From 547ced6500fc597d6780cf7f42ea44bbc6fb4769 Mon Sep 17 00:00:00 2001 From: JT Smith Date: Thu, 5 Jul 2007 04:23:55 +0000 Subject: [PATCH] upgraded yui to 2.2.2 and yui-ext to 1.0.1a --- www/extras/yui-ext/INCLUDE_ORDER.txt | 27 + www/extras/yui-ext/LICENSE.txt | 25 + .../adapter/jquery/ext-jquery-adapter.js | 12 + .../yui-ext/adapter/jquery/jquery-plugins.js | 965 + www/extras/yui-ext/adapter/jquery/jquery.js | 2201 + .../yui-ext/adapter/prototype/effects.js | 1098 + .../prototype/ext-prototype-adapter.js | 12 + .../yui-ext/adapter/prototype/prototype.js | 2523 + .../adapter/prototype/scriptaculous.js | 59 + .../yui-ext/adapter/yui/ext-yui-adapter.js | 12 + .../yui-ext/adapter/yui/yui-utilities.js | 18 + .../build/adapter/jquery-bridge-min.js | 9 + .../build/adapter/prototype-bridge-min.js | 9 + .../yui-ext/build/adapter/yui-bridge-min.js | 9 + .../build/core/CompositeElement-min.js | 9 + .../yui-ext/build/core/DomHelper-min.js | 9 + www/extras/yui-ext/build/core/DomQuery-min.js | 9 + www/extras/yui-ext/build/core/Element-min.js | 9 + .../yui-ext/build/core/EventManager-min.js | 9 + www/extras/yui-ext/build/core/Ext-min.js | 9 + www/extras/yui-ext/build/core/Fx-min.js | 9 + www/extras/yui-ext/build/core/Template-min.js | 9 + .../yui-ext/build/core/UpdateManager-min.js | 9 + .../yui-ext/build/data/ArrayReader-min.js | 9 + .../yui-ext/build/data/Connection-min.js | 9 + .../yui-ext/build/data/DataField-min.js | 9 + .../yui-ext/build/data/DataProxy-min.js | 9 + .../yui-ext/build/data/DataReader-min.js | 9 + .../yui-ext/build/data/HttpProxy-min.js | 9 + .../yui-ext/build/data/JsonReader-min.js | 9 + .../yui-ext/build/data/MemoryProxy-min.js | 9 + www/extras/yui-ext/build/data/Record-min.js | 9 + .../yui-ext/build/data/ScriptTagProxy-min.js | 9 + .../yui-ext/build/data/SimpleStore-min.js | 9 + .../yui-ext/build/data/SortTypes-min.js | 9 + www/extras/yui-ext/build/data/Store-min.js | 9 + www/extras/yui-ext/build/data/Tree-min.js | 9 + .../yui-ext/build/data/XmlReader-min.js | 9 + www/extras/yui-ext/build/dd/DDCore-min.js | 9 + www/extras/yui-ext/build/dd/DragSource-min.js | 9 + www/extras/yui-ext/build/dd/DragZone-min.js | 9 + www/extras/yui-ext/build/dd/DropTarget-min.js | 9 + www/extras/yui-ext/build/dd/DropZone-min.js | 9 + www/extras/yui-ext/build/dd/Registry-min.js | 9 + .../yui-ext/build/dd/ScrollManager-min.js | 9 + .../yui-ext/build/dd/StatusProxy-min.js | 9 + www/extras/yui-ext/build/debug-min.js | 9 + www/extras/yui-ext/build/legacy/Actor-min.js | 9 + .../yui-ext/build/legacy/Animator-min.js | 9 + .../yui-ext/build/legacy/InlineEditor-min.js | 9 + www/extras/yui-ext/build/legacy/compat-min.js | 9 + .../yui-ext/build/locale/ext-lang-da-min.js | 9 + .../yui-ext/build/locale/ext-lang-de-min.js | 9 + .../yui-ext/build/locale/ext-lang-en-min.js | 9 + .../build/locale/ext-lang-fr_CA-min.js | 8 + .../yui-ext/build/locale/ext-lang-hr-min.js | 9 + .../yui-ext/build/locale/ext-lang-hu-min.js | 9 + .../yui-ext/build/locale/ext-lang-it-min.js | 9 + .../yui-ext/build/locale/ext-lang-ja-min.js | 9 + .../yui-ext/build/locale/ext-lang-lv-min.js | 9 + .../yui-ext/build/locale/ext-lang-mk-min.js | 9 + .../yui-ext/build/locale/ext-lang-nl-min.js | 9 + .../yui-ext/build/locale/ext-lang-no-min.js | 9 + .../yui-ext/build/locale/ext-lang-pl-min.js | 9 + .../build/locale/ext-lang-pt_br-min.js | 9 + .../yui-ext/build/locale/ext-lang-ro-min.js | 9 + .../yui-ext/build/locale/ext-lang-ru-min.js | 9 + .../yui-ext/build/locale/ext-lang-sk-min.js | 9 + .../yui-ext/build/locale/ext-lang-sp-min.js | 9 + .../build/locale/ext-lang-sv_se-min.js | 8 + .../yui-ext/build/locale/ext-lang-tr-min.js | 9 + .../yui-ext/build/locale/ext-lang-vn-min.js | 8 + .../build/locale/ext-lang-zh_CN-min.js | 8 + .../build/locale/ext-lang-zh_TW-min.js | 8 + www/extras/yui-ext/build/state/State-min.js | 9 + www/extras/yui-ext/build/util/CSS-min.js | 9 + .../yui-ext/build/util/ClickRepeater-min.js | 9 + www/extras/yui-ext/build/util/Date-min.js | 9 + .../yui-ext/build/util/DelayedTask-min.js | 9 + www/extras/yui-ext/build/util/Format-min.js | 9 + www/extras/yui-ext/build/util/JSON-min.js | 9 + www/extras/yui-ext/build/util/KeyMap-min.js | 9 + www/extras/yui-ext/build/util/KeyNav-min.js | 9 + .../yui-ext/build/util/MixedCollection-min.js | 9 + .../yui-ext/build/util/Observable-min.js | 9 + www/extras/yui-ext/build/util/TaskMgr-min.js | 9 + .../yui-ext/build/util/TextMetrics-min.js | 9 + .../yui-ext/build/widgets/BasicDialog-min.js | 9 + .../yui-ext/build/widgets/BoxComponent-min.js | 9 + .../yui-ext/build/widgets/Button-min.js | 9 + .../yui-ext/build/widgets/ColorPalette-min.js | 9 + .../yui-ext/build/widgets/Component-min.js | 9 + .../yui-ext/build/widgets/DatePicker-min.js | 9 + .../yui-ext/build/widgets/Editor-min.js | 9 + .../yui-ext/build/widgets/JsonView-min.js | 9 + www/extras/yui-ext/build/widgets/Layer-min.js | 9 + .../yui-ext/build/widgets/LoadMask-min.js | 9 + .../yui-ext/build/widgets/MenuButton-min.js | 9 + .../yui-ext/build/widgets/MessageBox-min.js | 9 + .../build/widgets/PagingToolbar-min.js | 9 + .../yui-ext/build/widgets/QuickTips-min.js | 9 + .../yui-ext/build/widgets/Resizable-min.js | 9 + .../yui-ext/build/widgets/Shadow-min.js | 9 + .../yui-ext/build/widgets/SplitBar-min.js | 9 + .../yui-ext/build/widgets/TabPanel-min.js | 9 + .../yui-ext/build/widgets/Toolbar-min.js | 9 + www/extras/yui-ext/build/widgets/View-min.js | 9 + .../yui-ext/build/widgets/form/Action-min.js | 9 + .../build/widgets/form/BasicForm-min.js | 9 + .../build/widgets/form/Checkbox-min.js | 9 + .../yui-ext/build/widgets/form/Combo-min.js | 9 + .../build/widgets/form/DateField-min.js | 9 + .../yui-ext/build/widgets/form/Field-min.js | 9 + .../yui-ext/build/widgets/form/Form-min.js | 9 + .../yui-ext/build/widgets/form/Layout-min.js | 9 + .../build/widgets/form/NumberField-min.js | 9 + .../yui-ext/build/widgets/form/Radio-min.js | 9 + .../build/widgets/form/TextArea-min.js | 9 + .../build/widgets/form/TextField-min.js | 9 + .../build/widgets/form/TriggerField-min.js | 9 + .../yui-ext/build/widgets/form/VTypes-min.js | 9 + .../widgets/grid/AbstractGridView-min.js | 9 + .../grid/AbstractSelectionModel-min.js | 9 + .../widgets/grid/CellSelectionModel-min.js | 9 + .../build/widgets/grid/ColumnDD-min.js | 9 + .../build/widgets/grid/ColumnModel-min.js | 9 + .../build/widgets/grid/ColumnSplitDD-min.js | 9 + .../build/widgets/grid/EditorGrid-min.js | 9 + .../yui-ext/build/widgets/grid/Grid-min.js | 9 + .../yui-ext/build/widgets/grid/GridDD-min.js | 9 + .../build/widgets/grid/GridEditor-min.js | 9 + .../build/widgets/grid/GridView-min.js | 9 + .../build/widgets/grid/PropertyGrid-min.js | 9 + .../widgets/grid/RowSelectionModel-min.js | 9 + .../widgets/layout/BasicLayoutRegion-min.js | 9 + .../build/widgets/layout/BorderLayout-min.js | 9 + .../widgets/layout/BorderLayoutRegions-min.js | 9 + .../build/widgets/layout/ContentPanels-min.js | 9 + .../build/widgets/layout/LayoutManager-min.js | 9 + .../build/widgets/layout/LayoutRegion-min.js | 9 + .../widgets/layout/LayoutStateManager-min.js | 9 + .../build/widgets/layout/ReaderLayout-min.js | 9 + .../widgets/layout/SplitLayoutRegion-min.js | 9 + .../yui-ext/build/widgets/menu/Adapter-min.js | 9 + .../build/widgets/menu/BaseItem-min.js | 9 + .../build/widgets/menu/CheckItem-min.js | 9 + .../build/widgets/menu/ColorItem-min.js | 9 + .../build/widgets/menu/ColorMenu-min.js | 9 + .../build/widgets/menu/DateItem-min.js | 9 + .../build/widgets/menu/DateMenu-min.js | 9 + .../yui-ext/build/widgets/menu/Item-min.js | 9 + .../yui-ext/build/widgets/menu/Menu-min.js | 9 + .../yui-ext/build/widgets/menu/MenuMgr-min.js | 9 + .../build/widgets/menu/Separator-min.js | 9 + .../build/widgets/menu/TextItem-min.js | 9 + .../build/widgets/tree/AsyncTreeNode-min.js | 9 + .../build/widgets/tree/TreeDragZone-min.js | 9 + .../build/widgets/tree/TreeDropZone-min.js | 9 + .../build/widgets/tree/TreeEditor-min.js | 9 + .../build/widgets/tree/TreeFilter-min.js | 9 + .../build/widgets/tree/TreeLoader-min.js | 9 + .../build/widgets/tree/TreeNode-min.js | 9 + .../build/widgets/tree/TreeNodeUI-min.js | 9 + .../build/widgets/tree/TreePanel-min.js | 9 + .../widgets/tree/TreeSelectionModel-min.js | 9 + .../build/widgets/tree/TreeSorter-min.js | 9 + www/extras/yui-ext/build/yui/animation-min.js | 9 + .../yui-ext/build/yui/connection-min.js | 9 + www/extras/yui-ext/build/yui/dom-min.js | 9 + www/extras/yui-ext/build/yui/event-min.js | 9 + www/extras/yui-ext/build/yui/yahoo-min.js | 9 + www/extras/yui-ext/docs/index.html | 306 + .../docs/output/AbstractGridView.jss.html | 89 + .../output/AbstractSelectionModel.jss.html | 40 + .../yui-ext/docs/output/Action.jss.html | 196 + .../yui-ext/docs/output/Adapter.jss.html | 51 + .../yui-ext/docs/output/ArrayReader.jss.html | 73 + .../docs/output/AsyncTreeNode.jss.html | 107 + .../yui-ext/docs/output/AutoLayout.jss.html | 27 + .../yui-ext/docs/output/BaseItem.jss.html | 132 + .../yui-ext/docs/output/BasicDialog.jss.html | 1186 + .../yui-ext/docs/output/BasicForm.jss.html | 361 + .../docs/output/BasicLayoutRegion.jss.html | 285 + .../yui-ext/docs/output/BorderLayout.jss.html | 538 + .../docs/output/BorderLayoutRegions.jss.html | 195 + .../yui-ext/docs/output/BoxComponent.jss.html | 165 + .../yui-ext/docs/output/Button.jss.html | 455 + .../yui-ext/docs/output/ButtonPanel.jss.html | 3 + www/extras/yui-ext/docs/output/CSS.jss.html | 151 + .../docs/output/CellSelectionModel.jss.html | 220 + .../yui-ext/docs/output/CheckItem.jss.html | 103 + .../yui-ext/docs/output/Checkbox.jss.html | 117 + .../docs/output/ClickRepeater.jss.html | 163 + .../yui-ext/docs/output/ColorItem.jss.html | 19 + .../yui-ext/docs/output/ColorMenu.jss.html | 27 + .../yui-ext/docs/output/ColorPalette.jss.html | 129 + .../yui-ext/docs/output/ColumnDD.jss.html | 189 + .../yui-ext/docs/output/ColumnModel.jss.html | 449 + .../docs/output/ColumnSplitDD.jss.html | 57 + www/extras/yui-ext/docs/output/Combo.jss.html | 801 + .../yui-ext/docs/output/Component.jss.html | 406 + .../docs/output/CompositeElement.jss.html | 205 + .../yui-ext/docs/output/Connection.jss.html | 126 + .../yui-ext/docs/output/Container.jss.html | 160 + .../docs/output/ContainerLayout.jss.html | 41 + .../docs/output/ContentPanels.jss.html | 467 + .../yui-ext/docs/output/DDCore.jss.html | 2947 ++ .../yui-ext/docs/output/DataField.jss.html | 94 + .../yui-ext/docs/output/DataProxy.jss.html | 41 + .../yui-ext/docs/output/DataReader.jss.html | 10 + www/extras/yui-ext/docs/output/Date.html | 764 + www/extras/yui-ext/docs/output/Date.jss.html | 704 + .../yui-ext/docs/output/DateField.jss.html | 244 + .../yui-ext/docs/output/DateItem.jss.html | 30 + .../yui-ext/docs/output/DateMenu.jss.html | 27 + .../yui-ext/docs/output/DatePicker.jss.html | 480 + .../yui-ext/docs/output/DelayedTask.jss.html | 55 + .../yui-ext/docs/output/DomHelper.jss.html | 389 + .../yui-ext/docs/output/DomQuery.jss.html | 710 + .../yui-ext/docs/output/DragSource.jss.html | 352 + .../yui-ext/docs/output/DragZone.jss.html | 73 + .../yui-ext/docs/output/DropTarget.jss.html | 106 + .../yui-ext/docs/output/DropZone.jss.html | 201 + .../yui-ext/docs/output/Editor.jss.html | 271 + .../yui-ext/docs/output/EditorGrid.jss.html | 156 + .../yui-ext/docs/output/Element.jss.html | 2800 + .../yui-ext/docs/output/EventManager.jss.html | 655 + .../yui-ext/docs/output/Ext.BasicDialog.html | 1554 + .../docs/output/Ext.BasicLayoutRegion.html | 776 + .../yui-ext/docs/output/Ext.BorderLayout.html | 784 + .../yui-ext/docs/output/Ext.Button.html | 1006 + .../yui-ext/docs/output/Ext.ColorPalette.html | 973 + .../yui-ext/docs/output/Ext.Component.html | 846 + .../yui-ext/docs/output/Ext.ComponentMgr.html | 104 + .../docs/output/Ext.CompositeElement.html | 142 + .../docs/output/Ext.CompositeElementLite.html | 135 + .../yui-ext/docs/output/Ext.ContentPanel.html | 874 + .../yui-ext/docs/output/Ext.DatePicker.html | 1216 + .../docs/output/Ext.DialogManager.html | 180 + .../yui-ext/docs/output/Ext.DomHelper.html | 305 + .../yui-ext/docs/output/Ext.DomQuery.html | 294 + .../yui-ext/docs/output/Ext.Editor.html | 1216 + .../yui-ext/docs/output/Ext.Element.html | 3603 ++ .../yui-ext/docs/output/Ext.EventManager.html | 259 + .../yui-ext/docs/output/Ext.EventObject.html | 793 + www/extras/yui-ext/docs/output/Ext.Fx.html | 907 + .../yui-ext/docs/output/Ext.GridPanel.html | 898 + .../yui-ext/docs/output/Ext.JsonView.html | 1138 + .../yui-ext/docs/output/Ext.KeyMap.html | 268 + .../yui-ext/docs/output/Ext.KeyNav.html | 140 + www/extras/yui-ext/docs/output/Ext.Layer.html | 3618 ++ .../yui-ext/docs/output/Ext.LayoutDialog.html | 1660 + .../docs/output/Ext.LayoutManager.html | 529 + .../yui-ext/docs/output/Ext.LayoutRegion.html | 1418 + .../yui-ext/docs/output/Ext.LoadMask.html | 214 + .../docs/output/Ext.MasterTemplate.html | 478 + .../yui-ext/docs/output/Ext.MenuButton.html | 1086 + .../yui-ext/docs/output/Ext.MessageBox.html | 556 + .../docs/output/Ext.NestedLayoutPanel.html | 898 + .../docs/output/Ext.PagingToolbar.html | 586 + .../yui-ext/docs/output/Ext.QuickTips.html | 367 + .../yui-ext/docs/output/Ext.ReaderLayout.html | 741 + .../yui-ext/docs/output/Ext.Resizable.html | 699 + .../yui-ext/docs/output/Ext.Shadow.html | 249 + .../Ext.SplitBar.AbsoluteLayoutAdapter.html | 210 + .../Ext.SplitBar.BasicLayoutAdapter.html | 106 + .../yui-ext/docs/output/Ext.SplitBar.html | 632 + .../docs/output/Ext.SplitLayoutRegion.html | 1458 + .../yui-ext/docs/output/Ext.TabPanel.html | 921 + .../yui-ext/docs/output/Ext.TabPanelItem.html | 775 + .../yui-ext/docs/output/Ext.Template.html | 377 + .../docs/output/Ext.Toolbar.Button.html | 1005 + .../yui-ext/docs/output/Ext.Toolbar.Item.html | 277 + .../docs/output/Ext.Toolbar.MenuButton.html | 1083 + .../docs/output/Ext.Toolbar.Separator.html | 276 + .../docs/output/Ext.Toolbar.Spacer.html | 276 + .../docs/output/Ext.Toolbar.TextItem.html | 276 + .../yui-ext/docs/output/Ext.Toolbar.html | 356 + .../Ext.UpdateManager.BasicRenderer.html | 82 + .../output/Ext.UpdateManager.defaults.html | 150 + .../docs/output/Ext.UpdateManager.html | 890 + www/extras/yui-ext/docs/output/Ext.View.html | 855 + .../docs/output/Ext.WindowManager.html | 45 + .../docs/output/Ext.data.ArrayReader.html | 162 + .../docs/output/Ext.data.Connection.html | 184 + .../docs/output/Ext.data.DataProxy.html | 125 + .../docs/output/Ext.data.HttpProxy.html | 114 + .../docs/output/Ext.data.JsonReader.html | 247 + .../docs/output/Ext.data.MemoryProxy.html | 106 + .../yui-ext/docs/output/Ext.data.Node.html | 1151 + .../yui-ext/docs/output/Ext.data.Record.html | 222 + .../docs/output/Ext.data.ScriptTagProxy.html | 209 + .../docs/output/Ext.data.SimpleStore.html | 1242 + .../docs/output/Ext.data.SortTypes.html | 254 + .../yui-ext/docs/output/Ext.data.Store.html | 1200 + .../yui-ext/docs/output/Ext.data.Tree.html | 557 + .../docs/output/Ext.data.XmlReader.html | 251 + www/extras/yui-ext/docs/output/Ext.dd.DD.html | 1580 + .../yui-ext/docs/output/Ext.dd.DDProxy.html | 1692 + .../yui-ext/docs/output/Ext.dd.DDTarget.html | 1422 + .../yui-ext/docs/output/Ext.dd.DragDrop.html | 1453 + .../docs/output/Ext.dd.DragDropMgr.html | 1013 + .../docs/output/Ext.dd.DragSource.html | 2104 + .../yui-ext/docs/output/Ext.dd.DragZone.html | 2221 + .../docs/output/Ext.dd.DropTarget.html | 1593 + .../yui-ext/docs/output/Ext.dd.DropZone.html | 1793 + .../yui-ext/docs/output/Ext.dd.Registry.html | 205 + .../docs/output/Ext.dd.ScrollManager.html | 223 + .../docs/output/Ext.dd.StatusProxy.html | 375 + .../docs/output/Ext.form.BasicForm.html | 906 + .../docs/output/Ext.form.Checkbox.html | 1549 + .../yui-ext/docs/output/Ext.form.Column.html | 985 + .../docs/output/Ext.form.ComboBox.html | 2731 + .../docs/output/Ext.form.DateField.html | 2089 + .../yui-ext/docs/output/Ext.form.Field.html | 1478 + .../docs/output/Ext.form.FieldSet.html | 985 + .../yui-ext/docs/output/Ext.form.Form.html | 1263 + .../yui-ext/docs/output/Ext.form.Layout.html | 970 + .../docs/output/Ext.form.NumberField.html | 2012 + .../yui-ext/docs/output/Ext.form.Radio.html | 1547 + .../docs/output/Ext.form.TextArea.html | 1885 + .../docs/output/Ext.form.TextField.html | 1872 + .../docs/output/Ext.form.TriggerField.html | 1909 + .../yui-ext/docs/output/Ext.form.VTypes.html | 275 + .../Ext.grid.AbstractSelectionModel.html | 354 + .../output/Ext.grid.CellSelectionModel.html | 500 + .../docs/output/Ext.grid.ColumnModel.html | 1013 + .../docs/output/Ext.grid.EditorGrid.html | 1305 + .../yui-ext/docs/output/Ext.grid.Grid.html | 1196 + .../docs/output/Ext.grid.GridView.html | 357 + .../output/Ext.grid.RowSelectionModel.html | 904 + www/extras/yui-ext/docs/output/Ext.html | 668 + www/extras/yui-ext/docs/output/Ext.jss.html | 588 + .../yui-ext/docs/output/Ext.menu.Adapter.html | 1002 + .../docs/output/Ext.menu.BaseItem.html | 1002 + .../docs/output/Ext.menu.CheckItem.html | 1172 + .../docs/output/Ext.menu.ColorItem.html | 1016 + .../docs/output/Ext.menu.ColorMenu.html | 969 + .../docs/output/Ext.menu.DateItem.html | 1016 + .../docs/output/Ext.menu.DateMenu.html | 969 + .../yui-ext/docs/output/Ext.menu.Item.html | 1060 + .../yui-ext/docs/output/Ext.menu.Menu.html | 925 + .../yui-ext/docs/output/Ext.menu.MenuMgr.html | 104 + .../docs/output/Ext.menu.Separator.html | 1017 + .../docs/output/Ext.menu.TextItem.html | 1016 + .../docs/output/Ext.state.CookieProvider.html | 314 + .../docs/output/Ext.state.Manager.html | 191 + .../docs/output/Ext.state.Provider.html | 212 + .../docs/output/Ext.tree.AsyncTreeNode.html | 2138 + .../Ext.tree.DefaultSelectionModel.html | 482 + .../output/Ext.tree.MultiSelectionModel.html | 411 + .../docs/output/Ext.tree.TreeLoader.html | 79 + .../docs/output/Ext.tree.TreeNode.html | 1988 + .../docs/output/Ext.tree.TreePanel.html | 1521 + .../docs/output/Ext.tree.TreeSorter.html | 181 + .../yui-ext/docs/output/Ext.util.CSS.html | 231 + .../docs/output/Ext.util.ClickRepeater.html | 478 + .../docs/output/Ext.util.DelayedTask.html | 130 + .../yui-ext/docs/output/Ext.util.Format.html | 354 + .../yui-ext/docs/output/Ext.util.JSON.html | 106 + .../docs/output/Ext.util.MixedCollection.html | 1127 + .../docs/output/Ext.util.Observable.html | 321 + .../docs/output/Ext.util.TextMetrics.html | 238 + www/extras/yui-ext/docs/output/Field.jss.html | 491 + www/extras/yui-ext/docs/output/Form.jss.html | 291 + .../yui-ext/docs/output/Format.jss.html | 149 + www/extras/yui-ext/docs/output/Function.html | 191 + www/extras/yui-ext/docs/output/Fx.jss.html | 994 + www/extras/yui-ext/docs/output/Grid.jss.html | 598 + .../yui-ext/docs/output/GridDD.jss.html | 58 + .../yui-ext/docs/output/GridEditor.jss.html | 16 + .../yui-ext/docs/output/GridView.jss.html | 1505 + .../yui-ext/docs/output/HttpProxy.jss.html | 94 + www/extras/yui-ext/docs/output/Item.jss.html | 121 + www/extras/yui-ext/docs/output/JSON.jss.html | 137 + .../yui-ext/docs/output/JsonReader.jss.html | 158 + .../yui-ext/docs/output/JsonView.jss.html | 295 + .../yui-ext/docs/output/KeyMap.jss.html | 182 + .../yui-ext/docs/output/KeyNav.jss.html | 124 + www/extras/yui-ext/docs/output/Layer.jss.html | 448 + .../yui-ext/docs/output/Layout.jss.html | 200 + .../docs/output/LayoutManager.jss.html | 136 + .../yui-ext/docs/output/LayoutRegion.jss.html | 585 + .../docs/output/LayoutStateManager.jss.html | 69 + .../yui-ext/docs/output/LoadMask.jss.html | 93 + .../yui-ext/docs/output/MemoryProxy.jss.html | 49 + www/extras/yui-ext/docs/output/Menu.jss.html | 501 + .../yui-ext/docs/output/MenuButton.jss.html | 167 + .../yui-ext/docs/output/MenuMgr.jss.html | 176 + .../yui-ext/docs/output/MessageBox.jss.html | 479 + .../docs/output/MixedCollection.jss.html | 503 + .../yui-ext/docs/output/NumberField.jss.html | 131 + .../yui-ext/docs/output/Observable.jss.html | 341 + .../docs/output/PagingToolbar.jss.html | 261 + www/extras/yui-ext/docs/output/Panel.jss.html | 547 + .../yui-ext/docs/output/PropertyGrid.jss.html | 201 + .../yui-ext/docs/output/QuickTips.jss.html | 358 + www/extras/yui-ext/docs/output/Radio.jss.html | 16 + .../yui-ext/docs/output/ReaderLayout.jss.html | 98 + .../yui-ext/docs/output/Record.jss.html | 209 + .../yui-ext/docs/output/Registry.jss.html | 122 + .../yui-ext/docs/output/Resizable.jss.html | 2 + .../docs/output/RowSelectionModel.jss.html | 411 + .../docs/output/ScriptTagProxy.jss.html | 162 + .../docs/output/ScrollManager.jss.html | 171 + .../yui-ext/docs/output/Separator.jss.html | 33 + .../yui-ext/docs/output/Shadow.jss.html | 166 + .../yui-ext/docs/output/SimpleStore.jss.html | 23 + .../yui-ext/docs/output/SortTypes.jss.html | 88 + .../yui-ext/docs/output/SplitBar.jss.html | 431 + .../docs/output/SplitLayoutRegion.jss.html | 326 + www/extras/yui-ext/docs/output/State.jss.html | 279 + .../yui-ext/docs/output/StatusProxy.jss.html | 161 + www/extras/yui-ext/docs/output/Store.jss.html | 523 + .../yui-ext/docs/output/TabPanel.jss.html | 744 + .../yui-ext/docs/output/TaskMgr.jss.html | 87 + .../yui-ext/docs/output/Template.jss.html | 357 + .../yui-ext/docs/output/TextArea.jss.html | 101 + .../yui-ext/docs/output/TextField.jss.html | 281 + .../yui-ext/docs/output/TextItem.jss.html | 33 + .../yui-ext/docs/output/TextMetrics.jss.html | 114 + .../yui-ext/docs/output/Toolbar.jss.html | 452 + www/extras/yui-ext/docs/output/Tree.jss.html | 722 + .../yui-ext/docs/output/TreeDragZone.jss.html | 44 + .../yui-ext/docs/output/TreeDropZone.jss.html | 235 + .../yui-ext/docs/output/TreeEditor.jss.html | 70 + .../yui-ext/docs/output/TreeFilter.jss.html | 107 + .../yui-ext/docs/output/TreeLoader.jss.html | 127 + .../yui-ext/docs/output/TreeNode.jss.html | 461 + .../yui-ext/docs/output/TreeNodeUI.jss.html | 464 + .../yui-ext/docs/output/TreePanel.jss.html | 383 + .../docs/output/TreeSelectionModel.jss.html | 309 + .../yui-ext/docs/output/TreeSorter.jss.html | 65 + .../yui-ext/docs/output/TriggerField.jss.html | 194 + .../docs/output/UpdateManager.jss.html | 487 + .../yui-ext/docs/output/VTypes.jss.html | 83 + www/extras/yui-ext/docs/output/View.jss.html | 453 + .../yui-ext/docs/output/Window.jss.html | 509 + .../docs/output/WindowManager.jss.html | 137 + .../yui-ext/docs/output/XmlReader.jss.html | 113 + www/extras/yui-ext/docs/output/debug.jss.html | 727 + .../yui-ext/docs/output/ext-lang-da.jss.html | 169 + .../yui-ext/docs/output/ext-lang-de.jss.html | 168 + .../yui-ext/docs/output/ext-lang-en.jss.html | 172 + .../docs/output/ext-lang-fr_CA.jss.html | 168 + .../yui-ext/docs/output/ext-lang-hr.jss.html | 169 + .../yui-ext/docs/output/ext-lang-hu.jss.html | 174 + .../yui-ext/docs/output/ext-lang-it.jss.html | 169 + .../yui-ext/docs/output/ext-lang-ja.jss.html | 154 + .../yui-ext/docs/output/ext-lang-lv.jss.html | 171 + .../yui-ext/docs/output/ext-lang-mk.jss.html | 171 + .../yui-ext/docs/output/ext-lang-nl.jss.html | 179 + .../yui-ext/docs/output/ext-lang-no.jss.html | 166 + .../yui-ext/docs/output/ext-lang-pl.jss.html | 173 + .../docs/output/ext-lang-pt_br.jss.html | 167 + .../yui-ext/docs/output/ext-lang-ro.jss.html | 170 + .../yui-ext/docs/output/ext-lang-ru.jss.html | 169 + .../yui-ext/docs/output/ext-lang-sk.jss.html | 174 + .../yui-ext/docs/output/ext-lang-sp.jss.html | 167 + .../docs/output/ext-lang-sv_se.jss.html | 172 + .../yui-ext/docs/output/ext-lang-tr.jss.html | 172 + .../yui-ext/docs/output/ext-lang-vn.jss.html | 173 + .../docs/output/ext-lang-zh_CN.jss.html | 168 + .../docs/output/ext-lang-zh_TW.jss.html | 168 + .../docs/output/jquery-bridge.jss.html | 391 + .../docs/output/prototype-bridge.jss.html | 499 + .../yui-ext/docs/output/yui-bridge.jss.html | 297 + .../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 .../yui-ext/docs/resources/collapser.css | 34 + www/extras/yui-ext/docs/resources/docs.css | 77 + www/extras/yui-ext/docs/resources/docs.gif | Bin 0 -> 1016 bytes www/extras/yui-ext/docs/resources/docs.js | 148 + 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 | 216 + 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 | 64 + www/extras/yui-ext/examples/README.txt | 3 + .../yui-ext/examples/debug/debug-console.html | 42 + .../yui-ext/examples/debug/inspector.gif | Bin 0 -> 51396 bytes www/extras/yui-ext/examples/dialog/blog.html | 81 + .../yui-ext/examples/dialog/comments.txt | 44 + www/extras/yui-ext/examples/dialog/hello.html | 64 + www/extras/yui-ext/examples/dialog/hello.js | 46 + .../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 | 39 + www/extras/yui-ext/examples/dialog/layout.js | 77 + .../yui-ext/examples/dialog/msg-box.html | 57 + www/extras/yui-ext/examples/dialog/msg-box.js | 77 + www/extras/yui-ext/examples/dialog/post.css | 132 + www/extras/yui-ext/examples/dialog/post.js | 162 + www/extras/yui-ext/examples/dialog/post.php | 10 + www/extras/yui-ext/examples/examples.css | 51 + www/extras/yui-ext/examples/examples.js | 112 + www/extras/yui-ext/examples/examples.jsb | 222 + www/extras/yui-ext/examples/form/combos.css | 29 + www/extras/yui-ext/examples/form/combos.html | 184 + www/extras/yui-ext/examples/form/combos.js | 35 + www/extras/yui-ext/examples/form/dynamic.html | 73 + www/extras/yui-ext/examples/form/dynamic.js | 285 + www/extras/yui-ext/examples/form/forms.css | 31 + www/extras/yui-ext/examples/form/forms.html | 147 + www/extras/yui-ext/examples/form/forms.js | 69 + .../yui-ext/examples/form/forum-search.html | 43 + .../yui-ext/examples/form/forum-search.js | 54 + www/extras/yui-ext/examples/form/states.js | 64 + .../yui-ext/examples/form/xml-errors.xml | 17 + .../yui-ext/examples/form/xml-form.html | 48 + www/extras/yui-ext/examples/form/xml-form.js | 124 + www/extras/yui-ext/examples/form/xml-form.xml | 13 + .../yui-ext/examples/grid/array-grid.html | 28 + .../yui-ext/examples/grid/array-grid.js | 112 + .../yui-ext/examples/grid/custom-grid.html | 56 + .../yui-ext/examples/grid/custom-grid.js | 8 + www/extras/yui-ext/examples/grid/details.gif | Bin 0 -> 945 bytes .../yui-ext/examples/grid/edit-grid.html | 40 + www/extras/yui-ext/examples/grid/edit-grid.js | 138 + .../yui-ext/examples/grid/from-markup.html | 64 + .../yui-ext/examples/grid/from-markup.js | 90 + .../yui-ext/examples/grid/grid-examples.css | 62 + www/extras/yui-ext/examples/grid/paging.html | 36 + www/extras/yui-ext/examples/grid/paging.js | 130 + www/extras/yui-ext/examples/grid/plants.xml | 327 + www/extras/yui-ext/examples/grid/sheldon.xml | 151 + www/extras/yui-ext/examples/grid/topic.gif | Bin 0 -> 954 bytes .../yui-ext/examples/grid/xml-grid.html | 31 + www/extras/yui-ext/examples/grid/xml-grid.js | 46 + www/extras/yui-ext/examples/info-bg.gif | Bin 0 -> 852 bytes .../yui-ext/examples/layout/complex.html | 153 + .../yui-ext/examples/layout/feed-proxy.ashx | 1 + .../examples/layout/feed-proxy.ashx.vb | 54 + .../yui-ext/examples/layout/feed-proxy.php | 9 + .../yui-ext/examples/layout/feed-viewer.css | 216 + .../yui-ext/examples/layout/feed-viewer.html | 39 + .../yui-ext/examples/layout/feed-viewer.js | 341 + .../yui-ext/examples/layout/images/Thumbs.db | Bin 0 -> 35840 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/tab-close-on.gif | Bin 0 -> 880 bytes .../examples/layout/images/tab-close.gif | Bin 0 -> 859 bytes .../examples/layout/images/toolbar.gif | Bin 0 -> 859 bytes .../yui-ext/examples/layout/images/wait.gif | Bin 0 -> 1100 bytes .../examples/layout/images/warning.gif | Bin 0 -> 960 bytes .../yui-ext/examples/layout/nested.html | 126 + .../yui-ext/examples/layout/simple.html | 129 + www/extras/yui-ext/examples/lib.css | 20 + .../examples/locale/create_languages_js.py | 51 + .../yui-ext/examples/locale/dutch-form.html | 41 + .../yui-ext/examples/locale/dutch-form.js | 76 + .../examples/locale/dutch-provinces.js | 25 + .../yui-ext/examples/locale/languages.js | 39 + .../yui-ext/examples/locale/multi-lang.html | 78 + .../yui-ext/examples/locale/multi-lang.js | 166 + .../yui-ext/examples/menu/list-items.gif | Bin 0 -> 1044 bytes .../yui-ext/examples/menu/menu-show.gif | Bin 0 -> 917 bytes www/extras/yui-ext/examples/menu/menus.css | 17 + www/extras/yui-ext/examples/menu/menus.html | 45 + www/extras/yui-ext/examples/menu/menus.js | 174 + .../yui-ext/examples/resizable/basic.css | 40 + .../yui-ext/examples/resizable/basic.html | 180 + .../yui-ext/examples/resizable/basic.js | 92 + .../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 .../examples/shared/icons/arrow-down.gif | Bin 0 -> 881 bytes .../examples/shared/icons/arrow-up.gif | Bin 0 -> 881 bytes .../examples/shared/icons/fam/SILK.txt | 3 + .../yui-ext/examples/shared/icons/fam/add.gif | Bin 0 -> 994 bytes .../examples/shared/icons/fam/cross.gif | Bin 0 -> 944 bytes .../examples/shared/icons/fam/delete.gif | Bin 0 -> 989 bytes .../examples/shared/icons/fam/plugin.gif | Bin 0 -> 988 bytes .../examples/shared/icons/fam/plugin_add.gif | Bin 0 -> 1010 bytes .../yui-ext/examples/shared/icons/save.gif | Bin 0 -> 1014 bytes www/extras/yui-ext/examples/tabs/ajax1.htm | 3 + www/extras/yui-ext/examples/tabs/ajax2.htm | 7 + .../yui-ext/examples/tabs/tabs-adv.html | 35 + www/extras/yui-ext/examples/tabs/tabs-adv.js | 29 + .../yui-ext/examples/tabs/tabs-example.css | 36 + .../yui-ext/examples/tabs/tabs-example.js | 41 + www/extras/yui-ext/examples/tabs/tabs.html | 75 + www/extras/yui-ext/examples/tree/Thumbs.db | Bin 0 -> 4096 bytes www/extras/yui-ext/examples/tree/album.gif | Bin 0 -> 1039 bytes .../yui-ext/examples/tree/center-bg.gif | Bin 0 -> 811 bytes .../yui-ext/examples/tree/dep-tree.json | 1 + .../yui-ext/examples/tree/dependency.css | 52 + .../yui-ext/examples/tree/dependency.html | 33 + .../yui-ext/examples/tree/dependency.js | 436 + .../yui-ext/examples/tree/dependency.php | 46 + .../yui-ext/examples/tree/get-nodes.php | 43 + .../yui-ext/examples/tree/images/cmp-bg.gif | Bin 0 -> 830 bytes .../tree/images/thumbs/dance_fever.jpg | Bin 0 -> 2067 bytes .../tree/images/thumbs/gangster_zack.jpg | Bin 0 -> 2115 bytes .../examples/tree/images/thumbs/kids_hug.jpg | Bin 0 -> 2477 bytes .../examples/tree/images/thumbs/kids_hug2.jpg | Bin 0 -> 2476 bytes .../examples/tree/images/thumbs/sara_pink.jpg | Bin 0 -> 2154 bytes .../tree/images/thumbs/sara_pumpkin.jpg | Bin 0 -> 2588 bytes .../tree/images/thumbs/sara_smile.jpg | Bin 0 -> 2410 bytes .../tree/images/thumbs/up_to_something.jpg | Bin 0 -> 2120 bytes .../examples/tree/images/thumbs/zack.jpg | Bin 0 -> 2901 bytes .../tree/images/thumbs/zack_dress.jpg | Bin 0 -> 2645 bytes .../examples/tree/images/thumbs/zack_hat.jpg | Bin 0 -> 2323 bytes .../examples/tree/images/thumbs/zack_sink.jpg | Bin 0 -> 2303 bytes .../tree/images/thumbs/zacks_grill.jpg | Bin 0 -> 2825 bytes .../yui-ext/examples/tree/organizer.css | 94 + .../yui-ext/examples/tree/organizer.html | 31 + www/extras/yui-ext/examples/tree/organizer.js | 241 + www/extras/yui-ext/examples/tree/reorder.html | 27 + www/extras/yui-ext/examples/tree/reorder.js | 31 + www/extras/yui-ext/examples/tree/save-dep.php | 4 + .../yui-ext/examples/tree/two-trees.html | 43 + www/extras/yui-ext/examples/tree/two-trees.js | 72 + .../yui-ext/examples/view/chooser-example.js | 34 + www/extras/yui-ext/examples/view/chooser.css | 72 + www/extras/yui-ext/examples/view/chooser.html | 26 + www/extras/yui-ext/examples/view/chooser.js | 204 + .../yui-ext/examples/view/get-images.php | 15 + .../view/images/thumbs/dance_fever.jpg | Bin 0 -> 2067 bytes .../view/images/thumbs/gangster_zack.jpg | Bin 0 -> 2115 bytes .../examples/view/images/thumbs/kids_hug.jpg | Bin 0 -> 2477 bytes .../examples/view/images/thumbs/kids_hug2.jpg | Bin 0 -> 2476 bytes .../examples/view/images/thumbs/sara_pink.jpg | Bin 0 -> 2154 bytes .../view/images/thumbs/sara_pumpkin.jpg | Bin 0 -> 2588 bytes .../view/images/thumbs/sara_smile.jpg | Bin 0 -> 2410 bytes .../view/images/thumbs/up_to_something.jpg | Bin 0 -> 2120 bytes .../examples/view/images/thumbs/zack.jpg | Bin 0 -> 2901 bytes .../view/images/thumbs/zack_dress.jpg | Bin 0 -> 2645 bytes .../examples/view/images/thumbs/zack_hat.jpg | Bin 0 -> 2323 bytes .../examples/view/images/thumbs/zack_sink.jpg | Bin 0 -> 2303 bytes .../view/images/thumbs/zacks_grill.jpg | Bin 0 -> 2825 bytes www/extras/yui-ext/ext-all-debug.js | 27927 ++++++++++ www/extras/yui-ext/ext-all.js | 256 + www/extras/yui-ext/ext-back-compat.js | 14 + www/extras/yui-ext/ext-core-debug.js | 5097 ++ www/extras/yui-ext/ext-core.js | 28 + .../yui-ext/package/button/button-debug.js | 365 + www/extras/yui-ext/package/button/button.js | 10 + www/extras/yui-ext/package/color-palette.js | 10 + www/extras/yui-ext/package/data/data.js | 36 + www/extras/yui-ext/package/date.js | 10 + .../yui-ext/package/datepicker/datepicker.js | 10 + .../yui-ext/package/dialog/dialogs-debug.js | 1241 + www/extras/yui-ext/package/dialog/dialogs.js | 12 + .../yui-ext/package/dragdrop/dragdrop.js | 24 + www/extras/yui-ext/package/form/form-debug.js | 2697 + www/extras/yui-ext/package/form/form.js | 38 + .../yui-ext/package/grid/edit-grid-debug.js | 319 + www/extras/yui-ext/package/grid/edit-grid.js | 14 + www/extras/yui-ext/package/grid/grid.js | 28 + .../yui-ext/package/layout/layout-debug.js | 2032 + www/extras/yui-ext/package/layout/layout.js | 26 + www/extras/yui-ext/package/menu/menus.js | 32 + www/extras/yui-ext/package/qtips/qtips.js | 10 + www/extras/yui-ext/package/resizable.js | 10 + www/extras/yui-ext/package/splitbar.js | 10 + www/extras/yui-ext/package/tabs/tabs.js | 10 + www/extras/yui-ext/package/toolbar/toolbar.js | 12 + www/extras/yui-ext/package/tree/tree.js | 32 + www/extras/yui-ext/package/util.js | 26 + www/extras/yui-ext/package/widget-core.js | 14 + www/extras/yui-ext/resources/css/README.txt | 3 + .../yui-ext/resources/css/basic-dialog.css | 286 + www/extras/yui-ext/resources/css/box.css | 111 + www/extras/yui-ext/resources/css/button.css | 148 + www/extras/yui-ext/resources/css/combo.css | 46 + www/extras/yui-ext/resources/css/core.css | 290 + .../yui-ext/resources/css/date-picker.css | 155 + www/extras/yui-ext/resources/css/dd.css | 61 + www/extras/yui-ext/resources/css/debug.css | 55 + www/extras/yui-ext/resources/css/ext-all.css | 3167 ++ www/extras/yui-ext/resources/css/form.css | 359 + www/extras/yui-ext/resources/css/grid.css | 295 + www/extras/yui-ext/resources/css/layout.css | 252 + www/extras/yui-ext/resources/css/menu.css | 116 + www/extras/yui-ext/resources/css/panel.css | 258 + www/extras/yui-ext/resources/css/qtips.css | 119 + .../yui-ext/resources/css/reset-min.css | 9 + .../yui-ext/resources/css/resizable.css | 143 + www/extras/yui-ext/resources/css/tabs.css | 134 + www/extras/yui-ext/resources/css/toolbar.css | 160 + www/extras/yui-ext/resources/css/tree.css | 179 + www/extras/yui-ext/resources/css/window.css | 155 + .../yui-ext/resources/css/ytheme-aero.css | 581 + .../yui-ext/resources/css/ytheme-gray.css | 438 + .../yui-ext/resources/css/ytheme-vista.css | 511 + .../aero/basic-dialog/aero-close-over.gif | Bin 0 -> 1109 bytes .../images/aero/basic-dialog/aero-close.gif | Bin 0 -> 882 bytes .../images/aero/basic-dialog/bg-center.gif | Bin 0 -> 863 bytes .../images/aero/basic-dialog/bg-left.gif | Bin 0 -> 1201 bytes .../images/aero/basic-dialog/bg-right.gif | Bin 0 -> 1202 bytes .../images/aero/basic-dialog/close.gif | Bin 0 -> 350 bytes .../aero/basic-dialog/collapse-over.gif | Bin 0 -> 1030 bytes .../images/aero/basic-dialog/collapse.gif | Bin 0 -> 851 bytes .../images/aero/basic-dialog/e-handle.gif | Bin 0 -> 995 bytes .../images/aero/basic-dialog/expand-over.gif | Bin 0 -> 1044 bytes .../images/aero/basic-dialog/expand.gif | Bin 0 -> 875 bytes .../images/aero/basic-dialog/hd-sprite.gif | Bin 0 -> 980 bytes .../images/aero/basic-dialog/s-handle.gif | Bin 0 -> 992 bytes .../images/aero/basic-dialog/se-handle.gif | Bin 0 -> 838 bytes .../images/aero/basic-dialog/w-handle.gif | Bin 0 -> 817 bytes .../resources/images/aero/gradient-bg.gif | Bin 0 -> 1472 bytes .../images/aero/grid/grid-blue-split.gif | Bin 0 -> 817 bytes .../resources/images/aero/grid/grid-hrow.gif | Bin 0 -> 838 bytes .../resources/images/aero/grid/grid-split.gif | Bin 0 -> 817 bytes .../images/aero/grid/grid-vista-hd.gif | Bin 0 -> 829 bytes .../resources/images/aero/grid/pspbrwse.jbf | Bin 0 -> 6112 bytes .../images/aero/grid/sort-col-bg.gif | Bin 0 -> 855 bytes .../resources/images/aero/grid/sort_asc.gif | Bin 0 -> 830 bytes .../resources/images/aero/grid/sort_desc.gif | Bin 0 -> 833 bytes .../resources/images/aero/layout/collapse.gif | Bin 0 -> 842 bytes .../resources/images/aero/layout/expand.gif | Bin 0 -> 842 bytes .../images/aero/layout/gradient-bg.gif | Bin 0 -> 1202 bytes .../images/aero/layout/ns-collapse.gif | Bin 0 -> 842 bytes .../images/aero/layout/ns-expand.gif | Bin 0 -> 843 bytes .../images/aero/layout/panel-close.gif | Bin 0 -> 829 bytes .../images/aero/layout/panel-title-bg.gif | Bin 0 -> 830 bytes .../aero/layout/panel-title-light-bg.gif | Bin 0 -> 833 bytes .../images/aero/layout/tab-close-on.gif | Bin 0 -> 880 bytes .../images/aero/layout/tab-close.gif | Bin 0 -> 844 bytes .../yui-ext/resources/images/aero/qtip/bg.gif | Bin 0 -> 1024 bytes .../yui-ext/resources/images/aero/s.gif | Bin 0 -> 43 bytes .../images/aero/sizer/e-handle-dark.gif | Bin 0 -> 1062 bytes .../resources/images/aero/sizer/e-handle.gif | Bin 0 -> 1586 bytes .../images/aero/sizer/ne-handle-dark.gif | Bin 0 -> 839 bytes .../resources/images/aero/sizer/ne-handle.gif | Bin 0 -> 854 bytes .../images/aero/sizer/nw-handle-dark.gif | Bin 0 -> 839 bytes .../resources/images/aero/sizer/nw-handle.gif | Bin 0 -> 853 bytes .../images/aero/sizer/s-handle-dark.gif | Bin 0 -> 1060 bytes .../resources/images/aero/sizer/s-handle.gif | Bin 0 -> 1318 bytes .../images/aero/sizer/se-handle-dark.gif | Bin 0 -> 838 bytes .../resources/images/aero/sizer/se-handle.gif | Bin 0 -> 853 bytes .../images/aero/sizer/sw-handle-dark.gif | Bin 0 -> 839 bytes .../resources/images/aero/sizer/sw-handle.gif | Bin 0 -> 855 bytes .../aero/tabs/tab-btm-inactive-left-bg.gif | Bin 0 -> 891 bytes .../aero/tabs/tab-btm-inactive-right-bg.gif | Bin 0 -> 1618 bytes .../images/aero/tabs/tab-btm-left-bg.gif | Bin 0 -> 875 bytes .../images/aero/tabs/tab-btm-right-bg.gif | Bin 0 -> 1604 bytes .../resources/images/aero/tabs/tab-sprite.gif | Bin 0 -> 3102 bytes .../images/aero/tabs/tab-strip-bg.gif | Bin 0 -> 826 bytes .../images/aero/tabs/tab-strip-bg.png | Bin 0 -> 259 bytes .../images/aero/tabs/tab-strip-btm-bg.gif | Bin 0 -> 826 bytes .../resources/images/aero/toolbar/bg.gif | Bin 0 -> 904 bytes .../images/aero/toolbar/tb-btn-sprite.gif | Bin 0 -> 1127 bytes .../images/default/basic-dialog/btn-arrow.gif | Bin 0 -> 870 bytes .../default/basic-dialog/btn-sprite.gif | Bin 0 -> 1341 bytes .../images/default/basic-dialog/close.gif | Bin 0 -> 893 bytes .../images/default/basic-dialog/collapse.gif | Bin 0 -> 865 bytes .../images/default/basic-dialog/e-handle.gif | Bin 0 -> 995 bytes .../images/default/basic-dialog/expand.gif | Bin 0 -> 884 bytes .../images/default/basic-dialog/hd-sprite.gif | Bin 0 -> 1099 bytes .../images/default/basic-dialog/progress.gif | Bin 0 -> 19442 bytes .../images/default/basic-dialog/progress2.gif | Bin 0 -> 14113 bytes .../images/default/basic-dialog/s-handle.gif | Bin 0 -> 992 bytes .../images/default/basic-dialog/se-handle.gif | Bin 0 -> 833 bytes .../images/default/box/corners-blue.gif | Bin 0 -> 1010 bytes .../resources/images/default/box/corners.gif | Bin 0 -> 1005 bytes .../resources/images/default/box/l-blue.gif | Bin 0 -> 810 bytes .../resources/images/default/box/l.gif | Bin 0 -> 810 bytes .../resources/images/default/box/r-blue.gif | Bin 0 -> 810 bytes .../resources/images/default/box/r.gif | Bin 0 -> 810 bytes .../resources/images/default/box/tb-blue.gif | Bin 0 -> 851 bytes .../resources/images/default/box/tb.gif | Bin 0 -> 839 bytes .../resources/images/default/dd/drop-add.gif | Bin 0 -> 1001 bytes .../resources/images/default/dd/drop-no.gif | Bin 0 -> 949 bytes .../resources/images/default/dd/drop-yes.gif | Bin 0 -> 1016 bytes .../images/default/form/date-trigger.gif | Bin 0 -> 1041 bytes .../images/default/form/error-tip-corners.gif | Bin 0 -> 4183 bytes .../images/default/form/exclamation.gif | Bin 0 -> 995 bytes .../resources/images/default/form/text-bg.gif | Bin 0 -> 819 bytes .../resources/images/default/form/trigger.gif | Bin 0 -> 1297 bytes .../resources/images/default/gradient-bg.gif | Bin 0 -> 1472 bytes .../resources/images/default/grid/Thumbs.db | Bin 0 -> 33792 bytes .../images/default/grid/arrow-left-white.gif | Bin 0 -> 825 bytes .../images/default/grid/arrow-right-white.gif | Bin 0 -> 825 bytes .../images/default/grid/col-move-bottom.gif | Bin 0 -> 868 bytes .../images/default/grid/col-move-top.gif | Bin 0 -> 869 bytes .../resources/images/default/grid/dirty.gif | Bin 0 -> 832 bytes .../resources/images/default/grid/done.gif | Bin 0 -> 133 bytes .../resources/images/default/grid/drop-no.gif | Bin 0 -> 947 bytes .../images/default/grid/drop-yes.gif | Bin 0 -> 860 bytes .../images/default/grid/footer-bg.gif | Bin 0 -> 834 bytes .../images/default/grid/grid-blue-hd.gif | Bin 0 -> 829 bytes .../images/default/grid/grid-blue-split.gif | Bin 0 -> 817 bytes .../images/default/grid/grid-hrow.gif | Bin 0 -> 855 bytes .../images/default/grid/grid-loading.gif | Bin 0 -> 701 bytes .../images/default/grid/grid-split.gif | Bin 0 -> 817 bytes .../images/default/grid/grid-vista-hd.gif | Bin 0 -> 829 bytes .../resources/images/default/grid/hd-pop.gif | Bin 0 -> 839 bytes .../images/default/grid/hmenu-asc.gif | Bin 0 -> 931 bytes .../images/default/grid/hmenu-desc.gif | Bin 0 -> 930 bytes .../images/default/grid/hmenu-lock.gif | Bin 0 -> 955 bytes .../images/default/grid/hmenu-lock.png | Bin 0 -> 648 bytes .../images/default/grid/hmenu-unlock.gif | Bin 0 -> 971 bytes .../images/default/grid/hmenu-unlock.png | Bin 0 -> 697 bytes .../images/default/grid/invalid_line.gif | Bin 0 -> 815 bytes .../resources/images/default/grid/loading.gif | Bin 0 -> 771 bytes .../resources/images/default/grid/mso-hd.gif | Bin 0 -> 875 bytes .../resources/images/default/grid/nowait.gif | Bin 0 -> 884 bytes .../default/grid/page-first-disabled.gif | Bin 0 -> 925 bytes .../images/default/grid/page-first.gif | Bin 0 -> 925 bytes .../default/grid/page-last-disabled.gif | Bin 0 -> 923 bytes .../images/default/grid/page-last.gif | Bin 0 -> 923 bytes .../default/grid/page-next-disabled.gif | Bin 0 -> 875 bytes .../images/default/grid/page-next.gif | Bin 0 -> 875 bytes .../default/grid/page-prev-disabled.gif | Bin 0 -> 879 bytes .../images/default/grid/page-prev.gif | Bin 0 -> 879 bytes .../images/default/grid/pick-button.gif | Bin 0 -> 1036 bytes .../resources/images/default/grid/refresh.gif | Bin 0 -> 1015 bytes .../images/default/grid/sort_asc.gif | Bin 0 -> 825 bytes .../images/default/grid/sort_desc.gif | Bin 0 -> 826 bytes .../resources/images/default/grid/wait.gif | Bin 0 -> 1100 bytes .../images/default/layout/collapse.gif | Bin 0 -> 842 bytes .../images/default/layout/expand.gif | Bin 0 -> 842 bytes .../images/default/layout/gradient-bg.gif | Bin 0 -> 1472 bytes .../images/default/layout/ns-collapse.gif | Bin 0 -> 842 bytes .../images/default/layout/ns-expand.gif | Bin 0 -> 843 bytes .../images/default/layout/panel-close.gif | Bin 0 -> 829 bytes .../images/default/layout/panel-title-bg.gif | Bin 0 -> 838 bytes .../default/layout/panel-title-light-bg.gif | Bin 0 -> 835 bytes .../resources/images/default/layout/stick.gif | Bin 0 -> 874 bytes .../resources/images/default/layout/stuck.gif | Bin 0 -> 92 bytes .../images/default/layout/tab-close-on.gif | Bin 0 -> 880 bytes .../images/default/layout/tab-close.gif | Bin 0 -> 859 bytes .../resources/images/default/menu/checked.gif | Bin 0 -> 982 bytes .../images/default/menu/group-checked.gif | Bin 0 -> 891 bytes .../images/default/menu/menu-parent.gif | Bin 0 -> 854 bytes .../resources/images/default/menu/menu.gif | Bin 0 -> 842 bytes .../images/default/menu/unchecked.gif | Bin 0 -> 917 bytes .../resources/images/default/qtip/bg.gif | Bin 0 -> 1091 bytes .../resources/images/default/qtip/close.gif | Bin 0 -> 972 bytes .../images/default/qtip/tip-sprite.gif | Bin 0 -> 4032 bytes .../yui-ext/resources/images/default/s.gif | Bin 0 -> 43 bytes .../resources/images/default/shadow-c.png | Bin 0 -> 182 bytes .../resources/images/default/shadow-lr.png | Bin 0 -> 135 bytes .../resources/images/default/shadow.png | Bin 0 -> 311 bytes .../images/default/shared/calendar.gif | Bin 0 -> 979 bytes .../images/default/shared/left-btn.gif | Bin 0 -> 870 bytes .../images/default/shared/right-btn.gif | Bin 0 -> 871 bytes .../images/default/shared/warning.gif | Bin 0 -> 960 bytes .../images/default/sizer/e-handle-dark.gif | Bin 0 -> 1062 bytes .../images/default/sizer/e-handle.gif | Bin 0 -> 1586 bytes .../images/default/sizer/ne-handle-dark.gif | Bin 0 -> 839 bytes .../images/default/sizer/ne-handle.gif | Bin 0 -> 854 bytes .../images/default/sizer/nw-handle-dark.gif | Bin 0 -> 839 bytes .../images/default/sizer/nw-handle.gif | Bin 0 -> 853 bytes .../images/default/sizer/s-handle-dark.gif | Bin 0 -> 1060 bytes .../images/default/sizer/s-handle.gif | Bin 0 -> 1318 bytes .../images/default/sizer/se-handle-dark.gif | Bin 0 -> 838 bytes .../images/default/sizer/se-handle.gif | Bin 0 -> 853 bytes .../resources/images/default/sizer/square.gif | Bin 0 -> 864 bytes .../images/default/sizer/sw-handle-dark.gif | Bin 0 -> 839 bytes .../images/default/sizer/sw-handle.gif | Bin 0 -> 855 bytes .../default/tabs/tab-btm-inactive-left-bg.gif | Bin 0 -> 875 bytes .../tabs/tab-btm-inactive-right-bg.gif | Bin 0 -> 1601 bytes .../images/default/tabs/tab-btm-left-bg.gif | Bin 0 -> 877 bytes .../images/default/tabs/tab-btm-right-bg.gif | Bin 0 -> 1606 bytes .../images/default/tabs/tab-sprite.gif | Bin 0 -> 3088 bytes .../default/toolbar/btn-arrow-light.gif | Bin 0 -> 916 bytes .../images/default/toolbar/btn-arrow.gif | Bin 0 -> 919 bytes .../images/default/toolbar/btn-over-bg.gif | Bin 0 -> 837 bytes .../images/default/toolbar/gray-bg.gif | Bin 0 -> 832 bytes .../images/default/toolbar/tb-bg.gif | Bin 0 -> 862 bytes .../images/default/toolbar/tb-btn-sprite.gif | Bin 0 -> 1091 bytes .../images/default/tree/drop-add.gif | Bin 0 -> 1001 bytes .../images/default/tree/drop-between.gif | Bin 0 -> 907 bytes .../resources/images/default/tree/drop-no.gif | Bin 0 -> 949 bytes .../images/default/tree/drop-over.gif | Bin 0 -> 911 bytes .../images/default/tree/drop-under.gif | Bin 0 -> 911 bytes .../images/default/tree/drop-yes.gif | Bin 0 -> 1016 bytes .../default/tree/elbow-end-minus-nl.gif | Bin 0 -> 898 bytes .../images/default/tree/elbow-end-minus.gif | Bin 0 -> 905 bytes .../images/default/tree/elbow-end-plus-nl.gif | Bin 0 -> 900 bytes .../images/default/tree/elbow-end-plus.gif | Bin 0 -> 907 bytes .../images/default/tree/elbow-end.gif | Bin 0 -> 844 bytes .../images/default/tree/elbow-line.gif | Bin 0 -> 846 bytes .../images/default/tree/elbow-minus-nl.gif | Bin 0 -> 898 bytes .../images/default/tree/elbow-minus.gif | Bin 0 -> 908 bytes .../images/default/tree/elbow-plus-nl.gif | Bin 0 -> 900 bytes .../images/default/tree/elbow-plus.gif | Bin 0 -> 910 bytes .../resources/images/default/tree/elbow.gif | Bin 0 -> 850 bytes .../images/default/tree/folder-open.gif | Bin 0 -> 956 bytes .../resources/images/default/tree/folder.gif | Bin 0 -> 952 bytes .../resources/images/default/tree/leaf.gif | Bin 0 -> 945 bytes .../resources/images/default/tree/loading.gif | Bin 0 -> 771 bytes .../resources/images/default/tree/s.gif | Bin 0 -> 43 bytes .../images/gray/basic-dialog/close.gif | Bin 0 -> 893 bytes .../images/gray/basic-dialog/collapse.gif | Bin 0 -> 900 bytes .../images/gray/basic-dialog/dlg-bg.gif | Bin 0 -> 27857 bytes .../images/gray/basic-dialog/e-handle.gif | Bin 0 -> 995 bytes .../images/gray/basic-dialog/expand.gif | Bin 0 -> 911 bytes .../images/gray/basic-dialog/hd-sprite.gif | Bin 0 -> 1060 bytes .../images/gray/basic-dialog/s-handle.gif | Bin 0 -> 992 bytes .../images/gray/basic-dialog/se-handle.gif | Bin 0 -> 833 bytes .../resources/images/gray/gradient-bg.gif | Bin 0 -> 1472 bytes .../resources/images/gray/grid/grid-hrow.gif | Bin 0 -> 825 bytes .../resources/images/gray/layout/collapse.gif | Bin 0 -> 842 bytes .../resources/images/gray/layout/expand.gif | Bin 0 -> 842 bytes .../images/gray/layout/gradient-bg.gif | Bin 0 -> 1202 bytes .../images/gray/layout/ns-collapse.gif | Bin 0 -> 842 bytes .../images/gray/layout/ns-expand.gif | Bin 0 -> 843 bytes .../images/gray/layout/panel-close.gif | Bin 0 -> 829 bytes .../images/gray/layout/panel-title-bg.gif | Bin 0 -> 838 bytes .../gray/layout/panel-title-light-bg.gif | Bin 0 -> 842 bytes .../resources/images/gray/layout/stick.gif | Bin 0 -> 874 bytes .../images/gray/layout/tab-close-on.gif | Bin 0 -> 880 bytes .../images/gray/layout/tab-close.gif | Bin 0 -> 859 bytes .../resources/images/gray/menu/checked.gif | Bin 0 -> 982 bytes .../images/gray/menu/group-checked.gif | Bin 0 -> 891 bytes .../images/gray/menu/menu-parent.gif | Bin 0 -> 846 bytes .../resources/images/gray/menu/menu.gif | Bin 0 -> 842 bytes .../resources/images/gray/menu/unchecked.gif | Bin 0 -> 917 bytes .../yui-ext/resources/images/gray/qtip/bg.gif | Bin 0 -> 1024 bytes .../resources/images/gray/qtip/tip-sprite.gif | Bin 0 -> 4032 bytes .../yui-ext/resources/images/gray/s.gif | Bin 0 -> 43 bytes .../images/gray/sizer/e-handle-dark.gif | Bin 0 -> 1062 bytes .../resources/images/gray/sizer/e-handle.gif | Bin 0 -> 1586 bytes .../images/gray/sizer/ne-handle-dark.gif | Bin 0 -> 839 bytes .../resources/images/gray/sizer/ne-handle.gif | Bin 0 -> 854 bytes .../images/gray/sizer/nw-handle-dark.gif | Bin 0 -> 839 bytes .../resources/images/gray/sizer/nw-handle.gif | Bin 0 -> 853 bytes .../images/gray/sizer/s-handle-dark.gif | Bin 0 -> 1060 bytes .../resources/images/gray/sizer/s-handle.gif | Bin 0 -> 1318 bytes .../images/gray/sizer/se-handle-dark.gif | Bin 0 -> 838 bytes .../resources/images/gray/sizer/se-handle.gif | Bin 0 -> 853 bytes .../images/gray/sizer/sw-handle-dark.gif | Bin 0 -> 839 bytes .../resources/images/gray/sizer/sw-handle.gif | Bin 0 -> 855 bytes .../gray/tabs/tab-btm-inactive-left-bg.gif | Bin 0 -> 875 bytes .../gray/tabs/tab-btm-inactive-right-bg.gif | Bin 0 -> 1601 bytes .../images/gray/tabs/tab-btm-left-bg.gif | Bin 0 -> 875 bytes .../images/gray/tabs/tab-btm-right-bg.gif | Bin 0 -> 1601 bytes .../resources/images/gray/tabs/tab-sprite.gif | Bin 0 -> 3037 bytes .../resources/images/gray/toolbar/gray-bg.gif | Bin 0 -> 832 bytes .../images/gray/toolbar/tb-btn-sprite.gif | Bin 0 -> 963 bytes .../images/vista/basic-dialog/bg-center.gif | Bin 0 -> 865 bytes .../images/vista/basic-dialog/bg-left.gif | Bin 0 -> 1039 bytes .../images/vista/basic-dialog/bg-right.gif | Bin 0 -> 1039 bytes .../images/vista/basic-dialog/close.gif | Bin 0 -> 350 bytes .../images/vista/basic-dialog/collapse.gif | Bin 0 -> 333 bytes .../images/vista/basic-dialog/dlg-bg.gif | Bin 0 -> 27857 bytes .../images/vista/basic-dialog/e-handle.gif | Bin 0 -> 995 bytes .../images/vista/basic-dialog/expand.gif | Bin 0 -> 351 bytes .../images/vista/basic-dialog/hd-sprite.gif | Bin 0 -> 462 bytes .../images/vista/basic-dialog/s-handle.gif | Bin 0 -> 992 bytes .../images/vista/basic-dialog/se-handle.gif | Bin 0 -> 833 bytes .../images/vista/basic-dialog/w-handle.gif | Bin 0 -> 817 bytes .../resources/images/vista/gradient-bg.gif | Bin 0 -> 1472 bytes .../images/vista/grid/grid-split.gif | Bin 0 -> 817 bytes .../images/vista/grid/grid-vista-hd.gif | Bin 0 -> 829 bytes .../images/vista/layout/collapse.gif | Bin 0 -> 842 bytes .../resources/images/vista/layout/expand.gif | Bin 0 -> 842 bytes .../images/vista/layout/gradient-bg.gif | Bin 0 -> 1202 bytes .../images/vista/layout/ns-collapse.gif | Bin 0 -> 842 bytes .../images/vista/layout/ns-expand.gif | Bin 0 -> 843 bytes .../images/vista/layout/panel-close.gif | Bin 0 -> 829 bytes .../images/vista/layout/panel-title-bg.gif | Bin 0 -> 888 bytes .../vista/layout/panel-title-light-bg.gif | Bin 0 -> 846 bytes .../resources/images/vista/layout/stick.gif | Bin 0 -> 872 bytes .../images/vista/layout/tab-close-on.gif | Bin 0 -> 880 bytes .../images/vista/layout/tab-close.gif | Bin 0 -> 844 bytes .../resources/images/vista/qtip/bg.gif | Bin 0 -> 1024 bytes .../images/vista/qtip/tip-sprite.gif | Bin 0 -> 4183 bytes .../yui-ext/resources/images/vista/s.gif | Bin 0 -> 43 bytes .../images/vista/sizer/e-handle-dark.gif | Bin 0 -> 1062 bytes .../resources/images/vista/sizer/e-handle.gif | Bin 0 -> 1586 bytes .../images/vista/sizer/ne-handle-dark.gif | Bin 0 -> 839 bytes .../images/vista/sizer/ne-handle.gif | Bin 0 -> 854 bytes .../images/vista/sizer/nw-handle-dark.gif | Bin 0 -> 839 bytes .../images/vista/sizer/nw-handle.gif | Bin 0 -> 853 bytes .../images/vista/sizer/s-handle-dark.gif | Bin 0 -> 1060 bytes .../resources/images/vista/sizer/s-handle.gif | Bin 0 -> 1318 bytes .../images/vista/sizer/se-handle-dark.gif | Bin 0 -> 838 bytes .../images/vista/sizer/se-handle.gif | Bin 0 -> 853 bytes .../images/vista/sizer/sw-handle-dark.gif | Bin 0 -> 839 bytes .../images/vista/sizer/sw-handle.gif | Bin 0 -> 855 bytes .../vista/tabs/tab-btm-inactive-left-bg.gif | Bin 0 -> 879 bytes .../vista/tabs/tab-btm-inactive-right-bg.gif | Bin 0 -> 1609 bytes .../images/vista/tabs/tab-btm-left-bg.gif | Bin 0 -> 895 bytes .../images/vista/tabs/tab-btm-right-bg.gif | Bin 0 -> 1608 bytes .../images/vista/tabs/tab-sprite.gif | Bin 0 -> 3150 bytes .../images/vista/toolbar/gray-bg.gif | Bin 0 -> 839 bytes .../images/vista/toolbar/tb-btn-sprite.gif | Bin 0 -> 1110 bytes www/extras/yui-ext/resources/license.txt | 25 + .../yui-ext/resources/raw-images/shadow.psd | Bin 0 -> 59114 bytes www/extras/yui-ext/resources/resources.jsb | 522 + .../yui-ext/source/adapter/jquery-bridge.js | 398 + .../source/adapter/prototype-bridge.js | 506 + .../yui-ext/source/adapter/yui-bridge.js | 304 + .../yui-ext/source/core/CompositeElement.js | 212 + www/extras/yui-ext/source/core/DomHelper.js | 395 + www/extras/yui-ext/source/core/DomQuery.js | 715 + www/extras/yui-ext/source/core/Element.js | 2806 + .../yui-ext/source/core/EventManager.js | 662 + www/extras/yui-ext/source/core/Ext.js | 594 + www/extras/yui-ext/source/core/Fx.js | 1000 + www/extras/yui-ext/source/core/Template.js | 364 + .../yui-ext/source/core/UpdateManager.js | 493 + www/extras/yui-ext/source/data/ArrayReader.js | 80 + www/extras/yui-ext/source/data/Connection.js | 130 + www/extras/yui-ext/source/data/DataField.js | 101 + www/extras/yui-ext/source/data/DataProxy.js | 48 + www/extras/yui-ext/source/data/DataReader.js | 17 + www/extras/yui-ext/source/data/HttpProxy.js | 101 + www/extras/yui-ext/source/data/JsonReader.js | 165 + www/extras/yui-ext/source/data/MemoryProxy.js | 56 + www/extras/yui-ext/source/data/Record.js | 216 + .../yui-ext/source/data/ScriptTagProxy.js | 169 + www/extras/yui-ext/source/data/SimpleStore.js | 30 + www/extras/yui-ext/source/data/SortTypes.js | 95 + www/extras/yui-ext/source/data/Store.js | 526 + www/extras/yui-ext/source/data/Tree.js | 729 + www/extras/yui-ext/source/data/XmlReader.js | 120 + www/extras/yui-ext/source/dd/DDCore.js | 2953 ++ www/extras/yui-ext/source/dd/DragSource.js | 359 + www/extras/yui-ext/source/dd/DragZone.js | 79 + www/extras/yui-ext/source/dd/DropTarget.js | 112 + www/extras/yui-ext/source/dd/DropZone.js | 208 + www/extras/yui-ext/source/dd/Registry.js | 129 + www/extras/yui-ext/source/dd/ScrollManager.js | 178 + www/extras/yui-ext/source/dd/StatusProxy.js | 168 + www/extras/yui-ext/source/debug.js | 733 + www/extras/yui-ext/source/ext.jsb | 592 + www/extras/yui-ext/source/legacy/Actor.js | 697 + www/extras/yui-ext/source/legacy/Animator.js | 483 + .../yui-ext/source/legacy/InlineEditor.js | 223 + www/extras/yui-ext/source/legacy/compat.js | 168 + www/extras/yui-ext/source/license.txt | 25 + .../yui-ext/source/locale/ext-lang-da.js | 175 + .../yui-ext/source/locale/ext-lang-de.js | 174 + .../yui-ext/source/locale/ext-lang-en.js | 179 + .../yui-ext/source/locale/ext-lang-fr_CA.js | 174 + .../yui-ext/source/locale/ext-lang-hr.js | 175 + .../yui-ext/source/locale/ext-lang-hu.js | 180 + .../yui-ext/source/locale/ext-lang-it.js | 175 + .../yui-ext/source/locale/ext-lang-ja.js | 160 + .../yui-ext/source/locale/ext-lang-lv.js | 178 + .../yui-ext/source/locale/ext-lang-mk.js | 178 + .../yui-ext/source/locale/ext-lang-nl.js | 185 + .../yui-ext/source/locale/ext-lang-no.js | 173 + .../yui-ext/source/locale/ext-lang-pl.js | 179 + .../yui-ext/source/locale/ext-lang-pt_br.js | 173 + .../yui-ext/source/locale/ext-lang-ro.js | 177 + .../yui-ext/source/locale/ext-lang-ru.js | 175 + .../yui-ext/source/locale/ext-lang-sk.js | 180 + .../yui-ext/source/locale/ext-lang-sp.js | 173 + .../yui-ext/source/locale/ext-lang-sv_se.js | 179 + .../yui-ext/source/locale/ext-lang-tr.js | 179 + .../yui-ext/source/locale/ext-lang-vn.js | 179 + .../yui-ext/source/locale/ext-lang-zh_CN.js | 174 + .../yui-ext/source/locale/ext-lang-zh_TW.js | 174 + www/extras/yui-ext/source/state/State.js | 285 + www/extras/yui-ext/source/util/CSS.js | 158 + .../yui-ext/source/util/ClickRepeater.js | 170 + www/extras/yui-ext/source/util/Date.js | 711 + www/extras/yui-ext/source/util/DelayedTask.js | 62 + www/extras/yui-ext/source/util/Format.js | 156 + www/extras/yui-ext/source/util/JSON.js | 143 + www/extras/yui-ext/source/util/KeyMap.js | 189 + www/extras/yui-ext/source/util/KeyNav.js | 131 + .../yui-ext/source/util/MixedCollection.js | 510 + www/extras/yui-ext/source/util/Observable.js | 348 + www/extras/yui-ext/source/util/TaskMgr.js | 94 + www/extras/yui-ext/source/util/TextMetrics.js | 121 + .../yui-ext/source/widgets/BasicDialog.js | 1193 + .../yui-ext/source/widgets/BoxComponent.js | 172 + www/extras/yui-ext/source/widgets/Button.js | 462 + .../yui-ext/source/widgets/ColorPalette.js | 136 + .../yui-ext/source/widgets/Component.js | 413 + .../yui-ext/source/widgets/DatePicker.js | 487 + www/extras/yui-ext/source/widgets/Editor.js | 275 + www/extras/yui-ext/source/widgets/JsonView.js | 300 + www/extras/yui-ext/source/widgets/Layer.js | 455 + www/extras/yui-ext/source/widgets/LoadMask.js | 99 + .../yui-ext/source/widgets/MenuButton.js | 174 + .../yui-ext/source/widgets/MessageBox.js | 486 + .../yui-ext/source/widgets/PagingToolbar.js | 268 + .../yui-ext/source/widgets/QuickTips.js | 365 + .../yui-ext/source/widgets/Resizable.js | 9 + www/extras/yui-ext/source/widgets/Shadow.js | 172 + www/extras/yui-ext/source/widgets/SplitBar.js | 437 + www/extras/yui-ext/source/widgets/TabPanel.js | 751 + www/extras/yui-ext/source/widgets/Toolbar.js | 458 + www/extras/yui-ext/source/widgets/View.js | 459 + .../yui-ext/source/widgets/form/Action.js | 202 + .../yui-ext/source/widgets/form/BasicForm.js | 362 + .../yui-ext/source/widgets/form/Checkbox.js | 123 + .../yui-ext/source/widgets/form/Combo.js | 806 + .../yui-ext/source/widgets/form/DateField.js | 251 + .../yui-ext/source/widgets/form/Field.js | 497 + .../yui-ext/source/widgets/form/Form.js | 295 + .../yui-ext/source/widgets/form/Layout.js | 201 + .../source/widgets/form/NumberField.js | 138 + .../yui-ext/source/widgets/form/Radio.js | 23 + .../yui-ext/source/widgets/form/TextArea.js | 108 + .../yui-ext/source/widgets/form/TextField.js | 288 + .../source/widgets/form/TriggerField.js | 199 + .../yui-ext/source/widgets/form/VTypes.js | 90 + .../source/widgets/grid/AbstractGridView.js | 96 + .../widgets/grid/AbstractSelectionModel.js | 47 + .../source/widgets/grid/CellSelectionModel.js | 227 + .../yui-ext/source/widgets/grid/ColumnDD.js | 196 + .../source/widgets/grid/ColumnModel.js | 449 + .../source/widgets/grid/ColumnSplitDD.js | 64 + .../yui-ext/source/widgets/grid/EditorGrid.js | 163 + .../yui-ext/source/widgets/grid/Grid.js | 604 + .../yui-ext/source/widgets/grid/GridDD.js | 65 + .../yui-ext/source/widgets/grid/GridEditor.js | 23 + .../yui-ext/source/widgets/grid/GridView.js | 1512 + .../source/widgets/grid/PropertyGrid.js | 208 + .../source/widgets/grid/RowSelectionModel.js | 418 + .../widgets/layout/BasicLayoutRegion.js | 292 + .../source/widgets/layout/BorderLayout.js | 338 + .../widgets/layout/BorderLayoutRegions.js | 201 + .../source/widgets/layout/ContentPanels.js | 474 + .../source/widgets/layout/LayoutManager.js | 143 + .../source/widgets/layout/LayoutRegion.js | 590 + .../widgets/layout/LayoutStateManager.js | 76 + .../source/widgets/layout/ReaderLayout.js | 105 + .../widgets/layout/SplitLayoutRegion.js | 333 + .../yui-ext/source/widgets/menu/Adapter.js | 58 + .../yui-ext/source/widgets/menu/BaseItem.js | 138 + .../yui-ext/source/widgets/menu/CheckItem.js | 109 + .../yui-ext/source/widgets/menu/ColorItem.js | 26 + .../yui-ext/source/widgets/menu/ColorMenu.js | 34 + .../yui-ext/source/widgets/menu/DateItem.js | 37 + .../yui-ext/source/widgets/menu/DateMenu.js | 34 + .../yui-ext/source/widgets/menu/Item.js | 127 + .../yui-ext/source/widgets/menu/Menu.js | 508 + .../yui-ext/source/widgets/menu/MenuMgr.js | 182 + .../yui-ext/source/widgets/menu/Separator.js | 40 + .../yui-ext/source/widgets/menu/TextItem.js | 40 + .../source/widgets/tree/AsyncTreeNode.js | 113 + .../source/widgets/tree/TreeDragZone.js | 51 + .../source/widgets/tree/TreeDropZone.js | 242 + .../yui-ext/source/widgets/tree/TreeEditor.js | 77 + .../yui-ext/source/widgets/tree/TreeFilter.js | 113 + .../yui-ext/source/widgets/tree/TreeLoader.js | 134 + .../yui-ext/source/widgets/tree/TreeNode.js | 468 + .../yui-ext/source/widgets/tree/TreeNodeUI.js | 471 + .../yui-ext/source/widgets/tree/TreePanel.js | 390 + .../source/widgets/tree/TreeSelectionModel.js | 316 + .../yui-ext/source/widgets/tree/TreeSorter.js | 72 + www/extras/yui-ext/source/yui/animation.js | 1366 + www/extras/yui-ext/source/yui/connection.js | 1062 + www/extras/yui-ext/source/yui/dom.js | 909 + www/extras/yui-ext/source/yui/event.js | 2062 + www/extras/yui-ext/source/yui/yahoo.js | 441 + www/extras/yui/README | 208 + www/extras/yui/build/animation/README | 53 + .../yui/build/animation/animation-debug.js | 1355 + .../yui/build/animation/animation-min.js | 75 + www/extras/yui/build/animation/animation.js | 1352 + www/extras/yui/build/autocomplete/README | 91 + .../build/autocomplete/autocomplete-debug.js | 3104 ++ .../build/autocomplete/autocomplete-min.js | 184 + .../yui/build/autocomplete/autocomplete.js | 3075 ++ www/extras/yui/build/button/README | 53 + .../yui/build/button/assets/background.png | Bin 0 -> 185 bytes www/extras/yui/build/button/assets/button.css | 220 + .../yui/build/button/assets/menuarrow.gif | Bin 0 -> 67 bytes .../yui/build/button/assets/splitarrow.gif | Bin 0 -> 145 bytes .../build/button/assets/splitarrow_active.gif | Bin 0 -> 145 bytes .../yui/build/button/button-beta-debug.js | 4125 ++ .../yui/build/button/button-beta-min.js | 131 + www/extras/yui/build/button/button-beta.js | 4013 ++ www/extras/yui/build/calendar/README | 100 + .../yui/build/calendar/assets/calendar.css | 197 + .../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 | 4570 ++ www/extras/yui/build/calendar/calendar-min.js | 118 + www/extras/yui/build/calendar/calendar.js | 4548 ++ www/extras/yui/build/connection/README | 206 + .../yui/build/connection/connection-debug.js | 1129 + .../yui/build/connection/connection-min.js | 109 + www/extras/yui/build/connection/connection.js | 1102 + www/extras/yui/build/container/README | 277 + .../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 | 233 + .../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 | 5487 ++ .../yui/build/container/container-min.js | 162 + www/extras/yui/build/container/container.js | 5463 ++ .../build/container/container_core-debug.js | 3107 ++ .../yui/build/container/container_core-min.js | 100 + .../yui/build/container/container_core.js | 3097 ++ www/extras/yui/build/datasource/README | 27 + .../build/datasource/datasource-beta-debug.js | 1030 + .../build/datasource/datasource-beta-min.js | 68 + .../yui/build/datasource/datasource-beta.js | 1006 + www/extras/yui/build/datatable/README | 68 + .../yui/build/datatable/assets/datatable.css | 52 + .../build/datatable/datatable-beta-debug.js | 5882 +++ .../yui/build/datatable/datatable-beta-min.js | 269 + .../yui/build/datatable/datatable-beta.js | 5824 ++ www/extras/yui/build/dom/README | 91 + www/extras/yui/build/dom/dom-debug.js | 949 + www/extras/yui/build/dom/dom-min.js | 59 + www/extras/yui/build/dom/dom.js | 917 + www/extras/yui/build/dragdrop/README | 131 + .../yui/build/dragdrop/dragdrop-debug.js | 3126 ++ www/extras/yui/build/dragdrop/dragdrop-min.js | 94 + www/extras/yui/build/dragdrop/dragdrop.js | 3018 ++ www/extras/yui/build/element/README | 16 + .../yui/build/element/element-beta-debug.js | 925 + .../yui/build/element/element-beta-min.js | 34 + www/extras/yui/build/element/element-beta.js | 915 + www/extras/yui/build/event/README | 180 + www/extras/yui/build/event/event-debug.js | 2205 + www/extras/yui/build/event/event-min.js | 87 + www/extras/yui/build/event/event.js | 2183 + www/extras/yui/build/fonts/README | 13 + www/extras/yui/build/fonts/fonts-min.css | 7 + www/extras/yui/build/fonts/fonts.css | 29 + www/extras/yui/build/grids/README | 48 + www/extras/yui/build/grids/grids-min.css | 7 + www/extras/yui/build/grids/grids.css | 129 + www/extras/yui/build/history/README | 28 + .../yui/build/history/assets/blank.html | 1 + .../history/history-experimental-debug.js | 770 + .../build/history/history-experimental-min.js | 45 + .../yui/build/history/history-experimental.js | 770 + www/extras/yui/build/logger/README | 68 + www/extras/yui/build/logger/assets/logger.css | 37 + www/extras/yui/build/logger/logger-debug.js | 1818 + www/extras/yui/build/logger/logger-min.js | 66 + www/extras/yui/build/logger/logger.js | 1818 + www/extras/yui/build/menu/README | 478 + www/extras/yui/build/menu/assets/map.gif | Bin 0 -> 264 bytes www/extras/yui/build/menu/assets/menu.css | 401 + .../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 .../build/menu/assets/menuaroup8_dim_1.gif | Bin 0 -> 53 bytes .../build/menu/assets/menuaroup8_nrm_1.gif | Bin 0 -> 53 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 | 8778 +++ www/extras/yui/build/menu/menu-min.js | 280 + www/extras/yui/build/menu/menu.js | 8726 +++ www/extras/yui/build/reset-fonts-grids/README | 24 + .../reset-fonts-grids/reset-fonts-grids.css | 9 + www/extras/yui/build/reset/README | 25 + www/extras/yui/build/reset/reset-min.css | 7 + www/extras/yui/build/reset/reset.css | 15 + www/extras/yui/build/slider/README | 72 + www/extras/yui/build/slider/slider-debug.js | 1259 + www/extras/yui/build/slider/slider-min.js | 36 + www/extras/yui/build/slider/slider.js | 1222 + www/extras/yui/build/tabview/README | 32 + .../yui/build/tabview/assets/border_tabs.css | 54 + .../yui/build/tabview/assets/tabview.css | 75 + www/extras/yui/build/tabview/tabview-debug.js | 1025 + www/extras/yui/build/tabview/tabview-min.js | 35 + www/extras/yui/build/tabview/tabview.js | 1021 + www/extras/yui/build/treeview/README | 154 + 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 | 102 + .../yui/build/treeview/assets/vline.gif | Bin 0 -> 503 bytes .../yui/build/treeview/treeview-debug.js | 2287 + www/extras/yui/build/treeview/treeview-min.js | 70 + www/extras/yui/build/treeview/treeview.js | 2248 + www/extras/yui/build/utilities/README | 36 + www/extras/yui/build/utilities/utilities.js | 433 + www/extras/yui/build/yahoo-dom-event/README | 35 + .../build/yahoo-dom-event/yahoo-dom-event.js | 149 + www/extras/yui/build/yahoo/README | 75 + www/extras/yui/build/yahoo/yahoo-debug.js | 442 + www/extras/yui/build/yahoo/yahoo-min.js | 17 + www/extras/yui/build/yahoo/yahoo.js | 442 + www/extras/yui/docs/Anim.js.html | 552 + www/extras/yui/docs/AnimMgr.js.html | 293 + www/extras/yui/docs/Attribute.js.html | 301 + www/extras/yui/docs/AttributeProvider.js.html | 349 + www/extras/yui/docs/AutoComplete.js.html | 2114 + www/extras/yui/docs/Bezier.js.html | 154 + www/extras/yui/docs/Calendar.js.html | 2804 + www/extras/yui/docs/CalendarGroup.js.html | 1230 + www/extras/yui/docs/ColorAnim.js.html | 253 + www/extras/yui/docs/Column.html | 1602 + www/extras/yui/docs/ColumnEditor.html | 744 + www/extras/yui/docs/ColumnSet.html | 365 + www/extras/yui/docs/ColumnSet.js.html | 1565 + www/extras/yui/docs/Config.js.html | 596 + www/extras/yui/docs/ContainerEffect.js.html | 429 + www/extras/yui/docs/CustomEvent.js.html | 487 + www/extras/yui/docs/DD.js.html | 387 + www/extras/yui/docs/DDProxy.js.html | 330 + www/extras/yui/docs/DDTarget.js.html | 141 + www/extras/yui/docs/DataSource.html | 1990 + www/extras/yui/docs/DataSource.js.html | 1153 + www/extras/yui/docs/DataTable.html | 7904 +++ www/extras/yui/docs/DataTable.js.html | 4694 ++ www/extras/yui/docs/DateMath.js.html | 383 + www/extras/yui/docs/Dialog.js.html | 937 + www/extras/yui/docs/Dom.js.html | 870 + www/extras/yui/docs/DragDrop.js.html | 1309 + www/extras/yui/docs/DragDropMgr.js.html | 1521 + www/extras/yui/docs/Easing.js.html | 451 + www/extras/yui/docs/Element.js.html | 592 + www/extras/yui/docs/Event.js.html | 1539 + www/extras/yui/docs/EventProvider.js.html | 315 + www/extras/yui/docs/HTMLNode.js.html | 245 + www/extras/yui/docs/LogMsg.js.html | 177 + www/extras/yui/docs/LogReader.js.html | 1323 + www/extras/yui/docs/LogWriter.js.html | 199 + www/extras/yui/docs/Logger.js.html | 547 + www/extras/yui/docs/MenuNode.js.html | 155 + www/extras/yui/docs/Module.js.html | 968 + www/extras/yui/docs/Motion.js.html | 269 + www/extras/yui/docs/Node.js.html | 1119 + www/extras/yui/docs/Overlay.js.html | 1202 + www/extras/yui/docs/OverlayManager.js.html | 510 + www/extras/yui/docs/Panel.js.html | 937 + www/extras/yui/docs/Record.html | 218 + www/extras/yui/docs/RecordSet.html | 1113 + www/extras/yui/docs/RecordSet.js.html | 547 + www/extras/yui/docs/Region.js.html | 293 + www/extras/yui/docs/RootNode.js.html | 162 + www/extras/yui/docs/Scroll.js.html | 199 + www/extras/yui/docs/SimpleDialog.js.html | 353 + www/extras/yui/docs/Slider.js.html | 1099 + www/extras/yui/docs/SliderThumb.js.html | 365 + www/extras/yui/docs/Sort.html | 265 + www/extras/yui/docs/TVAnim.js.html | 173 + www/extras/yui/docs/TVFadeIn.js.html | 182 + www/extras/yui/docs/TVFadeOut.js.html | 180 + www/extras/yui/docs/Tab.js.html | 614 + www/extras/yui/docs/TabView.js.html | 616 + www/extras/yui/docs/TextNode.js.html | 327 + www/extras/yui/docs/Tooltip.js.html | 637 + www/extras/yui/docs/TreeView.js.html | 821 + www/extras/yui/docs/WidthResizer.html | 443 + www/extras/yui/docs/YAHOO.env.html | 254 + www/extras/yui/docs/YAHOO.html | 513 + www/extras/yui/docs/YAHOO.js.html | 542 + www/extras/yui/docs/YAHOO.lang.html | 723 + www/extras/yui/docs/YAHOO.util.Anim.html | 1156 + www/extras/yui/docs/YAHOO.util.AnimMgr.html | 522 + www/extras/yui/docs/YAHOO.util.Attribute.html | 596 + .../docs/YAHOO.util.AttributeProvider.html | 909 + www/extras/yui/docs/YAHOO.util.Bezier.html | 217 + www/extras/yui/docs/YAHOO.util.ColorAnim.html | 320 + www/extras/yui/docs/YAHOO.util.Config.html | 1295 + www/extras/yui/docs/YAHOO.util.Connect.html | 1626 + .../yui/docs/YAHOO.util.CustomEvent.html | 726 + www/extras/yui/docs/YAHOO.util.DD.html | 710 + www/extras/yui/docs/YAHOO.util.DDProxy.html | 561 + www/extras/yui/docs/YAHOO.util.DDTarget.html | 298 + www/extras/yui/docs/YAHOO.util.Dom.html | 1481 + www/extras/yui/docs/YAHOO.util.DragDrop.html | 3310 ++ ...YAHOO.util.DragDropMgr.ElementWrapper.html | 205 + .../yui/docs/YAHOO.util.DragDropMgr.html | 2773 + www/extras/yui/docs/YAHOO.util.Easing.html | 1367 + www/extras/yui/docs/YAHOO.util.Element.html | 1438 + www/extras/yui/docs/YAHOO.util.Event.html | 2529 + .../yui/docs/YAHOO.util.EventProvider.html | 578 + www/extras/yui/docs/YAHOO.util.History.html | 978 + www/extras/yui/docs/YAHOO.util.Motion.html | 263 + www/extras/yui/docs/YAHOO.util.Point.html | 250 + www/extras/yui/docs/YAHOO.util.Region.html | 581 + www/extras/yui/docs/YAHOO.util.Scroll.html | 263 + .../yui/docs/YAHOO.util.Subscriber.html | 406 + .../yui/docs/YAHOO.widget.AutoComplete.html | 3938 ++ www/extras/yui/docs/YAHOO.widget.Button.html | 4125 ++ .../yui/docs/YAHOO.widget.ButtonGroup.html | 1335 + .../yui/docs/YAHOO.widget.Calendar.html | 6049 +++ .../yui/docs/YAHOO.widget.Calendar2up.html | 294 + .../yui/docs/YAHOO.widget.CalendarGroup.html | 3142 ++ .../yui/docs/YAHOO.widget.Calendar_Core.html | 351 + .../docs/YAHOO.widget.ContainerEffect.html | 947 + .../yui/docs/YAHOO.widget.ContextMenu.html | 1205 + .../docs/YAHOO.widget.ContextMenuItem.html | 453 + .../yui/docs/YAHOO.widget.DS_JSArray.html | 326 + .../yui/docs/YAHOO.widget.DS_JSFunction.html | 326 + www/extras/yui/docs/YAHOO.widget.DS_XHR.html | 605 + .../yui/docs/YAHOO.widget.DataSource.html | 1074 + .../yui/docs/YAHOO.widget.DateMath.html | 951 + www/extras/yui/docs/YAHOO.widget.Dialog.html | 1655 + .../yui/docs/YAHOO.widget.HTMLNode.html | 449 + www/extras/yui/docs/YAHOO.widget.LogMsg.html | 264 + .../yui/docs/YAHOO.widget.LogReader.html | 2375 + .../yui/docs/YAHOO.widget.LogWriter.html | 382 + www/extras/yui/docs/YAHOO.widget.Logger.html | 1018 + www/extras/yui/docs/YAHOO.widget.Menu.html | 5640 ++ .../yui/docs/YAHOO.widget.MenuBarItem.html | 482 + .../yui/docs/YAHOO.widget.MenuItem.html | 2717 + .../yui/docs/YAHOO.widget.MenuManager.html | 1071 + .../yui/docs/YAHOO.widget.MenuNode.html | 335 + www/extras/yui/docs/YAHOO.widget.Menubar.html | 947 + www/extras/yui/docs/YAHOO.widget.Module.html | 1980 + www/extras/yui/docs/YAHOO.widget.Node.html | 2227 + www/extras/yui/docs/YAHOO.widget.Overlay.html | 2277 + .../yui/docs/YAHOO.widget.OverlayManager.html | 966 + www/extras/yui/docs/YAHOO.widget.Panel.html | 1741 + .../yui/docs/YAHOO.widget.RootNode.html | 295 + .../yui/docs/YAHOO.widget.SimpleDialog.html | 976 + www/extras/yui/docs/YAHOO.widget.Slider.html | 2308 + .../yui/docs/YAHOO.widget.SliderThumb.html | 858 + www/extras/yui/docs/YAHOO.widget.TVAnim.html | 316 + .../yui/docs/YAHOO.widget.TVFadeIn.html | 349 + .../yui/docs/YAHOO.widget.TVFadeOut.html | 349 + www/extras/yui/docs/YAHOO.widget.Tab.html | 995 + www/extras/yui/docs/YAHOO.widget.TabView.html | 1065 + .../yui/docs/YAHOO.widget.TextNode.html | 479 + www/extras/yui/docs/YAHOO.widget.Tooltip.html | 1255 + .../yui/docs/YAHOO.widget.TreeView.html | 2168 + www/extras/yui/docs/YAHOO_config.html | 173 + www/extras/yui/docs/assets/ac-js | 89 + www/extras/yui/docs/assets/api-js | 317 + www/extras/yui/docs/assets/api.css | 134 + www/extras/yui/docs/assets/logo.gif | Bin 0 -> 705 bytes .../yui/docs/assets/yui_cheatsheets.zip | Bin 0 -> 4156063 bytes www/extras/yui/docs/button.js.html | 3379 ++ www/extras/yui/docs/buttongroup.js.html | 952 + www/extras/yui/docs/connection.js.html | 1226 + www/extras/yui/docs/contextmenu.js.html | 598 + www/extras/yui/docs/contextmenuitem.js.html | 227 + www/extras/yui/docs/history.js.html | 868 + www/extras/yui/docs/index.html | 266 + www/extras/yui/docs/index.json | 1 + www/extras/yui/docs/menu.js.html | 4755 ++ www/extras/yui/docs/menubar.js.html | 566 + www/extras/yui/docs/menubaritem.js.html | 239 + www/extras/yui/docs/menuitem.js.html | 2395 + www/extras/yui/docs/menumanager.js.html | 790 + www/extras/yui/docs/module_animation.html | 140 + www/extras/yui/docs/module_autocomplete.html | 134 + www/extras/yui/docs/module_button.html | 162 + www/extras/yui/docs/module_calendar.html | 134 + www/extras/yui/docs/module_connection.html | 131 + www/extras/yui/docs/module_container.html | 144 + www/extras/yui/docs/module_datasource.html | 131 + www/extras/yui/docs/module_datatable.html | 139 + www/extras/yui/docs/module_dom.html | 131 + www/extras/yui/docs/module_dragdrop.html | 141 + www/extras/yui/docs/module_element.html | 134 + www/extras/yui/docs/module_event.html | 134 + www/extras/yui/docs/module_history.html | 131 + www/extras/yui/docs/module_logger.html | 138 + www/extras/yui/docs/module_menu.html | 154 + www/extras/yui/docs/module_slider.html | 135 + www/extras/yui/docs/module_tabview.html | 130 + www/extras/yui/docs/module_treeview.html | 144 + www/extras/yui/docs/module_yahoo.html | 134 + 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 | 95 + 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/assets/dpSyntaxHighlighter.css | 180 + .../examples/assets/dpSyntaxHighlighter.js | 735 + .../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 | 274 + .../examples/autocomplete/ysearch_flat.html | 279 + .../examples/autocomplete/ysearch_json.html | 180 + .../examples/autocomplete/ysearch_xml.html | 164 + www/extras/yui/examples/button/example01.html | 180 + www/extras/yui/examples/button/example02.html | 116 + www/extras/yui/examples/button/example03.html | 122 + www/extras/yui/examples/button/example04.html | 171 + www/extras/yui/examples/button/example05.html | 139 + www/extras/yui/examples/button/example06.html | 125 + www/extras/yui/examples/button/example07.html | 150 + www/extras/yui/examples/button/example08.html | 142 + www/extras/yui/examples/button/img/add.gif | Bin 0 -> 974 bytes www/extras/yui/examples/button/img/yahoo.gif | Bin 0 -> 175 bytes www/extras/yui/examples/button/index.html | 42 + .../yui/examples/calendar/assets/style.css | 62 + .../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 | 75 + .../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 | 112 + www/extras/yui/examples/connection/get.html | 120 + www/extras/yui/examples/connection/index.html | 23 + .../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 | 183 + .../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 .../container/assets/img/skin-chart.gif | Bin 0 -> 9222 bytes .../container/assets/img/skin-chart2.gif | Bin 0 -> 8997 bytes .../container/assets/img/skin-close.gif | Bin 0 -> 5063 bytes .../container/assets/img/skin-corners.gif | Bin 0 -> 6870 bytes .../container/assets/img/skin-final.gif | Bin 0 -> 4687 bytes .../container/assets/img/skin-module.gif | Bin 0 -> 2622 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 | 171 + .../yui/examples/container/dialog/2.html | 72 + .../examples/container/dialog/solution.html | 129 + .../yui/examples/container/effect/1.html | 98 + .../yui/examples/container/effect/2.html | 72 + .../examples/container/effect/solution.html | 98 + www/extras/yui/examples/container/index.html | 115 + .../yui/examples/container/keylistener/1.html | 101 + .../yui/examples/container/keylistener/2.html | 72 + .../container/keylistener/solution.html | 66 + .../yui/examples/container/module/1.html | 155 + .../yui/examples/container/module/2.html | 72 + .../examples/container/module/solution.html | 61 + .../yui/examples/container/overlay/1.html | 152 + .../yui/examples/container/overlay/2.html | 72 + .../examples/container/overlay/solution.html | 90 + .../examples/container/overlaymanager/1.html | 153 + .../examples/container/overlaymanager/2.html | 72 + .../container/overlaymanager/solution.html | 118 + .../yui/examples/container/panel/1.html | 108 + .../yui/examples/container/panel/2.html | 72 + .../examples/container/panel/solution.html | 66 + .../examples/container/panelphotobox/1.html | 338 + .../examples/container/panelphotobox/2.html | 72 + .../container/panelphotobox/solution.html | 291 + .../yui/examples/container/panelresize/1.html | 185 + .../yui/examples/container/panelresize/2.html | 72 + .../container/panelresize/solution.html | 188 + .../yui/examples/container/panelskin/1.html | 130 + .../yui/examples/container/panelskin/2.html | 72 + .../container/panelskin/solution.html | 106 + .../yui/examples/container/panelwait/1.html | 124 + .../yui/examples/container/panelwait/2.html | 72 + .../container/panelwait/solution.html | 78 + .../examples/container/simpledialog/1.html | 106 + .../examples/container/simpledialog/2.html | 72 + .../container/simpledialog/solution.html | 70 + www/extras/yui/examples/container/skin/1.html | 170 + www/extras/yui/examples/container/skin/2.html | 73 + .../yui/examples/container/skin/solution.html | 63 + .../yui/examples/container/tooltip/1.html | 93 + .../yui/examples/container/tooltip/2.html | 72 + .../examples/container/tooltip/solution.html | 36 + .../examples/container/tooltipmulti/1.html | 89 + .../examples/container/tooltipmulti/2.html | 72 + .../container/tooltipmulti/solution.html | 44 + www/extras/yui/examples/datatable/basic.html | 129 + .../yui/examples/datatable/complex.html | 249 + .../yui/examples/datatable/contextmenu.html | 226 + .../yui/examples/datatable/css/examples.css | 22 + .../yui/examples/datatable/customsort.html | 200 + .../yui/examples/datatable/enhanced.html | 208 + .../yui/examples/datatable/formatting.html | 157 + .../yui/examples/datatable/img/arrow_dn.gif | Bin 0 -> 61 bytes .../yui/examples/datatable/img/arrow_up.gif | Bin 0 -> 61 bytes .../yui/examples/datatable/img/logo.gif | Bin 0 -> 705 bytes www/extras/yui/examples/datatable/index.html | 41 + .../yui/examples/datatable/inlineediting.html | 150 + www/extras/yui/examples/datatable/js/data.js | 430 + .../yui/examples/datatable/nestedheaders.html | 142 + .../yui/examples/datatable/paginated.html | 192 + .../examples/datatable/php/json5000_proxy.php | 5010 ++ .../yui/examples/datatable/php/json_proxy.php | 7 + .../yui/examples/datatable/php/text_proxy.php | 20 + .../yui/examples/datatable/php/text_proxy.txt | 10 + .../examples/datatable/php/ylocal_proxy.php | 42 + .../yui/examples/datatable/rowselect.html | 151 + .../yui/examples/datatable/scrolling.html | 175 + .../yui/examples/datatable/xhrjson.html | 171 + .../yui/examples/datatable/xhrtext.html | 132 + www/extras/yui/examples/datatable/xhrxml.html | 184 + 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 | 242 + www/extras/yui/examples/dragdrop/css/ie.css | 1 + .../yui/examples/dragdrop/css/screen.css | 301 + www/extras/yui/examples/dragdrop/drag.html | 172 + www/extras/yui/examples/dragdrop/grid.html | 182 + .../yui/examples/dragdrop/img/GREYBG.PNG | Bin 0 -> 197 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 | 81 + .../yui/examples/dragdrop/interface.html | 151 + www/extras/yui/examples/dragdrop/js/DDList.js | 172 + 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 | 393 + .../yui/examples/dragdrop/multihandle.html | 166 + www/extras/yui/examples/dragdrop/ontop.html | 208 + www/extras/yui/examples/dragdrop/proxy.html | 293 + www/extras/yui/examples/dragdrop/resize.html | 195 + www/extras/yui/examples/dragdrop/slider.html | 576 + .../yui/examples/dragdrop/targetable.html | 219 + 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 | 168 + www/extras/yui/examples/event/index.html | 32 + www/extras/yui/examples/event/simple.html | 123 + .../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/history/assets/solution.css | 29 + .../yui/examples/history/assets/style.css | 29 + .../yui/examples/history/assets/tutorial.css | 62 + .../yui/examples/history/assets/yui.gif | Bin 0 -> 2425 bytes .../yui/examples/history/calendar/index.html | 178 + .../examples/history/calendar/solution.html | 93 + www/extras/yui/examples/history/index.html | 52 + .../yui/examples/history/multi/index.html | 48 + .../yui/examples/history/multi/solution.html | 174 + .../examples/history/navbar/inc/aboutus.html | 12 + .../history/navbar/inc/contactus.html | 12 + .../yui/examples/history/navbar/inc/home.html | 12 + .../yui/examples/history/navbar/inc/news.html | 12 + .../examples/history/navbar/inc/overview.html | 12 + .../examples/history/navbar/inc/products.html | 12 + .../yui/examples/history/navbar/index.html | 272 + .../history/navbar/solution/inc/aboutus.html | 12 + .../navbar/solution/inc/contactus.html | 12 + .../history/navbar/solution/inc/home.html | 12 + .../history/navbar/solution/inc/news.html | 12 + .../history/navbar/solution/inc/overview.html | 12 + .../history/navbar/solution/inc/products.html | 12 + .../history/navbar/solution/index.html | 187 + .../history/navbar/solution/style.css | 65 + .../yui/examples/history/tabview/index.html | 206 + .../examples/history/tabview/solution.html | 119 + www/extras/yui/examples/logger/basic.html | 72 + .../yui/examples/logger/css/examples.css | 20 + www/extras/yui/examples/logger/img/logo.gif | Bin 0 -> 705 bytes www/extras/yui/examples/logger/index.html | 29 + .../yui/examples/logger/integration.html | 175 + www/extras/yui/examples/logger/logreader.html | 419 + www/extras/yui/examples/logger/logwriter.html | 177 + .../yui/examples/menu/applicationmenubar.html | 231 + www/extras/yui/examples/menu/contextmenu.html | 518 + www/extras/yui/examples/menu/example01.html | 111 + www/extras/yui/examples/menu/example02.html | 102 + www/extras/yui/examples/menu/example03.html | 123 + www/extras/yui/examples/menu/example04.html | 121 + www/extras/yui/examples/menu/example05.html | 126 + www/extras/yui/examples/menu/example06.html | 126 + www/extras/yui/examples/menu/example07.html | 197 + www/extras/yui/examples/menu/example08.html | 163 + www/extras/yui/examples/menu/example09.html | 190 + www/extras/yui/examples/menu/example10.html | 236 + www/extras/yui/examples/menu/example11.html | 118 + www/extras/yui/examples/menu/example12.html | 217 + 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 .../examples/menu/img/menubar_background.gif | Bin 0 -> 154 bytes www/extras/yui/examples/menu/index.html | 41 + .../yui/examples/menu/leftnavfromjs.html | 231 + .../examples/menu/leftnavfromjswithanim.html | 247 + .../yui/examples/menu/leftnavfrommarkup.html | 236 + .../menu/leftnavfrommarkupwithanim.html | 242 + .../yui/examples/menu/programsmenu.html | 389 + .../yui/examples/menu/tablecontextmenu.html | 288 + .../yui/examples/menu/topnavfromjs.html | 251 + .../examples/menu/topnavfromjswithanim.html | 362 + .../yui/examples/menu/topnavfrommarkup.html | 246 + .../menu/topnavfrommarkupwithanim.html | 369 + .../examples/menu/treeviewcontextmenu.html | 275 + .../yui/examples/reset/example_default.html | 69 + www/extras/yui/examples/reset/index.html | 47 + www/extras/yui/examples/slider/basic.html | 221 + www/extras/yui/examples/slider/css/screen.css | 289 + 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 | 349 + 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 | 385 + www/extras/yui/examples/slider/rgb2.html | 283 + .../yui/examples/tabview/activation.html | 74 + .../yui/examples/tabview/add_events.html | 74 + www/extras/yui/examples/tabview/add_tabs.html | 82 + .../yui/examples/tabview/basic_from_js.html | 56 + .../examples/tabview/basic_from_markup.html | 66 + .../tabview/basic_from_partial_markup.html | 64 + .../yui/examples/tabview/css/example.css | 52 + .../yui/examples/tabview/css/module_tabs.css | 31 + .../yui/examples/tabview/css/round_tabs.css | 76 + .../yui/examples/tabview/custom_events.html | 71 + .../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 | 71 + .../yui/examples/tabview/module_tabs.html | 104 + .../examples/tabview/orientation_bottom.html | 79 + .../examples/tabview/orientation_left.html | 76 + .../examples/tabview/orientation_right.html | 77 + .../yui/examples/tabview/php/nonsense.php | 28 + .../yui/examples/tabview/remove_events.html | 75 + .../yui/examples/tabview/remove_tabs.html | 69 + .../yui/examples/tabview/rounded_tabs.html | 70 + .../examples/tabview/stop_custom_events.html | 72 + .../yui/examples/tabview/transition.html | 91 + www/extras/yui/examples/treeview/anim.html | 209 + www/extras/yui/examples/treeview/check.html | 227 + .../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 + .../yui/examples/treeview/customicons.html | 284 + www/extras/yui/examples/treeview/default.html | 217 + www/extras/yui/examples/treeview/dynamic.html | 274 + www/extras/yui/examples/treeview/folders.html | 185 + www/extras/yui/examples/treeview/html.html | 210 + .../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 .../yui/examples/treeview/img/icons.png | Bin 0 -> 2569 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 | 45 + .../examples/treeview/js/CheckOnClickNode.js | 23 + .../yui/examples/treeview/js/TaskNode.js | 294 + .../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 | 241 + www/extras/yui/examples/treeview/multi.html | 186 + 1992 files changed, 645731 insertions(+) create mode 100644 www/extras/yui-ext/INCLUDE_ORDER.txt create mode 100644 www/extras/yui-ext/LICENSE.txt create mode 100644 www/extras/yui-ext/adapter/jquery/ext-jquery-adapter.js create mode 100644 www/extras/yui-ext/adapter/jquery/jquery-plugins.js create mode 100644 www/extras/yui-ext/adapter/jquery/jquery.js create mode 100644 www/extras/yui-ext/adapter/prototype/effects.js create mode 100644 www/extras/yui-ext/adapter/prototype/ext-prototype-adapter.js create mode 100644 www/extras/yui-ext/adapter/prototype/prototype.js create mode 100644 www/extras/yui-ext/adapter/prototype/scriptaculous.js create mode 100644 www/extras/yui-ext/adapter/yui/ext-yui-adapter.js create mode 100644 www/extras/yui-ext/adapter/yui/yui-utilities.js create mode 100644 www/extras/yui-ext/build/adapter/jquery-bridge-min.js create mode 100644 www/extras/yui-ext/build/adapter/prototype-bridge-min.js create mode 100644 www/extras/yui-ext/build/adapter/yui-bridge-min.js create mode 100644 www/extras/yui-ext/build/core/CompositeElement-min.js create mode 100644 www/extras/yui-ext/build/core/DomHelper-min.js create mode 100644 www/extras/yui-ext/build/core/DomQuery-min.js create mode 100644 www/extras/yui-ext/build/core/Element-min.js create mode 100644 www/extras/yui-ext/build/core/EventManager-min.js create mode 100644 www/extras/yui-ext/build/core/Ext-min.js create mode 100644 www/extras/yui-ext/build/core/Fx-min.js create mode 100644 www/extras/yui-ext/build/core/Template-min.js create mode 100644 www/extras/yui-ext/build/core/UpdateManager-min.js create mode 100644 www/extras/yui-ext/build/data/ArrayReader-min.js create mode 100644 www/extras/yui-ext/build/data/Connection-min.js create mode 100644 www/extras/yui-ext/build/data/DataField-min.js create mode 100644 www/extras/yui-ext/build/data/DataProxy-min.js create mode 100644 www/extras/yui-ext/build/data/DataReader-min.js create mode 100644 www/extras/yui-ext/build/data/HttpProxy-min.js create mode 100644 www/extras/yui-ext/build/data/JsonReader-min.js create mode 100644 www/extras/yui-ext/build/data/MemoryProxy-min.js create mode 100644 www/extras/yui-ext/build/data/Record-min.js create mode 100644 www/extras/yui-ext/build/data/ScriptTagProxy-min.js create mode 100644 www/extras/yui-ext/build/data/SimpleStore-min.js create mode 100644 www/extras/yui-ext/build/data/SortTypes-min.js create mode 100644 www/extras/yui-ext/build/data/Store-min.js create mode 100644 www/extras/yui-ext/build/data/Tree-min.js create mode 100644 www/extras/yui-ext/build/data/XmlReader-min.js create mode 100644 www/extras/yui-ext/build/dd/DDCore-min.js create mode 100644 www/extras/yui-ext/build/dd/DragSource-min.js create mode 100644 www/extras/yui-ext/build/dd/DragZone-min.js create mode 100644 www/extras/yui-ext/build/dd/DropTarget-min.js create mode 100644 www/extras/yui-ext/build/dd/DropZone-min.js create mode 100644 www/extras/yui-ext/build/dd/Registry-min.js create mode 100644 www/extras/yui-ext/build/dd/ScrollManager-min.js create mode 100644 www/extras/yui-ext/build/dd/StatusProxy-min.js create mode 100644 www/extras/yui-ext/build/debug-min.js create mode 100644 www/extras/yui-ext/build/legacy/Actor-min.js create mode 100644 www/extras/yui-ext/build/legacy/Animator-min.js create mode 100644 www/extras/yui-ext/build/legacy/InlineEditor-min.js create mode 100644 www/extras/yui-ext/build/legacy/compat-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-da-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-de-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-en-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-fr_CA-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-hr-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-hu-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-it-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-ja-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-lv-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-mk-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-nl-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-no-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-pl-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-pt_br-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-ro-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-ru-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-sk-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-sp-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-sv_se-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-tr-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-vn-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-zh_CN-min.js create mode 100644 www/extras/yui-ext/build/locale/ext-lang-zh_TW-min.js create mode 100644 www/extras/yui-ext/build/state/State-min.js create mode 100644 www/extras/yui-ext/build/util/CSS-min.js create mode 100644 www/extras/yui-ext/build/util/ClickRepeater-min.js create mode 100644 www/extras/yui-ext/build/util/Date-min.js create mode 100644 www/extras/yui-ext/build/util/DelayedTask-min.js create mode 100644 www/extras/yui-ext/build/util/Format-min.js create mode 100644 www/extras/yui-ext/build/util/JSON-min.js create mode 100644 www/extras/yui-ext/build/util/KeyMap-min.js create mode 100644 www/extras/yui-ext/build/util/KeyNav-min.js create mode 100644 www/extras/yui-ext/build/util/MixedCollection-min.js create mode 100644 www/extras/yui-ext/build/util/Observable-min.js create mode 100644 www/extras/yui-ext/build/util/TaskMgr-min.js create mode 100644 www/extras/yui-ext/build/util/TextMetrics-min.js create mode 100644 www/extras/yui-ext/build/widgets/BasicDialog-min.js create mode 100644 www/extras/yui-ext/build/widgets/BoxComponent-min.js create mode 100644 www/extras/yui-ext/build/widgets/Button-min.js create mode 100644 www/extras/yui-ext/build/widgets/ColorPalette-min.js create mode 100644 www/extras/yui-ext/build/widgets/Component-min.js create mode 100644 www/extras/yui-ext/build/widgets/DatePicker-min.js create mode 100644 www/extras/yui-ext/build/widgets/Editor-min.js create mode 100644 www/extras/yui-ext/build/widgets/JsonView-min.js create mode 100644 www/extras/yui-ext/build/widgets/Layer-min.js create mode 100644 www/extras/yui-ext/build/widgets/LoadMask-min.js create mode 100644 www/extras/yui-ext/build/widgets/MenuButton-min.js create mode 100644 www/extras/yui-ext/build/widgets/MessageBox-min.js create mode 100644 www/extras/yui-ext/build/widgets/PagingToolbar-min.js create mode 100644 www/extras/yui-ext/build/widgets/QuickTips-min.js create mode 100644 www/extras/yui-ext/build/widgets/Resizable-min.js create mode 100644 www/extras/yui-ext/build/widgets/Shadow-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/Toolbar-min.js create mode 100644 www/extras/yui-ext/build/widgets/View-min.js create mode 100644 www/extras/yui-ext/build/widgets/form/Action-min.js create mode 100644 www/extras/yui-ext/build/widgets/form/BasicForm-min.js create mode 100644 www/extras/yui-ext/build/widgets/form/Checkbox-min.js create mode 100644 www/extras/yui-ext/build/widgets/form/Combo-min.js create mode 100644 www/extras/yui-ext/build/widgets/form/DateField-min.js create mode 100644 www/extras/yui-ext/build/widgets/form/Field-min.js create mode 100644 www/extras/yui-ext/build/widgets/form/Form-min.js create mode 100644 www/extras/yui-ext/build/widgets/form/Layout-min.js create mode 100644 www/extras/yui-ext/build/widgets/form/NumberField-min.js create mode 100644 www/extras/yui-ext/build/widgets/form/Radio-min.js create mode 100644 www/extras/yui-ext/build/widgets/form/TextArea-min.js create mode 100644 www/extras/yui-ext/build/widgets/form/TextField-min.js create mode 100644 www/extras/yui-ext/build/widgets/form/TriggerField-min.js create mode 100644 www/extras/yui-ext/build/widgets/form/VTypes-min.js create mode 100644 www/extras/yui-ext/build/widgets/grid/AbstractGridView-min.js create mode 100644 www/extras/yui-ext/build/widgets/grid/AbstractSelectionModel-min.js create mode 100644 www/extras/yui-ext/build/widgets/grid/CellSelectionModel-min.js create mode 100644 www/extras/yui-ext/build/widgets/grid/ColumnDD-min.js create mode 100644 www/extras/yui-ext/build/widgets/grid/ColumnModel-min.js create mode 100644 www/extras/yui-ext/build/widgets/grid/ColumnSplitDD-min.js create mode 100644 www/extras/yui-ext/build/widgets/grid/EditorGrid-min.js create mode 100644 www/extras/yui-ext/build/widgets/grid/Grid-min.js create mode 100644 www/extras/yui-ext/build/widgets/grid/GridDD-min.js create mode 100644 www/extras/yui-ext/build/widgets/grid/GridEditor-min.js create mode 100644 www/extras/yui-ext/build/widgets/grid/GridView-min.js create mode 100644 www/extras/yui-ext/build/widgets/grid/PropertyGrid-min.js create mode 100644 www/extras/yui-ext/build/widgets/grid/RowSelectionModel-min.js create mode 100644 www/extras/yui-ext/build/widgets/layout/BasicLayoutRegion-min.js create mode 100644 www/extras/yui-ext/build/widgets/layout/BorderLayout-min.js create mode 100644 www/extras/yui-ext/build/widgets/layout/BorderLayoutRegions-min.js create mode 100644 www/extras/yui-ext/build/widgets/layout/ContentPanels-min.js create mode 100644 www/extras/yui-ext/build/widgets/layout/LayoutManager-min.js create mode 100644 www/extras/yui-ext/build/widgets/layout/LayoutRegion-min.js create mode 100644 www/extras/yui-ext/build/widgets/layout/LayoutStateManager-min.js create mode 100644 www/extras/yui-ext/build/widgets/layout/ReaderLayout-min.js create mode 100644 www/extras/yui-ext/build/widgets/layout/SplitLayoutRegion-min.js create mode 100644 www/extras/yui-ext/build/widgets/menu/Adapter-min.js create mode 100644 www/extras/yui-ext/build/widgets/menu/BaseItem-min.js create mode 100644 www/extras/yui-ext/build/widgets/menu/CheckItem-min.js create mode 100644 www/extras/yui-ext/build/widgets/menu/ColorItem-min.js create mode 100644 www/extras/yui-ext/build/widgets/menu/ColorMenu-min.js create mode 100644 www/extras/yui-ext/build/widgets/menu/DateItem-min.js create mode 100644 www/extras/yui-ext/build/widgets/menu/DateMenu-min.js create mode 100644 www/extras/yui-ext/build/widgets/menu/Item-min.js create mode 100644 www/extras/yui-ext/build/widgets/menu/Menu-min.js create mode 100644 www/extras/yui-ext/build/widgets/menu/MenuMgr-min.js create mode 100644 www/extras/yui-ext/build/widgets/menu/Separator-min.js create mode 100644 www/extras/yui-ext/build/widgets/menu/TextItem-min.js create mode 100644 www/extras/yui-ext/build/widgets/tree/AsyncTreeNode-min.js create mode 100644 www/extras/yui-ext/build/widgets/tree/TreeDragZone-min.js create mode 100644 www/extras/yui-ext/build/widgets/tree/TreeDropZone-min.js create mode 100644 www/extras/yui-ext/build/widgets/tree/TreeEditor-min.js create mode 100644 www/extras/yui-ext/build/widgets/tree/TreeFilter-min.js create mode 100644 www/extras/yui-ext/build/widgets/tree/TreeLoader-min.js create mode 100644 www/extras/yui-ext/build/widgets/tree/TreeNode-min.js create mode 100644 www/extras/yui-ext/build/widgets/tree/TreeNodeUI-min.js create mode 100644 www/extras/yui-ext/build/widgets/tree/TreePanel-min.js create mode 100644 www/extras/yui-ext/build/widgets/tree/TreeSelectionModel-min.js create mode 100644 www/extras/yui-ext/build/widgets/tree/TreeSorter-min.js create mode 100644 www/extras/yui-ext/build/yui/animation-min.js create mode 100644 www/extras/yui-ext/build/yui/connection-min.js create mode 100644 www/extras/yui-ext/build/yui/dom-min.js create mode 100644 www/extras/yui-ext/build/yui/event-min.js create mode 100644 www/extras/yui-ext/build/yui/yahoo-min.js create mode 100644 www/extras/yui-ext/docs/index.html create mode 100644 www/extras/yui-ext/docs/output/AbstractGridView.jss.html create mode 100644 www/extras/yui-ext/docs/output/AbstractSelectionModel.jss.html create mode 100644 www/extras/yui-ext/docs/output/Action.jss.html create mode 100644 www/extras/yui-ext/docs/output/Adapter.jss.html create mode 100644 www/extras/yui-ext/docs/output/ArrayReader.jss.html create mode 100644 www/extras/yui-ext/docs/output/AsyncTreeNode.jss.html create mode 100644 www/extras/yui-ext/docs/output/AutoLayout.jss.html create mode 100644 www/extras/yui-ext/docs/output/BaseItem.jss.html create mode 100644 www/extras/yui-ext/docs/output/BasicDialog.jss.html create mode 100644 www/extras/yui-ext/docs/output/BasicForm.jss.html create mode 100644 www/extras/yui-ext/docs/output/BasicLayoutRegion.jss.html create mode 100644 www/extras/yui-ext/docs/output/BorderLayout.jss.html create mode 100644 www/extras/yui-ext/docs/output/BorderLayoutRegions.jss.html create mode 100644 www/extras/yui-ext/docs/output/BoxComponent.jss.html create mode 100644 www/extras/yui-ext/docs/output/Button.jss.html create mode 100644 www/extras/yui-ext/docs/output/ButtonPanel.jss.html create mode 100644 www/extras/yui-ext/docs/output/CSS.jss.html create mode 100644 www/extras/yui-ext/docs/output/CellSelectionModel.jss.html create mode 100644 www/extras/yui-ext/docs/output/CheckItem.jss.html create mode 100644 www/extras/yui-ext/docs/output/Checkbox.jss.html create mode 100644 www/extras/yui-ext/docs/output/ClickRepeater.jss.html create mode 100644 www/extras/yui-ext/docs/output/ColorItem.jss.html create mode 100644 www/extras/yui-ext/docs/output/ColorMenu.jss.html create mode 100644 www/extras/yui-ext/docs/output/ColorPalette.jss.html create mode 100644 www/extras/yui-ext/docs/output/ColumnDD.jss.html create mode 100644 www/extras/yui-ext/docs/output/ColumnModel.jss.html create mode 100644 www/extras/yui-ext/docs/output/ColumnSplitDD.jss.html create mode 100644 www/extras/yui-ext/docs/output/Combo.jss.html create mode 100644 www/extras/yui-ext/docs/output/Component.jss.html create mode 100644 www/extras/yui-ext/docs/output/CompositeElement.jss.html create mode 100644 www/extras/yui-ext/docs/output/Connection.jss.html create mode 100644 www/extras/yui-ext/docs/output/Container.jss.html create mode 100644 www/extras/yui-ext/docs/output/ContainerLayout.jss.html create mode 100644 www/extras/yui-ext/docs/output/ContentPanels.jss.html create mode 100644 www/extras/yui-ext/docs/output/DDCore.jss.html create mode 100644 www/extras/yui-ext/docs/output/DataField.jss.html create mode 100644 www/extras/yui-ext/docs/output/DataProxy.jss.html create mode 100644 www/extras/yui-ext/docs/output/DataReader.jss.html create mode 100644 www/extras/yui-ext/docs/output/Date.html create mode 100644 www/extras/yui-ext/docs/output/Date.jss.html create mode 100644 www/extras/yui-ext/docs/output/DateField.jss.html create mode 100644 www/extras/yui-ext/docs/output/DateItem.jss.html create mode 100644 www/extras/yui-ext/docs/output/DateMenu.jss.html create mode 100644 www/extras/yui-ext/docs/output/DatePicker.jss.html create mode 100644 www/extras/yui-ext/docs/output/DelayedTask.jss.html create mode 100644 www/extras/yui-ext/docs/output/DomHelper.jss.html create mode 100644 www/extras/yui-ext/docs/output/DomQuery.jss.html create mode 100644 www/extras/yui-ext/docs/output/DragSource.jss.html create mode 100644 www/extras/yui-ext/docs/output/DragZone.jss.html create mode 100644 www/extras/yui-ext/docs/output/DropTarget.jss.html create mode 100644 www/extras/yui-ext/docs/output/DropZone.jss.html create mode 100644 www/extras/yui-ext/docs/output/Editor.jss.html create mode 100644 www/extras/yui-ext/docs/output/EditorGrid.jss.html create mode 100644 www/extras/yui-ext/docs/output/Element.jss.html create mode 100644 www/extras/yui-ext/docs/output/EventManager.jss.html create mode 100644 www/extras/yui-ext/docs/output/Ext.BasicDialog.html create mode 100644 www/extras/yui-ext/docs/output/Ext.BasicLayoutRegion.html create mode 100644 www/extras/yui-ext/docs/output/Ext.BorderLayout.html create mode 100644 www/extras/yui-ext/docs/output/Ext.Button.html create mode 100644 www/extras/yui-ext/docs/output/Ext.ColorPalette.html create mode 100644 www/extras/yui-ext/docs/output/Ext.Component.html create mode 100644 www/extras/yui-ext/docs/output/Ext.ComponentMgr.html create mode 100644 www/extras/yui-ext/docs/output/Ext.CompositeElement.html create mode 100644 www/extras/yui-ext/docs/output/Ext.CompositeElementLite.html create mode 100644 www/extras/yui-ext/docs/output/Ext.ContentPanel.html create mode 100644 www/extras/yui-ext/docs/output/Ext.DatePicker.html create mode 100644 www/extras/yui-ext/docs/output/Ext.DialogManager.html create mode 100644 www/extras/yui-ext/docs/output/Ext.DomHelper.html create mode 100644 www/extras/yui-ext/docs/output/Ext.DomQuery.html create mode 100644 www/extras/yui-ext/docs/output/Ext.Editor.html create mode 100644 www/extras/yui-ext/docs/output/Ext.Element.html create mode 100644 www/extras/yui-ext/docs/output/Ext.EventManager.html create mode 100644 www/extras/yui-ext/docs/output/Ext.EventObject.html create mode 100644 www/extras/yui-ext/docs/output/Ext.Fx.html create mode 100644 www/extras/yui-ext/docs/output/Ext.GridPanel.html create mode 100644 www/extras/yui-ext/docs/output/Ext.JsonView.html create mode 100644 www/extras/yui-ext/docs/output/Ext.KeyMap.html create mode 100644 www/extras/yui-ext/docs/output/Ext.KeyNav.html create mode 100644 www/extras/yui-ext/docs/output/Ext.Layer.html create mode 100644 www/extras/yui-ext/docs/output/Ext.LayoutDialog.html create mode 100644 www/extras/yui-ext/docs/output/Ext.LayoutManager.html create mode 100644 www/extras/yui-ext/docs/output/Ext.LayoutRegion.html create mode 100644 www/extras/yui-ext/docs/output/Ext.LoadMask.html create mode 100644 www/extras/yui-ext/docs/output/Ext.MasterTemplate.html create mode 100644 www/extras/yui-ext/docs/output/Ext.MenuButton.html create mode 100644 www/extras/yui-ext/docs/output/Ext.MessageBox.html create mode 100644 www/extras/yui-ext/docs/output/Ext.NestedLayoutPanel.html create mode 100644 www/extras/yui-ext/docs/output/Ext.PagingToolbar.html create mode 100644 www/extras/yui-ext/docs/output/Ext.QuickTips.html create mode 100644 www/extras/yui-ext/docs/output/Ext.ReaderLayout.html create mode 100644 www/extras/yui-ext/docs/output/Ext.Resizable.html create mode 100644 www/extras/yui-ext/docs/output/Ext.Shadow.html create mode 100644 www/extras/yui-ext/docs/output/Ext.SplitBar.AbsoluteLayoutAdapter.html create mode 100644 www/extras/yui-ext/docs/output/Ext.SplitBar.BasicLayoutAdapter.html create mode 100644 www/extras/yui-ext/docs/output/Ext.SplitBar.html create mode 100644 www/extras/yui-ext/docs/output/Ext.SplitLayoutRegion.html create mode 100644 www/extras/yui-ext/docs/output/Ext.TabPanel.html create mode 100644 www/extras/yui-ext/docs/output/Ext.TabPanelItem.html create mode 100644 www/extras/yui-ext/docs/output/Ext.Template.html create mode 100644 www/extras/yui-ext/docs/output/Ext.Toolbar.Button.html create mode 100644 www/extras/yui-ext/docs/output/Ext.Toolbar.Item.html create mode 100644 www/extras/yui-ext/docs/output/Ext.Toolbar.MenuButton.html create mode 100644 www/extras/yui-ext/docs/output/Ext.Toolbar.Separator.html create mode 100644 www/extras/yui-ext/docs/output/Ext.Toolbar.Spacer.html create mode 100644 www/extras/yui-ext/docs/output/Ext.Toolbar.TextItem.html create mode 100644 www/extras/yui-ext/docs/output/Ext.Toolbar.html create mode 100644 www/extras/yui-ext/docs/output/Ext.UpdateManager.BasicRenderer.html create mode 100644 www/extras/yui-ext/docs/output/Ext.UpdateManager.defaults.html create mode 100644 www/extras/yui-ext/docs/output/Ext.UpdateManager.html create mode 100644 www/extras/yui-ext/docs/output/Ext.View.html create mode 100644 www/extras/yui-ext/docs/output/Ext.WindowManager.html create mode 100644 www/extras/yui-ext/docs/output/Ext.data.ArrayReader.html create mode 100644 www/extras/yui-ext/docs/output/Ext.data.Connection.html create mode 100644 www/extras/yui-ext/docs/output/Ext.data.DataProxy.html create mode 100644 www/extras/yui-ext/docs/output/Ext.data.HttpProxy.html create mode 100644 www/extras/yui-ext/docs/output/Ext.data.JsonReader.html create mode 100644 www/extras/yui-ext/docs/output/Ext.data.MemoryProxy.html create mode 100644 www/extras/yui-ext/docs/output/Ext.data.Node.html create mode 100644 www/extras/yui-ext/docs/output/Ext.data.Record.html create mode 100644 www/extras/yui-ext/docs/output/Ext.data.ScriptTagProxy.html create mode 100644 www/extras/yui-ext/docs/output/Ext.data.SimpleStore.html create mode 100644 www/extras/yui-ext/docs/output/Ext.data.SortTypes.html create mode 100644 www/extras/yui-ext/docs/output/Ext.data.Store.html create mode 100644 www/extras/yui-ext/docs/output/Ext.data.Tree.html create mode 100644 www/extras/yui-ext/docs/output/Ext.data.XmlReader.html create mode 100644 www/extras/yui-ext/docs/output/Ext.dd.DD.html create mode 100644 www/extras/yui-ext/docs/output/Ext.dd.DDProxy.html create mode 100644 www/extras/yui-ext/docs/output/Ext.dd.DDTarget.html create mode 100644 www/extras/yui-ext/docs/output/Ext.dd.DragDrop.html create mode 100644 www/extras/yui-ext/docs/output/Ext.dd.DragDropMgr.html create mode 100644 www/extras/yui-ext/docs/output/Ext.dd.DragSource.html create mode 100644 www/extras/yui-ext/docs/output/Ext.dd.DragZone.html create mode 100644 www/extras/yui-ext/docs/output/Ext.dd.DropTarget.html create mode 100644 www/extras/yui-ext/docs/output/Ext.dd.DropZone.html create mode 100644 www/extras/yui-ext/docs/output/Ext.dd.Registry.html create mode 100644 www/extras/yui-ext/docs/output/Ext.dd.ScrollManager.html create mode 100644 www/extras/yui-ext/docs/output/Ext.dd.StatusProxy.html create mode 100644 www/extras/yui-ext/docs/output/Ext.form.BasicForm.html create mode 100644 www/extras/yui-ext/docs/output/Ext.form.Checkbox.html create mode 100644 www/extras/yui-ext/docs/output/Ext.form.Column.html create mode 100644 www/extras/yui-ext/docs/output/Ext.form.ComboBox.html create mode 100644 www/extras/yui-ext/docs/output/Ext.form.DateField.html create mode 100644 www/extras/yui-ext/docs/output/Ext.form.Field.html create mode 100644 www/extras/yui-ext/docs/output/Ext.form.FieldSet.html create mode 100644 www/extras/yui-ext/docs/output/Ext.form.Form.html create mode 100644 www/extras/yui-ext/docs/output/Ext.form.Layout.html create mode 100644 www/extras/yui-ext/docs/output/Ext.form.NumberField.html create mode 100644 www/extras/yui-ext/docs/output/Ext.form.Radio.html create mode 100644 www/extras/yui-ext/docs/output/Ext.form.TextArea.html create mode 100644 www/extras/yui-ext/docs/output/Ext.form.TextField.html create mode 100644 www/extras/yui-ext/docs/output/Ext.form.TriggerField.html create mode 100644 www/extras/yui-ext/docs/output/Ext.form.VTypes.html create mode 100644 www/extras/yui-ext/docs/output/Ext.grid.AbstractSelectionModel.html create mode 100644 www/extras/yui-ext/docs/output/Ext.grid.CellSelectionModel.html create mode 100644 www/extras/yui-ext/docs/output/Ext.grid.ColumnModel.html create mode 100644 www/extras/yui-ext/docs/output/Ext.grid.EditorGrid.html create mode 100644 www/extras/yui-ext/docs/output/Ext.grid.Grid.html create mode 100644 www/extras/yui-ext/docs/output/Ext.grid.GridView.html create mode 100644 www/extras/yui-ext/docs/output/Ext.grid.RowSelectionModel.html create mode 100644 www/extras/yui-ext/docs/output/Ext.html create mode 100644 www/extras/yui-ext/docs/output/Ext.jss.html create mode 100644 www/extras/yui-ext/docs/output/Ext.menu.Adapter.html create mode 100644 www/extras/yui-ext/docs/output/Ext.menu.BaseItem.html create mode 100644 www/extras/yui-ext/docs/output/Ext.menu.CheckItem.html create mode 100644 www/extras/yui-ext/docs/output/Ext.menu.ColorItem.html create mode 100644 www/extras/yui-ext/docs/output/Ext.menu.ColorMenu.html create mode 100644 www/extras/yui-ext/docs/output/Ext.menu.DateItem.html create mode 100644 www/extras/yui-ext/docs/output/Ext.menu.DateMenu.html create mode 100644 www/extras/yui-ext/docs/output/Ext.menu.Item.html create mode 100644 www/extras/yui-ext/docs/output/Ext.menu.Menu.html create mode 100644 www/extras/yui-ext/docs/output/Ext.menu.MenuMgr.html create mode 100644 www/extras/yui-ext/docs/output/Ext.menu.Separator.html create mode 100644 www/extras/yui-ext/docs/output/Ext.menu.TextItem.html create mode 100644 www/extras/yui-ext/docs/output/Ext.state.CookieProvider.html create mode 100644 www/extras/yui-ext/docs/output/Ext.state.Manager.html create mode 100644 www/extras/yui-ext/docs/output/Ext.state.Provider.html create mode 100644 www/extras/yui-ext/docs/output/Ext.tree.AsyncTreeNode.html create mode 100644 www/extras/yui-ext/docs/output/Ext.tree.DefaultSelectionModel.html create mode 100644 www/extras/yui-ext/docs/output/Ext.tree.MultiSelectionModel.html create mode 100644 www/extras/yui-ext/docs/output/Ext.tree.TreeLoader.html create mode 100644 www/extras/yui-ext/docs/output/Ext.tree.TreeNode.html create mode 100644 www/extras/yui-ext/docs/output/Ext.tree.TreePanel.html create mode 100644 www/extras/yui-ext/docs/output/Ext.tree.TreeSorter.html create mode 100644 www/extras/yui-ext/docs/output/Ext.util.CSS.html create mode 100644 www/extras/yui-ext/docs/output/Ext.util.ClickRepeater.html create mode 100644 www/extras/yui-ext/docs/output/Ext.util.DelayedTask.html create mode 100644 www/extras/yui-ext/docs/output/Ext.util.Format.html create mode 100644 www/extras/yui-ext/docs/output/Ext.util.JSON.html create mode 100644 www/extras/yui-ext/docs/output/Ext.util.MixedCollection.html create mode 100644 www/extras/yui-ext/docs/output/Ext.util.Observable.html create mode 100644 www/extras/yui-ext/docs/output/Ext.util.TextMetrics.html create mode 100644 www/extras/yui-ext/docs/output/Field.jss.html create mode 100644 www/extras/yui-ext/docs/output/Form.jss.html create mode 100644 www/extras/yui-ext/docs/output/Format.jss.html create mode 100644 www/extras/yui-ext/docs/output/Function.html create mode 100644 www/extras/yui-ext/docs/output/Fx.jss.html create mode 100644 www/extras/yui-ext/docs/output/Grid.jss.html create mode 100644 www/extras/yui-ext/docs/output/GridDD.jss.html create mode 100644 www/extras/yui-ext/docs/output/GridEditor.jss.html create mode 100644 www/extras/yui-ext/docs/output/GridView.jss.html create mode 100644 www/extras/yui-ext/docs/output/HttpProxy.jss.html create mode 100644 www/extras/yui-ext/docs/output/Item.jss.html create mode 100644 www/extras/yui-ext/docs/output/JSON.jss.html create mode 100644 www/extras/yui-ext/docs/output/JsonReader.jss.html create mode 100644 www/extras/yui-ext/docs/output/JsonView.jss.html create mode 100644 www/extras/yui-ext/docs/output/KeyMap.jss.html create mode 100644 www/extras/yui-ext/docs/output/KeyNav.jss.html create mode 100644 www/extras/yui-ext/docs/output/Layer.jss.html create mode 100644 www/extras/yui-ext/docs/output/Layout.jss.html create mode 100644 www/extras/yui-ext/docs/output/LayoutManager.jss.html create mode 100644 www/extras/yui-ext/docs/output/LayoutRegion.jss.html create mode 100644 www/extras/yui-ext/docs/output/LayoutStateManager.jss.html create mode 100644 www/extras/yui-ext/docs/output/LoadMask.jss.html create mode 100644 www/extras/yui-ext/docs/output/MemoryProxy.jss.html create mode 100644 www/extras/yui-ext/docs/output/Menu.jss.html create mode 100644 www/extras/yui-ext/docs/output/MenuButton.jss.html create mode 100644 www/extras/yui-ext/docs/output/MenuMgr.jss.html create mode 100644 www/extras/yui-ext/docs/output/MessageBox.jss.html create mode 100644 www/extras/yui-ext/docs/output/MixedCollection.jss.html create mode 100644 www/extras/yui-ext/docs/output/NumberField.jss.html create mode 100644 www/extras/yui-ext/docs/output/Observable.jss.html create mode 100644 www/extras/yui-ext/docs/output/PagingToolbar.jss.html create mode 100644 www/extras/yui-ext/docs/output/Panel.jss.html create mode 100644 www/extras/yui-ext/docs/output/PropertyGrid.jss.html create mode 100644 www/extras/yui-ext/docs/output/QuickTips.jss.html create mode 100644 www/extras/yui-ext/docs/output/Radio.jss.html create mode 100644 www/extras/yui-ext/docs/output/ReaderLayout.jss.html create mode 100644 www/extras/yui-ext/docs/output/Record.jss.html create mode 100644 www/extras/yui-ext/docs/output/Registry.jss.html create mode 100644 www/extras/yui-ext/docs/output/Resizable.jss.html create mode 100644 www/extras/yui-ext/docs/output/RowSelectionModel.jss.html create mode 100644 www/extras/yui-ext/docs/output/ScriptTagProxy.jss.html create mode 100644 www/extras/yui-ext/docs/output/ScrollManager.jss.html create mode 100644 www/extras/yui-ext/docs/output/Separator.jss.html create mode 100644 www/extras/yui-ext/docs/output/Shadow.jss.html create mode 100644 www/extras/yui-ext/docs/output/SimpleStore.jss.html create mode 100644 www/extras/yui-ext/docs/output/SortTypes.jss.html create mode 100644 www/extras/yui-ext/docs/output/SplitBar.jss.html create mode 100644 www/extras/yui-ext/docs/output/SplitLayoutRegion.jss.html create mode 100644 www/extras/yui-ext/docs/output/State.jss.html create mode 100644 www/extras/yui-ext/docs/output/StatusProxy.jss.html create mode 100644 www/extras/yui-ext/docs/output/Store.jss.html create mode 100644 www/extras/yui-ext/docs/output/TabPanel.jss.html create mode 100644 www/extras/yui-ext/docs/output/TaskMgr.jss.html create mode 100644 www/extras/yui-ext/docs/output/Template.jss.html create mode 100644 www/extras/yui-ext/docs/output/TextArea.jss.html create mode 100644 www/extras/yui-ext/docs/output/TextField.jss.html create mode 100644 www/extras/yui-ext/docs/output/TextItem.jss.html create mode 100644 www/extras/yui-ext/docs/output/TextMetrics.jss.html create mode 100644 www/extras/yui-ext/docs/output/Toolbar.jss.html create mode 100644 www/extras/yui-ext/docs/output/Tree.jss.html create mode 100644 www/extras/yui-ext/docs/output/TreeDragZone.jss.html create mode 100644 www/extras/yui-ext/docs/output/TreeDropZone.jss.html create mode 100644 www/extras/yui-ext/docs/output/TreeEditor.jss.html create mode 100644 www/extras/yui-ext/docs/output/TreeFilter.jss.html create mode 100644 www/extras/yui-ext/docs/output/TreeLoader.jss.html create mode 100644 www/extras/yui-ext/docs/output/TreeNode.jss.html create mode 100644 www/extras/yui-ext/docs/output/TreeNodeUI.jss.html create mode 100644 www/extras/yui-ext/docs/output/TreePanel.jss.html create mode 100644 www/extras/yui-ext/docs/output/TreeSelectionModel.jss.html create mode 100644 www/extras/yui-ext/docs/output/TreeSorter.jss.html create mode 100644 www/extras/yui-ext/docs/output/TriggerField.jss.html create mode 100644 www/extras/yui-ext/docs/output/UpdateManager.jss.html create mode 100644 www/extras/yui-ext/docs/output/VTypes.jss.html create mode 100644 www/extras/yui-ext/docs/output/View.jss.html create mode 100644 www/extras/yui-ext/docs/output/Window.jss.html create mode 100644 www/extras/yui-ext/docs/output/WindowManager.jss.html create mode 100644 www/extras/yui-ext/docs/output/XmlReader.jss.html create mode 100644 www/extras/yui-ext/docs/output/debug.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-da.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-de.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-en.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-fr_CA.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-hr.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-hu.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-it.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-ja.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-lv.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-mk.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-nl.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-no.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-pl.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-pt_br.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-ro.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-ru.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-sk.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-sp.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-sv_se.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-tr.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-vn.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-zh_CN.jss.html create mode 100644 www/extras/yui-ext/docs/output/ext-lang-zh_TW.jss.html create mode 100644 www/extras/yui-ext/docs/output/jquery-bridge.jss.html create mode 100644 www/extras/yui-ext/docs/output/prototype-bridge.jss.html create mode 100644 www/extras/yui-ext/docs/output/yui-bridge.jss.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/collapser.css 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/examples/README.txt create mode 100644 www/extras/yui-ext/examples/debug/debug-console.html create mode 100644 www/extras/yui-ext/examples/debug/inspector.gif 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/msg-box.html create mode 100644 www/extras/yui-ext/examples/dialog/msg-box.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/examples.js create mode 100644 www/extras/yui-ext/examples/examples.jsb create mode 100644 www/extras/yui-ext/examples/form/combos.css create mode 100644 www/extras/yui-ext/examples/form/combos.html create mode 100644 www/extras/yui-ext/examples/form/combos.js create mode 100644 www/extras/yui-ext/examples/form/dynamic.html create mode 100644 www/extras/yui-ext/examples/form/dynamic.js create mode 100644 www/extras/yui-ext/examples/form/forms.css create mode 100644 www/extras/yui-ext/examples/form/forms.html create mode 100644 www/extras/yui-ext/examples/form/forms.js create mode 100644 www/extras/yui-ext/examples/form/forum-search.html create mode 100644 www/extras/yui-ext/examples/form/forum-search.js create mode 100644 www/extras/yui-ext/examples/form/states.js create mode 100644 www/extras/yui-ext/examples/form/xml-errors.xml create mode 100644 www/extras/yui-ext/examples/form/xml-form.html create mode 100644 www/extras/yui-ext/examples/form/xml-form.js create mode 100644 www/extras/yui-ext/examples/form/xml-form.xml 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/details.gif 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/from-markup.html create mode 100644 www/extras/yui-ext/examples/grid/from-markup.js create mode 100644 www/extras/yui-ext/examples/grid/grid-examples.css create mode 100644 www/extras/yui-ext/examples/grid/paging.html create mode 100644 www/extras/yui-ext/examples/grid/paging.js 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/topic.gif 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.ashx create mode 100644 www/extras/yui-ext/examples/layout/feed-proxy.ashx.vb 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/tab-close-on.gif create mode 100644 www/extras/yui-ext/examples/layout/images/tab-close.gif create mode 100644 www/extras/yui-ext/examples/layout/images/toolbar.gif create mode 100644 www/extras/yui-ext/examples/layout/images/wait.gif create mode 100644 www/extras/yui-ext/examples/layout/images/warning.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/lib.css create mode 100644 www/extras/yui-ext/examples/locale/create_languages_js.py create mode 100644 www/extras/yui-ext/examples/locale/dutch-form.html create mode 100644 www/extras/yui-ext/examples/locale/dutch-form.js create mode 100644 www/extras/yui-ext/examples/locale/dutch-provinces.js create mode 100644 www/extras/yui-ext/examples/locale/languages.js create mode 100644 www/extras/yui-ext/examples/locale/multi-lang.html create mode 100644 www/extras/yui-ext/examples/locale/multi-lang.js create mode 100644 www/extras/yui-ext/examples/menu/list-items.gif create mode 100644 www/extras/yui-ext/examples/menu/menu-show.gif create mode 100644 www/extras/yui-ext/examples/menu/menus.css create mode 100644 www/extras/yui-ext/examples/menu/menus.html create mode 100644 www/extras/yui-ext/examples/menu/menus.js create mode 100644 www/extras/yui-ext/examples/resizable/basic.css 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/shared/icons/arrow-down.gif create mode 100644 www/extras/yui-ext/examples/shared/icons/arrow-up.gif create mode 100644 www/extras/yui-ext/examples/shared/icons/fam/SILK.txt create mode 100644 www/extras/yui-ext/examples/shared/icons/fam/add.gif create mode 100644 www/extras/yui-ext/examples/shared/icons/fam/cross.gif create mode 100644 www/extras/yui-ext/examples/shared/icons/fam/delete.gif create mode 100644 www/extras/yui-ext/examples/shared/icons/fam/plugin.gif create mode 100644 www/extras/yui-ext/examples/shared/icons/fam/plugin_add.gif create mode 100644 www/extras/yui-ext/examples/shared/icons/save.gif 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-adv.html create mode 100644 www/extras/yui-ext/examples/tabs/tabs-adv.js 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/examples/tree/Thumbs.db create mode 100644 www/extras/yui-ext/examples/tree/album.gif create mode 100644 www/extras/yui-ext/examples/tree/center-bg.gif create mode 100644 www/extras/yui-ext/examples/tree/dep-tree.json create mode 100644 www/extras/yui-ext/examples/tree/dependency.css create mode 100644 www/extras/yui-ext/examples/tree/dependency.html create mode 100644 www/extras/yui-ext/examples/tree/dependency.js create mode 100644 www/extras/yui-ext/examples/tree/dependency.php create mode 100644 www/extras/yui-ext/examples/tree/get-nodes.php create mode 100644 www/extras/yui-ext/examples/tree/images/cmp-bg.gif create mode 100644 www/extras/yui-ext/examples/tree/images/thumbs/dance_fever.jpg create mode 100644 www/extras/yui-ext/examples/tree/images/thumbs/gangster_zack.jpg create mode 100644 www/extras/yui-ext/examples/tree/images/thumbs/kids_hug.jpg create mode 100644 www/extras/yui-ext/examples/tree/images/thumbs/kids_hug2.jpg create mode 100644 www/extras/yui-ext/examples/tree/images/thumbs/sara_pink.jpg create mode 100644 www/extras/yui-ext/examples/tree/images/thumbs/sara_pumpkin.jpg create mode 100644 www/extras/yui-ext/examples/tree/images/thumbs/sara_smile.jpg create mode 100644 www/extras/yui-ext/examples/tree/images/thumbs/up_to_something.jpg create mode 100644 www/extras/yui-ext/examples/tree/images/thumbs/zack.jpg create mode 100644 www/extras/yui-ext/examples/tree/images/thumbs/zack_dress.jpg create mode 100644 www/extras/yui-ext/examples/tree/images/thumbs/zack_hat.jpg create mode 100644 www/extras/yui-ext/examples/tree/images/thumbs/zack_sink.jpg create mode 100644 www/extras/yui-ext/examples/tree/images/thumbs/zacks_grill.jpg create mode 100644 www/extras/yui-ext/examples/tree/organizer.css create mode 100644 www/extras/yui-ext/examples/tree/organizer.html create mode 100644 www/extras/yui-ext/examples/tree/organizer.js create mode 100644 www/extras/yui-ext/examples/tree/reorder.html create mode 100644 www/extras/yui-ext/examples/tree/reorder.js create mode 100644 www/extras/yui-ext/examples/tree/save-dep.php create mode 100644 www/extras/yui-ext/examples/tree/two-trees.html create mode 100644 www/extras/yui-ext/examples/tree/two-trees.js create mode 100644 www/extras/yui-ext/examples/view/chooser-example.js create mode 100644 www/extras/yui-ext/examples/view/chooser.css create mode 100644 www/extras/yui-ext/examples/view/chooser.html create mode 100644 www/extras/yui-ext/examples/view/chooser.js create mode 100644 www/extras/yui-ext/examples/view/get-images.php create mode 100644 www/extras/yui-ext/examples/view/images/thumbs/dance_fever.jpg create mode 100644 www/extras/yui-ext/examples/view/images/thumbs/gangster_zack.jpg create mode 100644 www/extras/yui-ext/examples/view/images/thumbs/kids_hug.jpg create mode 100644 www/extras/yui-ext/examples/view/images/thumbs/kids_hug2.jpg create mode 100644 www/extras/yui-ext/examples/view/images/thumbs/sara_pink.jpg create mode 100644 www/extras/yui-ext/examples/view/images/thumbs/sara_pumpkin.jpg create mode 100644 www/extras/yui-ext/examples/view/images/thumbs/sara_smile.jpg create mode 100644 www/extras/yui-ext/examples/view/images/thumbs/up_to_something.jpg create mode 100644 www/extras/yui-ext/examples/view/images/thumbs/zack.jpg create mode 100644 www/extras/yui-ext/examples/view/images/thumbs/zack_dress.jpg create mode 100644 www/extras/yui-ext/examples/view/images/thumbs/zack_hat.jpg create mode 100644 www/extras/yui-ext/examples/view/images/thumbs/zack_sink.jpg create mode 100644 www/extras/yui-ext/examples/view/images/thumbs/zacks_grill.jpg create mode 100644 www/extras/yui-ext/ext-all-debug.js create mode 100644 www/extras/yui-ext/ext-all.js create mode 100644 www/extras/yui-ext/ext-back-compat.js create mode 100644 www/extras/yui-ext/ext-core-debug.js create mode 100644 www/extras/yui-ext/ext-core.js create mode 100644 www/extras/yui-ext/package/button/button-debug.js create mode 100644 www/extras/yui-ext/package/button/button.js create mode 100644 www/extras/yui-ext/package/color-palette.js create mode 100644 www/extras/yui-ext/package/data/data.js create mode 100644 www/extras/yui-ext/package/date.js create mode 100644 www/extras/yui-ext/package/datepicker/datepicker.js create mode 100644 www/extras/yui-ext/package/dialog/dialogs-debug.js create mode 100644 www/extras/yui-ext/package/dialog/dialogs.js create mode 100644 www/extras/yui-ext/package/dragdrop/dragdrop.js create mode 100644 www/extras/yui-ext/package/form/form-debug.js create mode 100644 www/extras/yui-ext/package/form/form.js create mode 100644 www/extras/yui-ext/package/grid/edit-grid-debug.js create mode 100644 www/extras/yui-ext/package/grid/edit-grid.js create mode 100644 www/extras/yui-ext/package/grid/grid.js create mode 100644 www/extras/yui-ext/package/layout/layout-debug.js create mode 100644 www/extras/yui-ext/package/layout/layout.js create mode 100644 www/extras/yui-ext/package/menu/menus.js create mode 100644 www/extras/yui-ext/package/qtips/qtips.js create mode 100644 www/extras/yui-ext/package/resizable.js create mode 100644 www/extras/yui-ext/package/splitbar.js create mode 100644 www/extras/yui-ext/package/tabs/tabs.js create mode 100644 www/extras/yui-ext/package/toolbar/toolbar.js create mode 100644 www/extras/yui-ext/package/tree/tree.js create mode 100644 www/extras/yui-ext/package/util.js create mode 100644 www/extras/yui-ext/package/widget-core.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/box.css create mode 100644 www/extras/yui-ext/resources/css/button.css create mode 100644 www/extras/yui-ext/resources/css/combo.css create mode 100644 www/extras/yui-ext/resources/css/core.css create mode 100644 www/extras/yui-ext/resources/css/date-picker.css create mode 100644 www/extras/yui-ext/resources/css/dd.css create mode 100644 www/extras/yui-ext/resources/css/debug.css create mode 100644 www/extras/yui-ext/resources/css/ext-all.css create mode 100644 www/extras/yui-ext/resources/css/form.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/menu.css create mode 100644 www/extras/yui-ext/resources/css/panel.css create mode 100644 www/extras/yui-ext/resources/css/qtips.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/tree.css create mode 100644 www/extras/yui-ext/resources/css/window.css create mode 100644 www/extras/yui-ext/resources/css/ytheme-aero.css create mode 100644 www/extras/yui-ext/resources/css/ytheme-gray.css create mode 100644 www/extras/yui-ext/resources/css/ytheme-vista.css create mode 100644 www/extras/yui-ext/resources/images/aero/basic-dialog/aero-close-over.gif create mode 100644 www/extras/yui-ext/resources/images/aero/basic-dialog/aero-close.gif create mode 100644 www/extras/yui-ext/resources/images/aero/basic-dialog/bg-center.gif create mode 100644 www/extras/yui-ext/resources/images/aero/basic-dialog/bg-left.gif create mode 100644 www/extras/yui-ext/resources/images/aero/basic-dialog/bg-right.gif create mode 100644 www/extras/yui-ext/resources/images/aero/basic-dialog/close.gif create mode 100644 www/extras/yui-ext/resources/images/aero/basic-dialog/collapse-over.gif create mode 100644 www/extras/yui-ext/resources/images/aero/basic-dialog/collapse.gif create mode 100644 www/extras/yui-ext/resources/images/aero/basic-dialog/e-handle.gif create mode 100644 www/extras/yui-ext/resources/images/aero/basic-dialog/expand-over.gif create mode 100644 www/extras/yui-ext/resources/images/aero/basic-dialog/expand.gif create mode 100644 www/extras/yui-ext/resources/images/aero/basic-dialog/hd-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/aero/basic-dialog/s-handle.gif create mode 100644 www/extras/yui-ext/resources/images/aero/basic-dialog/se-handle.gif create mode 100644 www/extras/yui-ext/resources/images/aero/basic-dialog/w-handle.gif create mode 100644 www/extras/yui-ext/resources/images/aero/gradient-bg.gif create mode 100644 www/extras/yui-ext/resources/images/aero/grid/grid-blue-split.gif create mode 100644 www/extras/yui-ext/resources/images/aero/grid/grid-hrow.gif create mode 100644 www/extras/yui-ext/resources/images/aero/grid/grid-split.gif create mode 100644 www/extras/yui-ext/resources/images/aero/grid/grid-vista-hd.gif create mode 100644 www/extras/yui-ext/resources/images/aero/grid/pspbrwse.jbf create mode 100644 www/extras/yui-ext/resources/images/aero/grid/sort-col-bg.gif create mode 100644 www/extras/yui-ext/resources/images/aero/grid/sort_asc.gif create mode 100644 www/extras/yui-ext/resources/images/aero/grid/sort_desc.gif create mode 100644 www/extras/yui-ext/resources/images/aero/layout/collapse.gif create mode 100644 www/extras/yui-ext/resources/images/aero/layout/expand.gif create mode 100644 www/extras/yui-ext/resources/images/aero/layout/gradient-bg.gif create mode 100644 www/extras/yui-ext/resources/images/aero/layout/ns-collapse.gif create mode 100644 www/extras/yui-ext/resources/images/aero/layout/ns-expand.gif create mode 100644 www/extras/yui-ext/resources/images/aero/layout/panel-close.gif create mode 100644 www/extras/yui-ext/resources/images/aero/layout/panel-title-bg.gif create mode 100644 www/extras/yui-ext/resources/images/aero/layout/panel-title-light-bg.gif create mode 100644 www/extras/yui-ext/resources/images/aero/layout/tab-close-on.gif create mode 100644 www/extras/yui-ext/resources/images/aero/layout/tab-close.gif create mode 100644 www/extras/yui-ext/resources/images/aero/qtip/bg.gif create mode 100644 www/extras/yui-ext/resources/images/aero/s.gif create mode 100644 www/extras/yui-ext/resources/images/aero/sizer/e-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/aero/sizer/e-handle.gif create mode 100644 www/extras/yui-ext/resources/images/aero/sizer/ne-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/aero/sizer/ne-handle.gif create mode 100644 www/extras/yui-ext/resources/images/aero/sizer/nw-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/aero/sizer/nw-handle.gif create mode 100644 www/extras/yui-ext/resources/images/aero/sizer/s-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/aero/sizer/s-handle.gif create mode 100644 www/extras/yui-ext/resources/images/aero/sizer/se-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/aero/sizer/se-handle.gif create mode 100644 www/extras/yui-ext/resources/images/aero/sizer/sw-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/aero/sizer/sw-handle.gif create mode 100644 www/extras/yui-ext/resources/images/aero/tabs/tab-btm-inactive-left-bg.gif create mode 100644 www/extras/yui-ext/resources/images/aero/tabs/tab-btm-inactive-right-bg.gif create mode 100644 www/extras/yui-ext/resources/images/aero/tabs/tab-btm-left-bg.gif create mode 100644 www/extras/yui-ext/resources/images/aero/tabs/tab-btm-right-bg.gif create mode 100644 www/extras/yui-ext/resources/images/aero/tabs/tab-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/aero/tabs/tab-strip-bg.gif create mode 100644 www/extras/yui-ext/resources/images/aero/tabs/tab-strip-bg.png create mode 100644 www/extras/yui-ext/resources/images/aero/tabs/tab-strip-btm-bg.gif create mode 100644 www/extras/yui-ext/resources/images/aero/toolbar/bg.gif create mode 100644 www/extras/yui-ext/resources/images/aero/toolbar/tb-btn-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/default/basic-dialog/btn-arrow.gif create mode 100644 www/extras/yui-ext/resources/images/default/basic-dialog/btn-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/default/basic-dialog/close.gif create mode 100644 www/extras/yui-ext/resources/images/default/basic-dialog/collapse.gif create mode 100644 www/extras/yui-ext/resources/images/default/basic-dialog/e-handle.gif create mode 100644 www/extras/yui-ext/resources/images/default/basic-dialog/expand.gif create mode 100644 www/extras/yui-ext/resources/images/default/basic-dialog/hd-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/default/basic-dialog/progress.gif create mode 100644 www/extras/yui-ext/resources/images/default/basic-dialog/progress2.gif create mode 100644 www/extras/yui-ext/resources/images/default/basic-dialog/s-handle.gif create mode 100644 www/extras/yui-ext/resources/images/default/basic-dialog/se-handle.gif create mode 100644 www/extras/yui-ext/resources/images/default/box/corners-blue.gif create mode 100644 www/extras/yui-ext/resources/images/default/box/corners.gif create mode 100644 www/extras/yui-ext/resources/images/default/box/l-blue.gif create mode 100644 www/extras/yui-ext/resources/images/default/box/l.gif create mode 100644 www/extras/yui-ext/resources/images/default/box/r-blue.gif create mode 100644 www/extras/yui-ext/resources/images/default/box/r.gif create mode 100644 www/extras/yui-ext/resources/images/default/box/tb-blue.gif create mode 100644 www/extras/yui-ext/resources/images/default/box/tb.gif create mode 100644 www/extras/yui-ext/resources/images/default/dd/drop-add.gif create mode 100644 www/extras/yui-ext/resources/images/default/dd/drop-no.gif create mode 100644 www/extras/yui-ext/resources/images/default/dd/drop-yes.gif create mode 100644 www/extras/yui-ext/resources/images/default/form/date-trigger.gif create mode 100644 www/extras/yui-ext/resources/images/default/form/error-tip-corners.gif create mode 100644 www/extras/yui-ext/resources/images/default/form/exclamation.gif create mode 100644 www/extras/yui-ext/resources/images/default/form/text-bg.gif create mode 100644 www/extras/yui-ext/resources/images/default/form/trigger.gif create mode 100644 www/extras/yui-ext/resources/images/default/gradient-bg.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/Thumbs.db create mode 100644 www/extras/yui-ext/resources/images/default/grid/arrow-left-white.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/arrow-right-white.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/col-move-bottom.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/col-move-top.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/dirty.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/done.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/drop-no.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/drop-yes.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/footer-bg.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/grid-blue-hd.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/grid-blue-split.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/grid-hrow.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/grid-loading.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/grid-split.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/grid-vista-hd.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/hd-pop.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/hmenu-asc.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/hmenu-desc.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/hmenu-lock.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/hmenu-lock.png create mode 100644 www/extras/yui-ext/resources/images/default/grid/hmenu-unlock.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/hmenu-unlock.png create mode 100644 www/extras/yui-ext/resources/images/default/grid/invalid_line.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/loading.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/mso-hd.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/nowait.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/page-first-disabled.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/page-first.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/page-last-disabled.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/page-last.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/page-next-disabled.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/page-next.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/page-prev-disabled.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/page-prev.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/pick-button.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/refresh.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/sort_asc.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/sort_desc.gif create mode 100644 www/extras/yui-ext/resources/images/default/grid/wait.gif create mode 100644 www/extras/yui-ext/resources/images/default/layout/collapse.gif create mode 100644 www/extras/yui-ext/resources/images/default/layout/expand.gif create mode 100644 www/extras/yui-ext/resources/images/default/layout/gradient-bg.gif create mode 100644 www/extras/yui-ext/resources/images/default/layout/ns-collapse.gif create mode 100644 www/extras/yui-ext/resources/images/default/layout/ns-expand.gif create mode 100644 www/extras/yui-ext/resources/images/default/layout/panel-close.gif create mode 100644 www/extras/yui-ext/resources/images/default/layout/panel-title-bg.gif create mode 100644 www/extras/yui-ext/resources/images/default/layout/panel-title-light-bg.gif create mode 100644 www/extras/yui-ext/resources/images/default/layout/stick.gif create mode 100644 www/extras/yui-ext/resources/images/default/layout/stuck.gif create mode 100644 www/extras/yui-ext/resources/images/default/layout/tab-close-on.gif create mode 100644 www/extras/yui-ext/resources/images/default/layout/tab-close.gif create mode 100644 www/extras/yui-ext/resources/images/default/menu/checked.gif create mode 100644 www/extras/yui-ext/resources/images/default/menu/group-checked.gif create mode 100644 www/extras/yui-ext/resources/images/default/menu/menu-parent.gif create mode 100644 www/extras/yui-ext/resources/images/default/menu/menu.gif create mode 100644 www/extras/yui-ext/resources/images/default/menu/unchecked.gif create mode 100644 www/extras/yui-ext/resources/images/default/qtip/bg.gif create mode 100644 www/extras/yui-ext/resources/images/default/qtip/close.gif create mode 100644 www/extras/yui-ext/resources/images/default/qtip/tip-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/default/s.gif create mode 100644 www/extras/yui-ext/resources/images/default/shadow-c.png create mode 100644 www/extras/yui-ext/resources/images/default/shadow-lr.png create mode 100644 www/extras/yui-ext/resources/images/default/shadow.png create mode 100644 www/extras/yui-ext/resources/images/default/shared/calendar.gif create mode 100644 www/extras/yui-ext/resources/images/default/shared/left-btn.gif create mode 100644 www/extras/yui-ext/resources/images/default/shared/right-btn.gif create mode 100644 www/extras/yui-ext/resources/images/default/shared/warning.gif create mode 100644 www/extras/yui-ext/resources/images/default/sizer/e-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/default/sizer/e-handle.gif create mode 100644 www/extras/yui-ext/resources/images/default/sizer/ne-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/default/sizer/ne-handle.gif create mode 100644 www/extras/yui-ext/resources/images/default/sizer/nw-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/default/sizer/nw-handle.gif create mode 100644 www/extras/yui-ext/resources/images/default/sizer/s-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/default/sizer/s-handle.gif create mode 100644 www/extras/yui-ext/resources/images/default/sizer/se-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/default/sizer/se-handle.gif create mode 100644 www/extras/yui-ext/resources/images/default/sizer/square.gif create mode 100644 www/extras/yui-ext/resources/images/default/sizer/sw-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/default/sizer/sw-handle.gif create mode 100644 www/extras/yui-ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif create mode 100644 www/extras/yui-ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif create mode 100644 www/extras/yui-ext/resources/images/default/tabs/tab-btm-left-bg.gif create mode 100644 www/extras/yui-ext/resources/images/default/tabs/tab-btm-right-bg.gif create mode 100644 www/extras/yui-ext/resources/images/default/tabs/tab-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/default/toolbar/btn-arrow-light.gif create mode 100644 www/extras/yui-ext/resources/images/default/toolbar/btn-arrow.gif create mode 100644 www/extras/yui-ext/resources/images/default/toolbar/btn-over-bg.gif create mode 100644 www/extras/yui-ext/resources/images/default/toolbar/gray-bg.gif create mode 100644 www/extras/yui-ext/resources/images/default/toolbar/tb-bg.gif create mode 100644 www/extras/yui-ext/resources/images/default/toolbar/tb-btn-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/drop-add.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/drop-between.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/drop-no.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/drop-over.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/drop-under.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/drop-yes.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/elbow-end-minus-nl.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/elbow-end-minus.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/elbow-end-plus-nl.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/elbow-end-plus.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/elbow-end.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/elbow-line.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/elbow-minus-nl.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/elbow-minus.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/elbow-plus-nl.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/elbow-plus.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/elbow.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/folder-open.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/folder.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/leaf.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/loading.gif create mode 100644 www/extras/yui-ext/resources/images/default/tree/s.gif create mode 100644 www/extras/yui-ext/resources/images/gray/basic-dialog/close.gif create mode 100644 www/extras/yui-ext/resources/images/gray/basic-dialog/collapse.gif create mode 100644 www/extras/yui-ext/resources/images/gray/basic-dialog/dlg-bg.gif create mode 100644 www/extras/yui-ext/resources/images/gray/basic-dialog/e-handle.gif create mode 100644 www/extras/yui-ext/resources/images/gray/basic-dialog/expand.gif create mode 100644 www/extras/yui-ext/resources/images/gray/basic-dialog/hd-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/gray/basic-dialog/s-handle.gif create mode 100644 www/extras/yui-ext/resources/images/gray/basic-dialog/se-handle.gif create mode 100644 www/extras/yui-ext/resources/images/gray/gradient-bg.gif create mode 100644 www/extras/yui-ext/resources/images/gray/grid/grid-hrow.gif create mode 100644 www/extras/yui-ext/resources/images/gray/layout/collapse.gif create mode 100644 www/extras/yui-ext/resources/images/gray/layout/expand.gif create mode 100644 www/extras/yui-ext/resources/images/gray/layout/gradient-bg.gif create mode 100644 www/extras/yui-ext/resources/images/gray/layout/ns-collapse.gif create mode 100644 www/extras/yui-ext/resources/images/gray/layout/ns-expand.gif create mode 100644 www/extras/yui-ext/resources/images/gray/layout/panel-close.gif create mode 100644 www/extras/yui-ext/resources/images/gray/layout/panel-title-bg.gif create mode 100644 www/extras/yui-ext/resources/images/gray/layout/panel-title-light-bg.gif create mode 100644 www/extras/yui-ext/resources/images/gray/layout/stick.gif create mode 100644 www/extras/yui-ext/resources/images/gray/layout/tab-close-on.gif create mode 100644 www/extras/yui-ext/resources/images/gray/layout/tab-close.gif create mode 100644 www/extras/yui-ext/resources/images/gray/menu/checked.gif create mode 100644 www/extras/yui-ext/resources/images/gray/menu/group-checked.gif create mode 100644 www/extras/yui-ext/resources/images/gray/menu/menu-parent.gif create mode 100644 www/extras/yui-ext/resources/images/gray/menu/menu.gif create mode 100644 www/extras/yui-ext/resources/images/gray/menu/unchecked.gif create mode 100644 www/extras/yui-ext/resources/images/gray/qtip/bg.gif create mode 100644 www/extras/yui-ext/resources/images/gray/qtip/tip-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/gray/s.gif create mode 100644 www/extras/yui-ext/resources/images/gray/sizer/e-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/gray/sizer/e-handle.gif create mode 100644 www/extras/yui-ext/resources/images/gray/sizer/ne-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/gray/sizer/ne-handle.gif create mode 100644 www/extras/yui-ext/resources/images/gray/sizer/nw-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/gray/sizer/nw-handle.gif create mode 100644 www/extras/yui-ext/resources/images/gray/sizer/s-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/gray/sizer/s-handle.gif create mode 100644 www/extras/yui-ext/resources/images/gray/sizer/se-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/gray/sizer/se-handle.gif create mode 100644 www/extras/yui-ext/resources/images/gray/sizer/sw-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/gray/sizer/sw-handle.gif create mode 100644 www/extras/yui-ext/resources/images/gray/tabs/tab-btm-inactive-left-bg.gif create mode 100644 www/extras/yui-ext/resources/images/gray/tabs/tab-btm-inactive-right-bg.gif create mode 100644 www/extras/yui-ext/resources/images/gray/tabs/tab-btm-left-bg.gif create mode 100644 www/extras/yui-ext/resources/images/gray/tabs/tab-btm-right-bg.gif create mode 100644 www/extras/yui-ext/resources/images/gray/tabs/tab-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/gray/toolbar/gray-bg.gif create mode 100644 www/extras/yui-ext/resources/images/gray/toolbar/tb-btn-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/vista/basic-dialog/bg-center.gif create mode 100644 www/extras/yui-ext/resources/images/vista/basic-dialog/bg-left.gif create mode 100644 www/extras/yui-ext/resources/images/vista/basic-dialog/bg-right.gif create mode 100644 www/extras/yui-ext/resources/images/vista/basic-dialog/close.gif create mode 100644 www/extras/yui-ext/resources/images/vista/basic-dialog/collapse.gif create mode 100644 www/extras/yui-ext/resources/images/vista/basic-dialog/dlg-bg.gif create mode 100644 www/extras/yui-ext/resources/images/vista/basic-dialog/e-handle.gif create mode 100644 www/extras/yui-ext/resources/images/vista/basic-dialog/expand.gif create mode 100644 www/extras/yui-ext/resources/images/vista/basic-dialog/hd-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/vista/basic-dialog/s-handle.gif create mode 100644 www/extras/yui-ext/resources/images/vista/basic-dialog/se-handle.gif create mode 100644 www/extras/yui-ext/resources/images/vista/basic-dialog/w-handle.gif create mode 100644 www/extras/yui-ext/resources/images/vista/gradient-bg.gif create mode 100644 www/extras/yui-ext/resources/images/vista/grid/grid-split.gif create mode 100644 www/extras/yui-ext/resources/images/vista/grid/grid-vista-hd.gif create mode 100644 www/extras/yui-ext/resources/images/vista/layout/collapse.gif create mode 100644 www/extras/yui-ext/resources/images/vista/layout/expand.gif create mode 100644 www/extras/yui-ext/resources/images/vista/layout/gradient-bg.gif create mode 100644 www/extras/yui-ext/resources/images/vista/layout/ns-collapse.gif create mode 100644 www/extras/yui-ext/resources/images/vista/layout/ns-expand.gif create mode 100644 www/extras/yui-ext/resources/images/vista/layout/panel-close.gif create mode 100644 www/extras/yui-ext/resources/images/vista/layout/panel-title-bg.gif create mode 100644 www/extras/yui-ext/resources/images/vista/layout/panel-title-light-bg.gif create mode 100644 www/extras/yui-ext/resources/images/vista/layout/stick.gif create mode 100644 www/extras/yui-ext/resources/images/vista/layout/tab-close-on.gif create mode 100644 www/extras/yui-ext/resources/images/vista/layout/tab-close.gif create mode 100644 www/extras/yui-ext/resources/images/vista/qtip/bg.gif create mode 100644 www/extras/yui-ext/resources/images/vista/qtip/tip-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/vista/s.gif create mode 100644 www/extras/yui-ext/resources/images/vista/sizer/e-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/vista/sizer/e-handle.gif create mode 100644 www/extras/yui-ext/resources/images/vista/sizer/ne-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/vista/sizer/ne-handle.gif create mode 100644 www/extras/yui-ext/resources/images/vista/sizer/nw-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/vista/sizer/nw-handle.gif create mode 100644 www/extras/yui-ext/resources/images/vista/sizer/s-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/vista/sizer/s-handle.gif create mode 100644 www/extras/yui-ext/resources/images/vista/sizer/se-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/vista/sizer/se-handle.gif create mode 100644 www/extras/yui-ext/resources/images/vista/sizer/sw-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/vista/sizer/sw-handle.gif create mode 100644 www/extras/yui-ext/resources/images/vista/tabs/tab-btm-inactive-left-bg.gif create mode 100644 www/extras/yui-ext/resources/images/vista/tabs/tab-btm-inactive-right-bg.gif create mode 100644 www/extras/yui-ext/resources/images/vista/tabs/tab-btm-left-bg.gif create mode 100644 www/extras/yui-ext/resources/images/vista/tabs/tab-btm-right-bg.gif create mode 100644 www/extras/yui-ext/resources/images/vista/tabs/tab-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/vista/toolbar/gray-bg.gif create mode 100644 www/extras/yui-ext/resources/images/vista/toolbar/tb-btn-sprite.gif create mode 100644 www/extras/yui-ext/resources/license.txt create mode 100644 www/extras/yui-ext/resources/raw-images/shadow.psd create mode 100644 www/extras/yui-ext/resources/resources.jsb create mode 100644 www/extras/yui-ext/source/adapter/jquery-bridge.js create mode 100644 www/extras/yui-ext/source/adapter/prototype-bridge.js create mode 100644 www/extras/yui-ext/source/adapter/yui-bridge.js create mode 100644 www/extras/yui-ext/source/core/CompositeElement.js create mode 100644 www/extras/yui-ext/source/core/DomHelper.js create mode 100644 www/extras/yui-ext/source/core/DomQuery.js create mode 100644 www/extras/yui-ext/source/core/Element.js create mode 100644 www/extras/yui-ext/source/core/EventManager.js create mode 100644 www/extras/yui-ext/source/core/Ext.js create mode 100644 www/extras/yui-ext/source/core/Fx.js create mode 100644 www/extras/yui-ext/source/core/Template.js create mode 100644 www/extras/yui-ext/source/core/UpdateManager.js create mode 100644 www/extras/yui-ext/source/data/ArrayReader.js create mode 100644 www/extras/yui-ext/source/data/Connection.js create mode 100644 www/extras/yui-ext/source/data/DataField.js create mode 100644 www/extras/yui-ext/source/data/DataProxy.js create mode 100644 www/extras/yui-ext/source/data/DataReader.js create mode 100644 www/extras/yui-ext/source/data/HttpProxy.js create mode 100644 www/extras/yui-ext/source/data/JsonReader.js create mode 100644 www/extras/yui-ext/source/data/MemoryProxy.js create mode 100644 www/extras/yui-ext/source/data/Record.js create mode 100644 www/extras/yui-ext/source/data/ScriptTagProxy.js create mode 100644 www/extras/yui-ext/source/data/SimpleStore.js create mode 100644 www/extras/yui-ext/source/data/SortTypes.js create mode 100644 www/extras/yui-ext/source/data/Store.js create mode 100644 www/extras/yui-ext/source/data/Tree.js create mode 100644 www/extras/yui-ext/source/data/XmlReader.js create mode 100644 www/extras/yui-ext/source/dd/DDCore.js create mode 100644 www/extras/yui-ext/source/dd/DragSource.js create mode 100644 www/extras/yui-ext/source/dd/DragZone.js create mode 100644 www/extras/yui-ext/source/dd/DropTarget.js create mode 100644 www/extras/yui-ext/source/dd/DropZone.js create mode 100644 www/extras/yui-ext/source/dd/Registry.js create mode 100644 www/extras/yui-ext/source/dd/ScrollManager.js create mode 100644 www/extras/yui-ext/source/dd/StatusProxy.js create mode 100644 www/extras/yui-ext/source/debug.js create mode 100644 www/extras/yui-ext/source/ext.jsb create mode 100644 www/extras/yui-ext/source/legacy/Actor.js create mode 100644 www/extras/yui-ext/source/legacy/Animator.js create mode 100644 www/extras/yui-ext/source/legacy/InlineEditor.js create mode 100644 www/extras/yui-ext/source/legacy/compat.js create mode 100644 www/extras/yui-ext/source/license.txt create mode 100644 www/extras/yui-ext/source/locale/ext-lang-da.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-de.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-en.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-fr_CA.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-hr.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-hu.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-it.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-ja.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-lv.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-mk.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-nl.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-no.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-pl.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-pt_br.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-ro.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-ru.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-sk.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-sp.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-sv_se.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-tr.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-vn.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-zh_CN.js create mode 100644 www/extras/yui-ext/source/locale/ext-lang-zh_TW.js create mode 100644 www/extras/yui-ext/source/state/State.js create mode 100644 www/extras/yui-ext/source/util/CSS.js create mode 100644 www/extras/yui-ext/source/util/ClickRepeater.js create mode 100644 www/extras/yui-ext/source/util/Date.js create mode 100644 www/extras/yui-ext/source/util/DelayedTask.js create mode 100644 www/extras/yui-ext/source/util/Format.js create mode 100644 www/extras/yui-ext/source/util/JSON.js create mode 100644 www/extras/yui-ext/source/util/KeyMap.js create mode 100644 www/extras/yui-ext/source/util/KeyNav.js create mode 100644 www/extras/yui-ext/source/util/MixedCollection.js create mode 100644 www/extras/yui-ext/source/util/Observable.js create mode 100644 www/extras/yui-ext/source/util/TaskMgr.js create mode 100644 www/extras/yui-ext/source/util/TextMetrics.js create mode 100644 www/extras/yui-ext/source/widgets/BasicDialog.js create mode 100644 www/extras/yui-ext/source/widgets/BoxComponent.js create mode 100644 www/extras/yui-ext/source/widgets/Button.js create mode 100644 www/extras/yui-ext/source/widgets/ColorPalette.js create mode 100644 www/extras/yui-ext/source/widgets/Component.js create mode 100644 www/extras/yui-ext/source/widgets/DatePicker.js create mode 100644 www/extras/yui-ext/source/widgets/Editor.js create mode 100644 www/extras/yui-ext/source/widgets/JsonView.js create mode 100644 www/extras/yui-ext/source/widgets/Layer.js create mode 100644 www/extras/yui-ext/source/widgets/LoadMask.js create mode 100644 www/extras/yui-ext/source/widgets/MenuButton.js create mode 100644 www/extras/yui-ext/source/widgets/MessageBox.js create mode 100644 www/extras/yui-ext/source/widgets/PagingToolbar.js create mode 100644 www/extras/yui-ext/source/widgets/QuickTips.js create mode 100644 www/extras/yui-ext/source/widgets/Resizable.js create mode 100644 www/extras/yui-ext/source/widgets/Shadow.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/Toolbar.js create mode 100644 www/extras/yui-ext/source/widgets/View.js create mode 100644 www/extras/yui-ext/source/widgets/form/Action.js create mode 100644 www/extras/yui-ext/source/widgets/form/BasicForm.js create mode 100644 www/extras/yui-ext/source/widgets/form/Checkbox.js create mode 100644 www/extras/yui-ext/source/widgets/form/Combo.js create mode 100644 www/extras/yui-ext/source/widgets/form/DateField.js create mode 100644 www/extras/yui-ext/source/widgets/form/Field.js create mode 100644 www/extras/yui-ext/source/widgets/form/Form.js create mode 100644 www/extras/yui-ext/source/widgets/form/Layout.js create mode 100644 www/extras/yui-ext/source/widgets/form/NumberField.js create mode 100644 www/extras/yui-ext/source/widgets/form/Radio.js create mode 100644 www/extras/yui-ext/source/widgets/form/TextArea.js create mode 100644 www/extras/yui-ext/source/widgets/form/TextField.js create mode 100644 www/extras/yui-ext/source/widgets/form/TriggerField.js create mode 100644 www/extras/yui-ext/source/widgets/form/VTypes.js create mode 100644 www/extras/yui-ext/source/widgets/grid/AbstractGridView.js create mode 100644 www/extras/yui-ext/source/widgets/grid/AbstractSelectionModel.js create mode 100644 www/extras/yui-ext/source/widgets/grid/CellSelectionModel.js create mode 100644 www/extras/yui-ext/source/widgets/grid/ColumnDD.js create mode 100644 www/extras/yui-ext/source/widgets/grid/ColumnModel.js create mode 100644 www/extras/yui-ext/source/widgets/grid/ColumnSplitDD.js create mode 100644 www/extras/yui-ext/source/widgets/grid/EditorGrid.js create mode 100644 www/extras/yui-ext/source/widgets/grid/Grid.js create mode 100644 www/extras/yui-ext/source/widgets/grid/GridDD.js create mode 100644 www/extras/yui-ext/source/widgets/grid/GridEditor.js create mode 100644 www/extras/yui-ext/source/widgets/grid/GridView.js create mode 100644 www/extras/yui-ext/source/widgets/grid/PropertyGrid.js create mode 100644 www/extras/yui-ext/source/widgets/grid/RowSelectionModel.js create mode 100644 www/extras/yui-ext/source/widgets/layout/BasicLayoutRegion.js create mode 100644 www/extras/yui-ext/source/widgets/layout/BorderLayout.js create mode 100644 www/extras/yui-ext/source/widgets/layout/BorderLayoutRegions.js create mode 100644 www/extras/yui-ext/source/widgets/layout/ContentPanels.js create mode 100644 www/extras/yui-ext/source/widgets/layout/LayoutManager.js create mode 100644 www/extras/yui-ext/source/widgets/layout/LayoutRegion.js create mode 100644 www/extras/yui-ext/source/widgets/layout/LayoutStateManager.js create mode 100644 www/extras/yui-ext/source/widgets/layout/ReaderLayout.js create mode 100644 www/extras/yui-ext/source/widgets/layout/SplitLayoutRegion.js create mode 100644 www/extras/yui-ext/source/widgets/menu/Adapter.js create mode 100644 www/extras/yui-ext/source/widgets/menu/BaseItem.js create mode 100644 www/extras/yui-ext/source/widgets/menu/CheckItem.js create mode 100644 www/extras/yui-ext/source/widgets/menu/ColorItem.js create mode 100644 www/extras/yui-ext/source/widgets/menu/ColorMenu.js create mode 100644 www/extras/yui-ext/source/widgets/menu/DateItem.js create mode 100644 www/extras/yui-ext/source/widgets/menu/DateMenu.js create mode 100644 www/extras/yui-ext/source/widgets/menu/Item.js create mode 100644 www/extras/yui-ext/source/widgets/menu/Menu.js create mode 100644 www/extras/yui-ext/source/widgets/menu/MenuMgr.js create mode 100644 www/extras/yui-ext/source/widgets/menu/Separator.js create mode 100644 www/extras/yui-ext/source/widgets/menu/TextItem.js create mode 100644 www/extras/yui-ext/source/widgets/tree/AsyncTreeNode.js create mode 100644 www/extras/yui-ext/source/widgets/tree/TreeDragZone.js create mode 100644 www/extras/yui-ext/source/widgets/tree/TreeDropZone.js create mode 100644 www/extras/yui-ext/source/widgets/tree/TreeEditor.js create mode 100644 www/extras/yui-ext/source/widgets/tree/TreeFilter.js create mode 100644 www/extras/yui-ext/source/widgets/tree/TreeLoader.js create mode 100644 www/extras/yui-ext/source/widgets/tree/TreeNode.js create mode 100644 www/extras/yui-ext/source/widgets/tree/TreeNodeUI.js create mode 100644 www/extras/yui-ext/source/widgets/tree/TreePanel.js create mode 100644 www/extras/yui-ext/source/widgets/tree/TreeSelectionModel.js create mode 100644 www/extras/yui-ext/source/widgets/tree/TreeSorter.js create mode 100644 www/extras/yui-ext/source/yui/animation.js create mode 100644 www/extras/yui-ext/source/yui/connection.js create mode 100644 www/extras/yui-ext/source/yui/dom.js create mode 100644 www/extras/yui-ext/source/yui/event.js create mode 100644 www/extras/yui-ext/source/yui/yahoo.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/button/README create mode 100644 www/extras/yui/build/button/assets/background.png create mode 100644 www/extras/yui/build/button/assets/button.css create mode 100644 www/extras/yui/build/button/assets/menuarrow.gif create mode 100644 www/extras/yui/build/button/assets/splitarrow.gif create mode 100644 www/extras/yui/build/button/assets/splitarrow_active.gif create mode 100644 www/extras/yui/build/button/button-beta-debug.js create mode 100644 www/extras/yui/build/button/button-beta-min.js create mode 100644 www/extras/yui/build/button/button-beta.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/datasource/README create mode 100644 www/extras/yui/build/datasource/datasource-beta-debug.js create mode 100644 www/extras/yui/build/datasource/datasource-beta-min.js create mode 100644 www/extras/yui/build/datasource/datasource-beta.js create mode 100644 www/extras/yui/build/datatable/README create mode 100644 www/extras/yui/build/datatable/assets/datatable.css create mode 100644 www/extras/yui/build/datatable/datatable-beta-debug.js create mode 100644 www/extras/yui/build/datatable/datatable-beta-min.js create mode 100644 www/extras/yui/build/datatable/datatable-beta.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/element/README create mode 100644 www/extras/yui/build/element/element-beta-debug.js create mode 100644 www/extras/yui/build/element/element-beta-min.js create mode 100644 www/extras/yui/build/element/element-beta.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/history/README create mode 100644 www/extras/yui/build/history/assets/blank.html create mode 100644 www/extras/yui/build/history/history-experimental-debug.js create mode 100644 www/extras/yui/build/history/history-experimental-min.js create mode 100644 www/extras/yui/build/history/history-experimental.js 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/map.gif 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/menuaroup8_dim_1.gif create mode 100644 www/extras/yui/build/menu/assets/menuaroup8_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.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/tabview.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/Column.html create mode 100644 www/extras/yui/docs/ColumnEditor.html create mode 100644 www/extras/yui/docs/ColumnSet.html create mode 100644 www/extras/yui/docs/ColumnSet.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.html create mode 100644 www/extras/yui/docs/DataSource.js.html create mode 100644 www/extras/yui/docs/DataTable.html create mode 100644 www/extras/yui/docs/DataTable.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/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/Record.html create mode 100644 www/extras/yui/docs/RecordSet.html create mode 100644 www/extras/yui/docs/RecordSet.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/Sort.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/WidthResizer.html create mode 100644 www/extras/yui/docs/YAHOO.env.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.lang.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.History.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.Button.html create mode 100644 www/extras/yui/docs/YAHOO.widget.ButtonGroup.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.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/YAHOO_config.html create mode 100644 www/extras/yui/docs/assets/ac-js 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/logo.gif create mode 100644 www/extras/yui/docs/assets/yui_cheatsheets.zip create mode 100644 www/extras/yui/docs/button.js.html create mode 100644 www/extras/yui/docs/buttongroup.js.html 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/history.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/module_animation.html create mode 100644 www/extras/yui/docs/module_autocomplete.html create mode 100644 www/extras/yui/docs/module_button.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_datasource.html create mode 100644 www/extras/yui/docs/module_datatable.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_element.html create mode 100644 www/extras/yui/docs/module_event.html create mode 100644 www/extras/yui/docs/module_history.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/assets/dpSyntaxHighlighter.css create mode 100644 www/extras/yui/examples/assets/dpSyntaxHighlighter.js 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/button/example01.html create mode 100644 www/extras/yui/examples/button/example02.html create mode 100644 www/extras/yui/examples/button/example03.html create mode 100644 www/extras/yui/examples/button/example04.html create mode 100644 www/extras/yui/examples/button/example05.html create mode 100644 www/extras/yui/examples/button/example06.html create mode 100644 www/extras/yui/examples/button/example07.html create mode 100644 www/extras/yui/examples/button/example08.html create mode 100644 www/extras/yui/examples/button/img/add.gif create mode 100644 www/extras/yui/examples/button/img/yahoo.gif create mode 100644 www/extras/yui/examples/button/index.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/skin-chart.gif create mode 100644 www/extras/yui/examples/container/assets/img/skin-chart2.gif create mode 100644 www/extras/yui/examples/container/assets/img/skin-close.gif create mode 100644 www/extras/yui/examples/container/assets/img/skin-corners.gif create mode 100644 www/extras/yui/examples/container/assets/img/skin-final.gif create mode 100644 www/extras/yui/examples/container/assets/img/skin-module.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/skin/1.html create mode 100644 www/extras/yui/examples/container/skin/2.html create mode 100644 www/extras/yui/examples/container/skin/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/datatable/basic.html create mode 100644 www/extras/yui/examples/datatable/complex.html create mode 100644 www/extras/yui/examples/datatable/contextmenu.html create mode 100644 www/extras/yui/examples/datatable/css/examples.css create mode 100644 www/extras/yui/examples/datatable/customsort.html create mode 100644 www/extras/yui/examples/datatable/enhanced.html create mode 100644 www/extras/yui/examples/datatable/formatting.html create mode 100644 www/extras/yui/examples/datatable/img/arrow_dn.gif create mode 100644 www/extras/yui/examples/datatable/img/arrow_up.gif create mode 100644 www/extras/yui/examples/datatable/img/logo.gif create mode 100644 www/extras/yui/examples/datatable/index.html create mode 100644 www/extras/yui/examples/datatable/inlineediting.html create mode 100644 www/extras/yui/examples/datatable/js/data.js create mode 100644 www/extras/yui/examples/datatable/nestedheaders.html create mode 100644 www/extras/yui/examples/datatable/paginated.html create mode 100644 www/extras/yui/examples/datatable/php/json5000_proxy.php create mode 100644 www/extras/yui/examples/datatable/php/json_proxy.php create mode 100644 www/extras/yui/examples/datatable/php/text_proxy.php create mode 100644 www/extras/yui/examples/datatable/php/text_proxy.txt create mode 100644 www/extras/yui/examples/datatable/php/ylocal_proxy.php create mode 100644 www/extras/yui/examples/datatable/rowselect.html create mode 100644 www/extras/yui/examples/datatable/scrolling.html create mode 100644 www/extras/yui/examples/datatable/xhrjson.html create mode 100644 www/extras/yui/examples/datatable/xhrtext.html create mode 100644 www/extras/yui/examples/datatable/xhrxml.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/history/assets/solution.css create mode 100644 www/extras/yui/examples/history/assets/style.css create mode 100644 www/extras/yui/examples/history/assets/tutorial.css create mode 100644 www/extras/yui/examples/history/assets/yui.gif create mode 100644 www/extras/yui/examples/history/calendar/index.html create mode 100644 www/extras/yui/examples/history/calendar/solution.html create mode 100644 www/extras/yui/examples/history/index.html create mode 100644 www/extras/yui/examples/history/multi/index.html create mode 100644 www/extras/yui/examples/history/multi/solution.html create mode 100644 www/extras/yui/examples/history/navbar/inc/aboutus.html create mode 100644 www/extras/yui/examples/history/navbar/inc/contactus.html create mode 100644 www/extras/yui/examples/history/navbar/inc/home.html create mode 100644 www/extras/yui/examples/history/navbar/inc/news.html create mode 100644 www/extras/yui/examples/history/navbar/inc/overview.html create mode 100644 www/extras/yui/examples/history/navbar/inc/products.html create mode 100644 www/extras/yui/examples/history/navbar/index.html create mode 100644 www/extras/yui/examples/history/navbar/solution/inc/aboutus.html create mode 100644 www/extras/yui/examples/history/navbar/solution/inc/contactus.html create mode 100644 www/extras/yui/examples/history/navbar/solution/inc/home.html create mode 100644 www/extras/yui/examples/history/navbar/solution/inc/news.html create mode 100644 www/extras/yui/examples/history/navbar/solution/inc/overview.html create mode 100644 www/extras/yui/examples/history/navbar/solution/inc/products.html create mode 100644 www/extras/yui/examples/history/navbar/solution/index.html create mode 100644 www/extras/yui/examples/history/navbar/solution/style.css create mode 100644 www/extras/yui/examples/history/tabview/index.html create mode 100644 www/extras/yui/examples/history/tabview/solution.html create mode 100644 www/extras/yui/examples/logger/basic.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/integration.html create mode 100644 www/extras/yui/examples/logger/logreader.html create mode 100644 www/extras/yui/examples/logger/logwriter.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/img/menubar_background.gif 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/tablecontextmenu.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/menu/treeviewcontextmenu.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/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/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/customicons.html 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/icons.png 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/INCLUDE_ORDER.txt b/www/extras/yui-ext/INCLUDE_ORDER.txt new file mode 100644 index 000000000..ca892eeb2 --- /dev/null +++ b/www/extras/yui-ext/INCLUDE_ORDER.txt @@ -0,0 +1,27 @@ +Your include order should be: + +Yahoo UI! (.12+) +------------------------------------------------------------------- +yui-utilities.js +ext-yui-adapter.js +ext-all.js (or your choice of files) + + +jQuery (1.1+) +------------------------------------------------------------------- +jquery.js +jquery-plugins.js // required jQuery plugins +ext-jquery-adapter.js +ext-all.js (or your choice of files) + + +Prototype (1.5+) / Scriptaculous (1.7+) +------------------------------------------------------------------- +prototype.js +scriptaculous.js?load=effects (or whatever you want to load) +ext-prototype-adapter.js +ext-all.js (or your choice of files) + + + +See the examples folders for more examples. \ No newline at end of file diff --git a/www/extras/yui-ext/LICENSE.txt b/www/extras/yui-ext/LICENSE.txt new file mode 100644 index 000000000..d026b4fdc --- /dev/null +++ b/www/extras/yui-ext/LICENSE.txt @@ -0,0 +1,25 @@ +Ext JS - JavaScript Library +Copyright (c) 2006-2007, Ext JS, LLC +All rights reserved. +licensing@extjs.com + +The CSS and Graphics ("Assets") distributed with Ext are licensed for use ONLY +with their associated Ext JavaScript component ("Component"). Use of the Assets in +any way that does not also include the Component is prohibited without explicit +permission from Ext JS, LLC. Deriving images and CSS from the Assets in an effort +to bypass this license is also prohibited. + +-- + +The JavaScript code distributed with Ext (the "Software") is licensed under the +Lesser GNU (LGPL) open source license version 2.1. + +http://www.gnu.org/licenses/lgpl.html + +If you are using this library for commercial purposes, we encourage you to purchase +a commercial license. Please visit http://extjs.com/license for more details. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. \ No newline at end of file diff --git a/www/extras/yui-ext/adapter/jquery/ext-jquery-adapter.js b/www/extras/yui-ext/adapter/jquery/ext-jquery-adapter.js new file mode 100644 index 000000000..5693d2731 --- /dev/null +++ b/www/extras/yui-ext/adapter/jquery/ext-jquery-adapter.js @@ -0,0 +1,12 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext={};window["undefined"]=window["undefined"];Ext.apply=function(o,c,_3){if(_3){Ext.apply(o,_3);}if(o&&c&&typeof c=="object"){for(var p in c){o[p]=c[p];}}return o;};(function(){var _5=0;var ua=navigator.userAgent.toLowerCase();var _7=document.compatMode=="CSS1Compat",_8=ua.indexOf("opera")>-1,_9=(/webkit|khtml/).test(ua),_a=ua.indexOf("msie")>-1,_b=ua.indexOf("msie 7")>-1,_c=!_9&&ua.indexOf("gecko")>-1,_d=_a&&!_7,_e=(ua.indexOf("windows")!=-1||ua.indexOf("win32")!=-1),_f=(ua.indexOf("macintosh")!=-1||ua.indexOf("mac os x")!=-1),_10=window.location.href.toLowerCase().indexOf("https")===0;if(_a&&!_b){try{document.execCommand("BackgroundImageCache",false,true);}catch(e){}}Ext.apply(Ext,{isStrict:_7,isSecure:_10,isReady:false,SSL_SECURE_URL:"javascript:false",BLANK_IMAGE_URL:"http:/"+"/extjs.com/s.gif",emptyFn:function(){},applyIf:function(o,c){if(o&&c){for(var p in c){if(typeof o[p]=="undefined"){o[p]=c[p];}}}return o;},addBehaviors:function(o){if(!Ext.isReady){Ext.onReady(function(){Ext.addBehaviors(o);});return;}var _15={};for(var b in o){var _17=b.split("@");if(_17[1]){var s=_17[0];if(!_15[s]){_15[s]=Ext.select(s);}_15[s].on(_17[1],o[b]);}}_15=null;},id:function(el,_1a){_1a=_1a||"ext-gen";el=Ext.getDom(el);var id=_1a+(++_5);return el?(el.id?el.id:(el.id=id)):id;},extend:function(){var io=function(o){for(var m in o){this[m]=o[m];}};return function(sb,sp,_21){if(typeof sp=="object"){_21=sp;sp=sb;sb=function(){sp.apply(this,arguments);};}var F=function(){},sbp,spp=sp.prototype;F.prototype=spp;sbp=sb.prototype=new F();sbp.constructor=sb;sb.superclass=spp;if(spp.constructor==Object.prototype.constructor){spp.constructor=sp;}sb.override=function(o){Ext.override(sb,o);};sbp.override=io;sbp.__extcls=sb;Ext.override(sb,_21);return sb;};}(),override:function(_26,_27){if(_27){var p=_26.prototype;for(var _29 in _27){p[_29]=_27[_29];}}},namespace:function(){var a=arguments,o=null,i,j,d,rt;for(i=0;i10000){clearInterval(iid);}var el=document.getElementById(id);if(el){clearInterval(iid);fn.call(_24||window,el);}};var iid=setInterval(f,50);},resolveTextNode:function(_29){if(_29&&3==_29.nodeType){return _29.parentNode;}else{return _29;}},getRelatedTarget:function(ev){ev=ev.browserEvent||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);}};Ext.lib.Ajax=function(){var _2c=function(cb){return function(xhr,_2f){if((_2f=="error"||_2f=="timeout")&&cb.failure){cb.failure.call(cb.scope||window,{responseText:xhr.responseText,responseXML:xhr.responseXML,argument:cb.argument});}else{if(cb.success){cb.success.call(cb.scope||window,{responseText:xhr.responseText,responseXML:xhr.responseXML,argument:cb.argument});}}};};return {request:function(_30,uri,cb,_33){jQuery.ajax({type:_30,url:uri,data:_33,timeout:cb.timeout,complete:_2c(cb)});},formRequest:function(_34,uri,cb,_37,_38,_39){jQuery.ajax({type:Ext.getDom(_34).method||"POST",url:uri,data:jQuery(_34).formSerialize()+(_37?"&"+_37:""),timeout:cb.timeout,complete:_2c(cb)});},isCallInProgress:function(_3a){return false;},abort:function(_3b){return false;},serializeForm:function(_3c){return jQuery(_3c.dom||_3c).formSerialize();}};}();Ext.lib.Anim=function(){var _3d=function(cb,_3f){var _40=true;return {stop:function(_41){},isAnimated:function(){return _40;},proxyCallback:function(){_40=false;Ext.callback(cb,_3f);}};};return {scroll:function(el,_43,_44,_45,cb,_47){var _48=_3d(cb,_47);el=Ext.getDom(el);el.scrollLeft=_43.scroll.to[0];el.scrollTop=_43.scroll.to[1];_48.proxyCallback();return _48;},motion:function(el,_4a,_4b,_4c,cb,_4e){return this.run(el,_4a,_4b,_4c,cb,_4e);},color:function(el,_50,_51,_52,cb,_54){var _55=_3d(cb,_54);_55.proxyCallback();return _55;},run:function(el,_57,_58,_59,cb,_5b,_5c){var _5d=_3d(cb,_5b);var o={};for(var k in _57){switch(k){case "points":var by,pts,e=Ext.fly(el,"_animrun");e.position();if(by=_57.points.by){var xy=e.getXY();pts=e.translatePoints([xy[0]+by[0],xy[1]+by[1]]);}else{pts=e.translatePoints(_57.points.to);}o.left=pts.left;o.top=pts.top;if(!parseInt(e.getStyle("left"),10)){e.setLeft(0);}if(!parseInt(e.getStyle("top"),10)){e.setTop(0);}break;case "width":o.width=_57.width.to;break;case "height":o.height=_57.height.to;break;case "opacity":o.opacity=_57.opacity.to;break;default:o[k]=_57[k].to;break;}}jQuery(el).animate(o,_58*1000,undefined,_5d.proxyCallback);return _5d;}};}();Ext.lib.Region=function(t,r,b,l){this.top=t;this[1]=t;this.right=r;this.bottom=b;this.left=l;this[0]=l;};Ext.lib.Region.prototype={contains:function(_68){return (_68.left>=this.left&&_68.right<=this.right&&_68.top>=this.top&&_68.bottom<=this.bottom);},getArea:function(){return ((this.bottom-this.top)*(this.right-this.left));},intersect:function(_69){var t=Math.max(this.top,_69.top);var r=Math.min(this.right,_69.right);var b=Math.min(this.bottom,_69.bottom);var l=Math.max(this.left,_69.left);if(b>=t&&r>=l){return new Ext.lib.Region(t,r,b,l);}else{return null;}},union:function(_6e){var t=Math.min(this.top,_6e.top);var r=Math.max(this.right,_6e.right);var b=Math.max(this.bottom,_6e.bottom);var l=Math.min(this.left,_6e.left);return new Ext.lib.Region(t,r,b,l);},adjust:function(t,l,b,r){this.top+=t;this.left+=l;this.right+=r;this.bottom+=b;return this;}};Ext.lib.Region.getRegion=function(el){var p=Ext.lib.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 Ext.lib.Region(t,r,b,l);};Ext.lib.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;};Ext.lib.Point.prototype=new Ext.lib.Region();if(Ext.isIE){jQuery(window).unload(function(){var p=Function.prototype;delete p.createSequence;delete p.defer;delete p.createDelegate;delete p.createCallback;delete p.createInterceptor;});}})(); + diff --git a/www/extras/yui-ext/adapter/jquery/jquery-plugins.js b/www/extras/yui-ext/adapter/jquery/jquery-plugins.js new file mode 100644 index 000000000..967f58a0c --- /dev/null +++ b/www/extras/yui-ext/adapter/jquery/jquery-plugins.js @@ -0,0 +1,965 @@ +/* + * Ext - JS Library 1.0 Alpha 2 + * Copyright(c) 2006-2007, Jack Slocum. + */ + +/* + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * + * $LastChangedDate$ + * $Rev$ + */ + +jQuery.fn._height = jQuery.fn.height; +jQuery.fn._width = jQuery.fn.width; + +/** + * If used on document, returns the document's height (innerHeight) + * If used on window, returns the viewport's (window) height + * See core docs on height() to see what happens when used on an element. + * + * @example $("#testdiv").height() + * @result 200 + * + * @example $(document).height() + * @result 800 + * + * @example $(window).height() + * @result 400 + * + * @name height + * @type Object + * @cat Plugins/Dimensions + */ +jQuery.fn.height = function() { + if ( this[0] == window ) + return self.innerHeight || + jQuery.boxModel && document.documentElement.clientHeight || + document.body.clientHeight; + + if ( this[0] == document ) + return Math.max( document.body.scrollHeight, document.body.offsetHeight ); + + return this._height(arguments[0]); +}; + +/** + * If used on document, returns the document's width (innerWidth) + * If used on window, returns the viewport's (window) width + * See core docs on height() to see what happens when used on an element. + * + * @example $("#testdiv").width() + * @result 200 + * + * @example $(document).width() + * @result 800 + * + * @example $(window).width() + * @result 400 + * + * @name width + * @type Object + * @cat Plugins/Dimensions + */ +jQuery.fn.width = function() { + if ( this[0] == window ) + return self.innerWidth || + jQuery.boxModel && document.documentElement.clientWidth || + document.body.clientWidth; + + if ( this[0] == document ) + return Math.max( document.body.scrollWidth, document.body.offsetWidth ); + + return this._width(arguments[0]); +}; + +/** + * Returns the inner height value (without border) for the first matched element. + * If used on document, returns the document's height (innerHeight) + * If used on window, returns the viewport's (window) height + * + * @example $("#testdiv").innerHeight() + * @result 800 + * + * @name innerHeight + * @type Number + * @cat Plugins/Dimensions + */ +jQuery.fn.innerHeight = function() { + return this[0] == window || this[0] == document ? + this.height() : + this.css('display') != 'none' ? + this[0].offsetHeight - (parseInt(this.css("borderTopWidth")) || 0) - (parseInt(this.css("borderBottomWidth")) || 0) : + this.height() + (parseInt(this.css("paddingTop")) || 0) + (parseInt(this.css("paddingBottom")) || 0); +}; + +/** + * Returns the inner width value (without border) for the first matched element. + * If used on document, returns the document's Width (innerWidth) + * If used on window, returns the viewport's (window) width + * + * @example $("#testdiv").innerWidth() + * @result 1000 + * + * @name innerWidth + * @type Number + * @cat Plugins/Dimensions + */ +jQuery.fn.innerWidth = function() { + return this[0] == window || this[0] == document ? + this.width() : + this.css('display') != 'none' ? + this[0].offsetWidth - (parseInt(this.css("borderLeftWidth")) || 0) - (parseInt(this.css("borderRightWidth")) || 0) : + this.height() + (parseInt(this.css("paddingLeft")) || 0) + (parseInt(this.css("paddingRight")) || 0); +}; + +/** + * Returns the outer height value (including border) for the first matched element. + * Cannot be used on document or window. + * + * @example $("#testdiv").outerHeight() + * @result 1000 + * + * @name outerHeight + * @type Number + * @cat Plugins/Dimensions + */ +jQuery.fn.outerHeight = function() { + return this[0] == window || this[0] == document ? + this.height() : + this.css('display') != 'none' ? + this[0].offsetHeight : + this.height() + (parseInt(this.css("borderTopWidth")) || 0) + (parseInt(this.css("borderBottomWidth")) || 0) + + (parseInt(this.css("paddingTop")) || 0) + (parseInt(this.css("paddingBottom")) || 0); +}; + +/** + * Returns the outer width value (including border) for the first matched element. + * Cannot be used on document or window. + * + * @example $("#testdiv").outerWidth() + * @result 1000 + * + * @name outerWidth + * @type Number + * @cat Plugins/Dimensions + */ +jQuery.fn.outerWidth = function() { + return this[0] == window || this[0] == document ? + this.width() : + this.css('display') != 'none' ? + this[0].offsetWidth : + this.height() + (parseInt(this.css("borderLeftWidth")) || 0) + (parseInt(this.css("borderRightWidth")) || 0) + + (parseInt(this.css("paddingLeft")) || 0) + (parseInt(this.css("paddingRight")) || 0); +}; + +/** + * Returns how many pixels the user has scrolled to the right (scrollLeft). + * Works on containers with overflow: auto and window/document. + * + * @example $("#testdiv").scrollLeft() + * @result 100 + * + * @name scrollLeft + * @type Number + * @cat Plugins/Dimensions + */ +jQuery.fn.scrollLeft = function() { + if ( this[0] == window || this[0] == document ) + return self.pageXOffset || + jQuery.boxModel && document.documentElement.scrollLeft || + document.body.scrollLeft; + + return this[0].scrollLeft; +}; + +/** + * Returns how many pixels the user has scrolled to the bottom (scrollTop). + * Works on containers with overflow: auto and window/document. + * + * @example $("#testdiv").scrollTop() + * @result 100 + * + * @name scrollTop + * @type Number + * @cat Plugins/Dimensions + */ +jQuery.fn.scrollTop = function() { + if ( this[0] == window || this[0] == document ) + return self.pageYOffset || + jQuery.boxModel && document.documentElement.scrollTop || + document.body.scrollTop; + + return this[0].scrollTop; +}; + +/** + * Returns the location of the element in pixels from the top left corner of the viewport. + * + * For accurate readings make sure to use pixel values for margins, borders and padding. + * + * @example $("#testdiv").offset() + * @result { top: 100, left: 100, scrollTop: 10, scrollLeft: 10 } + * + * @example $("#testdiv").offset({ scroll: false }) + * @result { top: 90, left: 90 } + * + * @example var offset = {} + * $("#testdiv").offset({ scroll: false }, offset) + * @result offset = { top: 90, left: 90 } + * + * @name offset + * @param Object options A hash of options describing what should be included in the final calculations of the offset. + * The options include: + * margin: Should the margin of the element be included in the calculations? True by default. + * If set to false the margin of the element is subtracted from the total offset. + * border: Should the border of the element be included in the calculations? True by default. + * If set to false the border of the element is subtracted from the total offset. + * padding: Should the padding of the element be included in the calculations? False by default. + * If set to true the padding of the element is added to the total offset. + * scroll: Should the scroll offsets of the parent elements be included in the calculations? + * True by default. When true, it adds the total scroll offsets of all parents to the + * total offset and also adds two properties to the returned object, scrollTop and + * scrollLeft. If set to false the scroll offsets of parent elements are ignored. + * If scroll offsets are not needed, set to false to get a performance boost. + * @param Object returnObject An object to store the return value in, so as not to break the chain. If passed in the + * chain will not be broken and the result will be assigned to this object. + * @type Object + * @cat Plugins/Dimensions + * @author Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net) + */ +jQuery.fn.offset = function(options, returnObject) { + var x = 0, y = 0, elem = this[0], parent = this[0], sl = 0, st = 0, options = jQuery.extend({ margin: true, border: true, padding: false, scroll: true }, options || {}); + do { + x += parent.offsetLeft || 0; + y += parent.offsetTop || 0; + + // Mozilla and IE do not add the border + if (jQuery.browser.mozilla || jQuery.browser.msie) { + // get borders + var bt = parseInt(jQuery.css(parent, 'borderTopWidth')) || 0; + var bl = parseInt(jQuery.css(parent, 'borderLeftWidth')) || 0; + + // add borders to offset + x += bl; + y += bt; + + // Mozilla removes the border if the parent has overflow property other than visible + if (jQuery.browser.mozilla && parent != elem && jQuery.css(parent, 'overflow') != 'visible') { + x += bl; + y += bt; + } + } + + var op = parent.offsetParent; + if (op && (op.tagName == 'BODY' || op.tagName == 'HTML')) { + // Safari doesn't add the body margin for elments positioned with static or relative + if (jQuery.browser.safari && jQuery.css(parent, 'position') != 'absolute') { + x += parseInt(jQuery.css(op, 'marginLeft')) || 0; + y += parseInt(jQuery.css(op, 'marginTop')) || 0; + } + + // Exit the loop + break; + } + + if (options.scroll) { + // Need to get scroll offsets in-between offsetParents + do { + sl += parent.scrollLeft || 0; + st += parent.scrollTop || 0; + + parent = parent.parentNode; + + // Mozilla removes the border if the parent has overflow property other than visible + if (jQuery.browser.mozilla && parent != elem && parent != op && parent.style && jQuery.css(parent, 'overflow') != 'visible') { + y += parseInt(jQuery.css(parent, 'borderTopWidth')) || 0; + x += parseInt(jQuery.css(parent, 'borderLeftWidth')) || 0; + } + } while (parent != op); + } else { + parent = parent.offsetParent; + } + } while (parent); + + if ( !options.margin) { + x -= parseInt(jQuery.css(elem, 'marginLeft')) || 0; + y -= parseInt(jQuery.css(elem, 'marginTop')) || 0; + } + + // Safari and Opera do not add the border for the element + if ( options.border && (jQuery.browser.safari || jQuery.browser.opera) ) { + x += parseInt(jQuery.css(elem, 'borderLeftWidth')) || 0; + y += parseInt(jQuery.css(elem, 'borderTopWidth')) || 0; + } else if ( !options.border && !(jQuery.browser.safari || jQuery.browser.opera) ) { + x -= parseInt(jQuery.css(elem, 'borderLeftWidth')) || 0; + y -= parseInt(jQuery.css(elem, 'borderTopWidth')) || 0; + } + + if ( options.padding ) { + x += parseInt(jQuery.css(elem, 'paddingLeft')) || 0; + y += parseInt(jQuery.css(elem, 'paddingTop')) || 0; + } + + // Opera thinks offset is scroll offset for display: inline elements + if (options.scroll && jQuery.browser.opera && jQuery.css(elem, 'display') == 'inline') { + sl -= elem.scrollLeft || 0; + st -= elem.scrollTop || 0; + } + + var returnValue = options.scroll ? { top: y - st, left: x - sl, scrollTop: st, scrollLeft: sl } + : { top: y, left: x }; + + if (returnObject) { jQuery.extend(returnObject, returnValue); return this; } + else { return returnValue; } +}; + + + +// FORM PLUGIN + +/* + * jQuery form plugin + * @requires jQuery v1.0.3 + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id$ + * Version: 0.9 + */ + +/** + * ajaxSubmit() provides a mechanism for submitting an HTML form using AJAX. + * + * ajaxSubmit accepts a single argument which can be either a success callback function + * or an options Object. If a function is provided it will be invoked upon successful + * completion of the submit and will be passed the response from the server. + * If an options Object is provided, the following attributes are supported: + * + * target: Identifies the element(s) in the page to be updated with the server response. + * This value may be specified as a jQuery selection string, a jQuery object, + * or a DOM element. + * default value: null + * + * url: URL to which the form data will be submitted. + * default value: value of form's 'action' attribute + * + * method: @deprecated use 'type' + * type: The method in which the form data should be submitted, 'GET' or 'POST'. + * default value: value of form's 'method' attribute (or 'GET' if none found) + * + * before: @deprecated use 'beforeSubmit' + * beforeSubmit: Callback method to be invoked before the form is submitted. + * default value: null + * + * after: @deprecated use 'success' + * success: Callback method to be invoked after the form has been successfully submitted + * and the response has been returned from the server + * default value: null + * + * dataType: Expected dataType of the response. One of: null, 'xml', 'script', or 'json' + * default value: null + * + * semantic: Boolean flag indicating whether data must be submitted in semantic order (slower). + * default value: false + * + * resetForm: Boolean flag indicating whether the form should be reset if the submit is successful + * + * clearForm: Boolean flag indicating whether the form should be cleared if the submit is successful + * + * + * The 'beforeSubmit' callback can be provided as a hook for running pre-submit logic or for + * validating the form data. If the 'beforeSubmit' callback returns false then the form will + * not be submitted. The 'beforeSubmit' callback is invoked with three arguments: the form data + * in array format, the jQuery object, and the options object passed into ajaxSubmit. + * The form data array takes the following form: + * + * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ] + * + * If a 'success' callback method is provided it is invoked after the response has been returned + * from the server. It is passed the responseText or responseXML value (depending on dataType). + * See jQuery.ajax for further details. + * + * + * The dataType option provides a means for specifying how the server response should be handled. + * This maps directly to the jQuery.httpData method. The following values are supported: + * + * 'xml': if dataType == 'xml' the server response is treated as XML and the 'after' + * callback method, if specified, will be passed the responseXML value + * 'json': if dataType == 'json' the server response will be evaluted and passed to + * the 'after' callback, if specified + * 'script': if dataType == 'script' the server response is evaluated in the global context + * + * + * Note that it does not make sense to use both the 'target' and 'dataType' options. If both + * are provided the target will be ignored. + * + * The semantic argument can be used to force form serialization in semantic order. + * This is normally true anyway, unless the form contains input elements of type='image'. + * If your form must be submitted with name/value pairs in semantic order and your form + * contains an input of type='image" then pass true for this arg, otherwise pass false + * (or nothing) to avoid the overhead for this logic. + * + * + * When used on its own, ajaxSubmit() is typically bound to a form's submit event like this: + * + * $("#form-id").submit(function() { + * $(this).ajaxSubmit(options); + * return false; // cancel conventional submit + * }); + * + * When using ajaxForm(), however, this is done for you. + * + * @example + * $('#myForm').ajaxSubmit(function(data) { + * alert('Form submit succeeded! Server returned: ' + data); + * }); + * @desc Submit form and alert server response + * + * + * @example + * var options = { + * target: '#myTargetDiv' + * }; + * $('#myForm').ajaxSubmit(options); + * @desc Submit form and update page element with server response + * + * + * @example + * var options = { + * success: function(responseText) { + * alert(responseText); + * } + * }; + * $('#myForm').ajaxSubmit(options); + * @desc Submit form and alert the server response + * + * + * @example + * var options = { + * beforeSubmit: function(formArray, jqForm) { + * if (formArray.length == 0) { + * alert('Please enter data.'); + * return false; + * } + * } + * }; + * $('#myForm').ajaxSubmit(options); + * @desc Pre-submit validation which aborts the submit operation if form data is empty + * + * + * @example + * var options = { + * url: myJsonUrl.php, + * dataType: 'json', + * success: function(data) { + * // 'data' is an object representing the the evaluated json data + * } + * }; + * $('#myForm').ajaxSubmit(options); + * @desc json data returned and evaluated + * + * + * @example + * var options = { + * url: myXmlUrl.php, + * dataType: 'xml', + * success: function(responseXML) { + * // responseXML is XML document object + * var data = $('myElement', responseXML).text(); + * } + * }; + * $('#myForm').ajaxSubmit(options); + * @desc XML data returned from server + * + * + * @example + * var options = { + * resetForm: true + * }; + * $('#myForm').ajaxSubmit(options); + * @desc submit form and reset it if successful + * + * @example + * $('#myForm).submit(function() { + * $(this).ajaxSubmit(); + * return false; + * }); + * @desc Bind form's submit event to use ajaxSubmit + * + * + * @name ajaxSubmit + * @type jQuery + * @param options object literal containing options which control the form submission process + * @cat Plugins/Form + * @return jQuery + * @see formToArray + * @see ajaxForm + * @see $.ajax + * @author jQuery Community + */ +jQuery.fn.ajaxSubmit = function(options) { + if (typeof options == 'function') + options = { success: options }; + + options = jQuery.extend({ + url: this.attr('action') || '', + method: this.attr('method') || 'GET' + }, options || {}); + + // remap deprecated options (temporarily) + options.success = options.success || options.after; + options.beforeSubmit = options.beforeSubmit || options.before; + options.type = options.type || options.method; + + var a = this.formToArray(options.semantic); + + // give pre-submit callback an opportunity to abort the submit + if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) return this; + + var q = jQuery.param(a); + + if (options.type.toUpperCase() == 'GET') { + // if url already has a '?' then append args after '&' + options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q; + options.data = null; // data is null for 'get' + } + else + options.data = q; // data is the query string for 'post' + + var $form = this, callbacks = []; + if (options.resetForm) callbacks.push(function() { $form.resetForm(); }); + if (options.clearForm) callbacks.push(function() { $form.clearForm(); }); + + // perform a load on the target only if dataType is not provided + if (!options.dataType && options.target) { + var oldSuccess = options.success || function(){}; + callbacks.push(function(data, status) { + jQuery(options.target).attr("innerHTML", data).evalScripts().each(oldSuccess, [data, status]); + }); + } + else if (options.success) + callbacks.push(options.success); + + options.success = function(data, status) { + for (var i=0, max=callbacks.length; i < max; i++) + callbacks[i](data, status); + }; + + jQuery.ajax(options); + return this; +}; + +/** + * ajaxForm() provides a mechanism for fully automating form submission. + * + * The advantages of using this method instead of ajaxSubmit() are: + * + * 1: This method will include coordinates for elements (if the element + * is used to submit the form). + * 2. This method will include the submit element's name/value data (for the element that was + * used to submit the form). + * 3. This method binds the submit() method to the form for you. + * + * Note that for accurate x/y coordinates of image submit elements in all browsers + * you need to also use the "dimensions" plugin (this method will auto-detect its presence). + * + * The options argument for ajaxForm works exactly as it does for ajaxSubmit. ajaxForm merely + * passes the options argument along after properly binding events for submit elements and + * the form itself. See ajaxSubmit for a full description of the options argument. + * + * + * @example + * var options = { + * target: '#myTargetDiv' + * }; + * $('#myForm').ajaxSForm(options); + * @desc Bind form's submit event so that 'myTargetDiv' is updated with the server response + * when the form is submitted. + * + * + * @example + * var options = { + * success: function(responseText) { + * alert(responseText); + * } + * }; + * $('#myForm').ajaxSubmit(options); + * @desc Bind form's submit event so that server response is alerted after the form is submitted. + * + * + * @example + * var options = { + * beforeSubmit: function(formArray, jqForm) { + * if (formArray.length == 0) { + * alert('Please enter data.'); + * return false; + * } + * } + * }; + * $('#myForm').ajaxSubmit(options); + * @desc Bind form's submit event so that pre-submit callback is invoked before the form + * is submitted. + * + * + * @name ajaxForm + * @param options object literal containing options which control the form submission process + * @return jQuery + * @cat Plugins/Form + * @type jQuery + * @see ajaxSubmit + * @author jQuery Community + */ +jQuery.fn.ajaxForm = function(options) { + return this.each(function() { + jQuery("input:submit,input:image,button:submit", this).click(function(ev) { + var $form = this.form; + $form.clk = this; + if (this.type == 'image') { + if (ev.offsetX != undefined) { + $form.clk_x = ev.offsetX; + $form.clk_y = ev.offsetY; + } else if (typeof jQuery.fn.offset == 'function') { // try to use dimensions plugin + var offset = jQuery(this).offset(); + $form.clk_x = ev.pageX - offset.left; + $form.clk_y = ev.pageY - offset.top; + } else { + $form.clk_x = ev.pageX - this.offsetLeft; + $form.clk_y = ev.pageY - this.offsetTop; + } + } + // clear form vars + setTimeout(function() { + $form.clk = $form.clk_x = $form.clk_y = null; + }, 10); + }) + }).submit(function(e) { + jQuery(this).ajaxSubmit(options); + return false; + }); +}; + + +/** + * formToArray() gathers form element data into an array of objects that can + * be passed to any of the following ajax functions: $.get, $.post, or load. + * Each object in the array has both a 'name' and 'value' property. An example of + * an array for a simple login form might be: + * + * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ] + * + * It is this array that is passed to pre-submit callback functions provided to the + * ajaxSubmit() and ajaxForm() methods. + * + * The semantic argument can be used to force form serialization in semantic order. + * This is normally true anyway, unless the form contains input elements of type='image'. + * If your form must be submitted with name/value pairs in semantic order and your form + * contains an input of type='image" then pass true for this arg, otherwise pass false + * (or nothing) to avoid the overhead for this logic. + * + * @example var data = $("#myForm").formToArray(); + * $.post( "myscript.cgi", data ); + * @desc Collect all the data from a form and submit it to the server. + * + * @name formToArray + * @param semantic true if serialization must maintain strict semantic ordering of elements (slower) + * @type Array + * @cat Plugins/Form + * @see ajaxForm + * @see ajaxSubmit + * @author jQuery Community + */ +jQuery.fn.formToArray = function(semantic) { + var a = []; + if (this.length == 0) return a; + + var form = this[0]; + var els = semantic ? form.getElementsByTagName('*') : form.elements; + if (!els) return a; + for(var i=0, max=els.length; i < max; i++) { + var el = els[i]; + var n = el.name; + if (!n) continue; + + if (semantic && form.clk && el.type == "image") { + // handle image inputs on the fly when semantic == true + if(!el.disabled && form.clk == el) + a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y}); + continue; + } + var v = jQuery.fieldValue(el, true); + if (v === null) continue; + if (v.constructor == Array) { + for(var j=0, jmax=v.length; j < jmax; j++) + a.push({name: n, value: v[j]}); + } + else + a.push({name: n, value: v}); + } + + if (!semantic && form.clk) { + // input type=='image' are not found in elements array! handle them here + var inputs = form.getElementsByTagName("input"); + for(var i=0, max=inputs.length; i < max; i++) { + var input = inputs[i]; + var n = input.name; + if(n && !input.disabled && input.type == "image" && form.clk == input) + a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y}); + } + } + return a; +}; + + +/** + * Serializes form data into a 'submittable' string. This method will return a string + * in the format: name1=value1&name2=value2 + * + * The semantic argument can be used to force form serialization in semantic order. + * If your form must be submitted with name/value pairs in semantic order then pass + * true for this arg, otherwise pass false (or nothing) to avoid the overhead for + * this logic (which can be significant for very large forms). + * + * @example var data = $("#myForm").formSerialize(); + * $.ajax('POST', "myscript.cgi", data); + * @desc Collect all the data from a form into a single string + * + * @name formSerialize + * @param semantic true if serialization must maintain strict semantic ordering of elements (slower) + * @type String + * @cat Plugins/Form + * @see formToArray + * @author jQuery Community + */ +jQuery.fn.formSerialize = function(semantic) { + //hand off to jQuery.param for proper encoding + return jQuery.param(this.formToArray(semantic)); +}; + + +/** + * Serializes all field elements in the jQuery object into a query string. + * This method will return a string in the format: name1=value1&name2=value2 + * + * The successful argument controls whether or not serialization is limited to + * 'successful' controls (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls). + * The default value of the successful argument is true. + * + * @example var data = $("input").formSerialize(); + * @desc Collect the data from all successful input elements into a query string + * + * @example var data = $(":radio").formSerialize(); + * @desc Collect the data from all successful radio input elements into a query string + * + * @example var data = $("#myForm :checkbox").formSerialize(); + * @desc Collect the data from all successful checkbox input elements in myForm into a query string + * + * @example var data = $("#myForm :checkbox").formSerialize(false); + * @desc Collect the data from all checkbox elements in myForm (even the unchecked ones) into a query string + * + * @example var data = $(":input").formSerialize(); + * @desc Collect the data from all successful input, select, textarea and button elements into a query string + * + * @name fieldSerialize + * @param successful true if only successful controls should be serialized (default is true) + * @type String + * @cat Plugins/Form + */ +jQuery.fn.fieldSerialize = function(successful) { + var a = []; + this.each(function() { + var n = this.name; + if (!n) return; + var v = jQuery.fieldValue(this, successful); + if (v && v.constructor == Array) { + for (var i=0,max=v.length; i < max; i++) + a.push({name: n, value: v[i]}); + } + else if (v !== null && typeof v != 'undefined') + a.push({name: this.name, value: v}); + }); + //hand off to jQuery.param for proper encoding + return jQuery.param(a); +}; + + +/** + * Returns the value of the field element in the jQuery object. If there is more than one field element + * in the jQuery object the value of the first successful one is returned. + * + * The successful argument controls whether or not the field element must be 'successful' + * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls). + * The default value of the successful argument is true. If this value is false then + * the value of the first field element in the jQuery object is returned. + * + * Note: If no valid value can be determined the return value will be undifined. + * + * Note: The fieldValue returned for a select-multiple element or for a checkbox input will + * always be an array if it is not undefined. + * + * + * @example var data = $("#myPasswordElement").formValue(); + * @desc Gets the current value of the myPasswordElement element + * + * @example var data = $("#myForm :input").formValue(); + * @desc Get the value of the first successful control in the jQuery object. + * + * @example var data = $("#myForm :checkbox").formValue(); + * @desc Get the array of values for the first set of successful checkbox controls in the jQuery object. + * + * @example var data = $("#mySingleSelect").formValue(); + * @desc Get the value of the select control + * + * @example var data = $("#myMultiSelect").formValue(); + * @desc Get the array of selected values for the select-multiple control + * + * @name fieldValue + * @param Boolean successful true if value returned must be for a successful controls (default is true) + * @type String or Array + * @cat Plugins/Form + */ +jQuery.fn.fieldValue = function(successful) { + var cbVal, cbName; + + // loop until we find a value + for (var i=0, max=this.length; i < max; i++) { + var el = this[i]; + var v = jQuery.fieldValue(el, successful); + if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) + continue; + + // for checkboxes, consider multiple elements, for everything else just return first valid value + if (el.type != 'checkbox') return v; + + cbName = cbName || el.name; + if (cbName != el.name) // return if we hit a checkbox with a different name + return cbVal; + cbVal = cbVal || []; + cbVal.push(v); + } + return cbVal; +}; + +/** + * Returns the value of the field element. + * + * The successful argument controls whether or not the field element must be 'successful' + * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls). + * The default value of the successful argument is true. If the given element is not + * successful and the successful arg is not false then the returned value will be null. + * + * Note: The fieldValue returned for a select-multiple element will always be an array. + * + * @example var data = jQuery.fieldValue($("#myPasswordElement")[0]); + * @desc Gets the current value of the myPasswordElement element + * + * @name fieldValue + * @param Element el The DOM element for which the value will be returned + * @param Boolean successful true if value returned must be for a successful controls (default is true) + * @type String or Array + * @cat Plugins/Form + */ +jQuery.fieldValue = function(el, successful) { + var n = el.name, t = el.type, tag = el.tagName.toLowerCase(); + if (typeof successful == 'undefined') successful = true; + + if (successful && ( !n || el.disabled || t == 'reset' || + (t == 'checkbox' || t == 'radio') && !el.checked || + (t == 'submit' || t == 'image') && el.form && el.form.clk != el || + tag == 'select' && el.selectedIndex == -1)) + return null; + + if (tag == 'select') { + var index = el.selectedIndex; + if (index < 0) return null; + var a = [], ops = el.options; + var one = (t == 'select-one'); + var max = (one ? index+1 : ops.length); + for(var i=(one ? index : 0); i < max; i++) { + var op = ops[i]; + if (op.selected) { + // extra pain for IE... + var v = jQuery.browser.msie && !(op.attributes['value'].specified) ? op.text : op.value; + if (one) return v; + a.push(v); + } + } + return a; + } + return el.value; +}; + + +/** + * Clears the form data. Takes the following actions on the form's input fields: + * - input text fields will have their 'value' property set to the empty string + * - select elements will have their 'selectedIndex' property set to -1 + * - checkbox and radio inputs will have their 'checked' property set to false + * - inputs of type submit, button, reset, and hidden will *not* be effected + * - button elements will *not* be effected + * + * @example $('form').clearForm(); + * @desc Clears all forms on the page. + * + * @name clearForm + * @type jQuery + * @cat Plugins/Form + * @see resetForm + */ +jQuery.fn.clearForm = function() { + return this.each(function() { + jQuery('input,select,textarea', this).clearFields(); + }); +}; + +/** + * Clears the selected form elements. Takes the following actions on the matched elements: + * - input text fields will have their 'value' property set to the empty string + * - select elements will have their 'selectedIndex' property set to -1 + * - checkbox and radio inputs will have their 'checked' property set to false + * - inputs of type submit, button, reset, and hidden will *not* be effected + * - button elements will *not* be effected + * + * @example $('.myInputs').clearFields(); + * @desc Clears all inputs with class myInputs + * + * @name clearFields + * @type jQuery + * @cat Plugins/Form + * @see clearForm + */ +jQuery.fn.clearFields = jQuery.fn.clearInputs = function() { + return this.each(function() { + var t = this.type, tag = this.tagName.toLowerCase(); + if (t == 'text' || t == 'password' || tag == 'textarea') + this.value = ''; + else if (t == 'checkbox' || t == 'radio') + this.checked = false; + else if (tag == 'select') + this.selectedIndex = -1; + }); +}; + + +/** + * Resets the form data. Causes all form elements to be reset to their original value. + * + * @example $('form').resetForm(); + * @desc Resets all forms on the page. + * + * @name resetForm + * @type jQuery + * @cat Plugins/Form + * @see clearForm + */ +jQuery.fn.resetForm = function() { + return this.each(function() { + // guard against an input with the name of 'reset' + // note that IE reports the reset function as an 'object' + if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) + this.reset(); + }); +}; diff --git a/www/extras/yui-ext/adapter/jquery/jquery.js b/www/extras/yui-ext/adapter/jquery/jquery.js new file mode 100644 index 000000000..709be4ac2 --- /dev/null +++ b/www/extras/yui-ext/adapter/jquery/jquery.js @@ -0,0 +1,2201 @@ +/* prevent execution of jQuery if included more than once */ +if(typeof window.jQuery == "undefined") { +/* + * jQuery 1.1.1 - New Wave Javascript + * + * Copyright (c) 2007 John Resig (jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * $Date: 2007-01-22 00:27:54 -0500 (Mon, 22 Jan 2007) $ + * $Rev: 1153 $ + */ + +// Global undefined variable +window.undefined = window.undefined; +var jQuery = function(a,c) { + // If the context is global, return a new object + if ( window == this ) + return new jQuery(a,c); + + // Make sure that a selection was provided + a = a || document; + + // HANDLE: $(function) + // Shortcut for document ready + if ( jQuery.isFunction(a) ) + return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a ); + + // Handle HTML strings + if ( typeof a == "string" ) { + // HANDLE: $(html) -> $(array) + var m = /^[^<]*(<(.|\n)+>)[^>]*$/.exec(a); + if ( m ) + a = jQuery.clean( [ m[1] ] ); + + // HANDLE: $(expr) + else + return new jQuery( c ).find( a ); + } + + return this.setArray( + // HANDLE: $(array) + a.constructor == Array && a || + + // HANDLE: $(arraylike) + // Watch for when an array-like object is passed as the selector + (a.jquery || a.length && a != window && !a.nodeType && a[0] != undefined && a[0].nodeType) && jQuery.makeArray( a ) || + + // HANDLE: $(*) + [ a ] ); +}; + +// Map over the $ in case of overwrite +if ( typeof $ != "undefined" ) + jQuery._$ = $; + +// Map the jQuery namespace to the '$' one +var $ = jQuery; + +jQuery.fn = jQuery.prototype = { + jquery: "1.1.1", + + size: function() { + return this.length; + }, + + length: 0, + + get: function( num ) { + return num == undefined ? + + // Return a 'clean' array + jQuery.makeArray( this ) : + + // Return just the object + this[num]; + }, + pushStack: function( a ) { + var ret = jQuery(this); + ret.prevObject = this; + return ret.setArray( a ); + }, + setArray: function( a ) { + this.length = 0; + [].push.apply( this, a ); + return this; + }, + each: function( fn, args ) { + return jQuery.each( this, fn, args ); + }, + index: function( obj ) { + var pos = -1; + this.each(function(i){ + if ( this == obj ) pos = i; + }); + return pos; + }, + + attr: function( key, value, type ) { + var obj = key; + + // Look for the case where we're accessing a style value + if ( key.constructor == String ) + if ( value == undefined ) + return this.length && jQuery[ type || "attr" ]( this[0], key ) || undefined; + else { + obj = {}; + obj[ key ] = value; + } + + // Check to see if we're setting style values + return this.each(function(index){ + // Set all the styles + for ( var prop in obj ) + jQuery.attr( + type ? this.style : this, + prop, jQuery.prop(this, obj[prop], type, index, prop) + ); + }); + }, + + css: function( key, value ) { + return this.attr( key, value, "curCSS" ); + }, + + text: function(e) { + if ( typeof e == "string" ) + return this.empty().append( document.createTextNode( e ) ); + + var t = ""; + jQuery.each( e || this, function(){ + jQuery.each( this.childNodes, function(){ + if ( this.nodeType != 8 ) + t += this.nodeType != 1 ? + this.nodeValue : jQuery.fn.text([ this ]); + }); + }); + return t; + }, + + wrap: function() { + // The elements to wrap the target around + var a = jQuery.clean(arguments); + + // Wrap each of the matched elements individually + return this.each(function(){ + // Clone the structure that we're using to wrap + var b = a[0].cloneNode(true); + + // Insert it before the element to be wrapped + this.parentNode.insertBefore( b, this ); + + // Find the deepest point in the wrap structure + while ( b.firstChild ) + b = b.firstChild; + + // Move the matched element to within the wrap structure + b.appendChild( this ); + }); + }, + append: function() { + return this.domManip(arguments, true, 1, function(a){ + this.appendChild( a ); + }); + }, + prepend: function() { + return this.domManip(arguments, true, -1, function(a){ + this.insertBefore( a, this.firstChild ); + }); + }, + before: function() { + return this.domManip(arguments, false, 1, function(a){ + this.parentNode.insertBefore( a, this ); + }); + }, + after: function() { + return this.domManip(arguments, false, -1, function(a){ + this.parentNode.insertBefore( a, this.nextSibling ); + }); + }, + end: function() { + return this.prevObject || jQuery([]); + }, + find: function(t) { + return this.pushStack( jQuery.map( this, function(a){ + return jQuery.find(t,a); + }) ); + }, + clone: function(deep) { + return this.pushStack( jQuery.map( this, function(a){ + return a.cloneNode( deep != undefined ? deep : true ); + }) ); + }, + + filter: function(t) { + return this.pushStack( + jQuery.isFunction( t ) && + jQuery.grep(this, function(el, index){ + return t.apply(el, [index]) + }) || + + jQuery.multiFilter(t,this) ); + }, + + not: function(t) { + return this.pushStack( + t.constructor == String && + jQuery.multiFilter(t,this,true) || + + jQuery.grep(this,function(a){ + if ( t.constructor == Array || t.jquery ) + return jQuery.inArray( t, a ) < 0; + else + return a != t; + }) ); + }, + + add: function(t) { + return this.pushStack( jQuery.merge( + this.get(), + t.constructor == String ? + jQuery(t).get() : + t.length != undefined && !t.nodeName ? + t : [t] ) + ); + }, + is: function(expr) { + return expr ? jQuery.filter(expr,this).r.length > 0 : false; + }, + + val: function( val ) { + return val == undefined ? + ( this.length ? this[0].value : null ) : + this.attr( "value", val ); + }, + + html: function( val ) { + return val == undefined ? + ( this.length ? this[0].innerHTML : null ) : + this.empty().append( val ); + }, + domManip: function(args, table, dir, fn){ + var clone = this.length > 1; + var a = jQuery.clean(args); + if ( dir < 0 ) + a.reverse(); + + return this.each(function(){ + var obj = this; + + if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") ) + obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody")); + + jQuery.each( a, function(){ + fn.apply( obj, [ clone ? this.cloneNode(true) : this ] ); + }); + + }); + } +}; + +jQuery.extend = jQuery.fn.extend = function() { + // copy reference to target object + var target = arguments[0], + a = 1; + + // extend jQuery itself if only one argument is passed + if ( arguments.length == 1 ) { + target = this; + a = 0; + } + var prop; + while (prop = arguments[a++]) + // Extend the base object + for ( var i in prop ) target[i] = prop[i]; + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function() { + if ( jQuery._$ ) + $ = jQuery._$; + return jQuery; + }, + + // This may seem like some crazy code, but trust me when I say that this + // is the only cross-browser way to do this. --John + isFunction: function( fn ) { + return !!fn && typeof fn != "string" && + typeof fn[0] == "undefined" && /function/i.test( fn + "" ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); + }, + // args is for internal usage only + each: function( obj, fn, args ) { + if ( obj.length == undefined ) + for ( var i in obj ) + fn.apply( obj[i], args || [i, obj[i]] ); + else + for ( var i = 0, ol = obj.length; i < ol; i++ ) + if ( fn.apply( obj[i], args || [i, obj[i]] ) === false ) break; + return obj; + }, + + prop: function(elem, value, type, index, prop){ + // Handle executable functions + if ( jQuery.isFunction( value ) ) + return value.call( elem, [index] ); + + // exclude the following css properties to add px + var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i; + + // Handle passing in a number to a CSS property + if ( value.constructor == Number && type == "curCSS" && !exclude.test(prop) ) + return value + "px"; + + return value; + }, + + className: { + // internal only, use addClass("class") + add: function( elem, c ){ + jQuery.each( c.split(/\s+/), function(i, cur){ + if ( !jQuery.className.has( elem.className, cur ) ) + elem.className += ( elem.className ? " " : "" ) + cur; + }); + }, + + // internal only, use removeClass("class") + remove: function( elem, c ){ + elem.className = c ? + jQuery.grep( elem.className.split(/\s+/), function(cur){ + return !jQuery.className.has( c, cur ); + }).join(" ") : ""; + }, + + // internal only, use is(".class") + has: function( t, c ) { + t = t.className || t; + return t && new RegExp("(^|\\s)" + c + "(\\s|$)").test( t ); + } + }, + swap: function(e,o,f) { + for ( var i in o ) { + e.style["old"+i] = e.style[i]; + e.style[i] = o[i]; + } + f.apply( e, [] ); + for ( var i in o ) + e.style[i] = e.style["old"+i]; + }, + + css: function(e,p) { + if ( p == "height" || p == "width" ) { + var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"]; + + jQuery.each( d, function(){ + old["padding" + this] = 0; + old["border" + this + "Width"] = 0; + }); + + jQuery.swap( e, old, function() { + if (jQuery.css(e,"display") != "none") { + oHeight = e.offsetHeight; + oWidth = e.offsetWidth; + } else { + e = jQuery(e.cloneNode(true)) + .find(":radio").removeAttr("checked").end() + .css({ + visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0" + }).appendTo(e.parentNode)[0]; + + var parPos = jQuery.css(e.parentNode,"position"); + if ( parPos == "" || parPos == "static" ) + e.parentNode.style.position = "relative"; + + oHeight = e.clientHeight; + oWidth = e.clientWidth; + + if ( parPos == "" || parPos == "static" ) + e.parentNode.style.position = "static"; + + e.parentNode.removeChild(e); + } + }); + + return p == "height" ? oHeight : oWidth; + } + + return jQuery.curCSS( e, p ); + }, + + curCSS: function(elem, prop, force) { + var ret; + + if (prop == "opacity" && jQuery.browser.msie) + return jQuery.attr(elem.style, "opacity"); + + if (prop == "float" || prop == "cssFloat") + prop = jQuery.browser.msie ? "styleFloat" : "cssFloat"; + + if (!force && elem.style[prop]) + ret = elem.style[prop]; + + else if (document.defaultView && document.defaultView.getComputedStyle) { + + if (prop == "cssFloat" || prop == "styleFloat") + prop = "float"; + + prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase(); + var cur = document.defaultView.getComputedStyle(elem, null); + + if ( cur ) + ret = cur.getPropertyValue(prop); + else if ( prop == "display" ) + ret = "none"; + else + jQuery.swap(elem, { display: "block" }, function() { + var c = document.defaultView.getComputedStyle(this, ""); + ret = c && c.getPropertyValue(prop) || ""; + }); + + } else if (elem.currentStyle) { + + var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();}); + ret = elem.currentStyle[prop] || elem.currentStyle[newProp]; + + } + + return ret; + }, + + clean: function(a) { + var r = []; + + jQuery.each( a, function(i,arg){ + if ( !arg ) return; + + if ( arg.constructor == Number ) + arg = arg.toString(); + + // Convert html string into DOM nodes + if ( typeof arg == "string" ) { + // Trim whitespace, otherwise indexOf won't work as expected + var s = jQuery.trim(arg), div = document.createElement("div"), tb = []; + + var wrap = + // option or optgroup + !s.indexOf("", ""] || + + (!s.indexOf("", ""] || + + !s.indexOf("", ""] || + + // matched above + (!s.indexOf("", ""] || + + [0,"",""]; + + // Go to html and back, then peel off extra wrappers + div.innerHTML = wrap[1] + s + wrap[2]; + + // Move to the right depth + while ( wrap[0]-- ) + div = div.firstChild; + + // Remove IE's autoinserted from table fragments + if ( jQuery.browser.msie ) { + + // String was a , *may* have spurious + if ( !s.indexOf(" or + else if ( wrap[1] == "
" && s.indexOf("= 0 ; --n ) + if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length ) + tb[n].parentNode.removeChild(tb[n]); + + } + + arg = div.childNodes; + } + + if ( arg.length === 0 ) + return; + + if ( arg[0] == undefined ) + r.push( arg ); + else + r = jQuery.merge( r, arg ); + + }); + + return r; + }, + + attr: function(elem, name, value){ + var fix = { + "for": "htmlFor", + "class": "className", + "float": jQuery.browser.msie ? "styleFloat" : "cssFloat", + cssFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat", + innerHTML: "innerHTML", + className: "className", + value: "value", + disabled: "disabled", + checked: "checked", + readonly: "readOnly", + selected: "selected" + }; + + // IE actually uses filters for opacity ... elem is actually elem.style + if ( name == "opacity" && jQuery.browser.msie && value != undefined ) { + // IE has trouble with opacity if it does not have layout + // Force it by setting the zoom level + elem.zoom = 1; + + // Set the alpha filter to set the opacity + return elem.filter = elem.filter.replace(/alpha\([^\)]*\)/gi,"") + + ( value == 1 ? "" : "alpha(opacity=" + value * 100 + ")" ); + + } else if ( name == "opacity" && jQuery.browser.msie ) + return elem.filter ? + parseFloat( elem.filter.match(/alpha\(opacity=(.*)\)/)[1] ) / 100 : 1; + + // Mozilla doesn't play well with opacity 1 + if ( name == "opacity" && jQuery.browser.mozilla && value == 1 ) + value = 0.9999; + + // Certain attributes only work when accessed via the old DOM 0 way + if ( fix[name] ) { + if ( value != undefined ) elem[fix[name]] = value; + return elem[fix[name]]; + + } else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") ) + return elem.getAttributeNode(name).nodeValue; + + // IE elem.getAttribute passes even for style + else if ( elem.tagName ) { + if ( value != undefined ) elem.setAttribute( name, value ); + return elem.getAttribute( name ); + + } else { + name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();}); + if ( value != undefined ) elem[name] = value; + return elem[name]; + } + }, + trim: function(t){ + return t.replace(/^\s+|\s+$/g, ""); + }, + + makeArray: function( a ) { + var r = []; + + if ( a.constructor != Array ) + for ( var i = 0, al = a.length; i < al; i++ ) + r.push( a[i] ); + else + r = a.slice( 0 ); + + return r; + }, + + inArray: function( b, a ) { + for ( var i = 0, al = a.length; i < al; i++ ) + if ( a[i] == b ) + return i; + return -1; + }, + merge: function(first, second) { + var r = [].slice.call( first, 0 ); + + // Now check for duplicates between the two arrays + // and only add the unique items + for ( var i = 0, sl = second.length; i < sl; i++ ) + // Check for duplicates + if ( jQuery.inArray( second[i], r ) == -1 ) + // The item is unique, add it + first.push( second[i] ); + + return first; + }, + grep: function(elems, fn, inv) { + // If a string is passed in for the function, make a function + // for it (a handy shortcut) + if ( typeof fn == "string" ) + fn = new Function("a","i","return " + fn); + + var result = []; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, el = elems.length; i < el; i++ ) + if ( !inv && fn(elems[i],i) || inv && !fn(elems[i],i) ) + result.push( elems[i] ); + + return result; + }, + map: function(elems, fn) { + // If a string is passed in for the function, make a function + // for it (a handy shortcut) + if ( typeof fn == "string" ) + fn = new Function("a","return " + fn); + + var result = [], r = []; + + // Go through the array, translating each of the items to their + // new value (or values). + for ( var i = 0, el = elems.length; i < el; i++ ) { + var val = fn(elems[i],i); + + if ( val !== null && val != undefined ) { + if ( val.constructor != Array ) val = [val]; + result = result.concat( val ); + } + } + + var r = result.length ? [ result[0] ] : []; + + check: for ( var i = 1, rl = result.length; i < rl; i++ ) { + for ( var j = 0; j < i; j++ ) + if ( result[i] == r[j] ) + continue check; + + r.push( result[i] ); + } + + return r; + } +}); + +/* + * Whether the W3C compliant box model is being used. + * + * @property + * @name $.boxModel + * @type Boolean + * @cat JavaScript + */ +new function() { + var b = navigator.userAgent.toLowerCase(); + + // Figure out what browser is being used + jQuery.browser = { + safari: /webkit/.test(b), + opera: /opera/.test(b), + msie: /msie/.test(b) && !/opera/.test(b), + mozilla: /mozilla/.test(b) && !/(compatible|webkit)/.test(b) + }; + + // Check to see if the W3C box model is being used + jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat"; +}; + +jQuery.each({ + parent: "a.parentNode", + parents: "jQuery.parents(a)", + next: "jQuery.nth(a,2,'nextSibling')", + prev: "jQuery.nth(a,2,'previousSibling')", + siblings: "jQuery.sibling(a.parentNode.firstChild,a)", + children: "jQuery.sibling(a.firstChild)" +}, function(i,n){ + jQuery.fn[ i ] = function(a) { + var ret = jQuery.map(this,n); + if ( a && typeof a == "string" ) + ret = jQuery.multiFilter(a,ret); + return this.pushStack( ret ); + }; +}); + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after" +}, function(i,n){ + jQuery.fn[ i ] = function(){ + var a = arguments; + return this.each(function(){ + for ( var j = 0, al = a.length; j < al; j++ ) + jQuery(a[j])[n]( this ); + }); + }; +}); + +jQuery.each( { + removeAttr: function( key ) { + jQuery.attr( this, key, "" ); + this.removeAttribute( key ); + }, + addClass: function(c){ + jQuery.className.add(this,c); + }, + removeClass: function(c){ + jQuery.className.remove(this,c); + }, + toggleClass: function( c ){ + jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this, c); + }, + remove: function(a){ + if ( !a || jQuery.filter( a, [this] ).r.length ) + this.parentNode.removeChild( this ); + }, + empty: function() { + while ( this.firstChild ) + this.removeChild( this.firstChild ); + } +}, function(i,n){ + jQuery.fn[ i ] = function() { + return this.each( n, arguments ); + }; +}); + +jQuery.each( [ "eq", "lt", "gt", "contains" ], function(i,n){ + jQuery.fn[ n ] = function(num,fn) { + return this.filter( ":" + n + "(" + num + ")", fn ); + }; +}); + +jQuery.each( [ "height", "width" ], function(i,n){ + jQuery.fn[ n ] = function(h) { + return h == undefined ? + ( this.length ? jQuery.css( this[0], n ) : null ) : + this.css( n, h.constructor == String ? h : h + "px" ); + }; +}); +jQuery.extend({ + expr: { + "": "m[2]=='*'||jQuery.nodeName(a,m[2])", + "#": "a.getAttribute('id')==m[2]", + ":": { + // Position Checks + lt: "im[3]-0", + nth: "m[3]-0==i", + eq: "m[3]-0==i", + first: "i==0", + last: "i==r.length-1", + even: "i%2==0", + odd: "i%2", + + // Child Checks + "nth-child": "jQuery.nth(a.parentNode.firstChild,m[3],'nextSibling',a)==a", + "first-child": "jQuery.nth(a.parentNode.firstChild,1,'nextSibling')==a", + "last-child": "jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a", + "only-child": "jQuery.sibling(a.parentNode.firstChild).length==1", + + // Parent Checks + parent: "a.firstChild", + empty: "!a.firstChild", + + // Text Check + contains: "jQuery.fn.text.apply([a]).indexOf(m[3])>=0", + + // Visibility + visible: 'a.type!="hidden"&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"', + hidden: 'a.type=="hidden"||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"', + + // Form attributes + enabled: "!a.disabled", + disabled: "a.disabled", + checked: "a.checked", + selected: "a.selected||jQuery.attr(a,'selected')", + + // Form elements + text: "a.type=='text'", + radio: "a.type=='radio'", + checkbox: "a.type=='checkbox'", + file: "a.type=='file'", + password: "a.type=='password'", + submit: "a.type=='submit'", + image: "a.type=='image'", + reset: "a.type=='reset'", + button: 'a.type=="button"||jQuery.nodeName(a,"button")', + input: "/input|select|textarea|button/i.test(a.nodeName)" + }, + ".": "jQuery.className.has(a,m[2])", + "@": { + "=": "z==m[4]", + "!=": "z!=m[4]", + "^=": "z&&!z.indexOf(m[4])", + "$=": "z&&z.substr(z.length - m[4].length,m[4].length)==m[4]", + "*=": "z&&z.indexOf(m[4])>=0", + "": "z", + _resort: function(m){ + return ["", m[1], m[3], m[2], m[5]]; + }, + _prefix: "z=a[m[3]]||jQuery.attr(a,m[3]);" + }, + "[": "jQuery.find(m[2],a).length" + }, + + // The regular expressions that power the parsing engine + parse: [ + // Match: [@value='test'], [@foo] + /^\[ *(@)([a-z0-9_-]*) *([!*$^=]*) *('?"?)(.*?)\4 *\]/i, + + // Match: [div], [div p] + /^(\[)\s*(.*?(\[.*?\])?[^[]*?)\s*\]/, + + // Match: :contains('foo') + /^(:)([a-z0-9_-]*)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/i, + + // Match: :even, :last-chlid + /^([:.#]*)([a-z0-9_*-]*)/i + ], + + token: [ + /^(\/?\.\.)/, "a.parentNode", + /^(>|\/)/, "jQuery.sibling(a.firstChild)", + /^(\+)/, "jQuery.nth(a,2,'nextSibling')", + /^(~)/, function(a){ + var s = jQuery.sibling(a.parentNode.firstChild); + return s.slice(0, jQuery.inArray(a,s)); + } + ], + + multiFilter: function( expr, elems, not ) { + var old, cur = []; + + while ( expr && expr != old ) { + old = expr; + var f = jQuery.filter( expr, elems, not ); + expr = f.t.replace(/^\s*,\s*/, "" ); + cur = not ? elems = f.r : jQuery.merge( cur, f.r ); + } + + return cur; + }, + find: function( t, context ) { + // Quickly handle non-string expressions + if ( typeof t != "string" ) + return [ t ]; + + // Make sure that the context is a DOM Element + if ( context && !context.nodeType ) + context = null; + + // Set the correct context (if none is provided) + context = context || document; + + // Handle the common XPath // expression + if ( !t.indexOf("//") ) { + context = context.documentElement; + t = t.substr(2,t.length); + + // And the / root expression + } else if ( !t.indexOf("/") ) { + context = context.documentElement; + t = t.substr(1,t.length); + if ( t.indexOf("/") >= 1 ) + t = t.substr(t.indexOf("/"),t.length); + } + + // Initialize the search + var ret = [context], done = [], last = null; + + // Continue while a selector expression exists, and while + // we're no longer looping upon ourselves + while ( t && last != t ) { + var r = []; + last = t; + + t = jQuery.trim(t).replace( /^\/\//i, "" ); + + var foundToken = false; + + // An attempt at speeding up child selectors that + // point to a specific element tag + var re = /^[\/>]\s*([a-z0-9*-]+)/i; + var m = re.exec(t); + + if ( m ) { + // Perform our own iteration and filter + jQuery.each( ret, function(){ + for ( var c = this.firstChild; c; c = c.nextSibling ) + if ( c.nodeType == 1 && ( jQuery.nodeName(c, m[1]) || m[1] == "*" ) ) + r.push( c ); + }); + + ret = r; + t = t.replace( re, "" ); + if ( t.indexOf(" ") == 0 ) continue; + foundToken = true; + } else { + // Look for pre-defined expression tokens + for ( var i = 0; i < jQuery.token.length; i += 2 ) { + // Attempt to match each, individual, token in + // the specified order + var re = jQuery.token[i]; + var m = re.exec(t); + + // If the token match was found + if ( m ) { + // Map it against the token's handler + r = ret = jQuery.map( ret, jQuery.isFunction( jQuery.token[i+1] ) ? + jQuery.token[i+1] : + function(a){ return eval(jQuery.token[i+1]); }); + + // And remove the token + t = jQuery.trim( t.replace( re, "" ) ); + foundToken = true; + break; + } + } + } + + // See if there's still an expression, and that we haven't already + // matched a token + if ( t && !foundToken ) { + // Handle multiple expressions + if ( !t.indexOf(",") ) { + // Clean the result set + if ( ret[0] == context ) ret.shift(); + + // Merge the result sets + jQuery.merge( done, ret ); + + // Reset the context + r = ret = [context]; + + // Touch up the selector string + t = " " + t.substr(1,t.length); + + } else { + // Optomize for the case nodeName#idName + var re2 = /^([a-z0-9_-]+)(#)([a-z0-9\\*_-]*)/i; + var m = re2.exec(t); + + // Re-organize the results, so that they're consistent + if ( m ) { + m = [ 0, m[2], m[3], m[1] ]; + + } else { + // Otherwise, do a traditional filter check for + // ID, class, and element selectors + re2 = /^([#.]?)([a-z0-9\\*_-]*)/i; + m = re2.exec(t); + } + + // Try to do a global search by ID, where we can + if ( m[1] == "#" && ret[ret.length-1].getElementById ) { + // Optimization for HTML document case + var oid = ret[ret.length-1].getElementById(m[2]); + + // Do a quick check for node name (where applicable) so + // that div#foo searches will be really fast + ret = r = oid && + (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : []; + + } else { + // Pre-compile a regular expression to handle class searches + if ( m[1] == "." ) + var rec = new RegExp("(^|\\s)" + m[2] + "(\\s|$)"); + + // We need to find all descendant elements, it is more + // efficient to use getAll() when we are already further down + // the tree - we try to recognize that here + jQuery.each( ret, function(){ + // Grab the tag name being searched for + var tag = m[1] != "" || m[0] == "" ? "*" : m[2]; + + // Handle IE7 being really dumb about s + if ( jQuery.nodeName(this, "object") && tag == "*" ) + tag = "param"; + + jQuery.merge( r, + m[1] != "" && ret.length != 1 ? + jQuery.getAll( this, [], m[1], m[2], rec ) : + this.getElementsByTagName( tag ) + ); + }); + + // It's faster to filter by class and be done with it + if ( m[1] == "." && ret.length == 1 ) + r = jQuery.grep( r, function(e) { + return rec.test(e.className); + }); + + // Same with ID filtering + if ( m[1] == "#" && ret.length == 1 ) { + // Remember, then wipe out, the result set + var tmp = r; + r = []; + + // Then try to find the element with the ID + jQuery.each( tmp, function(){ + if ( this.getAttribute("id") == m[2] ) { + r = [ this ]; + return false; + } + }); + } + + ret = r; + } + + t = t.replace( re2, "" ); + } + + } + + // If a selector string still exists + if ( t ) { + // Attempt to filter it + var val = jQuery.filter(t,r); + ret = r = val.r; + t = jQuery.trim(val.t); + } + } + + // Remove the root context + if ( ret && ret[0] == context ) ret.shift(); + + // And combine the results + jQuery.merge( done, ret ); + + return done; + }, + + filter: function(t,r,not) { + // Look for common filter expressions + while ( t && /^[a-z[({<*:.#]/i.test(t) ) { + + var p = jQuery.parse, m; + + jQuery.each( p, function(i,re){ + + // Look for, and replace, string-like sequences + // and finally build a regexp out of it + m = re.exec( t ); + + if ( m ) { + // Remove what we just matched + t = t.substring( m[0].length ); + + // Re-organize the first match + if ( jQuery.expr[ m[1] ]._resort ) + m = jQuery.expr[ m[1] ]._resort( m ); + + return false; + } + }); + + // :not() is a special case that can be optimized by + // keeping it out of the expression list + if ( m[1] == ":" && m[2] == "not" ) + r = jQuery.filter(m[3], r, true).r; + + // Handle classes as a special case (this will help to + // improve the speed, as the regexp will only be compiled once) + else if ( m[1] == "." ) { + + var re = new RegExp("(^|\\s)" + m[2] + "(\\s|$)"); + r = jQuery.grep( r, function(e){ + return re.test(e.className || ""); + }, not); + + // Otherwise, find the expression to execute + } else { + var f = jQuery.expr[m[1]]; + if ( typeof f != "string" ) + f = jQuery.expr[m[1]][m[2]]; + + // Build a custom macro to enclose it + eval("f = function(a,i){" + + ( jQuery.expr[ m[1] ]._prefix || "" ) + + "return " + f + "}"); + + // Execute it against the current filter + r = jQuery.grep( r, f, not ); + } + } + + // Return an array of filtered elements (r) + // and the modified expression string (t) + return { r: r, t: t }; + }, + + getAll: function( o, r, token, name, re ) { + for ( var s = o.firstChild; s; s = s.nextSibling ) + if ( s.nodeType == 1 ) { + var add = true; + + if ( token == "." ) + add = s.className && re.test(s.className); + else if ( token == "#" ) + add = s.getAttribute("id") == name; + + if ( add ) + r.push( s ); + + if ( token == "#" && r.length ) break; + + if ( s.firstChild ) + jQuery.getAll( s, r, token, name, re ); + } + + return r; + }, + parents: function( elem ){ + var matched = []; + var cur = elem.parentNode; + while ( cur && cur != document ) { + matched.push( cur ); + cur = cur.parentNode; + } + return matched; + }, + nth: function(cur,result,dir,elem){ + result = result || 1; + var num = 0; + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType == 1 ) num++; + if ( num == result || result == "even" && num % 2 == 0 && num > 1 && cur == elem || + result == "odd" && num % 2 == 1 && cur == elem ) return cur; + } + }, + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType == 1 && (!elem || n != elem) ) + r.push( n ); + } + + return r; + } +}); +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code orignated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function(element, type, handler, data) { + // For whatever reason, IE has trouble passing the window object + // around, causing it to be cloned in the process + if ( jQuery.browser.msie && element.setInterval != undefined ) + element = window; + + // if data is passed, bind to handler + if( data ) + handler.data = data; + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) + handler.guid = this.guid++; + + // Init the element's event structure + if (!element.events) + element.events = {}; + + // Get the current list of functions bound to this event + var handlers = element.events[type]; + + // If it hasn't been initialized yet + if (!handlers) { + // Init the event handler queue + handlers = element.events[type] = {}; + + // Remember an existing handler, if it's already there + if (element["on" + type]) + handlers[0] = element["on" + type]; + } + + // Add the function to the element's handler list + handlers[handler.guid] = handler; + + // And bind the global event handler to the element + element["on" + type] = this.handle; + + // Remember the function in a global list (for triggering) + if (!this.global[type]) + this.global[type] = []; + this.global[type].push( element ); + }, + + guid: 1, + global: {}, + + // Detach an event or set of events from an element + remove: function(element, type, handler) { + if (element.events) + if ( type && type.type ) + delete element.events[ type.type ][ type.handler.guid ]; + else if (type && element.events[type]) + if ( handler ) + delete element.events[type][handler.guid]; + else + for ( var i in element.events[type] ) + delete element.events[type][i]; + else + for ( var j in element.events ) + this.remove( element, j ); + }, + + trigger: function(type,data,element) { + // Clone the incoming data, if any + data = jQuery.makeArray(data || []); + + // Handle a global trigger + if ( !element ) + jQuery.each( this.global[type] || [], function(){ + jQuery.event.trigger( type, data, this ); + }); + + // Handle triggering a single element + else { + var handler = element["on" + type ], val, + fn = jQuery.isFunction( element[ type ] ); + + if ( handler ) { + // Pass along a fake event + data.unshift( this.fix({ type: type, target: element }) ); + + // Trigger the event + if ( (val = handler.apply( element, data )) !== false ) + this.triggered = true; + } + + if ( fn && val !== false ) + element[ type ](); + + this.triggered = false; + } + }, + + handle: function(event) { + // Handle the second event of a trigger and when + // an event is called after a page has unloaded + if ( typeof jQuery == "undefined" || jQuery.event.triggered ) return; + + // Empty object is for triggered events with no data + event = jQuery.event.fix( event || window.event || {} ); + + // returned undefined or false + var returnValue; + + var c = this.events[event.type]; + + var args = [].slice.call( arguments, 1 ); + args.unshift( event ); + + for ( var j in c ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + args[0].handler = c[j]; + args[0].data = c[j].data; + + if ( c[j].apply( this, args ) === false ) { + event.preventDefault(); + event.stopPropagation(); + returnValue = false; + } + } + + // Clean up added properties in IE to prevent memory leak + if (jQuery.browser.msie) event.target = event.preventDefault = event.stopPropagation = event.handler = event.data = null; + + return returnValue; + }, + + fix: function(event) { + // Fix target property, if necessary + if ( !event.target && event.srcElement ) + event.target = event.srcElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == undefined && event.clientX != undefined ) { + var e = document.documentElement, b = document.body; + event.pageX = event.clientX + (e.scrollLeft || b.scrollLeft); + event.pageY = event.clientY + (e.scrollTop || b.scrollTop); + } + + // check if target is a textnode (safari) + if (jQuery.browser.safari && event.target.nodeType == 3) { + // store a copy of the original event object + // and clone because target is read only + var originalEvent = event; + event = jQuery.extend({}, originalEvent); + + // get parentnode from textnode + event.target = originalEvent.target.parentNode; + + // add preventDefault and stopPropagation since + // they will not work on the clone + event.preventDefault = function() { + return originalEvent.preventDefault(); + }; + event.stopPropagation = function() { + return originalEvent.stopPropagation(); + }; + } + + // fix preventDefault and stopPropagation + if (!event.preventDefault) + event.preventDefault = function() { + this.returnValue = false; + }; + + if (!event.stopPropagation) + event.stopPropagation = function() { + this.cancelBubble = true; + }; + + return event; + } +}; + +jQuery.fn.extend({ + bind: function( type, data, fn ) { + return this.each(function(){ + jQuery.event.add( this, type, fn || data, data ); + }); + }, + one: function( type, data, fn ) { + return this.each(function(){ + jQuery.event.add( this, type, function(event) { + jQuery(this).unbind(event); + return (fn || data).apply( this, arguments); + }, data); + }); + }, + unbind: function( type, fn ) { + return this.each(function(){ + jQuery.event.remove( this, type, fn ); + }); + }, + trigger: function( type, data ) { + return this.each(function(){ + jQuery.event.trigger( type, data, this ); + }); + }, + toggle: function() { + // Save reference to arguments for access in closure + var a = arguments; + + return this.click(function(e) { + // Figure out which function to execute + this.lastToggle = this.lastToggle == 0 ? 1 : 0; + + // Make sure that clicks stop + e.preventDefault(); + + // and execute the function + return a[this.lastToggle].apply( this, [e] ) || false; + }); + }, + hover: function(f,g) { + + // A private function for handling mouse 'hovering' + function handleHover(e) { + // Check if mouse(over|out) are still within the same parent element + var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget; + + // Traverse up the tree + while ( p && p != this ) try { p = p.parentNode } catch(e) { p = this; }; + + // If we actually just moused on to a sub-element, ignore it + if ( p == this ) return false; + + // Execute the right function + return (e.type == "mouseover" ? f : g).apply(this, [e]); + } + + // Bind the function to the two event listeners + return this.mouseover(handleHover).mouseout(handleHover); + }, + ready: function(f) { + // If the DOM is already ready + if ( jQuery.isReady ) + // Execute the function immediately + f.apply( document, [jQuery] ); + + // Otherwise, remember the function for later + else { + // Add the function to the wait list + jQuery.readyList.push( function() { return f.apply(this, [jQuery]) } ); + } + + return this; + } +}); + +jQuery.extend({ + /* + * All the code that makes DOM Ready work nicely. + */ + isReady: false, + readyList: [], + + // Handle when the DOM is ready + ready: function() { + // Make sure that the DOM is not already loaded + if ( !jQuery.isReady ) { + // Remember that the DOM is ready + jQuery.isReady = true; + + // If there are functions bound, to execute + if ( jQuery.readyList ) { + // Execute all of them + jQuery.each( jQuery.readyList, function(){ + this.apply( document ); + }); + + // Reset the list of functions + jQuery.readyList = null; + } + // Remove event lisenter to avoid memory leak + if ( jQuery.browser.mozilla || jQuery.browser.opera ) + document.removeEventListener( "DOMContentLoaded", jQuery.ready, false ); + } + } +}); + +new function(){ + + jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," + + "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + + "submit,keydown,keypress,keyup,error").split(","), function(i,o){ + + // Handle event binding + jQuery.fn[o] = function(f){ + return f ? this.bind(o, f) : this.trigger(o); + }; + + }); + + // If Mozilla is used + if ( jQuery.browser.mozilla || jQuery.browser.opera ) + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", jQuery.ready, false ); + + // If IE is used, use the excellent hack by Matthias Miller + // http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited + else if ( jQuery.browser.msie ) { + + // Only works if you document.write() it + document.write("<\/script>"); + + // Use the defer script hack + var script = document.getElementById("__ie_init"); + + // script does not exist if jQuery is loaded dynamically + if ( script ) + script.onreadystatechange = function() { + if ( this.readyState != "complete" ) return; + this.parentNode.removeChild( this ); + jQuery.ready(); + }; + + // Clear from memory + script = null; + + // If Safari is used + } else if ( jQuery.browser.safari ) + // Continually check to see if the document.readyState is valid + jQuery.safariTimer = setInterval(function(){ + // loaded and complete are both valid states + if ( document.readyState == "loaded" || + document.readyState == "complete" ) { + + // If either one are found, remove the timer + clearInterval( jQuery.safariTimer ); + jQuery.safariTimer = null; + + // and execute any waiting functions + jQuery.ready(); + } + }, 10); + + // A fallback to window.onload, that will always work + jQuery.event.add( window, "load", jQuery.ready ); + +}; + +// Clean up after IE to avoid memory leaks +if (jQuery.browser.msie) + jQuery(window).one("unload", function() { + var global = jQuery.event.global; + for ( var type in global ) { + var els = global[type], i = els.length; + if ( i && type != 'unload' ) + do + jQuery.event.remove(els[i-1], type); + while (--i); + } + }); +jQuery.fn.extend({ + + show: function(speed,callback){ + var hidden = this.filter(":hidden"); + speed ? + hidden.animate({ + height: "show", width: "show", opacity: "show" + }, speed, callback) : + + hidden.each(function(){ + this.style.display = this.oldblock ? this.oldblock : ""; + if ( jQuery.css(this,"display") == "none" ) + this.style.display = "block"; + }); + return this; + }, + + hide: function(speed,callback){ + var visible = this.filter(":visible"); + speed ? + visible.animate({ + height: "hide", width: "hide", opacity: "hide" + }, speed, callback) : + + visible.each(function(){ + this.oldblock = this.oldblock || jQuery.css(this,"display"); + if ( this.oldblock == "none" ) + this.oldblock = "block"; + this.style.display = "none"; + }); + return this; + }, + + // Save the old toggle function + _toggle: jQuery.fn.toggle, + toggle: function( fn, fn2 ){ + var args = arguments; + return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ? + this._toggle( fn, fn2 ) : + this.each(function(){ + jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ] + .apply( jQuery(this), args ); + }); + }, + slideDown: function(speed,callback){ + return this.animate({height: "show"}, speed, callback); + }, + slideUp: function(speed,callback){ + return this.animate({height: "hide"}, speed, callback); + }, + slideToggle: function(speed, callback){ + return this.each(function(){ + var state = jQuery(this).is(":hidden") ? "show" : "hide"; + jQuery(this).animate({height: state}, speed, callback); + }); + }, + fadeIn: function(speed, callback){ + return this.animate({opacity: "show"}, speed, callback); + }, + fadeOut: function(speed, callback){ + return this.animate({opacity: "hide"}, speed, callback); + }, + fadeTo: function(speed,to,callback){ + return this.animate({opacity: to}, speed, callback); + }, + animate: function( prop, speed, easing, callback ) { + return this.queue(function(){ + + this.curAnim = jQuery.extend({}, prop); + var opt = jQuery.speed(speed, easing, callback); + + for ( var p in prop ) { + var e = new jQuery.fx( this, opt, p ); + if ( prop[p].constructor == Number ) + e.custom( e.cur(), prop[p] ); + else + e[ prop[p] ]( prop ); + } + + }); + }, + queue: function(type,fn){ + if ( !fn ) { + fn = type; + type = "fx"; + } + + return this.each(function(){ + if ( !this.queue ) + this.queue = {}; + + if ( !this.queue[type] ) + this.queue[type] = []; + + this.queue[type].push( fn ); + + if ( this.queue[type].length == 1 ) + fn.apply(this); + }); + } + +}); + +jQuery.extend({ + + speed: function(speed, easing, fn) { + var opt = speed && speed.constructor == Object ? speed : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && easing.constructor != Function && easing + }; + + opt.duration = (opt.duration && opt.duration.constructor == Number ? + opt.duration : + { slow: 600, fast: 200 }[opt.duration]) || 400; + + // Queueing + opt.old = opt.complete; + opt.complete = function(){ + jQuery.dequeue(this, "fx"); + if ( jQuery.isFunction( opt.old ) ) + opt.old.apply( this ); + }; + + return opt; + }, + + easing: {}, + + queue: {}, + + dequeue: function(elem,type){ + type = type || "fx"; + + if ( elem.queue && elem.queue[type] ) { + // Remove self + elem.queue[type].shift(); + + // Get next function + var f = elem.queue[type][0]; + + if ( f ) f.apply( elem ); + } + }, + + /* + * I originally wrote fx() as a clone of moo.fx and in the process + * of making it small in size the code became illegible to sane + * people. You've been warned. + */ + + fx: function( elem, options, prop ){ + + var z = this; + + // The styles + var y = elem.style; + + // Store display property + var oldDisplay = jQuery.css(elem, "display"); + + // Set display property to block for animation + y.display = "block"; + + // Make sure that nothing sneaks out + y.overflow = "hidden"; + + // Simple function for setting a style value + z.a = function(){ + if ( options.step ) + options.step.apply( elem, [ z.now ] ); + + if ( prop == "opacity" ) + jQuery.attr(y, "opacity", z.now); // Let attr handle opacity + else if ( parseInt(z.now) ) // My hate for IE will never die + y[prop] = parseInt(z.now) + "px"; + }; + + // Figure out the maximum number to run to + z.max = function(){ + return parseFloat( jQuery.css(elem,prop) ); + }; + + // Get the current size + z.cur = function(){ + var r = parseFloat( jQuery.curCSS(elem, prop) ); + return r && r > -10000 ? r : z.max(); + }; + + // Start an animation from one number to another + z.custom = function(from,to){ + z.startTime = (new Date()).getTime(); + z.now = from; + z.a(); + + z.timer = setInterval(function(){ + z.step(from, to); + }, 13); + }; + + // Simple 'show' function + z.show = function(){ + if ( !elem.orig ) elem.orig = {}; + + // Remember where we started, so that we can go back to it later + elem.orig[prop] = this.cur(); + + options.show = true; + + // Begin the animation + z.custom(0, elem.orig[prop]); + + // Stupid IE, look what you made me do + if ( prop != "opacity" ) + y[prop] = "1px"; + }; + + // Simple 'hide' function + z.hide = function(){ + if ( !elem.orig ) elem.orig = {}; + + // Remember where we started, so that we can go back to it later + elem.orig[prop] = this.cur(); + + options.hide = true; + + // Begin the animation + z.custom(elem.orig[prop], 0); + }; + + //Simple 'toggle' function + z.toggle = function() { + if ( !elem.orig ) elem.orig = {}; + + // Remember where we started, so that we can go back to it later + elem.orig[prop] = this.cur(); + + if(oldDisplay == "none") { + options.show = true; + + // Stupid IE, look what you made me do + if ( prop != "opacity" ) + y[prop] = "1px"; + + // Begin the animation + z.custom(0, elem.orig[prop]); + } else { + options.hide = true; + + // Begin the animation + z.custom(elem.orig[prop], 0); + } + }; + + // Each step of an animation + z.step = function(firstNum, lastNum){ + var t = (new Date()).getTime(); + + if (t > options.duration + z.startTime) { + // Stop the timer + clearInterval(z.timer); + z.timer = null; + + z.now = lastNum; + z.a(); + + if (elem.curAnim) elem.curAnim[ prop ] = true; + + var done = true; + for ( var i in elem.curAnim ) + if ( elem.curAnim[i] !== true ) + done = false; + + if ( done ) { + // Reset the overflow + y.overflow = ""; + + // Reset the display + y.display = oldDisplay; + if (jQuery.css(elem, "display") == "none") + y.display = "block"; + + // Hide the element if the "hide" operation was done + if ( options.hide ) + y.display = "none"; + + // Reset the properties, if the item has been hidden or shown + if ( options.hide || options.show ) + for ( var p in elem.curAnim ) + if (p == "opacity") + jQuery.attr(y, p, elem.orig[p]); + else + y[p] = ""; + } + + // If a callback was provided, execute it + if ( done && jQuery.isFunction( options.complete ) ) + // Execute the complete function + options.complete.apply( elem ); + } else { + var n = t - this.startTime; + // Figure out where in the animation we are and set the number + var p = n / options.duration; + + // If the easing function exists, then use it + z.now = options.easing && jQuery.easing[options.easing] ? + jQuery.easing[options.easing](p, n, firstNum, (lastNum-firstNum), options.duration) : + // else use default linear easing + ((-Math.cos(p*Math.PI)/2) + 0.5) * (lastNum-firstNum) + firstNum; + + // Perform the next step of the animation + z.a(); + } + }; + + } +}); +jQuery.fn.extend({ + loadIfModified: function( url, params, callback ) { + this.load( url, params, callback, 1 ); + }, + load: function( url, params, callback, ifModified ) { + if ( jQuery.isFunction( url ) ) + return this.bind("load", url); + + callback = callback || function(){}; + + // Default to a GET request + var type = "GET"; + + // If the second parameter was provided + if ( params ) + // If it's a function + if ( jQuery.isFunction( params ) ) { + // We assume that it's the callback + callback = params; + params = null; + + // Otherwise, build a param string + } else { + params = jQuery.param( params ); + type = "POST"; + } + + var self = this; + + // Request the remote document + jQuery.ajax({ + url: url, + type: type, + data: params, + ifModified: ifModified, + complete: function(res, status){ + if ( status == "success" || !ifModified && status == "notmodified" ) + // Inject the HTML into all the matched elements + self.attr("innerHTML", res.responseText) + // Execute all the scripts inside of the newly-injected HTML + .evalScripts() + // Execute callback + .each( callback, [res.responseText, status, res] ); + else + callback.apply( self, [res.responseText, status, res] ); + } + }); + return this; + }, + serialize: function() { + return jQuery.param( this ); + }, + evalScripts: function() { + return this.find("script").each(function(){ + if ( this.src ) + jQuery.getScript( this.src ); + else + jQuery.globalEval( this.text || this.textContent || this.innerHTML || "" ); + }).end(); + } + +}); + +// If IE is used, create a wrapper for the XMLHttpRequest object +if ( !window.XMLHttpRequest ) + XMLHttpRequest = function(){ + return new ActiveXObject("Microsoft.XMLHTTP"); + }; + +// Attach a bunch of functions for handling common AJAX events + +jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){ + jQuery.fn[o] = function(f){ + return this.bind(o, f); + }; +}); + +jQuery.extend({ + get: function( url, data, callback, type, ifModified ) { + // shift arguments if data argument was ommited + if ( jQuery.isFunction( data ) ) { + callback = data; + data = null; + } + + return jQuery.ajax({ + url: url, + data: data, + success: callback, + dataType: type, + ifModified: ifModified + }); + }, + getIfModified: function( url, data, callback, type ) { + return jQuery.get(url, data, callback, type, 1); + }, + getScript: function( url, callback ) { + return jQuery.get(url, null, callback, "script"); + }, + getJSON: function( url, data, callback ) { + return jQuery.get(url, data, callback, "json"); + }, + post: function( url, data, callback, type ) { + if ( jQuery.isFunction( data ) ) { + callback = data; + data = {}; + } + + return jQuery.ajax({ + type: "POST", + url: url, + data: data, + success: callback, + dataType: type + }); + }, + + // timeout (ms) + //timeout: 0, + ajaxTimeout: function( timeout ) { + jQuery.ajaxSettings.timeout = timeout; + }, + ajaxSetup: function( settings ) { + jQuery.extend( jQuery.ajaxSettings, settings ); + }, + + ajaxSettings: { + global: true, + type: "GET", + timeout: 0, + contentType: "application/x-www-form-urlencoded", + processData: true, + async: true, + data: null + }, + + // Last-Modified header cache for next request + lastModified: {}, + ajax: function( s ) { + // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout + s = jQuery.extend({}, jQuery.ajaxSettings, s); + + // if data available + if ( s.data ) { + // convert data if not already a string + if (s.processData && typeof s.data != "string") + s.data = jQuery.param(s.data); + // append data to url for get requests + if( s.type.toLowerCase() == "get" ) + // "?" + data or "&" + data (in case there are already params) + s.url += ((s.url.indexOf("?") > -1) ? "&" : "?") + s.data; + } + + // Watch for a new set of requests + if ( s.global && ! jQuery.active++ ) + jQuery.event.trigger( "ajaxStart" ); + + var requestDone = false; + + // Create the request object + var xml = new XMLHttpRequest(); + + // Open the socket + xml.open(s.type, s.url, s.async); + + // Set the correct header, if data is being sent + if ( s.data ) + xml.setRequestHeader("Content-Type", s.contentType); + + // Set the If-Modified-Since header, if ifModified mode. + if ( s.ifModified ) + xml.setRequestHeader("If-Modified-Since", + jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" ); + + // Set header so the called script knows that it's an XMLHttpRequest + xml.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + + // Make sure the browser sends the right content length + if ( xml.overrideMimeType ) + xml.setRequestHeader("Connection", "close"); + + // Allow custom headers/mimetypes + if( s.beforeSend ) + s.beforeSend(xml); + + if ( s.global ) + jQuery.event.trigger("ajaxSend", [xml, s]); + + // Wait for a response to come back + var onreadystatechange = function(isTimeout){ + // The transfer is complete and the data is available, or the request timed out + if ( xml && (xml.readyState == 4 || isTimeout == "timeout") ) { + requestDone = true; + var status; + try { + status = jQuery.httpSuccess( xml ) && isTimeout != "timeout" ? + s.ifModified && jQuery.httpNotModified( xml, s.url ) ? "notmodified" : "success" : "error"; + // Make sure that the request was successful or notmodified + if ( status != "error" ) { + // Cache Last-Modified header, if ifModified mode. + var modRes; + try { + modRes = xml.getResponseHeader("Last-Modified"); + } catch(e) {} // swallow exception thrown by FF if header is not available + + if ( s.ifModified && modRes ) + jQuery.lastModified[s.url] = modRes; + + // process the data (runs the xml through httpData regardless of callback) + var data = jQuery.httpData( xml, s.dataType ); + + // If a local callback was specified, fire it and pass it the data + if ( s.success ) + s.success( data, status ); + + // Fire the global callback + if( s.global ) + jQuery.event.trigger( "ajaxSuccess", [xml, s] ); + } else + jQuery.handleError(s, xml, status); + } catch(e) { + status = "error"; + jQuery.handleError(s, xml, status, e); + } + + // The request was completed + if( s.global ) + jQuery.event.trigger( "ajaxComplete", [xml, s] ); + + // Handle the global AJAX counter + if ( s.global && ! --jQuery.active ) + jQuery.event.trigger( "ajaxStop" ); + + // Process result + if ( s.complete ) + s.complete(xml, status); + + // Stop memory leaks + xml.onreadystatechange = function(){}; + xml = null; + } + }; + xml.onreadystatechange = onreadystatechange; + + // Timeout checker + if ( s.timeout > 0 ) + setTimeout(function(){ + // Check to see if the request is still happening + if ( xml ) { + // Cancel the request + xml.abort(); + + if( !requestDone ) + onreadystatechange( "timeout" ); + } + }, s.timeout); + + // save non-leaking reference + var xml2 = xml; + + // Send the data + try { + xml2.send(s.data); + } catch(e) { + jQuery.handleError(s, xml, null, e); + } + + // firefox 1.5 doesn't fire statechange for sync requests + if ( !s.async ) + onreadystatechange(); + + // return XMLHttpRequest to allow aborting the request etc. + return xml2; + }, + + handleError: function( s, xml, status, e ) { + // If a local callback was specified, fire it + if ( s.error ) s.error( xml, status, e ); + + // Fire the global callback + if ( s.global ) + jQuery.event.trigger( "ajaxError", [xml, s, e] ); + }, + + // Counter for holding the number of active queries + active: 0, + + // Determines if an XMLHttpRequest was successful or not + httpSuccess: function( r ) { + try { + return !r.status && location.protocol == "file:" || + ( r.status >= 200 && r.status < 300 ) || r.status == 304 || + jQuery.browser.safari && r.status == undefined; + } catch(e){} + return false; + }, + + // Determines if an XMLHttpRequest returns NotModified + httpNotModified: function( xml, url ) { + try { + var xmlRes = xml.getResponseHeader("Last-Modified"); + + // Firefox always returns 200. check Last-Modified date + return xml.status == 304 || xmlRes == jQuery.lastModified[url] || + jQuery.browser.safari && xml.status == undefined; + } catch(e){} + return false; + }, + + /* Get the data out of an XMLHttpRequest. + * Return parsed XML if content-type header is "xml" and type is "xml" or omitted, + * otherwise return plain text. + * (String) data - The type of data that you're expecting back, + * (e.g. "xml", "html", "script") + */ + httpData: function( r, type ) { + var ct = r.getResponseHeader("content-type"); + var data = !type && ct && ct.indexOf("xml") >= 0; + data = type == "xml" || data ? r.responseXML : r.responseText; + + // If the type is "script", eval it in global context + if ( type == "script" ) + jQuery.globalEval( data ); + + // Get the JavaScript object, if JSON is used. + if ( type == "json" ) + eval( "data = " + data ); + + // evaluate scripts within html + if ( type == "html" ) + jQuery("
").html(data).evalScripts(); + + return data; + }, + + // Serialize an array of form elements or a set of + // key/values into a query string + param: function( a ) { + var s = []; + + // If an array was passed in, assume that it is an array + // of form elements + if ( a.constructor == Array || a.jquery ) + // Serialize the form elements + jQuery.each( a, function(){ + s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) ); + }); + + // Otherwise, assume that it's an object of key/value pairs + else + // Serialize the key/values + for ( var j in a ) + // If the value is an array then the key names need to be repeated + if ( a[j] && a[j].constructor == Array ) + jQuery.each( a[j], function(){ + s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) ); + }); + else + s.push( encodeURIComponent(j) + "=" + encodeURIComponent( a[j] ) ); + + // Return the resulting serialization + return s.join("&"); + }, + + // evalulates a script in global context + // not reliable for safari + globalEval: function( data ) { + if ( window.execScript ) + window.execScript( data ); + else if ( jQuery.browser.safari ) + // safari doesn't provide a synchronous global eval + window.setTimeout( data, 0 ); + else + eval.call( window, data ); + } + +}); +} diff --git a/www/extras/yui-ext/adapter/prototype/effects.js b/www/extras/yui-ext/adapter/prototype/effects.js new file mode 100644 index 000000000..f6ccff2fd --- /dev/null +++ b/www/extras/yui-ext/adapter/prototype/effects.js @@ -0,0 +1,1098 @@ +/* + * Ext JS Library 1.0 Beta 1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +// script.aculo.us effects.js v1.7.0, Fri Jan 19 19:16:36 CET 2007 + +// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// Contributors: +// Justin Palmer (http://encytemedia.com/) +// Mark Pilgrim (http://diveintomark.org/) +// Martin Bialasinki +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +// converts rgb() and #xxx to #xxxxxx format, +// returns self (or first argument) if not convertable +String.prototype.parseColor = function() { + var color = '#'; + if(this.slice(0,4) == 'rgb(') { + var cols = this.slice(4,this.length-1).split(','); + var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); + } else { + if(this.slice(0,1) == '#') { + if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); + if(this.length==7) color = this.toLowerCase(); + } + } + return(color.length==7 ? color : (arguments[0] || this)); +} + +/*--------------------------------------------------------------------------*/ + +Element.collectTextNodes = function(element) { + return $A($(element).childNodes).collect( function(node) { + return (node.nodeType==3 ? node.nodeValue : + (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); + }).flatten().join(''); +} + +Element.collectTextNodesIgnoreClass = function(element, className) { + return $A($(element).childNodes).collect( function(node) { + return (node.nodeType==3 ? node.nodeValue : + ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? + Element.collectTextNodesIgnoreClass(node, className) : '')); + }).flatten().join(''); +} + +Element.setContentZoom = function(element, percent) { + element = $(element); + element.setStyle({fontSize: (percent/100) + 'em'}); + if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); + return element; +} + +Element.getOpacity = function(element){ + return $(element).getStyle('opacity'); +} + +Element.setOpacity = function(element, value){ + return $(element).setStyle({opacity:value}); +} + +Element.getInlineOpacity = function(element){ + return $(element).style.opacity || ''; +} + +Element.forceRerendering = function(element) { + try { + element = $(element); + var n = document.createTextNode(' '); + element.appendChild(n); + element.removeChild(n); + } catch(e) { } +}; + +/*--------------------------------------------------------------------------*/ + +Array.prototype.call = function() { + var args = arguments; + this.each(function(f){ f.apply(this, args) }); +} + +/*--------------------------------------------------------------------------*/ + +var Effect = { + _elementDoesNotExistError: { + name: 'ElementDoesNotExistError', + message: 'The specified DOM element does not exist, but is required for this effect to operate' + }, + tagifyText: function(element) { + if(typeof Builder == 'undefined') + throw("Effect.tagifyText requires including script.aculo.us' builder.js library"); + + var tagifyStyle = 'position:relative'; + if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1'; + + element = $(element); + $A(element.childNodes).each( function(child) { + if(child.nodeType==3) { + child.nodeValue.toArray().each( function(character) { + element.insertBefore( + Builder.node('span',{style: tagifyStyle}, + character == ' ' ? String.fromCharCode(160) : character), + child); + }); + Element.remove(child); + } + }); + }, + multiple: function(element, effect) { + var elements; + if(((typeof element == 'object') || + (typeof element == 'function')) && + (element.length)) + elements = element; + else + elements = $(element).childNodes; + + var options = Object.extend({ + speed: 0.1, + delay: 0.0 + }, arguments[2] || {}); + var masterDelay = options.delay; + + $A(elements).each( function(element, index) { + new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); + }); + }, + PAIRS: { + 'slide': ['SlideDown','SlideUp'], + 'blind': ['BlindDown','BlindUp'], + 'appear': ['Appear','Fade'] + }, + toggle: function(element, effect) { + element = $(element); + effect = (effect || 'appear').toLowerCase(); + var options = Object.extend({ + queue: { position:'end', scope:(element.id || 'global'), limit: 1 } + }, arguments[2] || {}); + Effect[element.visible() ? + Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); + } +}; + +var Effect2 = Effect; // deprecated + +/* ------------- transitions ------------- */ + +Effect.Transitions = { + linear: Prototype.K, + sinoidal: function(pos) { + return (-Math.cos(pos*Math.PI)/2) + 0.5; + }, + reverse: function(pos) { + return 1-pos; + }, + flicker: function(pos) { + return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; + }, + wobble: function(pos) { + return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; + }, + pulse: function(pos, pulses) { + pulses = pulses || 5; + return ( + Math.round((pos % (1/pulses)) * pulses) == 0 ? + ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : + 1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) + ); + }, + none: function(pos) { + return 0; + }, + full: function(pos) { + return 1; + } +}; + +/* ------------- core effects ------------- */ + +Effect.ScopedQueue = Class.create(); +Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), { + initialize: function() { + this.effects = []; + this.interval = null; + }, + _each: function(iterator) { + this.effects._each(iterator); + }, + add: function(effect) { + var timestamp = new Date().getTime(); + + var position = (typeof effect.options.queue == 'string') ? + effect.options.queue : effect.options.queue.position; + + switch(position) { + case 'front': + // move unstarted effects after this effect + this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { + e.startOn += effect.finishOn; + e.finishOn += effect.finishOn; + }); + break; + case 'with-last': + timestamp = this.effects.pluck('startOn').max() || timestamp; + break; + case 'end': + // start effect after last queued effect has finished + timestamp = this.effects.pluck('finishOn').max() || timestamp; + break; + } + + effect.startOn += timestamp; + effect.finishOn += timestamp; + + if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit)) + this.effects.push(effect); + + if(!this.interval) + this.interval = setInterval(this.loop.bind(this), 15); + }, + remove: function(effect) { + this.effects = this.effects.reject(function(e) { return e==effect }); + if(this.effects.length == 0) { + clearInterval(this.interval); + this.interval = null; + } + }, + loop: function() { + var timePos = new Date().getTime(); + for(var i=0, len=this.effects.length;i= this.startOn) { + if(timePos >= this.finishOn) { + this.render(1.0); + this.cancel(); + this.event('beforeFinish'); + if(this.finish) this.finish(); + this.event('afterFinish'); + return; + } + var pos = (timePos - this.startOn) / (this.finishOn - this.startOn); + var frame = Math.round(pos * this.options.fps * this.options.duration); + if(frame > this.currentFrame) { + this.render(pos); + this.currentFrame = frame; + } + } + }, + render: function(pos) { + if(this.state == 'idle') { + this.state = 'running'; + this.event('beforeSetup'); + if(this.setup) this.setup(); + this.event('afterSetup'); + } + if(this.state == 'running') { + if(this.options.transition) pos = this.options.transition(pos); + pos *= (this.options.to-this.options.from); + pos += this.options.from; + this.position = pos; + this.event('beforeUpdate'); + if(this.update) this.update(pos); + this.event('afterUpdate'); + } + }, + cancel: function() { + if(!this.options.sync) + Effect.Queues.get(typeof this.options.queue == 'string' ? + 'global' : this.options.queue.scope).remove(this); + this.state = 'finished'; + }, + event: function(eventName) { + if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); + if(this.options[eventName]) this.options[eventName](this); + }, + inspect: function() { + var data = $H(); + for(property in this) + if(typeof this[property] != 'function') data[property] = this[property]; + return '#'; + } +} + +Effect.Parallel = Class.create(); +Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), { + initialize: function(effects) { + this.effects = effects || []; + this.start(arguments[1]); + }, + update: function(position) { + this.effects.invoke('render', position); + }, + finish: function(position) { + this.effects.each( function(effect) { + effect.render(1.0); + effect.cancel(); + effect.event('beforeFinish'); + if(effect.finish) effect.finish(position); + effect.event('afterFinish'); + }); + } +}); + +Effect.Event = Class.create(); +Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), { + initialize: function() { + var options = Object.extend({ + duration: 0 + }, arguments[0] || {}); + this.start(options); + }, + update: Prototype.emptyFunction +}); + +Effect.Opacity = Class.create(); +Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), { + initialize: function(element) { + this.element = $(element); + if(!this.element) throw(Effect._elementDoesNotExistError); + // make this work on IE on elements without 'layout' + if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout)) + this.element.setStyle({zoom: 1}); + var options = Object.extend({ + from: this.element.getOpacity() || 0.0, + to: 1.0 + }, arguments[1] || {}); + this.start(options); + }, + update: function(position) { + this.element.setOpacity(position); + } +}); + +Effect.Move = Class.create(); +Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), { + initialize: function(element) { + this.element = $(element); + if(!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + x: 0, + y: 0, + mode: 'relative' + }, arguments[1] || {}); + this.start(options); + }, + setup: function() { + // Bug in Opera: Opera returns the "real" position of a static element or + // relative element that does not have top/left explicitly set. + // ==> Always set top and left for position relative elements in your stylesheets + // (to 0 if you do not need them) + this.element.makePositioned(); + this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); + this.originalTop = parseFloat(this.element.getStyle('top') || '0'); + if(this.options.mode == 'absolute') { + // absolute movement, so we need to calc deltaX and deltaY + this.options.x = this.options.x - this.originalLeft; + this.options.y = this.options.y - this.originalTop; + } + }, + update: function(position) { + this.element.setStyle({ + left: Math.round(this.options.x * position + this.originalLeft) + 'px', + top: Math.round(this.options.y * position + this.originalTop) + 'px' + }); + } +}); + +// for backwards compatibility +Effect.MoveBy = function(element, toTop, toLeft) { + return new Effect.Move(element, + Object.extend({ x: toLeft, y: toTop }, arguments[3] || {})); +}; + +Effect.Scale = Class.create(); +Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), { + initialize: function(element, percent) { + this.element = $(element); + if(!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + scaleX: true, + scaleY: true, + scaleContent: true, + scaleFromCenter: false, + scaleMode: 'box', // 'box' or 'contents' or {} with provided values + scaleFrom: 100.0, + scaleTo: percent + }, arguments[2] || {}); + this.start(options); + }, + setup: function() { + this.restoreAfterFinish = this.options.restoreAfterFinish || false; + this.elementPositioning = this.element.getStyle('position'); + + this.originalStyle = {}; + ['top','left','width','height','fontSize'].each( function(k) { + this.originalStyle[k] = this.element.style[k]; + }.bind(this)); + + this.originalTop = this.element.offsetTop; + this.originalLeft = this.element.offsetLeft; + + var fontSize = this.element.getStyle('font-size') || '100%'; + ['em','px','%','pt'].each( function(fontSizeType) { + if(fontSize.indexOf(fontSizeType)>0) { + this.fontSize = parseFloat(fontSize); + this.fontSizeType = fontSizeType; + } + }.bind(this)); + + this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; + + this.dims = null; + if(this.options.scaleMode=='box') + this.dims = [this.element.offsetHeight, this.element.offsetWidth]; + if(/^content/.test(this.options.scaleMode)) + this.dims = [this.element.scrollHeight, this.element.scrollWidth]; + if(!this.dims) + this.dims = [this.options.scaleMode.originalHeight, + this.options.scaleMode.originalWidth]; + }, + update: function(position) { + var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); + if(this.options.scaleContent && this.fontSize) + this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType }); + this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); + }, + finish: function(position) { + if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle); + }, + setDimensions: function(height, width) { + var d = {}; + if(this.options.scaleX) d.width = Math.round(width) + 'px'; + if(this.options.scaleY) d.height = Math.round(height) + 'px'; + if(this.options.scaleFromCenter) { + var topd = (height - this.dims[0])/2; + var leftd = (width - this.dims[1])/2; + if(this.elementPositioning == 'absolute') { + if(this.options.scaleY) d.top = this.originalTop-topd + 'px'; + if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; + } else { + if(this.options.scaleY) d.top = -topd + 'px'; + if(this.options.scaleX) d.left = -leftd + 'px'; + } + } + this.element.setStyle(d); + } +}); + +Effect.Highlight = Class.create(); +Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), { + initialize: function(element) { + this.element = $(element); + if(!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {}); + this.start(options); + }, + setup: function() { + // Prevent executing on elements not in the layout flow + if(this.element.getStyle('display')=='none') { this.cancel(); return; } + // Disable background image during the effect + this.oldStyle = {}; + if (!this.options.keepBackgroundImage) { + this.oldStyle.backgroundImage = this.element.getStyle('background-image'); + this.element.setStyle({backgroundImage: 'none'}); + } + if(!this.options.endcolor) + this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); + if(!this.options.restorecolor) + this.options.restorecolor = this.element.getStyle('background-color'); + // init color calculations + this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); + this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); + }, + update: function(position) { + this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){ + return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) }); + }, + finish: function() { + this.element.setStyle(Object.extend(this.oldStyle, { + backgroundColor: this.options.restorecolor + })); + } +}); + +Effect.ScrollTo = Class.create(); +Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), { + initialize: function(element) { + this.element = $(element); + this.start(arguments[1] || {}); + }, + setup: function() { + Position.prepare(); + var offsets = Position.cumulativeOffset(this.element); + if(this.options.offset) offsets[1] += this.options.offset; + var max = window.innerHeight ? + window.height - window.innerHeight : + document.body.scrollHeight - + (document.documentElement.clientHeight ? + document.documentElement.clientHeight : document.body.clientHeight); + this.scrollStart = Position.deltaY; + this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart; + }, + update: function(position) { + Position.prepare(); + window.scrollTo(Position.deltaX, + this.scrollStart + (position*this.delta)); + } +}); + +/* ------------- combination effects ------------- */ + +Effect.Fade = function(element) { + element = $(element); + var oldOpacity = element.getInlineOpacity(); + var options = Object.extend({ + from: element.getOpacity() || 1.0, + to: 0.0, + afterFinishInternal: function(effect) { + if(effect.options.to!=0) return; + effect.element.hide().setStyle({opacity: oldOpacity}); + }}, arguments[1] || {}); + return new Effect.Opacity(element,options); +} + +Effect.Appear = function(element) { + element = $(element); + var options = Object.extend({ + from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0), + to: 1.0, + // force Safari to render floated elements properly + afterFinishInternal: function(effect) { + effect.element.forceRerendering(); + }, + beforeSetup: function(effect) { + effect.element.setOpacity(effect.options.from).show(); + }}, arguments[1] || {}); + return new Effect.Opacity(element,options); +} + +Effect.Puff = function(element) { + element = $(element); + var oldStyle = { + opacity: element.getInlineOpacity(), + position: element.getStyle('position'), + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height + }; + return new Effect.Parallel( + [ new Effect.Scale(element, 200, + { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], + Object.extend({ duration: 1.0, + beforeSetupInternal: function(effect) { + Position.absolutize(effect.effects[0].element) + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().setStyle(oldStyle); } + }, arguments[1] || {}) + ); +} + +Effect.BlindUp = function(element) { + element = $(element); + element.makeClipping(); + return new Effect.Scale(element, 0, + Object.extend({ scaleContent: false, + scaleX: false, + restoreAfterFinish: true, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping(); + } + }, arguments[1] || {}) + ); +} + +Effect.BlindDown = function(element) { + element = $(element); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, 100, Object.extend({ + scaleContent: false, + scaleX: false, + scaleFrom: 0, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makeClipping().setStyle({height: '0px'}).show(); + }, + afterFinishInternal: function(effect) { + effect.element.undoClipping(); + } + }, arguments[1] || {})); +} + +Effect.SwitchOff = function(element) { + element = $(element); + var oldOpacity = element.getInlineOpacity(); + return new Effect.Appear(element, Object.extend({ + duration: 0.4, + from: 0, + transition: Effect.Transitions.flicker, + afterFinishInternal: function(effect) { + new Effect.Scale(effect.element, 1, { + duration: 0.3, scaleFromCenter: true, + scaleX: false, scaleContent: false, restoreAfterFinish: true, + beforeSetup: function(effect) { + effect.element.makePositioned().makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity}); + } + }) + } + }, arguments[1] || {})); +} + +Effect.DropOut = function(element) { + element = $(element); + var oldStyle = { + top: element.getStyle('top'), + left: element.getStyle('left'), + opacity: element.getInlineOpacity() }; + return new Effect.Parallel( + [ new Effect.Move(element, {x: 0, y: 100, sync: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 }) ], + Object.extend( + { duration: 0.5, + beforeSetup: function(effect) { + effect.effects[0].element.makePositioned(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); + } + }, arguments[1] || {})); +} + +Effect.Shake = function(element) { + element = $(element); + var oldStyle = { + top: element.getStyle('top'), + left: element.getStyle('left') }; + return new Effect.Move(element, + { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { + effect.element.undoPositioned().setStyle(oldStyle); + }}) }}) }}) }}) }}) }}); +} + +Effect.SlideDown = function(element) { + element = $(element).cleanWhitespace(); + // SlideDown need to have the content of the element wrapped in a container element with fixed height! + var oldInnerBottom = element.down().getStyle('bottom'); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, 100, Object.extend({ + scaleContent: false, + scaleX: false, + scaleFrom: window.opera ? 0 : 1, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makePositioned(); + effect.element.down().makePositioned(); + if(window.opera) effect.element.setStyle({top: ''}); + effect.element.makeClipping().setStyle({height: '0px'}).show(); + }, + afterUpdateInternal: function(effect) { + effect.element.down().setStyle({bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); + }, + afterFinishInternal: function(effect) { + effect.element.undoClipping().undoPositioned(); + effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); } + }, arguments[1] || {}) + ); +} + +Effect.SlideUp = function(element) { + element = $(element).cleanWhitespace(); + var oldInnerBottom = element.down().getStyle('bottom'); + return new Effect.Scale(element, window.opera ? 0 : 1, + Object.extend({ scaleContent: false, + scaleX: false, + scaleMode: 'box', + scaleFrom: 100, + restoreAfterFinish: true, + beforeStartInternal: function(effect) { + effect.element.makePositioned(); + effect.element.down().makePositioned(); + if(window.opera) effect.element.setStyle({top: ''}); + effect.element.makeClipping().show(); + }, + afterUpdateInternal: function(effect) { + effect.element.down().setStyle({bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom}); + effect.element.down().undoPositioned(); + } + }, arguments[1] || {}) + ); +} + +// Bug in opera makes the TD containing this element expand for a instance after finish +Effect.Squish = function(element) { + return new Effect.Scale(element, window.opera ? 1 : 0, { + restoreAfterFinish: true, + beforeSetup: function(effect) { + effect.element.makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping(); + } + }); +} + +Effect.Grow = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransition: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.full + }, arguments[1] || {}); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: element.getInlineOpacity() }; + + var dims = element.getDimensions(); + var initialMoveX, initialMoveY; + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + initialMoveX = initialMoveY = moveX = moveY = 0; + break; + case 'top-right': + initialMoveX = dims.width; + initialMoveY = moveY = 0; + moveX = -dims.width; + break; + case 'bottom-left': + initialMoveX = moveX = 0; + initialMoveY = dims.height; + moveY = -dims.height; + break; + case 'bottom-right': + initialMoveX = dims.width; + initialMoveY = dims.height; + moveX = -dims.width; + moveY = -dims.height; + break; + case 'center': + initialMoveX = dims.width / 2; + initialMoveY = dims.height / 2; + moveX = -dims.width / 2; + moveY = -dims.height / 2; + break; + } + + return new Effect.Move(element, { + x: initialMoveX, + y: initialMoveY, + duration: 0.01, + beforeSetup: function(effect) { + effect.element.hide().makeClipping().makePositioned(); + }, + afterFinishInternal: function(effect) { + new Effect.Parallel( + [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), + new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), + new Effect.Scale(effect.element, 100, { + scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, + sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) + ], Object.extend({ + beforeSetup: function(effect) { + effect.effects[0].element.setStyle({height: '0px'}).show(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); + } + }, options) + ) + } + }); +} + +Effect.Shrink = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransition: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.none + }, arguments[1] || {}); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: element.getInlineOpacity() }; + + var dims = element.getDimensions(); + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + moveX = moveY = 0; + break; + case 'top-right': + moveX = dims.width; + moveY = 0; + break; + case 'bottom-left': + moveX = 0; + moveY = dims.height; + break; + case 'bottom-right': + moveX = dims.width; + moveY = dims.height; + break; + case 'center': + moveX = dims.width / 2; + moveY = dims.height / 2; + break; + } + + return new Effect.Parallel( + [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), + new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), + new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) + ], Object.extend({ + beforeStartInternal: function(effect) { + effect.effects[0].element.makePositioned().makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); } + }, options) + ); +} + +Effect.Pulsate = function(element) { + element = $(element); + var options = arguments[1] || {}; + var oldOpacity = element.getInlineOpacity(); + var transition = options.transition || Effect.Transitions.sinoidal; + var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) }; + reverser.bind(transition); + return new Effect.Opacity(element, + Object.extend(Object.extend({ duration: 2.0, from: 0, + afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } + }, options), {transition: reverser})); +} + +Effect.Fold = function(element) { + element = $(element); + var oldStyle = { + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height }; + element.makeClipping(); + return new Effect.Scale(element, 5, Object.extend({ + scaleContent: false, + scaleX: false, + afterFinishInternal: function(effect) { + new Effect.Scale(element, 1, { + scaleContent: false, + scaleY: false, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().setStyle(oldStyle); + } }); + }}, arguments[1] || {})); +}; + +Effect.Morph = Class.create(); +Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), { + initialize: function(element) { + this.element = $(element); + if(!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + style: {} + }, arguments[1] || {}); + if (typeof options.style == 'string') { + if(options.style.indexOf(':') == -1) { + var cssText = '', selector = '.' + options.style; + $A(document.styleSheets).reverse().each(function(styleSheet) { + if (styleSheet.cssRules) cssRules = styleSheet.cssRules; + else if (styleSheet.rules) cssRules = styleSheet.rules; + $A(cssRules).reverse().each(function(rule) { + if (selector == rule.selectorText) { + cssText = rule.style.cssText; + throw $break; + } + }); + if (cssText) throw $break; + }); + this.style = cssText.parseStyle(); + options.afterFinishInternal = function(effect){ + effect.element.addClassName(effect.options.style); + effect.transforms.each(function(transform) { + if(transform.style != 'opacity') + effect.element.style[transform.style.camelize()] = ''; + }); + } + } else this.style = options.style.parseStyle(); + } else this.style = $H(options.style) + this.start(options); + }, + setup: function(){ + function parseColor(color){ + if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff'; + color = color.parseColor(); + return $R(0,2).map(function(i){ + return parseInt( color.slice(i*2+1,i*2+3), 16 ) + }); + } + this.transforms = this.style.map(function(pair){ + var property = pair[0].underscore().dasherize(), value = pair[1], unit = null; + + if(value.parseColor('#zzzzzz') != '#zzzzzz') { + value = value.parseColor(); + unit = 'color'; + } else if(property == 'opacity') { + value = parseFloat(value); + if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout)) + this.element.setStyle({zoom: 1}); + } else if(Element.CSS_LENGTH.test(value)) + var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/), + value = parseFloat(components[1]), unit = (components.length == 3) ? components[2] : null; + + var originalValue = this.element.getStyle(property); + return $H({ + style: property, + originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), + targetValue: unit=='color' ? parseColor(value) : value, + unit: unit + }); + }.bind(this)).reject(function(transform){ + return ( + (transform.originalValue == transform.targetValue) || + ( + transform.unit != 'color' && + (isNaN(transform.originalValue) || isNaN(transform.targetValue)) + ) + ) + }); + }, + update: function(position) { + var style = $H(), value = null; + this.transforms.each(function(transform){ + value = transform.unit=='color' ? + $R(0,2).inject('#',function(m,v,i){ + return m+(Math.round(transform.originalValue[i]+ + (transform.targetValue[i] - transform.originalValue[i])*position)).toColorPart() }) : + transform.originalValue + Math.round( + ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit; + style[transform.style] = value; + }); + this.element.setStyle(style); + } +}); + +Effect.Transform = Class.create(); +Object.extend(Effect.Transform.prototype, { + initialize: function(tracks){ + this.tracks = []; + this.options = arguments[1] || {}; + this.addTracks(tracks); + }, + addTracks: function(tracks){ + tracks.each(function(track){ + var data = $H(track).values().first(); + this.tracks.push($H({ + ids: $H(track).keys().first(), + effect: Effect.Morph, + options: { style: data } + })); + }.bind(this)); + return this; + }, + play: function(){ + return new Effect.Parallel( + this.tracks.map(function(track){ + var elements = [$(track.ids) || $$(track.ids)].flatten(); + return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) }); + }).flatten(), + this.options + ); + } +}); + +Element.CSS_PROPERTIES = $w( + 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + + 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' + + 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' + + 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' + + 'fontSize fontWeight height left letterSpacing lineHeight ' + + 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+ + 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' + + 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' + + 'right textIndent top width wordSpacing zIndex'); + +Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; + +String.prototype.parseStyle = function(){ + var element = Element.extend(document.createElement('div')); + element.innerHTML = '
'; + var style = element.down().style, styleRules = $H(); + + Element.CSS_PROPERTIES.each(function(property){ + if(style[property]) styleRules[property] = style[property]; + }); + if(/MSIE/.test(navigator.userAgent) && !window.opera && this.indexOf('opacity') > -1) { + styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]; + } + return styleRules; +}; + +Element.morph = function(element, style) { + new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {})); + return element; +}; + +['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom', + 'collectTextNodes','collectTextNodesIgnoreClass','morph'].each( + function(f) { Element.Methods[f] = Element[f]; } +); + +Element.Methods.visualEffect = function(element, effect, options) { + s = effect.gsub(/_/, '-').camelize(); + effect_class = s.charAt(0).toUpperCase() + s.substring(1); + new Effect[effect_class](element, options); + return $(element); +}; + +Element.addMethods(); \ No newline at end of file diff --git a/www/extras/yui-ext/adapter/prototype/ext-prototype-adapter.js b/www/extras/yui-ext/adapter/prototype/ext-prototype-adapter.js new file mode 100644 index 000000000..d20b5e88f --- /dev/null +++ b/www/extras/yui-ext/adapter/prototype/ext-prototype-adapter.js @@ -0,0 +1,12 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext={};window["undefined"]=window["undefined"];Ext.apply=function(o,c,_3){if(_3){Ext.apply(o,_3);}if(o&&c&&typeof c=="object"){for(var p in c){o[p]=c[p];}}return o;};(function(){var _5=0;var ua=navigator.userAgent.toLowerCase();var _7=document.compatMode=="CSS1Compat",_8=ua.indexOf("opera")>-1,_9=(/webkit|khtml/).test(ua),_a=ua.indexOf("msie")>-1,_b=ua.indexOf("msie 7")>-1,_c=!_9&&ua.indexOf("gecko")>-1,_d=_a&&!_7,_e=(ua.indexOf("windows")!=-1||ua.indexOf("win32")!=-1),_f=(ua.indexOf("macintosh")!=-1||ua.indexOf("mac os x")!=-1),_10=window.location.href.toLowerCase().indexOf("https")===0;if(_a&&!_b){try{document.execCommand("BackgroundImageCache",false,true);}catch(e){}}Ext.apply(Ext,{isStrict:_7,isSecure:_10,isReady:false,SSL_SECURE_URL:"javascript:false",BLANK_IMAGE_URL:"http:/"+"/extjs.com/s.gif",emptyFn:function(){},applyIf:function(o,c){if(o&&c){for(var p in c){if(typeof o[p]=="undefined"){o[p]=c[p];}}}return o;},addBehaviors:function(o){if(!Ext.isReady){Ext.onReady(function(){Ext.addBehaviors(o);});return;}var _15={};for(var b in o){var _17=b.split("@");if(_17[1]){var s=_17[0];if(!_15[s]){_15[s]=Ext.select(s);}_15[s].on(_17[1],o[b]);}}_15=null;},id:function(el,_1a){_1a=_1a||"ext-gen";el=Ext.getDom(el);var id=_1a+(++_5);return el?(el.id?el.id:(el.id=id)):id;},extend:function(){var io=function(o){for(var m in o){this[m]=o[m];}};return function(sb,sp,_21){if(typeof sp=="object"){_21=sp;sp=sb;sb=function(){sp.apply(this,arguments);};}var F=function(){},sbp,spp=sp.prototype;F.prototype=spp;sbp=sb.prototype=new F();sbp.constructor=sb;sb.superclass=spp;if(spp.constructor==Object.prototype.constructor){spp.constructor=sp;}sb.override=function(o){Ext.override(sb,o);};sbp.override=io;sbp.__extcls=sb;Ext.override(sb,_21);return sb;};}(),override:function(_26,_27){if(_27){var p=_26.prototype;for(var _29 in _27){p[_29]=_27[_29];}}},namespace:function(){var a=arguments,o=null,i,j,d,rt;for(i=0;i10000){clearInterval(iid);}var el=document.getElementById(id);if(el){clearInterval(iid);fn.call(_35||window,el);}};iid=setInterval(f,50);}};Ext.lib.Ajax=function(){var _3b=function(cb){return cb.success?function(xhr){cb.success.call(cb.scope||window,{responseText:xhr.responseText,responseXML:xhr.responseXML,argument:cb.argument});}:Ext.emptyFn;};var _3e=function(cb){return cb.failure?function(xhr){cb.failure.call(cb.scope||window,{responseText:xhr.responseText,responseXML:xhr.responseXML,argument:cb.argument});}:Ext.emptyFn;};return {request:function(_41,uri,cb,_44){new Ajax.Request(uri,{method:_41,parameters:_44||"",timeout:cb.timeout,onSuccess:_3b(cb),onFailure:_3e(cb)});},formRequest:function(_45,uri,cb,_48,_49,_4a){new Ajax.Request(uri,{method:Ext.getDom(_45).method||"POST",parameters:Form.serialize(_45)+(_48?"&"+_48:""),timeout:cb.timeout,onSuccess:_3b(cb),onFailure:_3e(cb)});},isCallInProgress:function(_4b){return false;},abort:function(_4c){return false;},serializeForm:function(_4d){return Form.serialize(_4d.dom||_4d,true);}};}();Ext.lib.Anim=function(){var _4e={easeOut:function(pos){return 1-Math.pow(1-pos,2);},easeIn:function(pos){return 1-Math.pow(1-pos,2);}};var _51=function(cb,_53){return {stop:function(_54){this.effect.cancel();},isAnimated:function(){return this.effect.state=="running";},proxyCallback:function(){Ext.callback(cb,_53);}};};return {scroll:function(el,_56,_57,_58,cb,_5a){var _5b=_51(cb,_5a);el=Ext.getDom(el);el.scrollLeft=_56.to[0];el.scrollTop=_56.to[1];_5b.proxyCallback();return _5b;},motion:function(el,_5d,_5e,_5f,cb,_61){return this.run(el,_5d,_5e,_5f,cb,_61);},color:function(el,_63,_64,_65,cb,_67){return this.run(el,_63,_64,_65,cb,_67);},run:function(el,_69,_6a,_6b,cb,_6d,_6e){var o={};for(var k in _69){switch(k){case "points":var by,pts,e=Ext.fly(el,"_animrun");e.position();if(by=_69.points.by){var xy=e.getXY();pts=e.translatePoints([xy[0]+by[0],xy[1]+by[1]]);}else{pts=e.translatePoints(_69.points.to);}o.left=pts.left+"px";o.top=pts.top+"px";break;case "width":o.width=_69.width.to+"px";break;case "height":o.height=_69.height.to+"px";break;case "opacity":o.opacity=String(_69.opacity.to);break;default:o[k]=String(_69[k].to);break;}}var _75=_51(cb,_6d);_75.effect=new Effect.Morph(Ext.id(el),{duration:_6a,afterFinish:_75.proxyCallback,transition:_4e[_6b]||Effect.Transitions.linear,style:o});return _75;}};}();function fly(el){if(!_1){_1=new Ext.Element.Flyweight();}_1.dom=el;return _1;}Ext.lib.Region=function(t,r,b,l){this.top=t;this[1]=t;this.right=r;this.bottom=b;this.left=l;this[0]=l;};Ext.lib.Region.prototype={contains:function(_7b){return (_7b.left>=this.left&&_7b.right<=this.right&&_7b.top>=this.top&&_7b.bottom<=this.bottom);},getArea:function(){return ((this.bottom-this.top)*(this.right-this.left));},intersect:function(_7c){var t=Math.max(this.top,_7c.top);var r=Math.min(this.right,_7c.right);var b=Math.min(this.bottom,_7c.bottom);var l=Math.max(this.left,_7c.left);if(b>=t&&r>=l){return new Ext.lib.Region(t,r,b,l);}else{return null;}},union:function(_81){var t=Math.min(this.top,_81.top);var r=Math.max(this.right,_81.right);var b=Math.max(this.bottom,_81.bottom);var l=Math.min(this.left,_81.left);return new Ext.lib.Region(t,r,b,l);},adjust:function(t,l,b,r){this.top+=t;this.left+=l;this.right+=r;this.bottom+=b;return this;}};Ext.lib.Region.getRegion=function(el){var p=Ext.lib.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 Ext.lib.Region(t,r,b,l);};Ext.lib.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;};Ext.lib.Point.prototype=new Ext.lib.Region();if(Ext.isIE){Event.observe(window,"unload",function(){var p=Function.prototype;delete p.createSequence;delete p.defer;delete p.createDelegate;delete p.createCallback;delete p.createInterceptor;});}})(); + diff --git a/www/extras/yui-ext/adapter/prototype/prototype.js b/www/extras/yui-ext/adapter/prototype/prototype.js new file mode 100644 index 000000000..7814180a1 --- /dev/null +++ b/www/extras/yui-ext/adapter/prototype/prototype.js @@ -0,0 +1,2523 @@ +/* + * Ext JS Library 1.0 Beta 1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* Prototype JavaScript framework, version 1.5.0 + * (c) 2005-2007 Sam Stephenson + * + * Prototype is freely distributable under the terms of an MIT-style license. + * For details, see the Prototype web site: http://prototype.conio.net/ + * +/*--------------------------------------------------------------------------*/ + +var Prototype = { + Version: '1.5.0', + BrowserFeatures: { + XPath: !!document.evaluate + }, + + ScriptFragment: '(?:)((\n|\r|.)*?)(?:<\/script>)', + emptyFunction: function() {}, + K: function(x) { return x } +} + +var Class = { + create: function() { + return function() { + this.initialize.apply(this, arguments); + } + } +} + +var Abstract = new Object(); + +Object.extend = function(destination, source) { + for (var property in source) { + destination[property] = source[property]; + } + return destination; +} + +Object.extend(Object, { + inspect: function(object) { + try { + if (object === undefined) return 'undefined'; + if (object === null) return 'null'; + return object.inspect ? object.inspect() : object.toString(); + } catch (e) { + if (e instanceof RangeError) return '...'; + throw e; + } + }, + + keys: function(object) { + var keys = []; + for (var property in object) + keys.push(property); + return keys; + }, + + values: function(object) { + var values = []; + for (var property in object) + values.push(object[property]); + return values; + }, + + clone: function(object) { + return Object.extend({}, object); + } +}); + +Function.prototype.bind = function() { + var __method = this, args = $A(arguments), object = args.shift(); + return function() { + return __method.apply(object, args.concat($A(arguments))); + } +} + +Function.prototype.bindAsEventListener = function(object) { + var __method = this, args = $A(arguments), object = args.shift(); + return function(event) { + return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments))); + } +} + +Object.extend(Number.prototype, { + toColorPart: function() { + var digits = this.toString(16); + if (this < 16) return '0' + digits; + return digits; + }, + + succ: function() { + return this + 1; + }, + + times: function(iterator) { + $R(0, this, true).each(iterator); + return this; + } +}); + +var Try = { + these: function() { + var returnValue; + + for (var i = 0, length = arguments.length; i < length; i++) { + var lambda = arguments[i]; + try { + returnValue = lambda(); + break; + } catch (e) {} + } + + return returnValue; + } +} + +/*--------------------------------------------------------------------------*/ + +var PeriodicalExecuter = Class.create(); +PeriodicalExecuter.prototype = { + initialize: function(callback, frequency) { + this.callback = callback; + this.frequency = frequency; + this.currentlyExecuting = false; + + this.registerCallback(); + }, + + registerCallback: function() { + this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + stop: function() { + if (!this.timer) return; + clearInterval(this.timer); + this.timer = null; + }, + + onTimerEvent: function() { + if (!this.currentlyExecuting) { + try { + this.currentlyExecuting = true; + this.callback(this); + } finally { + this.currentlyExecuting = false; + } + } + } +} +String.interpret = function(value){ + return value == null ? '' : String(value); +} + +Object.extend(String.prototype, { + gsub: function(pattern, replacement) { + var result = '', source = this, match; + replacement = arguments.callee.prepareReplacement(replacement); + + while (source.length > 0) { + if (match = source.match(pattern)) { + result += source.slice(0, match.index); + result += String.interpret(replacement(match)); + source = source.slice(match.index + match[0].length); + } else { + result += source, source = ''; + } + } + return result; + }, + + sub: function(pattern, replacement, count) { + replacement = this.gsub.prepareReplacement(replacement); + count = count === undefined ? 1 : count; + + return this.gsub(pattern, function(match) { + if (--count < 0) return match[0]; + return replacement(match); + }); + }, + + scan: function(pattern, iterator) { + this.gsub(pattern, iterator); + return this; + }, + + truncate: function(length, truncation) { + length = length || 30; + truncation = truncation === undefined ? '...' : truncation; + return this.length > length ? + this.slice(0, length - truncation.length) + truncation : this; + }, + + strip: function() { + return this.replace(/^\s+/, '').replace(/\s+$/, ''); + }, + + stripTags: function() { + return this.replace(/<\/?[^>]+>/gi, ''); + }, + + stripScripts: function() { + return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); + }, + + extractScripts: function() { + var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); + var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); + return (this.match(matchAll) || []).map(function(scriptTag) { + return (scriptTag.match(matchOne) || ['', ''])[1]; + }); + }, + + evalScripts: function() { + return this.extractScripts().map(function(script) { return eval(script) }); + }, + + escapeHTML: function() { + var div = document.createElement('div'); + var text = document.createTextNode(this); + div.appendChild(text); + return div.innerHTML; + }, + + unescapeHTML: function() { + var div = document.createElement('div'); + div.innerHTML = this.stripTags(); + return div.childNodes[0] ? (div.childNodes.length > 1 ? + $A(div.childNodes).inject('',function(memo,node){ return memo+node.nodeValue }) : + div.childNodes[0].nodeValue) : ''; + }, + + toQueryParams: function(separator) { + var match = this.strip().match(/([^?#]*)(#.*)?$/); + if (!match) return {}; + + return match[1].split(separator || '&').inject({}, function(hash, pair) { + if ((pair = pair.split('='))[0]) { + var name = decodeURIComponent(pair[0]); + var value = pair[1] ? decodeURIComponent(pair[1]) : undefined; + + if (hash[name] !== undefined) { + if (hash[name].constructor != Array) + hash[name] = [hash[name]]; + if (value) hash[name].push(value); + } + else hash[name] = value; + } + return hash; + }); + }, + + toArray: function() { + return this.split(''); + }, + + succ: function() { + return this.slice(0, this.length - 1) + + String.fromCharCode(this.charCodeAt(this.length - 1) + 1); + }, + + camelize: function() { + var parts = this.split('-'), len = parts.length; + if (len == 1) return parts[0]; + + var camelized = this.charAt(0) == '-' + ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) + : parts[0]; + + for (var i = 1; i < len; i++) + camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); + + return camelized; + }, + + capitalize: function(){ + return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); + }, + + underscore: function() { + return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); + }, + + dasherize: function() { + return this.gsub(/_/,'-'); + }, + + inspect: function(useDoubleQuotes) { + var escapedString = this.replace(/\\/g, '\\\\'); + if (useDoubleQuotes) + return '"' + escapedString.replace(/"/g, '\\"') + '"'; + else + return "'" + escapedString.replace(/'/g, '\\\'') + "'"; + } +}); + +String.prototype.gsub.prepareReplacement = function(replacement) { + if (typeof replacement == 'function') return replacement; + var template = new Template(replacement); + return function(match) { return template.evaluate(match) }; +} + +String.prototype.parseQuery = String.prototype.toQueryParams; + +var Template = Class.create(); +Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; +Template.prototype = { + initialize: function(template, pattern) { + this.template = template.toString(); + this.pattern = pattern || Template.Pattern; + }, + + evaluate: function(object) { + return this.template.gsub(this.pattern, function(match) { + var before = match[1]; + if (before == '\\') return match[2]; + return before + String.interpret(object[match[3]]); + }); + } +} + +var $break = new Object(); +var $continue = new Object(); + +var Enumerable = { + each: function(iterator) { + var index = 0; + try { + this._each(function(value) { + try { + iterator(value, index++); + } catch (e) { + if (e != $continue) throw e; + } + }); + } catch (e) { + if (e != $break) throw e; + } + return this; + }, + + eachSlice: function(number, iterator) { + var index = -number, slices = [], array = this.toArray(); + while ((index += number) < array.length) + slices.push(array.slice(index, index+number)); + return slices.map(iterator); + }, + + all: function(iterator) { + var result = true; + this.each(function(value, index) { + result = result && !!(iterator || Prototype.K)(value, index); + if (!result) throw $break; + }); + return result; + }, + + any: function(iterator) { + var result = false; + this.each(function(value, index) { + if (result = !!(iterator || Prototype.K)(value, index)) + throw $break; + }); + return result; + }, + + collect: function(iterator) { + var results = []; + this.each(function(value, index) { + results.push((iterator || Prototype.K)(value, index)); + }); + return results; + }, + + detect: function(iterator) { + var result; + this.each(function(value, index) { + if (iterator(value, index)) { + result = value; + throw $break; + } + }); + return result; + }, + + findAll: function(iterator) { + var results = []; + this.each(function(value, index) { + if (iterator(value, index)) + results.push(value); + }); + return results; + }, + + grep: function(pattern, iterator) { + var results = []; + this.each(function(value, index) { + var stringValue = value.toString(); + if (stringValue.match(pattern)) + results.push((iterator || Prototype.K)(value, index)); + }) + return results; + }, + + include: function(object) { + var found = false; + this.each(function(value) { + if (value == object) { + found = true; + throw $break; + } + }); + return found; + }, + + inGroupsOf: function(number, fillWith) { + fillWith = fillWith === undefined ? null : fillWith; + return this.eachSlice(number, function(slice) { + while(slice.length < number) slice.push(fillWith); + return slice; + }); + }, + + inject: function(memo, iterator) { + this.each(function(value, index) { + memo = iterator(memo, value, index); + }); + return memo; + }, + + invoke: function(method) { + var args = $A(arguments).slice(1); + return this.map(function(value) { + return value[method].apply(value, args); + }); + }, + + max: function(iterator) { + var result; + this.each(function(value, index) { + value = (iterator || Prototype.K)(value, index); + if (result == undefined || value >= result) + result = value; + }); + return result; + }, + + min: function(iterator) { + var result; + this.each(function(value, index) { + value = (iterator || Prototype.K)(value, index); + if (result == undefined || value < result) + result = value; + }); + return result; + }, + + partition: function(iterator) { + var trues = [], falses = []; + this.each(function(value, index) { + ((iterator || Prototype.K)(value, index) ? + trues : falses).push(value); + }); + return [trues, falses]; + }, + + pluck: function(property) { + var results = []; + this.each(function(value, index) { + results.push(value[property]); + }); + return results; + }, + + reject: function(iterator) { + var results = []; + this.each(function(value, index) { + if (!iterator(value, index)) + results.push(value); + }); + return results; + }, + + sortBy: function(iterator) { + return this.map(function(value, index) { + return {value: value, criteria: iterator(value, index)}; + }).sort(function(left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + }).pluck('value'); + }, + + toArray: function() { + return this.map(); + }, + + zip: function() { + var iterator = Prototype.K, args = $A(arguments); + if (typeof args.last() == 'function') + iterator = args.pop(); + + var collections = [this].concat(args).map($A); + return this.map(function(value, index) { + return iterator(collections.pluck(index)); + }); + }, + + size: function() { + return this.toArray().length; + }, + + inspect: function() { + return '#'; + } +} + +Object.extend(Enumerable, { + map: Enumerable.collect, + find: Enumerable.detect, + select: Enumerable.findAll, + member: Enumerable.include, + entries: Enumerable.toArray +}); +var $A = Array.from = function(iterable) { + if (!iterable) return []; + if (iterable.toArray) { + return iterable.toArray(); + } else { + var results = []; + for (var i = 0, length = iterable.length; i < length; i++) + results.push(iterable[i]); + return results; + } +} + +Object.extend(Array.prototype, Enumerable); + +if (!Array.prototype._reverse) + Array.prototype._reverse = Array.prototype.reverse; + +Object.extend(Array.prototype, { + _each: function(iterator) { + for (var i = 0, length = this.length; i < length; i++) + iterator(this[i]); + }, + + clear: function() { + this.length = 0; + return this; + }, + + first: function() { + return this[0]; + }, + + last: function() { + return this[this.length - 1]; + }, + + compact: function() { + return this.select(function(value) { + return value != null; + }); + }, + + flatten: function() { + return this.inject([], function(array, value) { + return array.concat(value && value.constructor == Array ? + value.flatten() : [value]); + }); + }, + + without: function() { + var values = $A(arguments); + return this.select(function(value) { + return !values.include(value); + }); + }, + + indexOf: function(object) { + for (var i = 0, length = this.length; i < length; i++) + if (this[i] == object) return i; + return -1; + }, + + reverse: function(inline) { + return (inline !== false ? this : this.toArray())._reverse(); + }, + + reduce: function() { + return this.length > 1 ? this : this[0]; + }, + + uniq: function() { + return this.inject([], function(array, value) { + return array.include(value) ? array : array.concat([value]); + }); + }, + + clone: function() { + return [].concat(this); + }, + + size: function() { + return this.length; + }, + + inspect: function() { + return '[' + this.map(Object.inspect).join(', ') + ']'; + } +}); + +Array.prototype.toArray = Array.prototype.clone; + +function $w(string){ + string = string.strip(); + return string ? string.split(/\s+/) : []; +} + +if(window.opera){ + Array.prototype.concat = function(){ + var array = []; + for(var i = 0, length = this.length; i < length; i++) array.push(this[i]); + for(var i = 0, length = arguments.length; i < length; i++) { + if(arguments[i].constructor == Array) { + for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) + array.push(arguments[i][j]); + } else { + array.push(arguments[i]); + } + } + return array; + } +} +var Hash = function(obj) { + Object.extend(this, obj || {}); +}; + +Object.extend(Hash, { + toQueryString: function(obj) { + var parts = []; + + this.prototype._each.call(obj, function(pair) { + if (!pair.key) return; + + if (pair.value && pair.value.constructor == Array) { + var values = pair.value.compact(); + if (values.length < 2) pair.value = values.reduce(); + else { + key = encodeURIComponent(pair.key); + values.each(function(value) { + value = value != undefined ? encodeURIComponent(value) : ''; + parts.push(key + '=' + encodeURIComponent(value)); + }); + return; + } + } + if (pair.value == undefined) pair[1] = ''; + parts.push(pair.map(encodeURIComponent).join('=')); + }); + + return parts.join('&'); + } +}); + +Object.extend(Hash.prototype, Enumerable); +Object.extend(Hash.prototype, { + _each: function(iterator) { + for (var key in this) { + var value = this[key]; + if (value && value == Hash.prototype[key]) continue; + + var pair = [key, value]; + pair.key = key; + pair.value = value; + iterator(pair); + } + }, + + keys: function() { + return this.pluck('key'); + }, + + values: function() { + return this.pluck('value'); + }, + + merge: function(hash) { + return $H(hash).inject(this, function(mergedHash, pair) { + mergedHash[pair.key] = pair.value; + return mergedHash; + }); + }, + + remove: function() { + var result; + for(var i = 0, length = arguments.length; i < length; i++) { + var value = this[arguments[i]]; + if (value !== undefined){ + if (result === undefined) result = value; + else { + if (result.constructor != Array) result = [result]; + result.push(value) + } + } + delete this[arguments[i]]; + } + return result; + }, + + toQueryString: function() { + return Hash.toQueryString(this); + }, + + inspect: function() { + return '#'; + } +}); + +function $H(object) { + if (object && object.constructor == Hash) return object; + return new Hash(object); +}; +ObjectRange = Class.create(); +Object.extend(ObjectRange.prototype, Enumerable); +Object.extend(ObjectRange.prototype, { + initialize: function(start, end, exclusive) { + this.start = start; + this.end = end; + this.exclusive = exclusive; + }, + + _each: function(iterator) { + var value = this.start; + while (this.include(value)) { + iterator(value); + value = value.succ(); + } + }, + + include: function(value) { + if (value < this.start) + return false; + if (this.exclusive) + return value < this.end; + return value <= this.end; + } +}); + +var $R = function(start, end, exclusive) { + return new ObjectRange(start, end, exclusive); +} + +var Ajax = { + getTransport: function() { + return Try.these( + function() {return new XMLHttpRequest()}, + function() {return new ActiveXObject('Msxml2.XMLHTTP')}, + function() {return new ActiveXObject('Microsoft.XMLHTTP')} + ) || false; + }, + + activeRequestCount: 0 +} + +Ajax.Responders = { + responders: [], + + _each: function(iterator) { + this.responders._each(iterator); + }, + + register: function(responder) { + if (!this.include(responder)) + this.responders.push(responder); + }, + + unregister: function(responder) { + this.responders = this.responders.without(responder); + }, + + dispatch: function(callback, request, transport, json) { + this.each(function(responder) { + if (typeof responder[callback] == 'function') { + try { + responder[callback].apply(responder, [request, transport, json]); + } catch (e) {} + } + }); + } +}; + +Object.extend(Ajax.Responders, Enumerable); + +Ajax.Responders.register({ + onCreate: function() { + Ajax.activeRequestCount++; + }, + onComplete: function() { + Ajax.activeRequestCount--; + } +}); + +Ajax.Base = function() {}; +Ajax.Base.prototype = { + setOptions: function(options) { + this.options = { + method: 'post', + asynchronous: true, + contentType: 'application/x-www-form-urlencoded', + encoding: 'UTF-8', + parameters: '' + } + Object.extend(this.options, options || {}); + + this.options.method = this.options.method.toLowerCase(); + if (typeof this.options.parameters == 'string') + this.options.parameters = this.options.parameters.toQueryParams(); + } +} + +Ajax.Request = Class.create(); +Ajax.Request.Events = + ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; + +Ajax.Request.prototype = Object.extend(new Ajax.Base(), { + _complete: false, + + initialize: function(url, options) { + this.transport = Ajax.getTransport(); + this.setOptions(options); + this.request(url); + }, + + request: function(url) { + this.url = url; + this.method = this.options.method; + var params = this.options.parameters; + + if (!['get', 'post'].include(this.method)) { + // simulate other verbs over post + params['_method'] = this.method; + this.method = 'post'; + } + + params = Hash.toQueryString(params); + if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += '&_=' + + // when GET, append parameters to URL + if (this.method == 'get' && params) + this.url += (this.url.indexOf('?') > -1 ? '&' : '?') + params; + + try { + Ajax.Responders.dispatch('onCreate', this, this.transport); + + this.transport.open(this.method.toUpperCase(), this.url, + this.options.asynchronous); + + if (this.options.asynchronous) + setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10); + + this.transport.onreadystatechange = this.onStateChange.bind(this); + this.setRequestHeaders(); + + var body = this.method == 'post' ? (this.options.postBody || params) : null; + + this.transport.send(body); + + /* Force Firefox to handle ready state 4 for synchronous requests */ + if (!this.options.asynchronous && this.transport.overrideMimeType) + this.onStateChange(); + + } + catch (e) { + this.dispatchException(e); + } + }, + + onStateChange: function() { + var readyState = this.transport.readyState; + if (readyState > 1 && !((readyState == 4) && this._complete)) + this.respondToReadyState(this.transport.readyState); + }, + + setRequestHeaders: function() { + var headers = { + 'X-Requested-With': 'XMLHttpRequest', + 'X-Prototype-Version': Prototype.Version, + 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' + }; + + if (this.method == 'post') { + headers['Content-type'] = this.options.contentType + + (this.options.encoding ? '; charset=' + this.options.encoding : ''); + + /* Force "Connection: close" for older Mozilla browsers to work + * around a bug where XMLHttpRequest sends an incorrect + * Content-length header. See Mozilla Bugzilla #246651. + */ + if (this.transport.overrideMimeType && + (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) + headers['Connection'] = 'close'; + } + + // user-defined headers + if (typeof this.options.requestHeaders == 'object') { + var extras = this.options.requestHeaders; + + if (typeof extras.push == 'function') + for (var i = 0, length = extras.length; i < length; i += 2) + headers[extras[i]] = extras[i+1]; + else + $H(extras).each(function(pair) { headers[pair.key] = pair.value }); + } + + for (var name in headers) + this.transport.setRequestHeader(name, headers[name]); + }, + + success: function() { + return !this.transport.status + || (this.transport.status >= 200 && this.transport.status < 300); + }, + + respondToReadyState: function(readyState) { + var state = Ajax.Request.Events[readyState]; + var transport = this.transport, json = this.evalJSON(); + + if (state == 'Complete') { + try { + this._complete = true; + (this.options['on' + this.transport.status] + || this.options['on' + (this.success() ? 'Success' : 'Failure')] + || Prototype.emptyFunction)(transport, json); + } catch (e) { + this.dispatchException(e); + } + + if ((this.getHeader('Content-type') || 'text/javascript').strip(). + match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i)) + this.evalResponse(); + } + + try { + (this.options['on' + state] || Prototype.emptyFunction)(transport, json); + Ajax.Responders.dispatch('on' + state, this, transport, json); + } catch (e) { + this.dispatchException(e); + } + + if (state == 'Complete') { + // avoid memory leak in MSIE: clean up + this.transport.onreadystatechange = Prototype.emptyFunction; + } + }, + + getHeader: function(name) { + try { + return this.transport.getResponseHeader(name); + } catch (e) { return null } + }, + + evalJSON: function() { + try { + var json = this.getHeader('X-JSON'); + return json ? eval('(' + json + ')') : null; + } catch (e) { return null } + }, + + evalResponse: function() { + try { + return eval(this.transport.responseText); + } catch (e) { + this.dispatchException(e); + } + }, + + dispatchException: function(exception) { + (this.options.onException || Prototype.emptyFunction)(this, exception); + Ajax.Responders.dispatch('onException', this, exception); + } +}); + +Ajax.Updater = Class.create(); + +Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), { + initialize: function(container, url, options) { + this.container = { + success: (container.success || container), + failure: (container.failure || (container.success ? null : container)) + } + + this.transport = Ajax.getTransport(); + this.setOptions(options); + + var onComplete = this.options.onComplete || Prototype.emptyFunction; + this.options.onComplete = (function(transport, param) { + this.updateContent(); + onComplete(transport, param); + }).bind(this); + + this.request(url); + }, + + updateContent: function() { + var receiver = this.container[this.success() ? 'success' : 'failure']; + var response = this.transport.responseText; + + if (!this.options.evalScripts) response = response.stripScripts(); + + if (receiver = $(receiver)) { + if (this.options.insertion) + new this.options.insertion(receiver, response); + else + receiver.update(response); + } + + if (this.success()) { + if (this.onComplete) + setTimeout(this.onComplete.bind(this), 10); + } + } +}); + +Ajax.PeriodicalUpdater = Class.create(); +Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), { + initialize: function(container, url, options) { + this.setOptions(options); + this.onComplete = this.options.onComplete; + + this.frequency = (this.options.frequency || 2); + this.decay = (this.options.decay || 1); + + this.updater = {}; + this.container = container; + this.url = url; + + this.start(); + }, + + start: function() { + this.options.onComplete = this.updateComplete.bind(this); + this.onTimerEvent(); + }, + + stop: function() { + this.updater.options.onComplete = undefined; + clearTimeout(this.timer); + (this.onComplete || Prototype.emptyFunction).apply(this, arguments); + }, + + updateComplete: function(request) { + if (this.options.decay) { + this.decay = (request.responseText == this.lastText ? + this.decay * this.options.decay : 1); + + this.lastText = request.responseText; + } + this.timer = setTimeout(this.onTimerEvent.bind(this), + this.decay * this.frequency * 1000); + }, + + onTimerEvent: function() { + this.updater = new Ajax.Updater(this.container, this.url, this.options); + } +}); +function $(element) { + if (arguments.length > 1) { + for (var i = 0, elements = [], length = arguments.length; i < length; i++) + elements.push($(arguments[i])); + return elements; + } + if (typeof element == 'string') + element = document.getElementById(element); + return Element.extend(element); +} + +if (Prototype.BrowserFeatures.XPath) { + document._getElementsByXPath = function(expression, parentElement) { + var results = []; + var query = document.evaluate(expression, $(parentElement) || document, + null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + for (var i = 0, length = query.snapshotLength; i < length; i++) + results.push(query.snapshotItem(i)); + return results; + }; +} + +document.getElementsByClassName = function(className, parentElement) { + if (Prototype.BrowserFeatures.XPath) { + var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]"; + return document._getElementsByXPath(q, parentElement); + } else { + var children = ($(parentElement) || document.body).getElementsByTagName('*'); + var elements = [], child; + for (var i = 0, length = children.length; i < length; i++) { + child = children[i]; + if (Element.hasClassName(child, className)) + elements.push(Element.extend(child)); + } + return elements; + } +}; + +/*--------------------------------------------------------------------------*/ + +if (!window.Element) + var Element = new Object(); + +Element.extend = function(element) { + if (!element || _nativeExtensions || element.nodeType == 3) return element; + + if (!element._extended && element.tagName && element != window) { + var methods = Object.clone(Element.Methods), cache = Element.extend.cache; + + if (element.tagName == 'FORM') + Object.extend(methods, Form.Methods); + if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName)) + Object.extend(methods, Form.Element.Methods); + + Object.extend(methods, Element.Methods.Simulated); + + for (var property in methods) { + var value = methods[property]; + if (typeof value == 'function' && !(property in element)) + element[property] = cache.findOrStore(value); + } + } + + element._extended = true; + return element; +}; + +Element.extend.cache = { + findOrStore: function(value) { + return this[value] = this[value] || function() { + return value.apply(null, [this].concat($A(arguments))); + } + } +}; + +Element.Methods = { + visible: function(element) { + return $(element).style.display != 'none'; + }, + + toggle: function(element) { + element = $(element); + Element[Element.visible(element) ? 'hide' : 'show'](element); + return element; + }, + + hide: function(element) { + $(element).style.display = 'none'; + return element; + }, + + show: function(element) { + $(element).style.display = ''; + return element; + }, + + remove: function(element) { + element = $(element); + element.parentNode.removeChild(element); + return element; + }, + + update: function(element, html) { + html = typeof html == 'undefined' ? '' : html.toString(); + $(element).innerHTML = html.stripScripts(); + setTimeout(function() {html.evalScripts()}, 10); + return element; + }, + + replace: function(element, html) { + element = $(element); + html = typeof html == 'undefined' ? '' : html.toString(); + if (element.outerHTML) { + element.outerHTML = html.stripScripts(); + } else { + var range = element.ownerDocument.createRange(); + range.selectNodeContents(element); + element.parentNode.replaceChild( + range.createContextualFragment(html.stripScripts()), element); + } + setTimeout(function() {html.evalScripts()}, 10); + return element; + }, + + inspect: function(element) { + element = $(element); + var result = '<' + element.tagName.toLowerCase(); + $H({'id': 'id', 'className': 'class'}).each(function(pair) { + var property = pair.first(), attribute = pair.last(); + var value = (element[property] || '').toString(); + if (value) result += ' ' + attribute + '=' + value.inspect(true); + }); + return result + '>'; + }, + + recursivelyCollect: function(element, property) { + element = $(element); + var elements = []; + while (element = element[property]) + if (element.nodeType == 1) + elements.push(Element.extend(element)); + return elements; + }, + + ancestors: function(element) { + return $(element).recursivelyCollect('parentNode'); + }, + + descendants: function(element) { + return $A($(element).getElementsByTagName('*')); + }, + + immediateDescendants: function(element) { + if (!(element = $(element).firstChild)) return []; + while (element && element.nodeType != 1) element = element.nextSibling; + if (element) return [element].concat($(element).nextSiblings()); + return []; + }, + + previousSiblings: function(element) { + return $(element).recursivelyCollect('previousSibling'); + }, + + nextSiblings: function(element) { + return $(element).recursivelyCollect('nextSibling'); + }, + + siblings: function(element) { + element = $(element); + return element.previousSiblings().reverse().concat(element.nextSiblings()); + }, + + match: function(element, selector) { + if (typeof selector == 'string') + selector = new Selector(selector); + return selector.match($(element)); + }, + + up: function(element, expression, index) { + return Selector.findElement($(element).ancestors(), expression, index); + }, + + down: function(element, expression, index) { + return Selector.findElement($(element).descendants(), expression, index); + }, + + previous: function(element, expression, index) { + return Selector.findElement($(element).previousSiblings(), expression, index); + }, + + next: function(element, expression, index) { + return Selector.findElement($(element).nextSiblings(), expression, index); + }, + + getElementsBySelector: function() { + var args = $A(arguments), element = $(args.shift()); + return Selector.findChildElements(element, args); + }, + + getElementsByClassName: function(element, className) { + return document.getElementsByClassName(className, element); + }, + + readAttribute: function(element, name) { + element = $(element); + if (document.all && !window.opera) { + var t = Element._attributeTranslations; + if (t.values[name]) return t.values[name](element, name); + if (t.names[name]) name = t.names[name]; + var attribute = element.attributes[name]; + if(attribute) return attribute.nodeValue; + } + return element.getAttribute(name); + }, + + getHeight: function(element) { + return $(element).getDimensions().height; + }, + + getWidth: function(element) { + return $(element).getDimensions().width; + }, + + classNames: function(element) { + return new Element.ClassNames(element); + }, + + hasClassName: function(element, className) { + if (!(element = $(element))) return; + var elementClassName = element.className; + if (elementClassName.length == 0) return false; + if (elementClassName == className || + elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) + return true; + return false; + }, + + addClassName: function(element, className) { + if (!(element = $(element))) return; + Element.classNames(element).add(className); + return element; + }, + + removeClassName: function(element, className) { + if (!(element = $(element))) return; + Element.classNames(element).remove(className); + return element; + }, + + toggleClassName: function(element, className) { + if (!(element = $(element))) return; + Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className); + return element; + }, + + observe: function() { + Event.observe.apply(Event, arguments); + return $A(arguments).first(); + }, + + stopObserving: function() { + Event.stopObserving.apply(Event, arguments); + return $A(arguments).first(); + }, + + // removes whitespace-only text node children + cleanWhitespace: function(element) { + element = $(element); + var node = element.firstChild; + while (node) { + var nextNode = node.nextSibling; + if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) + element.removeChild(node); + node = nextNode; + } + return element; + }, + + empty: function(element) { + return $(element).innerHTML.match(/^\s*$/); + }, + + descendantOf: function(element, ancestor) { + element = $(element), ancestor = $(ancestor); + while (element = element.parentNode) + if (element == ancestor) return true; + return false; + }, + + scrollTo: function(element) { + element = $(element); + var pos = Position.cumulativeOffset(element); + window.scrollTo(pos[0], pos[1]); + return element; + }, + + getStyle: function(element, style) { + element = $(element); + if (['float','cssFloat'].include(style)) + style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat'); + style = style.camelize(); + var value = element.style[style]; + if (!value) { + if (document.defaultView && document.defaultView.getComputedStyle) { + var css = document.defaultView.getComputedStyle(element, null); + value = css ? css[style] : null; + } else if (element.currentStyle) { + value = element.currentStyle[style]; + } + } + + if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none')) + value = element['offset'+style.capitalize()] + 'px'; + + if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) + if (Element.getStyle(element, 'position') == 'static') value = 'auto'; + if(style == 'opacity') { + if(value) return parseFloat(value); + if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) + if(value[1]) return parseFloat(value[1]) / 100; + return 1.0; + } + return value == 'auto' ? null : value; + }, + + setStyle: function(element, style) { + element = $(element); + for (var name in style) { + var value = style[name]; + if(name == 'opacity') { + if (value == 1) { + value = (/Gecko/.test(navigator.userAgent) && + !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0; + if(/MSIE/.test(navigator.userAgent) && !window.opera) + element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,''); + } else if(value === '') { + if(/MSIE/.test(navigator.userAgent) && !window.opera) + element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,''); + } else { + if(value < 0.00001) value = 0; + if(/MSIE/.test(navigator.userAgent) && !window.opera) + element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') + + 'alpha(opacity='+value*100+')'; + } + } else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat'; + element.style[name.camelize()] = value; + } + return element; + }, + + getDimensions: function(element) { + element = $(element); + var display = $(element).getStyle('display'); + if (display != 'none' && display != null) // Safari bug + return {width: element.offsetWidth, height: element.offsetHeight}; + + // All *Width and *Height properties give 0 on elements with display none, + // so enable the element temporarily + var els = element.style; + var originalVisibility = els.visibility; + var originalPosition = els.position; + var originalDisplay = els.display; + els.visibility = 'hidden'; + els.position = 'absolute'; + els.display = 'block'; + var originalWidth = element.clientWidth; + var originalHeight = element.clientHeight; + els.display = originalDisplay; + els.position = originalPosition; + els.visibility = originalVisibility; + return {width: originalWidth, height: originalHeight}; + }, + + makePositioned: function(element) { + element = $(element); + var pos = Element.getStyle(element, 'position'); + if (pos == 'static' || !pos) { + element._madePositioned = true; + element.style.position = 'relative'; + // Opera returns the offset relative to the positioning context, when an + // element is position relative but top and left have not been defined + if (window.opera) { + element.style.top = 0; + element.style.left = 0; + } + } + return element; + }, + + undoPositioned: function(element) { + element = $(element); + if (element._madePositioned) { + element._madePositioned = undefined; + element.style.position = + element.style.top = + element.style.left = + element.style.bottom = + element.style.right = ''; + } + return element; + }, + + makeClipping: function(element) { + element = $(element); + if (element._overflow) return element; + element._overflow = element.style.overflow || 'auto'; + if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') + element.style.overflow = 'hidden'; + return element; + }, + + undoClipping: function(element) { + element = $(element); + if (!element._overflow) return element; + element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; + element._overflow = null; + return element; + } +}; + +Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf}); + +Element._attributeTranslations = {}; + +Element._attributeTranslations.names = { + colspan: "colSpan", + rowspan: "rowSpan", + valign: "vAlign", + datetime: "dateTime", + accesskey: "accessKey", + tabindex: "tabIndex", + enctype: "encType", + maxlength: "maxLength", + readonly: "readOnly", + longdesc: "longDesc" +}; + +Element._attributeTranslations.values = { + _getAttr: function(element, attribute) { + return element.getAttribute(attribute, 2); + }, + + _flag: function(element, attribute) { + return $(element).hasAttribute(attribute) ? attribute : null; + }, + + style: function(element) { + return element.style.cssText.toLowerCase(); + }, + + title: function(element) { + var node = element.getAttributeNode('title'); + return node.specified ? node.nodeValue : null; + } +}; + +Object.extend(Element._attributeTranslations.values, { + href: Element._attributeTranslations.values._getAttr, + src: Element._attributeTranslations.values._getAttr, + disabled: Element._attributeTranslations.values._flag, + checked: Element._attributeTranslations.values._flag, + readonly: Element._attributeTranslations.values._flag, + multiple: Element._attributeTranslations.values._flag +}); + +Element.Methods.Simulated = { + hasAttribute: function(element, attribute) { + var t = Element._attributeTranslations; + attribute = t.names[attribute] || attribute; + return $(element).getAttributeNode(attribute).specified; + } +}; + +// IE is missing .innerHTML support for TABLE-related elements +if (document.all && !window.opera){ + Element.Methods.update = function(element, html) { + element = $(element); + html = typeof html == 'undefined' ? '' : html.toString(); + var tagName = element.tagName.toUpperCase(); + if (['THEAD','TBODY','TR','TD'].include(tagName)) { + var div = document.createElement('div'); + switch (tagName) { + case 'THEAD': + case 'TBODY': + div.innerHTML = '
' + html.stripScripts() + '
'; + depth = 2; + break; + case 'TR': + div.innerHTML = '' + html.stripScripts() + '
'; + depth = 3; + break; + case 'TD': + div.innerHTML = '
' + html.stripScripts() + '
'; + depth = 4; + } + $A(element.childNodes).each(function(node){ + element.removeChild(node) + }); + depth.times(function(){ div = div.firstChild }); + + $A(div.childNodes).each( + function(node){ element.appendChild(node) }); + } else { + element.innerHTML = html.stripScripts(); + } + setTimeout(function() {html.evalScripts()}, 10); + return element; + } +}; + +Object.extend(Element, Element.Methods); + +var _nativeExtensions = false; + +if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)) + ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) { + var className = 'HTML' + tag + 'Element'; + if(window[className]) return; + var klass = window[className] = {}; + klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__; + }); + +Element.addMethods = function(methods) { + Object.extend(Element.Methods, methods || {}); + + function copy(methods, destination, onlyIfAbsent) { + onlyIfAbsent = onlyIfAbsent || false; + var cache = Element.extend.cache; + for (var property in methods) { + var value = methods[property]; + if (!onlyIfAbsent || !(property in destination)) + destination[property] = cache.findOrStore(value); + } + } + + if (typeof HTMLElement != 'undefined') { + copy(Element.Methods, HTMLElement.prototype); + copy(Element.Methods.Simulated, HTMLElement.prototype, true); + copy(Form.Methods, HTMLFormElement.prototype); + [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) { + copy(Form.Element.Methods, klass.prototype); + }); + _nativeExtensions = true; + } +} + +var Toggle = new Object(); +Toggle.display = Element.toggle; + +/*--------------------------------------------------------------------------*/ + +Abstract.Insertion = function(adjacency) { + this.adjacency = adjacency; +} + +Abstract.Insertion.prototype = { + initialize: function(element, content) { + this.element = $(element); + this.content = content.stripScripts(); + + if (this.adjacency && this.element.insertAdjacentHTML) { + try { + this.element.insertAdjacentHTML(this.adjacency, this.content); + } catch (e) { + var tagName = this.element.tagName.toUpperCase(); + if (['TBODY', 'TR'].include(tagName)) { + this.insertContent(this.contentFromAnonymousTable()); + } else { + throw e; + } + } + } else { + this.range = this.element.ownerDocument.createRange(); + if (this.initializeRange) this.initializeRange(); + this.insertContent([this.range.createContextualFragment(this.content)]); + } + + setTimeout(function() {content.evalScripts()}, 10); + }, + + contentFromAnonymousTable: function() { + var div = document.createElement('div'); + div.innerHTML = '' + this.content + '
'; + return $A(div.childNodes[0].childNodes[0].childNodes); + } +} + +var Insertion = new Object(); + +Insertion.Before = Class.create(); +Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), { + initializeRange: function() { + this.range.setStartBefore(this.element); + }, + + insertContent: function(fragments) { + fragments.each((function(fragment) { + this.element.parentNode.insertBefore(fragment, this.element); + }).bind(this)); + } +}); + +Insertion.Top = Class.create(); +Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), { + initializeRange: function() { + this.range.selectNodeContents(this.element); + this.range.collapse(true); + }, + + insertContent: function(fragments) { + fragments.reverse(false).each((function(fragment) { + this.element.insertBefore(fragment, this.element.firstChild); + }).bind(this)); + } +}); + +Insertion.Bottom = Class.create(); +Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), { + initializeRange: function() { + this.range.selectNodeContents(this.element); + this.range.collapse(this.element); + }, + + insertContent: function(fragments) { + fragments.each((function(fragment) { + this.element.appendChild(fragment); + }).bind(this)); + } +}); + +Insertion.After = Class.create(); +Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), { + initializeRange: function() { + this.range.setStartAfter(this.element); + }, + + insertContent: function(fragments) { + fragments.each((function(fragment) { + this.element.parentNode.insertBefore(fragment, + this.element.nextSibling); + }).bind(this)); + } +}); + +/*--------------------------------------------------------------------------*/ + +Element.ClassNames = Class.create(); +Element.ClassNames.prototype = { + initialize: function(element) { + this.element = $(element); + }, + + _each: function(iterator) { + this.element.className.split(/\s+/).select(function(name) { + return name.length > 0; + })._each(iterator); + }, + + set: function(className) { + this.element.className = className; + }, + + add: function(classNameToAdd) { + if (this.include(classNameToAdd)) return; + this.set($A(this).concat(classNameToAdd).join(' ')); + }, + + remove: function(classNameToRemove) { + if (!this.include(classNameToRemove)) return; + this.set($A(this).without(classNameToRemove).join(' ')); + }, + + toString: function() { + return $A(this).join(' '); + } +}; + +Object.extend(Element.ClassNames.prototype, Enumerable); +var Selector = Class.create(); +Selector.prototype = { + initialize: function(expression) { + this.params = {classNames: []}; + this.expression = expression.toString().strip(); + this.parseExpression(); + this.compileMatcher(); + }, + + parseExpression: function() { + function abort(message) { throw 'Parse error in selector: ' + message; } + + if (this.expression == '') abort('empty expression'); + + var params = this.params, expr = this.expression, match, modifier, clause, rest; + while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) { + params.attributes = params.attributes || []; + params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''}); + expr = match[1]; + } + + if (expr == '*') return this.params.wildcard = true; + + while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) { + modifier = match[1], clause = match[2], rest = match[3]; + switch (modifier) { + case '#': params.id = clause; break; + case '.': params.classNames.push(clause); break; + case '': + case undefined: params.tagName = clause.toUpperCase(); break; + default: abort(expr.inspect()); + } + expr = rest; + } + + if (expr.length > 0) abort(expr.inspect()); + }, + + buildMatchExpression: function() { + var params = this.params, conditions = [], clause; + + if (params.wildcard) + conditions.push('true'); + if (clause = params.id) + conditions.push('element.readAttribute("id") == ' + clause.inspect()); + if (clause = params.tagName) + conditions.push('element.tagName.toUpperCase() == ' + clause.inspect()); + if ((clause = params.classNames).length > 0) + for (var i = 0, length = clause.length; i < length; i++) + conditions.push('element.hasClassName(' + clause[i].inspect() + ')'); + if (clause = params.attributes) { + clause.each(function(attribute) { + var value = 'element.readAttribute(' + attribute.name.inspect() + ')'; + var splitValueBy = function(delimiter) { + return value + ' && ' + value + '.split(' + delimiter.inspect() + ')'; + } + + switch (attribute.operator) { + case '=': conditions.push(value + ' == ' + attribute.value.inspect()); break; + case '~=': conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break; + case '|=': conditions.push( + splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect() + ); break; + case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break; + case '': + case undefined: conditions.push('element.hasAttribute(' + attribute.name.inspect() + ')'); break; + default: throw 'Unknown operator ' + attribute.operator + ' in selector'; + } + }); + } + + return conditions.join(' && '); + }, + + compileMatcher: function() { + this.match = new Function('element', 'if (!element.tagName) return false; \ + element = $(element); \ + return ' + this.buildMatchExpression()); + }, + + findElements: function(scope) { + var element; + + if (element = $(this.params.id)) + if (this.match(element)) + if (!scope || Element.childOf(element, scope)) + return [element]; + + scope = (scope || document).getElementsByTagName(this.params.tagName || '*'); + + var results = []; + for (var i = 0, length = scope.length; i < length; i++) + if (this.match(element = scope[i])) + results.push(Element.extend(element)); + + return results; + }, + + toString: function() { + return this.expression; + } +} + +Object.extend(Selector, { + matchElements: function(elements, expression) { + var selector = new Selector(expression); + return elements.select(selector.match.bind(selector)).map(Element.extend); + }, + + findElement: function(elements, expression, index) { + if (typeof expression == 'number') index = expression, expression = false; + return Selector.matchElements(elements, expression || '*')[index || 0]; + }, + + findChildElements: function(element, expressions) { + return expressions.map(function(expression) { + return expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], function(results, expr) { + var selector = new Selector(expr); + return results.inject([], function(elements, result) { + return elements.concat(selector.findElements(result || element)); + }); + }); + }).flatten(); + } +}); + +function $$() { + return Selector.findChildElements(document, $A(arguments)); +} +var Form = { + reset: function(form) { + $(form).reset(); + return form; + }, + + serializeElements: function(elements, getHash) { + var data = elements.inject({}, function(result, element) { + if (!element.disabled && element.name) { + var key = element.name, value = $(element).getValue(); + if (value != undefined) { + if (result[key]) { + if (result[key].constructor != Array) result[key] = [result[key]]; + result[key].push(value); + } + else result[key] = value; + } + } + return result; + }); + + return getHash ? data : Hash.toQueryString(data); + } +}; + +Form.Methods = { + serialize: function(form, getHash) { + return Form.serializeElements(Form.getElements(form), getHash); + }, + + getElements: function(form) { + return $A($(form).getElementsByTagName('*')).inject([], + function(elements, child) { + if (Form.Element.Serializers[child.tagName.toLowerCase()]) + elements.push(Element.extend(child)); + return elements; + } + ); + }, + + getInputs: function(form, typeName, name) { + form = $(form); + var inputs = form.getElementsByTagName('input'); + + if (!typeName && !name) return $A(inputs).map(Element.extend); + + for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { + var input = inputs[i]; + if ((typeName && input.type != typeName) || (name && input.name != name)) + continue; + matchingInputs.push(Element.extend(input)); + } + + return matchingInputs; + }, + + disable: function(form) { + form = $(form); + form.getElements().each(function(element) { + element.blur(); + element.disabled = 'true'; + }); + return form; + }, + + enable: function(form) { + form = $(form); + form.getElements().each(function(element) { + element.disabled = ''; + }); + return form; + }, + + findFirstElement: function(form) { + return $(form).getElements().find(function(element) { + return element.type != 'hidden' && !element.disabled && + ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); + }); + }, + + focusFirstElement: function(form) { + form = $(form); + form.findFirstElement().activate(); + return form; + } +} + +Object.extend(Form, Form.Methods); + +/*--------------------------------------------------------------------------*/ + +Form.Element = { + focus: function(element) { + $(element).focus(); + return element; + }, + + select: function(element) { + $(element).select(); + return element; + } +} + +Form.Element.Methods = { + serialize: function(element) { + element = $(element); + if (!element.disabled && element.name) { + var value = element.getValue(); + if (value != undefined) { + var pair = {}; + pair[element.name] = value; + return Hash.toQueryString(pair); + } + } + return ''; + }, + + getValue: function(element) { + element = $(element); + var method = element.tagName.toLowerCase(); + return Form.Element.Serializers[method](element); + }, + + clear: function(element) { + $(element).value = ''; + return element; + }, + + present: function(element) { + return $(element).value != ''; + }, + + activate: function(element) { + element = $(element); + element.focus(); + if (element.select && ( element.tagName.toLowerCase() != 'input' || + !['button', 'reset', 'submit'].include(element.type) ) ) + element.select(); + return element; + }, + + disable: function(element) { + element = $(element); + element.disabled = true; + return element; + }, + + enable: function(element) { + element = $(element); + element.blur(); + element.disabled = false; + return element; + } +} + +Object.extend(Form.Element, Form.Element.Methods); +var Field = Form.Element; +var $F = Form.Element.getValue; + +/*--------------------------------------------------------------------------*/ + +Form.Element.Serializers = { + input: function(element) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + return Form.Element.Serializers.inputSelector(element); + default: + return Form.Element.Serializers.textarea(element); + } + }, + + inputSelector: function(element) { + return element.checked ? element.value : null; + }, + + textarea: function(element) { + return element.value; + }, + + select: function(element) { + return this[element.type == 'select-one' ? + 'selectOne' : 'selectMany'](element); + }, + + selectOne: function(element) { + var index = element.selectedIndex; + return index >= 0 ? this.optionValue(element.options[index]) : null; + }, + + selectMany: function(element) { + var values, length = element.length; + if (!length) return null; + + for (var i = 0, values = []; i < length; i++) { + var opt = element.options[i]; + if (opt.selected) values.push(this.optionValue(opt)); + } + return values; + }, + + optionValue: function(opt) { + // extend element because hasAttribute may not be native + return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; + } +} + +/*--------------------------------------------------------------------------*/ + +Abstract.TimedObserver = function() {} +Abstract.TimedObserver.prototype = { + initialize: function(element, frequency, callback) { + this.frequency = frequency; + this.element = $(element); + this.callback = callback; + + this.lastValue = this.getValue(); + this.registerCallback(); + }, + + registerCallback: function() { + setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + onTimerEvent: function() { + var value = this.getValue(); + var changed = ('string' == typeof this.lastValue && 'string' == typeof value + ? this.lastValue != value : String(this.lastValue) != String(value)); + if (changed) { + this.callback(this.element, value); + this.lastValue = value; + } + } +} + +Form.Element.Observer = Class.create(); +Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.Observer = Class.create(); +Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { + getValue: function() { + return Form.serialize(this.element); + } +}); + +/*--------------------------------------------------------------------------*/ + +Abstract.EventObserver = function() {} +Abstract.EventObserver.prototype = { + initialize: function(element, callback) { + this.element = $(element); + this.callback = callback; + + this.lastValue = this.getValue(); + if (this.element.tagName.toLowerCase() == 'form') + this.registerFormCallbacks(); + else + this.registerCallback(this.element); + }, + + onElementEvent: function() { + var value = this.getValue(); + if (this.lastValue != value) { + this.callback(this.element, value); + this.lastValue = value; + } + }, + + registerFormCallbacks: function() { + Form.getElements(this.element).each(this.registerCallback.bind(this)); + }, + + registerCallback: function(element) { + if (element.type) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + Event.observe(element, 'click', this.onElementEvent.bind(this)); + break; + default: + Event.observe(element, 'change', this.onElementEvent.bind(this)); + break; + } + } + } +} + +Form.Element.EventObserver = Class.create(); +Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.EventObserver = Class.create(); +Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { + getValue: function() { + return Form.serialize(this.element); + } +}); +if (!window.Event) { + var Event = new Object(); +} + +Object.extend(Event, { + KEY_BACKSPACE: 8, + KEY_TAB: 9, + KEY_RETURN: 13, + KEY_ESC: 27, + KEY_LEFT: 37, + KEY_UP: 38, + KEY_RIGHT: 39, + KEY_DOWN: 40, + KEY_DELETE: 46, + KEY_HOME: 36, + KEY_END: 35, + KEY_PAGEUP: 33, + KEY_PAGEDOWN: 34, + + element: function(event) { + return event.target || event.srcElement; + }, + + isLeftClick: function(event) { + return (((event.which) && (event.which == 1)) || + ((event.button) && (event.button == 1))); + }, + + pointerX: function(event) { + return event.pageX || (event.clientX + + (document.documentElement.scrollLeft || document.body.scrollLeft)); + }, + + pointerY: function(event) { + return event.pageY || (event.clientY + + (document.documentElement.scrollTop || document.body.scrollTop)); + }, + + stop: function(event) { + if (event.preventDefault) { + event.preventDefault(); + event.stopPropagation(); + } else { + event.returnValue = false; + event.cancelBubble = true; + } + }, + + // find the first node with the given tagName, starting from the + // node the event was triggered on; traverses the DOM upwards + findElement: function(event, tagName) { + var element = Event.element(event); + while (element.parentNode && (!element.tagName || + (element.tagName.toUpperCase() != tagName.toUpperCase()))) + element = element.parentNode; + return element; + }, + + observers: false, + + _observeAndCache: function(element, name, observer, useCapture) { + if (!this.observers) this.observers = []; + if (element.addEventListener) { + this.observers.push([element, name, observer, useCapture]); + element.addEventListener(name, observer, useCapture); + } else if (element.attachEvent) { + this.observers.push([element, name, observer, useCapture]); + element.attachEvent('on' + name, observer); + } + }, + + unloadCache: function() { + if (!Event.observers) return; + for (var i = 0, length = Event.observers.length; i < length; i++) { + Event.stopObserving.apply(this, Event.observers[i]); + Event.observers[i][0] = null; + } + Event.observers = false; + }, + + observe: function(element, name, observer, useCapture) { + element = $(element); + useCapture = useCapture || false; + + if (name == 'keypress' && + (navigator.appVersion.match(/Konqueror|Safari|KHTML/) + || element.attachEvent)) + name = 'keydown'; + + Event._observeAndCache(element, name, observer, useCapture); + }, + + stopObserving: function(element, name, observer, useCapture) { + element = $(element); + useCapture = useCapture || false; + + if (name == 'keypress' && + (navigator.appVersion.match(/Konqueror|Safari|KHTML/) + || element.detachEvent)) + name = 'keydown'; + + if (element.removeEventListener) { + element.removeEventListener(name, observer, useCapture); + } else if (element.detachEvent) { + try { + element.detachEvent('on' + name, observer); + } catch (e) {} + } + } +}); + +/* prevent memory leaks in IE */ +if (navigator.appVersion.match(/\bMSIE\b/)) + Event.observe(window, 'unload', Event.unloadCache, false); +var Position = { + // set to true if needed, warning: firefox performance problems + // NOT neeeded for page scrolling, only if draggable contained in + // scrollable elements + includeScrollOffsets: false, + + // must be called before calling withinIncludingScrolloffset, every time the + // page is scrolled + prepare: function() { + this.deltaX = window.pageXOffset + || document.documentElement.scrollLeft + || document.body.scrollLeft + || 0; + this.deltaY = window.pageYOffset + || document.documentElement.scrollTop + || document.body.scrollTop + || 0; + }, + + realOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return [valueL, valueT]; + }, + + cumulativeOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + return [valueL, valueT]; + }, + + positionedOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + if(element.tagName=='BODY') break; + var p = Element.getStyle(element, 'position'); + if (p == 'relative' || p == 'absolute') break; + } + } while (element); + return [valueL, valueT]; + }, + + offsetParent: function(element) { + if (element.offsetParent) return element.offsetParent; + if (element == document.body) return element; + + while ((element = element.parentNode) && element != document.body) + if (Element.getStyle(element, 'position') != 'static') + return element; + + return document.body; + }, + + // caches x/y coordinate pair to use with overlap + within: function(element, x, y) { + if (this.includeScrollOffsets) + return this.withinIncludingScrolloffsets(element, x, y); + this.xcomp = x; + this.ycomp = y; + this.offset = this.cumulativeOffset(element); + + return (y >= this.offset[1] && + y < this.offset[1] + element.offsetHeight && + x >= this.offset[0] && + x < this.offset[0] + element.offsetWidth); + }, + + withinIncludingScrolloffsets: function(element, x, y) { + var offsetcache = this.realOffset(element); + + this.xcomp = x + offsetcache[0] - this.deltaX; + this.ycomp = y + offsetcache[1] - this.deltaY; + this.offset = this.cumulativeOffset(element); + + return (this.ycomp >= this.offset[1] && + this.ycomp < this.offset[1] + element.offsetHeight && + this.xcomp >= this.offset[0] && + this.xcomp < this.offset[0] + element.offsetWidth); + }, + + // within must be called directly before + overlap: function(mode, element) { + if (!mode) return 0; + if (mode == 'vertical') + return ((this.offset[1] + element.offsetHeight) - this.ycomp) / + element.offsetHeight; + if (mode == 'horizontal') + return ((this.offset[0] + element.offsetWidth) - this.xcomp) / + element.offsetWidth; + }, + + page: function(forElement) { + var valueT = 0, valueL = 0; + + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + + // Safari fix + if (element.offsetParent==document.body) + if (Element.getStyle(element,'position')=='absolute') break; + + } while (element = element.offsetParent); + + element = forElement; + do { + if (!window.opera || element.tagName=='BODY') { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } + } while (element = element.parentNode); + + return [valueL, valueT]; + }, + + clone: function(source, target) { + var options = Object.extend({ + setLeft: true, + setTop: true, + setWidth: true, + setHeight: true, + offsetTop: 0, + offsetLeft: 0 + }, arguments[2] || {}) + + // find page position of source + source = $(source); + var p = Position.page(source); + + // find coordinate system to use + target = $(target); + var delta = [0, 0]; + var parent = null; + // delta [0,0] will do fine with position: fixed elements, + // position:absolute needs offsetParent deltas + if (Element.getStyle(target,'position') == 'absolute') { + parent = Position.offsetParent(target); + delta = Position.page(parent); + } + + // correct by body offsets (fixes Safari) + if (parent == document.body) { + delta[0] -= document.body.offsetLeft; + delta[1] -= document.body.offsetTop; + } + + // set position + if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; + if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; + if(options.setWidth) target.style.width = source.offsetWidth + 'px'; + if(options.setHeight) target.style.height = source.offsetHeight + 'px'; + }, + + absolutize: function(element) { + element = $(element); + if (element.style.position == 'absolute') return; + Position.prepare(); + + var offsets = Position.positionedOffset(element); + var top = offsets[1]; + var left = offsets[0]; + var width = element.clientWidth; + var height = element.clientHeight; + + element._originalLeft = left - parseFloat(element.style.left || 0); + element._originalTop = top - parseFloat(element.style.top || 0); + element._originalWidth = element.style.width; + element._originalHeight = element.style.height; + + element.style.position = 'absolute'; + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.width = width + 'px'; + element.style.height = height + 'px'; + }, + + relativize: function(element) { + element = $(element); + if (element.style.position == 'relative') return; + Position.prepare(); + + element.style.position = 'relative'; + var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); + var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); + + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.height = element._originalHeight; + element.style.width = element._originalWidth; + } +} + +// Safari returns margins on body which is incorrect if the child is absolutely +// positioned. For performance reasons, redefine Position.cumulativeOffset for +// KHTML/WebKit only. +if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) { + Position.cumulativeOffset = function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == document.body) + if (Element.getStyle(element, 'position') == 'absolute') break; + + element = element.offsetParent; + } while (element); + + return [valueL, valueT]; + } +} + +Element.addMethods(); \ No newline at end of file diff --git a/www/extras/yui-ext/adapter/prototype/scriptaculous.js b/www/extras/yui-ext/adapter/prototype/scriptaculous.js new file mode 100644 index 000000000..b2b414edd --- /dev/null +++ b/www/extras/yui-ext/adapter/prototype/scriptaculous.js @@ -0,0 +1,59 @@ +/* + * Ext JS Library 1.0 Beta 1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +// script.aculo.us scriptaculous.js v1.7.0, Fri Jan 19 19:16:36 CET 2007 + +// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +var Scriptaculous = { + Version: '1.7.0', + require: function(libraryName) { + // inserting via DOM fails in Safari 2.0, so brute force approach + document.write(''); + }, + load: function() { + if((typeof Prototype=='undefined') || + (typeof Element == 'undefined') || + (typeof Element.Methods=='undefined') || + parseFloat(Prototype.Version.split(".")[0] + "." + + Prototype.Version.split(".")[1]) < 1.5) + throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0"); + + $A(document.getElementsByTagName("script")).findAll( function(s) { + return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/)) + }).each( function(s) { + var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,''); + var includes = s.src.match(/\?.*load=([a-z,]*)/); + (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each( + function(include) { Scriptaculous.require(path+include+'.js') }); + }); + } +} + +Scriptaculous.load(); \ No newline at end of file diff --git a/www/extras/yui-ext/adapter/yui/ext-yui-adapter.js b/www/extras/yui-ext/adapter/yui/ext-yui-adapter.js new file mode 100644 index 000000000..1c53bf657 --- /dev/null +++ b/www/extras/yui-ext/adapter/yui/ext-yui-adapter.js @@ -0,0 +1,12 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext={};window["undefined"]=window["undefined"];Ext.apply=function(o,c,_3){if(_3){Ext.apply(o,_3);}if(o&&c&&typeof c=="object"){for(var p in c){o[p]=c[p];}}return o;};(function(){var _5=0;var ua=navigator.userAgent.toLowerCase();var _7=document.compatMode=="CSS1Compat",_8=ua.indexOf("opera")>-1,_9=(/webkit|khtml/).test(ua),_a=ua.indexOf("msie")>-1,_b=ua.indexOf("msie 7")>-1,_c=!_9&&ua.indexOf("gecko")>-1,_d=_a&&!_7,_e=(ua.indexOf("windows")!=-1||ua.indexOf("win32")!=-1),_f=(ua.indexOf("macintosh")!=-1||ua.indexOf("mac os x")!=-1),_10=window.location.href.toLowerCase().indexOf("https")===0;if(_a&&!_b){try{document.execCommand("BackgroundImageCache",false,true);}catch(e){}}Ext.apply(Ext,{isStrict:_7,isSecure:_10,isReady:false,SSL_SECURE_URL:"javascript:false",BLANK_IMAGE_URL:"http:/"+"/extjs.com/s.gif",emptyFn:function(){},applyIf:function(o,c){if(o&&c){for(var p in c){if(typeof o[p]=="undefined"){o[p]=c[p];}}}return o;},addBehaviors:function(o){if(!Ext.isReady){Ext.onReady(function(){Ext.addBehaviors(o);});return;}var _15={};for(var b in o){var _17=b.split("@");if(_17[1]){var s=_17[0];if(!_15[s]){_15[s]=Ext.select(s);}_15[s].on(_17[1],o[b]);}}_15=null;},id:function(el,_1a){_1a=_1a||"ext-gen";el=Ext.getDom(el);var id=_1a+(++_5);return el?(el.id?el.id:(el.id=id)):id;},extend:function(){var io=function(o){for(var m in o){this[m]=o[m];}};return function(sb,sp,_21){if(typeof sp=="object"){_21=sp;sp=sb;sb=function(){sp.apply(this,arguments);};}var F=function(){},sbp,spp=sp.prototype;F.prototype=spp;sbp=sb.prototype=new F();sbp.constructor=sb;sb.superclass=spp;if(spp.constructor==Object.prototype.constructor){spp.constructor=sp;}sb.override=function(o){Ext.override(sb,o);};sbp.override=io;sbp.__extcls=sb;Ext.override(sb,_21);return sb;};}(),override:function(_26,_27){if(_27){var p=_26.prototype;for(var _29 in _27){p[_29]=_27[_29];}}},namespace:function(){var a=arguments,o=null,i,j,d,rt;for(i=0;i-1){return true;}else{return YAHOO.lang.isObject(obj)&&obj.constructor==Array;}},isBoolean:function(obj){return typeof obj=="boolean";},isFunction:function(obj){return typeof obj=="function";},isNull:function(obj){return obj===null;},isNumber:function(obj){return typeof obj=="number"&&isFinite(obj);},isObject:function(obj){return typeof obj=="object"||YAHOO.lang.isFunction(obj);},isString:function(obj){return typeof obj=="string";},isUndefined:function(obj){return typeof obj=="undefined";},hasOwnProperty:function(obj,_21){if(Object.prototype.hasOwnProperty){return obj.hasOwnProperty(_21);}return !YAHOO.lang.isUndefined(obj[_21])&&obj.constructor.prototype[_21]!==obj[_21];},extend:function(_22,_23,_24){var F=function(){};F.prototype=_23.prototype;_22.prototype=new F();_22.prototype.constructor=_22;_22.superclass=_23.prototype;if(_23.prototype.constructor==Object.prototype.constructor){_23.prototype.constructor=_23;}if(_24){for(var i in _24){_22.prototype[i]=_24[i];}}},augment:function(r,s){var rp=r.prototype,sp=s.prototype,a=arguments,i,p;if(a[2]){for(i=2;i-1),_8=(ua.indexOf("safari")>-1),_9=(!_7&&!_8&&ua.indexOf("gecko")>-1),_a=(!_7&&ua.indexOf("msie")>-1);var _b={HYPHEN:/(-[a-z])/i};var _c=function(_d){if(!_b.HYPHEN.test(_d)){return _d;}if(_5[_d]){return _5[_d];}while(_b.HYPHEN.exec(_d)){_d=_d.replace(RegExp.$1,RegExp.$1.substr(1).toUpperCase());}_5[_d]=_d;return _d;};if(document.defaultView&&document.defaultView.getComputedStyle){_2=function(el,_f){var _10=null;var _11=document.defaultView.getComputedStyle(el,"");if(_11){_10=_11[_c(_f)];}return el.style[_f]||_10;};}else{if(document.documentElement.currentStyle&&_a){_2=function(el,_13){switch(_c(_13)){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 _15=el.currentStyle?el.currentStyle[_13]:null;return (el.style[_13]||_15);}};}else{_2=function(el,_17){return el.style[_17];};}}if(_a){_3=function(el,_19,val){switch(_19){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[_19]=val;}};}else{_3=function(el,_1c,val){el.style[_1c]=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 _1f=[];for(var i=0,len=el.length;i=this.left&&_8d.right<=this.right&&_8d.top>=this.top&&_8d.bottom<=this.bottom);};YAHOO.util.Region.prototype.getArea=function(){return ((this.bottom-this.top)*(this.right-this.left));};YAHOO.util.Region.prototype.intersect=function(_8e){var t=Math.max(this.top,_8e.top);var r=Math.min(this.right,_8e.right);var b=Math.min(this.bottom,_8e.bottom);var l=Math.max(this.left,_8e.left);if(b>=t&&r>=l){return new YAHOO.util.Region(t,r,b,l);}else{return null;}};YAHOO.util.Region.prototype.union=function(_93){var t=Math.min(this.top,_93.top);var r=Math.max(this.right,_93.right);var b=Math.max(this.bottom,_93.bottom);var l=Math.min(this.left,_93.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.register("dom",YAHOO.util.Dom,{version:"2.2.0",build:"127"}); + +if(!YAHOO.util.Event){YAHOO.util.Event=function(){var _1=false;var _2=[];var _3=[];var _4=[];var _5=[];var _6=0;var _7=[];var _8=[];var _9=0;var _a=null;return {POLL_RETRYS:200,POLL_INTERVAL:20,EL:0,TYPE:1,FN:2,WFN:3,OBJ:3,ADJ_SCOPE:4,isSafari:(/KHTML/gi).test(navigator.userAgent),webkit:function(){var v=navigator.userAgent.match(/AppleWebKit\/([^ ]*)/);if(v&&v[1]){return v[1];}return null;}(),isIE:(!this.webkit&&!navigator.userAgent.match(/opera/gi)&&navigator.userAgent.match(/msie/gi)),_interval:null,startInterval:function(){if(!this._interval){var _c=this;var _d=function(){_c._tryPreloadAttach();};this._interval=setInterval(_d,this.POLL_INTERVAL);}},onAvailable:function(_e,_f,_10,_11){_7.push({id:_e,fn:_f,obj:_10,override:_11,checkReady:false});_6=this.POLL_RETRYS;this.startInterval();},onContentReady:function(_12,_13,_14,_15){_7.push({id:_12,fn:_13,obj:_14,override:_15,checkReady:true});_6=this.POLL_RETRYS;this.startInterval();},addListener:function(el,_17,fn,obj,_1a){if(!fn||!fn.call){return false;}if(this._isValidCollection(el)){var ok=true;for(var i=0,len=el.length;i=0){_3d=_2[_3e];}if(!el||!_3d){return false;}if(this.useLegacyEvent(el,_37)){var _3f=this.getLegacyIndex(el,_37);var _40=_5[_3f];if(_40){for(i=0,len=_40.length;i0);}var _62=[];for(var i=0,len=_7.length;i0){for(var i=0,len=_74.length;i0){j=_2.length;while(j){_7e=j-1;l=_2[_7e];if(l){EU.removeListener(l[EU.EL],l[EU.TYPE],l[EU.FN],_7e);}j=j-1;}l=null;EU.clearCache();}for(i=0,len=_4.length;i0){_a7=_a1[0];}ret=s.fn.call(_a6,_a7,s.obj);}else{ret=s.fn.call(_a6,this.type,_a1,s.obj);}if(false===ret){if(!this.silent){}return false;}}}return true;},unsubscribeAll:function(){for(var i=0,len=this.subscribers.length;i=200&&_16<300){_17=this.createResponseObject(o,_14.argument);if(_14.success){if(!_14.scope){_14.success(_17);}else{_14.success.apply(_14.scope,[_17]);}}}else{switch(_16){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:_17=this.createExceptionObject(o.tId,_14.argument,(_15?_15:false));if(_14.failure){if(!_14.scope){_14.failure(_17);}else{_14.failure.apply(_14.scope,[_17]);}}break;default:_17=this.createResponseObject(o,_14.argument);if(_14.failure){if(!_14.scope){_14.failure(_17);}else{_14.failure.apply(_14.scope,[_17]);}}}}this.releaseObject(o);_17=null;},createResponseObject:function(o,_19){var obj={};var _1b={};try{var _1c=o.conn.getAllResponseHeaders();var _1d=_1c.split("\n");for(var i=0;i<_1d.length;i++){var _1f=_1d[i].indexOf(":");if(_1f!=-1){_1b[_1d[i].substring(0,_1f)]=_1d[i].substring(_1f+2);}}}catch(e){}obj.tId=o.tId;obj.status=o.conn.status;obj.statusText=o.conn.statusText;obj.getResponseHeader=_1b;obj.getAllResponseHeaders=_1c;obj.responseText=o.conn.responseText;obj.responseXML=o.conn.responseXML;if(typeof _19!==undefined){obj.argument=_19;}return obj;},createExceptionObject:function(tId,_21,_22){var _23=0;var _24="communication failure";var _25=-1;var _26="transaction aborted";var obj={};obj.tId=tId;if(_22){obj.status=_25;obj.statusText=_26;}else{obj.status=_23;obj.statusText=_24;}if(_21){obj.argument=_21;}return obj;},initHeader:function(_28,_29,_2a){var _2b=(_2a)?this._default_headers:this._http_headers;if(_2b[_28]===undefined){_2b[_28]=_29;}else{_2b[_28]=_29+","+_2b[_28];}if(_2a){this._has_default_headers=true;}else{this._has_http_headers=true;}},setHeader:function(o){if(this._has_default_headers){for(var _2d in this._default_headers){if(YAHOO.lang.hasOwnProperty(this._default_headers,_2d)){o.conn.setRequestHeader(_2d,this._default_headers[_2d]);}}}if(this._has_http_headers){for(var _2d in this._http_headers){if(YAHOO.lang.hasOwnProperty(this._http_headers,_2d)){o.conn.setRequestHeader(_2d,this._http_headers[_2d]);}}delete this._http_headers;this._http_headers={};this._has_http_headers=false;}},resetDefaultHeaders:function(){delete this._default_headers;this._default_headers={};this._has_default_headers=false;},setForm:function(_2e,_2f,_30){this.resetFormState();var _31;if(typeof _2e=="string"){_31=(document.getElementById(_2e)||document.forms[_2e]);}else{if(typeof _2e=="object"){_31=_2e;}else{return;}}if(_2f){this.createFrame(_30?_30:null);this._isFormSubmit=true;this._isFileUpload=true;this._formNode=_31;return;}var _32,_33,_34,_35;var _36=false;for(var i=0;i<_31.elements.length;i++){_32=_31.elements[i];_35=_31.elements[i].disabled;_33=_31.elements[i].name;_34=_31.elements[i].value;if(!_35&&_33){switch(_32.type){case "select-one":case "select-multiple":for(var j=0;j<_32.options.length;j++){if(_32.options[j].selected){if(window.ActiveXObject){this._sFormData+=encodeURIComponent(_33)+"="+encodeURIComponent(_32.options[j].attributes["value"].specified?_32.options[j].value:_32.options[j].text)+"&";}else{this._sFormData+=encodeURIComponent(_33)+"="+encodeURIComponent(_32.options[j].hasAttribute("value")?_32.options[j].value:_32.options[j].text)+"&";}}}break;case "radio":case "checkbox":if(_32.checked){this._sFormData+=encodeURIComponent(_33)+"="+encodeURIComponent(_34)+"&";}break;case "file":case undefined:case "reset":case "button":break;case "submit":if(_36==false){this._sFormData+=encodeURIComponent(_33)+"="+encodeURIComponent(_34)+"&";_36=true;}break;default:this._sFormData+=encodeURIComponent(_33)+"="+encodeURIComponent(_34)+"&";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(_39){var _3a="yuiIO"+this._transaction_id;if(window.ActiveXObject){var io=document.createElement(" + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/AbstractGridView.jss.html b/www/extras/yui-ext/docs/output/AbstractGridView.jss.html new file mode 100644 index 000000000..45636fdb5 --- /dev/null +++ b/www/extras/yui-ext/docs/output/AbstractGridView.jss.html @@ -0,0 +1,89 @@ +AbstractGridView.js

AbstractGridView.js

Ext.grid.AbstractGridView = function(){
+	this.grid = null;
+	
+	this.events = {
+	    "beforerowremoved" : true,
+	    "beforerowsinserted" : true,
+	    "beforerefresh" : true,
+	    "rowremoved" : true,
+	    "rowsinserted" : true,
+	    "rowupdated" : true,
+	    "refresh" : true
+	};
+    Ext.grid.AbstractGridView.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.grid.AbstractGridView, Ext.util.Observable, {
+    rowClass : "x-grid-row",
+    cellClass : "x-grid-cell",
+    tdClass : "x-grid-td",
+    hdClass : "x-grid-hd",
+    splitClass : "x-grid-hd-split",
+    
+	init: function(grid){
+        this.grid = grid;
+		var cid = this.grid.container.id;
+        this.colSelector = "#" + cid + " ." + this.cellClass + "-";
+        this.tdSelector = "#" + cid + " ." + this.tdClass + "-";
+        this.hdSelector = "#" + cid + " ." + this.hdClass + "-";
+        this.splitSelector = "#" + cid + " ." + this.splitClass + "-";
+	},
+	
+	getColumnRenderers : function(){
+    	var renderers = [];
+    	var cm = this.grid.colModel;
+        var colCount = cm.getColumnCount();
+        for(var i = 0; i < colCount; i++){
+            renderers[i] = cm.getRenderer(i);
+        }
+        return renderers;
+    },
+    
+    getColumnIds : function(){
+    	var ids = [];
+    	var cm = this.grid.colModel;
+        var colCount = cm.getColumnCount();
+        for(var i = 0; i < colCount; i++){
+            ids[i] = cm.getColumnId(i);
+        }
+        return ids;
+    },
+    
+    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];
+    },
+    
+    /**
+     * 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 + " .x-grid-col-" + colIndex;
+        Ext.util.CSS.updateRule(selector, name, value);
+    },
+    
+    generateRules : function(cm){
+        var ruleBuf = [];
+        for(var i = 0, len = cm.getColumnCount(); i < len; i++){
+            var cid = cm.getColumnId(i);
+            ruleBuf.push(this.colSelector, cid, " {\n", cm.config[i].css, "}\n",
+                         this.tdSelector, cid, " {\n}\n",
+                         this.hdSelector, cid, " {\n}\n",
+                         this.splitSelector, cid, " {\n}\n");
+        }
+        return Ext.util.CSS.createStyleSheet(ruleBuf.join(""));
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/AbstractSelectionModel.jss.html b/www/extras/yui-ext/docs/output/AbstractSelectionModel.jss.html new file mode 100644 index 000000000..542c939a9 --- /dev/null +++ b/www/extras/yui-ext/docs/output/AbstractSelectionModel.jss.html @@ -0,0 +1,40 @@ +AbstractSelectionModel.js

AbstractSelectionModel.js

/**
+ @class Ext.grid.AbstractSelectionModel
+ @extends Ext.util.Observable
+ @constructor
+ */
+Ext.grid.AbstractSelectionModel = function(){
+    this.locked = false;
+    Ext.grid.AbstractSelectionModel.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.grid.AbstractSelectionModel, Ext.util.Observable,  {
+    /** @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;    
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Action.jss.html b/www/extras/yui-ext/docs/output/Action.jss.html new file mode 100644 index 000000000..b18c403ad --- /dev/null +++ b/www/extras/yui-ext/docs/output/Action.jss.html @@ -0,0 +1,196 @@ +Action.js

Action.js

// define the action interface
+Ext.form.Action = function(form, options){
+    this.form = form;
+    this.options = options || {};
+};
+
+Ext.form.Action.CLIENT_INVALID = 'client';
+Ext.form.Action.SERVER_INVALID = 'server';
+Ext.form.Action.CONNECT_FAILURE = 'connect';
+Ext.form.Action.LOAD_FAILURE = 'load';
+
+Ext.form.Action.prototype = {
+    type : 'default',
+    failureType : undefined,
+    response : undefined,
+    result : undefined,
+
+    // interface method
+    run : function(options){
+
+    },
+
+    // interface method
+    success : function(response){
+
+    },
+
+    // interface method
+    handleResponse : function(response){
+
+    },
+
+    // default connection failure
+    failure : function(response){
+        this.response = response;
+        this.failureType = Ext.form.Action.CONNECT_FAILURE;
+        this.form.afterAction(this, false);
+    },
+
+    processResponse : function(response){
+        this.response = response;
+        if(!response.responseText){
+            return true;
+        }
+        this.result = this.handleResponse(response);
+        return this.result;
+    },
+
+    // utility functions used internally
+    getUrl : function(appendParams){
+        var url = this.options.url || this.form.url || this.form.el.dom.action;
+        if(appendParams){
+            var p = this.getParams();
+            if(p){
+                url += (url.indexOf('?') != -1 ? '&' : '?') + p;
+            }
+        }
+        return url;
+    },
+
+    getMethod : function(){
+        return (this.options.method || this.form.method || this.form.el.dom.method || 'POST').toUpperCase();
+    },
+
+    getParams : function(){
+        var bp = this.form.baseParams;
+        var p = this.options.params;
+        if(p){
+            if(typeof p == "object"){
+                p = Ext.urlEncode(Ext.applyIf(p, bp));
+            }else if(typeof p == 'string' && bp){
+                p += '&' + Ext.urlEncode(bp);
+            }
+        }else if(bp){
+            p = Ext.urlEncode(bp);
+        }
+        return p;
+    },
+
+    createCallback : function(){
+        return {
+            success: this.success,
+            failure: this.failure,
+            scope: this,
+            timeout: (this.form.timeout*1000),
+            upload: this.form.fileUpload ? this.success : undefined
+        };
+    }
+};
+
+Ext.form.Action.Submit = function(form, options){
+    Ext.form.Action.Submit.superclass.constructor.call(this, form, options);
+};
+
+Ext.extend(Ext.form.Action.Submit, Ext.form.Action, {
+    type : 'submit',
+
+    run : function(){
+        var o = this.options;
+        var isPost = this.getMethod() == 'POST';
+        if(o.clientValidation === false || this.form.isValid()){
+            Ext.lib.Ajax.formRequest(
+                this.form.el.dom,
+                this.getUrl(!isPost),
+                this.createCallback(),
+                isPost ? this.getParams() : null, this.form.fileUpload, Ext.SSL_SECURE_URL);
+
+        }else if (o.clientValidation !== false){ // client validation failed
+            this.failureType = Ext.form.Action.CLIENT_INVALID;
+            this.form.afterAction(this, false);
+        }
+    },
+
+    success : function(response){
+        var result = this.processResponse(response);
+        if(result === true || result.success){
+            this.form.afterAction(this, true);
+            return;
+        }
+        if(result.errors){
+            this.form.markInvalid(result.errors);
+            this.failureType = Ext.form.Action.SERVER_INVALID;
+        }
+        this.form.afterAction(this, false);
+    },
+
+    handleResponse : function(response){
+        if(this.form.errorReader){
+            var rs = this.form.errorReader.read(response);
+            var errors = [];
+            if(rs.records){
+                for(var i = 0, len = rs.records.length; i < len; i++) {
+                    var r = rs.records[i];
+                    errors[i] = r.data;
+                }
+            }
+            if(errors.length < 1){
+                errors = null;
+            }
+            return {
+                success : rs.success,
+                errors : errors
+            };
+        }
+        return Ext.decode(response.responseText);
+    }
+});
+
+
+Ext.form.Action.Load = function(form, options){
+    Ext.form.Action.Load.superclass.constructor.call(this, form, options);
+    this.reader = this.form.reader;
+};
+
+Ext.extend(Ext.form.Action.Load, Ext.form.Action, {
+    type : 'load',
+
+    run : function(){
+        Ext.lib.Ajax.request(
+            this.getMethod(),
+            this.getUrl(false),
+            this.createCallback(),
+            this.getParams());
+    },
+
+    success : function(response){
+        var result = this.processResponse(response);
+        if(result === true || !result.success || !result.data){
+            this.failureType = Ext.form.Action.LOAD_FAILURE;
+            this.form.afterAction(this, false);
+            return;
+        }
+        this.form.clearInvalid();
+        this.form.setValues(result.data);
+        this.form.afterAction(this, true);
+    },
+
+    handleResponse : function(response){
+        if(this.form.reader){
+            var rs = this.form.reader.read(response);
+            var data = rs.records && rs.records[0] ? rs.records[0].data : null;
+            return {
+                success : rs.success,
+                data : data
+            };
+        }
+        return Ext.decode(response.responseText);
+    }
+});
+
+Ext.form.Action.ACTION_TYPES = {
+    'load' : Ext.form.Action.Load,
+    'submit' : Ext.form.Action.Submit
+};
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Adapter.jss.html b/www/extras/yui-ext/docs/output/Adapter.jss.html new file mode 100644 index 000000000..06f393300 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Adapter.jss.html @@ -0,0 +1,51 @@ +Adapter.js

Adapter.js

/**
+ * @class Ext.menu.Adapter
+ * @extends Ext.menu.BaseItem
+ * A base utility class that adapts a non-menu component so that it can be wrapped by a menu item and added to a menu.
+ * It provides basic rendering, activation management and enable/disable logic required to work in menus.
+ * @constructor
+ * Creates a new Adapter
+ * @param {Object} config Configuration options
+ */
+Ext.menu.Adapter = function(component, config){
+    Ext.menu.Adapter.superclass.constructor.call(this, config);
+    this.component = component;
+};
+Ext.extend(Ext.menu.Adapter, Ext.menu.BaseItem, {
+    // private
+    canActivate : true,
+
+    // private
+    onRender : function(container, position){
+        this.component.render(container);
+        this.el = this.component.getEl();
+    },
+
+    // private
+    activate : function(){
+        if(this.disabled){
+            return false;
+        }
+        this.component.focus();
+        this.fireEvent("activate", this);
+        return true;
+    },
+
+    // private
+    deactivate : function(){
+        this.fireEvent("deactivate", this);
+    },
+
+    // private
+    disable : function(){
+        this.component.disable();
+        Ext.menu.Adapter.superclass.disable.call(this);
+    },
+
+    // private
+    enable : function(){
+        this.component.enable();
+        Ext.menu.Adapter.superclass.enable.call(this);
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ArrayReader.jss.html b/www/extras/yui-ext/docs/output/ArrayReader.jss.html new file mode 100644 index 000000000..ed346ecfe --- /dev/null +++ b/www/extras/yui-ext/docs/output/ArrayReader.jss.html @@ -0,0 +1,73 @@ +ArrayReader.js

ArrayReader.js

/**
+ * @class Ext.data.ArrayReader
+ * @extends Ext.data.DataReader
+ * Data reader class to create an Array of Ext.data.Record objects from an Array.
+ * Each element of that Array represents a row of data fields. The
+ * fields are pulled into a Record object using as a subscript, the <em>mapping</em> property
+ * of the field definition if it exists, or the field's ordinal position in the definition.
+ * <p>
+ * The code below lists all configuration options.
+ * <pre><code>
+   var RecordDef = Ext.data.Record.create([
+       {name: 'name', mapping: 1},
+       {name: 'occupation', mapping: 2},
+   ]);
+   var myReader = new Ext.data.ArrayReader({
+       id: 0                     // The subscript within row Array that provides an ID for the Record (optional)
+   }, RecordDef);
+  </code></pre>
+ * <p>
+ * This would consume an Array like this:
+ * <pre><code>
+   [ [1, 'Bill', 'Gardener'], [2, 'Ben', 'Horticulturalist'] ]
+  </code></pre>
+ * @cfg {String} totalProperty Name of the property from which to retrieve the total number of records
+ * in the dataset. This is only needed if the whole dataset is not passed in one go, but is being
+ * paged from the remote server.
+ * @cfg {String} id (optional) The subscript within row Array that provides an ID for the Record
+ * @constructor
+ * Create a new JsonReader
+ * @param {Object} meta Metadata configuration options.
+ * @param {Array/Ext.data.Record constructor} recordType Either an Array of field definition objects,
+ * or an {@link Ext.data.Record} object created using {@link Ext.data.Record#create}.
+ */
+Ext.data.ArrayReader = function(meta, recordType){
+    Ext.data.ArrayReader.superclass.constructor.call(this, meta, recordType);
+};
+
+Ext.extend(Ext.data.ArrayReader, Ext.data.JsonReader, {
+    /**
+     * Create a data block containing Ext.data.Records from an XML document.
+     * @param {Object} o An object which contains an Array of row objects in the property specified
+     * in the config as 'root, and optionally a property, specified in the config as 'totalProperty'
+     * which contains the total size of the dataset.
+     * @return {Object} data A data block which is used by an Ext.data.Store object as
+     * a cache of Ext.data.Records.
+     */
+    readRecords : function(o){
+        var sid = this.meta ? this.meta.id : null;
+    	var recordType = this.recordType, fields = recordType.prototype.fields;
+    	var records = [];
+    	var root = o;
+	    for(var i = 0; i < root.length; i++){
+		    var n = root[i];
+	        var values = {};
+	        var id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null);
+	        for(var j = 0, jlen = fields.length; j < jlen; j++){
+                var f = fields.items[j];
+                var k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j;
+                var v = n[k] !== undefined ? n[k] : f.defaultValue;
+                v = f.convert(v);
+                values[f.name] = v;
+            }
+	        var record = new recordType(values, id);
+	        record.json = n;
+	        records[records.length] = record;
+	    }
+	    return {
+	        records : records,
+	        totalRecords : records.length
+	    };
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/AsyncTreeNode.jss.html b/www/extras/yui-ext/docs/output/AsyncTreeNode.jss.html new file mode 100644 index 000000000..5d2defc64 --- /dev/null +++ b/www/extras/yui-ext/docs/output/AsyncTreeNode.jss.html @@ -0,0 +1,107 @@ +AsyncTreeNode.js

AsyncTreeNode.js

/**
+ * @class Ext.tree.AsyncTreeNode
+ * @extends Ext.tree.TreeNode
+ * @cfg {TreeLoader} loader A TreeLoader to be used by this node (defaults to the loader defined on the tree)
+ * @constructor
+ * @param {Object/String} attributes The attributes/config for the node or just a string with the text for the node 
+ */
+ Ext.tree.AsyncTreeNode = function(config){
+    this.loaded = false;
+    this.loading = false;
+    Ext.tree.AsyncTreeNode.superclass.constructor.apply(this, arguments);
+    /**
+    * @event beforeload
+    * Fires before this node is loaded, return false to cancel
+    * @param {Node} this This node
+    */
+    this.addEvents({'beforeload':true, 'load': true});
+    /**
+    * @event load
+    * Fires when this node is loaded
+    * @param {Node} this This node
+    */
+// holder
+/***
+     * The loader used by this node (defaults to using the tree's defined loader)
+     * @type TreeLoader
+     * @property loader
+     */
+};
+Ext.extend(Ext.tree.AsyncTreeNode, Ext.tree.TreeNode, {
+    expand : function(deep, anim, callback){
+        if(this.loading){ // if an async load is already running, waiting til it's done
+            var timer;
+            var f = function(){
+                if(!this.loading){ // done loading
+                    clearInterval(timer);
+                    this.expand(deep, anim, callback);
+                }
+            }.createDelegate(this);
+            timer = setInterval(f, 200);
+            return;
+        }
+        if(!this.loaded){
+            if(this.fireEvent("beforeload", this) === false){
+                return;
+            }
+            this.loading = true;
+            this.ui.beforeLoad(this);
+            var loader = this.loader || this.attributes.loader || this.getOwnerTree().getLoader();
+            if(loader){
+                loader.load(this, this.loadComplete.createDelegate(this, [deep, anim, callback]));
+                return;
+            }
+        }
+        Ext.tree.AsyncTreeNode.superclass.expand.call(this, deep, anim, callback);
+    },
+    
+    /**
+     * Returns true if this node is currently loading
+     * @return {Boolean}
+     */
+    isLoading : function(){
+        return this.loading;  
+    },
+    
+    loadComplete : function(deep, anim, callback){
+        this.loading = false;
+        this.loaded = true;
+        this.ui.afterLoad(this);
+        this.fireEvent("load", this);
+        this.expand(deep, anim, callback);
+    },
+    
+    /**
+     * Returns true if this node has been loaded
+     * @return {Boolean}
+     */
+    isLoaded : function(){
+        return this.loaded;
+    },
+    
+    hasChildNodes : function(){
+        if(!this.isLeaf() && !this.loaded){
+            return true;
+        }else{
+            return Ext.tree.AsyncTreeNode.superclass.hasChildNodes.call(this);
+        }
+    },
+
+    /**
+     * Trigger a reload for this node
+     * @param {Function} callback
+     */
+    reload : function(callback){
+        this.collapse(false, false);
+        while(this.firstChild){
+            this.removeChild(this.firstChild);
+        }
+        this.childrenRendered = false;
+        this.loaded = false;
+        if(this.isHiddenRoot()){
+            this.expanded = false;
+        }
+        this.expand(false, false, callback);
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/AutoLayout.jss.html b/www/extras/yui-ext/docs/output/AutoLayout.jss.html new file mode 100644 index 000000000..0ea665849 --- /dev/null +++ b/www/extras/yui-ext/docs/output/AutoLayout.jss.html @@ -0,0 +1,27 @@ +AutoLayout.js

AutoLayout.js

Ext.layout.FitLayout = Ext.extend(Ext.layout.ContainerLayout, {
+    monitorResize:true,    
+    onLayout : function(ct, target){
+        Ext.layout.FitLayout.superclass.onLayout.call(this, ct, target);
+        var item = this.activeItem || ct.items.itemAt(0);
+        if(item){
+            item.setSize(target.getSize(true));
+        }
+    }
+});
+
+Ext.layout.CardLayout = Ext.extend(Ext.layout.FitLayout, {
+    renderHidden : true,
+    setActiveItem : function(item){
+        item = this.container.getComponent(item);
+        if(this.activeItem != item){
+            if(this.activeItem){
+                this.activeItem.hide();
+            }
+            this.activeItem = item;
+            item.show();
+            this.layout();
+        }
+    }
+});
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/BaseItem.jss.html b/www/extras/yui-ext/docs/output/BaseItem.jss.html new file mode 100644 index 000000000..1a142bda1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/BaseItem.jss.html @@ -0,0 +1,132 @@ +BaseItem.js

BaseItem.js

/**
+ * @class Ext.menu.BaseItem
+ * @extends Ext.Component
+ * The base class for all items that render into menus.  BaseItem provides default rendering, activated state
+ * management and base configuration options shared by all menu components.
+ * @constructor
+ * Creates a new BaseItem
+ * @param {Object} config Configuration options
+ */
+Ext.menu.BaseItem = function(config){
+    Ext.menu.BaseItem.superclass.constructor.call(this, config);
+
+    this.addEvents({
+        /**
+         * @event click
+         * Fires when this item is clicked
+         * @param {Ext.menu.BaseItem} this
+         * @param {Ext.EventObject} e
+         */
+        click: true,
+        /**
+         * @event activate
+         * Fires when this item is activated
+         * @param {Ext.menu.BaseItem} this
+         */
+        activate : true,
+        /**
+         * @event deactivate
+         * Fires when this item is deactivated
+         * @param {Ext.menu.BaseItem} this
+         */
+        deactivate : true
+    });
+
+    if(this.handler){
+        this.on("click", this.handler, this.scope, true);
+    }
+};
+
+Ext.extend(Ext.menu.BaseItem, Ext.Component, {
+    /**
+     * @cfg {Function} handler
+     * A function that will handle the click event of this menu item (defaults to undefined)
+     */
+// holder
+/***
+     * @cfg {Boolean} canActivate True if this item can be visually activated (defaults to false)
+     */
+    canActivate : false,
+    /**
+     * @cfg {String} activeClass The CSS class to use when the item becomes activated (defaults to "x-menu-item-active")
+     */
+    activeClass : "x-menu-item-active",
+    /**
+     * @cfg {Boolean} hideOnClick True to hide the containing menu after this item is clicked (defaults to true)
+     */
+    hideOnClick : true,
+    /**
+     * @cfg {Number} hideDelay Length of time in milliseconds to wait before hiding after a click (defaults to 100)
+     */
+    hideDelay : 100,
+
+    // private
+    ctype: "Ext.menu.BaseItem",
+
+    // private
+    actionMode : "container",
+
+    // private
+    render : function(container, parentMenu){
+        this.parentMenu = parentMenu;
+        Ext.menu.BaseItem.superclass.render.call(this, container);
+        this.container.menuItemId = this.id;
+    },
+
+    // private
+    onRender : function(container, position){
+        this.el = Ext.get(this.el);
+        container.dom.appendChild(this.el.dom);
+    },
+
+    // private
+    onClick : function(e){
+        if(!this.disabled && this.fireEvent("click", this, e) !== false
+                && this.parentMenu.fireEvent("itemclick", this, e) !== false){
+            this.handleClick(e);
+        }else{
+            e.stopEvent();
+        }
+    },
+
+    // private
+    activate : function(){
+        if(this.disabled){
+            return false;
+        }
+        var li = this.container;
+        li.addClass(this.activeClass);
+        this.region = li.getRegion().adjust(2, 2, -2, -2);
+        this.fireEvent("activate", this);
+        return true;
+    },
+
+    // private
+    deactivate : function(){
+        this.container.removeClass(this.activeClass);
+        this.fireEvent("deactivate", this);
+    },
+
+    // private
+    shouldDeactivate : function(e){
+        return !this.region || !this.region.contains(e.getPoint());
+    },
+
+    // private
+    handleClick : function(e){
+        if(this.hideOnClick){
+            this.parentMenu.hide.defer(this.hideDelay, this.parentMenu, [true]);
+        }
+    },
+
+    // private
+    expandMenu : function(autoActivate){
+        // do nothing
+    },
+
+    // private
+    hideMenu : function(){
+        // do nothing
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/BasicDialog.jss.html b/www/extras/yui-ext/docs/output/BasicDialog.jss.html new file mode 100644 index 000000000..4ba1ac4c4 --- /dev/null +++ b/www/extras/yui-ext/docs/output/BasicDialog.jss.html @@ -0,0 +1,1186 @@ +BasicDialog.js

BasicDialog.js

/**
+ * @class Ext.BasicDialog
+ * @extends Ext.util.Observable
+ * Lightweight Dialog Class.  The code below shows the creation of a typical dialog using existing HTML markup:
+ * <pre><code>
+    var dlg = new Ext.BasicDialog("my-dlg", {
+        height: 200,
+        width: 300,
+        minHeight: 100,
+        minWidth: 150,
+        modal: true,
+        proxyDrag: true,
+        shadow: true
+    });
+    dlg.addKeyListener(27, dlg.hide, dlg); // ESC can also close the dialog
+    dlg.addButton('OK', dlg.hide, dlg);    // Could call a save function instead of hiding
+    dlg.addButton('Cancel', dlg.hide, dlg);
+    dlg.show();
+  </code></pre>
+  <b>A Dialog should always be a direct child of the body element.</b>
+ * @cfg {Boolean/DomHelper} autoCreate True to auto create from scratch, or using a DomHelper Object (defaults to false)
+ * @cfg {String} title Default text to display in the title bar (defaults to null)
+ * @cfg {Number} width Width of the dialog in pixels (can also be set via CSS).  Determined by browser if unspecified.
+ * @cfg {Number} height Height of the dialog in pixels (can also be set via CSS).  Determined by browser if unspecified.
+ * @cfg {Number} x The default top page coordinate of the dialog (defaults to center screen)
+ * @cfg {Number} y The default left page coordinate of the dialog (defaults to center screen)
+ * @cfg {String/Element} animateTarget Id or element from which the dialog should animate while opening
+ * (defaults to null with no animation)
+ * @cfg {Boolean} resizable False to disable manual dialog resizing (defaults to true)
+ * @cfg {String} resizeHandles Which resize handles to display - see the {@link Ext.Resizable} handles config
+ * property for valid values (defaults to 'all')
+ * @cfg {Number} minHeight The minimum allowable height for a resizable dialog (defaults to 80)
+ * @cfg {Number} minWidth The minimum allowable width for a resizable dialog (defaults to 200)
+ * @cfg {Boolean} modal True to show the dialog modally, preventing user interaction with the rest of the page (defaults to false)
+ * @cfg {Boolean} autoScroll True to allow the dialog body contents to overflow and display scrollbars (defaults to false)
+ * @cfg {Boolean} closable False to remove the built-in top-right corner close button (defaults to true)
+ * @cfg {Boolean} collapsible False to remove the built-in top-right corner collapse button (defaults to true)
+ * @cfg {Boolean} constraintoviewport True to keep the dialog constrained within the visible viewport boundaries (defaults to true)
+ * @cfg {Boolean} syncHeightBeforeShow True to cause the dimensions to be recalculated before the dialog is shown (defaults to false)
+ * @cfg {Boolean} draggable False to disable dragging of the dialog within the viewport (defaults to true)
+ * @cfg {Boolean} autoTabs If true, all elements with class 'x-dlg-tab' will get automatically converted to tabs (defaults to false)
+ * @cfg {String} tabTag The tag name of tab elements, used when autoTabs = true (defaults to 'div')
+ * @cfg {Boolean} proxyDrag True to drag a lightweight proxy element rather than the dialog itself, used when
+ * draggable = true (defaults to false)
+ * @cfg {Boolean} fixedcenter True to ensure that anytime the dialog is shown or resized it gets centered (defaults to false)
+ * @cfg {Boolean/String} shadow True or "sides" for the default effect, "frame" for 4-way shadow, and "drop" for bottom-right
+ * shadow (defaults to false)
+ * @cfg {Number} shadowOffset The number of pixels to offset the shadow if displayed (defaults to 5)
+ * @cfg {String} buttonAlign Valid values are "left," "center" and "right" (defaults to "right")
+ * @cfg {Number} minButtonWidth Minimum width of all dialog buttons (defaults to 75)
+ * @cfg {Boolean} shim True to create an iframe shim that prevents selects from showing through (defaults to false)
+ * @constructor
+ * Create a new BasicDialog.
+ * @param {String/HTMLElement/Ext.Element} el The container element or DOM node, or its id
+ * @param {Object} config Configuration options
+ */
+Ext.BasicDialog = function(el, config){
+    this.el = Ext.get(el);
+    var dh = Ext.DomHelper;
+    if(!this.el && config && config.autoCreate){
+        if(typeof config.autoCreate == "object"){
+            if(!config.autoCreate.id){
+                config.autoCreate.id = el;
+            }
+            this.el = dh.append(document.body,
+                        config.autoCreate, true);
+        }else{
+            this.el = dh.append(document.body,
+                        {tag: "div", id: el, style:'visibility:hidden;'}, true);
+        }
+    }
+    el = this.el;                                                                                                                                                                                                                                                                                                                                                                                                  
+    el.setDisplayed(true);
+    el.hide = this.hideAction;
+    this.id = el.id;
+    el.addClass("x-dlg");
+
+    Ext.apply(this, config);
+
+    this.proxy = el.createProxy("x-dlg-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);
+    }
+    /** The header element @type Ext.Element */
+    this.header = el.child("/.x-dlg-hd");
+    /** The body element @type Ext.Element */
+    this.body = el.child("/.x-dlg-bd");
+    /** The footer element @type Ext.Element */
+    this.footer = el.child("/.x-dlg-ft");
+
+    if(!this.header){
+        this.header = el.createChild({tag: "div", cls:"x-dlg-hd", html: "&#160;"}, this.body ? this.body.dom : null);
+    }
+    if(!this.body){
+        this.body = el.createChild({tag: "div", cls:"x-dlg-bd"});
+    }
+
+    this.header.unselectable();
+    if(this.title){
+        this.header.update(this.title);
+    }
+    // this element allows the dialog to be focused for keyboard event
+    this.focusEl = el.createChild({tag: "a", href:"#", cls:"x-dlg-focus", tabIndex:"-1"});
+    this.focusEl.swallowEvent("click", true);
+
+    this.header.wrap({cls:"x-dlg-hd-right"}).wrap({cls:"x-dlg-hd-left"}, true);
+
+    // wrap the body and footer for special rendering
+    this.bwrap = this.body.wrap({tag: "div", cls:"x-dlg-dlg-body"});
+    if(this.footer){
+        this.bwrap.dom.appendChild(this.footer.dom);
+    }
+
+    this.bg = this.el.createChild({
+        tag: "div", cls:"x-dlg-bg",
+        html: '<div class="x-dlg-bg-left"><div class="x-dlg-bg-right"><div class="x-dlg-bg-center">&#160;</div></div></div>'
+    });
+    this.centerBg = this.bg.child("div.x-dlg-bg-center");
+
+
+    if(this.autoScroll !== false && !this.autoTabs){
+        this.body.setStyle("overflow", "auto");
+    }
+
+    this.toolbox = this.el.createChild({cls: "x-dlg-toolbox"});
+
+    if(this.closable !== false){
+        this.el.addClass("x-dlg-closable");
+        this.close = this.toolbox.createChild({cls:"x-dlg-close"});
+        this.close.on("click", this.closeClick, this);
+        this.close.addClassOnOver("x-dlg-close-over");
+    }
+    if(this.collapsible !== false){
+        this.collapseBtn = this.toolbox.createChild({cls:"x-dlg-collapse"});
+        this.collapseBtn.on("click", this.collapseClick, this);
+        this.collapseBtn.addClassOnOver("x-dlg-collapse-over");
+        this.header.on("dblclick", this.collapseClick, this);
+    }
+    if(this.resizable !== false){
+        this.el.addClass("x-dlg-resizable");
+        this.resizer = new Ext.Resizable(el, {
+            minWidth: this.minWidth || 80,
+            minHeight:this.minHeight || 80,
+            handles: this.resizeHandles || "all",
+            pinned: true
+        });
+        this.resizer.on("beforeresize", this.beforeResize, this);
+        this.resizer.on("resize", this.onResize, this);
+    }
+    if(this.draggable !== false){
+        el.addClass("x-dlg-draggable");
+        if (!this.proxyDrag) {
+            var dd = new Ext.dd.DD(el.dom.id, "WindowDrag");
+        }
+        else {
+            var dd = new Ext.dd.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);
+        dd.scroll = false;
+        this.dd = dd;
+    }
+    if(this.modal){
+        this.mask = dh.append(document.body, {tag: "div", cls:"x-dlg-mask"}, true);
+        this.mask.enableDisplayMode("block");
+        this.mask.hide();
+        this.el.addClass("x-dlg-modal");
+    }
+    if(this.shadow){
+        this.shadow = new Ext.Shadow({
+            mode : typeof this.shadow == "string" ? this.shadow : "sides",
+            offset : this.shadowOffset
+        });
+    }else{
+        this.shadowOffset = 0;
+    }
+    if(Ext.useShims && this.shim !== false){
+        this.shim = this.el.createShim();
+        this.shim.hide = this.hideAction;
+        this.shim.hide();
+    }else{
+        this.shim = false;
+    }
+    if(this.autoTabs){
+        this.initTabs();
+    }
+    this.addEvents({
+        /**
+         * @event keydown
+         * Fires when a key is pressed
+         * @param {Ext.BasicDialog} this
+         * @param {Ext.EventObject} e
+         */
+        "keydown" : true,
+        /**
+         * @event move
+         * Fires when this dialog is moved by the user.
+         * @param {Ext.BasicDialog} this
+         * @param {Number} x The new page X
+         * @param {Number} y The new page Y
+         */
+        "move" : true,
+        /**
+         * @event resize
+         * Fires when this dialog is resized by the user.
+         * @param {Ext.BasicDialog} this
+         * @param {Number} width The new width
+         * @param {Number} height The new height
+         */
+        "resize" : true,
+        /**
+         * @event beforehide
+         * Fires before this dialog is hidden.
+         * @param {Ext.BasicDialog} this
+         */
+        "beforehide" : true,
+        /**
+         * @event hide
+         * Fires when this dialog is hidden.
+         * @param {Ext.BasicDialog} this
+         */
+        "hide" : true,
+        /**
+         * @event beforeshow
+         * Fires before this dialog is shown.
+         * @param {Ext.BasicDialog} this
+         */
+        "beforeshow" : true,
+        /**
+         * @event show
+         * Fires when this dialog is shown.
+         * @param {Ext.BasicDialog} this
+         */
+        "show" : true
+    });
+    el.on("keydown", this.onKeyDown, this);
+    el.on("mousedown", this.toFront, this);
+    Ext.EventManager.onWindowResize(this.adjustViewport, this, true);
+    this.el.hide();
+    Ext.DialogManager.register(this);
+    Ext.BasicDialog.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.BasicDialog, Ext.util.Observable, {
+    shadowOffset: 5,
+    minHeight: 80,
+    minWidth: 200,
+    minButtonWidth: 75,
+    defaultButton: null,
+    buttonAlign: "right",
+    tabTag: 'div',
+    firstShow: true,
+
+    /**
+     * Sets the dialog title text
+     * @param {String} text The title text to display
+     * @return {Ext.BasicDialog} this
+     */
+    setTitle : function(text){
+        this.header.update(text);
+        return this;
+    },
+
+    // private
+    closeClick : function(){
+        this.hide();
+    },
+
+    // private
+    collapseClick : function(){
+        this[this.collapsed ? "expand" : "collapse"]();
+    },
+
+    /**
+     * Collapses the dialog to its minimized state (only the title bar is visible).
+     * Equivalent to the user clicking the collapse dialog button.
+     */
+    collapse : function(){
+        if(!this.collapsed){
+            this.collapsed = true;
+            this.el.addClass("x-dlg-collapsed");
+            this.restoreHeight = this.el.getHeight();
+            this.resizeTo(this.el.getWidth(), this.header.getHeight());
+        }
+    },
+
+    /**
+     * Expands a collapsed dialog back to its normal state.  Equivalent to the user
+     * clicking the expand dialog button.
+     */
+    expand : function(){
+        if(this.collapsed){
+            this.collapsed = false;
+            this.el.removeClass("x-dlg-collapsed");
+            this.resizeTo(this.el.getWidth(), this.restoreHeight);
+        }
+    },
+
+    /**
+     * Reinitializes the tabs component, clearing out old tabs and finding new ones.
+     * @return {Ext.TabPanel} The tabs component
+     */
+    initTabs : function(){
+        var tabs = this.getTabs();
+        while(tabs.getTab(0)){
+            tabs.removeTab(0);
+        }
+        this.el.select(this.tabTag+'.x-dlg-tab').each(function(el){
+            var dom = el.dom;
+            tabs.addTab(Ext.id(dom), dom.title);
+            dom.title = "";
+        });
+        tabs.activate(0);
+        return tabs;
+    },
+
+    // private
+    beforeResize : function(){
+        this.resizer.minHeight = Math.max(this.minHeight, this.getHeaderFooterHeight(true)+40);
+    },
+
+    // private
+    onResize : function(){
+        this.refreshSize();
+        this.syncBodyHeight();
+        this.adjustAssets();
+        this.focus();
+        this.fireEvent("resize", this, this.size.width, this.size.height);
+    },
+
+    // private
+    onKeyDown : function(e){
+        if(this.isVisible()){
+            this.fireEvent("keydown", this, e);
+        }
+    },
+
+    /**
+     * Resizes the dialog.
+     * @param {Number} width
+     * @param {Number} height
+     * @return {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();
+        }
+        this.fireEvent("resize", this, width, height);
+        return this;
+    },
+
+
+    /**
+     * Resizes the dialog to fit the specified content size.
+     * @param {Number} width
+     * @param {Number} height
+     * @return {Ext.BasicDialog} this
+     */
+    setContentSize : function(w, h){
+        h += this.getHeaderFooterHeight() + this.body.getMargins("tb");
+        w += this.body.getMargins("lr") + this.bwrap.getMargins("lr") + this.centerBg.getPadding("lr");
+        //if(!this.el.isBorderBox()){
+            h +=  this.body.getPadding("tb") + this.bwrap.getBorderWidth("tb") + this.body.getBorderWidth("tb") + this.el.getBorderWidth("tb");
+            w += this.body.getPadding("lr") + this.bwrap.getBorderWidth("lr") + this.body.getBorderWidth("lr") + this.bwrap.getPadding("lr") + this.el.getBorderWidth("lr");
+        //}
+        if(this.tabs){
+            h += this.tabs.stripWrap.getHeight() + this.tabs.bodyEl.getMargins("tb") + this.tabs.bodyEl.getPadding("tb");
+            w += this.tabs.bodyEl.getMargins("lr") + this.tabs.bodyEl.getPadding("lr");
+        }
+        this.resizeTo(w, h);
+        return this;
+    },
+
+    /**
+     * Adds a key listener for when this dialog is displayed.  This allows you to hook in a function that will be
+     * executed in response to a particular key being pressed while the dialog is active.
+     * @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 {Ext.BasicDialog} this
+     */
+    addKeyListener : function(key, fn, scope){
+        var keyCode, shift, ctrl, alt;
+        if(typeof key == "object" && !(key instanceof Array)){
+            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 (creates it if it doesn't exist).
+     * Note: If you wish to simply check for the existence of tabs without creating them,
+     * check for a null 'tabs' property.
+     * @return {Ext.TabPanel} The tabs component
+     */
+    getTabs : function(){
+        if(!this.tabs){
+            this.el.addClass("x-dlg-auto-tabs");
+            this.body.addClass(this.tabPosition == "bottom" ? "x-tabs-bottom" : "x-tabs-top");
+            this.tabs = new Ext.TabPanel(this.body.dom, this.tabPosition == "bottom");
+        }
+        return this.tabs;
+    },
+
+    /**
+     * Adds a button to the footer section of the dialog.
+     * @param {String/Object} config A string becomes the button text, an object can either be a Button config
+     * object or a valid 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 {Ext.Button} this
+     */
+    addButton : function(config, handler, scope){
+        var dh = Ext.DomHelper;
+        if(!this.footer){
+            this.footer = dh.append(this.bwrap, {tag: "div", cls:"x-dlg-ft"}, true);
+        }
+        if(!this.btnContainer){
+            var tb = this.footer.createChild({
+                tag:"div",
+                cls:"x-dlg-btns x-dlg-btns-"+this.buttonAlign,
+                html:'<table cellspacing="0"><tbody><tr></tr></tbody></table><div class="x-clear"></div>'
+            }, null, true);
+            this.btnContainer = tb.firstChild.firstChild.firstChild;
+        }
+        var bconfig = {
+            handler: handler,
+            scope: scope,
+            minWidth: this.minButtonWidth,
+            hideParent:true
+        };
+        if(typeof config == "string"){
+            bconfig.text = config;
+        }else{
+            if(config.tag){
+                bconfig.dhconfig = config;
+            }else{
+                Ext.apply(bconfig, config);
+            }
+        }
+        var btn = new Ext.Button(
+            this.btnContainer.appendChild(document.createElement("td")),
+            bconfig
+        );
+        this.syncBodyHeight();
+        if(!this.buttons){
+            /**
+             * Array of all the buttons that have been added to this dialog via addButton
+             * @type Array
+             */
+            this.buttons = [];
+        }
+        this.buttons.push(btn);
+        return btn;
+    },
+
+    /**
+     * Sets the default button to be focused when the dialog is displayed.
+     * @param {Ext.BasicDialog.Button} btn The button object returned by {@link #addButton}
+     * @return {Ext.BasicDialog} this
+     */
+    setDefaultButton : function(btn){
+        this.defaultButton = btn;
+        return this;
+    },
+
+    // private
+    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");
+        height += this.centerBg.getPadding("tb");
+        return height;
+    },
+
+    // private
+    syncBodyHeight : function(){
+        var bd = this.body, cb = this.centerBg, bw = this.bwrap;
+        var height = this.size.height - this.getHeaderFooterHeight(false);
+        bd.setHeight(height-bd.getMargins("tb"));
+        var hh = this.header.getHeight();
+        var h = this.size.height-hh;
+        cb.setHeight(h);
+        bw.setLeftTop(cb.getPadding("l"), hh+cb.getPadding("t"));
+        bw.setHeight(h-cb.getPadding("tb"));
+        bw.setWidth(this.el.getWidth(true)-cb.getPadding("lr"));
+        bd.setWidth(bw.getWidth(true));
+        if(this.tabs){
+            this.tabs.syncHeight();
+            if(Ext.isIE){
+                this.tabs.el.repaint();
+            }
+        }
+    },
+
+    /**
+     * Restores the previous state of the dialog if Ext.state is configured.
+     * @return {Ext.BasicDialog} this
+     */
+    restoreState : function(){
+        var box = Ext.state.Manager.get(this.stateId || (this.el.id + "-state"));
+        if(box && box.width){
+            this.xy = [box.x, box.y];
+            this.resizeTo(box.width, box.height);
+        }
+        return this;
+    },
+
+    // private
+    beforeShow : function(){
+        this.expand();
+        if(this.fixedcenter){
+            this.xy = this.el.getCenterXY(true);
+        }
+        if(this.modal){
+            Ext.get(document.body).addClass("x-body-masked");
+            this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
+            this.mask.show();
+        }
+        this.constrainXY();
+    },
+
+    // private
+    animShow : function(){
+        var b = Ext.get(this.animateTarget, true).getBox();
+        this.proxy.setSize(b.width, b.height);
+        this.proxy.setLocation(b.x, b.y);
+        this.proxy.show();
+        this.proxy.setBounds(this.xy[0], this.xy[1], this.size.width, this.size.height,
+                    true, .35, this.showEl.createDelegate(this));
+    },
+
+    /**
+     * Shows the dialog.
+     * @param {String/HTMLElement/Ext.Element} animateTarget (optional) Reset the animation target
+     * @return {Ext.BasicDialog} this
+     */
+    show : function(animateTarget){
+        if (this.fireEvent("beforeshow", this) === false){
+            return;
+        }
+        if(this.syncHeightBeforeShow){
+            this.syncBodyHeight();
+        }else if(this.firstShow){
+            this.firstShow = false;
+            this.syncBodyHeight(); // sync the height on the first show instead of in the constructor
+        }
+        this.animateTarget = animateTarget || this.animateTarget;
+        if(!this.el.isVisible()){
+            this.beforeShow();
+            if(this.animateTarget){
+                this.animShow();
+            }else{
+                this.showEl();
+            }
+        }
+        return this;
+    },
+
+    // private
+    showEl : function(){
+        this.proxy.hide();
+        this.el.setXY(this.xy);
+        this.el.show();
+        this.adjustAssets(true);
+        this.toFront();
+        this.focus();
+        // IE peekaboo bug - fix found by Dave Fenwick
+        if(Ext.isIE){
+            this.el.repaint();
+        }
+        this.fireEvent("show", this);
+    },
+
+    /**
+     * Focuses the dialog.  If a defaultButton is set, it will receive focus, otherwise the
+     * dialog itself will receive focus.
+     */
+    focus : function(){
+        if(this.defaultButton){
+            this.defaultButton.focus();
+        }else{
+            this.focusEl.focus();
+        }
+    },
+
+    // private
+    constrainXY : function(){
+        if(this.constraintoviewport !== false){
+            if(!this.viewSize){
+                if(this.container){
+                    var s = this.container.getSize();
+                    this.viewSize = [s.width, s.height];
+                }else{
+                    this.viewSize = [Ext.lib.Dom.getViewWidth(),Ext.lib.Dom.getViewHeight()];
+                }
+            }
+            var s = Ext.get(this.container||document).getScroll();
+
+            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+s.left){
+                x = vw - w;
+                moved = true;
+            }
+            if(y + h > vh+s.top){
+                y = vh - h;
+                moved = true;
+            }
+            // then make sure top/left isn't negative
+            if(x < s.left){
+                x = s.left;
+                moved = true;
+            }
+            if(y < s.top){
+                y = s.top;
+                moved = true;
+            }
+            if(moved){
+                // cache xy
+                this.xy = [x, y];
+                if(this.isVisible()){
+                    this.el.setLocation(x, y);
+                    this.adjustAssets();
+                }
+            }
+        }
+    },
+
+    // private
+    onDrag : function(){
+        if(!this.proxyDrag){
+            this.xy = this.el.getXY();
+            this.adjustAssets();
+        }
+    },
+
+    // private
+    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(this.el);
+            }
+            if(this.shim){
+                this.shim.show();
+            }
+        }
+        if(this.shadow && this.shadow.isVisible()){
+            this.shadow.show(this.el);
+        }
+        if(this.shim && this.shim.isVisible()){
+            this.shim.setBounds(x, y, w, h);
+        }
+    },
+
+    // private
+    adjustViewport : function(w, h){
+        if(!w || !h){
+            w = Ext.lib.Dom.getViewWidth();
+            h = Ext.lib.Dom.getViewHeight();
+        }
+        // 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(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
+        }
+        if(this.isVisible()){
+            this.constrainXY();
+        }
+    },
+
+    /**
+     * Destroys this dialog and all its supporting elements (including any tabs, shim,
+     * shadow, proxy, mask, etc.)  Also removes all event listeners.
+     * @param {Boolean} removeEl (optional) true to remove the element from the DOM
+     */
+    destroy : function(removeEl){
+        if(this.isVisible()){
+            this.animateTarget = null;
+            this.hide();
+        }
+        Ext.EventManager.removeResizeListener(this.adjustViewport, this);
+        if(this.tabs){
+            this.tabs.destroy(removeEl);
+        }
+        Ext.destroy(
+             this.shim,
+             this.proxy,
+             this.resizer,
+             this.close,
+             this.mask
+        );
+        if(this.dd){
+            this.dd.unreg();
+        }
+        if(this.buttons){
+           for(var i = 0, len = this.buttons.length; i < len; i++){
+               this.buttons[i].destroy();
+           }
+        }
+        this.el.removeAllListeners();
+        if(removeEl === true){
+            this.el.update("");
+            this.el.remove();
+        }
+        Ext.DialogManager.unregister(this);
+    },
+
+    // private
+    startMove : function(){
+        if(this.proxyDrag){
+            this.proxy.show();
+        }
+        if(this.constraintoviewport !== false){
+            this.dd.constrainTo(document.body, {right: this.shadowOffset, bottom: this.shadowOffset});
+        }
+    },
+
+    // private
+    endMove : function(){
+        if(!this.proxyDrag){
+            Ext.dd.DD.prototype.endDrag.apply(this.dd, arguments);
+        }else{
+            Ext.dd.DDProxy.prototype.endDrag.apply(this.dd, arguments);
+            this.proxy.hide();
+        }
+        this.refreshSize();
+        this.adjustAssets();
+        this.focus();
+        this.fireEvent("move", this, this.xy[0], this.xy[1]);
+    },
+
+    /**
+     * Brings this dialog to the front of any other visible dialogs
+     * @return {Ext.BasicDialog} this
+     */
+    toFront : function(){
+        Ext.DialogManager.bringToFront(this);
+        return this;
+    },
+
+    /**
+     * Sends this dialog to the back (under) of any other visible dialogs
+     * @return {Ext.BasicDialog} this
+     */
+    toBack : function(){
+        Ext.DialogManager.sendToBack(this);
+        return this;
+    },
+
+    /**
+     * Centers this dialog in the viewport
+     * @return {Ext.BasicDialog} this
+     */
+    center : function(){
+        var xy = this.el.getCenterXY(true);
+        this.moveTo(xy[0], xy[1]);
+        return this;
+    },
+
+    /**
+     * Moves the dialog's top-left corner to the specified point
+     * @param {Number} x
+     * @param {Number} y
+     * @return {Ext.BasicDialog} this
+     */
+    moveTo : function(x, y){
+        this.xy = [x,y];
+        if(this.isVisible()){
+            this.el.setXY(this.xy);
+            this.adjustAssets();
+        }
+        return this;
+    },
+
+    /**
+     * Aligns the dialog to the specified element
+     * @param {String/HTMLElement/Ext.Element} element The element to align to.
+     * @param {String} position The position to align to (see {@link Ext.Element#alignTo} for more details).
+     * @param {Array} offsets (optional) Offset the positioning by [x, y]
+     * @return {Ext.BasicDialog} this
+     */
+    alignTo : function(element, position, offsets){
+        this.xy = this.el.getAlignToXY(element, position, offsets);
+        if(this.isVisible()){
+            this.el.setXY(this.xy);
+            this.adjustAssets();
+        }
+        return this;
+    },
+
+    /**
+     * Anchors an element to another element and realigns it when the window is resized.
+     * @param {String/HTMLElement/Ext.Element} element The element to align to.
+     * @param {String} position The position to align to (see {@link Ext.Element#alignTo} for more details)
+     * @param {Array} offsets (optional) Offset the positioning by [x, y]
+     * @param {Boolean/Number} monitorScroll (optional) true to monitor body scroll and reposition. If this parameter
+     * is a number, it is used as the buffer delay (defaults to 50ms).
+     * @return {Ext.BasicDialog} this
+     */
+    anchorTo : function(el, alignment, offsets, monitorScroll){
+        var action = function(){
+            this.alignTo(el, alignment, offsets);
+        };
+        Ext.EventManager.onWindowResize(action, this);
+        var tm = typeof monitorScroll;
+        if(tm != 'undefined'){
+            Ext.EventManager.on(window, 'scroll', action, this,
+                {buffer: tm == 'number' ? monitorScroll : 50});
+        }
+        action.call(this);
+        return this;
+    },
+
+    /**
+     * Returns true if the dialog is visible
+     * @return {Boolean}
+     */
+    isVisible : function(){
+        return this.el.isVisible();
+    },
+
+    // private
+    animHide : function(callback){
+        var b = Ext.get(this.animateTarget).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]));
+    },
+
+    /**
+     * Hides the dialog.
+     * @param {Function} callback (optional) Function to call when the dialog is hidden
+     * @return {Ext.BasicDialog} this
+     */
+    hide : function(callback){
+        if (this.fireEvent("beforehide", this) === false){
+            return;
+        }
+        if(this.shadow){
+            this.shadow.hide();
+        }
+        if(this.shim) {
+          this.shim.hide();
+        }
+        if(this.animateTarget){
+           this.animHide(callback);
+        }else{
+            this.el.hide();
+            this.hideEl(callback);
+        }
+        return this;
+    },
+
+    // private
+    hideEl : function(callback){
+        this.proxy.hide();
+        if(this.modal){
+            this.mask.hide();
+            Ext.get(document.body).removeClass("x-body-masked");
+        }
+        this.fireEvent("hide", this);
+        if(typeof callback == "function"){
+            callback();
+        }
+    },
+
+    // private
+    hideAction : function(){
+        this.setLeft("-10000px");
+        this.setTop("-10000px");
+        this.setStyle("visibility", "hidden");
+    },
+
+    // private
+    refreshSize : function(){
+        this.size = this.el.getSize();
+        this.xy = this.el.getXY();
+        Ext.state.Manager.set(this.stateId || this.el.id + "-state", this.el.getBox());
+    },
+
+    // private
+    // z-index is managed by the DialogManager and may be overwritten at any time
+    setZIndex : function(index){
+        if(this.modal){
+            this.mask.setStyle("z-index", index);
+        }
+        if(this.shim){
+            this.shim.setStyle("z-index", ++index);
+        }
+        if(this.shadow){
+            this.shadow.setZIndex(++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 {Ext.Element} The underlying dialog Element
+     */
+    getEl : function(){
+        return this.el;
+    }
+});
+
+/**
+ * @class Ext.DialogManager
+ * Provides global access to BasicDialogs that have been created and
+ * support for z-indexing (layering) multiple open dialogs.
+ */
+Ext.DialogManager = function(){
+    var list = {};
+    var accessList = [];
+    var front = null;
+
+    // private
+    var sortDialogs = function(d1, d2){
+        return (!d1._lastAccess || d1._lastAccess < d2._lastAccess) ? -1 : 1;
+    };
+
+    // private
+    var orderDialogs = function(){
+        accessList.sort(sortDialogs);
+        var seed = Ext.DialogManager.zseed;
+        for(var i = 0, len = accessList.length; i < len; i++){
+            var dlg = accessList[i];
+            if(dlg){
+                dlg.setZIndex(seed + (i*10));
+            }
+        }
+    };
+
+    return {
+        /**
+         * The starting z-index for BasicDialogs (defaults to 9000)
+         * @type Number The z-index value
+         */
+        zseed : 9000,
+
+        // private
+        register : function(dlg){
+            list[dlg.id] = dlg;
+            accessList.push(dlg);
+        },
+
+        // private
+        unregister : function(dlg){
+            delete list[dlg.id];
+            if(!accessList.indexOf){
+                for(var i = 0, len = accessList.length; i < len; i++){
+                    if(accessList[i] == dlg){
+                        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 {Ext.BasicDialog} this
+         */
+        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 {Ext.BasicDialog} this
+         */
+        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 {Ext.BasicDialog} this
+         */
+        sendToBack : function(dlg){
+            dlg = this.get(dlg);
+            dlg._lastAccess = -(new Date().getTime());
+            orderDialogs();
+            return dlg;
+        },
+
+        /**
+         * Hides all dialogs
+         */
+        hideAll : function(){
+            for(var id in list){
+                if(list[id] && typeof list[id] != "function" && list[id].isVisible()){
+                    list[id].hide();
+                }
+            }
+        }
+    };
+}();
+
+/**
+ * @class Ext.LayoutDialog
+ * @extends 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 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 Ext.BorderLayout("dl-inner", {
+        east: {
+            initialSize: 200,
+            autoScroll:true,
+            split:true
+        },
+        center: {
+            autoScroll:true
+        }
+    });
+    innerLayout.beginUpdate();
+    innerLayout.add("east", new Ext.ContentPanel("dl-details"));
+    innerLayout.add("center", new Ext.ContentPanel("selection-panel"));
+    innerLayout.endUpdate(true);
+
+    var layout = dialog.getLayout();
+    layout.beginUpdate();
+    layout.add("center", new Ext.ContentPanel("standard-panel",
+                        {title: "Download the Source", fitToFrame:true}));
+    layout.add("center", new Ext.NestedLayoutPanel(innerLayout,
+               {title: "Build your own ext.js"}));
+    layout.getRegion("center").showPanel(sp);
+    layout.endUpdate();</code></pre>
+    * @constructor
+    * @param {String/HTMLElement/Ext.Element} el The id of or container element
+    * @param {Object} config configuration options
+  */
+Ext.LayoutDialog = function(el, config){
+    config.autoTabs = false;
+    Ext.LayoutDialog.superclass.constructor.call(this, el, config);
+    this.body.setStyle({overflow:"hidden", position:"relative"});
+    this.layout = new Ext.BorderLayout(this.body.dom, config);
+    this.layout.monitorWindowResize = false;
+    this.el.addClass("x-dlg-auto-layout");
+    // fix case when center region overwrites center function
+    this.center = Ext.BasicDialog.prototype.center;
+    this.on("show", this.layout.layout, this.layout, true);
+};
+Ext.extend(Ext.LayoutDialog, Ext.BasicDialog, {
+    /**
+     * Ends update of the layout <strike>and resets display to none</strike>. Use standard beginUpdate/endUpdate on the layout.
+     * @deprecated
+     */
+    endUpdate : function(){
+        this.layout.endUpdate();
+    },
+
+    /**
+     * Begins an update of the layout <strike>and sets display to block and visibility to hidden</strike>. Use standard beginUpdate/endUpdate on the layout.
+     *  @deprecated
+     */
+    beginUpdate : function(){
+        this.layout.beginUpdate();
+    },
+
+    /**
+     * Get the BorderLayout for this dialog
+     * @return {Ext.BorderLayout}
+     */
+    getLayout : function(){
+        return this.layout;
+    },
+
+    showEl : function(){
+        Ext.LayoutDialog.superclass.showEl.apply(this, arguments);
+        if(Ext.isIE7){
+            this.layout.layout();
+        }
+    },
+
+    // private
+    // Use the syncHeightBeforeShow config option to control this automatically
+    syncBodyHeight : function(){
+        Ext.LayoutDialog.superclass.syncBodyHeight.call(this);
+        if(this.layout){this.layout.layout();}
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/BasicForm.jss.html b/www/extras/yui-ext/docs/output/BasicForm.jss.html new file mode 100644 index 000000000..dc87e2f61 --- /dev/null +++ b/www/extras/yui-ext/docs/output/BasicForm.jss.html @@ -0,0 +1,361 @@ +BasicForm.js

BasicForm.js

/**
+ * @class Ext.form.BasicForm
+ * @extends Ext.util.Observable
+ * Supplies the functionality to do "actions" on forms and initialize Ext.form.Field types on existing markup.
+ * @constructor
+ * @param {String/HTMLElement/Ext.Element} el The form element or its id
+ * @param {Object} config Configuration options
+ */
+Ext.form.BasicForm = function(el, config){
+    Ext.apply(this, config);
+    /*
+     * The Ext.form.Field items in this form
+     * @type MixedCollection
+     */
+    this.items = new Ext.util.MixedCollection(false, function(o){
+        return o.id || (o.id = Ext.id());
+    });
+    this.addEvents({
+        /**
+         * @event beforeaction
+         * Fires before any action is performed. Return false to cancel the action.
+         * @param {Form} this
+         * @param {Action} action The action to be performed
+         */
+        beforeaction: true,
+        /**
+         * @event actionfailed
+         * Fires when an action fails
+         * @param {Form} this
+         * @param {Action} action The action that failed
+         */
+        actionfailed : true,
+        /**
+         * @event actioncomplete 
+         * Fires when an action is completed
+         * @param {Form} this
+         * @param {Action} action The action that completed
+         */
+        actioncomplete : true
+    });
+    if(el){
+        this.initEl(el);
+    }
+    Ext.form.BasicForm.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.form.BasicForm, Ext.util.Observable, {
+    /**
+     * @cfg {String} method
+     * The request method to use (GET or POST) for form actions if one isn't supplied in the action options
+     */
+// holder
+/***
+     * @cfg {DataReader} reader
+     * An Ext.data.DataReader (e.g. {@link Ext.data.XmlReader} to be used to read data when executing "load" actions.
+     * This is completely optional as there is built-in support for processing JSON.
+     */
+// holder
+/***
+     * @cfg {DataReader} errorReader
+     * An Ext.data.DataReader (e.g. {@link Ext.data.XmlReader} to be used to read data when reading validation errors on "submit" actions.
+     * This is completely optional as there is built-in support for processing JSON.
+     */
+// holder
+/***
+     * @cfg {String} url
+     * The url to use for form actions if one isn't supplied in the action options
+     */
+// holder
+/***
+     * @cfg {Boolean} fileUpload
+     * Set to true if this form is a file upload (YUI adapter only)
+     */
+// holder
+/***
+     * @cfg {Object} baseParams
+     * Parameters to pass with all requests. e.g. baseParams: {id: '123', foo: 'bar'}
+     */
+// holder
+/***
+     * @cfg {Number} timeout
+     */
+    timeout: 30,
+
+    // private
+    activeAction : null,
+
+    /**
+     * By default wait messages are displayed with Ext.MessageBox.wait. You can target a specific
+     * element by passing it or its id or mask the form itself by passing in true.
+     * @type Mixed
+     */
+    waitMsgTarget : undefined,
+
+    // private
+    initEl : function(el){
+        this.el = Ext.get(el);
+        this.id = this.el.id || Ext.id();
+        this.el.on('submit', this.onSubmit, this);
+        this.el.addClass('x-form');
+    },
+
+    // private
+    onSubmit : function(e){
+        e.stopEvent();
+    },
+
+    /**
+     * Returns true is client-side validation on the form is successful
+     * @return Boolean
+     */
+    isValid : function(){
+        var valid = true;
+        this.items.each(function(f){
+           if(!f.validate()){
+               valid = false;
+           }
+        });
+        return valid;
+    },
+
+    /**
+     * Performs a predefined action (submit or load) or custom actions you define on this form
+     * @param {String} actionName The name of the action type
+     * @param {Object} options The options to pass to the action
+     */
+    doAction : function(action, options){
+        if(typeof action == 'string'){
+            action = new Ext.form.Action.ACTION_TYPES[action](this, options);
+        }
+        if(this.fireEvent('beforeaction', this, action) !== false){
+            this.beforeAction(action);
+            action.run.defer(100, action);
+        }
+    },
+
+    /**
+     * Shortcut to do a submit action
+     * @param {Object} options The options to pass to the action
+     */
+    submit : function(options){
+        this.doAction('submit', options);
+    },
+
+    /**
+     * Shortcut to do a load action
+     * @param {Object} options The options to pass to the action
+     */
+    load : function(options){
+        this.doAction('load', options);
+    },
+
+    /**
+     * Persists the values in this form into the passed Ext.data.Record object in a beginEdit/endEdit block.
+     * @param {Record} record The record to edit
+     */
+    updateRecord : function(record){
+        record.beginEdit();
+        var fs = record.fields;
+        fs.each(function(f){
+            var field = this.findField(f.name);
+            if(field){
+                record.set(f.name, field.getValue());
+            }
+        }, this);
+        record.endEdit();
+    },
+
+    // private
+    beforeAction : function(action){
+        var o = action.options;
+        if(o.waitMsg){
+            if(this.waitMsgTarget === true){
+                this.el.mask(o.waitMsg, 'x-mask-loading');
+            }else if(this.waitMsgTarget){
+                this.waitMsgTarget = Ext.get(this.waitMsgTarget);
+                this.waitMsgTarget.mask(o.waitMsg, 'x-mask-loading');
+            }else{
+                Ext.MessageBox.wait(o.waitMsg, o.waitTitle || this.waitTitle || 'Please Wait...');
+            }
+        }
+    },
+
+    // private
+    afterAction : function(action, success){
+        this.activeAction = null;
+        var o = action.options;
+        if(o.waitMsg){
+            if(this.waitMsgTarget === true){
+                this.el.unmask();
+            }else if(this.waitMsgTarget){
+                this.waitMsgTarget.unmask();
+            }else{
+                Ext.MessageBox.updateProgress(1);
+                Ext.MessageBox.hide();
+            }
+        }
+        if(success){
+            if(o.reset){
+                this.reset();
+            }
+            Ext.callback(o.success, o.scope, [this, action]);
+            this.fireEvent('actioncomplete', this, action);
+        }else{
+            Ext.callback(o.failure, o.scope, [this, action]);
+            this.fireEvent('actionfailed', this, action);
+        }
+    },
+
+    /**
+     * Find a Ext.form.Field in this form by id, dataIndex, name or hiddenName
+     * @param {String} id The value to search for
+     * @return Field
+     */
+    findField : function(id){
+        var field = this.items.get(id);
+        if(!field){
+            this.items.each(function(f){
+                if(f.isFormField && (f.dataIndex == id || f.id == id || f.getName() == id)){
+                    field = f;
+                    return false;
+                }
+            });
+        }
+        return field || null;
+    },
+
+
+    /**
+     * Mark fields in this form invalid in bulk.
+     * @param {Array/Object} errors Either an array in the form [{id:'fieldId', msg:'The message'},...] or an object hash of {id: msg, id2: msg2}
+     */
+    markInvalid : function(errors){
+        if(errors instanceof Array){
+            for(var i = 0, len = errors.length; i < len; i++){
+                var fieldError = errors[i];
+                var f = this.findField(fieldError.id);
+                if(f){
+                    f.markInvalid(fieldError.msg);
+                }
+            }
+        }else{
+            var field, id;
+            for(id in errors){
+                if(typeof errors[id] != 'function' && (field = this.findField(id))){
+                    field.markInvalid(errors[id]);
+                }
+            }
+        }
+    },
+
+    /**
+     * Set values for fields in this form in bulk.
+     * @param {Array/Object} values Either an array in the form [{id:'fieldId', value:'foo'},...] or an object hash of {id: value, id2: value2}
+     */
+    setValues : function(values){
+        if(values instanceof Array){ // array of objects
+            for(var i = 0, len = values.length; i < len; i++){
+                var v = values[i];
+                var f = this.findField(v.id);
+                if(f){
+                    f.setValue(v.value);
+                }
+            }
+        }else{ // object hash
+            var field, id;
+            for(id in values){
+                if(typeof values[id] != 'function' && (field = this.findField(id))){
+                    field.setValue(values[id]);
+                }
+            }
+        }
+    },
+
+    /**
+     * Returns the fields in this form as an object with key value pair. If multiple fields exist with the same name
+     * they are returned as an array.
+     * @param {Boolean} asString
+     * @return {Object}
+     */
+    getValues : function(asString){
+        var fs = Ext.lib.Ajax.serializeForm(this.el.dom);
+        if(asString === true){
+            return fs;
+        }
+        return Ext.urlDecode(fs);
+    },
+
+    /**
+     * Clears all invalid messages in this form
+     */
+    clearInvalid : function(){
+        this.items.each(function(f){
+           f.clearInvalid();
+        });
+    },
+
+    /**
+     * Resets this form
+     */
+    reset : function(){
+        this.items.each(function(f){
+            f.reset();
+        });
+    },
+
+    /**
+     * Add Ext.form components to this form
+     * @param {Field} field1
+     * @param {Field} field2 (optional)
+     * @param {Field} etc (optional)
+     */
+    add : function(){
+        this.items.addAll(Array.prototype.slice.call(arguments, 0));
+    },
+
+
+    /**
+     * Removes a field from the items collection (does NOT remove its markup)
+     * @param {Field} field
+     */
+    remove : function(field){
+        this.items.remove(field);
+    },
+
+    /**
+     * Looks at the fields in this form, checks them for an id attribute
+     * and call applyTo on the existing dom element with that id
+     */
+    render : function(){
+        this.items.each(function(f){
+            if(f.isFormField && !f.rendered && document.getElementById(f.id)){ // if the element exists
+                f.applyTo(f.id);
+            }
+        });
+    },
+
+    /**
+     * Calls {@link Ext#apply} for all field in this form with the passed object
+     * @param {Object} values
+     */
+    applyToFields : function(o){
+        this.items.each(function(f){
+           Ext.apply(f, o);
+        });
+    },
+
+    /**
+     * Calls {@link Ext#applyIf} for all field in this form with the passed object
+     * @param {Object} values
+     */
+    applyIfToFields : function(o){
+        this.items.each(function(f){
+           Ext.applyIf(f, o);
+        });
+    }
+});
+
+// back compat
+Ext.BasicForm = Ext.form.BasicForm;

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/BasicLayoutRegion.jss.html b/www/extras/yui-ext/docs/output/BasicLayoutRegion.jss.html new file mode 100644 index 000000000..4f7f87848 --- /dev/null +++ b/www/extras/yui-ext/docs/output/BasicLayoutRegion.jss.html @@ -0,0 +1,285 @@ +BasicLayoutRegion.js

BasicLayoutRegion.js

/**
+ * @class Ext.BasicLayoutRegion
+ * @extends Ext.util.Observable
+ * This class represents a lightweight region in a layout manager. This region does not move dom nodes
+ * and does not have a titlebar, tabs or any other features. All it does is size and position 
+ * panels. To create a BasicLayoutRegion, add lightweight:true or basic:true to your regions config.
+ */
+Ext.BasicLayoutRegion = function(mgr, config, pos, skipConfig){
+    this.mgr = mgr;
+    this.position  = pos;
+    this.events = {
+        /**
+         * @event beforeremove
+         * Fires before a panel is removed (or closed). To cancel the removal set "e.cancel = true" on the event argument.
+         * @param {Ext.LayoutRegion} this
+         * @param {Ext.ContentPanel} panel The panel
+         * @param {Object} e The cancel event object
+         */
+        "beforeremove" : true,
+        /**
+         * @event invalidated
+         * Fires when the layout for this region is changed.
+         * @param {Ext.LayoutRegion} this
+         */
+        "invalidated" : true,
+        /**
+         * @event visibilitychange
+         * Fires when this region is shown or hidden 
+         * @param {Ext.LayoutRegion} this
+         * @param {Boolean} visibility true or false
+         */
+        "visibilitychange" : true,
+        /**
+         * @event paneladded
+         * Fires when a panel is added. 
+         * @param {Ext.LayoutRegion} this
+         * @param {Ext.ContentPanel} panel The panel
+         */
+        "paneladded" : true,
+        /**
+         * @event panelremoved
+         * Fires when a panel is removed. 
+         * @param {Ext.LayoutRegion} this
+         * @param {Ext.ContentPanel} panel The panel
+         */
+        "panelremoved" : true,
+        /**
+         * @event collapsed
+         * Fires when this region is collapsed.
+         * @param {Ext.LayoutRegion} this
+         */
+        "collapsed" : true,
+        /**
+         * @event expanded
+         * Fires when this region is expanded.
+         * @param {Ext.LayoutRegion} this
+         */
+        "expanded" : true,
+        /**
+         * @event slideshow
+         * Fires when this region is slid into view.
+         * @param {Ext.LayoutRegion} this
+         */
+        "slideshow" : true,
+        /**
+         * @event slidehide
+         * Fires when this region slides out of view. 
+         * @param {Ext.LayoutRegion} this
+         */
+        "slidehide" : true,
+        /**
+         * @event panelactivated
+         * Fires when a panel is activated. 
+         * @param {Ext.LayoutRegion} this
+         * @param {Ext.ContentPanel} panel The activated panel
+         */
+        "panelactivated" : true,
+        /**
+         * @event resized
+         * Fires when the user resizes this region. 
+         * @param {Ext.LayoutRegion} this
+         * @param {Number} newSize The new size (width for east/west, height for north/south)
+         */
+        "resized" : true
+    };
+    /** A collection of panels in this region. @type Ext.util.MixedCollection */
+    this.panels = new Ext.util.MixedCollection();
+    this.panels.getKey = this.getPanelId.createDelegate(this);
+    this.box = null;
+    this.activePanel = null;
+    if(skipConfig !== true){
+        this.applyConfig(config);
+    }
+};
+
+Ext.extend(Ext.BasicLayoutRegion, Ext.util.Observable, {
+    getPanelId : function(p){
+        return p.getId();
+    },
+    
+    applyConfig : function(config){
+        this.margins = config.margins || this.margins || {top: 0, left: 0, right:0, bottom: 0};
+        this.config = config;
+    },
+    
+    /**
+     * 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){
+        var el = this.el ? this.el :
+                 (this.activePanel ? this.activePanel.getEl() : null);
+        if(el){
+            switch(this.position){
+                case "east":
+                case "west":
+                    el.setWidth(newSize);
+                    this.fireEvent("resized", this, newSize);
+                break;
+                case "north":
+                case "south":
+                    el.setHeight(newSize);
+                    this.fireEvent("resized", this, newSize);
+                break;                
+            }
+        }
+    },
+    
+    getBox : function(){
+        return this.activePanel ? this.activePanel.getEl().getBox(false, true) : null;
+    },
+    
+    getMargins : function(){
+        return this.margins;
+    },
+    
+    updateBox : function(box){
+        this.box = box;
+        var el = this.activePanel.getEl();
+        el.dom.style.left = box.x + "px";
+        el.dom.style.top = box.y + "px";
+        this.activePanel.setSize(box.width, box.height);
+    },
+    
+    /**
+     * Returns the container element for this region.
+     * @return {Ext.Element}
+     */
+    getEl : function(){
+        return this.activePanel;
+    },
+    
+    /**
+     * Returns true if this region is currently visible.
+     * @return {Boolean}
+     */
+    isVisible : function(){
+        return this.activePanel ? true : false;
+    },
+    
+    setActivePanel : function(panel){
+        panel = this.getPanel(panel);
+        if(this.activePanel && this.activePanel != panel){
+            this.activePanel.setActiveState(false);
+            this.activePanel.getEl().setLeftTop(-10000,-10000);
+        }
+        this.activePanel = panel;
+        panel.setActiveState(true);
+        if(this.box){
+            panel.setSize(this.box.width, this.box.height);
+        }
+        this.fireEvent("panelactivated", this, panel);
+        this.fireEvent("invalidated");
+    },
+    
+    /**
+     * Show the specified panel.
+     * @param {Number/String/ContentPanel} panelId The panels index, id or the panel itself
+     * @return {Ext.ContentPanel} The shown panel or null
+     */
+    showPanel : function(panel){
+        if(panel = this.getPanel(panel)){
+            this.setActivePanel(panel);
+        }
+        return panel;
+    },
+    
+    /**
+     * Get the active panel for this region.
+     * @return {Ext.ContentPanel} The active panel or null
+     */
+    getActivePanel : function(){
+        return this.activePanel;
+    },
+    
+    /**
+     * Add the passed ContentPanel(s)
+     * @param {ContentPanel...} panel The ContentPanel(s) to add (you can pass more than one)
+     * @return {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;
+        }
+        if(this.hasPanel(panel)){
+            this.showPanel(panel);
+            return panel;
+        }
+        var el = panel.getEl();
+        if(el.dom.parentNode != this.mgr.el.dom){
+            this.mgr.el.dom.appendChild(el.dom);
+        }
+        if(panel.setRegion){
+            panel.setRegion(this);
+        }
+        this.panels.add(panel);
+        el.setStyle("position", "absolute");
+        if(!panel.background){
+            this.setActivePanel(panel);
+            if(this.config.initialSize && this.panels.getCount()==1){
+                this.resizeTo(this.config.initialSize);
+            }
+        }
+        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;
+    },
+    
+    /**
+     * 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 {Ext.ContentPanel} The panel that was removed
+     */
+    remove : function(panel, preservePanel){
+        panel = this.getPanel(panel);
+        if(!panel){
+            return null;
+        }
+        var e = {};
+        this.fireEvent("beforeremove", this, panel, e);
+        if(e.cancel === true){
+            return null;
+        }
+        var panelId = panel.getId();
+        this.panels.removeKey(panelId);
+        return panel;
+    },
+    
+    /**
+     * 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 {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;    
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/BorderLayout.jss.html b/www/extras/yui-ext/docs/output/BorderLayout.jss.html new file mode 100644 index 000000000..a8f5fd3b1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/BorderLayout.jss.html @@ -0,0 +1,538 @@ +BorderLayout.js

BorderLayout.js

/*
+Ext.layout.BorderLayout = function(cfg){
+    for(var r in cfg){
+        if(typeof cfg[r] == 'object'){
+            Ext.apply(cfg[r], this.regionDefaults);
+        }
+    }
+    this.layoutConfig = cfg;
+};
+
+Ext.extend(Ext.layout.BorderLayout, Ext.layout.ContainerLayout, {
+    regionDefaults : {
+        titlebar:false,
+        autoScroll:false
+    },
+    renderLayout : function(el){
+        this.sublayout = new Ext.BorderLayout(el, this.layoutConfig);
+    },
+
+    onLayout : function(ct, target){
+        if(!this.sublayout){
+            this.renderLayout();
+        }
+        var items = ct.items.items;
+        for(var i = 0, len = items.length; i < len; i++) {
+            var c = items[i];
+            if(!c.rendered){
+                c.render(target, i);
+                if(this.renderHidden && c != this.activeItem){
+                    c.hide();
+                }
+            }
+        }
+
+    }
+});*/
+
+
+
+
+Ext.layout.BorderLayout = function(config){
+    Ext.layout.BorderLayout.superclass.constructor.call(this, config);
+};
+
+Ext.extend(Ext.layout.BorderLayout, Ext.layout.ContainerLayout, {
+    monitorResize:true,
+    rendered : false,
+
+    onLayout : function(ct, target){
+        if(!this.rendered){
+            target.position();
+            target.addClass('x-border-layout-ct');
+            var items = ct.items.items;
+            for(var i = 0, len = items.length; i < len; i++) {
+                var c = items[i];
+                var pos = c.region;
+                var collapsed = c.collapsed;
+                c.collapsed = false;
+                if(!c.rendered){
+                    c.cls = c.cls ? c.cls +' x-border-panel' : 'x-border-panel';
+                    c.render(target, i);
+                }
+                this[pos] = pos != 'center' && c.split ?
+                    new Ext.layout.BorderLayout.SplitRegion(this, c.initialConfig, pos) :
+                    new Ext.layout.BorderLayout.Region(this, c.initialConfig, pos);
+                this[pos].render(ct, c);
+                if(collapsed){
+                    this[pos].onCollapse(c, false);
+                }
+            }
+            this.rendered = true;
+        }
+
+        var size = target.getViewSize();
+        var w = size.width, h = size.height;
+        var centerW = w, centerH = h, centerY = 0, centerX = 0;
+
+        var n = this.north, s = this.south, west = this.west, e = this.east, c = this.center;
+        if(n && n.isVisible()){
+            var b = n.getSize();
+            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.applyLayout(b);
+        }
+        if(s && s.isVisible()){
+            var b = s.getSize();
+            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.applyLayout(b);
+        }
+        if(west && west.isVisible()){
+            var b = west.getSize();
+            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.applyLayout(b);
+        }
+        if(e && e.isVisible()){
+            var b = e.getSize();
+            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.applyLayout(b);
+        }
+
+        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)
+        };
+        c.applyLayout(centerBox);
+
+        //target.repaint();
+    }
+});
+
+Ext.layout.BorderLayout.Region = function(layout, config, pos){
+    this.layout = layout;
+    this.position = pos;
+    Ext.apply(this, config);
+    this.margins = Ext.applyIf(this.margins || {}, this.defaultMargins[pos]);
+    if(this.collapsible){
+        this.cmargins = Ext.applyIf(this.cmargins || {}, this.defaultMargins[pos]);
+    }
+};
+
+Ext.layout.BorderLayout.Region.prototype = {
+    collapsible : false,
+    split:false,
+    floatable: false,
+    showPin: false,
+    collapsed : false,
+    defaultMargins : {
+        'north': {top:5,left:5,right:5,bottom:0},
+        'south': {top:0,left:5,right:5,bottom:5},
+        'east': {top:5,left:0,right:5,bottom:5},
+        'west': {top:5,left:5,right:0,bottom:5},
+        'center': {top:5,left:5,right:5,bottom:5}
+    },
+    minWidth:20,
+    minHeight:20,
+
+    render : function(ct, p){
+        this.panel = p;
+        this.el = p.el;
+        if(this.position != 'center'){
+            p.on({
+                beforecollapse: this.onCollapse,
+                beforeexpand: this.onExpand,
+                hide: this.onHide,
+                show: this.onShow,
+                scope: this
+            });
+            if(p.tools && p.tools.collapse){
+                p.tools.collapse.addClass('x-tool-collapse-'+this.position);
+            }
+        }
+    },
+
+    onCollapse : function(){
+        return false;
+    },
+
+    onExpand : function(){
+        return false;
+    },
+
+    onHide : function(){
+
+    },
+
+    onShow : function(){
+
+    },
+
+    isVisible : function(){
+        return !this.panel.hidden;
+    },
+
+    getMargins : function(){
+        return this.collapsed ? this.cmargins : this.margins;
+    },
+
+    getSize : function(){
+        return this.collapsed ? this.collapsedEl.getSize() : this.panel.getSize();
+    },
+
+    setPanel : function(panel){
+        this.panel = panel;
+
+    },
+
+    getMinWidth: function(){
+        return this.minWidth;
+    },
+
+    getMinHeight: function(){
+        return this.minHeight;
+    },
+
+    applyLayout : function(box){
+        this.panel.setPosition(box.x, box.y);
+        this.panel.setSize(box.width, box.height);
+    }
+};
+
+
+Ext.layout.BorderLayout.SplitRegion = function(layout, config, pos){
+    Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this, layout, config, pos);
+};
+
+Ext.extend(Ext.layout.BorderLayout.SplitRegion, Ext.layout.BorderLayout.Region, {
+    splitTip : "Drag to resize.",
+    collapsibleSplitTip : "Drag to resize. Double click to hide.",
+    useSplitTips : false,
+
+    render : function(ct, p){
+        Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this, ct, p);
+        this.splitEl = ct.createChild({
+            cls: "x-layout-split x-layout-split-"+this.position, html: "&#160;"
+        });
+        this.split = new Ext.SplitBar(this.splitEl.dom, p.el, this.orientation);
+        this.split.on("beforeapply", this.onSplitMove, this);
+        this.split.useShim = this.useShim === true;
+        this.split.getMaximumSize = this[this.position == 'north' || this.position == 'south' ?
+                                         'getVMaxSize' : 'getHMaxSize'].createDelegate(this);
+        if(this.useSplitTips){
+            this.splitEl.dom.title = this.collapsible ? this.collapsibleSplitTip : this.splitTip;
+        }
+        if(this.collapsible){
+            this.splitEl.on("dblclick", this.collapse,  this);
+        }
+
+        switch(this.position){
+            case 'north':
+                this.split.placement = Ext.SplitBar.BOTTOM;
+                this.split.orientation = Ext.SplitBar.VERTICAL;
+                this.split.el.addClass("x-layout-split-v");
+            break;
+            case 'south':
+                this.split.placement = Ext.SplitBar.TOP;
+                this.split.orientation = Ext.SplitBar.VERTICAL;
+                this.split.el.addClass("x-layout-split-v");
+            break;
+            case 'east':
+                this.split.placement = Ext.SplitBar.RIGHT;
+                this.split.orientation = Ext.SplitBar.HORIZONTAL;
+                this.split.el.addClass("x-layout-split-h");
+            break;
+            case 'west':
+                this.split.placement = Ext.SplitBar.LEFT;
+                this.split.orientation = Ext.SplitBar.HORIZONTAL;
+                this.split.el.addClass("x-layout-split-h");
+            break;
+        }
+    },
+
+    getHMaxSize : function(){
+         var cmax = this.maxSize || 10000;
+         var center = this.layout.center;
+         return Math.min(cmax, (this.el.getWidth()+center.el.getWidth())-center.getMinWidth());
+    },
+
+    getVMaxSize : function(){
+         var cmax = this.config.maxSize || 10000;
+         var center = this.mgr.getRegion("center");
+         return Math.min(cmax, (this.el.getHeight()+center.getEl().getHeight())-center.getMinHeight());
+    },
+
+    onSplitMove : function(split, newSize){
+        var s = this.panel.getSize();
+        if(this.position == 'north' || this.position == 'south'){
+            this.panel.setSize(s.width, newSize);
+        }else{
+            this.panel.setSize(newSize, s.height);
+        }
+        this.layout.layout();
+    },
+
+    getSplitBar : function(){
+        return this.split;
+    },
+
+    beforeSlide: function(){
+        /*if(Ext.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(Ext.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();
+                }
+            }
+        }*/
+    },
+
+    initAutoHide : function(){
+        if(this.autoHide !== false){
+            if(!this.autoHideHd){
+                var st = new Ext.util.DelayedTask(this.slideIn, this);
+                this.autoHideHd = {
+                    "mouseout": function(e){
+                        if(!e.within(this.el, true)){
+                            st.delay(500);
+                        }
+                    },
+                    "mouseover" : function(e){
+                        st.cancel();
+                    },
+                    scope : this
+                };
+            }
+            this.el.on(this.autoHideHd);
+        }
+    },
+
+    clearAutoHide : function(){
+        if(this.autoHide !== false){
+            this.el.un("mouseout", this.autoHideHd.mouseout);
+            this.el.un("mouseover", this.autoHideHd.mouseover);
+        }
+    },
+
+    clearMonitor : function(){
+        Ext.get(document).un("click", this.slideInIf, this);
+    },
+
+    // these names are backwards but not changed for compat
+    slideOut : function(){
+        if(this.isSlid || this.el.hasActiveFx()){
+            return;
+        }
+        this.isSlid = true;
+        if(this.collapseBtn){
+            this.collapseBtn.hide();
+        }
+        this.closeBtnState = this.closeBtn.getStyle('display');
+        this.closeBtn.hide();
+        if(this.stickBtn){
+            this.stickBtn.show();
+        }
+        this.el.show();
+        this.el.alignTo(this.collapsedEl, this.getCollapseAnchor());
+        this.beforeSlide();
+        this.el.setStyle("z-index", 20000);
+        this.el.slideIn(this.getSlideAnchor(), {
+            callback: function(){
+                this.afterSlide();
+                this.initAutoHide();
+                Ext.get(document).on("click", this.slideInIf, this);
+                this.fireEvent("slideshow", this);
+            },
+            scope: this,
+            block: true
+        });
+    },
+
+    afterSlideIn : function(){
+        this.clearAutoHide();
+        this.isSlid = false;
+        this.clearMonitor();
+        this.el.setStyle("z-index", "");
+        if(this.collapseBtn){
+            this.collapseBtn.show();
+        }
+        this.closeBtn.setStyle('display', this.closeBtnState);
+        if(this.stickBtn){
+            this.stickBtn.hide();
+        }
+        this.fireEvent("slidehide", this);
+    },
+
+    slideIn : function(cb){
+        if(!this.isSlid || this.el.hasActiveFx()){
+            Ext.callback(cb);
+            return;
+        }
+        this.isSlid = false;
+        this.beforeSlide();
+        this.el.slideOut(this.getSlideAnchor(), {
+            callback: function(){
+                this.el.setLeftTop(-10000, -10000);
+                this.afterSlide();
+                this.afterSlideIn();
+                Ext.callback(cb);
+            },
+            scope: this,
+            block: true
+        });
+    },
+
+    slideInIf : function(e){
+        if(!e.within(this.el)){
+            this.slideIn();
+        }
+    },
+
+    animateCollapse : function(){
+        this.beforeSlide();
+        this.el.setStyle("z-index", 20000);
+        var anchor = this.getSlideAnchor();
+        this.el.slideOut(anchor, {
+            callback : function(){
+                this.el.setStyle("z-index", "");
+                this.collapsedEl.slideIn(anchor, {duration:.3});
+                this.afterSlide();
+                this.el.setLocation(-10000,-10000);
+                this.el.hide();
+                this.fireEvent("collapsed", this);
+            },
+            scope: this,
+            block: true
+        });
+    },
+
+    animateExpand : function(){
+        this.beforeSlide();
+        this.el.alignTo(this.collapsedEl, this.getCollapseAnchor(), this.getExpandAdj());
+        this.el.setStyle("z-index", 20000);
+        this.collapsedEl.hide({
+            duration:.1
+        });
+        this.el.slideIn(this.getSlideAnchor(), {
+            callback : function(){
+                this.el.setStyle("z-index", "");
+                this.afterSlide();
+                if(this.split){
+                    this.split.el.show();
+                }
+                this.fireEvent("invalidated", this);
+                this.fireEvent("expanded", this);
+            },
+            scope: this,
+            block: true
+        });
+    },
+
+    anchors : {
+        "west" : "left",
+        "east" : "right",
+        "north" : "top",
+        "south" : "bottom"
+    },
+
+    sanchors : {
+        "west" : "l",
+        "east" : "r",
+        "north" : "t",
+        "south" : "b"
+    },
+
+    canchors : {
+        "west" : "tl-tr",
+        "east" : "tr-tl",
+        "north" : "tl-bl",
+        "south" : "bl-tl"
+    },
+
+    getAnchor : function(){
+        return this.anchors[this.position];
+    },
+
+    getCollapseAnchor : function(){
+        return this.canchors[this.position];
+    },
+
+    getSlideAnchor : function(){
+        return this.sanchors[this.position];
+    },
+
+    getAlignAdj : function(){
+        var cm = this.cmargins;
+        switch(this.position){
+            case "west":
+                return [0, 0];
+            break;
+            case "east":
+                return [0, 0];
+            break;
+            case "north":
+                return [0, 0];
+            break;
+            case "south":
+                return [0, 0];
+            break;
+        }
+    },
+
+    getExpandAdj : function(){
+        var c = this.collapsedEl, cm = this.cmargins;
+        switch(this.position){
+            case "west":
+                return [-(cm.right+c.getWidth()+cm.left), 0];
+            break;
+            case "east":
+                return [cm.right+c.getWidth()+cm.left, 0];
+            break;
+            case "north":
+                return [0, -(cm.top+cm.bottom+c.getHeight())];
+            break;
+            case "south":
+                return [0, cm.top+cm.bottom+c.getHeight()];
+            break;
+        }
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/BorderLayoutRegions.jss.html b/www/extras/yui-ext/docs/output/BorderLayoutRegions.jss.html new file mode 100644 index 000000000..521c43170 --- /dev/null +++ b/www/extras/yui-ext/docs/output/BorderLayoutRegions.jss.html @@ -0,0 +1,195 @@ +BorderLayoutRegions.js

BorderLayoutRegions.js

/*
+ * These classes are private internal classes
+ */
+Ext.CenterLayoutRegion = function(mgr, config){
+    Ext.CenterLayoutRegion.superclass.constructor.call(this, mgr, config, "center");
+    this.visible = true;
+    this.minWidth = config.minWidth || 20;
+    this.minHeight = config.minHeight || 20;
+};
+
+Ext.extend(Ext.CenterLayoutRegion, 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;
+    }
+});
+
+
+Ext.NorthLayoutRegion = function(mgr, config){
+    Ext.NorthLayoutRegion.superclass.constructor.call(this, mgr, config, "north", "n-resize");
+    if(this.split){
+        this.split.placement = Ext.SplitBar.TOP;
+        this.split.orientation = Ext.SplitBar.VERTICAL;
+        this.split.el.addClass("x-layout-split-v");
+    }
+    var size = config.initialSize || config.height;
+    if(typeof size != "undefined"){
+        this.el.setHeight(size);
+    }
+};
+Ext.extend(Ext.NorthLayoutRegion, Ext.SplitLayoutRegion, {
+    orientation: Ext.SplitBar.VERTICAL,
+    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.updateBody(box.width, null);
+        }
+        Ext.NorthLayoutRegion.superclass.updateBox.call(this, box);
+    }
+});
+
+Ext.SouthLayoutRegion = function(mgr, config){
+    Ext.SouthLayoutRegion.superclass.constructor.call(this, mgr, config, "south", "s-resize");
+    if(this.split){
+        this.split.placement = Ext.SplitBar.BOTTOM;
+        this.split.orientation = Ext.SplitBar.VERTICAL;
+        this.split.el.addClass("x-layout-split-v");
+    }
+    var size = config.initialSize || config.height;
+    if(typeof size != "undefined"){
+        this.el.setHeight(size);
+    }
+};
+Ext.extend(Ext.SouthLayoutRegion, Ext.SplitLayoutRegion, {
+    orientation: Ext.SplitBar.VERTICAL,
+    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.updateBody(box.width, null);
+        }
+        Ext.SouthLayoutRegion.superclass.updateBox.call(this, box);
+    }
+});
+
+Ext.EastLayoutRegion = function(mgr, config){
+    Ext.EastLayoutRegion.superclass.constructor.call(this, mgr, config, "east", "e-resize");
+    if(this.split){
+        this.split.placement = Ext.SplitBar.RIGHT;
+        this.split.orientation = Ext.SplitBar.HORIZONTAL;
+        this.split.el.addClass("x-layout-split-h");
+    }
+    var size = config.initialSize || config.width;
+    if(typeof size != "undefined"){
+        this.el.setWidth(size);
+    }
+};
+Ext.extend(Ext.EastLayoutRegion, Ext.SplitLayoutRegion, {
+    orientation: Ext.SplitBar.HORIZONTAL,
+    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.updateBody(null, box.height);
+        }
+        Ext.EastLayoutRegion.superclass.updateBox.call(this, box);
+    }
+});
+
+Ext.WestLayoutRegion = function(mgr, config){
+    Ext.WestLayoutRegion.superclass.constructor.call(this, mgr, config, "west", "w-resize");
+    if(this.split){
+        this.split.placement = Ext.SplitBar.LEFT;
+        this.split.orientation = Ext.SplitBar.HORIZONTAL;
+        this.split.el.addClass("x-layout-split-h");
+    }
+    var size = config.initialSize || config.width;
+    if(typeof size != "undefined"){
+        this.el.setWidth(size);
+    }
+};
+Ext.extend(Ext.WestLayoutRegion, Ext.SplitLayoutRegion, {
+    orientation: Ext.SplitBar.HORIZONTAL,
+    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.updateBody(null, box.height);
+        }
+        Ext.WestLayoutRegion.superclass.updateBox.call(this, box);
+    }
+});
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/BoxComponent.jss.html b/www/extras/yui-ext/docs/output/BoxComponent.jss.html new file mode 100644 index 000000000..dd4f84853 --- /dev/null +++ b/www/extras/yui-ext/docs/output/BoxComponent.jss.html @@ -0,0 +1,165 @@ +BoxComponent.js

BoxComponent.js

Ext.BoxComponent = function(config){
+    Ext.BoxComponent.superclass.constructor.call(this, config);
+    this.addEvents({
+        resize : true,
+        move : true
+    });
+};
+
+Ext.extend(Ext.BoxComponent, Ext.Component, {
+    boxReady : false,
+    // private, used to defer height settings to subclasses
+    deferHeight: false,
+
+    setSize : function(w, h){
+        // support for standard size objects
+        if(typeof w == 'object'){
+            h = w.height;
+            w = w.width;
+        }
+        // not rendered
+        if(!this.boxReady){
+            this.width = w;
+            this.height = h;
+            return;
+        }
+
+        // prevent recalcs when not needed
+        if(this.lastSize && this.lastSize.width == w && this.lastSize.height == h){
+            return;
+        }
+        this.lastSize = {width: w, height: h};
+
+        var adj = this.adjustSize(w, h);
+        var aw = adj.width, ah = adj.height;
+        if(aw !== undefined || ah !== undefined){ // this code is nasty but performs better with floaters
+            var rz = this.getResizeEl();
+            if(!this.deferHeight && aw !== undefined && ah !== undefined){
+                rz.setSize(aw, ah);
+            }else if(!this.deferHeight && ah !== undefined){
+                rz.setHeight(ah);
+            }else if(aw !== undefined){
+                rz.setWidth(aw);
+            }
+            this.onResize(aw, ah, w, h);
+            this.fireEvent('resize', this, aw, ah, w, h);
+        }
+        return this;
+    },
+
+    getSize : function(){
+        return this.el.getSize();
+    },
+
+    getPosition : function(local){
+        if(local === true){
+            return [this.el.getLeft(true), this.el.getTop(true)];
+        }
+        return this.xy || this.el.getXY();
+    },
+
+    getBox : function(local){
+        var s = this.el.getSize();
+        if(local){
+            s.x = this.el.getLeft(true);
+            s.y = this.el.getTop(true);
+        }else{
+            var xy = this.xy || this.el.getXY();
+            s.x = xy[0];
+            s.y = xy[1];
+        }
+        return s;
+    },
+
+    updateBox : function(box){
+        this.setSize(box.width, box.height);
+        this.setPagePosition(box.x, box.y);
+    },
+
+    getResizeEl : function(){
+        return this.resizeEl || this.el;
+    },
+
+    setPosition : function(x, y){
+        this.x = x;
+        this.y = y;
+        if(!this.boxReady){
+            return;
+        }
+        var adj = this.adjustPosition(x, y);
+        var ax = adj.x, ay = adj.y;
+
+        if(ax !== undefined || ay !== undefined){
+            if(ax !== undefined && ay !== undefined){
+                this.el.setLeftTop(ax, ay);
+            }else if(ax !== undefined){
+                this.el.setLeft(ax);
+            }else if(ay !== undefined){
+                this.el.setTop(ay);
+            }
+            this.onPosition(ax, ay);
+            this.fireEvent('move', this, ax, ay);
+        }
+        return this;
+    },
+
+    setPagePosition : function(x, y){
+        this.pageX = x;
+        this.pageY = y;
+        if(!this.boxReady){
+            return;
+        }
+        if(x === undefined || y === undefined){ // cannot translate undefined points
+            return;
+        }
+        var p = this.el.translatePoints(x, y);
+        this.setPosition(p.left, p.top);
+        return this;
+    },
+
+    onRender : function(ct, position){
+        Ext.BoxComponent.superclass.onRender.call(this, ct, position);
+        if(this.resizeEl){
+            this.resizeEl = Ext.get(this.resizeEl);
+        }
+    },
+
+    afterRender : function(){
+        Ext.BoxComponent.superclass.afterRender.call(this);
+        this.boxReady = true;
+        this.setSize(this.width, this.height);
+        if(this.x || this.y){
+            this.setPosition(this.x, this.y);
+        }
+        if(this.pageX || this.pageY){
+            this.setPagePosition(this.pageX, this.pageY);
+        }
+    },
+
+    syncSize : function(){
+        this.setSize(this.el.getWidth(), this.el.getHeight());
+    },
+
+    onResize : function(adjWidth, adjHeight, rawWidth, rawHeight){
+
+    },
+
+    onPosition : function(x, y){
+
+    },
+
+    adjustSize : function(w, h){
+        if(this.autoWidth){
+            w = 'auto';
+        }
+        if(this.autoHeight){
+            h = 'auto';
+        }
+        return {width : w, height: h};
+    },
+
+    adjustPosition : function(x, y){
+        return {x : x, y: y};
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Button.jss.html b/www/extras/yui-ext/docs/output/Button.jss.html new file mode 100644 index 000000000..665274035 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Button.jss.html @@ -0,0 +1,455 @@ +Button.js

Button.js

/**
+ * @class Ext.Button
+ * @extends Ext.util.Observable
+ * Simple Button class
+ * @cfg {String} text The button text
+ * @cfg {String} icon The path to an image to display in the button (the image will be set as the background-image
+ * CSS property of the button by default, so if you want a mixed icon/text button, set cls:"x-btn-text-icon")
+ * @cfg {Function} handler A function called when the button is clicked (can be used instead of click event)
+ * @cfg {Object} scope The scope of the handler
+ * @cfg {Number} minWidth The minimum width for this button (used to give a set of buttons a common width)
+ * @cfg {String/Object} tooltip The tooltip for the button - can be a string or QuickTips config object
+ * @cfg {Boolean} hidden True to start hidden (defaults to false)
+ * @cfg {Boolean} disabled True to start disabled (defaults to false)
+ * @cfg {Boolean} pressed True to start pressed (only if enableToggle = true)
+ * @cfg {String} toggleGroup The group this toggle button is a member of (only 1 per group can be pressed, only
+ * applies if enableToggle = true)
+ * @cfg {Boolean/Object} repeat True to repeat fire the click event while the mouse is down. This can also be
+  an {@link Ext.util.ClickRepeater} config object (defaults to false).
+ * @constructor
+ * Create a new button
+ * @param {String/HTMLElement/Element} renderTo The element to append the button to
+ * @param {Object} config The config object
+ */
+Ext.Button = function(renderTo, config){
+    Ext.apply(this, config);
+    this.addEvents({
+        /**
+	     * @event click
+	     * Fires when this button is clicked
+	     * @param {Button} this
+	     * @param {EventObject} e The click event
+	     */
+	    "click" : true,
+        /**
+	     * @event toggle
+	     * Fires when the "pressed" state of this button changes (only if enableToggle = true)
+	     * @param {Button} this
+	     * @param {Boolean} pressed
+	     */
+	    "toggle" : true,
+        /**
+	     * @event mouseover
+	     * Fires when the mouse hovers over the button
+	     * @param {Button} this
+	     * @param {Event} e The event object
+	     */
+        'mouseover' : true,
+        /**
+	     * @event mouseout
+	     * Fires when the mouse exits the button
+	     * @param {Button} this
+	     * @param {Event} e The event object
+	     */
+        'mouseout': true
+    });
+    if(this.menu){
+        this.menu = Ext.menu.MenuMgr.get(this.menu);
+    }
+    if(renderTo){
+        this.render(renderTo);
+    }
+    Ext.Button.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.Button, Ext.util.Observable, {
+    /**
+     * Read-only. True if this button is hidden
+     * @type Boolean
+     */
+    hidden : false,
+    /**
+     * Read-only. True if this button is disabled
+     * @type Boolean
+     */
+    disabled : false,
+    /**
+     * Read-only. True if this button is pressed (only if enableToggle = true)
+     * @type Boolean
+     */
+    pressed : false,
+
+    /**
+     * @cfg {Boolean} enableToggle
+     * True to enable pressed/not pressed toggling (defaults to false)
+     */
+    enableToggle: false,
+    /**
+     * @cfg {Mixed} menu
+     * Standard menu attribute consisting of a reference to a menu object, a menu id or a menu config blob
+     */
+    menu : undefined,
+    /**
+     * @cfg {String} menuAlign
+     * The position to align the menu to (see {@link Ext.Element#alignTo} for more details, defaults to 'tl-bl?').
+     */
+    menuAlign : "tl-bl?",
+
+    // private
+    menuClassTarget: 'tr',
+
+    clickEvent : 'click',
+    handleMouseEvents : true,
+
+    /**
+     * @cfg {String} tooltipType
+     * The type of tooltip to use. Either "qtip" for QuickTips or "title" for title attribute.
+     */
+    tooltipType : 'qtip',
+
+    // private
+    render : function(renderTo){
+        var btn;
+        if(this.hideParent){
+            this.parentEl = Ext.get(renderTo);
+        }
+        if(!this.dhconfig){
+            if(!this.template){
+                if(!Ext.Button.buttonTemplate){
+                    // hideous table template
+                    Ext.Button.buttonTemplate = new Ext.Template(
+                        '<table border="0" cellpadding="0" cellspacing="0" class="x-btn-wrap"><tbody><tr>',
+                        '<td class="x-btn-left"><i>&#160;</i></td><td class="x-btn-center"><em><button class="x-btn-text">{0}</button></em></td><td class="x-btn-right"><i>&#160;</i></td>',
+                        "</tr></tbody></table>");
+                }
+                this.template = Ext.Button.buttonTemplate;
+            }
+            btn = this.template.append(renderTo, [this.text || '&#160;'], true);
+            var btnEl = btn.child("button:first");
+            btnEl.on('focus', this.onFocus, this);
+            btnEl.on('blur', this.onBlur, this);
+            if(this.cls){
+                btn.addClass(this.cls);
+            }
+            if(this.icon){
+                btnEl.setStyle('background-image', 'url(' +this.icon +')');
+            }
+            if(this.tooltip){
+                if(typeof this.tooltip == 'object'){
+                    Ext.QuickTips.tips(Ext.apply({
+                          target: btnEl.id
+                    }, this.tooltip));
+                } else {
+                    btnEl.dom[this.tooltipType] = this.tooltip;
+                }
+            }
+        }else{
+            btn = Ext.DomHelper.append(Ext.get(renderTo).dom, this.dhconfig, true);
+        }
+        this.el = btn;
+        if(this.id){
+            this.el.dom.id = this.el.id = this.id;
+        }
+        if(this.menu){
+            this.el.child(this.menuClassTarget).addClass("x-btn-with-menu");
+            this.menu.on("show", this.onMenuShow, this);
+            this.menu.on("hide", this.onMenuHide, this);
+        }
+        btn.addClass("x-btn");
+        if(Ext.isIE && !Ext.isIE7){
+            this.autoWidth.defer(1, this);
+        }else{
+            this.autoWidth();
+        }
+        if(this.handleMouseEvents){
+            btn.on("mouseover", this.onMouseOver, this);
+            btn.on("mouseout", this.onMouseOut, this);
+            btn.on("mousedown", this.onMouseDown, this);
+        }
+        btn.on(this.clickEvent, this.onClick, this);
+        //btn.on("mouseup", this.onMouseUp, this);
+        if(this.hidden){
+            this.hide();
+        }
+        if(this.disabled){
+            this.disable();
+        }
+        Ext.ButtonToggleMgr.register(this);
+        if(this.pressed){
+            this.el.addClass("x-btn-pressed");
+        }
+        if(this.repeat){
+            var repeater = new Ext.util.ClickRepeater(btn,
+                typeof this.repeat == "object" ? this.repeat : {}
+            );
+            repeater.on("click", this.onClick,  this);
+        }
+    },
+    /**
+     * Returns the button's underlying element
+     * @return {Ext.Element} The element
+     */
+    getEl : function(){
+        return this.el;  
+    },
+    
+    /**
+     * Destroys this Button and removes any listeners.
+     */
+    destroy : function(){
+        Ext.ButtonToggleMgr.unregister(this);
+        this.el.removeAllListeners();
+        this.purgeListeners();
+        this.el.remove();
+    },
+
+    // private
+    autoWidth : function(){
+        if(this.el){
+            this.el.setWidth("auto");
+            if(Ext.isIE7 && Ext.isStrict){
+                var ib = this.el.child('button');
+                if(ib && ib.getWidth() > 20){
+                    ib.clip();
+                    ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr'));
+                }
+            }
+            if(this.minWidth){
+                if(this.hidden){
+                    this.el.beginMeasure();
+                }
+                if(this.el.getWidth() < this.minWidth){
+                    this.el.setWidth(this.minWidth);
+                }
+                if(this.hidden){
+                    this.el.endMeasure();
+                }
+            }
+        }
+    },
+
+    /**
+     * Assigns this button's click handler
+     * @param {Function} handler The function to call when the button is clicked
+     * @param {Object} scope (optional) Scope for the function passed in
+     */
+    setHandler : function(handler, scope){
+        this.handler = handler;
+        this.scope = scope;  
+    },
+    
+    /**
+     * Sets this button's text
+     * @param {String} text The button text
+     */
+    setText : function(text){
+        this.text = text;
+        if(this.el){
+            this.el.child("td.x-btn-center button.x-btn-text").update(text);
+        }
+        this.autoWidth();
+    },
+    
+    /**
+     * Gets the text for this button
+     * @return {String} The button text
+     */
+    getText : function(){
+        return this.text;  
+    },
+    
+    /**
+     * Show this button
+     */
+    show: function(){
+        this.hidden = false;
+        if(this.el){
+            this[this.hideParent? 'parentEl' : 'el'].setStyle("display", "");
+        }
+    },
+    
+    /**
+     * Hide this button
+     */
+    hide: function(){
+        this.hidden = true;
+        if(this.el){
+            this[this.hideParent? 'parentEl' : '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();
+        }
+    },
+    
+    /**
+     * If a state it passed, it becomes the pressed state otherwise the current state is toggled.
+     * @param {Boolean} state (optional) Force a particular state
+     */
+    toggle : function(state){
+        state = state === undefined ? !this.pressed : state;
+        if(state != this.pressed){
+            if(state){
+                this.el.addClass("x-btn-pressed");
+                this.pressed = true;
+                this.fireEvent("toggle", this, true);
+            }else{
+                this.el.removeClass("x-btn-pressed");
+                this.pressed = false;
+                this.fireEvent("toggle", this, false);
+            }
+            if(this.toggleHandler){
+                this.toggleHandler.call(this.scope || this, this, state);
+            }
+        }
+    },
+    
+    /**
+     * Focus the button
+     */
+    focus : function(){
+        this.el.child('button:first').focus();
+    },
+    
+    /**
+     * Disable this button
+     */
+    disable : function(){
+        if(this.el){
+            this.el.addClass("x-btn-disabled");
+        }
+        this.disabled = true;
+    },
+    
+    /**
+     * Enable this button
+     */
+    enable : function(){
+        if(this.el){
+            this.el.removeClass("x-btn-disabled");
+        }
+        this.disabled = false;
+    },
+
+    /**
+     * Convenience function for boolean enable/disable
+     * @param {Boolean} enabled True to enable, false to disable
+     */
+    setDisabled : function(v){
+        this[v !== true ? "enable" : "disable"]();
+    },
+
+    // private
+    onClick : function(e){
+        if(e){
+            e.preventDefault();
+        }
+        if(!this.disabled){
+            if(this.enableToggle){
+                this.toggle();
+            }
+            if(this.menu && !this.menu.isVisible()){
+                this.menu.show(this.el, this.menuAlign);
+            }
+            this.fireEvent("click", this, e);
+            if(this.handler){
+                this.el.removeClass("x-btn-over");
+                this.handler.call(this.scope || this, this, e);
+            }
+        }
+    },
+    // private
+    onMouseOver : function(e){
+        if(!this.disabled){
+            this.el.addClass("x-btn-over");
+            this.fireEvent('mouseover', this, e);
+        }
+    },
+    // private
+    onMouseOut : function(e){
+        if(!e.within(this.el,  true)){
+            this.el.removeClass("x-btn-over");
+            this.fireEvent('mouseout', this, e);
+        }
+    },
+    // private
+    onFocus : function(e){
+        if(!this.disabled){
+            this.el.addClass("x-btn-focus");
+        }
+    },
+    // private
+    onBlur : function(e){
+        this.el.removeClass("x-btn-focus");
+    },
+    // private
+    onMouseDown : function(){
+        if(!this.disabled){
+            this.el.addClass("x-btn-click");
+            Ext.get(document).on('mouseup', this.onMouseUp, this);
+        }
+    },
+    // private
+    onMouseUp : function(){
+        this.el.removeClass("x-btn-click");
+        Ext.get(document).un('mouseup', this.onMouseUp, this);
+    },
+    // private
+    onMenuShow : function(e){
+        this.el.addClass("x-btn-menu-active");
+    },
+    // private
+    onMenuHide : function(e){
+        this.el.removeClass("x-btn-menu-active");
+    }   
+});
+
+// Private utility class used by Button
+Ext.ButtonToggleMgr = function(){
+   var groups = {};
+   
+   function toggleGroup(btn, state){
+       if(state){
+           var g = groups[btn.toggleGroup];
+           for(var i = 0, l = g.length; i < l; i++){
+               if(g[i] != btn){
+                   g[i].toggle(false);
+               }
+           }
+       }
+   }
+   
+   return {
+       register : function(btn){
+           if(!btn.toggleGroup){
+               return;
+           }
+           var g = groups[btn.toggleGroup];
+           if(!g){
+               g = groups[btn.toggleGroup] = [];
+           }
+           g.push(btn);
+           btn.on("toggle", toggleGroup);
+       },
+       
+       unregister : function(btn){
+           if(!btn.toggleGroup){
+               return;
+           }
+           var g = groups[btn.toggleGroup];
+           if(g){
+               g.remove(btn);
+               btn.un("toggle", toggleGroup);
+           }
+       }
+   };
+}();

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ButtonPanel.jss.html b/www/extras/yui-ext/docs/output/ButtonPanel.jss.html new file mode 100644 index 000000000..10aada3b7 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ButtonPanel.jss.html @@ -0,0 +1,3 @@ +ButtonPanel.js

ButtonPanel.js


+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/CSS.jss.html b/www/extras/yui-ext/docs/output/CSS.jss.html new file mode 100644 index 000000000..4f6854e0f --- /dev/null +++ b/www/extras/yui-ext/docs/output/CSS.jss.html @@ -0,0 +1,151 @@ +CSS.js

CSS.js

/**
+ * @class Ext.util.CSS
+ * Utility class for manipulating CSS rules
+ * @singleton
+ */
+Ext.util.CSS = function(){
+	var rules = null;
+   	var doc = document;
+
+    var camelRe = /(-[a-z])/gi;
+    var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); };
+
+   return {
+   /**
+    * Very simple dynamic creation of stylesheets from a text blob of rules.  The text will wrapped in a style
+    * tag and appended to the HEAD of the document.
+    * @param {String} cssText The text containing the css rules
+    * @return {StyleSheet} 
+    */
+   createStyleSheet : function(cssText){
+       var ss;
+       if(Ext.isIE){
+           ss = doc.createStyleSheet();
+           ss.cssText = cssText;
+       }else{
+           var head = doc.getElementsByTagName("head")[0];
+           var rules = doc.createElement("style");
+           rules.setAttribute("type", "text/css");
+           try{
+                rules.appendChild(doc.createTextNode(cssText));
+           }catch(e){
+               rules.cssText = cssText; 
+           }
+           head.appendChild(rules);
+           ss = rules.styleSheet ? rules.styleSheet : (rules.sheet || doc.styleSheets[doc.styleSheets.length-1]);
+       }
+       this.cacheStyleSheet(ss);
+       return ss;
+   },
+
+   /**
+    * Removes a style or link tag by id
+    * @param {String} id The id of the tag
+    */
+   removeStyleSheet : function(id){
+       var existing = doc.getElementById(id);
+       if(existing){
+           existing.parentNode.removeChild(existing);
+       }
+   },
+
+   /**
+    * Dynamically swaps an existing stylesheet reference for a new one
+    * @param {String} id The id of an existing link tag to remove
+    * @param {String} url The href of the new stylesheet to include
+    */
+   swapStyleSheet : function(id, url){
+       this.removeStyleSheet(id);
+       var ss = doc.createElement("link");
+       ss.setAttribute("rel", "stylesheet");
+       ss.setAttribute("type", "text/css");
+       ss.setAttribute("id", id);
+       ss.setAttribute("href", url);
+       doc.getElementsByTagName("head")[0].appendChild(ss);
+   },
+   
+   /**
+    * Refresh the rule cache if you have dynamically added stylesheets
+    * @return {Object} An object (hash) of rules indexed by selector
+    */
+   refreshCache : function(){
+       return this.getRules(true);
+   },
+
+   // private
+   cacheStyleSheet : function(ss){
+       if(!rules){
+           rules = {};
+       }
+       try{// try catch for cross domain access issue
+           var ssRules = ss.cssRules || ss.rules;
+           for(var j = ssRules.length-1; j >= 0; --j){
+               rules[ssRules[j].selectorText] = ssRules[j];
+           }
+       }catch(e){}
+   },
+   
+   /**
+    * 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
+    */
+   getRules : function(refreshCache){
+   		if(rules == null || refreshCache){
+   			rules = {};
+   			var ds = doc.styleSheets;
+   			for(var i =0, len = ds.length; i < len; i++){
+   			    try{
+    		        this.cacheStyleSheet(ds[i]);
+    		    }catch(e){} 
+	        }
+   		}
+   		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 if you have recently updated any rules or added styles dynamically
+    * @return {CSSRule} The CSS rule or null if one is not found
+    */
+   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
+    */
+   updateRule : function(selector, property, value){
+   		if(!(selector instanceof Array)){
+   			var rule = this.getRule(selector);
+   			if(rule){
+   				rule.style[property.replace(camelRe, camelFn)] = value;
+   				return true;
+   			}
+   		}else{
+   			for(var i = 0; i < selector.length; i++){
+   				if(this.updateRule(selector[i], property, value)){
+   					return true;
+   				}
+   			}
+   		}
+   		return false;
+   	}
+   };	
+}();

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/CellSelectionModel.jss.html b/www/extras/yui-ext/docs/output/CellSelectionModel.jss.html new file mode 100644 index 000000000..fea5d1da8 --- /dev/null +++ b/www/extras/yui-ext/docs/output/CellSelectionModel.jss.html @@ -0,0 +1,220 @@ +CellSelectionModel.js

CellSelectionModel.js

/**
+ @class Ext.grid.CellSelectionModel
+ * @extends Ext.grid.AbstractSelectionModel
+ @constructor
+ * @param {Object} config
+ */
+Ext.grid.CellSelectionModel = function(config){
+    Ext.apply(this, config);
+
+    this.selection = null;
+
+    this.addEvents({
+        /**
+	     * @event beforerowselect
+	     * Fires before a cell is selected.
+	     * @param {SelectionModel} this
+	     * @param {Number} rowIndex The selected row index
+	     * @param {Number} colIndex The selected cell index
+	     */
+	    "beforecellselect" : true,
+        /**
+	     * @event cellselect
+	     * Fires when a cell is selected.
+	     * @param {SelectionModel} this
+	     * @param {Number} rowIndex The selected row index
+	     * @param {Number} colIndex The selected cell index
+	     */
+	    "cellselect" : true,
+        /**
+	     * @event selectionchange
+	     * Fires when the active selection changes.
+	     * @param {SelectionModel} this
+	     * @param {Object} selection null for no selection or an object (o) with two properties
+	        <ul>
+	        <li>o.record: the record object for the row the selection is in</li>
+	        <li>o.cell: An array of [rowIndex, columnIndex]</li>
+	        </ul>
+	     */
+	    "selectionchange" : true
+    });
+};
+
+Ext.extend(Ext.grid.CellSelectionModel, Ext.grid.AbstractSelectionModel,  {
+
+    /** @ignore */
+    initEvents : function(){
+        this.grid.on("mousedown", this.handleMouseDown, this);
+        this.grid.container.on(Ext.isIE ? "keydown" : "keypress", this.handleKeyDown, this);
+        var view = this.grid.view;
+        view.on("refresh", this.onViewChange, this);
+        view.on("rowupdated", this.onRowUpdated, this);
+        view.on("beforerowremoved", this.clearSelections, this);
+        view.on("beforerowsinserted", this.clearSelections, this);
+        if(this.grid.isEditor){
+            this.grid.on("beforeedit", this.beforeEdit,  this);
+        }
+    },
+
+    beforeEdit : function(e){
+        this.select(e.row, e.column, false, true, e.record);
+    },
+
+    onRowUpdated : function(v, index, r){
+        if(this.selection && this.selection.record == r){
+            v.onCellSelect(index, this.selection.cell[1]);
+        }
+    },
+
+    onViewChange : function(){
+        this.clearSelections(true);
+    },
+
+    getSelectedCell : function(){
+        return this.selection ? this.selection.cell : null;
+    },
+
+    /**
+     * Clears all selections.
+     */
+    clearSelections : function(preventNotify){
+        var s = this.selection;
+        if(s){
+            if(preventNotify !== true){
+                this.grid.view.onCellDeselect(s.cell[0], s.cell[1]);
+            }
+            this.selection = null;
+            this.fireEvent("selectionchange", this, null);
+        }
+    },
+
+    /**
+     * Returns True if there is a selection.
+     * @return {Boolean}
+     */
+    hasSelection : function(){
+        return this.selection ? true : false;
+    },
+
+    /** @ignore */
+    handleMouseDown : function(e, t){
+        var v = this.grid.getView();
+        if(this.isLocked()){
+            return;
+        };
+        var row = v.findRowIndex(t);
+        var cell = v.findCellIndex(t);
+        if(row !== false && cell !== false){
+            this.select(row, cell);
+        }
+    },
+
+    /**
+     * Selects a cell.
+     * @param {Number} rowIndex
+     * @param {Number} collIndex
+     */
+    select : function(rowIndex, colIndex, preventViewNotify, preventFocus, /*internal*/ r){
+        if(this.fireEvent("beforecellselect", this, rowIndex, colIndex) !== false){
+            this.clearSelections();
+            r = r || this.grid.dataSource.getAt(rowIndex);
+            this.selection = {
+                record : r,
+                cell : [rowIndex, colIndex]
+            };
+            if(!preventViewNotify){
+                var v = this.grid.getView();
+                v.onCellSelect(rowIndex, colIndex);
+                if(preventFocus !== true){
+                    v.focusCell(rowIndex, colIndex);
+                }
+            }
+            this.fireEvent("cellselect", this, rowIndex, colIndex);
+            this.fireEvent("selectionchange", this, this.selection);
+        }
+    },
+
+    isSelectable : function(rowIndex, colIndex, cm){
+        return !cm.isHidden(colIndex);
+    },
+
+    /** @ignore */
+    handleKeyDown : function(e){
+        if(!e.isNavKeyPress()){
+            return;
+        }
+        var g = this.grid, s = this.selection;
+        if(!s){
+            e.stopEvent();
+            var cell = g.walkCells(0, 0, 1, this.isSelectable,  this);
+            if(cell){
+                this.select(cell[0], cell[1]);
+            }
+            return;
+        }
+        var sm = this;
+        var walk = function(row, col, step){
+            return g.walkCells(row, col, step, sm.isSelectable,  sm);
+        };
+        var k = e.getKey(), r = s.cell[0], c = s.cell[1];
+        var newCell;
+
+        switch(k){
+             case e.TAB:
+                 if(e.shiftKey){
+                     newCell = walk(r, c-1, -1);
+                 }else{
+                     newCell = walk(r, c+1, 1);
+                 }
+             break;
+             case e.DOWN:
+                 newCell = walk(r+1, c, 1);
+             break;
+             case e.UP:
+                 newCell = walk(r-1, c, -1);
+             break;
+             case e.RIGHT:
+                 newCell = walk(r, c+1, 1);
+             break;
+             case e.LEFT:
+                 newCell = walk(r, c-1, -1);
+             break;
+             case e.ENTER:
+                 if(g.isEditor && !g.editing){
+                    g.startEditing(r, c);
+                    e.stopEvent();
+                    return;
+                }
+             break;
+        };
+        if(newCell){
+            this.select(newCell[0], newCell[1]);
+            e.stopEvent();
+        }
+    },
+
+    acceptsNav : function(row, col, cm){
+        return !cm.isHidden(col) && cm.isCellEditable(col, row);
+    },
+
+    onEditorKey : function(field, e){
+        var k = e.getKey(), newCell, g = this.grid, ed = g.activeEditor;
+        if(k == e.TAB){
+            if(e.shiftKey){
+                newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this);
+            }else{
+                newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this);
+            }
+            e.stopEvent();
+        }else if(k == e.ENTER && !e.ctrlKey){
+            ed.completeEdit();
+            e.stopEvent();
+        }else if(k == e.ESC){
+            ed.cancelEdit();
+        }
+        if(newCell){
+            g.startEditing(newCell[0], newCell[1]);
+        }
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/CheckItem.jss.html b/www/extras/yui-ext/docs/output/CheckItem.jss.html new file mode 100644 index 000000000..3330c0f19 --- /dev/null +++ b/www/extras/yui-ext/docs/output/CheckItem.jss.html @@ -0,0 +1,103 @@ +CheckItem.js

CheckItem.js

/**
+ * @class Ext.menu.CheckItem
+ * @extends Ext.menu.Item
+ * Adds a menu item that contains a checkbox by default, but can also be part of a radio group.
+ * @constructor
+ * Creates a new CheckItem
+ * @param {Object} config Configuration options
+ */
+Ext.menu.CheckItem = function(config){
+    Ext.menu.CheckItem.superclass.constructor.call(this, config);
+    this.addEvents({
+        /**
+         * @event beforecheckchange
+         * Fires before the checked value is set, providing an opportunity to cancel if needed
+         * @param {Ext.menu.CheckItem} this
+         * @param {Boolean} checked The new checked value that will be set
+         */
+        "beforecheckchange" : true,
+        /**
+         * @event checkchange
+         * Fires after the checked value has been set
+         * @param {Ext.menu.CheckItem} this
+         * @param {Boolean} checked The checked value that was set
+         */
+        "checkchange" : true
+    });
+    if(this.checkHandler){
+        this.on('checkchange', this.checkHandler, this.scope);
+    }
+};
+Ext.extend(Ext.menu.CheckItem, Ext.menu.Item, {
+    /**
+     * @cfg {String} group
+     * All check items with the same group name will automatically be grouped into a single-select
+     * radio button group (defaults to '')
+     */
+// holder
+/***
+     * @cfg {String} itemCls The default CSS class to use for check items (defaults to "x-menu-item x-menu-check-item")
+     */
+    itemCls : "x-menu-item x-menu-check-item",
+    /**
+     * @cfg {String} groupClass The default CSS class to use for radio group check items (defaults to "x-menu-group-item")
+     */
+    groupClass : "x-menu-group-item",
+
+    /**
+     * @cfg {Boolean} checked True to initialize this checkbox as checked (defaults to false).  Note that
+     * if this checkbox is part of a radio group (group = true) only the last item in the group that is
+     * initialized with checked = true will be rendered as checked.
+     */
+    checked: false,
+
+    // private
+    ctype: "Ext.menu.CheckItem",
+
+    // private
+    onRender : function(c){
+        Ext.menu.CheckItem.superclass.onRender.apply(this, arguments);
+        if(this.group){
+            this.el.addClass(this.groupClass);
+        }
+        Ext.menu.MenuMgr.registerCheckable(this);
+        if(this.checked){
+            this.checked = false;
+            this.setChecked(true, true);
+        }
+    },
+
+    // private
+    destroy : function(){
+        if(this.rendered){
+            Ext.menu.MenuMgr.unregisterCheckable(this);
+        }
+        Ext.menu.CheckItem.superclass.destroy.apply(this, arguments);
+    },
+
+    /**
+     * Set the checked state of this item
+     * @param {Boolean} checked The new checked value
+     * @param {Boolean} suppressEvent (optional) True to prevent the checkchange event from firing (defaults to false)
+     */
+    setChecked : function(state, suppressEvent){
+        if(this.checked != state && this.fireEvent("beforecheckchange", this, state) !== false){
+            if(this.container){
+                this.container[state ? "addClass" : "removeClass"]("x-menu-item-checked");
+            }
+            this.checked = state;
+            if(suppressEvent !== true){
+                this.fireEvent("checkchange", this, state);
+            }
+        }
+    },
+
+    // private
+    handleClick : function(e){
+       if(!this.disabled && !(this.checked && this.group)){// disable unselect on radio item
+           this.setChecked(!this.checked);
+       }
+       Ext.menu.CheckItem.superclass.handleClick.apply(this, arguments);
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Checkbox.jss.html b/www/extras/yui-ext/docs/output/Checkbox.jss.html new file mode 100644 index 000000000..74da17dd3 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Checkbox.jss.html @@ -0,0 +1,117 @@ +Checkbox.js

Checkbox.js

/**
+ * @class Ext.form.Checkbox
+ * @extends Ext.form.Field
+ * Single checkbox field.  Can be used as a direct replacement for traditional checkbox fields.
+ * @constructor
+ * Creates a new CheckBox
+ * @param {Object} config Configuration options
+ */
+Ext.form.Checkbox = function(config){
+    Ext.form.Checkbox.superclass.constructor.call(this, config);
+    this.addEvents({
+        /**
+         * @event check
+         * Fires when the checkbox is checked or unchecked
+	     * @param {Ext.form.Checkbox} this This checkbox
+	     * @param {Boolean} checked The new checked value
+	     */
+        check : true
+    });
+};
+
+Ext.extend(Ext.form.Checkbox, Ext.form.Field,  {
+    /**
+     * @cfg {String} focusClass The CSS class to use when the checkbox receives focus (defaults to 'x-form-check-focus')
+     */
+    focusClass : "x-form-check-focus",
+    /**
+     * @cfg {String} fieldClass The default CSS class for the checkbox (defaults to "x-form-field")
+     */
+    fieldClass: "x-form-field",
+    /**
+     * @cfg {Boolean} checked True if the the checkbox should render already checked (defaults to false)
+     */
+    checked: false,
+
+    // private
+    defaultAutoCreate : { tag: "input", type: 'checkbox', autocomplete: "off"},
+    /**
+     * @cfg {String} boxLabel The text that appears beside the checkbox
+     */
+    boxLabel : undefined,
+    /**
+     * @cfg {String} inputValue The value that should go into the generated input element's value attribute
+     */
+// holder
+/***
+     * Sets the width and height of the checkbox wrapper element
+     * @param {Number} width New width in pixels
+     * @param {Number} height New height in pixels
+     */
+    setSize : function(w, h){
+        if(!this.wrap){
+            this.width = w;
+            this.height = h;
+            return;
+        }
+        this.wrap.setSize(w, h);
+        if(!this.boxLabel){
+            this.el.alignTo(this.wrap, 'c-c');
+        }
+    },
+
+    initEvents : function(){
+        Ext.form.Checkbox.superclass.initEvents.call(this);
+        this.el.on("click", this.onClick,  this);
+        this.el.on("change", this.onClick,  this);
+    },
+
+    
+    // private
+    onRender : function(ct, position){
+        Ext.form.Checkbox.superclass.onRender.call(this, ct, position);
+        if(this.inputValue !== undefined){
+            this.el.dom.value = this.inputValue;
+        }
+        this.wrap = this.el.wrap({cls: "x-form-check-wrap"});
+        if(this.boxLabel){
+            this.wrap.createChild({tag: 'label', htmlFor: this.el.id, cls: 'x-form-cb-label', html: this.boxLabel});
+        }
+        if(this.checked){
+            this.setValue(true);
+        }
+    },
+
+    // private
+    initValue : Ext.emptyFn,
+
+    /**
+     * Returns the checked state of the checkbox.
+     * @return {Boolean} True if checked, else false
+     */
+    getValue : function(){
+        if(this.rendered){
+            return this.el.dom.checked;
+        }
+        return false;
+    },
+
+    onClick : function(){
+        if(this.el.dom.checked != this.checked){
+            this.setValue(this.el.dom.checked);
+        }
+    },
+
+    /**
+     * Sets the checked state of the checkbox
+     * @param {Boolean/String} checked True, 'true,' or '1' to check the checkbox, any other value will uncheck it
+     */
+    setValue : function(v){
+        this.checked = (v === true || v === 'true' || v == '1');
+        if(this.el && this.el.dom){
+            this.el.dom.checked = this.checked;
+        }
+        this.fireEvent("check", this, this.checked);
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ClickRepeater.jss.html b/www/extras/yui-ext/docs/output/ClickRepeater.jss.html new file mode 100644 index 000000000..4f9e6f202 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ClickRepeater.jss.html @@ -0,0 +1,163 @@ +ClickRepeater.js

ClickRepeater.js

/**
+ @class Ext.util.ClickRepeater
+ @extends Ext.util.Observable
+
+ A wrapper class which can be applied to any element. Fires a "click" event while the
+ mouse is pressed. The interval between firings may be specified in the config but
+ defaults to 10 milliseconds.
+
+ Optionally, a CSS class may be applied to the element during the time it is pressed.
+
+ @cfg {String/HTMLElement/Element} el The element to act as a button.
+ @cfg {Number} delay The initial delay before the repeating event begins firing.
+ Similar to an autorepeat key delay.
+ @cfg {Number} interval The interval between firings of the "click" event. Default 10 ms.
+ @cfg {String} pressClass A CSS class name to be applied to the element while pressed.
+ @cfg {Boolean} accelerate True if autorepeating should start slowly and accelerate.
+           "interval" and "delay" are ignored. "immediate" is honored.
+ @cfg {Boolean} preventDefault True to prevent the default click event
+ @cfg {Boolean} stopDefault True to stop the default click event
+
+ @history
+    2007-02-02 jvs Original code contributed by Nige "Animal" White
+    2007-02-02 jvs Renamed to ClickRepeater
+    2007-02-03 jvs Modifications for FF Mac and Safari 
+
+ @constructor
+ @param {String/HTMLElement/Element} el The element to listen on
+ @param {Object} config
+ */
+Ext.util.ClickRepeater = function(el, config)
+{
+    this.el = Ext.get(el);
+    this.el.unselectable();
+
+    Ext.apply(this, config);
+
+    this.addEvents({
+    /**
+     * @event mousedown
+     * Fires when the mouse button is depressed.
+     * @param {Ext.util.ClickRepeater} this
+     */
+        "mousedown" : true,
+    /**
+     * @event click
+     * Fires on a specified interval during the time the element is pressed.
+     * @param {Ext.util.ClickRepeater} this
+     */
+        "click" : true,
+    /**
+     * @event mouseup
+     * Fires when the mouse key is released.
+     * @param {Ext.util.ClickRepeater} this
+     */
+        "mouseup" : true
+    });
+
+    this.el.on("mousedown", this.handleMouseDown, this);
+    if(this.preventDefault || this.stopDefault){
+        this.el.on("click", function(e){
+            if(this.preventDefault){
+                e.preventDefault();
+            }
+            if(this.stopDefault){
+                e.stopEvent();
+            }
+        }, this);
+    }
+
+    // allow inline handler
+    if(this.handler){
+        this.on("click", this.handler,  this.scope || this);
+    }
+
+    Ext.util.ClickRepeater.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.util.ClickRepeater, Ext.util.Observable, {
+    interval : 20,
+    delay: 250,
+    preventDefault : true,
+    stopDefault : false,
+    timer : 0,
+    docEl : Ext.get(document),
+
+    // private
+    handleMouseDown : function(){
+        clearTimeout(this.timer);
+        this.el.blur();
+        if(this.pressClass){
+            this.el.addClass(this.pressClass);
+        }
+        this.mousedownTime = new Date();
+
+        this.docEl.on("mouseup", this.handleMouseUp, this);
+        this.el.on("mouseout", this.handleMouseOut, this);
+
+        this.fireEvent("mousedown", this);
+        this.fireEvent("click", this);
+        
+        this.timer = this.click.defer(this.delay || this.interval, this);
+    },
+
+    // private
+    click : function(){
+        this.fireEvent("click", this);
+        this.timer = this.click.defer(this.getInterval(), this);
+    },
+
+    // private
+    getInterval: function(){
+        if(!this.accelerate){
+            return this.interval;
+        }
+        var pressTime = this.mousedownTime.getElapsed();
+        if(pressTime < 500){
+            return 400;
+        }else if(pressTime < 1700){
+            return 320;
+        }else if(pressTime < 2600){
+            return 250;
+        }else if(pressTime < 3500){
+            return 180;
+        }else if(pressTime < 4400){
+            return 140;
+        }else if(pressTime < 5300){
+            return 80;
+        }else if(pressTime < 6200){
+            return 50;
+        }else{
+            return 10;
+        }
+    },
+
+    // private
+    handleMouseOut : function(){
+        clearTimeout(this.timer);
+        if(this.pressClass){
+            this.el.removeClass(this.pressClass);
+        }
+        this.el.on("mouseover", this.handleMouseReturn, this);
+    },
+
+    // private
+    handleMouseReturn : function(){
+        this.el.un("mouseover", this.handleMouseReturn);
+        if(this.pressClass){
+            this.el.addClass(this.pressClass);
+        }
+        this.click();
+    },
+
+    // private
+    handleMouseUp : function(){
+        clearTimeout(this.timer);
+        this.el.un("mouseover", this.handleMouseReturn);
+        this.el.un("mouseout", this.handleMouseOut);
+        this.docEl.un("mouseup", this.handleMouseUp);
+        this.el.removeClass(this.pressClass);
+        this.fireEvent("mouseup", this);
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ColorItem.jss.html b/www/extras/yui-ext/docs/output/ColorItem.jss.html new file mode 100644 index 000000000..a3fd462b4 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ColorItem.jss.html @@ -0,0 +1,19 @@ +ColorItem.js

ColorItem.js

/**
+ * @class Ext.menu.ColorItem
+ * @extends Ext.menu.Adapter
+ * A menu item that wraps the {@link Ext.ColorPalette} component.
+ * @constructor
+ * Creates a new ColorItem
+ * @param {Object} config Configuration options
+ */
+Ext.menu.ColorItem = function(config){
+    Ext.menu.ColorItem.superclass.constructor.call(this, new Ext.ColorPalette(config), config);
+    /** The Ext.ColorPalette object @type Ext.ColorPalette */
+    this.palette = this.component;
+    this.relayEvents(this.palette, ["select"]);
+    if(this.selectHandler){
+        this.on('select', this.selectHandler, this.scope);
+    }
+};
+Ext.extend(Ext.menu.ColorItem, Ext.menu.Adapter);

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ColorMenu.jss.html b/www/extras/yui-ext/docs/output/ColorMenu.jss.html new file mode 100644 index 000000000..406523550 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ColorMenu.jss.html @@ -0,0 +1,27 @@ +ColorMenu.js

ColorMenu.js

/**
+ * @class Ext.menu.ColorMenu
+ * @extends Ext.menu.Menu
+ * A menu containing a {@link Ext.menu.ColorItem} component (which provides a basic color picker).
+ * @constructor
+ * Creates a new ColorMenu
+ * @param {Object} config Configuration options
+ */
+Ext.menu.ColorMenu = function(config){
+    Ext.menu.ColorMenu.superclass.constructor.call(this, config);
+    this.plain = true;
+    var ci = new Ext.menu.ColorItem(config);
+    this.add(ci);
+    /**
+     * The {@link Ext.ColorPalette} instance for this ColorMenu
+     * @type ColorPalette
+     */
+    this.palette = ci.palette;
+    /**
+     * @event select
+     * @param {ColorPalette} palette
+     * @param {String} color
+     */
+    this.relayEvents(ci, ["select"]);
+};
+Ext.extend(Ext.menu.ColorMenu, Ext.menu.Menu);

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ColorPalette.jss.html b/www/extras/yui-ext/docs/output/ColorPalette.jss.html new file mode 100644 index 000000000..91a032a2f --- /dev/null +++ b/www/extras/yui-ext/docs/output/ColorPalette.jss.html @@ -0,0 +1,129 @@ +ColorPalette.js

ColorPalette.js

/**
+ * @class Ext.ColorPalette
+ * @extends Ext.Component
+ * Simple color palette class for choosing colors.  The palette can be rendered to any container.<br />
+ * Here's an example of typical usage:
+ * <pre><code>
+var cp = new Ext.ColorPalette({value:'993300'});  // initial selected color
+cp.render('my-div');
+
+cp.on('select', function(palette, selColor){
+    // do something with selColor
+});
+</code></pre>
+ * @constructor
+ * Create a new ColorPalette
+ * @param {Object} config The config object
+ */
+Ext.ColorPalette = function(config){
+    Ext.ColorPalette.superclass.constructor.call(this, config);
+    this.addEvents({
+        /**
+	     * @event select
+	     * Fires when a color is selected
+	     * @param {ColorPalette} this
+	     * @param {String} color The 6-digit color hex code (without the # symbol)
+	     */
+        select: true
+    });
+
+    if(this.handler){
+        this.on("select", this.handler, this.scope, true);
+    }
+};
+Ext.extend(Ext.ColorPalette, Ext.Component, {
+    /**
+     * @cfg {String} itemCls
+     * The CSS class to apply to the containing element (defaults to "x-color-palette")
+     */
+    itemCls : "x-color-palette",
+    /**
+     * @cfg {String} value
+     * The initial color to highlight (should be a valid 6-digit color hex code without the # symbol).  Note that
+     * the hex codes are case-sensitive.
+     */
+    value : null,
+
+    // private
+    ctype: "Ext.ColorPalette",
+
+    /**
+     * <p>An array of 6-digit color hex code strings (without the # symbol).  This array can contain any number
+     * of colors, and each hex code should be unique.  The width of the palette is controlled via CSS by adjusting
+     * the width property of the 'x-color-palette' class (or assigning a custom class), so you can balance the number
+     * of colors with the width setting until the box is symmetrical.</p>
+     * <p>You can override individual colors if needed:</p>
+     * <pre><code>
+var cp = new Ext.ColorPalette();
+cp.colors[0] = "FF0000";  // change the first box to red
+</code></pre>
+
+Or you can provide a custom array of your own for complete control:
+<pre><code>
+var cp = new Ext.ColorPalette();
+cp.colors = ["000000", "993300", "333300"];
+</code></pre>
+     * @type Array
+     */
+    colors : [
+        "000000", "993300", "333300", "003300", "003366", "000080", "333399", "333333",
+        "800000", "FF6600", "808000", "008000", "008080", "0000FF", "666699", "808080",
+        "FF0000", "FF9900", "99CC00", "339966", "33CCCC", "3366FF", "800080", "969696",
+        "FF00FF", "FFCC00", "FFFF00", "00FF00", "00FFFF", "00CCFF", "993366", "C0C0C0",
+        "FF99CC", "FFCC99", "FFFF99", "CCFFCC", "CCFFFF", "99CCFF", "CC99FF", "FFFFFF"
+    ],
+
+    // private
+    onRender : function(container, position){
+        var t = new Ext.MasterTemplate(
+            '<tpl><a href="#" class="color-{0}" hidefocus="on"><em><span style="background:#{0}">&#160;</span></em></a></tpl>'
+        );
+        var c = this.colors;
+        for(var i = 0, len = c.length; i < len; i++){
+            t.add([c[i]]);
+        }
+        var el = document.createElement("div");
+        el.className = this.itemCls;
+        t.overwrite(el);
+        container.dom.insertBefore(el, position);
+        this.el = Ext.get(el);
+        this.el.on("click", this.handleClick,  this, {delegate: "a"});
+    },
+
+    // private
+    afterRender : function(){
+        Ext.ColorPalette.superclass.afterRender.call(this);
+        if(this.value){
+            var s = this.value;
+            this.value = null;
+            this.select(s);
+        }
+    },
+
+    // private
+    handleClick : function(e, t){
+        e.preventDefault();
+        if(!this.disabled){
+            var c = t.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];
+            this.select(c.toUpperCase());
+        }
+    },
+
+    /**
+     * Selects the specified color in the palette (fires the select event)
+     * @param {String} color A valid 6-digit color hex code (# will be stripped if included)
+     */
+    select : function(color){
+        color = color.replace("#", "");
+        if(color != this.value){
+            var el = this.el;
+            if(this.value){
+                el.child("a.color-"+this.value).removeClass("x-color-palette-sel");
+            }
+            el.child("a.color-"+color).addClass("x-color-palette-sel");
+            this.value = color;
+            this.fireEvent("select", this, color);
+        }
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ColumnDD.jss.html b/www/extras/yui-ext/docs/output/ColumnDD.jss.html new file mode 100644 index 000000000..59335e581 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ColumnDD.jss.html @@ -0,0 +1,189 @@ +ColumnDD.js

ColumnDD.js

// private
+// This is a support class used internally by the Grid components
+Ext.grid.HeaderDragZone = function(grid, hd, hd2){
+    this.grid = grid;
+    this.view = grid.getView();
+    this.ddGroup = "gridHeader" + this.grid.container.id;
+    Ext.grid.HeaderDragZone.superclass.constructor.call(this, hd);
+    if(hd2){
+        this.setHandleElId(Ext.id(hd));
+        this.setOuterHandleElId(Ext.id(hd2));
+    }
+    this.scroll = false;
+};
+Ext.extend(Ext.grid.HeaderDragZone, Ext.dd.DragZone, {
+    maxDragWidth: 120,
+    getDragData : function(e){
+        var t = Ext.lib.Event.getTarget(e);
+        var h = this.view.findHeaderCell(t);
+        if(h){
+            return {ddel: h.firstChild, header:h};
+        }
+        return false;
+    },
+
+    onInitDrag : function(e){
+        this.view.headersDisabled = true;
+        var clone = this.dragData.ddel.cloneNode(true);
+        clone.style.width = Math.min(this.dragData.header.offsetWidth,this.maxDragWidth) + "px";
+        this.proxy.update(clone);
+        return true;
+    },
+
+    afterValidDrop : function(){
+        var v = this.view;
+        setTimeout(function(){
+            v.headersDisabled = false;
+        }, 50);
+    },
+
+    afterInvalidDrop : function(){
+        var v = this.view;
+        setTimeout(function(){
+            v.headersDisabled = false;
+        }, 50);
+    }
+});
+
+// private
+// This is a support class used internally by the Grid components
+Ext.grid.HeaderDropZone = function(grid, hd, hd2){
+    this.grid = grid;
+    this.view = grid.getView();
+    // split the proxies so they don't interfere with mouse events
+    this.proxyTop = Ext.DomHelper.append(document.body, {
+        tag:"div", cls:"col-move-top", html:"&#160;"
+    }, true);
+    this.proxyBottom = Ext.DomHelper.append(document.body, {
+        tag:"div", cls:"col-move-bottom", html:"&#160;"
+    }, true);
+    this.proxyTop.hide = this.proxyBottom.hide = function(){
+        this.setLeftTop(-100,-100);
+        this.setStyle("visibility", "hidden");
+    };
+    this.ddGroup = "gridHeader" + this.grid.container.id;
+    // temporarily disabled
+    //Ext.dd.ScrollManager.register(this.view.scroller.dom);
+    Ext.grid.HeaderDropZone.superclass.constructor.call(this, grid.container.dom);
+};
+Ext.extend(Ext.grid.HeaderDropZone, Ext.dd.DropZone, {
+    proxyOffsets : [-4, -9],
+    fly: Ext.Element.fly,
+
+    getTargetFromEvent : function(e){
+        var t = Ext.lib.Event.getTarget(e);
+        var cindex = this.view.findCellIndex(t);
+        if(cindex !== false){
+            return this.view.getHeaderCell(cindex);
+        }
+    },
+
+    nextVisible : function(h){
+        var v = this.view, cm = this.grid.colModel;
+        h = h.nextSibling;
+        while(h){
+            if(!cm.isHidden(v.getCellIndex(h))){
+                return h;
+            }
+            h = h.nextSibling;
+        }
+        return null;
+    },
+
+    prevVisible : function(h){
+        var v = this.view, cm = this.grid.colModel;
+        h = h.prevSibling;
+        while(h){
+            if(!cm.isHidden(v.getCellIndex(h))){
+                return h;
+            }
+            h = h.prevSibling;
+        }
+        return null;
+    },
+
+    positionIndicator : function(h, n, e){
+        var x = Ext.lib.Event.getPageX(e);
+        var r = Ext.lib.Dom.getRegion(n.firstChild);
+        var px, pt, py = r.top + this.proxyOffsets[1];
+        if((r.right - x) <= (r.right-r.left)/2){
+            px = r.right+this.view.borderWidth;
+            pt = "after";
+        }else{
+            px = r.left;
+            pt = "before";
+        }
+        var oldIndex = this.view.getCellIndex(h);
+        var newIndex = this.view.getCellIndex(n);
+        var locked = this.grid.colModel.isLocked(newIndex);
+        if(pt == "after"){
+            newIndex++;
+        }
+        if(oldIndex < newIndex){
+            newIndex--;
+        }
+        if(oldIndex == newIndex && (locked == this.grid.colModel.isLocked(oldIndex))){
+            return false;
+        }
+        px +=  this.proxyOffsets[0];
+        this.proxyTop.setLeftTop(px, py);
+        this.proxyTop.show();
+        if(!this.bottomOffset){
+            this.bottomOffset = this.view.mainHd.getHeight();
+        }
+        this.proxyBottom.setLeftTop(px, py+this.proxyTop.dom.offsetHeight+this.bottomOffset);
+        this.proxyBottom.show();
+        return pt;
+    },
+
+    onNodeEnter : function(n, dd, e, data){
+        if(data.header != n){
+            this.positionIndicator(data.header, n, e);
+        }
+    },
+
+    onNodeOver : function(n, dd, e, data){
+        var result = false;
+        if(data.header != n){
+            result = this.positionIndicator(data.header, n, e);
+        }
+        if(!result){
+            this.proxyTop.hide();
+            this.proxyBottom.hide();
+        }
+        return result ? this.dropAllowed : this.dropNotAllowed;
+    },
+
+    onNodeOut : function(n, dd, e, data){
+        this.proxyTop.hide();
+        this.proxyBottom.hide();
+    },
+
+    onNodeDrop : function(n, dd, e, data){
+        var h = data.header;
+        if(h != n){
+            var cm = this.grid.colModel;
+            var x = Ext.lib.Event.getPageX(e);
+            var r = Ext.lib.Dom.getRegion(n.firstChild);
+            var pt = (r.right - x) <= ((r.right-r.left)/2) ? "after" : "before";
+            var oldIndex = this.view.getCellIndex(h);
+            var newIndex = this.view.getCellIndex(n);
+            var locked = cm.isLocked(newIndex);
+            if(pt == "after"){
+                newIndex++;
+            }
+            if(oldIndex < newIndex){
+                newIndex--;
+            }
+            if(oldIndex == newIndex && (locked == cm.isLocked(oldIndex))){
+                return false;
+            }
+            cm.setLocked(oldIndex, locked, true);
+            cm.moveColumn(oldIndex, newIndex);
+            this.grid.fireEvent("columnmove", oldIndex, newIndex);
+            return true;
+        }
+        return false;
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ColumnModel.jss.html b/www/extras/yui-ext/docs/output/ColumnModel.jss.html new file mode 100644 index 000000000..738361fe2 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ColumnModel.jss.html @@ -0,0 +1,449 @@ +ColumnModel.js

ColumnModel.js

/**
+ * @class Ext.grid.ColumnModel
+ * @extends Ext.util.Observable
+ * 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 colModel = new Ext.grid.ColumnModel([
+	{header: "Ticker", width: 60, sortable: true, locked: true},
+	{header: "Company Name", width: 150, sortable: true},
+	{header: "Market Cap.", width: 100, sortable: true},
+	{header: "$ Sales", width: 100, sortable: true, renderer: money},
+	{header: "Employees", width: 100, sortable: true, resizable: false}
+ ]);
+ </code></pre>
+ * <p>
+ * The config options listed for this class, are options which may appear in each
+ * individual column definition.
+ * @constructor
+ * @param {Object} config An Array of column config objects. See this class's
+ * config objects for details.
+*/
+Ext.grid.ColumnModel = function(config){
+	Ext.grid.ColumnModel.superclass.constructor.call(this);
+    /**
+     * The config passed into the constructor
+     */
+    this.config = config;
+    this.lookup = {};
+
+    // if id, create one
+    // if the column does not have a dataIndex mapping,
+    // map it to the order it is in the config
+    for(var i = 0, len = config.length; i < len; i++){
+        if(typeof config[i].dataIndex == "undefined"){
+            config[i].dataIndex = i;
+        }
+        if(typeof config[i].renderer == "string"){
+            config[i].renderer = Ext.util.Format[config[i].renderer];
+        }
+        if(typeof config[i].id == "undefined"){
+            config[i].id = i;
+        }
+        this.lookup[config[i].id] = config[i];
+    }
+
+    /**
+     * 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;
+
+    this.addEvents({
+        /**
+	     * @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": true,
+        /**
+	     * @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": true,
+        /**
+	     * @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": true,
+	    /**
+         * @event columnmoved
+         * Fires when a column is moved
+         * @param {ColumnModel} this
+         * @param {Number} oldIndex
+         * @param {Number} newIndex
+         */
+        "columnmoved" : true,
+        /**
+         * @event columlockchange
+         * Fires when a column's locked state is changed
+         * @param {ColumnModel} this
+         * @param {Number} colIndex
+         * @param {Boolean} locked true if locked
+         */
+        "columnlockchange" : true
+    });
+    Ext.grid.ColumnModel.superclass.constructor.call(this);
+};
+Ext.extend(Ext.grid.ColumnModel, Ext.util.Observable, {
+    /**
+     * @cfg header {String} The header text to display in the Grid view.
+     */
+// holder
+/***
+     * @cfg dataIndex {String} The name of the field in the grid's {@link Ext.data.Store}'s
+     * {@link Ext.data.Record} definition from which to draw the column's value. If not
+     * specified, the column's index is used as an index into the Record's data Array.
+     */
+// holder
+/***
+     * @cfg width {Number} (Optional) The initial width in pixels of the column. Using this
+     * instead of {@link Ext.grid.Grid#autoSizeColumns} is more efficient.
+     */
+// holder
+/***
+     * @cfg sortable {Boolean} True if sorting is to be allowed on this column. Defaults to true.
+     * Whether local/remote sorting is used is specified in {@link Ext.data.Store#remoteSort}.
+     */
+// holder
+/***
+     * @cfg locked {Boolean} True to lock the column in place while scrolling the Grid.
+     * Defaults to false.
+     */
+// holder
+/***
+     * @cfg resizable {Boolean} False to disable column resizing. Defaults to true.
+     */
+// holder
+/***
+     * @cfg renderer {Function} (Optional) A function used to generate HTML markup for a cell
+     * given the cell's data value. See {@link #setRenderer}. If not specified, the
+     * default renderer uses the raw data value.
+     */
+// holder
+/***
+     * Returns the id of the column at the specified index
+     * @param {Number} index
+     * @return {String} the id
+     */
+    getColumnId : function(index){
+        return this.config[index].id;
+    },
+
+    getColumnById : function(id){
+        return this.lookup[id];
+    },
+
+    getIndexById : function(id){
+        for(var i = 0, len = this.config.length; i < len; i++){
+            if(this.config[i].id == id){
+                return i;
+            }
+        }
+        return -1;
+    },
+
+    moveColumn : function(oldIndex, newIndex){
+        var c = this.config[oldIndex];
+        this.config.splice(oldIndex, 1);
+        this.config.splice(newIndex, 0, c);
+        this.dataMap = null;
+        this.fireEvent("columnmoved", this, oldIndex, newIndex);
+    },
+
+    isLocked : function(colIndex){
+        return this.config[colIndex].locked === true;
+    },
+
+    setLocked : function(colIndex, value, suppressEvent){
+        if(this.isLocked(colIndex) == value){
+            return;
+        }
+        this.config[colIndex].locked = value;
+        if(!suppressEvent){
+            this.fireEvent("columnlockchange", this, colIndex, value);
+        }
+    },
+
+    getTotalLockedWidth : function(){
+        var totalWidth = 0;
+        for(var i = 0; i < this.config.length; i++){
+            if(this.isLocked(i) && !this.isHidden(i)){
+                this.totalWidth += this.getColumnWidth(i);
+            }
+        }
+        return totalWidth;
+    },
+
+    getLockedCount : function(){
+        for(var i = 0, len = this.config.length; i < len; i++){
+            if(!this.isLocked(i)){
+                return i;
+            }
+        }
+    },
+
+    /**
+     * Returns the number of columns.
+     * @return {Number}
+     */
+    getColumnCount : function(visibleOnly){
+        if(visibleOnly == true){
+            var c = 0;
+            for(var i = 0, len = this.config.length; i < len; i++){
+                if(!this.isHidden(i)){
+                    c++;
+                }
+            }
+            return c;
+        }
+        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 rendering (formatting) function defined for the column.
+     * @param {Number} col The column index.
+     * @return {Function} The function used to render the cell. See {@link #setRenderer}.
+     */
+    getRenderer : function(col){
+        if(!this.config[col].renderer){
+            return Ext.grid.ColumnModel.defaultRenderer;
+        }
+        return this.config[col].renderer;
+    },
+
+    /**
+     * Sets the rendering (formatting) function for a column.
+     * @param {Number} col The column index
+     * @param {Function} fn The function to use to process the cell's raw data
+     * to return HTML markup for the grid view. The render function is called with
+     * the following parameters:<ul>
+     * <li>Data value.</li>
+     * <li>Cell metadata. An object in which you may set the following attributes:<ul>
+     * <li>css A CSS style string to apply to the table cell.</li>
+     * <li>attr An HTML attribute definition string to apply to the data container element <i>within</i> the table cell.</li></ul>
+     * <li>The {@link Ext.data.Record} from which the data was extracted.</li>
+     * <li>Row index</li>
+     * <li>Column index</li>
+     * <li>The {@link Ext.data.Store} object from which the Record was extracted</li></ul>
+     */
+    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.fireEvent("widthchange", 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, len = this.config.length; i < len; 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.fireEvent("headerchange", this, col, header);
+    },
+
+    /**
+     * Returns the tooltip for the specified column.
+     * @param {Number} col The column index
+     * @return {String}
+     */
+    getColumnTooltip : function(col){
+            return this.config[col].tooltip;
+    },
+    /**
+     * Sets the tooltip for a column.
+     * @param {Number} col The column index
+     * @param {String} tooltip The new tooltip
+     */
+    setColumnTooltip : function(col, tooltip){
+            this.config[col].tooltip = tooltip;
+    },
+
+    /**
+     * Returns the dataIndex for the specified column.
+     * @param {Number} col The column index
+     * @return {Number}
+     */
+    getDataIndex : function(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;
+    },
+
+    findColumnIndex : function(dataIndex){
+        var c = this.config;
+        for(var i = 0, len = c.length; i < len; i++){
+            if(c[i].dataIndex == dataIndex){
+                return i;
+            }
+        }
+        return -1;
+    },
+
+    /**
+     * 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)) ? true : false;
+    },
+
+    /**
+     * 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
+     * @return {Boolean}
+     */
+    isResizable : function(colIndex){
+        return this.config[colIndex].resizable !== false;
+    },
+    /**
+     * Sets if a column is hidden.
+     * @param {Number} colIndex The column index
+     * @param {Boolean} hidden True if the column is hidden
+     */
+    setHidden : function(colIndex, hidden){
+        this.config[colIndex].hidden = hidden;
+        this.totalWidth = null;
+        this.fireEvent("hiddenchange", this, 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;
+    }
+});
+
+Ext.grid.ColumnModel.defaultRenderer = function(value){
+	if(typeof value == "string" && value.length < 1){
+	    return "&#160;";
+	}
+	return value;
+};
+
+// Alias for backwards compatibility
+Ext.grid.DefaultColumnModel = Ext.grid.ColumnModel;
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ColumnSplitDD.jss.html b/www/extras/yui-ext/docs/output/ColumnSplitDD.jss.html new file mode 100644 index 000000000..79f871d1e --- /dev/null +++ b/www/extras/yui-ext/docs/output/ColumnSplitDD.jss.html @@ -0,0 +1,57 @@ +ColumnSplitDD.js

ColumnSplitDD.js

// private
+// This is a support class used internally by the Grid components
+Ext.grid.SplitDragZone = function(grid, hd, hd2){
+    this.grid = grid;
+    this.view = grid.getView();
+    this.proxy = this.view.resizeProxy;
+    Ext.grid.SplitDragZone.superclass.constructor.call(this, hd,
+        "gridSplitters" + this.grid.container.id, {
+        dragElId : Ext.id(this.proxy.dom), resizeFrame:false
+    });
+    this.setHandleElId(Ext.id(hd));
+    this.setOuterHandleElId(Ext.id(hd2));
+    this.scroll = false;
+};
+Ext.extend(Ext.grid.SplitDragZone, Ext.dd.DDProxy, {
+    fly: Ext.Element.fly,
+
+    b4StartDrag : function(x, y){
+        this.view.headersDisabled = true;
+        this.proxy.setHeight(this.view.mainWrap.getHeight());
+        var w = this.cm.getColumnWidth(this.cellIndex);
+        var minw = Math.max(w-this.grid.minColumnWidth, 0);
+        this.resetConstraints();
+        this.setXConstraint(minw, 1000);
+        this.setYConstraint(0, 0);
+        this.minX = x - minw;
+        this.maxX = x + 1000;
+        this.startPos = x;
+        Ext.dd.DDProxy.prototype.b4StartDrag.call(this, x, y);
+    },
+
+
+    handleMouseDown : function(e){
+        ev = Ext.EventObject.setEvent(e);
+        var t = this.fly(ev.getTarget());
+        if(t.hasClass("x-grid-split")){
+            this.cellIndex = this.view.getCellIndex(t.dom);
+            this.split = t.dom;
+            this.cm = this.grid.colModel;
+            if(this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)){
+                Ext.grid.SplitDragZone.superclass.handleMouseDown.apply(this, arguments);
+            }
+        }
+    },
+
+    endDrag : function(e){
+        this.view.headersDisabled = false;
+        var endX = Math.max(this.minX, Ext.lib.Event.getPageX(e));
+        var diff = endX - this.startPos;
+        this.view.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex)+diff);
+    },
+
+    autoOffset : function(){
+        this.setDelta(0,0);
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Combo.jss.html b/www/extras/yui-ext/docs/output/Combo.jss.html new file mode 100644 index 000000000..5d64e2477 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Combo.jss.html @@ -0,0 +1,801 @@ +Combo.js

Combo.js

/**
+ * @class Ext.form.ComboBox
+ * @extends Ext.form.TriggerField
+ * A combobox control with support for autocomplete, remote-loading, paging and many other features.
+ * @constructor
+ * Create a new ComboBox.
+ * @param {Object} config Configuration options
+ */
+Ext.form.ComboBox = function(config){
+    Ext.form.ComboBox.superclass.constructor.call(this, config);
+    this.addEvents({
+        /**
+         * @event expand
+         * Fires when the dropdown list is expanded
+	     * @param {Ext.form.ComboBox} combo This combo box
+	     */
+        'expand' : true,
+        /**
+         * @event collapse
+         * Fires when the dropdown list is collapsed
+	     * @param {Ext.form.ComboBox} combo This combo box
+	     */
+        'collapse' : true,
+        /**
+         * @event beforeselect
+         * Fires before a list item is selected. Return false to cancel the selection.
+	     * @param {Ext.form.ComboBox} combo This combo box
+	     * @param {Ext.data.Record} record The data record returned from the underlying store
+	     * @param {Number} index The index of the selected item in the dropdown list
+	     */
+        'beforeselect' : true,
+        /**
+         * @event select
+         * Fires when a list item is selected
+	     * @param {Ext.form.ComboBox} combo This combo box
+	     * @param {Ext.data.Record} record The data record returned from the underlying store
+	     * @param {Number} index The index of the selected item in the dropdown list
+	     */
+        'select' : true,
+        /**
+         * @event beforequery
+         * Fires before all queries are processed. Return false to cancel the query or set cancel to true.
+         * The event object passed has these properties:
+         * <ul style="padding:5px;padding-left:16px;">
+	     * <li>{Ext.form.ComboBox} combo - This combo box</li>
+	     * <li>{String} query - The query</li>
+	     * <li>{Boolean} forceAll - true to force "all" query</li>
+	     * <li>{Boolean} cancel - set to true to cancel the query.</li>
+	     * </ul>
+	     * @param {Object} e The query event object
+	     */
+        'beforequery': true
+    });
+    if(this.transform){
+        var s = Ext.getDom(this.transform);
+        if(!this.hiddenName){
+            this.hiddenName = s.name;
+        }
+        if(!this.store){
+            this.mode = 'local';
+            var d = [], opts = s.options;
+            for(var i = 0, len = opts.length;i < len; i++){
+                var o = opts[i];
+                var value = (Ext.isIE ? o.getAttributeNode('value').specified : o.hasAttribute('value')) ? o.value : o.text;
+                if(o.selected) {
+                    this.value = value;
+                }
+                d.push([value, o.text]);
+            }
+            this.store = new Ext.data.SimpleStore({
+                'id': 0,
+                fields: ['value', 'text'],
+                data : d
+            });
+            this.valueField = 'value';
+            this.displayField = 'text';
+        }
+        s.name = Ext.id(); // wipe out the name in case somewhere else they have a reference
+        if(!this.lazyRender){
+            this.target = true;
+            this.el = Ext.DomHelper.insertBefore(s, this.autoCreate || this.defaultAutoCreate);
+            s.parentNode.removeChild(s); // remove it
+            this.render(this.el.parentNode);
+        }else{
+            s.parentNode.removeChild(s); // remove it
+        }
+
+    }
+    this.selectedIndex = -1;
+    if(this.mode == 'local'){
+        if(config.queryDelay === undefined){
+            this.queryDelay = 10;
+        }
+        if(config.minChars === undefined){
+            this.minChars = 0;
+        }
+    }
+};
+
+Ext.extend(Ext.form.ComboBox, Ext.form.TriggerField, {
+    /**
+     * @cfg {String/HTMLElement/Element} transform The id, DOM node or element of an existing select to convert to a ComboBox
+     */
+// holder
+/***
+     * @cfg {Boolean} lazyRender True to prevent the ComboBox from rendering until requested (should always be used when
+     * rendering into an Ext.Editor, defaults to false)
+     */
+// holder
+/***
+     * @cfg {Boolean/Object} autoCreate A DomHelper element spec, or true for a default element spec (defaults to:
+     * {tag: "input", type: "text", size: "24", autocomplete: "off"})
+     */
+
+    // private
+    defaultAutoCreate : {tag: "input", type: "text", size: "24", autocomplete: "off"},
+    /**
+     * @cfg {Number} listWidth The width in pixels of the dropdown list (defaults to the width of the ComboBox field)
+     */
+    listWidth: undefined,
+    /**
+     * @cfg {String} displayField The underlying data field name to bind to this CombBox (defaults to undefined if
+     * mode = 'remote' or 'text' if mode = 'local')
+     */
+    displayField: undefined,
+    /**
+     * @cfg {String} valueField The underlying data value name to bind to this CombBox (defaults to undefined if
+     * mode = 'remote' or 'value' if mode = 'local')
+     */
+    valueField: undefined,
+    /**
+     * @cfg {String} hiddenName If specified, a hidden form field with this name is dynamically generated to store the
+     * field's data value (defaults to the underlying DOM element's name)
+     */
+    hiddenName: undefined,
+    /**
+     * @cfg {String} listClass CSS class to apply to the dropdown list element (defaults to '')
+     */
+    listClass: '',
+    /**
+     * @cfg {String} selectedClass CSS class to apply to the selected item in the dropdown list (defaults to 'x-combo-selected')
+     */
+    selectedClass: 'x-combo-selected',
+    /**
+     * @cfg {String} triggerClass An additional CSS class used to style the trigger button.  The trigger will always get the
+     * class 'x-form-trigger' and triggerClass will be <b>appended</b> if specified (defaults to 'x-form-arrow-trigger'
+     * which displays a downward arrow icon).
+     */
+    triggerClass : 'x-form-arrow-trigger',
+    /**
+     * @cfg {Boolean/String} shadow True or "sides" for the default effect, "frame" for 4-way shadow, and "drop" for bottom-right
+     */
+    shadow:'sides',
+    /**
+     * @cfg {String} listAlign A valid anchor position value. See {@link Ext.Element#alignTo} for details on supported
+     * anchor positions (defaults to 'tl-bl')
+     */
+    listAlign: 'tl-bl?',
+    /**
+     * @cfg {Number} maxHeight The maximum height in pixels of the dropdown list before scrollbars are shown (defaults to 300)
+     */
+    maxHeight: 300,
+    /**
+     * @cfg {String} triggerAction The action to execute when the trigger field is activated.  Use 'all' to run the
+     * query specified by the allQuery config option (defaults to 'query')
+     */
+    triggerAction: 'query',
+    /**
+     * @cfg {Number} minChars The minimum number of characters the user must type before autocomplete and typeahead activate
+     * (defaults to 4, does not apply if editable = false)
+     */
+    minChars : 4,
+    /**
+     * @cfg {Boolean} typeAhead True to populate and autoselect the remainder of the text being typed after a configurable
+     * delay (typeAheadDelay) if it matches a known value (defaults to false)
+     */
+    typeAhead: false,
+    /**
+     * @cfg {Number} queryDelay The length of time in milliseconds to delay between the start of typing and sending the
+     * query to filter the dropdown list (defaults to 500 if mode = 'remote' or 10 if mode = 'local')
+     */
+    queryDelay: 500,
+    /**
+     * @cfg {Number} pageSize If greater than 0, a paging toolbar is displayed in the footer of the dropdown list and the
+     * filter queries will execute with page start and limit parameters.  Only applies when mode = 'remote' (defaults to 0)
+     */
+    pageSize: 0,
+    /**
+     * @cfg {Boolean} selectOnFocus True to select any existing text in the field immediately on focus.  Only applies
+     * when editable = true (defaults to false)
+     */
+    selectOnFocus:false,
+    /**
+     * @cfg {String} queryParam Name of the query as it will be passed on the querystring (defaults to 'query')
+     */
+    queryParam: 'query',
+    /**
+     * @cfg {String} loadingText The text to display in the dropdown list while data is loading.  Only applies
+     * when mode = 'remote' (defaults to 'Loading...')
+     */
+    loadingText: 'Loading...',
+    /**
+     * @cfg {Boolean} resizable True to add a resize handle to the bottom of the dropdown list (defaults to false)
+     */
+    resizable: false,
+    /**
+     * @cfg {Number} handleHeight The height in pixels of the dropdown list resize handle if resizable = true (defaults to 8)
+     */
+    handleHeight : 8,
+    /**
+     * @cfg {Boolean} editable False to prevent the user from typing text directly into the field, just like a
+     * traditional select (defaults to true)
+     */
+    editable: true,
+    /**
+     * @cfg {String} allQuery The text query to send to the server to return all records for the list with no filtering (defaults to '')
+     */
+    allQuery: '',
+    /**
+     * @cfg {String} mode Set to 'local' if the ComboBox loads local data (defaults to 'remote' which loads from the server)
+     */
+    mode: 'remote',
+    /**
+     * @cfg {Number} minListWidth The minimum width of the dropdown list in pixels (defaults to 70, will be ignored if
+     * listWidth has a higher value)
+     */
+    minListWidth : 70,
+    /**
+     * @cfg {Boolean} forceSelection True to restrict the selected value to one of the values in the list, false to
+     * allow the user to set arbitrary text into the field (defaults to false)
+     */
+    forceSelection:false,
+    /**
+     * @cfg {Number} typeAheadDelay The length of time in milliseconds to wait until the typeahead text is displayed
+     * if typeAhead = true (defaults to 250)
+     */
+    typeAheadDelay : 250,
+    /**
+     * @cfg {String} valueNotFoundText When using a name/value combo, if the value passed to setValue is not found in
+     * the store, valueNotFoundText will be displayed as the field text if defined (defaults to undefined)
+     */
+    valueNotFoundText : undefined,
+
+    // private
+    onRender : function(ct, position){
+        Ext.form.ComboBox.superclass.onRender.call(this, ct, position);
+        if(this.hiddenName){
+            this.hiddenField = this.el.insertSibling({tag:'input', type:'hidden', name: this.hiddenName, id: this.hiddenName},
+                    'before', true);
+            this.hiddenField.value =
+                this.hiddenValue !== undefined ? this.hiddenValue :
+                this.value !== undefined ? this.value : '';
+
+            // prevent input submission
+            this.el.dom.removeAttribute('name');
+        }
+        if(Ext.isGecko){
+            this.el.dom.setAttribute('autocomplete', 'off');
+        }
+
+        var cls = 'x-combo-list';
+
+        this.list = new Ext.Layer({
+            shadow: this.shadow, cls: [cls, this.listClass].join(' '), constrain:false
+        });
+
+        this.list.setWidth(this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth));
+        this.list.swallowEvent('mousewheel');
+        this.assetHeight = 0;
+
+        if(this.title){
+            this.header = this.list.createChild({cls:cls+'-hd', html: this.title});
+            this.assetHeight += this.header.getHeight();
+        }
+
+        this.innerList = this.list.createChild({cls:cls+'-inner'});
+        this.innerList.on('mouseover', this.onViewOver, this);
+        this.innerList.on('mousemove', this.onViewMove, this);
+
+        if(this.pageSize){
+            this.footer = this.list.createChild({cls:cls+'-ft'});
+            this.pageTb = new Ext.PagingToolbar(this.footer, this.store,
+                    {pageSize: this.pageSize});
+            this.assetHeight += this.footer.getHeight();
+        }
+
+        if(!this.tpl){
+            this.tpl = '<div class="'+cls+'-item">{' + this.displayField + '}</div>';
+        }
+
+        this.view = new Ext.View(this.innerList, this.tpl, {
+            singleSelect:true, store: this.store, selectedClass: this.selectedClass
+        });
+
+        this.view.on('click', this.onViewClick, this);
+
+        this.store.on('beforeload', this.onBeforeLoad, this);
+        this.store.on('load', this.onLoad, this);
+        this.store.on('loadexception', this.collapse, this);
+
+        if(this.resizable){
+            this.resizer = new Ext.Resizable(this.list,  {
+               pinned:true, handles:'se'
+            });
+            this.resizer.on('resize', function(r, w, h){
+                this.maxHeight = h-this.handleHeight-this.list.getFrameWidth('tb')-this.assetHeight;
+                this.listWidth = w;
+                this.restrictHeight();
+            }, this);
+            this[this.pageSize?'footer':'innerList'].setStyle('margin-bottom', this.handleHeight+'px');
+        }
+        if(!this.editable){
+            this.editable = true;
+            this.setEditable(false);
+        }
+    },
+
+    // private
+    initEvents : function(){
+        Ext.form.ComboBox.superclass.initEvents.call(this);
+
+        this.keyNav = new Ext.KeyNav(this.el, {
+            "up" : function(e){
+                this.inKeyMode = true;
+                this.selectPrev();
+            },
+
+            "down" : function(e){
+                if(!this.isExpanded()){
+                    this.onTriggerClick();
+                }else{
+                    this.inKeyMode = true;
+                    this.selectNext();
+                }
+            },
+
+            "enter" : function(e){
+                this.onViewClick();
+                //return true;
+            },
+
+            "esc" : function(e){
+                this.collapse();
+            },
+
+            "tab" : function(e){
+                this.onViewClick(false);
+                return true;
+            },
+
+            scope : this,
+
+            doRelay : function(foo, bar, hname){
+                if(hname == 'down' || this.scope.isExpanded()){
+                   return Ext.KeyNav.prototype.doRelay.apply(this, arguments);
+                }
+                return true;
+            }
+        });
+        this.queryDelay = Math.max(this.queryDelay || 10,
+                this.mode == 'local' ? 10 : 250);
+        this.dqTask = new Ext.util.DelayedTask(this.initQuery, this);
+        if(this.typeAhead){
+            this.taTask = new Ext.util.DelayedTask(this.onTypeAhead, this);
+        }
+        if(this.editable !== false){
+            this.el.on("keyup", this.onKeyUp, this);
+        }
+        if(this.forceSelection){
+            this.on('blur', this.doForce, this);
+        }
+    },
+
+    onDestroy : function(){
+        if(this.view){
+            this.view.setStore(null);
+            this.view.el.removeAllListeners();
+            this.view.el.remove();
+            this.view.purgeListeners();
+        }
+        if(this.list){
+            this.list.destroy();
+        }
+        if(this.store){
+            this.store.un('beforeload', this.onBeforeLoad, this);
+            this.store.un('load', this.onLoad, this);
+            this.store.un('loadexception', this.collapse, this);
+        }
+        Ext.form.ComboBox.superclass.onDestroy.call(this);
+    },
+
+    // private
+    fireKey : function(e){
+        if(e.isNavKeyPress() && !this.list.isVisible()){
+            this.fireEvent("specialkey", this, e);
+        }
+    },
+
+    // private
+    onResize: function(w, h){
+        if(this.list && this.listWidth === undefined){
+            this.list.setWidth(Math.max(w, this.minListWidth));
+        }
+    },
+
+    /**
+     * Allow or prevent the user from directly editing the field text.  If false is passed in,
+     * the user will only be able to select from the items defined in the dropdown list.  This method
+     * is the runtime equivalent of setting the editable config option at config time.
+     */
+    setEditable : function(value){
+        if(value == this.editable){
+            return;
+        }
+        this.editable = value;
+        if(!value){
+            this.el.dom.setAttribute('readOnly', true);
+            this.el.on('mousedown', this.onTriggerClick,  this);
+            this.el.addClass('x-combo-noedit');
+        }else{
+            this.el.dom.setAttribute('readOnly', false);
+            this.el.un('mousedown', this.onTriggerClick,  this);
+            this.el.removeClass('x-combo-noedit');
+        }
+    },
+
+    // private
+    onBeforeLoad : function(){
+        if(!this.hasFocus){
+            return;
+        }
+        this.innerList.update(this.loadingText ?
+               '<div class="loading-indicator">'+this.loadingText+'</div>' : '');
+        this.restrictHeight();
+        this.selectedIndex = -1;
+    },
+
+    // private
+    onLoad : function(){
+        if(!this.hasFocus){
+            return;
+        }
+        if(this.store.getCount() > 0){
+            this.expand();
+            this.restrictHeight();
+            if(this.lastQuery == this.allQuery){
+                if(this.editable){
+                    this.el.dom.select();
+                }
+                if(!this.selectByValue(this.value, true)){
+                    this.select(0, true);
+                }
+            }else{
+                this.selectNext();
+                if(this.typeAhead && this.lastKey != Ext.EventObject.BACKSPACE && this.lastKey != Ext.EventObject.DELETE){
+                    this.taTask.delay(this.typeAheadDelay);
+                }
+            }
+        }else{
+            this.onEmptyResults();
+        }
+        //this.el.focus();
+    },
+
+    // private
+    onTypeAhead : function(){
+        if(this.store.getCount() > 0){
+            var r = this.store.getAt(0);
+            var newValue = r.data[this.displayField];
+            var len = newValue.length;
+            var selStart = this.getRawValue().length;
+            if(selStart != len){
+                this.setRawValue(newValue);
+                this.selectText(selStart, newValue.length);
+            }
+        }
+    },
+
+    // private
+    onSelect : function(record, index){
+        if(this.fireEvent('beforeselect', this, record, index) !== false){
+            this.setValue(record.data[this.valueField || this.displayField]);
+            this.collapse();
+            this.fireEvent('select', this, record, index);
+        }
+    },
+
+    /**
+     * Returns the currently-selected field value or empty string if no value is set.
+     * @return {String} value The selected value
+     */
+    getValue : function(){
+        if(this.valueField){
+            return typeof this.value != 'undefined' ? this.value : '';
+        }else{
+            return Ext.form.ComboBox.superclass.getValue.call(this);
+        }
+    },
+
+    /**
+     * Clears any text/value currently set in the field
+     */
+    clearValue : function(){
+        if(this.hiddenField){
+            this.hiddenField.value = '';
+        }
+        this.setRawValue('');
+        this.lastSelectionText = '';
+    },
+
+    /**
+     * Sets the specified value into the field.  If the value finds a match, the corresponding record text
+     * will be displayed in the field.  If the value does not match the data value of an existing item,
+     * and the valueNotFoundText config option is defined, it will be displayed as the default field text.
+     * Otherwise the field will be blank (although the value will still be set).
+     * @param {String} value The value to match
+     */
+    setValue : function(v){
+        var text = v;
+        if(this.valueField){
+            var r = this.findRecord(this.valueField, v);
+            if(r){
+                text = r.data[this.displayField];
+            }else if(this.valueNotFoundText){
+                text = this.valueNotFoundText;
+            }
+        }
+        this.lastSelectionText = text;
+        if(this.hiddenField){
+            this.hiddenField.value = v;
+        }
+        Ext.form.ComboBox.superclass.setValue.call(this, text);
+        this.value = v;
+    },
+
+    // private
+    findRecord : function(prop, value){
+        var record;
+        if(this.store.getCount() > 0){
+            this.store.each(function(r){
+                if(r.data[prop] == value){
+                    record = r;
+                    return false;
+                }
+            });
+        }
+        return record;
+    },
+
+    // private
+    onViewMove : function(e, t){
+        this.inKeyMode = false;
+    },
+
+    // private
+    onViewOver : function(e, t){
+        if(this.inKeyMode){ // prevent key nav and mouse over conflicts
+            return;
+        }
+        var item = this.view.findItemFromChild(t);
+        if(item){
+            var index = this.view.indexOf(item);
+            this.select(index, false);
+        }
+    },
+
+    // private
+    onViewClick : function(doFocus){
+        var index = this.view.getSelectedIndexes()[0];
+        var r = this.store.getAt(index);
+        if(r){
+            this.onSelect(r, index);
+        }
+        if(doFocus !== false){
+            this.el.focus();
+        }
+    },
+
+    // private
+    restrictHeight : function(){
+        this.innerList.dom.style.height = '';
+        var inner = this.innerList.dom;
+        var h = Math.max(inner.clientHeight, inner.offsetHeight, inner.scrollHeight);
+        this.innerList.setHeight(h < this.maxHeight ? 'auto' : this.maxHeight);
+        this.list.beginUpdate();
+        this.list.setHeight(this.innerList.getHeight()+this.list.getFrameWidth('tb')+(this.resizable?this.handleHeight:0)+this.assetHeight);
+        this.list.alignTo(this.el, this.listAlign);
+        this.list.endUpdate();
+    },
+
+    // private
+    onEmptyResults : function(){
+        this.collapse();
+    },
+
+    /**
+     * Returns true if the dropdown list is expanded, else false.
+     */
+    isExpanded : function(){
+        return this.list.isVisible();
+    },
+
+    /**
+     * Select an item in the dropdown list by its data value
+     * @param {String} value The data value of the item to select
+     * @param {Boolean} scrollIntoView False to prevent the dropdown list from autoscrolling to display the
+     * selected item if it is not currently in view (defaults to true)
+     * @return {Boolean} valueFound True if the value matched an item in the list, else false
+     */
+    selectByValue : function(v, scrollIntoView){
+        if(v !== undefined && v !== null){
+            var r = this.findRecord(this.valueField || this.displayField, v);
+            if(r){
+                this.select(this.store.indexOf(r), scrollIntoView);
+                return true;
+            }
+        }
+        return false;
+    },
+
+    /**
+     * Select an item in the dropdown list by its numeric index in the list
+     * @param {Number} index The zero-based index of the list item to select
+     * @param {Boolean} scrollIntoView False to prevent the dropdown list from autoscrolling to display the
+     * selected item if it is not currently in view (defaults to true)
+     */
+    select : function(index, scrollIntoView){
+        this.selectedIndex = index;
+        this.view.select(index);
+        if(scrollIntoView !== false){
+            var el = this.view.getNode(index);
+            if(el){
+                this.innerList.scrollChildIntoView(el);
+            }
+        }
+    },
+
+    /**
+     * Select the next item in the dropdown list (selects the first item by default if no items are currently selected)
+     */
+    selectNext : function(){
+        var ct = this.store.getCount();
+        if(ct > 0){
+            if(this.selectedIndex == -1){
+                this.select(0);
+            }else if(this.selectedIndex < ct-1){
+                this.select(this.selectedIndex+1);
+            }
+        }
+    },
+
+    /**
+     * Select the previous item in the dropdown list (selects the first item by default if no items are currently selected)
+     */
+    selectPrev : function(){
+        var ct = this.store.getCount();
+        if(ct > 0){
+            if(this.selectedIndex == -1){
+                this.select(0);
+            }else if(this.selectedIndex != 0){
+                this.select(this.selectedIndex-1);
+            }
+        }
+    },
+
+    // private
+    onKeyUp : function(e){
+        if(this.editable !== false && !e.isSpecialKey()){
+            this.lastKey = e.getKey();
+            this.dqTask.delay(this.queryDelay);
+        }
+    },
+
+    // private
+    validateBlur : function(){
+        return !this.list || !this.list.isVisible();   
+    },
+
+    // private
+    initQuery : function(){
+        this.doQuery(this.getRawValue());
+    },
+
+    // private
+    doForce : function(){
+        if(this.el.dom.value.length > 0){
+            this.el.dom.value =
+                this.lastSelectionText === undefined ? '' : this.lastSelectionText;
+            this.applyEmptyText();
+        }
+    },
+
+    /**
+     * Execute a query to filter the dropdown list.  Fires the beforequery event prior to performing the
+     * query allowing the query action to be canceled if needed.
+     * @param {String} query The sql query to execute
+     * @param {Boolean} forceAll True to force the query to execute even if there are currently fewer characters
+     * in the field than the minimum specified by the minChars config option.  It also clears any filter previously
+     * saved in the current store (defaults to false)
+     */
+    doQuery : function(q, forceAll){
+        if(q === undefined || q === null){
+            q = '';
+        }
+        var qe = {
+            query: q,
+            forceAll: forceAll,
+            combo: this,
+            cancel:false
+        };
+        if(this.fireEvent('beforequery', qe)===false || qe.cancel){
+            return false;
+        }
+        q = qe.query;
+        forceAll = qe.forceAll;
+        if(forceAll === true || (q.length >= this.minChars)){
+            if(this.lastQuery != q){
+                this.lastQuery = q;
+                if(this.mode == 'local'){
+                    this.selectedIndex = -1;
+                    if(forceAll){
+                        this.store.clearFilter();
+                    }else{
+                        this.store.filter(this.displayField, q);
+                    }
+                    this.onLoad();
+                }else{
+                    this.store.baseParams[this.queryParam] = q;
+                    this.store.load({
+                        params: this.getParams(q)
+                    });
+                    this.expand();
+                }
+            }else{
+                this.selectedIndex = -1;
+                this.onLoad();   
+            }
+        }
+    },
+
+    // private
+    getParams : function(q){
+        var p = {};
+        //p[this.queryParam] = q;
+        if(this.pageSize){
+            p.start = 0;
+            p.limit = this.pageSize;
+        }
+        return p;
+    },
+
+    /**
+     * Hides the dropdown list if it is currently expanded. Fires the 'collapse' event on completion.
+     */
+    collapse : function(){
+        if(!this.isExpanded()){
+            return;
+        }
+        this.list.hide();
+        Ext.get(document).un('mousedown', this.collapseIf, this);
+        this.fireEvent('collapse', this);
+    },
+
+    // private
+    collapseIf : function(e){
+        if(!e.within(this.wrap) && !e.within(this.list)){
+            this.collapse();
+        }
+    },
+
+    /**
+     * Expands the dropdown list if it is currently hidden. Fires the 'expand' event on completion.
+     */
+    expand : function(){
+        if(this.isExpanded() || !this.hasFocus){
+            return;
+        }
+        this.list.alignTo(this.el, this.listAlign);
+        this.list.show();
+        Ext.get(document).on('mousedown', this.collapseIf, this);
+        this.fireEvent('expand', this);
+    },
+
+    // private
+    // Implements the default empty TriggerField.onTriggerClick function
+    onTriggerClick : function(){
+        if(this.disabled){
+            return;
+        }
+        if(this.isExpanded()){
+            this.collapse();
+            this.el.focus();
+        }else{
+            this.hasFocus = true;
+            this.doQuery(this.triggerAction == 'all' ?
+                     this.doQuery(this.allQuery, true) : this.doQuery(this.getRawValue()));
+            this.el.focus();
+        }
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Component.jss.html b/www/extras/yui-ext/docs/output/Component.jss.html new file mode 100644 index 000000000..2e5c839f8 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Component.jss.html @@ -0,0 +1,406 @@ +Component.js

Component.js

/**
+ * @class Ext.ComponentMgr
+ * Provides a common registry of all components on a page so that they can be easily accessed by component id.
+ * @singleton
+ */
+Ext.ComponentMgr = function(){
+    var all = new Ext.util.MixedCollection();
+
+    return {
+        // private
+        register : function(c){
+            all.add(c);
+        },
+
+        // private
+        unregister : function(c){
+            all.remove(c);
+        },
+
+        /**
+         * Returns a component by id
+         * @param {String} id The component id
+         */
+        get : function(id){
+            return all.get(id);
+        },
+
+        /**
+         * Registers a function that will be called when a specified component is added to ComponentMgr
+         * @param {String} id The component id
+         * @param {Funtction} fn The callback function
+         * @param {Object} scope The scope of the callback
+         */
+        onAvailable : function(id, fn, scope){
+            all.on("add", function(index, o){
+                if(o.id == id){
+                    fn.call(scope || o, o);
+                    all.un("add", fn, scope);
+                }
+            });
+        }
+    };
+}();
+
+/**
+ * @class Ext.Component
+ * @extends Ext.util.Observable
+ * Base class for all Ext form controls that provides a common set of events and functionality shared by all components.
+ * @constructor
+ * @param {Ext.Element/String/Object} config The configuration options.  If an element is passed, it is set as the internal
+ * element and its id used as the component id.  If a string is passed, it is assumed to be the id of an existing element
+ * and is used as the component id.  Otherwise, it is assumed to be a standard config object and is applied to the component.
+ */
+Ext.Component = function(config){
+    config = config || {};
+    if(config.tagName || config.dom || typeof config == "string"){ // element object
+        config = {el: config, id: config.id || config};
+    }
+    this.initialConfig = config;
+
+    Ext.apply(this, config);
+    this.addEvents({
+        /**
+         * @event disable
+         * Fires after the component is disabled
+	     * @param {Ext.Component} this
+	     */
+        disable : true,
+        /**
+         * @event enable
+         * Fires after the component is enabled
+	     * @param {Ext.Component} this
+	     */
+        enable : true,
+        /**
+         * @event beforeshow
+         * Fires before the component is shown
+	     * @param {Ext.Component} this
+	     */
+        beforeshow : true,
+        /**
+         * @event show
+         * Fires after the component is shown
+	     * @param {Ext.Component} this
+	     */
+        show : true,
+        /**
+         * @event beforehide
+         * Fires before the component is hidden
+	     * @param {Ext.Component} this
+	     */
+        beforehide : true,
+        /**
+         * @event hide
+         * Fires after the component is hidden
+	     * @param {Ext.Component} this
+	     */
+        hide : true,
+        /**
+         * @event beforerender
+         * Fires before the component is rendered
+	     * @param {Ext.Component} this
+	     */
+        beforerender : true,
+        /**
+         * @event render
+         * Fires after the component is rendered
+	     * @param {Ext.Component} this
+	     */
+        render : true,
+        /**
+         * @event beforedestroy
+         * Fires before the component is destroyed
+	     * @param {Ext.Component} this
+	     */
+        beforedestroy : true,
+        /**
+         * @event destroy
+         * Fires after the component is destroyed
+	     * @param {Ext.Component} this
+	     */
+        destroy : true
+    });
+    if(!this.id){
+        this.id = "ext-comp-" + (++Ext.Component.AUTO_ID);
+    }
+    Ext.ComponentMgr.register(this);
+    Ext.Component.superclass.constructor.call(this);
+    this.initComponent();
+};
+
+// private
+Ext.Component.AUTO_ID = 1000;
+
+Ext.extend(Ext.Component, Ext.util.Observable, {
+    /**
+     * true if this component is hidden. Read-only.
+     */
+    hidden : false,
+    /**
+     * true if this component is disabled. Read-only.
+     */
+    disabled : false,
+    /**
+     * CSS class added to the component when it is disabled.
+     */
+    disabledClass : "x-item-disabled",
+    /**
+     * true if this component has been rendered. Read-only.
+     */
+    rendered : false,
+
+    allowDomMove: true,
+
+    // private
+    ctype : "Ext.Component",
+
+    // private
+    actionMode : "el",
+
+    // private
+    getActionEl : function(){
+        return this[this.actionMode];
+    },
+
+    initComponent : Ext.emptyFn,     
+    /**
+     * If this is a lazy rendering component, render it to its container element
+     * @param {String/HTMLElement/Element} container (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+     */
+    render : function(container, position){
+        if(!this.rendered && this.fireEvent("beforerender", this) !== false){
+            if(!container && this.el){
+                this.el = Ext.get(this.el);
+                container = this.el.dom.parentNode;
+                this.allowDomMove = false;
+            }
+            this.container = Ext.get(container);
+            this.rendered = true;
+            if(position !== undefined){
+                if(typeof position == 'number'){
+                    position = this.container.dom.childNodes[position];
+                }else{
+                    position = Ext.getDom(position);
+                }
+            }
+            this.onRender(this.container, position || null);
+            if(this.cls){
+                this.el.addClass(this.cls);
+                delete this.cls;
+            }
+            if(this.style){
+                this.el.applyStyles(this.style);
+                delete this.style;
+            }
+            this.fireEvent("render", this);
+            this.afterRender(this.container);
+            if(this.hidden){
+                this.hide();
+            }
+            if(this.disabled){
+                this.disable();
+            }
+        }
+        return this;
+    },
+
+    // private
+    // default function is not really useful
+    onRender : function(ct, position){
+        if(this.el){
+            this.el = Ext.get(this.el);
+            if(this.allowDomMove !== false){
+                ct.dom.insertBefore(this.el.dom, position);
+            }
+        }
+    },
+
+    // private
+    getAutoCreate : function(){
+        var cfg = typeof this.autoCreate == "object" ?
+                      this.autoCreate : Ext.apply({}, this.defaultAutoCreate);
+        if(this.id && !cfg.id){
+            cfg.id = this.id;
+        }
+        return cfg;
+    },
+
+    // private
+    afterRender : Ext.emptyFn,
+
+    // private
+    destroy : function(){
+        if(this.fireEvent("beforedestroy", this) !== false){
+            this.purgeListeners();
+            this.beforeDestroy();
+            if(this.rendered){
+                this.el.removeAllListeners();
+                this.el.remove();
+                if(this.actionMode == "container"){
+                    this.container.remove();
+                }
+            }
+            this.onDestroy();
+            Ext.ComponentMgr.unregister(this);
+            this.fireEvent("destroy", this);
+        }
+    },
+
+    beforeDestroy : function(){
+
+    },
+
+    onDestroy : function(){
+
+    },
+
+    /**
+     * Returns the underlying {@link Ext.Element}
+     * @return {Ext.Element} The element
+     */
+    getEl : function(){
+        return this.el;
+    },
+
+    /**
+     * Returns the id of this component
+     * @return {String}
+     */
+    getId : function(){
+        return this.id;
+    },
+
+    /**
+     * Try to focus this component
+     * @param {Boolean} selectText True to also select the text in this component (if applicable)
+     */
+    focus : function(selectText){
+        if(this.rendered){
+            this.el.focus();
+            if(selectText === true){
+                this.el.dom.select();
+            }
+        }
+        return this;
+    },
+
+    // private
+    blur : function(){
+        if(this.rendered){
+            this.el.blur();
+        }
+        return this;
+    },
+
+    /**
+     * Disable this component
+     */
+    disable : function(){
+        if(this.rendered){
+            this.onDisable();
+        }
+        this.disabled = true;
+        this.fireEvent("disable", this);
+        return this;
+    },
+
+    onDisable : function(){
+        this.getActionEl().addClass(this.disabledClass);
+        this.el.dom.disabled = true;
+    },
+
+    /**
+     * Enable this component
+     */
+    enable : function(){
+        if(this.rendered){
+            this.onEnable();
+        }
+        this.disabled = false;
+        this.fireEvent("enable", this);
+        return this;
+    },
+
+    onEnable : function(){
+        this.getActionEl().removeClass(this.disabledClass);
+        this.el.dom.disabled = false;
+    },
+
+    /**
+     * Convenience function for setting disabled/enabled by boolean
+     * @param {Boolean} disabled
+     */
+    setDisabled : function(disabled){
+        this[disabled ? "disable" : "enable"]();
+    },
+
+    /**
+     * Show this component
+     */
+    show: function(){
+        if(this.fireEvent("beforeshow", this) !== false){
+            this.hidden = false;
+            if(this.rendered){
+                this.onShow();
+            }
+            this.fireEvent("show", this);
+        }
+        return this;
+    },
+
+    // private
+    onShow : function(){
+        var st = this.getActionEl().dom.style;
+        st.display = "";
+        st.visibility = "visible";
+    },
+
+    /**
+     * Hide this component
+     */
+    hide: function(){
+        if(this.fireEvent("beforehide", this) !== false){
+            this.hidden = true;
+            if(this.rendered){
+                this.onHide();
+            }
+            this.fireEvent("hide", this);
+        }
+        return this;
+    },
+
+    // private
+    onHide : function(){
+        this.getActionEl().dom.style.display = "none";
+    },
+
+    /**
+     * Convenience function to hide or show this component by boolean
+     * @param {Boolean} visible True to show, false to hide
+     */
+    setVisible: function(visible){
+        if(visible) {
+            this.show();
+        }else{
+            this.hide();
+        }
+        return this;
+    },
+
+    /**
+     * Returns true if this component is visible
+     */
+    isVisible : function(){
+        return this.getActionEl().isVisible();
+    },
+
+    cloneConfig : function(overrides){
+        overrides = overrides || {};
+        var id = overrides.id || Ext.id();
+        var cfg = Ext.applyIf(overrides, this.initialConfig);
+        cfg.id = id; // prevent dup id
+        return new this.__extcls(cfg);
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/CompositeElement.jss.html b/www/extras/yui-ext/docs/output/CompositeElement.jss.html new file mode 100644 index 000000000..13e90e6f5 --- /dev/null +++ b/www/extras/yui-ext/docs/output/CompositeElement.jss.html @@ -0,0 +1,205 @@ +CompositeElement.js

CompositeElement.js

/**
+ * @class Ext.CompositeElement
+ * Standard composite class. Creates a 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 Ext.Element. All 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 = 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>
+ */
+Ext.CompositeElement = function(els){
+    this.elements = [];
+    this.addElements(els);
+};
+Ext.CompositeElement.prototype = {
+    isComposite: true,
+    addElements : function(els){
+        if(!els) return this;
+        if(typeof els == "string"){
+            els = Ext.Element.selectorFunction(els);
+        }
+        var yels = this.elements;
+        var index = yels.length-1;
+        for(var i = 0, len = els.length; i < len; i++) {
+        	yels[++index] = Ext.get(els[i], true);
+        }
+        return this;
+    },
+    invoke : function(fn, args){
+        var els = this.elements;
+        for(var i = 0, len = els.length; i < len; i++) {
+        	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(Ext.Element.selectorFunction(els));
+        }else if(els.length !== undefined){
+            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++){
+            if(fn.call(scope || els[i], els[i], this, i) === false) {
+                break;
+            }
+        }
+        return this;
+    },
+
+    /**
+     * Returns the Element object at the specified index
+     * @param {Number} index
+     * @return {Ext.Element}
+     */
+    item : function(index){
+        return this.elements[index];
+    }
+};
+(function(){
+Ext.CompositeElement.createCall = function(proto, fnName){
+    if(!proto[fnName]){
+        proto[fnName] = function(){
+            return this.invoke(fnName, arguments);
+        };
+    }
+};
+for(var fnName in Ext.Element.prototype){
+    if(typeof Ext.Element.prototype[fnName] == "function"){
+        Ext.CompositeElement.createCall(Ext.CompositeElement.prototype, fnName);
+    }
+};
+})();
+
+/**
+ * @class Ext.CompositeElementLite
+ * @extends Ext.CompositeElement
+ * Flyweight composite class. Reuses the same Ext.Element for element operations.
+ * <br><br>
+ * <b>NOTE: Although they are not listed, this class supports all of the set/update methods of Ext.Element. All Ext.Element
+ * actions will be performed on all the elements in this collection.</b>
+ */
+Ext.CompositeElementLite = function(els){
+    Ext.CompositeElementLite.superclass.constructor.call(this, els);
+    var flyEl = function(){};
+    flyEl.prototype = Ext.Element.prototype;
+    this.el = new Ext.Element.Flyweight();
+};
+Ext.extend(Ext.CompositeElementLite, Ext.CompositeElement, {
+    addElements : function(els){
+        if(els){
+            if(els instanceof Array){
+                this.elements = this.elements.concat(els);
+            }else{
+                var yels = this.elements;
+                var index = yels.length-1;
+                for(var i = 0, len = els.length; i < len; i++) {
+                    yels[++index] = els[i];
+                }
+            }
+        }
+        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];
+        	Ext.Element.prototype[fn].apply(el, args);
+        }
+        return this;
+    },
+    /**
+     * Returns a flyweight Element of the dom element object at the specified index
+     * @param {Number} index
+     * @return {Ext.Element}
+     */
+    item : function(index){
+        this.el.dom = this.elements[index];
+        return this.el;
+    },
+
+    // fixes scope with flyweight
+    addListener : function(eventName, handler, scope, opt){
+        var els = this.elements;
+        for(var i = 0, len = els.length; i < len; i++) {
+            Ext.EventManager.on(els[i], eventName, handler, scope || els[i], opt);
+        }
+        return this;
+    },
+
+    /**
+    * Calls the passed function passing (el, this, index) for each element in this composite. <b>The element
+    * passed is the flyweight (shared) Ext.Element instance, so if you require a
+    * a reference to the dom node, use el.dom.</b>
+    * @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;
+        var el = this.el;
+        for(var i = 0, len = els.length; i < len; i++){
+            el.dom = els[i];
+        	if(fn.call(scope || el, el, this, i) === false){
+                break;
+            }
+        }
+        return this;
+    }
+});
+Ext.CompositeElementLite.prototype.on = Ext.CompositeElementLite.prototype.addListener;
+if(Ext.DomQuery){
+    Ext.Element.selectorFunction = Ext.DomQuery.select;
+}
+
+Ext.Element.select = function(selector, unique){
+    var els;
+    if(typeof selector == "string"){
+        els = Ext.Element.selectorFunction(selector);
+    }else if(selector.length !== undefined){
+        els = selector;
+    }else{
+        throw "Invalid selector";
+    }
+    if(unique === true){
+        return new Ext.CompositeElement(els);
+    }else{
+        return new Ext.CompositeElementLite(els);
+    }
+};
+/**
+ * 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 Ext.Element for each element (defaults to a shared flyweight object)
+ * @return {CompositeElementLite/CompositeElement}
+ * @member Ext
+ * @method select
+ */
+Ext.select = Ext.Element.select;

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Connection.jss.html b/www/extras/yui-ext/docs/output/Connection.jss.html new file mode 100644 index 000000000..3b8c7ff22 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Connection.jss.html @@ -0,0 +1,126 @@ +Connection.js

Connection.js

/**
+ * @class Ext.data.Connection
+ * The class encapsulates a connection to the page's originating domain, allowing requests to be made
+ * either to a configured URL, or to a URL specified at request time.
+ * <p>
+ * Requests made by this class are asynchronous, and will return immediately, and no data from
+ * the server will be available. To process the returned data, us a callback in the request options
+ * object.
+ * @constructor
+ * @param config {Object} a configuration object.
+ */
+Ext.data.Connection = function(config){
+    Ext.apply(this, config);
+    this.addEvents({
+        "beforerequest" : true,
+        "requestcomplete" : true,
+        "requestexception" : true
+    });
+    Ext.data.Connection.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.data.Connection, Ext.util.Observable, {
+    /**
+     * @cfg url {String} (Optional) The default URL to be used for requests to the server.
+     */
+// holder
+/***
+     * @cfg extraParams {Object} (Optional) An object containing properties which are used as
+     * extra parameters to each request made by this object.
+     */
+// holder
+/***
+     * @cfg method {String} (Optional) The default HTTP method to be used for requests.
+     */
+// holder
+/***
+     * @cfg timeout {Number} (Optional) The timeout in milliseconds to be used for requests. Defaults
+     * to 30000.
+     */
+    timeout : 30000,
+    
+    /**
+     * Sends an HTTP request to a remote server.
+     * @param {Object} options. An object which may contain the following properties:<ul>
+     * <li>url {String} (Optional) The URL to which to send the request. Defaults to configured URL</li>
+     * <li>params {Object} (Optional) An object containing properties which are used as extra parameters to the request</li>
+     * <li>method {String} (Optional) The HTTP method to use for the request. Defaults to the configured method, or
+     * if no method was configured, "GET" if no parameters are being sent, and "POST" if parameters are being sent.</li>
+     * <li>callback {Function} (Optional) The function to be called upon receipt of the HTTP response.
+     * The callback is passed the following parameters:<ul>
+     * <li>options {Object} The parameter to the request call.</li>
+     * <li>success {Boolean} True if the request succeeded.</li>
+     * <li>resopnse {Object} The XMLHttpRequest object containing the response data.</li>
+     * </ul></li>
+     * <li>scope {Object} (Optional) The scope in which to execute the callback: The "this" object
+     * for the callback function. Defaults to the browser window.</li>
+     * </ul>
+     */
+    request : function(options){
+        if(this.fireEvent("beforerequest", this, options) !== false){
+            var p = options.params;
+            if(typeof p == "object"){
+                p = Ext.urlEncode(Ext.apply(options.params, this.extraParams));
+            }
+            var cb = {
+                success: this.handleResponse,
+                failure: this.handleFailure,
+                scope: this,
+        		argument: {options: options},
+        		timeout : this.timeout
+            };
+            var method = options.method||this.method||(p ? "POST" : "GET");
+            var url = options.url || this.url;
+            if(this.autoAbort !== false){
+                this.abort();
+            }
+            if(method == 'GET' && p){
+                url += (url.indexOf('?') != -1 ? '&' : '?') + p;
+                p = '';
+            }
+            this.transId = Ext.lib.Ajax.request(method, url, cb, p);
+        }else{
+            if(typeof options.callback == "function"){
+                options.callback.call(options.scope||window, options, null, null);
+            }
+        }
+    },
+
+    /**
+     * Determine whether this object has a request outstanding.
+     * @return {Boolean} True if there is an outstanding request.
+     */
+    isLoading : function(){
+        return this.transId ? true : false;  
+    },
+
+    /**
+     * Aborts any outstanding request.
+     */
+    abort : function(){
+        if(this.isLoading()){
+            Ext.lib.Ajax.abort(this.transId);
+        }
+    },
+
+    // private
+    handleResponse : function(response){
+        this.transId = false;
+        var options = response.argument.options;
+        this.fireEvent("requestcomplete", this, response, options);
+        if(typeof options.callback == "function"){
+            options.callback.call(options.scope||window, options, true, response);
+        }
+    },
+
+    // private
+    handleFailure : function(response, e){
+        this.transId = false;
+        var options = response.argument.options;
+        this.fireEvent("requestexception", this, response, options, e);
+        if(typeof options.callback == "function"){
+            options.callback.call(options.scope||window, options, false, response);
+        }
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Container.jss.html b/www/extras/yui-ext/docs/output/Container.jss.html new file mode 100644 index 000000000..4b4d02972 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Container.jss.html @@ -0,0 +1,160 @@ +Container.js

Container.js

Ext.Container = function(config){
+    Ext.Container.superclass.constructor.call(this, config);
+    if(this.renderTo){
+        this.render(this.renderTo);
+        delete this.renderTo;
+    }
+};
+
+Ext.extend(Ext.Container, Ext.BoxComponent, {
+    autoDestroy: true,
+
+    initComponent : function(){
+        Ext.Container.superclass.initComponent.call(this);
+
+        this.addEvents({
+            'beforeadd':true,
+            'beforeremove':true,
+            'add':true,
+            'remove':true
+        });
+
+        var items = this.items;
+        if(items){
+            delete this.items;
+            if(items instanceof Array){
+                this.add.apply(this, items);
+            }else{
+                this.add(items);
+            }
+        }
+    },
+
+    initItems : function(){
+        if(!this.items){
+            this.items = new Ext.util.MixedCollection(false, this.getComponentId);
+            this.getLayout(); // initialize the layout
+        }
+    },
+
+    setLayout : function(layout){
+        if(this.layout && this.layout != layout){
+            this.layout.setContainer(null);
+        }
+        this.layout = layout;
+        layout.setContainer(this);
+    },
+
+    render : function(){
+        Ext.Container.superclass.render.apply(this, arguments);
+        if(this.layout){
+            this.setLayout(this.layout);
+        }
+        this.doLayout();
+    },
+
+    getLayoutTarget : function(){
+        return this.el;  
+    },
+
+    getComponentId : function(comp){
+        return comp.id;
+    },
+
+    add : function(comp){
+        if(!this.items){
+            this.initItems();
+        }
+        var a = arguments, len = a.length;
+        if(len > 1){
+            for(var i = 0; i < len; i++) {
+                this.add(a[i]);
+            }
+        }else{
+            var c = this.lookupComponent(comp);
+            var pos = this.items.length;
+            if(this.fireEvent('beforeadd', this, c, pos) !== false){
+                this.items.add(c);
+                c.ownerCt = this;
+                this.fireEvent('add', this, c, pos);
+            }
+        }
+        return this;
+    },
+
+    insert : function(index, comp){
+        if(!this.items){
+            this.initItems();
+        }
+        var a = arguments, len = a.length;
+        if(len > 1){
+            for(var i = len; i >= 0; --i) {
+                this.insert(index, a[i]);
+            }
+        }else{
+
+            var c = this.lookupComponent(comp);
+            if(this.fireEvent('beforeadd', this, c, index) !== false){
+                this.items.insert(index, c);
+                this.fireEvent('add', this, c, index);
+            }
+        }
+        return this;
+    },
+
+    remove : function(comp){
+        var c = this.getComponent(comp);
+        if(this.fireEvent('beforeremove', this, c) !== false){
+            this.items.remove(c);
+            if(this.autoDestroy){
+                c.destroy();
+            }
+            this.fireEvent('remove', this, c);
+        }
+    },
+
+    getComponent : function(comp){
+        if(typeof comp == 'object'){
+            return comp;
+        }
+        return this.items.get(comp);
+    },
+
+    // private
+    lookupComponent : function(comp){
+        if(typeof comp == 'string'){
+            return Ext.ComponentMgr.get(comp);
+        }else if(!comp.events){
+            return this.createComponent(comp);
+        }
+        return comp;
+    },
+
+    createComponent : function(config){
+        return new Ext.Panel(config);
+    },
+
+    doLayout : function(){
+        if(this.layout){
+            this.layout.layout();
+        }
+        if(this.items){
+            var cs = this.items.items;
+            for(var i = 0, len = cs.length; i < len; i++) {
+                var c  = cs[i];
+                if(c.doLayout){
+                    c.doLayout();
+                }
+            }
+        }
+    },
+
+    getLayout : function(){
+        if(!this.layout){
+            var layout = new Ext.layout.AutoLayout();
+            this.setLayout(layout);
+        }
+        return this.layout;
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ContainerLayout.jss.html b/www/extras/yui-ext/docs/output/ContainerLayout.jss.html new file mode 100644 index 000000000..be3ac9a28 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ContainerLayout.jss.html @@ -0,0 +1,41 @@ +ContainerLayout.js

ContainerLayout.js

Ext.layout.ContainerLayout = function(config){
+    Ext.apply(this, config);
+};
+
+Ext.layout.ContainerLayout.prototype = {
+    monitorResize:false,
+    activeItem : null,
+
+    layout : function(){
+        this.onLayout(this.container,
+                this.container.getLayoutTarget());
+    },
+
+    onLayout : function(ct, target){
+        var items = ct.items.items;
+        for(var i = 0, len = items.length; i < len; i++) {
+            var c = items[i];
+            if(!c.rendered){
+                c.render(target, i);
+                if(this.renderHidden && c != this.activeItem){
+                    c.hide();
+                }
+            }
+        }
+    },
+
+    onResize: function(){
+        this.layout();
+    },
+
+    setContainer : function(ct){
+        if(this.monitorResize){
+            if(ct && this.container && ct != this.container){
+                this.container.un('resize', this.onResize, this);
+            }
+            ct.on('resize', this.onResize, this);
+        }
+        this.container = ct;
+    }
+};

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ContentPanels.jss.html b/www/extras/yui-ext/docs/output/ContentPanels.jss.html new file mode 100644 index 000000000..c7271e4cb --- /dev/null +++ b/www/extras/yui-ext/docs/output/ContentPanels.jss.html @@ -0,0 +1,467 @@ +ContentPanels.js

ContentPanels.js

/**
+ * @class Ext.ContentPanel
+ * @extends Ext.util.Observable
+ * A basic ContentPanel element.
+ * @cfg {Boolean} fitToFrame True for this panel to adjust its size to fit when the region resizes  (defaults to false)
+ * @cfg {Boolean} fitContainer When using fitToFrame and resizeEl, you can also fit the parent container  (defaults to false)
+ * @cfg {Boolean/Object} autoCreate True to auto generate the DOM element for this panel, or a DomHelper config of the element to create
+ * @cfg {Boolean} closable True if the panel can be closed/removed
+ * @cfg {Boolean} background True if the panel should not be activated when it is added (defaults to false)
+ * @cfg {String/HTMLElement/Element} resizeEl An element to resize if fitToFrame is true (instead of this panel's element)
+ * @cfg {Toolbar} toolbar A toolbar for this panel
+ * @cfg {Boolean} autoScroll True to scroll overflow in this panel (use with fitToFrame)
+ * @cfg {String} title The title for this panel
+ * @cfg {Array} adjustments Values to <b>add</b> to the width/height when doing a fitToFrame (default is [0, 0])
+ * @cfg {String} url Calls setUrl() with this value
+ * @cfg {String/Object} params When used with "url", calls setUrl() with this value
+ * @cfg {Boolean} loadOnce Calls When used with "url", calls setUrl() with this value
+ * @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
+ */
+Ext.ContentPanel = function(el, config, content){
+    Ext.ContentPanel.superclass.constructor.call(this);
+    if(el.autoCreate){
+        config = el;
+        el = Ext.id();
+    }
+    this.el = Ext.get(el);
+    if(!this.el && config && config.autoCreate){
+        if(typeof config.autoCreate == "object"){
+            if(!config.autoCreate.id){
+                config.autoCreate.id = config.id||el;
+            }
+            this.el = Ext.DomHelper.append(document.body,
+                        config.autoCreate, true);
+        }else{
+            this.el = Ext.DomHelper.append(document.body,
+                        {tag: "div", cls: "x-layout-inactive-content", id: config.id||el}, true);
+        }
+    }
+    this.closable = false;
+    this.loaded = false;
+    this.active = false;
+    if(typeof config == "string"){
+        this.title = config;
+    }else{
+        Ext.apply(this, config);
+    }
+    if(this.resizeEl){
+        this.resizeEl = Ext.get(this.resizeEl, true);
+    }else{
+        this.resizeEl = this.el;
+    }
+    this.addEvents({
+        /**
+         * @event activate
+         * Fires when this panel is activated. 
+         * @param {Ext.ContentPanel} this
+         */
+        "activate" : true,
+        /**
+         * @event deactivate
+         * Fires when this panel is activated. 
+         * @param {Ext.ContentPanel} this
+         */
+        "deactivate" : true,
+
+        /**
+         * @event resize
+         * Fires when this panel is resized if fitToFrame is true.
+         * @param {Ext.ContentPanel} this
+         * @param {Number} width The width after any component adjustments
+         * @param {Number} height The height after any component adjustments
+         */
+        "resize" : true
+    });
+    if(this.autoScroll){
+        this.resizeEl.setStyle("overflow", "auto");
+    }
+    content = content || this.content;
+    if(content){
+        this.setContent(content);
+    }
+    if(config && config.url){
+        this.setUrl(this.url, this.params, this.loadOnce);
+    }
+};
+
+Ext.extend(Ext.ContentPanel, Ext.util.Observable, {
+    tabTip:'',
+    setRegion : function(region){
+        this.region = region;
+        if(region){
+           this.el.replaceClass("x-layout-inactive-content", "x-layout-active-content");
+        }else{
+           this.el.replaceClass("x-layout-active-content", "x-layout-inactive-content");
+        } 
+    },
+    
+    /**
+     * Returns the toolbar for this Panel if one was configured. 
+     * @return {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);
+    },
+
+    ignoreResize : function(w, h){
+        if(this.lastSize && this.lastSize.width == w && this.lastSize.height == h){
+            return true;
+        }else{
+            this.lastSize = {width: w, height: h};
+            return false;
+        }
+    },
+    /**
+     * Get the {@link Ext.UpdateManager} for this panel. Enables you to perform Ajax updates.
+     * @return {Ext.UpdateManager} The UpdateManager
+     */
+    getUpdateManager : function(){
+        return this.el.getUpdateManager();
+    },
+     /**
+     * Loads this content panel immediately with content from XHR. Note: to delay loading until the panel is activated, use setUrl.
+     * @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>
+panel.load({<br/>
+    url: "your-url.php",<br/>
+    params: {param1: "foo", param2: "bar"}, // or a URL encoded string<br/>
+    callback: yourFunction,<br/>
+    scope: yourObject, //(optional scope)  <br/>
+    discardUrl: false, <br/>
+    nocache: false,<br/>
+    text: "Loading...",<br/>
+    timeout: 30,<br/>
+    scripts: false<br/>
+});
+</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 panel UpdateManager instance.
+     * @param {String/Object} 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 {Function} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess, oResponse)
+     * @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 {Ext.ContentPanel} this
+     */
+    load : function(){
+        var um = this.el.getUpdateManager();
+        um.update.apply(um, arguments);
+        return this;
+    },
+
+
+    /**
+     * Set a URL to be used to load the content for this panel. When this panel is activated, the content will be loaded from that URL.
+     * @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 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 {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 {Ext.Element} 
+     */
+    getEl : function(){
+        return this.el;
+    },
+    
+    adjustForComponents : function(width, height){
+        if(this.resizeEl != this.el){
+            width -= this.el.getFrameWidth('lr');
+            height -= this.el.getFrameWidth('tb');
+        }
+        if(this.toolbar){
+            var te = this.toolbar.getEl();
+            height -= te.getHeight();
+            te.setWidth(width);
+        }
+        if(this.adjustments){
+            width += this.adjustments[0];
+            height += this.adjustments[1];
+        }
+        return {"width": width, "height": height};
+    },
+    
+    setSize : function(width, height){
+        if(this.fitToFrame && !this.ignoreResize(width, height)){
+            if(this.fitContainer && this.resizeEl != this.el){
+                this.el.setSize(width, height);
+            }
+            var size = this.adjustForComponents(width, height);
+            this.resizeEl.setSize(this.autoWidth ? "auto" : size.width, this.autoHeight ? "auto" : size.height);
+            this.fireEvent('resize', this, 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();
+    },
+    
+    /**
+     *   Force a content refresh from the URL specified in the setUrl() method.
+     *   Will fail silently if the setUrl method has not been called.
+     *   This does not activate the panel, just updates its content.
+     */
+    refresh : function(){
+        if(this.refreshDelegate){
+           this.loaded = false;
+           this.refreshDelegate();
+        }
+    },
+    
+    /**
+     * Destroys this panel
+     */
+    destroy : function(){
+        this.el.removeAllListeners();
+        var tempEl = document.createElement("span");
+        tempEl.appendChild(this.el.dom);
+        tempEl.innerHTML = "";
+        this.el.remove();
+        this.el = null;
+    }
+});
+
+/**
+ * @class Ext.GridPanel
+ * @extends Ext.ContentPanel
+ * @constructor
+ * Create a new GridPanel.
+ * @param {Ext.grid.Grid} grid The grid for this panel
+ * @param {String/Object} config A string to set only the title or a config object
+ */
+Ext.GridPanel = function(grid, config){
+    this.wrapper = Ext.DomHelper.append(document.body, // wrapper for IE7 strict & safari scroll issue
+        {tag: "div", cls: "x-layout-grid-wrapper x-layout-inactive-content"}, true);
+    this.wrapper.dom.appendChild(grid.container.dom);
+    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("x-layout-inactive-content", "x-layout-component-panel");
+};
+
+Ext.extend(Ext.GridPanel, Ext.ContentPanel, {
+    getId : function(){
+        return this.grid.id;
+    },
+    
+    /**
+     * Returns the grid for this panel
+     * @return {Ext.grid.Grid} 
+     */
+    getGrid : function(){
+        return this.grid;    
+    },
+    
+    setSize : function(width, height){
+        if(!this.ignoreResize(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().scroller.clip();
+    },
+    
+    afterSlide : function(){
+        this.grid.getView().scroller.unclip();
+    },
+    
+    destroy : function(){
+        this.grid.destroy();
+        delete this.grid;
+        Ext.GridPanel.superclass.destroy.call(this); 
+    }
+});
+
+
+/**
+ * @class Ext.NestedLayoutPanel
+ * @extends Ext.ContentPanel
+ * @constructor
+ * Create a new NestedLayoutPanel.
+ * @param {Ext.BorderLayout} layout The layout for this panel
+ * @param {String/Object} config A string to set only the title or a config object
+ */
+Ext.NestedLayoutPanel = function(layout, config){
+    Ext.NestedLayoutPanel.superclass.constructor.call(this, layout.getEl(), config);
+    layout.monitorWindowResize = false; // turn off autosizing
+    this.layout = layout;
+    this.layout.getEl().addClass("x-layout-nested-layout");
+};
+
+Ext.extend(Ext.NestedLayoutPanel, Ext.ContentPanel, {
+
+    setSize : function(width, height){
+        if(!this.ignoreResize(width, height)){
+            var size = this.adjustForComponents(width, height);
+            var el = this.layout.getEl();
+            el.setSize(size.width, size.height);
+            var touch = el.dom.offsetWidth;
+            this.layout.layout();
+            // ie requires a double layout on the first pass
+            if(Ext.isIE && !this.initialized){
+                this.initialized = true;
+                this.layout.layout();
+            }
+        }
+    },
+    
+    /**
+     * Returns the nested BorderLayout for this panel
+     * @return {Ext.BorderLayout} 
+     */
+    getLayout : function(){
+        return this.layout;
+    }
+});
+
+Ext.ScrollPanel = function(el, config, content){
+    config = config || {};
+    config.fitToFrame = true;
+    Ext.ScrollPanel.superclass.constructor.call(this, el, config, content);
+    
+    this.el.dom.style.overflow = "hidden";
+    var wrap = this.el.wrap({cls: "x-scroller x-layout-inactive-content"});
+    this.el.removeClass("x-layout-inactive-content");
+    this.el.on("mousewheel", this.onWheel, this);
+
+    var up = wrap.createChild({cls: "x-scroller-up", html: "&#160;"}, this.el.dom);
+    var down = wrap.createChild({cls: "x-scroller-down", html: "&#160;"});
+    up.unselectable(); down.unselectable();
+    up.on("click", this.scrollUp, this);
+    down.on("click", this.scrollDown, this);
+    up.addClassOnOver("x-scroller-btn-over");
+    down.addClassOnOver("x-scroller-btn-over");
+    up.addClassOnClick("x-scroller-btn-click");
+    down.addClassOnClick("x-scroller-btn-click");
+    this.adjustments = [0, -(up.getHeight() + down.getHeight())];
+
+    this.resizeEl = this.el;
+    this.el = wrap; this.up = up; this.down = down;
+};
+
+Ext.extend(Ext.ScrollPanel, Ext.ContentPanel, {
+    increment : 100,
+    wheelIncrement : 5,
+    scrollUp : function(){
+        this.resizeEl.scroll("up", this.increment, {callback: this.afterScroll, scope: this});
+    },
+
+    scrollDown : function(){
+        this.resizeEl.scroll("down", this.increment, {callback: this.afterScroll, scope: this});
+    },
+
+    afterScroll : function(){
+        var el = this.resizeEl;
+        var t = el.dom.scrollTop, h = el.dom.scrollHeight, ch = el.dom.clientHeight;
+        this.up[t == 0 ? "addClass" : "removeClass"]("x-scroller-btn-disabled");
+        this.down[h - t <= ch ? "addClass" : "removeClass"]("x-scroller-btn-disabled");
+    },
+
+    setSize : function(){
+        Ext.ScrollPanel.superclass.setSize.apply(this, arguments);
+        this.afterScroll();
+    },
+
+    onWheel : function(e){
+        var d = e.getWheelDelta();
+        this.resizeEl.dom.scrollTop -= (d*this.wheelIncrement);
+        this.afterScroll();
+        e.stopEvent();
+    },
+
+    setContent : function(content, loadScripts){
+        this.resizeEl.update(content, loadScripts);
+    }
+
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DDCore.jss.html b/www/extras/yui-ext/docs/output/DDCore.jss.html new file mode 100644 index 000000000..c85caad8b --- /dev/null +++ b/www/extras/yui-ext/docs/output/DDCore.jss.html @@ -0,0 +1,2947 @@ +DDCore.js

DDCore.js

/*
+ * These classes are derivatives of the similarly named classes in the YUI Library.
+ * The original license:
+ * Copyright (c) 2006, Yahoo! Inc. All rights reserved.
+ * Code licensed under the BSD License:
+ * http://developer.yahoo.net/yui/license.txt
+ */
+
+(function() {
+
+var Event=Ext.EventManager;
+var Dom=Ext.lib.Dom;
+
+/**
+ * @class Ext.dd.DragDrop
+ * 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 and 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 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 Ext.dd.DD}.  setDragElId() lets you define
+ * a separate element that would be moved, as in {@link Ext.dd.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 Ext.dd.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>
+ * @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
+ */
+Ext.dd.DragDrop = function(id, sGroup, config) {
+    if (id) {
+        this.init(id, sGroup, config);
+    }
+};
+
+Ext.dd.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:
+     * Ext.dd.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 () {
+    },
+
+    /*
+     * Provides default constraint padding to "constrainTo" elements (defaults to {left: 0, right:0, top:0, bottom:0}).
+     * @type Object
+     */
+    defaultPadding : {left:0, right:0, top:0, bottom:0},
+
+    /*
+     * Initializes the drag drop object's constraints to restrict movement to a certain element.
+ *
+ * Usage:
+ <pre><code>
+ var dd = new Ext.dd.DDProxy("dragDiv1", "proxytest",
+                { dragElId: "existingProxyDiv" });
+ dd.startDrag = function(){
+     this.constrainTo("parent-id");
+ };
+ </code></pre>
+ * Or you can initalize it using the {@link Ext.Element} object:
+ <pre><code>
+ Ext.get("dragDiv1").initDDProxy("proxytest", {dragElId: "existingProxyDiv"}, {
+     startDrag : function(){
+         this.constrainTo("parent-id");
+     }
+ });
+ </code></pre>
+     * @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)
+     */
+    constrainTo : function(constrainTo, pad, inContent){
+        if(typeof pad == "number"){
+            pad = {left: pad, right:pad, top:pad, bottom:pad};
+        }
+        pad = pad || this.defaultPadding;
+        var b = Ext.get(this.getEl()).getBox();
+        var ce = Ext.get(constrainTo);
+        var s = ce.getScroll();
+        var c, cd = ce.dom;
+        if(cd == document.body){
+            c = { x: s.left, y: s.top, width: Ext.lib.Dom.getViewWidth(), height: Ext.lib.Dom.getViewHeight()};
+        }else{
+            xy = ce.getXY();
+            c = {x : xy[0]+s.left, y: xy[1]+s.top, width: cd.clientWidth, height: cd.clientHeight};
+        }
+
+
+        var topSpace = b.y - c.y;
+        var leftSpace = b.x - c.x;
+
+        this.resetConstraints();
+        this.setXConstraint(leftSpace - (pad.left||0), // left
+                c.width - leftSpace - b.width - (pad.right||0) //right
+        );
+        this.setYConstraint(topSpace - (pad.top||0), //top
+                c.height - topSpace - b.height - (pad.bottom||0) //bottom
+        );
+    },
+
+    /**
+     * Returns a reference to the linked element
+     * @method getEl
+     * @return {HTMLElement} the html element
+     */
+    getEl: function() {
+        if (!this._domRef) {
+            this._domRef = Ext.getDom(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 Ext.dd.DDProxy
+     * @method getDragEl
+     * @return {HTMLElement} the html element
+     */
+    getDragEl: function() {
+        return Ext.getDom(this.dragElId);
+    },
+
+    /**
+     * Sets up the DragDrop object.  Must be called in the constructor of any
+     * Ext.dd.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);
+        // 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 = Ext.dd.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") {
+            id = Ext.id(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;
+
+        // the linked element is the element that gets dragged by default
+        this.setDragElId(id);
+
+        // by default, clicked anchors will not start drag operations.
+        this.invalidHandleTypes = { A: "A" };
+        this.invalidHandleIds = {};
+        this.invalidHandleClasses = [];
+
+        this.applyConfig();
+
+        this.handleOnAvailable();
+    },
+
+    /**
+     * 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") {
+            id = Ext.id(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") {
+            id = Ext.id(id);
+        }
+        Event.on(id, "mousedown",
+                this.handleMouseDown, this);
+        this.setHandleElId(id);
+
+        this.hasOuterHandles = true;
+    },
+
+    /**
+     * Remove all drag and drop hooks for this element
+     * @method unreg
+     */
+    unreg: function() {
+        Event.un(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 {Ext.dd.DragDrop} oDD the clicked dd object (this dd obj)
+     * @private
+     */
+    handleMouseDown: function(e, oDD){
+        if (this.primaryButtonOnly && e.button != 0) {
+            return;
+        }
+
+        if (this.isLocked()) {
+            return;
+        }
+
+        this.DDM.refreshCache(this.groups);
+
+        var pt = new Ext.lib.Point(Ext.lib.Event.getPageX(e), Ext.lib.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 = Ext.lib.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") {
+            id = Ext.id(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") {
+            id = Ext.id(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.
+ */
+
+// Only load the library once.  Rewriting the manager class would orphan
+// existing drag and drop instances.
+if (!Ext.dd.DragDropMgr) {
+
+/**
+ * @class Ext.dd.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.
+ * @singleton
+ */
+Ext.dd.DragDropMgr = function() {
+
+    var Event = Ext.EventManager;
+
+    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: 350,
+
+        /**
+         * 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 = Ext.lib.Event.getTarget(e);
+
+            this.dragCurrent = oDD;
+
+            var el = oDD.getEl();
+
+            // track start position
+            this.startX = Ext.lib.Event.getPageX(e);
+            this.startY = Ext.lib.Event.getPageY(e);
+
+            this.deltaX = this.startX - el.offsetLeft;
+            this.deltaY = this.startY - el.offsetTop;
+
+            this.dragThreshMet = false;
+
+            this.clickTimeout = setTimeout(
+                    function() {
+                        var DDM = Ext.dd.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) {
+                e.stopPropagation();
+            }
+
+            if (this.preventDefault) {
+                e.preventDefault();
+            }
+        },
+
+        /**
+         * 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 (Ext.isIE && (e.button !== 0 && e.button !== 1 && e.button !== 2)) {
+                this.stopEvent(e);
+                return this.handleMouseUp(e);
+            }
+
+            if (!this.dragThreshMet) {
+                var diffX = Math.abs(this.startX - Ext.lib.Event.getPageX(e));
+                var diffY = Math.abs(this.startY - Ext.lib.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);
+                if(!this.dragCurrent.moveOnly){
+                    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 = Ext.lib.Event.getPageX(e);
+            var y = Ext.lib.Event.getPageY(e);
+            var pt = new Ext.lib.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>
+         * Ext.dd.DragDropMgr.refreshCache(ddinstance.groups);
+         * </code>
+         * Alternatively:
+         * <code>
+         * Ext.dd.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 {Ext.lib.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= Ext.lib.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 Ext.lib.Region( t, r, b, l );
+        },
+
+        /**
+         * Checks the cursor location to see if it over the target
+         * @method isOverTarget
+         * @param {Ext.lib.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 Ext.lib.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) {
+            Ext.dd.DragDropMgr.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 {Ext.dd.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(Ext.getDom(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 Ext.lib.Ext.getDom instead
+         * @static
+         */
+        getElement: function(id) {
+            return Ext.getDom(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 Ext.lib.Dom instead
+         * @static
+         */
+        getCss: function(id) {
+            var el = Ext.getDom(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 Ext.lib.Dom.getX instead
+         * @static
+         */
+        getPosX: function(el) {
+            return Ext.lib.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 Ext.lib.Dom.getY instead
+         * @static
+         */
+        getPosY: function(el) {
+            return Ext.lib.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 {
+
+            }
+            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 Ext.lib.Dom.getStyle
+         * @static
+         */
+        getStyle: function(el, styleProp) {
+            return Ext.fly(el).getStyle(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 = Ext.lib.Dom.getXY(targetEl);
+            Ext.lib.Dom.setXY(moveEl, aCoord);
+        },
+
+        /**
+         * 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 = Ext.dd.DDM;
+            if ( Ext.lib.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
+Ext.dd.DDM = Ext.dd.DragDropMgr;
+Ext.dd.DDM._addListeners();
+
+}
+
+/**
+ * @class Ext.dd.DD
+ * A DragDrop implementation where the linked element follows the
+ * mouse cursor during a drag.
+ * @extends Ext.dd.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
+ */
+Ext.dd.DD = function(id, sGroup, config) {
+    if (id) {
+        this.init(id, sGroup, config);
+    }
+};
+
+Ext.extend(Ext.dd.DD, Ext.dd.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)
+     * @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);
+        var fly = el.dom ? el : Ext.fly(el);
+        if (!this.deltaSetXY) {
+            var aCoord = [oCoord.x, oCoord.y];
+            fly.setXY(aCoord);
+            var newLeft = fly.getLeft(true);
+            var newTop  = fly.getTop(true);
+            this.deltaSetXY = [ newLeft - oCoord.x, newTop - oCoord.y ];
+        } else {
+            fly.setLeftTop(oCoord.x + this.deltaSetXY[0], oCoord.y + this.deltaSetXY[1]);
+        }
+
+        this.cachePosition(oCoord.x, oCoord.y);
+        this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth);
+        return oCoord;
+    },
+
+    /**
+     * 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 = Ext.lib.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 = Ext.lib.Dom.getViewWidth();
+
+            // The client width
+            var clientW = Ext.lib.Dom.getViewHeight();
+
+            // 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
+     * Ext.dd.DragDrop, but all versions of this method through the
+     * inheritance chain are called
+     */
+    applyConfig: function() {
+        Ext.dd.DD.superclass.applyConfig.call(this);
+        this.scroll = (this.config.scroll !== false);
+    },
+
+    /*
+     * Event that fires prior to the onMouseDown event.  Overrides
+     * Ext.dd.DragDrop.
+     */
+    b4MouseDown: function(e) {
+        // this.resetConstraints();
+        this.autoOffset(Ext.lib.Event.getPageX(e),
+                            Ext.lib.Event.getPageY(e));
+    },
+
+    /*
+     * Event that fires prior to the onDrag event.  Overrides
+     * Ext.dd.DragDrop.
+     */
+    b4Drag: function(e) {
+        this.setDragElPos(Ext.lib.Event.getPageX(e),
+                            Ext.lib.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) {
+    }
+
+    */
+
+});
+/**
+ * @class Ext.dd.DDProxy
+ * 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.
+ *
+ * @extends Ext.dd.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
+ */
+Ext.dd.DDProxy = function(id, sGroup, config) {
+    if (id) {
+        this.init(id, sGroup, config);
+        this.initFrame();
+    }
+};
+
+/**
+ * The default drag frame div id
+ * @property Ext.dd.DDProxy.dragElId
+ * @type String
+ * @static
+ */
+Ext.dd.DDProxy.dragElId = "ygddfdiv";
+
+Ext.extend(Ext.dd.DDProxy, Ext.dd.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 Ext.dd.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() {
+        Ext.dd.DDProxy.superclass.applyConfig.call(this);
+
+        this.resizeFrame = (this.config.resizeFrame !== false);
+        this.centerFrame = (this.config.centerFrame);
+        this.setDragElId(this.config.dragElId || Ext.dd.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);
+
+        Ext.fly(dragEl).show();
+    },
+
+    /**
+     * 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 el = this.getEl();
+            Ext.fly(this.getDragEl()).setSize(el.offsetWidth, el.offsetHeight);
+        }
+    },
+
+    // overrides Ext.dd.DragDrop
+    b4MouseDown: function(e) {
+        var x = Ext.lib.Event.getPageX(e);
+        var y = Ext.lib.Event.getPageY(e);
+        this.autoOffset(x, y);
+        this.setDragElPos(x, y);
+    },
+
+    // overrides Ext.dd.DragDrop
+    b4StartDrag: function(x, y) {
+        // show the drag frame
+        this.showFrame(x, y);
+    },
+
+    // overrides Ext.dd.DragDrop
+    b4EndDrag: function(e) {
+        Ext.fly(this.getDragEl()).hide();
+    },
+
+    // overrides Ext.dd.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 Ext.dd.DD.
+    endDrag: function(e) {
+
+        var lel = this.getEl();
+        var del = this.getDragEl();
+
+        // Show the drag frame briefly so we can get its position
+        del.style.visibility = "";
+
+        this.beforeMove();
+        // Hide the linked element before the move to get around a Safari
+        // rendering bug.
+        lel.style.visibility = "hidden";
+        Ext.dd.DDM.moveToEl(lel, del);
+        del.style.visibility = "hidden";
+        lel.style.visibility = "";
+
+        this.afterDrag();
+    },
+
+    beforeMove : function(){
+
+    },
+
+    afterDrag : function(){
+
+    },
+
+    toString: function() {
+        return ("DDProxy " + this.id);
+    }
+
+});
+/**
+ * @class Ext.dd.DDTarget
+ * 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.
+ * @extends Ext.dd.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
+ */
+Ext.dd.DDTarget = function(id, sGroup, config) {
+    if (id) {
+        this.initTarget(id, sGroup, config);
+    }
+};
+
+// Ext.dd.DDTarget.prototype = new Ext.dd.DragDrop();
+Ext.extend(Ext.dd.DDTarget, Ext.dd.DragDrop, {
+    toString: function() {
+        return ("DDTarget " + this.id);
+    }
+});
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DataField.jss.html b/www/extras/yui-ext/docs/output/DataField.jss.html new file mode 100644 index 000000000..a98a09728 --- /dev/null +++ b/www/extras/yui-ext/docs/output/DataField.jss.html @@ -0,0 +1,94 @@ +DataField.js

DataField.js

Ext.data.Field = function(config){
+    if(typeof config == "string"){
+        config = {name: config};
+    }
+    Ext.apply(this, config);
+    
+    if(!this.type){
+        this.type = "auto";
+    }
+    
+    var st = Ext.data.SortTypes;
+    // named sortTypes are supported, here we look them up
+    if(typeof this.sortType == "string"){
+        this.sortType = st[this.sortType];
+    }
+    
+    // set default sortType for strings and dates
+    if(!this.sortType){
+        switch(this.type){
+            case "string":
+                this.sortType = st.asUCString;
+                break;
+            case "date":
+                this.sortType = st.asDate;
+                break;
+            default:
+                this.sortType = st.none;
+        }
+    }
+
+    // define once
+    var stripRe = /[\$,%]/g;
+
+    // prebuilt conversion function for this field, instead of
+    // switching every time we're reading a value
+    if(!this.convert){
+        var cv, dateFormat = this.dateFormat;
+        switch(this.type){
+            case "":
+            case "auto":
+            case undefined:
+                cv = function(v){ return v; };
+                break;
+            case "string":
+                cv = function(v){ return String(v); };
+                break;
+            case "int":
+                cv = function(v){
+                    return v !== undefined && v !== null && v !== '' ?
+                           parseInt(String(v).replace(stripRe, ""), 10) : '';
+                    };
+                break;
+            case "float":
+                cv = function(v){
+                    return v !== undefined && v !== null && v !== '' ?
+                           parseFloat(String(v).replace(stripRe, ""), 10) : ''; 
+                    };
+                break;
+            case "bool":
+            case "boolean":
+                cv = function(v){ return v === true || v === "true" || v == 1; };
+                break;
+            case "date":
+                cv = function(v){
+                    if(!v){
+                        return '';
+                    }
+                    if(v instanceof Date){
+                        return v;
+                    }
+                    if(dateFormat){
+                        if(dateFormat == "timestamp"){
+                            return new Date(v*1000);
+                        }
+                        return Date.parseDate(v, dateFormat);
+                    }
+                    var parsed = Date.parse(v);
+                    return parsed ? new Date(parsed) : null;
+                };
+             break;
+            
+        }
+        this.convert = cv;
+    }
+};
+
+Ext.data.Field.prototype = {
+    dateFormat: null,
+    defaultValue: "",
+    mapping: null,
+    sortType : null,
+    sortDir : "ASC"
+};

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DataProxy.jss.html b/www/extras/yui-ext/docs/output/DataProxy.jss.html new file mode 100644 index 000000000..fc14d2a3d --- /dev/null +++ b/www/extras/yui-ext/docs/output/DataProxy.jss.html @@ -0,0 +1,41 @@ +DataProxy.js

DataProxy.js

/**
+ * @class Ext.data.DataProxy
+ * This class is an abstract base class for implementations which provide retrieval of
+ * unformatted data objects.
+ * <p>
+ * DataProxy implementations are usually used in conjunction with an implementation of Ext.data.DataReader
+ * (of the approriate type which knows how to parse the data object) to provide a block of Records
+ * to an Ext.data.Store.
+ * <p>
+ * Custom implementations must implement the load method as described in
+ * {@link Ext.data.HttpProxy#load}.
+ */
+Ext.data.DataProxy = function(){
+    this.addEvents({
+        /**
+         * @event beforeload
+         * Fires before a network request is made to retrieve a data object.
+         * @param {Object} params The params parameter to the load function.
+         */
+        beforeload : true,
+        /**
+         * @event load
+         * Fires before the load method's callback is called.
+         * @param {Object} o The data object.
+         * @param {Object} arg The callback argument object passed to the load function.
+         */
+        load : true,
+        /**
+         * @event loadexception
+         * Fires if an Exception occurs during data retrieval.
+         * @param {Object} o The data object.
+         * @param {Object} arg The callback argument object passed to the load function.
+         * @param {Object} e The Exception.
+         */
+        loadexception : true
+    });
+    Ext.data.DataProxy.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.data.DataProxy, Ext.util.Observable);

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DataReader.jss.html b/www/extras/yui-ext/docs/output/DataReader.jss.html new file mode 100644 index 000000000..4d6161a04 --- /dev/null +++ b/www/extras/yui-ext/docs/output/DataReader.jss.html @@ -0,0 +1,10 @@ +DataReader.js

DataReader.js

Ext.data.DataReader = function(meta, recordType){
+    this.meta = meta;
+    this.recordType = recordType instanceof Array ? 
+        Ext.data.Record.create(recordType) : recordType;
+};
+
+Ext.data.DataReader.prototype = {
+    
+};

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Date.html b/www/extras/yui-ext/docs/output/Date.html new file mode 100644 index 000000000..467acdc19 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Date.html @@ -0,0 +1,764 @@ + + + + Date + + + + + + +
+
+  Print Friendly
+ +
+

Class Date

+ + + + + +
Package:Global
Class:Date
Extends:Object
Defined In:Date.js
+
+ The date parsing and format syntax is a subset of +PHP's date() function, and the formats that are +supported will provide results equivalent to their PHP versions. +Following is the list of all currently supported formats: +
+Sample date:
+'Wed Jan 10 2007 15:05:01 GMT-0600 (Central Standard Time)'
+
+Format  Output      Description
+------  ----------  --------------------------------------------------------------
+  d      10         Day of the month, 2 digits with leading zeros
+  D      Wed        A textual representation of a day, three letters
+  j      10         Day of the month without leading zeros
+  l      Wednesday  A full textual representation of the day of the week
+  S      th         English ordinal day of month suffix, 2 chars (use with j)
+  w      3          Numeric representation of the day of the week
+  z      9          The julian date, or day of the year (0-365)
+  W      01         ISO-8601 2-digit week number of year, weeks starting on Monday (00-52)
+  F      January    A full textual representation of the month
+  m      01         Numeric representation of a month, with leading zeros
+  M      Jan        Month name abbreviation, three letters
+  n      1          Numeric representation of a month, without leading zeros
+  t      31         Number of days in the given month
+  L      0          Whether it's a leap year (1 if it is a leap year, else 0)
+  Y      2007       A full numeric representation of a year, 4 digits
+  y      07         A two digit representation of a year
+  a      pm         Lowercase Ante meridiem and Post meridiem	
+  A      PM         Uppercase Ante meridiem and Post meridiem
+  g      3          12-hour format of an hour without leading zeros
+  G      15         24-hour format of an hour without leading zeros
+  h      03         12-hour format of an hour with leading zeros
+  H      15         24-hour format of an hour with leading zeros
+  i      05         Minutes with leading zeros
+  s      01         Seconds, with leading zeros
+  O      -0600      Difference to Greenwich time (GMT) in hours
+  T      CST        Timezone setting of the machine running the code
+  Z      -21600     Timezone offset in seconds (negative if west of UTC, positive if east)
+
+Example usage (note that you must escape format specifiers with '\\' to render them as character literals): +
var dt = new Date('1/10/2007 03:05:01 PM GMT-0600');
+document.write(dt.format('Y-m-d'));                         //2007-01-10
+document.write(dt.format('F j, Y, g:i a'));                 //January 10, 2007, 3:05 pm
+document.write(dt.format('l, \\t\\he dS of F Y h:i:s A'));  //Wednesday, the 10th of January 2007 03:05:01 PM
+Here are some standard date/time patterns that you might find helpful. They +are not part of the source of Date.js, but to use them you can simply copy this +block of code into any script that is included after Date.js and they will also become +globally available on the Date object. Feel free to add or remove patterns as needed in your code. +

+Date.patterns = {
+    ISO8601Long:"Y-m-d H:i:s",
+    ISO8601Short:"Y-m-d",
+    ShortDate: "n/j/Y",
+    LongDate: "l, F d, Y",
+    FullDateTime: "l, F d, Y g:i:s A",
+    MonthDay: "F d",
+    ShortTime: "g:i A",
+    LongTime: "g:i:s A",
+    SortableDateTime: "Y-m-d\\TH:i:s",
+    UniversalSortableDateTime: "Y-m-d H:i:sO",
+    YearMonth: "F, Y"
+};
+
+Example usage: +

+var dt = new Date();
+document.write(dt.format(Date.patterns.ShortDate));
+ 
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 Date.DAY : StringDate
<static> Date interval constant
 Date.HOUR : StringDate
<static> Date interval constant
 Date.MILLI : StringDate
<static> Date interval constant
 Date.MINUTE : StringDate
<static> Date interval constant
 Date.MONTH : StringDate
<static> Date interval constant
 Date.SECOND : StringDate
<static> Date interval constant
 Date.YEAR : StringDate
<static> Date interval constant
 Date.dayNames : ArrayDate
<static> An array of textual day names. +Override these values for international dates, for example... +Date.dayN...
 Date.monthNames : ArrayDate
<static> An array of textual month names. +Override these values for international dates, for example... +Date.mo...
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Date.parseDate(String input, String format) : DateDate
<static> Parses the passed string using the specified format. Example Usage: + +var date = Date.parseDate('2006...
 add(String interval, Number value) : DateDate
Provides a convenient method of performing basic date arithmetic. This method +does not modify the Date instance bein...
 clearTime(Boolean clone) : DateDate
Clears any time information from this date
 clone() : DateDate
Creates and returns a new Date instance with the exact same date value as the called instance. +Dates are copied and p...
 format(String format) : StringDate
Formats a date given the supplied format string
 getDayOfYear() : NumberDate
Get the numeric day number of the year, adjusted for leap year.
 getDaysInMonth() : NumberDate
Get the number of days in the current month, adjusted for leap year.
 getElapsed([Date date]) : NumberDate
Returns the number of milliseconds between this date and date
 getFirstDateOfMonth() : DateDate
Get a Date of the first day of this date's month
 getFirstDayOfMonth() : NumberDate
Get the first day of the current month, adjusted for leap year. The returned value +is the numeric day index within t...
 getGMTOffset() : StringDate
Get the offset from GMT of the current date (equivalent to the format specifier 'O').
 getLastDateOfMonth() : DateDate
Get a Date of the late day of this date's month
 getLastDayOfMonth() : NumberDate
Get the last day of the current month, adjusted for leap year. The returned value +is the numeric day index within th...
 getSuffix() : StringDate
Get the English ordinal suffix of the current day (equivalent to the format specifier 'S').
 getTimezone() : StringDate
Get the timezone abbreviation of the current date (equivalent to the format specifier 'T').
 getWeekOfYear() : StringDate
Get the string representation of the numeric week number of the year +(equivalent to the format specifier 'W').
 isLeapYear() : BooleanDate
Whether or not the current date is in a leap year.
+ +

Public Events

+
This class has no public events.

Property Details

+
+ +
+

Date.DAY

+ public String Date.DAY +
+ <static> Date interval constant
+
This property is defined by Date.
+
+ +
+

Date.HOUR

+ public String Date.HOUR +
+ <static> Date interval constant
+
This property is defined by Date.
+
+ +
+

Date.MILLI

+ public String Date.MILLI +
+ <static> Date interval constant
+
This property is defined by Date.
+
+ +
+

Date.MINUTE

+ public String Date.MINUTE +
+ <static> Date interval constant
+
This property is defined by Date.
+
+ +
+

Date.MONTH

+ public String Date.MONTH +
+ <static> Date interval constant
+
This property is defined by Date.
+
+ +
+

Date.SECOND

+ public String Date.SECOND +
+ <static> Date interval constant
+
This property is defined by Date.
+
+ +
+

Date.YEAR

+ public String Date.YEAR +
+ <static> Date interval constant
+
This property is defined by Date.
+
+ +
+

Date.dayNames

+ public Array Date.dayNames +
+ <static> An array of textual day names. +Override these values for international dates, for example... +Date.dayNames = ['SundayInYourLang', 'MondayInYourLang', ...];
+
This property is defined by Date.
+
+ +
+

Date.monthNames

+ public Array Date.monthNames +
+ <static> An array of textual month names. +Override these values for international dates, for example... +Date.monthNames = ['JanInYourLang', 'FebInYourLang', ...];
+
This property is defined by Date.
+
+
+ + +

Method Details

+
+ +
+

Date.parseDate

+ public function Date.parseDate(String input, String format) +
+ <static> Parses the passed string using the specified format. Example Usage: +

+var date = Date.parseDate('2006-12-25', 'Y-m-d');
+
+
+ Parameters: +
  • input : String
    The unparsed date as a string
  • format : String
    The format the date is in
+ Returns: +
    +
  • Date
    The parsed date
  • +
+
+
+
This method is defined by Date.
+
+ +
+

add

+ public function add(String interval, Number value) +
+ Provides a convenient method of performing basic date arithmetic. This method +does not modify the Date instance being called - it creates and returns +a new Date instance containing the resulting date value. +Examples: +

+//Basic usage:
+var dt = new Date('10/29/2006').add(Date.DAY, 5);
+document.write(dt); //returns 'Fri Oct 06 2006 00:00:00'
+
+//Negative values will subtract correctly:
+var dt2 = new Date('10/1/2006').add(Date.DAY, -5);
+document.write(dt2); //returns 'Tue Sep 26 2006 00:00:00'
+
+//You can even chain several calls together in one line!
+var dt3 = new Date('10/1/2006').add(Date.DAY, 5).add(Date.HOUR, 8).add(Date.MINUTE, -30);
+document.write(dt3); //returns 'Fri Oct 06 2006 07:30:00'
+ 
+
+ Parameters: +
  • interval : String
    A valid date interval enum value
  • value : Number
    The amount to add to the current date
+ Returns: +
    +
  • Date
    The new Date instance
  • +
+
+
+
This method is defined by Date.
+
+ +
+

clearTime

+ public function clearTime(Boolean clone) +
+ Clears any time information from this date +
+ Parameters: +
  • clone : Boolean
    true to create a clone of this date, clear the time and return it
+ Returns: +
    +
  • Date
    this or the clone
  • +
+
+
+
This method is defined by Date.
+
+ +
+

clone

+ public function clone() +
+ Creates and returns a new Date instance with the exact same date value as the called instance. +Dates are copied and passed by reference, so if a copied date variable is modified later, the original +variable will also be changed. When the intention is to create a new variable that will not +modify the original instance, you should create a clone. +Example of correctly cloning a date: +

+//wrong way:
+var orig = new Date('10/1/2006');
+var copy = orig;
+copy.setDate(5);
+document.write(orig);  //returns 'Thu Oct 05 2006'!
+
+//correct way:
+var orig = new Date('10/1/2006');
+var copy = orig.clone();
+copy.setDate(5);
+document.write(orig);  //returns 'Thu Oct 01 2006'
+
+
+ Parameters: +
  • None.
+ Returns: +
    +
  • Date
    The new Date instance
  • +
+
+
+
This method is defined by Date.
+
+ +
+

format

+ public function format(String format) +
+ Formats a date given the supplied format string +
+ Parameters: +
  • format : String
    The format string
+ Returns: +
    +
  • String
    The formatted date
  • +
+
+
+
This method is defined by Date.
+
+ +
+

getDayOfYear

+ public function getDayOfYear() +
+ Get the numeric day number of the year, adjusted for leap year. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
    0 through 365 (366 in leap years)
  • +
+
+
+
This method is defined by Date.
+
+ +
+

getDaysInMonth

+ public function getDaysInMonth() +
+ Get the number of days in the current month, adjusted for leap year. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
    The number of days in the month
  • +
+
+
+
This method is defined by Date.
+
+ +
+

getElapsed

+ public function getElapsed([Date date]) +
+ Returns the number of milliseconds between this date and date +
+ Parameters: +
  • date : Date
    (optional) Defaults to now
+ Returns: +
    +
  • Number
    The diff in milliseconds
  • +
+
+
+
This method is defined by Date.
+
+ +
+

getFirstDateOfMonth

+ public function getFirstDateOfMonth() +
+ Get a Date of the first day of this date's month +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Date
  • +
+
+
+
This method is defined by Date.
+
+ +
+

getFirstDayOfMonth

+ public function getFirstDayOfMonth() +
+ Get the first day of the current month, adjusted for leap year. The returned value +is the numeric day index within the week (0-6) which can be used in conjunction with +the monthNames array to retrieve the textual day name. +Example: +

+var dt = new Date('1/10/2007');
+document.write(Date.dayNames[dt.getFirstDayOfMonth()]); //output: 'Monday'
+
+
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
    The day number (0-6)
  • +
+
+
+
This method is defined by Date.
+
+ +
+

getGMTOffset

+ public function getGMTOffset() +
+ Get the offset from GMT of the current date (equivalent to the format specifier 'O'). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    The 4-character offset string prefixed with + or - (e.g. '-0600')
  • +
+
+
+
This method is defined by Date.
+
+ +
+

getLastDateOfMonth

+ public function getLastDateOfMonth() +
+ Get a Date of the late day of this date's month +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Date
  • +
+
+
+
This method is defined by Date.
+
+ +
+

getLastDayOfMonth

+ public function getLastDayOfMonth() +
+ Get the last day of the current month, adjusted for leap year. The returned value +is the numeric day index within the week (0-6) which can be used in conjunction with +the monthNames array to retrieve the textual day name. +Example: +

+var dt = new Date('1/10/2007');
+document.write(Date.dayNames[dt.getLastDayOfMonth()]); //output: 'Wednesday'
+
+
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
    The day number (0-6)
  • +
+
+
+
This method is defined by Date.
+
+ +
+

getSuffix

+ public function getSuffix() +
+ Get the English ordinal suffix of the current day (equivalent to the format specifier 'S'). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    'st, 'nd', 'rd' or 'th'
  • +
+
+
+
This method is defined by Date.
+
+ +
+

getTimezone

+ public function getTimezone() +
+ Get the timezone abbreviation of the current date (equivalent to the format specifier 'T'). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    The abbreviated timezone name (e.g. 'CST')
  • +
+
+
+
This method is defined by Date.
+
+ +
+

getWeekOfYear

+ public function getWeekOfYear() +
+ Get the string representation of the numeric week number of the year +(equivalent to the format specifier 'W'). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    '00' through '52'
  • +
+
+
+
This method is defined by Date.
+
+ +
+

isLeapYear

+ public function isLeapYear() +
+ Whether or not the current date is in a leap year. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    True if the current date is in a leap year, else false
  • +
+
+
+
This method is defined by Date.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Date.jss.html b/www/extras/yui-ext/docs/output/Date.jss.html new file mode 100644 index 000000000..e4e710280 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Date.jss.html @@ -0,0 +1,704 @@ +Date.js

Date.js

/**
+ * @class Date
+ * 
+ * The date parsing and format syntax is a subset of 
+ * <a href="http://www.php.net/date">PHP's date() function</a>, and the formats that are
+ * supported will provide results equivalent to their PHP versions.
+ * 
+ * Following is the list of all currently supported formats:
+ *<pre>
+Sample date:
+'Wed Jan 10 2007 15:05:01 GMT-0600 (Central Standard Time)'
+
+Format  Output      Description
+------  ----------  --------------------------------------------------------------
+  d      10         Day of the month, 2 digits with leading zeros
+  D      Wed        A textual representation of a day, three letters
+  j      10         Day of the month without leading zeros
+  l      Wednesday  A full textual representation of the day of the week
+  S      th         English ordinal day of month suffix, 2 chars (use with j)
+  w      3          Numeric representation of the day of the week
+  z      9          The julian date, or day of the year (0-365)
+  W      01         ISO-8601 2-digit week number of year, weeks starting on Monday (00-52)
+  F      January    A full textual representation of the month
+  m      01         Numeric representation of a month, with leading zeros
+  M      Jan        Month name abbreviation, three letters
+  n      1          Numeric representation of a month, without leading zeros
+  t      31         Number of days in the given month
+  L      0          Whether it's a leap year (1 if it is a leap year, else 0)
+  Y      2007       A full numeric representation of a year, 4 digits
+  y      07         A two digit representation of a year
+  a      pm         Lowercase Ante meridiem and Post meridiem	
+  A      PM         Uppercase Ante meridiem and Post meridiem
+  g      3          12-hour format of an hour without leading zeros
+  G      15         24-hour format of an hour without leading zeros
+  h      03         12-hour format of an hour with leading zeros
+  H      15         24-hour format of an hour with leading zeros
+  i      05         Minutes with leading zeros
+  s      01         Seconds, with leading zeros
+  O      -0600      Difference to Greenwich time (GMT) in hours
+  T      CST        Timezone setting of the machine running the code
+  Z      -21600     Timezone offset in seconds (negative if west of UTC, positive if east)
+</pre>
+ *
+ * Example usage (note that you must escape format specifiers with '\\' to render them as character literals):
+ * <pre><code>
+var dt = new Date('1/10/2007 03:05:01 PM GMT-0600');
+document.write(dt.format('Y-m-d'));                         //2007-01-10
+document.write(dt.format('F j, Y, g:i a'));                 //January 10, 2007, 3:05 pm
+document.write(dt.format('l, \\t\\he dS of F Y h:i:s A'));  //Wednesday, the 10th of January 2007 03:05:01 PM
+ </code></pre>
+ * 
+ * Here are some standard date/time patterns that you might find helpful.  They
+ * are not part of the source of Date.js, but to use them you can simply copy this
+ * block of code into any script that is included after Date.js and they will also become
+ * globally available on the Date object.  Feel free to add or remove patterns as needed in your code.
+ * <pre><code>
+Date.patterns = {
+    ISO8601Long:"Y-m-d H:i:s",
+    ISO8601Short:"Y-m-d",
+    ShortDate: "n/j/Y",
+    LongDate: "l, F d, Y",
+    FullDateTime: "l, F d, Y g:i:s A",
+    MonthDay: "F d",
+    ShortTime: "g:i A",
+    LongTime: "g:i:s A",
+    SortableDateTime: "Y-m-d\\TH:i:s",
+    UniversalSortableDateTime: "Y-m-d H:i:sO",
+    YearMonth: "F, Y"
+};
+</code></pre>
+ *
+ * Example usage:
+ * <pre><code>
+var dt = new Date();
+document.write(dt.format(Date.patterns.ShortDate));
+ </code></pre>
+ */
+// holder
+/**
+ * Most of the date-formatting functions below are the excellent work of Baron Schwartz.
+ * They generate precompiled functions from date formats instead of parsing and 
+ * processing the pattern every time you format a date.  These functions are available 
+ * on every Date object (any javascript function).
+ *
+ * The original article and download are here:
+ * http://www.xaprb.com/blog/2005/12/12/javascript-closures-for-runtime-efficiency/
+ *
+ */
+
+// private
+Date.parseFunctions = {count:0};
+// private
+Date.parseRegexes = [];
+// private
+Date.formatFunctions = {count:0};
+
+// private
+Date.prototype.dateFormat = function(format) {
+    if (Date.formatFunctions[format] == null) {
+        Date.createNewFormat(format);
+    }
+    var func = Date.formatFunctions[format];
+    return this[func]();
+};
+
+
+/**
+ * Formats a date given the supplied format string
+ * @param {String} format The format string
+ * @return {String} The formatted date
+ * @method
+ */
+Date.prototype.format = Date.prototype.dateFormat;
+
+// private
+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) + ";}");
+};
+
+// private
+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 the passed string using the specified format. Example Usage:
+<pre><code>
+var date = Date.parseDate('2006-12-25', 'Y-m-d');
+</code></pre>
+ * @param {String} input The unparsed date as a string
+ * @param {String} format The format the date is in
+ * @return {Date} The parsed date
+ * @static
+ */
+Date.parseDate = function(input, format) {
+    if (Date.parseFunctions[format] == null) {
+        Date.createParser(format);
+    }
+    var func = Date.parseFunctions[format];
+    return Date[func](input);
+};
+
+// private
+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 {
+            var 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);
+};
+
+// private
+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)};
+    }
+};
+
+/**
+ * Get the timezone abbreviation of the current date (equivalent to the format specifier 'T').
+ * @return {String} The abbreviated timezone name (e.g. 'CST')
+ */
+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");
+};
+
+/**
+ * Get the offset from GMT of the current date (equivalent to the format specifier 'O').
+ * @return {String} The 4-character offset string prefixed with + or - (e.g. '-0600')
+ */
+Date.prototype.getGMTOffset = function() {
+    return (this.getTimezoneOffset() > 0 ? "-" : "+")
+        + String.leftPad(Math.floor(this.getTimezoneOffset() / 60), 2, "0")
+        + String.leftPad(this.getTimezoneOffset() % 60, 2, "0");
+};
+
+/**
+ * Get the numeric day number of the year, adjusted for leap year.
+ * @return {Number} 0 through 365 (366 in leap years)
+ */
+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;
+};
+
+/**
+ * Get the string representation of the numeric week number of the year
+ * (equivalent to the format specifier 'W').
+ * @return {String} '00' through '52'
+ */
+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);
+    return String.leftPad(((now - then) / 7) + 1, 2, "0");
+};
+
+/**
+ * Whether or not the current date is in a leap year.
+ * @return {Boolean} True if the current date is in a leap year, else false
+ */
+Date.prototype.isLeapYear = function() {
+    var year = this.getFullYear();
+    return ((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));
+};
+
+/**
+ * Get the first day of the current month, adjusted for leap year.  The returned value
+ * is the numeric day index within the week (0-6) which can be used in conjunction with
+ * the {@link #monthNames} array to retrieve the textual day name.
+ * Example:
+ *<pre><code>
+var dt = new Date('1/10/2007');
+document.write(Date.dayNames[dt.getFirstDayOfMonth()]); //output: 'Monday'
+</code></pre>
+ * @return {Number} The day number (0-6)
+ */
+Date.prototype.getFirstDayOfMonth = function() {
+    var day = (this.getDay() - (this.getDate() - 1)) % 7;
+    return (day < 0) ? (day + 7) : day;
+};
+
+/**
+ * Get the last day of the current month, adjusted for leap year.  The returned value
+ * is the numeric day index within the week (0-6) which can be used in conjunction with
+ * the {@link #monthNames} array to retrieve the textual day name.
+ * Example:
+ *<pre><code>
+var dt = new Date('1/10/2007');
+document.write(Date.dayNames[dt.getLastDayOfMonth()]); //output: 'Wednesday'
+</code></pre>
+ * @return {Number} The day number (0-6)
+ */
+Date.prototype.getLastDayOfMonth = function() {
+    var day = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7;
+    return (day < 0) ? (day + 7) : day;
+};
+
+
+/**
+ * Get a Date of the first day of this date's month
+ * @return {Date}
+ */
+Date.prototype.getFirstDateOfMonth = function() {
+    return new Date(this.getFullYear(), this.getMonth(), 1);
+};
+
+/**
+ * Get a Date of the late day of this date's month
+ * @return {Date}
+ */
+Date.prototype.getLastDateOfMonth = function() {
+    return new Date(this.getFullYear(), this.getMonth(), this.getDaysInMonth());
+};
+/**
+ * Get the number of days in the current month, adjusted for leap year.
+ * @return {Number} The number of days in the month
+ */
+Date.prototype.getDaysInMonth = function() {
+    Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
+    return Date.daysInMonth[this.getMonth()];
+};
+
+/**
+ * Get the English ordinal suffix of the current day (equivalent to the format specifier 'S').
+ * @return {String} 'st, 'nd', 'rd' or 'th'
+ */
+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";
+    }
+};
+
+// private
+Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
+
+/**
+ * An array of textual month names.
+ * Override these values for international dates, for example...
+ * Date.monthNames = ['JanInYourLang', 'FebInYourLang', ...];
+ * @type Array
+ * @static
+ */
+Date.monthNames =
+   ["January",
+    "February",
+    "March",
+    "April",
+    "May",
+    "June",
+    "July",
+    "August",
+    "September",
+    "October",
+    "November",
+    "December"];
+    
+/**
+ * An array of textual day names.
+ * Override these values for international dates, for example...
+ * Date.dayNames = ['SundayInYourLang', 'MondayInYourLang', ...];
+ * @type Array
+ * @static
+ */
+Date.dayNames =
+   ["Sunday",
+    "Monday",
+    "Tuesday",
+    "Wednesday",
+    "Thursday",
+    "Friday",
+    "Saturday"];
+
+// private
+Date.y2kYear = 50;
+// private
+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};
+
+/**
+ * Creates and returns a new Date instance with the exact same date value as the called instance.
+ * Dates are copied and passed by reference, so if a copied date variable is modified later, the original 
+ * variable will also be changed.  When the intention is to create a new variable that will not 
+ * modify the original instance, you should create a clone.
+ *
+ * Example of correctly cloning a date:
+ * <pre><code>
+//wrong way:
+var orig = new Date('10/1/2006');
+var copy = orig;
+copy.setDate(5);
+document.write(orig);  //returns 'Thu Oct 05 2006'!
+
+//correct way:
+var orig = new Date('10/1/2006');
+var copy = orig.clone();
+copy.setDate(5);
+document.write(orig);  //returns 'Thu Oct 01 2006'
+</code></pre>
+ * @return {Date} The new Date instance
+ */
+Date.prototype.clone = function() {
+	return new Date(this.getTime());
+};
+
+/**
+ * Clears any time information from this date
+ @param {Boolean} clone true to create a clone of this date, clear the time and return it
+ @return {Date} this or the clone
+ */
+Date.prototype.clearTime = function(clone){
+    if(clone){
+        return this.clone().clearTime();
+    }
+    this.setHours(0);
+    this.setMinutes(0);
+    this.setSeconds(0);
+    this.setMilliseconds(0);
+    return this;
+};
+
+// private
+// safari setMonth is broken
+if(Ext.isSafari){
+    Date.brokenSetMonth = Date.prototype.setMonth;
+	Date.prototype.setMonth = function(num){
+		if(num <= -1){
+			var n = Math.ceil(-num);
+			var back_year = Math.ceil(n/12);
+			var month = (n % 12) ? 12 - n % 12 : 0 ;
+			this.setFullYear(this.getFullYear() - back_year);
+			return Date.brokenSetMonth.call(this, month);
+		} else {
+			return Date.brokenSetMonth.apply(this, arguments);
+		}
+	};
+}
+
+/** Date interval constant @static @type String */
+Date.MILLI = "ms";
+/** Date interval constant @static @type String */
+Date.SECOND = "s";
+/** Date interval constant @static @type String */
+Date.MINUTE = "mi";
+/** Date interval constant @static @type String */
+Date.HOUR = "h";
+/** Date interval constant @static @type String */
+Date.DAY = "d";
+/** Date interval constant @static @type String */
+Date.MONTH = "mo";
+/** Date interval constant @static @type String */
+Date.YEAR = "y";
+
+/** 
+ * Provides a convenient method of performing basic date arithmetic.  This method
+ * does not modify the Date instance being called - it creates and returns
+ * a new Date instance containing the resulting date value.
+ *
+ * Examples:
+ * <pre><code>
+//Basic usage:
+var dt = new Date('10/29/2006').add(Date.DAY, 5);
+document.write(dt); //returns 'Fri Oct 06 2006 00:00:00'
+
+//Negative values will subtract correctly:
+var dt2 = new Date('10/1/2006').add(Date.DAY, -5);
+document.write(dt2); //returns 'Tue Sep 26 2006 00:00:00'
+
+//You can even chain several calls together in one line!
+var dt3 = new Date('10/1/2006').add(Date.DAY, 5).add(Date.HOUR, 8).add(Date.MINUTE, -30);
+document.write(dt3); //returns 'Fri Oct 06 2006 07:30:00'
+ </code></pre>
+ *
+ * @param {String} interval   A valid date interval enum value
+ * @param {Number} value      The amount to add to the current date
+ * @return {Date} The new Date instance
+ */
+Date.prototype.add = function(interval, value){
+  var d = this.clone();
+  if (!interval || value === 0) return d;
+  switch(interval.toLowerCase()){
+    case Date.MILLI:
+      d.setMilliseconds(this.getMilliseconds() + value);
+      break;
+    case Date.SECOND:
+      d.setSeconds(this.getSeconds() + value);
+      break;
+    case Date.MINUTE:
+      d.setMinutes(this.getMinutes() + value);
+      break;
+    case Date.HOUR:
+      d.setHours(this.getHours() + value);
+      break;
+    case Date.DAY:
+      d.setDate(this.getDate() + value);
+      break;
+    case Date.MONTH:
+      var day = this.getDate();
+      if(day > 28){
+          day = Math.min(day, this.getFirstDateOfMonth().add('mo', value).getLastDateOfMonth().getDate());
+      }
+      d.setDate(day);
+      d.setMonth(this.getMonth() + value);
+      break;
+    case Date.YEAR:
+      d.setFullYear(this.getFullYear() + value);
+      break;
+  }
+  return d;
+};

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DateField.jss.html b/www/extras/yui-ext/docs/output/DateField.jss.html new file mode 100644 index 000000000..a205f24a7 --- /dev/null +++ b/www/extras/yui-ext/docs/output/DateField.jss.html @@ -0,0 +1,244 @@ +DateField.js

DateField.js

/**
+ * @class Ext.form.DateField
+ * @extends Ext.form.TriggerField
+ * Provides a date input field with a {@link Ext.DatePicker} dropdown and automatic date validation.
+* @constructor
+* Create a new DateField
+* @param {Object} config
+ */
+Ext.form.DateField = function(config){
+    Ext.form.DateField.superclass.constructor.call(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 = null;
+    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 + ")");
+    }
+};
+
+Ext.extend(Ext.form.DateField, Ext.form.TriggerField,  {
+    /**
+     * @cfg {String} format
+     * The default date format string which can be overriden for localization support.  The format must be
+     * valid according to {@link Date#parseDate} (defaults to 'm/d/y').
+     */
+    format : "m/d/y",
+    /**
+     * @cfg {Array} disabledDays
+     * An array of days to disable, 0 based. For example, [0, 6] disables Sunday and Saturday (defaults to null).
+     */
+    disabledDays : null,
+    /**
+     * @cfg {String} disabledDaysText
+     * The tooltip to display when the date falls on a disabled day (defaults to 'Disabled')
+     */
+    disabledDaysText : "Disabled",
+    /**
+     * @cfg {Array} 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. Some examples:
+     * <ul>
+     * <li>["03/08/2003", "09/16/2003"] would disable those exact dates</li>
+     * <li>["03/08", "09/16"] would disable those days for every year</li>
+     * <li>["^03/08"] would only match the beginning (useful if you are using short years)</li>
+     * <li>["03/../2006"] would disable every day in March 2006</li>
+     * <li>["^03"] would disable every day in every March</li>
+     * </ul>
+     * 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"].
+     */
+    disabledDates : null,
+    /**
+     * @cfg {String} disabledDatesText
+     * The tooltip text to display when the date falls on a disabled date (defaults to 'Disabled')
+     */
+    disabledDatesText : "Disabled",
+    /**
+     * @cfg {Date/String} minValue
+     * The minimum allowed date. Can be either a Javascript date object or a string date in a
+     * valid format (defaults to null).
+     */
+    minValue : null,
+    /**
+     * @cfg {Date/String} maxValue
+     * The maximum allowed date. Can be either a Javascript date object or a string date in a
+     * valid format (defaults to null).
+     */
+    maxValue : null,
+    /**
+     * @cfg {String} minText
+     * The error text to display when the date in the cell is before minValue (defaults to
+     * 'The date in this field must be after {minValue}').
+     */
+    minText : "The date in this field must be after {0}",
+    /**
+     * @cfg {String} maxText
+     * The error text to display when the date in the cell is before maxValue (defaults to
+     * 'The date in this field must be before {maxValue}').
+     */
+    maxText : "The date in this field must be before {0}",
+    /**
+     * @cfg {String} invalidText
+     * The error to display when the date in the field is invalid (defaults to
+     * '{value} is not a valid date - it must be in the format {format}').
+     */
+    invalidText : "{0} is not a valid date - it must be in the format {1}",
+    /**
+     * @cfg {String} triggerClass
+     * An additional CSS class used to style the trigger button.  The trigger will always get the
+     * class 'x-form-trigger' and triggerClass will be <b>appended</b> if specified (defaults to 'x-form-date-trigger'
+     * which displays a calendar icon).
+     */
+    triggerClass : 'x-form-date-trigger',
+    /**
+     * @cfg {String/Object} autoCreate
+     * A DomHelper element spec, or true for a default element spec (defaults to
+     * {tag: "input", type: "text", size: "10", autocomplete: "off"})
+     */
+
+    // private
+    defaultAutoCreate : {tag: "input", type: "text", size: "10", autocomplete: "off"},
+
+    // private
+    validateValue : function(value){
+        value = this.formatDate(value);
+        if(!Ext.form.DateField.superclass.validateValue.call(this, value)){
+            return false;
+        }
+        if(value.length < 1){ // if it's blank and textfield didn't flag it then it's valid
+             return true;
+        }
+        var svalue = value;
+        value = this.parseDate(value);
+        if(!value){
+            this.markInvalid(String.format(this.invalidText, svalue, this.format));
+            return false;
+        }
+        var time = value.getTime();
+        if(this.minValue && time < this.minValue.getTime()){
+            this.markInvalid(String.format(this.minText, this.formatDate(this.minValue)));
+            return false;
+        }
+        if(this.maxValue && time > this.maxValue.getTime()){
+            this.markInvalid(String.format(this.maxText, this.formatDate(this.maxValue)));
+            return false;
+        }
+        if(this.disabledDays){
+            var day = value.getDay();
+            for(var i = 0; i < this.disabledDays.length; i++) {
+            	if(day === this.disabledDays[i]){
+            	    this.markInvalid(this.disabledDaysText);
+                    return false;
+            	}
+            }
+        }
+        var fvalue = this.formatDate(value);
+        if(this.ddMatch && this.ddMatch.test(fvalue)){
+            this.markInvalid(String.format(this.disabledDatesText, fvalue));
+            return false;
+        }
+        return true;
+    },
+
+    // private
+    // Provides logic to override the default TriggerField.validateBlur which just returns true
+    validateBlur : function(){
+        return !this.menu || !this.menu.isVisible();
+    },
+
+    /**
+     * Returns the current date value of the date field
+     * @return {Date} value The date value
+     */
+    getValue : function(){
+        return this.parseDate(Ext.form.DateField.superclass.getValue.call(this)) || "";
+    },
+
+    /**
+     * Sets the value of the date field.  You can pass a date object or any string that can be parsed into a valid
+     * date, using DateField.format as the date format, according to the same rules as {@link Date#parseDate}
+     * (the default format used is "m/d/y").
+     * <br />Usage:
+     * <pre><code>
+//All of these calls set the same date value (May 4, 2006)
+
+//Pass a date object:
+var dt = new Date('5/4/06');
+dateField.setValue(dt);
+
+//Pass a date string (default format):
+dateField.setValue('5/4/06');
+
+//Pass a date string (custom format):
+dateField.format = 'Y-m-d';
+dateField.setValue('2006-5-4');
+</code></pre>
+     * @param {String/Date} date The date or valid date string
+     */
+    setValue : function(date){
+        Ext.form.DateField.superclass.setValue.call(this, this.formatDate(this.parseDate(date)));
+    },
+
+    // private
+    parseDate : function(value){
+        return (!value || value instanceof Date) ?
+               value : Date.parseDate(value, this.format);
+    },
+
+    // private
+    formatDate : function(date){
+        return (!date || !(date instanceof Date)) ?
+               date : date.dateFormat(this.format);
+    },
+
+    // private
+    menuListeners : {
+        select: function(m, d){
+            this.setValue(d);
+        },
+        show : function(){ // retain focus styling
+            this.onFocus();
+        },
+        hide : function(){
+            this.focus();
+            var ml = this.menuListeners;
+            this.menu.un("select", ml.select,  this);
+            this.menu.un("show", ml.show,  this);
+            this.menu.un("hide", ml.hide,  this);
+        }
+    },
+
+    // private
+    // Implements the default empty TriggerField.onTriggerClick function to display the DatePicker
+    onTriggerClick : function(){
+        if(this.disabled){
+            return;
+        }
+        if(this.menu == null){
+            this.menu = new Ext.menu.DateMenu();
+        }
+        Ext.apply(this.menu.picker,  {
+            minDate : this.minValue,
+            maxDate : this.maxValue,
+            disabledDatesRE : this.ddMatch,
+            disabledDatesText : this.disabledDatesText,
+            disabledDays : this.disabledDays,
+            disabledDaysText : this.disabledDaysText,
+            format : this.format,
+            minText : String.format(this.minText, this.formatDate(this.minValue)),
+            maxText : String.format(this.maxText, this.formatDate(this.maxValue))
+        });
+        this.menu.on(Ext.apply({}, this.menuListeners, {
+            scope:this
+        }));
+        this.menu.picker.setValue(this.getValue() || new Date());
+        this.menu.show(this.el, "tl-bl?");
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DateItem.jss.html b/www/extras/yui-ext/docs/output/DateItem.jss.html new file mode 100644 index 000000000..fc17ac8c5 --- /dev/null +++ b/www/extras/yui-ext/docs/output/DateItem.jss.html @@ -0,0 +1,30 @@ +DateItem.js

DateItem.js

/**
+ * @class Ext.menu.DateItem
+ * @extends Ext.menu.Adapter
+ * A menu item that wraps the {@link Ext.DatPicker} component.
+ * @constructor
+ * Creates a new DateItem
+ * @param {Object} config Configuration options
+ */
+Ext.menu.DateItem = function(config){
+    Ext.menu.DateItem.superclass.constructor.call(this, new Ext.DatePicker(config), config);
+    /** The Ext.DatePicker object @type Ext.DatePicker */
+    this.picker = this.component;
+    this.addEvents({select: true});
+    
+    this.picker.on("render", function(picker){
+        picker.getEl().swallowEvent("click");
+        picker.container.addClass("x-menu-date-item");
+    });
+
+    this.picker.on("select", this.onSelect, this);
+};
+
+Ext.extend(Ext.menu.DateItem, Ext.menu.Adapter, {
+    // private
+    onSelect : function(picker, date){
+        this.fireEvent("select", this, date, picker);
+        Ext.menu.DateItem.superclass.handleClick.call(this);
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DateMenu.jss.html b/www/extras/yui-ext/docs/output/DateMenu.jss.html new file mode 100644 index 000000000..b20454f63 --- /dev/null +++ b/www/extras/yui-ext/docs/output/DateMenu.jss.html @@ -0,0 +1,27 @@ +DateMenu.js

DateMenu.js

/**
+ * @class Ext.menu.DateMenu
+ * @extends Ext.menu.Menu
+ * A menu containing a {@link Ext.menu.DateItem} component (which provides a date picker).
+ * @constructor
+ * Creates a new DateMenu
+ * @param {Object} config Configuration options
+ */
+Ext.menu.DateMenu = function(config){
+    Ext.menu.DateMenu.superclass.constructor.call(this, config);
+    this.plain = true;
+    var di = new Ext.menu.DateItem(config);
+    this.add(di);
+    /**
+     * The {@link Ext.DatePicker} instance for this DateMenu
+     * @type DatePicker
+     */
+    this.picker = di.picker;
+    /**
+     * @event select
+     * @param {DatePicker} picker
+     * @param {Date} date
+     */
+    this.relayEvents(di, ["select"]);
+};
+Ext.extend(Ext.menu.DateMenu, Ext.menu.Menu);

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DatePicker.jss.html b/www/extras/yui-ext/docs/output/DatePicker.jss.html new file mode 100644 index 000000000..5d367a0f2 --- /dev/null +++ b/www/extras/yui-ext/docs/output/DatePicker.jss.html @@ -0,0 +1,480 @@ +DatePicker.js

DatePicker.js

/**
+ * @class Ext.DatePicker
+ * @extends Ext.Component
+ * Simple date picker class.
+ * @constructor
+ * Create a new DatePicker
+ * @param {Object} config The config object
+ */
+Ext.DatePicker = function(config){
+    Ext.DatePicker.superclass.constructor.call(this, config);
+
+    this.value = config && config.value ?
+                 config.value.clearTime() : new Date().clearTime();
+
+    this.addEvents({
+        /**
+	     * @event select
+	     * Fires when a date is selected
+	     * @param {DatePicker} this
+	     * @param {Date} date The selected date
+	     */
+        select: true
+    });
+
+    if(this.handler){
+        this.on("select", this.handler,  this.scope || this);
+    }
+    // build the disabledDatesRE
+    if(!this.disabledDatesRE && 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.disabledDatesRE = new RegExp(re + ")");
+    }
+};
+
+Ext.extend(Ext.DatePicker, Ext.Component, {
+    /**
+     * @cfg {String} todayText
+     * The text to display on the button that selects the current date (defaults to "Today")
+     */
+    todayText : "Today",
+    /**
+     * @cfg {String} todayTip
+     * The tooltip to display for the button that selects the current date (defaults to "{current date} (Spacebar)")
+     */
+    todayTip : "{0} (Spacebar)",
+    /**
+     * @cfg {Date} minDate
+     * Minimum allowable date (JavaScript date object, defaults to null)
+     */
+    minDate : null,
+    /**
+     * @cfg {Date} maxDate
+     * Maximum allowable date (JavaScript date object, defaults to null)
+     */
+    maxDate : null,
+    /**
+     * @cfg {String} minText
+     * The error text to display if the minDate validation fails (defaults to "This date is before the minimum date")
+     */
+    minText : "This date is before the minimum date",
+    /**
+     * @cfg {String} maxText
+     * The error text to display if the maxDate validation fails (defaults to "This date is after the maximum date")
+     */
+    maxText : "This date is after the maximum date",
+    /**
+     * @cfg {String} format
+     * The default date format string which can be overriden for localization support.  The format must be
+     * valid according to {@link Date#parseDate} (defaults to 'm/d/y').
+     */
+    format : "m/d/y",
+    /**
+     * @cfg {Array} disabledDays
+     * An array of days to disable, 0-based. For example, [0, 6] disables Sunday and Saturday (defaults to null).
+     */
+    disabledDays : null,
+    /**
+     * @cfg {String} disabledDaysText
+     * The tooltip to display when the date falls on a disabled day (defaults to "")
+     */
+    disabledDaysText : "",
+    /**
+     * @cfg {RegExp} disabledDatesRE
+     * JavaScript regular expression used to disable a pattern of dates (defaults to null)
+     */
+    disabledDatesRE : null,
+    /**
+     * @cfg {String} disabledDatesText
+     * The tooltip text to display when the date falls on a disabled date (defaults to "")
+     */
+    disabledDatesText : "",
+    /**
+     * @cfg {Boolean} constrainToViewport
+     * True to constrain the date picker to the viewport (defaults to true)
+     */
+    constrainToViewport : true,
+    /**
+     * @cfg {Array} monthNames
+     * An array of textual month names which can be overriden for localization support (defaults to Date.monthNames)
+     */
+    monthNames : Date.monthNames,
+    /**
+     * @cfg {Array} dayNames
+     * An array of textual day names which can be overriden for localization support (defaults to Date.dayNames)
+     */
+    dayNames : Date.dayNames,
+    /**
+     * @cfg {String} nextText
+     * The next month navigation button tooltip (defaults to 'Next Month (Control+Right)')
+     */
+    nextText: 'Next Month (Control+Right)',
+    /**
+     * @cfg {String} prevText
+     * The previous month navigation button tooltip (defaults to 'Previous Month (Control+Left)')
+     */
+    prevText: 'Previous Month (Control+Left)',
+    /**
+     * @cfg {String} monthYearText
+     * The header month selector tooltip (defaults to 'Choose a month (Control+Up/Down to move years)')
+     */
+    monthYearText: 'Choose a month (Control+Up/Down to move years)',
+    /**
+     * @cfg {Number} startDay
+     * Day index at which the week should begin, 0-based (defaults to 0, which is Sunday)
+     */
+    startDay : 0,
+
+    /**
+     * Sets the value of the date field
+     * @param {Date} value The date to set
+     */
+    setValue : function(value){
+        var old = this.value;
+        this.value = value.clearTime(true);
+        if(this.el){
+            this.update(this.value);
+        }
+    },
+
+    /**
+     * Gets the current selected value of the date field
+     * @return {Date} The selected date
+     */
+    getValue : function(){
+        return this.value;
+    },
+
+    // private
+    focus : function(){
+        if(this.el){
+            this.update(this.activeDate);
+        }
+    },
+
+    // private
+    onRender : function(container, position){
+        var m = [
+             '<table cellspacing="0">',
+                '<tr><td class="x-date-left"><a href="#" title="', this.prevText ,'">&#160;</a></td><td class="x-date-middle" align="center"></td><td class="x-date-right"><a href="#" title="', this.nextText ,'">&#160;</a></td></tr>',
+                '<tr><td colspan="3"><table class="x-date-inner" cellspacing="0"><thead><tr>'];
+        var dn = this.dayNames;
+        for(var i = 0; i < 7; i++){
+            var d = this.startDay+i;
+            if(d > 6){
+                d = d-7;
+            }
+            m.push("<th><span>", dn[d].substr(0,1), "</span></th>");
+        }
+        m[m.length] = "</tr></thead><tbody><tr>";
+        for(var i = 0; i < 42; i++) {
+            if(i % 7 == 0 && i != 0){
+                m[m.length] = "</tr><tr>";
+            }
+            m[m.length] = '<td><a href="#" hidefocus="on" class="x-date-date" tabIndex="1"><em><span></span></em></a></td>';
+        }
+        m[m.length] = '</tr></tbody></table></td></tr><tr><td colspan="3" class="x-date-bottom" align="center"></td></tr></table>';
+
+        var el = document.createElement("div");
+        el.className = "x-date-picker";
+        el.innerHTML = m.join("");
+
+        container.dom.insertBefore(el, position);
+
+        this.el = Ext.get(el);
+        new Ext.util.ClickRepeater(this.el.child("td.x-date-left a"), {handler: this.showPrevMonth, scope: this});
+        new Ext.util.ClickRepeater(this.el.child("td.x-date-right a"), {handler: this.showNextMonth, scope: this});
+
+        this.el.on("mousewheel", this.handleMouseWheel,  this);
+
+
+        var kn = new Ext.KeyNav(this.el, {
+            "left" : function(e){
+                e.ctrlKey ?
+                    this.showPrevMonth() :
+                    this.update(this.activeDate.add("d", -1));
+            },
+
+            "right" : function(e){
+                e.ctrlKey ?
+                    this.showNextMonth() :
+                    this.update(this.activeDate.add("d", 1));
+            },
+
+            "up" : function(e){
+                e.ctrlKey ?
+                    this.showNextYear() :
+                    this.update(this.activeDate.add("d", -7));
+            },
+
+            "down" : function(e){
+                e.ctrlKey ?
+                    this.showPrevYear() :
+                    this.update(this.activeDate.add("d", 7));
+            },
+
+            "pageUp" : function(e){
+                this.showNextMonth();
+            },
+
+            "pageDown" : function(e){
+                this.showPrevMonth();
+            },
+
+            "enter" : function(e){
+                e.stopPropagation();
+                return true;
+            },
+
+            scope : this
+        });
+
+        this.el.on("click", this.handleDateClick,  this, {delegate: "a.x-date-date"});
+
+        this.el.addKeyListener(Ext.EventObject.SPACE, this.selectToday,  this);
+
+        this.el.unselectable();
+        
+        this.cells = this.el.select("table.x-date-inner tbody td");
+        this.textNodes = this.el.query("table.x-date-inner tbody span");
+
+        var mmenu = new Ext.menu.Menu({
+            plain:true,
+            cls: "x-date-mmenu",
+            allowOtherMenus : true
+        });
+
+        var menuGroup = Ext.id()+"months";
+        for(var i = 0; i < 12; i++){
+            mmenu.add(new Ext.menu.CheckItem({
+                id: "mm-"+i,
+                text: this.monthNames[i],
+                group:menuGroup,
+                month: i
+            }));
+        }
+
+        mmenu.on({
+            "beforeshow" : function(){
+                mmenu.items.get("mm-"+(this.activeDate || this.value).getMonth()).setChecked(true);
+            },
+            "itemclick" : function(item){
+                var d = (this.activeDate || this.value).clone();
+                d.setMonth(item.month);
+                this.update(d);
+            },
+            "show" : function(m){
+                this.visibleRegion = m.el.getRegion().adjust(2, 2, -2, -2);
+            },
+            "mouseout" : function(m, e){
+                if(!this.visibleRegion.contains(e.getPoint())){
+                    m.hide();
+                }
+            },
+            scope: this
+        });
+
+        this.mbtn = new Ext.Button(this.el.child("td.x-date-middle", true), {
+            menu: mmenu,
+            text: "&#160;",
+            menuAlign: "c-c?",
+            tooltip: this.monthYearText
+        });
+
+        var today = (new Date()).dateFormat(this.format);
+        var todayBtn = new Ext.Button(this.el.child("td.x-date-bottom", true), {
+            text: String.format(this.todayText, today),
+            tooltip: String.format(this.todayTip, today),
+            handler: this.selectToday,
+            scope: this
+        });
+        
+        if(Ext.isIE){
+            this.el.repaint();
+        }
+        this.update(this.value);
+    },
+
+    // private
+    showPrevMonth : function(e){
+        this.update(this.activeDate.add("mo", -1));
+    },
+
+    // private
+    showNextMonth : function(e){
+        this.update(this.activeDate.add("mo", 1));
+    },
+
+    // private
+    showPrevYear : function(){
+        this.update(this.activeDate.add("y", -1));
+    },
+
+    // private
+    showNextYear : function(){
+        this.update(this.activeDate.add("y", 1));
+    },
+
+    // private
+    handleMouseWheel : function(e){
+        var delta = e.getWheelDelta();
+        if(delta > 0){
+            this.showPrevMonth();
+            e.stopEvent();
+        } else if(delta < 0){
+            this.showNextMonth();
+            e.stopEvent();
+        }
+    },
+
+    // private
+    handleDateClick : function(e, t){
+        e.stopEvent();
+        if(t.dateValue && !Ext.fly(t.parentNode).hasClass("x-date-disabled")){
+            this.setValue(new Date(t.dateValue));
+            this.fireEvent("select", this, this.value);
+        }
+    },
+
+    // private
+    selectToday : function(){
+        this.setValue(new Date().clearTime());
+        this.fireEvent("select", this, this.value);
+    },
+
+    // private
+    update : function(date){
+        var vd = this.activeDate;
+        this.activeDate = date;
+
+        if(vd && this.el){
+            var t = date.getTime();
+            if(vd.getMonth() == date.getMonth() && vd.getFullYear() == date.getFullYear()){
+                this.cells.removeClass("x-date-selected");
+                this.cells.each(function(c){
+                   if(c.dom.firstChild.dateValue == t){
+                       c.addClass("x-date-selected");
+                       setTimeout(function(){
+                            try{c.dom.firstChild.focus();}catch(e){}
+                       }, 50);
+                       return false;
+                   }
+                });
+                return;
+            }
+        }
+        var days = date.getDaysInMonth();
+        var firstOfMonth = date.getFirstDateOfMonth();
+        var startingPos = firstOfMonth.getDay()-this.startDay;
+
+        if(startingPos <= this.startDay){
+            startingPos += 7;
+        }
+
+        var pm = date.add("mo", -1);
+        var prevStart = pm.getDaysInMonth()-startingPos;
+
+        var cells = this.cells.elements;
+        var textEls = this.textNodes;
+        days += startingPos;
+
+        // convert everything to numbers so it's fast
+        var day = 86400000;
+        var d = (new Date(pm.getFullYear(), pm.getMonth(), prevStart)).clearTime();
+        var today = new Date().clearTime().getTime();
+        var sel = date.clearTime().getTime();
+        var min = this.minDate ? this.minDate.clearTime() : Number.NEGATIVE_INFINITY;
+        var max = this.maxDate ? this.maxDate.clearTime() : Number.POSITIVE_INFINITY;
+        var ddMatch = this.disabledDatesRE;
+        var ddText = this.disabledDatesText;
+        var ddays = this.disabledDays ? this.disabledDays.join("") : false;
+        var ddaysText = this.disabledDaysText;
+        var format = this.format;
+
+        var setCellClass = function(cal, cell){
+            cell.title = "";
+            var t = d.getTime();
+            cell.firstChild.dateValue = t;
+            if(t == today){
+                cell.className += " x-date-today";
+                cell.title = cal.todayText;
+            }
+            if(t == sel){
+                cell.className += " x-date-selected";
+                setTimeout(function(){
+                    try{cell.firstChild.focus();}catch(e){}
+                }, 50);
+            }
+            // disabling
+            if(t < min) {
+                cell.className = " x-date-disabled";
+                cell.title = cal.minText;
+                return;
+            }
+            if(t > max) {
+                cell.className = " x-date-disabled";
+                cell.title = cal.maxText;
+                return;
+            }
+            if(ddays){
+                if(ddays.indexOf(d.getDay()) != -1){
+                    cell.title = ddaysText;
+                    cell.className = " x-date-disabled";
+                }
+            }
+            if(ddMatch && format){
+                var fvalue = d.dateFormat(format);
+                if(ddMatch.test(fvalue)){
+                    cell.title = ddText.replace("%0", fvalue);
+                    cell.className = " x-date-disabled";
+                }
+            }
+        };
+
+        var i = 0;
+        for(; i < startingPos; i++) {
+            textEls[i].innerHTML = (++prevStart);
+            d.setDate(d.getDate()+1);
+            cells[i].className = "x-date-prevday";
+            setCellClass(this, cells[i]);
+        }
+        for(; i < days; i++){
+            intDay = i - startingPos + 1;
+            textEls[i].innerHTML = (intDay);
+            d.setDate(d.getDate()+1);
+            cells[i].className = "x-date-active";
+            setCellClass(this, cells[i]);
+        }
+        var extraDays = 0;
+        for(; i < 42; i++) {
+             textEls[i].innerHTML = (++extraDays);
+             d.setDate(d.getDate()+1);
+             cells[i].className = "x-date-nextday";
+             setCellClass(this, cells[i]);
+        }
+
+        this.mbtn.setText(this.monthNames[date.getMonth()] + " " + date.getFullYear());
+
+        if(!this.internalRender){
+            var main = this.el.dom.firstChild;
+            var w = main.offsetWidth;
+            this.el.setWidth(w + this.el.getBorderWidth("lr"));
+            Ext.fly(main).setWidth(w);
+            this.internalRender = true;
+            // opera does not respect the auto grow header center column
+            // then, after it gets a width opera refuses to recalculate
+            // without a second pass
+            if(Ext.isOpera && !this.secondPass){
+                main.rows[0].cells[1].style.width = (w - (main.rows[0].cells[0].offsetWidth+main.rows[0].cells[2].offsetWidth)) + "px";
+                this.secondPass = true;
+                this.update.defer(10, this, [date]);
+            }
+        }
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DelayedTask.jss.html b/www/extras/yui-ext/docs/output/DelayedTask.jss.html new file mode 100644 index 000000000..0faba6faf --- /dev/null +++ b/www/extras/yui-ext/docs/output/DelayedTask.jss.html @@ -0,0 +1,55 @@ +DelayedTask.js

DelayedTask.js

/**
+ * @class 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 {Function} 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
+ */
+Ext.util.DelayedTask = function(fn, scope, args){
+    var id = null, d, t;
+
+    var call = function(){
+        var now = new Date().getTime();
+        if(now - t >= d){
+            clearInterval(id);
+            id = null;
+            fn.apply(scope, args || []);
+        }
+    };
+    /**
+     * 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(id && delay != d){
+            this.cancel();
+        }
+        d = delay;
+        t = new Date().getTime();
+        fn = newFn || fn;
+        scope = newScope || scope;
+        args = newArgs || args;
+        if(!id){
+            id = setInterval(call, d);
+        }
+    };
+
+    /**
+     * Cancel the last queued timeout
+     */
+    this.cancel = function(){
+        if(id){
+            clearInterval(id);
+            id = null;
+        }
+    };
+};

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DomHelper.jss.html b/www/extras/yui-ext/docs/output/DomHelper.jss.html new file mode 100644 index 000000000..4d06506fe --- /dev/null +++ b/www/extras/yui-ext/docs/output/DomHelper.jss.html @@ -0,0 +1,389 @@ +DomHelper.js

DomHelper.js

/**
+ * @class 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
+ */
+Ext.DomHelper = function(){
+    var tempTableEl = null;
+    var emptyTags = /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i;
+           
+    // build as innerHTML where available
+    /** @ignore */
+    var createHtml = function(o){
+        if(typeof o == 'string'){
+            return o;
+        }
+        var b = "";
+        if(!o.tag){
+            o.tag = "div";
+        }
+        b += "<" + o.tag;
+        for(var attr in o){
+            if(attr == "tag" || attr == "children" || attr == "cn" || 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 += ">";
+            var cn = o.children || o.cn;
+            if(cn){
+                if(cn instanceof Array){
+                    for(var i = 0, len = cn.length; i < len; i++) {
+                        b += createHtml(cn[i], b);
+                    }
+                }else{
+                    b += createHtml(cn, b);
+                }
+            }
+            if(o.html){
+                b += o.html;
+            }
+            b += "</" + o.tag + ">";
+        }
+        return b;
+    };
+    
+    // build as dom
+    /** @ignore */
+    var createDom = function(o, parentNode){
+        var el = document.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 == "cn" || 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];
+            }
+        }
+        Ext.DomHelper.applyStyles(el, o.style);
+        var cn = o.children || o.cn;
+        if(cn){
+            if(cn instanceof Array){
+                for(var i = 0, len = cn.length; i < len; i++) {
+                    createDom(cn[i], el);
+                }
+            }else{
+                createDom(cn, el);
+            }
+        }
+        if(o.html){
+            el.innerHTML = o.html;
+        }
+        if(parentNode){
+           parentNode.appendChild(el);
+        }
+        return el;
+    };
+
+    var ieTable = function(depth, s, h, e){
+        tempTableEl.innerHTML = [s, h, e].join('');
+        var i = -1, el = tempTableEl;
+        while(++i < depth){
+            el = el.firstChild;
+        }
+        return el;
+    };
+
+    // kill repeat to save bytes
+    var ts = '<table>',
+        te = '</table>',
+        tbs = ts+'<tbody>',
+        tbe = '</tbody>'+te,
+        trs = tbs + '<tr>',
+        tre = '</tr>'+tbe;
+
+    /**
+     * @ignore
+     * Nasty code for IE's broken table implementation 
+     */
+    var insertIntoTable = function(tag, where, el, html){
+        if(!tempTableEl){
+            tempTableEl = document.createElement('div');
+        }
+        var node;
+        var before = null;
+        if(tag == 'td'){
+            if(where == 'afterbegin' || where == 'beforeend'){ // INTO a TD
+                return;
+            }
+            if(where == 'beforebegin'){
+                before = el;
+                el = el.parentNode;
+            } else{
+                before = el.nextSibling;
+                el = el.parentNode;
+            }
+            node = ieTable(4, trs, html, tre);
+        }
+        else if(tag == 'tr'){
+            if(where == 'beforebegin'){
+                before = el;
+                el = el.parentNode;
+                node = ieTable(3, tbs, html, tbe);
+            } else if(where == 'afterend'){
+                before = el.nextSibling;
+                el = el.parentNode;
+                node = ieTable(3, tbs, html, tbe);
+            } else{ // INTO a TR
+                if(where == 'afterbegin'){
+                    before = el.firstChild;
+                }
+                node = ieTable(4, trs, html, tre);
+            }
+        } else if(tag == 'tbody'){
+            if(where == 'beforebegin'){
+                before = el;
+                el = el.parentNode;
+                node = ieTable(2, ts, html, te);
+            } else if(where == 'afterend'){
+                before = el.nextSibling;
+                el = el.parentNode;
+                node = ieTable(2, ts, html, te);
+            } else{
+                if(where == 'afterbegin'){
+                    before = el.firstChild;
+                }
+                node = ieTable(3, tbs, html, tbe);
+            }
+        } else{ // TABLE
+            if(where == 'beforebegin' || where == 'afterend'){ // OUTSIDE the table
+                return;
+            }
+            if(where == 'afterbegin'){
+                before = el.firstChild;
+            }
+            node = ieTable(2, ts, html, te);
+        }
+        el.insertBefore(node, before);
+        return node;
+    };
+    
+    return {
+    /** True to force the use of DOM instead of html fragments @type Boolean */
+    useDom : false,
+
+    /**
+     * Returns the markup for the passed Element(s) config
+     * @param {Object} o The Dom object spec (and children)
+     * @return {String}
+     */
+    markup : function(o){
+        return createHtml(o);
+    },
+
+    /**
+     * 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.
+     */
+    applyStyles : function(el, styles){
+        if(styles){
+           el = Ext.fly(el);
+           if(typeof styles == "string"){
+               var re = /\s?([a-z\-]*)\:\s?([^;]*);?/gi;
+               var matches;
+               while ((matches = re.exec(styles)) != null){
+                   el.setStyle(matches[1], matches[2]);
+               }
+           }else if (typeof styles == "object"){
+               for (var style in styles){
+                  el.setStyle(style, styles[style]);
+               }
+           }else if (typeof styles == "function"){
+                Ext.DomHelper.applyStyles(el, styles.call());
+           }
+        }
+    }, 
+    
+    /**
+     * 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
+     */
+    insertHtml : function(where, el, html){
+        where = where.toLowerCase();
+        if(el.insertAdjacentHTML){
+            var tag = el.tagName.toLowerCase();
+            if(tag == "table" || tag == "tbody" || tag == "tr" || tag == 'td'){
+                var rs;
+                if(rs = insertIntoTable(tag, where, el, html)){
+                    return rs;
+                }
+            }
+            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);
+                    frag = range.createContextualFragment(html);
+                    el.insertBefore(frag, el.firstChild);
+                    return el.firstChild;
+                }else{
+                    el.innerHTML = html;
+                    return el.firstChild;
+                }
+            case "beforeend":
+                if(el.lastChild){
+                    range.setStartAfter(el.lastChild);
+                    frag = range.createContextualFragment(html);
+                    el.appendChild(frag);
+                    return el.lastChild;
+                }else{
+                    el.innerHTML = html;
+                    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 {String/HTMLElement/Element} el The context element
+     * @param {Object} o The Dom object spec (and children)
+     * @param {Boolean} returnElement (optional) true to return a Ext.Element
+     * @return {HTMLElement} The new node
+     */
+    insertBefore : function(el, o, returnElement){
+        return this.doInsert(el, o, returnElement, "beforeBegin");
+    },
+    
+    /**
+     * Creates new Dom element(s) and inserts them after el
+     * @param {String/HTMLElement/Element} el The context element
+     * @param {Object} o The Dom object spec (and children)
+     * @param {Boolean} returnElement (optional) true to return a Ext.Element
+     * @return {HTMLElement} The new node
+     */
+    insertAfter : function(el, o, returnElement){
+        return this.doInsert(el, o, returnElement, "afterEnd", "nextSibling");
+    },
+
+    /**
+     * Creates new Dom element(s) and inserts them as the first child of el
+     * @param {String/HTMLElement/Element} el The context element
+     * @param {Object} o The Dom object spec (and children)
+     * @param {Boolean} returnElement (optional) true to return a Ext.Element
+     * @return {HTMLElement} The new node
+     */
+    insertFirst : function(el, o, returnElement){
+        return this.doInsert(el, o, returnElement, "afterBegin");
+    },
+
+    // private
+    doInsert : function(el, o, returnElement, pos, sibling){
+        el = Ext.getDom(el);
+        var newNode;
+        if(this.useDom){
+            newNode = createDom(o, null);
+            el.parentNode.insertBefore(newNode, sibling ? el[sibling] : el);
+        }else{
+            var html = createHtml(o);
+            newNode = this.insertHtml(pos, el, html);
+        }
+        return returnElement ? Ext.get(newNode, true) : newNode;
+    },
+
+    /**
+     * Creates new Dom element(s) and appends them to el
+     * @param {String/HTMLElement/Element} el The context element
+     * @param {Object} o The Dom object spec (and children)
+     * @param {Boolean} returnElement (optional) true to return a Ext.Element
+     * @return {HTMLElement} The new node
+     */
+    append : function(el, o, returnElement){
+        el = Ext.getDom(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 ? Ext.get(newNode, true) : newNode;
+    },
+    
+    /**
+     * Creates new Dom element(s) and overwrites the contents of el with them
+     * @param {String/HTMLElement/Element} el The context element
+     * @param {Object} o The Dom object spec (and children)
+     * @param {Boolean} returnElement (optional) true to return a Ext.Element
+     * @return {HTMLElement} The new node
+     */
+    overwrite : function(el, o, returnElement){
+        el = Ext.getDom(el);
+        el.innerHTML = createHtml(o);
+        return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;
+    },
+    
+    /**
+     * Creates a new Ext.DomHelper.Template from the Dom object spec 
+     * @param {Object} o The Dom object spec (and children)
+     * @return {Ext.DomHelper.Template} The new template
+     */
+    createTemplate : function(o){
+        var html = createHtml(o);
+        return new Ext.Template(html);
+    }
+    };
+}();
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DomQuery.jss.html b/www/extras/yui-ext/docs/output/DomQuery.jss.html new file mode 100644 index 000000000..ae924bbcd --- /dev/null +++ b/www/extras/yui-ext/docs/output/DomQuery.jss.html @@ -0,0 +1,710 @@ +DomQuery.js

DomQuery.js

/*
+ * This is code is also distributed under MIT license for use
+ * with jQuery and prototype JavaScript libraries.
+ */
+// holder
+/***
+ * @class Ext.DomQuery
+ * Provides high performance selector/xpath processing by compiling queries into reusable functions.
+ * New pseudo classes and matchers can be plugged. It works on HTML and XML documents (if a content node is passed in).
+ * @singleton
+ */
+Ext.DomQuery = function(){
+    var cache = {}, simpleCache = {}, valueCache = {};
+    var nonSpace = /\S/;
+    var trimRe = /^\s+|\s+$/g;
+    var tplRe = /\{(\d+)\}/g;
+    var modeRe = /^(\s?[\/>]\s?|\s|$)/;
+    var tagTokenRe = /^(#)?([\w-\*]+)/;
+    
+    function child(p, index){
+        var i = 0;
+        var n = p.firstChild;
+        while(n){
+            if(n.nodeType == 1){
+               if(++i == index){
+                   return n;
+               }
+            }
+            n = n.nextSibling;
+        }
+        return null;
+    };
+    
+    function next(n){
+        while((n = n.nextSibling) && n.nodeType != 1);
+        return n;
+    };
+    
+    function prev(n){
+        while((n = n.previousSibling) && n.nodeType != 1);
+        return n;
+    };
+    
+    function clean(d){
+        var n = d.firstChild, ni = -1;
+ 	    while(n){
+ 	        var nx = n.nextSibling;
+ 	        if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){
+ 	            d.removeChild(n);
+ 	        }else{
+ 	            n.nodeIndex = ++ni;
+ 	        }
+ 	        n = nx;
+ 	    }
+ 	    return this;
+ 	};
+
+    function byClassName(c, a, v, re, cn){
+        if(!v){
+            return c;
+        }
+        var r = [];
+        for(var i = 0, ci; ci = c[i]; i++){
+            cn = ci.className;
+            if(cn && (' '+cn+' ').indexOf(v) != -1){
+                r[r.length] = ci;
+            }
+        }
+        return r;
+    };
+
+    function attrValue(n, attr){
+        if(!n.tagName && typeof n.length != "undefined"){
+            n = n[0];
+        }
+        if(!n){
+            return null;
+        }
+        if(attr == "for"){
+            return n.htmlFor;
+        }
+        if(attr == "class" || attr == "className"){
+            return n.className;
+        }
+        return n.getAttribute(attr) || n[attr];
+          
+    };
+    
+    function getNodes(ns, mode, tagName){
+        var result = [], cs;
+        if(!ns){
+            return result;
+        }
+        mode = mode ? mode.replace(trimRe, "") : "";
+        tagName = tagName || "*";
+        if(typeof ns.getElementsByTagName != "undefined"){
+            ns = [ns];   
+        }
+        if(mode != "/" && mode != ">"){
+            for(var i = 0, ni; ni = ns[i]; i++){
+                cs = ni.getElementsByTagName(tagName);
+                for(var j = 0, ci; ci = cs[j]; j++){
+                    result[result.length] = ci;
+                }
+            }
+        }else{
+            for(var i = 0, ni; ni = ns[i]; i++){
+                var cn = ni.getElementsByTagName(tagName);
+                for(var j = 0, cj; cj = cn[j]; j++){
+                    if(cj.parentNode == ni){
+                        result[result.length] = cj;
+                    }
+                }
+            }
+        }
+        return result;
+    };
+    
+    function concat(a, b){
+        if(b.slice){
+            return a.concat(b);
+        }
+        for(var i = 0, l = b.length; i < l; i++){
+            a[a.length] = b[i];
+        }
+        return a;
+    }
+    
+    function byTag(cs, tagName){
+        if(cs.tagName || cs == document){
+            cs = [cs];
+        }
+        if(!tagName){
+            return cs;
+        }
+        var r = []; tagName = tagName.toLowerCase();
+        for(var i = 0, ci; ci = cs[i]; i++){
+            if(ci.nodeType == 1 && ci.tagName.toLowerCase()==tagName){
+                r[r.length] = ci;
+            }
+        }
+        return r; 
+    };
+    
+    function byId(cs, attr, id){
+        if(cs.tagName || cs == document){
+            cs = [cs];
+        }
+        if(!id){
+            return cs;
+        }
+        var r = [];
+        for(var i = 0,ci; ci = cs[i]; i++){
+            if(ci && ci.id == id){
+                r[r.length] = ci;
+                return r;
+            }
+        }
+        return r; 
+    };
+    
+    function byAttribute(cs, attr, value, op, custom){
+        var r = [], st = custom=="{";
+        var f = Ext.DomQuery.operators[op];
+        for(var i = 0; ci = cs[i]; i++){
+            var a;
+            if(st){
+                a = Ext.DomQuery.getStyle(ci, attr);
+            }
+            else if(attr == "class" || attr == "className"){
+                a = ci.className;
+            }else if(attr == "for"){
+                a = ci.htmlFor;
+            }else if(attr == "href"){
+                a = ci.getAttribute("href", 2);
+            }else{
+                a = ci.getAttribute(attr);
+            }
+            if((f && f(a, value)) || (!f && a)){
+                r[r.length] = ci;
+            }
+        }
+        return r;
+    };
+    
+    function byPseudo(cs, name, value){
+        return Ext.DomQuery.pseudos[name](cs, value);
+    };
+    
+    // This is for IE MSXML which does not support expandos.
+    // IE runs the same speed using setAttribute, however FF slows way down
+    // and Safari completely fails so they need to continue to use expandos.
+    var isIE = window.ActiveXObject ? true : false;
+
+    var key = 30803;
+
+    function nodupIEXml(cs){
+        var d = ++key;
+        cs[0].setAttribute("_nodup", d);
+        var r = [cs[0]];
+        for(var i = 1, len = cs.length; i < len; i++){
+            var c = cs[i];
+            if(!c.getAttribute("_nodup") != d){
+                c.setAttribute("_nodup", d);
+                r[r.length] = c;
+            }
+        }
+        for(var i = 0, len = cs.length; i < len; i++){
+            cs[i].removeAttribute("_nodup");
+        }
+        return r;
+    }
+
+    function nodup(cs){
+        if(!cs){
+            return [];
+        }
+        var len = cs.length, c, i, r = cs, cj;
+        if(!len || typeof cs.nodeType != "undefined" || len == 1){
+            return cs;
+        }
+        if(isIE && typeof cs[0].selectSingleNode != "undefined"){
+            return nodupIEXml(cs);
+        }
+        var d = ++key;
+        cs[0]._nodup = d;
+        for(i = 1; c = cs[i]; i++){
+            if(c._nodup != d){
+                c._nodup = d;
+            }else{
+                r = [];
+                for(var j = 0; j < i; j++){
+                    r[r.length] = cs[j];
+                }
+                for(j = i+1; cj = cs[j]; j++){
+                    if(cj._nodup != d){
+                        cj._nodup = d;
+                        r[r.length] = cj;
+                    }
+                }
+                return r;
+            }
+        }
+        return r;
+    }
+
+    function quickDiffIEXml(c1, c2){
+        var d = ++key;
+        for(var i = 0, len = c1.length; i < len; i++){
+            c1[i].setAttribute("_qdiff", d);
+        }
+        var r = [];
+        for(var i = 0, len = c2.length; i < len; i++){
+            if(c2[i].getAttribute("_qdiff") != d){
+                r[r.length] = c2[i];
+            }
+        }
+        for(var i = 0, len = c1.length; i < len; i++){
+           c1[i].removeAttribute("_qdiff");
+        }
+        return r;
+    }
+
+    function quickDiff(c1, c2){
+        var len1 = c1.length;
+        if(!len1){
+            return c2;
+        }
+        if(isIE && c1[0].selectSingleNode){
+            return quickDiffIEXml(c1, c2);
+        }
+        var d = ++key;
+        for(var i = 0; i < len1; i++){
+            c1[i]._qdiff = d;
+        }
+        var r = [];
+        for(var i = 0, len = c2.length; i < len; i++){
+            if(c2[i]._qdiff != d){
+                r[r.length] = c2[i];
+            }
+        }
+        return r;
+    }
+    
+    function quickId(ns, mode, root, id){
+        if(ns == root){
+           var d = root.ownerDocument || root;
+           return d.getElementById(id);
+        }
+        ns = getNodes(ns, mode, "*");
+        return byId(ns, null, id);
+    }
+    
+    return {
+        getStyle : function(el, name){
+            return Ext.fly(el).getStyle(name);
+        },
+        /**
+         * Compiles a selector/xpath query into a reusable function. The returned function
+         * takes one parameter "root" (optional), which is the context node from where the query should start. 
+         * @param {String} selector The selector/xpath query
+         * @param {String} type (optional) Either "select" (the default) or "simple" for a simple selector match
+         * @return {Function}
+         */
+        compile : function(path, type){
+            // strip leading slashes
+            while(path.substr(0, 1)=="/"){
+                path = path.substr(1);
+            }
+            type = type || "select";
+            
+            var fn = ["var f = function(root){\n var mode; var n = root || document;\n"];
+            var q = path, mode, lq;
+            var tk = Ext.DomQuery.matchers;
+            var tklen = tk.length;
+            var mm;
+            while(q && lq != q){
+                lq = q;
+                var tm = q.match(tagTokenRe);
+                if(type == "select"){
+                    if(tm){
+                        if(tm[1] == "#"){
+                            fn[fn.length] = 'n = quickId(n, mode, root, "'+tm[2]+'");';
+                        }else{
+                            fn[fn.length] = 'n = getNodes(n, mode, "'+tm[2]+'");';
+                        }
+                        q = q.replace(tm[0], "");
+                    }else if(q.substr(0, 1) != '@'){
+                        fn[fn.length] = 'n = getNodes(n, mode, "*");';
+                    }
+                }else{
+                    if(tm){
+                        if(tm[1] == "#"){
+                            fn[fn.length] = 'n = byId(n, null, "'+tm[2]+'");';
+                        }else{
+                            fn[fn.length] = 'n = byTag(n, "'+tm[2]+'");';
+                        }
+                        q = q.replace(tm[0], "");
+                    }
+                }
+                while(!(mm = q.match(modeRe))){
+                    var matched = false;
+                    for(var j = 0; j < tklen; j++){
+                        var t = tk[j];
+                        var m = q.match(t.re);
+                        if(m){
+                            fn[fn.length] = t.select.replace(tplRe, function(x, i){
+                                                    return m[i];
+                                                });
+                            q = q.replace(m[0], "");
+                            matched = true;
+                            break;
+                        }
+                    }
+                    // prevent infinite loop on bad selector
+                    if(!matched){
+                        throw 'Error parsing selector, parsing failed at "' + q + '"';
+                    }
+                }
+                if(mm[1]){
+                    fn[fn.length] = 'mode="'+mm[1]+'";';
+                    q = q.replace(mm[1], "");
+                }
+            }
+            fn[fn.length] = "return nodup(n);\n}";
+            eval(fn.join(""));
+            return f;
+        },
+        
+        /**
+         * Selects a group of elements.
+         * @param {String} selector The selector/xpath query
+         * @param {Node} root (optional) The start of the query (defaults to document).
+         * @return {Array}
+         */
+        select : function(path, root, type){
+            if(!root || root == document){
+                root = document;
+            }
+            if(typeof root == "string"){
+                root = document.getElementById(root);
+            }
+            var paths = path.split(",");
+            var results = [];
+            for(var i = 0, len = paths.length; i < len; i++){
+                var p = paths[i].replace(trimRe, "");
+                if(!cache[p]){
+                    cache[p] = Ext.DomQuery.compile(p);
+                    if(!cache[p]){
+                        throw p + " is not a valid selector";
+                    }
+                }
+                var result = cache[p](root);
+                if(result && result != document){
+                    results = results.concat(result);
+                }
+            }
+            return results;
+        },
+        
+        /**
+         * Selects a single element.
+         * @param {String} selector The selector/xpath query
+         * @param {Node} root (optional) The start of the query (defaults to document).
+         * @return {Element}
+         */
+        selectNode : function(path, root){
+            return Ext.DomQuery.select(path, root)[0];
+        },
+        
+        /**
+         * Selects the value of a node, optionally replacing null with the defaultValue.
+         * @param {String} selector The selector/xpath query
+         * @param {Node} root (optional) The start of the query (defaults to document).
+         * @param {String} defaultValue
+         */
+        selectValue : function(path, root, defaultValue){
+            path = path.replace(trimRe, "");
+            if(!valueCache[path]){
+                valueCache[path] = Ext.DomQuery.compile(path, "select");
+            }
+            var n = valueCache[path](root);
+            n = n[0] ? n[0] : n;
+            var v = (n && n.firstChild ? n.firstChild.nodeValue : null);
+            return (v === null ? defaultValue : v);
+        },
+        
+        /**
+         * Selects the value of a node, parsing integers and floats.
+         * @param {String} selector The selector/xpath query
+         * @param {Node} root (optional) The start of the query (defaults to document).
+         * @param {Number} defaultValue
+         * @return {Number}
+         */
+        selectNumber : function(path, root, defaultValue){
+            var v = Ext.DomQuery.selectValue(path, root, defaultValue || 0);
+            return parseFloat(v);
+        },
+        
+        /**
+         * Returns true if the passed element(s) match the passed simple selector (e.g. div.some-class or span:first-child)
+         * @param {String/HTMLElement/Array} el An element id, element or array of elements
+         * @param {String} selector The simple selector to test
+         * @return {Boolean}
+         */
+        is : function(el, ss){
+            if(typeof el == "string"){
+                el = document.getElementById(el);
+            }
+            var isArray = (el instanceof Array);
+            var result = Ext.DomQuery.filter(isArray ? el : [el], ss);
+            return isArray ? (result.length == el.length) : (result.length > 0);
+        },
+        
+        /**
+         * Filters an array of elements to only include matches of a simple selector (e.g. div.some-class or span:first-child)
+         * @param {Array} el An array of elements to filter
+         * @param {String} selector The simple selector to test
+         * @param {Boolean} nonMatches If true, it returns the elements that DON'T match 
+         * the selector instead of the ones that match
+         * @return {Array}
+         */
+        filter : function(els, ss, nonMatches){
+            ss = ss.replace(trimRe, "");
+            if(!simpleCache[ss]){
+                simpleCache[ss] = Ext.DomQuery.compile(ss, "simple");
+            }
+            var result = simpleCache[ss](els);
+            return nonMatches ? quickDiff(result, els) : result;
+        },
+        
+        /**
+         * Collection of matching regular expressions and code snippets. 
+         */
+        matchers : [{
+                re: /^\.([\w-]+)/,
+                select: 'n = byClassName(n, null, " {1} ");'
+            }, {
+                re: /^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,
+                select: 'n = byPseudo(n, "{1}", "{2}");'
+            },{
+                re: /^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,
+                select: 'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");'
+            }, {
+                re: /^#([\w-]+)/,
+                select: 'n = byId(n, null, "{1}");'
+            },{
+                re: /^@([\w-]+)/,
+                select: 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};'
+            }
+        ],
+        
+        /**
+         * Collection of operator comparison functions. The default operators are =, !=, ^=, $=, *= and %=.
+         * New operators can be added as long as the match the format <i>c</i>= where <i>c<i> is any character other than space, &gt; &lt;.
+         */
+        operators : {
+            "=" : function(a, v){
+                return a == v;
+            },
+            "!=" : function(a, v){
+                return a != v;
+            },
+            "^=" : function(a, v){
+                return a && a.substr(0, v.length) == v;
+            },
+            "$=" : function(a, v){
+                return a && a.substr(a.length-v.length) == v;
+            },
+            "*=" : function(a, v){
+                return a && a.indexOf(v) !== -1;
+            },
+            "%=" : function(a, v){
+                return (a % v) == 0;
+            }
+        },
+        
+        /**
+         * Collection of "pseudo class" processors. Each processor is passed the current nodeset (array)
+         * and the argument (if any) supplied in the selector.
+         */
+        pseudos : {
+            "first-child" : function(c){
+                var r = [], n;
+                for(var i = 0, ci; ci = n = c[i]; i++){
+                    while((n = n.previousSibling) && n.nodeType != 1);
+                    if(!n){
+                        r[r.length] = ci;
+                    }
+                }
+                return r;
+            },
+            
+            "last-child" : function(c){
+                var r = [];
+                for(var i = 0, ci; ci = n = c[i]; i++){
+                    while((n = n.nextSibling) && n.nodeType != 1);
+                    if(!n){
+                        r[r.length] = ci;
+                    }
+                }
+                return r;
+            },
+            
+            "nth-child" : function(c, a){
+                var r = [];
+                if(a != "odd" && a != "even"){
+                    for(var i = 0, ci; ci = c[i]; i++){
+                        var m = child(ci.parentNode, a);
+                        if(m == ci){
+                            r[r.length] = m;
+                        }
+                    }
+                    return r;
+                }
+                var p;
+                // first let's clean up the parent nodes
+                for(var i = 0, l = c.length; i < l; i++){
+                    var cp = c[i].parentNode;
+                    if(cp != p){
+                        clean(cp);
+                        p = cp;
+                    }
+                }
+                // then lets see if we match
+                for(var i = 0, ci; ci = c[i]; i++){
+                    var m = false;
+                    if(a == "odd"){
+                        m = ((ci.nodeIndex+1) % 2 == 1);
+                    }else if(a == "even"){
+                        m = ((ci.nodeIndex+1) % 2 == 0);
+                    }
+                    if(m){
+                        r[r.length] = ci;
+                    }
+                }
+                return r;
+            },
+            
+            "only-child" : function(c){
+                var r = [];
+                for(var i = 0, ci; ci = c[i]; i++){
+                    if(!prev(ci) && !next(ci)){
+                        r[r.length] = ci;
+                    }
+                }
+                return r;
+            },
+            
+            "empty" : function(c){
+                var r = [];
+                for(var i = 0, ci; ci = c[i]; i++){
+                    var cns = ci.childNodes, j = 0, cn, empty = true;
+                    while(cn = cns[j]){
+                        ++j;
+                        if(cn.nodeType == 1 || cn.nodeType == 3){
+                            empty = false;
+                            break;
+                        }
+                    }
+                    if(empty){
+                        r[r.length] = ci;
+                    }
+                }
+                return r;
+            },
+            
+            "contains" : function(c, v){
+                var r = [];
+                for(var i = 0, ci; ci = c[i]; i++){
+                    if(ci.innerHTML.indexOf(v) !== -1){
+                        r[r.length] = ci;
+                    }
+                }
+                return r;
+            },
+
+            "nodeValue" : function(c, v){
+                var r = [];
+                for(var i = 0, ci; ci = c[i]; i++){
+                    if(ci.firstChild && ci.firstChild.nodeValue == v){
+                        r[r.length] = ci;
+                    }
+                }
+                return r;
+            },
+
+            "checked" : function(c){
+                var r = [];
+                for(var i = 0, ci; ci = c[i]; i++){
+                    if(ci.checked == true){
+                        r[r.length] = ci;
+                    }
+                }
+                return r;
+            },
+            
+            "not" : function(c, ss){
+                return Ext.DomQuery.filter(c, ss, true);
+            },
+            
+            "odd" : function(c){
+                return this["nth-child"](c, "odd");
+            },
+            
+            "even" : function(c){
+                return this["nth-child"](c, "even");
+            },
+            
+            "nth" : function(c, a){
+                return c[a-1] || [];
+            },
+            
+            "first" : function(c){
+                return c[0] || [];
+            },
+            
+            "last" : function(c){
+                return c[c.length-1] || [];
+            },
+            
+            "has" : function(c, ss){
+                var s = Ext.DomQuery.select;
+                var r = [];
+                for(var i = 0, ci; ci = c[i]; i++){
+                    if(s(ss, ci).length > 0){
+                        r[r.length] = ci;
+                    }
+                }
+                return r;
+            },
+            
+            "next" : function(c, ss){
+                var is = Ext.DomQuery.is;
+                var r = [];
+                for(var i = 0, ci; ci = c[i]; i++){
+                    var n = next(ci);
+                    if(n && is(n, ss)){
+                        r[r.length] = ci;
+                    }
+                }
+                return r;
+            },
+            
+            "prev" : function(c, ss){
+                var is = Ext.DomQuery.is;
+                var r = [];
+                for(var i = 0, ci; ci = c[i]; i++){
+                    var n = prev(ci);
+                    if(n && is(n, ss)){
+                        r[r.length] = ci;
+                    }
+                }
+                return r;
+            }
+        }
+    };
+}();
+
+/**
+ * Selects an array of DOM nodes by CSS/XPath selector. Shorthand of {@link Ext.DomQuery#select}
+ * @param {String} path The selector/xpath query
+ * @param {Node} root (optional) The start of the query (defaults to document).
+ * @return {Array}
+ * @member Ext
+ * @method query
+ */
+Ext.query = Ext.DomQuery.select;
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DragSource.jss.html b/www/extras/yui-ext/docs/output/DragSource.jss.html new file mode 100644 index 000000000..6a600aaa8 --- /dev/null +++ b/www/extras/yui-ext/docs/output/DragSource.jss.html @@ -0,0 +1,352 @@ +DragSource.js

DragSource.js

/**
+ * @class Ext.dd.DragSource
+ * @extends Ext.dd.DDProxy
+ * A simple class that provides the basic implementation needed to make any element draggable.
+ * @constructor
+ * @param {String/HTMLElement/Element} el The container element
+ * @param {Object} config
+ */
+Ext.dd.DragSource = function(el, config){
+    this.el = Ext.get(el);
+    this.dragData = {};
+    
+    Ext.apply(this, config);
+    
+    if(!this.proxy){
+        this.proxy = new Ext.dd.StatusProxy();
+    }
+    this.el.on("mouseup", this.handleMouseUp);
+    Ext.dd.DragSource.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, 
+          {dragElId : this.proxy.id, resizeFrame: false, isTarget: false, scroll: this.scroll === true});
+    
+    this.dragging = false;
+};
+
+Ext.extend(Ext.dd.DragSource, Ext.dd.DDProxy, {
+    /**
+     * @cfg {String} dropAllowed
+     * The CSS class returned to the drag source when drop is allowed (defaults to "x-dd-drop-ok").
+     */
+    dropAllowed : "x-dd-drop-ok",
+    /**
+     * @cfg {String} dropNotAllowed
+     * The CSS class returned to the drag source when drop is not allowed (defaults to "x-dd-drop-nodrop").
+     */
+    dropNotAllowed : "x-dd-drop-nodrop",
+
+    /**
+     * Returns the data object associated with this drag source
+     * @return {Object} data An object containing arbitrary data
+     */
+    getDragData : function(e){
+        return this.dragData;
+    },
+
+    // private
+    onDragEnter : function(e, id){
+        var target = Ext.dd.DragDropMgr.getDDById(id);
+        this.cachedTarget = target;
+        if(this.beforeDragEnter(target, e, id) !== false){
+            if(target.isNotifyTarget){
+                var status = target.notifyEnter(this, e, this.dragData);
+                this.proxy.setStatus(status);
+            }else{
+                this.proxy.setStatus(this.dropAllowed);
+            }
+            
+            if(this.afterDragEnter){
+                /**
+                 * An empty function by default, but provided so that you can perform a custom action
+                 * when the dragged item enters the drop target by providing an implementation.
+                 * @param {Ext.dd.DragDrop} target The drop target
+                 * @param {Event} e The event object
+                 * @param {String} id The id of the dragged element
+                 * @method afterDragEnter
+                 */
+                this.afterDragEnter(target, e, id);
+            }
+        }
+    },
+
+    /**
+     * An empty function by default, but provided so that you can perform a custom action
+     * before the dragged item enters the drop target and optionally cancel the onDragEnter.
+     * @param {Ext.dd.DragDrop} target The drop target
+     * @param {Event} e The event object
+     * @param {String} id The id of the dragged element
+     * @return {Boolean} isValid True if the drag event is valid, else false to cancel
+     */
+    beforeDragEnter : function(target, e, id){
+        return true;
+    },
+
+    // private
+    alignElWithMouse: function() {
+        Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments);
+        this.proxy.sync();
+    },
+
+    // private
+    onDragOver : function(e, id){
+        var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
+        if(this.beforeDragOver(target, e, id) !== false){
+            if(target.isNotifyTarget){
+                var status = target.notifyOver(this, e, this.dragData);
+                this.proxy.setStatus(status);
+            }
+
+            if(this.afterDragOver){
+                /**
+                 * An empty function by default, but provided so that you can perform a custom action
+                 * while the dragged item is over the drop target by providing an implementation.
+                 * @param {Ext.dd.DragDrop} target The drop target
+                 * @param {Event} e The event object
+                 * @param {String} id The id of the dragged element
+                 * @method afterDragOver
+                 */
+                this.afterDragOver(target, e, id);
+            }
+        }
+    },
+
+    /**
+     * An empty function by default, but provided so that you can perform a custom action
+     * while the dragged item is over the drop target and optionally cancel the onDragOver.
+     * @param {Ext.dd.DragDrop} target The drop target
+     * @param {Event} e The event object
+     * @param {String} id The id of the dragged element
+     * @return {Boolean} isValid True if the drag event is valid, else false to cancel
+     */
+    beforeDragOver : function(target, e, id){
+        return true;
+    },
+
+    // private
+    onDragOut : function(e, id){
+        var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
+        if(this.beforeDragOut(target, e, id) !== false){
+            if(target.isNotifyTarget){
+                target.notifyOut(this, e, this.dragData);
+            }
+            this.proxy.reset();
+            if(this.afterDragOut){
+                /**
+                 * An empty function by default, but provided so that you can perform a custom action
+                 * after the dragged item is dragged out of the target without dropping.
+                 * @param {Ext.dd.DragDrop} target The drop target
+                 * @param {Event} e The event object
+                 * @param {String} id The id of the dragged element
+                 * @method afterDragOut
+                 */
+                this.afterDragOut(target, e, id);
+            }
+        }
+        this.cachedTarget = null;
+    },
+
+    /**
+     * An empty function by default, but provided so that you can perform a custom action before the dragged
+     * item is dragged out of the target without dropping, and optionally cancel the onDragOut.
+     * @param {Ext.dd.DragDrop} target The drop target
+     * @param {Event} e The event object
+     * @param {String} id The id of the dragged element
+     * @return {Boolean} isValid True if the drag event is valid, else false to cancel
+     */
+    beforeDragOut : function(target, e, id){
+        return true;
+    },
+    
+    // private
+    onDragDrop : function(e, id){
+        var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
+        if(this.beforeDragDrop(target, e, id) !== false){
+            if(target.isNotifyTarget){
+                if(target.notifyDrop(this, e, this.dragData)){ // valid drop?
+                    this.onValidDrop(target, e, id);
+                }else{
+                    this.onInvalidDrop(target, e, id);
+                }
+            }else{
+                this.onValidDrop(target, e, id);
+            }
+            
+            if(this.afterDragDrop){
+                /**
+                 * An empty function by default, but provided so that you can perform a custom action
+                 * after a valid drag drop has occurred by providing an implementation.
+                 * @param {Ext.dd.DragDrop} target The drop target
+                 * @param {Event} e The event object
+                 * @param {String} id The id of the dropped element
+                 * @method afterDragDrop
+                 */
+                this.afterDragDrop(target, e, id);
+            }
+        }
+    },
+
+    /**
+     * An empty function by default, but provided so that you can perform a custom action before the dragged
+     * item is dropped onto the target and optionally cancel the onDragDrop.
+     * @param {Ext.dd.DragDrop} target The drop target
+     * @param {Event} e The event object
+     * @param {String} id The id of the dragged element
+     * @return {Boolean} isValid True if the drag drop event is valid, else false to cancel
+     */
+    beforeDragDrop : function(target, e, id){
+        return true;
+    },
+
+    // private
+    onValidDrop : function(target, e, id){
+        this.hideProxy();
+    },
+
+    // private
+    getRepairXY : function(e, data){
+        return this.el.getXY();  
+    },
+
+    // private
+    onInvalidDrop : function(target, e, id){
+        this.beforeInvalidDrop(target, e, id);
+        if(this.cachedTarget){
+            if(this.cachedTarget.isNotifyTarget){
+                this.cachedTarget.notifyOut(this, e, this.dragData);
+            }
+            this.cacheTarget = null;
+        }
+        this.proxy.repair(this.getRepairXY(e, this.dragData), this.afterRepair, this);
+
+        if(this.afterInvalidDrop){
+            /**
+             * An empty function by default, but provided so that you can perform a custom action
+             * after an invalid drop has occurred by providing an implementation.
+             * @param {Event} e The event object
+             * @param {String} id The id of the dropped element
+             * @method afterInvalidDrop
+             */
+            this.afterInvalidDrop(e, id);
+        }
+    },
+
+    // private
+    afterRepair : function(){
+        if(Ext.enableFx){
+            this.el.highlight(this.hlColor || "c3daf9");
+        }
+        this.dragging = false;
+    },
+
+    /**
+     * An empty function by default, but provided so that you can perform a custom action after an invalid
+     * drop has occurred.
+     * @param {Ext.dd.DragDrop} target The drop target
+     * @param {Event} e The event object
+     * @param {String} id The id of the dragged element
+     * @return {Boolean} isValid True if the invalid drop should proceed, else false to cancel
+     */
+    beforeInvalidDrop : function(target, e, id){
+        return true;
+    },
+
+    // private
+    handleMouseDown : function(e){
+        if(this.dragging) {
+            return;
+        }
+        if(Ext.QuickTips){
+            Ext.QuickTips.disable();
+        }
+        var data = this.getDragData(e);
+        if(data && this.onBeforeDrag(data, e) !== false){
+            this.dragData = data;
+            this.proxy.stop();
+            Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments);
+        } 
+    },
+
+    // private
+    handleMouseUp : function(e){
+        if(Ext.QuickTips){
+            Ext.QuickTips.enable();
+        }
+    },
+
+    /**
+     * An empty function by default, but provided so that you can perform a custom action before the initial
+     * drag event begins and optionally cancel it.
+     * @param {Object} data An object containing arbitrary data to be shared with drop targets
+     * @param {Event} e The event object
+     * @return {Boolean} isValid True if the drag event is valid, else false to cancel
+     */
+    onBeforeDrag : function(data, e){
+        return true;
+    },
+
+    /**
+     * An empty function by default, but provided so that you can perform a custom action once the initial
+     * drag event has begun.  The drag cannot be canceled from this function.
+     * @param {Number} x The x position of the click on the dragged object
+     * @param {Number} y The y position of the click on the dragged object
+     */
+    onStartDrag : Ext.emptyFn,
+
+    // private - YUI override
+    startDrag : function(x, y){
+        this.proxy.reset();
+        this.dragging = true;
+        this.proxy.update("");
+        this.onInitDrag(x, y);
+        this.proxy.show();
+    },
+
+    // private
+    onInitDrag : function(x, y){
+        var clone = this.el.dom.cloneNode(true);
+        clone.id = Ext.id(); // prevent duplicate ids
+        this.proxy.update(clone);
+        this.onStartDrag(x, y);
+        return true;
+    },
+
+    /**
+     * Returns the drag source's underlying {@link Ext.dd.StatusProxy}
+     * @return {Ext.dd.StatusProxy} proxy The StatusProxy
+     */
+    getProxy : function(){
+        return this.proxy;  
+    },
+
+    /**
+     * Hides the drag source's {@link Ext.dd.StatusProxy}
+     */
+    hideProxy : function(){
+        this.proxy.hide();  
+        this.proxy.reset(true);
+        this.dragging = false;
+    },
+
+    // private
+    triggerCacheRefresh : function(){
+        Ext.dd.DDM.refreshCache(this.groups);
+    },
+
+    // private - override to prevent hiding
+    b4EndDrag: function(e) {
+    },
+
+    // private - override to prevent moving
+    endDrag : function(e){
+        this.onEndDrag(this.dragData, e);
+    },
+
+    // private
+    onEndDrag : function(data, e){
+    },
+    
+    // private - pin to cursor
+    autoOffset : function(x, y) {
+        this.setDelta(-12, -20);
+    }    
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DragZone.jss.html b/www/extras/yui-ext/docs/output/DragZone.jss.html new file mode 100644 index 000000000..e6d32837a --- /dev/null +++ b/www/extras/yui-ext/docs/output/DragZone.jss.html @@ -0,0 +1,73 @@ +DragZone.js

DragZone.js

/**
+ * @class Ext.dd.DragZone
+ * @extends Ext.dd.DragSource
+ * This class provides a container DD instance that proxies for multiple child node sources.<br />
+ * By default, this class requires that draggable child nodes are registered with {@link Ext.dd.Registry}.
+ * @constructor
+ * @param {String/HTMLElement/Element} el The container element
+ * @param {Object} config
+ */
+Ext.dd.DragZone = function(el, config){
+    Ext.dd.DragZone.superclass.constructor.call(this, el, config);
+    if(this.containerScroll){
+        Ext.dd.ScrollManager.register(this.el);
+    }
+};
+
+Ext.extend(Ext.dd.DragZone, Ext.dd.DragSource, {
+    /**
+     * @cfg {Boolean} containerScroll True to register this container with the Scrollmanager
+     * for auto scrolling during drag operations.
+     */
+// holder
+/***
+     * @cfg {String} hlColor The color to use when visually highlighting the drag source in the afterRepair
+     * method after a failed drop (defaults to "c3daf9" - light blue)
+     */
+// holder
+/***
+     * Called when a mousedown occurs in this container. Looks in {@link Ext.dd.Registry}
+     * for a valid target to drag based on the mouse down. Override this method
+     * to provide your own lookup logic (e.g. finding a child by class name). Make sure your returned
+     * object has a "ddel" attribute (with an HTML Element) for other functions to work.
+     * @param {EventObject} e The mouse down event
+     * @return {Object} The dragData
+     */
+    getDragData : function(e){
+        return Ext.dd.Registry.getHandleFromEvent(e);
+    },
+    
+    /**
+     * Called once drag threshold has been reached to initialize the proxy element. By default, it clones the
+     * this.dragData.ddel
+     * @param {Number} x The x position of the click on the dragged object
+     * @param {Number} y The y position of the click on the dragged object
+     * @return {Boolean} true to continue the drag, false to cancel
+     */
+    onInitDrag : function(x, y){
+        this.proxy.update(this.dragData.ddel.cloneNode(true));
+        this.onStartDrag(x, y);
+        return true;
+    },
+    
+    /**
+     * Called after a repair of an invalid drop. By default, highlights this.dragData.ddel 
+     */
+    afterRepair : function(){
+        if(Ext.enableFx){
+            Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9");
+        }
+        this.dragging = false;
+    },
+
+    /**
+     * Called before a repair of an invalid drop to get the XY to animate to. By default returns
+     * the XY of this.dragData.ddel
+     * @param {EventObject} e The mouse up event
+     * @return {Array} The xy location (e.g. [100, 200])
+     */
+    getRepairXY : function(e){
+        return Ext.Element.fly(this.dragData.ddel).getXY();  
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DropTarget.jss.html b/www/extras/yui-ext/docs/output/DropTarget.jss.html new file mode 100644 index 000000000..00c5c46cc --- /dev/null +++ b/www/extras/yui-ext/docs/output/DropTarget.jss.html @@ -0,0 +1,106 @@ +DropTarget.js

DropTarget.js

/**
+ * @class Ext.dd.DropTarget
+ * @extends Ext.dd.DDTarget
+ * A simple class that provides the basic implementation needed to make any element a drop target that can have
+ * draggable items dropped onto it.  The drop has no effect until an implementation of notifyDrop is provided.
+ * @constructor
+ * @param {String/HTMLElement/Element} el The container element
+ * @param {Object} config
+ */
+Ext.dd.DropTarget = function(el, config){
+    this.el = Ext.get(el);
+    
+    Ext.apply(this, config);
+    
+    if(this.containerScroll){
+        Ext.dd.ScrollManager.register(this.el);
+    }
+    
+    Ext.dd.DropTarget.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, 
+          {isTarget: true});
+
+};
+
+Ext.extend(Ext.dd.DropTarget, Ext.dd.DDTarget, {
+    /**
+     * @cfg {String} overClass
+     * The CSS class applied to the drop target element while the drag source is over it (defaults to "").
+     */
+// holder
+/***
+     * @cfg {String} dropAllowed
+     * The CSS class returned to the drag source when drop is allowed (defaults to "x-dd-drop-ok").
+     */
+    dropAllowed : "x-dd-drop-ok",
+    /**
+     * @cfg {String} dropNotAllowed
+     * The CSS class returned to the drag source when drop is not allowed (defaults to "x-dd-drop-nodrop").
+     */
+    dropNotAllowed : "x-dd-drop-nodrop",
+
+    // private
+    isTarget : true,
+
+    // private
+    isNotifyTarget : true,
+
+    /**
+     * The function a {@link Ext.dd.DragSource} calls once to notify this drop target that the source is now over the
+     * target.  This default implementation adds the CSS class specified by overClass (if any) to the drop element
+     * and returns the dropAllowed config value.  This method should be overridden if drop validation is required.
+     * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop target
+     * @param {Event} e The event
+     * @param {Object} data An object containing arbitrary data supplied by the drag source
+     * @return {String} status The CSS class that communicates the drop status back to the source so that the
+     * underlying {@link Ext.dd.StatusProxy} can be updated
+     */
+    notifyEnter : function(dd, e, data){
+        if(this.overClass){
+            this.el.addClass(this.overClass);
+        }
+        return this.dropAllowed;
+    },
+
+    /**
+     * The function a {@link Ext.dd.DragSource} calls continuously while it is being dragged over the target.
+     * This method will be called on every mouse movement while the drag source is over the drop target.
+     * This default implementation simply returns the dropAllowed config value.
+     * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop target
+     * @param {Event} e The event
+     * @param {Object} data An object containing arbitrary data supplied by the drag source
+     * @return {String} status The CSS class that communicates the drop status back to the source so that the
+     * underlying {@link Ext.dd.StatusProxy} can be updated
+     */
+    notifyOver : function(dd, e, data){
+        return this.dropAllowed;
+    },
+
+    /**
+     * The function a {@link Ext.dd.DragSource} calls once to notify this drop target that the source has been dragged
+     * out of the target without dropping.  This default implementation simply removes the CSS class specified by
+     * overClass (if any) from the drop element.
+     * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop target
+     * @param {Event} e The event
+     * @param {Object} data An object containing arbitrary data supplied by the drag source
+     */
+    notifyOut : function(dd, e, data){
+        if(this.overClass){
+            this.el.removeClass(this.overClass);
+        }
+    },
+
+    /**
+     * The function a {@link Ext.dd.DragSource} calls once to notify this drop target that the dragged item has
+     * been dropped on it.  This method has no default implementation and returns false, so you must provide an
+     * implementation that does something to process the drop event and returns true so that the drag source's
+     * repair action does not run.
+     * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop target
+     * @param {Event} e The event
+     * @param {Object} data An object containing arbitrary data supplied by the drag source
+     * @return {Boolean} True if the drop was valid, else false
+     */
+    notifyDrop : function(dd, e, data){
+        return false;
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DropZone.jss.html b/www/extras/yui-ext/docs/output/DropZone.jss.html new file mode 100644 index 000000000..311cdd1ad --- /dev/null +++ b/www/extras/yui-ext/docs/output/DropZone.jss.html @@ -0,0 +1,201 @@ +DropZone.js

DropZone.js

/**
+ * @class Ext.dd.DropZone
+ * @extends Ext.dd.DropTarget
+ * This class provides a container DD instance that proxies for multiple child node targets.<br />
+ * By default, this class requires that child nodes accepting drop are registered with {@link Ext.dd.Registry}.
+ * @constructor
+ * @param {String/HTMLElement/Element} el The container element
+ * @param {Object} config
+ */
+Ext.dd.DropZone = function(el, config){
+    Ext.dd.DropZone.superclass.constructor.call(this, el, config);
+};
+
+Ext.extend(Ext.dd.DropZone, Ext.dd.DropTarget, {
+    /**
+     * Returns a custom data object associated with the DOM node that is the target of the event.  By default
+     * this looks up the event target in the {@link Ext.dd.Registry}, although you can override this method to
+     * provide your own custom lookup.
+     * @param {Event} e The event
+     * @return {Object} data The custom data
+     */
+    getTargetFromEvent : function(e){
+        return Ext.dd.Registry.getTargetFromEvent(e);
+    },
+
+    /**
+     * Called internally when the DropZone determines that a {@link Ext.dd.DragSource} has entered a drop node
+     * that it has registered.  This method has no default implementation and should be overridden to provide
+     * node-specific processing if necessary.
+     * @param {Object} nodeData The custom data associated with the drop node (this is the same value returned from 
+     * {@link #getTargetFromEvent} for this node)
+     * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone
+     * @param {Event} e The event
+     * @param {Object} data An object containing arbitrary data supplied by the drag source
+     */
+    onNodeEnter : function(n, dd, e, data){
+        
+    },
+
+    /**
+     * Called internally while the DropZone determines that a {@link Ext.dd.DragSource} is over a drop node
+     * that it has registered.  The default implementation returns this.dropNotAllowed, so it should be
+     * overridden to provide the proper feedback.
+     * @param {Object} nodeData The custom data associated with the drop node (this is the same value returned from
+     * {@link #getTargetFromEvent} for this node)
+     * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone
+     * @param {Event} e The event
+     * @param {Object} data An object containing arbitrary data supplied by the drag source
+     * @return {String} status The CSS class that communicates the drop status back to the source so that the
+     * underlying {@link Ext.dd.StatusProxy} can be updated
+     */
+    onNodeOver : function(n, dd, e, data){
+        return this.dropAllowed;
+    },
+
+    /**
+     * Called internally when the DropZone determines that a {@link Ext.dd.DragSource} has been dragged out of
+     * the drop node without dropping.  This method has no default implementation and should be overridden to provide
+     * node-specific processing if necessary.
+     * @param {Object} nodeData The custom data associated with the drop node (this is the same value returned from
+     * {@link #getTargetFromEvent} for this node)
+     * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone
+     * @param {Event} e The event
+     * @param {Object} data An object containing arbitrary data supplied by the drag source
+     */
+    onNodeOut : function(n, dd, e, data){
+        
+    },
+
+    /**
+     * Called internally when the DropZone determines that a {@link Ext.dd.DragSource} has been dropped onto
+     * the drop node.  The default implementation returns false, so it should be overridden to provide the
+     * appropriate processing of the drop event and return true so that the drag source's repair action does not run.
+     * @param {Object} nodeData The custom data associated with the drop node (this is the same value returned from
+     * {@link #getTargetFromEvent} for this node)
+     * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone
+     * @param {Event} e The event
+     * @param {Object} data An object containing arbitrary data supplied by the drag source
+     * @return {Boolean} True if the drop was valid, else false
+     */
+    onNodeDrop : function(n, dd, e, data){
+        return false;
+    },
+
+    /**
+     * Called internally while the DropZone determines that a {@link Ext.dd.DragSource} is being dragged over it,
+     * but not over any of its registered drop nodes.  The default implementation returns this.dropNotAllowed, so
+     * it should be overridden to provide the proper feedback if necessary.
+     * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone
+     * @param {Event} e The event
+     * @param {Object} data An object containing arbitrary data supplied by the drag source
+     * @return {String} status The CSS class that communicates the drop status back to the source so that the
+     * underlying {@link Ext.dd.StatusProxy} can be updated
+     */
+    onContainerOver : function(dd, e, data){
+        return this.dropNotAllowed;
+    },
+
+    /**
+     * Called internally when the DropZone determines that a {@link Ext.dd.DragSource} has been dropped on it,
+     * but not on any of its registered drop nodes.  The default implementation returns false, so it should be
+     * overridden to provide the appropriate processing of the drop event if you need the drop zone itself to
+     * be able to accept drops.  It should return true when valid so that the drag source's repair action does not run.
+     * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone
+     * @param {Event} e The event
+     * @param {Object} data An object containing arbitrary data supplied by the drag source
+     * @return {Boolean} True if the drop was valid, else false
+     */
+    onContainerDrop : function(dd, e, data){
+        return false;
+    },
+
+    /**
+     * The function a {@link Ext.dd.DragSource} calls once to notify this drop zone that the source is now over
+     * the zone.  The default implementation returns this.dropNotAllowed and expects that only registered drop
+     * nodes can process drag drop operations, so if you need the drop zone itself to be able to process drops
+     * you should override this method and provide a custom implementation.
+     * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone
+     * @param {Event} e The event
+     * @param {Object} data An object containing arbitrary data supplied by the drag source
+     * @return {String} status The CSS class that communicates the drop status back to the source so that the
+     * underlying {@link Ext.dd.StatusProxy} can be updated
+     */
+    notifyEnter : function(dd, e, data){
+        return this.dropNotAllowed;
+    },
+
+    /**
+     * The function a {@link Ext.dd.DragSource} calls continuously while it is being dragged over the drop zone.
+     * This method will be called on every mouse movement while the drag source is over the drop zone.
+     * It will call {@link #onNodeOver} while the drag source is over a registered node, and will also automatically
+     * delegate to the appropriate node-specific methods as necessary when the drag source enters and exits
+     * registered nodes ({@link #onNodeEnter}, {@link #onNodeOut}). If the drag source is not currently over a
+     * registered node, it will call {@link #onContainerOver}.
+     * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone
+     * @param {Event} e The event
+     * @param {Object} data An object containing arbitrary data supplied by the drag source
+     * @return {String} status The CSS class that communicates the drop status back to the source so that the
+     * underlying {@link Ext.dd.StatusProxy} can be updated
+     */
+    notifyOver : function(dd, e, data){
+        var n = this.getTargetFromEvent(e);
+        if(!n){ // not over valid drop target
+            if(this.lastOverNode){
+                this.onNodeOut(this.lastOverNode, dd, e, data);
+                this.lastOverNode = null;
+            }
+            return this.onContainerOver(dd, e, data);
+        }
+        if(this.lastOverNode != n){
+            if(this.lastOverNode){
+                this.onNodeOut(this.lastOverNode, dd, e, data);
+            }
+            this.onNodeEnter(n, dd, e, data);
+            this.lastOverNode = n;
+        }
+        return this.onNodeOver(n, dd, e, data);
+    },
+
+    /**
+     * The function a {@link Ext.dd.DragSource} calls once to notify this drop zone that the source has been dragged
+     * out of the zone without dropping.  If the drag source is currently over a registered node, the notification
+     * will be delegated to {@link #onNodeOut} for node-specific handling, otherwise it will be ignored.
+     * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop target
+     * @param {Event} e The event
+     * @param {Object} data An object containing arbitrary data supplied by the drag zone
+     */
+    notifyOut : function(dd, e, data){
+        if(this.lastOverNode){
+            this.onNodeOut(this.lastOverNode, dd, e, data);
+            this.lastOverNode = null;
+        }
+    },
+
+    /**
+     * The function a {@link Ext.dd.DragSource} calls once to notify this drop zone that the dragged item has
+     * been dropped on it.  The drag zone will look up the target node based on the event passed in, and if there
+     * is a node registered for that event, it will delegate to {@link #onNodeDrop} for node-specific handling,
+     * otherwise it will call {@link #onContainerDrop}.
+     * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone
+     * @param {Event} e The event
+     * @param {Object} data An object containing arbitrary data supplied by the drag source
+     * @return {Boolean} True if the drop was valid, else false
+     */
+    notifyDrop : function(dd, e, data){
+        if(this.lastOverNode){
+            this.onNodeOut(this.lastOverNode, dd, e, data);
+            this.lastOverNode = null;
+        }
+        var n = this.getTargetFromEvent(e);
+        return n ?
+            this.onNodeDrop(n, dd, e, data) :
+            this.onContainerDrop(dd, e, data);
+    },
+
+    // private
+    triggerCacheRefresh : function(){
+        Ext.dd.DDM.refreshCache(this.groups);
+    }  
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Editor.jss.html b/www/extras/yui-ext/docs/output/Editor.jss.html new file mode 100644 index 000000000..af3e9b3ef --- /dev/null +++ b/www/extras/yui-ext/docs/output/Editor.jss.html @@ -0,0 +1,271 @@ +Editor.js

Editor.js

/**
+ * @class Ext.Editor
+ * @extends Ext.Component
+ * A base editor field that handles displaying/hiding on demand and has some built-in sizing and event handling logic.
+ * @constructor
+ * Create a new Editor
+ * @param {Object} config The config object
+ */
+Ext.Editor = function(field, config){
+    Ext.Editor.superclass.constructor.call(this, config);
+    this.field = field;
+    this.addEvents({
+        /**
+	     * @event beforestartedit
+	     * Fires when editing is initiated, but before the value changes.  Editing can be canceled by returning
+	     * false from the handler of this event.
+	     * @param {Editor} this
+	     * @param {Ext.Element} boundEl The underlying element bound to this editor
+	     * @param {Mixed} value The field value being set
+	     */
+        "beforestartedit" : true,
+        /**
+	     * @event startedit
+	     * Fires when this editor is displayed
+	     * @param {Ext.Element} boundEl The underlying element bound to this editor
+	     * @param {Mixed} value The starting field value
+	     */
+        "startedit" : true,
+        /**
+	     * @event beforecomplete
+	     * Fires after a change has been made to the field, but before the change is reflected in the underlying
+	     * field.  Saving the change to the field can be canceled by returning false from the handler of this event.
+	     * Note that if the value has not changed and ignoreNoChange = true, the editing will still end but this
+	     * event will not fire since no edit actually occurred.
+	     * @param {Editor} this
+	     * @param {Mixed} value The current field value
+	     * @param {Mixed} startValue The original field value
+	     */
+        "beforecomplete" : true,
+        /**
+	     * @event complete
+	     * Fires after editing is complete and any changed value has been written to the underlying field.
+	     * @param {Editor} this
+	     * @param {Mixed} value The current field value
+	     * @param {Mixed} startValue The original field value
+	     */
+        "complete" : true,
+        /**
+	     * @event specialkey
+	     * Fires when special key is pressed
+	     */
+        "specialkey" : true
+    });
+};
+
+Ext.extend(Ext.Editor, Ext.Component, {
+    /**
+     * @cfg {Boolean/String} autosize
+     * True for the editor to automatically adopt the size of the underlying field, "width" to adopt the width only,
+     * or "height" to adopt the height only (defaults to false)
+     */
+// holder
+/***
+     * @cfg {Boolean} revertInvalid
+     * True to automatically revert the field value and cancel the edit when the user completes an edit and the field
+     * validation fails (defaults to true)
+     */
+// holder
+/***
+     * @cfg {Boolean} ignoreNoChange
+     * True to skip the the edit completion process (no save, no events fired) if the user completes an edit and
+     * the value has not changed (defaults to false).  Applies only to string values - edits for other data types
+     * will never be ignored.
+     */
+// holder
+/***
+     * @cfg {Mixed} value
+     * The data value of the underlying field (defaults to "")
+     */
+    value : "",
+    /**
+     * @cfg {String} alignment
+     * The position to align to (see {@link Ext.Element#alignTo} for more details, defaults to "c-c?").
+     */
+    alignment: "c-c?",
+    /**
+     * @cfg {Boolean/String} shadow "sides" for sides/bottom only, "frame" for 4-way shadow, and "drop"
+     * for bottom-right shadow (defaults to "frame")
+     */
+    shadow : "frame",
+
+    // private
+    updateEl : false,
+
+    // private
+    onRender : function(ct, position){
+        this.el = new Ext.Layer({
+            shadow: this.shadow,
+            cls: "x-editor",
+            parentEl : ct,
+            shim : this.shim,
+            shadowOffset:3,
+            id: this.id
+        });
+        this.el.setStyle("overflow", Ext.isGecko ? "auto" : "hidden");
+        this.field.render(this.el);
+        if(Ext.isGecko){
+            this.field.el.dom.setAttribute('autocomplete', 'off');
+        }
+        this.field.show();
+        this.field.on("blur", this.onBlur, this);
+        this.relayEvents(this.field,  ["specialkey"]);
+        if(this.field.grow){
+            this.field.on("autosize", this.el.sync,  this.el, {delay:1});
+        }
+    },
+
+    // private
+    startEdit : function(el, value){
+        if(this.editing){
+            this.completeEdit();
+        }
+        this.boundEl = Ext.get(el);
+        var v = value !== undefined ? value : this.boundEl.dom.innerHTML;
+        if(!this.rendered){
+            this.render(this.parentEl || document.body);
+        }
+        if(this.fireEvent("beforestartedit", this, this.boundEl, v) === false){
+            return;
+        }
+        this.startValue = v;
+        this.field.setValue(v);
+        if(this.autoSize){
+            var sz = this.boundEl.getSize();
+            switch(this.autoSize){
+                case "width":
+                this.setSize(sz.width,  "");
+                break;
+                case "height":
+                this.setSize("",  sz.height);
+                break;
+                default:
+                this.setSize(sz.width,  sz.height);
+            }
+        }
+        this.el.alignTo(this.boundEl, this.alignment);
+        this.editing = true;
+        if(Ext.QuickTips){
+            Ext.QuickTips.disable();
+        }
+        this.show();
+    },
+
+    /**
+     * Sets the height and width of this editor
+     * @param {Number} width The new width
+     * @param {Number} height The new height
+     */
+    setSize : function(w, h){
+        this.field.setSize(w, h);
+        if(this.el){
+            this.el.sync();
+        }
+    },
+
+    /**
+     * Realigns the editor to the bound field based on the current alignment config value.
+     */
+    realign : function(){
+        this.el.alignTo(this.boundEl, this.alignment);
+    },
+
+    /**
+     * Ends the editing process, persist the changed value to the underlying field and hides the editor.
+     * @param {Boolean} remainVisible Override the default behavior and keep the editor visible after edit (defaults to false)
+     */
+    completeEdit : function(remainVisible){
+        if(!this.editing){
+            return;
+        }
+        var v = this.getValue();
+        if(this.revertInvalid !== false && !this.field.isValid()){
+            v = this.startValue;
+            this.cancelEdit(true);
+        }
+        if(String(v) == String(this.startValue) && this.ignoreNoChange){
+            this.editing = false;
+            this.hide();
+            return;
+        }
+        if(this.fireEvent("beforecomplete", this, v, this.startValue) !== false){
+            this.editing = false;
+            if(this.updateEl && this.boundEl){
+                this.boundEl.update(v);
+            }
+            if(remainVisible !== true){
+                this.hide();
+            }
+            this.fireEvent("complete", this, v, this.startValue);
+        }
+    },
+
+    // private
+    onShow : function(){
+        this.el.show();
+        if(this.hideEl !== false){
+            this.boundEl.hide();
+        }
+        this.field.show();
+        this.field.focus();
+        this.fireEvent("startedit", this.boundEl, this.startValue);
+    },
+
+    /**
+     * Cancels the editing process and hides the editor without persisting any changes.  The field value will be
+     * reverted to the original starting value.
+     * @param {Boolean} remainVisible Override the default behavior and keep the editor visible after
+     * cancel (defaults to false)
+     */
+    cancelEdit : function(remainVisible){
+        if(this.editing){
+            this.setValue(this.startValue);
+            if(remainVisible !== true){
+                this.hide();
+            }
+        }
+    },
+
+    // private
+    onBlur : function(){
+        if(this.allowBlur !== true && this.editing){
+            this.completeEdit();
+        }
+    },
+
+    // private
+    onHide : function(){
+        if(this.editing){
+            this.completeEdit();
+            return;
+        }
+        this.field.blur();
+        if(this.field.collapse){
+            this.field.collapse();
+        }
+        this.el.hide();
+        if(this.hideEl !== false){
+            this.boundEl.show();
+        }
+        if(Ext.QuickTips){
+            Ext.QuickTips.enable();
+        }
+    },
+
+    /**
+     * Sets the data value of the editor
+     * @param {Mixed} value Any valid value supported by the underlying field
+     */
+    setValue : function(v){
+        this.field.setValue(v);
+    },
+
+    /**
+     * Gets the data value of the editor
+     * @return {Mixed} value The data value
+     */
+    getValue : function(){
+        return this.field.getValue();
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/EditorGrid.jss.html b/www/extras/yui-ext/docs/output/EditorGrid.jss.html new file mode 100644 index 000000000..0b02c77af --- /dev/null +++ b/www/extras/yui-ext/docs/output/EditorGrid.jss.html @@ -0,0 +1,156 @@ +EditorGrid.js

EditorGrid.js

/**
+ * @class Ext.grid.EditorGrid
+ * @extends Ext.grid.Grid
+ * Class for creating and editable grid.
+ * @param {String/HTMLElement/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} dataSource The data model to bind to
+ * @param {Object} colModel The column model with info about this grid's columns
+ */
+Ext.grid.EditorGrid = function(container, config){
+    Ext.grid.EditorGrid.superclass.constructor.call(this, container, config);
+    this.container.addClass("xedit-grid");
+
+    if(!this.selModel){
+        this.selModel = new Ext.grid.CellSelectionModel();
+    }
+
+    this.activeEditor = null;
+
+	this.addEvents({
+	    /**
+	     * @event beforeedit
+	     * Fires before cell editing is triggered. The edit event object has the following properties <br />
+	     * <ul style="padding:5px;padding-left:16px;">
+	     * <li>grid - This grid</li>
+	     * <li>record - The record being edited</li>
+	     * <li>field - The field name being edited</li>
+	     * <li>value - The value for the field being edited.</li>
+	     * <li>row - The grid row index</li>
+	     * <li>column - The grid column index</li>
+	     * <li>cancel - Set this to true to cancel the edit or return false from your handler.</li>
+	     * </ul>
+	     * @param {Object} e An edit event (see above for description)
+	     */
+	    "beforeedit" : true,
+	    /**
+	     * @event afteredit
+	     * Fires after a cell is edited. <br />
+	     * <ul style="padding:5px;padding-left:16px;">
+	     * <li>grid - This grid</li>
+	     * <li>record - The record being edited</li>
+	     * <li>field - The field name being edited</li>
+	     * <li>value - The value being set</li>
+	     * <li>originalValue - The original value for the field, before the edit.</li>
+	     * <li>row - The grid row index</li>
+	     * <li>column - The grid column index</li>
+	     * </ul>
+	     * @param {Object} e An edit event (see above for description)
+	     */
+	    "afteredit" : true,
+	    /**
+	     * @event validateedit
+	     * Fires after a cell is edited, but before the value is set in the record. Return false
+	     * to cancel the change. The edit event object has the following properties <br />
+	     * <ul style="padding:5px;padding-left:16px;">
+	     * <li>grid - This grid</li>
+	     * <li>record - The record being edited</li>
+	     * <li>field - The field name being edited</li>
+	     * <li>value - The value being set</li>
+	     * <li>originalValue - The original value for the field, before the edit.</li>
+	     * <li>row - The grid row index</li>
+	     * <li>column - The grid column index</li>
+	     * <li>cancel - Set this to true to cancel the edit or return false from your handler.</li>
+	     * </ul>
+	     * @param {Object} e An edit event (see above for description)
+	     */
+	    "validateedit" : true
+	});
+    this.on("bodyscroll", this.stopEditing,  this);
+    this.on(this.clicksToEdit == 1 ? "cellclick" : "celldblclick", this.onCellDblClick,  this);
+};
+
+Ext.extend(Ext.grid.EditorGrid, Ext.grid.Grid, {
+    isEditor : true,
+    clicksToEdit: 2,
+    trackMouseOver: false, // causes very odd FF errors
+
+    onCellDblClick : function(g, row, col){
+        this.startEditing(row, col);
+    },
+
+    onEditComplete : function(ed, value, startValue){
+        this.editing = false;
+        this.activeEditor = null;
+        ed.un("specialkey", this.selModel.onEditorKey, this.selModel);
+        if(String(value) != String(startValue)){
+            var r = ed.record;
+            var field = this.colModel.getDataIndex(ed.col);
+            var e = {
+                grid: this,
+                record: r,
+                field: field,
+                originalValue: startValue,
+                value: value,
+                row: ed.row,
+                column: ed.col,
+                cancel:false
+            };
+            if(this.fireEvent("validateedit", e) !== false && !e.cancel){
+                r.set(field, e.value);
+                delete e.cancel;
+                this.fireEvent("afteredit", e);
+            }
+        }
+        this.view.focusCell(ed.row, ed.col);
+    },
+
+    /**
+     * Starts editing the specified for the specified row/column
+     * @param {Number} rowIndex
+     * @param {Number} colIndex
+     */
+    startEditing : function(row, col){
+        this.stopEditing();
+        if(this.colModel.isCellEditable(col, row)){
+            this.view.focusCell(row, col);
+            var r = this.dataSource.getAt(row);
+            var field = this.colModel.getDataIndex(col);
+            var e = {
+                grid: this,
+                record: r,
+                field: field,
+                value: r.data[field],
+                row: row,
+                column: col,
+                cancel:false
+            };
+            if(this.fireEvent("beforeedit", e) !== false && !e.cancel){
+                this.editing = true; // flag for buffering of orphan key strokes
+                (function(){ // complex but required for focus issues in safari, ie and opera
+                    var ed = this.colModel.getCellEditor(col, row);
+                    ed.row = row;
+                    ed.col = col;
+                    ed.record = r;
+                    ed.on("complete", this.onEditComplete, this, {single: true});
+                    ed.on("specialkey", this.selModel.onEditorKey, this.selModel);
+                    this.activeEditor = ed;
+                    var v = r.data[field];
+                    ed.startEdit(this.view.getCell(row, col), v);
+                }).defer(50, this);
+            }
+        }
+    },
+        
+    /**
+     * Stops any active editing
+     */
+    stopEditing : function(){
+        if(this.activeEditor){
+            this.activeEditor.completeEdit();
+        }
+        this.activeEditor = null;
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Element.jss.html b/www/extras/yui-ext/docs/output/Element.jss.html new file mode 100644 index 000000000..1e84eb80e --- /dev/null +++ b/www/extras/yui-ext/docs/output/Element.jss.html @@ -0,0 +1,2800 @@ +Element.js

Element.js

/**
+ * @class Ext.Element
+ * Represents an Element in the DOM.<br><br>
+ * Usage:<br>
+<pre><code>
+var el = Ext.get("my-div");
+
+// or with getEl
+var el = getEl("my-div");
+
+// or with a DOM element
+var el = Ext.get(myDivElement);
+</code></pre>
+ * Using Ext.get() or getEl() instead of calling the constructor directly ensures you get the same object 
+ * each call instead of constructing a new one.<br><br>
+ * <b>Animations</b><br />
+ * Many of the functions for manipulating an element have an optional "animate" parameter. The animate parameter
+ * should either be a boolean (true) or an object literal with animation options. The animation options are:
+<pre>
+Option    Default   Description
+--------- --------  ---------------------------------------------
+duration  .35       The duration of the animation in seconds
+easing    easeOut   The YUI easing method
+callback  none      A function to execute when the anim completes
+scope     this      The scope (this) of the callback function
+</pre>
+* Also, the Anim object being used for the animation will be set on your options object as "anim", which allows you to stop or 
+* manipulate the animation. Here's an example:
+<pre><code>
+var el = Ext.get("my-div");
+
+// no animation
+el.setWidth(100);
+
+// default animation
+el.setWidth(100, true);
+
+// animation with some options set
+el.setWidth(100, {
+    duration: 1, 
+    callback: this.foo, 
+    scope: this
+});
+
+// using the "anim" property to get the Anim object
+var opt = {
+    duration: 1, 
+    callback: this.foo, 
+    scope: this
+};
+el.setWidth(100, opt);
+...
+if(opt.anim.isAnimated()){
+    opt.anim.stop();
+}
+</code></pre>
+* <b> Composite (Collections of) Elements</b><br />
+ * For working with collections of Elements, see <a href="Ext.CompositeElement.html">Ext.CompositeElement</a>
+ * @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).
+ */
+(function(){
+var D = Ext.lib.Dom;
+var E = Ext.lib.Event;
+var A = Ext.lib.Anim;
+    
+// local style camelizing for speed
+var propCache = {};
+var camelRe = /(-[a-z])/gi;
+var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); };
+var view = document.defaultView;
+
+Ext.Element = function(element, forceNew){
+    var dom = typeof element == "string" ?
+            document.getElementById(element) : element;
+    if(!dom){ // invalid id/element
+        return null;
+    }
+    if(!forceNew && Ext.Element.cache[dom.id]){ // element object already exists
+        return Ext.Element.cache[dom.id];
+    }
+    /**
+     * The DOM element
+     * @type HTMLElement
+     */
+    this.dom = dom;
+    
+    /**
+     * The DOM element ID
+     * @type String
+     */
+    this.id = dom.id || Ext.id(dom);
+};
+
+var El = Ext.Element;
+
+El.prototype = {
+    /**
+     * The element's default display mode @type String
+     */
+    originalDisplay : "",
+    
+    visibilityMode : 1,
+    /**
+     * The default unit to append to CSS values where a unit isn't provided (Defaults to px).
+     * @type String
+     */
+    defaultUnit : "px",
+    /**
+     * 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 {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 {Ext.Element} this
+     */
+    enableDisplayMode : function(display){
+        this.setVisibilityMode(El.DISPLAY);
+        if(typeof display != "undefined") this.originalDisplay = display;
+        return this;
+    },
+    
+    /**
+     * Looks at this node and then at parent nodes for a match of the passed simple selector (e.g. div.some-class or span:first-child)
+     * @param {String} ss The simple selector to test
+     * @param {Number/String/HTMLElement/Element} maxDepth (optional) The max depth to
+            search as a number or element (defaults to 10 || document.body)
+     * @param {Boolean} returnEl (optional) True to return a Ext.Element object instead of DOM node
+     * @return {HTMLElement}
+     */
+    findParent : function(simpleSelector, maxDepth, returnEl){
+        var p = this.dom, b = document.body, depth = 0, dq = Ext.DomQuery, stopEl;
+        maxDepth = maxDepth || 50;
+        if(typeof maxDepth != "number"){
+            stopEl = Ext.getDom(maxDepth);
+            maxDepth = 10;
+        }
+        while(p && p.nodeType == 1 && depth < maxDepth && p != b && p != stopEl){
+            if(dq.is(p, simpleSelector)){
+                return returnEl ? Ext.get(p) : p;
+            }
+            depth++;
+            p = p.parentNode;
+        }
+        return null;
+    },
+
+
+    /**
+     * Looks at parent nodes for a match of the passed simple selector (e.g. div.some-class or span:first-child)
+     * @param {String} ss The simple selector to test
+     * @param {Number/String/HTMLElement/Element} maxDepth (optional) The max depth to
+            search as a number or element (defaults to 10 || document.body)
+     * @param {Boolean} returnEl (optional) True to return a Ext.Element object instead of DOM node
+     * @return {HTMLElement}
+     */
+    findParentNode : function(simpleSelector, maxDepth, returnEl){
+        var p = Ext.fly(this.dom.parentNode, '_internal');
+        return p ? p.findParent(simpleSelector, maxDepth, returnEl) : null;
+    },
+
+    /**
+     * Walks up the dom looking for a parent node that matches the passed simple selector (e.g. div.some-class or span:first-child).
+     * This is a shortcut for findParentNode() that always returns an Ext.Element.
+     * @param {String} ss The simple selector to test
+     * @param {Number/String/HTMLElement/Element} maxDepth (optional) The max depth to
+            search as a number or element (defaults to 10 || document.body)
+     * @return {Ext.Element}
+     */
+    up : function(simpleSelector, maxDepth){
+        return this.findParentNode(simpleSelector, maxDepth, true);
+    },
+
+
+
+    /**
+     * Returns true if this element matches the passed simple selector (e.g. div.some-class or span:first-child)
+     * @param {String} ss The simple selector to test
+     * @return {Boolean}
+     */
+    is : function(simpleSelector){
+        return Ext.DomQuery.is(this.dom, simpleSelector);    
+    },
+    
+    /**
+     * Perform  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 {String} easing (optional) Easing method to use. (Defaults to 'easeOut')
+     * @param {String} animType (optional) 'run' is the default. Can be 'color', 'motion', or 'scroll'
+     * @return {Ext.Element} this
+     */
+    animate : function(args, duration, onComplete, easing, animType){
+        this.anim(args, {duration: duration, callback: onComplete, easing: easing}, animType);
+        return this;
+    },
+    
+    /*
+     * @private Internal animation call
+     */
+    anim : function(args, opt, animType, defaultDur, defaultEase, cb){
+        animType = animType || 'run';
+        opt = opt || {};
+        var anim = Ext.lib.Anim[animType](
+            this.dom, args,
+            (opt.duration || defaultDur) || .35,
+            (opt.easing || defaultEase) || 'easeOut',
+            function(){
+                Ext.callback(cb, this);
+                Ext.callback(opt.callback, opt.scope || this, [this, opt]);
+            },
+            this
+        );
+        opt.anim = anim;
+        return anim;
+    },
+    
+    // private legacy anim prep
+    preanim : function(a, i){
+        return !a[i] ? false : (typeof a[i] == "object" ? a[i]: {duration: a[i+1], callback: a[i+2], easing: a[i+3]});
+    },
+    
+    /**
+     * Removes worthless text nodes
+     * @param {Boolean} forceReclean (optional) By default the element
+     * keeps track if it has been cleaned already so
+     * you can call this over and over. However, if you update the element and 
+     * need to force a reclean, you can pass true.
+     */
+    clean : function(forceReclean){
+        if(this.isCleaned && forceReclean !== true){
+            return this;
+        }
+        var ns = /\S/;
+        var d = this.dom, n = d.firstChild, ni = -1;
+ 	    while(n){
+ 	        var nx = n.nextSibling;
+ 	        if(n.nodeType == 3 && !ns.test(n.nodeValue)){
+ 	            d.removeChild(n);
+ 	        }else{
+ 	            n.nodeIndex = ++ni;
+ 	        }
+ 	        n = nx;
+ 	    }
+ 	    this.isCleaned = true;
+ 	    return this;
+ 	},    
+
+    calcOffsetsTo : function(el){
+        el = Ext.get(el), d = el.dom;
+        var restorePos = false;
+        if(el.getStyle('position') == 'static'){
+            el.position('relative');
+            restorePos = true;
+        }
+        var x = 0, y =0;
+        var op = this.dom;
+        while(op && op != d && op.tagName != 'HTML'){
+            x+= op.offsetLeft;
+            y+= op.offsetTop;
+            op = op.offsetParent;
+        }
+        if(restorePos){
+            el.position('static');
+        }
+        return [x, y];
+    },
+
+    /**
+     * Scrolls this element into view within the passed container.
+     * @param {String/HTMLElement/Element} container (optional) The container element to scroll (defaults to document.body)
+     * @param {Boolean} hscroll (optional) false to disable horizontal scroll
+     * @return {Ext.Element} this
+     */
+    scrollIntoView : function(container, hscroll){
+        var c = Ext.getDom(container) || document.body;
+        var el = this.dom;
+
+        var o = this.calcOffsetsTo(c),
+            l = o[0],
+            t = o[1],
+            b = t+el.offsetHeight,
+            r = l+el.offsetWidth;
+        
+        var ch = c.clientHeight;
+        var ct = parseInt(c.scrollTop, 10);
+        var cl = parseInt(c.scrollLeft, 10);
+        var cb = ct + ch;
+        var cr = cl + c.clientWidth;
+
+        if(t < ct){
+        	c.scrollTop = t;
+        }else if(b > cb){
+            c.scrollTop = b-ch;
+        }
+
+        if(hscroll !== false){
+            if(l < cl){
+                c.scrollLeft = l;
+            }else if(r > cr){
+                c.scrollLeft = r-c.clientWidth;
+            }
+        }
+        return this;
+    },
+
+    scrollChildIntoView : function(child){
+        Ext.fly(child, '_scrollChildIntoView').scrollIntoView(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 {String} easing (optional) Easing method to use.
+     * @return {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;
+    },
+    
+    /**
+     * Returns true if this element is an ancestor of the passed element
+     * @param {HTMLElement/String} el
+     * @return {Boolean}
+     */
+    contains : function(el){
+        if(!el){return false;}
+        return D.isAncestor(this.dom, el.dom ? el.dom : el);
+    },
+    
+    /**
+     * 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 = !(this.getStyle("visibility") == "hidden" || this.getStyle("display") == "none");
+        if(deep !== true || !vis){
+            return vis;
+        }
+        var p = this.dom.parentNode;
+        while(p && p.tagName.toLowerCase() != "body"){
+            if(!Ext.fly(p, '_isVisible').isVisible()){
+                return false;
+            }
+            p = p.parentNode;
+        }
+        return true;
+    },
+    
+    /**
+     * Creates a CompositeElement for 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 Ext.Element for each child (defaults to a shared flyweight object)
+     * @return {CompositeElement/CompositeElementLite} The composite element
+     */
+    select : function(selector, unique){
+        return El.select("#" + Ext.id(this.dom) + " " + selector, unique);
+    },
+    
+    /**
+     * Selects child nodes based on the passed CSS selector (the selector should not contain an id)
+     * @param {String} selector The CSS selector
+     * @return {Array} An array of the matched nodes
+     */
+    query : function(selector, unique){
+        return Ext.DomQuery.select("#" + Ext.id(this.dom) + " " + selector);
+    },
+    
+    /**
+     * Selects a single child based on the passed CSS selector (the selector should not contain an id)
+     * @param {String} selector The CSS selector
+     * @param {Boolean} returnDom true to return the DOM node instead of Ext.Element
+     * @return {Element} The element
+     */
+    child : function(selector, returnDom){
+        var n = Ext.DomQuery.selectNode("#" + Ext.id(this.dom) + " " + selector);
+        return returnDom ? n : Ext.get(n);
+    },
+
+    /**
+     * Selects a single *direct* child based on the passed CSS selector (the selector should not contain an id)
+     * @param {String} selector The CSS selector
+     * @param {Boolean} returnDom true to return the DOM node instead of Ext.Element
+     * @return {Element} The element
+     */
+    down : function(selector, returnDom){
+        var n = Ext.DomQuery.selectNode("#" + Ext.id(this.dom) + " > " + selector);
+        return returnDom ? n : Ext.get(n);
+    },
+
+    /**
+     * Initializes a Ext.dd.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 {Ext.dd.DD} The DD object
+     */
+    initDD : function(group, config, overrides){
+        var dd = new Ext.dd.DD(Ext.id(this.dom), group, config);
+        return Ext.apply(dd, overrides);
+    },
+   
+    /**
+     * Initializes a Ext.dd.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 {Ext.dd.DDProxy} The DDProxy object
+     */
+    initDDProxy : function(group, config, overrides){
+        var dd = new Ext.dd.DDProxy(Ext.id(this.dom), group, config);
+        return Ext.apply(dd, overrides);
+    },
+   
+    /**
+     * Initializes a Ext.dd.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 {Ext.dd.DDTarget} The DDTarget object
+     */
+    initDDTarget : function(group, config, overrides){
+        var dd = new Ext.dd.DDTarget(Ext.id(this.dom), group, config);
+        return Ext.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/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Ext.Element} this
+     */
+     setVisible : function(visible, animate){
+        if(!animate || !A){
+            if(this.visibilityMode == El.DISPLAY){
+                this.setDisplayed(visible);
+            }else{
+                this.fixDisplay();
+                this.dom.style.visibility = visible ? "visible" : "hidden";
+            }
+        }else{
+            // closure for composites
+            var dom = this.dom;
+            var visMode = this.visibilityMode;
+            if(visible){
+                this.setOpacity(.01);
+                this.setVisible(true);
+            }
+            this.anim({opacity: { to: (visible?1:0) }},
+                  this.preanim(arguments, 1),
+                  null, .35, 'easeIn', function(){
+                     if(!visible){
+                         if(visMode == El.DISPLAY){
+                             dom.style.display = "none";
+                         }else{
+                             dom.style.visibility = "hidden";
+                         }
+                         Ext.get(dom).setOpacity(1);
+                     }
+                 });
+        }
+        return this;
+    },
+
+    /**
+     * Returns true if display is not "none"
+     * @return {Boolean}
+     */
+    isDisplayed : function() {
+        return this.getStyle("display") != "none";
+    },
+    
+    /**
+     * Toggles the elements visibility or display, depending on visibility mode.
+     * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Ext.Element} this
+     */
+    toggle : function(animate){
+        this.setVisible(!this.isVisible(), this.preanim(arguments, 0));
+        return this;
+    },
+    
+    /**
+     * Sets the css display. Uses originalDisplay if value is a boolean true.
+     * @param {Boolean} value Boolean to display the element using its default display or a string to set the display directly
+     * @return {Ext.Element} this
+     */
+    setDisplayed : function(value) {
+        if(typeof value == "boolean"){
+           value = value ? this.originalDisplay : "none";
+        }
+        this.setStyle("display", value);
+        return this;
+    },
+    
+    /**
+     * Tries to focus the element. Any exceptions are caught.
+     * @return {Ext.Element} this
+     */
+    focus : function() {
+        try{
+            this.dom.focus();
+        }catch(e){}
+        return this;
+    },
+    
+    /**
+     * Tries to blur the element. Any exceptions are caught.
+     * @return {Ext.Element} this
+     */
+    blur : function() {
+        try{
+            this.dom.blur();
+        }catch(e){}
+        return this;
+    },
+    
+    /**
+     * Add a CSS class to the element.
+     * @param {String/Array} className The CSS class to add or an array of classes
+     * @return {Ext.Element} this
+     */
+    addClass : function(className){
+        if(className instanceof Array){
+            for(var i = 0, len = className.length; i < len; i++) {
+            	this.addClass(className[i]);
+            }
+        }else{
+            if(className && !this.hasClass(className)){
+                this.dom.className = this.dom.className + " " + 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 {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){
+        	    Ext.get(s).removeClass(className);
+        	}
+        }
+        this.addClass(className);
+        return this;
+    },
+    
+    /**
+     * Removes a CSS class from the element.
+     * @param {String/Array} className The CSS class to remove or an array of classes
+     * @return {Ext.Element} this
+     */
+    removeClass : function(className){
+        if(!className || !this.dom.className){
+            return this;
+        }
+        if(className instanceof Array){
+            for(var i = 0, len = className.length; i < len; i++) {
+            	this.removeClass(className[i]);
+            }
+        }else{
+            if(this.hasClass(className)){
+                var re = this.classReCache[className];
+                if (!re) {
+                   re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)', "g");
+                   this.classReCache[className] = re;
+                }
+                this.dom.className =
+                    this.dom.className.replace(re, " ");
+            }
+        }
+        return this;
+    },
+    
+    classReCache: {},
+
+    /**
+     * Toggles (adds or removes) the passed class.
+     * @param {String} className
+     * @return {Ext.Element} this
+     */
+    toggleClass : function(className){
+        if(this.hasClass(className)){
+            this.removeClass(className);
+        }else{
+            this.addClass(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 className && (' '+this.dom.className+' ').indexOf(' '+className+' ') != -1;
+    },
+    
+    /**
+     * 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 {Ext.Element} this
+     */
+    replaceClass : function(oldClassName, newClassName){
+        this.removeClass(oldClassName);
+        this.addClass(newClassName);
+        return this;
+    },
+
+    /**
+     * Get an object with properties matching the styles requested.
+     * e.g. el.getStyles('color', 'font-size', 'width') might return
+     * {'color': '#FFFFFF', 'font-size': '13px', 'width': '100px'}.
+     * @param {String} style1
+     * @param {String} style2
+     * @param {String} etc
+     * @return Object
+     */
+    getStyles : function(){
+        var a = arguments, len = a.length, r = {};
+        for(var i = 0; i < len; i++){
+            r[a[i]] = this.getStyle(a[i]);
+        }
+        return r;
+    },
+
+    /**
+       * Normalizes currentStyle and computedStyle. This is not YUI getStyle, it is an optimised version.
+       * @param {String} property The style property whose value is returned.
+       * @return {String} The current value of the style property for this element.
+       */
+    getStyle : function(){
+        return view && view.getComputedStyle ?
+            function(prop){
+                var el = this.dom, v, cs, camel;
+                if(prop == 'float'){
+                    prop = "cssFloat";
+                }
+                if(v = el.style[prop]){
+                    return v;
+                }
+                if(cs = view.getComputedStyle(el, "")){
+                    if(!(camel = propCache[prop])){
+                        camel = propCache[prop] = prop.replace(camelRe, camelFn);
+                    }
+                    return cs[camel];
+                }
+                return null;
+            } : 
+            function(prop){
+                var el = this.dom, v, cs, camel;
+                if(prop == 'opacity'){
+                    if(typeof el.filter == 'string'){
+                        var fv = parseFloat(el.filter.match(/alpha\(opacity=(.*)\)/i)[1]);
+                        if(!isNaN(fv)){
+                            return fv ? fv / 100 : 0;
+                        }
+                    }
+                    return 1;
+                }else if(prop == 'float'){
+                    prop = "styleFloat";
+                }
+                if(!(camel = propCache[prop])){
+                    camel = propCache[prop] = prop.replace(camelRe, camelFn);
+                }
+                if(v = el.style[camel]){
+                    return v;
+                }
+                if(cs = el.currentStyle){
+                    return cs[camel];
+                }
+                return null;
+            };
+    }(),
+    
+    /**
+       * 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 {Ext.Element} this
+     */
+    setStyle : function(prop, value){
+        if(typeof prop == "string"){
+            var camel;
+            if(!(camel = propCache[prop])){
+                camel = propCache[prop] = prop.replace(camelRe, camelFn);
+            }
+            if(camel == 'opacity') {
+                this.setOpacity(value);
+            }else{
+                this.dom.style[camel] = value;
+            }
+        }else{
+            for(var style in prop){
+                if(typeof prop[style] != "function"){
+                   this.setStyle(style, prop[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 {Ext.Element} this
+     */
+    applyStyles : function(style){
+        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 D.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 D.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 D.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/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Ext.Element} this
+     */
+    setX : function(x, animate){
+        if(!animate || !A){
+            D.setX(this.dom, x);
+        }else{
+            this.setXY([x, this.getY()], this.preanim(arguments, 1));
+        }
+        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/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Ext.Element} this
+      */
+    setY : function(y, animate){
+        if(!animate || !A){
+            D.setY(this.dom, y);
+        }else{
+            this.setXY([this.getX(), y], this.preanim(arguments, 1));
+        }
+        return this;
+    },
+    
+    /**
+     * Set the element's left position directly using CSS style (instead of setX())
+     * @param {String} left The left CSS property value
+     * @return {Ext.Element} this
+     */
+    setLeft : function(left){
+        this.setStyle("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 {Ext.Element} this
+     */
+    setTop : function(top){
+        this.setStyle("top", this.addUnits(top));
+        return this;
+    },
+    
+    /**
+     * Set the element's css right style
+     * @param {String} right The right CSS property value
+     * @return {Ext.Element} this
+     */
+    setRight : function(right){
+        this.setStyle("right", this.addUnits(right));
+        return this;
+    },
+    
+    /**
+     * Set the element's css bottom style
+     * @param {String} bottom The bottom CSS property value
+     * @return {Ext.Element} this
+     */
+    setBottom : function(bottom){
+        this.setStyle("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/Object} animate (optional) true for the default animation or a standard Element animation config object
+      * @return {Ext.Element} this
+       */
+    setXY : function(pos, animate){
+        if(!animate || !A){
+            D.setXY(this.dom, pos);
+        }else{
+            this.anim({points: {to: pos}}, this.preanim(arguments, 1), '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/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Ext.Element} this
+     */
+    setLocation : function(x, y, animate){
+        this.setXY([x, y], this.preanim(arguments, 2));
+        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/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Ext.Element} this
+     */
+    moveTo : function(x, y, animate){
+        this.setXY([x, y], this.preanim(arguments, 2));
+        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 Ext.lib.Region containing "top, left, bottom, right" member data.
+       */
+    getRegion : function(){
+        return D.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 || 0;
+        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 || 0;
+        return contentWidth !== true ? w : w-this.getBorderWidth("lr")-this.getPadding("lr");
+    },
+
+    /**
+     * Returns either the offsetHeight or the height of this element based on CSS height adjusted by padding or borders
+     * when needed to simulate offsetHeight when offsets aren't available. This may not work on display:none elements
+     * if a height has not been set using CSS.
+     * @return {Number}
+     */
+    getComputedHeight : function(){
+        var h = Math.max(this.dom.offsetHeight, this.dom.clientHeight);
+        if(!h){
+            h = parseInt(this.getStyle('height'), 10) || 0;
+            if(!this.isBorderBox()){
+                h += this.getFrameWidth('tb');
+            }
+        }
+        return h;
+    },
+
+    /**
+     * Returns either the offsetWidth or the width of this element based on CSS width adjusted by padding or borders
+     * when needed to simulate offsetWidth when offsets aren't available. This may not work on display:none elements
+     * if a width has not been set using CSS.
+     * @return {Number}
+     */
+    getComputedWidth : function(){
+        var w = Math.max(this.dom.offsetWidth, this.dom.clientWidth);
+        if(!w){
+            w = parseInt(this.getStyle('width'), 10) || 0;
+            if(!this.isBorderBox()){
+                w += this.getFrameWidth('lr');
+            }
+        }
+        return w;
+    },
+
+    /**
+     * 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)};
+    },
+
+    getViewSize : function(){
+        var d = this.dom, doc = document, aw = 0, ah = 0;
+        if(d == doc || d == doc.body){
+            return {width : D.getViewWidth(), height: D.getViewHeight()};
+        }else{
+            return {
+                width : d.clientWidth,
+                height: d.clientHeight
+            };
+        }
+    },
+
+    /**
+     * Returns the value of the "value" attribute
+     * @param {Boolean} asNumber true to parse the value as a number
+     * @return {String/Number}
+     */
+    getValue : function(asNumber){
+        return asNumber ? parseInt(this.dom.value, 10) : this.dom.value;
+    },
+    
+    /** @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/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Ext.Element} this
+     */
+    setWidth : function(width, animate){
+        width = this.adjustWidth(width);
+        if(!animate || !A){
+            this.dom.style.width = this.addUnits(width); 
+        }else{
+            this.anim({width: {to: width}}, this.preanim(arguments, 1));
+        }
+        return this;
+    },
+    
+    /**
+     * Set the height of the element
+     * @param {Number} height The new height
+     * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Ext.Element} this
+     */
+     setHeight : function(height, animate){
+        height = this.adjustHeight(height);
+        if(!animate || !A){
+            this.dom.style.height = this.addUnits(height);
+        }else{
+            this.anim({height: {to: height}}, this.preanim(arguments, 1));
+        }
+        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/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Ext.Element} this
+     */
+     setSize : function(width, height, animate){
+        if(typeof width == "object"){ // in case of object from getSize()
+            height = width.height; width = width.width;
+        }
+        width = this.adjustWidth(width); height = this.adjustHeight(height);
+        if(!animate || !A){
+            this.dom.style.width = this.addUnits(width);
+            this.dom.style.height = this.addUnits(height);
+        }else{
+            this.anim({width: {to: width}, height: {to: height}}, this.preanim(arguments, 2));
+        }
+        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/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Ext.Element} this
+     */
+    setBounds : function(x, y, width, height, animate){
+        if(!animate || !A){
+            this.setSize(width, 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}}, 
+                          this.preanim(arguments, 4), '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 {Ext.lib.Region} region The region to fill
+     * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Ext.Element} this
+     */
+    setRegion : function(region, animate){
+        this.setBounds(region.left, region.top, region.right-region.left, region.bottom-region.top, this.preanim(arguments, 1));
+        return this;
+    },
+
+    /**
+     * Appends an event handler
+     *
+     * @param {String}   eventName     The type of event to append
+     * @param {Function} fn        The method the event invokes
+     * @param {Object} scope       (optional) The scope (this object) of the fn
+     * @param {Object}   options   (optional)An object with standard EventManager options
+     */
+    addListener : function(eventName, fn, scope, options){
+        Ext.EventManager.on(this.dom,  eventName, fn, scope || this, options);
+    },
+
+    /**
+     * Removes an event handler from this element
+     * @param {String} eventName the type of event to remove
+     * @param {Function} fn the method the event invokes
+     * @return {Ext.Element} this
+     */
+    removeListener : function(eventName, fn){
+        Ext.EventManager.removeListener(this.dom,  eventName, fn);
+        return this;
+    },
+    
+    /**
+     * Removes all previous added listeners from this element
+     * @return {Ext.Element} this
+     */
+    removeAllListeners : function(){
+        E.purgeElement(this.dom);
+        return this;
+    },
+    
+    relayEvent : function(eventName, observable){
+        this.on(eventName, function(e){
+            observable.fireEvent(eventName, e);
+        });  
+    },
+    
+    /**
+     * Set the opacity of the element
+     * @param {Float} opacity The new opacity. 0 = transparent, .5 = 50% visibile, 1 = fully visible, etc
+     * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Ext.Element} this
+     */
+     setOpacity : function(opacity, animate){
+        if(!animate || !A){
+            var s = this.dom.style;
+            if(Ext.isIE){
+                s.zoom = 1;
+                s.filter = (s.filter || '').replace(/alpha\([^\)]*\)/gi,"") +
+                           (opacity == 1 ? "" : "alpha(opacity=" + opacity * 100 + ")");
+            }else{
+                s.opacity = opacity;
+            }
+        }else{
+            this.anim({opacity: {to: opacity}}, this.preanim(arguments, 1), null, .35, 'easeIn');
+        }
+        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;
+        }
+    },
+
+    /**
+    * Initializes positioning on this element. If a desired position is not passed, it will make the
+    * the element positioned relative IF it is not already positioned.
+    * @param {String} pos (optional) Positioning to use "relative", "absolute" or "fixed"
+    * @param {Number} zIndex (optional) The zIndex to apply
+    * @param {Number} x (optional) Set the page X position
+    * @param {Number} y (optional) Set the page Y position
+    */
+    position : function(pos, zIndex, x, y){
+        if(!pos){
+           if(this.getStyle('position') == 'static'){
+               this.setStyle('position', 'relative');
+           }
+        }else{
+            this.setStyle("position", pos);
+        }
+        if(zIndex){
+            this.setStyle("z-index", zIndex);
+        }
+        if(x !== undefined && y !== undefined){
+            this.setXY([x, y]);
+        }else if(x !== undefined){
+            this.setX(x);
+        }else if(y !== undefined){
+            this.setY(y);
+        }
+    },
+    
+    /**
+    * Clear positioning back to the default when the document was loaded
+    * @param {String} value (optional) The value to use for the left,right,top,bottom, defaults to '' (empty string). You could use 'auto'.
+    * @return {Ext.Element} this
+     */
+    clearPositioning : function(value){
+        value = value ||'';
+        this.setStyle({
+            "left": value,
+            "right": value,
+            "top": value,
+            "bottom": value,
+            "z-index": "",
+            "position" : "static"
+        });
+        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(){
+        var l = this.getStyle("left");
+        var t = this.getStyle("top");
+        return {
+            "position" : this.getStyle("position"),
+            "left" : l,
+            "right" : l ? "" : this.getStyle("right"),
+            "top" : t,
+            "bottom" : t ? "" : this.getStyle("bottom"),
+            "z-index" : this.getStyle("z-index")
+        };
+    },
+
+    /**
+     * 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, El.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, El.paddings);
+    },
+    
+    /**
+    * Set positioning with an object returned by getPositioning().
+    * @param {Object} posCfg
+    * @return {Ext.Element} this
+     */
+    setPositioning : function(pc){
+        this.applyStyles(pc);
+        if(pc.right == "auto"){
+            this.dom.style.right = "";
+        }
+        if(pc.bottom == "auto"){
+            this.dom.style.bottom = "";
+        }
+        return this;
+    },
+
+    fixDisplay : function(){
+        if(this.getStyle("display") == "none"){
+            this.setStyle("visibility", "hidden");
+            this.setStyle("display", this.originalDisplay); // first try reverting to default
+            if(this.getStyle("display") == "none"){ // if that fails, default to block
+                this.setStyle("display", "block");
+            }
+        }
+    },
+
+    /**
+     * Quick set left and top adding default units
+     * @return {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 its 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/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Ext.Element} this
+     */
+     move : function(direction, distance, animate){
+        var xy = this.getXY();
+        direction = direction.toLowerCase();
+        switch(direction){
+            case "l":
+            case "left":
+                this.moveTo(xy[0]-distance, xy[1], this.preanim(arguments, 2));
+                break;
+           case "r":
+           case "right":
+                this.moveTo(xy[0]+distance, xy[1], this.preanim(arguments, 2));
+                break;
+           case "t":
+           case "top":
+           case "up":
+                this.moveTo(xy[0], xy[1]-distance, this.preanim(arguments, 2));
+                break;
+           case "b":
+           case "bottom":
+           case "down":
+                this.moveTo(xy[0], xy[1]+distance, this.preanim(arguments, 2));
+                break;
+        }
+        return this;
+    },
+    
+    /**
+     *  Store the current overflow setting and clip overflow on the element - use {@link #unclip} to remove
+     * @return {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 {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;
+    },
+
+
+    /**
+     * Gets the x,y coordinates specified by the anchor position on the element.
+     * @param {String} anchor (optional) The specified anchor position (defaults to "c").  See {@link #alignTo} for details on supported anchor positions.
+     * @param {Object} size (optional) An object containing the size to use for calculating anchor position
+     *                       {width: (target width), height: (target height)} (defaults to the element's current size)
+     * @param {Boolean} local (optional) True to get the local (element top/left-relative) anchor position instead of page coordinates
+     * @return {Array} [x, y] An array containing the element's x and y coordinates
+     */
+    getAnchorXY : function(anchor, local, s){
+        //Passing a different size is useful for pre-calculating anchors,
+        //especially for anchored animations that change the el size.
+
+        var w, h, vp = false;
+        if(!s){
+            var d = this.dom;
+            if(d == document.body || d == document){
+                vp = true;
+                w = D.getViewWidth(); h = D.getViewHeight();
+            }else{
+                w = this.getWidth(); h = this.getHeight();
+            }
+        }else{
+            w = s.width;  h = s.height;
+        }
+        var x = 0, y = 0, r = Math.round;
+        switch((anchor || "tl").toLowerCase()){
+            case "c":
+                x = r(w*.5);
+                y = r(h*.5);
+            break;
+            case "t":
+                x = r(w*.5);
+                y = 0;
+            break;
+            case "l":
+                x = 0;
+                y = r(h*.5);
+            break;
+            case "r":
+                x = w;
+                y = r(h*.5);
+            break;
+            case "b":
+                x = r(w*.5);
+                y = h;
+            break;
+            case "tl":
+                x = 0;
+                y = 0;
+            break;
+            case "bl":
+                x = 0;
+                y = h;
+            break;
+            case "br":
+                x = w;
+                y = h;
+            break;
+            case "tr":
+                x = w;
+                y = 0;
+            break;
+        }
+        if(local === true){
+            return [x, y];
+        }
+        if(vp){
+            var sc = this.getScroll();
+            return [x + sc.left, y + sc.top];
+        }
+        //Add the element's offset xy
+        var o = this.getXY();
+        return [x+o[0], y+o[1]];
+    },
+
+    /**
+     * Gets the x,y coordinates to align this element with another element. See {@link #alignTo} for more info on the
+     * supported position values.
+     * @param {String/HTMLElement/Ext.Element} element The element to align to.
+     * @param {String} position The position to align to. 
+     * @param {Array} offsets (optional) Offset the positioning by [x, y]
+     * @return {Array} [x, y]
+     */
+    getAlignToXY : function(el, p, o){
+        el = Ext.get(el), d = this.dom;
+        if(!el.dom){
+            throw "Element.alignTo with an element that doesn't exist";
+        }
+        var c = false; //constrain to viewport
+        var p1 = "", p2 = "";
+        o = o || [0,0];
+
+        if(!p){
+            p = "tl-bl";
+        }else if(p == "?"){
+            p = "tl-bl?";
+        }else if(p.indexOf("-") == -1){
+            p = "tl-" + p;
+        }
+        p = p.toLowerCase();
+        var m = p.match(/^([a-z]+)-([a-z]+)(\?)?$/);
+        if(!m){
+           throw "Element.alignTo with an invalid alignment " + p;
+        }
+        p1 = m[1], p2 = m[2], c = m[3] ? true : false;
+
+        //Subtract the aligned el"s internal xy from the target"s offset xy
+        //plus custom offset to get the aligned el's new offset xy
+        var a1 = this.getAnchorXY(p1, true);
+        var a2 = el.getAnchorXY(p2, false);
+        var x = a2[0] - a1[0] + o[0];
+        var y = a2[1] - a1[1] + o[1];
+        if(c){
+            //constrain the aligned el to viewport if necessary
+            var w = this.getWidth(), h = this.getHeight(), r = el.getRegion();
+            // 5px of margin for ie
+            var dw = D.getViewWidth()-5, dh = D.getViewHeight()-5;
+
+            //If we are at a viewport boundary and the aligned el is anchored on a target border that is
+            //perpendicular to the vp border, allow the aligned el to slide on that border,
+            //otherwise swap the aligned el to the opposite border of the target.
+            var p1y = p1.charAt(0), p1x = p1.charAt(p1.length-1);
+           var p2y = p2.charAt(0), p2x = p2.charAt(p2.length-1);
+           var swapY = ((p1y=="t" && p2y=="b") || (p1y=="b" && p2y=="t"));
+           var swapX = ((p1x=="r" && p2x=="l") || (p1x=="l" && p2x=="r"));
+
+           var doc = document;
+           var scrollX = (doc.documentElement.scrollLeft || doc.body.scrollLeft || 0)+5;
+           var scrollY = (doc.documentElement.scrollTop || doc.body.scrollTop || 0)+5;
+
+           if((x+w) > dw){
+               x = swapX ? r.left-w : dw-w;
+           }
+           if(x < scrollX){
+               x = swapX ? r.right : scrollX;
+           }
+           if((y+h) > dh){
+               y = swapY ? r.top-h : dh-h;
+           }
+           if (y < scrollY){
+               y = swapY ? r.bottom : scrollY;
+           }
+        }
+        return [x,y];
+    },
+
+    getConstrainToXY : function(){
+        var os = {top:0, left:0, bottom:0, right: 0};
+
+        return function(el, local, offsets){
+            el = Ext.get(el);
+            offsets = offsets ? Ext.applyIf(offsets, os) : os;
+
+            var vw, vh, vx = 0, vy = 0;
+            if(el.dom == document.body || el.dom == document){
+                vw = Ext.lib.Dom.getViewWidth();
+                vh = Ext.lib.Dom.getViewHeight();
+            }else{
+                vw = el.dom.clientWidth;
+                vh = el.dom.clientHeight;
+                if(!local){
+                    var vxy = el.getXY();
+                    vx = vxy[0];
+                    vy = vxy[1];
+                }
+            }
+
+            var s = el.getScroll();
+
+            vx += offsets.left + s.left;
+            vy += offsets.top + s.top;
+
+            vw -= offsets.right;
+            vh -= offsets.bottom;
+
+            var vr = vx+vw;
+            var vb = vy+vh;
+
+            var xy = !local ? this.getXY() : [this.getLeft(true), this.getTop(true)];
+            var x = xy[0], y = xy[1];
+            var w = this.dom.offsetWidth, h = this.dom.offsetHeight;
+
+            // only move it if it needs it
+            var moved = false;
+
+            // first validate right/bottom
+            if((x + w) > vr){
+                x = vr - w;
+                moved = true;
+            }
+            if((y + h) > vb){
+                y = vb - h;
+                moved = true;
+            }
+            // then make sure top/left isn't negative
+            if(x < vx){
+                x = vx;
+                moved = true;
+            }
+            if(y < vy){
+                y = vy;
+                moved = true;
+            }
+            return moved ? [x, y] : false;
+        };
+    }(),
+
+    /**
+     * Aligns this element with another element relative to the specified anchor points. If the other element is the
+     * document it aligns it to the viewport.
+     * The position parameter is optional, and can be specified in any one of the following formats:
+     * <ul>
+     *   <li><b>Blank</b>: Defaults to aligning the element"s top-left corner to the target"s bottom-left corner ("tl-bl").</li>
+     *   <li><b>One anchor (deprecated)</b>: The passed anchor position is used as the target element's anchor point.
+     *       The element being aligned will position its top-left corner (tl) to that point.  <i>This method has been
+     *       deprecated in favor of the newer two anchor syntax below</i>.</li>
+     *   <li><b>Two anchors</b>: If two values from the table below are passed separated by a dash, the first value is used as the
+     *       element"s anchor point, and the second value is used as the target"s anchor point.</li>
+     * </ul>
+     * In addition to the anchor points, the position parameter also supports the "?" character.  If "?" is passed at the end of
+     * the position string, the element will attempt to align as specified, but the position will be adjusted to constrain to
+     * the viewport if necessary.  Note that the element being aligned might be swapped to align to a different position than
+     * that specified in order to enforce the viewport constraints.
+     * Following are all of the supported anchor positions:
+<pre>
+Value  Description
+-----  -----------------------------
+tl     The top left corner (default)
+t      The center of the top edge
+tr     The top right corner
+l      The center of the left edge
+c      In the center of the element
+r      The center of the right edge
+bl     The bottom left corner
+b      The center of the bottom edge
+br     The bottom right corner
+</pre>
+Example Usage:
+<pre><code>
+// align el to other-el using the default positioning ("tl-bl", non-constrained)
+el.alignTo("other-el");
+
+// align the top left corner of el with the top right corner of other-el (constrained to viewport)
+el.alignTo("other-el", "tr?");
+
+// align the bottom right corner of el with the center left edge of other-el
+el.alignTo("other-el", "br-l?");
+
+// align the center of el with the bottom left corner of other-el and
+// adjust the x position by -6 pixels (and the y position by 0)
+el.alignTo("other-el", "c-bl", [-6, 0]);
+</code></pre>
+     * @param {String/HTMLElement/Ext.Element} element The element to align to.
+     * @param {String} position The position to align to.
+     * @param {Array} offsets (optional) Offset the positioning by [x, y]
+     * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Ext.Element} this
+     */
+    alignTo : function(element, position, offsets, animate){
+        var xy = this.getAlignToXY(element, position, offsets);
+        this.setXY(xy, this.preanim(arguments, 3));
+        return this;
+    },
+
+    /**
+     * Anchors an element to another element and realigns it when the window is resized.
+     * @param {String/HTMLElement/Ext.Element} element The element to align to.
+     * @param {String} position The position to align to.
+     * @param {Array} offsets (optional) Offset the positioning by [x, y]
+     * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @param {Boolean/Number} monitorScroll (optional) true to monitor body scroll and reposition. If this parameter
+     * is a number, it is used as the buffer delay (defaults to 50ms).
+     * @param 
+     */
+    anchorTo : function(el, alignment, offsets, animate, monitorScroll, callback){
+        var action = function(){
+            this.alignTo(el, alignment, offsets, animate);
+            Ext.callback(callback, this);
+        };
+        Ext.EventManager.onWindowResize(action, this);
+        var tm = typeof monitorScroll;
+        if(tm != 'undefined'){
+            Ext.EventManager.on(window, 'scroll', action, this,
+                {buffer: tm == 'number' ? monitorScroll : 50});
+        }
+        action.call(this); // align immediately
+        return this;
+    },
+    /**
+    * Clears any opacity settings from this element. Required in some cases for IE.
+    * @return {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/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Ext.Element} this
+      */
+    hide : function(animate){
+        this.setVisible(false, this.preanim(arguments, 0));
+        return this;
+    },
+    
+    /**
+    * Show this element - Uses display mode to determine whether to use "display" or "visibility". See {@link #setVisible}.
+    * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Ext.Element} this
+     */
+    show : function(animate){
+        this.setVisible(true, this.preanim(arguments, 0));
+        return this;
+    },
+    
+    /**
+     * @private Test if size has a unit, otherwise appends the default 
+     */
+    addUnits : function(size){
+        return Ext.Element.addUnits(size, this.defaultUnit);
+    },
+    
+    /**
+     * Temporarily enables offsets (width,height,x,y) for an element with display:none, use endMeasure() when done.
+     * @return {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, b = document.body; // start with this element
+        while((!el.offsetWidth && !el.offsetHeight) && p && p.tagName && p != b){
+            var pe = Ext.get(p);
+            if(pe.getStyle('display') == 'none'){
+                changed.push({el: p, visibility: pe.getStyle("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 {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 {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 = Ext.id();
+        var dom = this.dom;
+        
+        html += '<span id="' + id + '"></span>';
+        
+        E.onAvailable(id, function(){
+            var hd = document.getElementsByTagName("head")[0];
+            var re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;
+            var srcRe = /\ssrc=([\'\"])(.*?)\1/i;
+            var typeRe = /\stype=([\'\"])(.*?)\1/i;
+            
+            var match;
+            while(match = re.exec(html)){
+                var attrs = match[1];
+                var srcMatch = attrs ? attrs.match(srcRe) : false;
+                if(srcMatch && srcMatch[2]){
+                   var s = document.createElement("script");
+                   s.src = srcMatch[2];
+                   var typeMatch = attrs.match(typeRe);
+                   if(typeMatch && typeMatch[2]){
+                       s.type = typeMatch[2];
+                   }
+                   hd.appendChild(s);
+                }else if(match[2] && match[2].length > 0){
+                   eval(match[2]);
+                }
+            }
+            var el = document.getElementById(id);
+            if(el){el.parentNode.removeChild(el);}
+            if(typeof callback == "function"){
+                callback();
+            }
+        });
+        dom.innerHTML = html.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig, "");
+        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&amp;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 {Ext.Element} this
+     */
+    load : function(){
+        var um = this.getUpdateManager();
+        um.update.apply(um, arguments);
+        return this;
+    },
+    
+    /**
+    * Gets this elements UpdateManager
+    * @return {Ext.UpdateManager} The UpdateManager
+    */
+    getUpdateManager : function(){
+        if(!this.updateManager){
+            this.updateManager = new Ext.UpdateManager(this);
+        }
+        return this.updateManager;
+    },
+    
+    /**
+     * Disables text selection for this element (normalized across browsers)
+     * @return {Ext.Element} this
+     */
+    unselectable : function(){
+        this.dom.unselectable = "on";
+        this.swallowEvent("selectstart", true);
+        this.applyStyles("-moz-user-select:none;-khtml-user-select:none;");
+        this.addClass("x-unselectable");
+        return this;
+    },
+    
+    /**
+    * Calculates the x, y to center this element on the screen
+    * @return {Array} The x, y values [x, y]
+    */
+    getCenterXY : function(){
+        return this.getAlignToXY(document, 'c-c');
+    },
+
+    /**
+    * Centers the Element in either the viewport, or another Element.
+    * @param {String/HTMLElement/Ext.Element} centerIn (optional) The element in which to center the element.
+    */
+    center : function(centerIn){
+        this.alignTo(centerIn || document, 'c-c');
+        return this;
+    },
+
+    /**
+     * Tests various css rules/browsers to determine if this element uses a border box
+     * @return {Boolean}
+     */
+    isBorderBox : function(){
+        return noBoxAdjust[this.dom.tagName.toLowerCase()] || Ext.isBorderBox;
+    },
+    
+    /**
+     * 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(this.getStyle("left"), 10) || 0;
+            var top = parseInt(this.getStyle("top"), 10) || 0;
+            xy = [left, top];
+        }
+        var el = this.dom, w = el.offsetWidth, h = el.offsetHeight, bx;
+        if(!contentBox){
+            bx = {x: xy[0], y: xy[1], 0: xy[0], 1: 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");
+            bx = {x: xy[0]+l, y: xy[1]+t, 0: xy[0]+l, 1: xy[1]+t, width: w-(l+r), height: h-(t+b)};
+        }
+        bx.right = bx.x + bx.width;
+        bx.bottom = bx.y + bx.height;
+        return bx;
+    },
+
+    /**
+     * Returns the sum width of the padding and borders for the passed "sides". See getBorderWidth()
+     for more information about the sides.
+     * @param {String} sides
+     * @return {Number}
+     */
+    getFrameWidth : function(sides){
+        return this.getPadding(sides) + this.getBorderWidth(sides);
+    },
+
+    /**
+     * 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/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Ext.Element} this
+     */
+    setBox : function(box, adjust, animate){
+        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, this.preanim(arguments, 2));
+        return this;
+    },
+    
+    /**
+     * Forces the browser to repaint this element
+     * @return {Ext.Element} this
+     */
+     repaint : function(){
+        var dom = this.dom;
+        this.addClass("x-repaint");
+        setTimeout(function(){
+            Ext.get(dom).removeClass("x-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, El.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 {Ext.Element} The new proxy element
+     */
+    createProxy : function(config, renderTo, matchBox){
+        if(renderTo){
+            renderTo = Ext.getDom(renderTo);
+        }else{
+            renderTo = document.body;
+        }
+        config = typeof config == "object" ?
+            config : {tag : "div", cls: config};
+        var proxy = Ext.DomHelper.append(renderTo, config, true);
+        if(matchBox){
+           proxy.setBox(this.getBox());
+        }
+        return proxy;
+    },
+    
+    /**
+     * Puts a mask over this element to disable user interaction. Requires core.css.
+     * This method can only be applied to elements which accept child nodes.
+     * @param {String} msg (optional) A message to display in the mask
+     * @param {String} msgCls (optional) A css class to apply to the msg element
+     * @return {Element} The message element
+     */
+    mask : function(msg, msgCls){
+        if(this.getStyle("position") == "static"){
+            this.setStyle("position", "relative");
+        }
+        if(!this._mask){
+            this._mask = Ext.DomHelper.append(this.dom, {tag:"div", cls:"ext-el-mask"}, true);
+        }
+        this.addClass("x-masked");
+        this._mask.setDisplayed(true);
+        if(typeof msg == 'string'){
+            if(!this._maskMsg){
+                this._maskMsg = Ext.DomHelper.append(this.dom, {tag:"div", cls:"ext-el-mask-msg", cn:{tag:'div'}}, true);
+            }
+            var mm = this._maskMsg;
+            mm.dom.className = msgCls ? "ext-el-mask-msg " + msgCls : "ext-el-mask-msg";
+            mm.dom.firstChild.innerHTML = msg;
+            mm.setDisplayed(true);
+            mm.center(this);
+        }
+        return this._mask;
+    },
+    
+    /**
+     * Removes a previously applied mask. If removeEl is true the mask overlay is destroyed, otherwise
+     * it is cached for reuse.
+     */
+    unmask : function(removeEl){
+        if(this._mask){
+            if(removeEl === true){
+                this._mask.remove();
+                delete this._mask;
+                if(this._maskMsg){
+                    this._maskMsg.remove();
+                    delete this._maskMsg;
+                }
+            }else{
+                this._mask.setDisplayed(false);
+                if(this._maskMsg){
+                    this._maskMsg.setDisplayed(false);
+                }
+            }
+        }
+        this.removeClass("x-masked");
+    },
+
+    /**
+     * Returns true if this element is masked
+     * @return {Boolean}
+     */
+    isMasked : function(){
+        return this._mask && this._mask.isVisible();
+    },
+
+    /**
+     * Creates an iframe shim for this element to keep selects and other windowed objects from
+     * showing through.
+     * @return {Ext.Element} The new shim element
+     */
+    createShim : function(){
+        var el = document.createElement('iframe');
+        el.frameBorder = 'no';
+        el.className = 'ext-shim';
+        if(Ext.isIE && Ext.isSecure){
+            el.src = Ext.SSL_SECURE_URL;
+        }
+        var shim = Ext.get(this.dom.parentNode.insertBefore(el, this.dom));
+        shim.autoBoxAdjust = false;
+        return shim;
+    },
+
+    /**
+     * Removes this element from the DOM and deletes it from the cache
+     */
+    remove : function(){
+        if(this.dom.parentNode){
+            this.dom.parentNode.removeChild(this.dom);
+        }
+        delete El.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
+     * @param {Boolean} preventFlicker (optional) If set to true, it prevents flickering by filtering
+     * mouseout events for children elements
+     * @return {Ext.Element} this
+     */
+    addClassOnOver : function(className, preventFlicker){
+        this.on("mouseover", function(){
+            Ext.fly(this, '_internal').addClass(className);
+        }, this.dom);
+        var removeFn = function(e){
+            if(preventFlicker !== true || !e.within(this, true)){
+                Ext.fly(this, '_internal').removeClass(className);
+            }
+        };
+        this.on("mouseout", removeFn, this.dom);
+        return this;
+    },
+
+    /**
+     * Sets up event handlers to add and remove a css class when this element has the focus
+     * @param {String} className
+     * @return {Ext.Element} this
+     */
+    addClassOnFocus : function(className){
+        this.on("focus", function(){
+            Ext.fly(this, '_internal').addClass(className);
+        }, this.dom);
+        this.on("blur", function(){
+            Ext.fly(this, '_internal').removeClass(className);
+        }, this.dom);
+        return this;
+    },
+    /**
+     * Sets up event handlers to add and remove a css class when the mouse is down and then up on this element (a click effect)
+     * @param {String} className
+     * @return {Ext.Element} this
+     */
+    addClassOnClick : function(className){
+        var dom = this.dom;
+        this.on("mousedown", function(){
+            Ext.fly(dom, '_internal').addClass(className);
+            var d = Ext.get(document);
+            var fn = function(){
+                Ext.fly(dom, '_internal').removeClass(className);
+                d.removeListener("mouseup", fn);
+            };
+            d.on("mouseup", fn);
+        });
+        return this;
+    },
+
+    /**
+     * Stops the specified event from bubbling and optionally prevents the default action
+     * @param {String} eventName
+     * @param {Boolean} preventDefault (optional) true to prevent the default action too
+     * @return {Ext.Element} this
+     */
+    swallowEvent : function(eventName, preventDefault){
+        var fn = function(e){
+            e.stopPropagation();
+            if(preventDefault){
+                e.preventDefault();
+            }
+        };
+        if(eventName instanceof Array){
+            for(var i = 0, len = eventName.length; i < len; i++){
+                 this.on(eventName[i], fn);
+            }
+            return this;
+        }
+        this.on(eventName, fn);
+        return this;
+    },
+
+    /**
+     * Sizes this element to its parent element's dimensions performing 
+     * neccessary box adjustments. 
+     * @param {Boolean} monitorResize (optional) If true maintains the fit when the browser window is resized.
+     * @param {String/HTMLElment/Element} targetParent (optional) The target parent, default to the parentNode.
+     * @return {Ext.Element} this
+     */
+    fitToParent : function(monitorResize, targetParent){
+        var p = Ext.get(targetParent || this.dom.parentNode);
+        this.setSize(p.getComputedWidth()-p.getFrameWidth('lr'), p.getComputedHeight()-p.getFrameWidth('tb'));
+        if(monitorResize === true){
+            Ext.EventManager.onWindowResize(this.fitToParent.createDelegate(this, []));
+        }
+        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 {Ext.Element} this
+     */
+    appendChild: function(el){
+        el = Ext.get(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
+     * @param {Boolean} returnDom (optional) true to return the dom node instead of creating an Element
+     * @return {Ext.Element} The new child element
+     */
+    createChild: function(config, insertBefore, returnDom){
+        config = config || {tag:'div'};
+        if(insertBefore){
+            return Ext.DomHelper.insertBefore(insertBefore, config, returnDom !== true);
+        }
+        return Ext.DomHelper[!this.dom.firstChild ? 'overwrite' : 'append'](this.dom, config,  returnDom !== true);
+    },
+    
+    /**
+     * Appends this element to the passed element
+     * @param {String/HTMLElement/Element} el The new parent element
+     * @return {Ext.Element} this
+     */
+    appendTo: function(el){
+        el = Ext.getDom(el);
+        el.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 {Ext.Element} this
+     */
+    insertBefore: function(el){
+        el = Ext.getDom(el);
+        el.parentNode.insertBefore(this.dom, el);
+        return this;
+    },
+    
+    /**
+     * Inserts this element after the passed element in the DOM
+     * @param {String/HTMLElement/Element} el The element to insert after
+     * @return {Ext.Element} this
+     */
+    insertAfter: function(el){
+        el = Ext.getDom(el);
+        el.parentNode.insertBefore(this.dom, el.nextSibling);
+        return this;
+    },
+
+    /**
+     * Inserts (or creates) an element (or DomHelper config) as the first child of the this element
+     * @param {String/HTMLElement/Element/Object} el The id or element to insert or a DomHelper config to create and insert
+     * @return {Ext.Element} The new child
+     */
+    insertFirst: function(el, returnDom){
+        el = el || {};
+        if(typeof el == 'object' && !el.nodeType){ // dh config
+            return this.createChild(el, this.dom.firstChild, returnDom);
+        }else{
+            el = Ext.getDom(el);
+            this.dom.insertBefore(el, this.dom.firstChild);
+            return !returnDom ? Ext.get(el) : el;
+        }
+    },
+
+    /**
+     * Inserts (or creates) the passed element (or DomHelper config) as a sibling of this element
+     * @param {String/HTMLElement/Element/Object} el The id or element to insert or a DomHelper config to create and insert
+     * @param {String} where (optional) 'before' or 'after' defaults to before
+     * @param {Boolean} returnDom (optional) True to return the raw DOM element instead of Ext.Element
+     * @return {Ext.Element} the inserted Element
+     */
+    insertSibling: function(el, where, returnDom){
+        where = where ? where.toLowerCase() : 'before';
+        el = el || {};
+        var rt, refNode = where == 'before' ? this.dom : this.dom.nextSibling;
+
+        if(typeof el == 'object' && !el.nodeType){ // dh config
+            if(where == 'after' && !this.dom.nextSibling){
+                rt = Ext.DomHelper.append(this.dom.parentNode, el, !returnDom);
+            }else{
+                rt = Ext.DomHelper[where == 'after' ? 'insertAfter' : 'insertBefore'](this.dom, el, !returnDom);
+            }
+
+        }else{
+            rt = this.dom.parentNode.insertBefore(Ext.getDom(el),
+                        where == 'before' ? this.dom : this.dom.nextSibling);
+            if(!returnDom){
+                rt = Ext.get(rt);
+            }
+        }
+        return rt;
+    },
+
+    /**
+     * 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
+     * @param {Boolean} returnDom (optional) True to return the raw DOM element instead of Ext.Element
+     * @return {/HTMLElementElement} The newly created wrapper element
+     */
+    wrap: function(config, returnDom){
+        if(!config){
+            config = {tag: "div"};
+        }
+        var newEl = Ext.DomHelper.insertBefore(this.dom, config, !returnDom);
+        newEl.dom ? newEl.dom.appendChild(this.dom) : newEl.appendChild(this.dom);
+        return newEl;
+    },
+    
+    /**
+     * Replaces the passed element with this element
+     * @param {String/HTMLElement/Element} el The element to replace
+     * @return {Ext.Element} this
+     */
+    replace: function(el){
+        el = Ext.get(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 {HTMLElement} The inserted node (or nearest related if more than 1 inserted)
+     */
+    insertHtml : function(where, html){
+        return Ext.DomHelper.insertHtml(where, this.dom, html);
+    },
+    
+    /**
+     * 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
+     * @param {Boolean} useSet (optional) false to override the default setAttribute to use expandos.
+     * @return {Ext.Element} this
+     */
+    set : function(o, useSet){
+        var el = this.dom;
+        useSet = typeof useSet == 'undefined' ? (el.setAttribute ? true : false) : useSet;
+        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];
+            }
+        }
+        Ext.DomHelper.applyStyles(el, o.style);
+        return this;
+    },
+    
+    /**
+     * Convenience method for constructing a KeyMap
+     * @param {Number/Array/Object/String} key Either a string with the keys to listen for, 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 {Ext.KeyMap} The KeyMap created
+     */
+    addKeyListener : function(key, fn, scope){
+        var config;
+        if(typeof key != "object" || key instanceof Array){
+            config = {
+                key: key,
+                fn: fn,
+                scope: scope 
+            };
+        }else{
+            config = {
+                key : key.key,
+                shift : key.shift,
+                ctrl : key.ctrl,
+                alt : key.alt,
+                fn: fn,
+                scope: scope
+            };
+        }
+        return new Ext.KeyMap(this, config);
+    },
+    
+    /**
+     * Creates a KeyMap for this element
+     * @param {Object} config The KeyMap config. See {@link Ext.KeyMap} for more details
+     * @return {Ext.KeyMap} The KeyMap created
+     */
+    addKeyMap : function(config){
+        return new Ext.KeyMap(this, config);
+    },
+    
+    /**
+     * Returns true if this element is scrollable.
+     * @return {Boolean}
+     */
+     isScrollable : function(){
+        var dom = this.dom;
+        return dom.scrollHeight > dom.clientHeight || dom.scrollWidth > dom.clientWidth;
+    },
+    
+    /**
+     * Scrolls this element the specified scroll point. It does NOT do bounds checking so if you scroll to a weird value it will try to do it. For auto bounds checking, use scroll().
+     * @param {String} side Either "left" for scrollLeft values or "top" for scrollTop values.
+     * @param {Number} value The new scroll value
+     * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Element} this
+     */
+     
+    scrollTo : function(side, value, animate){
+        var prop = side.toLowerCase() == "left" ? "scrollLeft" : "scrollTop";
+        if(!animate || !A){
+            this.dom[prop] = value;
+        }else{
+            var to = prop == "scrollLeft" ? [value, this.dom.scrollTop] : [this.dom.scrollLeft, value];
+            this.anim({scroll: {"to": to}}, this.preanim(arguments, 2), 'scroll');
+        }
+        return this;
+    },
+    
+    /**
+     * Scrolls this element the specified direction. Does bounds checking to make sure the scroll is 
+     * within this elements scrollable range.
+     * @param {String} direction Possible values are: "l","left" - "r","right" - "t","top","up" - "b","bottom","down".
+     * @param {Number} distance How far to scroll the element in pixels
+     * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
+     * @return {Boolean} Returns true if a scroll was triggered or false if the element 
+     * was scrolled as far as it could go.
+     */
+     scroll : function(direction, distance, animate){
+         if(!this.isScrollable()){
+             return;
+         }
+         var el = this.dom;
+         var l = el.scrollLeft, t = el.scrollTop;
+         var w = el.scrollWidth, h = el.scrollHeight;
+         var cw = el.clientWidth, ch = el.clientHeight;
+         direction = direction.toLowerCase();
+         var scrolled = false;
+         var a = this.preanim(arguments, 2);
+         switch(direction){
+             case "l":
+             case "left":
+                 if(w - l > cw){
+                     var v = Math.min(l + distance, w-cw);
+                     this.scrollTo("left", v, a);
+                     scrolled = true;
+                 }
+                 break;
+            case "r":
+            case "right":
+                 if(l > 0){
+                     var v = Math.max(l - distance, 0);
+                     this.scrollTo("left", v, a);
+                     scrolled = true;
+                 }
+                 break;
+            case "t":
+            case "top":
+            case "up":
+                 if(t > 0){
+                     var v = Math.max(t - distance, 0);
+                     this.scrollTo("top", v, a);
+                     scrolled = true;
+                 }
+                 break;
+            case "b":
+            case "bottom":
+            case "down":
+                 if(h - t > ch){
+                     var v = Math.min(t + distance, h-ch);
+                     this.scrollTo("top", v, a);
+                     scrolled = true;
+                 }
+                 break;
+         }
+         return scrolled;
+    },
+
+    /**
+     * Translates the passed page coordinates into left/top css values for this element
+     * @param {Number/Array} x The page x or an array containing [x, y]
+     * @param {Number} y The page y
+     * @param {Object} An object with left and top properties. e.g. {left: (value), top: (value)}
+     */
+    translatePoints : function(x, y){
+        if(typeof x == 'object' || x instanceof Array){
+            y = x[1]; x = x[0];
+        }
+        var p = this.getStyle('position');
+        var o = this.getXY();
+
+        var l = parseInt(this.getStyle('left'), 10);
+        var t = parseInt(this.getStyle('top'), 10);
+
+        if(isNaN(l)){
+            l = (p == "relative") ? 0 : this.dom.offsetLeft;
+        }
+        if(isNaN(t)){
+            t = (p == "relative") ? 0 : this.dom.offsetTop;
+        }
+
+        return {left: (x - o[0] + l), top: (y - o[1] + t)};
+    },
+
+    getScroll : function(){
+        var d = this.dom, doc = document;
+        if(d == doc || d == doc.body){
+            var l = window.pageXOffset || doc.documentElement.scrollLeft || doc.body.scrollLeft || 0;
+            var t = window.pageYOffset || doc.documentElement.scrollTop || doc.body.scrollTop || 0;
+            return {left: l, top: t};
+        }else{
+            return {left: d.scrollLeft, top: d.scrollTop};
+        }
+    },
+
+    /**
+     * Return the CSS color for the specified CSS attribute. rgb, 3 digit (like #fff) and valid values
+     * are convert to standard 6 digit hex color. 
+     * @param {String} attr The css attribute
+     * @param {String} defaultValue The default value to use when a valid color isn't found
+     * @param {String} prefix (optional) defaults to #. Use an empty string when working with 
+     * YUI color anims.
+     */
+    getColor : function(attr, defaultValue, prefix){
+        var v = this.getStyle(attr);
+        if(!v || v == "transparent" || v == "inherit") {
+            return defaultValue;
+        }
+        var color = typeof prefix == "undefined" ? "#" : prefix;
+        if(v.substr(0, 4) == "rgb("){
+            var rvs = v.slice(4, v.length -1).split(",");
+            for(var i = 0; i < 3; i++){
+                var h = parseInt(rvs[i]).toString(16);
+                if(h < 16){
+                    h = "0" + h;
+                }
+                color += h;
+            }
+        } else {  
+            if(v.substr(0, 1) == "#"){
+                if(v.length == 4) {
+                    for(var i = 1; i < 4; i++){
+                        var c = v.charAt(i);
+                        color +=  c + c;
+                    }
+                }else if(v.length == 7){
+                    color += v.substr(1);
+                }
+            }
+        }
+        return(color.length > 5 ? color.toLowerCase() : defaultValue);  
+    },
+
+    boxWrap : function(cls){
+        cls = cls || 'x-box';
+        var el = Ext.get(this.insertHtml('beforeBegin', String.format('<div class="{0}">'+El.boxMarkup+'</div>', cls)));
+        el.child('.'+cls+'-mc').dom.appendChild(this.dom);
+        return el;
+    },
+
+    getAttributeNS : Ext.isIE ? function(ns, name){
+        var d = this.dom;
+        var type = typeof d[ns+":"+name];
+        if(type != 'undefined' && type != 'unknown'){
+            return d[ns+":"+name];
+        }
+        return d[name];
+    } : function(ns, name){
+        var d = this.dom;
+        return d.getAttributeNS(ns, name) || d.getAttribute(ns+":"+name) || d.getAttribute(name) || d[name];
+    }
+};
+
+var ep = El.prototype;
+
+/**
+ * Appends an event handler (Shorthand for addListener)
+ * @param {String}   eventName     The type of event to append
+ * @param {Function} fn        The method the event invokes
+ * @param {Object} scope       (optional) The scope (this object) of the fn
+ * @param {Object}   options   (optional)An object with standard EventManager options
+ * @method
+ */
+ep.on = ep.addListener;
+    // backwards compat
+ep.mon = ep.addListener;
+
+/**
+ * Removes an event handler from this element (shorthand for removeListener)
+ * @param {String} eventName the type of event to remove
+ * @param {Function} fn the method the event invokes
+ * @return {Ext.Element} this
+ * @method
+ */
+ep.un = ep.removeListener;
+
+/**
+ * true to automatically adjust width and height settings for box-model issues (default to true)
+ */
+ep.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>Ext.Element.prototype.autoDisplayMode = true;</code></pre>
+ */
+ep.autoDisplayMode = true;
+
+El.unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i;
+
+El.addUnits = function(v, defaultUnit){
+    if(v === "" || v == "auto"){
+        return v;
+    }
+    if(v === undefined){
+        return '';
+    }
+    if(typeof v == "number" || !El.unitPattern.test(v)){
+        return v + (defaultUnit || 'px');
+    }
+    return v;
+};
+
+// special markup used throughout Ext when box wrapping elements
+El.boxMarkup = '<div class="{0}-tl"><div class="{0}-tr"><div class="{0}-tc"></div></div></div><div class="{0}-ml"><div class="{0}-mr"><div class="{0}-mc"></div></div></div><div class="{0}-bl"><div class="{0}-br"><div class="{0}-bc"></div></div></div>';
+/**
+ * Visibility mode constant - Use visibility to hide element
+ * @static
+ * @type Number
+ */
+El.VISIBILITY = 1;
+/**
+ * Visibility mode constant - Use display to hide element
+ * @static
+ * @type Number
+ */
+El.DISPLAY = 2;
+
+El.borders = {l: "border-left-width", r: "border-right-width", t: "border-top-width", b: "border-bottom-width"};
+El.paddings = {l: "padding-left", r: "padding-right", t: "padding-top", b: "padding-bottom"};
+El.margins = {l: "margin-left", r: "margin-right", t: "margin-top", b: "margin-bottom"};
+
+
+
+/**
+ * @private
+ */
+El.cache = {};
+
+var docEl;
+
+/**
+ * Static method to retrieve 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 node, a DOM Node or an existing Element.
+ * @return {Element} The Element object
+ * @static
+ */
+El.get = function(el){
+    var ex, elm, id;
+    if(!el){ return null; }
+    if(typeof el == "string"){ // element id
+        if(!(elm = document.getElementById(el))){
+            return null;
+        }
+        if(ex = El.cache[el]){
+            ex.dom = elm;
+        }else{
+            ex = El.cache[el] = new El(elm);
+        }
+        return ex;
+    }else if(el.tagName){ // dom element
+        if(!(id = el.id)){
+            id = Ext.id(el);
+        }
+        if(ex = El.cache[id]){
+            ex.dom = el;
+        }else{
+            ex = El.cache[id] = new El(el);
+        }
+        return ex;
+    }else if(el instanceof El){
+        if(el != docEl){
+            el.dom = document.getElementById(el.id) || el.dom; // refresh dom element in case no longer valid,
+                                                          // catch case where it hasn't been appended
+            El.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 El.select(el);
+    }else if(el == document){
+        // create a bogus element object representing the document object
+        if(!docEl){
+            var f = function(){};
+            f.prototype = El.prototype;
+            docEl = new f();
+            docEl.dom = document;
+        }
+        return docEl;
+    }
+    return null;
+};
+
+El.uncache = function(el){
+    for(var i = 0, a = arguments, len = a.length; i < len; i++) {
+        if(a[i]){
+            delete El.cache[a[i].id || a[i]];
+        }
+    }
+};
+
+// dom is optional
+El.Flyweight = function(dom){
+    this.dom = dom;
+};
+El.Flyweight.prototype = El.prototype;
+
+El._flyweights = {};
+/**
+ * Gets the globally shared flyweight Element, with the passed node as the active element. Do not store a reference to this element - 
+ * the dom node can be overwritten by other code.
+ * @param {String/HTMLElement} el The dom node or id
+ * @param {String} named (optional) Allows for creation of named reusable flyweights to
+ *                                  prevent conflicts (e.g. internally Ext uses "_internal")
+ * @static
+ * @return {Element} The shared Element object
+ */
+El.fly = function(el, named){
+    named = named || '_global';
+    el = Ext.getDom(el);
+    if(!el){
+        return null;
+    }
+    if(!El._flyweights[named]){
+        El._flyweights[named] = new El.Flyweight();
+    }
+    El._flyweights[named].dom = el;
+    return El._flyweights[named];
+};
+
+/**
+ * Static method to retrieve 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.
+ * Shorthand of {@link Ext.Element#get}
+ * @param {String/HTMLElement/Element} el The id of the node, a DOM Node or an existing Element.
+ * @return {Element} The Element object
+ * @member Ext
+ * @method get
+ */
+Ext.get = El.get;
+/**
+ * Gets the globally shared flyweight Element, with the passed node as the active element. Do not store a reference to this element - 
+ * the dom node can be overwritten by other code.
+ * Shorthand of {@link Ext.Element#fly}
+ * @param {String/HTMLElement} el The dom node or id
+ * @param {String} named (optional) Allows for creation of named reusable flyweights to
+ *                                  prevent conflicts (e.g. internally Ext uses "_internal")
+ * @static
+ * @return {Element} The shared Element object
+ * @member Ext
+ * @method fly
+ */
+Ext.fly = El.fly;
+
+// speedy lookup for elements never to box adjust
+var noBoxAdjust = Ext.isStrict ? {
+    select:1
+} : {
+    input:1, select:1, textarea:1
+};
+if(Ext.isIE || Ext.isGecko){
+    noBoxAdjust['button'] = 1;
+}
+
+
+Ext.EventManager.on(window, 'unload', function(){
+    delete El.cache;
+    delete El._flyweights;
+});
+})();
+
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/EventManager.jss.html b/www/extras/yui-ext/docs/output/EventManager.jss.html new file mode 100644 index 000000000..5e610d5cf --- /dev/null +++ b/www/extras/yui-ext/docs/output/EventManager.jss.html @@ -0,0 +1,655 @@ +EventManager.js

EventManager.js

/**
+ * @class 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 Ext.EventObject} for more details on normalized event objects.
+ * @singleton
+ */
+Ext.EventManager = function(){
+    var docReadyEvent, docReadyProcId, docReadyState = false;
+    var resizeEvent, resizeTask, textEvent, textSize;
+    var E = Ext.lib.Event;
+    var D = Ext.lib.Dom;
+
+
+    var fireDocReady = function(){
+        if(!docReadyState){
+            docReadyState = true;
+            Ext.isReady = true;
+            if(docReadyProcId){
+                clearInterval(docReadyProcId);
+            }
+            if(Ext.isGecko || Ext.isOpera) {
+                document.removeEventListener("DOMContentLoaded", fireDocReady, false);
+            }
+            if(docReadyEvent){
+                docReadyEvent.fire();
+                docReadyEvent.clearListeners();
+            }
+        }
+    };
+    
+    var initDocReady = function(){
+        docReadyEvent = new Ext.util.Event();
+        if(Ext.isGecko || Ext.isOpera) {
+            document.addEventListener("DOMContentLoaded", fireDocReady, false);
+        }else if(Ext.isIE){
+            // inspired by  http://www.thefutureoftheweb.com/blog/2006/6/adddomloadevent
+            document.write("<s"+'cript id="ie-deferred-loader" defer="defer" src="/'+'/:"></s'+"cript>");
+            var defer = document.getElementById("ie-deferred-loader");
+            defer.onreadystatechange = function(){
+                if(this.readyState == "complete"){
+                    fireDocReady();
+                    defer.onreadystatechange = null;
+                    defer.parentNode.removeChild(defer);
+                }
+            };
+        }else if(Ext.isSafari){ 
+            docReadyProcId = setInterval(function(){
+                var rs = document.readyState;
+                if(rs == "complete") {
+                    fireDocReady();     
+                 }
+            }, 10);
+        }
+        // no matter what, make sure it fires on load
+        E.on(window, "load", fireDocReady);
+    };
+
+    var createBuffered = function(h, o){
+        var task = new Ext.util.DelayedTask(h);
+        return function(e){
+            // create new event object impl so new events don't wipe out properties
+            e = new Ext.EventObjectImpl(e);
+            task.delay(o.buffer, h, null, [e]);
+        };
+    };
+
+    var createSingle = function(h, el, ename, fn){
+        return function(e){
+            Ext.EventManager.removeListener(el, ename, fn);
+            h(e);
+        };
+    };
+
+    var createDelayed = function(h, o){
+        return function(e){
+            // create new event object impl so new events don't wipe out properties
+            e = new Ext.EventObjectImpl(e);
+            setTimeout(function(){
+                h(e);
+            }, o.delay || 10);
+        };
+    };
+
+    var listen = function(element, ename, opt, fn, scope){
+        var o = (!opt || typeof opt == "boolean") ? {} : opt;
+        fn = fn || o.fn; scope = scope || o.scope;
+        var el = Ext.getDom(element);
+        if(!el){
+            throw "Error listening for \"" + ename + '\". Element "' + element + '" doesn\'t exist.';
+        }
+        var h = function(e){
+            e = Ext.EventObject.setEvent(e);
+            var t;
+            if(o.delegate){
+                t = e.getTarget(o.delegate, el);
+                if(!t){
+                    return;
+                }
+            }else{
+                t = e.target;
+            }
+            if(o.stopEvent === true){
+                e.stopEvent();
+            }
+            if(o.preventDefault === true){
+               e.preventDefault();
+            }
+            if(o.stopPropagation === true){
+                e.stopPropagation();
+            }
+
+            if(o.normalized === false){
+                e = e.browserEvent;
+            }
+
+            fn.call(scope || el, e, t, o);
+        };
+        if(o.delay){
+            h = createDelayed(h, o);
+        }
+        if(o.single){
+            h = createSingle(h, el, ename, fn);
+        }
+        if(o.buffer){
+            h = createBuffered(h, o);
+        }
+        fn._handlers = fn._handlers || [];
+        fn._handlers.push([Ext.id(el), ename, h]);
+
+        E.on(el, ename, h);
+        if(ename == "mousewheel" && el.addEventListener){ // workaround for jQuery
+            el.addEventListener("DOMMouseScroll", h, false);
+            E.on(window, 'unload', function(){
+                el.removeEventListener("DOMMouseScroll", h, false);
+            });
+        }
+        if(ename == "mousedown" && el == document){ // fix stopped mousedowns on the document
+            Ext.EventManager.stoppedMouseDownEvent.addListener(h);
+        }
+        return h;
+    };
+
+    var stopListening = function(el, ename, fn){
+        var id = Ext.id(el), hds = fn._handlers, hd = fn;
+        if(hds){
+            for(var i = 0, len = hds.length; i < len; i++){
+                var h = hds[i];
+                if(h[0] == id && h[1] == ename){
+                    hd = h[2];
+                    hds.splice(i, 1);
+                    break;
+                }
+            }
+        }
+        E.un(el, ename, hd);
+        el = Ext.getDom(el);
+        if(ename == "mousewheel" && el.addEventListener){
+            el.removeEventListener("DOMMouseScroll", hd, false);
+        }
+        if(ename == "mousedown" && el == document){ // fix stopped mousedowns on the document
+            Ext.EventManager.stoppedMouseDownEvent.removeListener(hd);
+        }
+    };
+
+    var propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized)$/;
+    var pub = {
+        
+        /** 
+         * This is no longer needed and is deprecated. Places a simple wrapper around an event handler to override the browser event
+         * object with a 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
+         * @deprecated
+         */
+        wrap : function(fn, scope, override){
+            return function(e){
+                Ext.EventObject.setEvent(e);
+                fn.call(override ? scope || window : window, Ext.EventObject, scope);
+            };
+        },
+        
+        /**
+         * Appends an event handler
+         *
+         * @param {String/HTMLElement}   element        The html element or id to assign the 
+         *                             event to
+         * @param {String}   eventName     The type of event to append
+         * @param {Function} fn        The method the event invokes
+         * @param {Object}   options   An object with standard EventManager options
+         */
+        addListener : function(element, eventName, fn, scope, options){
+            if(typeof eventName == "object"){
+                var o = eventName;
+                for(var e in o){
+                    if(propRe.test(e)){
+                        continue;
+                    }
+                    if(typeof o[e] == "function"){
+                        // shared options
+                        listen(element, e, o, o[e], o.scope);
+                    }else{
+                        // individual options
+                        listen(element, e, o[e]);
+                    }
+                }
+                return;
+            }
+            return listen(element, eventName, options, fn, scope);
+        },
+        
+        /**
+         * Removes an event handler
+         *
+         * @param {String/HTMLElement}   element        The id or html element to remove the 
+         *                             event from
+         * @param {String}   eventName     The type of event
+         * @param {Function} fn
+         * @return {Boolean} True if a listener was actually removed
+         */
+        removeListener : function(element, eventName, fn){
+            return stopListening(element, eventName, fn);
+        },
+        
+        /**
+         * Fires when the document is ready (before onload and before images are loaded). Can be 
+         * accessed shorthanded Ext.onReady().
+         * @param {Function} fn        The method the event invokes
+         * @param {Object}   scope    An  object that becomes the scope of the handler
+         * @param {boolean}  options
+         */
+        onDocumentReady : function(fn, scope, options){
+            if(docReadyState){ // if it already fired
+                fn.call(scope || window, scope);
+                return;
+            }
+            if(!docReadyEvent){
+                initDocReady();
+            }
+            docReadyEvent.addListener(fn, scope, options);
+        },
+        
+        /**
+         * 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}  options
+         */
+        onWindowResize : function(fn, scope, options){
+            if(!resizeEvent){
+                resizeEvent = new Ext.util.Event();
+                resizeTask = new Ext.util.DelayedTask(function(){
+                    resizeEvent.fire(D.getViewWidth(), D.getViewHeight());
+                });
+                E.on(window, "resize", function(){
+                    if(Ext.isIE){
+                        resizeTask.delay(50);
+                    }else{
+                        resizeEvent.fire(D.getViewWidth(), D.getViewHeight());
+                    }
+                });
+            }
+            resizeEvent.addListener(fn, scope, options);
+        },
+
+        /**
+         * Fires when the user changes the active text size. Handler gets called with 2 params, the old size and the new size.
+         * @param {Function} fn        The method the event invokes
+         * @param {Object}   scope    An object that becomes the scope of the handler
+         * @param {boolean}  options
+         */
+        onTextResize : function(fn, scope, options){
+            if(!textEvent){
+                textEvent = new Ext.util.Event();
+                var textEl = new Ext.Element(document.createElement('div'));
+                textEl.dom.className = 'x-text-resize';
+                textEl.dom.innerHTML = 'X';
+                textEl.appendTo(document.body);
+                textSize = textEl.dom.offsetHeight;
+                setInterval(function(){
+                    if(textEl.dom.offsetHeight != textSize){
+                        textEvent.fire(textSize, textSize = textEl.dom.offsetHeight);
+                    }
+                }, this.textResizeInterval);
+            }
+            textEvent.addListener(fn, scope, options);
+        },
+
+        /**
+         * Removes the passed window resize listener.
+         * @param {Function} fn        The method the event invokes
+         * @param {Object}   scope    The scope of handler
+         */
+        removeResizeListener : function(fn, scope){
+            if(resizeEvent){
+                resizeEvent.removeListener(fn, scope);
+            }
+        },
+        
+        fireResize : function(){
+            if(resizeEvent){
+                resizeEvent.fire(D.getViewWidth(), D.getViewHeight());
+            }   
+        },
+        /**
+         * Url used for onDocumentReady with using SSL (defaults to Ext.SSL_SECURE_URL)
+         */
+        ieDeferSrc : false,
+        textResizeInterval : 50
+    };
+    /**
+     * Appends an event handler (shorthand for addListener)
+     *
+     * @param {String/HTMLElement}   element        The html element or id 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
+     */
+    pub.on = pub.addListener;
+    pub.un = pub.removeListener;
+
+    pub.stoppedMouseDownEvent = new Ext.util.Event();
+    return pub;
+}();
+/**
+  * Fires when the document is ready (before onload and before images are loaded).  Shorthand of {@link Ext.EventManager#onDocumentReady}.
+  * @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
+  * @member Ext
+  * @method onReady
+ */
+Ext.onReady = Ext.EventManager.onDocumentReady;
+
+Ext.onReady(function(){
+    var bd = Ext.get(document.body);
+    if(!bd){ return; }
+    var cls = Ext.isIE ? "ext-ie"
+            : Ext.isGecko ? "ext-gecko"
+            : Ext.isOpera ? "ext-opera"
+            : Ext.isSafari ? "ext-safari" : "";
+    if(Ext.isBorderBox){
+        cls += ' ext-border-box';
+    }
+    if(Ext.isStrict){
+        cls += ' ext-strict';
+    }
+    bd.addClass(cls);
+});
+/**
+ * @class 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 
+ * Example:
+ * <pre><code>
+ function handleClick(e){ // e is not a standard event object, it is a Ext.EventObject
+    e.preventDefault();
+    var target = e.getTarget();
+    ...
+ }
+ var myDiv = Ext.get("myDiv");
+ myDiv.on("click", handleClick);
+ //or
+ Ext.EventManager.on("myDiv", 'click', handleClick);
+ Ext.EventManager.addListener("myDiv", 'click', handleClick);
+ </code></pre>
+ * @singleton
+ */
+Ext.EventObject = function(){
+    
+    var E = Ext.lib.Event;
+    
+    // safari keypress events for special keys return bad keycodes
+    var safariKeys = {
+        63234 : 37, // left
+        63235 : 39, // right
+        63232 : 38, // up
+        63233 : 40, // down
+        63276 : 33, // page up
+        63277 : 34, // page down
+        63272 : 46, // delete
+        63273 : 36, // home
+        63275 : 35  // end
+    };
+
+    // normalize button clicks
+    var btnMap = Ext.isIE ? {1:0,4:1,2:2} :
+                (Ext.isSafari ? {1:0,2:1,3:2} : {0:0,1:1,2:2});
+
+    Ext.EventObjectImpl = function(e){
+        if(e){
+            this.setEvent(e.browserEvent || e);
+        }
+    };
+    Ext.EventObjectImpl.prototype = {
+        /** The normal browser event */
+        browserEvent : null,
+        /** The button pressed in a mouse event */
+        button : -1,
+        /** True if the shift key was down during the event */
+        shiftKey : false,
+        /** True if the control key was down during the event */
+        ctrlKey : false,
+        /** True if the alt key was down during the event */
+        altKey : false,
+
+        /** Key constant @type Number */
+        BACKSPACE : 8,
+        /** Key constant @type Number */
+        TAB : 9,
+        /** Key constant @type Number */
+        RETURN : 13,
+        /** Key constant @type Number */
+        ENTER : 13,
+        /** Key constant @type Number */
+        SHIFT : 16,
+        /** Key constant @type Number */
+        CONTROL : 17,
+        /** Key constant @type Number */
+        ESC : 27,
+        /** Key constant @type Number */
+        SPACE : 32,
+        /** Key constant @type Number */
+        PAGEUP : 33,
+        /** Key constant @type Number */
+        PAGEDOWN : 34,
+        /** Key constant @type Number */
+        END : 35,
+        /** Key constant @type Number */
+        HOME : 36,
+        /** Key constant @type Number */
+        LEFT : 37,
+        /** Key constant @type Number */
+        UP : 38,
+        /** Key constant @type Number */
+        RIGHT : 39,
+        /** Key constant @type Number */
+        DOWN : 40,
+        /** Key constant @type Number */
+        DELETE : 46,
+        /** Key constant @type Number */
+        F5 : 116,
+
+           /** @private */
+        setEvent : function(e){
+            if(e == this || (e && e.browserEvent)){ // already wrapped
+                return e;
+            }
+            this.browserEvent = e;
+            if(e){
+                // normalize buttons
+                this.button = e.button ? btnMap[e.button] : (e.which ? e.which-1 : -1);
+                this.shiftKey = e.shiftKey;
+                // mac metaKey behaves like ctrlKey
+                this.ctrlKey = e.ctrlKey || e.metaKey;
+                this.altKey = e.altKey;
+                // in getKey these will be normalized for the mac
+                this.keyCode = e.keyCode;
+                this.charCode = e.charCode;
+                // cache the target for the delayed and or buffered events
+                this.target = E.getTarget(e);
+                // same for XY
+                this.xy = E.getXY(e);
+            }else{
+                this.button = -1;
+                this.shiftKey = false;
+                this.ctrlKey = false;
+                this.altKey = false;
+                this.keyCode = 0;
+                this.charCode =0;
+                this.target = null;
+                this.xy = [0, 0];
+            }
+            return this;
+        },
+
+        /**
+         * Stop the event (preventDefault and stopPropagation)
+         */
+        stopEvent : function(){
+            if(this.browserEvent){
+                if(this.browserEvent.type == 'mousedown'){
+                    Ext.EventManager.stoppedMouseDownEvent.fire(this);
+                }
+                E.stopEvent(this.browserEvent);
+            }
+        },
+
+        /**
+         * Prevents the browsers default handling of the event.
+         */
+        preventDefault : function(){
+            if(this.browserEvent){
+                E.preventDefault(this.browserEvent);
+            }
+        },
+
+        /** @private */
+        isNavKeyPress : function(){
+            var k = this.keyCode;
+            k = Ext.isSafari ? (safariKeys[k] || k) : k;
+            return (k >= 33 && k <= 40) || k == this.RETURN || k == this.TAB || k == this.ESC;
+        },
+
+        isSpecialKey : function(){
+            var k = this.keyCode;
+            return k == 9 || k == 13  || k == 40 || k == 27 ||
+            (k == 16) || (k == 17) ||
+            (k >= 18 && k <= 20) ||
+            (k >= 33 && k <= 35) ||
+            (k >= 36 && k <= 39) ||
+            (k >= 44 && k <= 45);
+        },
+        /**
+         * Cancels bubbling of the event.
+         */
+        stopPropagation : function(){
+            if(this.browserEvent){
+                if(this.browserEvent.type == 'mousedown'){
+                    Ext.EventManager.stoppedMouseDownEvent.fire(this);
+                }
+                E.stopPropagation(this.browserEvent);
+            }
+        },
+
+        /**
+         * Gets the key code for the event.
+         * @return {Number}
+         */
+        getCharCode : function(){
+            return this.charCode || this.keyCode;
+        },
+
+        /**
+         * Returns a normalized keyCode for the event.
+         * @return {Number} The key code
+         */
+        getKey : function(){
+            var k = this.keyCode || this.charCode;
+            return Ext.isSafari ? (safariKeys[k] || k) : k;
+        },
+
+        /**
+         * Gets the x coordinate of the event.
+         * @return {Number}
+         */
+        getPageX : function(){
+            return this.xy[0];
+        },
+
+        /**
+         * Gets the y coordinate of the event.
+         * @return {Number}
+         */
+        getPageY : function(){
+            return this.xy[1];
+        },
+
+        /**
+         * Gets the time of the event.
+         * @return {Number}
+         */
+        getTime : function(){
+            if(this.browserEvent){
+                return E.getTime(this.browserEvent);
+            }
+            return null;
+        },
+
+        /**
+         * Gets the page coordinates of the event.
+         * @return {Array} The xy values like [x, y]
+         */
+        getXY : function(){
+            return this.xy;
+        },
+
+        /**
+         * Gets the target for the event.
+         * @param {String} selector (optional) A simple selector to filter the target or look for an ancestor of the target
+         * @param {Number/String/HTMLElement/Element} maxDepth (optional) The max depth to
+                search as a number or element (defaults to 10 || document.body)
+         * @param {Boolean} returnEl (optional) True to return a Ext.Element object instead of DOM node
+         * @return {HTMLelement}
+         */
+        getTarget : function(selector, maxDepth, returnEl){
+            return selector ? Ext.fly(this.target).findParent(selector, maxDepth, returnEl) : this.target;
+        },
+        /**
+         * Gets the related target.
+         * @return {HTMLElement}
+         */
+        getRelatedTarget : function(){
+            if(this.browserEvent){
+                return E.getRelatedTarget(this.browserEvent);
+            }
+            return null;
+        },
+
+        /**
+         * Normalizes mouse wheel delta across browsers
+         * @return {Number} The delta
+         */
+        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, meta, shift or alt key was pressed during this event.
+         * @return {Boolean}
+         */
+        hasModifier : function(){
+            return ((this.ctrlKey || this.altKey) || this.shiftKey) ? true : false;
+        },
+
+        /**
+         * Returns true if the target of this event equals el or is a child of el
+         * @param {String/HTMLElement/Element} el
+         * @param {Boolean} related (optional) true to test if the related target is within el instead of the target
+         * @return {Boolean}
+         */
+        within : function(el, related){
+            var t = this[related ? "getRelatedTarget" : "getTarget"]();
+            return t && Ext.fly(el).contains(t);
+        },
+
+        getPoint : function(){
+            return new Ext.lib.Point(this.xy[0], this.xy[1]);
+        }
+    };
+
+    return new Ext.EventObjectImpl();
+}();
+            
+    

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.BasicDialog.html b/www/extras/yui-ext/docs/output/Ext.BasicDialog.html new file mode 100644 index 000000000..ceb69d487 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.BasicDialog.html @@ -0,0 +1,1554 @@ + + + + Ext.BasicDialog + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.BasicDialog

+ + + + + + +
Package:Ext
Class:BasicDialog
Extends:Observable
Subclasses:LayoutDialog
Defined In:BasicDialog.js
+
+ Lightweight Dialog Class. The code below shows the creation of a typical dialog using existing HTML markup: +
var dlg = new Ext.BasicDialog("my-dlg", {
+        height: 200,
+        width: 300,
+        minHeight: 100,
+        minWidth: 150,
+        modal: true,
+        proxyDrag: true,
+        shadow: true
+    });
+    dlg.addKeyListener(27, dlg.hide, dlg); // ESC can also close the dialog
+    dlg.addButton('OK', dlg.hide, dlg);    // Could call a save function instead of hiding
+    dlg.addButton('Cancel', dlg.hide, dlg);
+    dlg.show();
+ A Dialog should always be a direct child of the body element.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 body : Ext.ElementBasicDialog
The body element
 buttons : ArrayBasicDialog
Array of all the buttons that have been added to this dialog via addButton
 footer : Ext.ElementBasicDialog
The footer element
 header : Ext.ElementBasicDialog
The header element
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 BasicDialog(String/HTMLElement/Ext.Element el, Object config)BasicDialog
Create a new BasicDialog.
 addButton(String/Object config, Function handler, [Object scope]) : Ext.ButtonBasicDialog
Adds a button to the footer section of the dialog.
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addKeyListener(Number/Array/Object key, Function fn, [Object scope]) : Ext.BasicDialogBasicDialog
Adds a key listener for when this dialog is displayed. This allows you to hook in a function that will be +executed i...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 alignTo(String/HTMLElement/Ext.Element element, String position, [Array offsets]) : Ext.BasicDialogBasicDialog
Aligns the dialog to the specified element
 anchorTo(String/HTMLElement/Ext.Element element, String position, [Array offsets], [Boolean/Number monitorScroll]) : Ext.BasicDialogBasicDialog
Anchors an element to another element and realigns it when the window is resized.
 center() : Ext.BasicDialogBasicDialog
Centers this dialog in the viewport
 collapse() : voidBasicDialog
Collapses the dialog to its minimized state (only the title bar is visible). +Equivalent to the user clicking the coll...
 destroy([Boolean removeEl]) : voidBasicDialog
Destroys this dialog and all its supporting elements (including any tabs, shim, +shadow, proxy, mask, etc.) Also remo...
 expand() : voidBasicDialog
Expands a collapsed dialog back to its normal state. Equivalent to the user +clicking the expand dialog button.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus() : voidBasicDialog
Focuses the dialog. If a defaultButton is set, it will receive focus, otherwise the +dialog itself will receive focus.
 getEl() : Ext.ElementBasicDialog
Returns the element for this dialog
 getTabs() : Ext.TabPanelBasicDialog
Returns the TabPanel component (creates it if it doesn't exist). +Note: If you wish to simply check for the existence ...
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide([Function callback]) : Ext.BasicDialogBasicDialog
Hides the dialog.
 initTabs() : Ext.TabPanelBasicDialog
Reinitializes the tabs component, clearing out old tabs and finding new ones.
 isVisible() : BooleanBasicDialog
Returns true if the dialog is visible
 moveTo(Number x, Number y) : Ext.BasicDialogBasicDialog
Moves the dialog's top-left corner to the specified point
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 resizeTo(Number width, Number height) : Ext.BasicDialogBasicDialog
Resizes the dialog.
 restoreState() : Ext.BasicDialogBasicDialog
Restores the previous state of the dialog if Ext.state is configured.
 setContentSize(Number width, Number height) : Ext.BasicDialogBasicDialog
Resizes the dialog to fit the specified content size.
 setDefaultButton(Ext.BasicDialog.Button btn) : Ext.BasicDialogBasicDialog
Sets the default button to be focused when the dialog is displayed.
 setTitle(String text) : Ext.BasicDialogBasicDialog
Sets the dialog title text
 show([String/HTMLElement/Ext.Element animateTarget]) : Ext.BasicDialogBasicDialog
Shows the dialog.
 toBack() : Ext.BasicDialogBasicDialog
Sends this dialog to the back (under) of any other visible dialogs
 toFront() : Ext.BasicDialogBasicDialog
Brings this dialog to the front of any other visible dialogs
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

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

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 animateTarget : String/ElementBasicDialog
Id or element from which the dialog should animate while opening (defaults to null with no animation)
 autoCreate : Boolean/DomHelperBasicDialog
True to auto create from scratch, or using a DomHelper Object (defaults to false)
 autoScroll : BooleanBasicDialog
True to allow the dialog body contents to overflow and display scrollbars (defaults to false)
 autoTabs : BooleanBasicDialog
If true, all elements with class 'x-dlg-tab' will get automatically converted to tabs (defaults to false)
 buttonAlign : StringBasicDialog
Valid values are "left," "center" and "right" (defaults to "right")
 closable : BooleanBasicDialog
False to remove the built-in top-right corner close button (defaults to true)
 collapsible : BooleanBasicDialog
False to remove the built-in top-right corner collapse button (defaults to true)
 constraintoviewport : BooleanBasicDialog
True to keep the dialog constrained within the visible viewport boundaries (defaults to true)
 draggable : BooleanBasicDialog
False to disable dragging of the dialog within the viewport (defaults to true)
 fixedcenter : BooleanBasicDialog
True to ensure that anytime the dialog is shown or resized it gets centered (defaults to false)
 height : NumberBasicDialog
Height of the dialog in pixels (can also be set via CSS). Determined by browser if unspecified.
 minButtonWidth : NumberBasicDialog
Minimum width of all dialog buttons (defaults to 75)
 minHeight : NumberBasicDialog
The minimum allowable height for a resizable dialog (defaults to 80)
 minWidth : NumberBasicDialog
The minimum allowable width for a resizable dialog (defaults to 200)
 modal : BooleanBasicDialog
True to show the dialog modally, preventing user interaction with the rest of the page (defaults to false)
 proxyDrag : BooleanBasicDialog
True to drag a lightweight proxy element rather than the dialog itself, used when draggable = true (defaults to false)
 resizable : BooleanBasicDialog
False to disable manual dialog resizing (defaults to true)
 resizeHandles : StringBasicDialog
Which resize handles to display - see the Ext.Resizable handles config property for valid values (defaults to 'all')
 shadow : Boolean/StringBasicDialog
True or "sides" for the default effect, "frame" for 4-way shadow, and "drop" for bottom-right shadow (defaults to false)
 shadowOffset : NumberBasicDialog
The number of pixels to offset the shadow if displayed (defaults to 5)
 shim : BooleanBasicDialog
True to create an iframe shim that prevents selects from showing through (defaults to false)
 syncHeightBeforeShow : BooleanBasicDialog
True to cause the dimensions to be recalculated before the dialog is shown (defaults to false)
 tabTag : StringBasicDialog
The tag name of tab elements, used when autoTabs = true (defaults to 'div')
 title : StringBasicDialog
Default text to display in the title bar (defaults to null)
 width : NumberBasicDialog
Width of the dialog in pixels (can also be set via CSS). Determined by browser if unspecified.
 x : NumberBasicDialog
The default top page coordinate of the dialog (defaults to center screen)
 y : NumberBasicDialog
The default left page coordinate of the dialog (defaults to center screen)
+

Property Details

+
+ +
+

body

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

buttons

+ public Array buttons +
+ Array of all the buttons that have been added to this dialog via addButton
+
This property is defined by BasicDialog.
+
+ +
+

footer

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

header

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

Constructor Details

+
+
+

BasicDialog

+ public function BasicDialog(String/HTMLElement/Ext.Element el, Object config) +
+ Create a new BasicDialog.
+ Parameters: +
  • el : String/HTMLElement/Ext.Element
    The container element or DOM node, or its id
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addButton

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

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addKeyListener

+ public function addKeyListener(Number/Array/Object key, Function fn, [Object scope]) +
+ Adds a key listener for when this dialog is displayed. This allows you to hook in a function that will be +executed in response to a particular key being pressed while the dialog is active. +
+ 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: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

alignTo

+ public function alignTo(String/HTMLElement/Ext.Element element, String position, [Array offsets]) +
+ Aligns the dialog to the specified element +
+ Parameters: +
  • element : String/HTMLElement/Ext.Element
    The element to align to.
  • position : String
    The position to align to (see Ext.Element.alignTo for more details).
  • offsets : Array
    (optional) Offset the positioning by [x, y]
+ Returns: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

anchorTo

+ public function anchorTo(String/HTMLElement/Ext.Element element, String position, [Array offsets], [Boolean/Number monitorScroll]) +
+ Anchors an element to another element and realigns it when the window is resized. +
+ Parameters: +
  • element : String/HTMLElement/Ext.Element
    The element to align to.
  • position : String
    The position to align to (see Ext.Element.alignTo for more details)
  • offsets : Array
    (optional) Offset the positioning by [x, y]
  • monitorScroll : Boolean/Number
    (optional) true to monitor body scroll and reposition. If this parameter is a number, it is used as the buffer delay (defaults to 50ms).
+ Returns: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

center

+ public function center() +
+ Centers this dialog in the viewport +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

collapse

+ public function collapse() +
+ Collapses the dialog to its minimized state (only the title bar is visible). +Equivalent to the user clicking the collapse dialog button. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

destroy

+ public function destroy([Boolean removeEl]) +
+ Destroys this dialog and all its supporting elements (including any tabs, shim, +shadow, proxy, mask, etc.) Also removes all event listeners. +
+ Parameters: +
  • removeEl : Boolean
    (optional) true to remove the element from the DOM
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

expand

+ public function expand() +
+ Expands a collapsed dialog back to its normal state. Equivalent to the user +clicking the expand dialog button. +
+ Parameters: +
  • None.
+ 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.
+
+ +
+

focus

+ public function focus() +
+ Focuses the dialog. If a defaultButton is set, it will receive focus, otherwise the +dialog itself will receive focus. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

getEl

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

getTabs

+ public function getTabs() +
+ Returns the TabPanel component (creates it if it doesn't exist). +Note: If you wish to simply check for the existence of tabs without creating them, +check for a null 'tabs' property. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.TabPanel
    The tabs component
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

initTabs

+ public function initTabs() +
+ Reinitializes the tabs component, clearing out old tabs and finding new ones. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.TabPanel
    The tabs component
  • +
+
+
+
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's top-left corner to the specified point +
+ Parameters: +
  • x : Number
  • y : Number
+ Returns: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

resizeTo

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

restoreState

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

setContentSize

+ public function setContentSize(Number width, Number height) +
+ Resizes the dialog to fit the specified content size. +
+ Parameters: +
  • width : Number
  • height : Number
+ Returns: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

setDefaultButton

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

setTitle

+ public function setTitle(String text) +
+ Sets the dialog title text +
+ Parameters: +
  • text : String
    The title text to display
+ Returns: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

show

+ public function show([String/HTMLElement/Ext.Element animateTarget]) +
+ Shows the dialog. +
+ Parameters: +
  • animateTarget : String/HTMLElement/Ext.Element
    (optional) Reset the animation target
+ Returns: +
    +
  • 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: +
    +
  • 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: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

beforehide

+ public event beforehide +
+ Fires before this dialog is hidden. +
+ Subscribers will be called with the following parameters: +
  • this : 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 : 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 : 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 : Ext.BasicDialog
  • e : 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 : 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 : 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 : Ext.BasicDialog
+
+
+
This event is defined by BasicDialog.
+
+
+

Config Details

+
+ +
+

animateTarget

+ animateTarget : String/Element +
+ Id or element from which the dialog should animate while opening (defaults to null with no animation)
+
This config option is defined by BasicDialog.
+
+ +
+

autoCreate

+ autoCreate : Boolean/DomHelper +
+ True to auto create from scratch, or using a DomHelper Object (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

autoScroll

+ autoScroll : Boolean +
+ True to allow the dialog body contents to overflow and display scrollbars (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

autoTabs

+ autoTabs : Boolean +
+ If true, all elements with class 'x-dlg-tab' will get automatically converted to tabs (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

buttonAlign

+ buttonAlign : String +
+ Valid values are "left," "center" and "right" (defaults to "right")
+
This config option is defined by BasicDialog.
+
+ +
+

closable

+ closable : Boolean +
+ False to remove the built-in top-right corner close button (defaults to true)
+
This config option is defined by BasicDialog.
+
+ +
+

collapsible

+ collapsible : Boolean +
+ False to remove the built-in top-right corner collapse button (defaults to true)
+
This config option is defined by BasicDialog.
+
+ +
+

constraintoviewport

+ constraintoviewport : Boolean +
+ True to keep the dialog constrained within the visible viewport boundaries (defaults to true)
+
This config option is defined by BasicDialog.
+
+ +
+

draggable

+ draggable : Boolean +
+ False to disable dragging of the dialog within the viewport (defaults to true)
+
This config option is defined by BasicDialog.
+
+ +
+

fixedcenter

+ fixedcenter : Boolean +
+ True to ensure that anytime the dialog is shown or resized it gets centered (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

height

+ height : Number +
+ Height of the dialog in pixels (can also be set via CSS). Determined by browser if unspecified.
+
This config option is defined by BasicDialog.
+
+ +
+

minButtonWidth

+ minButtonWidth : Number +
+ Minimum width of all dialog buttons (defaults to 75)
+
This config option is defined by BasicDialog.
+
+ +
+

minHeight

+ minHeight : Number +
+ The minimum allowable height for a resizable dialog (defaults to 80)
+
This config option is defined by BasicDialog.
+
+ +
+

minWidth

+ minWidth : Number +
+ The minimum allowable width for a resizable dialog (defaults to 200)
+
This config option is defined by BasicDialog.
+
+ +
+

modal

+ modal : Boolean +
+ True to show the dialog modally, preventing user interaction with the rest of the page (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

proxyDrag

+ proxyDrag : Boolean +
+ True to drag a lightweight proxy element rather than the dialog itself, used when draggable = true (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

resizable

+ resizable : Boolean +
+ False to disable manual dialog resizing (defaults to true)
+
This config option is defined by BasicDialog.
+
+ +
+

resizeHandles

+ resizeHandles : String +
+ Which resize handles to display - see the Ext.Resizable handles config property for valid values (defaults to 'all')
+
This config option is defined by BasicDialog.
+
+ +
+

shadow

+ shadow : Boolean/String +
+ True or "sides" for the default effect, "frame" for 4-way shadow, and "drop" for bottom-right shadow (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

shadowOffset

+ shadowOffset : Number +
+ The number of pixels to offset the shadow if displayed (defaults to 5)
+
This config option is defined by BasicDialog.
+
+ +
+

shim

+ shim : Boolean +
+ True to create an iframe shim that prevents selects from showing through (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

syncHeightBeforeShow

+ syncHeightBeforeShow : Boolean +
+ True to cause the dimensions to be recalculated before the dialog is shown (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

tabTag

+ tabTag : String +
+ The tag name of tab elements, used when autoTabs = true (defaults to 'div')
+
This config option is defined by BasicDialog.
+
+ +
+

title

+ title : String +
+ Default text to display in the title bar (defaults to null)
+
This config option is defined by BasicDialog.
+
+ +
+

width

+ width : Number +
+ Width of the dialog in pixels (can also be set via CSS). Determined by browser if unspecified.
+
This config option is defined by BasicDialog.
+
+ +
+

x

+ x : Number +
+ The default top page coordinate of the dialog (defaults to center screen)
+
This config option is defined by BasicDialog.
+
+ +
+

y

+ y : Number +
+ The default left page coordinate of the dialog (defaults to center screen)
+
This config option is defined by BasicDialog.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.BasicLayoutRegion.html b/www/extras/yui-ext/docs/output/Ext.BasicLayoutRegion.html new file mode 100644 index 000000000..e8dfd6620 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.BasicLayoutRegion.html @@ -0,0 +1,776 @@ + + + + Ext.BasicLayoutRegion + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.BasicLayoutRegion

+ + + + + + +
Package:Ext
Class:BasicLayoutRegion
Extends:Observable
Subclasses:LayoutRegion
Defined In:BasicLayoutRegion.js
+
+ This class represents a lightweight region in a layout manager. This region does not move dom nodes +and does not have a titlebar, tabs or any other features. All it does is size and position +panels. To create a BasicLayoutRegion, add lightweight:true or basic:true to your regions config.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 panels : Ext.util.MixedCollectionBasicLayoutRegion
A collection of panels in this region.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 add(ContentPanel... panel) : Ext.ContentPanelBasicLayoutRegion
Add the passed ContentPanel(s)
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getActivePanel() : Ext.ContentPanelBasicLayoutRegion
Get the active panel for this region.
 getEl() : Ext.ElementBasicLayoutRegion
Returns the container element for this region.
 getPanel(Number/String/ContentPanel panel) : Ext.ContentPanelBasicLayoutRegion
Returns the panel specified or null if it's not in this region.
 getPosition() : StringBasicLayoutRegion
Returns this regions position (north/south/east/west/center).
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hasPanel(Number/String/ContentPanel panel) : BooleanBasicLayoutRegion
Returns true if the panel is in this region.
 isVisible() : BooleanBasicLayoutRegion
Returns true if this region is currently visible.
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 remove(Number/String/ContentPanel panel, Boolean preservePanel) : Ext.ContentPanelBasicLayoutRegion
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) : voidBasicLayoutRegion
Resizes the region to the specified size. For vertical regions (west, east) this adjusts +the width, for horizontal (...
 showPanel(Number/String/ContentPanel panelId) : Ext.ContentPanelBasicLayoutRegion
Show the specified panel.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeremove : (Ext.LayoutRegion this, Ext.ContentPanel panel, Object e)BasicLayoutRegion
Fires before a panel is removed (or closed). To cancel the removal set "e.cancel = true" on the event argument.
 collapsed : (Ext.LayoutRegion this)BasicLayoutRegion
Fires when this region is collapsed.
 expanded : (Ext.LayoutRegion this)BasicLayoutRegion
Fires when this region is expanded.
 invalidated : (Ext.LayoutRegion this)BasicLayoutRegion
Fires when the layout for this region is changed.
 panelactivated : (Ext.LayoutRegion this, Ext.ContentPanel panel)BasicLayoutRegion
Fires when a panel is activated.
 paneladded : (Ext.LayoutRegion this, Ext.ContentPanel panel)BasicLayoutRegion
Fires when a panel is added.
 panelremoved : (Ext.LayoutRegion this, Ext.ContentPanel panel)BasicLayoutRegion
Fires when a panel is removed.
 resized : (Ext.LayoutRegion this, Number newSize)BasicLayoutRegion
Fires when the user resizes this region.
 slidehide : (Ext.LayoutRegion this)BasicLayoutRegion
Fires when this region slides out of view.
 slideshow : (Ext.LayoutRegion this)BasicLayoutRegion
Fires when this region is slid into view.
 visibilitychange : (Ext.LayoutRegion this, Boolean visibility)BasicLayoutRegion
Fires when this region is shown or hidden
+

Property Details

+
+ +
+

panels

+ public Ext.util.MixedCollection panels +
+ A collection of panels in this region.
+
This property is defined by BasicLayoutRegion.
+
+
+ + +

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: +
    +
  • Ext.ContentPanel
    The panel added (if only one was added)
  • +
+
+
+
This method is defined by BasicLayoutRegion.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

getActivePanel

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

getEl

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

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: +
    +
  • Ext.ContentPanel
  • +
+
+
+
This method is defined by BasicLayoutRegion.
+
+ +
+

getPosition

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

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

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 BasicLayoutRegion.
+
+ +
+

isVisible

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

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

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: +
    +
  • Ext.ContentPanel
    The panel that was removed
  • +
+
+
+
This method is defined by BasicLayoutRegion.
+
+ +
+

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 BasicLayoutRegion.
+
+ +
+

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: +
    +
  • Ext.ContentPanel
    The shown panel or null
  • +
+
+
+
This method is defined by BasicLayoutRegion.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

beforeremove

+ public event beforeremove +
+ Fires before a panel is removed (or closed). To cancel the removal set "e.cancel = true" on the event argument. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.LayoutRegion
  • panel : Ext.ContentPanel
    The panel
  • e : Object
    The cancel event object
+
+
+
This event is defined by BasicLayoutRegion.
+
+ +
+

collapsed

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

expanded

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

invalidated

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

panelactivated

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

paneladded

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

panelremoved

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

resized

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

slidehide

+ public event slidehide +
+ Fires when this region slides out of view. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.LayoutRegion
+
+
+
This event is defined by BasicLayoutRegion.
+
+ +
+

slideshow

+ public event slideshow +
+ Fires when this region is slid into view. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.LayoutRegion
+
+
+
This event is defined by BasicLayoutRegion.
+
+ +
+

visibilitychange

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

Class Ext.BorderLayout

+ + + + + + +
Package:Ext
Class:BorderLayout
Extends:LayoutManager
Subclasses:ReaderLayout
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 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 = 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();
+ +The container the layout is rendered into can be either the body element or any other element. +If it is not the body element, the element needs to either be an absolute positioned element, +or you will need to add "position:relative" to the css of the element.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 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, Ext.ContentPanel panel) : Ext.ContentPanelBorderLayout
Adds a ContentPanel (or subclass) to this layout.
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 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
 endUpdate(Boolean noLayout) : voidLayoutManager
Restore auto-layouts and optionally disable the manager from performing a layout
 findPanel(String panelId) : 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() : Ext.ElementLayoutManager
Returns the element this layout is bound to.
 getRegion(String target) : 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 ...
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 isUpdating() : BooleanLayoutManager
Returns true if this layout is currently being updated
 layout() : voidBorderLayout
Performs a layout update.
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 remove(String target, Number/String/Ext.ContentPanel panel) : Ext.ContentPanelBorderLayout
Remove a ContentPanel (or subclass) to this layout.
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 restoreState([Ext.state.Provider provider]) : voidBorderLayout
Restores this layouts state using Ext.state.Manager or the state provided by the passed provider.
 showPanel(String/ContentPanel panelId) : Ext.ContentPanelBorderLayout
Searches all regions for a panel with the specified id and activates (shows) it.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 layout : (Ext.LayoutManager this)LayoutManager
Fires when a layout is performed.
 regioncollapsed : (Ext.LayoutRegion region)LayoutManager
Fires when a region is collapsed.
 regionexpanded : (Ext.LayoutRegion region)LayoutManager
Fires when a region is expanded.
 regionresized : (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.
+
+
+ + +

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, 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 : Ext.ContentPanel
    The panel to add
+ Returns: +
    +
  • Ext.ContentPanel
    The added panel
  • +
+
+
+
This method is defined by BorderLayout.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ 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.
+
+ +
+

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: +
    +
  • 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: +
    +
  • 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: +
    +
  • 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.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

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.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

remove

+ public function remove(String target, Number/String/Ext.ContentPanel panel) +
+ Remove a ContentPanel (or subclass) to this layout. +
+ Parameters: +
  • target : String
    The target region key (north, south, east, west or center).
  • panel : Number/String/Ext.ContentPanel
    The index, id or panel to remove
+ Returns: +
    +
  • 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([Ext.state.Provider provider]) +
+ Restores this layouts state using Ext.state.Manager or the state provided by the passed provider. +
+ Parameters: +
  • provider : 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: +
    +
  • Ext.ContentPanel
    The shown panel or null
  • +
+
+
+
This method is defined by BorderLayout.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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 : 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 : 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 : 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 : Ext.LayoutRegion
  • newSize : Number
    The new size (width for east/west, height for north/south)
+
+
+
This event is defined by LayoutManager.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.Button.html b/www/extras/yui-ext/docs/output/Ext.Button.html new file mode 100644 index 000000000..66bdbe272 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.Button.html @@ -0,0 +1,1006 @@ + + + + Ext.Button + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.Button

+ + + + + + +
Package:Ext
Class:Button
Extends:Observable
Subclasses:MenuButton, Toolbar.Button
Defined In:Button.js
+
+ Simple Button class
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : BooleanButton
Read-only. True if this button is disabled
 hidden : BooleanButton
Read-only. True if this button is hidden
 pressed : BooleanButton
Read-only. True if this button is pressed (only if enableToggle = true)
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Button(String/HTMLElement/Element renderTo, Object config)Button
Create a new button
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 destroy() : voidButton
Destroys this Button and removes any listeners.
 disable() : voidButton
Disable this button
 enable() : voidButton
Enable this button
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus() : voidButton
Focus the button
 getEl() : Ext.ElementButton
Returns the button's underlying element
 getText() : StringButton
Gets the text for this button
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidButton
Hide this button
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 setDisabled(Boolean enabled) : voidButton
Convenience function for boolean enable/disable
 setHandler(Function handler, [Object scope]) : voidButton
Assigns this button's click handler
 setText(String text) : voidButton
Sets this button's text
 setVisible(Boolean visible) : voidButton
Convenience function for boolean show/hide
 show() : voidButton
Show this button
 toggle([Boolean state]) : voidButton
If a state it passed, it becomes the pressed state otherwise the current state is toggled.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 click : (Button this, EventObject e)Button
Fires when this button is clicked
 mouseout : (Button this, Event e)Button
Fires when the mouse exits the button
 mouseover : (Button this, Event e)Button
Fires when the mouse hovers over the button
 toggle : (Button this, Boolean pressed)Button
Fires when the "pressed" state of this button changes (only if enableToggle = true)
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 disabled : BooleanButton
True to start disabled (defaults to false)
 enableToggle : BooleanButton
True to enable pressed/not pressed toggling (defaults to false)
 handler : FunctionButton
A function called when the button is clicked (can be used instead of click event)
 hidden : BooleanButton
True to start hidden (defaults to false)
 icon : StringButton
The path to an image to display in the button (the image will be set as the background-image CSS property of the butt...
 menu : MixedButton
Standard menu attribute consisting of a reference to a menu object, a menu id or a menu config blob
 menuAlign : StringButton
The position to align the menu to (see Ext.Element.alignTo for more details, defaults to 'tl-bl?').
 minWidth : NumberButton
The minimum width for this button (used to give a set of buttons a common width)
 pressed : BooleanButton
True to start pressed (only if enableToggle = true)
 repeat : Boolean/ObjectButton
True to repeat fire the click event while the mouse is down. This can also be an Ext.util.ClickRepeater config object...
 scope : ObjectButton
The scope of the handler
 text : StringButton
The button text
 toggleGroup : StringButton
The group this toggle button is a member of (only 1 per group can be pressed, only applies if enableToggle = true)
 tooltip : String/ObjectButton
The tooltip for the button - can be a string or QuickTips config object
 tooltipType : StringButton
The type of tooltip to use. Either "qtip" for QuickTips or "title" for title attribute.
+

Property Details

+
+ +
+

disabled

+ public Boolean disabled +
+ Read-only. True if this button is disabled
+
This property is defined by Button.
+
+ +
+

hidden

+ public Boolean hidden +
+ Read-only. True if this button is hidden
+
This property is defined by Button.
+
+ +
+

pressed

+ public Boolean pressed +
+ Read-only. True if this button is pressed (only if enableToggle = true)
+
This property is defined by Button.
+
+
+ + +

Constructor Details

+
+
+

Button

+ public function Button(String/HTMLElement/Element renderTo, Object config) +
+ Create a new button
+ Parameters: +
  • renderTo : String/HTMLElement/Element
    The element to append the button to
  • config : Object
    The config object
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

destroy

+ public function destroy() +
+ Destroys this Button and removes any listeners. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Button.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

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

getEl

+ public function getEl() +
+ Returns the button's underlying element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Button.
+
+ +
+

getText

+ public function getText() +
+ Gets the text for this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    The button text
  • +
+
+
+
This method is defined by Button.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean enabled) +
+ Convenience function for boolean enable/disable +
+ Parameters: +
  • enabled : Boolean
    True to enable, false to disable
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Button.
+
+ +
+

setHandler

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

setText

+ public function setText(String text) +
+ Sets this button's text +
+ Parameters: +
  • text : String
    The button text
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by 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 Button.
+
+ +
+

show

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

toggle

+ public function toggle([Boolean state]) +
+ If a state it passed, it becomes the pressed state otherwise the current state is toggled. +
+ Parameters: +
  • state : Boolean
    (optional) Force a particular state
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Button.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

click

+ public event click +
+ Fires when this button is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Button
  • e : EventObject
    The click event
+
+
+
This event is defined by Button.
+
+ +
+

mouseout

+ public event mouseout +
+ Fires when the mouse exits the button +
+ Subscribers will be called with the following parameters: +
  • this : Button
  • e : Event
    The event object
+
+
+
This event is defined by Button.
+
+ +
+

mouseover

+ public event mouseover +
+ Fires when the mouse hovers over the button +
+ Subscribers will be called with the following parameters: +
  • this : Button
  • e : Event
    The event object
+
+
+
This event is defined by Button.
+
+ +
+

toggle

+ public event toggle +
+ Fires when the "pressed" state of this button changes (only if enableToggle = true) +
+ Subscribers will be called with the following parameters: +
  • this : Button
  • pressed : Boolean
+
+
+
This event is defined by Button.
+
+
+

Config Details

+
+ +
+

disabled

+ disabled : Boolean +
+ True to start disabled (defaults to false)
+
This config option is defined by Button.
+
+ +
+

enableToggle

+ enableToggle : Boolean +
+ True to enable pressed/not pressed toggling (defaults to false)
+
This config option is defined by Button.
+
+ +
+

handler

+ handler : Function +
+ A function called when the button is clicked (can be used instead of click event)
+
This config option is defined by Button.
+
+ +
+

hidden

+ hidden : Boolean +
+ True to start hidden (defaults to false)
+
This config option is defined by Button.
+
+ +
+

icon

+ icon : String +
+ The path to an image to display in the button (the image will be set as the background-image CSS property of the button by default, so if you want a mixed icon/text button, set cls:"x-btn-text-icon")
+
This config option is defined by Button.
+
+ +
+

menu

+ menu : Mixed +
+ Standard menu attribute consisting of a reference to a menu object, a menu id or a menu config blob
+
This config option is defined by Button.
+
+ +
+

menuAlign

+ menuAlign : String +
+ The position to align the menu to (see Ext.Element.alignTo for more details, defaults to 'tl-bl?').
+
This config option is defined by Button.
+
+ +
+

minWidth

+ minWidth : Number +
+ The minimum width for this button (used to give a set of buttons a common width)
+
This config option is defined by Button.
+
+ +
+

pressed

+ pressed : Boolean +
+ True to start pressed (only if enableToggle = true)
+
This config option is defined by Button.
+
+ +
+

repeat

+ repeat : Boolean/Object +
+ True to repeat fire the click event while the mouse is down. This can also be an Ext.util.ClickRepeater config object (defaults to false).
+
This config option is defined by Button.
+
+ +
+

scope

+ scope : Object +
+ The scope of the handler
+
This config option is defined by Button.
+
+ +
+

text

+ text : String +
+ The button text
+
This config option is defined by Button.
+
+ +
+

toggleGroup

+ toggleGroup : String +
+ The group this toggle button is a member of (only 1 per group can be pressed, only applies if enableToggle = true)
+
This config option is defined by Button.
+
+ +
+

tooltip

+ tooltip : String/Object +
+ The tooltip for the button - can be a string or QuickTips config object
+
This config option is defined by Button.
+
+ +
+

tooltipType

+ tooltipType : String +
+ The type of tooltip to use. Either "qtip" for QuickTips or "title" for title attribute.
+
This config option is defined by Button.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.ColorPalette.html b/www/extras/yui-ext/docs/output/Ext.ColorPalette.html new file mode 100644 index 000000000..25bfd18dd --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.ColorPalette.html @@ -0,0 +1,973 @@ + + + + Ext.ColorPalette + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.ColorPalette

+ + + + + +
Package:Ext
Class:ColorPalette
Extends:Component
Defined In:ColorPalette.js
+
+ Simple color palette class for choosing colors. The palette can be rendered to any container.
+Here's an example of typical usage: +
var cp = new Ext.ColorPalette({value:'993300'});  // initial selected color
+cp.render('my-div');
+
+cp.on('select', function(palette, selColor){
+    // do something with selColor
+});
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 colors : ArrayColorPalette
An array of 6-digit color hex code strings (without the # symbol). This array can contain any number +of colors, and ...
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 ColorPalette(Object config)ColorPalette
Create a new ColorPalette
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isVisible() : voidComponent
Returns true if this component is visible
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 select(String color) : voidColorPalette
Selects the specified color in the palette (fires the select event)
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 hide : (Ext.Component this)Component
Fires after the component is hidden
 render : (Ext.Component this)Component
Fires after the component is rendered
 select : (ColorPalette this, String color)ColorPalette
Fires when a color is selected
 show : (Ext.Component this)Component
Fires after the component is shown
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 itemCls : StringColorPalette
The CSS class to apply to the containing element (defaults to "x-color-palette")
 value : StringColorPalette
The initial color to highlight (should be a valid 6-digit color hex code without the # symbol). Note that the hex cod...
+

Property Details

+
+ +
+

colors

+ public Array colors +
+

An array of 6-digit color hex code strings (without the # symbol). This array can contain any number +of colors, and each hex code should be unique. The width of the palette is controlled via CSS by adjusting +the width property of the 'x-color-palette' class (or assigning a custom class), so you can balance the number +of colors with the width setting until the box is symmetrical.

+

You can override individual colors if needed:

+

+var cp = new Ext.ColorPalette();
+cp.colors[0] = "FF0000";  // change the first box to red
+
+ +Or you can provide a custom array of your own for complete control: +

+var cp = new Ext.ColorPalette();
+cp.colors = ["000000", "993300", "333300"];
+
+
This property is defined by ColorPalette.
+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

ColorPalette

+ public function ColorPalette(Object config) +
+ Create a new ColorPalette
+ Parameters: +
  • config : Object
    The config object
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

select

+ public function select(String color) +
+ Selects the specified color in the palette (fires the select event) +
+ Parameters: +
  • color : String
    A valid 6-digit color hex code (# will be stripped if included)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ColorPalette.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

select

+ public event select +
+ Fires when a color is selected +
+ Subscribers will be called with the following parameters: +
  • this : ColorPalette
  • color : String
    The 6-digit color hex code (without the # symbol)
+
+
+
This event is defined by ColorPalette.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+
+

Config Details

+
+ +
+

itemCls

+ itemCls : String +
+ The CSS class to apply to the containing element (defaults to "x-color-palette")
+
This config option is defined by ColorPalette.
+
+ +
+

value

+ value : String +
+ The initial color to highlight (should be a valid 6-digit color hex code without the # symbol). Note that the hex codes are case-sensitive.
+
This config option is defined by ColorPalette.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.Component.html b/www/extras/yui-ext/docs/output/Ext.Component.html new file mode 100644 index 000000000..f45cf586d --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.Component.html @@ -0,0 +1,846 @@ + + + + Ext.Component + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.Component

+ + + + + + +
Package:Ext
Class:Component
Extends:Observable
Subclasses:ColorPalette, DatePicker, Editor, Field, Layout, BaseItem
Defined In:Component.js
+
+ Base class for all Ext form controls that provides a common set of events and functionality shared by all components.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Component(Ext.Element/String/Object config)Component
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isVisible() : voidComponent
Returns true if this component is visible
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 hide : (Ext.Component this)Component
Fires after the component is hidden
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

Component

+ public function Component(Ext.Element/String/Object config) +
+
+ Parameters: +
  • config : Ext.Element/String/Object
    The configuration options. If an element is passed, it is set as the internal element and its id used as the component id. If a string is passed, it is assumed to be the id of an existing element and is used as the component id. Otherwise, it is assumed to be a standard config object and is applied to the component.
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.ComponentMgr.html b/www/extras/yui-ext/docs/output/Ext.ComponentMgr.html new file mode 100644 index 000000000..534af7692 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.ComponentMgr.html @@ -0,0 +1,104 @@ + + + + Ext.ComponentMgr + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.ComponentMgr

+ + + + + +
Package:Ext
Class:ComponentMgr
Extends:Object
Defined In:Component.js
+
+ Provides a common registry of all components on a page so that they can be easily accessed by component id.

This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 get(String id) : voidComponentMgr
Returns a component by id
 onAvailable(String id, Funtction fn, Object scope) : voidComponentMgr
Registers a function that will be called when a specified component is added to ComponentMgr
+ +

Public Events

+
This class has no public events.
+ +

Method Details

+
+ +
+

get

+ public function get(String id) +
+ Returns a component by id +
+ Parameters: +
  • id : String
    The component id
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ComponentMgr.
+
+ +
+

onAvailable

+ public function onAvailable(String id, Funtction fn, Object scope) +
+ Registers a function that will be called when a specified component is added to ComponentMgr +
+ Parameters: +
  • id : String
    The component id
  • fn : Funtction
    The callback function
  • scope : Object
    The scope of the callback
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ComponentMgr.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.CompositeElement.html b/www/extras/yui-ext/docs/output/Ext.CompositeElement.html new file mode 100644 index 000000000..78e8eb1cc --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.CompositeElement.html @@ -0,0 +1,142 @@ + + + + Ext.CompositeElement + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.CompositeElement

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

+NOTE: Although they are not listed, this class supports all of the set/update methods of Ext.Element. All 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 = 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);
+
+ Properties +   -  Methods +   -  Events +
+ +

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.
 item(Number index) : Ext.ElementCompositeElement
Returns the Element object at the specified index
+ +

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.
+
+ +
+

item

+ public function item(Number index) +
+ Returns the Element object at the specified index +
+ Parameters: +
  • index : Number
+ Returns: +
    +
  • Ext.Element
  • +
+
+
+
This method is defined by CompositeElement.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.CompositeElementLite.html b/www/extras/yui-ext/docs/output/Ext.CompositeElementLite.html new file mode 100644 index 000000000..9adf78947 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.CompositeElementLite.html @@ -0,0 +1,135 @@ + + + + Ext.CompositeElementLite + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.CompositeElementLite

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

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

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]) : CompositeElementCompositeElementLite
Calls the passed function passing (el, this, index) for each element in this composite. The element +passed is the fly...
 item(Number index) : Ext.ElementCompositeElementLite
Returns a flyweight Element of the dom element object at the specified index
+ +

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. The element +passed is the flyweight (shared) Ext.Element instance, so if you require a +a reference to the dom node, use el.dom. +
+ 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 CompositeElementLite.
+
+ +
+

item

+ public function item(Number index) +
+ Returns a flyweight Element of the dom element object at the specified index +
+ Parameters: +
  • index : Number
+ Returns: +
    +
  • Ext.Element
  • +
+
+
+
This method is defined by CompositeElementLite.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.ContentPanel.html b/www/extras/yui-ext/docs/output/Ext.ContentPanel.html new file mode 100644 index 000000000..147cad12b --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.ContentPanel.html @@ -0,0 +1,874 @@ + + + + Ext.ContentPanel + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.ContentPanel

+ + + + + + +
Package:Ext
Class:ContentPanel
Extends:Observable
Subclasses:GridPanel, NestedLayoutPanel
Defined In:ContentPanels.js
+
+ A basic ContentPanel element.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

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.
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 destroy() : voidContentPanel
Destroys this panel
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getEl() : Ext.ElementContentPanel
Returns this panel's element
 getId() : StringContentPanel
Returns this panel's id
 getTitle() : StringContentPanel
Returns this panel's title
 getToolbar() : Ext.ToolbarContentPanel
Returns the toolbar for this Panel if one was configured.
 getUpdateManager() : Ext.UpdateManagerContentPanel
Get the Ext.UpdateManager for this panel. Enables you to perform Ajax updates.
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 isClosable() : BooleanContentPanel
Returns true is this panel was configured to be closable
 load(Object/String/Function url, [String/Object params], [Function callback], [Boolean discardUrl]) : Ext.ContentPanelContentPanel
Loads this content panel immediately with content from XHR. Note: to delay loading until the panel is activated, use ...
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 refresh() : voidContentPanel
Force a content refresh from the URL specified in the setUrl() method. +Will fail silently if the setUrl method has no...
 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]) : Ext.UpdateManagerContentPanel
Set a URL to be used to load the content for this panel. When this panel is activated, the content will be loaded fro...
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 activate : (Ext.ContentPanel this)ContentPanel
Fires when this panel is activated.
 deactivate : (Ext.ContentPanel this)ContentPanel
Fires when this panel is activated.
 resize : (Ext.ContentPanel this, Number width, Number height)ContentPanel
Fires when this panel is resized if fitToFrame is true.
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 adjustments : ArrayContentPanel
Values to add to the width/height when doing a fitToFrame (default is [0, 0])
 autoCreate : Boolean/ObjectContentPanel
True to auto generate the DOM element for this panel, or a DomHelper config of the element to create
 autoScroll : BooleanContentPanel
True to scroll overflow in this panel (use with fitToFrame)
 background : BooleanContentPanel
True if the panel should not be activated when it is added (defaults to false)
 closable : BooleanContentPanel
True if the panel can be closed/removed
 fitContainer : BooleanContentPanel
When using fitToFrame and resizeEl, you can also fit the parent container (defaults to false)
 fitToFrame : BooleanContentPanel
True for this panel to adjust its size to fit when the region resizes (defaults to false)
 loadOnce : BooleanContentPanel
Calls When used with "url", calls setUrl() with this value
 params : String/ObjectContentPanel
When used with "url", calls setUrl() with this value
 resizeEl : String/HTMLElement/ElementContentPanel
An element to resize if fitToFrame is true (instead of this panel's element)
 title : StringContentPanel
The title for this panel
 toolbar : ToolbarContentPanel
A toolbar for this panel
 url : StringContentPanel
Calls setUrl() with this value
+ + +

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

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
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: +
    +
  • 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: +
    +
  • Ext.Toolbar
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

getUpdateManager

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

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

isClosable

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

load

+ public function load(Object/String/Function url, [String/Object params], [Function callback], [Boolean discardUrl]) +
+ Loads this content panel immediately with content from XHR. Note: to delay loading until the panel is activated, use setUrl. +
+ 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:
     panel.load({
    url: "your-url.php",
    params: {param1: "foo", param2: "bar"}, // or a URL encoded string
    callback: yourFunction,
    scope: yourObject, //(optional scope)
    discardUrl: false,
    nocache: false,
    text: "Loading...",
    timeout: 30,
    scripts: 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 panel 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, oResponse)
  • 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: +
    +
  • Ext.ContentPanel
    this
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

refresh

+ public function refresh() +
+ Force a content refresh from the URL specified in the setUrl() method. +Will fail silently if the setUrl method has not been called. +This does not activate the panel, just updates its content. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

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. When this panel is activated, the content will be loaded from that URL. +
+ 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 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: +
    +
  • Ext.UpdateManager
    The UpdateManager
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

activate

+ public event activate +
+ Fires when this panel is activated. +
+ Subscribers will be called with the following parameters: +
  • this : 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 : Ext.ContentPanel
+
+
+
This event is defined by ContentPanel.
+
+ +
+

resize

+ public event resize +
+ Fires when this panel is resized if fitToFrame is true. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.ContentPanel
  • width : Number
    The width after any component adjustments
  • height : Number
    The height after any component adjustments
+
+
+
This event is defined by ContentPanel.
+
+
+

Config Details

+
+ +
+

adjustments

+ adjustments : Array +
+ Values to add to the width/height when doing a fitToFrame (default is [0, 0])
+
This config option is defined by ContentPanel.
+
+ +
+

autoCreate

+ autoCreate : Boolean/Object +
+ True to auto generate the DOM element for this panel, or a DomHelper config of the element to create
+
This config option is defined by ContentPanel.
+
+ +
+

autoScroll

+ autoScroll : Boolean +
+ True to scroll overflow in this panel (use with fitToFrame)
+
This config option is defined by ContentPanel.
+
+ +
+

background

+ background : Boolean +
+ True if the panel should not be activated when it is added (defaults to false)
+
This config option is defined by ContentPanel.
+
+ +
+

closable

+ closable : Boolean +
+ True if the panel can be closed/removed
+
This config option is defined by ContentPanel.
+
+ +
+

fitContainer

+ fitContainer : Boolean +
+ When using fitToFrame and resizeEl, you can also fit the parent container (defaults to false)
+
This config option is defined by ContentPanel.
+
+ +
+

fitToFrame

+ fitToFrame : Boolean +
+ True for this panel to adjust its size to fit when the region resizes (defaults to false)
+
This config option is defined by ContentPanel.
+
+ +
+

loadOnce

+ loadOnce : Boolean +
+ Calls When used with "url", calls setUrl() with this value
+
This config option is defined by ContentPanel.
+
+ +
+

params

+ params : String/Object +
+ When used with "url", calls setUrl() with this value
+
This config option is defined by ContentPanel.
+
+ +
+

resizeEl

+ resizeEl : String/HTMLElement/Element +
+ An element to resize if fitToFrame is true (instead of this panel's element)
+
This config option is defined by ContentPanel.
+
+ +
+

title

+ title : String +
+ The title for this panel
+
This config option is defined by ContentPanel.
+
+ +
+

toolbar

+ toolbar : Toolbar +
+ A toolbar for this panel
+
This config option is defined by ContentPanel.
+
+ +
+

url

+ url : String +
+ Calls setUrl() with this value
+
This config option is defined by ContentPanel.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.DatePicker.html b/www/extras/yui-ext/docs/output/Ext.DatePicker.html new file mode 100644 index 000000000..598246544 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.DatePicker.html @@ -0,0 +1,1216 @@ + + + + Ext.DatePicker + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.DatePicker

+ + + + + +
Package:Ext
Class:DatePicker
Extends:Component
Defined In:DatePicker.js
+
+ Simple date picker class.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 DatePicker(Object config)DatePicker
Create a new DatePicker
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 getValue() : DateDatePicker
Gets the current selected value of the date field
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isVisible() : voidComponent
Returns true if this component is visible
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setValue(Date value) : voidDatePicker
Sets the value of the date field
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 hide : (Ext.Component this)Component
Fires after the component is hidden
 render : (Ext.Component this)Component
Fires after the component is rendered
 select : (DatePicker this, Date date)DatePicker
Fires when a date is selected
 show : (Ext.Component this)Component
Fires after the component is shown
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 constrainToViewport : BooleanDatePicker
True to constrain the date picker to the viewport (defaults to true)
 dayNames : ArrayDatePicker
An array of textual day names which can be overriden for localization support (defaults to Date.dayNames)
 disabledDatesRE : RegExpDatePicker
JavaScript regular expression used to disable a pattern of dates (defaults to null)
 disabledDatesText : StringDatePicker
The tooltip text to display when the date falls on a disabled date (defaults to "")
 disabledDays : ArrayDatePicker
An array of days to disable, 0-based. For example, [0, 6] disables Sunday and Saturday (defaults to null).
 disabledDaysText : StringDatePicker
The tooltip to display when the date falls on a disabled day (defaults to "")
 format : StringDatePicker
The default date format string which can be overriden for localization support. The format must be valid according to...
 maxDate : DateDatePicker
Maximum allowable date (JavaScript date object, defaults to null)
 maxText : StringDatePicker
The error text to display if the maxDate validation fails (defaults to "This date is after the maximum date")
 minDate : DateDatePicker
Minimum allowable date (JavaScript date object, defaults to null)
 minText : StringDatePicker
The error text to display if the minDate validation fails (defaults to "This date is before the minimum date")
 monthNames : ArrayDatePicker
An array of textual month names which can be overriden for localization support (defaults to Date.monthNames)
 monthYearText : StringDatePicker
The header month selector tooltip (defaults to 'Choose a month (Control+Up/Down to move years)')
 nextText : StringDatePicker
The next month navigation button tooltip (defaults to 'Next Month (Control+Right)')
 prevText : StringDatePicker
The previous month navigation button tooltip (defaults to 'Previous Month (Control+Left)')
 startDay : NumberDatePicker
Day index at which the week should begin, 0-based (defaults to 0, which is Sunday)
 todayText : StringDatePicker
The text to display on the button that selects the current date (defaults to "Today")
 todayTip : StringDatePicker
The tooltip to display for the button that selects the current date (defaults to "{current date} (Spacebar)")
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

DatePicker

+ public function DatePicker(Object config) +
+ Create a new DatePicker
+ Parameters: +
  • config : Object
    The config object
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getValue

+ public function getValue() +
+ Gets the current selected value of the date field +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Date
    The selected date
  • +
+
+
+
This method is defined by DatePicker.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setValue

+ public function setValue(Date value) +
+ Sets the value of the date field +
+ Parameters: +
  • value : Date
    The date to set
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DatePicker.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

select

+ public event select +
+ Fires when a date is selected +
+ Subscribers will be called with the following parameters: +
  • this : DatePicker
  • date : Date
    The selected date
+
+
+
This event is defined by DatePicker.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+
+

Config Details

+
+ +
+

constrainToViewport

+ constrainToViewport : Boolean +
+ True to constrain the date picker to the viewport (defaults to true)
+
This config option is defined by DatePicker.
+
+ +
+

dayNames

+ dayNames : Array +
+ An array of textual day names which can be overriden for localization support (defaults to Date.dayNames)
+
This config option is defined by DatePicker.
+
+ +
+

disabledDatesRE

+ disabledDatesRE : RegExp +
+ JavaScript regular expression used to disable a pattern of dates (defaults to null)
+
This config option is defined by DatePicker.
+
+ +
+

disabledDatesText

+ disabledDatesText : String +
+ The tooltip text to display when the date falls on a disabled date (defaults to "")
+
This config option is defined by DatePicker.
+
+ +
+

disabledDays

+ disabledDays : Array +
+ An array of days to disable, 0-based. For example, [0, 6] disables Sunday and Saturday (defaults to null).
+
This config option is defined by DatePicker.
+
+ +
+

disabledDaysText

+ disabledDaysText : String +
+ The tooltip to display when the date falls on a disabled day (defaults to "")
+
This config option is defined by DatePicker.
+
+ +
+

format

+ format : String +
+ The default date format string which can be overriden for localization support. The format must be valid according to Date.parseDate (defaults to 'm/d/y').
+
This config option is defined by DatePicker.
+
+ +
+

maxDate

+ maxDate : Date +
+ Maximum allowable date (JavaScript date object, defaults to null)
+
This config option is defined by DatePicker.
+
+ +
+

maxText

+ maxText : String +
+ The error text to display if the maxDate validation fails (defaults to "This date is after the maximum date")
+
This config option is defined by DatePicker.
+
+ +
+

minDate

+ minDate : Date +
+ Minimum allowable date (JavaScript date object, defaults to null)
+
This config option is defined by DatePicker.
+
+ +
+

minText

+ minText : String +
+ The error text to display if the minDate validation fails (defaults to "This date is before the minimum date")
+
This config option is defined by DatePicker.
+
+ +
+

monthNames

+ monthNames : Array +
+ An array of textual month names which can be overriden for localization support (defaults to Date.monthNames)
+
This config option is defined by DatePicker.
+
+ +
+

monthYearText

+ monthYearText : String +
+ The header month selector tooltip (defaults to 'Choose a month (Control+Up/Down to move years)')
+
This config option is defined by DatePicker.
+
+ +
+

nextText

+ nextText : String +
+ The next month navigation button tooltip (defaults to 'Next Month (Control+Right)')
+
This config option is defined by DatePicker.
+
+ +
+

prevText

+ prevText : String +
+ The previous month navigation button tooltip (defaults to 'Previous Month (Control+Left)')
+
This config option is defined by DatePicker.
+
+ +
+

startDay

+ startDay : Number +
+ Day index at which the week should begin, 0-based (defaults to 0, which is Sunday)
+
This config option is defined by DatePicker.
+
+ +
+

todayText

+ todayText : String +
+ The text to display on the button that selects the current date (defaults to "Today")
+
This config option is defined by DatePicker.
+
+ +
+

todayTip

+ todayTip : String +
+ The tooltip to display for the button that selects the current date (defaults to "{current date} (Spacebar)")
+
This config option is defined by DatePicker.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.DialogManager.html b/www/extras/yui-ext/docs/output/Ext.DialogManager.html new file mode 100644 index 000000000..219dee2b5 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.DialogManager.html @@ -0,0 +1,180 @@ + + + + Ext.DialogManager + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.DialogManager

+ + + + + +
Package:Ext
Class:DialogManager
Extends:Object
Defined In:BasicDialog.js
+
+ Provides global access to BasicDialogs that have been created and +support for z-indexing (layering) multiple open dialogs.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 zseed : NumberDialogManager
The starting z-index for BasicDialogs (defaults to 9000)
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 bringToFront(String/Object dlg) : Ext.BasicDialogDialogManager
Brings the specified dialog to the front
 get(String/Object id) : Ext.BasicDialogDialogManager
Gets a registered dialog by id
 hideAll() : voidDialogManager
Hides all dialogs
 sendToBack(String/Object dlg) : Ext.BasicDialogDialogManager
Sends the specified dialog to the back
+ +

Public Events

+
This class has no public events.

Property Details

+
+ +
+

zseed

+ public Number zseed +
+ The starting z-index for BasicDialogs (defaults to 9000)
+
This property is defined by DialogManager.
+
+
+ + +

Method Details

+
+ +
+

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: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by DialogManager.
+
+ +
+

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: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by DialogManager.
+
+ +
+

hideAll

+ public function hideAll() +
+ Hides all dialogs +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DialogManager.
+
+ +
+

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: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by DialogManager.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.DomHelper.html b/www/extras/yui-ext/docs/output/Ext.DomHelper.html new file mode 100644 index 000000000..cf32a5a0e --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.DomHelper.html @@ -0,0 +1,305 @@ + + + + Ext.DomHelper + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.DomHelper

+ + + + + +
Package: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.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

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

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 append(String/HTMLElement/Element 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) : Ext.DomHelper.TemplateDomHelper
Creates a new Ext.DomHelper.Template from the Dom object spec
 insertAfter(String/HTMLElement/Element el, Object o, [Boolean returnElement]) : HTMLElementDomHelper
Creates new Dom element(s) and inserts them after el
 insertBefore(String/HTMLElement/Element el, Object o, [Boolean returnElement]) : HTMLElementDomHelper
Creates new Dom element(s) and inserts them before el
 insertFirst(String/HTMLElement/Element el, Object o, [Boolean returnElement]) : HTMLElementDomHelper
Creates new Dom element(s) and inserts them as the first child of el
 insertHtml(String where, HTMLElement el, String html) : HTMLElementDomHelper
Inserts an HTML fragment into the Dom
 markup(Object o) : StringDomHelper
Returns the markup for the passed Element(s) config
 overwrite(String/HTMLElement/Element 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(String/HTMLElement/Element el, Object o, [Boolean returnElement]) +
+ Creates new Dom element(s) and appends them to el +
+ Parameters: +
  • el : String/HTMLElement/Element
    The context element
  • o : Object
    The Dom object spec (and children)
  • returnElement : Boolean
    (optional) true to return a 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 Ext.DomHelper.Template from the Dom object spec +
+ Parameters: +
  • o : Object
    The Dom object spec (and children)
+ Returns: +
    +
  • Ext.DomHelper.Template
    The new template
  • +
+
+
+
This method is defined by DomHelper.
+
+ +
+

insertAfter

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

insertBefore

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

insertFirst

+ public function insertFirst(String/HTMLElement/Element el, Object o, [Boolean returnElement]) +
+ Creates new Dom element(s) and inserts them as the first child of el +
+ Parameters: +
  • el : String/HTMLElement/Element
    The context element
  • o : Object
    The Dom object spec (and children)
  • returnElement : Boolean
    (optional) true to return a 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.
+
+ +
+

markup

+ public function markup(Object o) +
+ Returns the markup for the passed Element(s) config +
+ Parameters: +
  • o : Object
    The Dom object spec (and children)
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by DomHelper.
+
+ +
+

overwrite

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

Class Ext.DomQuery

+ + + + + +
Package:Ext
Class:DomQuery
Extends:Object
Defined In:DomQuery.js
+
+ * +Provides high performance selector/xpath processing by compiling queries into reusable functions. +New pseudo classes and matchers can be plugged. It works on HTML and XML documents (if a content node is passed in).

This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 matchers : ObjectDomQuery
Collection of matching regular expressions and code snippets.
 operators : ObjectDomQuery
Collection of operator comparison functions. The default operators are =, !=, ^=, $=, *= and %=. +New operators can be...
 pseudos : ObjectDomQuery
Collection of "pseudo class" processors. Each processor is passed the current nodeset (array) +and the argument (if an...
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 compile(String selector, [String type]) : FunctionDomQuery
Compiles a selector/xpath query into a reusable function. The returned function +takes one parameter "root" (optional)...
 filter(Array el, String selector, Boolean nonMatches) : ArrayDomQuery
Filters an array of elements to only include matches of a simple selector (e.g. div.some-class or span:first-child)
 is(String/HTMLElement/Array el, String selector) : BooleanDomQuery
Returns true if the passed element(s) match the passed simple selector (e.g. div.some-class or span:first-child)
 select(String selector, [Node root]) : ArrayDomQuery
Selects a group of elements.
 selectNode(String selector, [Node root]) : ElementDomQuery
Selects a single element.
 selectNumber(String selector, [Node root], Number defaultValue) : NumberDomQuery
Selects the value of a node, parsing integers and floats.
 selectValue(String selector, [Node root], String defaultValue) : voidDomQuery
Selects the value of a node, optionally replacing null with the defaultValue.
+ +

Public Events

+
This class has no public events.

Property Details

+
+ +
+

matchers

+ public Object matchers +
+ Collection of matching regular expressions and code snippets.
+
This property is defined by DomQuery.
+
+ +
+

operators

+ public Object operators +
+ Collection of operator comparison functions. The default operators are =, !=, ^=, $=, *= and %=. +New operators can be added as long as the match the format c= where c is any character other than space, > <.
+
This property is defined by DomQuery.
+
+ +
+

pseudos

+ public Object pseudos +
+ Collection of "pseudo class" processors. Each processor is passed the current nodeset (array) +and the argument (if any) supplied in the selector.
+
This property is defined by DomQuery.
+
+
+ + +

Method Details

+
+ +
+

compile

+ public function compile(String selector, [String type]) +
+ Compiles a selector/xpath query into a reusable function. The returned function +takes one parameter "root" (optional), which is the context node from where the query should start. +
+ Parameters: +
  • selector : String
    The selector/xpath query
  • type : String
    (optional) Either "select" (the default) or "simple" for a simple selector match
+ Returns: +
    +
  • Function
  • +
+
+
+
This method is defined by DomQuery.
+
+ +
+

filter

+ public function filter(Array el, String selector, Boolean nonMatches) +
+ Filters an array of elements to only include matches of a simple selector (e.g. div.some-class or span:first-child) +
+ Parameters: +
  • el : Array
    An array of elements to filter
  • selector : String
    The simple selector to test
  • nonMatches : Boolean
    If true, it returns the elements that DON'T match the selector instead of the ones that match
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by DomQuery.
+
+ +
+

is

+ public function is(String/HTMLElement/Array el, String selector) +
+ Returns true if the passed element(s) match the passed simple selector (e.g. div.some-class or span:first-child) +
+ Parameters: +
  • el : String/HTMLElement/Array
    An element id, element or array of elements
  • selector : String
    The simple selector to test
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by DomQuery.
+
+ +
+

select

+ public function select(String selector, [Node root]) +
+ Selects a group of elements. +
+ Parameters: +
  • selector : String
    The selector/xpath query
  • root : Node
    (optional) The start of the query (defaults to document).
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by DomQuery.
+
+ +
+

selectNode

+ public function selectNode(String selector, [Node root]) +
+ Selects a single element. +
+ Parameters: +
  • selector : String
    The selector/xpath query
  • root : Node
    (optional) The start of the query (defaults to document).
+ Returns: +
    +
  • Element
  • +
+
+
+
This method is defined by DomQuery.
+
+ +
+

selectNumber

+ public function selectNumber(String selector, [Node root], Number defaultValue) +
+ Selects the value of a node, parsing integers and floats. +
+ Parameters: +
  • selector : String
    The selector/xpath query
  • root : Node
    (optional) The start of the query (defaults to document).
  • defaultValue : Number
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by DomQuery.
+
+ +
+

selectValue

+ public function selectValue(String selector, [Node root], String defaultValue) +
+ Selects the value of a node, optionally replacing null with the defaultValue. +
+ Parameters: +
  • selector : String
    The selector/xpath query
  • root : Node
    (optional) The start of the query (defaults to document).
  • defaultValue : String
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DomQuery.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.Editor.html b/www/extras/yui-ext/docs/output/Ext.Editor.html new file mode 100644 index 000000000..eef8d04e0 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.Editor.html @@ -0,0 +1,1216 @@ + + + + Ext.Editor + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.Editor

+ + + + + +
Package:Ext
Class:Editor
Extends:Component
Defined In:Editor.js
+
+ A base editor field that handles displaying/hiding on demand and has some built-in sizing and event handling logic.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Editor(Object config)Editor
Create a new Editor
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 cancelEdit(Boolean remainVisible) : voidEditor
Cancels the editing process and hides the editor without persisting any changes. The field value will be +reverted to...
 completeEdit(Boolean remainVisible) : voidEditor
Ends the editing process, persist the changed value to the underlying field and hides the editor.
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 getValue() : MixedEditor
Gets the data value of the editor
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isVisible() : voidComponent
Returns true if this component is visible
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 realign() : voidEditor
Realigns the editor to the bound field based on the current alignment config value.
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setSize(Number width, Number height) : voidEditor
Sets the height and width of this editor
 setValue(Mixed value) : voidEditor
Sets the data value of the editor
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforecomplete : (Editor this, Mixed value, Mixed startValue)Editor
Fires after a change has been made to the field, but before the change is reflected in the underlying +field. Saving ...
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 beforestartedit : (Editor this, Ext.Element boundEl, Mixed value)Editor
Fires when editing is initiated, but before the value changes. Editing can be canceled by returning +false from the h...
 complete : (Editor this, Mixed value, Mixed startValue)Editor
Fires after editing is complete and any changed value has been written to the underlying field.
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 hide : (Ext.Component this)Component
Fires after the component is hidden
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
 specialkey : ()Editor
Fires when special key is pressed
 startedit : (Ext.Element boundEl, Mixed value)Editor
Fires when this editor is displayed
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 alignment : StringEditor
The position to align to (see Ext.Element.alignTo for more details, defaults to "c-c?").
 autosize : Boolean/StringEditor
True for the editor to automatically adopt the size of the underlying field, "width" to adopt the width only, or "hei...
 ignoreNoChange : BooleanEditor
True to skip the the edit completion process (no save, no events fired) if the user completes an edit and the value h...
 revertInvalid : BooleanEditor
True to automatically revert the field value and cancel the edit when the user completes an edit and the field valida...
 shadow : Boolean/StringEditor
"sides" for sides/bottom only, "frame" for 4-way shadow, and "drop" for bottom-right shadow (defaults to "frame")
 value : MixedEditor
The data value of the underlying field (defaults to "")
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

Editor

+ public function Editor(Object config) +
+ Create a new Editor
+ Parameters: +
  • config : Object
    The config object
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

cancelEdit

+ public function cancelEdit(Boolean remainVisible) +
+ Cancels the editing process and hides the editor without persisting any changes. The field value will be +reverted to the original starting value. +
+ Parameters: +
  • remainVisible : Boolean
    Override the default behavior and keep the editor visible after cancel (defaults to false)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Editor.
+
+ +
+

completeEdit

+ public function completeEdit(Boolean remainVisible) +
+ Ends the editing process, persist the changed value to the underlying field and hides the editor. +
+ Parameters: +
  • remainVisible : Boolean
    Override the default behavior and keep the editor visible after edit (defaults to false)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Editor.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getValue

+ public function getValue() +
+ Gets the data value of the editor +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Mixed
    value The data value
  • +
+
+
+
This method is defined by Editor.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

realign

+ public function realign() +
+ Realigns the editor to the bound field based on the current alignment config value. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Editor.
+
+ +
+

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([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setSize

+ public function setSize(Number width, Number height) +
+ Sets the height and width of this editor +
+ Parameters: +
  • width : Number
    The new width
  • height : Number
    The new height
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Editor.
+
+ +
+

setValue

+ public function setValue(Mixed value) +
+ Sets the data value of the editor +
+ Parameters: +
  • value : Mixed
    Any valid value supported by the underlying field
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Editor.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

beforecomplete

+ public event beforecomplete +
+ Fires after a change has been made to the field, but before the change is reflected in the underlying +field. Saving the change to the field can be canceled by returning false from the handler of this event. +Note that if the value has not changed and ignoreNoChange = true, the editing will still end but this +event will not fire since no edit actually occurred. +
+ Subscribers will be called with the following parameters: +
  • this : Editor
  • value : Mixed
    The current field value
  • startValue : Mixed
    The original field value
+
+
+
This event is defined by Editor.
+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforestartedit

+ public event beforestartedit +
+ Fires when editing is initiated, but before the value changes. Editing can be canceled by returning +false from the handler of this event. +
+ Subscribers will be called with the following parameters: +
  • this : Editor
  • boundEl : Ext.Element
    The underlying element bound to this editor
  • value : Mixed
    The field value being set
+
+
+
This event is defined by Editor.
+
+ +
+

complete

+ public event complete +
+ Fires after editing is complete and any changed value has been written to the underlying field. +
+ Subscribers will be called with the following parameters: +
  • this : Editor
  • value : Mixed
    The current field value
  • startValue : Mixed
    The original field value
+
+
+
This event is defined by Editor.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

specialkey

+ public event specialkey +
+ Fires when special key is pressed +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Editor.
+
+ +
+

startedit

+ public event startedit +
+ Fires when this editor is displayed +
+ Subscribers will be called with the following parameters: +
  • boundEl : Ext.Element
    The underlying element bound to this editor
  • value : Mixed
    The starting field value
+
+
+
This event is defined by Editor.
+
+
+

Config Details

+
+ +
+

alignment

+ alignment : String +
+ The position to align to (see Ext.Element.alignTo for more details, defaults to "c-c?").
+
This config option is defined by Editor.
+
+ +
+

autosize

+ autosize : Boolean/String +
+ True for the editor to automatically adopt the size of the underlying field, "width" to adopt the width only, or "height" to adopt the height only (defaults to false)
+
This config option is defined by Editor.
+
+ +
+

ignoreNoChange

+ ignoreNoChange : Boolean +
+ True to skip the the edit completion process (no save, no events fired) if the user completes an edit and the value has not changed (defaults to false). Applies only to string values - edits for other data types will never be ignored.
+
This config option is defined by Editor.
+
+ +
+

revertInvalid

+ revertInvalid : Boolean +
+ True to automatically revert the field value and cancel the edit when the user completes an edit and the field validation fails (defaults to true)
+
This config option is defined by Editor.
+
+ +
+

shadow

+ shadow : Boolean/String +
+ "sides" for sides/bottom only, "frame" for 4-way shadow, and "drop" for bottom-right shadow (defaults to "frame")
+
This config option is defined by Editor.
+
+ +
+

value

+ value : Mixed +
+ The data value of the underlying field (defaults to "")
+
This config option is defined by Editor.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.Element.html b/www/extras/yui-ext/docs/output/Ext.Element.html new file mode 100644 index 000000000..dab531b03 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.Element.html @@ -0,0 +1,3603 @@ + + + + Ext.Element + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.Element

+ + + + + + +
Package:Ext
Class:Element
Extends:Object
Subclasses:Layer
Defined In:Element.js
+
+ Represents an Element in the DOM.

+Usage:
+
var el = Ext.get("my-div");
+
+// or with getEl
+var el = getEl("my-div");
+
+// or with a DOM element
+var el = Ext.get(myDivElement);
+Using Ext.get() or getEl() instead of calling the constructor directly ensures you get the same object +each call instead of constructing a new one.

+Animations
+Many of the functions for manipulating an element have an optional "animate" parameter. The animate parameter +should either be a boolean (true) or an object literal with animation options. The animation options are: +
+Option    Default   Description
+--------- --------  ---------------------------------------------
+duration  .35       The duration of the animation in seconds
+easing    easeOut   The YUI easing method
+callback  none      A function to execute when the anim completes
+scope     this      The scope (this) of the callback function
+
+Also, the Anim object being used for the animation will be set on your options object as "anim", which allows you to stop or +manipulate the animation. Here's an example: +

+var el = Ext.get("my-div");
+
+// no animation
+el.setWidth(100);
+
+// default animation
+el.setWidth(100, true);
+
+// animation with some options set
+el.setWidth(100, {
+    duration: 1, 
+    callback: this.foo, 
+    scope: this
+});
+
+// using the "anim" property to get the Anim object
+var opt = {
+    duration: 1, 
+    callback: this.foo, 
+    scope: this
+};
+el.setWidth(100, opt);
+...
+if(opt.anim.isAnimated()){
+    opt.anim.stop();
+}
+
+ Composite (Collections of) Elements
+For working with collections of Elements, see Ext.CompositeElement
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 Element.DISPLAY : NumberElement
<static> Visibility mode constant - Use display to hide element
 Element.VISIBILITY : NumberElement
<static> Visibility mode constant - Use visibility to hide element
 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.
 Element.fly(String/HTMLElement el, [String named]) : ElementElement
<static> Gets the globally shared flyweight Element, with the passed node as the active element. Do not store a...
 Element.get(String/HTMLElement/Element el) : ElementElement
<static> Static method to retrieve Element objects. Uses simple caching to consistently return the same object....
 addClass(String/Array className) : Ext.ElementElement
Add a CSS class to the element.
 addClassOnClick(String className) : Ext.ElementElement
Sets up event handlers to add and remove a css class when the mouse is down and then up on this element (a click effect)
 addClassOnFocus(String className) : Ext.ElementElement
Sets up event handlers to add and remove a css class when this element has the focus
 addClassOnOver(String className, [Boolean preventFlicker]) : Ext.ElementElement
Sets up event handlers to add and remove a css class when the mouse is over this element
 addKeyListener(Number/Array/Object/String key, Function fn, [Object scope]) : Ext.KeyMapElement
Convenience method for constructing a KeyMap
 addKeyMap(Object config) : Ext.KeyMapElement
Creates a KeyMap for this element
 addListener(String eventName, Function fn, [Object scope], [Object options]) : voidElement
Appends an event handler
 alignTo(String/HTMLElement/Ext.Element element, String position, [Array offsets], [Boolean/Object animate]) : Ext.ElementElement
Aligns this element with another element relative to the specified anchor points. If the other element is the +documen...
 anchorTo(String/HTMLElement/Ext.Element element, String position, [Array offsets], [Boolean/Object animate], [Boolean/Number monitorScroll], ) : voidElement
Anchors an element to another element and realigns it when the window is resized.
 animate(Object args, [Float duration], [Function onComplete], [String easing], [String animType]) : Ext.ElementElement
Perform animation on this element.
 appendChild(String/HTMLElement/Array/Element/CompositeElement el) : Ext.ElementElement
Appends the passed element(s) to this element
 appendTo(String/HTMLElement/Element el) : Ext.ElementElement
Appends this element to the passed element
 applyStyles(String/Object/Function styles) : Ext.ElementElement
More flexible version of setStyle for setting style properties.
 autoHeight([Boolean animate], [Float duration], [Function onComplete], [String easing]) : Ext.ElementElement
Measures the elements content height and updates height to match. Note, this function uses setTimeout and +the new he...
 beginMeasure() : Ext.ElementElement
Temporarily enables offsets (width,height,x,y) for an element with display:none, use endMeasure() when done.
 blur() : Ext.ElementElement
Tries to blur the element. Any exceptions are caught.
 center([String/HTMLElement/Ext.Element centerIn]) : voidElement
Centers the Element in either the viewport, or another Element.
 child(String selector, Boolean returnDom) : ElementElement
Selects a single child based on the passed CSS selector (the selector should not contain an id)
 clean([Boolean forceReclean]) : voidElement
Removes worthless text nodes
 clearOpacity() : Ext.ElementElement
Clears any opacity settings from this element. Required in some cases for IE.
 clearPositioning([String value]) : Ext.ElementElement
Clear positioning back to the default when the document was loaded
 clip() : Ext.ElementElement
Store the current overflow setting and clip overflow on the element - use unclip to remove
 contains(HTMLElement/String el) : BooleanElement
Returns true if this element is an ancestor of the passed element
 createChild(Object config, [HTMLElement insertBefore], [Boolean returnDom]) : 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]) : Ext.ElementElement
Creates a proxy element of this element
 createShim() : Ext.ElementElement
Creates an iframe shim for this element to keep selects and other windowed objects from +showing through.
 down(String selector, Boolean returnDom) : ElementElement
Selects a single *direct* child based on the passed CSS selector (the selector should not contain an id)
 enableDisplayMode([String display]) : Ext.ElementElement
Convenience method for setVisibilityMode(Element.DISPLAY)
 endMeasure() : Ext.ElementElement
Restores displays to before beginMeasure was called
 findParent(String ss, [Number/String/HTMLElement/Element maxDepth], [Boolean returnEl]) : HTMLElementElement
Looks at this node and then at parent nodes for a match of the passed simple selector (e.g. div.some-class or span:fi...
 findParentNode(String ss, [Number/String/HTMLElement/Element maxDepth], [Boolean returnEl]) : HTMLElementElement
Looks at parent nodes for a match of the passed simple selector (e.g. div.some-class or span:first-child)
 fitToParent([Boolean monitorResize], [String/HTMLElment/Element targetParent]) : Ext.ElementElement
Sizes this element to its parent element's dimensions performing +neccessary box adjustments.
 focus() : Ext.ElementElement
Tries to focus the element. Any exceptions are caught.
 getAlignToXY(String/HTMLElement/Ext.Element element, String position, [Array offsets]) : ArrayElement
Gets the x,y coordinates to align this element with another element. See alignTo for more info on the +supported posit...
 getAnchorXY([String anchor], [Object size], [Boolean local]) : ArrayElement
Gets the x,y coordinates specified by the anchor position on the element.
 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() : ArrayElement
Calculates the x, y to center this element on the screen
 getColor(String attr, String defaultValue, [String prefix]) : voidElement
Return the CSS color for the specified CSS attribute. rgb, 3 digit (like #fff) and valid values +are convert to standa...
 getComputedHeight() : NumberElement
Returns either the offsetHeight or the height of this element based on CSS height adjusted by padding or borders +when...
 getComputedWidth() : NumberElement
Returns either the offsetWidth or the width of this element based on CSS width adjusted by padding or borders +when ne...
 getFrameWidth(String sides) : NumberElement
Returns the sum width of the padding and borders for the passed "sides". See getBorderWidth() + for more informat...
 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 performing...
 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. This is not YUI getStyle, it is an optimised version.
 getStyles(String style1, String style2, String etc) : ObjectElement
Get an object with properties matching the styles requested. +e.g. el.getStyles('color', 'font-size', 'width') might r...
 getTop(Boolean local) : NumberElement
Gets the top Y coordinate
 getUpdateManager() : Ext.UpdateManagerElement
Gets this elements UpdateManager
 getValue(Boolean asNumber) : String/NumberElement
Returns the value of the "value" attribute
 getWidth([Boolean contentWidth]) : NumberElement
Returns the offset width of the element
 getX() : NumberElement
Gets the current X position of the element based on page coordinates. Element must be part of the DOM tree to have p...
 getXY() : ArrayElement
Gets the current position of the element based on page coordinates. Element must be part of the DOM tree to have pag...
 getY() : NumberElement
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/Object animate]) : 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) : Ext.dd.DDElement
Initializes a Ext.dd.DD object for this element.
 initDDProxy(String group, Object config, Object overrides) : Ext.dd.DDProxyElement
Initializes a Ext.dd.DDProxy object for this element.
 initDDTarget(String group, Object config, Object overrides) : Ext.dd.DDTargetElement
Initializes a Ext.dd.DDTarget object for this element.
 insertAfter(String/HTMLElement/Element el) : Ext.ElementElement
Inserts this element after the passed element in the DOM
 insertBefore(String/HTMLElement/Element el) : Ext.ElementElement
Inserts this element before the passed element in the DOM
 insertFirst(String/HTMLElement/Element/Object el) : Ext.ElementElement
Inserts (or creates) an element (or DomHelper config) as the first child of the this element
 insertHtml(String where, String html) : HTMLElementElement
Inserts an html fragment into this element
 insertSibling(String/HTMLElement/Element/Object el, [String where], [Boolean returnDom]) : Ext.ElementElement
Inserts (or creates) the passed element (or DomHelper config) as a sibling of this element
 is(String ss) : BooleanElement
Returns true if this element matches the passed simple selector (e.g. div.some-class or span:first-child)
 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"
 isMasked() : BooleanElement
Returns true if this element is masked
 isScrollable() : BooleanElement
Returns true if this element is scrollable.
 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]) : Ext.ElementElement
Direct access to the UpdateManager update() method (takes the same parameters).
 mask([String msg], [String msgCls]) : ElementElement
Puts a mask over this element to disable user interaction. Requires core.css. +This method can only be applied to elem...
 move(String direction, Number distance, [Boolean/Object animate]) : Ext.ElementElement
Move this element relative to its current position.
 moveTo(Number x, Number y, [Boolean/Object animate]) : Ext.ElementElement
Set the position of the element in page coordinates, regardless of how the element is positioned. +The element must be...
 position([String pos], [Number zIndex], [Number x], [Number y]) : voidElement
Initializes positioning on this element. If a desired position is not passed, it will make the +the element positioned...
 query(String selector) : ArrayElement
Selects child nodes based on the passed CSS selector (the selector should not contain an id)
 radioClass(String className) : 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() : Ext.ElementElement
Removes all previous added listeners from this element
 removeClass(String/Array className) : Ext.ElementElement
Removes a CSS class from the element.
 removeListener(String eventName, Function fn) : Ext.ElementElement
Removes an event handler from this element
 repaint() : Ext.ElementElement
Forces the browser to repaint this element
 replace(String/HTMLElement/Element el) : Ext.ElementElement
Replaces the passed element with this element
 replaceClass(String oldClassName, String newClassName) : Ext.ElementElement
Replaces a CSS class on the element with another.
 scroll(String direction, Number distance, [Boolean/Object animate]) : BooleanElement
Scrolls this element the specified direction. Does bounds checking to make sure the scroll is +within this elements s...
 scrollIntoView([String/HTMLElement/Element container], [Boolean hscroll]) : Ext.ElementElement
Scrolls this element into view within the passed container.
 scrollTo(String side, Number value, [Boolean/Object animate]) : ElementElement
Scrolls this element the specified scroll point. It does NOT do bounds checking so if you scroll to a weird value it ...
 select(String selector, Boolean unique) : CompositeElement/CompositeElementLiteElement
Creates a CompositeElement for child nodes based on the passed CSS selector (the selector should not contain an id)
 set(Object o, [Boolean useSet]) : Ext.ElementElement
Sets the passed attributes as attributes of this element (a style attribute can be a string, object or function)
 setBottom(String bottom) : Ext.ElementElement
Set the element's css bottom style
 setBounds(Number x, Number y, Number width, Number height, [Boolean/Object animate]) : 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/Object animate]) : 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) : Ext.ElementElement
Sets the css display. Uses originalDisplay if value is a boolean true.
 setHeight(Number height, [Boolean/Object animate]) : Ext.ElementElement
Set the height of the element
 setLeft(String left) : Ext.ElementElement
Set the element's left position directly using CSS style (instead of setX())
 setLeftTop() : Ext.ElementElement
Quick set left and top adding default units
 setLocation(Number x, Number y, [Boolean/Object animate]) : 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/Object animate]) : Ext.ElementElement
Set the opacity of the element
 setPositioning(Object posCfg) : Ext.ElementElement
Set positioning with an object returned by getPositioning().
 setRegion(Ext.lib.Region region, [Boolean/Object animate]) : Ext.ElementElement
Sets the element's position and size the the specified region. If animation is true then width, height, x and y will ...
 setRight(String right) : Ext.ElementElement
Set the element's css right style
 setSize(Number width, Number height, [Boolean/Object animate]) : 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]) : Ext.ElementElement
Wrapper for setting style properties, also takes single object parameter of multiple styles
 setTop(String top) : Ext.ElementElement
Set the element's top position directly using CSS style (instead of setY())
 setVisibilityMode(visMode Element.VISIBILITY) : 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/Object animate]) : 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/Object animate]) : Ext.ElementElement
Set the width of the element
 setX(Number The, [Boolean/Object animate]) : 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/Object animate]) : 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/Object animate]) : 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/Object animate]) : Ext.ElementElement
Show this element - Uses display mode to determine whether to use "display" or "visibility". See setVisible.
 swallowEvent(String eventName, [Boolean preventDefault]) : Ext.ElementElement
Stops the specified event from bubbling and optionally prevents the default action
 toggle([Boolean/Object animate]) : Ext.ElementElement
Toggles the elements visibility or display, depending on visibility mode.
 toggleClass(String className) : Ext.ElementElement
Toggles (adds or removes) the passed class.
 translatePoints(Number/Array x, Number y, Object An) : voidElement
Translates the passed page coordinates into left/top css values for this element
 unclip() : Ext.ElementElement
Return clipping (overflow) to original clipping before clip() was called
 unmask() : voidElement
Removes a previously applied mask. If removeEl is true the mask overlay is destroyed, otherwise +it is cached for reuse.
 unselectable() : Ext.ElementElement
Disables text selection for this element (normalized across browsers)
 up(String ss, [Number/String/HTMLElement/Element maxDepth]) : Ext.ElementElement
Walks up the dom looking for a parent node that matches the passed simple selector (e.g. div.some-class or span:first...
 update(String html, [Boolean loadScripts], Function callback) : Ext.ElementElement
Update the innerHTML of this element, optionally searching for and processing scripts
 wrap([Object config], [Boolean returnDom]) : /HTMLElementElementElement
Creates and wraps this element with another element
+ +

Public Events

+
This class has no public events.

Property Details

+
+ +
+

Element.DISPLAY

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

Element.VISIBILITY

+ public Number Element.VISIBILITY +
+ <static> Visibility mode constant - Use visibility to hide element
+
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

+
+ +
+

Element.fly

+ public function Element.fly(String/HTMLElement el, [String named]) +
+ <static> Gets the globally shared flyweight Element, with the passed node as the active element. Do not store a reference to this element - +the dom node can be overwritten by other code. +
+ Parameters: +
  • el : String/HTMLElement
    The dom node or id
  • named : String
    (optional) Allows for creation of named reusable flyweights to prevent conflicts (e.g. internally Ext uses "_internal")
+ Returns: +
    +
  • Element
    The shared Element object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

Element.get

+ public function Element.get(String/HTMLElement/Element el) +
+ <static> Static method to retrieve 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 node, a DOM Node or an existing Element.
+ Returns: +
    +
  • Element
    The Element object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addClass

+ public function addClass(String/Array className) +
+ Add a CSS class to the element. +
+ Parameters: +
  • className : String/Array
    The CSS class to add or an array of classes
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addClassOnClick

+ public function addClassOnClick(String className) +
+ Sets up event handlers to add and remove a css class when the mouse is down and then up on this element (a click effect) +
+ Parameters: +
  • className : String
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addClassOnFocus

+ public function addClassOnFocus(String className) +
+ Sets up event handlers to add and remove a css class when this element has the focus +
+ Parameters: +
  • className : String
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addClassOnOver

+ public function addClassOnOver(String className, [Boolean preventFlicker]) +
+ Sets up event handlers to add and remove a css class when the mouse is over this element +
+ Parameters: +
  • className : String
  • preventFlicker : Boolean
    (optional) If set to true, it prevents flickering by filtering mouseout events for children elements
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addKeyListener

+ public function addKeyListener(Number/Array/Object/String key, Function fn, [Object scope]) +
+ Convenience method for constructing a KeyMap +
+ Parameters: +
  • key : Number/Array/Object/String
    Either a string with the keys to listen for, 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: +
    +
  • Ext.KeyMap
    The KeyMap created
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addKeyMap

+ public function addKeyMap(Object config) +
+ Creates a KeyMap for this element +
+ Parameters: +
  • config : Object
    The KeyMap config. See Ext.KeyMap for more details
+ Returns: +
    +
  • Ext.KeyMap
    The KeyMap created
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addListener

+ public function addListener(String eventName, Function fn, [Object scope], [Object options]) +
+ Appends an event handler +
+ Parameters: +
  • eventName : String
    The type of event to append
  • fn : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) of the fn
  • options : Object
    (optional)An object with standard EventManager options
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

alignTo

+ public function alignTo(String/HTMLElement/Ext.Element element, String position, [Array offsets], [Boolean/Object animate]) +
+ Aligns this element with another element relative to the specified anchor points. If the other element is the +document it aligns it to the viewport. +The position parameter is optional, and can be specified in any one of the following formats: +
    +
  • Blank: Defaults to aligning the element"s top-left corner to the target"s bottom-left corner ("tl-bl").
  • +
  • One anchor (deprecated): The passed anchor position is used as the target element's anchor point. +The element being aligned will position its top-left corner (tl) to that point. This method has been +deprecated in favor of the newer two anchor syntax below.
  • +
  • Two anchors: If two values from the table below are passed separated by a dash, the first value is used as the +element"s anchor point, and the second value is used as the target"s anchor point.
  • +
+In addition to the anchor points, the position parameter also supports the "?" character. If "?" is passed at the end of +the position string, the element will attempt to align as specified, but the position will be adjusted to constrain to +the viewport if necessary. Note that the element being aligned might be swapped to align to a different position than +that specified in order to enforce the viewport constraints. +Following are all of the supported anchor positions: +
+Value  Description
+-----  -----------------------------
+tl     The top left corner (default)
+t      The center of the top edge
+tr     The top right corner
+l      The center of the left edge
+c      In the center of the element
+r      The center of the right edge
+bl     The bottom left corner
+b      The center of the bottom edge
+br     The bottom right corner
+
+Example Usage: +

+// align el to other-el using the default positioning ("tl-bl", non-constrained)
+el.alignTo("other-el");
+
+// align the top left corner of el with the top right corner of other-el (constrained to viewport)
+el.alignTo("other-el", "tr?");
+
+// align the bottom right corner of el with the center left edge of other-el
+el.alignTo("other-el", "br-l?");
+
+// align the center of el with the bottom left corner of other-el and
+// adjust the x position by -6 pixels (and the y position by 0)
+el.alignTo("other-el", "c-bl", [-6, 0]);
+
+
+ Parameters: +
  • element : String/HTMLElement/Ext.Element
    The element to align to.
  • position : String
    The position to align to.
  • offsets : Array
    (optional) Offset the positioning by [x, y]
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

anchorTo

+ public function anchorTo(String/HTMLElement/Ext.Element element, String position, [Array offsets], [Boolean/Object animate], [Boolean/Number monitorScroll], ) +
+ Anchors an element to another element and realigns it when the window is resized. +
+ Parameters: +
  • element : String/HTMLElement/Ext.Element
    The element to align to.
  • position : String
    The position to align to.
  • offsets : Array
    (optional) Offset the positioning by [x, y]
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
  • monitorScroll : Boolean/Number
    (optional) true to monitor body scroll and reposition. If this parameter is a number, it is used as the buffer delay (defaults to 50ms).
  • :
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

animate

+ public function animate(Object args, [Float duration], [Function onComplete], [String easing], [String animType]) +
+ Perform 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 : String
    (optional) Easing method to use. (Defaults to 'easeOut')
  • animType : String
    (optional) 'run' is the default. Can be 'color', 'motion', or 'scroll'
+ Returns: +
    +
  • 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: +
    +
  • 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: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

autoHeight

+ public function autoHeight([Boolean animate], [Float duration], [Function onComplete], [String 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 : String
    (optional) Easing method to use.
+ Returns: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

blur

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

center

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

child

+ public function child(String selector, Boolean returnDom) +
+ Selects a single child based on the passed CSS selector (the selector should not contain an id) +
+ Parameters: +
  • selector : String
    The CSS selector
  • returnDom : Boolean
    true to return the DOM node instead of Ext.Element
+ Returns: +
    +
  • Element
    The element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

clean

+ public function clean([Boolean forceReclean]) +
+ Removes worthless text nodes +
+ Parameters: +
  • forceReclean : Boolean
    (optional) By default the element keeps track if it has been cleaned already so you can call this over and over. However, if you update the element and need to force a reclean, you can pass true.
+ 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

clearPositioning

+ public function clearPositioning([String value]) +
+ Clear positioning back to the default when the document was loaded +
+ Parameters: +
  • value : String
    (optional) The value to use for the left,right,top,bottom, defaults to '' (empty string). You could use 'auto'.
+ Returns: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

contains

+ public function contains(HTMLElement/String el) +
+ Returns true if this element is an ancestor of the passed element +
+ Parameters: +
  • el : HTMLElement/String
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Element.
+
+ +
+

createChild

+ public function createChild(Object config, [HTMLElement insertBefore], [Boolean returnDom]) +
+ 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
  • returnDom : Boolean
    (optional) true to return the dom node instead of creating an Element
+ Returns: +
    +
  • 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: +
    +
  • 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: +
    +
  • Ext.Element
    The new shim element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

down

+ public function down(String selector, Boolean returnDom) +
+ Selects a single *direct* child based on the passed CSS selector (the selector should not contain an id) +
+ Parameters: +
  • selector : String
    The CSS selector
  • returnDom : Boolean
    true to return the DOM node instead of Ext.Element
+ Returns: +
    +
  • Element
    The 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

endMeasure

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

findParent

+ public function findParent(String ss, [Number/String/HTMLElement/Element maxDepth], [Boolean returnEl]) +
+ Looks at this node and then at parent nodes for a match of the passed simple selector (e.g. div.some-class or span:first-child) +
+ Parameters: +
  • ss : String
    The simple selector to test
  • maxDepth : Number/String/HTMLElement/Element
    (optional) The max depth to search as a number or element (defaults to 10 || document.body)
  • returnEl : Boolean
    (optional) True to return a Ext.Element object instead of DOM node
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Element.
+
+ +
+

findParentNode

+ public function findParentNode(String ss, [Number/String/HTMLElement/Element maxDepth], [Boolean returnEl]) +
+ Looks at parent nodes for a match of the passed simple selector (e.g. div.some-class or span:first-child) +
+ Parameters: +
  • ss : String
    The simple selector to test
  • maxDepth : Number/String/HTMLElement/Element
    (optional) The max depth to search as a number or element (defaults to 10 || document.body)
  • returnEl : Boolean
    (optional) True to return a Ext.Element object instead of DOM node
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Element.
+
+ +
+

fitToParent

+ public function fitToParent([Boolean monitorResize], [String/HTMLElment/Element targetParent]) +
+ Sizes this element to its parent element's dimensions performing +neccessary box adjustments. +
+ Parameters: +
  • monitorResize : Boolean
    (optional) If true maintains the fit when the browser window is resized.
  • targetParent : String/HTMLElment/Element
    (optional) The target parent, default to the parentNode.
+ Returns: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getAlignToXY

+ public function getAlignToXY(String/HTMLElement/Ext.Element element, String position, [Array offsets]) +
+ Gets the x,y coordinates to align this element with another element. See alignTo for more info on the +supported position values. +
+ Parameters: +
  • element : String/HTMLElement/Ext.Element
    The element to align to.
  • position : String
    The position to align to.
  • offsets : Array
    (optional) Offset the positioning by [x, y]
+ Returns: +
    +
  • Array
    [x, y]
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getAnchorXY

+ public function getAnchorXY([String anchor], [Object size], [Boolean local]) +
+ Gets the x,y coordinates specified by the anchor position on the element. +
+ Parameters: +
  • anchor : String
    (optional) The specified anchor position (defaults to "c"). See alignTo for details on supported anchor positions.
  • size : Object
    (optional) An object containing the size to use for calculating anchor position {width: (target width), height: (target height)} (defaults to the element's current size)
  • local : Boolean
    (optional) True to get the local (element top/left-relative) anchor position instead of page coordinates
+ Returns: +
    +
  • Array
    [x, y] An array containing the element's x and y coordinates
  • +
+
+
+
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() +
+ Calculates the x, y to center this element on the screen +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
    The x, y values [x, y]
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getColor

+ public function getColor(String attr, String defaultValue, [String prefix]) +
+ Return the CSS color for the specified CSS attribute. rgb, 3 digit (like #fff) and valid values +are convert to standard 6 digit hex color. +
+ Parameters: +
  • attr : String
    The css attribute
  • defaultValue : String
    The default value to use when a valid color isn't found
  • prefix : String
    (optional) defaults to #. Use an empty string when working with YUI color anims.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getComputedHeight

+ public function getComputedHeight() +
+ Returns either the offsetHeight or the height of this element based on CSS height adjusted by padding or borders +when needed to simulate offsetHeight when offsets aren't available. This may not work on display:none elements +if a height has not been set using CSS. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getComputedWidth

+ public function getComputedWidth() +
+ Returns either the offsetWidth or the width of this element based on CSS width adjusted by padding or borders +when needed to simulate offsetWidth when offsets aren't available. This may not work on display:none elements +if a width has not been set using CSS. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getFrameWidth

+ public function getFrameWidth(String sides) +
+ Returns the sum width of the padding and borders for the passed "sides". See getBorderWidth() + for more information about the sides. +
+ Parameters: +
  • sides : String
+ Returns: +
    +
  • Number
  • +
+
+
+
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 Ext.lib.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. This is not YUI getStyle, it is an optimised version. +
+ 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.
+
+ +
+

getStyles

+ public function getStyles(String style1, String style2, String etc) +
+ Get an object with properties matching the styles requested. +e.g. el.getStyles('color', 'font-size', 'width') might return +{'color': '#FFFFFF', 'font-size': '13px', 'width': '100px'}. +
+ Parameters: +
  • style1 : String
  • style2 : String
  • etc : String
+ Returns: +
    +
  • Object
  • +
+
+
+
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: +
    +
  • Ext.UpdateManager
    The UpdateManager
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getValue

+ public function getValue(Boolean asNumber) +
+ Returns the value of the "value" attribute +
+ Parameters: +
  • asNumber : Boolean
    true to parse the value as a number
+ Returns: +
    +
  • String/Number
  • +
+
+
+
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). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
    The X position of the element
  • +
+
+
+
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). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
    The XY position of the element
  • +
+
+
+
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). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
    The Y position of the element
  • +
+
+
+
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/Object animate]) +
+ Hide this element - Uses display mode to determine whether to use "display" or "visibility". See setVisible. +
+ Parameters: +
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

initDD

+ public function initDD(String group, Object config, Object overrides) +
+ Initializes a Ext.dd.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: +
    +
  • Ext.dd.DD
    The DD object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

initDDProxy

+ public function initDDProxy(String group, Object config, Object overrides) +
+ Initializes a Ext.dd.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: +
    +
  • Ext.dd.DDProxy
    The DDProxy object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

initDDTarget

+ public function initDDTarget(String group, Object config, Object overrides) +
+ Initializes a Ext.dd.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: +
    +
  • Ext.dd.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: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

insertFirst

+ public function insertFirst(String/HTMLElement/Element/Object el) +
+ Inserts (or creates) an element (or DomHelper config) as the first child of the this element +
+ Parameters: +
  • el : String/HTMLElement/Element/Object
    The id or element to insert or a DomHelper config to create and insert
+ Returns: +
    +
  • Ext.Element
    The new child
  • +
+
+
+
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: +
    +
  • HTMLElement
    The inserted node (or nearest related if more than 1 inserted)
  • +
+
+
+
This method is defined by Element.
+
+ +
+

insertSibling

+ public function insertSibling(String/HTMLElement/Element/Object el, [String where], [Boolean returnDom]) +
+ Inserts (or creates) the passed element (or DomHelper config) as a sibling of this element +
+ Parameters: +
  • el : String/HTMLElement/Element/Object
    The id or element to insert or a DomHelper config to create and insert
  • where : String
    (optional) 'before' or 'after' defaults to before
  • returnDom : Boolean
    (optional) True to return the raw DOM element instead of Ext.Element
+ Returns: +
    +
  • Ext.Element
    the inserted Element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

is

+ public function is(String ss) +
+ Returns true if this element matches the passed simple selector (e.g. div.some-class or span:first-child) +
+ Parameters: +
  • ss : String
    The simple selector to test
+ Returns: +
    +
  • Boolean
  • +
+
+
+
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.
+
+ +
+

isMasked

+ public function isMasked() +
+ Returns true if this element is masked +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Element.
+
+ +
+

isScrollable

+ public function isScrollable() +
+ Returns true if this element is scrollable. +
+ 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

mask

+ public function mask([String msg], [String msgCls]) +
+ Puts a mask over this element to disable user interaction. Requires core.css. +This method can only be applied to elements which accept child nodes. +
+ Parameters: +
  • msg : String
    (optional) A message to display in the mask
  • msgCls : String
    (optional) A css class to apply to the msg element
+ Returns: +
    +
  • Element
    The message element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

move

+ public function move(String direction, Number distance, [Boolean/Object animate]) +
+ Move this element relative to its 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

moveTo

+ public function moveTo(Number x, Number y, [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

position

+ public function position([String pos], [Number zIndex], [Number x], [Number y]) +
+ Initializes positioning on this element. If a desired position is not passed, it will make the +the element positioned relative IF it is not already positioned. +
+ Parameters: +
  • pos : String
    (optional) Positioning to use "relative", "absolute" or "fixed"
  • zIndex : Number
    (optional) The zIndex to apply
  • x : Number
    (optional) Set the page X position
  • y : Number
    (optional) Set the page Y position
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

query

+ public function query(String selector) +
+ Selects child nodes based on the passed CSS selector (the selector should not contain an id) +
+ Parameters: +
  • selector : String
    The CSS selector
+ Returns: +
    +
  • Array
    An array of the matched nodes
  • +
+
+
+
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: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

removeClass

+ public function removeClass(String/Array className) +
+ Removes a CSS class from the element. +
+ Parameters: +
  • className : String/Array
    The CSS class to remove or an array of classes
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

removeListener

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

repaint

+ public function repaint() +
+ Forces the browser to repaint this element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • 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: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

scroll

+ public function scroll(String direction, Number distance, [Boolean/Object animate]) +
+ Scrolls this element the specified direction. Does bounds checking to make sure the scroll is +within this elements scrollable range. +
+ Parameters: +
  • direction : String
    Possible values are: "l","left" - "r","right" - "t","top","up" - "b","bottom","down".
  • distance : Number
    How far to scroll the element in pixels
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Boolean
    Returns true if a scroll was triggered or false if the element was scrolled as far as it could go.
  • +
+
+
+
This method is defined by Element.
+
+ +
+

scrollIntoView

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

scrollTo

+ public function scrollTo(String side, Number value, [Boolean/Object animate]) +
+ Scrolls this element the specified scroll point. It does NOT do bounds checking so if you scroll to a weird value it will try to do it. For auto bounds checking, use scroll(). +
+ Parameters: +
  • side : String
    Either "left" for scrollLeft values or "top" for scrollTop values.
  • value : Number
    The new scroll value
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

select

+ public function select(String selector, Boolean unique) +
+ Creates a CompositeElement for 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 Ext.Element for each child (defaults to a shared flyweight object)
+ Returns: +
    +
  • CompositeElement/CompositeElementLite
    The composite element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

set

+ public function set(Object o, [Boolean useSet]) +
+ 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
  • useSet : Boolean
    (optional) false to override the default setAttribute to use expandos.
+ Returns: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setBounds

+ public function setBounds(Number x, Number y, Number width, Number height, [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setBox

+ public function setBox(Object box, [Boolean adjust], [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • 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 its default display or a string to set the display directly
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setHeight

+ public function setHeight(Number height, [Boolean/Object animate]) +
+ Set the height of the element +
+ Parameters: +
  • height : Number
    The new height
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setLeftTop

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

setLocation

+ public function setLocation(Number x, Number y, [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setOpacity

+ public function setOpacity(Float opacity, [Boolean/Object animate]) +
+ Set the opacity of the element +
+ Parameters: +
  • opacity : Float
    The new opacity. 0 = transparent, .5 = 50% visibile, 1 = fully visible, etc
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setRegion

+ public function setRegion(Ext.lib.Region region, [Boolean/Object animate]) +
+ 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 : Ext.lib.Region
    The region to fill
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setSize

+ public function setSize(Number width, Number height, [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • 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: +
    +
  • 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: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible, [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setWidth

+ public function setWidth(Number width, [Boolean/Object animate]) +
+ Set the width of the element +
+ Parameters: +
  • width : Number
    The new width
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setX

+ public function setX(Number The, [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setXY

+ public function setXY(Array pos, [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setY

+ public function setY(Number The, [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

show

+ public function show([Boolean/Object animate]) +
+ Show this element - Uses display mode to determine whether to use "display" or "visibility". See setVisible. +
+ Parameters: +
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • 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 prevents the default action +
+ Parameters: +
  • eventName : String
  • preventDefault : Boolean
    (optional) true to prevent the default action too
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

toggle

+ public function toggle([Boolean/Object animate]) +
+ Toggles the elements visibility or display, depending on visibility mode. +
+ Parameters: +
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

translatePoints

+ public function translatePoints(Number/Array x, Number y, Object An) +
+ Translates the passed page coordinates into left/top css values for this element +
+ Parameters: +
  • x : Number/Array
    The page x or an array containing [x, y]
  • y : Number
    The page y
  • An : Object
    object with left and top properties. e.g. {left: (value), top: (value)}
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

unclip

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

unmask

+ public function unmask() +
+ Removes a previously applied mask. If removeEl is true the mask overlay is destroyed, otherwise +it is cached for reuse. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

unselectable

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

up

+ public function up(String ss, [Number/String/HTMLElement/Element maxDepth]) +
+ Walks up the dom looking for a parent node that matches the passed simple selector (e.g. div.some-class or span:first-child). +This is a shortcut for findParentNode() that always returns an Ext.Element. +
+ Parameters: +
  • ss : String
    The simple selector to test
  • maxDepth : Number/String/HTMLElement/Element
    (optional) The max depth to search as a number or element (defaults to 10 || document.body)
+ Returns: +
    +
  • Ext.Element
  • +
+
+
+
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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

wrap

+ public function wrap([Object config], [Boolean returnDom]) +
+ 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
  • returnDom : Boolean
    (optional) True to return the raw DOM element instead of Ext.Element
+ Returns: +
    +
  • /HTMLElementElement
    The newly created wrapper element
  • +
+
+
+
This method is defined by Element.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.EventManager.html b/www/extras/yui-ext/docs/output/Ext.EventManager.html new file mode 100644 index 000000000..8dbe1420e --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.EventManager.html @@ -0,0 +1,259 @@ + + + + Ext.EventManager + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.EventManager

+ + + + + +
Package: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 Ext.EventObject for more details on normalized event objects.

This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 ieDeferSrc : ObjectEventManager
Url used for onDocumentReady with using SSL (defaults to Ext.SSL_SECURE_URL)
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 addListener(String/HTMLElement element, String eventName, Function fn, Object options) : voidEventManager
Appends an event handler
 onDocumentReady(Function fn, Object scope, boolean options) : voidEventManager
Fires when the document is ready (before onload and before images are loaded). Can be +accessed shorthanded Ext.onRea...
 onTextResize(Function fn, Object scope, boolean options) : voidEventManager
Fires when the user changes the active text size. Handler gets called with 2 params, the old size and the new size.
 onWindowResize(Function fn, Object scope, boolean options) : voidEventManager
Fires when the window is resized and provides resize event buffering (50 milliseconds), passes new viewport width and...
 removeListener(String/HTMLElement element, String eventName, Function fn) : 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
Deprecated. This is no longer needed and is deprecated. Places a simple wrapper around an event handler to override t...
+ +

Public Events

+
This class has no public events.

Property Details

+
+ +
+

ieDeferSrc

+ public Object ieDeferSrc +
+ Url used for onDocumentReady with using SSL (defaults to Ext.SSL_SECURE_URL)
+
This property is defined by EventManager.
+
+
+ + +

Method Details

+
+ +
+

addListener

+ public function addListener(String/HTMLElement element, String eventName, Function fn, Object options) +
+ Appends an event handler +
+ Parameters: +
  • element : String/HTMLElement
    The html element or id to assign the event to
  • eventName : String
    The type of event to append
  • fn : Function
    The method the event invokes
  • options : Object
    An object with standard EventManager options
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by EventManager.
+
+ +
+

onDocumentReady

+ public function onDocumentReady(Function fn, Object scope, boolean options) +
+ Fires when the document is ready (before onload and before images are loaded). Can be +accessed shorthanded Ext.onReady(). +
+ Parameters: +
  • fn : Function
    The method the event invokes
  • scope : Object
    An object that becomes the scope of the handler
  • options : boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by EventManager.
+
+ +
+

onTextResize

+ public function onTextResize(Function fn, Object scope, boolean options) +
+ Fires when the user changes the active text size. Handler gets called with 2 params, the old size and the new size. +
+ Parameters: +
  • fn : Function
    The method the event invokes
  • scope : Object
    An object that becomes the scope of the handler
  • options : boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by EventManager.
+
+ +
+

onWindowResize

+ public function onWindowResize(Function fn, Object scope, boolean options) +
+ 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
  • options : boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by EventManager.
+
+ +
+

removeListener

+ public function removeListener(String/HTMLElement element, String eventName, Function fn) +
+ Removes an event handler +
+ Parameters: +
  • element : String/HTMLElement
    The id or html element to remove the event from
  • eventName : String
    The type of event
  • fn : Function
+ 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) +
+ Deprecated. This is no longer needed and is deprecated. Places a simple wrapper around an event handler to override the browser event +object with a 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.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.EventObject.html b/www/extras/yui-ext/docs/output/Ext.EventObject.html new file mode 100644 index 000000000..cd8f18b28 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.EventObject.html @@ -0,0 +1,793 @@ + + + + Ext.EventObject + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.EventObject

+ + + + + +
Package: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 +Example: +
function handleClick(e){ // e is not a standard event object, it is a Ext.EventObject
+    e.preventDefault();
+    var target = e.getTarget();
+    ...
+ }
+ var myDiv = Ext.get("myDiv");
+ myDiv.on("click", handleClick);
+ //or
+ Ext.EventManager.on("myDiv", 'click', handleClick);
+ Ext.EventManager.addListener("myDiv", 'click', handleClick);


This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 BACKSPACE : NumberEventObject
Key constant
 CONTROL : NumberEventObject
Key constant
 DELETE : NumberEventObject
Key constant
 DOWN : NumberEventObject
Key constant
 END : NumberEventObject
Key constant
 ENTER : 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
 SHIFT : 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
 getCharCode() : NumberEventObject
Gets the key code for the event.
 getKey() : NumberEventObject
Returns a normalized keyCode for the event.
 getPageX() : NumberEventObject
Gets the x coordinate of the event.
 getPageY() : NumberEventObject
Gets the y coordinate of the event.
 getRelatedTarget() : HTMLElementEventObject
Gets the related target.
 getTarget([String selector], [Number/String/HTMLElement/Element maxDepth], [Boolean returnEl]) : HTMLelementEventObject
Gets the target for the event.
 getTime() : NumberEventObject
Gets the time of the event.
 getWheelDelta() : NumberEventObject
Normalizes mouse wheel delta across browsers
 getXY() : ArrayEventObject
Gets the page coordinates of the event.
 hasModifier() : BooleanEventObject
Returns true if the control, meta, shift or alt key was pressed during this event.
 preventDefault() : voidEventObject
Prevents the browsers default handling of the event.
 stopEvent() : voidEventObject
Stop the event (preventDefault and stopPropagation)
 stopPropagation() : voidEventObject
Cancels bubbling of the event.
 within(String/HTMLElement/Element el, [Boolean related]) : BooleanEventObject
Returns true if the target of this event equals el or is a child of el
+ +

Public Events

+
This class has no public events.

Property Details

+
+ +
+

BACKSPACE

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

CONTROL

+ public Number CONTROL +
+ 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.
+
+ +
+

ENTER

+ public Number ENTER +
+ 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.
+
+ +
+

SHIFT

+ public Number SHIFT +
+ 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

+
+ +
+

getCharCode

+ public function getCharCode() +
+ Gets the key code for the event. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

getKey

+ public function getKey() +
+ Returns a normalized keyCode for the 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. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

getPageY

+ public function getPageY() +
+ Gets the y coordinate of the event. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

getRelatedTarget

+ public function getRelatedTarget() +
+ Gets the related target. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

getTarget

+ public function getTarget([String selector], [Number/String/HTMLElement/Element maxDepth], [Boolean returnEl]) +
+ Gets the target for the event. +
+ Parameters: +
  • selector : String
    (optional) A simple selector to filter the target or look for an ancestor of the target
  • maxDepth : Number/String/HTMLElement/Element
    (optional) The max depth to search as a number or element (defaults to 10 || document.body)
  • returnEl : Boolean
    (optional) True to return a Ext.Element object instead of DOM node
+ Returns: +
    +
  • HTMLelement
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

getTime

+ public function getTime() +
+ Gets the time of the event. +
+ 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. +
+ 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, meta, 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. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

stopEvent

+ public function stopEvent() +
+ Stop the event (preventDefault and stopPropagation) +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

stopPropagation

+ public function stopPropagation() +
+ Cancels bubbling of the event. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

within

+ public function within(String/HTMLElement/Element el, [Boolean related]) +
+ Returns true if the target of this event equals el or is a child of el +
+ Parameters: +
  • el : String/HTMLElement/Element
  • related : Boolean
    (optional) true to test if the related target is within el instead of the target
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by EventObject.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.Fx.html b/www/extras/yui-ext/docs/output/Ext.Fx.html new file mode 100644 index 000000000..ab88f744b --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.Fx.html @@ -0,0 +1,907 @@ + + + + Ext.Fx + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.Fx

+ + + + + +
Package:Ext
Class:Fx
Extends:Object
Defined In:Fx.js
+
+

A class to provide basic animation and visual effects support. Note: This class is automatically applied +to the Ext.Element interface when included, so all effects calls should be performed via Element. +Conversely, since the effects are not actually defined in Element, Ext.Fx must be included in order for the +Element effects to work.


+

It is important to note that although the Fx methods and many non-Fx Element methods support "method chaining" in that +they return the Element object itself as the method return value, it is not always possible to mix the two in a single +method chain. The Fx methods use an internal effects queue so that each effect can be properly timed and sequenced. +Non-Fx methods, on the other hand, have no such internal queueing and will always execute immediately. For this reason, +while it may be possible to mix certain Fx and non-Fx method calls in a single chain, it may not always provide the +expected results and should be done with care.


+

Motion effects support 8-way anchoring, meaning that you can choose one of 8 different anchor points on the Element +that will serve as either the start or end point of the animation. Following are all of the supported anchor positions:

+
+Value  Description
+-----  -----------------------------
+tl     The top left corner
+t      The center of the top edge
+tr     The top right corner
+l      The center of the left edge
+r      The center of the right edge
+bl     The bottom left corner
+b      The center of the bottom edge
+br     The bottom right corner
+
+Although some Fx methods accept specific custom config parameters, the ones shown in the Config Options section +below are common options that can be passed to any Fx method.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 fadeIn([Object options]) : ElementFx
Fade an element in (from transparent to opaque). The ending opacity can be specified +using the "endOpacity" config o...
 fadeOut([Object options]) : ElementFx
Fade an element out (from opaque to transparent). The ending opacity can be specified +using the "endOpacity" config ...
 frame([String color], [Number count], [Object options]) : ElementFx
Shows a ripple of exploding, attenuating borders to draw attention to an Element. +Usage: + +// default: a single light ...
 ghost([String anchor], [Object options]) : ElementFx
Slides the element while fading it out of view. An anchor point can be optionally passed to set the +ending point of...
 hasActiveFx() : BooleanFx
Returns true if the element has any effects actively running or queued, else returns false.
 hasFxBlock() : BooleanFx
Returns true if the element is currently blocking so that no other effect can be queued +until this effect is finished...
 highlight([String color], [Object options]) : ElementFx
Highlights the Element by setting a color (applies to the background-color by default, but can be +changed using the "...
 pause(Number seconds) : ElementFx
Creates a pause before any subsequent queued effects begin. If there are +no effects queued after the pause it will h...
 puff([Object options]) : ElementFx
Fades the element out while slowly expanding it in all directions. When the effect is completed, the +element will b...
 scale(Number width, Number height, [Object options]) : ElementFx
Animates the transition of an element's dimensions from a starting height/width +to an ending height/width. +Usage: + +//...
 sequenceFx() : ElementFx
Ensures that all effects queued after sequenceFx is called on the element are +run in sequence. This is the opposite ...
 shift(Object options) : ElementFx
Animates the transition of any combination of an element's dimensions, xy position and/or opacity. +Any of these prope...
 slideIn([String anchor], [Object options]) : ElementFx
Slides the element into view. An anchor point can be optionally passed to set the point of +origin for the slide effe...
 slideOut([String anchor], [Object options]) : ElementFx
Slides the element out of view. An anchor point can be optionally passed to set the end point +for the slide effect. ...
 stopFx() : ElementFx
Stops any running effects and clears the element's internal effects queue if it contains +any additional effects that ...
 switchOff([Object options]) : ElementFx
Blinks the element as if it was clicked and then collapses on its center (similar to switching off a television). +Whe...
 syncFx() : ElementFx
Ensures that all effects queued after syncFx is called on the element are +run concurrently. This is the opposite of ...
+ +

Public Events

+
This class has no public events.
+

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 afterCls : StringFx
A css class to apply after the effect
 afterStyle : String/Object/FunctionFx
A style specification string eg "width:100px", or object in the form {width:"100px"}, or a function which returns suc...
 block : BooleanFx
Whether the effect should block other effects from queueing while it runs
 callback : FunctionFx
A function called when the effect is finished
 concurrent : BooleanFx
Whether to allow subsequently-queued effects to run at the same time as the current effect, or to ensure that they ru...
 duration : NumberFx
The length of time (in seconds) that the effect should last
 easing : StringFx
A valid Easing value for the effect
 remove : BooleanFx
Whether the Element should be removed from the DOM and destroyed after the effect finishes
 scope : ObjectFx
The scope of the effect function
 stopFx : BooleanFx
Whether subsequent effects should be stopped and removed after the current effect finishes
 useDisplay : BooleanFx
Whether to use the display style attribute instead of visibility when hiding Elements (only applies to effects that e...
+ + +

Method Details

+
+ +
+

fadeIn

+ public function fadeIn([Object options]) +
+ Fade an element in (from transparent to opaque). The ending opacity can be specified +using the "endOpacity" config option. +Usage: +

+// default: fade in from opactiy 0 to 100%
+el.fadeIn();
+
+// custom: fade in from opcaity 0 to 75% over 2 seconds
+el.fadeIn({ endOpacity: .75, duration: 2});
+
+// common config options shown with default values
+el.fadeIn({
+ endOpacity: 1, //can be any value between 0 and 1 (e.g. .5)
+ easing: 'easeOut',
+ duration: .5
+}); +
+
+ Parameters: +
  • options : Object
    (optional) Object literal with any of the Fx config options
+ Returns: +
    +
  • Element
    The Element
  • +
+
+
+
This method is defined by Fx.
+
+ +
+

fadeOut

+ public function fadeOut([Object options]) +
+ Fade an element out (from opaque to transparent). The ending opacity can be specified +using the "endOpacity" config option. +Usage: +

+// default: fade out from the element's current opacity to 0
+el.fadeOut();
+
+// custom: fade out from the element's current opacity to 25% over 2 seconds
+el.fadeOut({ endOpacity: .25, duration: 2});
+
+// common config options shown with default values
+el.fadeOut({
+ endOpacity: 0, //can be any value between 0 and 1 (e.g. .5)
+ easing: 'easeOut',
+ duration: .5
+ remove: false,
+ useDisplay: false +}); +
+
+ Parameters: +
  • options : Object
    (optional) Object literal with any of the Fx config options
+ Returns: +
    +
  • Element
    The Element
  • +
+
+
+
This method is defined by Fx.
+
+ +
+

frame

+ public function frame([String color], [Number count], [Object options]) +
+ Shows a ripple of exploding, attenuating borders to draw attention to an Element. +Usage: +

+// default: a single light blue ripple
+el.frame();
+
+// custom: 3 red ripples lasting 3 seconds total
+el.frame("ff0000", 3, { duration: 3 });
+
+// common config options shown with default values
+el.frame("C3DAF9", 1, {
+ duration: 1 //duration of entire animation (not each individual ripple)
+ // Note: Easing is not configurable and will be ignored if included +}); +
+
+ Parameters: +
  • color : String
    (optional) The color of the border. Should be a 6 char hex color without the leading # (defaults to light blue: 'C3DAF9').
  • count : Number
    (optional) The number of ripples to display (defaults to 1)
  • options : Object
    (optional) Object literal with any of the Fx config options
+ Returns: +
    +
  • Element
    The Element
  • +
+
+
+
This method is defined by Fx.
+
+ +
+

ghost

+ public function ghost([String anchor], [Object options]) +
+ Slides the element while fading it out of view. An anchor point can be optionally passed to set the +ending point of the effect. +Usage: +

+// default: slide the element downward while fading out
+el.ghost();
+
+// custom: slide the element out to the right with a 2-second duration
+el.ghost('r', { duration: 2 });
+
+// common config options shown with default values
+el.ghost('b', {
+ easing: 'easeOut',
+ duration: .5
+ remove: false,
+ useDisplay: false +}); +
+
+ Parameters: +
  • anchor : String
    (optional) One of the valid Fx anchor positions (defaults to bottom: 'b')
  • options : Object
    (optional) Object literal with any of the Fx config options
+ Returns: +
    +
  • Element
    The Element
  • +
+
+
+
This method is defined by Fx.
+
+ +
+

hasActiveFx

+ public function hasActiveFx() +
+ Returns true if the element has any effects actively running or queued, else returns false. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    True if element has active effects, else false
  • +
+
+
+
This method is defined by Fx.
+
+ +
+

hasFxBlock

+ public function hasFxBlock() +
+ Returns true if the element is currently blocking so that no other effect can be queued +until this effect is finished, else returns false if blocking is not set. This is commonly +used to ensure that an effect initiated by a user action runs to completion prior to the +same effect being restarted (e.g., firing only one effect even if the user clicks several times). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    True if blocking, else false
  • +
+
+
+
This method is defined by Fx.
+
+ +
+

highlight

+ public function highlight([String color], [Object options]) +
+ Highlights the Element by setting a color (applies to the background-color by default, but can be +changed using the "attr" config option) and then fading back to the original color. If no original +color is available, you should provide the "endColor" config option which will be cleared after the animation. +Usage: +

+// default: highlight background to yellow
+el.highlight();
+
+// custom: highlight foreground text to blue for 2 seconds
+el.highlight("0000ff", { attr: 'color', duration: 2 });
+
+// common config options shown with default values
+el.highlight("ffff9c", {
+ attr: "background-color", //can be any valid css attribute that supports a color value
+ endColor: (current color) or "ffffff",
+ easing: 'easeIn',
+ duration: 1
+}); +
+
+ Parameters: +
  • color : String
    (optional) The highlight color. Should be a 6 char hex color without the leading # (defaults to yellow: 'ffff9c')
  • options : Object
    (optional) Object literal with any of the Fx config options
+ Returns: +
    +
  • Element
    The Element
  • +
+
+
+
This method is defined by Fx.
+
+ +
+

pause

+ public function pause(Number seconds) +
+ Creates a pause before any subsequent queued effects begin. If there are +no effects queued after the pause it will have no affect. +Usage: +

+el.pause(1);
+
+
+ Parameters: +
  • seconds : Number
    The length of time to pause (in seconds)
+ Returns: +
    +
  • Element
    The Element
  • +
+
+
+
This method is defined by Fx.
+
+ +
+

puff

+ public function puff([Object options]) +
+ Fades the element out while slowly expanding it in all directions. When the effect is completed, the +element will be hidden (visibility = 'hidden') but block elements will still take up space in the document. +The element must be removed from the DOM using the 'remove' config option if desired. +Usage: +

+// default
+el.puff();
+
+// common config options shown with default values
+el.puff({
+ easing: 'easeOut',
+ duration: .5,
+ remove: false,
+ useDisplay: false +}); +
+
+ Parameters: +
  • options : Object
    (optional) Object literal with any of the Fx config options
+ Returns: +
    +
  • Element
    The Element
  • +
+
+
+
This method is defined by Fx.
+
+ +
+

scale

+ public function scale(Number width, Number height, [Object options]) +
+ Animates the transition of an element's dimensions from a starting height/width +to an ending height/width. +Usage: +

+// change height and width to 100x100 pixels
+el.scale(100, 100);
+
+// common config options shown with default values.  The height and width will default to
+// the element's existing values if passed as null.
+el.scale(
+	[element's width],
+ [element's height], {
+ easing: 'easeOut',
+ duration: .35
+}); +
+
+ Parameters: +
  • width : Number
    The new width (pass null to keep the original width)
  • height : Number
    The new height (pass null to keep the original height)
  • options : Object
    (optional) Object literal with any of the Fx config options
+ Returns: +
    +
  • Element
    The Element
  • +
+
+
+
This method is defined by Fx.
+
+ +
+

sequenceFx

+ public function sequenceFx() +
+ Ensures that all effects queued after sequenceFx is called on the element are +run in sequence. This is the opposite of syncFx. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Element
    The Element
  • +
+
+
+
This method is defined by Fx.
+
+ +
+

shift

+ public function shift(Object options) +
+ Animates the transition of any combination of an element's dimensions, xy position and/or opacity. +Any of these properties not specified in the config object will not be changed. This effect +requires that at least one new dimension, position or opacity setting must be passed in on +the config object in order for the function to have any affect. +Usage: +

+// slide the element horizontally to x position 200 while changing the height and opacity
+el.shift({ x: 200, height: 50, opacity: .8 });
+
+// common config options shown with default values.
+el.shift({
+	width: [element's width],
+ height: [element's height],
+ x: [element's x position],
+ y: [element's y position],
+ opacity: [element's opacity],
+ easing: 'easeOut',
+ duration: .35
+}); +
+
+ Parameters: +
  • options : Object
    Object literal with any of the Fx config options
+ Returns: +
    +
  • Element
    The Element
  • +
+
+
+
This method is defined by Fx.
+
+ +
+

slideIn

+ public function slideIn([String anchor], [Object options]) +
+ Slides the element into view. An anchor point can be optionally passed to set the point of +origin for the slide effect. This function automatically handles wrapping the element with +a fixed-size container if needed. See the Fx class overview for valid anchor point options. +Usage: +

+// default: slide the element in from the top
+el.slideIn();
+
+// custom: slide the element in from the right with a 2-second duration
+el.slideIn('r', { duration: 2 });
+
+// common config options shown with default values
+el.slideIn('t', {
+ easing: 'easeOut',
+ duration: .5
+}); +
+
+ Parameters: +
  • anchor : String
    (optional) One of the valid Fx anchor positions (defaults to top: 't')
  • options : Object
    (optional) Object literal with any of the Fx config options
+ Returns: +
    +
  • Element
    The Element
  • +
+
+
+
This method is defined by Fx.
+
+ +
+

slideOut

+ public function slideOut([String anchor], [Object options]) +
+ Slides the element out of view. An anchor point can be optionally passed to set the end point +for the slide effect. When the effect is completed, the element will be hidden (visibility = +'hidden') but block elements will still take up space in the document. The element must be removed +from the DOM using the 'remove' config option if desired. This function automatically handles +wrapping the element with a fixed-size container if needed. See the Fx class overview for valid anchor point options. +Usage: +

+// default: slide the element out to the top
+el.slideOut();
+
+// custom: slide the element out to the right with a 2-second duration
+el.slideOut('r', { duration: 2 });
+
+// common config options shown with default values
+el.slideOut('t', {
+ easing: 'easeOut',
+ duration: .5,
+ remove: false,
+ useDisplay: false +}); +
+
+ Parameters: +
  • anchor : String
    (optional) One of the valid Fx anchor positions (defaults to top: 't')
  • options : Object
    (optional) Object literal with any of the Fx config options
+ Returns: +
    +
  • Element
    The Element
  • +
+
+
+
This method is defined by Fx.
+
+ +
+

stopFx

+ public function stopFx() +
+ Stops any running effects and clears the element's internal effects queue if it contains +any additional effects that haven't started yet. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Element
    The Element
  • +
+
+
+
This method is defined by Fx.
+
+ +
+

switchOff

+ public function switchOff([Object options]) +
+ Blinks the element as if it was clicked and then collapses on its center (similar to switching off a television). +When the effect is completed, the element will be hidden (visibility = 'hidden') but block elements will still +take up space in the document. The element must be removed from the using the 'remove' config option if desired. +Usage: +

+// default
+el.switchOff();
+
+// all config options shown with default values
+el.switchOff({
+ easing: 'easeIn',
+ duration: .3,
+ remove: false,
+ useDisplay: false +}); +
+
+ Parameters: +
  • options : Object
    (optional) Object literal with any of the Fx config options
+ Returns: +
    +
  • Element
    The Element
  • +
+
+
+
This method is defined by Fx.
+
+ +
+

syncFx

+ public function syncFx() +
+ Ensures that all effects queued after syncFx is called on the element are +run concurrently. This is the opposite of sequenceFx. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Element
    The Element
  • +
+
+
+
This method is defined by Fx.
+
+
+ +

Config Details

+
+ +
+

afterCls

+ afterCls : String +
+ A css class to apply after the effect
+
This config option is defined by Fx.
+
+ +
+

afterStyle

+ afterStyle : 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 that will be applied to the Element after the effect finishes
+
This config option is defined by Fx.
+
+ +
+

block

+ block : Boolean +
+ Whether the effect should block other effects from queueing while it runs
+
This config option is defined by Fx.
+
+ +
+

callback

+ callback : Function +
+ A function called when the effect is finished
+
This config option is defined by Fx.
+
+ +
+

concurrent

+ concurrent : Boolean +
+ Whether to allow subsequently-queued effects to run at the same time as the current effect, or to ensure that they run in sequence
+
This config option is defined by Fx.
+
+ +
+

duration

+ duration : Number +
+ The length of time (in seconds) that the effect should last
+
This config option is defined by Fx.
+
+ +
+

easing

+ easing : String +
+ A valid Easing value for the effect
+
This config option is defined by Fx.
+
+ +
+

remove

+ remove : Boolean +
+ Whether the Element should be removed from the DOM and destroyed after the effect finishes
+
This config option is defined by Fx.
+
+ +
+

scope

+ scope : Object +
+ The scope of the effect function
+
This config option is defined by Fx.
+
+ +
+

stopFx

+ stopFx : Boolean +
+ Whether subsequent effects should be stopped and removed after the current effect finishes
+
This config option is defined by Fx.
+
+ +
+

useDisplay

+ useDisplay : Boolean +
+ Whether to use the display style attribute instead of visibility when hiding Elements (only applies to effects that end with the element being visually hidden, ignored otherwise)
+
This config option is defined by Fx.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.GridPanel.html b/www/extras/yui-ext/docs/output/Ext.GridPanel.html new file mode 100644 index 000000000..deeffb2fc --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.GridPanel.html @@ -0,0 +1,898 @@ + + + + Ext.GridPanel + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.GridPanel

+ + + + + +
Package:Ext
Class:GridPanel
Extends:ContentPanel
Defined In:ContentPanels.js
+
+
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 GridPanel(Ext.grid.Grid grid, String/Object config)GridPanel
Create a new GridPanel.
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 destroy() : voidContentPanel
Destroys this panel
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getEl() : Ext.ElementContentPanel
Returns this panel's element
 getGrid() : Ext.grid.GridGridPanel
Returns the grid for this panel
 getId() : StringContentPanel
Returns this panel's id
 getTitle() : StringContentPanel
Returns this panel's title
 getToolbar() : Ext.ToolbarContentPanel
Returns the toolbar for this Panel if one was configured.
 getUpdateManager() : Ext.UpdateManagerContentPanel
Get the Ext.UpdateManager for this panel. Enables you to perform Ajax updates.
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 isClosable() : BooleanContentPanel
Returns true is this panel was configured to be closable
 load(Object/String/Function url, [String/Object params], [Function callback], [Boolean discardUrl]) : Ext.ContentPanelContentPanel
Loads this content panel immediately with content from XHR. Note: to delay loading until the panel is activated, use ...
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 refresh() : voidContentPanel
Force a content refresh from the URL specified in the setUrl() method. +Will fail silently if the setUrl method has no...
 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]) : Ext.UpdateManagerContentPanel
Set a URL to be used to load the content for this panel. When this panel is activated, the content will be loaded fro...
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 activate : (Ext.ContentPanel this)ContentPanel
Fires when this panel is activated.
 deactivate : (Ext.ContentPanel this)ContentPanel
Fires when this panel is activated.
 resize : (Ext.ContentPanel this, Number width, Number height)ContentPanel
Fires when this panel is resized if fitToFrame is true.
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 adjustments : ArrayContentPanel
Values to add to the width/height when doing a fitToFrame (default is [0, 0])
 autoCreate : Boolean/ObjectContentPanel
True to auto generate the DOM element for this panel, or a DomHelper config of the element to create
 autoScroll : BooleanContentPanel
True to scroll overflow in this panel (use with fitToFrame)
 background : BooleanContentPanel
True if the panel should not be activated when it is added (defaults to false)
 closable : BooleanContentPanel
True if the panel can be closed/removed
 fitContainer : BooleanContentPanel
When using fitToFrame and resizeEl, you can also fit the parent container (defaults to false)
 fitToFrame : BooleanContentPanel
True for this panel to adjust its size to fit when the region resizes (defaults to false)
 loadOnce : BooleanContentPanel
Calls When used with "url", calls setUrl() with this value
 params : String/ObjectContentPanel
When used with "url", calls setUrl() with this value
 resizeEl : String/HTMLElement/ElementContentPanel
An element to resize if fitToFrame is true (instead of this panel's element)
 title : StringContentPanel
The title for this panel
 toolbar : ToolbarContentPanel
A toolbar for this panel
 url : StringContentPanel
Calls setUrl() with this value
+ + +

Constructor Details

+
+
+

GridPanel

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

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
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: +
    +
  • Ext.Element
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

getGrid

+ public function getGrid() +
+ Returns the grid for this panel +
+ Parameters: +
  • None.
+ Returns: +
    +
  • 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: +
    +
  • Ext.Toolbar
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

getUpdateManager

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

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

isClosable

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

load

+ public function load(Object/String/Function url, [String/Object params], [Function callback], [Boolean discardUrl]) +
+ Loads this content panel immediately with content from XHR. Note: to delay loading until the panel is activated, use setUrl. +
+ 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:
     panel.load({
    url: "your-url.php",
    params: {param1: "foo", param2: "bar"}, // or a URL encoded string
    callback: yourFunction,
    scope: yourObject, //(optional scope)
    discardUrl: false,
    nocache: false,
    text: "Loading...",
    timeout: 30,
    scripts: 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 panel 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, oResponse)
  • 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: +
    +
  • Ext.ContentPanel
    this
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

refresh

+ public function refresh() +
+ Force a content refresh from the URL specified in the setUrl() method. +Will fail silently if the setUrl method has not been called. +This does not activate the panel, just updates its content. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

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. When this panel is activated, the content will be loaded from that URL. +
+ 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 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: +
    +
  • Ext.UpdateManager
    The UpdateManager
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

activate

+ public event activate +
+ Fires when this panel is activated. +
+ Subscribers will be called with the following parameters: +
  • this : 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 : Ext.ContentPanel
+
+
+
This event is defined by ContentPanel.
+
+ +
+

resize

+ public event resize +
+ Fires when this panel is resized if fitToFrame is true. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.ContentPanel
  • width : Number
    The width after any component adjustments
  • height : Number
    The height after any component adjustments
+
+
+
This event is defined by ContentPanel.
+
+
+

Config Details

+
+ +
+

adjustments

+ adjustments : Array +
+ Values to add to the width/height when doing a fitToFrame (default is [0, 0])
+
This config option is defined by ContentPanel.
+
+ +
+

autoCreate

+ autoCreate : Boolean/Object +
+ True to auto generate the DOM element for this panel, or a DomHelper config of the element to create
+
This config option is defined by ContentPanel.
+
+ +
+

autoScroll

+ autoScroll : Boolean +
+ True to scroll overflow in this panel (use with fitToFrame)
+
This config option is defined by ContentPanel.
+
+ +
+

background

+ background : Boolean +
+ True if the panel should not be activated when it is added (defaults to false)
+
This config option is defined by ContentPanel.
+
+ +
+

closable

+ closable : Boolean +
+ True if the panel can be closed/removed
+
This config option is defined by ContentPanel.
+
+ +
+

fitContainer

+ fitContainer : Boolean +
+ When using fitToFrame and resizeEl, you can also fit the parent container (defaults to false)
+
This config option is defined by ContentPanel.
+
+ +
+

fitToFrame

+ fitToFrame : Boolean +
+ True for this panel to adjust its size to fit when the region resizes (defaults to false)
+
This config option is defined by ContentPanel.
+
+ +
+

loadOnce

+ loadOnce : Boolean +
+ Calls When used with "url", calls setUrl() with this value
+
This config option is defined by ContentPanel.
+
+ +
+

params

+ params : String/Object +
+ When used with "url", calls setUrl() with this value
+
This config option is defined by ContentPanel.
+
+ +
+

resizeEl

+ resizeEl : String/HTMLElement/Element +
+ An element to resize if fitToFrame is true (instead of this panel's element)
+
This config option is defined by ContentPanel.
+
+ +
+

title

+ title : String +
+ The title for this panel
+
This config option is defined by ContentPanel.
+
+ +
+

toolbar

+ toolbar : Toolbar +
+ A toolbar for this panel
+
This config option is defined by ContentPanel.
+
+ +
+

url

+ url : String +
+ Calls setUrl() with this value
+
This config option is defined by ContentPanel.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.JsonView.html b/www/extras/yui-ext/docs/output/Ext.JsonView.html new file mode 100644 index 000000000..a705dc502 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.JsonView.html @@ -0,0 +1,1138 @@ + + + + Ext.JsonView + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.JsonView

+ + + + + +
Package:Ext
Class:JsonView
Extends:View
Defined In:JsonView.js
+
+ Shortcut class to create a JSON + UpdateManager template view. Usage: +
var view = new Ext.JsonView("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");
+
+
+ // Example from my blog list
+ var tpl = new Ext.Template(
+ '<div class="entry">' +
+ '<a class="entry-title" href="{link}">{title}</a>' +
+ "<h4>{date} by {author} | {comments} Comments</h4>{description}" +
+ "</div><hr />"
+ );
+
+ var moreView = new Ext.JsonView("entry-list", tpl, {
+ jsonRoot: "posts"
+ });
+ moreView.on("beforerender", this.sortEntries, this);
+ moreView.load({
+ url:"/blog/get-posts.php",
+ params: "allposts=true",
+ text:"Loading Blog Entries..."
+ });
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 jsonData : ObjectJsonView
The current json data or null
 jsonRoot : StringJsonView
The root property in the loaded json object that contains the data
 selectedClass : Ext.DomHelper.TemplateView
The css class to add to selected nodes
 tpl : Ext.DomHelper.TemplateView
The template used by this View
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 JsonView(String/HTMLElement/Element container, Template tpl, Object config)JsonView
Create a new JsonView
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 clearFilter() : voidJsonView
Clears the current filter.
 clearSelections([Boolean suppressEvent]) : voidView
Clear all selections
 filter(String property, String/RegExp value) : voidJsonView
Filter the data by a specific property.
 filterBy(Function fn, [Object scope]) : voidJsonView
Filter by a function. The passed function will be called with each +object in the current dataset. If the function ret...
 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).
 getCount() : NumberJsonView
Get the number of records in the current JSON dataset
 getEl() : Ext.ElementView
Returns the element this view is bound to.
 getNode(HTMLElement/String/Number nodeInfo) : HTMLElementView
Gets a template node.
 getNodeData(HTMLElement/Array node) : Object/ArrayJsonView
Returns the JSON object for the specified node(s)
 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.
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 indexOf(HTMLElement/String/Number nodeInfo) : NumberView
Finds the index of the passed node
 isSelected(HTMLElement/Number node) : BooleanView
Returns true if the passed node is selected
 load(Object/String/Function url, [String/Object params], [Function callback], [Boolean discardUrl]) : voidJsonView
Performs an async request, loading the JSON from the response. If params are specified it uses POST, otherwise it use...
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 prepareData(Array/Object data) : 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() : voidJsonView
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.
 setStore(Store store) : voidView
Changes the data store this view uses and refresh the view.
 sort(String property, [String direction], [Function sortType]) : voidJsonView
Sorts the data for this view and refreshes it.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeclick : (Ext.View this, Number index, HTMLElement node, Ext.EventObject e)View
Fires before a click is processed. Returns false to cancel the default action.
 beforerender : (Ext.View this, Object data)JsonView
Fires before rendering of the downloaded json data.
 beforeselect : (Ext.View this, HTMLElement node, Array selections)View
Fires before a selection is made. If any handlers return false, the selection is cancelled.
 click : (Ext.View this, Number index, HTMLElement node, Ext.EventObject e)View
Fires when a template node is clicked.
 contextmenu : (Ext.View this, Number index, HTMLElement node, Ext.EventObject e)View
Fires when a template node is right clicked.
 dblclick : (Ext.View this, Number index, HTMLElement node, Ext.EventObject e)View
Fires when a template node is double clicked.
 load : (Ext.View this, Object data, Object response)JsonView
* +Fires when data is loaded.
 loadexception : (Ext.View this, Object response)JsonView
* +Fires when loading fails.
 selectionchange : (Ext.View this, Array selections)View
Fires when the selected nodes change.
+

Property Details

+
+ +
+

jsonData

+ public Object jsonData +
+ The current json data or null
+
This property is defined by JsonView.
+
+ +
+

jsonRoot

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

selectedClass

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

tpl

+ public 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, Template tpl, Object config) +
+ Create a new JsonView
+ Parameters: +
  • container : String/HTMLElement/Element
    The container element where the view is to be rendered.
  • tpl : Template
    The rendering template
  • config : Object
    The config object
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

clearFilter

+ public function clearFilter() +
+ Clears the current filter. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by JsonView.
+
+ +
+

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.
+
+ +
+

filter

+ public function filter(String property, String/RegExp value) +
+ Filter the data by a specific property. +
+ Parameters: +
  • property : String
    A property on your JSON objects
  • value : String/RegExp
    Either string that the property values should start with or a RegExp to test against the property
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by JsonView.
+
+ +
+

filterBy

+ public function filterBy(Function fn, [Object scope]) +
+ Filter by a function. The passed function will be called with each +object in the current dataset. If the function returns true, the value is kept +otherwise it is filtered. +
+ Parameters: +
  • fn : Function
  • scope : Object
    (optional) The scope of the function (defaults to this JsonView)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by JsonView.
+
+ +
+

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.
+
+ +
+

getCount

+ public function getCount() +
+ Get the number of records in the current JSON dataset +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by JsonView.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the element this view is bound to. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • 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.
+
+ +
+

getNodeData

+ public function getNodeData(HTMLElement/Array node) +
+ Returns the JSON object for the specified node(s) +
+ Parameters: +
  • node : HTMLElement/Array
    The node or an array of nodes
+ Returns: +
    +
  • Object/Array
    If you pass in an array, you get an array back, otherwise you get the JSON object for the node
  • +
+
+
+
This method is defined by JsonView.
+
+ +
+

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.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

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.
+
+ +
+

isSelected

+ public function isSelected(HTMLElement/Number node) +
+ Returns true if the passed node is selected +
+ Parameters: +
  • node : HTMLElement/Number
    The node or node index
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by View.
+
+ +
+

load

+ public function load(Object/String/Function url, [String/Object params], [Function callback], [Boolean discardUrl]) +
+ Performs an async request, loading the JSON from 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:
     view.load({ url: "your-url.php",
    params: {param1: "foo", param2: "bar"}, // or a URL encoded string
    callback: yourFunction,
    scope: yourObject, //(optional scope)
    discardUrl: false,
    nocache: false,
    text: "Loading...",
    timeout: 30,
    scripts: 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 JsonView.
+
+ +
+

on

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

prepareData

+ public function prepareData(Array/Object data) +
+ 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).
+ 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 JsonView.
+
+ +
+

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.
+
+ +
+

setStore

+ public function setStore(Store store) +
+ Changes the data store this view uses and refresh the view. +
+ Parameters: +
  • store : Store
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by View.
+
+ +
+

sort

+ public function sort(String property, [String direction], [Function sortType]) +
+ Sorts the data for this view and refreshes it. +
+ Parameters: +
  • property : String
    A property on your JSON objects to sort on
  • direction : String
    (optional) desc or asc (defaults to asc)
  • sortType : Function
    (optional) A function to call to convert the data to a sortable value.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by JsonView.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

beforeclick

+ public event beforeclick +
+ Fires before a click is processed. Returns false to cancel the default action. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.View
  • index : Number
    The index of the target node
  • node : HTMLElement
    The target node
  • e : Ext.EventObject
    The raw event object
+
+
+
This event is defined by View.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before rendering of the downloaded json data. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.View
  • data : Object
    The json data loaded
+
+
+
This event is defined by JsonView.
+
+ +
+

beforeselect

+ public event beforeselect +
+ Fires before a selection is made. If any handlers return false, the selection is cancelled. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.View
  • node : HTMLElement
    The node to be selected
  • selections : Array
    Array of currently selected nodes
+
+
+
This event is defined by View.
+
+ +
+

click

+ public event click +
+ Fires when a template node is clicked. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.View
  • index : Number
    The index of the target node
  • node : HTMLElement
    The target node
  • e : 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 : Ext.View
  • index : Number
    The index of the target node
  • node : HTMLElement
    The target node
  • e : 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 : Ext.View
  • index : Number
    The index of the target node
  • node : HTMLElement
    The target node
  • e : Ext.EventObject
    The raw event object
+
+
+
This event is defined by View.
+
+ +
+

load

+ public event load +
+ * +Fires when data is loaded. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.View
  • data : Object
    The json data loaded
  • response : Object
    The raw Connect response object
+
+
+
This event is defined by JsonView.
+
+ +
+

loadexception

+ public event loadexception +
+ * +Fires when loading fails. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.View
  • response : Object
    The raw Connect response object
+
+
+
This event is defined by JsonView.
+
+ +
+

selectionchange

+ public event selectionchange +
+ Fires when the selected nodes change. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.View
  • selections : Array
    Array of the selected nodes
+
+
+
This event is defined by View.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.KeyMap.html b/www/extras/yui-ext/docs/output/Ext.KeyMap.html new file mode 100644 index 000000000..01ef12987 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.KeyMap.html @@ -0,0 +1,268 @@ + + + + Ext.KeyMap + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.KeyMap

+ + + + + +
Package:Ext
Class:KeyMap
Extends:Object
Defined In:KeyMap.js
+
+ Handles mapping keys to actions for an element. One key map can be used for multiple actions. +The constructor accepts the same config object as defined by addBinding. +If you bind a callback function to a KeyMap, anytime the KeyMap handles an expected key +combination it will call the function with this signature (if the match is a multi-key +combination the callback will still be called only once): (String key, Ext.EventObject e) +A KeyMap can also handle a string representation of keys.
+Usage: +
// map one key by key code
+ var map = new Ext.KeyMap("my-element", {
+     key: 13, // or Ext.EventObject.ENTER
+     fn: myHandler,
+     scope: myObject
+ });
+ 
+ // map multiple keys to one action by string
+ var map = new Ext.KeyMap("my-element", {
+     key: "a\r\n\t",
+     fn: myHandler,
+     scope: myObject
+ });
+ 
+ // map multiple keys to multiple actions by strings and array of codes
+ var map = new Ext.KeyMap("my-element", [
+    {
+        key: [10,13],
+        fn: function(){ alert("Return was pressed"); }
+    }, {
+        key: "abc",
+        fn: function(){ alert('a, b or c was pressed'); }
+    }, {
+        key: "\t",
+        ctrl:true,
+        shift:true,
+        fn: function(){ alert('Control + shift + tab was pressed.'); }
+    }
+]);
+Note: A KepMap starts enabled
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 stopEvent : BooleanKeyMap
True to stop the event from bubbling and prevent the default browser action if the +key was handled by the KeyMap (def...
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 KeyMap(String/HTMLElement/Ext.Element el, Object config, [String eventName])KeyMap
 addBinding(Object config) : voidKeyMap
Add a new binding to this KeyMap. The following config object properties are supported: + +Property Type ...
 disable() : voidKeyMap
Disable this KeyMap
 enable() : voidKeyMap
Enable this KeyMap
 isEnabled() : BooleanKeyMap
Returns true if this KepMap is enabled
+ +

Public Events

+
This class has no public events.

Property Details

+
+ +
+

stopEvent

+ public Boolean stopEvent +
+ True to stop the event from bubbling and prevent the default browser action if the +key was handled by the KeyMap (defaults to false)
+
This property is defined by KeyMap.
+
+
+ + +

Constructor Details

+
+
+

KeyMap

+ public function KeyMap(String/HTMLElement/Ext.Element el, Object config, [String eventName]) +
+
+ Parameters: +
  • el : String/HTMLElement/Ext.Element
    The element to bind to
  • config : Object
    The config
  • eventName : String
    (optional) The event to bind to (defaults to "keydown")
+
+
+
+
+ +

Method Details

+
+ +
+

addBinding

+ public function addBinding(Object config) +
+ Add a new binding to this KeyMap. The following config object properties are supported: +
+Property    Type             Description
+----------  ---------------  ----------------------------------------------------------------------
+key         String/Array     A single keycode or an array of keycodes to handle
+shift       Boolean          True to handle key only when shift is pressed (defaults to false)
+ctrl        Boolean          True to handle key only when ctrl is pressed (defaults to false)
+alt         Boolean          True to handle key only when alt is pressed (defaults to false)
+fn          Function         The function to call when KeyMap finds the expected key combination
+scope       Object           The scope of the callback function
+
+Usage: +

+// Create a KeyMap
+var map = new Ext.KeyMap(document, {
+    key: Ext.EventObject.ENTER,
+    fn: handleKey,
+    scope: this
+});
+
+//Add a new binding to the existing KeyMap later
+map.addBinding({
+    key: 'abc',
+    shift: true,
+    fn: handleKey,
+    scope: this
+});
+
+
+ Parameters: +
  • config : Object
    A single KeyMap config
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by KeyMap.
+
+ +
+

disable

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

enable

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

isEnabled

+ public function isEnabled() +
+ Returns true if this KepMap is enabled +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by KeyMap.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.KeyNav.html b/www/extras/yui-ext/docs/output/Ext.KeyNav.html new file mode 100644 index 000000000..bc6cae7fa --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.KeyNav.html @@ -0,0 +1,140 @@ + + + + Ext.KeyNav + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.KeyNav

+ + + + + +
Package:Ext
Class:KeyNav
Extends:Object
Defined In:KeyNav.js
+
+ Provides a convenient wrapper for normalized keyboard navigation. KeyNav allows you to bind +navigation keys to function calls that will get called when the keys are pressed. +
Usage: +
var nav = new Ext.KeyNav("my-element", {
+    "left" : function(e){
+        this.moveLeft(e.ctrlKey);
+    },
+    "right" : function(e){
+        this.moveRight(e.ctrlKey);
+    },
+    "enter" : function(e){
+        this.save();
+    },
+    scope : this
+});
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 KeyNav(String/HTMLElement/Ext.Element el, Object config)KeyNav
 disable() : voidKeyNav
Disable this KeyNav
 enable() : voidKeyNav
Enable this KeyNav
+ +

Public Events

+
This class has no public events.
+ +

Constructor Details

+
+
+

KeyNav

+ public function KeyNav(String/HTMLElement/Ext.Element el, Object config) +
+
+ Parameters: +
  • el : String/HTMLElement/Ext.Element
    The element to bind to
  • config : Object
    The config
+
+
+
+
+ +

Method Details

+
+ +
+

disable

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

enable

+ public function enable() +
+ Enable this KeyNav +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by KeyNav.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.Layer.html b/www/extras/yui-ext/docs/output/Ext.Layer.html new file mode 100644 index 000000000..fed586b38 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.Layer.html @@ -0,0 +1,3618 @@ + + + + Ext.Layer + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.Layer

+ + + + + +
Package:Ext
Class:Layer
Extends:Element
Defined In:Layer.js
+
+ An extended Element object that supports a shadow and shim, constrain to viewport and +automatic maintaining of shadow/shim positions.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 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
 Layer(Object config, [String/HTMLElement existingEl])Layer
 addClass(String/Array className) : Ext.ElementElement
Add a CSS class to the element.
 addClassOnClick(String className) : Ext.ElementElement
Sets up event handlers to add and remove a css class when the mouse is down and then up on this element (a click effect)
 addClassOnFocus(String className) : Ext.ElementElement
Sets up event handlers to add and remove a css class when this element has the focus
 addClassOnOver(String className, [Boolean preventFlicker]) : Ext.ElementElement
Sets up event handlers to add and remove a css class when the mouse is over this element
 addKeyListener(Number/Array/Object/String key, Function fn, [Object scope]) : Ext.KeyMapElement
Convenience method for constructing a KeyMap
 addKeyMap(Object config) : Ext.KeyMapElement
Creates a KeyMap for this element
 addListener(String eventName, Function fn, [Object scope], [Object options]) : voidElement
Appends an event handler
 alignTo(String/HTMLElement/Ext.Element element, String position, [Array offsets], [Boolean/Object animate]) : Ext.ElementElement
Aligns this element with another element relative to the specified anchor points. If the other element is the +documen...
 anchorTo(String/HTMLElement/Ext.Element element, String position, [Array offsets], [Boolean/Object animate], [Boolean/Number monitorScroll], ) : voidElement
Anchors an element to another element and realigns it when the window is resized.
 animate(Object args, [Float duration], [Function onComplete], [String easing], [String animType]) : Ext.ElementElement
Perform animation on this element.
 appendChild(String/HTMLElement/Array/Element/CompositeElement el) : Ext.ElementElement
Appends the passed element(s) to this element
 appendTo(String/HTMLElement/Element el) : Ext.ElementElement
Appends this element to the passed element
 applyStyles(String/Object/Function styles) : Ext.ElementElement
More flexible version of setStyle for setting style properties.
 autoHeight([Boolean animate], [Float duration], [Function onComplete], [String easing]) : Ext.ElementElement
Measures the elements content height and updates height to match. Note, this function uses setTimeout and +the new he...
 beginMeasure() : Ext.ElementElement
Temporarily enables offsets (width,height,x,y) for an element with display:none, use endMeasure() when done.
 blur() : Ext.ElementElement
Tries to blur the element. Any exceptions are caught.
 center([String/HTMLElement/Ext.Element centerIn]) : voidElement
Centers the Element in either the viewport, or another Element.
 child(String selector, Boolean returnDom) : ElementElement
Selects a single child based on the passed CSS selector (the selector should not contain an id)
 clean([Boolean forceReclean]) : voidElement
Removes worthless text nodes
 clearOpacity() : Ext.ElementElement
Clears any opacity settings from this element. Required in some cases for IE.
 clearPositioning([String value]) : Ext.ElementElement
Clear positioning back to the default when the document was loaded
 clip() : Ext.ElementElement
Store the current overflow setting and clip overflow on the element - use unclip to remove
 contains(HTMLElement/String el) : BooleanElement
Returns true if this element is an ancestor of the passed element
 createChild(Object config, [HTMLElement insertBefore], [Boolean returnDom]) : 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]) : Ext.ElementElement
Creates a proxy element of this element
 createShim() : Ext.ElementElement
Creates an iframe shim for this element to keep selects and other windowed objects from +showing through.
 down(String selector, Boolean returnDom) : ElementElement
Selects a single *direct* child based on the passed CSS selector (the selector should not contain an id)
 enableDisplayMode([String display]) : Ext.ElementElement
Convenience method for setVisibilityMode(Element.DISPLAY)
 endMeasure() : Ext.ElementElement
Restores displays to before beginMeasure was called
 findParent(String ss, [Number/String/HTMLElement/Element maxDepth], [Boolean returnEl]) : HTMLElementElement
Looks at this node and then at parent nodes for a match of the passed simple selector (e.g. div.some-class or span:fi...
 findParentNode(String ss, [Number/String/HTMLElement/Element maxDepth], [Boolean returnEl]) : HTMLElementElement
Looks at parent nodes for a match of the passed simple selector (e.g. div.some-class or span:first-child)
 fitToParent([Boolean monitorResize], [String/HTMLElment/Element targetParent]) : Ext.ElementElement
Sizes this element to its parent element's dimensions performing +neccessary box adjustments.
 focus() : Ext.ElementElement
Tries to focus the element. Any exceptions are caught.
 getAlignToXY(String/HTMLElement/Ext.Element element, String position, [Array offsets]) : ArrayElement
Gets the x,y coordinates to align this element with another element. See alignTo for more info on the +supported posit...
 getAnchorXY([String anchor], [Object size], [Boolean local]) : ArrayElement
Gets the x,y coordinates specified by the anchor position on the element.
 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() : ArrayElement
Calculates the x, y to center this element on the screen
 getColor(String attr, String defaultValue, [String prefix]) : voidElement
Return the CSS color for the specified CSS attribute. rgb, 3 digit (like #fff) and valid values +are convert to standa...
 getComputedHeight() : NumberElement
Returns either the offsetHeight or the height of this element based on CSS height adjusted by padding or borders +when...
 getComputedWidth() : NumberElement
Returns either the offsetWidth or the width of this element based on CSS width adjusted by padding or borders +when ne...
 getFrameWidth(String sides) : NumberElement
Returns the sum width of the padding and borders for the passed "sides". See getBorderWidth() + for more informat...
 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 performing...
 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. This is not YUI getStyle, it is an optimised version.
 getStyles(String style1, String style2, String etc) : ObjectElement
Get an object with properties matching the styles requested. +e.g. el.getStyles('color', 'font-size', 'width') might r...
 getTop(Boolean local) : NumberElement
Gets the top Y coordinate
 getUpdateManager() : Ext.UpdateManagerElement
Gets this elements UpdateManager
 getValue(Boolean asNumber) : String/NumberElement
Returns the value of the "value" attribute
 getWidth([Boolean contentWidth]) : NumberElement
Returns the offset width of the element
 getX() : NumberElement
Gets the current X position of the element based on page coordinates. Element must be part of the DOM tree to have p...
 getXY() : ArrayElement
Gets the current position of the element based on page coordinates. Element must be part of the DOM tree to have pag...
 getY() : NumberElement
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/Object animate]) : 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) : Ext.dd.DDElement
Initializes a Ext.dd.DD object for this element.
 initDDProxy(String group, Object config, Object overrides) : Ext.dd.DDProxyElement
Initializes a Ext.dd.DDProxy object for this element.
 initDDTarget(String group, Object config, Object overrides) : Ext.dd.DDTargetElement
Initializes a Ext.dd.DDTarget object for this element.
 insertAfter(String/HTMLElement/Element el) : Ext.ElementElement
Inserts this element after the passed element in the DOM
 insertBefore(String/HTMLElement/Element el) : Ext.ElementElement
Inserts this element before the passed element in the DOM
 insertFirst(String/HTMLElement/Element/Object el) : Ext.ElementElement
Inserts (or creates) an element (or DomHelper config) as the first child of the this element
 insertHtml(String where, String html) : HTMLElementElement
Inserts an html fragment into this element
 insertSibling(String/HTMLElement/Element/Object el, [String where], [Boolean returnDom]) : Ext.ElementElement
Inserts (or creates) the passed element (or DomHelper config) as a sibling of this element
 is(String ss) : BooleanElement
Returns true if this element matches the passed simple selector (e.g. div.some-class or span:first-child)
 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"
 isMasked() : BooleanElement
Returns true if this element is masked
 isScrollable() : BooleanElement
Returns true if this element is scrollable.
 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]) : Ext.ElementElement
Direct access to the UpdateManager update() method (takes the same parameters).
 mask([String msg], [String msgCls]) : ElementElement
Puts a mask over this element to disable user interaction. Requires core.css. +This method can only be applied to elem...
 move(String direction, Number distance, [Boolean/Object animate]) : Ext.ElementElement
Move this element relative to its current position.
 moveTo(Number x, Number y, [Boolean/Object animate]) : Ext.ElementElement
Set the position of the element in page coordinates, regardless of how the element is positioned. +The element must be...
 position([String pos], [Number zIndex], [Number x], [Number y]) : voidElement
Initializes positioning on this element. If a desired position is not passed, it will make the +the element positioned...
 query(String selector) : ArrayElement
Selects child nodes based on the passed CSS selector (the selector should not contain an id)
 radioClass(String className) : 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() : Ext.ElementElement
Removes all previous added listeners from this element
 removeClass(String/Array className) : Ext.ElementElement
Removes a CSS class from the element.
 removeListener(String eventName, Function fn) : Ext.ElementElement
Removes an event handler from this element
 repaint() : Ext.ElementElement
Forces the browser to repaint this element
 replace(String/HTMLElement/Element el) : Ext.ElementElement
Replaces the passed element with this element
 replaceClass(String oldClassName, String newClassName) : Ext.ElementElement
Replaces a CSS class on the element with another.
 scroll(String direction, Number distance, [Boolean/Object animate]) : BooleanElement
Scrolls this element the specified direction. Does bounds checking to make sure the scroll is +within this elements s...
 scrollIntoView([String/HTMLElement/Element container], [Boolean hscroll]) : Ext.ElementElement
Scrolls this element into view within the passed container.
 scrollTo(String side, Number value, [Boolean/Object animate]) : ElementElement
Scrolls this element the specified scroll point. It does NOT do bounds checking so if you scroll to a weird value it ...
 select(String selector, Boolean unique) : CompositeElement/CompositeElementLiteElement
Creates a CompositeElement for child nodes based on the passed CSS selector (the selector should not contain an id)
 set(Object o, [Boolean useSet]) : Ext.ElementElement
Sets the passed attributes as attributes of this element (a style attribute can be a string, object or function)
 setBottom(String bottom) : Ext.ElementElement
Set the element's css bottom style
 setBounds(Number x, Number y, Number width, Number height, [Boolean/Object animate]) : 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/Object animate]) : 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) : Ext.ElementElement
Sets the css display. Uses originalDisplay if value is a boolean true.
 setHeight(Number height, [Boolean/Object animate]) : Ext.ElementElement
Set the height of the element
 setLeft(String left) : Ext.ElementElement
Set the element's left position directly using CSS style (instead of setX())
 setLeftTop() : Ext.ElementElement
Quick set left and top adding default units
 setLocation(Number x, Number y, [Boolean/Object animate]) : 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/Object animate]) : Ext.ElementElement
Set the opacity of the element
 setPositioning(Object posCfg) : Ext.ElementElement
Set positioning with an object returned by getPositioning().
 setRegion(Ext.lib.Region region, [Boolean/Object animate]) : Ext.ElementElement
Sets the element's position and size the the specified region. If animation is true then width, height, x and y will ...
 setRight(String right) : Ext.ElementElement
Set the element's css right style
 setSize(Number width, Number height, [Boolean/Object animate]) : 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]) : Ext.ElementElement
Wrapper for setting style properties, also takes single object parameter of multiple styles
 setTop(String top) : Ext.ElementElement
Set the element's top position directly using CSS style (instead of setY())
 setVisibilityMode(visMode Element.VISIBILITY) : 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/Object animate]) : 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/Object animate]) : Ext.ElementElement
Set the width of the element
 setX(Number The, [Boolean/Object animate]) : 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/Object animate]) : 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/Object animate]) : 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...
 setZIndex(Number zindex) : thisLayer
Set the z-index of this layer and adjusts any shadow and shim z-indexes. The layer z-index is automatically +increment...
 show([Boolean/Object animate]) : Ext.ElementElement
Show this element - Uses display mode to determine whether to use "display" or "visibility". See setVisible.
 swallowEvent(String eventName, [Boolean preventDefault]) : Ext.ElementElement
Stops the specified event from bubbling and optionally prevents the default action
 toggle([Boolean/Object animate]) : Ext.ElementElement
Toggles the elements visibility or display, depending on visibility mode.
 toggleClass(String className) : Ext.ElementElement
Toggles (adds or removes) the passed class.
 translatePoints(Number/Array x, Number y, Object An) : voidElement
Translates the passed page coordinates into left/top css values for this element
 unclip() : Ext.ElementElement
Return clipping (overflow) to original clipping before clip() was called
 unmask() : voidElement
Removes a previously applied mask. If removeEl is true the mask overlay is destroyed, otherwise +it is cached for reuse.
 unselectable() : Ext.ElementElement
Disables text selection for this element (normalized across browsers)
 up(String ss, [Number/String/HTMLElement/Element maxDepth]) : Ext.ElementElement
Walks up the dom looking for a parent node that matches the passed simple selector (e.g. div.some-class or span:first...
 update(String html, [Boolean loadScripts], Function callback) : Ext.ElementElement
Update the innerHTML of this element, optionally searching for and processing scripts
 wrap([Object config], [Boolean returnDom]) : /HTMLElementElementElement
Creates and wraps this element with another element
+ +

Public Events

+
This class has no public events.
+

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 cls : StringLayer
CSS class to add to the element
 constrain : BooleanLayer
False to disable constrain to viewport (defaults to true)
 dh : ObjectLayer
DomHelper object config to create element with (defaults to {tag: "div", cls: "x-layer"}).
 shadow : String/BooleanLayer
True to create a shadow element with default class "x-layer-shadow" or you can pass a string with a css class name. F...
 shadowOffset : NumberLayer
Number of pixels to offset the shadow (defaults to 3)
 shim : BooleanLayer
False to disable the iframe shim in browsers which need one (defaults to true)
 zindex : NumberLayer
Starting z-index (defaults to 11000!)
+

Property Details

+
+ +
+

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

+
+
+

Layer

+ public function Layer(Object config, [String/HTMLElement existingEl]) +
+
+ Parameters: +
  • config : Object
  • existingEl : String/HTMLElement
    (optional) Uses an existing dom element. If the element is not found it creates it.
+
+
+
+
+ +

Method Details

+
+ +
+

addClass

+ public function addClass(String/Array className) +
+ Add a CSS class to the element. +
+ Parameters: +
  • className : String/Array
    The CSS class to add or an array of classes
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addClassOnClick

+ public function addClassOnClick(String className) +
+ Sets up event handlers to add and remove a css class when the mouse is down and then up on this element (a click effect) +
+ Parameters: +
  • className : String
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addClassOnFocus

+ public function addClassOnFocus(String className) +
+ Sets up event handlers to add and remove a css class when this element has the focus +
+ Parameters: +
  • className : String
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addClassOnOver

+ public function addClassOnOver(String className, [Boolean preventFlicker]) +
+ Sets up event handlers to add and remove a css class when the mouse is over this element +
+ Parameters: +
  • className : String
  • preventFlicker : Boolean
    (optional) If set to true, it prevents flickering by filtering mouseout events for children elements
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addKeyListener

+ public function addKeyListener(Number/Array/Object/String key, Function fn, [Object scope]) +
+ Convenience method for constructing a KeyMap +
+ Parameters: +
  • key : Number/Array/Object/String
    Either a string with the keys to listen for, 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: +
    +
  • Ext.KeyMap
    The KeyMap created
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addKeyMap

+ public function addKeyMap(Object config) +
+ Creates a KeyMap for this element +
+ Parameters: +
  • config : Object
    The KeyMap config. See Ext.KeyMap for more details
+ Returns: +
    +
  • Ext.KeyMap
    The KeyMap created
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addListener

+ public function addListener(String eventName, Function fn, [Object scope], [Object options]) +
+ Appends an event handler +
+ Parameters: +
  • eventName : String
    The type of event to append
  • fn : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) of the fn
  • options : Object
    (optional)An object with standard EventManager options
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

alignTo

+ public function alignTo(String/HTMLElement/Ext.Element element, String position, [Array offsets], [Boolean/Object animate]) +
+ Aligns this element with another element relative to the specified anchor points. If the other element is the +document it aligns it to the viewport. +The position parameter is optional, and can be specified in any one of the following formats: +
    +
  • Blank: Defaults to aligning the element"s top-left corner to the target"s bottom-left corner ("tl-bl").
  • +
  • One anchor (deprecated): The passed anchor position is used as the target element's anchor point. +The element being aligned will position its top-left corner (tl) to that point. This method has been +deprecated in favor of the newer two anchor syntax below.
  • +
  • Two anchors: If two values from the table below are passed separated by a dash, the first value is used as the +element"s anchor point, and the second value is used as the target"s anchor point.
  • +
+In addition to the anchor points, the position parameter also supports the "?" character. If "?" is passed at the end of +the position string, the element will attempt to align as specified, but the position will be adjusted to constrain to +the viewport if necessary. Note that the element being aligned might be swapped to align to a different position than +that specified in order to enforce the viewport constraints. +Following are all of the supported anchor positions: +
+Value  Description
+-----  -----------------------------
+tl     The top left corner (default)
+t      The center of the top edge
+tr     The top right corner
+l      The center of the left edge
+c      In the center of the element
+r      The center of the right edge
+bl     The bottom left corner
+b      The center of the bottom edge
+br     The bottom right corner
+
+Example Usage: +

+// align el to other-el using the default positioning ("tl-bl", non-constrained)
+el.alignTo("other-el");
+
+// align the top left corner of el with the top right corner of other-el (constrained to viewport)
+el.alignTo("other-el", "tr?");
+
+// align the bottom right corner of el with the center left edge of other-el
+el.alignTo("other-el", "br-l?");
+
+// align the center of el with the bottom left corner of other-el and
+// adjust the x position by -6 pixels (and the y position by 0)
+el.alignTo("other-el", "c-bl", [-6, 0]);
+
+
+ Parameters: +
  • element : String/HTMLElement/Ext.Element
    The element to align to.
  • position : String
    The position to align to.
  • offsets : Array
    (optional) Offset the positioning by [x, y]
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

anchorTo

+ public function anchorTo(String/HTMLElement/Ext.Element element, String position, [Array offsets], [Boolean/Object animate], [Boolean/Number monitorScroll], ) +
+ Anchors an element to another element and realigns it when the window is resized. +
+ Parameters: +
  • element : String/HTMLElement/Ext.Element
    The element to align to.
  • position : String
    The position to align to.
  • offsets : Array
    (optional) Offset the positioning by [x, y]
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
  • monitorScroll : Boolean/Number
    (optional) true to monitor body scroll and reposition. If this parameter is a number, it is used as the buffer delay (defaults to 50ms).
  • :
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

animate

+ public function animate(Object args, [Float duration], [Function onComplete], [String easing], [String animType]) +
+ Perform 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 : String
    (optional) Easing method to use. (Defaults to 'easeOut')
  • animType : String
    (optional) 'run' is the default. Can be 'color', 'motion', or 'scroll'
+ Returns: +
    +
  • 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: +
    +
  • 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: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

autoHeight

+ public function autoHeight([Boolean animate], [Float duration], [Function onComplete], [String 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 : String
    (optional) Easing method to use.
+ Returns: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

blur

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

center

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

child

+ public function child(String selector, Boolean returnDom) +
+ Selects a single child based on the passed CSS selector (the selector should not contain an id) +
+ Parameters: +
  • selector : String
    The CSS selector
  • returnDom : Boolean
    true to return the DOM node instead of Ext.Element
+ Returns: +
    +
  • Element
    The element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

clean

+ public function clean([Boolean forceReclean]) +
+ Removes worthless text nodes +
+ Parameters: +
  • forceReclean : Boolean
    (optional) By default the element keeps track if it has been cleaned already so you can call this over and over. However, if you update the element and need to force a reclean, you can pass true.
+ 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

clearPositioning

+ public function clearPositioning([String value]) +
+ Clear positioning back to the default when the document was loaded +
+ Parameters: +
  • value : String
    (optional) The value to use for the left,right,top,bottom, defaults to '' (empty string). You could use 'auto'.
+ Returns: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

contains

+ public function contains(HTMLElement/String el) +
+ Returns true if this element is an ancestor of the passed element +
+ Parameters: +
  • el : HTMLElement/String
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Element.
+
+ +
+

createChild

+ public function createChild(Object config, [HTMLElement insertBefore], [Boolean returnDom]) +
+ 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
  • returnDom : Boolean
    (optional) true to return the dom node instead of creating an Element
+ Returns: +
    +
  • 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: +
    +
  • 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: +
    +
  • Ext.Element
    The new shim element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

down

+ public function down(String selector, Boolean returnDom) +
+ Selects a single *direct* child based on the passed CSS selector (the selector should not contain an id) +
+ Parameters: +
  • selector : String
    The CSS selector
  • returnDom : Boolean
    true to return the DOM node instead of Ext.Element
+ Returns: +
    +
  • Element
    The 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

endMeasure

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

findParent

+ public function findParent(String ss, [Number/String/HTMLElement/Element maxDepth], [Boolean returnEl]) +
+ Looks at this node and then at parent nodes for a match of the passed simple selector (e.g. div.some-class or span:first-child) +
+ Parameters: +
  • ss : String
    The simple selector to test
  • maxDepth : Number/String/HTMLElement/Element
    (optional) The max depth to search as a number or element (defaults to 10 || document.body)
  • returnEl : Boolean
    (optional) True to return a Ext.Element object instead of DOM node
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Element.
+
+ +
+

findParentNode

+ public function findParentNode(String ss, [Number/String/HTMLElement/Element maxDepth], [Boolean returnEl]) +
+ Looks at parent nodes for a match of the passed simple selector (e.g. div.some-class or span:first-child) +
+ Parameters: +
  • ss : String
    The simple selector to test
  • maxDepth : Number/String/HTMLElement/Element
    (optional) The max depth to search as a number or element (defaults to 10 || document.body)
  • returnEl : Boolean
    (optional) True to return a Ext.Element object instead of DOM node
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Element.
+
+ +
+

fitToParent

+ public function fitToParent([Boolean monitorResize], [String/HTMLElment/Element targetParent]) +
+ Sizes this element to its parent element's dimensions performing +neccessary box adjustments. +
+ Parameters: +
  • monitorResize : Boolean
    (optional) If true maintains the fit when the browser window is resized.
  • targetParent : String/HTMLElment/Element
    (optional) The target parent, default to the parentNode.
+ Returns: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getAlignToXY

+ public function getAlignToXY(String/HTMLElement/Ext.Element element, String position, [Array offsets]) +
+ Gets the x,y coordinates to align this element with another element. See alignTo for more info on the +supported position values. +
+ Parameters: +
  • element : String/HTMLElement/Ext.Element
    The element to align to.
  • position : String
    The position to align to.
  • offsets : Array
    (optional) Offset the positioning by [x, y]
+ Returns: +
    +
  • Array
    [x, y]
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getAnchorXY

+ public function getAnchorXY([String anchor], [Object size], [Boolean local]) +
+ Gets the x,y coordinates specified by the anchor position on the element. +
+ Parameters: +
  • anchor : String
    (optional) The specified anchor position (defaults to "c"). See alignTo for details on supported anchor positions.
  • size : Object
    (optional) An object containing the size to use for calculating anchor position {width: (target width), height: (target height)} (defaults to the element's current size)
  • local : Boolean
    (optional) True to get the local (element top/left-relative) anchor position instead of page coordinates
+ Returns: +
    +
  • Array
    [x, y] An array containing the element's x and y coordinates
  • +
+
+
+
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() +
+ Calculates the x, y to center this element on the screen +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
    The x, y values [x, y]
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getColor

+ public function getColor(String attr, String defaultValue, [String prefix]) +
+ Return the CSS color for the specified CSS attribute. rgb, 3 digit (like #fff) and valid values +are convert to standard 6 digit hex color. +
+ Parameters: +
  • attr : String
    The css attribute
  • defaultValue : String
    The default value to use when a valid color isn't found
  • prefix : String
    (optional) defaults to #. Use an empty string when working with YUI color anims.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getComputedHeight

+ public function getComputedHeight() +
+ Returns either the offsetHeight or the height of this element based on CSS height adjusted by padding or borders +when needed to simulate offsetHeight when offsets aren't available. This may not work on display:none elements +if a height has not been set using CSS. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getComputedWidth

+ public function getComputedWidth() +
+ Returns either the offsetWidth or the width of this element based on CSS width adjusted by padding or borders +when needed to simulate offsetWidth when offsets aren't available. This may not work on display:none elements +if a width has not been set using CSS. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getFrameWidth

+ public function getFrameWidth(String sides) +
+ Returns the sum width of the padding and borders for the passed "sides". See getBorderWidth() + for more information about the sides. +
+ Parameters: +
  • sides : String
+ Returns: +
    +
  • Number
  • +
+
+
+
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 Ext.lib.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. This is not YUI getStyle, it is an optimised version. +
+ 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.
+
+ +
+

getStyles

+ public function getStyles(String style1, String style2, String etc) +
+ Get an object with properties matching the styles requested. +e.g. el.getStyles('color', 'font-size', 'width') might return +{'color': '#FFFFFF', 'font-size': '13px', 'width': '100px'}. +
+ Parameters: +
  • style1 : String
  • style2 : String
  • etc : String
+ Returns: +
    +
  • Object
  • +
+
+
+
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: +
    +
  • Ext.UpdateManager
    The UpdateManager
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getValue

+ public function getValue(Boolean asNumber) +
+ Returns the value of the "value" attribute +
+ Parameters: +
  • asNumber : Boolean
    true to parse the value as a number
+ Returns: +
    +
  • String/Number
  • +
+
+
+
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). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
    The X position of the element
  • +
+
+
+
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). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
    The XY position of the element
  • +
+
+
+
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). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
    The Y position of the element
  • +
+
+
+
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/Object animate]) +
+ Hide this element - Uses display mode to determine whether to use "display" or "visibility". See setVisible. +
+ Parameters: +
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

initDD

+ public function initDD(String group, Object config, Object overrides) +
+ Initializes a Ext.dd.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: +
    +
  • Ext.dd.DD
    The DD object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

initDDProxy

+ public function initDDProxy(String group, Object config, Object overrides) +
+ Initializes a Ext.dd.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: +
    +
  • Ext.dd.DDProxy
    The DDProxy object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

initDDTarget

+ public function initDDTarget(String group, Object config, Object overrides) +
+ Initializes a Ext.dd.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: +
    +
  • Ext.dd.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: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

insertFirst

+ public function insertFirst(String/HTMLElement/Element/Object el) +
+ Inserts (or creates) an element (or DomHelper config) as the first child of the this element +
+ Parameters: +
  • el : String/HTMLElement/Element/Object
    The id or element to insert or a DomHelper config to create and insert
+ Returns: +
    +
  • Ext.Element
    The new child
  • +
+
+
+
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: +
    +
  • HTMLElement
    The inserted node (or nearest related if more than 1 inserted)
  • +
+
+
+
This method is defined by Element.
+
+ +
+

insertSibling

+ public function insertSibling(String/HTMLElement/Element/Object el, [String where], [Boolean returnDom]) +
+ Inserts (or creates) the passed element (or DomHelper config) as a sibling of this element +
+ Parameters: +
  • el : String/HTMLElement/Element/Object
    The id or element to insert or a DomHelper config to create and insert
  • where : String
    (optional) 'before' or 'after' defaults to before
  • returnDom : Boolean
    (optional) True to return the raw DOM element instead of Ext.Element
+ Returns: +
    +
  • Ext.Element
    the inserted Element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

is

+ public function is(String ss) +
+ Returns true if this element matches the passed simple selector (e.g. div.some-class or span:first-child) +
+ Parameters: +
  • ss : String
    The simple selector to test
+ Returns: +
    +
  • Boolean
  • +
+
+
+
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.
+
+ +
+

isMasked

+ public function isMasked() +
+ Returns true if this element is masked +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Element.
+
+ +
+

isScrollable

+ public function isScrollable() +
+ Returns true if this element is scrollable. +
+ 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

mask

+ public function mask([String msg], [String msgCls]) +
+ Puts a mask over this element to disable user interaction. Requires core.css. +This method can only be applied to elements which accept child nodes. +
+ Parameters: +
  • msg : String
    (optional) A message to display in the mask
  • msgCls : String
    (optional) A css class to apply to the msg element
+ Returns: +
    +
  • Element
    The message element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

move

+ public function move(String direction, Number distance, [Boolean/Object animate]) +
+ Move this element relative to its 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

moveTo

+ public function moveTo(Number x, Number y, [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

position

+ public function position([String pos], [Number zIndex], [Number x], [Number y]) +
+ Initializes positioning on this element. If a desired position is not passed, it will make the +the element positioned relative IF it is not already positioned. +
+ Parameters: +
  • pos : String
    (optional) Positioning to use "relative", "absolute" or "fixed"
  • zIndex : Number
    (optional) The zIndex to apply
  • x : Number
    (optional) Set the page X position
  • y : Number
    (optional) Set the page Y position
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

query

+ public function query(String selector) +
+ Selects child nodes based on the passed CSS selector (the selector should not contain an id) +
+ Parameters: +
  • selector : String
    The CSS selector
+ Returns: +
    +
  • Array
    An array of the matched nodes
  • +
+
+
+
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: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

removeClass

+ public function removeClass(String/Array className) +
+ Removes a CSS class from the element. +
+ Parameters: +
  • className : String/Array
    The CSS class to remove or an array of classes
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

removeListener

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

repaint

+ public function repaint() +
+ Forces the browser to repaint this element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • 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: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

scroll

+ public function scroll(String direction, Number distance, [Boolean/Object animate]) +
+ Scrolls this element the specified direction. Does bounds checking to make sure the scroll is +within this elements scrollable range. +
+ Parameters: +
  • direction : String
    Possible values are: "l","left" - "r","right" - "t","top","up" - "b","bottom","down".
  • distance : Number
    How far to scroll the element in pixels
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Boolean
    Returns true if a scroll was triggered or false if the element was scrolled as far as it could go.
  • +
+
+
+
This method is defined by Element.
+
+ +
+

scrollIntoView

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

scrollTo

+ public function scrollTo(String side, Number value, [Boolean/Object animate]) +
+ Scrolls this element the specified scroll point. It does NOT do bounds checking so if you scroll to a weird value it will try to do it. For auto bounds checking, use scroll(). +
+ Parameters: +
  • side : String
    Either "left" for scrollLeft values or "top" for scrollTop values.
  • value : Number
    The new scroll value
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

select

+ public function select(String selector, Boolean unique) +
+ Creates a CompositeElement for 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 Ext.Element for each child (defaults to a shared flyweight object)
+ Returns: +
    +
  • CompositeElement/CompositeElementLite
    The composite element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

set

+ public function set(Object o, [Boolean useSet]) +
+ 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
  • useSet : Boolean
    (optional) false to override the default setAttribute to use expandos.
+ Returns: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setBounds

+ public function setBounds(Number x, Number y, Number width, Number height, [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setBox

+ public function setBox(Object box, [Boolean adjust], [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • 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 its default display or a string to set the display directly
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setHeight

+ public function setHeight(Number height, [Boolean/Object animate]) +
+ Set the height of the element +
+ Parameters: +
  • height : Number
    The new height
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setLeftTop

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

setLocation

+ public function setLocation(Number x, Number y, [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setOpacity

+ public function setOpacity(Float opacity, [Boolean/Object animate]) +
+ Set the opacity of the element +
+ Parameters: +
  • opacity : Float
    The new opacity. 0 = transparent, .5 = 50% visibile, 1 = fully visible, etc
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setRegion

+ public function setRegion(Ext.lib.Region region, [Boolean/Object animate]) +
+ 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 : Ext.lib.Region
    The region to fill
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setSize

+ public function setSize(Number width, Number height, [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • 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: +
    +
  • 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: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible, [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setWidth

+ public function setWidth(Number width, [Boolean/Object animate]) +
+ Set the width of the element +
+ Parameters: +
  • width : Number
    The new width
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setX

+ public function setX(Number The, [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setXY

+ public function setXY(Array pos, [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setY

+ public function setY(Number The, [Boolean/Object animate]) +
+ 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/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setZIndex

+ public function setZIndex(Number zindex) +
+ Set the z-index of this layer and adjusts any shadow and shim z-indexes. The layer z-index is automatically +incremented by two more than the value passed in so that it always shows above any shadow or shim (the shadow +element, if any, will be assigned z-index + 1, and the shim element, if any, will be assigned the unmodified z-index). +
+ Parameters: +
  • zindex : Number
    The new z-index to set
+ Returns: +
    +
  • this
    The Layer
  • +
+
+
+
This method is defined by Layer.
+
+ +
+

show

+ public function show([Boolean/Object animate]) +
+ Show this element - Uses display mode to determine whether to use "display" or "visibility". See setVisible. +
+ Parameters: +
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • 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 prevents the default action +
+ Parameters: +
  • eventName : String
  • preventDefault : Boolean
    (optional) true to prevent the default action too
+ Returns: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

toggle

+ public function toggle([Boolean/Object animate]) +
+ Toggles the elements visibility or display, depending on visibility mode. +
+ Parameters: +
  • animate : Boolean/Object
    (optional) true for the default animation or a standard Element animation config object
+ Returns: +
    +
  • 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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

translatePoints

+ public function translatePoints(Number/Array x, Number y, Object An) +
+ Translates the passed page coordinates into left/top css values for this element +
+ Parameters: +
  • x : Number/Array
    The page x or an array containing [x, y]
  • y : Number
    The page y
  • An : Object
    object with left and top properties. e.g. {left: (value), top: (value)}
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

unclip

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

unmask

+ public function unmask() +
+ Removes a previously applied mask. If removeEl is true the mask overlay is destroyed, otherwise +it is cached for reuse. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

unselectable

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

up

+ public function up(String ss, [Number/String/HTMLElement/Element maxDepth]) +
+ Walks up the dom looking for a parent node that matches the passed simple selector (e.g. div.some-class or span:first-child). +This is a shortcut for findParentNode() that always returns an Ext.Element. +
+ Parameters: +
  • ss : String
    The simple selector to test
  • maxDepth : Number/String/HTMLElement/Element
    (optional) The max depth to search as a number or element (defaults to 10 || document.body)
+ Returns: +
    +
  • Ext.Element
  • +
+
+
+
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: +
    +
  • Ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

wrap

+ public function wrap([Object config], [Boolean returnDom]) +
+ 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
  • returnDom : Boolean
    (optional) True to return the raw DOM element instead of Ext.Element
+ Returns: +
    +
  • /HTMLElementElement
    The newly created wrapper element
  • +
+
+
+
This method is defined by Element.
+
+
+ +

Config Details

+
+ +
+

cls

+ cls : String +
+ CSS class to add to the element
+
This config option is defined by Layer.
+
+ +
+

constrain

+ constrain : Boolean +
+ False to disable constrain to viewport (defaults to true)
+
This config option is defined by Layer.
+
+ +
+

dh

+ dh : Object +
+ DomHelper object config to create element with (defaults to {tag: "div", cls: "x-layer"}).
+
This config option is defined by Layer.
+
+ +
+

shadow

+ shadow : String/Boolean +
+ True to create a shadow element with default class "x-layer-shadow" or you can pass a string with a css class name. False turns off the shadow.
+
This config option is defined by Layer.
+
+ +
+

shadowOffset

+ shadowOffset : Number +
+ Number of pixels to offset the shadow (defaults to 3)
+
This config option is defined by Layer.
+
+ +
+

shim

+ shim : Boolean +
+ False to disable the iframe shim in browsers which need one (defaults to true)
+
This config option is defined by Layer.
+
+ +
+

zindex

+ zindex : Number +
+ Starting z-index (defaults to 11000!)
+
This config option is defined by Layer.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.LayoutDialog.html b/www/extras/yui-ext/docs/output/Ext.LayoutDialog.html new file mode 100644 index 000000000..78f90b647 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.LayoutDialog.html @@ -0,0 +1,1660 @@ + + + + Ext.LayoutDialog + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.LayoutDialog

+ + + + + +
Package: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 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 Ext.BorderLayout("dl-inner", {
+        east: {
+            initialSize: 200,
+            autoScroll:true,
+            split:true
+        },
+        center: {
+            autoScroll:true
+        }
+    });
+    innerLayout.beginUpdate();
+    innerLayout.add("east", new Ext.ContentPanel("dl-details"));
+    innerLayout.add("center", new Ext.ContentPanel("selection-panel"));
+    innerLayout.endUpdate(true);
+
+    var layout = dialog.getLayout();
+    layout.beginUpdate();
+    layout.add("center", new Ext.ContentPanel("standard-panel",
+                        {title: "Download the Source", fitToFrame:true}));
+    layout.add("center", new Ext.NestedLayoutPanel(innerLayout,
+               {title: "Build your own ext.js"}));
+    layout.getRegion("center").showPanel(sp);
+    layout.endUpdate();
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 body : Ext.ElementBasicDialog
The body element
 buttons : ArrayBasicDialog
Array of all the buttons that have been added to this dialog via addButton
 footer : Ext.ElementBasicDialog
The footer element
 header : Ext.ElementBasicDialog
The header element
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 LayoutDialog(String/HTMLElement/Ext.Element el, Object config)LayoutDialog
 addButton(String/Object config, Function handler, [Object scope]) : Ext.ButtonBasicDialog
Adds a button to the footer section of the dialog.
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addKeyListener(Number/Array/Object key, Function fn, [Object scope]) : Ext.BasicDialogBasicDialog
Adds a key listener for when this dialog is displayed. This allows you to hook in a function that will be +executed i...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 alignTo(String/HTMLElement/Ext.Element element, String position, [Array offsets]) : Ext.BasicDialogBasicDialog
Aligns the dialog to the specified element
 anchorTo(String/HTMLElement/Ext.Element element, String position, [Array offsets], [Boolean/Number monitorScroll]) : Ext.BasicDialogBasicDialog
Anchors an element to another element and realigns it when the window is resized.
 beginUpdate() : voidLayoutDialog
Deprecated. Begins an update of the layout and sets display to block and visibility to hidden. Use standard beginUpda...
 center() : Ext.BasicDialogBasicDialog
Centers this dialog in the viewport
 collapse() : voidBasicDialog
Collapses the dialog to its minimized state (only the title bar is visible). +Equivalent to the user clicking the coll...
 destroy([Boolean removeEl]) : voidBasicDialog
Destroys this dialog and all its supporting elements (including any tabs, shim, +shadow, proxy, mask, etc.) Also remo...
 endUpdate() : voidLayoutDialog
Deprecated. Ends update of the layout and resets display to none. Use standard beginUpdate/endUpdate on the layout.
 expand() : voidBasicDialog
Expands a collapsed dialog back to its normal state. Equivalent to the user +clicking the expand dialog button.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus() : voidBasicDialog
Focuses the dialog. If a defaultButton is set, it will receive focus, otherwise the +dialog itself will receive focus.
 getEl() : Ext.ElementBasicDialog
Returns the element for this dialog
 getLayout() : Ext.BorderLayoutLayoutDialog
Get the BorderLayout for this dialog
 getTabs() : Ext.TabPanelBasicDialog
Returns the TabPanel component (creates it if it doesn't exist). +Note: If you wish to simply check for the existence ...
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide([Function callback]) : Ext.BasicDialogBasicDialog
Hides the dialog.
 initTabs() : Ext.TabPanelBasicDialog
Reinitializes the tabs component, clearing out old tabs and finding new ones.
 isVisible() : BooleanBasicDialog
Returns true if the dialog is visible
 moveTo(Number x, Number y) : Ext.BasicDialogBasicDialog
Moves the dialog's top-left corner to the specified point
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 resizeTo(Number width, Number height) : Ext.BasicDialogBasicDialog
Resizes the dialog.
 restoreState() : Ext.BasicDialogBasicDialog
Restores the previous state of the dialog if Ext.state is configured.
 setContentSize(Number width, Number height) : Ext.BasicDialogBasicDialog
Resizes the dialog to fit the specified content size.
 setDefaultButton(Ext.BasicDialog.Button btn) : Ext.BasicDialogBasicDialog
Sets the default button to be focused when the dialog is displayed.
 setTitle(String text) : Ext.BasicDialogBasicDialog
Sets the dialog title text
 show([String/HTMLElement/Ext.Element animateTarget]) : Ext.BasicDialogBasicDialog
Shows the dialog.
 toBack() : Ext.BasicDialogBasicDialog
Sends this dialog to the back (under) of any other visible dialogs
 toFront() : Ext.BasicDialogBasicDialog
Brings this dialog to the front of any other visible dialogs
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

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

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 animateTarget : String/ElementBasicDialog
Id or element from which the dialog should animate while opening (defaults to null with no animation)
 autoCreate : Boolean/DomHelperBasicDialog
True to auto create from scratch, or using a DomHelper Object (defaults to false)
 autoScroll : BooleanBasicDialog
True to allow the dialog body contents to overflow and display scrollbars (defaults to false)
 autoTabs : BooleanBasicDialog
If true, all elements with class 'x-dlg-tab' will get automatically converted to tabs (defaults to false)
 buttonAlign : StringBasicDialog
Valid values are "left," "center" and "right" (defaults to "right")
 closable : BooleanBasicDialog
False to remove the built-in top-right corner close button (defaults to true)
 collapsible : BooleanBasicDialog
False to remove the built-in top-right corner collapse button (defaults to true)
 constraintoviewport : BooleanBasicDialog
True to keep the dialog constrained within the visible viewport boundaries (defaults to true)
 draggable : BooleanBasicDialog
False to disable dragging of the dialog within the viewport (defaults to true)
 fixedcenter : BooleanBasicDialog
True to ensure that anytime the dialog is shown or resized it gets centered (defaults to false)
 height : NumberBasicDialog
Height of the dialog in pixels (can also be set via CSS). Determined by browser if unspecified.
 minButtonWidth : NumberBasicDialog
Minimum width of all dialog buttons (defaults to 75)
 minHeight : NumberBasicDialog
The minimum allowable height for a resizable dialog (defaults to 80)
 minWidth : NumberBasicDialog
The minimum allowable width for a resizable dialog (defaults to 200)
 modal : BooleanBasicDialog
True to show the dialog modally, preventing user interaction with the rest of the page (defaults to false)
 proxyDrag : BooleanBasicDialog
True to drag a lightweight proxy element rather than the dialog itself, used when draggable = true (defaults to false)
 resizable : BooleanBasicDialog
False to disable manual dialog resizing (defaults to true)
 resizeHandles : StringBasicDialog
Which resize handles to display - see the Ext.Resizable handles config property for valid values (defaults to 'all')
 shadow : Boolean/StringBasicDialog
True or "sides" for the default effect, "frame" for 4-way shadow, and "drop" for bottom-right shadow (defaults to false)
 shadowOffset : NumberBasicDialog
The number of pixels to offset the shadow if displayed (defaults to 5)
 shim : BooleanBasicDialog
True to create an iframe shim that prevents selects from showing through (defaults to false)
 syncHeightBeforeShow : BooleanBasicDialog
True to cause the dimensions to be recalculated before the dialog is shown (defaults to false)
 tabTag : StringBasicDialog
The tag name of tab elements, used when autoTabs = true (defaults to 'div')
 title : StringBasicDialog
Default text to display in the title bar (defaults to null)
 width : NumberBasicDialog
Width of the dialog in pixels (can also be set via CSS). Determined by browser if unspecified.
 x : NumberBasicDialog
The default top page coordinate of the dialog (defaults to center screen)
 y : NumberBasicDialog
The default left page coordinate of the dialog (defaults to center screen)
+

Property Details

+
+ +
+

body

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

buttons

+ public Array buttons +
+ Array of all the buttons that have been added to this dialog via addButton
+
This property is defined by BasicDialog.
+
+ +
+

footer

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

header

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

Constructor Details

+
+
+

LayoutDialog

+ public function LayoutDialog(String/HTMLElement/Ext.Element el, Object config) +
+
+ Parameters: +
  • el : String/HTMLElement/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 to the footer section of the dialog. +
+ Parameters: +
  • config : String/Object
    A string becomes the button text, an object can either be a Button config object or a valid Ext.DomHelper element config
  • handler : Function
    The function called when the button is clicked
  • scope : Object
    (optional) The scope of the handler function
+ Returns: +
    +
  • Ext.Button
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addKeyListener

+ public function addKeyListener(Number/Array/Object key, Function fn, [Object scope]) +
+ Adds a key listener for when this dialog is displayed. This allows you to hook in a function that will be +executed in response to a particular key being pressed while the dialog is active. +
+ 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: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

alignTo

+ public function alignTo(String/HTMLElement/Ext.Element element, String position, [Array offsets]) +
+ Aligns the dialog to the specified element +
+ Parameters: +
  • element : String/HTMLElement/Ext.Element
    The element to align to.
  • position : String
    The position to align to (see Ext.Element.alignTo for more details).
  • offsets : Array
    (optional) Offset the positioning by [x, y]
+ Returns: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

anchorTo

+ public function anchorTo(String/HTMLElement/Ext.Element element, String position, [Array offsets], [Boolean/Number monitorScroll]) +
+ Anchors an element to another element and realigns it when the window is resized. +
+ Parameters: +
  • element : String/HTMLElement/Ext.Element
    The element to align to.
  • position : String
    The position to align to (see Ext.Element.alignTo for more details)
  • offsets : Array
    (optional) Offset the positioning by [x, y]
  • monitorScroll : Boolean/Number
    (optional) true to monitor body scroll and reposition. If this parameter is a number, it is used as the buffer delay (defaults to 50ms).
+ Returns: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

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.
+
+ +
+

center

+ public function center() +
+ Centers this dialog in the viewport +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

collapse

+ public function collapse() +
+ Collapses the dialog to its minimized state (only the title bar is visible). +Equivalent to the user clicking the collapse dialog button. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

destroy

+ public function destroy([Boolean removeEl]) +
+ Destroys this dialog and all its supporting elements (including any tabs, shim, +shadow, proxy, mask, etc.) Also removes all event listeners. +
+ 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.
+
+ +
+

expand

+ public function expand() +
+ Expands a collapsed dialog back to its normal state. Equivalent to the user +clicking the expand dialog button. +
+ Parameters: +
  • None.
+ 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.
+
+ +
+

focus

+ public function focus() +
+ Focuses the dialog. If a defaultButton is set, it will receive focus, otherwise the +dialog itself will receive focus. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

getEl

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

getLayout

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

getTabs

+ public function getTabs() +
+ Returns the TabPanel component (creates it if it doesn't exist). +Note: If you wish to simply check for the existence of tabs without creating them, +check for a null 'tabs' property. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.TabPanel
    The tabs component
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

initTabs

+ public function initTabs() +
+ Reinitializes the tabs component, clearing out old tabs and finding new ones. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.TabPanel
    The tabs component
  • +
+
+
+
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's top-left corner to the specified point +
+ Parameters: +
  • x : Number
  • y : Number
+ Returns: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

resizeTo

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

restoreState

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

setContentSize

+ public function setContentSize(Number width, Number height) +
+ Resizes the dialog to fit the specified content size. +
+ Parameters: +
  • width : Number
  • height : Number
+ Returns: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

setDefaultButton

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

setTitle

+ public function setTitle(String text) +
+ Sets the dialog title text +
+ Parameters: +
  • text : String
    The title text to display
+ Returns: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

show

+ public function show([String/HTMLElement/Ext.Element animateTarget]) +
+ Shows the dialog. +
+ Parameters: +
  • animateTarget : String/HTMLElement/Ext.Element
    (optional) Reset the animation target
+ Returns: +
    +
  • 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: +
    +
  • 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: +
    +
  • Ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

beforehide

+ public event beforehide +
+ Fires before this dialog is hidden. +
+ Subscribers will be called with the following parameters: +
  • this : 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 : 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 : 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 : Ext.BasicDialog
  • e : 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 : 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 : 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 : Ext.BasicDialog
+
+
+
This event is defined by BasicDialog.
+
+
+

Config Details

+
+ +
+

animateTarget

+ animateTarget : String/Element +
+ Id or element from which the dialog should animate while opening (defaults to null with no animation)
+
This config option is defined by BasicDialog.
+
+ +
+

autoCreate

+ autoCreate : Boolean/DomHelper +
+ True to auto create from scratch, or using a DomHelper Object (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

autoScroll

+ autoScroll : Boolean +
+ True to allow the dialog body contents to overflow and display scrollbars (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

autoTabs

+ autoTabs : Boolean +
+ If true, all elements with class 'x-dlg-tab' will get automatically converted to tabs (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

buttonAlign

+ buttonAlign : String +
+ Valid values are "left," "center" and "right" (defaults to "right")
+
This config option is defined by BasicDialog.
+
+ +
+

closable

+ closable : Boolean +
+ False to remove the built-in top-right corner close button (defaults to true)
+
This config option is defined by BasicDialog.
+
+ +
+

collapsible

+ collapsible : Boolean +
+ False to remove the built-in top-right corner collapse button (defaults to true)
+
This config option is defined by BasicDialog.
+
+ +
+

constraintoviewport

+ constraintoviewport : Boolean +
+ True to keep the dialog constrained within the visible viewport boundaries (defaults to true)
+
This config option is defined by BasicDialog.
+
+ +
+

draggable

+ draggable : Boolean +
+ False to disable dragging of the dialog within the viewport (defaults to true)
+
This config option is defined by BasicDialog.
+
+ +
+

fixedcenter

+ fixedcenter : Boolean +
+ True to ensure that anytime the dialog is shown or resized it gets centered (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

height

+ height : Number +
+ Height of the dialog in pixels (can also be set via CSS). Determined by browser if unspecified.
+
This config option is defined by BasicDialog.
+
+ +
+

minButtonWidth

+ minButtonWidth : Number +
+ Minimum width of all dialog buttons (defaults to 75)
+
This config option is defined by BasicDialog.
+
+ +
+

minHeight

+ minHeight : Number +
+ The minimum allowable height for a resizable dialog (defaults to 80)
+
This config option is defined by BasicDialog.
+
+ +
+

minWidth

+ minWidth : Number +
+ The minimum allowable width for a resizable dialog (defaults to 200)
+
This config option is defined by BasicDialog.
+
+ +
+

modal

+ modal : Boolean +
+ True to show the dialog modally, preventing user interaction with the rest of the page (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

proxyDrag

+ proxyDrag : Boolean +
+ True to drag a lightweight proxy element rather than the dialog itself, used when draggable = true (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

resizable

+ resizable : Boolean +
+ False to disable manual dialog resizing (defaults to true)
+
This config option is defined by BasicDialog.
+
+ +
+

resizeHandles

+ resizeHandles : String +
+ Which resize handles to display - see the Ext.Resizable handles config property for valid values (defaults to 'all')
+
This config option is defined by BasicDialog.
+
+ +
+

shadow

+ shadow : Boolean/String +
+ True or "sides" for the default effect, "frame" for 4-way shadow, and "drop" for bottom-right shadow (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

shadowOffset

+ shadowOffset : Number +
+ The number of pixels to offset the shadow if displayed (defaults to 5)
+
This config option is defined by BasicDialog.
+
+ +
+

shim

+ shim : Boolean +
+ True to create an iframe shim that prevents selects from showing through (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

syncHeightBeforeShow

+ syncHeightBeforeShow : Boolean +
+ True to cause the dimensions to be recalculated before the dialog is shown (defaults to false)
+
This config option is defined by BasicDialog.
+
+ +
+

tabTag

+ tabTag : String +
+ The tag name of tab elements, used when autoTabs = true (defaults to 'div')
+
This config option is defined by BasicDialog.
+
+ +
+

title

+ title : String +
+ Default text to display in the title bar (defaults to null)
+
This config option is defined by BasicDialog.
+
+ +
+

width

+ width : Number +
+ Width of the dialog in pixels (can also be set via CSS). Determined by browser if unspecified.
+
This config option is defined by BasicDialog.
+
+ +
+

x

+ x : Number +
+ The default top page coordinate of the dialog (defaults to center screen)
+
This config option is defined by BasicDialog.
+
+ +
+

y

+ y : Number +
+ The default left page coordinate of the dialog (defaults to center screen)
+
This config option is defined by BasicDialog.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.LayoutManager.html b/www/extras/yui-ext/docs/output/Ext.LayoutManager.html new file mode 100644 index 000000000..9f77eed1c --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.LayoutManager.html @@ -0,0 +1,529 @@ + + + + Ext.LayoutManager + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.LayoutManager

+ + + + + + +
Package:Ext
Class:LayoutManager
Extends:Observable
Subclasses:BorderLayout
Defined In:LayoutManager.js
+
+ Base class for layout managers.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

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

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 beginUpdate() : voidLayoutManager
Suspend the LayoutManager from doing auto-layouts while +making multiple add or remove calls
 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() : Ext.ElementLayoutManager
Returns the element this layout is bound to.
 getRegion(String target) : 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 ...
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 isUpdating() : BooleanLayoutManager
Returns true if this layout is currently being updated
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 layout : (Ext.LayoutManager this)LayoutManager
Fires when a layout is performed.
 regioncollapsed : (Ext.LayoutRegion region)LayoutManager
Fires when a region is collapsed.
 regionexpanded : (Ext.LayoutRegion region)LayoutManager
Fires when a region is expanded.
 regionresized : (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

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ 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.
+
+ +
+

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: +
    +
  • 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: +
    +
  • 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.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

isUpdating

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

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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 : 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 : 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 : 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 : Ext.LayoutRegion
  • newSize : Number
    The new size (width for east/west, height for north/south)
+
+
+
This event is defined by LayoutManager.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.LayoutRegion.html b/www/extras/yui-ext/docs/output/Ext.LayoutRegion.html new file mode 100644 index 000000000..846697431 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.LayoutRegion.html @@ -0,0 +1,1418 @@ + + + + Ext.LayoutRegion + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.LayoutRegion

+ + + + + + +
Package:Ext
Class:LayoutRegion
Extends:BasicLayoutRegion
Subclasses:SplitLayoutRegion
Defined In:LayoutRegion.js
+
+ This class represents a region in a layout manager.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 bodyEl : Ext.ElementLayoutRegion
This regions body element
 collapsedEl : Ext.ElementLayoutRegion
This region's collapsed element
 el : Ext.ElementLayoutRegion
This regions container element
 panels : Ext.util.MixedCollectionBasicLayoutRegion
A collection of panels in this region.
 titleTextEl : HTMLElementLayoutRegion
This regions title text element
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 add(ContentPanel... panel) : Ext.ContentPanelLayoutRegion
Add the passed ContentPanel(s)
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 collapse([Boolean skipAnim]) : voidLayoutRegion
Collapses this region.
 expand(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() : Ext.ContentPanelLayoutRegion
Get the active panel for this region.
 getEl() : Ext.ElementLayoutRegion
Returns the container element for this region.
 getPanel(Number/String/ContentPanel panel) : Ext.ContentPanelBasicLayoutRegion
Returns the panel specified or null if it's not in this region.
 getPosition() : StringBasicLayoutRegion
Returns this regions position (north/south/east/west/center).
 getTabs() : Ext.TabPanelLayoutRegion
Returns the TabPanel component used by this region
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hasPanel(Number/String/ContentPanel panel) : BooleanBasicLayoutRegion
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.
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 remove(Number/String/ContentPanel panel, Boolean preservePanel) : 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) : voidBasicLayoutRegion
Resizes the region to the specified size. For vertical regions (west, east) this adjusts +the width, for horizontal (...
 setCollapsedTitle() : voidLayoutRegion
Updates the collapsed text for north/south regions (used with collapsedTitle config option)
 show() : voidLayoutRegion
Shows this region if it was previously hidden.
 showPanel(Number/String/ContentPanel panelId) : Ext.ContentPanelLayoutRegion
Show the specified panel.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 unhidePanel(Number/String/ContentPanel panel) : voidLayoutRegion
Unhides the tab for a previously hidden panel.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeremove : (Ext.LayoutRegion this, Ext.ContentPanel panel, Object e)BasicLayoutRegion
Fires before a panel is removed (or closed). To cancel the removal set "e.cancel = true" on the event argument.
 collapsed : (Ext.LayoutRegion this)BasicLayoutRegion
Fires when this region is collapsed.
 expanded : (Ext.LayoutRegion this)BasicLayoutRegion
Fires when this region is expanded.
 invalidated : (Ext.LayoutRegion this)BasicLayoutRegion
Fires when the layout for this region is changed.
 panelactivated : (Ext.LayoutRegion this, Ext.ContentPanel panel)BasicLayoutRegion
Fires when a panel is activated.
 paneladded : (Ext.LayoutRegion this, Ext.ContentPanel panel)BasicLayoutRegion
Fires when a panel is added.
 panelremoved : (Ext.LayoutRegion this, Ext.ContentPanel panel)BasicLayoutRegion
Fires when a panel is removed.
 resized : (Ext.LayoutRegion this, Number newSize)BasicLayoutRegion
Fires when the user resizes this region.
 slidehide : (Ext.LayoutRegion this)BasicLayoutRegion
Fires when this region slides out of view.
 slideshow : (Ext.LayoutRegion this)BasicLayoutRegion
Fires when this region is slid into view.
 visibilitychange : (Ext.LayoutRegion this, Boolean visibility)BasicLayoutRegion
Fires when this region is shown or hidden
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 alwaysShowTabs : BooleanLayoutRegion
True to always display tabs even when only 1 panel (defaults to false)
 animate : BooleanLayoutRegion
True to animate expand/collapse (defaults to false)
 autoHide : BooleanLayoutRegion
False to disable autoHide when the mouse leaves the "floated" region (defaults to true)
 autoScroll : BooleanLayoutRegion
True to enable overflow scrolling (defaults to false)
 closeOnTab : BooleanLayoutRegion
True to place the close icon on the tabs instead of the region titlebar (defaults to false)
 cmargins : ObjectLayoutRegion
Margins for the element when collapsed (defaults to: north/south {top: 2, left: 0, right:0, bottom: 2} or east/west {...
 collapsed : BooleanLayoutRegion
True to set the initial display to collapsed (defaults to false)
 collapsedTitle : StringLayoutRegion
Optional string message to display in the collapsed block of a north or south region
 collapsible : BooleanLayoutRegion
False to disable collapsing (defaults to true)
 disableTabTips : BooleanLayoutRegion
True to disable tab tooltips
 floatable : BooleanLayoutRegion
False to disable floating (defaults to true)
 hidden : BooleanLayoutRegion
True to start the region hidden
 hideTabs : BooleanLayoutRegion
True to hide the tab strip (defaults to false)
 hideWhenEmpty : BooleanLayoutRegion
True to hide the region when it has no panels
 margins : ObjectLayoutRegion
Margins for the element (defaults to {top: 0, left: 0, right:0, bottom: 0})
 minTabWidth : NumberLayoutRegion
The minimum tab width (defaults to 40)
 preferredTabWidth : NumberLayoutRegion
The preferred tab width (defaults to 150)
 preservePanels : BooleanLayoutRegion
True to preserve removed panels so they can be readded later (defaults to false)
 resizeTabs : BooleanLayoutRegion
True to enable automatic tab resizing. This will resize the tabs so they are all the same size and fit within the spa...
 showPin : BooleanLayoutRegion
True to show a pin button
 tabPosition : StringLayoutRegion
"top" or "bottom" (defaults to "bottom")
 title : StringLayoutRegion
The title for the region (overrides panel titles)
 titlebar : BooleanLayoutRegion
True to display a title bar (defaults to true)
+

Property Details

+
+ +
+

bodyEl

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

collapsedEl

+ public Ext.Element collapsedEl +
+ This region's collapsed element
+
This property is defined by LayoutRegion.
+
+ +
+

el

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

panels

+ public Ext.util.MixedCollection panels +
+ A collection of panels in this region.
+
This property is defined by BasicLayoutRegion.
+
+ +
+

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: +
    +
  • Ext.ContentPanel
    The panel added (if only one was added)
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ 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.
+
+ +
+

expand

+ public function expand(Ext.EventObject e, [Boolean skipAnim]) +
+ Expand this region if it was previously collapsed. +
+ Parameters: +
  • e : 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: +
    +
  • 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: +
    +
  • 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: +
    +
  • Ext.ContentPanel
  • +
+
+
+
This method is defined by BasicLayoutRegion.
+
+ +
+

getPosition

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

getTabs

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

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

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 BasicLayoutRegion.
+
+ +
+

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.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

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: +
    +
  • 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 BasicLayoutRegion.
+
+ +
+

setCollapsedTitle

+ public function setCollapsedTitle() +
+ Updates the collapsed text for north/south regions (used with collapsedTitle config option) +
+ Parameters: +
  • None.
+ 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: +
    +
  • Ext.ContentPanel
    The shown panel or null
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

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

+
+ +
+

beforeremove

+ public event beforeremove +
+ Fires before a panel is removed (or closed). To cancel the removal set "e.cancel = true" on the event argument. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.LayoutRegion
  • panel : Ext.ContentPanel
    The panel
  • e : Object
    The cancel event object
+
+
+
This event is defined by BasicLayoutRegion.
+
+ +
+

collapsed

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

expanded

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

invalidated

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

panelactivated

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

paneladded

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

panelremoved

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

resized

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

slidehide

+ public event slidehide +
+ Fires when this region slides out of view. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.LayoutRegion
+
+
+
This event is defined by BasicLayoutRegion.
+
+ +
+

slideshow

+ public event slideshow +
+ Fires when this region is slid into view. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.LayoutRegion
+
+
+
This event is defined by BasicLayoutRegion.
+
+ +
+

visibilitychange

+ public event visibilitychange +
+ Fires when this region is shown or hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.LayoutRegion
  • visibility : Boolean
    true or false
+
+
+
This event is defined by BasicLayoutRegion.
+
+
+

Config Details

+
+ +
+

alwaysShowTabs

+ alwaysShowTabs : Boolean +
+ True to always display tabs even when only 1 panel (defaults to false)
+
This config option is defined by LayoutRegion.
+
+ +
+

animate

+ animate : Boolean +
+ True to animate expand/collapse (defaults to false)
+
This config option is defined by LayoutRegion.
+
+ +
+

autoHide

+ autoHide : Boolean +
+ False to disable autoHide when the mouse leaves the "floated" region (defaults to true)
+
This config option is defined by LayoutRegion.
+
+ +
+

autoScroll

+ autoScroll : Boolean +
+ True to enable overflow scrolling (defaults to false)
+
This config option is defined by LayoutRegion.
+
+ +
+

closeOnTab

+ closeOnTab : Boolean +
+ True to place the close icon on the tabs instead of the region titlebar (defaults to false)
+
This config option is defined by LayoutRegion.
+
+ +
+

cmargins

+ cmargins : Object +
+ Margins for the element when collapsed (defaults to: north/south {top: 2, left: 0, right:0, bottom: 2} or east/west {top: 0, left: 2, right:2, bottom: 0})
+
This config option is defined by LayoutRegion.
+
+ +
+

collapsed

+ collapsed : Boolean +
+ True to set the initial display to collapsed (defaults to false)
+
This config option is defined by LayoutRegion.
+
+ +
+

collapsedTitle

+ collapsedTitle : String +
+ Optional string message to display in the collapsed block of a north or south region
+
This config option is defined by LayoutRegion.
+
+ +
+

collapsible

+ collapsible : Boolean +
+ False to disable collapsing (defaults to true)
+
This config option is defined by LayoutRegion.
+
+ +
+

disableTabTips

+ disableTabTips : Boolean +
+ True to disable tab tooltips
+
This config option is defined by LayoutRegion.
+
+ +
+

floatable

+ floatable : Boolean +
+ False to disable floating (defaults to true)
+
This config option is defined by LayoutRegion.
+
+ +
+

hidden

+ hidden : Boolean +
+ True to start the region hidden
+
This config option is defined by LayoutRegion.
+
+ +
+

hideTabs

+ hideTabs : Boolean +
+ True to hide the tab strip (defaults to false)
+
This config option is defined by LayoutRegion.
+
+ +
+

hideWhenEmpty

+ hideWhenEmpty : Boolean +
+ True to hide the region when it has no panels
+
This config option is defined by LayoutRegion.
+
+ +
+

margins

+ margins : Object +
+ Margins for the element (defaults to {top: 0, left: 0, right:0, bottom: 0})
+
This config option is defined by LayoutRegion.
+
+ +
+

minTabWidth

+ minTabWidth : Number +
+ The minimum tab width (defaults to 40)
+
This config option is defined by LayoutRegion.
+
+ +
+

preferredTabWidth

+ preferredTabWidth : Number +
+ The preferred tab width (defaults to 150)
+
This config option is defined by LayoutRegion.
+
+ +
+

preservePanels

+ preservePanels : Boolean +
+ True to preserve removed panels so they can be readded later (defaults to false)
+
This config option is defined by LayoutRegion.
+
+ +
+

resizeTabs

+ resizeTabs : Boolean +
+ True to enable automatic tab resizing. This will resize the tabs so they are all the same size and fit within the space available, similar to FireFox 1.5 tabs (defaults to false)
+
This config option is defined by LayoutRegion.
+
+ +
+

showPin

+ showPin : Boolean +
+ True to show a pin button
+
This config option is defined by LayoutRegion.
+
+ +
+

tabPosition

+ tabPosition : String +
+ "top" or "bottom" (defaults to "bottom")
+
This config option is defined by LayoutRegion.
+
+ +
+

title

+ title : String +
+ The title for the region (overrides panel titles)
+
This config option is defined by LayoutRegion.
+
+ +
+

titlebar

+ titlebar : Boolean +
+ True to display a title bar (defaults to true)
+
This config option is defined by LayoutRegion.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.LoadMask.html b/www/extras/yui-ext/docs/output/Ext.LoadMask.html new file mode 100644 index 000000000..2c48a9127 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.LoadMask.html @@ -0,0 +1,214 @@ + + + + Ext.LoadMask + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.LoadMask

+ + + + + +
Package:Ext
Class:LoadMask
Extends:Object
Defined In:LoadMask.js
+
+ A simple utility class for generically masking elements while loading data. If the element being masked has +an underlying Ext.data.Store, the masking will be automatically synchronized with the store's loading +process and the mask element will be cached for reuse. For all other elements, this mask will replace the +element's UpdateManager load indicator and will be destroyed after the initial load.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 disabled : BooleanLoadMask
Read-only. True if the mask is currently disabled so that it will not be displayed (defaults to false)
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 LoadMask(Object config)LoadMask
Create a new LoadMask
 disable() : voidLoadMask
Disables the mask to prevent it from being displayed
 enable() : voidLoadMask
Enables the mask so that it can be displayed
+ +

Public Events

+
This class has no public events.
+

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 msg : StringLoadMask
The text to display in a centered loading message box (defaults to 'Loading...')
 msgCls : StringLoadMask
The CSS class to apply to the loading message element (defaults to "x-mask-loading")
 removeMask : BooleanLoadMask
True to create a single-use mask that is automatically destroyed after loading (useful for page loads), False to pers...
+

Property Details

+
+ +
+

disabled

+ public Boolean disabled +
+ Read-only. True if the mask is currently disabled so that it will not be displayed (defaults to false)
+
This property is defined by LoadMask.
+
+
+ + +

Constructor Details

+
+
+

LoadMask

+ public function LoadMask(Object config) +
+ Create a new LoadMask
+ Parameters: +
  • config : Object
    The config object
+
+
+
+
+ +

Method Details

+
+ +
+

disable

+ public function disable() +
+ Disables the mask to prevent it from being displayed +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadMask.
+
+ +
+

enable

+ public function enable() +
+ Enables the mask so that it can be displayed +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadMask.
+
+
+ +

Config Details

+
+ +
+

msg

+ msg : String +
+ The text to display in a centered loading message box (defaults to 'Loading...')
+
This config option is defined by LoadMask.
+
+ +
+

msgCls

+ msgCls : String +
+ The CSS class to apply to the loading message element (defaults to "x-mask-loading")
+
This config option is defined by LoadMask.
+
+ +
+

removeMask

+ removeMask : Boolean +
+ True to create a single-use mask that is automatically destroyed after loading (useful for page loads), False to persist the mask element reference for multiple uses (e.g., for paged data widgets). Defaults to false.
+
This config option is defined by LoadMask.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.MasterTemplate.html b/www/extras/yui-ext/docs/output/Ext.MasterTemplate.html new file mode 100644 index 000000000..c50814828 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.MasterTemplate.html @@ -0,0 +1,478 @@ + + + + Ext.MasterTemplate + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.MasterTemplate

+ + + + + +
Package:Ext
Class:MasterTemplate
Extends:Template
Defined In:Template.js
+
+ Provides a template that can have child templates. The syntax is: +
var t = new Ext.MasterTemplate(
+	'<select name="{name}">',
+		'<tpl name="options"><option value="{value:trim}">{text:ellipsis(10)}</option></tpl>',
+	'</select>'
+);
+t.add('options', {value: 'foo', text: 'bar'});
+// or you can add multiple child elements in one shot
+t.addAll('options', [
+    {value: 'foo', text: 'bar'},
+    {value: 'foo2', text: 'bar2'},
+    {value: 'foo3', text: 'bar3'}
+]);
+// then append, applying the master template values
+t.append('my-form', {name: 'my-select'});
+A name attribute for the child template is not required if you have only one child +template or you want to refer to them by index.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disableFormats : BooleanTemplate
True to disable format functions (default to false)
 re : RegExpTemplate
The regular expression used to match template variables
 subTemplateRe : RegExpMasterTemplate
The regular expression used to match sub templates
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 MasterTemplate.from(String/HTMLElement el) : voidMasterTemplate
<static> Creates a template from the passed element's value (display:none textarea, preferred) or innerHTML. e....
 add([String/Number name], Array/Object values) : MasterTemplateMasterTemplate
Applies the passed values to a child template.
 addAll() : voidMasterTemplate
Alias for fill().
 append(String/HTMLElement/Element el, Object values, [Boolean returnElement]) : HTMLElementTemplate
Applies the supplied values to the template and append the new node(s) to el
 apply() : voidTemplate
Alias for applyTemplate
 applyTemplate(Object values) : StringTemplate
Returns an HTML fragment of this template with the specified values applied
 compile() : voidTemplate
Compiles the template into an internal function, eliminating the RegEx overhead
 fill([String/Number name], Array values, [Boolean reset]) : MasterTemplateMasterTemplate
Applies all the passed values to a child template.
 insertAfter(String/HTMLElement/Element el, Object values, [Boolean returnElement]) : HTMLElementTemplate
Applies the supplied values to the template and inserts the new node(s) after el
 insertBefore(String/HTMLElement/Element el, Object values, [Boolean returnElement]) : HTMLElementTemplate
Applies the supplied values to the template and inserts the new node(s) before el
 insertFirst(String/HTMLElement/Element el, Object values, [Boolean returnElement]) : HTMLElementTemplate
Applies the supplied values to the template and inserts the new node(s) as the first child of el
 overwrite(String/HTMLElement/Element el, Object values, [Boolean returnElement]) : HTMLElementTemplate
Applies the supplied values to the template and overwrites the content of el with the new node(s)
 reset() : MasterTemplateMasterTemplate
Resets the template for reuse
 set(String html, [Boolean compile]) : TemplateTemplate
Sets the html used as the template and optionally compiles it
+ +

Public Events

+
This class has no public events.

Property Details

+
+ +
+

disableFormats

+ public Boolean disableFormats +
+ True to disable format functions (default to false)
+
This property is defined by Template.
+
+ +
+

re

+ public RegExp re +
+ The regular expression used to match template variables
+
This property is defined by Template.
+
+ +
+

subTemplateRe

+ public RegExp subTemplateRe +
+ The regular expression used to match sub templates
+
This property is defined by MasterTemplate.
+
+
+ + +

Method Details

+
+ +
+

MasterTemplate.from

+ public function MasterTemplate.from(String/HTMLElement el) +
+ <static> Creates a template from the passed element's value (display:none textarea, preferred) or innerHTML. e.g. +var tpl = Ext.MasterTemplate.from('element-id'); +
+ Parameters: +
  • el : String/HTMLElement
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by MasterTemplate.
+
+ +
+

add

+ public function add([String/Number name], Array/Object values) +
+ Applies the passed values to a child template. +
+ Parameters: +
  • name : String/Number
    (optional) The name or index of the child template
  • values : Array/Object
    The values to be applied to the template
+ Returns: +
    +
  • MasterTemplate
    this
  • +
+
+
+
This method is defined by MasterTemplate.
+
+ +
+

addAll

+ public function addAll() +
+ Alias for fill(). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by MasterTemplate.
+
+ +
+

append

+ public function append(String/HTMLElement/Element el, Object values, [Boolean returnElement]) +
+ Applies the supplied values to the template and append the new node(s) to el +
+ Parameters: +
  • el : String/HTMLElement/Element
    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 Ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by Template.
+
+ +
+

apply

+ public function apply() +
+ Alias for applyTemplate +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by 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 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 Template.
+
+ +
+

fill

+ public function fill([String/Number name], Array values, [Boolean reset]) +
+ Applies all the passed values to a child template. +
+ Parameters: +
  • name : String/Number
    (optional) The name or index of the child template
  • values : Array
    The values to be applied to the template, this should be an array of objects.
  • reset : Boolean
    (optional) True to reset the template first
+ Returns: +
    +
  • MasterTemplate
    this
  • +
+
+
+
This method is defined by MasterTemplate.
+
+ +
+

insertAfter

+ public function insertAfter(String/HTMLElement/Element el, Object values, [Boolean returnElement]) +
+ Applies the supplied values to the template and inserts the new node(s) after el +
+ Parameters: +
  • el : String/HTMLElement/Element
    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 Ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by Template.
+
+ +
+

insertBefore

+ public function insertBefore(String/HTMLElement/Element el, Object values, [Boolean returnElement]) +
+ Applies the supplied values to the template and inserts the new node(s) before el +
+ Parameters: +
  • el : String/HTMLElement/Element
    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 Ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by Template.
+
+ +
+

insertFirst

+ public function insertFirst(String/HTMLElement/Element el, Object values, [Boolean returnElement]) +
+ Applies the supplied values to the template and inserts the new node(s) as the first child of el +
+ Parameters: +
  • el : String/HTMLElement/Element
    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 Ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by Template.
+
+ +
+

overwrite

+ public function overwrite(String/HTMLElement/Element 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 : String/HTMLElement/Element
    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 Ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by Template.
+
+ +
+

reset

+ public function reset() +
+ Resets the template for reuse +
+ Parameters: +
  • None.
+ Returns: +
    +
  • MasterTemplate
    this
  • +
+
+
+
This method is defined by MasterTemplate.
+
+ +
+

set

+ public function set(String html, [Boolean compile]) +
+ Sets the html used as the template and optionally compiles it +
+ Parameters: +
  • html : String
  • compile : Boolean
    (optional)
+ Returns: +
    +
  • Template
    this
  • +
+
+
+
This method is defined by Template.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.MenuButton.html b/www/extras/yui-ext/docs/output/Ext.MenuButton.html new file mode 100644 index 000000000..1814fbf3c --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.MenuButton.html @@ -0,0 +1,1086 @@ + + + + Ext.MenuButton + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.MenuButton

+ + + + + + +
Package:Ext
Class:MenuButton
Extends:Button
Subclasses:Toolbar.MenuButton
Defined In:MenuButton.js
+
+ A split button that provides a built-in dropdown arrow that can fire an event separately from the default +click event of the button. Typically this would be used to display a dropdown menu that provides additional +options to the primary button action, but any custom handler can provide the arrowclick implementation.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : BooleanButton
Read-only. True if this button is disabled
 hidden : BooleanButton
Read-only. True if this button is hidden
 pressed : BooleanButton
Read-only. True if this button is pressed (only if enableToggle = true)
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 MenuButton(String/HTMLElement/Element renderTo, Object config)MenuButton
Create a new menu button
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 destroy() : voidButton
Destroys this Button and removes any listeners.
 disable() : voidButton
Disable this button
 enable() : voidButton
Enable this button
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus() : voidMenuButton
Focus the button
 getEl() : Ext.ElementButton
Returns the button's underlying element
 getText() : StringButton
Gets the text for this button
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidButton
Hide this button
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 setArrowHandler(Function handler, [Object scope]) : voidMenuButton
Sets this button's arrow click handler
 setDisabled(Boolean enabled) : voidButton
Convenience function for boolean enable/disable
 setHandler(Function handler, [Object scope]) : voidMenuButton
Sets this button's click handler
 setText(String text) : voidButton
Sets this button's text
 setVisible(Boolean visible) : voidButton
Convenience function for boolean show/hide
 show() : voidButton
Show this button
 toggle([Boolean state]) : voidButton
If a state it passed, it becomes the pressed state otherwise the current state is toggled.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 arrowclick : (MenuButton this, EventObject e)MenuButton
Fires when this button's arrow is clicked
 click : (Button this, EventObject e)Button
Fires when this button is clicked
 mouseout : (Button this, Event e)Button
Fires when the mouse exits the button
 mouseover : (Button this, Event e)Button
Fires when the mouse hovers over the button
 toggle : (Button this, Boolean pressed)Button
Fires when the "pressed" state of this button changes (only if enableToggle = true)
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 arrowHandler : FunctionMenuButton
A function called when the arrow button is clicked (can be used instead of click event)
 arrowTooltip : StringMenuButton
The title attribute of the arrow
 disabled : BooleanButton
True to start disabled (defaults to false)
 enableToggle : BooleanButton
True to enable pressed/not pressed toggling (defaults to false)
 handler : FunctionButton
A function called when the button is clicked (can be used instead of click event)
 hidden : BooleanButton
True to start hidden (defaults to false)
 icon : StringButton
The path to an image to display in the button (the image will be set as the background-image CSS property of the butt...
 menu : MixedButton
Standard menu attribute consisting of a reference to a menu object, a menu id or a menu config blob
 menuAlign : StringButton
The position to align the menu to (see Ext.Element.alignTo for more details, defaults to 'tl-bl?').
 minWidth : NumberButton
The minimum width for this button (used to give a set of buttons a common width)
 pressed : BooleanButton
True to start pressed (only if enableToggle = true)
 repeat : Boolean/ObjectButton
True to repeat fire the click event while the mouse is down. This can also be an Ext.util.ClickRepeater config object...
 scope : ObjectButton
The scope of the handler
 text : StringButton
The button text
 toggleGroup : StringButton
The group this toggle button is a member of (only 1 per group can be pressed, only applies if enableToggle = true)
 tooltip : String/ObjectButton
The tooltip for the button - can be a string or QuickTips config object
 tooltipType : StringButton
The type of tooltip to use. Either "qtip" for QuickTips or "title" for title attribute.
+

Property Details

+
+ +
+

disabled

+ public Boolean disabled +
+ Read-only. True if this button is disabled
+
This property is defined by Button.
+
+ +
+

hidden

+ public Boolean hidden +
+ Read-only. True if this button is hidden
+
This property is defined by Button.
+
+ +
+

pressed

+ public Boolean pressed +
+ Read-only. True if this button is pressed (only if enableToggle = true)
+
This property is defined by Button.
+
+
+ + +

Constructor Details

+
+
+

MenuButton

+ public function MenuButton(String/HTMLElement/Element renderTo, Object config) +
+ Create a new menu button
+ Parameters: +
  • renderTo : String/HTMLElement/Element
    The element to append the button to
  • config : Object
    The config object
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

destroy

+ public function destroy() +
+ Destroys this Button and removes any listeners. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Button.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

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

getEl

+ public function getEl() +
+ Returns the button's underlying element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Button.
+
+ +
+

getText

+ public function getText() +
+ Gets the text for this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    The button text
  • +
+
+
+
This method is defined by Button.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

setArrowHandler

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

setDisabled

+ public function setDisabled(Boolean enabled) +
+ Convenience function for boolean enable/disable +
+ Parameters: +
  • enabled : Boolean
    True to enable, false to disable
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Button.
+
+ +
+

setHandler

+ public function setHandler(Function handler, [Object scope]) +
+ Sets this button's 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 MenuButton.
+
+ +
+

setText

+ public function setText(String text) +
+ Sets this button's text +
+ Parameters: +
  • text : String
    The button text
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by 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 Button.
+
+ +
+

show

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

toggle

+ public function toggle([Boolean state]) +
+ If a state it passed, it becomes the pressed state otherwise the current state is toggled. +
+ Parameters: +
  • state : Boolean
    (optional) Force a particular state
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Button.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

arrowclick

+ public event arrowclick +
+ Fires when this button's arrow is clicked +
+ Subscribers will be called with the following parameters: +
  • this : MenuButton
  • e : EventObject
    The click event
+
+
+
This event is defined by MenuButton.
+
+ +
+

click

+ public event click +
+ Fires when this button is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Button
  • e : EventObject
    The click event
+
+
+
This event is defined by Button.
+
+ +
+

mouseout

+ public event mouseout +
+ Fires when the mouse exits the button +
+ Subscribers will be called with the following parameters: +
  • this : Button
  • e : Event
    The event object
+
+
+
This event is defined by Button.
+
+ +
+

mouseover

+ public event mouseover +
+ Fires when the mouse hovers over the button +
+ Subscribers will be called with the following parameters: +
  • this : Button
  • e : Event
    The event object
+
+
+
This event is defined by Button.
+
+ +
+

toggle

+ public event toggle +
+ Fires when the "pressed" state of this button changes (only if enableToggle = true) +
+ Subscribers will be called with the following parameters: +
  • this : Button
  • pressed : Boolean
+
+
+
This event is defined by Button.
+
+
+

Config Details

+
+ +
+

arrowHandler

+ arrowHandler : Function +
+ A function called when the arrow button is clicked (can be used instead of click event)
+
This config option is defined by MenuButton.
+
+ +
+

arrowTooltip

+ arrowTooltip : String +
+ The title attribute of the arrow
+
This config option is defined by MenuButton.
+
+ +
+

disabled

+ disabled : Boolean +
+ True to start disabled (defaults to false)
+
This config option is defined by Button.
+
+ +
+

enableToggle

+ enableToggle : Boolean +
+ True to enable pressed/not pressed toggling (defaults to false)
+
This config option is defined by Button.
+
+ +
+

handler

+ handler : Function +
+ A function called when the button is clicked (can be used instead of click event)
+
This config option is defined by Button.
+
+ +
+

hidden

+ hidden : Boolean +
+ True to start hidden (defaults to false)
+
This config option is defined by Button.
+
+ +
+

icon

+ icon : String +
+ The path to an image to display in the button (the image will be set as the background-image CSS property of the button by default, so if you want a mixed icon/text button, set cls:"x-btn-text-icon")
+
This config option is defined by Button.
+
+ +
+

menu

+ menu : Mixed +
+ Standard menu attribute consisting of a reference to a menu object, a menu id or a menu config blob
+
This config option is defined by Button.
+
+ +
+

menuAlign

+ menuAlign : String +
+ The position to align the menu to (see Ext.Element.alignTo for more details, defaults to 'tl-bl?').
+
This config option is defined by Button.
+
+ +
+

minWidth

+ minWidth : Number +
+ The minimum width for this button (used to give a set of buttons a common width)
+
This config option is defined by Button.
+
+ +
+

pressed

+ pressed : Boolean +
+ True to start pressed (only if enableToggle = true)
+
This config option is defined by Button.
+
+ +
+

repeat

+ repeat : Boolean/Object +
+ True to repeat fire the click event while the mouse is down. This can also be an Ext.util.ClickRepeater config object (defaults to false).
+
This config option is defined by Button.
+
+ +
+

scope

+ scope : Object +
+ The scope of the handler
+
This config option is defined by Button.
+
+ +
+

text

+ text : String +
+ The button text
+
This config option is defined by Button.
+
+ +
+

toggleGroup

+ toggleGroup : String +
+ The group this toggle button is a member of (only 1 per group can be pressed, only applies if enableToggle = true)
+
This config option is defined by Button.
+
+ +
+

tooltip

+ tooltip : String/Object +
+ The tooltip for the button - can be a string or QuickTips config object
+
This config option is defined by Button.
+
+ +
+

tooltipType

+ tooltipType : String +
+ The type of tooltip to use. Either "qtip" for QuickTips or "title" for title attribute.
+
This config option is defined by Button.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.MessageBox.html b/www/extras/yui-ext/docs/output/Ext.MessageBox.html new file mode 100644 index 000000000..90a8184de --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.MessageBox.html @@ -0,0 +1,556 @@ + + + + Ext.MessageBox + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.MessageBox

+ + + + + +
Package:Ext
Class:MessageBox
Extends:Object
Defined In:MessageBox.js
+
+ Utility class for generating different styles of message boxes. The alias Ext.Msg can also be used. +Example usage: +
// Basic alert:
+Ext.Msg.alert('Status', 'Changes saved successfully.');
+
+// Prompt for user data:
+Ext.Msg.prompt('Name', 'Please enter your name:', function(btn, text){
+    if (btn == 'ok'){
+        // process text value...
+    }
+});
+
+// Show a dialog using config options:
+Ext.Msg.show({
+   title:'Save Changes?',
+   msg: 'Your are closing a tab that has unsaved changes. Would you like to save your changes?',
+   buttons: Ext.Msg.YESNOCANCEL,
+   fn: processResult,
+   animEl: 'elId'
+});


This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 OK : ObjectMessageBox
Button config that displays a single OK button
 OKCANCEL : ObjectMessageBox
Button config that displays OK and Cancel buttons
 YESNO : ObjectMessageBox
Button config that displays Yes and No buttons
 YESNOCANCEL : ObjectMessageBox
Button config that displays Yes, No and Cancel buttons
 buttonText : ObjectMessageBox
An object containing the default button text strings that can be overriden for localized language support. +Supported ...
 defaultTextHeight : NumberMessageBox
The default height in pixels of the message box's multiline textarea if displayed (defaults to 75)
 maxWidth : NumberMessageBox
The maximum width in pixels of the message box (defaults to 600)
 minProgressWidth : NumberMessageBox
The minimum width in pixels of the message box progress bar if displayed (defaults to 250)
 minWidth : NumberMessageBox
The minimum width in pixels of the message box (defaults to 100)
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 alert(String title, String msg, [Function fn], [Object scope]) : Ext.MessageBoxMessageBox
Displays a standard read-only message box (comparable to the basic JavaScript alert prompt) with an OK +button. If a c...
 confirm(String title, String msg, [Function fn], [Object scope]) : Ext.MessageBoxMessageBox
Displays a confirmation message box with Yes and No buttons. If a callback function is passed it will +be called afte...
 getDialog() : Ext.BasicDialogMessageBox
Returns a reference to the underlying Ext.BasicDialog element
 hide() : voidMessageBox
Hides the message box if it is displayed
 isVisible() : BooleanMessageBox
Returns true if the message box is currently displayed
 progress(String title, String msg) : Ext.MessageBoxMessageBox
Displays a message box with a progress bar. This message box has no buttons and is not closeable by +the user. You a...
 prompt(String title, String msg, [Function fn], [Object scope], [Boolean/Number multiline]) : Ext.MessageBoxMessageBox
Displays a message box with OK and Cancel buttons prompting the user to enter some text. The prompt can +be a single-...
 show(Object config) : Ext.MessageBoxMessageBox
Displays a new message box, or reinitializes an existing message box, based on the config options +passed in. All func...
 updateProgress(Number value, String text) : Ext.MessageBoxMessageBox
Updates a progress-style message box's text and progress bar. Only relevant on message boxes +initiated via Ext.Messa...
 updateText(String text) : Ext.MessageBoxMessageBox
Updates the message box body text
 wait(String msg, [String title]) : Ext.MessageBoxMessageBox
Displays a message box with an infinitely auto-updating progress bar. This can be used to block user +interaction whi...
+ +

Public Events

+
This class has no public events.

Property Details

+
+ +
+

OK

+ public Object OK +
+ Button config that displays a single OK button
+
This property is defined by MessageBox.
+
+ +
+

OKCANCEL

+ public Object OKCANCEL +
+ Button config that displays OK and Cancel buttons
+
This property is defined by MessageBox.
+
+ +
+

YESNO

+ public Object YESNO +
+ Button config that displays Yes and No buttons
+
This property is defined by MessageBox.
+
+ +
+

YESNOCANCEL

+ public Object YESNOCANCEL +
+ Button config that displays Yes, No and Cancel buttons
+
This property is defined by MessageBox.
+
+ +
+

buttonText

+ public Object buttonText +
+ An object containing the default button text strings that can be overriden for localized language support. +Supported properties are: ok, cancel, yes and no. +Customize the default text like so: Ext.MessageBox.buttonText.yes = "Si";
+
This property is defined by MessageBox.
+
+ +
+

defaultTextHeight

+ public Number defaultTextHeight +
+ The default height in pixels of the message box's multiline textarea if displayed (defaults to 75)
+
This property is defined by MessageBox.
+
+ +
+

maxWidth

+ public Number maxWidth +
+ The maximum width in pixels of the message box (defaults to 600)
+
This property is defined by MessageBox.
+
+ +
+

minProgressWidth

+ public Number minProgressWidth +
+ The minimum width in pixels of the message box progress bar if displayed (defaults to 250)
+
This property is defined by MessageBox.
+
+ +
+

minWidth

+ public Number minWidth +
+ The minimum width in pixels of the message box (defaults to 100)
+
This property is defined by MessageBox.
+
+
+ + +

Method Details

+
+ +
+

alert

+ public function alert(String title, String msg, [Function fn], [Object scope]) +
+ Displays a standard read-only message box (comparable to the basic JavaScript alert prompt) with an OK +button. If a callback function is passed it will be called after the user clicks the button, and the +id of the button that was clicked will be passed as the only parameter to the callback +(could also be the top-right close button). +
+ Parameters: +
  • title : String
    The title bar text
  • msg : String
    The message box body text
  • fn : Function
    (optional) The callback function invoked after the message box is closed
  • scope : Object
    (optional) The scope of the callback function
+ Returns: +
    +
  • Ext.MessageBox
    messageBox This message box
  • +
+
+
+
This method is defined by MessageBox.
+
+ +
+

confirm

+ public function confirm(String title, String msg, [Function fn], [Object scope]) +
+ Displays a confirmation message box with Yes and No buttons. If a callback function is passed it will +be called after the user clicks either button, and the id of the button that was clicked +will be passed as the only parameter to the callback (could also be the top-right close button). +
+ Parameters: +
  • title : String
    The title bar text
  • msg : String
    The message box body text
  • fn : Function
    (optional) The callback function invoked after the message box is closed
  • scope : Object
    (optional) The scope of the callback function
+ Returns: +
    +
  • Ext.MessageBox
    messageBox This message box
  • +
+
+
+
This method is defined by MessageBox.
+
+ +
+

getDialog

+ public function getDialog() +
+ Returns a reference to the underlying Ext.BasicDialog element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.BasicDialog
    dialog The BasicDialog element
  • +
+
+
+
This method is defined by MessageBox.
+
+ +
+

hide

+ public function hide() +
+ Hides the message box if it is displayed +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by MessageBox.
+
+ +
+

isVisible

+ public function isVisible() +
+ Returns true if the message box is currently displayed +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    isVisible True if the message box is visible, else false
  • +
+
+
+
This method is defined by MessageBox.
+
+ +
+

progress

+ public function progress(String title, String msg) +
+ Displays a message box with a progress bar. This message box has no buttons and is not closeable by +the user. You are responsible for updating the progress bar as needed via Ext.MessageBox.updateProgress +and closing the message box when the process is complete. +
+ Parameters: +
  • title : String
    The title bar text
  • msg : String
    The message box body text
+ Returns: +
    +
  • Ext.MessageBox
    messageBox This message box
  • +
+
+
+
This method is defined by MessageBox.
+
+ +
+

prompt

+ public function prompt(String title, String msg, [Function fn], [Object scope], [Boolean/Number multiline]) +
+ Displays a message box with OK and Cancel buttons prompting the user to enter some text. The prompt can +be a single-line or multi-line textbox. If a callback function is passed it will be called after the user +clicks either button, and the id of the button that was clicked (could also be the top-right +close button) and the text that was entered will be passed as the two parameters to the callback. +
+ Parameters: +
  • title : String
    The title bar text
  • msg : String
    The message box body text
  • fn : Function
    (optional) The callback function invoked after the message box is closed
  • scope : Object
    (optional) The scope of the callback function
  • multiline : Boolean/Number
    (optional) True to create a multiline textbox using the defaultTextHeight property, or the height in pixels to create the textbox (defaults to false / single-line)
+ Returns: +
    +
  • Ext.MessageBox
    messageBox This message box
  • +
+
+
+
This method is defined by MessageBox.
+
+ +
+

show

+ public function show(Object config) +
+ Displays a new message box, or reinitializes an existing message box, based on the config options +passed in. All functions (e.g. prompt, alert, etc) on MessageBox call this function internally. +The following config object properties are supported: +
+Property    Type             Description
+----------  ---------------  ----------------------------------------------------------------------
+title       String           The title text
+closable    Boolean          False to hide the top-right close box (defaults to true)
+prompt      Boolean          True to prompt the user to enter single-line text (defaults to false)
+multiline   Boolean          True to prompt the user to enter multi-line text (defaults to false)
+progress    Boolean          True to display a progress bar (defaults to false)
+value       String           The string value to set into the active textbox element if displayed
+buttons     Object/Boolean   A button config object (e.g., Ext.MessageBox.OKCANCEL or {ok:'Foo',
+                             cancel:'Bar'}), or false to not show any buttons (defaults to false)
+msg         String           A string that will replace the existing message box body text (defaults
+                             to the XHTML-compliant non-breaking space character  )
+cls         String           A custom CSS class to apply to the message box element
+proxyDrag   Boolean          True to display a lightweight proxy while dragging (defaults to false)
+modal       Boolean          False to allow user interaction with the page while the message box is
+                             displayed (defaults to true)
+
+Example usage: +

+Ext.Msg.show({
+   title: 'Address',
+   msg: 'Please enter your address:',
+   width: 300,
+   buttons: Ext.MessageBox.OKCANCEL,
+   multiline: true,
+   fn: saveAddress,
+   animEl: 'addAddressBtn'
+});
+
+
+ Parameters: +
  • config : Object
    Configuration options
+ Returns: +
    +
  • Ext.MessageBox
    messageBox This message box
  • +
+
+
+
This method is defined by MessageBox.
+
+ +
+

updateProgress

+ public function updateProgress(Number value, String text) +
+ Updates a progress-style message box's text and progress bar. Only relevant on message boxes +initiated via Ext.MessageBox.progress or by calling Ext.MessageBox.show with progress: true. +
+ Parameters: +
  • value : Number
    Any number between 0 and 1 (e.g., .5)
  • text : String
    If defined, the message box's body text is replaced with the specified string (defaults to undefined)
+ Returns: +
    +
  • Ext.MessageBox
    messageBox This message box
  • +
+
+
+
This method is defined by MessageBox.
+
+ +
+

updateText

+ public function updateText(String text) +
+ Updates the message box body text +
+ Parameters: +
  • text : String
    Replaces the message box element's innerHTML with the specified string (defaults to the XHTML-compliant non-breaking space character  )
+ Returns: +
    +
  • Ext.MessageBox
    messageBox This message box
  • +
+
+
+
This method is defined by MessageBox.
+
+ +
+

wait

+ public function wait(String msg, [String title]) +
+ Displays a message box with an infinitely auto-updating progress bar. This can be used to block user +interaction while waiting for a long-running process to complete that does not have defined intervals. +You are responsible for closing the message box when the process is complete. +
+ Parameters: +
  • msg : String
    The message box body text
  • title : String
    (optional) The title bar text
+ Returns: +
    +
  • Ext.MessageBox
    messageBox This message box
  • +
+
+
+
This method is defined by MessageBox.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.NestedLayoutPanel.html b/www/extras/yui-ext/docs/output/Ext.NestedLayoutPanel.html new file mode 100644 index 000000000..d3caf9257 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.NestedLayoutPanel.html @@ -0,0 +1,898 @@ + + + + Ext.NestedLayoutPanel + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.NestedLayoutPanel

+ + + + + +
Package:Ext
Class:NestedLayoutPanel
Extends:ContentPanel
Defined In:ContentPanels.js
+
+
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 NestedLayoutPanel(Ext.BorderLayout layout, String/Object config)NestedLayoutPanel
Create a new NestedLayoutPanel.
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 destroy() : voidContentPanel
Destroys this panel
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getEl() : Ext.ElementContentPanel
Returns this panel's element
 getId() : StringContentPanel
Returns this panel's id
 getLayout() : Ext.BorderLayoutNestedLayoutPanel
Returns the nested BorderLayout for this panel
 getTitle() : StringContentPanel
Returns this panel's title
 getToolbar() : Ext.ToolbarContentPanel
Returns the toolbar for this Panel if one was configured.
 getUpdateManager() : Ext.UpdateManagerContentPanel
Get the Ext.UpdateManager for this panel. Enables you to perform Ajax updates.
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 isClosable() : BooleanContentPanel
Returns true is this panel was configured to be closable
 load(Object/String/Function url, [String/Object params], [Function callback], [Boolean discardUrl]) : Ext.ContentPanelContentPanel
Loads this content panel immediately with content from XHR. Note: to delay loading until the panel is activated, use ...
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 refresh() : voidContentPanel
Force a content refresh from the URL specified in the setUrl() method. +Will fail silently if the setUrl method has no...
 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]) : Ext.UpdateManagerContentPanel
Set a URL to be used to load the content for this panel. When this panel is activated, the content will be loaded fro...
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 activate : (Ext.ContentPanel this)ContentPanel
Fires when this panel is activated.
 deactivate : (Ext.ContentPanel this)ContentPanel
Fires when this panel is activated.
 resize : (Ext.ContentPanel this, Number width, Number height)ContentPanel
Fires when this panel is resized if fitToFrame is true.
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 adjustments : ArrayContentPanel
Values to add to the width/height when doing a fitToFrame (default is [0, 0])
 autoCreate : Boolean/ObjectContentPanel
True to auto generate the DOM element for this panel, or a DomHelper config of the element to create
 autoScroll : BooleanContentPanel
True to scroll overflow in this panel (use with fitToFrame)
 background : BooleanContentPanel
True if the panel should not be activated when it is added (defaults to false)
 closable : BooleanContentPanel
True if the panel can be closed/removed
 fitContainer : BooleanContentPanel
When using fitToFrame and resizeEl, you can also fit the parent container (defaults to false)
 fitToFrame : BooleanContentPanel
True for this panel to adjust its size to fit when the region resizes (defaults to false)
 loadOnce : BooleanContentPanel
Calls When used with "url", calls setUrl() with this value
 params : String/ObjectContentPanel
When used with "url", calls setUrl() with this value
 resizeEl : String/HTMLElement/ElementContentPanel
An element to resize if fitToFrame is true (instead of this panel's element)
 title : StringContentPanel
The title for this panel
 toolbar : ToolbarContentPanel
A toolbar for this panel
 url : StringContentPanel
Calls setUrl() with this value
+ + +

Constructor Details

+
+
+

NestedLayoutPanel

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

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
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: +
    +
  • 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: +
    +
  • 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: +
    +
  • Ext.Toolbar
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

getUpdateManager

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

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

isClosable

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

load

+ public function load(Object/String/Function url, [String/Object params], [Function callback], [Boolean discardUrl]) +
+ Loads this content panel immediately with content from XHR. Note: to delay loading until the panel is activated, use setUrl. +
+ 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:
     panel.load({
    url: "your-url.php",
    params: {param1: "foo", param2: "bar"}, // or a URL encoded string
    callback: yourFunction,
    scope: yourObject, //(optional scope)
    discardUrl: false,
    nocache: false,
    text: "Loading...",
    timeout: 30,
    scripts: 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 panel 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, oResponse)
  • 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: +
    +
  • Ext.ContentPanel
    this
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

refresh

+ public function refresh() +
+ Force a content refresh from the URL specified in the setUrl() method. +Will fail silently if the setUrl method has not been called. +This does not activate the panel, just updates its content. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

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. When this panel is activated, the content will be loaded from that URL. +
+ 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 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: +
    +
  • Ext.UpdateManager
    The UpdateManager
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

activate

+ public event activate +
+ Fires when this panel is activated. +
+ Subscribers will be called with the following parameters: +
  • this : 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 : Ext.ContentPanel
+
+
+
This event is defined by ContentPanel.
+
+ +
+

resize

+ public event resize +
+ Fires when this panel is resized if fitToFrame is true. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.ContentPanel
  • width : Number
    The width after any component adjustments
  • height : Number
    The height after any component adjustments
+
+
+
This event is defined by ContentPanel.
+
+
+

Config Details

+
+ +
+

adjustments

+ adjustments : Array +
+ Values to add to the width/height when doing a fitToFrame (default is [0, 0])
+
This config option is defined by ContentPanel.
+
+ +
+

autoCreate

+ autoCreate : Boolean/Object +
+ True to auto generate the DOM element for this panel, or a DomHelper config of the element to create
+
This config option is defined by ContentPanel.
+
+ +
+

autoScroll

+ autoScroll : Boolean +
+ True to scroll overflow in this panel (use with fitToFrame)
+
This config option is defined by ContentPanel.
+
+ +
+

background

+ background : Boolean +
+ True if the panel should not be activated when it is added (defaults to false)
+
This config option is defined by ContentPanel.
+
+ +
+

closable

+ closable : Boolean +
+ True if the panel can be closed/removed
+
This config option is defined by ContentPanel.
+
+ +
+

fitContainer

+ fitContainer : Boolean +
+ When using fitToFrame and resizeEl, you can also fit the parent container (defaults to false)
+
This config option is defined by ContentPanel.
+
+ +
+

fitToFrame

+ fitToFrame : Boolean +
+ True for this panel to adjust its size to fit when the region resizes (defaults to false)
+
This config option is defined by ContentPanel.
+
+ +
+

loadOnce

+ loadOnce : Boolean +
+ Calls When used with "url", calls setUrl() with this value
+
This config option is defined by ContentPanel.
+
+ +
+

params

+ params : String/Object +
+ When used with "url", calls setUrl() with this value
+
This config option is defined by ContentPanel.
+
+ +
+

resizeEl

+ resizeEl : String/HTMLElement/Element +
+ An element to resize if fitToFrame is true (instead of this panel's element)
+
This config option is defined by ContentPanel.
+
+ +
+

title

+ title : String +
+ The title for this panel
+
This config option is defined by ContentPanel.
+
+ +
+

toolbar

+ toolbar : Toolbar +
+ A toolbar for this panel
+
This config option is defined by ContentPanel.
+
+ +
+

url

+ url : String +
+ Calls setUrl() with this value
+
This config option is defined by ContentPanel.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.PagingToolbar.html b/www/extras/yui-ext/docs/output/Ext.PagingToolbar.html new file mode 100644 index 000000000..6434d1590 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.PagingToolbar.html @@ -0,0 +1,586 @@ + + + + Ext.PagingToolbar + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.PagingToolbar

+ + + + + +
Package:Ext
Class:PagingToolbar
Extends:Toolbar
Defined In:PagingToolbar.js
+
+ A specialized toolbar that is bound to a Ext.data.Store and provides automatic paging controls.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 afterPageText : StringPagingToolbar
Customizable piece of the default paging text (defaults to "of %0")
 beforePageText : StringPagingToolbar
Customizable piece of the default paging text (defaults to "Page")
 firstText : StringPagingToolbar
Customizable piece of the default paging text (defaults to "First Page")
 lastText : StringPagingToolbar
Customizable piece of the default paging text (defaults to "Last Page")
 nextText : StringPagingToolbar
Customizable piece of the default paging text (defaults to "Next Page")
 prevText : StringPagingToolbar
Customizable piece of the default paging text (defaults to "Previous Page")
 refreshText : StringPagingToolbar
Customizable piece of the default paging text (defaults to "Refresh")
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 PagingToolbar(String/HTMLElement/Element container, Ext.data.Store store, Object config)PagingToolbar
Create a new PagingToolbar
 add(Mixed arg1, Mixed arg2, Mixed etc) : 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) : Ext.Toolbar.Button/ArrayToolbar
Add a button (or buttons), see Ext.Toolbar.Button for more info on the config
 addDom(Object config) : Ext.Toolbar.ItemToolbar
Adds a new element to the toolbar from the passed DomHelper config
 addElement(String/HTMLElement/Element el) : Ext.Toolbar.ItemToolbar
Adds any standard HTML element to the toolbar
 addField(Field field) : ToolbarItemToolbar
Add a dynamically rendered Ext.form field (TextField, ComboBox, etc). Note: the field should not have +been rendered y...
 addItem(Toolbar.Item item) : Ext.Toolbar.ItemToolbar
Adds any Toolbar.Item or subclass
 addSeparator() : Ext.Toolbar.ItemToolbar
Adds a separator
 addSpacer() : Ext.Toolbar.ItemToolbar
Adds a spacer element
 addText(String text) : Ext.Toolbar.ItemToolbar
Adds text to the toolbar
 bind(Ext.data.Store store) : voidPagingToolbar
Binds the paging toolbar to the specified Ext.data.Store
 getEl() : Ext.ElementToolbar
Returns the element for this toolbar
 insertButton(Number index, Object/Toolbar.Item/Toolbar.Button (may) : Ext.Toolbar.Button/ItemToolbar
Inserts any Toolbar.Item/Toolbar.Button at the specified index
 unbind(Ext.data.Store store) : voidPagingToolbar
Unbinds the paging toolbar from the specified Ext.data.Store
+ +

Public Events

+
This class has no public events.
+

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 displayMsg : StringPagingToolbar
The paging status message to display (defaults to "Displaying {start} - {end} of {total}")
 emptyMsg : StringPagingToolbar
The message to display when no records are found (defaults to "No data to display")
 pageSize : NumberPagingToolbar
The number of records to display per page (defaults to 20)
+

Property Details

+
+ +
+

afterPageText

+ public String afterPageText +
+ Customizable piece of the default paging text (defaults to "of %0")
+
This property is defined by PagingToolbar.
+
+ +
+

beforePageText

+ public String beforePageText +
+ Customizable piece of the default paging text (defaults to "Page")
+
This property is defined by PagingToolbar.
+
+ +
+

firstText

+ public String firstText +
+ Customizable piece of the default paging text (defaults to "First Page")
+
This property is defined by PagingToolbar.
+
+ +
+

lastText

+ public String lastText +
+ Customizable piece of the default paging text (defaults to "Last Page")
+
This property is defined by PagingToolbar.
+
+ +
+

nextText

+ public String nextText +
+ Customizable piece of the default paging text (defaults to "Next Page")
+
This property is defined by PagingToolbar.
+
+ +
+

prevText

+ public String prevText +
+ Customizable piece of the default paging text (defaults to "Previous Page")
+
This property is defined by PagingToolbar.
+
+ +
+

refreshText

+ public String refreshText +
+ Customizable piece of the default paging text (defaults to "Refresh")
+
This property is defined by PagingToolbar.
+
+
+ + +

Constructor Details

+
+
+

PagingToolbar

+ public function PagingToolbar(String/HTMLElement/Element container, Ext.data.Store store, Object config) +
+ Create a new PagingToolbar
+ Parameters: +
  • container : String/HTMLElement/Element
    The id or element that will contain the toolbar
  • store : Ext.data.Store
    The underlying data store providing the paged data
  • config : Object
    The config object
+
+
+
+
+ +

Method Details

+
+ +
+

add

+ public function add(Mixed arg1, Mixed arg2, Mixed etc) +
+ Adds element(s) to the toolbar - this function takes a variable number of +arguments of mixed type and adds them to the toolbar. +
+ Parameters: +
  • arg1 : Mixed
    If arg is a Toolbar.Button, 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.
  • arg2 : Mixed
  • etc : Mixed
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

addButton

+ public function addButton(Object/Array config) +
+ Add a button (or buttons), see Ext.Toolbar.Button for more info on the config +
+ Parameters: +
  • config : Object/Array
    A button config or array of configs
+ Returns: +
    +
  • Ext.Toolbar.Button/Array
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

addDom

+ public function addDom(Object config) +
+ Adds a new element to the toolbar from the passed DomHelper config +
+ Parameters: +
  • config : Object
+ Returns: +
    +
  • Ext.Toolbar.Item
    The element's item
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

addElement

+ public function addElement(String/HTMLElement/Element el) +
+ Adds any standard HTML element to the toolbar +
+ Parameters: +
  • el : String/HTMLElement/Element
    The element or id of the element to add
+ Returns: +
    +
  • Ext.Toolbar.Item
    The element's item
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

addField

+ public function addField(Field field) +
+ Add a dynamically rendered Ext.form field (TextField, ComboBox, etc). Note: the field should not have +been rendered yet. For a field that has already been rendered, use addElement. +
+ Parameters: +
  • field : Field
+ Returns: +
    +
  • ToolbarItem
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

addItem

+ public function addItem(Toolbar.Item item) +
+ Adds any Toolbar.Item or subclass +
+ Parameters: +
  • item : Toolbar.Item
+ Returns: +
    +
  • Ext.Toolbar.Item
    The item
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

addSeparator

+ public function addSeparator() +
+ Adds a separator +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Toolbar.Item
    The separator item
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

addSpacer

+ public function addSpacer() +
+ Adds a spacer element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Toolbar.Item
    The spacer item
  • +
+
+
+
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: +
    +
  • Ext.Toolbar.Item
    The element's item
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

bind

+ public function bind(Ext.data.Store store) +
+ Binds the paging toolbar to the specified Ext.data.Store +
+ Parameters: +
  • store : Ext.data.Store
    The data store to bind
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by PagingToolbar.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the element for this toolbar +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

insertButton

+ public function insertButton(Number index, Object/Toolbar.Item/Toolbar.Button (may) +
+ Inserts any Toolbar.Item/Toolbar.Button at the specified index +
+ Parameters: +
  • index : Number
    The index where the item is to be inserted
  • (may : Object/Toolbar.Item/Toolbar.Button
    be Array)} item The button, or button config object to be inserted.
+ Returns: +
    +
  • Ext.Toolbar.Button/Item
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

unbind

+ public function unbind(Ext.data.Store store) +
+ Unbinds the paging toolbar from the specified Ext.data.Store +
+ Parameters: +
  • store : Ext.data.Store
    The data store to unbind
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by PagingToolbar.
+
+
+ +

Config Details

+
+ +
+

displayMsg

+ displayMsg : String +
+ The paging status message to display (defaults to "Displaying {start} - {end} of {total}")
+
This config option is defined by PagingToolbar.
+
+ +
+

emptyMsg

+ emptyMsg : String +
+ The message to display when no records are found (defaults to "No data to display")
+
This config option is defined by PagingToolbar.
+
+ +
+

pageSize

+ pageSize : Number +
+ The number of records to display per page (defaults to 20)
+
This config option is defined by PagingToolbar.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.QuickTips.html b/www/extras/yui-ext/docs/output/Ext.QuickTips.html new file mode 100644 index 000000000..544f4d126 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.QuickTips.html @@ -0,0 +1,367 @@ + + + + Ext.QuickTips + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.QuickTips

+ + + + + +
Package:Ext
Class:QuickTips
Extends:Object
Defined In:QuickTips.js
+
+ Provides attractive and customizable tooltips for any element.

This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 disable() : voidQuickTips
Disable this quick tip
 enable() : voidQuickTips
Enable this quick tip
 isEnabled() : voidQuickTips
Returns true if the quick tip is enabled, else false
 register(Object config) : voidQuickTips
Configures a new quick tip instance and assigns it to a target element
 unregister() : voidQuickTips
Removes this quick tip from its element and destroys it
+ +

Public Events

+
This class has no public events.
+

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 Delay : NumberQuickTips
in milliseconds before the quick tip hides when autoDismiss = true (defaults to 5000)
 True : BooleanQuickTips
to automatically hide the quick tip after a set period of time, regardless of the user's actions (defaults to true). ...
 animate : BooleanQuickTips
True to turn on fade animation. Defaults to false (ClearType/scrollbar flicker issues in IE7).
 autoHide : BooleanQuickTips
True to automatically hide the quick tip after the mouse exits the target element (defaults to true). Used in conjunc...
 hideDelay : NumberQuickTips
Delay in milliseconds before the quick tip hides when autoHide = true (defaults to 200)
 hideOnClick : BooleanQuickTips
True to hide the quick tip if the user clicks anywhere in the document (defaults to true)
 interceptTitles : BooleanQuickTips
True to automatically use the element's DOM title value if available (defaults to false)
 maxWidth : NumberQuickTips
The maximum width of the quick tip (defaults to 300)
 minWidth : NumberQuickTips
The minimum width of the quick tip (defaults to 40)
 showDelay : NumberQuickTips
Delay in milliseconds before the quick tip displays after the mouse enters the target element (defaults to 500)
 trackMouse : BooleanQuickTips
True to have the quick tip follow the mouse as it moves over the target element (defaults to false)
+ + +

Method Details

+
+ +
+

disable

+ public function disable() +
+ Disable this quick tip +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by QuickTips.
+
+ +
+

enable

+ public function enable() +
+ Enable this quick tip +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by QuickTips.
+
+ +
+

isEnabled

+ public function isEnabled() +
+ Returns true if the quick tip is enabled, else false +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by QuickTips.
+
+ +
+

register

+ public function register(Object config) +
+ Configures a new quick tip instance and assigns it to a target element +
+ Parameters: +
  • config : Object
    The config object
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by QuickTips.
+
+ +
+

unregister

+ public function unregister() +
+ Removes this quick tip from its element and destroys it +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by QuickTips.
+
+
+ +

Config Details

+
+ +
+

Delay

+ Delay : Number +
+ in milliseconds before the quick tip hides when autoDismiss = true (defaults to 5000)
+
This config option is defined by QuickTips.
+
+ +
+

True

+ True : Boolean +
+ to automatically hide the quick tip after a set period of time, regardless of the user's actions (defaults to true). Used in conjunction with autoDismissDelay.
+
This config option is defined by QuickTips.
+
+ +
+

animate

+ animate : Boolean +
+ True to turn on fade animation. Defaults to false (ClearType/scrollbar flicker issues in IE7).
+
This config option is defined by QuickTips.
+
+ +
+

autoHide

+ autoHide : Boolean +
+ True to automatically hide the quick tip after the mouse exits the target element (defaults to true). Used in conjunction with hideDelay.
+
This config option is defined by QuickTips.
+
+ +
+

hideDelay

+ hideDelay : Number +
+ Delay in milliseconds before the quick tip hides when autoHide = true (defaults to 200)
+
This config option is defined by QuickTips.
+
+ +
+

hideOnClick

+ hideOnClick : Boolean +
+ True to hide the quick tip if the user clicks anywhere in the document (defaults to true)
+
This config option is defined by QuickTips.
+
+ +
+

interceptTitles

+ interceptTitles : Boolean +
+ True to automatically use the element's DOM title value if available (defaults to false)
+
This config option is defined by QuickTips.
+
+ +
+

maxWidth

+ maxWidth : Number +
+ The maximum width of the quick tip (defaults to 300)
+
This config option is defined by QuickTips.
+
+ +
+

minWidth

+ minWidth : Number +
+ The minimum width of the quick tip (defaults to 40)
+
This config option is defined by QuickTips.
+
+ +
+

showDelay

+ showDelay : Number +
+ Delay in milliseconds before the quick tip displays after the mouse enters the target element (defaults to 500)
+
This config option is defined by QuickTips.
+
+ +
+

trackMouse

+ trackMouse : Boolean +
+ True to have the quick tip follow the mouse as it moves over the target element (defaults to false)
+
This config option is defined by QuickTips.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.ReaderLayout.html b/www/extras/yui-ext/docs/output/Ext.ReaderLayout.html new file mode 100644 index 000000000..2ad7b9d96 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.ReaderLayout.html @@ -0,0 +1,741 @@ + + + + Ext.ReaderLayout + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.ReaderLayout

+ + + + + +
Package:Ext
Class:ReaderLayout
Extends:BorderLayout
Defined In:ReaderLayout.js
+
+ This is a pre-built layout that represents a classic, 5-pane application. It consists of a header, a primary +center region containing two nested regions (a top one for a list view and one for item preview below), +and regions on either side that can be used for navigation, application commands, informational displays, etc. +The setup and configuration work exactly the same as it does for a Ext.BorderLayout - this class simply +expedites the setup of the overall layout and regions for this common application style. +Example: +
var reader = new Ext.ReaderLayout();
+var CP = Ext.ContentPanel;  // shortcut for adding
+
+reader.beginUpdate();
+reader.add("north", new CP("north", "North"));
+reader.add("west", new CP("west", {title: "West"}));
+reader.add("east", new CP("east", {title: "East"}));
+
+reader.regions.listView.add(new CP("listView", "List"));
+reader.regions.preview.add(new CP("preview", "Preview"));
+reader.endUpdate();
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

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

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 ReaderLayout(Object config, [String/HTMLElement/Element container])ReaderLayout
Create a new ReaderLayout
 add(String target, Ext.ContentPanel panel) : Ext.ContentPanelBorderLayout
Adds a ContentPanel (or subclass) to this layout.
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 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
 endUpdate(Boolean noLayout) : voidLayoutManager
Restore auto-layouts and optionally disable the manager from performing a layout
 findPanel(String panelId) : 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() : Ext.ElementLayoutManager
Returns the element this layout is bound to.
 getRegion(String target) : 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 ...
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 isUpdating() : BooleanLayoutManager
Returns true if this layout is currently being updated
 layout() : voidBorderLayout
Performs a layout update.
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 remove(String target, Number/String/Ext.ContentPanel panel) : Ext.ContentPanelBorderLayout
Remove a ContentPanel (or subclass) to this layout.
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 restoreState([Ext.state.Provider provider]) : voidBorderLayout
Restores this layouts state using Ext.state.Manager or the state provided by the passed provider.
 showPanel(String/ContentPanel panelId) : Ext.ContentPanelBorderLayout
Searches all regions for a panel with the specified id and activates (shows) it.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 layout : (Ext.LayoutManager this)LayoutManager
Fires when a layout is performed.
 regioncollapsed : (Ext.LayoutRegion region)LayoutManager
Fires when a region is collapsed.
 regionexpanded : (Ext.LayoutRegion region)LayoutManager
Fires when a region is expanded.
 regionresized : (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.
+
+
+ + +

Constructor Details

+
+
+

ReaderLayout

+ public function ReaderLayout(Object config, [String/HTMLElement/Element container]) +
+ Create a new ReaderLayout
+ Parameters: +
  • config : Object
    Configuration options
  • container : String/HTMLElement/Element
    (optional) The container this layout is bound to (defaults to document.body if omitted)
+
+
+
+
+ +

Method Details

+
+ +
+

add

+ public function add(String target, 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 : Ext.ContentPanel
    The panel to add
+ Returns: +
    +
  • Ext.ContentPanel
    The added panel
  • +
+
+
+
This method is defined by BorderLayout.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ 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.
+
+ +
+

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: +
    +
  • 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: +
    +
  • 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: +
    +
  • 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.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

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.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

remove

+ public function remove(String target, Number/String/Ext.ContentPanel panel) +
+ Remove a ContentPanel (or subclass) to this layout. +
+ Parameters: +
  • target : String
    The target region key (north, south, east, west or center).
  • panel : Number/String/Ext.ContentPanel
    The index, id or panel to remove
+ Returns: +
    +
  • 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([Ext.state.Provider provider]) +
+ Restores this layouts state using Ext.state.Manager or the state provided by the passed provider. +
+ Parameters: +
  • provider : 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: +
    +
  • Ext.ContentPanel
    The shown panel or null
  • +
+
+
+
This method is defined by BorderLayout.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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 : 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 : 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 : 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 : Ext.LayoutRegion
  • newSize : Number
    The new size (width for east/west, height for north/south)
+
+
+
This event is defined by LayoutManager.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.Resizable.html b/www/extras/yui-ext/docs/output/Ext.Resizable.html new file mode 100644 index 000000000..884708427 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.Resizable.html @@ -0,0 +1,699 @@ + + + + Ext.Resizable + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.Resizable

+ + + + + +
Package: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 to the id of the element), or set wrap:true in your config and +the element will be wrapped for you automatically.

+

Here is the list of valid resize handles:

+
Value   Description
------  -------------------
 'n'     north
 's'     south
 'e'     east
 'w'     west
 'nw'    northwest
 'sw'    southwest
 'se'    southeast
 'ne'    northeast
 'all'   all
+

Here's an example showing the creation of a typical Resizable:

+
var resizer = new Ext.Resizable("element-id", {
    handles: 'all',
    minWidth: 200,
    minHeight: 100,
    maxWidth: 500,
    maxHeight: 400,
    pinned: true
});
resizer.on("resize", myHandler);
+

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

+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Resizable(String/HTMLElement/Ext.Element el, Object config)Resizable
Create a new resizable component
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+
This class has no public events.
+

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 adjustments : Array/StringResizable
String "auto" or an array [width, height] with values to be added to the resize operation's new size (defaults to [0,...
 animate : BooleanResizable
True to animate the resize (not compatible with dynamic sizing, defaults to false)
 disableTrackOver : BooleanResizable
True to disable mouse tracking. This is only applied at config time. (defaults to false)
 draggable : BooleanResizable
Convenience to initialize drag drop (defaults to false)
 duration : NumberResizable
Animation duration if animate = true (defaults to .35)
 dynamic : BooleanResizable
True to resize the element while dragging instead of using a proxy (defaults to false)
 easing : StringResizable
Animation easing if animate = true (defaults to 'easingOutStrong')
 enabled : BooleanResizable
False to disable resizing (defaults to true)
 handles : Boolean/StringResizable
String consisting of the resize handles to display (defaults to false)
 height : NumberResizable
The height of the element in pixels (defaults to null)
 heightIncrement : NumberResizable
The increment to snap the height resize in pixels (dynamic must be true, defaults to 0)
 maxHeight : NumberResizable
The maximum height for the element (defaults to 10000)
 maxWidth : NumberResizable
The maximum width for the element (defaults to 10000)
 minHeight : NumberResizable
The minimum height for the element (defaults to 5)
 minWidth : NumberResizable
The minimum width for the element (defaults to 5)
 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)
 multiDirectional : BooleanResizable
Deprecated. The old style of adding multi-direction resize handles, deprecated in favor of the handles config option ...
 pinned : BooleanResizable
True to ensure that the resize handles are always visible, false to display them only when the user mouses over the r...
 preserveRatio : BooleanResizable
True to preserve the original ratio between height and width during resize (defaults to false)
 resizeChild : Boolean/String/ElementResizable
True to resize the first child, or id/element to resize (defaults to false)
 transparent : BooleanResizable
True for transparent handles. This is only applied at config time. (defaults to false)
 width : NumberResizable
The width of the element in pixels (defaults to null)
 widthIncrement : NumberResizable
The increment to snap the width resize in pixels (dynamic must be true, defaults to 0)
 wrap : BooleanResizable
True to wrap an element with a div if needed (required for textareas and images, defaults to false)
+ + +

Constructor Details

+
+
+

Resizable

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

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+
+ +

Config Details

+
+ +
+

adjustments

+ adjustments : Array/String +
+ String "auto" or an array [width, height] with values to be added to the resize operation's new size (defaults to [0, 0])
+
This config option is defined by Resizable.
+
+ +
+

animate

+ animate : Boolean +
+ True to animate the resize (not compatible with dynamic sizing, defaults to false)
+
This config option is defined by Resizable.
+
+ +
+

disableTrackOver

+ disableTrackOver : Boolean +
+ True to disable mouse tracking. This is only applied at config time. (defaults to false)
+
This config option is defined by Resizable.
+
+ +
+

draggable

+ draggable : Boolean +
+ Convenience to initialize drag drop (defaults to false)
+
This config option is defined by Resizable.
+
+ +
+

duration

+ duration : Number +
+ Animation duration if animate = true (defaults to .35)
+
This config option is defined by Resizable.
+
+ +
+

dynamic

+ dynamic : Boolean +
+ True to resize the element while dragging instead of using a proxy (defaults to false)
+
This config option is defined by Resizable.
+
+ +
+

easing

+ easing : String +
+ Animation easing if animate = true (defaults to 'easingOutStrong')
+
This config option is defined by Resizable.
+
+ +
+

enabled

+ enabled : Boolean +
+ False to disable resizing (defaults to true)
+
This config option is defined by Resizable.
+
+ +
+

handles

+ handles : Boolean/String +
+ String consisting of the resize handles to display (defaults to false)
+
This config option is defined by Resizable.
+
+ +
+

height

+ height : Number +
+ The height of the element in pixels (defaults to null)
+
This config option is defined by Resizable.
+
+ +
+

heightIncrement

+ heightIncrement : Number +
+ The increment to snap the height resize in pixels (dynamic must be true, defaults to 0)
+
This config option is defined by Resizable.
+
+ +
+

maxHeight

+ maxHeight : Number +
+ The maximum height for the element (defaults to 10000)
+
This config option is defined by Resizable.
+
+ +
+

maxWidth

+ maxWidth : Number +
+ The maximum width for the element (defaults to 10000)
+
This config option is defined by Resizable.
+
+ +
+

minHeight

+ minHeight : Number +
+ The minimum height for the element (defaults to 5)
+
This config option is defined by Resizable.
+
+ +
+

minWidth

+ minWidth : Number +
+ The minimum width for the element (defaults to 5)
+
This config option is defined by Resizable.
+
+ +
+

minX

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

minY

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

multiDirectional

+ multiDirectional : Boolean +
+ Deprecated. The old style of adding multi-direction resize handles, deprecated in favor of the handles config option (defaults to false)
+
This config option is defined by Resizable.
+
+ +
+

pinned

+ pinned : Boolean +
+ True to ensure that the resize handles are always visible, false to display them only when the user mouses over the resizable borders. This is only applied at config time. (defaults to false)
+
This config option is defined by Resizable.
+
+ +
+

preserveRatio

+ preserveRatio : Boolean +
+ True to preserve the original ratio between height and width during resize (defaults to false)
+
This config option is defined by Resizable.
+
+ +
+

resizeChild

+ resizeChild : Boolean/String/Element +
+ True to resize the first child, or id/element to resize (defaults to false)
+
This config option is defined by Resizable.
+
+ +
+

transparent

+ transparent : Boolean +
+ True for transparent handles. This is only applied at config time. (defaults to false)
+
This config option is defined by Resizable.
+
+ +
+

width

+ width : Number +
+ The width of the element in pixels (defaults to null)
+
This config option is defined by Resizable.
+
+ +
+

widthIncrement

+ widthIncrement : Number +
+ The increment to snap the width resize in pixels (dynamic must be true, defaults to 0)
+
This config option is defined by Resizable.
+
+ +
+

wrap

+ wrap : Boolean +
+ True to wrap an element with a div if needed (required for textareas and images, defaults to false)
+
This config option is defined by Resizable.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.Shadow.html b/www/extras/yui-ext/docs/output/Ext.Shadow.html new file mode 100644 index 000000000..91dd02a06 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.Shadow.html @@ -0,0 +1,249 @@ + + + + Ext.Shadow + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.Shadow

+ + + + + +
Package:Ext
Class:Shadow
Extends:Object
Defined In:Shadow.js
+
+ Simple class that can provide a shadow effect for any element. Note that the element MUST be absolutely positioned, +and the shadow does not provide any shimming. This should be used only in simple cases -- for more advanced +functionality that can also provide the same shadow effect, see the Ext.Layer class.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Shadow(Object config)Shadow
Create a new Shadow
 hide() : voidShadow
Hides this shadow
 isVisible() : voidShadow
Returns true if the shadow is visible, else false
 realign(Number left, Number top, Number width, Number height) : voidShadow
Direct alignment when values are already available. Show must be called at least once before +calling this method to e...
 setZIndex(Number zindex) : voidShadow
Adjust the z-index of this shadow
 show(String/HTMLElement/Element targetEl) : voidShadow
Displays the shadow under the target element
+ +

Public Events

+
This class has no public events.
+

Config Options

+ + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 mode : StringShadow
The shadow display mode. Supports the following options: Option Description ------- --------------------------------...
 offset : StringShadow
The number of pixels to offset the shadow from the element (defaults to 4)
+ + +

Constructor Details

+
+
+

Shadow

+ public function Shadow(Object config) +
+ Create a new Shadow
+ Parameters: +
  • config : Object
    The config object
+
+
+
+
+ +

Method Details

+
+ +
+

hide

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

isVisible

+ public function isVisible() +
+ Returns true if the shadow is visible, else false +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Shadow.
+
+ +
+

realign

+ public function realign(Number left, Number top, Number width, Number height) +
+ Direct alignment when values are already available. Show must be called at least once before +calling this method to ensure it is initialized. +
+ Parameters: +
  • left : Number
    The target element left position
  • top : Number
    The target element top position
  • width : Number
    The target element width
  • height : Number
    The target element height
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Shadow.
+
+ +
+

setZIndex

+ public function setZIndex(Number zindex) +
+ Adjust the z-index of this shadow +
+ Parameters: +
  • zindex : Number
    The new z-index
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Shadow.
+
+ +
+

show

+ public function show(String/HTMLElement/Element targetEl) +
+ Displays the shadow under the target element +
+ Parameters: +
  • targetEl : String/HTMLElement/Element
    The id or element under which the shadow should display
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Shadow.
+
+
+ +

Config Details

+
+ +
+

mode

+ mode : String +
+ The shadow display mode. Supports the following options:
 Option Description ------- ---------------------------------------------- sides Shadow displays on both sides and bottom only frame Shadow displays equally on all four sides drop Traditional bottom-right drop shadow 
+
This config option is defined by Shadow.
+
+ +
+

offset

+ offset : String +
+ The number of pixels to offset the shadow from the element (defaults to 4)
+
This config option is defined by Shadow.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.SplitBar.AbsoluteLayoutAdapter.html b/www/extras/yui-ext/docs/output/Ext.SplitBar.AbsoluteLayoutAdapter.html new file mode 100644 index 000000000..9327d03cb --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.SplitBar.AbsoluteLayoutAdapter.html @@ -0,0 +1,210 @@ + + + + Ext.SplitBar.AbsoluteLayoutAdapter + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.SplitBar.AbsoluteLayoutAdapter

+ + + + + +
Package: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.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 SplitBar.AbsoluteLayoutAdapter.BOTTOM : NumberSplitBar.AbsoluteLayoutAdapter
<static> Placement constant - The resizing element is positioned under splitter element
 SplitBar.AbsoluteLayoutAdapter.HORIZONTAL : NumberSplitBar.AbsoluteLayoutAdapter
<static> Orientation constant - Create a horizontal SplitBar
 SplitBar.AbsoluteLayoutAdapter.LEFT : NumberSplitBar.AbsoluteLayoutAdapter
<static> Placement constant - The resizing element is to the left of the splitter element
 SplitBar.AbsoluteLayoutAdapter.RIGHT : NumberSplitBar.AbsoluteLayoutAdapter
<static> Placement constant - The resizing element is to the right of the splitter element
 SplitBar.AbsoluteLayoutAdapter.TOP : NumberSplitBar.AbsoluteLayoutAdapter
<static> Placement constant - The resizing element is positioned above the splitter element
 SplitBar.AbsoluteLayoutAdapter.VERTICAL : NumberSplitBar.AbsoluteLayoutAdapter
<static> Orientation constant - Create a vertical SplitBar
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 getElementSize(Ext.SplitBar s) : voidSplitBar.BasicLayoutAdapter
Called before drag operations to get the current size of the resizing element.
 setElementSize(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

+
+ +
+

SplitBar.AbsoluteLayoutAdapter.BOTTOM

+ public Number SplitBar.AbsoluteLayoutAdapter.BOTTOM +
+ <static> Placement constant - The resizing element is positioned under splitter element
+
This property is defined by SplitBar.AbsoluteLayoutAdapter.
+
+ +
+

SplitBar.AbsoluteLayoutAdapter.HORIZONTAL

+ public Number SplitBar.AbsoluteLayoutAdapter.HORIZONTAL +
+ <static> Orientation constant - Create a horizontal SplitBar
+
This property is defined by SplitBar.AbsoluteLayoutAdapter.
+
+ +
+

SplitBar.AbsoluteLayoutAdapter.LEFT

+ public Number SplitBar.AbsoluteLayoutAdapter.LEFT +
+ <static> Placement constant - The resizing element is to the left of the splitter element
+
This property is defined by SplitBar.AbsoluteLayoutAdapter.
+
+ +
+

SplitBar.AbsoluteLayoutAdapter.RIGHT

+ public Number SplitBar.AbsoluteLayoutAdapter.RIGHT +
+ <static> Placement constant - The resizing element is to the right of the splitter element
+
This property is defined by SplitBar.AbsoluteLayoutAdapter.
+
+ +
+

SplitBar.AbsoluteLayoutAdapter.TOP

+ public Number SplitBar.AbsoluteLayoutAdapter.TOP +
+ <static> Placement constant - The resizing element is positioned above the splitter element
+
This property is defined by SplitBar.AbsoluteLayoutAdapter.
+
+ +
+

SplitBar.AbsoluteLayoutAdapter.VERTICAL

+ public Number SplitBar.AbsoluteLayoutAdapter.VERTICAL +
+ <static> Orientation constant - Create a vertical SplitBar
+
This property is defined by SplitBar.AbsoluteLayoutAdapter.
+
+
+ + +

Method Details

+
+ +
+

getElementSize

+ public function getElementSize(Ext.SplitBar s) +
+ Called before drag operations to get the current size of the resizing element. +
+ Parameters: +
  • s : Ext.SplitBar
    The SplitBar using this adapter
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by SplitBar.BasicLayoutAdapter.
+
+ +
+

setElementSize

+ public function setElementSize(Ext.SplitBar s, Number newSize, Function onComplete) +
+ Called after drag operations to set the size of the resizing element. +
+ Parameters: +
  • s : 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.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.SplitBar.BasicLayoutAdapter.html b/www/extras/yui-ext/docs/output/Ext.SplitBar.BasicLayoutAdapter.html new file mode 100644 index 000000000..0113f7b20 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.SplitBar.BasicLayoutAdapter.html @@ -0,0 +1,106 @@ + + + + Ext.SplitBar.BasicLayoutAdapter + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.SplitBar.BasicLayoutAdapter

+ + + + + + +
Package: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.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 getElementSize(Ext.SplitBar s) : voidSplitBar.BasicLayoutAdapter
Called before drag operations to get the current size of the resizing element.
 setElementSize(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(Ext.SplitBar s) +
+ Called before drag operations to get the current size of the resizing element. +
+ Parameters: +
  • s : Ext.SplitBar
    The SplitBar using this adapter
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by SplitBar.BasicLayoutAdapter.
+
+ +
+

setElementSize

+ public function setElementSize(Ext.SplitBar s, Number newSize, Function onComplete) +
+ Called after drag operations to set the size of the resizing element. +
+ Parameters: +
  • s : 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.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.SplitBar.html b/www/extras/yui-ext/docs/output/Ext.SplitBar.html new file mode 100644 index 000000000..6a18a732a --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.SplitBar.html @@ -0,0 +1,632 @@ + + + + Ext.SplitBar + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.SplitBar

+ + + + + +
Package:Ext
Class:SplitBar
Extends:Observable
Defined In:SplitBar.js
+
+ Creates draggable splitter bar functionality from two elements. +

+Usage: +
var split = new Ext.SplitBar("elementToDrag", "elementToSize",
+                   Ext.SplitBar.HORIZONTAL, Ext.SplitBar.LEFT);
+split.setAdapter(new Ext.SplitBar.AbsoluteLayoutAdapter("container"));
+split.minSize = 100;
+split.maxSize = 600;
+split.animate = true;
+split.on('moved', splitterMoved);
+
+ Properties +   -  Methods +   -  Events +
+ +

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
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 destroy(Boolean removeEl) : voidSplitBar
Destroy this splitbar.
 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
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 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
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeresize : (Ext.SplitBar this)SplitBar
Fires before the splitter is dragged
 moved : (Ext.SplitBar this, Number newSize)SplitBar
Fires when the splitter is moved
 resize : (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 Ext.SplitBar.HORIZONTAL or Ext.SplitBar.VERTICAL. (Defaults to HORIZONTAL)
  • placement : Number
    (optional) Either Ext.SplitBar.LEFT or Ext.SplitBar.RIGHT for horizontal or Ext.SplitBar.TOP or Ext.SplitBar.BOTTOM for vertical. (By default, this is determined automatically by the intial position position of the SplitBar).
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

destroy

+ public function destroy(Boolean removeEl) +
+ Destroy this splitbar. +
+ Parameters: +
  • removeEl : Boolean
    True to remove the element
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by SplitBar.
+
+ +
+

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.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

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.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

beforeresize

+ public event beforeresize +
+ Fires before the splitter is dragged +
+ Subscribers will be called with the following parameters: +
  • this : 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 : 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 : Ext.SplitBar
  • newSize : Number
    the new width or height
+
+
+
This event is defined by SplitBar.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.SplitLayoutRegion.html b/www/extras/yui-ext/docs/output/Ext.SplitLayoutRegion.html new file mode 100644 index 000000000..06cdafaf6 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.SplitLayoutRegion.html @@ -0,0 +1,1458 @@ + + + + Ext.SplitLayoutRegion + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.SplitLayoutRegion

+ + + + + +
Package:Ext
Class:SplitLayoutRegion
Extends:LayoutRegion
Defined In:SplitLayoutRegion.js
+
+ Adds a splitbar and other (private) useful functionality to a LayoutRegion
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 bodyEl : Ext.ElementLayoutRegion
This regions body element
 collapsedEl : Ext.ElementLayoutRegion
This region's collapsed element
 el : Ext.ElementLayoutRegion
This regions container element
 panels : Ext.util.MixedCollectionBasicLayoutRegion
A collection of panels in this region.
 split : Ext.SplitBarSplitLayoutRegion
The SplitBar for this region
 titleTextEl : HTMLElementLayoutRegion
This regions title text element
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 add(ContentPanel... panel) : Ext.ContentPanelBasicLayoutRegion
Add the passed ContentPanel(s)
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 collapse([Boolean skipAnim]) : voidLayoutRegion
Collapses this region.
 expand(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() : Ext.ContentPanelBasicLayoutRegion
Get the active panel for this region.
 getEl() : Ext.ElementBasicLayoutRegion
Returns the container element for this region.
 getPanel(Number/String/ContentPanel panel) : Ext.ContentPanelBasicLayoutRegion
Returns the panel specified or null if it's not in this region.
 getPosition() : StringBasicLayoutRegion
Returns this regions position (north/south/east/west/center).
 getSplitBar() : Ext.SplitBarSplitLayoutRegion
Returns the SplitBar for this region.
 getTabs() : Ext.TabPanelLayoutRegion
Returns the TabPanel component used by this region
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hasPanel(Number/String/ContentPanel panel) : BooleanBasicLayoutRegion
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() : BooleanBasicLayoutRegion
Returns true if this region is currently visible.
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 remove(Number/String/ContentPanel panel, Boolean preservePanel) : Ext.ContentPanelBasicLayoutRegion
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) : voidBasicLayoutRegion
Resizes the region to the specified size. For vertical regions (west, east) this adjusts +the width, for horizontal (...
 setCollapsedTitle() : voidLayoutRegion
Updates the collapsed text for north/south regions (used with collapsedTitle config option)
 show() : voidLayoutRegion
Shows this region if it was previously hidden.
 showPanel(Number/String/ContentPanel panelId) : Ext.ContentPanelBasicLayoutRegion
Show the specified panel.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 unhidePanel(Number/String/ContentPanel panel) : voidLayoutRegion
Unhides the tab for a previously hidden panel.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeremove : (Ext.LayoutRegion this, Ext.ContentPanel panel, Object e)BasicLayoutRegion
Fires before a panel is removed (or closed). To cancel the removal set "e.cancel = true" on the event argument.
 collapsed : (Ext.LayoutRegion this)BasicLayoutRegion
Fires when this region is collapsed.
 expanded : (Ext.LayoutRegion this)BasicLayoutRegion
Fires when this region is expanded.
 invalidated : (Ext.LayoutRegion this)BasicLayoutRegion
Fires when the layout for this region is changed.
 panelactivated : (Ext.LayoutRegion this, Ext.ContentPanel panel)BasicLayoutRegion
Fires when a panel is activated.
 paneladded : (Ext.LayoutRegion this, Ext.ContentPanel panel)BasicLayoutRegion
Fires when a panel is added.
 panelremoved : (Ext.LayoutRegion this, Ext.ContentPanel panel)BasicLayoutRegion
Fires when a panel is removed.
 resized : (Ext.LayoutRegion this, Number newSize)BasicLayoutRegion
Fires when the user resizes this region.
 slidehide : (Ext.LayoutRegion this)BasicLayoutRegion
Fires when this region slides out of view.
 slideshow : (Ext.LayoutRegion this)BasicLayoutRegion
Fires when this region is slid into view.
 visibilitychange : (Ext.LayoutRegion this, Boolean visibility)BasicLayoutRegion
Fires when this region is shown or hidden
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 alwaysShowTabs : BooleanLayoutRegion
True to always display tabs even when only 1 panel (defaults to false)
 animate : BooleanLayoutRegion
True to animate expand/collapse (defaults to false)
 autoHide : BooleanLayoutRegion
False to disable autoHide when the mouse leaves the "floated" region (defaults to true)
 autoScroll : BooleanLayoutRegion
True to enable overflow scrolling (defaults to false)
 closeOnTab : BooleanLayoutRegion
True to place the close icon on the tabs instead of the region titlebar (defaults to false)
 cmargins : ObjectLayoutRegion
Margins for the element when collapsed (defaults to: north/south {top: 2, left: 0, right:0, bottom: 2} or east/west {...
 collapsed : BooleanLayoutRegion
True to set the initial display to collapsed (defaults to false)
 collapsedTitle : StringLayoutRegion
Optional string message to display in the collapsed block of a north or south region
 collapsible : BooleanLayoutRegion
False to disable collapsing (defaults to true)
 disableTabTips : BooleanLayoutRegion
True to disable tab tooltips
 floatable : BooleanLayoutRegion
False to disable floating (defaults to true)
 hidden : BooleanLayoutRegion
True to start the region hidden
 hideTabs : BooleanLayoutRegion
True to hide the tab strip (defaults to false)
 hideWhenEmpty : BooleanLayoutRegion
True to hide the region when it has no panels
 margins : ObjectLayoutRegion
Margins for the element (defaults to {top: 0, left: 0, right:0, bottom: 0})
 minTabWidth : NumberLayoutRegion
The minimum tab width (defaults to 40)
 preferredTabWidth : NumberLayoutRegion
The preferred tab width (defaults to 150)
 preservePanels : BooleanLayoutRegion
True to preserve removed panels so they can be readded later (defaults to false)
 resizeTabs : BooleanLayoutRegion
True to enable automatic tab resizing. This will resize the tabs so they are all the same size and fit within the spa...
 showPin : BooleanLayoutRegion
True to show a pin button
 tabPosition : StringLayoutRegion
"top" or "bottom" (defaults to "bottom")
 title : StringLayoutRegion
The title for the region (overrides panel titles)
 titlebar : BooleanLayoutRegion
True to display a title bar (defaults to true)
+

Property Details

+
+ +
+

bodyEl

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

collapsedEl

+ public Ext.Element collapsedEl +
+ This region's collapsed element
+
This property is defined by LayoutRegion.
+
+ +
+

el

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

panels

+ public Ext.util.MixedCollection panels +
+ A collection of panels in this region.
+
This property is defined by BasicLayoutRegion.
+
+ +
+

split

+ public Ext.SplitBar split +
+ The SplitBar for this region
+
This property is defined by SplitLayoutRegion.
+
+ +
+

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: +
    +
  • Ext.ContentPanel
    The panel added (if only one was added)
  • +
+
+
+
This method is defined by BasicLayoutRegion.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ 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.
+
+ +
+

expand

+ public function expand(Ext.EventObject e, [Boolean skipAnim]) +
+ Expand this region if it was previously collapsed. +
+ Parameters: +
  • e : 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: +
    +
  • Ext.ContentPanel
    The active panel or null
  • +
+
+
+
This method is defined by BasicLayoutRegion.
+
+ +
+

getEl

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

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: +
    +
  • Ext.ContentPanel
  • +
+
+
+
This method is defined by BasicLayoutRegion.
+
+ +
+

getPosition

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

getSplitBar

+ public function getSplitBar() +
+ Returns the SplitBar for this region. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.SplitBar
  • +
+
+
+
This method is defined by SplitLayoutRegion.
+
+ +
+

getTabs

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

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

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 BasicLayoutRegion.
+
+ +
+

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 BasicLayoutRegion.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

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: +
    +
  • Ext.ContentPanel
    The panel that was removed
  • +
+
+
+
This method is defined by BasicLayoutRegion.
+
+ +
+

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 BasicLayoutRegion.
+
+ +
+

setCollapsedTitle

+ public function setCollapsedTitle() +
+ Updates the collapsed text for north/south regions (used with collapsedTitle config option) +
+ Parameters: +
  • None.
+ 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: +
    +
  • Ext.ContentPanel
    The shown panel or null
  • +
+
+
+
This method is defined by BasicLayoutRegion.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

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

+
+ +
+

beforeremove

+ public event beforeremove +
+ Fires before a panel is removed (or closed). To cancel the removal set "e.cancel = true" on the event argument. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.LayoutRegion
  • panel : Ext.ContentPanel
    The panel
  • e : Object
    The cancel event object
+
+
+
This event is defined by BasicLayoutRegion.
+
+ +
+

collapsed

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

expanded

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

invalidated

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

panelactivated

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

paneladded

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

panelremoved

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

resized

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

slidehide

+ public event slidehide +
+ Fires when this region slides out of view. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.LayoutRegion
+
+
+
This event is defined by BasicLayoutRegion.
+
+ +
+

slideshow

+ public event slideshow +
+ Fires when this region is slid into view. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.LayoutRegion
+
+
+
This event is defined by BasicLayoutRegion.
+
+ +
+

visibilitychange

+ public event visibilitychange +
+ Fires when this region is shown or hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.LayoutRegion
  • visibility : Boolean
    true or false
+
+
+
This event is defined by BasicLayoutRegion.
+
+
+

Config Details

+
+ +
+

alwaysShowTabs

+ alwaysShowTabs : Boolean +
+ True to always display tabs even when only 1 panel (defaults to false)
+
This config option is defined by LayoutRegion.
+
+ +
+

animate

+ animate : Boolean +
+ True to animate expand/collapse (defaults to false)
+
This config option is defined by LayoutRegion.
+
+ +
+

autoHide

+ autoHide : Boolean +
+ False to disable autoHide when the mouse leaves the "floated" region (defaults to true)
+
This config option is defined by LayoutRegion.
+
+ +
+

autoScroll

+ autoScroll : Boolean +
+ True to enable overflow scrolling (defaults to false)
+
This config option is defined by LayoutRegion.
+
+ +
+

closeOnTab

+ closeOnTab : Boolean +
+ True to place the close icon on the tabs instead of the region titlebar (defaults to false)
+
This config option is defined by LayoutRegion.
+
+ +
+

cmargins

+ cmargins : Object +
+ Margins for the element when collapsed (defaults to: north/south {top: 2, left: 0, right:0, bottom: 2} or east/west {top: 0, left: 2, right:2, bottom: 0})
+
This config option is defined by LayoutRegion.
+
+ +
+

collapsed

+ collapsed : Boolean +
+ True to set the initial display to collapsed (defaults to false)
+
This config option is defined by LayoutRegion.
+
+ +
+

collapsedTitle

+ collapsedTitle : String +
+ Optional string message to display in the collapsed block of a north or south region
+
This config option is defined by LayoutRegion.
+
+ +
+

collapsible

+ collapsible : Boolean +
+ False to disable collapsing (defaults to true)
+
This config option is defined by LayoutRegion.
+
+ +
+

disableTabTips

+ disableTabTips : Boolean +
+ True to disable tab tooltips
+
This config option is defined by LayoutRegion.
+
+ +
+

floatable

+ floatable : Boolean +
+ False to disable floating (defaults to true)
+
This config option is defined by LayoutRegion.
+
+ +
+

hidden

+ hidden : Boolean +
+ True to start the region hidden
+
This config option is defined by LayoutRegion.
+
+ +
+

hideTabs

+ hideTabs : Boolean +
+ True to hide the tab strip (defaults to false)
+
This config option is defined by LayoutRegion.
+
+ +
+

hideWhenEmpty

+ hideWhenEmpty : Boolean +
+ True to hide the region when it has no panels
+
This config option is defined by LayoutRegion.
+
+ +
+

margins

+ margins : Object +
+ Margins for the element (defaults to {top: 0, left: 0, right:0, bottom: 0})
+
This config option is defined by LayoutRegion.
+
+ +
+

minTabWidth

+ minTabWidth : Number +
+ The minimum tab width (defaults to 40)
+
This config option is defined by LayoutRegion.
+
+ +
+

preferredTabWidth

+ preferredTabWidth : Number +
+ The preferred tab width (defaults to 150)
+
This config option is defined by LayoutRegion.
+
+ +
+

preservePanels

+ preservePanels : Boolean +
+ True to preserve removed panels so they can be readded later (defaults to false)
+
This config option is defined by LayoutRegion.
+
+ +
+

resizeTabs

+ resizeTabs : Boolean +
+ True to enable automatic tab resizing. This will resize the tabs so they are all the same size and fit within the space available, similar to FireFox 1.5 tabs (defaults to false)
+
This config option is defined by LayoutRegion.
+
+ +
+

showPin

+ showPin : Boolean +
+ True to show a pin button
+
This config option is defined by LayoutRegion.
+
+ +
+

tabPosition

+ tabPosition : String +
+ "top" or "bottom" (defaults to "bottom")
+
This config option is defined by LayoutRegion.
+
+ +
+

title

+ title : String +
+ The title for the region (overrides panel titles)
+
This config option is defined by LayoutRegion.
+
+ +
+

titlebar

+ titlebar : Boolean +
+ True to display a title bar (defaults to true)
+
This config option is defined by LayoutRegion.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.TabPanel.html b/www/extras/yui-ext/docs/output/Ext.TabPanel.html new file mode 100644 index 000000000..f4db0477e --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.TabPanel.html @@ -0,0 +1,921 @@ + + + + Ext.TabPanel + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.TabPanel

+ + + + + +
Package: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 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 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.on('activate', 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");
+}
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 bodyEl : Ext.ElementTabPanel
The body element that contains TabPaneItem bodies.
 el : 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.
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 addTab(String id, String text, [String content], [Boolean closable]) : 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(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)
 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() : Ext.TabPanelItemTabPanel
Get the active TabPanelItem
 getCount() : NumberTabPanel
Returns the number of tabs
 getTab(String/Number id) : Ext.TabPanelItemTabPanel
Returns the TabPanelItem with the specified id/index
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hideTab(String/Number id) : voidTabPanel
Hides the TabPanelItem with the specified id/index
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 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
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 unhideTab(String/Number id) : voidTabPanel
"Unhides" the TabPanelItem with the specified id/index
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforetabchange : (Ext.TabPanel this, Object e, Ext.TabPanelItem tab)TabPanel
Fires before the active tab changes, set cancel to true on the "e" parameter to cancel the change
 tabchange : (Ext.TabPanel this, Ext.TabPanelItem activePanel)TabPanel
Fires when the active tab changes
+

Property Details

+
+ +
+

bodyEl

+ public Ext.Element bodyEl +
+ The body element that contains TabPaneItem bodies.
+
This property is defined by TabPanel.
+
+ +
+

el

+ public 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 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.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ 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: +
    +
  • Ext.TabPanelItem
    The created TabPanelItem
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

addTabItem

+ public function addTabItem(Ext.TabPanelItem item) +
+ Add an existing TabPanelItem. +
+ Parameters: +
  • item : 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.
+
+ +
+

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: +
    +
  • Ext.TabPanelItem
    The active TabPanelItem or null if none are active.
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

getCount

+ public function getCount() +
+ Returns the number of tabs +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
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: +
    +
  • Ext.TabPanelItem
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

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.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

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.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

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 : Ext.TabPanel
  • e : Object
    Set cancel to true on this object to cancel the tab change
  • tab : 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 : Ext.TabPanel
  • activePanel : Ext.TabPanelItem
    The new active tab
+
+
+
This event is defined by TabPanel.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.TabPanelItem.html b/www/extras/yui-ext/docs/output/Ext.TabPanelItem.html new file mode 100644 index 000000000..c4d9a9068 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.TabPanelItem.html @@ -0,0 +1,775 @@ + + + + Ext.TabPanelItem + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.TabPanelItem

+ + + + + +
Package:Ext
Class:TabPanelItem
Extends:Observable
Defined In:TabPanel.js
+
+
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 bodyEl : 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 : Ext.TabPanelTabPanelItem
The TabPanel this TabPanelItem belongs to
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 activate() : voidTabPanelItem
Activate this TabPanelItem - this does deactivate the currently active TabPanelItem.
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 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).
 getText() : StringTabPanelItem
Returns the text for this tab
 getUpdateManager() : Ext.UpdateManagerTabPanelItem
Get the Ext.UpdateManager for the body of this TabPanelItem. Enables you to perform Ajax updates.
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidTabPanelItem
Hide this TabPanelItem - if you don't activate another TabPanelItem this could look odd.
 isActive() : BooleanTabPanelItem
Returns true if this tab is the active tab
 isHidden() : BooleanTabPanelItem
Returns true if this tab is "hidden"
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 refresh() : voidTabPanelItem
Force a content refresh from the URL specified in the setUrl() method. +Will fail silently if the setUrl method has no...
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 setContent(String content, Boolean loadScripts) : voidTabPanelItem
Set the content for this TabPanelItem.
 setText(String text) : voidTabPanelItem
Sets the text for the tab (Note: this also sets the tooltip)
 setTooltip(String tooltip) : voidTabPanelItem
Set the tooltip for the tab
 setUrl(String/Function url, [String/Object params], [Boolean loadOnce]) : 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.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 activate : (Ext.TabPanel tabPanel, Ext.TabPanelItem this)TabPanelItem
Fires when this tab becomes the active tab
 beforeclose : (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 : (Ext.TabPanelItem this)TabPanelItem
Fires when this tab is closed
 deactivate : (Ext.TabPanel tabPanel, Ext.TabPanelItem this)TabPanelItem
Fires when this tab is no longer the active tab
+

Property Details

+
+ +
+

bodyEl

+ public 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 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.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

getText

+ public function getText() +
+ Returns the text for this tab +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by TabPanelItem.
+
+ +
+

getUpdateManager

+ public function getUpdateManager() +
+ Get the Ext.UpdateManager for the body of this TabPanelItem. Enables you to perform Ajax updates. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.UpdateManager
    The UpdateManager
  • +
+
+
+
This method is defined by TabPanelItem.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

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.
+
+ +
+

isActive

+ public function isActive() +
+ Returns true if this tab is the active tab +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by TabPanelItem.
+
+ +
+

isHidden

+ public function isHidden() +
+ Returns true if this tab is "hidden" +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by TabPanelItem.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

refresh

+ public function refresh() +
+ Force a content refresh from the URL specified in the setUrl() method. +Will fail silently if the setUrl method has not been called. +This does not activate the panel, just updates its content. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanelItem.
+
+ +
+

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.
+
+ +
+

setText

+ public function setText(String text) +
+ Sets the text for the tab (Note: this also sets the tooltip) +
+ Parameters: +
  • text : String
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanelItem.
+
+ +
+

setTooltip

+ public function setTooltip(String tooltip) +
+ Set the tooltip for the tab +
+ Parameters: +
  • tooltip : String
+ 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 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: +
    +
  • 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.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

activate

+ public event activate +
+ Fires when this tab becomes the active tab +
+ Subscribers will be called with the following parameters: +
  • tabPanel : Ext.TabPanel
  • this : 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 : 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 : 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 : Ext.TabPanel
  • this : Ext.TabPanelItem
+
+
+
This event is defined by TabPanelItem.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.Template.html b/www/extras/yui-ext/docs/output/Ext.Template.html new file mode 100644 index 000000000..c45d36219 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.Template.html @@ -0,0 +1,377 @@ + + + + Ext.Template + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.Template

+ + + + + + +
Package:Ext
Class:Template
Extends:Object
Subclasses:MasterTemplate
Defined In:Template.js
+
+ Represents an HTML fragment template. Templates can be precompiled for greater performance. +For a list of available format functions, see Ext.util.Format. +
var t = new Ext.Template(
+	'<div name="{id}">',
+		'<span class="{cls}">{name:trim} {value:ellipsis(10)}</span>',
+	'</div>'
+);
+t.append('some-element', {id: 'myid', name: 'foo', value: 'bar'});
+For more information see this blog post with examples. +
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disableFormats : BooleanTemplate
True to disable format functions (default to false)
 re : RegExpTemplate
The regular expression used to match template variables
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Template(String/Array html)Template
 Template.from(String/HTMLElement el) : voidTemplate
<static> Creates a template from the passed element's value (display:none textarea, preferred) or innerHTML
 append(String/HTMLElement/Element el, Object values, [Boolean returnElement]) : HTMLElementTemplate
Applies the supplied values to the template and append the new node(s) to el
 apply() : voidTemplate
Alias for applyTemplate
 applyTemplate(Object values) : StringTemplate
Returns an HTML fragment of this template with the specified values applied
 compile() : voidTemplate
Compiles the template into an internal function, eliminating the RegEx overhead
 insertAfter(String/HTMLElement/Element el, Object values, [Boolean returnElement]) : HTMLElementTemplate
Applies the supplied values to the template and inserts the new node(s) after el
 insertBefore(String/HTMLElement/Element el, Object values, [Boolean returnElement]) : HTMLElementTemplate
Applies the supplied values to the template and inserts the new node(s) before el
 insertFirst(String/HTMLElement/Element el, Object values, [Boolean returnElement]) : HTMLElementTemplate
Applies the supplied values to the template and inserts the new node(s) as the first child of el
 overwrite(String/HTMLElement/Element el, Object values, [Boolean returnElement]) : HTMLElementTemplate
Applies the supplied values to the template and overwrites the content of el with the new node(s)
 set(String html, [Boolean compile]) : TemplateTemplate
Sets the html used as the template and optionally compiles it
+ +

Public Events

+
This class has no public events.

Property Details

+
+ +
+

disableFormats

+ public Boolean disableFormats +
+ True to disable format functions (default to false)
+
This property is defined by Template.
+
+ +
+

re

+ public RegExp re +
+ The regular expression used to match template variables
+
This property is defined by Template.
+
+
+ + +

Constructor Details

+
+
+

Template

+ public function Template(String/Array html) +
+
+ Parameters: +
  • html : String/Array
    The HTML fragment or an array of fragments to join('') or multiple arguments to join('')
+
+
+
+
+ +

Method Details

+
+ +
+

Template.from

+ public function Template.from(String/HTMLElement el) +
+ <static> Creates a template from the passed element's value (display:none textarea, preferred) or innerHTML +
+ Parameters: +
  • el : String/HTMLElement
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Template.
+
+ +
+

append

+ public function append(String/HTMLElement/Element el, Object values, [Boolean returnElement]) +
+ Applies the supplied values to the template and append the new node(s) to el +
+ Parameters: +
  • el : String/HTMLElement/Element
    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 Ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by Template.
+
+ +
+

apply

+ public function apply() +
+ Alias for applyTemplate +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by 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 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 Template.
+
+ +
+

insertAfter

+ public function insertAfter(String/HTMLElement/Element el, Object values, [Boolean returnElement]) +
+ Applies the supplied values to the template and inserts the new node(s) after el +
+ Parameters: +
  • el : String/HTMLElement/Element
    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 Ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by Template.
+
+ +
+

insertBefore

+ public function insertBefore(String/HTMLElement/Element el, Object values, [Boolean returnElement]) +
+ Applies the supplied values to the template and inserts the new node(s) before el +
+ Parameters: +
  • el : String/HTMLElement/Element
    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 Ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by Template.
+
+ +
+

insertFirst

+ public function insertFirst(String/HTMLElement/Element el, Object values, [Boolean returnElement]) +
+ Applies the supplied values to the template and inserts the new node(s) as the first child of el +
+ Parameters: +
  • el : String/HTMLElement/Element
    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 Ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by Template.
+
+ +
+

overwrite

+ public function overwrite(String/HTMLElement/Element 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 : String/HTMLElement/Element
    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 Ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by Template.
+
+ +
+

set

+ public function set(String html, [Boolean compile]) +
+ Sets the html used as the template and optionally compiles it +
+ Parameters: +
  • html : String
  • compile : Boolean
    (optional)
+ Returns: +
    +
  • Template
    this
  • +
+
+
+
This method is defined by Template.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.Toolbar.Button.html b/www/extras/yui-ext/docs/output/Ext.Toolbar.Button.html new file mode 100644 index 000000000..4796ceeca --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.Toolbar.Button.html @@ -0,0 +1,1005 @@ + + + + Ext.Toolbar.Button + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.Toolbar.Button

+ + + + + +
Package:Ext
Class:Toolbar.Button
Extends:Button
Defined In:Toolbar.js
+
+ A button that renders into a toolbar.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : BooleanButton
Read-only. True if this button is disabled
 hidden : BooleanButton
Read-only. True if this button is hidden
 pressed : BooleanButton
Read-only. True if this button is pressed (only if enableToggle = true)
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Toolbar.Button(Object config)Toolbar.Button
Creates a new Button
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 destroy() : voidToolbar.Button
Remove and destroy this button
 disable() : voidToolbar.Button
Disable this item
 enable() : voidToolbar.Button
Enable this item
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus() : voidButton
Focus the button
 getEl() : Ext.ElementButton
Returns the button's underlying element
 getText() : StringButton
Gets the text for this button
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidToolbar.Button
Hide this button
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 setDisabled(Boolean enabled) : voidButton
Convenience function for boolean enable/disable
 setHandler(Function handler, [Object scope]) : voidButton
Assigns this button's click handler
 setText(String text) : voidButton
Sets this button's text
 setVisible(Boolean visible) : voidButton
Convenience function for boolean show/hide
 show() : voidToolbar.Button
Show this button
 toggle([Boolean state]) : voidButton
If a state it passed, it becomes the pressed state otherwise the current state is toggled.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 click : (Button this, EventObject e)Button
Fires when this button is clicked
 mouseout : (Button this, Event e)Button
Fires when the mouse exits the button
 mouseover : (Button this, Event e)Button
Fires when the mouse hovers over the button
 toggle : (Button this, Boolean pressed)Button
Fires when the "pressed" state of this button changes (only if enableToggle = true)
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 disabled : BooleanButton
True to start disabled (defaults to false)
 enableToggle : BooleanButton
True to enable pressed/not pressed toggling (defaults to false)
 handler : FunctionButton
A function called when the button is clicked (can be used instead of click event)
 hidden : BooleanButton
True to start hidden (defaults to false)
 icon : StringButton
The path to an image to display in the button (the image will be set as the background-image CSS property of the butt...
 menu : MixedButton
Standard menu attribute consisting of a reference to a menu object, a menu id or a menu config blob
 menuAlign : StringButton
The position to align the menu to (see Ext.Element.alignTo for more details, defaults to 'tl-bl?').
 minWidth : NumberButton
The minimum width for this button (used to give a set of buttons a common width)
 pressed : BooleanButton
True to start pressed (only if enableToggle = true)
 repeat : Boolean/ObjectButton
True to repeat fire the click event while the mouse is down. This can also be an Ext.util.ClickRepeater config object...
 scope : ObjectButton
The scope of the handler
 text : StringButton
The button text
 toggleGroup : StringButton
The group this toggle button is a member of (only 1 per group can be pressed, only applies if enableToggle = true)
 tooltip : String/ObjectButton
The tooltip for the button - can be a string or QuickTips config object
 tooltipType : StringButton
The type of tooltip to use. Either "qtip" for QuickTips or "title" for title attribute.
+

Property Details

+
+ +
+

disabled

+ public Boolean disabled +
+ Read-only. True if this button is disabled
+
This property is defined by Button.
+
+ +
+

hidden

+ public Boolean hidden +
+ Read-only. True if this button is hidden
+
This property is defined by Button.
+
+ +
+

pressed

+ public Boolean pressed +
+ Read-only. True if this button is pressed (only if enableToggle = true)
+
This property is defined by Button.
+
+
+ + +

Constructor Details

+
+
+

Toolbar.Button

+ public function Toolbar.Button(Object config) +
+ Creates a new Button
+ Parameters: +
  • config : Object
    A standard Ext.Button config object
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

destroy

+ public function destroy() +
+ Remove and destroy this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Button.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

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

getEl

+ public function getEl() +
+ Returns the button's underlying element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Button.
+
+ +
+

getText

+ public function getText() +
+ Gets the text for this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    The button text
  • +
+
+
+
This method is defined by Button.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean enabled) +
+ Convenience function for boolean enable/disable +
+ Parameters: +
  • enabled : Boolean
    True to enable, false to disable
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Button.
+
+ +
+

setHandler

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

setText

+ public function setText(String text) +
+ Sets this button's text +
+ Parameters: +
  • text : String
    The button text
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by 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 Button.
+
+ +
+

show

+ public function show() +
+ Show this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Button.
+
+ +
+

toggle

+ public function toggle([Boolean state]) +
+ If a state it passed, it becomes the pressed state otherwise the current state is toggled. +
+ Parameters: +
  • state : Boolean
    (optional) Force a particular state
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Button.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

click

+ public event click +
+ Fires when this button is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Button
  • e : EventObject
    The click event
+
+
+
This event is defined by Button.
+
+ +
+

mouseout

+ public event mouseout +
+ Fires when the mouse exits the button +
+ Subscribers will be called with the following parameters: +
  • this : Button
  • e : Event
    The event object
+
+
+
This event is defined by Button.
+
+ +
+

mouseover

+ public event mouseover +
+ Fires when the mouse hovers over the button +
+ Subscribers will be called with the following parameters: +
  • this : Button
  • e : Event
    The event object
+
+
+
This event is defined by Button.
+
+ +
+

toggle

+ public event toggle +
+ Fires when the "pressed" state of this button changes (only if enableToggle = true) +
+ Subscribers will be called with the following parameters: +
  • this : Button
  • pressed : Boolean
+
+
+
This event is defined by Button.
+
+
+

Config Details

+
+ +
+

disabled

+ disabled : Boolean +
+ True to start disabled (defaults to false)
+
This config option is defined by Button.
+
+ +
+

enableToggle

+ enableToggle : Boolean +
+ True to enable pressed/not pressed toggling (defaults to false)
+
This config option is defined by Button.
+
+ +
+

handler

+ handler : Function +
+ A function called when the button is clicked (can be used instead of click event)
+
This config option is defined by Button.
+
+ +
+

hidden

+ hidden : Boolean +
+ True to start hidden (defaults to false)
+
This config option is defined by Button.
+
+ +
+

icon

+ icon : String +
+ The path to an image to display in the button (the image will be set as the background-image CSS property of the button by default, so if you want a mixed icon/text button, set cls:"x-btn-text-icon")
+
This config option is defined by Button.
+
+ +
+

menu

+ menu : Mixed +
+ Standard menu attribute consisting of a reference to a menu object, a menu id or a menu config blob
+
This config option is defined by Button.
+
+ +
+

menuAlign

+ menuAlign : String +
+ The position to align the menu to (see Ext.Element.alignTo for more details, defaults to 'tl-bl?').
+
This config option is defined by Button.
+
+ +
+

minWidth

+ minWidth : Number +
+ The minimum width for this button (used to give a set of buttons a common width)
+
This config option is defined by Button.
+
+ +
+

pressed

+ pressed : Boolean +
+ True to start pressed (only if enableToggle = true)
+
This config option is defined by Button.
+
+ +
+

repeat

+ repeat : Boolean/Object +
+ True to repeat fire the click event while the mouse is down. This can also be an Ext.util.ClickRepeater config object (defaults to false).
+
This config option is defined by Button.
+
+ +
+

scope

+ scope : Object +
+ The scope of the handler
+
This config option is defined by Button.
+
+ +
+

text

+ text : String +
+ The button text
+
This config option is defined by Button.
+
+ +
+

toggleGroup

+ toggleGroup : String +
+ The group this toggle button is a member of (only 1 per group can be pressed, only applies if enableToggle = true)
+
This config option is defined by Button.
+
+ +
+

tooltip

+ tooltip : String/Object +
+ The tooltip for the button - can be a string or QuickTips config object
+
This config option is defined by Button.
+
+ +
+

tooltipType

+ tooltipType : String +
+ The type of tooltip to use. Either "qtip" for QuickTips or "title" for title attribute.
+
This config option is defined by Button.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.Toolbar.Item.html b/www/extras/yui-ext/docs/output/Ext.Toolbar.Item.html new file mode 100644 index 000000000..412bc16f2 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.Toolbar.Item.html @@ -0,0 +1,277 @@ + + + + Ext.Toolbar.Item + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.Toolbar.Item

+ + + + + + +
Package:Ext
Class:Toolbar.Item
Extends:Object
Subclasses:Toolbar.Separator, Toolbar.Spacer, Toolbar.TextItem
Defined In:Toolbar.js
+
+ The base class that other classes should extend in order to get some basic common toolbar item functionality.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Toolbar.Item(HTMLElement el)Toolbar.Item
Creates a new Item
 destroy() : voidToolbar.Item
Remove and destroy this button
 disable() : voidToolbar.Item
Disable this item
 enable() : voidToolbar.Item
Enable this item
 focus() : voidToolbar.Item
Try to focus this item
 getEl() : HTMLElementToolbar.Item
Get this item's HTML Element
 hide() : voidToolbar.Item
Hide this item
 setVisible(Boolean visible) : voidToolbar.Item
Convenience function for boolean show/hide
 show() : voidToolbar.Item
Show this item
+ +

Public Events

+
This class has no public events.
+ +

Constructor Details

+
+
+

Toolbar.Item

+ public function Toolbar.Item(HTMLElement el) +
+ Creates a new Item
+ Parameters: +
  • el : HTMLElement
+
+
+
+
+ +

Method Details

+
+ +
+

destroy

+ public function destroy() +
+ Remove and destroy this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

disable

+ public function disable() +
+ Disable this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

enable

+ public function enable() +
+ Enable this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

focus

+ public function focus() +
+ Try to focus this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

getEl

+ public function getEl() +
+ Get this item's HTML Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

hide

+ public function hide() +
+ Hide this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

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 Toolbar.Item.
+
+ +
+

show

+ public function show() +
+ Show this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.Toolbar.MenuButton.html b/www/extras/yui-ext/docs/output/Ext.Toolbar.MenuButton.html new file mode 100644 index 000000000..6a4d06e78 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.Toolbar.MenuButton.html @@ -0,0 +1,1083 @@ + + + + Ext.Toolbar.MenuButton + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.Toolbar.MenuButton

+ + + + + +
Package:Ext
Class:Toolbar.MenuButton
Extends:MenuButton
Defined In:Toolbar.js
+
+ A menu button that renders into a toolbar.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : BooleanButton
Read-only. True if this button is disabled
 hidden : BooleanButton
Read-only. True if this button is hidden
 pressed : BooleanButton
Read-only. True if this button is pressed (only if enableToggle = true)
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Toolbar.MenuButton(Object config)Toolbar.MenuButton
Creates a new MenuButton
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 destroy() : voidToolbar.MenuButton
Remove and destroy this button
 disable() : voidButton
Disable this button
 enable() : voidButton
Enable this button
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus() : voidButton
Focus the button
 getEl() : Ext.ElementButton
Returns the button's underlying element
 getText() : StringButton
Gets the text for this button
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidToolbar.MenuButton
Hide this button
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 setArrowHandler(Function handler, [Object scope]) : voidMenuButton
Sets this button's arrow click handler
 setDisabled(Boolean enabled) : voidButton
Convenience function for boolean enable/disable
 setHandler(Function handler, [Object scope]) : voidButton
Assigns this button's click handler
 setText(String text) : voidButton
Sets this button's text
 setVisible(Boolean visible) : voidButton
Convenience function for boolean show/hide
 show() : voidToolbar.MenuButton
Show this button
 toggle([Boolean state]) : voidButton
If a state it passed, it becomes the pressed state otherwise the current state is toggled.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 arrowclick : (MenuButton this, EventObject e)MenuButton
Fires when this button's arrow is clicked
 click : (Button this, EventObject e)Button
Fires when this button is clicked
 mouseout : (Button this, Event e)Button
Fires when the mouse exits the button
 mouseover : (Button this, Event e)Button
Fires when the mouse hovers over the button
 toggle : (Button this, Boolean pressed)Button
Fires when the "pressed" state of this button changes (only if enableToggle = true)
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 arrowHandler : FunctionMenuButton
A function called when the arrow button is clicked (can be used instead of click event)
 arrowTooltip : StringMenuButton
The title attribute of the arrow
 disabled : BooleanButton
True to start disabled (defaults to false)
 enableToggle : BooleanButton
True to enable pressed/not pressed toggling (defaults to false)
 handler : FunctionButton
A function called when the button is clicked (can be used instead of click event)
 hidden : BooleanButton
True to start hidden (defaults to false)
 icon : StringButton
The path to an image to display in the button (the image will be set as the background-image CSS property of the butt...
 menu : MixedButton
Standard menu attribute consisting of a reference to a menu object, a menu id or a menu config blob
 menuAlign : StringButton
The position to align the menu to (see Ext.Element.alignTo for more details, defaults to 'tl-bl?').
 minWidth : NumberButton
The minimum width for this button (used to give a set of buttons a common width)
 pressed : BooleanButton
True to start pressed (only if enableToggle = true)
 repeat : Boolean/ObjectButton
True to repeat fire the click event while the mouse is down. This can also be an Ext.util.ClickRepeater config object...
 scope : ObjectButton
The scope of the handler
 text : StringButton
The button text
 toggleGroup : StringButton
The group this toggle button is a member of (only 1 per group can be pressed, only applies if enableToggle = true)
 tooltip : String/ObjectButton
The tooltip for the button - can be a string or QuickTips config object
 tooltipType : StringButton
The type of tooltip to use. Either "qtip" for QuickTips or "title" for title attribute.
+

Property Details

+
+ +
+

disabled

+ public Boolean disabled +
+ Read-only. True if this button is disabled
+
This property is defined by Button.
+
+ +
+

hidden

+ public Boolean hidden +
+ Read-only. True if this button is hidden
+
This property is defined by Button.
+
+ +
+

pressed

+ public Boolean pressed +
+ Read-only. True if this button is pressed (only if enableToggle = true)
+
This property is defined by Button.
+
+
+ + +

Constructor Details

+
+
+

Toolbar.MenuButton

+ public function Toolbar.MenuButton(Object config) +
+ Creates a new MenuButton
+ Parameters: + +
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

destroy

+ public function destroy() +
+ Remove and destroy this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.MenuButton.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

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

getEl

+ public function getEl() +
+ Returns the button's underlying element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Button.
+
+ +
+

getText

+ public function getText() +
+ Gets the text for this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    The button text
  • +
+
+
+
This method is defined by Button.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

setArrowHandler

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

setDisabled

+ public function setDisabled(Boolean enabled) +
+ Convenience function for boolean enable/disable +
+ Parameters: +
  • enabled : Boolean
    True to enable, false to disable
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Button.
+
+ +
+

setHandler

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

setText

+ public function setText(String text) +
+ Sets this button's text +
+ Parameters: +
  • text : String
    The button text
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by 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 Button.
+
+ +
+

show

+ public function show() +
+ Show this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.MenuButton.
+
+ +
+

toggle

+ public function toggle([Boolean state]) +
+ If a state it passed, it becomes the pressed state otherwise the current state is toggled. +
+ Parameters: +
  • state : Boolean
    (optional) Force a particular state
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Button.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

arrowclick

+ public event arrowclick +
+ Fires when this button's arrow is clicked +
+ Subscribers will be called with the following parameters: +
  • this : MenuButton
  • e : EventObject
    The click event
+
+
+
This event is defined by MenuButton.
+
+ +
+

click

+ public event click +
+ Fires when this button is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Button
  • e : EventObject
    The click event
+
+
+
This event is defined by Button.
+
+ +
+

mouseout

+ public event mouseout +
+ Fires when the mouse exits the button +
+ Subscribers will be called with the following parameters: +
  • this : Button
  • e : Event
    The event object
+
+
+
This event is defined by Button.
+
+ +
+

mouseover

+ public event mouseover +
+ Fires when the mouse hovers over the button +
+ Subscribers will be called with the following parameters: +
  • this : Button
  • e : Event
    The event object
+
+
+
This event is defined by Button.
+
+ +
+

toggle

+ public event toggle +
+ Fires when the "pressed" state of this button changes (only if enableToggle = true) +
+ Subscribers will be called with the following parameters: +
  • this : Button
  • pressed : Boolean
+
+
+
This event is defined by Button.
+
+
+

Config Details

+
+ +
+

arrowHandler

+ arrowHandler : Function +
+ A function called when the arrow button is clicked (can be used instead of click event)
+
This config option is defined by MenuButton.
+
+ +
+

arrowTooltip

+ arrowTooltip : String +
+ The title attribute of the arrow
+
This config option is defined by MenuButton.
+
+ +
+

disabled

+ disabled : Boolean +
+ True to start disabled (defaults to false)
+
This config option is defined by Button.
+
+ +
+

enableToggle

+ enableToggle : Boolean +
+ True to enable pressed/not pressed toggling (defaults to false)
+
This config option is defined by Button.
+
+ +
+

handler

+ handler : Function +
+ A function called when the button is clicked (can be used instead of click event)
+
This config option is defined by Button.
+
+ +
+

hidden

+ hidden : Boolean +
+ True to start hidden (defaults to false)
+
This config option is defined by Button.
+
+ +
+

icon

+ icon : String +
+ The path to an image to display in the button (the image will be set as the background-image CSS property of the button by default, so if you want a mixed icon/text button, set cls:"x-btn-text-icon")
+
This config option is defined by Button.
+
+ +
+

menu

+ menu : Mixed +
+ Standard menu attribute consisting of a reference to a menu object, a menu id or a menu config blob
+
This config option is defined by Button.
+
+ +
+

menuAlign

+ menuAlign : String +
+ The position to align the menu to (see Ext.Element.alignTo for more details, defaults to 'tl-bl?').
+
This config option is defined by Button.
+
+ +
+

minWidth

+ minWidth : Number +
+ The minimum width for this button (used to give a set of buttons a common width)
+
This config option is defined by Button.
+
+ +
+

pressed

+ pressed : Boolean +
+ True to start pressed (only if enableToggle = true)
+
This config option is defined by Button.
+
+ +
+

repeat

+ repeat : Boolean/Object +
+ True to repeat fire the click event while the mouse is down. This can also be an Ext.util.ClickRepeater config object (defaults to false).
+
This config option is defined by Button.
+
+ +
+

scope

+ scope : Object +
+ The scope of the handler
+
This config option is defined by Button.
+
+ +
+

text

+ text : String +
+ The button text
+
This config option is defined by Button.
+
+ +
+

toggleGroup

+ toggleGroup : String +
+ The group this toggle button is a member of (only 1 per group can be pressed, only applies if enableToggle = true)
+
This config option is defined by Button.
+
+ +
+

tooltip

+ tooltip : String/Object +
+ The tooltip for the button - can be a string or QuickTips config object
+
This config option is defined by Button.
+
+ +
+

tooltipType

+ tooltipType : String +
+ The type of tooltip to use. Either "qtip" for QuickTips or "title" for title attribute.
+
This config option is defined by Button.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.Toolbar.Separator.html b/www/extras/yui-ext/docs/output/Ext.Toolbar.Separator.html new file mode 100644 index 000000000..c9b2b696d --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.Toolbar.Separator.html @@ -0,0 +1,276 @@ + + + + Ext.Toolbar.Separator + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.Toolbar.Separator

+ + + + + +
Package:Ext
Class:Toolbar.Separator
Extends:Toolbar.Item
Defined In:Toolbar.js
+
+ A simple toolbar separator class
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Toolbar.Separator()Toolbar.Separator
Creates a new Separator
 destroy() : voidToolbar.Item
Remove and destroy this button
 disable() : voidToolbar.Item
Disable this item
 enable() : voidToolbar.Item
Enable this item
 focus() : voidToolbar.Item
Try to focus this item
 getEl() : HTMLElementToolbar.Item
Get this item's HTML Element
 hide() : voidToolbar.Item
Hide this item
 setVisible(Boolean visible) : voidToolbar.Item
Convenience function for boolean show/hide
 show() : voidToolbar.Item
Show this item
+ +

Public Events

+
This class has no public events.
+ +

Constructor Details

+
+
+

Toolbar.Separator

+ public function Toolbar.Separator() +
+ Creates a new Separator
+ Parameters: +
  • None.
+
+
+
+
+ +

Method Details

+
+ +
+

destroy

+ public function destroy() +
+ Remove and destroy this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

disable

+ public function disable() +
+ Disable this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

enable

+ public function enable() +
+ Enable this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

focus

+ public function focus() +
+ Try to focus this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

getEl

+ public function getEl() +
+ Get this item's HTML Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

hide

+ public function hide() +
+ Hide this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

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 Toolbar.Item.
+
+ +
+

show

+ public function show() +
+ Show this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.Toolbar.Spacer.html b/www/extras/yui-ext/docs/output/Ext.Toolbar.Spacer.html new file mode 100644 index 000000000..8476019c7 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.Toolbar.Spacer.html @@ -0,0 +1,276 @@ + + + + Ext.Toolbar.Spacer + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.Toolbar.Spacer

+ + + + + +
Package:Ext
Class:Toolbar.Spacer
Extends:Toolbar.Item
Defined In:Toolbar.js
+
+ A simple element that adds extra horizontal space to a toolbar.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Toolbar.Spacer()Toolbar.Spacer
Creates a new Spacer
 destroy() : voidToolbar.Item
Remove and destroy this button
 disable() : voidToolbar.Item
Disable this item
 enable() : voidToolbar.Item
Enable this item
 focus() : voidToolbar.Item
Try to focus this item
 getEl() : HTMLElementToolbar.Item
Get this item's HTML Element
 hide() : voidToolbar.Item
Hide this item
 setVisible(Boolean visible) : voidToolbar.Item
Convenience function for boolean show/hide
 show() : voidToolbar.Item
Show this item
+ +

Public Events

+
This class has no public events.
+ +

Constructor Details

+
+
+

Toolbar.Spacer

+ public function Toolbar.Spacer() +
+ Creates a new Spacer
+ Parameters: +
  • None.
+
+
+
+
+ +

Method Details

+
+ +
+

destroy

+ public function destroy() +
+ Remove and destroy this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

disable

+ public function disable() +
+ Disable this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

enable

+ public function enable() +
+ Enable this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

focus

+ public function focus() +
+ Try to focus this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

getEl

+ public function getEl() +
+ Get this item's HTML Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

hide

+ public function hide() +
+ Hide this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

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 Toolbar.Item.
+
+ +
+

show

+ public function show() +
+ Show this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.Toolbar.TextItem.html b/www/extras/yui-ext/docs/output/Ext.Toolbar.TextItem.html new file mode 100644 index 000000000..ea8443abf --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.Toolbar.TextItem.html @@ -0,0 +1,276 @@ + + + + Ext.Toolbar.TextItem + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.Toolbar.TextItem

+ + + + + +
Package:Ext
Class:Toolbar.TextItem
Extends:Toolbar.Item
Defined In:Toolbar.js
+
+ A simple class that renders text directly into a toolbar.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Toolbar.TextItem(String text)Toolbar.TextItem
Creates a new TextItem
 destroy() : voidToolbar.Item
Remove and destroy this button
 disable() : voidToolbar.Item
Disable this item
 enable() : voidToolbar.Item
Enable this item
 focus() : voidToolbar.Item
Try to focus this item
 getEl() : HTMLElementToolbar.Item
Get this item's HTML Element
 hide() : voidToolbar.Item
Hide this item
 setVisible(Boolean visible) : voidToolbar.Item
Convenience function for boolean show/hide
 show() : voidToolbar.Item
Show this item
+ +

Public Events

+
This class has no public events.
+ +

Constructor Details

+
+
+

Toolbar.TextItem

+ public function Toolbar.TextItem(String text) +
+ Creates a new TextItem
+ Parameters: +
  • text : String
+
+
+
+
+ +

Method Details

+
+ +
+

destroy

+ public function destroy() +
+ Remove and destroy this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

disable

+ public function disable() +
+ Disable this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

enable

+ public function enable() +
+ Enable this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

focus

+ public function focus() +
+ Try to focus this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

getEl

+ public function getEl() +
+ Get this item's HTML Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

hide

+ public function hide() +
+ Hide this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+ +
+

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 Toolbar.Item.
+
+ +
+

show

+ public function show() +
+ Show this item +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.Item.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.Toolbar.html b/www/extras/yui-ext/docs/output/Ext.Toolbar.html new file mode 100644 index 000000000..66e17cbc1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.Toolbar.html @@ -0,0 +1,356 @@ + + + + Ext.Toolbar + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.Toolbar

+ + + + + + +
Package:Ext
Class:Toolbar
Extends:Object
Subclasses:PagingToolbar
Defined In:Toolbar.js
+
+ Basic Toolbar class.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Toolbar(String/HTMLElement/Element container, [Array buttons], Object config)Toolbar
Creates a new Toolbar
 add(Mixed arg1, Mixed arg2, Mixed etc) : 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) : Ext.Toolbar.Button/ArrayToolbar
Add a button (or buttons), see Ext.Toolbar.Button for more info on the config
 addDom(Object config) : Ext.Toolbar.ItemToolbar
Adds a new element to the toolbar from the passed DomHelper config
 addElement(String/HTMLElement/Element el) : Ext.Toolbar.ItemToolbar
Adds any standard HTML element to the toolbar
 addField(Field field) : ToolbarItemToolbar
Add a dynamically rendered Ext.form field (TextField, ComboBox, etc). Note: the field should not have +been rendered y...
 addItem(Toolbar.Item item) : Ext.Toolbar.ItemToolbar
Adds any Toolbar.Item or subclass
 addSeparator() : Ext.Toolbar.ItemToolbar
Adds a separator
 addSpacer() : Ext.Toolbar.ItemToolbar
Adds a spacer element
 addText(String text) : Ext.Toolbar.ItemToolbar
Adds text to the toolbar
 getEl() : Ext.ElementToolbar
Returns the element for this toolbar
 insertButton(Number index, Object/Toolbar.Item/Toolbar.Button (may) : Ext.Toolbar.Button/ItemToolbar
Inserts any Toolbar.Item/Toolbar.Button at the specified index
+ +

Public Events

+
This class has no public events.
+ +

Constructor Details

+
+
+

Toolbar

+ public function Toolbar(String/HTMLElement/Element container, [Array buttons], Object config) +
+ Creates a new Toolbar
+ Parameters: +
  • container : String/HTMLElement/Element
    The id or element that will contain the toolbar
  • buttons : Array
    (optional) array of button configs or elements to add
  • config : Object
    The config object
+
+
+
+
+ +

Method Details

+
+ +
+

add

+ public function add(Mixed arg1, Mixed arg2, Mixed etc) +
+ Adds element(s) to the toolbar - this function takes a variable number of +arguments of mixed type and adds them to the toolbar. +
+ Parameters: +
  • arg1 : Mixed
    If arg is a Toolbar.Button, 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.
  • arg2 : Mixed
  • etc : Mixed
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

addButton

+ public function addButton(Object/Array config) +
+ Add a button (or buttons), see Ext.Toolbar.Button for more info on the config +
+ Parameters: +
  • config : Object/Array
    A button config or array of configs
+ Returns: +
    +
  • Ext.Toolbar.Button/Array
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

addDom

+ public function addDom(Object config) +
+ Adds a new element to the toolbar from the passed DomHelper config +
+ Parameters: +
  • config : Object
+ Returns: +
    +
  • Ext.Toolbar.Item
    The element's item
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

addElement

+ public function addElement(String/HTMLElement/Element el) +
+ Adds any standard HTML element to the toolbar +
+ Parameters: +
  • el : String/HTMLElement/Element
    The element or id of the element to add
+ Returns: +
    +
  • Ext.Toolbar.Item
    The element's item
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

addField

+ public function addField(Field field) +
+ Add a dynamically rendered Ext.form field (TextField, ComboBox, etc). Note: the field should not have +been rendered yet. For a field that has already been rendered, use addElement. +
+ Parameters: +
  • field : Field
+ Returns: +
    +
  • ToolbarItem
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

addItem

+ public function addItem(Toolbar.Item item) +
+ Adds any Toolbar.Item or subclass +
+ Parameters: +
  • item : Toolbar.Item
+ Returns: +
    +
  • Ext.Toolbar.Item
    The item
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

addSeparator

+ public function addSeparator() +
+ Adds a separator +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Toolbar.Item
    The separator item
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

addSpacer

+ public function addSpacer() +
+ Adds a spacer element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Toolbar.Item
    The spacer item
  • +
+
+
+
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: +
    +
  • Ext.Toolbar.Item
    The element's item
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the element for this toolbar +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

insertButton

+ public function insertButton(Number index, Object/Toolbar.Item/Toolbar.Button (may) +
+ Inserts any Toolbar.Item/Toolbar.Button at the specified index +
+ Parameters: +
  • index : Number
    The index where the item is to be inserted
  • (may : Object/Toolbar.Item/Toolbar.Button
    be Array)} item The button, or button config object to be inserted.
+ Returns: +
    +
  • Ext.Toolbar.Button/Item
  • +
+
+
+
This method is defined by Toolbar.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.UpdateManager.BasicRenderer.html b/www/extras/yui-ext/docs/output/Ext.UpdateManager.BasicRenderer.html new file mode 100644 index 000000000..c8d2b1b91 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.UpdateManager.BasicRenderer.html @@ -0,0 +1,82 @@ + + + + Ext.UpdateManager.BasicRenderer + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.UpdateManager.BasicRenderer

+ + + + + +
Package:Ext
Class:UpdateManager.BasicRenderer
Extends:Object
Defined In:UpdateManager.js
+
+ Default Content renderer. Updates the elements innerHTML with the responseText.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + +
MethodDefined By
 render(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(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 : 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.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.UpdateManager.defaults.html b/www/extras/yui-ext/docs/output/Ext.UpdateManager.defaults.html new file mode 100644 index 000000000..0e8f47f8a --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.UpdateManager.defaults.html @@ -0,0 +1,150 @@ + + + + Ext.UpdateManager.defaults + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.UpdateManager.defaults

+ + + + + +
Package:Ext
Class:UpdateManager.defaults
Extends:Object
Defined In:UpdateManager.js
+
+ The defaults collection enables customizing the default properties of UpdateManager
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disableCaching : BooleanUpdateManager.defaults
Whether to append unique parameter on get request to disable caching (Defaults to false).
 indicatorText : StringUpdateManager.defaults
Text for loading indicator (Defaults to '<div class="loading-indicator">Loading...</div>').
 loadScripts : BooleanUpdateManager.defaults
True to process scripts by default (Defaults to false).
 showLoadIndicator : BooleanUpdateManager.defaults
Whether to show indicatorText when loading (Defaults to true).
 sslBlankUrl : StringUpdateManager.defaults
Blank page URL to use with SSL file uploads (Defaults to "javascript:false").
 timeout : NumberUpdateManager.defaults
Timeout for requests or form posts in seconds (Defaults 30 seconds).
+ +

Public Methods

+
This class has no public methods.
+

Public Events

+
This class has no public events.

Property Details

+
+ +
+

disableCaching

+ public Boolean disableCaching +
+ Whether to append unique parameter on get request to disable caching (Defaults to false).
+
This property is defined by UpdateManager.defaults.
+
+ +
+

indicatorText

+ public String indicatorText +
+ Text for loading indicator (Defaults to '<div class="loading-indicator">Loading...</div>').
+
This property is defined by UpdateManager.defaults.
+
+ +
+

loadScripts

+ public Boolean loadScripts +
+ True to process scripts by default (Defaults to false).
+
This property is defined by UpdateManager.defaults.
+
+ +
+

showLoadIndicator

+ public Boolean showLoadIndicator +
+ Whether to show indicatorText when loading (Defaults to true).
+
This property is defined by UpdateManager.defaults.
+
+ +
+

sslBlankUrl

+ public String sslBlankUrl +
+ Blank page URL to use with SSL file uploads (Defaults to "javascript:false").
+
This property is defined by UpdateManager.defaults.
+
+ +
+

timeout

+ public Number timeout +
+ Timeout for requests or form posts in seconds (Defaults 30 seconds).
+
This property is defined by UpdateManager.defaults.
+
+
+ + + + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.UpdateManager.html b/www/extras/yui-ext/docs/output/Ext.UpdateManager.html new file mode 100644 index 000000000..92620e3e8 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.UpdateManager.html @@ -0,0 +1,890 @@ + + + + Ext.UpdateManager + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.UpdateManager

+ + + + + +
Package:Ext
Class:UpdateManager
Extends:Observable
Defined In:UpdateManager.js
+
+ Provides AJAX-style update for Element object.

+Usage:
+
// Get it from a Ext.Element object
+var el = Ext.get("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 Ext.UpdateManager("myElementId"); +mgr.startAutoRefresh(60, "http://myserver.com/index.php"); +mgr.on("update", myFcnNeedsToKnow); +
+ // short handed call directly from the element object + Ext.get("foo").load({ + url: "bar.php", + scripts:true, + params: "for=bar", + text: "Loading Foo..." + });
+
+ Properties +   -  Methods +   -  Events +
+ +

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 Ext.UpdateManager.defaults.disableC...
 el : 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 Ext.UpdateManager.defaults.indicatorText or '<div class="loading-indicator...
 loadScripts : BooleanUpdateManager
True to process scripts in the output (Defaults to Ext.UpdateManager.defaults.loadScripts (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 Ext.UpdateManager.BasicRenderer.
 showLoadIndicator : StringUpdateManager
Whether to show indicatorText when loading (Defaults to Ext.UpdateManager.defaults.showLoadIndicator or true).
 sslBlankUrl : StringUpdateManager
Blank page URL to use with SSL file uploads (Defaults to Ext.UpdateManager.defaults.sslBlankUrl or "about:blank").
 timeout : NumberUpdateManager
Timeout for requests or form posts in seconds (Defaults to Ext.UpdateManager.defaults.timeout or 30 seconds).
 transaction : ObjectUpdateManager
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/Ext.Element el, [Boolean forceNew])UpdateManager
Create new UpdateManager directly.
 UpdateManager.updateElement(String/HTMLElement/Ext.Element el, String url, [String/Object params], [Object options]) : voidUpdateManager
Deprecated. <static> Static convenience method. This method is deprecated in favor of el.load({url:'foo.php', ....
 abort() : voidUpdateManager
Aborts the executing transaction
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 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() : Ext.ElementUpdateManager
Get the Element this UpdateManager is bound to
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 isUpdating() : BooleanUpdateManager
Returns true if an update is in progress
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 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 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.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 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...
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeupdate : (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 : (Ext.Element el, Object oResponseObject)UpdateManager
Fired on update failure.
 update : (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 Ext.UpdateManager.defaults.disableCaching or false).
+
This property is defined by UpdateManager.
+
+ +
+

el

+ public 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 Ext.UpdateManager.defaults.indicatorText or '<div class="loading-indicator">Loading...</div>').
+
This property is defined by UpdateManager.
+
+ +
+

loadScripts

+ public Boolean loadScripts +
+ True to process scripts in the output (Defaults to Ext.UpdateManager.defaults.loadScripts (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 Ext.UpdateManager.BasicRenderer.
+
This property is defined by UpdateManager.
+
+ +
+

showLoadIndicator

+ public String showLoadIndicator +
+ Whether to show indicatorText when loading (Defaults to Ext.UpdateManager.defaults.showLoadIndicator or true).
+
This property is defined by UpdateManager.
+
+ +
+

sslBlankUrl

+ public String sslBlankUrl +
+ Blank page URL to use with SSL file uploads (Defaults to Ext.UpdateManager.defaults.sslBlankUrl or "about:blank").
+
This property is defined by UpdateManager.
+
+ +
+

timeout

+ public Number timeout +
+ Timeout for requests or form posts in seconds (Defaults to Ext.UpdateManager.defaults.timeout or 30 seconds).
+
This property is defined by UpdateManager.
+
+ +
+

transaction

+ public Object transaction +
+ 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/Ext.Element el, [Boolean forceNew]) +
+ Create new UpdateManager directly.
+ Parameters: +
  • el : String/HTMLElement/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

+
+ +
+

UpdateManager.updateElement

+ public function UpdateManager.updateElement(String/HTMLElement/Ext.Element el, String url, [String/Object params], [Object options]) +
+ Deprecated. <static> Static convenience method. This method is deprecated in favor of el.load({url:'foo.php', ...}). +Usage: +
Ext.UpdateManager.updateElement("my-div", "stuff.php");
+
+ Parameters: +
  • el : String/HTMLElement/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.
+
+ +
+

abort

+ public function abort() +
+ Aborts the executing transaction +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by UpdateManager.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
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, oResponse)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by UpdateManager.
+
+ +
+

getEl

+ public function getEl() +
+ Get the Element this UpdateManager is bound to +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by UpdateManager.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

isUpdating

+ public function isUpdating() +
+ Returns true if an update is in progress +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by UpdateManager.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

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 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.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

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,
    nocache: false,
    text: "Loading...",
    timeout: 30,
    scripts: 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, oResponse)
  • 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.
+
+
+ +

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 : Ext.Element
  • url : String/Object/Function
  • params : String/Object
+
+
+
This event is defined by UpdateManager.
+
+ +
+

failure

+ public event failure +
+ Fired on update failure. +
+ Subscribers will be called with the following parameters: +
  • el : Ext.Element
  • oResponseObject : Object
    The 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 : Ext.Element
  • oResponseObject : Object
    The response Object
+
+
+
This event is defined by UpdateManager.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.View.html b/www/extras/yui-ext/docs/output/Ext.View.html new file mode 100644 index 000000000..da0b43cdc --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.View.html @@ -0,0 +1,855 @@ + + + + Ext.View + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.View

+ + + + + + +
Package:Ext
Class:View
Extends:Observable
Subclasses:JsonView
Defined In:View.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 store = new Ext.data.Store(...);
+
+ var view = new Ext.View("my-element",
+ '<div id="{0}">{2} - {1}</div>', // auto create template
+ {
+ singleSelect: true,
+ selectedClass: "ydataview-selected",
+ store: store
+ });
+
+ // 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 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.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 selectedClass : Ext.DomHelper.TemplateView
The css class to add to selected nodes
 tpl : Ext.DomHelper.TemplateView
The template used by this View
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 View(String/HTMLElement/Element container, String/DomHelper.Template tpl, Object config)View
Create a new View
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 clearSelections([Boolean suppressEvent]) : voidView
Clear all selections
 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() : 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.
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 indexOf(HTMLElement/String/Number nodeInfo) : NumberView
Finds the index of the passed node
 isSelected(HTMLElement/Number node) : BooleanView
Returns true if the passed node is selected
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 prepareData(Array/Object data) : 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.
 setStore(Store store) : voidView
Changes the data store this view uses and refresh the view.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeclick : (Ext.View this, Number index, HTMLElement node, Ext.EventObject e)View
Fires before a click is processed. Returns false to cancel the default action.
 beforeselect : (Ext.View this, HTMLElement node, Array selections)View
Fires before a selection is made. If any handlers return false, the selection is cancelled.
 click : (Ext.View this, Number index, HTMLElement node, Ext.EventObject e)View
Fires when a template node is clicked.
 contextmenu : (Ext.View this, Number index, HTMLElement node, Ext.EventObject e)View
Fires when a template node is right clicked.
 dblclick : (Ext.View this, Number index, HTMLElement node, Ext.EventObject e)View
Fires when a template node is double clicked.
 selectionchange : (Ext.View this, Array selections)View
Fires when the selected nodes change.
+

Property Details

+
+ +
+

selectedClass

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

tpl

+ public 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, 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
  • config : Object
    The config object
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ 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.
+
+ +
+

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: +
    +
  • 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.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

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.
+
+ +
+

isSelected

+ public function isSelected(HTMLElement/Number node) +
+ Returns true if the passed node is selected +
+ Parameters: +
  • node : HTMLElement/Number
    The node or node index
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by View.
+
+ +
+

on

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

prepareData

+ public function prepareData(Array/Object data) +
+ 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).
+ 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.
+
+ +
+

setStore

+ public function setStore(Store store) +
+ Changes the data store this view uses and refresh the view. +
+ Parameters: +
  • store : Store
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by View.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

beforeclick

+ public event beforeclick +
+ Fires before a click is processed. Returns false to cancel the default action. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.View
  • index : Number
    The index of the target node
  • node : HTMLElement
    The target node
  • e : Ext.EventObject
    The raw event object
+
+
+
This event is defined by View.
+
+ +
+

beforeselect

+ public event beforeselect +
+ Fires before a selection is made. If any handlers return false, the selection is cancelled. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.View
  • node : HTMLElement
    The node to be selected
  • selections : Array
    Array of currently selected nodes
+
+
+
This event is defined by View.
+
+ +
+

click

+ public event click +
+ Fires when a template node is clicked. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.View
  • index : Number
    The index of the target node
  • node : HTMLElement
    The target node
  • e : 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 : Ext.View
  • index : Number
    The index of the target node
  • node : HTMLElement
    The target node
  • e : 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 : Ext.View
  • index : Number
    The index of the target node
  • node : HTMLElement
    The target node
  • e : 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 : Ext.View
  • selections : Array
    Array of the selected nodes
+
+
+
This event is defined by View.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.WindowManager.html b/www/extras/yui-ext/docs/output/Ext.WindowManager.html new file mode 100644 index 000000000..296cf879e --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.WindowManager.html @@ -0,0 +1,45 @@ + + + + Ext.WindowManager + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.WindowManager

+ + + + + +
Package:Ext
Class:WindowManager
Extends:Ext.WindowGroup
Defined In:WindowManager.js
+
+ The default global group of windows.

This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+
This class has no public methods.
+

Public Events

+
This class has no public events.
+ + + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.data.ArrayReader.html b/www/extras/yui-ext/docs/output/Ext.data.ArrayReader.html new file mode 100644 index 000000000..4eecc17ca --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.data.ArrayReader.html @@ -0,0 +1,162 @@ + + + + Ext.data.ArrayReader + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.data.ArrayReader

+ + + + + +
Package:Ext.data
Class:ArrayReader
Extends:Ext.data.DataReader
Defined In:ArrayReader.js
+
+ Data reader class to create an Array of Ext.data.Record objects from an Array. +Each element of that Array represents a row of data fields. The +fields are pulled into a Record object using as a subscript, the mapping property +of the field definition if it exists, or the field's ordinal position in the definition. +

+The code below lists all configuration options. +

var RecordDef = Ext.data.Record.create([
+       {name: 'name', mapping: 1},
+       {name: 'occupation', mapping: 2},
+   ]);
+   var myReader = new Ext.data.ArrayReader({
+       id: 0                     // The subscript within row Array that provides an ID for the Record (optional)
+   }, RecordDef);
+

+This would consume an Array like this: +


+   [ [1, 'Bill', 'Gardener'], [2, 'Ben', 'Horticulturalist'] ]
+  
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 ArrayReader(Object meta, Array/Ext.data.Record constructor})ArrayReader
Create a new JsonReader
 readRecords(Object o) : ObjectArrayReader
Create a data block containing Ext.data.Records from an XML document.
+ +

Public Events

+
This class has no public events.
+

Config Options

+ + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 id : StringArrayReader
(optional) The subscript within row Array that provides an ID for the Record
 totalProperty : StringArrayReader
Name of the property from which to retrieve the total number of records in the dataset. This is only needed if the wh...
+ + +

Constructor Details

+
+
+

ArrayReader

+ public function ArrayReader(Object meta, Array/Ext.data.Record constructor}) +
+ Create a new JsonReader
+ Parameters: + +
+
+
+
+ +

Method Details

+
+ +
+

readRecords

+ public function readRecords(Object o) +
+ Create a data block containing Ext.data.Records from an XML document. +
+ Parameters: +
  • o : Object
    An object which contains an Array of row objects in the property specified in the config as 'root, and optionally a property, specified in the config as 'totalProperty' which contains the total size of the dataset.
+ Returns: +
    +
  • Object
    data A data block which is used by an Ext.data.Store object as a cache of Ext.data.Records.
  • +
+
+
+
This method is defined by ArrayReader.
+
+
+ +

Config Details

+
+ +
+

id

+ id : String +
+ (optional) The subscript within row Array that provides an ID for the Record
+
This config option is defined by ArrayReader.
+
+ +
+

totalProperty

+ totalProperty : String +
+ Name of the property from which to retrieve the total number of records in the dataset. This is only needed if the whole dataset is not passed in one go, but is being paged from the remote server.
+
This config option is defined by ArrayReader.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.data.Connection.html b/www/extras/yui-ext/docs/output/Ext.data.Connection.html new file mode 100644 index 000000000..5bb2eead1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.data.Connection.html @@ -0,0 +1,184 @@ + + + + Ext.data.Connection + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.data.Connection

+ + + + + +
Package:Ext.data
Class:Connection
Extends:Object
Defined In:Connection.js
+
+ The class encapsulates a connection to the page's originating domain, allowing requests to be made +either to a configured URL, or to a URL specified at request time. +

+Requests made by this class are asynchronous, and will return immediately, and no data from +the server will be available. To process the returned data, us a callback in the request options +object.

+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Connection(config {Object})Connection
 abort() : voidConnection
Aborts any outstanding request.
 isLoading() : BooleanConnection
Determine whether this object has a request outstanding.
 request([Object options.]) : voidConnection
Sends an HTTP request to a remote server.
+ +

Public Events

+
This class has no public events.
+

Config Options

+ + + + + + + + + + + + + +
Config OptionsDefined By
 {Number} : timeoutConnection
(Optional) The timeout in milliseconds to be used for requests. Defaults to 30000.
+ + +

Constructor Details

+
+
+

Connection

+ public function Connection(config {Object}) +
+
+ Parameters: +
  • {Object} : config
    a configuration object.
+
+
+
+
+ +

Method Details

+
+ +
+

abort

+ public function abort() +
+ Aborts any outstanding request. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Connection.
+
+ +
+

isLoading

+ public function isLoading() +
+ Determine whether this object has a request outstanding. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    True if there is an outstanding request.
  • +
+
+
+
This method is defined by Connection.
+
+ +
+

request

+ public function request([Object options.]) +
+ Sends an HTTP request to a remote server. +
+ Parameters: +
  • options. : Object
    An object which may contain the following properties:
    • url {String} (Optional) The URL to which to send the request. Defaults to configured URL
    • params {Object} (Optional) An object containing properties which are used as extra parameters to the request
    • method {String} (Optional) The HTTP method to use for the request. Defaults to the configured method, or if no method was configured, "GET" if no parameters are being sent, and "POST" if parameters are being sent.
    • callback {Function} (Optional) The function to be called upon receipt of the HTTP response. The callback is passed the following parameters:
      • options {Object} The parameter to the request call.
      • success {Boolean} True if the request succeeded.
      • resopnse {Object} The XMLHttpRequest object containing the response data.
    • scope {Object} (Optional) The scope in which to execute the callback: The "this" object for the callback function. Defaults to the browser window.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Connection.
+
+
+ +

Config Details

+
+ +
+

{Number}

+ {Number} : timeout +
+ (Optional) The timeout in milliseconds to be used for requests. Defaults to 30000.
+
This config option is defined by Connection.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.data.DataProxy.html b/www/extras/yui-ext/docs/output/Ext.data.DataProxy.html new file mode 100644 index 000000000..fd000fd09 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.data.DataProxy.html @@ -0,0 +1,125 @@ + + + + Ext.data.DataProxy + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.data.DataProxy

+ + + + + +
Package:Ext.data
Class:DataProxy
Extends:Object
Defined In:DataProxy.js
+
+ This class is an abstract base class for implementations which provide retrieval of +unformatted data objects. +

+DataProxy implementations are usually used in conjunction with an implementation of Ext.data.DataReader +(of the approriate type which knows how to parse the data object) to provide a block of Records +to an Ext.data.Store. +

+Custom implementations must implement the load method as described in +Ext.data.HttpProxy.load.

+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+
This class has no public methods.
+

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeload : (Object params)DataProxy
Fires before a network request is made to retrieve a data object.
 load : (Object o, Object arg)DataProxy
Fires before the load method's callback is called.
 loadexception : (Object o, Object arg, Object e)DataProxy
Fires if an Exception occurs during data retrieval.
+ + + +

Event Details

+
+ +
+

beforeload

+ public event beforeload +
+ Fires before a network request is made to retrieve a data object. +
+ Subscribers will be called with the following parameters: +
  • params : Object
    The params parameter to the load function.
+
+
+
This event is defined by DataProxy.
+
+ +
+

load

+ public event load +
+ Fires before the load method's callback is called. +
+ Subscribers will be called with the following parameters: +
  • o : Object
    The data object.
  • arg : Object
    The callback argument object passed to the load function.
+
+
+
This event is defined by DataProxy.
+
+ +
+

loadexception

+ public event loadexception +
+ Fires if an Exception occurs during data retrieval. +
+ Subscribers will be called with the following parameters: +
  • o : Object
    The data object.
  • arg : Object
    The callback argument object passed to the load function.
  • e : Object
    The Exception.
+
+
+
This event is defined by DataProxy.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.data.HttpProxy.html b/www/extras/yui-ext/docs/output/Ext.data.HttpProxy.html new file mode 100644 index 000000000..92465c425 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.data.HttpProxy.html @@ -0,0 +1,114 @@ + + + + Ext.data.HttpProxy + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.data.HttpProxy

+ + + + + +
Package:Ext.data
Class:HttpProxy
Extends:Object
Defined In:HttpProxy.js
+
+ An implementation of Ext.data.DataProxy that reads a data object from an Ext.data.Connection object +configured to reference a certain URL. +

+Note that this class cannot be used to retrieve data from a domain other than the domain +from which the running page was served. +

+For cross-domain access to remote data, use an Ext.data.ScriptTagProxy. + +

+Be aware that to enable the browser to parse an XML document, the server must set +the Content-Type header to "text/xml".

+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 HttpProxy(Object conn)HttpProxy
 load(Object params, Ext.data.DataReader) reader, Function callback, Object scope, Object arg) : voidHttpProxy
Load data from the configured Ext.data.Connection, read the data object into +a block of Ext.data.Records using the pa...
+ +

Public Events

+
This class has no public events.
+ +

Constructor Details

+
+
+

HttpProxy

+ public function HttpProxy(Object conn) +
+
+ Parameters: +
  • conn : Object
    An Ext.data.Connection object referencing the URL from which the data object is to be read, or a configuration object for an Ext.data.Connection.
+
+
+
+
+ +

Method Details

+
+ +
+

load

+ public function load(Object params, Ext.data.DataReader) reader, Function callback, Object scope, Object arg) +
+ Load data from the configured Ext.data.Connection, read the data object into +a block of Ext.data.Records using the passed Ext.data.DataReader implementation, and +process that block using the passed callback. +
+ Parameters: +
  • params : Object
    An object containing properties which are to be used as HTTP parameters for the request to the remote server.
  • reader : Ext.data.DataReader)
    The Reader object which converts the data object into a block of Ext.data.Records.
  • callback : Function
    The function into which to pass the block of Ext.data.Records. The function must be passed
    • The Record block object
    • The "arg" argument from the load function
    • A boolean success indicator
  • scope : Object
    The scope in which to call the callback
  • arg : Object
    An optional argument which is passed to the callback as its second parameter.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by HttpProxy.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.data.JsonReader.html b/www/extras/yui-ext/docs/output/Ext.data.JsonReader.html new file mode 100644 index 000000000..cf14bcd6f --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.data.JsonReader.html @@ -0,0 +1,247 @@ + + + + Ext.data.JsonReader + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.data.JsonReader

+ + + + + +
Package:Ext.data
Class:JsonReader
Extends:Ext.data.DataReader
Defined In:JsonReader.js
+
+ Data reader class to create an Array of Ext.data.Record objects from a JSON response +based on mappings in a provided Ext.data.Record constructor. +

+The code below lists all configuration options. +

var RecordDef = Ext.data.Record.create([
+       {name: 'name', mapping: 'name'},     // "mapping" property not needed if it's the same as "name"
+       {name: 'occupation'},                // This field will use "occupation" as the mapping.
+   ]);
+   var myReader = new Ext.data.JsonReader({
+       totalProperty: "results",    // The property which contains the number of returned records (optional)
+       root: "rows",                // The property which contains an Array of record objects
+       id: "id"                     // The property within the record object that provides an ID for the record (optional)
+   }, RecordDef);
+

+This would consume a JSON file like this: +


+   { 'results': 2, 'rows': [
+     { 'id': 1, 'name': 'Bill', occupation: 'Gardener' },
+     { 'id': 2, 'name': 'Ben', occupation: 'Horticulturalist' } ]
+   }
+  
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 jsonData : ObjectJsonReader
After any data loads, the raw JSON data is available for further custom processing.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 JsonReader(Object meta, Object[]/Ext.data.Record constructor})JsonReader
Create a new JsonReader
 read(Object response) : ObjectJsonReader
This method is only used by a DataProxy which has retrieved data from a remote server.
 readRecords(Object o) : ObjectJsonReader
Create a data block containing Ext.data.Records from an XML document.
+ +

Public Events

+
This class has no public events.
+

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 id : StringJsonReader
Name of the property within a row object that contains a record identifier value.
 root : StringJsonReader
name of the property which contains the Array of row objects.
 successProperty : StringJsonReader
Name of the property from which to retrieve the success attribute used by forms.
 totalProperty : StringJsonReader
Name of the property from which to retrieve the total number of records in the dataset. This is only needed if the wh...
+

Property Details

+
+ +
+

jsonData

+ public Object jsonData +
+ After any data loads, the raw JSON data is available for further custom processing.
+
This property is defined by JsonReader.
+
+
+ + +

Constructor Details

+
+
+

JsonReader

+ public function JsonReader(Object meta, Object[]/Ext.data.Record constructor}) +
+ Create a new JsonReader
+ Parameters: +
  • meta : Object
    Metadata configuration options
  • constructor} : Object[]/Ext.data.Record
    recordType The record definition of the data record to produce.
+
+
+
+
+ +

Method Details

+
+ +
+

read

+ public function read(Object response) +
+ This method is only used by a DataProxy which has retrieved data from a remote server. +
+ Parameters: +
  • response : Object
    The XHR object which contains the JSON data in its responseText.
+ Returns: +
    +
  • Object
    data A data block which is used by an Ext.data.Store object as a cache of Ext.data.Records.
  • +
+
+
+
This method is defined by JsonReader.
+
+ +
+

readRecords

+ public function readRecords(Object o) +
+ Create a data block containing Ext.data.Records from an XML document. +
+ Parameters: +
  • o : Object
    An object which contains an Array of row objects in the property specified in the config as 'root, and optionally a property, specified in the config as 'totalProperty' which contains the total size of the dataset.
+ Returns: +
    +
  • Object
    data A data block which is used by an Ext.data.Store object as a cache of Ext.data.Records.
  • +
+
+
+
This method is defined by JsonReader.
+
+
+ +

Config Details

+
+ +
+

id

+ id : String +
+ Name of the property within a row object that contains a record identifier value.
+
This config option is defined by JsonReader.
+
+ +
+

root

+ root : String +
+ name of the property which contains the Array of row objects.
+
This config option is defined by JsonReader.
+
+ +
+

successProperty

+ successProperty : String +
+ Name of the property from which to retrieve the success attribute used by forms.
+
This config option is defined by JsonReader.
+
+ +
+

totalProperty

+ totalProperty : String +
+ Name of the property from which to retrieve the total number of records in the dataset. This is only needed if the whole dataset is not passed in one go, but is being paged from the remote server.
+
This config option is defined by JsonReader.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.data.MemoryProxy.html b/www/extras/yui-ext/docs/output/Ext.data.MemoryProxy.html new file mode 100644 index 000000000..5ee9fb494 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.data.MemoryProxy.html @@ -0,0 +1,106 @@ + + + + Ext.data.MemoryProxy + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.data.MemoryProxy

+ + + + + +
Package:Ext.data
Class:MemoryProxy
Extends:Object
Defined In:MemoryProxy.js
+
+ An implementation of Ext.data.DataProxy that simply passes the data specified in its constructor +to the Reader when its load method is called.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 MemoryProxy(Object data)MemoryProxy
 load(Object params, Ext.data.DataReader) reader, Function callback, Object scope, Object arg) : voidMemoryProxy
Load data from the requested source (in this case an in-memory +data object passed to the constructor), read the data ...
+ +

Public Events

+
This class has no public events.
+ +

Constructor Details

+
+
+

MemoryProxy

+ public function MemoryProxy(Object data) +
+
+ Parameters: +
  • data : Object
    The data object which the Reader uses to construct a block of Ext.data.Records.
+
+
+
+
+ +

Method Details

+
+ +
+

load

+ public function load(Object params, Ext.data.DataReader) reader, Function callback, Object scope, Object arg) +
+ Load data from the requested source (in this case an in-memory +data object passed to the constructor), read the data object into +a block of Ext.data.Records using the passed Ext.data.DataReader implementation, and +process that block using the passed callback. +
+ Parameters: +
  • params : Object
    This parameter is not used by the MemoryProxy class.
  • reader : Ext.data.DataReader)
    The Reader object which converts the data object into a block of Ext.data.Records.
  • callback : Function
    The function into which to pass the block of Ext.data.records. The function must be passed
    • The Record block object
    • The "arg" argument from the load function
    • A boolean success indicator
  • scope : Object
    The scope in which to call the callback
  • arg : Object
    An optional argument which is passed to the callback as its second parameter.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by MemoryProxy.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.data.Node.html b/www/extras/yui-ext/docs/output/Ext.data.Node.html new file mode 100644 index 000000000..ef2f71de7 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.data.Node.html @@ -0,0 +1,1151 @@ + + + + Ext.data.Node + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.data.Node

+ + + + + + +
Package:Ext.data
Class:Node
Extends:Observable
Subclasses:TreeNode
Defined In:Tree.js
+
+
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 attributes : ObjectNode
The attributes supplied for the node. You can use this property to access any custom attributes you supplied.
 childNodes : ArrayNode
All child nodes of this node.
 firstChild : NodeNode
The first direct child node of this node, or null if this node has no child nodes.
 id : StringNode
The node id.
 lastChild : NodeNode
The last direct child node of this node, or null if this node has no child nodes.
 nextSibling : NodeNode
The node immediately following this node in the tree, or null if there is no sibling node.
 parentNode : NodeNode
The parent node for this node.
 previousSibling : NodeNode
The node immediately preceding this node in the tree, or null if there is no sibling node.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Node(Object attributes)Node
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 appendChild(Node/Array node) : NodeNode
Insert node(s) as the last child node of this node.
 bubble(Function fn, [Object scope], [Array args]) : voidNode
Bubbles up the tree from this node, calling the specified function with each node. The scope (this) of +function call...
 cascade(Function fn, [Object scope], [Array args]) : voidNode
Cascades down the tree from this node, calling the specified function with each node. The scope (this) of +function c...
 contains(Node node) : BooleanNode
Returns true if this node is an ancestor (at any point) of the passed node.
 eachChild(Function fn, [Object scope], [Array args]) : voidNode
Interates the child nodes of this node, calling the specified function with each node. The scope (this) of +function ...
 findChild(String attribute, Mixed value) : NodeNode
Finds the first child that has the attribute with the specified value.
 findChildBy(Function fn, [Object scope]) : NodeNode
Finds the first child by a custom function. The child matches if the function passed +returns true.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getDepth() : NumberNode
Returns depth of this node (the root node has a depth of 0)
 getOwnerTree() : TreeNode
Returns the tree this node is in.
 getPath([String attr]) : StringNode
Returns the path for this node. The path can be used to expand or select this node programmatically.
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 indexOf(Node node) : NumberNode
Returns the index of a child node
 insertBefore(Node node, Node refNode) : NodeNode
Inserts the first node before the second node in this nodes childNodes collection.
 isAncestor(Node node) : BooleanNode
Returns true if the passed node is an ancestor (at any point) of this node.
 isFirst() : BooleanNode
Returns true if this node is the first child of its parent
 isLast() : BooleanNode
Returns true if this node is the last child of its parent
 isLeaf() : BooleanNode
Returns true if this node is a leaf
 item(Number index) : NodeNode
Returns the child node at the specified index.
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeChild(Node node) : NodeNode
Removes a child node from this node.
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 replaceChild(Node newChild, Node oldChild) : NodeNode
Replaces one child node in this node with another.
 sort(Function fn, [Object scope]) : voidNode
Sorts this nodes children using the supplied sort function
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 append : (Tree tree, Node this, Node node, Number index)Node
Fires when a new child node is appended
 beforeappend : (Tree tree, Node this, Node node)Node
Fires before a new child is appended, return false to cancel the append.
 beforeinsert : (Tree tree, Node this, Node node, Node refNode)Node
Fires before a new child is inserted, return false to cancel the insert.
 beforemove : (Tree tree, Node this, Node oldParent, Node newParent, Number index)Node
Fires before this node is moved to a new location in the tree. Return false to cancel the move.
 beforeremove : (Tree tree, Node this, Node node)Node
Fires before a child is removed, return false to cancel the remove.
 insert : (Tree tree, Node this, Node node, Node refNode)Node
Fires when a new child node is inserted.
 move : (Tree tree, Node this, Node oldParent, Node newParent, Number index)Node
Fires when this node is moved to a new location in the tree
 remove : (Tree tree, Node this, Node node)Node
Fires when a child node is removed
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 id : StringNode
The id for this node. If one is not specified, one is generated.
 leaf : BooleanNode
true if this node is a leaf and does not have children
+

Property Details

+
+ +
+

attributes

+ public Object attributes +
+ The attributes supplied for the node. You can use this property to access any custom attributes you supplied.
+
This property is defined by Node.
+
+ +
+

childNodes

+ public Array childNodes +
+ All child nodes of this node.
+
This property is defined by Node.
+
+ +
+

firstChild

+ public Node firstChild +
+ The first direct child node of this node, or null if this node has no child nodes.
+
This property is defined by Node.
+
+ +
+

id

+ public String id +
+ The node id.
+
This property is defined by Node.
+
+ +
+

lastChild

+ public Node lastChild +
+ The last direct child node of this node, or null if this node has no child nodes.
+
This property is defined by Node.
+
+ +
+

nextSibling

+ public Node nextSibling +
+ The node immediately following this node in the tree, or null if there is no sibling node.
+
This property is defined by Node.
+
+ +
+

parentNode

+ public Node parentNode +
+ The parent node for this node.
+
This property is defined by Node.
+
+ +
+

previousSibling

+ public Node previousSibling +
+ The node immediately preceding this node in the tree, or null if there is no sibling node.
+
This property is defined by Node.
+
+
+ + +

Constructor Details

+
+
+

Node

+ public function Node(Object attributes) +
+
+ Parameters: +
  • attributes : Object
    The attributes/config for the node
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

appendChild

+ public function appendChild(Node/Array node) +
+ Insert node(s) as the last child node of this node. +
+ Parameters: +
  • node : Node/Array
    The node or Array of nodes to append
+ Returns: +
    +
  • Node
    The appended node if single append, or null if an array was passed
  • +
+
+
+
This method is defined by Node.
+
+ +
+

bubble

+ public function bubble(Function fn, [Object scope], [Array args]) +
+ Bubbles up the tree from this node, calling the specified function with each node. The scope (this) of +function call will be the scope provided or the current node. The arguments to the function +will be the args provided or the current node. If the function returns false at any point, +the bubble is stopped. +
+ Parameters: +
  • fn : Function
    The function to call
  • scope : Object
    (optional) The scope of the function (defaults to current node)
  • args : Array
    (optional) The args to call the function with (default to passing the current node)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Node.
+
+ +
+

cascade

+ public function cascade(Function fn, [Object scope], [Array args]) +
+ Cascades down the tree from this node, calling the specified function with each node. The scope (this) of +function call will be the scope provided or the current node. The arguments to the function +will be the args provided or the current node. If the function returns false at any point, +the cascade is stopped on that branch. +
+ Parameters: +
  • fn : Function
    The function to call
  • scope : Object
    (optional) The scope of the function (defaults to current node)
  • args : Array
    (optional) The args to call the function with (default to passing the current node)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Node.
+
+ +
+

contains

+ public function contains(Node node) +
+ Returns true if this node is an ancestor (at any point) of the passed node. +
+ Parameters: +
  • node : Node
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Node.
+
+ +
+

eachChild

+ public function eachChild(Function fn, [Object scope], [Array args]) +
+ Interates the child nodes of this node, calling the specified function with each node. The scope (this) of +function call will be the scope provided or the current node. The arguments to the function +will be the args provided or the current node. If the function returns false at any point, +the iteration stops. +
+ Parameters: +
  • fn : Function
    The function to call
  • scope : Object
    (optional) The scope of the function (defaults to current node)
  • args : Array
    (optional) The args to call the function with (default to passing the current node)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Node.
+
+ +
+

findChild

+ public function findChild(String attribute, Mixed value) +
+ Finds the first child that has the attribute with the specified value. +
+ Parameters: +
  • attribute : String
    The attribute name
  • value : Mixed
    The value to search for
+ Returns: +
    +
  • Node
    The found child or null if none was found
  • +
+
+
+
This method is defined by Node.
+
+ +
+

findChildBy

+ public function findChildBy(Function fn, [Object scope]) +
+ Finds the first child by a custom function. The child matches if the function passed +returns true. +
+ Parameters: +
  • fn : Function
  • scope : Object
    (optional)
+ Returns: +
    +
  • Node
    The found child or null if none was found
  • +
+
+
+
This method is defined by Node.
+
+ +
+

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.
+
+ +
+

getDepth

+ public function getDepth() +
+ Returns depth of this node (the root node has a depth of 0) +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Node.
+
+ +
+

getOwnerTree

+ public function getOwnerTree() +
+ Returns the tree this node is in. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Tree
  • +
+
+
+
This method is defined by Node.
+
+ +
+

getPath

+ public function getPath([String attr]) +
+ Returns the path for this node. The path can be used to expand or select this node programmatically. +
+ Parameters: +
  • attr : String
    (optional) The attr to use for the path (defaults to the node's id)
+ Returns: +
    +
  • String
    The path
  • +
+
+
+
This method is defined by Node.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

indexOf

+ public function indexOf(Node node) +
+ Returns the index of a child node +
+ Parameters: +
  • node : Node
+ Returns: +
    +
  • Number
    The index of the node or -1 if it was not found
  • +
+
+
+
This method is defined by Node.
+
+ +
+

insertBefore

+ public function insertBefore(Node node, Node refNode) +
+ Inserts the first node before the second node in this nodes childNodes collection. +
+ Parameters: +
  • node : Node
    The node to insert
  • refNode : Node
    The node to insert before (if null the node is appended)
+ Returns: +
    +
  • Node
    The inserted node
  • +
+
+
+
This method is defined by Node.
+
+ +
+

isAncestor

+ public function isAncestor(Node node) +
+ Returns true if the passed node is an ancestor (at any point) of this node. +
+ Parameters: +
  • node : Node
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Node.
+
+ +
+

isFirst

+ public function isFirst() +
+ Returns true if this node is the first child of its parent +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Node.
+
+ +
+

isLast

+ public function isLast() +
+ Returns true if this node is the last child of its parent +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Node.
+
+ +
+

isLeaf

+ public function isLeaf() +
+ Returns true if this node is a leaf +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Node.
+
+ +
+

item

+ public function item(Number index) +
+ Returns the child node at the specified index. +
+ Parameters: +
  • index : Number
+ Returns: +
    +
  • Node
  • +
+
+
+
This method is defined by Node.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

removeChild

+ public function removeChild(Node node) +
+ Removes a child node from this node. +
+ Parameters: +
  • node : Node
    The node to remove
+ Returns: +
    +
  • Node
    The removed node
  • +
+
+
+
This method is defined by Node.
+
+ +
+

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.
+
+ +
+

replaceChild

+ public function replaceChild(Node newChild, Node oldChild) +
+ Replaces one child node in this node with another. +
+ Parameters: +
  • newChild : Node
    The replacement node
  • oldChild : Node
    The node to replace
+ Returns: +
    +
  • Node
    The replaced node
  • +
+
+
+
This method is defined by Node.
+
+ +
+

sort

+ public function sort(Function fn, [Object scope]) +
+ Sorts this nodes children using the supplied sort function +
+ Parameters: +
  • fn : Function
  • scope : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Node.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

append

+ public event append +
+ Fires when a new child node is appended +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The newly appended node
  • index : Number
    The index of the newly appended node
+
+
+
This event is defined by Node.
+
+ +
+

beforeappend

+ public event beforeappend +
+ Fires before a new child is appended, return false to cancel the append. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The child node to be appended
+
+
+
This event is defined by Node.
+
+ +
+

beforeinsert

+ public event beforeinsert +
+ Fires before a new child is inserted, return false to cancel the insert. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The child node to be inserted
  • refNode : Node
    The child node the node is being inserted before
+
+
+
This event is defined by Node.
+
+ +
+

beforemove

+ public event beforemove +
+ Fires before this node is moved to a new location in the tree. Return false to cancel the move. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • oldParent : Node
    The parent of this node
  • newParent : Node
    The new parent this node is moving to
  • index : Number
    The index it is being moved to
+
+
+
This event is defined by Node.
+
+ +
+

beforeremove

+ public event beforeremove +
+ Fires before a child is removed, return false to cancel the remove. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The child node to be removed
+
+
+
This event is defined by Node.
+
+ +
+

insert

+ public event insert +
+ Fires when a new child node is inserted. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The child node inserted
  • refNode : Node
    The child node the node was inserted before
+
+
+
This event is defined by Node.
+
+ +
+

move

+ public event move +
+ Fires when this node is moved to a new location in the tree +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • oldParent : Node
    The old parent of this node
  • newParent : Node
    The new parent of this node
  • index : Number
    The index it was moved to
+
+
+
This event is defined by Node.
+
+ +
+

remove

+ public event remove +
+ Fires when a child node is removed +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The removed node
+
+
+
This event is defined by Node.
+
+
+

Config Details

+
+ +
+

id

+ id : String +
+ The id for this node. If one is not specified, one is generated.
+
This config option is defined by Node.
+
+ +
+

leaf

+ leaf : Boolean +
+ true if this node is a leaf and does not have children
+
This config option is defined by Node.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.data.Record.html b/www/extras/yui-ext/docs/output/Ext.data.Record.html new file mode 100644 index 000000000..1d88ead4f --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.data.Record.html @@ -0,0 +1,222 @@ + + + + Ext.data.Record + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.data.Record

+ + + + + +
Package:Ext.data
Class:Record
Extends:Object
Defined In:Record.js
+
+ Instances of this class encapsulate both record definition information, and record +value information for use in Ext.data.Store objects, or any code which needs +to access Records cached in an Ext.data.Store object. +

+Constructors for this class are generated by passing an Array of field definition objects to create +and instances are usually only created by Ext.data.Reader objects when processing unformatted data +objects. +

+Record objects generated by this constructor inherit all the methods of Ext.data.Record listed below.

+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 dirty : BooleanRecord
Readonly flag - true if this record has been modified.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Record(data {Array}, id (Optional))Record
This constructor should not be used to create Record objects. Instead, use the constructor generated by +create. The p...
 commit() : voidRecord
Usually called by the Ext.data.Store which owns the Record. +Commits all changes made to the Record since either creat...
 get(name {String}) : ObjectRecord
Get the value of the named field.
 reject() : voidRecord
Usually called by the Ext.data.Store which owns the Record. +Rejects all changes made to the Record since either creat...
 set(name {String}, value {Object}) : voidRecord
Set the named field to the specified value.
+ +

Public Events

+
This class has no public events.

Property Details

+
+ +
+

dirty

+ public Boolean dirty +
+ Readonly flag - true if this record has been modified.
+
This property is defined by Record.
+
+
+ + +

Constructor Details

+
+
+

Record

+ public function Record(data {Array}, id (Optional)) +
+ This constructor should not be used to create Record objects. Instead, use the constructor generated by +create. The parameters are the same.
+ Parameters: +
  • {Array} : data
    An associative Array of data values keyed by the field name.
  • (Optional) : id
    The id of the record. This id should be unique, and is used by the @link Ext.data.Store} object which owns the Record to index its collection of Records. If not specified an integer id is generated.
+
+
+
+
+ +

Method Details

+
+ +
+

commit

+ public function commit() +
+ Usually called by the Ext.data.Store which owns the Record. +Commits all changes made to the Record since either creation, or the last commit operation. +

+Developers should subscribe to the Ext.data.Store.update event to have their code notified +of commit operations. +

+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Record.
+
+ +
+

get

+ public function get(name {String}) +
+ Get the value of the named field. +
+ Parameters: +
  • {String} : name
    The name of the field to get the value of.
+ Returns: +
    +
  • Object
    The value of the field.
  • +
+
+
+
This method is defined by Record.
+
+ +
+

reject

+ public function reject() +
+ Usually called by the Ext.data.Store which owns the Record. +Rejects all changes made to the Record since either creation, or the last commit operation. +Modified fields are reverted to their original values. +

+Developers should subscribe to the Ext.data.Store.update event to have their code notified +of reject operations. +

+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Record.
+
+ +
+

set

+ public function set(name {String}, value {Object}) +
+ Set the named field to the specified value. +
+ Parameters: +
  • {String} : name
    The name of the field to set.
  • {Object} : value
    The value to set the field to.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Record.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.data.ScriptTagProxy.html b/www/extras/yui-ext/docs/output/Ext.data.ScriptTagProxy.html new file mode 100644 index 000000000..869c95db7 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.data.ScriptTagProxy.html @@ -0,0 +1,209 @@ + + + + Ext.data.ScriptTagProxy + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.data.ScriptTagProxy

+ + + + + +
Package:Ext.data
Class:ScriptTagProxy
Extends:Object
Defined In:ScriptTagProxy.js
+
+ An implementation of Ext.data.DataProxy that reads a data object from a URL which may be in a domain +other than the originating domain of the running page. +

+Note that this class must be used to retrieve data from a domain other than the domain +from which the running page was served.

+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 ScriptTagProxy(Object conn)ScriptTagProxy
 abort() : voidScriptTagProxy
Abort the current server request.
 load(Object params, Ext.data.DataReader reader, Function callback, Object scope, Object arg) : voidScriptTagProxy
Load data from the configured URL, read the data object into +a block of Ext.data.Records using the passed Ext.data.Da...
+ +

Public Events

+
This class has no public events.
+

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 callbackParam : StringScriptTagProxy
(Optional) The name of the parameter to pass to the server which tells the server the name of the callback function s...
 timeout : NumberScriptTagProxy
(Optional) The number of milliseconds to wait for a response. Defaults to 30 seconds.
 url : StringScriptTagProxy
The url from which to request the data object.
 {Boolean} : nocacheScriptTagProxy
(Optional) Defaults to true. Disable cacheing by adding a unique parameter name to the request.
+ + +

Constructor Details

+
+
+

ScriptTagProxy

+ public function ScriptTagProxy(Object conn) +
+
+ Parameters: +
  • conn : Object
    A configuration object.
+
+
+
+
+ +

Method Details

+
+ +
+

abort

+ public function abort() +
+ Abort the current server request. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ScriptTagProxy.
+
+ +
+

load

+ public function load(Object params, Ext.data.DataReader reader, Function callback, Object scope, Object arg) +
+ Load data from the configured URL, read the data object into +a block of Ext.data.Records using the passed Ext.data.DataReader implementation, and +process that block using the passed callback. +
+ Parameters: +
  • params : Object
    An object containing properties which are to be used as HTTP parameters for the request to the remote server.
  • reader : Ext.data.DataReader
    The Reader object which converts the data object into a block of Ext.data.Records.
  • callback : Function
    The function into which to pass the block of Ext.data.Records. The function must be passed
    • The Record block object
    • The "arg" argument from the load function
    • A boolean success indicator
  • scope : Object
    The scope in which to call the callback
  • arg : Object
    An optional argument which is passed to the callback as its second parameter.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ScriptTagProxy.
+
+
+ +

Config Details

+
+ +
+

callbackParam

+ callbackParam : String +
+ (Optional) The name of the parameter to pass to the server which tells the server the name of the callback function set up by the load call to process the returned data object. Defaults to "callback".

The server-side processing must read this parameter value, and generate javascript output which calls this named function passing the data object as its only parameter.

+
This config option is defined by ScriptTagProxy.
+
+ +
+

timeout

+ timeout : Number +
+ (Optional) The number of milliseconds to wait for a response. Defaults to 30 seconds.
+
This config option is defined by ScriptTagProxy.
+
+ +
+

url

+ url : String +
+ The url from which to request the data object.
+
This config option is defined by ScriptTagProxy.
+
+ +
+

{Boolean}

+ {Boolean} : nocache +
+ (Optional) Defaults to true. Disable cacheing by adding a unique parameter name to the request.
+
This config option is defined by ScriptTagProxy.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.data.SimpleStore.html b/www/extras/yui-ext/docs/output/Ext.data.SimpleStore.html new file mode 100644 index 000000000..a34447507 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.data.SimpleStore.html @@ -0,0 +1,1242 @@ + + + + Ext.data.SimpleStore + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.data.SimpleStore

+ + + + + +
Package:Ext.data
Class:SimpleStore
Extends:Store
Defined In:SimpleStore.js
+
+ Smaller help class to make creating Stores from Array data easier.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 SimpleStore(Object config)SimpleStore
 add(Ext.data.Record[] records) : voidStore
Add Records to the Store and fires the add event.
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 clearFilter(Boolean suppressEvent) : voidStore
Revert to a view of the Record cache with no filtering applied.
 commitChanges() : voidStore
Commit all Records with outstanding changes. To handle updates for changes, subscribe to the +Store's "update" event, ...
 each(Function fn, [Object scope]) : voidStore
Calls the specified function for each of the Records in the cache.
 filter(String field, String/RegExp value) : BooleanStore
Filter the records by a specified property.
 filterBy(Function fn, [Object scope]) : voidStore
Filter by a function. The specified function will be called with each +record in this data source. If the function ret...
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getAt(String index) : Ext.data.RecordStore
Get the Record at the specified index.
 getById(String id) : Ext.data.RecordStore
Get the Record with the specified id.
 getCount() : voidStore
Gets the number of cached records. + +If using paging, this may not be the total size of the dataset. If the data objec...
 getModifiedRecords() : Ext.data.Record[]Store
Get all records modified since the last load, or since the last commit.
 getRange([Number startIndex], [Number endIndex]) : Ext.data.Record[]Store
Returns a range of Records between specified indices.
 getSortState() : voidStore
Returns the sort state of the Store as an object with two properties: + + field {String} The name of the field by whic...
 getTotalCount() : voidStore
Gets the total number of records in the dataset. + +If using paging, for this to be accurate, the data object used by t...
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 indexOf(Ext.data.Record[] records) : NumberStore
Get the index within the cache of the passed Record.
 indexOfId(String id) : NumberStore
Get the index within the cache of the Record with the passed id.
 insert(Number index, Ext.data.Record[] records) : voidStore
Inserts Records to the Store at the given index and fires the add event.
 load(Object options) : voidStore
Loads the Record cache from the configured Proxy using the configured Reader. + +If using remote paging, then the first...
 loadData(Object data, [Boolean append]) : voidStore
Loads data from a passed data block. A Reader which understands the format of the data +must have been configured in t...
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 rejectChanges() : voidStore
Cancel outstanding changes on all changed records.
 reload([Object options]) : voidStore
Reloads the Record cache from the configured Proxy using the configured Reader and +the options from the last load ope...
 remove(Ext.data.Record record) : voidStore
Remove a Record from the Store and fires the remove event.
 removeAll() : voidStore
Remove all Records from the Store and fires the clear event.
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 setDefaultSort(String fieldName, [String dir]) : voidStore
Sets the default sort column and order to be used by the next load operation.
 sort(String fieldName, [String dir]) : voidStore
Sort the Records. +If remote sorting is used, the sort is performed on the server, and the cache is +reloaded. If local...
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 add : (Store this, Ext.data.Record[] records, Number index)Store
Fires when Records have been added to the Store
 beforeload : (Store this, Object options)Store
Fires before a request is made for a new data object. If the beforeload handler returns false +the load action will b...
 clear : (Store this)Store
Fires when the data cache has been cleared.
 datachanged : (Store this)Store
Fires when the data cache has changed, and a widget which is using this Store +as a Record cache should refresh its view.
 load : (Store this, Ext.data.Record[] records, Object options)Store
Fires after a new set of Records has been loaded.
 loadexception : ()Store
Fires if an exception occurs in the Proxy during loading. +Called with the signature of the Proxy's "loadexception" ev...
 remove : (Store this, Ext.data.Record record, Number index)Store
Fires when Records have been removed from the Store
 update : (Store this, Ext.data.Record record, String operation)Store
Fires when Records have been updated
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 baseParams : ObjectStore
An object containing properties which are to be sent as parameters on any HTTP request
 data : ArraySimpleStore
The multi-dimensional array of data
 fields : ArraySimpleStore
An standard field array consisting of string name or object literal field definitions
 id : NumberSimpleStore
The index in the array that be used for record ids. Leave blank to auto generate ids.
 proxy : Ext.data.DataProxyStore
The Proxy object which provides access to a data object.
 reader : Ext.data.ReaderStore
The Reader object which processes the data object and returns an Array of Ext.data.record objects which are cached ke...
 remoteSort : booleanStore
True if sorting is to be handled by requesting the Proxy to provide a refreshed version of the data object in sorted ...
 sortInfo : ObjectStore
A config object in the format: {field: "fieldName", direction: "ASC|DESC"}
+ + +

Constructor Details

+
+
+

SimpleStore

+ public function SimpleStore(Object config) +
+
+ Parameters: +
  • config : Object
+
+
+
+
+ +

Method Details

+
+ +
+

add

+ public function add(Ext.data.Record[] records) +
+ Add Records to the Store and fires the add event. +
+ Parameters: +
  • records : Ext.data.Record[]
    An Array of Ext.data.Record objects to add to the cache.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

clearFilter

+ public function clearFilter(Boolean suppressEvent) +
+ Revert to a view of the Record cache with no filtering applied. +
+ Parameters: +
  • suppressEvent : Boolean
    If true the filter is cleared silently without notifying listeners
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

commitChanges

+ public function commitChanges() +
+ Commit all Records with outstanding changes. To handle updates for changes, subscribe to the +Store's "update" event, and perform updating when the third parameter is Ext.data.Record.COMMIT. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

each

+ public function each(Function fn, [Object scope]) +
+ Calls the specified function for each of the Records in the cache. +
+ Parameters: +
  • fn : Function
    The function to call. The Record is passed as the first parameter. Returning false aborts and exits the iteration.
  • scope : Object
    (optional) The scope in which to call the function (defaults to the Record).
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

filter

+ public function filter(String field, String/RegExp value) +
+ Filter the records by a specified property. +
+ Parameters: +
  • field : String
    A field on your records
  • value : String/RegExp
    Either a string that the field should start with or a RegExp to test against the field
+ Returns: +
    +
  • Boolean
    True if the filter matched at least one record, else false
  • +
+
+
+
This method is defined by Store.
+
+ +
+

filterBy

+ public function filterBy(Function fn, [Object scope]) +
+ Filter by a function. The specified function will be called with each +record in this data source. If the function returns true the record is included, +otherwise it is filtered. +
+ Parameters: +
  • fn : Function
    The function to be called, it will receive 2 args (record, id)
  • scope : Object
    (optional) The scope of the function (defaults to this)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

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.
+
+ +
+

getAt

+ public function getAt(String index) +
+ Get the Record at the specified index. +
+ Parameters: +
  • index : String
    The index of the Record to find.
+ Returns: +
    +
  • Ext.data.Record
    The Record at the passed index. Returns undefined if not found.
  • +
+
+
+
This method is defined by Store.
+
+ +
+

getById

+ public function getById(String id) +
+ Get the Record with the specified id. +
+ Parameters: +
  • id : String
    The id of the Record to find.
+ Returns: +
    +
  • Ext.data.Record
    The Record with the passed id. Returns undefined if not found.
  • +
+
+
+
This method is defined by Store.
+
+ +
+

getCount

+ public function getCount() +
+ Gets the number of cached records. +

+If using paging, this may not be the total size of the dataset. If the data object +used by the Reader contains the dataset size, then the getTotalCount() function returns +the data set size +

+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

getModifiedRecords

+ public function getModifiedRecords() +
+ Get all records modified since the last load, or since the last commit. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.data.Record[]
    An array of Records containing outstanding modifications.
  • +
+
+
+
This method is defined by Store.
+
+ +
+

getRange

+ public function getRange([Number startIndex], [Number endIndex]) +
+ Returns a range of Records between specified indices. +
+ Parameters: +
  • startIndex : Number
    (optional) The starting index (defaults to 0)
  • endIndex : Number
    (optional) The ending index (defaults to the last Record in the Store)
+ Returns: +
    +
  • Ext.data.Record[]
    An array of Records
  • +
+
+
+
This method is defined by Store.
+
+ +
+

getSortState

+ public function getSortState() +
+ Returns the sort state of the Store as an object with two properties: +

+ field {String} The name of the field by which the Records are sorted
+ direction {String} The sort order, "ASC" or "DESC"
+
+
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

getTotalCount

+ public function getTotalCount() +
+ Gets the total number of records in the dataset. +

+If using paging, for this to be accurate, the data object used by the Reader must contain +the dataset size +

+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

indexOf

+ public function indexOf(Ext.data.Record[] records) +
+ Get the index within the cache of the passed Record. +
+ Parameters: +
  • records : Ext.data.Record[]
    An Array of Ext.data.Record objects to add to the cache.
+ Returns: +
    +
  • Number
    The index of the passed Record. Returns -1 if not found.
  • +
+
+
+
This method is defined by Store.
+
+ +
+

indexOfId

+ public function indexOfId(String id) +
+ Get the index within the cache of the Record with the passed id. +
+ Parameters: +
  • id : String
    The id of the Record to find.
+ Returns: +
    +
  • Number
    The index of the Record. Returns -1 if not found.
  • +
+
+
+
This method is defined by Store.
+
+ +
+

insert

+ public function insert(Number index, Ext.data.Record[] records) +
+ Inserts Records to the Store at the given index and fires the add event. +
+ Parameters: +
  • index : Number
    The start index at which to insert the passed Records.
  • records : Ext.data.Record[]
    An Array of Ext.data.Record objects to add to the cache.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

load

+ public function load(Object options) +
+ Loads the Record cache from the configured Proxy using the configured Reader. +

+If using remote paging, then the first load call must specify the start +and limit properties in the options.params property to establish the initial +position within the dataset, and the number of Records to cache on each read from the Proxy. +

+It is important to note that for remote data sources, loading is asynchronous, +and this call will return before the new data has been loaded. Perform any post-processing +in a callback function, or in a "load" event handler. +

+

+ Parameters: +
  • options : Object
    An object containing properties which control loading options:
     params {Object} An object containing properties to pass as HTTP parameters to a remote data source. callback {Function} A function to be called after the Records have been loaded. The callback is passed the following arguments: r : Ext.data.Record[] options: Options object from the load call success: Boolean success indicator scope {Object} Scope with which to call the callback (defaults to the Store object) append {Boolean} indicator to append loaded records rather than replace the current cache. 
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

loadData

+ public function loadData(Object data, [Boolean append]) +
+ Loads data from a passed data block. A Reader which understands the format of the data +must have been configured in the constructor. +
+ Parameters: +
  • data : Object
    The data block from which to read the Records. The format of the data expected is dependent on the type of Reader that is configured and should correspond to that Reader's readRecords parameter.
  • append : Boolean
    (Optional) True to append the new Records rather than replace the existing cache.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

rejectChanges

+ public function rejectChanges() +
+ Cancel outstanding changes on all changed records. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

reload

+ public function reload([Object options]) +
+ Reloads the Record cache from the configured Proxy using the configured Reader and +the options from the last load operation performed. +
+ Parameters: +
  • options : Object
    (optional) An object containing properties which may override the options used in the last load operation. See load for details (defaults to null, in which case the most recently used options are reused).
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

remove

+ public function remove(Ext.data.Record record) +
+ Remove a Record from the Store and fires the remove event. +
+ Parameters: +
  • record : Ext.data.Record
    Th Ext.data.Record object to remove from the cache.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

removeAll

+ public function removeAll() +
+ Remove all Records from the Store and fires the clear event. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

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.
+
+ +
+

setDefaultSort

+ public function setDefaultSort(String fieldName, [String dir]) +
+ Sets the default sort column and order to be used by the next load operation. +
+ Parameters: +
  • fieldName : String
    The name of the field to sort by.
  • dir : String
    (optional) The sort order, "ASC" or "DESC" (defaults to "ASC")
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

sort

+ public function sort(String fieldName, [String dir]) +
+ Sort the Records. +If remote sorting is used, the sort is performed on the server, and the cache is +reloaded. If local sorting is used, the cache is sorted internally. +
+ Parameters: +
  • fieldName : String
    The name of the field to sort by.
  • dir : String
    (optional) The sort order, "ASC" or "DESC" (defaults to "ASC")
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

add

+ public event add +
+ Fires when Records have been added to the Store +
+ Subscribers will be called with the following parameters: +
  • this : Store
  • records : Ext.data.Record[]
    The array of Records added
  • index : Number
    The index at which the record(s) were added
+
+
+
This event is defined by Store.
+
+ +
+

beforeload

+ public event beforeload +
+ Fires before a request is made for a new data object. If the beforeload handler returns false +the load action will be canceled. +
+ Subscribers will be called with the following parameters: +
  • this : Store
  • options : Object
    The loading options that were specified (see load for details)
+
+
+
This event is defined by Store.
+
+ +
+

clear

+ public event clear +
+ Fires when the data cache has been cleared. +
+ Subscribers will be called with the following parameters: +
  • this : Store
+
+
+
This event is defined by Store.
+
+ +
+

datachanged

+ public event datachanged +
+ Fires when the data cache has changed, and a widget which is using this Store +as a Record cache should refresh its view. +
+ Subscribers will be called with the following parameters: +
  • this : Store
+
+
+
This event is defined by Store.
+
+ +
+

load

+ public event load +
+ Fires after a new set of Records has been loaded. +
+ Subscribers will be called with the following parameters: +
  • this : Store
  • records : Ext.data.Record[]
    The Records that were loaded
  • options : Object
    The loading options that were specified (see load for details)
+
+
+
This event is defined by Store.
+
+ +
+

loadexception

+ public event loadexception +
+ Fires if an exception occurs in the Proxy during loading. +Called with the signature of the Proxy's "loadexception" event. +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Store.
+
+ +
+

remove

+ public event remove +
+ Fires when Records have been removed from the Store +
+ Subscribers will be called with the following parameters: +
  • this : Store
  • record : Ext.data.Record
    The Record that was removed
  • index : Number
    The index at which the record was removed
+
+
+
This event is defined by Store.
+
+ +
+

update

+ public event update +
+ Fires when Records have been updated +
+ Subscribers will be called with the following parameters: +
  • this : Store
  • record : Ext.data.Record
    The Record that was updated
  • operation : String
    The update operation being performed. Value may be one of:
     Ext.data.Record.EDIT Ext.data.Record.REJECT Ext.data.Record.COMMIT 
+
+
+
This event is defined by Store.
+
+
+

Config Details

+
+ +
+

baseParams

+ baseParams : Object +
+ An object containing properties which are to be sent as parameters on any HTTP request
+
This config option is defined by Store.
+
+ +
+

data

+ data : Array +
+ The multi-dimensional array of data
+
This config option is defined by SimpleStore.
+
+ +
+

fields

+ fields : Array +
+ An standard field array consisting of string name or object literal field definitions
+
This config option is defined by SimpleStore.
+
+ +
+

id

+ id : Number +
+ The index in the array that be used for record ids. Leave blank to auto generate ids.
+
This config option is defined by SimpleStore.
+
+ +
+

proxy

+ proxy : Ext.data.DataProxy +
+ The Proxy object which provides access to a data object.
+
This config option is defined by Store.
+
+ +
+

reader

+ reader : Ext.data.Reader +
+ The Reader object which processes the data object and returns an Array of Ext.data.record objects which are cached keyed by their id property.
+
This config option is defined by Store.
+
+ +
+

remoteSort

+ remoteSort : boolean +
+ True if sorting is to be handled by requesting the Proxy to provide a refreshed version of the data object in sorted order, as opposed to sorting the Record cache in place (defaults to false).
+
This config option is defined by Store.
+
+ +
+

sortInfo

+ sortInfo : Object +
+ A config object in the format: {field: "fieldName", direction: "ASC|DESC"}
+
This config option is defined by Store.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.data.SortTypes.html b/www/extras/yui-ext/docs/output/Ext.data.SortTypes.html new file mode 100644 index 000000000..07464d032 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.data.SortTypes.html @@ -0,0 +1,254 @@ + + + + Ext.data.SortTypes + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.data.SortTypes

+ + + + + +
Package:Ext.data
Class:SortTypes
Extends:Object
Defined In:SortTypes.js
+
+

This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 stripTagsRE : RegExpSortTypes
The regular expression used to strip tags
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 asDate(Mixed s) : NumberSortTypes
Date sorting
 asFloat(Mixed s) : FloatSortTypes
Float sorting
 asInt(Mixed s) : NumberSortTypes
Integer sorting
 asText(Mixed s) : StringSortTypes
Strips all HTML tags to sort on text only
 asUCString(Mixed s) : StringSortTypes
Case insensitive string
 asUCText(Mixed s) : StringSortTypes
Strips all HTML tags to sort on text only - Case insensitive
 none(Mixed s) : MixedSortTypes
Default sort that does nothing
+ +

Public Events

+
This class has no public events.

Property Details

+
+ +
+

stripTagsRE

+ public RegExp stripTagsRE +
+ The regular expression used to strip tags
+
This property is defined by SortTypes.
+
+
+ + +

Method Details

+
+ +
+

asDate

+ public function asDate(Mixed s) +
+ Date sorting +
+ Parameters: +
  • s : Mixed
    The value being converted
+ Returns: +
    +
  • Number
    The comparison value
  • +
+
+
+
This method is defined by SortTypes.
+
+ +
+

asFloat

+ public function asFloat(Mixed s) +
+ Float sorting +
+ Parameters: +
  • s : Mixed
    The value being converted
+ Returns: +
    +
  • Float
    The comparison value
  • +
+
+
+
This method is defined by SortTypes.
+
+ +
+

asInt

+ public function asInt(Mixed s) +
+ Integer sorting +
+ Parameters: +
  • s : Mixed
    The value being converted
+ Returns: +
    +
  • Number
    The comparison value
  • +
+
+
+
This method is defined by SortTypes.
+
+ +
+

asText

+ public function asText(Mixed s) +
+ Strips all HTML tags to sort on text only +
+ Parameters: +
  • s : Mixed
    The value being converted
+ Returns: +
    +
  • String
    The comparison value
  • +
+
+
+
This method is defined by SortTypes.
+
+ +
+

asUCString

+ public function asUCString(Mixed s) +
+ Case insensitive string +
+ Parameters: +
  • s : Mixed
    The value being converted
+ Returns: +
    +
  • String
    The comparison value
  • +
+
+
+
This method is defined by SortTypes.
+
+ +
+

asUCText

+ public function asUCText(Mixed s) +
+ Strips all HTML tags to sort on text only - Case insensitive +
+ Parameters: +
  • s : Mixed
    The value being converted
+ Returns: +
    +
  • String
    The comparison value
  • +
+
+
+
This method is defined by SortTypes.
+
+ +
+

none

+ public function none(Mixed s) +
+ Default sort that does nothing +
+ Parameters: +
  • s : Mixed
    The value being converted
+ Returns: +
    +
  • Mixed
    The comparison value
  • +
+
+
+
This method is defined by SortTypes.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.data.Store.html b/www/extras/yui-ext/docs/output/Ext.data.Store.html new file mode 100644 index 000000000..9b730795f --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.data.Store.html @@ -0,0 +1,1200 @@ + + + + Ext.data.Store + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.data.Store

+ + + + + + +
Package:Ext.data
Class:Store
Extends:Observable
Subclasses:SimpleStore
Defined In:Store.js
+
+ The Store class encapsulates a client side cache of Ext.data.Record objects which provide input data +for widgets such as the Ext.grid.Grid, or the Ext.form.ComboBox. +A Store object uses an implementation of Ext.data.DataProxy to access a data object unless you call loadData() directly and pass in your data. The Store object +has no knowledge of the format of the data returned by the Proxy. +The Store object uses its configured implementation of Ext.data.DataReader to create Ext.data.Record +instances from the data object. These records are cached and made available through accessor functions.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Store(Object config)Store
Creates a new Store
 add(Ext.data.Record[] records) : voidStore
Add Records to the Store and fires the add event.
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 clearFilter(Boolean suppressEvent) : voidStore
Revert to a view of the Record cache with no filtering applied.
 commitChanges() : voidStore
Commit all Records with outstanding changes. To handle updates for changes, subscribe to the +Store's "update" event, ...
 each(Function fn, [Object scope]) : voidStore
Calls the specified function for each of the Records in the cache.
 filter(String field, String/RegExp value) : BooleanStore
Filter the records by a specified property.
 filterBy(Function fn, [Object scope]) : voidStore
Filter by a function. The specified function will be called with each +record in this data source. If the function ret...
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getAt(String index) : Ext.data.RecordStore
Get the Record at the specified index.
 getById(String id) : Ext.data.RecordStore
Get the Record with the specified id.
 getCount() : voidStore
Gets the number of cached records. + +If using paging, this may not be the total size of the dataset. If the data objec...
 getModifiedRecords() : Ext.data.Record[]Store
Get all records modified since the last load, or since the last commit.
 getRange([Number startIndex], [Number endIndex]) : Ext.data.Record[]Store
Returns a range of Records between specified indices.
 getSortState() : voidStore
Returns the sort state of the Store as an object with two properties: + + field {String} The name of the field by whic...
 getTotalCount() : voidStore
Gets the total number of records in the dataset. + +If using paging, for this to be accurate, the data object used by t...
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 indexOf(Ext.data.Record[] records) : NumberStore
Get the index within the cache of the passed Record.
 indexOfId(String id) : NumberStore
Get the index within the cache of the Record with the passed id.
 insert(Number index, Ext.data.Record[] records) : voidStore
Inserts Records to the Store at the given index and fires the add event.
 load(Object options) : voidStore
Loads the Record cache from the configured Proxy using the configured Reader. + +If using remote paging, then the first...
 loadData(Object data, [Boolean append]) : voidStore
Loads data from a passed data block. A Reader which understands the format of the data +must have been configured in t...
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 rejectChanges() : voidStore
Cancel outstanding changes on all changed records.
 reload([Object options]) : voidStore
Reloads the Record cache from the configured Proxy using the configured Reader and +the options from the last load ope...
 remove(Ext.data.Record record) : voidStore
Remove a Record from the Store and fires the remove event.
 removeAll() : voidStore
Remove all Records from the Store and fires the clear event.
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 setDefaultSort(String fieldName, [String dir]) : voidStore
Sets the default sort column and order to be used by the next load operation.
 sort(String fieldName, [String dir]) : voidStore
Sort the Records. +If remote sorting is used, the sort is performed on the server, and the cache is +reloaded. If local...
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 add : (Store this, Ext.data.Record[] records, Number index)Store
Fires when Records have been added to the Store
 beforeload : (Store this, Object options)Store
Fires before a request is made for a new data object. If the beforeload handler returns false +the load action will b...
 clear : (Store this)Store
Fires when the data cache has been cleared.
 datachanged : (Store this)Store
Fires when the data cache has changed, and a widget which is using this Store +as a Record cache should refresh its view.
 load : (Store this, Ext.data.Record[] records, Object options)Store
Fires after a new set of Records has been loaded.
 loadexception : ()Store
Fires if an exception occurs in the Proxy during loading. +Called with the signature of the Proxy's "loadexception" ev...
 remove : (Store this, Ext.data.Record record, Number index)Store
Fires when Records have been removed from the Store
 update : (Store this, Ext.data.Record record, String operation)Store
Fires when Records have been updated
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 baseParams : ObjectStore
An object containing properties which are to be sent as parameters on any HTTP request
 proxy : Ext.data.DataProxyStore
The Proxy object which provides access to a data object.
 reader : Ext.data.ReaderStore
The Reader object which processes the data object and returns an Array of Ext.data.record objects which are cached ke...
 remoteSort : booleanStore
True if sorting is to be handled by requesting the Proxy to provide a refreshed version of the data object in sorted ...
 sortInfo : ObjectStore
A config object in the format: {field: "fieldName", direction: "ASC|DESC"}
+ + +

Constructor Details

+
+
+

Store

+ public function Store(Object config) +
+ Creates a new Store
+ Parameters: +
  • config : Object
    A config object containing the objects needed for the Store to access data, and read the data into Records.
+
+
+
+
+ +

Method Details

+
+ +
+

add

+ public function add(Ext.data.Record[] records) +
+ Add Records to the Store and fires the add event. +
+ Parameters: +
  • records : Ext.data.Record[]
    An Array of Ext.data.Record objects to add to the cache.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

clearFilter

+ public function clearFilter(Boolean suppressEvent) +
+ Revert to a view of the Record cache with no filtering applied. +
+ Parameters: +
  • suppressEvent : Boolean
    If true the filter is cleared silently without notifying listeners
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

commitChanges

+ public function commitChanges() +
+ Commit all Records with outstanding changes. To handle updates for changes, subscribe to the +Store's "update" event, and perform updating when the third parameter is Ext.data.Record.COMMIT. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

each

+ public function each(Function fn, [Object scope]) +
+ Calls the specified function for each of the Records in the cache. +
+ Parameters: +
  • fn : Function
    The function to call. The Record is passed as the first parameter. Returning false aborts and exits the iteration.
  • scope : Object
    (optional) The scope in which to call the function (defaults to the Record).
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

filter

+ public function filter(String field, String/RegExp value) +
+ Filter the records by a specified property. +
+ Parameters: +
  • field : String
    A field on your records
  • value : String/RegExp
    Either a string that the field should start with or a RegExp to test against the field
+ Returns: +
    +
  • Boolean
    True if the filter matched at least one record, else false
  • +
+
+
+
This method is defined by Store.
+
+ +
+

filterBy

+ public function filterBy(Function fn, [Object scope]) +
+ Filter by a function. The specified function will be called with each +record in this data source. If the function returns true the record is included, +otherwise it is filtered. +
+ Parameters: +
  • fn : Function
    The function to be called, it will receive 2 args (record, id)
  • scope : Object
    (optional) The scope of the function (defaults to this)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

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.
+
+ +
+

getAt

+ public function getAt(String index) +
+ Get the Record at the specified index. +
+ Parameters: +
  • index : String
    The index of the Record to find.
+ Returns: +
    +
  • Ext.data.Record
    The Record at the passed index. Returns undefined if not found.
  • +
+
+
+
This method is defined by Store.
+
+ +
+

getById

+ public function getById(String id) +
+ Get the Record with the specified id. +
+ Parameters: +
  • id : String
    The id of the Record to find.
+ Returns: +
    +
  • Ext.data.Record
    The Record with the passed id. Returns undefined if not found.
  • +
+
+
+
This method is defined by Store.
+
+ +
+

getCount

+ public function getCount() +
+ Gets the number of cached records. +

+If using paging, this may not be the total size of the dataset. If the data object +used by the Reader contains the dataset size, then the getTotalCount() function returns +the data set size +

+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

getModifiedRecords

+ public function getModifiedRecords() +
+ Get all records modified since the last load, or since the last commit. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.data.Record[]
    An array of Records containing outstanding modifications.
  • +
+
+
+
This method is defined by Store.
+
+ +
+

getRange

+ public function getRange([Number startIndex], [Number endIndex]) +
+ Returns a range of Records between specified indices. +
+ Parameters: +
  • startIndex : Number
    (optional) The starting index (defaults to 0)
  • endIndex : Number
    (optional) The ending index (defaults to the last Record in the Store)
+ Returns: +
    +
  • Ext.data.Record[]
    An array of Records
  • +
+
+
+
This method is defined by Store.
+
+ +
+

getSortState

+ public function getSortState() +
+ Returns the sort state of the Store as an object with two properties: +

+ field {String} The name of the field by which the Records are sorted
+ direction {String} The sort order, "ASC" or "DESC"
+
+
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

getTotalCount

+ public function getTotalCount() +
+ Gets the total number of records in the dataset. +

+If using paging, for this to be accurate, the data object used by the Reader must contain +the dataset size +

+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

indexOf

+ public function indexOf(Ext.data.Record[] records) +
+ Get the index within the cache of the passed Record. +
+ Parameters: +
  • records : Ext.data.Record[]
    An Array of Ext.data.Record objects to add to the cache.
+ Returns: +
    +
  • Number
    The index of the passed Record. Returns -1 if not found.
  • +
+
+
+
This method is defined by Store.
+
+ +
+

indexOfId

+ public function indexOfId(String id) +
+ Get the index within the cache of the Record with the passed id. +
+ Parameters: +
  • id : String
    The id of the Record to find.
+ Returns: +
    +
  • Number
    The index of the Record. Returns -1 if not found.
  • +
+
+
+
This method is defined by Store.
+
+ +
+

insert

+ public function insert(Number index, Ext.data.Record[] records) +
+ Inserts Records to the Store at the given index and fires the add event. +
+ Parameters: +
  • index : Number
    The start index at which to insert the passed Records.
  • records : Ext.data.Record[]
    An Array of Ext.data.Record objects to add to the cache.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

load

+ public function load(Object options) +
+ Loads the Record cache from the configured Proxy using the configured Reader. +

+If using remote paging, then the first load call must specify the start +and limit properties in the options.params property to establish the initial +position within the dataset, and the number of Records to cache on each read from the Proxy. +

+It is important to note that for remote data sources, loading is asynchronous, +and this call will return before the new data has been loaded. Perform any post-processing +in a callback function, or in a "load" event handler. +

+

+ Parameters: +
  • options : Object
    An object containing properties which control loading options:
     params {Object} An object containing properties to pass as HTTP parameters to a remote data source. callback {Function} A function to be called after the Records have been loaded. The callback is passed the following arguments: r : Ext.data.Record[] options: Options object from the load call success: Boolean success indicator scope {Object} Scope with which to call the callback (defaults to the Store object) append {Boolean} indicator to append loaded records rather than replace the current cache. 
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

loadData

+ public function loadData(Object data, [Boolean append]) +
+ Loads data from a passed data block. A Reader which understands the format of the data +must have been configured in the constructor. +
+ Parameters: +
  • data : Object
    The data block from which to read the Records. The format of the data expected is dependent on the type of Reader that is configured and should correspond to that Reader's readRecords parameter.
  • append : Boolean
    (Optional) True to append the new Records rather than replace the existing cache.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

rejectChanges

+ public function rejectChanges() +
+ Cancel outstanding changes on all changed records. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

reload

+ public function reload([Object options]) +
+ Reloads the Record cache from the configured Proxy using the configured Reader and +the options from the last load operation performed. +
+ Parameters: +
  • options : Object
    (optional) An object containing properties which may override the options used in the last load operation. See load for details (defaults to null, in which case the most recently used options are reused).
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

remove

+ public function remove(Ext.data.Record record) +
+ Remove a Record from the Store and fires the remove event. +
+ Parameters: +
  • record : Ext.data.Record
    Th Ext.data.Record object to remove from the cache.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

removeAll

+ public function removeAll() +
+ Remove all Records from the Store and fires the clear event. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

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.
+
+ +
+

setDefaultSort

+ public function setDefaultSort(String fieldName, [String dir]) +
+ Sets the default sort column and order to be used by the next load operation. +
+ Parameters: +
  • fieldName : String
    The name of the field to sort by.
  • dir : String
    (optional) The sort order, "ASC" or "DESC" (defaults to "ASC")
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

sort

+ public function sort(String fieldName, [String dir]) +
+ Sort the Records. +If remote sorting is used, the sort is performed on the server, and the cache is +reloaded. If local sorting is used, the cache is sorted internally. +
+ Parameters: +
  • fieldName : String
    The name of the field to sort by.
  • dir : String
    (optional) The sort order, "ASC" or "DESC" (defaults to "ASC")
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Store.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

add

+ public event add +
+ Fires when Records have been added to the Store +
+ Subscribers will be called with the following parameters: +
  • this : Store
  • records : Ext.data.Record[]
    The array of Records added
  • index : Number
    The index at which the record(s) were added
+
+
+
This event is defined by Store.
+
+ +
+

beforeload

+ public event beforeload +
+ Fires before a request is made for a new data object. If the beforeload handler returns false +the load action will be canceled. +
+ Subscribers will be called with the following parameters: +
  • this : Store
  • options : Object
    The loading options that were specified (see load for details)
+
+
+
This event is defined by Store.
+
+ +
+

clear

+ public event clear +
+ Fires when the data cache has been cleared. +
+ Subscribers will be called with the following parameters: +
  • this : Store
+
+
+
This event is defined by Store.
+
+ +
+

datachanged

+ public event datachanged +
+ Fires when the data cache has changed, and a widget which is using this Store +as a Record cache should refresh its view. +
+ Subscribers will be called with the following parameters: +
  • this : Store
+
+
+
This event is defined by Store.
+
+ +
+

load

+ public event load +
+ Fires after a new set of Records has been loaded. +
+ Subscribers will be called with the following parameters: +
  • this : Store
  • records : Ext.data.Record[]
    The Records that were loaded
  • options : Object
    The loading options that were specified (see load for details)
+
+
+
This event is defined by Store.
+
+ +
+

loadexception

+ public event loadexception +
+ Fires if an exception occurs in the Proxy during loading. +Called with the signature of the Proxy's "loadexception" event. +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Store.
+
+ +
+

remove

+ public event remove +
+ Fires when Records have been removed from the Store +
+ Subscribers will be called with the following parameters: +
  • this : Store
  • record : Ext.data.Record
    The Record that was removed
  • index : Number
    The index at which the record was removed
+
+
+
This event is defined by Store.
+
+ +
+

update

+ public event update +
+ Fires when Records have been updated +
+ Subscribers will be called with the following parameters: +
  • this : Store
  • record : Ext.data.Record
    The Record that was updated
  • operation : String
    The update operation being performed. Value may be one of:
     Ext.data.Record.EDIT Ext.data.Record.REJECT Ext.data.Record.COMMIT 
+
+
+
This event is defined by Store.
+
+
+

Config Details

+
+ +
+

baseParams

+ baseParams : Object +
+ An object containing properties which are to be sent as parameters on any HTTP request
+
This config option is defined by Store.
+
+ +
+

proxy

+ proxy : Ext.data.DataProxy +
+ The Proxy object which provides access to a data object.
+
This config option is defined by Store.
+
+ +
+

reader

+ reader : Ext.data.Reader +
+ The Reader object which processes the data object and returns an Array of Ext.data.record objects which are cached keyed by their id property.
+
This config option is defined by Store.
+
+ +
+

remoteSort

+ remoteSort : boolean +
+ True if sorting is to be handled by requesting the Proxy to provide a refreshed version of the data object in sorted order, as opposed to sorting the Record cache in place (defaults to false).
+
This config option is defined by Store.
+
+ +
+

sortInfo

+ sortInfo : Object +
+ A config object in the format: {field: "fieldName", direction: "ASC|DESC"}
+
This config option is defined by Store.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.data.Tree.html b/www/extras/yui-ext/docs/output/Ext.data.Tree.html new file mode 100644 index 000000000..5c4121083 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.data.Tree.html @@ -0,0 +1,557 @@ + + + + Ext.data.Tree + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.data.Tree

+ + + + + + +
Package:Ext.data
Class:Tree
Extends:Observable
Subclasses:TreePanel
Defined In:Tree.js
+
+ Represents a tree data structure and bubbles all the events for its nodes. The nodes +in the tree have most standard DOM functionality.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 root : NodeTree
The root node for this tree
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Tree([Node root])Tree
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getNodeById(String id) : NodeTree
Gets a node in this tree by its id
 getRootNode() : NodeTree
Returns this root node for this tree
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 setRootNode(Node node) : NodeTree
Sets the root node for this tree
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 append : (Tree tree, Node parent, Node node, Number index)Tree
Fires when a new child node is appended to a node in this tree.
 beforeappend : (Tree tree, Node parent, Node node)Tree
Fires before a new child is appended to a node in this tree, return false to cancel the append.
 beforeinsert : (Tree tree, Node parent, Node node, Node refNode)Tree
Fires before a new child is inserted in a node in this tree, return false to cancel the insert.
 beforemove : (Tree tree, Node node, Node oldParent, Node newParent, Number index)Tree
Fires before a node is moved to a new location in the tree. Return false to cancel the move.
 beforeremove : (Tree tree, Node parent, Node node)Tree
Fires before a child is removed from a node in this tree, return false to cancel the remove.
 insert : (Tree tree, Node parent, Node node, Node refNode)Tree
Fires when a new child node is inserted in a node in this tree.
 move : (Tree tree, Node node, Node oldParent, Node newParent, Number index)Tree
Fires when a node is moved to a new location in the tree
 remove : (Tree tree, Node parent, Node node)Tree
Fires when a child node is removed from a node in this tree.
+

Property Details

+
+ +
+

root

+ public Node root +
+ The root node for this tree
+
This property is defined by Tree.
+
+
+ + +

Constructor Details

+
+
+

Tree

+ public function Tree([Node root]) +
+
+ Parameters: +
  • root : Node
    (optional) The root node
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

getNodeById

+ public function getNodeById(String id) +
+ Gets a node in this tree by its id +
+ Parameters: +
  • id : String
+ Returns: +
    +
  • Node
  • +
+
+
+
This method is defined by Tree.
+
+ +
+

getRootNode

+ public function getRootNode() +
+ Returns this root node for this tree +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Node
  • +
+
+
+
This method is defined by Tree.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

setRootNode

+ public function setRootNode(Node node) +
+ Sets the root node for this tree +
+ Parameters: +
  • node : Node
+ Returns: +
    +
  • Node
  • +
+
+
+
This method is defined by Tree.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

append

+ public event append +
+ Fires when a new child node is appended to a node in this tree. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • parent : Node
    The parent node
  • node : Node
    The newly appended node
  • index : Number
    The index of the newly appended node
+
+
+
This event is defined by Tree.
+
+ +
+

beforeappend

+ public event beforeappend +
+ Fires before a new child is appended to a node in this tree, return false to cancel the append. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • parent : Node
    The parent node
  • node : Node
    The child node to be appended
+
+
+
This event is defined by Tree.
+
+ +
+

beforeinsert

+ public event beforeinsert +
+ Fires before a new child is inserted in a node in this tree, return false to cancel the insert. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • parent : Node
    The parent node
  • node : Node
    The child node to be inserted
  • refNode : Node
    The child node the node is being inserted before
+
+
+
This event is defined by Tree.
+
+ +
+

beforemove

+ public event beforemove +
+ Fires before a node is moved to a new location in the tree. Return false to cancel the move. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • node : Node
    The node being moved
  • oldParent : Node
    The parent of the node
  • newParent : Node
    The new parent the node is moving to
  • index : Number
    The index it is being moved to
+
+
+
This event is defined by Tree.
+
+ +
+

beforeremove

+ public event beforeremove +
+ Fires before a child is removed from a node in this tree, return false to cancel the remove. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • parent : Node
    The parent node
  • node : Node
    The child node to be removed
+
+
+
This event is defined by Tree.
+
+ +
+

insert

+ public event insert +
+ Fires when a new child node is inserted in a node in this tree. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • parent : Node
    The parent node
  • node : Node
    The child node inserted
  • refNode : Node
    The child node the node was inserted before
+
+
+
This event is defined by Tree.
+
+ +
+

move

+ public event move +
+ Fires when a node is moved to a new location in the tree +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • node : Node
    The node moved
  • oldParent : Node
    The old parent of this node
  • newParent : Node
    The new parent of this node
  • index : Number
    The index it was moved to
+
+
+
This event is defined by Tree.
+
+ +
+

remove

+ public event remove +
+ Fires when a child node is removed from a node in this tree. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • parent : Node
    The parent node
  • node : Node
    The child node removed
+
+
+
This event is defined by Tree.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.data.XmlReader.html b/www/extras/yui-ext/docs/output/Ext.data.XmlReader.html new file mode 100644 index 000000000..6f59c288e --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.data.XmlReader.html @@ -0,0 +1,251 @@ + + + + Ext.data.XmlReader + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.data.XmlReader

+ + + + + +
Package:Ext.data
Class:XmlReader
Extends:Ext.data.DataReader
Defined In:XmlReader.js
+
+ Data reader class to create an Array of Ext.data.Record objects from an XML document +based on mappings in a provided Ext.data.Record constructor. +

+The code below lists all configuration options. +

var myReader = new Ext.data.XmlReader({
+   record: "row",           // The repeated element which contains record information
+   totalRecords: "results", // The element which contains the number of returned records (optional)
+   id: "id"                 // The element within the record that provides an ID for the record (optional)
+}, myRecordDefinition);
+

+This would consume an XML file like this: +


+<?xml?>
+<dataset>
+ <results>2</results>
+ <row>
+   <id>1</id>
+   <name>Bill</name>
+ </row>
+ <row>
+   <id>2</id>
+   <name>Ben</name>
+ </row>
+</dataset>
+
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 xmlData : XMLDocumentXmlReader
After any data loads/reads, the raw XML Document is available for further custom processing.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 XmlReader(Object meta, Mixed recordType)XmlReader
Create a new XmlReader
 read(Object response) : ObjectXmlReader
This method is only used by a DataProxy which has retrieved data from a remote server.
 readRecords(Object doc) : ObjectXmlReader
Create a data block containing Ext.data.Records from an XML document.
+ +

Public Events

+
This class has no public events.
+

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 id : StringXmlReader
The DomQuery path relative from the record element to the element that contains a record identifier value.
 record : StringXmlReader
The DomQuery path to the repeated element which contains record information.
 success : StringXmlReader
The DomQuery path to the success attribute used by forms.
 totalRecords : StringXmlReader
The DomQuery path from which to retrieve the total number of records in the dataset. This is only needed if the whole...
+

Property Details

+
+ +
+

xmlData

+ public XMLDocument xmlData +
+ After any data loads/reads, the raw XML Document is available for further custom processing.
+
This property is defined by XmlReader.
+
+
+ + +

Constructor Details

+
+
+

XmlReader

+ public function XmlReader(Object meta, Mixed recordType) +
+ Create a new XmlReader
+ Parameters: +
  • meta : Object
    Metadata configuration options
  • recordType : Mixed
    The definition of the data record type to produce. This can be either a valid Record subclass created with Ext.data.Record.create, or an array of objects with which to call Ext.data.Record.create. See the Ext.data.Record class for more details.
+
+
+
+
+ +

Method Details

+
+ +
+

read

+ public function read(Object response) +
+ This method is only used by a DataProxy which has retrieved data from a remote server. +
+ Parameters: +
  • response : Object
    The XHR object which contains the parsed XML document. The response is expected to contain a method called 'responseXML' that returns an XML document object.
+ Returns: +
    +
  • Object
    records A data block which is used by an {@link Ext.data.Store} as a cache of Ext.data.Records.
  • +
+
+
+
This method is defined by XmlReader.
+
+ +
+

readRecords

+ public function readRecords(Object doc) +
+ Create a data block containing Ext.data.Records from an XML document. +
+ Parameters: +
  • doc : Object
    A parsed XML document.
+ Returns: +
    +
  • Object
    records A data block which is used by an {@link Ext.data.Store} as a cache of Ext.data.Records.
  • +
+
+
+
This method is defined by XmlReader.
+
+
+ +

Config Details

+
+ +
+

id

+ id : String +
+ The DomQuery path relative from the record element to the element that contains a record identifier value.
+
This config option is defined by XmlReader.
+
+ +
+

record

+ record : String +
+ The DomQuery path to the repeated element which contains record information.
+
This config option is defined by XmlReader.
+
+ +
+

success

+ success : String +
+ The DomQuery path to the success attribute used by forms.
+
This config option is defined by XmlReader.
+
+ +
+

totalRecords

+ totalRecords : String +
+ The DomQuery path from which to retrieve the total number of records in the dataset. This is only needed if the whole dataset is not passed in one go, but is being paged from the remote server.
+
This config option is defined by XmlReader.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.dd.DD.html b/www/extras/yui-ext/docs/output/Ext.dd.DD.html new file mode 100644 index 000000000..c2e8980cd --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.dd.DD.html @@ -0,0 +1,1580 @@ + + + + Ext.dd.DD + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.dd.DD

+ + + + + + +
Package:Ext.dd
Class:DD
Extends:DragDrop
Subclasses:DDProxy
Defined In:DDCore.js
+
+ A DragDrop implementation where the linked element follows the +mouse cursor during a drag.
+
+ Properties +   -  Methods +   -  Events +
+ +

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 +Ext.dd.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 Ext.dd.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 +Ext.dd.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) +
+ 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.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.dd.DDProxy.html b/www/extras/yui-ext/docs/output/Ext.dd.DDProxy.html new file mode 100644 index 000000000..701f1fd11 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.dd.DDProxy.html @@ -0,0 +1,1692 @@ + + + + Ext.dd.DDProxy + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.dd.DDProxy

+ + + + + + +
Package:Ext.dd
Class:DDProxy
Extends:DD
Subclasses:DragSource
Defined In:DDCore.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.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 DDProxy.dragElId : StringDDProxy
<static> The default drag frame div id
 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 Ext.dd....
 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...
 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 +Ext.dd.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

+
+ +
+

DDProxy.dragElId

+ public String DDProxy.dragElId +
+ <static> The default drag frame div id
+
This property is defined by DDProxy.
+
+ +
+

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 Ext.dd.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.
+
+ +
+

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 Ext.dd.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 +Ext.dd.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) +
+ 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.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.dd.DDTarget.html b/www/extras/yui-ext/docs/output/Ext.dd.DDTarget.html new file mode 100644 index 000000000..b237f8981 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.dd.DDTarget.html @@ -0,0 +1,1422 @@ + + + + Ext.dd.DDTarget + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.dd.DDTarget

+ + + + + + +
Package:Ext.dd
Class:DDTarget
Extends:DragDrop
Subclasses:DropTarget
Defined In:DDCore.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.
+
+ Properties +   -  Methods +   -  Events +
+ +

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 +Ext.dd.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 Ext.dd.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 +Ext.dd.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.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.dd.DragDrop.html b/www/extras/yui-ext/docs/output/Ext.dd.DragDrop.html new file mode 100644 index 000000000..f6bc130d9 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.dd.DragDrop.html @@ -0,0 +1,1453 @@ + + + + Ext.dd.DragDrop + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.dd.DragDrop

+ + + + + + +
Package:Ext.dd
Class:DragDrop
Extends:Object
Subclasses:DD, DDTarget
Defined In:DDCore.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 and 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 the element that would be moved along +with the cursor during a drag operation. By default, this is the linked +element itself as in Ext.dd.DD. setDragElId() lets you define +a separate element that would be moved, as in Ext.dd.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 Ext.dd.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);
+}
+
+
+ Properties +   -  Methods +   -  Events +
+ +

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 +Ext.dd.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 Ext.dd.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 +Ext.dd.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.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.dd.DragDropMgr.html b/www/extras/yui-ext/docs/output/Ext.dd.DragDropMgr.html new file mode 100644 index 000000000..3d9cc3747 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.dd.DragDropMgr.html @@ -0,0 +1,1013 @@ + + + + Ext.dd.DragDropMgr + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.dd.DragDropMgr

+ + + + + +
Package:Ext.dd
Class:DragDropMgr
Extends:Object
Defined In:DDCore.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.

This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +
+ +

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...
 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) : Ext.lib.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.
+
+ +
+

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: +
    +
  • Ext.lib.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: + +Ext.dd.DragDropMgr.refreshCache(ddinstance.groups); + +Alternatively: + +Ext.dd.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.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.dd.DragSource.html b/www/extras/yui-ext/docs/output/Ext.dd.DragSource.html new file mode 100644 index 000000000..e3ed53b05 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.dd.DragSource.html @@ -0,0 +1,2104 @@ + + + + Ext.dd.DragSource + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.dd.DragSource

+ + + + + + +
Package:Ext.dd
Class:DragSource
Extends:DDProxy
Subclasses:DragZone
Defined In:DragSource.js
+
+ A simple class that provides the basic implementation needed to make any element draggable.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

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 Ext.dd....
 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...
 onStartDrag : ObjectDragSource
An empty function by default, but provided so that you can perform a custom action once the initial +drag event has be...
 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
 DragSource(String/HTMLElement/Element el, Object config)DragSource
 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...
 afterDragDrop(Ext.dd.DragDrop target, Event e, String id) : voidDragSource
An empty function by default, but provided so that you can perform a custom action +after a valid drag drop has occurr...
 afterDragEnter(Ext.dd.DragDrop target, Event e, String id) : voidDragSource
An empty function by default, but provided so that you can perform a custom action +when the dragged item enters the d...
 afterDragOut(Ext.dd.DragDrop target, Event e, String id) : voidDragSource
An empty function by default, but provided so that you can perform a custom action +after the dragged item is dragged ...
 afterDragOver(Ext.dd.DragDrop target, Event e, String id) : voidDragSource
An empty function by default, but provided so that you can perform a custom action +while the dragged item is over the...
 afterInvalidDrop(Event e, String id) : voidDragSource
An empty function by default, but provided so that you can perform a custom action +after an invalid drop has occurred...
 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...
 beforeDragDrop(Ext.dd.DragDrop target, Event e, String id) : BooleanDragSource
An empty function by default, but provided so that you can perform a custom action before the dragged +item is dropped...
 beforeDragEnter(Ext.dd.DragDrop target, Event e, String id) : BooleanDragSource
An empty function by default, but provided so that you can perform a custom action +before the dragged item enters the...
 beforeDragOut(Ext.dd.DragDrop target, Event e, String id) : BooleanDragSource
An empty function by default, but provided so that you can perform a custom action before the dragged +item is dragged...
 beforeDragOver(Ext.dd.DragDrop target, Event e, String id) : BooleanDragSource
An empty function by default, but provided so that you can perform a custom action +while the dragged item is over the...
 beforeInvalidDrop(Ext.dd.DragDrop target, Event e, String id) : BooleanDragSource
An empty function by default, but provided so that you can perform a custom action after an invalid +drop has occurred.
 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
 getDragData() : ObjectDragSource
Returns the data object associated with this drag source
 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
 getProxy() : Ext.dd.StatusProxyDragSource
Returns the drag source's underlying Ext.dd.StatusProxy
 hideProxy() : voidDragSource
Hides the drag source's Ext.dd.StatusProxy
 init(id the, String sGroup, object config) : voidDragDrop
Sets up the DragDrop object. Must be called in the constructor of any +Ext.dd.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.
 onBeforeDrag(Object data, Event e) : BooleanDragSource
An empty function by default, but provided so that you can perform a custom action before the initial +drag event begi...
 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.
+

Config Options

+ + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 dropAllowed : StringDragSource
The CSS class returned to the drag source when drop is allowed (defaults to "x-dd-drop-ok").
 dropNotAllowed : StringDragSource
The CSS class returned to the drag source when drop is not allowed (defaults to "x-dd-drop-nodrop").
+

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 Ext.dd.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.
+
+ +
+

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.
+
+ +
+

onStartDrag

+ public Object onStartDrag +
+ An empty function by default, but provided so that you can perform a custom action once the initial +drag event has begun. The drag cannot be canceled from this function.
+
This property is defined by DragSource.
+
+ +
+

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

+
+
+

DragSource

+ public function DragSource(String/HTMLElement/Element el, Object config) +
+
+ Parameters: +
  • el : String/HTMLElement/Element
    The container element
  • config : Object
+
+
+
+
+ +

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.
+
+ +
+

afterDragDrop

+ public function afterDragDrop(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action +after a valid drag drop has occurred by providing an implementation. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dropped element
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

afterDragEnter

+ public function afterDragEnter(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action +when the dragged item enters the drop target by providing an implementation. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dragged element
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

afterDragOut

+ public function afterDragOut(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action +after the dragged item is dragged out of the target without dropping. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dragged element
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

afterDragOver

+ public function afterDragOver(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action +while the dragged item is over the drop target by providing an implementation. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dragged element
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

afterInvalidDrop

+ public function afterInvalidDrop(Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action +after an invalid drop has occurred by providing an implementation. +
+ Parameters: +
  • e : Event
    The event object
  • id : String
    The id of the dropped element
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

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.
+
+ +
+

beforeDragDrop

+ public function beforeDragDrop(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action before the dragged +item is dropped onto the target and optionally cancel the onDragDrop. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dragged element
+ Returns: +
    +
  • Boolean
    isValid True if the drag drop event is valid, else false to cancel
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

beforeDragEnter

+ public function beforeDragEnter(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action +before the dragged item enters the drop target and optionally cancel the onDragEnter. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dragged element
+ Returns: +
    +
  • Boolean
    isValid True if the drag event is valid, else false to cancel
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

beforeDragOut

+ public function beforeDragOut(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action before the dragged +item is dragged out of the target without dropping, and optionally cancel the onDragOut. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dragged element
+ Returns: +
    +
  • Boolean
    isValid True if the drag event is valid, else false to cancel
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

beforeDragOver

+ public function beforeDragOver(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action +while the dragged item is over the drop target and optionally cancel the onDragOver. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dragged element
+ Returns: +
    +
  • Boolean
    isValid True if the drag event is valid, else false to cancel
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

beforeInvalidDrop

+ public function beforeInvalidDrop(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action after an invalid +drop has occurred. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dragged element
+ Returns: +
    +
  • Boolean
    isValid True if the invalid drop should proceed, else false to cancel
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

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.
+
+ +
+

getDragData

+ public function getDragData() +
+ Returns the data object associated with this drag source +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Object
    data An object containing arbitrary data
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

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 Ext.dd.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.
+
+ +
+

getProxy

+ public function getProxy() +
+ Returns the drag source's underlying Ext.dd.StatusProxy +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.dd.StatusProxy
    proxy The StatusProxy
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

hideProxy

+ public function hideProxy() +
+ Hides the drag source's Ext.dd.StatusProxy +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

init

+ public function init(id the, String sGroup, object config) +
+ Sets up the DragDrop object. Must be called in the constructor of any +Ext.dd.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.
+
+ +
+

onBeforeDrag

+ public function onBeforeDrag(Object data, Event e) +
+ An empty function by default, but provided so that you can perform a custom action before the initial +drag event begins and optionally cancel it. +
+ Parameters: +
  • data : Object
    An object containing arbitrary data to be shared with drop targets
  • e : Event
    The event object
+ Returns: +
    +
  • Boolean
    isValid True if the drag event is valid, else false to cancel
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

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) +
+ 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.
+
+
+ +

Config Details

+
+ +
+

dropAllowed

+ dropAllowed : String +
+ The CSS class returned to the drag source when drop is allowed (defaults to "x-dd-drop-ok").
+
This config option is defined by DragSource.
+
+ +
+

dropNotAllowed

+ dropNotAllowed : String +
+ The CSS class returned to the drag source when drop is not allowed (defaults to "x-dd-drop-nodrop").
+
This config option is defined by DragSource.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.dd.DragZone.html b/www/extras/yui-ext/docs/output/Ext.dd.DragZone.html new file mode 100644 index 000000000..392c2a272 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.dd.DragZone.html @@ -0,0 +1,2221 @@ + + + + Ext.dd.DragZone + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.dd.DragZone

+ + + + + +
Package:Ext.dd
Class:DragZone
Extends:DragSource
Defined In:DragZone.js
+
+ This class provides a container DD instance that proxies for multiple child node sources.
+By default, this class requires that draggable child nodes are registered with Ext.dd.Registry.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

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 Ext.dd....
 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...
 onStartDrag : ObjectDragSource
An empty function by default, but provided so that you can perform a custom action once the initial +drag event has be...
 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
 DragZone(String/HTMLElement/Element el, Object config)DragZone
 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...
 afterDragDrop(Ext.dd.DragDrop target, Event e, String id) : voidDragSource
An empty function by default, but provided so that you can perform a custom action +after a valid drag drop has occurr...
 afterDragEnter(Ext.dd.DragDrop target, Event e, String id) : voidDragSource
An empty function by default, but provided so that you can perform a custom action +when the dragged item enters the d...
 afterDragOut(Ext.dd.DragDrop target, Event e, String id) : voidDragSource
An empty function by default, but provided so that you can perform a custom action +after the dragged item is dragged ...
 afterDragOver(Ext.dd.DragDrop target, Event e, String id) : voidDragSource
An empty function by default, but provided so that you can perform a custom action +while the dragged item is over the...
 afterInvalidDrop(Event e, String id) : voidDragSource
An empty function by default, but provided so that you can perform a custom action +after an invalid drop has occurred...
 afterRepair() : voidDragZone
Called after a repair of an invalid drop. By default, highlights this.dragData.ddel
 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...
 beforeDragDrop(Ext.dd.DragDrop target, Event e, String id) : BooleanDragSource
An empty function by default, but provided so that you can perform a custom action before the dragged +item is dropped...
 beforeDragEnter(Ext.dd.DragDrop target, Event e, String id) : BooleanDragSource
An empty function by default, but provided so that you can perform a custom action +before the dragged item enters the...
 beforeDragOut(Ext.dd.DragDrop target, Event e, String id) : BooleanDragSource
An empty function by default, but provided so that you can perform a custom action before the dragged +item is dragged...
 beforeDragOver(Ext.dd.DragDrop target, Event e, String id) : BooleanDragSource
An empty function by default, but provided so that you can perform a custom action +while the dragged item is over the...
 beforeInvalidDrop(Ext.dd.DragDrop target, Event e, String id) : BooleanDragSource
An empty function by default, but provided so that you can perform a custom action after an invalid +drop has occurred.
 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
 getDragData(EventObject e) : ObjectDragZone
* +Called when a mousedown occurs in this container. Looks in Ext.dd.Registry +for a valid target to drag based on the ...
 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
 getProxy() : Ext.dd.StatusProxyDragSource
Returns the drag source's underlying Ext.dd.StatusProxy
 getRepairXY(EventObject e) : ArrayDragZone
Called before a repair of an invalid drop to get the XY to animate to. By default returns +the XY of this.dragData.ddel
 hideProxy() : voidDragSource
Hides the drag source's Ext.dd.StatusProxy
 init(id the, String sGroup, object config) : voidDragDrop
Sets up the DragDrop object. Must be called in the constructor of any +Ext.dd.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.
 onBeforeDrag(Object data, Event e) : BooleanDragSource
An empty function by default, but provided so that you can perform a custom action before the initial +drag event begi...
 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
 onInitDrag(Number x, Number y) : BooleanDragZone
Called once drag threshold has been reached to initialize the proxy element. By default, it clones the +this.dragData....
 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.
+

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 containerScroll : BooleanDragZone
True to register this container with the Scrollmanager for auto scrolling during drag operations.
 dropAllowed : StringDragSource
The CSS class returned to the drag source when drop is allowed (defaults to "x-dd-drop-ok").
 dropNotAllowed : StringDragSource
The CSS class returned to the drag source when drop is not allowed (defaults to "x-dd-drop-nodrop").
 hlColor : StringDragZone
The color to use when visually highlighting the drag source in the afterRepair method after a failed drop (defaults t...
+

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 Ext.dd.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.
+
+ +
+

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.
+
+ +
+

onStartDrag

+ public Object onStartDrag +
+ An empty function by default, but provided so that you can perform a custom action once the initial +drag event has begun. The drag cannot be canceled from this function.
+
This property is defined by DragSource.
+
+ +
+

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

+
+
+

DragZone

+ public function DragZone(String/HTMLElement/Element el, Object config) +
+
+ Parameters: +
  • el : String/HTMLElement/Element
    The container element
  • config : Object
+
+
+
+
+ +

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.
+
+ +
+

afterDragDrop

+ public function afterDragDrop(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action +after a valid drag drop has occurred by providing an implementation. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dropped element
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

afterDragEnter

+ public function afterDragEnter(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action +when the dragged item enters the drop target by providing an implementation. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dragged element
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

afterDragOut

+ public function afterDragOut(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action +after the dragged item is dragged out of the target without dropping. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dragged element
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

afterDragOver

+ public function afterDragOver(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action +while the dragged item is over the drop target by providing an implementation. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dragged element
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

afterInvalidDrop

+ public function afterInvalidDrop(Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action +after an invalid drop has occurred by providing an implementation. +
+ Parameters: +
  • e : Event
    The event object
  • id : String
    The id of the dropped element
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

afterRepair

+ public function afterRepair() +
+ Called after a repair of an invalid drop. By default, highlights this.dragData.ddel +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragZone.
+
+ +
+

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.
+
+ +
+

beforeDragDrop

+ public function beforeDragDrop(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action before the dragged +item is dropped onto the target and optionally cancel the onDragDrop. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dragged element
+ Returns: +
    +
  • Boolean
    isValid True if the drag drop event is valid, else false to cancel
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

beforeDragEnter

+ public function beforeDragEnter(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action +before the dragged item enters the drop target and optionally cancel the onDragEnter. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dragged element
+ Returns: +
    +
  • Boolean
    isValid True if the drag event is valid, else false to cancel
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

beforeDragOut

+ public function beforeDragOut(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action before the dragged +item is dragged out of the target without dropping, and optionally cancel the onDragOut. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dragged element
+ Returns: +
    +
  • Boolean
    isValid True if the drag event is valid, else false to cancel
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

beforeDragOver

+ public function beforeDragOver(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action +while the dragged item is over the drop target and optionally cancel the onDragOver. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dragged element
+ Returns: +
    +
  • Boolean
    isValid True if the drag event is valid, else false to cancel
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

beforeInvalidDrop

+ public function beforeInvalidDrop(Ext.dd.DragDrop target, Event e, String id) +
+ An empty function by default, but provided so that you can perform a custom action after an invalid +drop has occurred. +
+ Parameters: +
  • target : Ext.dd.DragDrop
    The drop target
  • e : Event
    The event object
  • id : String
    The id of the dragged element
+ Returns: +
    +
  • Boolean
    isValid True if the invalid drop should proceed, else false to cancel
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

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.
+
+ +
+

getDragData

+ public function getDragData(EventObject e) +
+ * +Called when a mousedown occurs in this container. Looks in Ext.dd.Registry +for a valid target to drag based on the mouse down. Override this method +to provide your own lookup logic (e.g. finding a child by class name). Make sure your returned +object has a "ddel" attribute (with an HTML Element) for other functions to work. +
+ Parameters: +
  • e : EventObject
    The mouse down event
+ Returns: +
    +
  • Object
    The dragData
  • +
+
+
+
This method is defined by DragZone.
+
+ +
+

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 Ext.dd.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.
+
+ +
+

getProxy

+ public function getProxy() +
+ Returns the drag source's underlying Ext.dd.StatusProxy +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.dd.StatusProxy
    proxy The StatusProxy
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

getRepairXY

+ public function getRepairXY(EventObject e) +
+ Called before a repair of an invalid drop to get the XY to animate to. By default returns +the XY of this.dragData.ddel +
+ Parameters: +
  • e : EventObject
    The mouse up event
+ Returns: +
    +
  • Array
    The xy location (e.g. [100, 200])
  • +
+
+
+
This method is defined by DragZone.
+
+ +
+

hideProxy

+ public function hideProxy() +
+ Hides the drag source's Ext.dd.StatusProxy +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

init

+ public function init(id the, String sGroup, object config) +
+ Sets up the DragDrop object. Must be called in the constructor of any +Ext.dd.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.
+
+ +
+

onBeforeDrag

+ public function onBeforeDrag(Object data, Event e) +
+ An empty function by default, but provided so that you can perform a custom action before the initial +drag event begins and optionally cancel it. +
+ Parameters: +
  • data : Object
    An object containing arbitrary data to be shared with drop targets
  • e : Event
    The event object
+ Returns: +
    +
  • Boolean
    isValid True if the drag event is valid, else false to cancel
  • +
+
+
+
This method is defined by DragSource.
+
+ +
+

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.
+
+ +
+

onInitDrag

+ public function onInitDrag(Number x, Number y) +
+ Called once drag threshold has been reached to initialize the proxy element. By default, it clones the +this.dragData.ddel +
+ Parameters: +
  • x : Number
    The x position of the click on the dragged object
  • y : Number
    The y position of the click on the dragged object
+ Returns: +
    +
  • Boolean
    true to continue the drag, false to cancel
  • +
+
+
+
This method is defined by DragZone.
+
+ +
+

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) +
+ 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.
+
+
+ +

Config Details

+
+ +
+

containerScroll

+ containerScroll : Boolean +
+ True to register this container with the Scrollmanager for auto scrolling during drag operations.
+
This config option is defined by DragZone.
+
+ +
+

dropAllowed

+ dropAllowed : String +
+ The CSS class returned to the drag source when drop is allowed (defaults to "x-dd-drop-ok").
+
This config option is defined by DragSource.
+
+ +
+

dropNotAllowed

+ dropNotAllowed : String +
+ The CSS class returned to the drag source when drop is not allowed (defaults to "x-dd-drop-nodrop").
+
This config option is defined by DragSource.
+
+ +
+

hlColor

+ hlColor : String +
+ The color to use when visually highlighting the drag source in the afterRepair method after a failed drop (defaults to "c3daf9" - light blue)
+
This config option is defined by DragZone.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.dd.DropTarget.html b/www/extras/yui-ext/docs/output/Ext.dd.DropTarget.html new file mode 100644 index 000000000..e0a46f9cd --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.dd.DropTarget.html @@ -0,0 +1,1593 @@ + + + + Ext.dd.DropTarget + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.dd.DropTarget

+ + + + + + +
Package:Ext.dd
Class:DropTarget
Extends:DDTarget
Subclasses:DropZone
Defined In:DropTarget.js
+
+ A simple class that provides the basic implementation needed to make any element a drop target that can have +draggable items dropped onto it. The drop has no effect until an implementation of notifyDrop is provided.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

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
 DropTarget(String/HTMLElement/Element el, Object config)DropTarget
 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 +Ext.dd.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
 notifyDrop(Ext.dd.DragSource source, Event e, Object data) : BooleanDropTarget
The function a Ext.dd.DragSource calls once to notify this drop target that the dragged item has +been dropped on it. ...
 notifyEnter(Ext.dd.DragSource source, Event e, Object data) : StringDropTarget
The function a Ext.dd.DragSource calls once to notify this drop target that the source is now over the +target. This ...
 notifyOut(Ext.dd.DragSource source, Event e, Object data) : voidDropTarget
The function a Ext.dd.DragSource calls once to notify this drop target that the source has been dragged +out of the ta...
 notifyOver(Ext.dd.DragSource source, Event e, Object data) : StringDropTarget
The function a Ext.dd.DragSource calls continuously while it is being dragged over the target. +This method will be ca...
 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.
+

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 dropAllowed : StringDropTarget
The CSS class returned to the drag source when drop is allowed (defaults to "x-dd-drop-ok").
 dropNotAllowed : StringDropTarget
The CSS class returned to the drag source when drop is not allowed (defaults to "x-dd-drop-nodrop").
 overClass : StringDropTarget
The CSS class applied to the drop target element while the drag source is over it (defaults to "").
+

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

+
+
+

DropTarget

+ public function DropTarget(String/HTMLElement/Element el, Object config) +
+
+ Parameters: +
  • el : String/HTMLElement/Element
    The container element
  • config : Object
+
+
+
+
+ +

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 Ext.dd.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 +Ext.dd.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.
+
+ +
+

notifyDrop

+ public function notifyDrop(Ext.dd.DragSource source, Event e, Object data) +
+ The function a Ext.dd.DragSource calls once to notify this drop target that the dragged item has +been dropped on it. This method has no default implementation and returns false, so you must provide an +implementation that does something to process the drop event and returns true so that the drag source's +repair action does not run. +
+ Parameters: +
  • source : Ext.dd.DragSource
    The drag source that was dragged over this drop target
  • e : Event
    The event
  • data : Object
    An object containing arbitrary data supplied by the drag source
+ Returns: +
    +
  • Boolean
    True if the drop was valid, else false
  • +
+
+
+
This method is defined by DropTarget.
+
+ +
+

notifyEnter

+ public function notifyEnter(Ext.dd.DragSource source, Event e, Object data) +
+ The function a Ext.dd.DragSource calls once to notify this drop target that the source is now over the +target. This default implementation adds the CSS class specified by overClass (if any) to the drop element +and returns the dropAllowed config value. This method should be overridden if drop validation is required. +
+ Parameters: +
  • source : Ext.dd.DragSource
    The drag source that was dragged over this drop target
  • e : Event
    The event
  • data : Object
    An object containing arbitrary data supplied by the drag source
+ Returns: +
    +
  • String
    status The CSS class that communicates the drop status back to the source so that the underlying {@link Ext.dd.StatusProxy} can be updated
  • +
+
+
+
This method is defined by DropTarget.
+
+ +
+

notifyOut

+ public function notifyOut(Ext.dd.DragSource source, Event e, Object data) +
+ The function a Ext.dd.DragSource calls once to notify this drop target that the source has been dragged +out of the target without dropping. This default implementation simply removes the CSS class specified by +overClass (if any) from the drop element. +
+ Parameters: +
  • source : Ext.dd.DragSource
    The drag source that was dragged over this drop target
  • e : Event
    The event
  • data : Object
    An object containing arbitrary data supplied by the drag source
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DropTarget.
+
+ +
+

notifyOver

+ public function notifyOver(Ext.dd.DragSource source, Event e, Object data) +
+ The function a Ext.dd.DragSource calls continuously while it is being dragged over the target. +This method will be called on every mouse movement while the drag source is over the drop target. +This default implementation simply returns the dropAllowed config value. +
+ Parameters: +
  • source : Ext.dd.DragSource
    The drag source that was dragged over this drop target
  • e : Event
    The event
  • data : Object
    An object containing arbitrary data supplied by the drag source
+ Returns: +
    +
  • String
    status The CSS class that communicates the drop status back to the source so that the underlying {@link Ext.dd.StatusProxy} can be updated
  • +
+
+
+
This method is defined by DropTarget.
+
+ +
+

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.
+
+
+ +

Config Details

+
+ +
+

dropAllowed

+ dropAllowed : String +
+ The CSS class returned to the drag source when drop is allowed (defaults to "x-dd-drop-ok").
+
This config option is defined by DropTarget.
+
+ +
+

dropNotAllowed

+ dropNotAllowed : String +
+ The CSS class returned to the drag source when drop is not allowed (defaults to "x-dd-drop-nodrop").
+
This config option is defined by DropTarget.
+
+ +
+

overClass

+ overClass : String +
+ The CSS class applied to the drop target element while the drag source is over it (defaults to "").
+
This config option is defined by DropTarget.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.dd.DropZone.html b/www/extras/yui-ext/docs/output/Ext.dd.DropZone.html new file mode 100644 index 000000000..7afcc963b --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.dd.DropZone.html @@ -0,0 +1,1793 @@ + + + + Ext.dd.DropZone + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.dd.DropZone

+ + + + + +
Package:Ext.dd
Class:DropZone
Extends:DropTarget
Defined In:DropZone.js
+
+ This class provides a container DD instance that proxies for multiple child node targets.
+By default, this class requires that child nodes accepting drop are registered with Ext.dd.Registry.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

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
 DropZone(String/HTMLElement/Element el, Object config)DropZone
 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
 getTargetFromEvent(Event e) : ObjectDropZone
Returns a custom data object associated with the DOM node that is the target of the event. By default +this looks up ...
 init(id the, String sGroup, object config) : voidDragDrop
Sets up the DragDrop object. Must be called in the constructor of any +Ext.dd.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
 notifyDrop(Ext.dd.DragSource source, Event e, Object data) : BooleanDropZone
The function a Ext.dd.DragSource calls once to notify this drop zone that the dragged item has +been dropped on it. T...
 notifyEnter(Ext.dd.DragSource source, Event e, Object data) : StringDropZone
The function a Ext.dd.DragSource calls once to notify this drop zone that the source is now over +the zone. The defau...
 notifyOut(Ext.dd.DragSource source, Event e, Object data) : voidDropZone
The function a Ext.dd.DragSource calls once to notify this drop zone that the source has been dragged +out of the zone...
 notifyOver(Ext.dd.DragSource source, Event e, Object data) : StringDropZone
The function a Ext.dd.DragSource calls continuously while it is being dragged over the drop zone. +This method will be...
 onAvailable() : voidDragDrop
Override the onAvailable method to do what is needed after the initial +position was determined.
 onContainerDrop(Ext.dd.DragSource source, Event e, Object data) : BooleanDropZone
Called internally when the DropZone determines that a Ext.dd.DragSource has been dropped on it, +but not on any of its...
 onContainerOver(Ext.dd.DragSource source, Event e, Object data) : StringDropZone
Called internally while the DropZone determines that a Ext.dd.DragSource is being dragged over it, +but not over any o...
 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
 onNodeDrop(Object nodeData, Ext.dd.DragSource source, Event e, Object data) : BooleanDropZone
Called internally when the DropZone determines that a Ext.dd.DragSource has been dropped onto +the drop node. The def...
 onNodeEnter(Object nodeData, Ext.dd.DragSource source, Event e, Object data) : voidDropZone
Called internally when the DropZone determines that a Ext.dd.DragSource has entered a drop node +that it has registere...
 onNodeOut(Object nodeData, Ext.dd.DragSource source, Event e, Object data) : voidDropZone
Called internally when the DropZone determines that a Ext.dd.DragSource has been dragged out of +the drop node without...
 onNodeOver(Object nodeData, Ext.dd.DragSource source, Event e, Object data) : StringDropZone
Called internally while the DropZone determines that a Ext.dd.DragSource is over a drop node +that it has registered. ...
 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.
+

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 dropAllowed : StringDropTarget
The CSS class returned to the drag source when drop is allowed (defaults to "x-dd-drop-ok").
 dropNotAllowed : StringDropTarget
The CSS class returned to the drag source when drop is not allowed (defaults to "x-dd-drop-nodrop").
 overClass : StringDropTarget
The CSS class applied to the drop target element while the drag source is over it (defaults to "").
+

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

+
+
+

DropZone

+ public function DropZone(String/HTMLElement/Element el, Object config) +
+
+ Parameters: +
  • el : String/HTMLElement/Element
    The container element
  • config : Object
+
+
+
+
+ +

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 Ext.dd.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.
+
+ +
+

getTargetFromEvent

+ public function getTargetFromEvent(Event e) +
+ Returns a custom data object associated with the DOM node that is the target of the event. By default +this looks up the event target in the Ext.dd.Registry, although you can override this method to +provide your own custom lookup. +
+ Parameters: +
  • e : Event
    The event
+ Returns: +
    +
  • Object
    data The custom data
  • +
+
+
+
This method is defined by DropZone.
+
+ +
+

init

+ public function init(id the, String sGroup, object config) +
+ Sets up the DragDrop object. Must be called in the constructor of any +Ext.dd.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.
+
+ +
+

notifyDrop

+ public function notifyDrop(Ext.dd.DragSource source, Event e, Object data) +
+ The function a Ext.dd.DragSource calls once to notify this drop zone that the dragged item has +been dropped on it. The drag zone will look up the target node based on the event passed in, and if there +is a node registered for that event, it will delegate to onNodeDrop for node-specific handling, +otherwise it will call onContainerDrop. +
+ Parameters: +
  • source : Ext.dd.DragSource
    The drag source that was dragged over this drop zone
  • e : Event
    The event
  • data : Object
    An object containing arbitrary data supplied by the drag source
+ Returns: +
    +
  • Boolean
    True if the drop was valid, else false
  • +
+
+
+
This method is defined by DropZone.
+
+ +
+

notifyEnter

+ public function notifyEnter(Ext.dd.DragSource source, Event e, Object data) +
+ The function a Ext.dd.DragSource calls once to notify this drop zone that the source is now over +the zone. The default implementation returns this.dropNotAllowed and expects that only registered drop +nodes can process drag drop operations, so if you need the drop zone itself to be able to process drops +you should override this method and provide a custom implementation. +
+ Parameters: +
  • source : Ext.dd.DragSource
    The drag source that was dragged over this drop zone
  • e : Event
    The event
  • data : Object
    An object containing arbitrary data supplied by the drag source
+ Returns: +
    +
  • String
    status The CSS class that communicates the drop status back to the source so that the underlying {@link Ext.dd.StatusProxy} can be updated
  • +
+
+
+
This method is defined by DropZone.
+
+ +
+

notifyOut

+ public function notifyOut(Ext.dd.DragSource source, Event e, Object data) +
+ The function a Ext.dd.DragSource calls once to notify this drop zone that the source has been dragged +out of the zone without dropping. If the drag source is currently over a registered node, the notification +will be delegated to onNodeOut for node-specific handling, otherwise it will be ignored. +
+ Parameters: +
  • source : Ext.dd.DragSource
    The drag source that was dragged over this drop target
  • e : Event
    The event
  • data : Object
    An object containing arbitrary data supplied by the drag zone
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DropZone.
+
+ +
+

notifyOver

+ public function notifyOver(Ext.dd.DragSource source, Event e, Object data) +
+ The function a Ext.dd.DragSource calls continuously while it is being dragged over the drop zone. +This method will be called on every mouse movement while the drag source is over the drop zone. +It will call onNodeOver while the drag source is over a registered node, and will also automatically +delegate to the appropriate node-specific methods as necessary when the drag source enters and exits +registered nodes (onNodeEnter, onNodeOut). If the drag source is not currently over a +registered node, it will call onContainerOver. +
+ Parameters: +
  • source : Ext.dd.DragSource
    The drag source that was dragged over this drop zone
  • e : Event
    The event
  • data : Object
    An object containing arbitrary data supplied by the drag source
+ Returns: +
    +
  • String
    status The CSS class that communicates the drop status back to the source so that the underlying {@link Ext.dd.StatusProxy} can be updated
  • +
+
+
+
This method is defined by DropZone.
+
+ +
+

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.
+
+ +
+

onContainerDrop

+ public function onContainerDrop(Ext.dd.DragSource source, Event e, Object data) +
+ Called internally when the DropZone determines that a Ext.dd.DragSource has been dropped on it, +but not on any of its registered drop nodes. The default implementation returns false, so it should be +overridden to provide the appropriate processing of the drop event if you need the drop zone itself to +be able to accept drops. It should return true when valid so that the drag source's repair action does not run. +
+ Parameters: +
  • source : Ext.dd.DragSource
    The drag source that was dragged over this drop zone
  • e : Event
    The event
  • data : Object
    An object containing arbitrary data supplied by the drag source
+ Returns: +
    +
  • Boolean
    True if the drop was valid, else false
  • +
+
+
+
This method is defined by DropZone.
+
+ +
+

onContainerOver

+ public function onContainerOver(Ext.dd.DragSource source, Event e, Object data) +
+ Called internally while the DropZone determines that a Ext.dd.DragSource is being dragged over it, +but not over any of its registered drop nodes. The default implementation returns this.dropNotAllowed, so +it should be overridden to provide the proper feedback if necessary. +
+ Parameters: +
  • source : Ext.dd.DragSource
    The drag source that was dragged over this drop zone
  • e : Event
    The event
  • data : Object
    An object containing arbitrary data supplied by the drag source
+ Returns: +
    +
  • String
    status The CSS class that communicates the drop status back to the source so that the underlying {@link Ext.dd.StatusProxy} can be updated
  • +
+
+
+
This method is defined by DropZone.
+
+ +
+

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.
+
+ +
+

onNodeDrop

+ public function onNodeDrop(Object nodeData, Ext.dd.DragSource source, Event e, Object data) +
+ Called internally when the DropZone determines that a Ext.dd.DragSource has been dropped onto +the drop node. The default implementation returns false, so it should be overridden to provide the +appropriate processing of the drop event and return true so that the drag source's repair action does not run. +
+ Parameters: +
  • nodeData : Object
    The custom data associated with the drop node (this is the same value returned from getTargetFromEvent for this node)
  • source : Ext.dd.DragSource
    The drag source that was dragged over this drop zone
  • e : Event
    The event
  • data : Object
    An object containing arbitrary data supplied by the drag source
+ Returns: +
    +
  • Boolean
    True if the drop was valid, else false
  • +
+
+
+
This method is defined by DropZone.
+
+ +
+

onNodeEnter

+ public function onNodeEnter(Object nodeData, Ext.dd.DragSource source, Event e, Object data) +
+ Called internally when the DropZone determines that a Ext.dd.DragSource has entered a drop node +that it has registered. This method has no default implementation and should be overridden to provide +node-specific processing if necessary. +
+ Parameters: +
  • nodeData : Object
    The custom data associated with the drop node (this is the same value returned from getTargetFromEvent for this node)
  • source : Ext.dd.DragSource
    The drag source that was dragged over this drop zone
  • e : Event
    The event
  • data : Object
    An object containing arbitrary data supplied by the drag source
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DropZone.
+
+ +
+

onNodeOut

+ public function onNodeOut(Object nodeData, Ext.dd.DragSource source, Event e, Object data) +
+ Called internally when the DropZone determines that a Ext.dd.DragSource has been dragged out of +the drop node without dropping. This method has no default implementation and should be overridden to provide +node-specific processing if necessary. +
+ Parameters: +
  • nodeData : Object
    The custom data associated with the drop node (this is the same value returned from getTargetFromEvent for this node)
  • source : Ext.dd.DragSource
    The drag source that was dragged over this drop zone
  • e : Event
    The event
  • data : Object
    An object containing arbitrary data supplied by the drag source
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DropZone.
+
+ +
+

onNodeOver

+ public function onNodeOver(Object nodeData, Ext.dd.DragSource source, Event e, Object data) +
+ Called internally while the DropZone determines that a Ext.dd.DragSource is over a drop node +that it has registered. The default implementation returns this.dropNotAllowed, so it should be +overridden to provide the proper feedback. +
+ Parameters: +
  • nodeData : Object
    The custom data associated with the drop node (this is the same value returned from getTargetFromEvent for this node)
  • source : Ext.dd.DragSource
    The drag source that was dragged over this drop zone
  • e : Event
    The event
  • data : Object
    An object containing arbitrary data supplied by the drag source
+ Returns: +
    +
  • String
    status The CSS class that communicates the drop status back to the source so that the underlying {@link Ext.dd.StatusProxy} can be updated
  • +
+
+
+
This method is defined by DropZone.
+
+ +
+

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.
+
+
+ +

Config Details

+
+ +
+

dropAllowed

+ dropAllowed : String +
+ The CSS class returned to the drag source when drop is allowed (defaults to "x-dd-drop-ok").
+
This config option is defined by DropTarget.
+
+ +
+

dropNotAllowed

+ dropNotAllowed : String +
+ The CSS class returned to the drag source when drop is not allowed (defaults to "x-dd-drop-nodrop").
+
This config option is defined by DropTarget.
+
+ +
+

overClass

+ overClass : String +
+ The CSS class applied to the drop target element while the drag source is over it (defaults to "").
+
This config option is defined by DropTarget.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.dd.Registry.html b/www/extras/yui-ext/docs/output/Ext.dd.Registry.html new file mode 100644 index 000000000..6ee28835b --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.dd.Registry.html @@ -0,0 +1,205 @@ + + + + Ext.dd.Registry + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.dd.Registry

+ + + + + +
Package:Ext.dd
Class:Registry
Extends:Object
Defined In:Registry.js
+
+ Provides easy access to all drag drop components that are registered on a page. Items can be retrieved either +directly by DOM node id, or by passing in the drag drop event that occurred and looking up the event target.

This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 getHandle(String/HTMLElement id) : ObjectRegistry
Returns the handle registered for a DOM Node by id
 getHandleFromEvent(Event e) : ObjectRegistry
Returns the handle that is registered for the DOM node that is the target of the event
 getTarget(String/HTMLElement id) : ObjectRegistry
Returns a custom data object that is registered for a DOM node by id
 getTargetFromEvent(Event e) : ObjectRegistry
Returns a custom data object that is registered for the DOM node that is the target of the event
 register(String/HTMLElement) element, [Object data]) : voidRegistry
Resgister a drag drop element
 unregister(String/HTMLElement) element) : voidRegistry
Unregister a drag drop element
+ +

Public Events

+
This class has no public events.
+ +

Method Details

+
+ +
+

getHandle

+ public function getHandle(String/HTMLElement id) +
+ Returns the handle registered for a DOM Node by id +
+ Parameters: +
  • id : String/HTMLElement
    The DOM node or id to look up
+ Returns: +
    +
  • Object
    handle The custom handle data
  • +
+
+
+
This method is defined by Registry.
+
+ +
+

getHandleFromEvent

+ public function getHandleFromEvent(Event e) +
+ Returns the handle that is registered for the DOM node that is the target of the event +
+ Parameters: +
  • e : Event
    The event
+ Returns: +
    +
  • Object
    handle The custom handle data
  • +
+
+
+
This method is defined by Registry.
+
+ +
+

getTarget

+ public function getTarget(String/HTMLElement id) +
+ Returns a custom data object that is registered for a DOM node by id +
+ Parameters: +
  • id : String/HTMLElement
    The DOM node or id to look up
+ Returns: +
    +
  • Object
    data The custom data
  • +
+
+
+
This method is defined by Registry.
+
+ +
+

getTargetFromEvent

+ public function getTargetFromEvent(Event e) +
+ Returns a custom data object that is registered for the DOM node that is the target of the event +
+ Parameters: +
  • e : Event
    The event
+ Returns: +
    +
  • Object
    data The custom data
  • +
+
+
+
This method is defined by Registry.
+
+ +
+

register

+ public function register(String/HTMLElement) element, [Object data]) +
+ Resgister a drag drop element +
+ Parameters: +
  • element : String/HTMLElement)
    The id or DOM node to register
  • data : Object
    (optional) An custom data object that will be passed between the elements that are involved in drag drop operations. You can populate this object with any arbitrary properties that your own code knows how to interpret, plus there are some specific properties known to the Registry that should be populated in the data object (if applicable):
     Value Description
    --------- ------------------------------------------
    handles Array of DOM nodes that trigger dragging
    for the element being registered
    isHandle True if the element passed in triggers
    dragging itself, else false
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Registry.
+
+ +
+

unregister

+ public function unregister(String/HTMLElement) element) +
+ Unregister a drag drop element +
+ Parameters: +
  • element : String/HTMLElement)
    The id or DOM node to unregister
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Registry.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.dd.ScrollManager.html b/www/extras/yui-ext/docs/output/Ext.dd.ScrollManager.html new file mode 100644 index 000000000..2c2071c93 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.dd.ScrollManager.html @@ -0,0 +1,223 @@ + + + + Ext.dd.ScrollManager + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.dd.ScrollManager

+ + + + + +
Package:Ext.dd
Class:ScrollManager
Extends:Object
Defined In:ScrollManager.js
+
+ Provides automatic scrolling of overflow regions in the page during drag operations.

+Note: This class uses "Point Mode" and is untested in "Intersect Mode".

This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 animDuration : NumberScrollManager
The animation duration in seconds - +MUST BE less than Ext.dd.ScrollManager.frequency! (defaults to .4)
 animate : BooleanScrollManager
True to animate the scroll (defaults to true)
 frequency : NumberScrollManager
The frequency of scrolls in milliseconds (defaults to 500)
 increment : NumberScrollManager
The number of pixels to scroll in each scroll increment (defaults to 50)
 thresh : NumberScrollManager
The number of pixels from the edge of a container the pointer needs to be to +trigger scrolling (defaults to 25)
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 refreshCache() : voidScrollManager
Manually trigger a cache refresh.
 register(String/HTMLElement/Element/Array el) : voidScrollManager
Registers new overflow element(s) to auto scroll
 unregister(String/HTMLElement/Element/Array el) : voidScrollManager
Unregisters overflow element(s) so they are no longer scrolled
+ +

Public Events

+
This class has no public events.

Property Details

+
+ +
+

animDuration

+ public Number animDuration +
+ The animation duration in seconds - +MUST BE less than Ext.dd.ScrollManager.frequency! (defaults to .4)
+
This property is defined by ScrollManager.
+
+ +
+

animate

+ public Boolean animate +
+ True to animate the scroll (defaults to true)
+
This property is defined by ScrollManager.
+
+ +
+

frequency

+ public Number frequency +
+ The frequency of scrolls in milliseconds (defaults to 500)
+
This property is defined by ScrollManager.
+
+ +
+

increment

+ public Number increment +
+ The number of pixels to scroll in each scroll increment (defaults to 50)
+
This property is defined by ScrollManager.
+
+ +
+

thresh

+ public Number thresh +
+ The number of pixels from the edge of a container the pointer needs to be to +trigger scrolling (defaults to 25)
+
This property is defined by ScrollManager.
+
+
+ + +

Method Details

+
+ +
+

refreshCache

+ public function refreshCache() +
+ Manually trigger a cache refresh. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ScrollManager.
+
+ +
+

register

+ public function register(String/HTMLElement/Element/Array el) +
+ Registers new overflow element(s) to auto scroll +
+ Parameters: +
  • el : String/HTMLElement/Element/Array
    The id of or the element to be scrolled or an array of either
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ScrollManager.
+
+ +
+

unregister

+ public function unregister(String/HTMLElement/Element/Array el) +
+ Unregisters overflow element(s) so they are no longer scrolled +
+ Parameters: +
  • el : String/HTMLElement/Element/Array
    The id of or the element to be removed or an array of either
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ScrollManager.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.dd.StatusProxy.html b/www/extras/yui-ext/docs/output/Ext.dd.StatusProxy.html new file mode 100644 index 000000000..c9840588b --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.dd.StatusProxy.html @@ -0,0 +1,375 @@ + + + + Ext.dd.StatusProxy + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.dd.StatusProxy

+ + + + + +
Package:Ext.dd
Class:StatusProxy
Extends:Object
Defined In:StatusProxy.js
+
+ A specialized drag proxy that supports a drop status icon, Ext.Layer styles and auto-repair. This is the +default drag proxy used by all Ext.dd components.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 StatusProxy(Object config)StatusProxy
 getEl() : Ext.LayerStatusProxy
Returns the underlying proxy Ext.Layer
 getGhost() : Ext.ElementStatusProxy
Returns the ghost element
 hide(Boolean clear) : voidStatusProxy
Hides the proxy
 repair(Array xy, Function callback, Object scope) : voidStatusProxy
Causes the proxy to return to its position of origin via an animation. Should be called after an +invalid drop operat...
 reset(Boolean clearGhost) : voidStatusProxy
Resets the status indicator to the default dropNotAllowed value
 setStatus(String cssClass) : voidStatusProxy
Updates the proxy's visual element to indicate the status of whether or not drop is allowed +over the current target e...
 show() : voidStatusProxy
Displays this proxy
 stop() : voidStatusProxy
Stops the repair animation if it's currently running
 sync() : voidStatusProxy
Force the Layer to sync its shadow and shim positions to the element
 update(String html) : voidStatusProxy
Updates the contents of the ghost element
+ +

Public Events

+
This class has no public events.
+

Config Options

+ + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 dropAllowed : StringStatusProxy
The CSS class to apply to the status element when drop is allowed (defaults to "x-dd-drop-ok").
 dropNotAllowed : StringStatusProxy
The CSS class to apply to the status element when drop is not allowed (defaults to "x-dd-drop-nodrop").
+ + +

Constructor Details

+
+
+

StatusProxy

+ public function StatusProxy(Object config) +
+
+ Parameters: +
  • config : Object
+
+
+
+
+ +

Method Details

+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying proxy Ext.Layer +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Layer
    el
  • +
+
+
+
This method is defined by StatusProxy.
+
+ +
+

getGhost

+ public function getGhost() +
+ Returns the ghost element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    el
  • +
+
+
+
This method is defined by StatusProxy.
+
+ +
+

hide

+ public function hide(Boolean clear) +
+ Hides the proxy +
+ Parameters: +
  • clear : Boolean
    True to reset the status and clear the ghost contents, false to preserve them
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by StatusProxy.
+
+ +
+

repair

+ public function repair(Array xy, Function callback, Object scope) +
+ Causes the proxy to return to its position of origin via an animation. Should be called after an +invalid drop operation by the item being dragged. +
+ Parameters: +
  • xy : Array
    The XY position of the element ([x, y])
  • callback : Function
    The function to call after the repair is complete
  • scope : Object
    The scope in which to execute the callback
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by StatusProxy.
+
+ +
+

reset

+ public function reset(Boolean clearGhost) +
+ Resets the status indicator to the default dropNotAllowed value +
+ Parameters: +
  • clearGhost : Boolean
    True to also remove all content from the ghost, false to preserve it
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by StatusProxy.
+
+ +
+

setStatus

+ public function setStatus(String cssClass) +
+ Updates the proxy's visual element to indicate the status of whether or not drop is allowed +over the current target element. +
+ Parameters: +
  • cssClass : String
    The css class for the new drop status indicator image
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by StatusProxy.
+
+ +
+

show

+ public function show() +
+ Displays this proxy +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by StatusProxy.
+
+ +
+

stop

+ public function stop() +
+ Stops the repair animation if it's currently running +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by StatusProxy.
+
+ +
+

sync

+ public function sync() +
+ Force the Layer to sync its shadow and shim positions to the element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by StatusProxy.
+
+ +
+

update

+ public function update(String html) +
+ Updates the contents of the ghost element +
+ Parameters: +
  • html : String
    The html that will replace the current innerHTML of the ghost element
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by StatusProxy.
+
+
+ +

Config Details

+
+ +
+

dropAllowed

+ dropAllowed : String +
+ The CSS class to apply to the status element when drop is allowed (defaults to "x-dd-drop-ok").
+
This config option is defined by StatusProxy.
+
+ +
+

dropNotAllowed

+ dropNotAllowed : String +
+ The CSS class to apply to the status element when drop is not allowed (defaults to "x-dd-drop-nodrop").
+
This config option is defined by StatusProxy.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.form.BasicForm.html b/www/extras/yui-ext/docs/output/Ext.form.BasicForm.html new file mode 100644 index 000000000..e36c8b189 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.form.BasicForm.html @@ -0,0 +1,906 @@ + + + + Ext.form.BasicForm + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.form.BasicForm

+ + + + + + +
Package:Ext.form
Class:BasicForm
Extends:Observable
Subclasses:Form
Defined In:BasicForm.js
+
+ Supplies the functionality to do "actions" on forms and initialize Ext.form.Field types on existing markup.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 waitMsgTarget : MixedBasicForm
By default wait messages are displayed with Ext.MessageBox.wait. You can target a specific +element by passing it or i...
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 BasicForm(String/HTMLElement/Ext.Element el, Object config)BasicForm
 add(Field field1, [Field field2], [Field etc]) : voidBasicForm
Add Ext.form components to this form
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 applyIfToFields(Object values) : voidBasicForm
Calls Ext.applyIf for all field in this form with the passed object
 applyToFields(Object values) : voidBasicForm
Calls Ext.apply for all field in this form with the passed object
 clearInvalid() : voidBasicForm
Clears all invalid messages in this form
 doAction(String actionName, Object options) : voidBasicForm
Performs a predefined action (submit or load) or custom actions you define on this form
 findField(String id) : FieldBasicForm
Find a Ext.form.Field in this form by id, dataIndex, name or hiddenName
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getValues(Boolean asString) : ObjectBasicForm
Returns the fields in this form as an object with key value pair. If multiple fields exist with the same name +they ar...
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 isValid() : BooleanBasicForm
Returns true is client-side validation on the form is successful
 load(Object options) : voidBasicForm
Shortcut to do a load action
 markInvalid(Array/Object errors) : voidBasicForm
Mark fields in this form invalid in bulk.
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 remove(Field field) : voidBasicForm
Removes a field from the items collection (does NOT remove its markup)
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render() : voidBasicForm
Looks at the fields in this form, checks them for an id attribute +and call applyTo on the existing dom element with t...
 reset() : voidBasicForm
Resets this form
 setValues(Array/Object values) : voidBasicForm
Set values for fields in this form in bulk.
 submit(Object options) : voidBasicForm
Shortcut to do a submit action
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 updateRecord(Record record) : voidBasicForm
Persists the values in this form into the passed Ext.data.Record object in a beginEdit/endEdit block.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 actioncomplete : (Form this, Action action)BasicForm
Fires when an action is completed
 actionfailed : (Form this, Action action)BasicForm
Fires when an action fails
 beforeaction : (Form this, Action action)BasicForm
Fires before any action is performed. Return false to cancel the action.
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 baseParams : ObjectBasicForm
Parameters to pass with all requests. e.g. baseParams: {id: '123', foo: 'bar'}
 errorReader : DataReaderBasicForm
An Ext.data.DataReader (e.g. Ext.data.XmlReader to be used to read data when reading validation errors on "submit" ac...
 fileUpload : BooleanBasicForm
Set to true if this form is a file upload (YUI adapter only)
 method : StringBasicForm
The request method to use (GET or POST) for form actions if one isn't supplied in the action options
 reader : DataReaderBasicForm
An Ext.data.DataReader (e.g. Ext.data.XmlReader to be used to read data when executing "load" actions. This is comple...
 timeout : NumberBasicForm
 url : StringBasicForm
The url to use for form actions if one isn't supplied in the action options
+

Property Details

+
+ +
+

waitMsgTarget

+ public Mixed waitMsgTarget +
+ By default wait messages are displayed with Ext.MessageBox.wait. You can target a specific +element by passing it or its id or mask the form itself by passing in true.
+
This property is defined by BasicForm.
+
+
+ + +

Constructor Details

+
+
+

BasicForm

+ public function BasicForm(String/HTMLElement/Ext.Element el, Object config) +
+
+ Parameters: +
  • el : String/HTMLElement/Ext.Element
    The form element or its id
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

add

+ public function add(Field field1, [Field field2], [Field etc]) +
+ Add Ext.form components to this form +
+ Parameters: +
  • field1 : Field
  • field2 : Field
    (optional)
  • etc : Field
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

applyIfToFields

+ public function applyIfToFields(Object values) +
+ Calls Ext.applyIf for all field in this form with the passed object +
+ Parameters: +
  • values : Object
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

applyToFields

+ public function applyToFields(Object values) +
+ Calls Ext.apply for all field in this form with the passed object +
+ Parameters: +
  • values : Object
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

clearInvalid

+ public function clearInvalid() +
+ Clears all invalid messages in this form +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

doAction

+ public function doAction(String actionName, Object options) +
+ Performs a predefined action (submit or load) or custom actions you define on this form +
+ Parameters: +
  • actionName : String
    The name of the action type
  • options : Object
    The options to pass to the action
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

findField

+ public function findField(String id) +
+ Find a Ext.form.Field in this form by id, dataIndex, name or hiddenName +
+ Parameters: +
  • id : String
    The value to search for
+ Returns: +
    +
  • Field
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

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.
+
+ +
+

getValues

+ public function getValues(Boolean asString) +
+ Returns the fields in this form as an object with key value pair. If multiple fields exist with the same name +they are returned as an array. +
+ Parameters: +
  • asString : Boolean
+ Returns: +
    +
  • Object
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

isValid

+ public function isValid() +
+ Returns true is client-side validation on the form is successful +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

load

+ public function load(Object options) +
+ Shortcut to do a load action +
+ Parameters: +
  • options : Object
    The options to pass to the action
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

markInvalid

+ public function markInvalid(Array/Object errors) +
+ Mark fields in this form invalid in bulk. +
+ Parameters: +
  • errors : Array/Object
    Either an array in the form [{id:'fieldId', msg:'The message'},...] or an object hash of {id: msg, id2: msg2}
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

remove

+ public function remove(Field field) +
+ Removes a field from the items collection (does NOT remove its markup) +
+ Parameters: +
  • field : Field
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

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() +
+ Looks at the fields in this form, checks them for an id attribute +and call applyTo on the existing dom element with that id +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

reset

+ public function reset() +
+ Resets this form +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

setValues

+ public function setValues(Array/Object values) +
+ Set values for fields in this form in bulk. +
+ Parameters: +
  • values : Array/Object
    Either an array in the form [{id:'fieldId', value:'foo'},...] or an object hash of {id: value, id2: value2}
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

submit

+ public function submit(Object options) +
+ Shortcut to do a submit action +
+ Parameters: +
  • options : Object
    The options to pass to the action
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

updateRecord

+ public function updateRecord(Record record) +
+ Persists the values in this form into the passed Ext.data.Record object in a beginEdit/endEdit block. +
+ Parameters: +
  • record : Record
    The record to edit
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+
+ +

Event Details

+
+ +
+

actioncomplete

+ public event actioncomplete +
+ Fires when an action is completed +
+ Subscribers will be called with the following parameters: +
  • this : Form
  • action : Action
    The action that completed
+
+
+
This event is defined by BasicForm.
+
+ +
+

actionfailed

+ public event actionfailed +
+ Fires when an action fails +
+ Subscribers will be called with the following parameters: +
  • this : Form
  • action : Action
    The action that failed
+
+
+
This event is defined by BasicForm.
+
+ +
+

beforeaction

+ public event beforeaction +
+ Fires before any action is performed. Return false to cancel the action. +
+ Subscribers will be called with the following parameters: +
  • this : Form
  • action : Action
    The action to be performed
+
+
+
This event is defined by BasicForm.
+
+
+

Config Details

+
+ +
+

baseParams

+ baseParams : Object +
+ Parameters to pass with all requests. e.g. baseParams: {id: '123', foo: 'bar'}
+
This config option is defined by BasicForm.
+
+ +
+

errorReader

+ errorReader : DataReader +
+ An Ext.data.DataReader (e.g. Ext.data.XmlReader to be used to read data when reading validation errors on "submit" actions. This is completely optional as there is built-in support for processing JSON.
+
This config option is defined by BasicForm.
+
+ +
+

fileUpload

+ fileUpload : Boolean +
+ Set to true if this form is a file upload (YUI adapter only)
+
This config option is defined by BasicForm.
+
+ +
+

method

+ method : String +
+ The request method to use (GET or POST) for form actions if one isn't supplied in the action options
+
This config option is defined by BasicForm.
+
+ +
+

reader

+ reader : DataReader +
+ An Ext.data.DataReader (e.g. Ext.data.XmlReader to be used to read data when executing "load" actions. This is completely optional as there is built-in support for processing JSON.
+
This config option is defined by BasicForm.
+
+ +
+

timeout

+ timeout : Number +
+
+
This config option is defined by BasicForm.
+
+ +
+

url

+ url : String +
+ The url to use for form actions if one isn't supplied in the action options
+
This config option is defined by BasicForm.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.form.Checkbox.html b/www/extras/yui-ext/docs/output/Ext.form.Checkbox.html new file mode 100644 index 000000000..46db38830 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.form.Checkbox.html @@ -0,0 +1,1549 @@ + + + + Ext.form.Checkbox + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.form.Checkbox

+ + + + + + +
Package:Ext.form
Class:Checkbox
Extends:Field
Subclasses:Radio
Defined In:Checkbox.js
+
+ Single checkbox field. Can be used as a direct replacement for traditional checkbox fields.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Checkbox(Object config)Checkbox
Creates a new CheckBox
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 applyTo(String/HTMLElement/Element el) : Ext.form.FieldField
Apply the behaviors of this component to an existing element. This is used instead of render().
 clearInvalid() : voidField
Clear any invalid styles/messages for this field
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 getName() : StringField
Returns the name attribute of the field if available
 getRawValue() : MixedField
Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue.
 getValue() : BooleanCheckbox
Returns the checked state of the checkbox.
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isValid(Boolean preventMark) : BooleanField
Returns whether or not the field value is currently valid
 isVisible() : voidComponent
Returns true if this component is visible
 markInvalid(String msg) : voidField
Mark this field as invalid
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 reset() : voidField
Resets the current field value to the originally-loaded value and clears any validation messages
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setRawValue(Mixed value) : voidField
Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue.
 setSize(Number width, Number height) : voidCheckbox
* +Sets the width and height of the checkbox wrapper element
 setValue(Boolean/String checked) : voidCheckbox
Sets the checked state of the checkbox
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 validate() : BooleanField
Validates the field value
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 blur : (Ext.form.Field this)Field
Fires when
 change : (Ext.form.Field this, Mixed value, Mixed value)Field
Fires just before the field blurs if the field value has changed
 check : (Ext.form.Checkbox this, Boolean checked)Checkbox
Fires when the checkbox is checked or unchecked
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 focus : (Ext.form.Field this)Field
Fires when this field receives input focus
 hide : (Ext.Component this)Component
Fires after the component is hidden
 invalid : (Ext.form.Field this, String msg)Field
Fires after the field has been marked as invalid
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
 specialkey : (Ext.form.Field this, Ext.EventObject e)Field
Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.g...
 valid : (Ext.form.Field this)Field
Fires after the field has been validated with no errors
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 autoCreate : String/ObjectField
A DomHelper element spec, or true for a default element spec (defaults to {tag: "input", type: "text", size: "20", au...
 boxLabel : StringCheckbox
The text that appears beside the checkbox
 checked : BooleanCheckbox
True if the the checkbox should render already checked (defaults to false)
 fieldClass : StringCheckbox
The default CSS class for the checkbox (defaults to "x-form-field")
 focusClass : StringCheckbox
The CSS class to use when the checkbox receives focus (defaults to 'x-form-check-focus')
 inputType : StringField
The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
 inputValue : StringCheckbox
The value that should go into the generated input element's value attribute
 invalidClass : StringField
The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
 invalidText : StringField
The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field i...
 msgFx : StringField
Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
 msgTarget : StringField
The location where error text should display. Should be one of the following values (defaults to 'qtip'): Value Desc...
 validateOnBlur : String/BooleanField
Defaults to true.
 validationDelay : NumberField
The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
 validationEvent : String/BooleanField
The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
 value : MixedField
A value to initialize this field with
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

Checkbox

+ public function Checkbox(Object config) +
+ Creates a new CheckBox
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

applyTo

+ public function applyTo(String/HTMLElement/Element el) +
+ Apply the behaviors of this component to an existing element. This is used instead of render(). +
+ Parameters: +
  • el : String/HTMLElement/Element
    The id of the node, a DOM Node or an existing Element
+ Returns: +
    +
  • Ext.form.Field
    this
  • +
+
+
+
This method is defined by Field.
+
+ +
+

clearInvalid

+ public function clearInvalid() +
+ Clear any invalid styles/messages for this field +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getName

+ public function getName() +
+ Returns the name attribute of the field if available +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    name The field name
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getRawValue

+ public function getRawValue() +
+ Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Mixed
    value The field value
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getValue

+ public function getValue() +
+ Returns the checked state of the checkbox. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    True if checked, else false
  • +
+
+
+
This method is defined by Checkbox.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isValid

+ public function isValid(Boolean preventMark) +
+ Returns whether or not the field value is currently valid +
+ Parameters: +
  • preventMark : Boolean
    True to disable marking the field invalid
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+ +
+

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

markInvalid

+ public function markInvalid(String msg) +
+ Mark this field as invalid +
+ Parameters: +
  • msg : String
    The validation message
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

reset

+ public function reset() +
+ Resets the current field value to the originally-loaded value and clears any validation messages +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setRawValue

+ public function setRawValue(Mixed value) +
+ Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue. +
+ Parameters: +
  • value : Mixed
    The value to set
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setSize

+ public function setSize(Number width, Number height) +
+ * +Sets the width and height of the checkbox wrapper element +
+ Parameters: +
  • width : Number
    New width in pixels
  • height : Number
    New height in pixels
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Checkbox.
+
+ +
+

setValue

+ public function setValue(Boolean/String checked) +
+ Sets the checked state of the checkbox +
+ Parameters: +
  • checked : Boolean/String
    True, 'true,' or '1' to check the checkbox, any other value will uncheck it
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Checkbox.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

validate

+ public function validate() +
+ Validates the field value +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+
+ +

Event Details

+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

blur

+ public event blur +
+ Fires when +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

change

+ public event change +
+ Fires just before the field blurs if the field value has changed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • value : Mixed
    The changed value
  • value : Mixed
    The original value
+
+
+
This event is defined by Field.
+
+ +
+

check

+ public event check +
+ Fires when the checkbox is checked or unchecked +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Checkbox
    This checkbox
  • checked : Boolean
    The new checked value
+
+
+
This event is defined by Checkbox.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

focus

+ public event focus +
+ Fires when this field receives input focus +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

invalid

+ public event invalid +
+ Fires after the field has been marked as invalid +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • msg : String
    The validation message
+
+
+
This event is defined by Field.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

specialkey

+ public event specialkey +
+ Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.getKey to determine which key was pressed. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by Field.
+
+ +
+

valid

+ public event valid +
+ Fires after the field has been validated with no errors +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+
+

Config Details

+
+ +
+

autoCreate

+ autoCreate : String/Object +
+ A DomHelper element spec, or true for a default element spec (defaults to {tag: "input", type: "text", size: "20", autocomplete: "off"})
+
This config option is defined by Field.
+
+ +
+

boxLabel

+ boxLabel : String +
+ The text that appears beside the checkbox
+
This config option is defined by Checkbox.
+
+ +
+

checked

+ checked : Boolean +
+ True if the the checkbox should render already checked (defaults to false)
+
This config option is defined by Checkbox.
+
+ +
+

fieldClass

+ fieldClass : String +
+ The default CSS class for the checkbox (defaults to "x-form-field")
+
This config option is defined by Checkbox.
+
+ +
+

focusClass

+ focusClass : String +
+ The CSS class to use when the checkbox receives focus (defaults to 'x-form-check-focus')
+
This config option is defined by Checkbox.
+
+ +
+

inputType

+ inputType : String +
+ The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
+
This config option is defined by Field.
+
+ +
+

inputValue

+ inputValue : String +
+ The value that should go into the generated input element's value attribute
+
This config option is defined by Checkbox.
+
+ +
+

invalidClass

+ invalidClass : String +
+ The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
+
This config option is defined by Field.
+
+ +
+

invalidText

+ invalidText : String +
+ The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field is invalid")
+
This config option is defined by Field.
+
+ +
+

msgFx

+ msgFx : String +
+ Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
+
This config option is defined by Field.
+
+ +
+

msgTarget

+ msgTarget : String +
+ The location where error text should display. Should be one of the following values (defaults to 'qtip'):
 Value Description ----------- ---------------------------------------------------------------------- qtip Display a quick tip when the user hovers over the field title Display a default browser title attribute popup under Add a block div beneath the field containing the error text side Add an error icon to the right of the field with a popup on hover [element id] Add the error text directly to the innerHTML of the specified element 
+
This config option is defined by Field.
+
+ +
+

validateOnBlur

+ validateOnBlur : String/Boolean +
+ Defaults to true.
+
This config option is defined by Field.
+
+ +
+

validationDelay

+ validationDelay : Number +
+ The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
+
This config option is defined by Field.
+
+ +
+

validationEvent

+ validationEvent : String/Boolean +
+ The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
+
This config option is defined by Field.
+
+ +
+

value

+ value : Mixed +
+ A value to initialize this field with
+
This config option is defined by Field.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.form.Column.html b/www/extras/yui-ext/docs/output/Ext.form.Column.html new file mode 100644 index 000000000..4ac738ea0 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.form.Column.html @@ -0,0 +1,985 @@ + + + + Ext.form.Column + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.form.Column

+ + + + + +
Package:Ext.form
Class:Column
Extends:Layout
Defined In:Layout.js
+
+ Creates a column container for layout and rendering of fields in an Ext.form.Form.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Column(Object config)Column
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isVisible() : voidComponent
Returns true if this component is visible
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 hide : (Ext.Component this)Component
Fires after the component is hidden
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 autoCreate : String/ObjectColumn
A DomHelper element spec used to autocreate the column (defaults to {tag: 'div', cls: 'x-form-ct x-form-column'})
 clear : BooleanLayout
True to add a clearing element at the end of this layout, equivalent to CSS clear: both (defaults to true)
 hideLabels : BooleanLayout
True to suppress the display of field labels in this layout (defaults to false)
 labelAlign : StringLayout
Valid values are "left," "top" and "right" (defaults to "left")
 labelSeparator : StringLayout
The separator to use after field labels (defaults to ':')
 labelWidth : NumberLayout
Fixed width in pixels of all field labels (defaults to undefined)
 style : String/Object/FunctionLayout
A style specification string eg "width:100px", or object in the form {width:"100px"}, or a function which returns suc...
 width : NumberColumn
The fixed width of the column in pixels (defaults to auto)
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

Column

+ public function Column(Object config) +
+
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+
+

Config Details

+
+ +
+

autoCreate

+ autoCreate : String/Object +
+ A DomHelper element spec used to autocreate the column (defaults to {tag: 'div', cls: 'x-form-ct x-form-column'})
+
This config option is defined by Column.
+
+ +
+

clear

+ clear : Boolean +
+ True to add a clearing element at the end of this layout, equivalent to CSS clear: both (defaults to true)
+
This config option is defined by Layout.
+
+ +
+

hideLabels

+ hideLabels : Boolean +
+ True to suppress the display of field labels in this layout (defaults to false)
+
This config option is defined by Layout.
+
+ +
+

labelAlign

+ labelAlign : String +
+ Valid values are "left," "top" and "right" (defaults to "left")
+
This config option is defined by Layout.
+
+ +
+

labelSeparator

+ labelSeparator : String +
+ The separator to use after field labels (defaults to ':')
+
This config option is defined by Layout.
+
+ +
+

labelWidth

+ labelWidth : Number +
+ Fixed width in pixels of all field labels (defaults to undefined)
+
This config option is defined by Layout.
+
+ +
+

style

+ style : 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.
+
This config option is defined by Layout.
+
+ +
+

width

+ width : Number +
+ The fixed width of the column in pixels (defaults to auto)
+
This config option is defined by Column.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.form.ComboBox.html b/www/extras/yui-ext/docs/output/Ext.form.ComboBox.html new file mode 100644 index 000000000..9c051f56c --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.form.ComboBox.html @@ -0,0 +1,2731 @@ + + + + Ext.form.ComboBox + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.form.ComboBox

+ + + + + +
Package:Ext.form
Class:ComboBox
Extends:TriggerField
Defined In:Combo.js
+
+ A combobox control with support for autocomplete, remote-loading, paging and many other features.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 ComboBox(Object config)ComboBox
Create a new ComboBox.
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 applyTo(String/HTMLElement/Element el) : Ext.form.FieldField
Apply the behaviors of this component to an existing element. This is used instead of render().
 autoSize() : voidTextField
Automatically grows the field to accomodate the width of the text up to the maximum field width allowed. +This only ta...
 clearInvalid() : voidField
Clear any invalid styles/messages for this field
 clearValue() : voidComboBox
Clears any text/value currently set in the field
 collapse() : voidComboBox
Hides the dropdown list if it is currently expanded. Fires the 'collapse' event on completion.
 disable() : voidComponent
Disable this component
 doQuery(String query, Boolean forceAll) : voidComboBox
Execute a query to filter the dropdown list. Fires the beforequery event prior to performing the +query allowing the ...
 enable() : voidComponent
Enable this component
 expand() : voidComboBox
Expands the dropdown list if it is currently hidden. Fires the 'expand' event on completion.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 getName() : StringField
Returns the name attribute of the field if available
 getRawValue() : MixedField
Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue.
 getValue() : StringComboBox
Returns the currently-selected field value or empty string if no value is set.
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isExpanded() : voidComboBox
Returns true if the dropdown list is expanded, else false.
 isValid(Boolean preventMark) : BooleanField
Returns whether or not the field value is currently valid
 isVisible() : voidComponent
Returns true if this component is visible
 markInvalid(String msg) : voidField
Mark this field as invalid
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 onTriggerClick(EventObject e) : voidTriggerField
The function that should handle the trigger's click event. This method does nothing by default until overridden +by a...
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 reset() : voidField
Resets the current field value to the originally-loaded value and clears any validation messages
 select(Number index, Boolean scrollIntoView) : voidComboBox
Select an item in the dropdown list by its numeric index in the list
 selectByValue(String value, Boolean scrollIntoView) : BooleanComboBox
Select an item in the dropdown list by its data value
 selectNext() : voidComboBox
Select the next item in the dropdown list (selects the first item by default if no items are currently selected)
 selectPrev() : voidComboBox
Select the previous item in the dropdown list (selects the first item by default if no items are currently selected)
 selectText([Number start], [Number end]) : voidTextField
Selects text in this field
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setEditable() : voidComboBox
Allow or prevent the user from directly editing the field text. If false is passed in, +the user will only be able to...
 setRawValue(Mixed value) : voidField
Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue.
 setSize(Number width, Number height) : voidField
Sets the height and width of the field
 setValue(String value) : voidComboBox
Sets the specified value into the field. If the value finds a match, the corresponding record text +will be displayed...
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 validate() : BooleanField
Validates the field value
 validateValue(Mixed value) : BooleanTextField
Validates a value according to the field's validation rules and marks the field as invalid +if the validation fails
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 autosize : (Ext.form.Field this, Number width)TextField
Fires when the autosize function is triggered. The field may or may not have actually changed size +according to the ...
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforequery : (Object e)ComboBox
Fires before all queries are processed. Return false to cancel the query or set cancel to true. +The event object pass...
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeselect : (Ext.form.ComboBox combo, Ext.data.Record record, Number index)ComboBox
Fires before a list item is selected. Return false to cancel the selection.
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 blur : (Ext.form.Field this)Field
Fires when
 change : (Ext.form.Field this, Mixed value, Mixed value)Field
Fires just before the field blurs if the field value has changed
 collapse : (Ext.form.ComboBox combo)ComboBox
Fires when the dropdown list is collapsed
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 expand : (Ext.form.ComboBox combo)ComboBox
Fires when the dropdown list is expanded
 focus : (Ext.form.Field this)Field
Fires when this field receives input focus
 hide : (Ext.Component this)Component
Fires after the component is hidden
 invalid : (Ext.form.Field this, String msg)Field
Fires after the field has been marked as invalid
 render : (Ext.Component this)Component
Fires after the component is rendered
 select : (Ext.form.ComboBox combo, Ext.data.Record record, Number index)ComboBox
Fires when a list item is selected
 show : (Ext.Component this)Component
Fires after the component is shown
 specialkey : (Ext.form.Field this, Ext.EventObject e)Field
Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.g...
 valid : (Ext.form.Field this)Field
Fires after the field has been validated with no errors
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 allQuery : StringComboBox
The text query to send to the server to return all records for the list with no filtering (defaults to '')
 allowBlank : BooleanTextField
False to validate that the value length > 0 (defaults to true)
 autoCreate : Boolean/ObjectComboBox
A DomHelper element spec, or true for a default element spec (defaults to: {tag: "input", type: "text", size: "24", a...
 blankText : StringTextField
Error text to display if the allow blank validation fails (defaults to "This field is required")
 disableKeyFilter : BooleanTextField
True to disable input keystroke filtering (defaults to false)
 displayField : StringComboBox
The underlying data field name to bind to this CombBox (defaults to undefined if mode = 'remote' or 'text' if mode = ...
 editable : BooleanComboBox
False to prevent the user from typing text directly into the field, just like a traditional select (defaults to true)
 emptyClass : StringTextField
The CSS class to apply to an empty field to style the emptyText (defaults to 'x-form-empty-field'). This class is aut...
 emptyText : StringTextField
The default text to display in an empty field (defaults to null).
 fieldClass : StringField
The default CSS class for the field (defaults to "x-form-field")
 focusClass : StringField
The CSS class to use when the field receives focus (defaults to "x-form-focus")
 forceSelection : BooleanComboBox
True to restrict the selected value to one of the values in the list, false to allow the user to set arbitrary text i...
 grow : BooleanTextField
True if this field should automatically grow and shrink to its content
 growMax : NumberTextField
The maximum width to allow when grow = true (defaults to 800)
 growMin : NumberTextField
The minimum width to allow when grow = true (defaults to 30)
 handleHeight : NumberComboBox
The height in pixels of the dropdown list resize handle if resizable = true (defaults to 8)
 hiddenName : StringComboBox
If specified, a hidden form field with this name is dynamically generated to store the field's data value (defaults t...
 hideTrigger : BooleanTriggerField
True to hide the trigger element and display only the base text field (defaults to false)
 inputType : StringField
The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
 invalidClass : StringField
The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
 invalidText : StringField
The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field i...
 lazyRender : BooleanComboBox
True to prevent the ComboBox from rendering until requested (should always be used when rendering into an Ext.Editor,...
 listAlign : StringComboBox
A valid anchor position value. See Ext.Element.alignTo for details on supported anchor positions (defaults to 'tl-bl')
 listClass : StringComboBox
CSS class to apply to the dropdown list element (defaults to '')
 listWidth : NumberComboBox
The width in pixels of the dropdown list (defaults to the width of the ComboBox field)
 loadingText : StringComboBox
The text to display in the dropdown list while data is loading. Only applies when mode = 'remote' (defaults to 'Loadi...
 maskRe : StringTextField
An input mask regular expression that will be used to filter keystrokes that don't match (defaults to null)
 maxHeight : NumberComboBox
The maximum height in pixels of the dropdown list before scrollbars are shown (defaults to 300)
 maxLength : NumberTextField
Maximum input field length allowed (defaults to Number.MAX_VALUE)
 maxLengthText : StringTextField
Error text to display if the maximum length validation fails (defaults to "The maximum length for this field is {maxL...
 minChars : NumberComboBox
The minimum number of characters the user must type before autocomplete and typeahead activate (defaults to 4, does n...
 minLength : NumberTextField
Minimum input field length required (defaults to 0)
 minLengthText : StringTextField
Error text to display if the minimum length validation fails (defaults to "The minimum length for this field is {minL...
 minListWidth : NumberComboBox
The minimum width of the dropdown list in pixels (defaults to 70, will be ignored if listWidth has a higher value)
 mode : StringComboBox
Set to 'local' if the ComboBox loads local data (defaults to 'remote' which loads from the server)
 msgFx : StringField
Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
 msgTarget : StringField
The location where error text should display. Should be one of the following values (defaults to 'qtip'): Value Desc...
 pageSize : NumberComboBox
If greater than 0, a paging toolbar is displayed in the footer of the dropdown list and the filter queries will execu...
 queryDelay : NumberComboBox
The length of time in milliseconds to delay between the start of typing and sending the query to filter the dropdown ...
 queryParam : StringComboBox
Name of the query as it will be passed on the querystring (defaults to 'query')
 regex : RegExpTextField
A JavaScript RegExp object to be tested against the field value during validation (defaults to null). If available, t...
 regexText : StringTextField
The error text to display if regex is used and the test fails during validation (defaults to "")
 resizable : BooleanComboBox
True to add a resize handle to the bottom of the dropdown list (defaults to false)
 selectOnFocus : BooleanComboBox
True to select any existing text in the field immediately on focus. Only applies when editable = true (defaults to fa...
 selectedClass : StringComboBox
CSS class to apply to the selected item in the dropdown list (defaults to 'x-combo-selected')
 shadow : Boolean/StringComboBox
True or "sides" for the default effect, "frame" for 4-way shadow, and "drop" for bottom-right
 transform : String/HTMLElement/ElementComboBox
The id, DOM node or element of an existing select to convert to a ComboBox
 triggerAction : StringComboBox
The action to execute when the trigger field is activated. Use 'all' to run the query specified by the allQuery confi...
 triggerClass : StringComboBox
An additional CSS class used to style the trigger button. The trigger will always get the class 'x-form-trigger' and ...
 typeAhead : BooleanComboBox
True to populate and autoselect the remainder of the text being typed after a configurable delay (typeAheadDelay) if ...
 typeAheadDelay : NumberComboBox
The length of time in milliseconds to wait until the typeahead text is displayed if typeAhead = true (defaults to 250)
 validateOnBlur : String/BooleanField
Defaults to true.
 validationDelay : NumberField
The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
 validationEvent : String/BooleanField
The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
 validator : FunctionTextField
A custom validation function to be called during field validation (defaults to null). If available, this function wil...
 value : MixedField
A value to initialize this field with
 valueField : StringComboBox
The underlying data value name to bind to this CombBox (defaults to undefined if mode = 'remote' or 'value' if mode =...
 valueNotFoundText : StringComboBox
When using a name/value combo, if the value passed to setValue is not found in the store, valueNotFoundText will be d...
 vtype : StringTextField
A validation type name as defined in Ext.form.VTypes (defaults to null)
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

ComboBox

+ public function ComboBox(Object config) +
+ Create a new ComboBox.
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

applyTo

+ public function applyTo(String/HTMLElement/Element el) +
+ Apply the behaviors of this component to an existing element. This is used instead of render(). +
+ Parameters: +
  • el : String/HTMLElement/Element
    The id of the node, a DOM Node or an existing Element
+ Returns: +
    +
  • Ext.form.Field
    this
  • +
+
+
+
This method is defined by Field.
+
+ +
+

autoSize

+ public function autoSize() +
+ Automatically grows the field to accomodate the width of the text up to the maximum field width allowed. +This only takes effect if grow = true and fires the autosize event. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TextField.
+
+ +
+

clearInvalid

+ public function clearInvalid() +
+ Clear any invalid styles/messages for this field +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

clearValue

+ public function clearValue() +
+ Clears any text/value currently set in the field +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ComboBox.
+
+ +
+

collapse

+ public function collapse() +
+ Hides the dropdown list if it is currently expanded. Fires the 'collapse' event on completion. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ComboBox.
+
+ +
+

disable

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

doQuery

+ public function doQuery(String query, Boolean forceAll) +
+ Execute a query to filter the dropdown list. Fires the beforequery event prior to performing the +query allowing the query action to be canceled if needed. +
+ Parameters: +
  • query : String
    The sql query to execute
  • forceAll : Boolean
    True to force the query to execute even if there are currently fewer characters in the field than the minimum specified by the minChars config option. It also clears any filter previously saved in the current store (defaults to false)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ComboBox.
+
+ +
+

enable

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

expand

+ public function expand() +
+ Expands the dropdown list if it is currently hidden. Fires the 'expand' event on completion. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ComboBox.
+
+ +
+

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getName

+ public function getName() +
+ Returns the name attribute of the field if available +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    name The field name
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getRawValue

+ public function getRawValue() +
+ Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Mixed
    value The field value
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getValue

+ public function getValue() +
+ Returns the currently-selected field value or empty string if no value is set. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    value The selected value
  • +
+
+
+
This method is defined by ComboBox.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isExpanded

+ public function isExpanded() +
+ Returns true if the dropdown list is expanded, else false. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ComboBox.
+
+ +
+

isValid

+ public function isValid(Boolean preventMark) +
+ Returns whether or not the field value is currently valid +
+ Parameters: +
  • preventMark : Boolean
    True to disable marking the field invalid
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+ +
+

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

markInvalid

+ public function markInvalid(String msg) +
+ Mark this field as invalid +
+ Parameters: +
  • msg : String
    The validation message
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

on

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

onTriggerClick

+ public function onTriggerClick(EventObject e) +
+ The function that should handle the trigger's click event. This method does nothing by default until overridden +by a handler implementation. +
+ Parameters: +
  • e : EventObject
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TriggerField.
+
+ +
+

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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

reset

+ public function reset() +
+ Resets the current field value to the originally-loaded value and clears any validation messages +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

select

+ public function select(Number index, Boolean scrollIntoView) +
+ Select an item in the dropdown list by its numeric index in the list +
+ Parameters: +
  • index : Number
    The zero-based index of the list item to select
  • scrollIntoView : Boolean
    False to prevent the dropdown list from autoscrolling to display the selected item if it is not currently in view (defaults to true)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ComboBox.
+
+ +
+

selectByValue

+ public function selectByValue(String value, Boolean scrollIntoView) +
+ Select an item in the dropdown list by its data value +
+ Parameters: +
  • value : String
    The data value of the item to select
  • scrollIntoView : Boolean
    False to prevent the dropdown list from autoscrolling to display the selected item if it is not currently in view (defaults to true)
+ Returns: +
    +
  • Boolean
    valueFound True if the value matched an item in the list, else false
  • +
+
+
+
This method is defined by ComboBox.
+
+ +
+

selectNext

+ public function selectNext() +
+ Select the next item in the dropdown list (selects the first item by default if no items are currently selected) +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ComboBox.
+
+ +
+

selectPrev

+ public function selectPrev() +
+ Select the previous item in the dropdown list (selects the first item by default if no items are currently selected) +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ComboBox.
+
+ +
+

selectText

+ public function selectText([Number start], [Number end]) +
+ Selects text in this field +
+ Parameters: +
  • start : Number
    (optional) The index where the selection should start (defaults to 0)
  • end : Number
    (optional) The index where the selection should end (defaults to the text length)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TextField.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setEditable

+ public function setEditable() +
+ Allow or prevent the user from directly editing the field text. If false is passed in, +the user will only be able to select from the items defined in the dropdown list. This method +is the runtime equivalent of setting the editable config option at config time. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ComboBox.
+
+ +
+

setRawValue

+ public function setRawValue(Mixed value) +
+ Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue. +
+ Parameters: +
  • value : Mixed
    The value to set
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setSize

+ public function setSize(Number width, Number height) +
+ Sets the height and width of the field +
+ Parameters: +
  • width : Number
    The new field width in pixels
  • height : Number
    The new field height in pixels
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setValue

+ public function setValue(String value) +
+ Sets the specified value into the field. If the value finds a match, the corresponding record text +will be displayed in the field. If the value does not match the data value of an existing item, +and the valueNotFoundText config option is defined, it will be displayed as the default field text. +Otherwise the field will be blank (although the value will still be set). +
+ Parameters: +
  • value : String
    The value to match
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ComboBox.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

validate

+ public function validate() +
+ Validates the field value +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+ +
+

validateValue

+ public function validateValue(Mixed value) +
+ Validates a value according to the field's validation rules and marks the field as invalid +if the validation fails +
+ Parameters: +
  • value : Mixed
    The value to validate
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by TextField.
+
+
+ +

Event Details

+
+ +
+

autosize

+ public event autosize +
+ Fires when the autosize function is triggered. The field may or may not have actually changed size +according to the default logic, but this event provides a hook for the developer to apply additional +logic at runtime to resize the field if needed. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
    This text field
  • width : Number
    The new field width
+
+
+
This event is defined by TextField.
+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforequery

+ public event beforequery +
+ Fires before all queries are processed. Return false to cancel the query or set cancel to true. +The event object passed has these properties: +
    +
  • {Ext.form.ComboBox} combo - This combo box
  • +
  • {String} query - The query
  • +
  • {Boolean} forceAll - true to force "all" query
  • +
  • {Boolean} cancel - set to true to cancel the query.
  • +
+
+ Subscribers will be called with the following parameters: +
  • e : Object
    The query event object
+
+
+
This event is defined by ComboBox.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeselect

+ public event beforeselect +
+ Fires before a list item is selected. Return false to cancel the selection. +
+ Subscribers will be called with the following parameters: +
  • combo : Ext.form.ComboBox
    This combo box
  • record : Ext.data.Record
    The data record returned from the underlying store
  • index : Number
    The index of the selected item in the dropdown list
+
+
+
This event is defined by ComboBox.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

blur

+ public event blur +
+ Fires when +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

change

+ public event change +
+ Fires just before the field blurs if the field value has changed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • value : Mixed
    The changed value
  • value : Mixed
    The original value
+
+
+
This event is defined by Field.
+
+ +
+

collapse

+ public event collapse +
+ Fires when the dropdown list is collapsed +
+ Subscribers will be called with the following parameters: +
  • combo : Ext.form.ComboBox
    This combo box
+
+
+
This event is defined by ComboBox.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

expand

+ public event expand +
+ Fires when the dropdown list is expanded +
+ Subscribers will be called with the following parameters: +
  • combo : Ext.form.ComboBox
    This combo box
+
+
+
This event is defined by ComboBox.
+
+ +
+

focus

+ public event focus +
+ Fires when this field receives input focus +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

invalid

+ public event invalid +
+ Fires after the field has been marked as invalid +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • msg : String
    The validation message
+
+
+
This event is defined by Field.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

select

+ public event select +
+ Fires when a list item is selected +
+ Subscribers will be called with the following parameters: +
  • combo : Ext.form.ComboBox
    This combo box
  • record : Ext.data.Record
    The data record returned from the underlying store
  • index : Number
    The index of the selected item in the dropdown list
+
+
+
This event is defined by ComboBox.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

specialkey

+ public event specialkey +
+ Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.getKey to determine which key was pressed. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by Field.
+
+ +
+

valid

+ public event valid +
+ Fires after the field has been validated with no errors +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+
+

Config Details

+
+ +
+

allQuery

+ allQuery : String +
+ The text query to send to the server to return all records for the list with no filtering (defaults to '')
+
This config option is defined by ComboBox.
+
+ +
+

allowBlank

+ allowBlank : Boolean +
+ False to validate that the value length > 0 (defaults to true)
+
This config option is defined by TextField.
+
+ +
+

autoCreate

+ autoCreate : Boolean/Object +
+ A DomHelper element spec, or true for a default element spec (defaults to: {tag: "input", type: "text", size: "24", autocomplete: "off"})
+
This config option is defined by ComboBox.
+
+ +
+

blankText

+ blankText : String +
+ Error text to display if the allow blank validation fails (defaults to "This field is required")
+
This config option is defined by TextField.
+
+ +
+

disableKeyFilter

+ disableKeyFilter : Boolean +
+ True to disable input keystroke filtering (defaults to false)
+
This config option is defined by TextField.
+
+ +
+

displayField

+ displayField : String +
+ The underlying data field name to bind to this CombBox (defaults to undefined if mode = 'remote' or 'text' if mode = 'local')
+
This config option is defined by ComboBox.
+
+ +
+

editable

+ editable : Boolean +
+ False to prevent the user from typing text directly into the field, just like a traditional select (defaults to true)
+
This config option is defined by ComboBox.
+
+ +
+

emptyClass

+ emptyClass : String +
+ The CSS class to apply to an empty field to style the emptyText (defaults to 'x-form-empty-field'). This class is automatically added and removed as needed depending on the current field value.
+
This config option is defined by TextField.
+
+ +
+

emptyText

+ emptyText : String +
+ The default text to display in an empty field (defaults to null).
+
This config option is defined by TextField.
+
+ +
+

fieldClass

+ fieldClass : String +
+ The default CSS class for the field (defaults to "x-form-field")
+
This config option is defined by Field.
+
+ +
+

focusClass

+ focusClass : String +
+ The CSS class to use when the field receives focus (defaults to "x-form-focus")
+
This config option is defined by Field.
+
+ +
+

forceSelection

+ forceSelection : Boolean +
+ True to restrict the selected value to one of the values in the list, false to allow the user to set arbitrary text into the field (defaults to false)
+
This config option is defined by ComboBox.
+
+ +
+

grow

+ grow : Boolean +
+ True if this field should automatically grow and shrink to its content
+
This config option is defined by TextField.
+
+ +
+

growMax

+ growMax : Number +
+ The maximum width to allow when grow = true (defaults to 800)
+
This config option is defined by TextField.
+
+ +
+

growMin

+ growMin : Number +
+ The minimum width to allow when grow = true (defaults to 30)
+
This config option is defined by TextField.
+
+ +
+

handleHeight

+ handleHeight : Number +
+ The height in pixels of the dropdown list resize handle if resizable = true (defaults to 8)
+
This config option is defined by ComboBox.
+
+ +
+

hiddenName

+ hiddenName : String +
+ If specified, a hidden form field with this name is dynamically generated to store the field's data value (defaults to the underlying DOM element's name)
+
This config option is defined by ComboBox.
+
+ +
+

hideTrigger

+ hideTrigger : Boolean +
+ True to hide the trigger element and display only the base text field (defaults to false)
+
This config option is defined by TriggerField.
+
+ +
+

inputType

+ inputType : String +
+ The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
+
This config option is defined by Field.
+
+ +
+

invalidClass

+ invalidClass : String +
+ The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
+
This config option is defined by Field.
+
+ +
+

invalidText

+ invalidText : String +
+ The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field is invalid")
+
This config option is defined by Field.
+
+ +
+

lazyRender

+ lazyRender : Boolean +
+ True to prevent the ComboBox from rendering until requested (should always be used when rendering into an Ext.Editor, defaults to false)
+
This config option is defined by ComboBox.
+
+ +
+

listAlign

+ listAlign : String +
+ A valid anchor position value. See Ext.Element.alignTo for details on supported anchor positions (defaults to 'tl-bl')
+
This config option is defined by ComboBox.
+
+ +
+

listClass

+ listClass : String +
+ CSS class to apply to the dropdown list element (defaults to '')
+
This config option is defined by ComboBox.
+
+ +
+

listWidth

+ listWidth : Number +
+ The width in pixels of the dropdown list (defaults to the width of the ComboBox field)
+
This config option is defined by ComboBox.
+
+ +
+

loadingText

+ loadingText : String +
+ The text to display in the dropdown list while data is loading. Only applies when mode = 'remote' (defaults to 'Loading...')
+
This config option is defined by ComboBox.
+
+ +
+

maskRe

+ maskRe : String +
+ An input mask regular expression that will be used to filter keystrokes that don't match (defaults to null)
+
This config option is defined by TextField.
+
+ +
+

maxHeight

+ maxHeight : Number +
+ The maximum height in pixels of the dropdown list before scrollbars are shown (defaults to 300)
+
This config option is defined by ComboBox.
+
+ +
+

maxLength

+ maxLength : Number +
+ Maximum input field length allowed (defaults to Number.MAX_VALUE)
+
This config option is defined by TextField.
+
+ +
+

maxLengthText

+ maxLengthText : String +
+ Error text to display if the maximum length validation fails (defaults to "The maximum length for this field is {maxLength}")
+
This config option is defined by TextField.
+
+ +
+

minChars

+ minChars : Number +
+ The minimum number of characters the user must type before autocomplete and typeahead activate (defaults to 4, does not apply if editable = false)
+
This config option is defined by ComboBox.
+
+ +
+

minLength

+ minLength : Number +
+ Minimum input field length required (defaults to 0)
+
This config option is defined by TextField.
+
+ +
+

minLengthText

+ minLengthText : String +
+ Error text to display if the minimum length validation fails (defaults to "The minimum length for this field is {minLength}")
+
This config option is defined by TextField.
+
+ +
+

minListWidth

+ minListWidth : Number +
+ The minimum width of the dropdown list in pixels (defaults to 70, will be ignored if listWidth has a higher value)
+
This config option is defined by ComboBox.
+
+ +
+

mode

+ mode : String +
+ Set to 'local' if the ComboBox loads local data (defaults to 'remote' which loads from the server)
+
This config option is defined by ComboBox.
+
+ +
+

msgFx

+ msgFx : String +
+ Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
+
This config option is defined by Field.
+
+ +
+

msgTarget

+ msgTarget : String +
+ The location where error text should display. Should be one of the following values (defaults to 'qtip'):
 Value Description ----------- ---------------------------------------------------------------------- qtip Display a quick tip when the user hovers over the field title Display a default browser title attribute popup under Add a block div beneath the field containing the error text side Add an error icon to the right of the field with a popup on hover [element id] Add the error text directly to the innerHTML of the specified element 
+
This config option is defined by Field.
+
+ +
+

pageSize

+ pageSize : Number +
+ If greater than 0, a paging toolbar is displayed in the footer of the dropdown list and the filter queries will execute with page start and limit parameters. Only applies when mode = 'remote' (defaults to 0)
+
This config option is defined by ComboBox.
+
+ +
+

queryDelay

+ queryDelay : Number +
+ The length of time in milliseconds to delay between the start of typing and sending the query to filter the dropdown list (defaults to 500 if mode = 'remote' or 10 if mode = 'local')
+
This config option is defined by ComboBox.
+
+ +
+

queryParam

+ queryParam : String +
+ Name of the query as it will be passed on the querystring (defaults to 'query')
+
This config option is defined by ComboBox.
+
+ +
+

regex

+ regex : RegExp +
+ A JavaScript RegExp object to be tested against the field value during validation (defaults to null). If available, this regex will be evaluated only after the basic validators all return true, and will be passed the current field value. If the test fails, the field will be marked invalid using regexText.
+
This config option is defined by TextField.
+
+ +
+

regexText

+ regexText : String +
+ The error text to display if regex is used and the test fails during validation (defaults to "")
+
This config option is defined by TextField.
+
+ +
+

resizable

+ resizable : Boolean +
+ True to add a resize handle to the bottom of the dropdown list (defaults to false)
+
This config option is defined by ComboBox.
+
+ +
+

selectOnFocus

+ selectOnFocus : Boolean +
+ True to select any existing text in the field immediately on focus. Only applies when editable = true (defaults to false)
+
This config option is defined by ComboBox.
+
+ +
+

selectedClass

+ selectedClass : String +
+ CSS class to apply to the selected item in the dropdown list (defaults to 'x-combo-selected')
+
This config option is defined by ComboBox.
+
+ +
+

shadow

+ shadow : Boolean/String +
+ True or "sides" for the default effect, "frame" for 4-way shadow, and "drop" for bottom-right
+
This config option is defined by ComboBox.
+
+ +
+

transform

+ transform : String/HTMLElement/Element +
+ The id, DOM node or element of an existing select to convert to a ComboBox
+
This config option is defined by ComboBox.
+
+ +
+

triggerAction

+ triggerAction : String +
+ The action to execute when the trigger field is activated. Use 'all' to run the query specified by the allQuery config option (defaults to 'query')
+
This config option is defined by ComboBox.
+
+ +
+

triggerClass

+ triggerClass : String +
+ An additional CSS class used to style the trigger button. The trigger will always get the class 'x-form-trigger' and triggerClass will be appended if specified (defaults to 'x-form-arrow-trigger' which displays a downward arrow icon).
+
This config option is defined by ComboBox.
+
+ +
+

typeAhead

+ typeAhead : Boolean +
+ True to populate and autoselect the remainder of the text being typed after a configurable delay (typeAheadDelay) if it matches a known value (defaults to false)
+
This config option is defined by ComboBox.
+
+ +
+

typeAheadDelay

+ typeAheadDelay : Number +
+ The length of time in milliseconds to wait until the typeahead text is displayed if typeAhead = true (defaults to 250)
+
This config option is defined by ComboBox.
+
+ +
+

validateOnBlur

+ validateOnBlur : String/Boolean +
+ Defaults to true.
+
This config option is defined by Field.
+
+ +
+

validationDelay

+ validationDelay : Number +
+ The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
+
This config option is defined by Field.
+
+ +
+

validationEvent

+ validationEvent : String/Boolean +
+ The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
+
This config option is defined by Field.
+
+ +
+

validator

+ validator : Function +
+ A custom validation function to be called during field validation (defaults to null). If available, this function will be called only after the basic validators all return true, and will be passed the current field value and expected to return boolean true if the value is valid or a string error message if invalid.
+
This config option is defined by TextField.
+
+ +
+

value

+ value : Mixed +
+ A value to initialize this field with
+
This config option is defined by Field.
+
+ +
+

valueField

+ valueField : String +
+ The underlying data value name to bind to this CombBox (defaults to undefined if mode = 'remote' or 'value' if mode = 'local')
+
This config option is defined by ComboBox.
+
+ +
+

valueNotFoundText

+ valueNotFoundText : String +
+ When using a name/value combo, if the value passed to setValue is not found in the store, valueNotFoundText will be displayed as the field text if defined (defaults to undefined)
+
This config option is defined by ComboBox.
+
+ +
+

vtype

+ vtype : String +
+ A validation type name as defined in Ext.form.VTypes (defaults to null)
+
This config option is defined by TextField.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.form.DateField.html b/www/extras/yui-ext/docs/output/Ext.form.DateField.html new file mode 100644 index 000000000..df4362c47 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.form.DateField.html @@ -0,0 +1,2089 @@ + + + + Ext.form.DateField + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.form.DateField

+ + + + + +
Package:Ext.form
Class:DateField
Extends:TriggerField
Defined In:DateField.js
+
+ Provides a date input field with a Ext.DatePicker dropdown and automatic date validation.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 DateField(Object config)DateField
Create a new DateField
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 applyTo(String/HTMLElement/Element el) : Ext.form.FieldField
Apply the behaviors of this component to an existing element. This is used instead of render().
 autoSize() : voidTextField
Automatically grows the field to accomodate the width of the text up to the maximum field width allowed. +This only ta...
 clearInvalid() : voidField
Clear any invalid styles/messages for this field
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 getName() : StringField
Returns the name attribute of the field if available
 getRawValue() : MixedField
Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue.
 getValue() : DateDateField
Returns the current date value of the date field
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isValid(Boolean preventMark) : BooleanField
Returns whether or not the field value is currently valid
 isVisible() : voidComponent
Returns true if this component is visible
 markInvalid(String msg) : voidField
Mark this field as invalid
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 onTriggerClick(EventObject e) : voidTriggerField
The function that should handle the trigger's click event. This method does nothing by default until overridden +by a...
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 reset() : voidField
Resets the current field value to the originally-loaded value and clears any validation messages
 selectText([Number start], [Number end]) : voidTextField
Selects text in this field
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setRawValue(Mixed value) : voidField
Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue.
 setSize(Number width, Number height) : voidField
Sets the height and width of the field
 setValue(String/Date date) : voidDateField
Sets the value of the date field. You can pass a date object or any string that can be parsed into a valid +date, usi...
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 validate() : BooleanField
Validates the field value
 validateValue(Mixed value) : BooleanTextField
Validates a value according to the field's validation rules and marks the field as invalid +if the validation fails
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 autosize : (Ext.form.Field this, Number width)TextField
Fires when the autosize function is triggered. The field may or may not have actually changed size +according to the ...
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 blur : (Ext.form.Field this)Field
Fires when
 change : (Ext.form.Field this, Mixed value, Mixed value)Field
Fires just before the field blurs if the field value has changed
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 focus : (Ext.form.Field this)Field
Fires when this field receives input focus
 hide : (Ext.Component this)Component
Fires after the component is hidden
 invalid : (Ext.form.Field this, String msg)Field
Fires after the field has been marked as invalid
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
 specialkey : (Ext.form.Field this, Ext.EventObject e)Field
Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.g...
 valid : (Ext.form.Field this)Field
Fires after the field has been validated with no errors
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 allowBlank : BooleanTextField
False to validate that the value length > 0 (defaults to true)
 autoCreate : String/ObjectDateField
A DomHelper element spec, or true for a default element spec (defaults to {tag: "input", type: "text", size: "10", au...
 blankText : StringTextField
Error text to display if the allow blank validation fails (defaults to "This field is required")
 disableKeyFilter : BooleanTextField
True to disable input keystroke filtering (defaults to false)
 disabledDates : ArrayDateField
An array of "dates" to disable, as strings. These strings will be used to build a dynamic regular expression so they ...
 disabledDatesText : StringDateField
The tooltip text to display when the date falls on a disabled date (defaults to 'Disabled')
 disabledDays : ArrayDateField
An array of days to disable, 0 based. For example, [0, 6] disables Sunday and Saturday (defaults to null).
 disabledDaysText : StringDateField
The tooltip to display when the date falls on a disabled day (defaults to 'Disabled')
 emptyClass : StringTextField
The CSS class to apply to an empty field to style the emptyText (defaults to 'x-form-empty-field'). This class is aut...
 emptyText : StringTextField
The default text to display in an empty field (defaults to null).
 fieldClass : StringField
The default CSS class for the field (defaults to "x-form-field")
 focusClass : StringField
The CSS class to use when the field receives focus (defaults to "x-form-focus")
 format : StringDateField
The default date format string which can be overriden for localization support. The format must be valid according to...
 grow : BooleanTextField
True if this field should automatically grow and shrink to its content
 growMax : NumberTextField
The maximum width to allow when grow = true (defaults to 800)
 growMin : NumberTextField
The minimum width to allow when grow = true (defaults to 30)
 hideTrigger : BooleanTriggerField
True to hide the trigger element and display only the base text field (defaults to false)
 inputType : StringField
The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
 invalidClass : StringField
The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
 invalidText : StringDateField
The error to display when the date in the field is invalid (defaults to '{value} is not a valid date - it must be in ...
 maskRe : StringTextField
An input mask regular expression that will be used to filter keystrokes that don't match (defaults to null)
 maxLength : NumberTextField
Maximum input field length allowed (defaults to Number.MAX_VALUE)
 maxLengthText : StringTextField
Error text to display if the maximum length validation fails (defaults to "The maximum length for this field is {maxL...
 maxText : StringDateField
The error text to display when the date in the cell is before maxValue (defaults to 'The date in this field must be b...
 maxValue : Date/StringDateField
The maximum allowed date. Can be either a Javascript date object or a string date in a valid format (defaults to null).
 minLength : NumberTextField
Minimum input field length required (defaults to 0)
 minLengthText : StringTextField
Error text to display if the minimum length validation fails (defaults to "The minimum length for this field is {minL...
 minText : StringDateField
The error text to display when the date in the cell is before minValue (defaults to 'The date in this field must be a...
 minValue : Date/StringDateField
The minimum allowed date. Can be either a Javascript date object or a string date in a valid format (defaults to null).
 msgFx : StringField
Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
 msgTarget : StringField
The location where error text should display. Should be one of the following values (defaults to 'qtip'): Value Desc...
 regex : RegExpTextField
A JavaScript RegExp object to be tested against the field value during validation (defaults to null). If available, t...
 regexText : StringTextField
The error text to display if regex is used and the test fails during validation (defaults to "")
 selectOnFocus : BooleanTextField
True to automatically select any existing field text when the field receives input focus (defaults to false)
 triggerClass : StringDateField
An additional CSS class used to style the trigger button. The trigger will always get the class 'x-form-trigger' and ...
 validateOnBlur : String/BooleanField
Defaults to true.
 validationDelay : NumberField
The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
 validationEvent : String/BooleanField
The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
 validator : FunctionTextField
A custom validation function to be called during field validation (defaults to null). If available, this function wil...
 value : MixedField
A value to initialize this field with
 vtype : StringTextField
A validation type name as defined in Ext.form.VTypes (defaults to null)
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

DateField

+ public function DateField(Object config) +
+ Create a new DateField
+ Parameters: +
  • config : Object
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

applyTo

+ public function applyTo(String/HTMLElement/Element el) +
+ Apply the behaviors of this component to an existing element. This is used instead of render(). +
+ Parameters: +
  • el : String/HTMLElement/Element
    The id of the node, a DOM Node or an existing Element
+ Returns: +
    +
  • Ext.form.Field
    this
  • +
+
+
+
This method is defined by Field.
+
+ +
+

autoSize

+ public function autoSize() +
+ Automatically grows the field to accomodate the width of the text up to the maximum field width allowed. +This only takes effect if grow = true and fires the autosize event. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TextField.
+
+ +
+

clearInvalid

+ public function clearInvalid() +
+ Clear any invalid styles/messages for this field +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getName

+ public function getName() +
+ Returns the name attribute of the field if available +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    name The field name
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getRawValue

+ public function getRawValue() +
+ Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Mixed
    value The field value
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getValue

+ public function getValue() +
+ Returns the current date value of the date field +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Date
    value The date value
  • +
+
+
+
This method is defined by DateField.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isValid

+ public function isValid(Boolean preventMark) +
+ Returns whether or not the field value is currently valid +
+ Parameters: +
  • preventMark : Boolean
    True to disable marking the field invalid
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+ +
+

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

markInvalid

+ public function markInvalid(String msg) +
+ Mark this field as invalid +
+ Parameters: +
  • msg : String
    The validation message
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

on

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

onTriggerClick

+ public function onTriggerClick(EventObject e) +
+ The function that should handle the trigger's click event. This method does nothing by default until overridden +by a handler implementation. +
+ Parameters: +
  • e : EventObject
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TriggerField.
+
+ +
+

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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

reset

+ public function reset() +
+ Resets the current field value to the originally-loaded value and clears any validation messages +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

selectText

+ public function selectText([Number start], [Number end]) +
+ Selects text in this field +
+ Parameters: +
  • start : Number
    (optional) The index where the selection should start (defaults to 0)
  • end : Number
    (optional) The index where the selection should end (defaults to the text length)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TextField.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setRawValue

+ public function setRawValue(Mixed value) +
+ Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue. +
+ Parameters: +
  • value : Mixed
    The value to set
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setSize

+ public function setSize(Number width, Number height) +
+ Sets the height and width of the field +
+ Parameters: +
  • width : Number
    The new field width in pixels
  • height : Number
    The new field height in pixels
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setValue

+ public function setValue(String/Date date) +
+ Sets the value of the date field. You can pass a date object or any string that can be parsed into a valid +date, using DateField.format as the date format, according to the same rules as Date.parseDate +(the default format used is "m/d/y"). +
Usage: +

+//All of these calls set the same date value (May 4, 2006)
+
+//Pass a date object:
+var dt = new Date('5/4/06');
+dateField.setValue(dt);
+
+//Pass a date string (default format):
+dateField.setValue('5/4/06');
+
+//Pass a date string (custom format):
+dateField.format = 'Y-m-d';
+dateField.setValue('2006-5-4');
+
+
+ Parameters: +
  • date : String/Date
    The date or valid date string
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DateField.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

validate

+ public function validate() +
+ Validates the field value +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+ +
+

validateValue

+ public function validateValue(Mixed value) +
+ Validates a value according to the field's validation rules and marks the field as invalid +if the validation fails +
+ Parameters: +
  • value : Mixed
    The value to validate
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by TextField.
+
+
+ +

Event Details

+
+ +
+

autosize

+ public event autosize +
+ Fires when the autosize function is triggered. The field may or may not have actually changed size +according to the default logic, but this event provides a hook for the developer to apply additional +logic at runtime to resize the field if needed. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
    This text field
  • width : Number
    The new field width
+
+
+
This event is defined by TextField.
+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

blur

+ public event blur +
+ Fires when +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

change

+ public event change +
+ Fires just before the field blurs if the field value has changed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • value : Mixed
    The changed value
  • value : Mixed
    The original value
+
+
+
This event is defined by Field.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

focus

+ public event focus +
+ Fires when this field receives input focus +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

invalid

+ public event invalid +
+ Fires after the field has been marked as invalid +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • msg : String
    The validation message
+
+
+
This event is defined by Field.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

specialkey

+ public event specialkey +
+ Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.getKey to determine which key was pressed. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by Field.
+
+ +
+

valid

+ public event valid +
+ Fires after the field has been validated with no errors +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+
+

Config Details

+
+ +
+

allowBlank

+ allowBlank : Boolean +
+ False to validate that the value length > 0 (defaults to true)
+
This config option is defined by TextField.
+
+ +
+

autoCreate

+ autoCreate : String/Object +
+ A DomHelper element spec, or true for a default element spec (defaults to {tag: "input", type: "text", size: "10", autocomplete: "off"})
+
This config option is defined by DateField.
+
+ +
+

blankText

+ blankText : String +
+ Error text to display if the allow blank validation fails (defaults to "This field is required")
+
This config option is defined by TextField.
+
+ +
+

disableKeyFilter

+ disableKeyFilter : Boolean +
+ True to disable input keystroke filtering (defaults to false)
+
This config option is defined by TextField.
+
+ +
+

disabledDates

+ disabledDates : Array +
+ An array of "dates" to disable, as strings. These strings will be used to build a dynamic regular expression so they are very powerful. Some examples:
  • ["03/08/2003", "09/16/2003"] would disable those exact dates
  • ["03/08", "09/16"] would disable those days for every year
  • ["^03/08"] would only match the beginning (useful if you are using short years)
  • ["03/../2006"] would disable every day in March 2006
  • ["^03"] would disable every day in every March
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"].
+
This config option is defined by DateField.
+
+ +
+

disabledDatesText

+ disabledDatesText : String +
+ The tooltip text to display when the date falls on a disabled date (defaults to 'Disabled')
+
This config option is defined by DateField.
+
+ +
+

disabledDays

+ disabledDays : Array +
+ An array of days to disable, 0 based. For example, [0, 6] disables Sunday and Saturday (defaults to null).
+
This config option is defined by DateField.
+
+ +
+

disabledDaysText

+ disabledDaysText : String +
+ The tooltip to display when the date falls on a disabled day (defaults to 'Disabled')
+
This config option is defined by DateField.
+
+ +
+

emptyClass

+ emptyClass : String +
+ The CSS class to apply to an empty field to style the emptyText (defaults to 'x-form-empty-field'). This class is automatically added and removed as needed depending on the current field value.
+
This config option is defined by TextField.
+
+ +
+

emptyText

+ emptyText : String +
+ The default text to display in an empty field (defaults to null).
+
This config option is defined by TextField.
+
+ +
+

fieldClass

+ fieldClass : String +
+ The default CSS class for the field (defaults to "x-form-field")
+
This config option is defined by Field.
+
+ +
+

focusClass

+ focusClass : String +
+ The CSS class to use when the field receives focus (defaults to "x-form-focus")
+
This config option is defined by Field.
+
+ +
+

format

+ format : String +
+ The default date format string which can be overriden for localization support. The format must be valid according to Date.parseDate (defaults to 'm/d/y').
+
This config option is defined by DateField.
+
+ +
+

grow

+ grow : Boolean +
+ True if this field should automatically grow and shrink to its content
+
This config option is defined by TextField.
+
+ +
+

growMax

+ growMax : Number +
+ The maximum width to allow when grow = true (defaults to 800)
+
This config option is defined by TextField.
+
+ +
+

growMin

+ growMin : Number +
+ The minimum width to allow when grow = true (defaults to 30)
+
This config option is defined by TextField.
+
+ +
+

hideTrigger

+ hideTrigger : Boolean +
+ True to hide the trigger element and display only the base text field (defaults to false)
+
This config option is defined by TriggerField.
+
+ +
+

inputType

+ inputType : String +
+ The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
+
This config option is defined by Field.
+
+ +
+

invalidClass

+ invalidClass : String +
+ The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
+
This config option is defined by Field.
+
+ +
+

invalidText

+ invalidText : String +
+ The error to display when the date in the field is invalid (defaults to '{value} is not a valid date - it must be in the format {format}').
+
This config option is defined by DateField.
+
+ +
+

maskRe

+ maskRe : String +
+ An input mask regular expression that will be used to filter keystrokes that don't match (defaults to null)
+
This config option is defined by TextField.
+
+ +
+

maxLength

+ maxLength : Number +
+ Maximum input field length allowed (defaults to Number.MAX_VALUE)
+
This config option is defined by TextField.
+
+ +
+

maxLengthText

+ maxLengthText : String +
+ Error text to display if the maximum length validation fails (defaults to "The maximum length for this field is {maxLength}")
+
This config option is defined by TextField.
+
+ +
+

maxText

+ maxText : String +
+ The error text to display when the date in the cell is before maxValue (defaults to 'The date in this field must be before {maxValue}').
+
This config option is defined by DateField.
+
+ +
+

maxValue

+ maxValue : Date/String +
+ The maximum allowed date. Can be either a Javascript date object or a string date in a valid format (defaults to null).
+
This config option is defined by DateField.
+
+ +
+

minLength

+ minLength : Number +
+ Minimum input field length required (defaults to 0)
+
This config option is defined by TextField.
+
+ +
+

minLengthText

+ minLengthText : String +
+ Error text to display if the minimum length validation fails (defaults to "The minimum length for this field is {minLength}")
+
This config option is defined by TextField.
+
+ +
+

minText

+ minText : String +
+ The error text to display when the date in the cell is before minValue (defaults to 'The date in this field must be after {minValue}').
+
This config option is defined by DateField.
+
+ +
+

minValue

+ minValue : Date/String +
+ The minimum allowed date. Can be either a Javascript date object or a string date in a valid format (defaults to null).
+
This config option is defined by DateField.
+
+ +
+

msgFx

+ msgFx : String +
+ Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
+
This config option is defined by Field.
+
+ +
+

msgTarget

+ msgTarget : String +
+ The location where error text should display. Should be one of the following values (defaults to 'qtip'):
 Value Description ----------- ---------------------------------------------------------------------- qtip Display a quick tip when the user hovers over the field title Display a default browser title attribute popup under Add a block div beneath the field containing the error text side Add an error icon to the right of the field with a popup on hover [element id] Add the error text directly to the innerHTML of the specified element 
+
This config option is defined by Field.
+
+ +
+

regex

+ regex : RegExp +
+ A JavaScript RegExp object to be tested against the field value during validation (defaults to null). If available, this regex will be evaluated only after the basic validators all return true, and will be passed the current field value. If the test fails, the field will be marked invalid using regexText.
+
This config option is defined by TextField.
+
+ +
+

regexText

+ regexText : String +
+ The error text to display if regex is used and the test fails during validation (defaults to "")
+
This config option is defined by TextField.
+
+ +
+

selectOnFocus

+ selectOnFocus : Boolean +
+ True to automatically select any existing field text when the field receives input focus (defaults to false)
+
This config option is defined by TextField.
+
+ +
+

triggerClass

+ triggerClass : String +
+ An additional CSS class used to style the trigger button. The trigger will always get the class 'x-form-trigger' and triggerClass will be appended if specified (defaults to 'x-form-date-trigger' which displays a calendar icon).
+
This config option is defined by DateField.
+
+ +
+

validateOnBlur

+ validateOnBlur : String/Boolean +
+ Defaults to true.
+
This config option is defined by Field.
+
+ +
+

validationDelay

+ validationDelay : Number +
+ The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
+
This config option is defined by Field.
+
+ +
+

validationEvent

+ validationEvent : String/Boolean +
+ The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
+
This config option is defined by Field.
+
+ +
+

validator

+ validator : Function +
+ A custom validation function to be called during field validation (defaults to null). If available, this function will be called only after the basic validators all return true, and will be passed the current field value and expected to return boolean true if the value is valid or a string error message if invalid.
+
This config option is defined by TextField.
+
+ +
+

value

+ value : Mixed +
+ A value to initialize this field with
+
This config option is defined by Field.
+
+ +
+

vtype

+ vtype : String +
+ A validation type name as defined in Ext.form.VTypes (defaults to null)
+
This config option is defined by TextField.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.form.Field.html b/www/extras/yui-ext/docs/output/Ext.form.Field.html new file mode 100644 index 000000000..d5c44eaff --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.form.Field.html @@ -0,0 +1,1478 @@ + + + + Ext.form.Field + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.form.Field

+ + + + + + +
Package:Ext.form
Class:Field
Extends:Component
Subclasses:Checkbox, TextField
Defined In:Field.js
+
+ Base class for form fields that provides default event handling, sizing, value handling and other functionality.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Field(Object config)Field
Creates a new Field
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 applyTo(String/HTMLElement/Element el) : Ext.form.FieldField
Apply the behaviors of this component to an existing element. This is used instead of render().
 clearInvalid() : voidField
Clear any invalid styles/messages for this field
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 getName() : StringField
Returns the name attribute of the field if available
 getRawValue() : MixedField
Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue.
 getValue() : MixedField
Returns the normalized data value (undefined or emptyText will be returned as ''). To return the raw value see getRa...
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isValid(Boolean preventMark) : BooleanField
Returns whether or not the field value is currently valid
 isVisible() : voidComponent
Returns true if this component is visible
 markInvalid(String msg) : voidField
Mark this field as invalid
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 reset() : voidField
Resets the current field value to the originally-loaded value and clears any validation messages
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setRawValue(Mixed value) : voidField
Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue.
 setSize(Number width, Number height) : voidField
Sets the height and width of the field
 setValue(Mixed value) : voidField
Sets a data value into the field and validates it. To set the value directly without validation see setRawValue.
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 validate() : BooleanField
Validates the field value
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 blur : (Ext.form.Field this)Field
Fires when
 change : (Ext.form.Field this, Mixed value, Mixed value)Field
Fires just before the field blurs if the field value has changed
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 focus : (Ext.form.Field this)Field
Fires when this field receives input focus
 hide : (Ext.Component this)Component
Fires after the component is hidden
 invalid : (Ext.form.Field this, String msg)Field
Fires after the field has been marked as invalid
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
 specialkey : (Ext.form.Field this, Ext.EventObject e)Field
Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.g...
 valid : (Ext.form.Field this)Field
Fires after the field has been validated with no errors
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 autoCreate : String/ObjectField
A DomHelper element spec, or true for a default element spec (defaults to {tag: "input", type: "text", size: "20", au...
 fieldClass : StringField
The default CSS class for the field (defaults to "x-form-field")
 focusClass : StringField
The CSS class to use when the field receives focus (defaults to "x-form-focus")
 inputType : StringField
The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
 invalidClass : StringField
The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
 invalidText : StringField
The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field i...
 msgFx : StringField
Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
 msgTarget : StringField
The location where error text should display. Should be one of the following values (defaults to 'qtip'): Value Desc...
 validateOnBlur : String/BooleanField
Defaults to true.
 validationDelay : NumberField
The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
 validationEvent : String/BooleanField
The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
 value : MixedField
A value to initialize this field with
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

Field

+ public function Field(Object config) +
+ Creates a new Field
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

applyTo

+ public function applyTo(String/HTMLElement/Element el) +
+ Apply the behaviors of this component to an existing element. This is used instead of render(). +
+ Parameters: +
  • el : String/HTMLElement/Element
    The id of the node, a DOM Node or an existing Element
+ Returns: +
    +
  • Ext.form.Field
    this
  • +
+
+
+
This method is defined by Field.
+
+ +
+

clearInvalid

+ public function clearInvalid() +
+ Clear any invalid styles/messages for this field +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getName

+ public function getName() +
+ Returns the name attribute of the field if available +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    name The field name
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getRawValue

+ public function getRawValue() +
+ Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Mixed
    value The field value
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getValue

+ public function getValue() +
+ Returns the normalized data value (undefined or emptyText will be returned as ''). To return the raw value see getRawValue. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Mixed
    value The field value
  • +
+
+
+
This method is defined by Field.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isValid

+ public function isValid(Boolean preventMark) +
+ Returns whether or not the field value is currently valid +
+ Parameters: +
  • preventMark : Boolean
    True to disable marking the field invalid
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+ +
+

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

markInvalid

+ public function markInvalid(String msg) +
+ Mark this field as invalid +
+ Parameters: +
  • msg : String
    The validation message
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

reset

+ public function reset() +
+ Resets the current field value to the originally-loaded value and clears any validation messages +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setRawValue

+ public function setRawValue(Mixed value) +
+ Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue. +
+ Parameters: +
  • value : Mixed
    The value to set
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setSize

+ public function setSize(Number width, Number height) +
+ Sets the height and width of the field +
+ Parameters: +
  • width : Number
    The new field width in pixels
  • height : Number
    The new field height in pixels
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setValue

+ public function setValue(Mixed value) +
+ Sets a data value into the field and validates it. To set the value directly without validation see setRawValue. +
+ Parameters: +
  • value : Mixed
    The value to set
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

validate

+ public function validate() +
+ Validates the field value +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+
+ +

Event Details

+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

blur

+ public event blur +
+ Fires when +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

change

+ public event change +
+ Fires just before the field blurs if the field value has changed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • value : Mixed
    The changed value
  • value : Mixed
    The original value
+
+
+
This event is defined by Field.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

focus

+ public event focus +
+ Fires when this field receives input focus +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

invalid

+ public event invalid +
+ Fires after the field has been marked as invalid +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • msg : String
    The validation message
+
+
+
This event is defined by Field.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

specialkey

+ public event specialkey +
+ Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.getKey to determine which key was pressed. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by Field.
+
+ +
+

valid

+ public event valid +
+ Fires after the field has been validated with no errors +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+
+

Config Details

+
+ +
+

autoCreate

+ autoCreate : String/Object +
+ A DomHelper element spec, or true for a default element spec (defaults to {tag: "input", type: "text", size: "20", autocomplete: "off"})
+
This config option is defined by Field.
+
+ +
+

fieldClass

+ fieldClass : String +
+ The default CSS class for the field (defaults to "x-form-field")
+
This config option is defined by Field.
+
+ +
+

focusClass

+ focusClass : String +
+ The CSS class to use when the field receives focus (defaults to "x-form-focus")
+
This config option is defined by Field.
+
+ +
+

inputType

+ inputType : String +
+ The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
+
This config option is defined by Field.
+
+ +
+

invalidClass

+ invalidClass : String +
+ The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
+
This config option is defined by Field.
+
+ +
+

invalidText

+ invalidText : String +
+ The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field is invalid")
+
This config option is defined by Field.
+
+ +
+

msgFx

+ msgFx : String +
+ Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
+
This config option is defined by Field.
+
+ +
+

msgTarget

+ msgTarget : String +
+ The location where error text should display. Should be one of the following values (defaults to 'qtip'):
 Value Description ----------- ---------------------------------------------------------------------- qtip Display a quick tip when the user hovers over the field title Display a default browser title attribute popup under Add a block div beneath the field containing the error text side Add an error icon to the right of the field with a popup on hover [element id] Add the error text directly to the innerHTML of the specified element 
+
This config option is defined by Field.
+
+ +
+

validateOnBlur

+ validateOnBlur : String/Boolean +
+ Defaults to true.
+
This config option is defined by Field.
+
+ +
+

validationDelay

+ validationDelay : Number +
+ The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
+
This config option is defined by Field.
+
+ +
+

validationEvent

+ validationEvent : String/Boolean +
+ The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
+
This config option is defined by Field.
+
+ +
+

value

+ value : Mixed +
+ A value to initialize this field with
+
This config option is defined by Field.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.form.FieldSet.html b/www/extras/yui-ext/docs/output/Ext.form.FieldSet.html new file mode 100644 index 000000000..f33d6f4f0 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.form.FieldSet.html @@ -0,0 +1,985 @@ + + + + Ext.form.FieldSet + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.form.FieldSet

+ + + + + +
Package:Ext.form
Class:FieldSet
Extends:Layout
Defined In:Layout.js
+
+ Creates a fieldset container for layout and rendering of fields in an Ext.form.Form.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 FieldSet(Object config)FieldSet
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isVisible() : voidComponent
Returns true if this component is visible
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 hide : (Ext.Component this)Component
Fires after the component is hidden
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 autoCreate : String/ObjectFieldSet
A DomHelper element spec used to autocreate the fieldset (defaults to {tag: 'fieldset', cn: {tag:'legend'}})
 clear : BooleanLayout
True to add a clearing element at the end of this layout, equivalent to CSS clear: both (defaults to true)
 hideLabels : BooleanLayout
True to suppress the display of field labels in this layout (defaults to false)
 labelAlign : StringLayout
Valid values are "left," "top" and "right" (defaults to "left")
 labelSeparator : StringLayout
The separator to use after field labels (defaults to ':')
 labelWidth : NumberLayout
Fixed width in pixels of all field labels (defaults to undefined)
 legend : StringFieldSet
The text to display as the legend for the FieldSet (defaults to '')
 style : String/Object/FunctionLayout
A style specification string eg "width:100px", or object in the form {width:"100px"}, or a function which returns suc...
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

FieldSet

+ public function FieldSet(Object config) +
+
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+
+

Config Details

+
+ +
+

autoCreate

+ autoCreate : String/Object +
+ A DomHelper element spec used to autocreate the fieldset (defaults to {tag: 'fieldset', cn: {tag:'legend'}})
+
This config option is defined by FieldSet.
+
+ +
+

clear

+ clear : Boolean +
+ True to add a clearing element at the end of this layout, equivalent to CSS clear: both (defaults to true)
+
This config option is defined by Layout.
+
+ +
+

hideLabels

+ hideLabels : Boolean +
+ True to suppress the display of field labels in this layout (defaults to false)
+
This config option is defined by Layout.
+
+ +
+

labelAlign

+ labelAlign : String +
+ Valid values are "left," "top" and "right" (defaults to "left")
+
This config option is defined by Layout.
+
+ +
+

labelSeparator

+ labelSeparator : String +
+ The separator to use after field labels (defaults to ':')
+
This config option is defined by Layout.
+
+ +
+

labelWidth

+ labelWidth : Number +
+ Fixed width in pixels of all field labels (defaults to undefined)
+
This config option is defined by Layout.
+
+ +
+

legend

+ legend : String +
+ The text to display as the legend for the FieldSet (defaults to '')
+
This config option is defined by FieldSet.
+
+ +
+

style

+ style : 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.
+
This config option is defined by Layout.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.form.Form.html b/www/extras/yui-ext/docs/output/Ext.form.Form.html new file mode 100644 index 000000000..2b7f2be46 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.form.Form.html @@ -0,0 +1,1263 @@ + + + + Ext.form.Form + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.form.Form

+ + + + + +
Package:Ext.form
Class:Form
Extends:BasicForm
Defined In:Form.js
+
+ Adds the ability to dynamically render forms with JS to Ext.form.BasicForm.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 buttons : ArrayForm
Array of all the buttons that have been added to this form via addButton
 waitMsgTarget : MixedBasicForm
By default wait messages are displayed with Ext.MessageBox.wait. You can target a specific +element by passing it or i...
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Form(Object config)Form
 add(Field field1, [Field field2], [Field etc]) : FormForm
Add Ext.form components to the current open container (e.g. column, fieldset, etc)
 addButton(String/Object config, Function handler, [Object scope]) : Ext.ButtonForm
Adds a button to the footer of the form - this must be called before the form is rendered.
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 applyIfToFields(Object values) : voidBasicForm
Calls Ext.applyIf for all field in this form with the passed object
 applyToFields(Object values) : voidBasicForm
Calls Ext.apply for all field in this form with the passed object
 clearInvalid() : voidBasicForm
Clears all invalid messages in this form
 column(Object config, [Field field1], [Field field2], [Field etc]) : ColumnForm
Opens the a new Ext.form.Column container in the layout stack. If fields are passed after the config, the +fields are ...
 container(Object config, [Field field1], [Field field2], [Field etc]) : LayoutForm
Opens the a new Ext.form.Layout container in the layout stack. If fields are passed after the config, the +fields are ...
 doAction(String actionName, Object options) : voidBasicForm
Performs a predefined action (submit or load) or custom actions you define on this form
 end() : FormForm
Closes the current open container
 fieldset(Object config, [Field field1], [Field field2], [Field etc]) : FieldSetForm
Opens the a new Ext.form.FieldSet container in the layout stack. If fields are passed after the config, the +fields ar...
 findField(String id) : FieldBasicForm
Find a Ext.form.Field in this form by id, dataIndex, name or hiddenName
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getValues(Boolean asString) : ObjectBasicForm
Returns the fields in this form as an object with key value pair. If multiple fields exist with the same name +they ar...
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 isValid() : BooleanBasicForm
Returns true is client-side validation on the form is successful
 load(Object options) : voidBasicForm
Shortcut to do a load action
 markInvalid(Array/Object errors) : voidBasicForm
Mark fields in this form invalid in bulk.
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 remove(Field field) : voidBasicForm
Removes a field from the items collection (does NOT remove its markup)
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render(String/HTMLElement/Element container) : FormForm
Render this form into the passed container. This should only be called once!
 reset() : voidBasicForm
Resets this form
 setValues(Array/Object values) : voidBasicForm
Set values for fields in this form in bulk.
 start(Object container) : FormForm
Opens the passed container in the layout stack. The container can be any Ext.form.Layout or subclass.
 startMonitoring() : voidForm
Starts monitoring of the valid state of this form. Usually this is don't by passing the config +option "monitorValid"
 stopMonitoring() : voidForm
Stops monitoring of the valid state of this form
 submit(Object options) : voidBasicForm
Shortcut to do a submit action
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 updateRecord(Record record) : voidBasicForm
Persists the values in this form into the passed Ext.data.Record object in a beginEdit/endEdit block.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 actioncomplete : (Form this, Action action)BasicForm
Fires when an action is completed
 actionfailed : (Form this, Action action)BasicForm
Fires when an action fails
 beforeaction : (Form this, Action action)BasicForm
Fires before any action is performed. Return false to cancel the action.
 clientvalidation : (Form this, Boolean valid)Form
If the monitorValid config option is true, this event fires repetitively to notify of valid state
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 baseParams : ObjectBasicForm
Parameters to pass with all requests. e.g. baseParams: {id: '123', foo: 'bar'}
 buttonAlign : StringForm
Valid values are "left," "center" and "right" (defaults to "center")
 errorReader : DataReaderBasicForm
An Ext.data.DataReader (e.g. Ext.data.XmlReader to be used to read data when reading validation errors on "submit" ac...
 fileUpload : BooleanBasicForm
Set to true if this form is a file upload (YUI adapter only)
 itemCls : StringForm
A css class to apply to the x-form-item of fields. This property cascades to child containers.
 labelAlign : StringForm
Valid values are "left," "top" and "right" (defaults to "left"). This property cascades to child containers if not set.
 labelWidth : NumberForm
The width of labels. This property cascades to child containers.
 method : StringBasicForm
The request method to use (GET or POST) for form actions if one isn't supplied in the action options
 minButtonWidth : NumberForm
Minimum width of all buttons (defaults to 75)
 monitorPoll : NumberForm
The milliseconds to poll valid state, ignored if monitorValid is not true (defaults to 200)
 monitorValid : BooleanForm
If true the form monitors it's valid state client-side and fires a looping event with that state. This is required to...
 reader : DataReaderBasicForm
An Ext.data.DataReader (e.g. Ext.data.XmlReader to be used to read data when executing "load" actions. This is comple...
 timeout : NumberBasicForm
 url : StringBasicForm
The url to use for form actions if one isn't supplied in the action options
+

Property Details

+
+ +
+

buttons

+ public Array buttons +
+ Array of all the buttons that have been added to this form via addButton
+
This property is defined by Form.
+
+ +
+

waitMsgTarget

+ public Mixed waitMsgTarget +
+ By default wait messages are displayed with Ext.MessageBox.wait. You can target a specific +element by passing it or its id or mask the form itself by passing in true.
+
This property is defined by BasicForm.
+
+
+ + +

Constructor Details

+
+
+

Form

+ public function Form(Object config) +
+
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

add

+ public function add(Field field1, [Field field2], [Field etc]) +
+ Add Ext.form components to the current open container (e.g. column, fieldset, etc) +
+ Parameters: +
  • field1 : Field
  • field2 : Field
    (optional)
  • etc : Field
    (optional)
+ Returns: +
    +
  • Form
    this
  • +
+
+
+
This method is defined by Form.
+
+ +
+

addButton

+ public function addButton(String/Object config, Function handler, [Object scope]) +
+ Adds a button to the footer of the form - this must be called before the form is rendered. +
+ Parameters: +
  • config : String/Object
    A string becomes the button text, an object can either be a Button config object or a valid Ext.DomHelper element config
  • handler : Function
    The function called when the button is clicked
  • scope : Object
    (optional) The scope of the handler function
+ Returns: +
    +
  • Ext.Button
  • +
+
+
+
This method is defined by Form.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

applyIfToFields

+ public function applyIfToFields(Object values) +
+ Calls Ext.applyIf for all field in this form with the passed object +
+ Parameters: +
  • values : Object
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

applyToFields

+ public function applyToFields(Object values) +
+ Calls Ext.apply for all field in this form with the passed object +
+ Parameters: +
  • values : Object
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

clearInvalid

+ public function clearInvalid() +
+ Clears all invalid messages in this form +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

column

+ public function column(Object config, [Field field1], [Field field2], [Field etc]) +
+ Opens the a new Ext.form.Column container in the layout stack. If fields are passed after the config, the +fields are added and the column is closed. If no fields are passed the column remains open +until end() is called. +
+ Parameters: +
  • config : Object
    The config to pass to the column
  • field1 : Field
    (optional)
  • field2 : Field
    (optional)
  • etc : Field
    (optional)
+ Returns: +
    +
  • Column
    The column container object
  • +
+
+
+
This method is defined by Form.
+
+ +
+

container

+ public function container(Object config, [Field field1], [Field field2], [Field etc]) +
+ Opens the a new Ext.form.Layout container in the layout stack. If fields are passed after the config, the +fields are added and the container is closed. If no fields are passed the container remains open +until end() is called. +
+ Parameters: +
  • config : Object
    The config to pass to the Layout
  • field1 : Field
    (optional)
  • field2 : Field
    (optional)
  • etc : Field
    (optional)
+ Returns: +
    +
  • Layout
    The container object
  • +
+
+
+
This method is defined by Form.
+
+ +
+

doAction

+ public function doAction(String actionName, Object options) +
+ Performs a predefined action (submit or load) or custom actions you define on this form +
+ Parameters: +
  • actionName : String
    The name of the action type
  • options : Object
    The options to pass to the action
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

end

+ public function end() +
+ Closes the current open container +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Form
    this
  • +
+
+
+
This method is defined by Form.
+
+ +
+

fieldset

+ public function fieldset(Object config, [Field field1], [Field field2], [Field etc]) +
+ Opens the a new Ext.form.FieldSet container in the layout stack. If fields are passed after the config, the +fields are added and the fieldset is closed. If no fields are passed the fieldset remains open +until end() is called. +
+ Parameters: +
  • config : Object
    The config to pass to the fieldset
  • field1 : Field
    (optional)
  • field2 : Field
    (optional)
  • etc : Field
    (optional)
+ Returns: +
    +
  • FieldSet
    The fieldset container object
  • +
+
+
+
This method is defined by Form.
+
+ +
+

findField

+ public function findField(String id) +
+ Find a Ext.form.Field in this form by id, dataIndex, name or hiddenName +
+ Parameters: +
  • id : String
    The value to search for
+ Returns: +
    +
  • Field
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

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.
+
+ +
+

getValues

+ public function getValues(Boolean asString) +
+ Returns the fields in this form as an object with key value pair. If multiple fields exist with the same name +they are returned as an array. +
+ Parameters: +
  • asString : Boolean
+ Returns: +
    +
  • Object
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

isValid

+ public function isValid() +
+ Returns true is client-side validation on the form is successful +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

load

+ public function load(Object options) +
+ Shortcut to do a load action +
+ Parameters: +
  • options : Object
    The options to pass to the action
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

markInvalid

+ public function markInvalid(Array/Object errors) +
+ Mark fields in this form invalid in bulk. +
+ Parameters: +
  • errors : Array/Object
    Either an array in the form [{id:'fieldId', msg:'The message'},...] or an object hash of {id: msg, id2: msg2}
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

remove

+ public function remove(Field field) +
+ Removes a field from the items collection (does NOT remove its markup) +
+ Parameters: +
  • field : Field
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

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(String/HTMLElement/Element container) +
+ Render this form into the passed container. This should only be called once! +
+ Parameters: +
  • container : String/HTMLElement/Element
    The element this component should be rendered into
+ Returns: +
    +
  • Form
    this
  • +
+
+
+
This method is defined by Form.
+
+ +
+

reset

+ public function reset() +
+ Resets this form +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

setValues

+ public function setValues(Array/Object values) +
+ Set values for fields in this form in bulk. +
+ Parameters: +
  • values : Array/Object
    Either an array in the form [{id:'fieldId', value:'foo'},...] or an object hash of {id: value, id2: value2}
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

start

+ public function start(Object container) +
+ Opens the passed container in the layout stack. The container can be any Ext.form.Layout or subclass. +
+ Parameters: +
  • container : Object
    A Ext.form.Layout or subclass of Layout
+ Returns: +
    +
  • Form
    this
  • +
+
+
+
This method is defined by Form.
+
+ +
+

startMonitoring

+ public function startMonitoring() +
+ Starts monitoring of the valid state of this form. Usually this is don't by passing the config +option "monitorValid" +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Form.
+
+ +
+

stopMonitoring

+ public function stopMonitoring() +
+ Stops monitoring of the valid state of this form +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Form.
+
+ +
+

submit

+ public function submit(Object options) +
+ Shortcut to do a submit action +
+ Parameters: +
  • options : Object
    The options to pass to the action
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

updateRecord

+ public function updateRecord(Record record) +
+ Persists the values in this form into the passed Ext.data.Record object in a beginEdit/endEdit block. +
+ Parameters: +
  • record : Record
    The record to edit
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicForm.
+
+
+ +

Event Details

+
+ +
+

actioncomplete

+ public event actioncomplete +
+ Fires when an action is completed +
+ Subscribers will be called with the following parameters: +
  • this : Form
  • action : Action
    The action that completed
+
+
+
This event is defined by BasicForm.
+
+ +
+

actionfailed

+ public event actionfailed +
+ Fires when an action fails +
+ Subscribers will be called with the following parameters: +
  • this : Form
  • action : Action
    The action that failed
+
+
+
This event is defined by BasicForm.
+
+ +
+

beforeaction

+ public event beforeaction +
+ Fires before any action is performed. Return false to cancel the action. +
+ Subscribers will be called with the following parameters: +
  • this : Form
  • action : Action
    The action to be performed
+
+
+
This event is defined by BasicForm.
+
+ +
+

clientvalidation

+ public event clientvalidation +
+ If the monitorValid config option is true, this event fires repetitively to notify of valid state +
+ Subscribers will be called with the following parameters: +
  • this : Form
  • valid : Boolean
    true if the form has passed client-side validation
+
+
+
This event is defined by Form.
+
+
+

Config Details

+
+ +
+

baseParams

+ baseParams : Object +
+ Parameters to pass with all requests. e.g. baseParams: {id: '123', foo: 'bar'}
+
This config option is defined by BasicForm.
+
+ +
+

buttonAlign

+ buttonAlign : String +
+ Valid values are "left," "center" and "right" (defaults to "center")
+
This config option is defined by Form.
+
+ +
+

errorReader

+ errorReader : DataReader +
+ An Ext.data.DataReader (e.g. Ext.data.XmlReader to be used to read data when reading validation errors on "submit" actions. This is completely optional as there is built-in support for processing JSON.
+
This config option is defined by BasicForm.
+
+ +
+

fileUpload

+ fileUpload : Boolean +
+ Set to true if this form is a file upload (YUI adapter only)
+
This config option is defined by BasicForm.
+
+ +
+

itemCls

+ itemCls : String +
+ A css class to apply to the x-form-item of fields. This property cascades to child containers.
+
This config option is defined by Form.
+
+ +
+

labelAlign

+ labelAlign : String +
+ Valid values are "left," "top" and "right" (defaults to "left"). This property cascades to child containers if not set.
+
This config option is defined by Form.
+
+ +
+

labelWidth

+ labelWidth : Number +
+ The width of labels. This property cascades to child containers.
+
This config option is defined by Form.
+
+ +
+

method

+ method : String +
+ The request method to use (GET or POST) for form actions if one isn't supplied in the action options
+
This config option is defined by BasicForm.
+
+ +
+

minButtonWidth

+ minButtonWidth : Number +
+ Minimum width of all buttons (defaults to 75)
+
This config option is defined by Form.
+
+ +
+

monitorPoll

+ monitorPoll : Number +
+ The milliseconds to poll valid state, ignored if monitorValid is not true (defaults to 200)
+
This config option is defined by Form.
+
+ +
+

monitorValid

+ monitorValid : Boolean +
+ If true the form monitors it's valid state client-side and fires a looping event with that state. This is required to bind buttons to the valid state using the config value bindForm:true on the button.
+
This config option is defined by Form.
+
+ +
+

reader

+ reader : DataReader +
+ An Ext.data.DataReader (e.g. Ext.data.XmlReader to be used to read data when executing "load" actions. This is completely optional as there is built-in support for processing JSON.
+
This config option is defined by BasicForm.
+
+ +
+

timeout

+ timeout : Number +
+
+
This config option is defined by BasicForm.
+
+ +
+

url

+ url : String +
+ The url to use for form actions if one isn't supplied in the action options
+
This config option is defined by BasicForm.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.form.Layout.html b/www/extras/yui-ext/docs/output/Ext.form.Layout.html new file mode 100644 index 000000000..a67e68c0b --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.form.Layout.html @@ -0,0 +1,970 @@ + + + + Ext.form.Layout + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.form.Layout

+ + + + + + +
Package:Ext.form
Class:Layout
Extends:Component
Subclasses:Column, FieldSet
Defined In:Layout.js
+
+ Creates a container for layout and rendering of fields in an Ext.form.Form.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Layout(Object config)Layout
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isVisible() : voidComponent
Returns true if this component is visible
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 hide : (Ext.Component this)Component
Fires after the component is hidden
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 autoCreate : String/ObjectLayout
A DomHelper element spec used to autocreate the layout (defaults to {tag: 'div', cls: 'x-form-ct'})
 clear : BooleanLayout
True to add a clearing element at the end of this layout, equivalent to CSS clear: both (defaults to true)
 hideLabels : BooleanLayout
True to suppress the display of field labels in this layout (defaults to false)
 labelAlign : StringLayout
Valid values are "left," "top" and "right" (defaults to "left")
 labelSeparator : StringLayout
The separator to use after field labels (defaults to ':')
 labelWidth : NumberLayout
Fixed width in pixels of all field labels (defaults to undefined)
 style : String/Object/FunctionLayout
A style specification string eg "width:100px", or object in the form {width:"100px"}, or a function which returns suc...
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

Layout

+ public function Layout(Object config) +
+
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+
+

Config Details

+
+ +
+

autoCreate

+ autoCreate : String/Object +
+ A DomHelper element spec used to autocreate the layout (defaults to {tag: 'div', cls: 'x-form-ct'})
+
This config option is defined by Layout.
+
+ +
+

clear

+ clear : Boolean +
+ True to add a clearing element at the end of this layout, equivalent to CSS clear: both (defaults to true)
+
This config option is defined by Layout.
+
+ +
+

hideLabels

+ hideLabels : Boolean +
+ True to suppress the display of field labels in this layout (defaults to false)
+
This config option is defined by Layout.
+
+ +
+

labelAlign

+ labelAlign : String +
+ Valid values are "left," "top" and "right" (defaults to "left")
+
This config option is defined by Layout.
+
+ +
+

labelSeparator

+ labelSeparator : String +
+ The separator to use after field labels (defaults to ':')
+
This config option is defined by Layout.
+
+ +
+

labelWidth

+ labelWidth : Number +
+ Fixed width in pixels of all field labels (defaults to undefined)
+
This config option is defined by Layout.
+
+ +
+

style

+ style : 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.
+
This config option is defined by Layout.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.form.NumberField.html b/www/extras/yui-ext/docs/output/Ext.form.NumberField.html new file mode 100644 index 000000000..c1bff3dbf --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.form.NumberField.html @@ -0,0 +1,2012 @@ + + + + Ext.form.NumberField + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.form.NumberField

+ + + + + +
Package:Ext.form
Class:NumberField
Extends:TextField
Defined In:NumberField.js
+
+ Numeric text field that provides automatic keystroke filtering and numeric validation.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 NumberField(Object config)NumberField
Creates a new NumberField
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 applyTo(String/HTMLElement/Element el) : Ext.form.FieldField
Apply the behaviors of this component to an existing element. This is used instead of render().
 autoSize() : voidTextField
Automatically grows the field to accomodate the width of the text up to the maximum field width allowed. +This only ta...
 clearInvalid() : voidField
Clear any invalid styles/messages for this field
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 getName() : StringField
Returns the name attribute of the field if available
 getRawValue() : MixedField
Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue.
 getValue() : MixedField
Returns the normalized data value (undefined or emptyText will be returned as ''). To return the raw value see getRa...
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isValid(Boolean preventMark) : BooleanField
Returns whether or not the field value is currently valid
 isVisible() : voidComponent
Returns true if this component is visible
 markInvalid(String msg) : voidField
Mark this field as invalid
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 reset() : voidField
Resets the current field value to the originally-loaded value and clears any validation messages
 selectText([Number start], [Number end]) : voidTextField
Selects text in this field
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setRawValue(Mixed value) : voidField
Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue.
 setSize(Number width, Number height) : voidField
Sets the height and width of the field
 setValue(Mixed value) : voidField
Sets a data value into the field and validates it. To set the value directly without validation see setRawValue.
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 validate() : BooleanField
Validates the field value
 validateValue(Mixed value) : BooleanTextField
Validates a value according to the field's validation rules and marks the field as invalid +if the validation fails
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 autosize : (Ext.form.Field this, Number width)TextField
Fires when the autosize function is triggered. The field may or may not have actually changed size +according to the ...
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 blur : (Ext.form.Field this)Field
Fires when
 change : (Ext.form.Field this, Mixed value, Mixed value)Field
Fires just before the field blurs if the field value has changed
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 focus : (Ext.form.Field this)Field
Fires when this field receives input focus
 hide : (Ext.Component this)Component
Fires after the component is hidden
 invalid : (Ext.form.Field this, String msg)Field
Fires after the field has been marked as invalid
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
 specialkey : (Ext.form.Field this, Ext.EventObject e)Field
Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.g...
 valid : (Ext.form.Field this)Field
Fires after the field has been validated with no errors
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 allowBlank : BooleanTextField
False to validate that the value length > 0 (defaults to true)
 allowDecimals : BooleanNumberField
False to disallow decimal values (defaults to true)
 allowNegative : BooleanNumberField
False to require only positive numbers (defaults to true)
 autoCreate : String/ObjectField
A DomHelper element spec, or true for a default element spec (defaults to {tag: "input", type: "text", size: "20", au...
 blankText : StringTextField
Error text to display if the allow blank validation fails (defaults to "This field is required")
 decimalPrecision : NumberNumberField
The maximum precision to display after the decimal separator (defaults to 2)
 decimalSeparator : StringNumberField
Character(s) to allow as the decimal separator (defaults to '.')
 disableKeyFilter : BooleanTextField
True to disable input keystroke filtering (defaults to false)
 emptyClass : StringTextField
The CSS class to apply to an empty field to style the emptyText (defaults to 'x-form-empty-field'). This class is aut...
 emptyText : StringTextField
The default text to display in an empty field (defaults to null).
 fieldClass : StringNumberField
The default CSS class for the field (defaults to "x-form-field x-form-num-field")
 focusClass : StringField
The CSS class to use when the field receives focus (defaults to "x-form-focus")
 grow : BooleanTextField
True if this field should automatically grow and shrink to its content
 growMax : NumberTextField
The maximum width to allow when grow = true (defaults to 800)
 growMin : NumberTextField
The minimum width to allow when grow = true (defaults to 30)
 inputType : StringField
The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
 invalidClass : StringField
The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
 invalidText : StringField
The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field i...
 maskRe : StringTextField
An input mask regular expression that will be used to filter keystrokes that don't match (defaults to null)
 maxLength : NumberTextField
Maximum input field length allowed (defaults to Number.MAX_VALUE)
 maxLengthText : StringTextField
Error text to display if the maximum length validation fails (defaults to "The maximum length for this field is {maxL...
 maxText : StringNumberField
Error text to display if the maximum value validation fails (defaults to "The maximum value for this field is {maxVal...
 maxValue : NumberNumberField
The maximum allowed value (defaults to Number.MAX_VALUE)
 minLength : NumberTextField
Minimum input field length required (defaults to 0)
 minLengthText : StringTextField
Error text to display if the minimum length validation fails (defaults to "The minimum length for this field is {minL...
 minText : StringNumberField
Error text to display if the minimum value validation fails (defaults to "The minimum value for this field is {minVal...
 minValue : NumberNumberField
The minimum allowed value (defaults to Number.NEGATIVE_INFINITY)
 msgFx : StringField
Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
 msgTarget : StringField
The location where error text should display. Should be one of the following values (defaults to 'qtip'): Value Desc...
 nanText : StringNumberField
Error text to display if the value is not a valid number. For example, this can happen if a valid character like '.' ...
 regex : RegExpTextField
A JavaScript RegExp object to be tested against the field value during validation (defaults to null). If available, t...
 regexText : StringTextField
The error text to display if regex is used and the test fails during validation (defaults to "")
 selectOnFocus : BooleanTextField
True to automatically select any existing field text when the field receives input focus (defaults to false)
 validateOnBlur : String/BooleanField
Defaults to true.
 validationDelay : NumberField
The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
 validationEvent : String/BooleanField
The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
 validator : FunctionTextField
A custom validation function to be called during field validation (defaults to null). If available, this function wil...
 value : MixedField
A value to initialize this field with
 vtype : StringTextField
A validation type name as defined in Ext.form.VTypes (defaults to null)
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

NumberField

+ public function NumberField(Object config) +
+ Creates a new NumberField
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

applyTo

+ public function applyTo(String/HTMLElement/Element el) +
+ Apply the behaviors of this component to an existing element. This is used instead of render(). +
+ Parameters: +
  • el : String/HTMLElement/Element
    The id of the node, a DOM Node or an existing Element
+ Returns: +
    +
  • Ext.form.Field
    this
  • +
+
+
+
This method is defined by Field.
+
+ +
+

autoSize

+ public function autoSize() +
+ Automatically grows the field to accomodate the width of the text up to the maximum field width allowed. +This only takes effect if grow = true and fires the autosize event. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TextField.
+
+ +
+

clearInvalid

+ public function clearInvalid() +
+ Clear any invalid styles/messages for this field +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getName

+ public function getName() +
+ Returns the name attribute of the field if available +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    name The field name
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getRawValue

+ public function getRawValue() +
+ Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Mixed
    value The field value
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getValue

+ public function getValue() +
+ Returns the normalized data value (undefined or emptyText will be returned as ''). To return the raw value see getRawValue. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Mixed
    value The field value
  • +
+
+
+
This method is defined by Field.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isValid

+ public function isValid(Boolean preventMark) +
+ Returns whether or not the field value is currently valid +
+ Parameters: +
  • preventMark : Boolean
    True to disable marking the field invalid
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+ +
+

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

markInvalid

+ public function markInvalid(String msg) +
+ Mark this field as invalid +
+ Parameters: +
  • msg : String
    The validation message
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

reset

+ public function reset() +
+ Resets the current field value to the originally-loaded value and clears any validation messages +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

selectText

+ public function selectText([Number start], [Number end]) +
+ Selects text in this field +
+ Parameters: +
  • start : Number
    (optional) The index where the selection should start (defaults to 0)
  • end : Number
    (optional) The index where the selection should end (defaults to the text length)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TextField.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setRawValue

+ public function setRawValue(Mixed value) +
+ Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue. +
+ Parameters: +
  • value : Mixed
    The value to set
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setSize

+ public function setSize(Number width, Number height) +
+ Sets the height and width of the field +
+ Parameters: +
  • width : Number
    The new field width in pixels
  • height : Number
    The new field height in pixels
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setValue

+ public function setValue(Mixed value) +
+ Sets a data value into the field and validates it. To set the value directly without validation see setRawValue. +
+ Parameters: +
  • value : Mixed
    The value to set
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

validate

+ public function validate() +
+ Validates the field value +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+ +
+

validateValue

+ public function validateValue(Mixed value) +
+ Validates a value according to the field's validation rules and marks the field as invalid +if the validation fails +
+ Parameters: +
  • value : Mixed
    The value to validate
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by TextField.
+
+
+ +

Event Details

+
+ +
+

autosize

+ public event autosize +
+ Fires when the autosize function is triggered. The field may or may not have actually changed size +according to the default logic, but this event provides a hook for the developer to apply additional +logic at runtime to resize the field if needed. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
    This text field
  • width : Number
    The new field width
+
+
+
This event is defined by TextField.
+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

blur

+ public event blur +
+ Fires when +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

change

+ public event change +
+ Fires just before the field blurs if the field value has changed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • value : Mixed
    The changed value
  • value : Mixed
    The original value
+
+
+
This event is defined by Field.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

focus

+ public event focus +
+ Fires when this field receives input focus +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

invalid

+ public event invalid +
+ Fires after the field has been marked as invalid +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • msg : String
    The validation message
+
+
+
This event is defined by Field.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

specialkey

+ public event specialkey +
+ Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.getKey to determine which key was pressed. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by Field.
+
+ +
+

valid

+ public event valid +
+ Fires after the field has been validated with no errors +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+
+

Config Details

+
+ +
+

allowBlank

+ allowBlank : Boolean +
+ False to validate that the value length > 0 (defaults to true)
+
This config option is defined by TextField.
+
+ +
+

allowDecimals

+ allowDecimals : Boolean +
+ False to disallow decimal values (defaults to true)
+
This config option is defined by NumberField.
+
+ +
+

allowNegative

+ allowNegative : Boolean +
+ False to require only positive numbers (defaults to true)
+
This config option is defined by NumberField.
+
+ +
+

autoCreate

+ autoCreate : String/Object +
+ A DomHelper element spec, or true for a default element spec (defaults to {tag: "input", type: "text", size: "20", autocomplete: "off"})
+
This config option is defined by Field.
+
+ +
+

blankText

+ blankText : String +
+ Error text to display if the allow blank validation fails (defaults to "This field is required")
+
This config option is defined by TextField.
+
+ +
+

decimalPrecision

+ decimalPrecision : Number +
+ The maximum precision to display after the decimal separator (defaults to 2)
+
This config option is defined by NumberField.
+
+ +
+

decimalSeparator

+ decimalSeparator : String +
+ Character(s) to allow as the decimal separator (defaults to '.')
+
This config option is defined by NumberField.
+
+ +
+

disableKeyFilter

+ disableKeyFilter : Boolean +
+ True to disable input keystroke filtering (defaults to false)
+
This config option is defined by TextField.
+
+ +
+

emptyClass

+ emptyClass : String +
+ The CSS class to apply to an empty field to style the emptyText (defaults to 'x-form-empty-field'). This class is automatically added and removed as needed depending on the current field value.
+
This config option is defined by TextField.
+
+ +
+

emptyText

+ emptyText : String +
+ The default text to display in an empty field (defaults to null).
+
This config option is defined by TextField.
+
+ +
+

fieldClass

+ fieldClass : String +
+ The default CSS class for the field (defaults to "x-form-field x-form-num-field")
+
This config option is defined by NumberField.
+
+ +
+

focusClass

+ focusClass : String +
+ The CSS class to use when the field receives focus (defaults to "x-form-focus")
+
This config option is defined by Field.
+
+ +
+

grow

+ grow : Boolean +
+ True if this field should automatically grow and shrink to its content
+
This config option is defined by TextField.
+
+ +
+

growMax

+ growMax : Number +
+ The maximum width to allow when grow = true (defaults to 800)
+
This config option is defined by TextField.
+
+ +
+

growMin

+ growMin : Number +
+ The minimum width to allow when grow = true (defaults to 30)
+
This config option is defined by TextField.
+
+ +
+

inputType

+ inputType : String +
+ The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
+
This config option is defined by Field.
+
+ +
+

invalidClass

+ invalidClass : String +
+ The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
+
This config option is defined by Field.
+
+ +
+

invalidText

+ invalidText : String +
+ The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field is invalid")
+
This config option is defined by Field.
+
+ +
+

maskRe

+ maskRe : String +
+ An input mask regular expression that will be used to filter keystrokes that don't match (defaults to null)
+
This config option is defined by TextField.
+
+ +
+

maxLength

+ maxLength : Number +
+ Maximum input field length allowed (defaults to Number.MAX_VALUE)
+
This config option is defined by TextField.
+
+ +
+

maxLengthText

+ maxLengthText : String +
+ Error text to display if the maximum length validation fails (defaults to "The maximum length for this field is {maxLength}")
+
This config option is defined by TextField.
+
+ +
+

maxText

+ maxText : String +
+ Error text to display if the maximum value validation fails (defaults to "The maximum value for this field is {maxValue}")
+
This config option is defined by NumberField.
+
+ +
+

maxValue

+ maxValue : Number +
+ The maximum allowed value (defaults to Number.MAX_VALUE)
+
This config option is defined by NumberField.
+
+ +
+

minLength

+ minLength : Number +
+ Minimum input field length required (defaults to 0)
+
This config option is defined by TextField.
+
+ +
+

minLengthText

+ minLengthText : String +
+ Error text to display if the minimum length validation fails (defaults to "The minimum length for this field is {minLength}")
+
This config option is defined by TextField.
+
+ +
+

minText

+ minText : String +
+ Error text to display if the minimum value validation fails (defaults to "The minimum value for this field is {minValue}")
+
This config option is defined by NumberField.
+
+ +
+

minValue

+ minValue : Number +
+ The minimum allowed value (defaults to Number.NEGATIVE_INFINITY)
+
This config option is defined by NumberField.
+
+ +
+

msgFx

+ msgFx : String +
+ Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
+
This config option is defined by Field.
+
+ +
+

msgTarget

+ msgTarget : String +
+ The location where error text should display. Should be one of the following values (defaults to 'qtip'):
 Value Description ----------- ---------------------------------------------------------------------- qtip Display a quick tip when the user hovers over the field title Display a default browser title attribute popup under Add a block div beneath the field containing the error text side Add an error icon to the right of the field with a popup on hover [element id] Add the error text directly to the innerHTML of the specified element 
+
This config option is defined by Field.
+
+ +
+

nanText

+ nanText : String +
+ Error text to display if the value is not a valid number. For example, this can happen if a valid character like '.' or '-' is left in the field with no number (defaults to "{value} is not a valid number")
+
This config option is defined by NumberField.
+
+ +
+

regex

+ regex : RegExp +
+ A JavaScript RegExp object to be tested against the field value during validation (defaults to null). If available, this regex will be evaluated only after the basic validators all return true, and will be passed the current field value. If the test fails, the field will be marked invalid using regexText.
+
This config option is defined by TextField.
+
+ +
+

regexText

+ regexText : String +
+ The error text to display if regex is used and the test fails during validation (defaults to "")
+
This config option is defined by TextField.
+
+ +
+

selectOnFocus

+ selectOnFocus : Boolean +
+ True to automatically select any existing field text when the field receives input focus (defaults to false)
+
This config option is defined by TextField.
+
+ +
+

validateOnBlur

+ validateOnBlur : String/Boolean +
+ Defaults to true.
+
This config option is defined by Field.
+
+ +
+

validationDelay

+ validationDelay : Number +
+ The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
+
This config option is defined by Field.
+
+ +
+

validationEvent

+ validationEvent : String/Boolean +
+ The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
+
This config option is defined by Field.
+
+ +
+

validator

+ validator : Function +
+ A custom validation function to be called during field validation (defaults to null). If available, this function will be called only after the basic validators all return true, and will be passed the current field value and expected to return boolean true if the value is valid or a string error message if invalid.
+
This config option is defined by TextField.
+
+ +
+

value

+ value : Mixed +
+ A value to initialize this field with
+
This config option is defined by Field.
+
+ +
+

vtype

+ vtype : String +
+ A validation type name as defined in Ext.form.VTypes (defaults to null)
+
This config option is defined by TextField.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.form.Radio.html b/www/extras/yui-ext/docs/output/Ext.form.Radio.html new file mode 100644 index 000000000..6d9487ab5 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.form.Radio.html @@ -0,0 +1,1547 @@ + + + + Ext.form.Radio + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.form.Radio

+ + + + + +
Package:Ext.form
Class:Radio
Extends:Checkbox
Defined In:Radio.js
+
+ Single radio field. Same as Checkbox, but provided as a convenience for automatically setting the input type. +Radio grouping is handled automatically by the browser if you give each radio in a group the same name.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Radio(Object config)Radio
Creates a new Radio
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 applyTo(String/HTMLElement/Element el) : Ext.form.FieldField
Apply the behaviors of this component to an existing element. This is used instead of render().
 clearInvalid() : voidField
Clear any invalid styles/messages for this field
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 getName() : StringField
Returns the name attribute of the field if available
 getRawValue() : MixedField
Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue.
 getValue() : MixedField
Returns the normalized data value (undefined or emptyText will be returned as ''). To return the raw value see getRa...
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isValid(Boolean preventMark) : BooleanField
Returns whether or not the field value is currently valid
 isVisible() : voidComponent
Returns true if this component is visible
 markInvalid(String msg) : voidField
Mark this field as invalid
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 reset() : voidField
Resets the current field value to the originally-loaded value and clears any validation messages
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setRawValue(Mixed value) : voidField
Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue.
 setSize(Number width, Number height) : voidField
Sets the height and width of the field
 setValue(Mixed value) : voidField
Sets a data value into the field and validates it. To set the value directly without validation see setRawValue.
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 validate() : BooleanField
Validates the field value
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 blur : (Ext.form.Field this)Field
Fires when
 change : (Ext.form.Field this, Mixed value, Mixed value)Field
Fires just before the field blurs if the field value has changed
 check : (Ext.form.Checkbox this, Boolean checked)Checkbox
Fires when the checkbox is checked or unchecked
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 focus : (Ext.form.Field this)Field
Fires when this field receives input focus
 hide : (Ext.Component this)Component
Fires after the component is hidden
 invalid : (Ext.form.Field this, String msg)Field
Fires after the field has been marked as invalid
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
 specialkey : (Ext.form.Field this, Ext.EventObject e)Field
Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.g...
 valid : (Ext.form.Field this)Field
Fires after the field has been validated with no errors
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 autoCreate : String/ObjectField
A DomHelper element spec, or true for a default element spec (defaults to {tag: "input", type: "text", size: "20", au...
 boxLabel : StringCheckbox
The text that appears beside the checkbox
 checked : BooleanCheckbox
True if the the checkbox should render already checked (defaults to false)
 fieldClass : StringField
The default CSS class for the field (defaults to "x-form-field")
 focusClass : StringField
The CSS class to use when the field receives focus (defaults to "x-form-focus")
 inputType : StringField
The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
 inputValue : StringCheckbox
The value that should go into the generated input element's value attribute
 invalidClass : StringField
The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
 invalidText : StringField
The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field i...
 msgFx : StringField
Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
 msgTarget : StringField
The location where error text should display. Should be one of the following values (defaults to 'qtip'): Value Desc...
 validateOnBlur : String/BooleanField
Defaults to true.
 validationDelay : NumberField
The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
 validationEvent : String/BooleanField
The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
 value : MixedField
A value to initialize this field with
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

Radio

+ public function Radio(Object config) +
+ Creates a new Radio
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

applyTo

+ public function applyTo(String/HTMLElement/Element el) +
+ Apply the behaviors of this component to an existing element. This is used instead of render(). +
+ Parameters: +
  • el : String/HTMLElement/Element
    The id of the node, a DOM Node or an existing Element
+ Returns: +
    +
  • Ext.form.Field
    this
  • +
+
+
+
This method is defined by Field.
+
+ +
+

clearInvalid

+ public function clearInvalid() +
+ Clear any invalid styles/messages for this field +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getName

+ public function getName() +
+ Returns the name attribute of the field if available +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    name The field name
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getRawValue

+ public function getRawValue() +
+ Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Mixed
    value The field value
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getValue

+ public function getValue() +
+ Returns the normalized data value (undefined or emptyText will be returned as ''). To return the raw value see getRawValue. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Mixed
    value The field value
  • +
+
+
+
This method is defined by Field.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isValid

+ public function isValid(Boolean preventMark) +
+ Returns whether or not the field value is currently valid +
+ Parameters: +
  • preventMark : Boolean
    True to disable marking the field invalid
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+ +
+

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

markInvalid

+ public function markInvalid(String msg) +
+ Mark this field as invalid +
+ Parameters: +
  • msg : String
    The validation message
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

reset

+ public function reset() +
+ Resets the current field value to the originally-loaded value and clears any validation messages +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setRawValue

+ public function setRawValue(Mixed value) +
+ Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue. +
+ Parameters: +
  • value : Mixed
    The value to set
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setSize

+ public function setSize(Number width, Number height) +
+ Sets the height and width of the field +
+ Parameters: +
  • width : Number
    The new field width in pixels
  • height : Number
    The new field height in pixels
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setValue

+ public function setValue(Mixed value) +
+ Sets a data value into the field and validates it. To set the value directly without validation see setRawValue. +
+ Parameters: +
  • value : Mixed
    The value to set
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

validate

+ public function validate() +
+ Validates the field value +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+
+ +

Event Details

+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

blur

+ public event blur +
+ Fires when +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

change

+ public event change +
+ Fires just before the field blurs if the field value has changed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • value : Mixed
    The changed value
  • value : Mixed
    The original value
+
+
+
This event is defined by Field.
+
+ +
+

check

+ public event check +
+ Fires when the checkbox is checked or unchecked +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Checkbox
    This checkbox
  • checked : Boolean
    The new checked value
+
+
+
This event is defined by Checkbox.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

focus

+ public event focus +
+ Fires when this field receives input focus +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

invalid

+ public event invalid +
+ Fires after the field has been marked as invalid +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • msg : String
    The validation message
+
+
+
This event is defined by Field.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

specialkey

+ public event specialkey +
+ Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.getKey to determine which key was pressed. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by Field.
+
+ +
+

valid

+ public event valid +
+ Fires after the field has been validated with no errors +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+
+

Config Details

+
+ +
+

autoCreate

+ autoCreate : String/Object +
+ A DomHelper element spec, or true for a default element spec (defaults to {tag: "input", type: "text", size: "20", autocomplete: "off"})
+
This config option is defined by Field.
+
+ +
+

boxLabel

+ boxLabel : String +
+ The text that appears beside the checkbox
+
This config option is defined by Checkbox.
+
+ +
+

checked

+ checked : Boolean +
+ True if the the checkbox should render already checked (defaults to false)
+
This config option is defined by Checkbox.
+
+ +
+

fieldClass

+ fieldClass : String +
+ The default CSS class for the field (defaults to "x-form-field")
+
This config option is defined by Field.
+
+ +
+

focusClass

+ focusClass : String +
+ The CSS class to use when the field receives focus (defaults to "x-form-focus")
+
This config option is defined by Field.
+
+ +
+

inputType

+ inputType : String +
+ The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
+
This config option is defined by Field.
+
+ +
+

inputValue

+ inputValue : String +
+ The value that should go into the generated input element's value attribute
+
This config option is defined by Checkbox.
+
+ +
+

invalidClass

+ invalidClass : String +
+ The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
+
This config option is defined by Field.
+
+ +
+

invalidText

+ invalidText : String +
+ The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field is invalid")
+
This config option is defined by Field.
+
+ +
+

msgFx

+ msgFx : String +
+ Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
+
This config option is defined by Field.
+
+ +
+

msgTarget

+ msgTarget : String +
+ The location where error text should display. Should be one of the following values (defaults to 'qtip'):
 Value Description ----------- ---------------------------------------------------------------------- qtip Display a quick tip when the user hovers over the field title Display a default browser title attribute popup under Add a block div beneath the field containing the error text side Add an error icon to the right of the field with a popup on hover [element id] Add the error text directly to the innerHTML of the specified element 
+
This config option is defined by Field.
+
+ +
+

validateOnBlur

+ validateOnBlur : String/Boolean +
+ Defaults to true.
+
This config option is defined by Field.
+
+ +
+

validationDelay

+ validationDelay : Number +
+ The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
+
This config option is defined by Field.
+
+ +
+

validationEvent

+ validationEvent : String/Boolean +
+ The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
+
This config option is defined by Field.
+
+ +
+

value

+ value : Mixed +
+ A value to initialize this field with
+
This config option is defined by Field.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.form.TextArea.html b/www/extras/yui-ext/docs/output/Ext.form.TextArea.html new file mode 100644 index 000000000..926c9a199 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.form.TextArea.html @@ -0,0 +1,1885 @@ + + + + Ext.form.TextArea + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.form.TextArea

+ + + + + +
Package:Ext.form
Class:TextArea
Extends:TextField
Defined In:TextArea.js
+
+ Multiline text field. Can be used as a direct replacement for traditional textarea fields, plus adds +support for auto-sizing.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 TextArea(Object config)TextArea
Creates a new TextArea
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 applyTo(String/HTMLElement/Element el) : Ext.form.FieldField
Apply the behaviors of this component to an existing element. This is used instead of render().
 autoSize() : voidTextArea
Automatically grows the field to accomodate the height of the text up to the maximum field height allowed. +This only ...
 clearInvalid() : voidField
Clear any invalid styles/messages for this field
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 getName() : StringField
Returns the name attribute of the field if available
 getRawValue() : MixedField
Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue.
 getValue() : MixedField
Returns the normalized data value (undefined or emptyText will be returned as ''). To return the raw value see getRa...
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isValid(Boolean preventMark) : BooleanField
Returns whether or not the field value is currently valid
 isVisible() : voidComponent
Returns true if this component is visible
 markInvalid(String msg) : voidField
Mark this field as invalid
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 reset() : voidField
Resets the current field value to the originally-loaded value and clears any validation messages
 selectText([Number start], [Number end]) : voidTextField
Selects text in this field
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setRawValue(Mixed value) : voidField
Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue.
 setSize(Number width, Number height) : voidField
Sets the height and width of the field
 setValue(Mixed value) : voidField
Sets a data value into the field and validates it. To set the value directly without validation see setRawValue.
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 validate() : BooleanField
Validates the field value
 validateValue(Mixed value) : BooleanTextField
Validates a value according to the field's validation rules and marks the field as invalid +if the validation fails
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 autosize : (Ext.form.Field this, Number width)TextField
Fires when the autosize function is triggered. The field may or may not have actually changed size +according to the ...
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 blur : (Ext.form.Field this)Field
Fires when
 change : (Ext.form.Field this, Mixed value, Mixed value)Field
Fires just before the field blurs if the field value has changed
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 focus : (Ext.form.Field this)Field
Fires when this field receives input focus
 hide : (Ext.Component this)Component
Fires after the component is hidden
 invalid : (Ext.form.Field this, String msg)Field
Fires after the field has been marked as invalid
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
 specialkey : (Ext.form.Field this, Ext.EventObject e)Field
Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.g...
 valid : (Ext.form.Field this)Field
Fires after the field has been validated with no errors
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 allowBlank : BooleanTextField
False to validate that the value length > 0 (defaults to true)
 autoCreate : String/ObjectField
A DomHelper element spec, or true for a default element spec (defaults to {tag: "input", type: "text", size: "20", au...
 blankText : StringTextField
Error text to display if the allow blank validation fails (defaults to "This field is required")
 disableKeyFilter : BooleanTextField
True to disable input keystroke filtering (defaults to false)
 emptyClass : StringTextField
The CSS class to apply to an empty field to style the emptyText (defaults to 'x-form-empty-field'). This class is aut...
 emptyText : StringTextField
The default text to display in an empty field (defaults to null).
 fieldClass : StringField
The default CSS class for the field (defaults to "x-form-field")
 focusClass : StringField
The CSS class to use when the field receives focus (defaults to "x-form-focus")
 grow : BooleanTextField
True if this field should automatically grow and shrink to its content
 growMax : NumberTextArea
The maximum height to allow when grow = true (defaults to 1000)
 growMin : NumberTextArea
The minimum height to allow when grow = true (defaults to 60)
 inputType : StringField
The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
 invalidClass : StringField
The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
 invalidText : StringField
The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field i...
 maskRe : StringTextField
An input mask regular expression that will be used to filter keystrokes that don't match (defaults to null)
 maxLength : NumberTextField
Maximum input field length allowed (defaults to Number.MAX_VALUE)
 maxLengthText : StringTextField
Error text to display if the maximum length validation fails (defaults to "The maximum length for this field is {maxL...
 minLength : NumberTextField
Minimum input field length required (defaults to 0)
 minLengthText : StringTextField
Error text to display if the minimum length validation fails (defaults to "The minimum length for this field is {minL...
 msgFx : StringField
Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
 msgTarget : StringField
The location where error text should display. Should be one of the following values (defaults to 'qtip'): Value Desc...
 preventScrollbars : BooleanTextArea
True to prevent scrollbars from appearing regardless of how much text is in the field (equivalent to setting overflow...
 regex : RegExpTextField
A JavaScript RegExp object to be tested against the field value during validation (defaults to null). If available, t...
 regexText : StringTextField
The error text to display if regex is used and the test fails during validation (defaults to "")
 selectOnFocus : BooleanTextField
True to automatically select any existing field text when the field receives input focus (defaults to false)
 validateOnBlur : String/BooleanField
Defaults to true.
 validationDelay : NumberField
The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
 validationEvent : String/BooleanField
The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
 validator : FunctionTextField
A custom validation function to be called during field validation (defaults to null). If available, this function wil...
 value : MixedField
A value to initialize this field with
 vtype : StringTextField
A validation type name as defined in Ext.form.VTypes (defaults to null)
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

TextArea

+ public function TextArea(Object config) +
+ Creates a new TextArea
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

applyTo

+ public function applyTo(String/HTMLElement/Element el) +
+ Apply the behaviors of this component to an existing element. This is used instead of render(). +
+ Parameters: +
  • el : String/HTMLElement/Element
    The id of the node, a DOM Node or an existing Element
+ Returns: +
    +
  • Ext.form.Field
    this
  • +
+
+
+
This method is defined by Field.
+
+ +
+

autoSize

+ public function autoSize() +
+ Automatically grows the field to accomodate the height of the text up to the maximum field height allowed. +This only takes effect if grow = true and fires the autosize event. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TextArea.
+
+ +
+

clearInvalid

+ public function clearInvalid() +
+ Clear any invalid styles/messages for this field +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getName

+ public function getName() +
+ Returns the name attribute of the field if available +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    name The field name
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getRawValue

+ public function getRawValue() +
+ Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Mixed
    value The field value
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getValue

+ public function getValue() +
+ Returns the normalized data value (undefined or emptyText will be returned as ''). To return the raw value see getRawValue. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Mixed
    value The field value
  • +
+
+
+
This method is defined by Field.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isValid

+ public function isValid(Boolean preventMark) +
+ Returns whether or not the field value is currently valid +
+ Parameters: +
  • preventMark : Boolean
    True to disable marking the field invalid
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+ +
+

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

markInvalid

+ public function markInvalid(String msg) +
+ Mark this field as invalid +
+ Parameters: +
  • msg : String
    The validation message
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

reset

+ public function reset() +
+ Resets the current field value to the originally-loaded value and clears any validation messages +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

selectText

+ public function selectText([Number start], [Number end]) +
+ Selects text in this field +
+ Parameters: +
  • start : Number
    (optional) The index where the selection should start (defaults to 0)
  • end : Number
    (optional) The index where the selection should end (defaults to the text length)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TextField.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setRawValue

+ public function setRawValue(Mixed value) +
+ Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue. +
+ Parameters: +
  • value : Mixed
    The value to set
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setSize

+ public function setSize(Number width, Number height) +
+ Sets the height and width of the field +
+ Parameters: +
  • width : Number
    The new field width in pixels
  • height : Number
    The new field height in pixels
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setValue

+ public function setValue(Mixed value) +
+ Sets a data value into the field and validates it. To set the value directly without validation see setRawValue. +
+ Parameters: +
  • value : Mixed
    The value to set
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

validate

+ public function validate() +
+ Validates the field value +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+ +
+

validateValue

+ public function validateValue(Mixed value) +
+ Validates a value according to the field's validation rules and marks the field as invalid +if the validation fails +
+ Parameters: +
  • value : Mixed
    The value to validate
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by TextField.
+
+
+ +

Event Details

+
+ +
+

autosize

+ public event autosize +
+ Fires when the autosize function is triggered. The field may or may not have actually changed size +according to the default logic, but this event provides a hook for the developer to apply additional +logic at runtime to resize the field if needed. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
    This text field
  • width : Number
    The new field width
+
+
+
This event is defined by TextField.
+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

blur

+ public event blur +
+ Fires when +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

change

+ public event change +
+ Fires just before the field blurs if the field value has changed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • value : Mixed
    The changed value
  • value : Mixed
    The original value
+
+
+
This event is defined by Field.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

focus

+ public event focus +
+ Fires when this field receives input focus +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

invalid

+ public event invalid +
+ Fires after the field has been marked as invalid +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • msg : String
    The validation message
+
+
+
This event is defined by Field.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

specialkey

+ public event specialkey +
+ Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.getKey to determine which key was pressed. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by Field.
+
+ +
+

valid

+ public event valid +
+ Fires after the field has been validated with no errors +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+
+

Config Details

+
+ +
+

allowBlank

+ allowBlank : Boolean +
+ False to validate that the value length > 0 (defaults to true)
+
This config option is defined by TextField.
+
+ +
+

autoCreate

+ autoCreate : String/Object +
+ A DomHelper element spec, or true for a default element spec (defaults to {tag: "input", type: "text", size: "20", autocomplete: "off"})
+
This config option is defined by Field.
+
+ +
+

blankText

+ blankText : String +
+ Error text to display if the allow blank validation fails (defaults to "This field is required")
+
This config option is defined by TextField.
+
+ +
+

disableKeyFilter

+ disableKeyFilter : Boolean +
+ True to disable input keystroke filtering (defaults to false)
+
This config option is defined by TextField.
+
+ +
+

emptyClass

+ emptyClass : String +
+ The CSS class to apply to an empty field to style the emptyText (defaults to 'x-form-empty-field'). This class is automatically added and removed as needed depending on the current field value.
+
This config option is defined by TextField.
+
+ +
+

emptyText

+ emptyText : String +
+ The default text to display in an empty field (defaults to null).
+
This config option is defined by TextField.
+
+ +
+

fieldClass

+ fieldClass : String +
+ The default CSS class for the field (defaults to "x-form-field")
+
This config option is defined by Field.
+
+ +
+

focusClass

+ focusClass : String +
+ The CSS class to use when the field receives focus (defaults to "x-form-focus")
+
This config option is defined by Field.
+
+ +
+

grow

+ grow : Boolean +
+ True if this field should automatically grow and shrink to its content
+
This config option is defined by TextField.
+
+ +
+

growMax

+ growMax : Number +
+ The maximum height to allow when grow = true (defaults to 1000)
+
This config option is defined by TextArea.
+
+ +
+

growMin

+ growMin : Number +
+ The minimum height to allow when grow = true (defaults to 60)
+
This config option is defined by TextArea.
+
+ +
+

inputType

+ inputType : String +
+ The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
+
This config option is defined by Field.
+
+ +
+

invalidClass

+ invalidClass : String +
+ The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
+
This config option is defined by Field.
+
+ +
+

invalidText

+ invalidText : String +
+ The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field is invalid")
+
This config option is defined by Field.
+
+ +
+

maskRe

+ maskRe : String +
+ An input mask regular expression that will be used to filter keystrokes that don't match (defaults to null)
+
This config option is defined by TextField.
+
+ +
+

maxLength

+ maxLength : Number +
+ Maximum input field length allowed (defaults to Number.MAX_VALUE)
+
This config option is defined by TextField.
+
+ +
+

maxLengthText

+ maxLengthText : String +
+ Error text to display if the maximum length validation fails (defaults to "The maximum length for this field is {maxLength}")
+
This config option is defined by TextField.
+
+ +
+

minLength

+ minLength : Number +
+ Minimum input field length required (defaults to 0)
+
This config option is defined by TextField.
+
+ +
+

minLengthText

+ minLengthText : String +
+ Error text to display if the minimum length validation fails (defaults to "The minimum length for this field is {minLength}")
+
This config option is defined by TextField.
+
+ +
+

msgFx

+ msgFx : String +
+ Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
+
This config option is defined by Field.
+
+ +
+

msgTarget

+ msgTarget : String +
+ The location where error text should display. Should be one of the following values (defaults to 'qtip'):
 Value Description ----------- ---------------------------------------------------------------------- qtip Display a quick tip when the user hovers over the field title Display a default browser title attribute popup under Add a block div beneath the field containing the error text side Add an error icon to the right of the field with a popup on hover [element id] Add the error text directly to the innerHTML of the specified element 
+
This config option is defined by Field.
+
+ +
+

preventScrollbars

+ preventScrollbars : Boolean +
+ True to prevent scrollbars from appearing regardless of how much text is in the field (equivalent to setting overflow: hidden, defaults to false)
+
This config option is defined by TextArea.
+
+ +
+

regex

+ regex : RegExp +
+ A JavaScript RegExp object to be tested against the field value during validation (defaults to null). If available, this regex will be evaluated only after the basic validators all return true, and will be passed the current field value. If the test fails, the field will be marked invalid using regexText.
+
This config option is defined by TextField.
+
+ +
+

regexText

+ regexText : String +
+ The error text to display if regex is used and the test fails during validation (defaults to "")
+
This config option is defined by TextField.
+
+ +
+

selectOnFocus

+ selectOnFocus : Boolean +
+ True to automatically select any existing field text when the field receives input focus (defaults to false)
+
This config option is defined by TextField.
+
+ +
+

validateOnBlur

+ validateOnBlur : String/Boolean +
+ Defaults to true.
+
This config option is defined by Field.
+
+ +
+

validationDelay

+ validationDelay : Number +
+ The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
+
This config option is defined by Field.
+
+ +
+

validationEvent

+ validationEvent : String/Boolean +
+ The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
+
This config option is defined by Field.
+
+ +
+

validator

+ validator : Function +
+ A custom validation function to be called during field validation (defaults to null). If available, this function will be called only after the basic validators all return true, and will be passed the current field value and expected to return boolean true if the value is valid or a string error message if invalid.
+
This config option is defined by TextField.
+
+ +
+

value

+ value : Mixed +
+ A value to initialize this field with
+
This config option is defined by Field.
+
+ +
+

vtype

+ vtype : String +
+ A validation type name as defined in Ext.form.VTypes (defaults to null)
+
This config option is defined by TextField.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.form.TextField.html b/www/extras/yui-ext/docs/output/Ext.form.TextField.html new file mode 100644 index 000000000..3588f935c --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.form.TextField.html @@ -0,0 +1,1872 @@ + + + + Ext.form.TextField + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.form.TextField

+ + + + + + +
Package:Ext.form
Class:TextField
Extends:Field
Subclasses:NumberField, TextArea, TriggerField
Defined In:TextField.js
+
+ Basic text field. Can be used as a direct replacement for traditional text inputs, or as the base +class for more sophisticated input controls (like Ext.form.TextArea and Ext.form.ComboBox).
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 TextField(Object config)TextField
Creates a new TextField
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 applyTo(String/HTMLElement/Element el) : Ext.form.FieldField
Apply the behaviors of this component to an existing element. This is used instead of render().
 autoSize() : voidTextField
Automatically grows the field to accomodate the width of the text up to the maximum field width allowed. +This only ta...
 clearInvalid() : voidField
Clear any invalid styles/messages for this field
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 getName() : StringField
Returns the name attribute of the field if available
 getRawValue() : MixedField
Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue.
 getValue() : MixedField
Returns the normalized data value (undefined or emptyText will be returned as ''). To return the raw value see getRa...
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isValid(Boolean preventMark) : BooleanField
Returns whether or not the field value is currently valid
 isVisible() : voidComponent
Returns true if this component is visible
 markInvalid(String msg) : voidField
Mark this field as invalid
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 reset() : voidTextField
Resets the current field value to the originally-loaded value and clears any validation messages. +Also adds emptyText...
 selectText([Number start], [Number end]) : voidTextField
Selects text in this field
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setRawValue(Mixed value) : voidField
Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue.
 setSize(Number width, Number height) : voidField
Sets the height and width of the field
 setValue(Mixed value) : voidField
Sets a data value into the field and validates it. To set the value directly without validation see setRawValue.
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 validate() : BooleanField
Validates the field value
 validateValue(Mixed value) : BooleanTextField
Validates a value according to the field's validation rules and marks the field as invalid +if the validation fails
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 autosize : (Ext.form.Field this, Number width)TextField
Fires when the autosize function is triggered. The field may or may not have actually changed size +according to the ...
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 blur : (Ext.form.Field this)Field
Fires when
 change : (Ext.form.Field this, Mixed value, Mixed value)Field
Fires just before the field blurs if the field value has changed
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 focus : (Ext.form.Field this)Field
Fires when this field receives input focus
 hide : (Ext.Component this)Component
Fires after the component is hidden
 invalid : (Ext.form.Field this, String msg)Field
Fires after the field has been marked as invalid
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
 specialkey : (Ext.form.Field this, Ext.EventObject e)Field
Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.g...
 valid : (Ext.form.Field this)Field
Fires after the field has been validated with no errors
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 allowBlank : BooleanTextField
False to validate that the value length > 0 (defaults to true)
 autoCreate : String/ObjectField
A DomHelper element spec, or true for a default element spec (defaults to {tag: "input", type: "text", size: "20", au...
 blankText : StringTextField
Error text to display if the allow blank validation fails (defaults to "This field is required")
 disableKeyFilter : BooleanTextField
True to disable input keystroke filtering (defaults to false)
 emptyClass : StringTextField
The CSS class to apply to an empty field to style the emptyText (defaults to 'x-form-empty-field'). This class is aut...
 emptyText : StringTextField
The default text to display in an empty field (defaults to null).
 fieldClass : StringField
The default CSS class for the field (defaults to "x-form-field")
 focusClass : StringField
The CSS class to use when the field receives focus (defaults to "x-form-focus")
 grow : BooleanTextField
True if this field should automatically grow and shrink to its content
 growMax : NumberTextField
The maximum width to allow when grow = true (defaults to 800)
 growMin : NumberTextField
The minimum width to allow when grow = true (defaults to 30)
 inputType : StringField
The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
 invalidClass : StringField
The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
 invalidText : StringField
The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field i...
 maskRe : StringTextField
An input mask regular expression that will be used to filter keystrokes that don't match (defaults to null)
 maxLength : NumberTextField
Maximum input field length allowed (defaults to Number.MAX_VALUE)
 maxLengthText : StringTextField
Error text to display if the maximum length validation fails (defaults to "The maximum length for this field is {maxL...
 minLength : NumberTextField
Minimum input field length required (defaults to 0)
 minLengthText : StringTextField
Error text to display if the minimum length validation fails (defaults to "The minimum length for this field is {minL...
 msgFx : StringField
Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
 msgTarget : StringField
The location where error text should display. Should be one of the following values (defaults to 'qtip'): Value Desc...
 regex : RegExpTextField
A JavaScript RegExp object to be tested against the field value during validation (defaults to null). If available, t...
 regexText : StringTextField
The error text to display if regex is used and the test fails during validation (defaults to "")
 selectOnFocus : BooleanTextField
True to automatically select any existing field text when the field receives input focus (defaults to false)
 validateOnBlur : String/BooleanField
Defaults to true.
 validationDelay : NumberField
The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
 validationEvent : String/BooleanField
The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
 validator : FunctionTextField
A custom validation function to be called during field validation (defaults to null). If available, this function wil...
 value : MixedField
A value to initialize this field with
 vtype : StringTextField
A validation type name as defined in Ext.form.VTypes (defaults to null)
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

TextField

+ public function TextField(Object config) +
+ Creates a new TextField
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

applyTo

+ public function applyTo(String/HTMLElement/Element el) +
+ Apply the behaviors of this component to an existing element. This is used instead of render(). +
+ Parameters: +
  • el : String/HTMLElement/Element
    The id of the node, a DOM Node or an existing Element
+ Returns: +
    +
  • Ext.form.Field
    this
  • +
+
+
+
This method is defined by Field.
+
+ +
+

autoSize

+ public function autoSize() +
+ Automatically grows the field to accomodate the width of the text up to the maximum field width allowed. +This only takes effect if grow = true and fires the autosize event. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TextField.
+
+ +
+

clearInvalid

+ public function clearInvalid() +
+ Clear any invalid styles/messages for this field +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getName

+ public function getName() +
+ Returns the name attribute of the field if available +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    name The field name
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getRawValue

+ public function getRawValue() +
+ Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Mixed
    value The field value
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getValue

+ public function getValue() +
+ Returns the normalized data value (undefined or emptyText will be returned as ''). To return the raw value see getRawValue. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Mixed
    value The field value
  • +
+
+
+
This method is defined by Field.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isValid

+ public function isValid(Boolean preventMark) +
+ Returns whether or not the field value is currently valid +
+ Parameters: +
  • preventMark : Boolean
    True to disable marking the field invalid
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+ +
+

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

markInvalid

+ public function markInvalid(String msg) +
+ Mark this field as invalid +
+ Parameters: +
  • msg : String
    The validation message
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

reset

+ public function reset() +
+ Resets the current field value to the originally-loaded value and clears any validation messages. +Also adds emptyText and emptyClass if the original value was blank. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TextField.
+
+ +
+

selectText

+ public function selectText([Number start], [Number end]) +
+ Selects text in this field +
+ Parameters: +
  • start : Number
    (optional) The index where the selection should start (defaults to 0)
  • end : Number
    (optional) The index where the selection should end (defaults to the text length)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TextField.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setRawValue

+ public function setRawValue(Mixed value) +
+ Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue. +
+ Parameters: +
  • value : Mixed
    The value to set
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setSize

+ public function setSize(Number width, Number height) +
+ Sets the height and width of the field +
+ Parameters: +
  • width : Number
    The new field width in pixels
  • height : Number
    The new field height in pixels
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setValue

+ public function setValue(Mixed value) +
+ Sets a data value into the field and validates it. To set the value directly without validation see setRawValue. +
+ Parameters: +
  • value : Mixed
    The value to set
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

validate

+ public function validate() +
+ Validates the field value +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+ +
+

validateValue

+ public function validateValue(Mixed value) +
+ Validates a value according to the field's validation rules and marks the field as invalid +if the validation fails +
+ Parameters: +
  • value : Mixed
    The value to validate
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by TextField.
+
+
+ +

Event Details

+
+ +
+

autosize

+ public event autosize +
+ Fires when the autosize function is triggered. The field may or may not have actually changed size +according to the default logic, but this event provides a hook for the developer to apply additional +logic at runtime to resize the field if needed. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
    This text field
  • width : Number
    The new field width
+
+
+
This event is defined by TextField.
+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

blur

+ public event blur +
+ Fires when +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

change

+ public event change +
+ Fires just before the field blurs if the field value has changed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • value : Mixed
    The changed value
  • value : Mixed
    The original value
+
+
+
This event is defined by Field.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

focus

+ public event focus +
+ Fires when this field receives input focus +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

invalid

+ public event invalid +
+ Fires after the field has been marked as invalid +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • msg : String
    The validation message
+
+
+
This event is defined by Field.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

specialkey

+ public event specialkey +
+ Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.getKey to determine which key was pressed. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by Field.
+
+ +
+

valid

+ public event valid +
+ Fires after the field has been validated with no errors +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+
+

Config Details

+
+ +
+

allowBlank

+ allowBlank : Boolean +
+ False to validate that the value length > 0 (defaults to true)
+
This config option is defined by TextField.
+
+ +
+

autoCreate

+ autoCreate : String/Object +
+ A DomHelper element spec, or true for a default element spec (defaults to {tag: "input", type: "text", size: "20", autocomplete: "off"})
+
This config option is defined by Field.
+
+ +
+

blankText

+ blankText : String +
+ Error text to display if the allow blank validation fails (defaults to "This field is required")
+
This config option is defined by TextField.
+
+ +
+

disableKeyFilter

+ disableKeyFilter : Boolean +
+ True to disable input keystroke filtering (defaults to false)
+
This config option is defined by TextField.
+
+ +
+

emptyClass

+ emptyClass : String +
+ The CSS class to apply to an empty field to style the emptyText (defaults to 'x-form-empty-field'). This class is automatically added and removed as needed depending on the current field value.
+
This config option is defined by TextField.
+
+ +
+

emptyText

+ emptyText : String +
+ The default text to display in an empty field (defaults to null).
+
This config option is defined by TextField.
+
+ +
+

fieldClass

+ fieldClass : String +
+ The default CSS class for the field (defaults to "x-form-field")
+
This config option is defined by Field.
+
+ +
+

focusClass

+ focusClass : String +
+ The CSS class to use when the field receives focus (defaults to "x-form-focus")
+
This config option is defined by Field.
+
+ +
+

grow

+ grow : Boolean +
+ True if this field should automatically grow and shrink to its content
+
This config option is defined by TextField.
+
+ +
+

growMax

+ growMax : Number +
+ The maximum width to allow when grow = true (defaults to 800)
+
This config option is defined by TextField.
+
+ +
+

growMin

+ growMin : Number +
+ The minimum width to allow when grow = true (defaults to 30)
+
This config option is defined by TextField.
+
+ +
+

inputType

+ inputType : String +
+ The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
+
This config option is defined by Field.
+
+ +
+

invalidClass

+ invalidClass : String +
+ The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
+
This config option is defined by Field.
+
+ +
+

invalidText

+ invalidText : String +
+ The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field is invalid")
+
This config option is defined by Field.
+
+ +
+

maskRe

+ maskRe : String +
+ An input mask regular expression that will be used to filter keystrokes that don't match (defaults to null)
+
This config option is defined by TextField.
+
+ +
+

maxLength

+ maxLength : Number +
+ Maximum input field length allowed (defaults to Number.MAX_VALUE)
+
This config option is defined by TextField.
+
+ +
+

maxLengthText

+ maxLengthText : String +
+ Error text to display if the maximum length validation fails (defaults to "The maximum length for this field is {maxLength}")
+
This config option is defined by TextField.
+
+ +
+

minLength

+ minLength : Number +
+ Minimum input field length required (defaults to 0)
+
This config option is defined by TextField.
+
+ +
+

minLengthText

+ minLengthText : String +
+ Error text to display if the minimum length validation fails (defaults to "The minimum length for this field is {minLength}")
+
This config option is defined by TextField.
+
+ +
+

msgFx

+ msgFx : String +
+ Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
+
This config option is defined by Field.
+
+ +
+

msgTarget

+ msgTarget : String +
+ The location where error text should display. Should be one of the following values (defaults to 'qtip'):
 Value Description ----------- ---------------------------------------------------------------------- qtip Display a quick tip when the user hovers over the field title Display a default browser title attribute popup under Add a block div beneath the field containing the error text side Add an error icon to the right of the field with a popup on hover [element id] Add the error text directly to the innerHTML of the specified element 
+
This config option is defined by Field.
+
+ +
+

regex

+ regex : RegExp +
+ A JavaScript RegExp object to be tested against the field value during validation (defaults to null). If available, this regex will be evaluated only after the basic validators all return true, and will be passed the current field value. If the test fails, the field will be marked invalid using regexText.
+
This config option is defined by TextField.
+
+ +
+

regexText

+ regexText : String +
+ The error text to display if regex is used and the test fails during validation (defaults to "")
+
This config option is defined by TextField.
+
+ +
+

selectOnFocus

+ selectOnFocus : Boolean +
+ True to automatically select any existing field text when the field receives input focus (defaults to false)
+
This config option is defined by TextField.
+
+ +
+

validateOnBlur

+ validateOnBlur : String/Boolean +
+ Defaults to true.
+
This config option is defined by Field.
+
+ +
+

validationDelay

+ validationDelay : Number +
+ The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
+
This config option is defined by Field.
+
+ +
+

validationEvent

+ validationEvent : String/Boolean +
+ The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
+
This config option is defined by Field.
+
+ +
+

validator

+ validator : Function +
+ A custom validation function to be called during field validation (defaults to null). If available, this function will be called only after the basic validators all return true, and will be passed the current field value and expected to return boolean true if the value is valid or a string error message if invalid.
+
This config option is defined by TextField.
+
+ +
+

value

+ value : Mixed +
+ A value to initialize this field with
+
This config option is defined by Field.
+
+ +
+

vtype

+ vtype : String +
+ A validation type name as defined in Ext.form.VTypes (defaults to null)
+
This config option is defined by TextField.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.form.TriggerField.html b/www/extras/yui-ext/docs/output/Ext.form.TriggerField.html new file mode 100644 index 000000000..2dc1907dc --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.form.TriggerField.html @@ -0,0 +1,1909 @@ + + + + Ext.form.TriggerField + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.form.TriggerField

+ + + + + + +
Package:Ext.form
Class:TriggerField
Extends:TextField
Subclasses:ComboBox, DateField
Defined In:TriggerField.js
+
+ Provides a convenient wrapper for TextFields that adds a clickable trigger button (looks like a combobox by default). +The trigger has no default action, so you must assign a function to implement the trigger click handler by +overriding onTriggerClick. You can create a TriggerField directly, as it renders exactly like a combobox +for which you can provide a custom implementation. For example: +
var trigger = new Ext.form.TriggerField();
+trigger.onTriggerClick = myTriggerFn;
+trigger.applyTo('my-field');
+However, in general you will most likely want to use TriggerField as the base class for a reusable component. +Ext.form.DateField and Ext.form.ComboBox are perfect examples of this.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 TriggerField(Object config)TriggerField
Create a new TriggerField.
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 applyTo(String/HTMLElement/Element el) : Ext.form.FieldField
Apply the behaviors of this component to an existing element. This is used instead of render().
 clearInvalid() : voidField
Clear any invalid styles/messages for this field
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 getName() : StringField
Returns the name attribute of the field if available
 getRawValue() : MixedField
Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue.
 getValue() : MixedField
Returns the normalized data value (undefined or emptyText will be returned as ''). To return the raw value see getRa...
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isValid(Boolean preventMark) : BooleanField
Returns whether or not the field value is currently valid
 isVisible() : voidComponent
Returns true if this component is visible
 markInvalid(String msg) : voidField
Mark this field as invalid
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 onTriggerClick(EventObject e) : voidTriggerField
The function that should handle the trigger's click event. This method does nothing by default until overridden +by a...
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 reset() : voidField
Resets the current field value to the originally-loaded value and clears any validation messages
 selectText([Number start], [Number end]) : voidTextField
Selects text in this field
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setRawValue(Mixed value) : voidField
Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue.
 setSize(Number width, Number height) : voidField
Sets the height and width of the field
 setValue(Mixed value) : voidField
Sets a data value into the field and validates it. To set the value directly without validation see setRawValue.
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 validate() : BooleanField
Validates the field value
 validateValue(Mixed value) : BooleanTextField
Validates a value according to the field's validation rules and marks the field as invalid +if the validation fails
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 autosize : (Ext.form.Field this, Number width)TextField
Fires when the autosize function is triggered. The field may or may not have actually changed size +according to the ...
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 blur : (Ext.form.Field this)Field
Fires when
 change : (Ext.form.Field this, Mixed value, Mixed value)Field
Fires just before the field blurs if the field value has changed
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 focus : (Ext.form.Field this)Field
Fires when this field receives input focus
 hide : (Ext.Component this)Component
Fires after the component is hidden
 invalid : (Ext.form.Field this, String msg)Field
Fires after the field has been marked as invalid
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
 specialkey : (Ext.form.Field this, Ext.EventObject e)Field
Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.g...
 valid : (Ext.form.Field this)Field
Fires after the field has been validated with no errors
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 allowBlank : BooleanTextField
False to validate that the value length > 0 (defaults to true)
 autoCreate : String/ObjectTriggerField
A DomHelper element spec, or true for a default element spec (defaults to {tag: "input", type: "text", size: "16", au...
 blankText : StringTextField
Error text to display if the allow blank validation fails (defaults to "This field is required")
 disableKeyFilter : BooleanTextField
True to disable input keystroke filtering (defaults to false)
 emptyClass : StringTextField
The CSS class to apply to an empty field to style the emptyText (defaults to 'x-form-empty-field'). This class is aut...
 emptyText : StringTextField
The default text to display in an empty field (defaults to null).
 fieldClass : StringField
The default CSS class for the field (defaults to "x-form-field")
 focusClass : StringField
The CSS class to use when the field receives focus (defaults to "x-form-focus")
 grow : BooleanTextField
True if this field should automatically grow and shrink to its content
 growMax : NumberTextField
The maximum width to allow when grow = true (defaults to 800)
 growMin : NumberTextField
The minimum width to allow when grow = true (defaults to 30)
 hideTrigger : BooleanTriggerField
True to hide the trigger element and display only the base text field (defaults to false)
 inputType : StringField
The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
 invalidClass : StringField
The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
 invalidText : StringField
The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field i...
 maskRe : StringTextField
An input mask regular expression that will be used to filter keystrokes that don't match (defaults to null)
 maxLength : NumberTextField
Maximum input field length allowed (defaults to Number.MAX_VALUE)
 maxLengthText : StringTextField
Error text to display if the maximum length validation fails (defaults to "The maximum length for this field is {maxL...
 minLength : NumberTextField
Minimum input field length required (defaults to 0)
 minLengthText : StringTextField
Error text to display if the minimum length validation fails (defaults to "The minimum length for this field is {minL...
 msgFx : StringField
Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
 msgTarget : StringField
The location where error text should display. Should be one of the following values (defaults to 'qtip'): Value Desc...
 regex : RegExpTextField
A JavaScript RegExp object to be tested against the field value during validation (defaults to null). If available, t...
 regexText : StringTextField
The error text to display if regex is used and the test fails during validation (defaults to "")
 selectOnFocus : BooleanTextField
True to automatically select any existing field text when the field receives input focus (defaults to false)
 triggerClass : StringTriggerField
An additional CSS class used to style the trigger button. The trigger will always get the class 'x-form-trigger' by d...
 validateOnBlur : String/BooleanField
Defaults to true.
 validationDelay : NumberField
The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
 validationEvent : String/BooleanField
The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
 validator : FunctionTextField
A custom validation function to be called during field validation (defaults to null). If available, this function wil...
 value : MixedField
A value to initialize this field with
 vtype : StringTextField
A validation type name as defined in Ext.form.VTypes (defaults to null)
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

TriggerField

+ public function TriggerField(Object config) +
+ Create a new TriggerField.
+ Parameters: +
  • config : Object
    Configuration options (valid {@Ext.form.TextField} config options will also be applied to the base TextField)
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

applyTo

+ public function applyTo(String/HTMLElement/Element el) +
+ Apply the behaviors of this component to an existing element. This is used instead of render(). +
+ Parameters: +
  • el : String/HTMLElement/Element
    The id of the node, a DOM Node or an existing Element
+ Returns: +
    +
  • Ext.form.Field
    this
  • +
+
+
+
This method is defined by Field.
+
+ +
+

clearInvalid

+ public function clearInvalid() +
+ Clear any invalid styles/messages for this field +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getName

+ public function getName() +
+ Returns the name attribute of the field if available +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    name The field name
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getRawValue

+ public function getRawValue() +
+ Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see getValue. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Mixed
    value The field value
  • +
+
+
+
This method is defined by Field.
+
+ +
+

getValue

+ public function getValue() +
+ Returns the normalized data value (undefined or emptyText will be returned as ''). To return the raw value see getRawValue. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Mixed
    value The field value
  • +
+
+
+
This method is defined by Field.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isValid

+ public function isValid(Boolean preventMark) +
+ Returns whether or not the field value is currently valid +
+ Parameters: +
  • preventMark : Boolean
    True to disable marking the field invalid
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+ +
+

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

markInvalid

+ public function markInvalid(String msg) +
+ Mark this field as invalid +
+ Parameters: +
  • msg : String
    The validation message
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

on

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

onTriggerClick

+ public function onTriggerClick(EventObject e) +
+ The function that should handle the trigger's click event. This method does nothing by default until overridden +by a handler implementation. +
+ Parameters: +
  • e : EventObject
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TriggerField.
+
+ +
+

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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

reset

+ public function reset() +
+ Resets the current field value to the originally-loaded value and clears any validation messages +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

selectText

+ public function selectText([Number start], [Number end]) +
+ Selects text in this field +
+ Parameters: +
  • start : Number
    (optional) The index where the selection should start (defaults to 0)
  • end : Number
    (optional) The index where the selection should end (defaults to the text length)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TextField.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setRawValue

+ public function setRawValue(Mixed value) +
+ Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see setValue. +
+ Parameters: +
  • value : Mixed
    The value to set
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setSize

+ public function setSize(Number width, Number height) +
+ Sets the height and width of the field +
+ Parameters: +
  • width : Number
    The new field width in pixels
  • height : Number
    The new field height in pixels
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setValue

+ public function setValue(Mixed value) +
+ Sets a data value into the field and validates it. To set the value directly without validation see setRawValue. +
+ Parameters: +
  • value : Mixed
    The value to set
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Field.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

validate

+ public function validate() +
+ Validates the field value +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by Field.
+
+ +
+

validateValue

+ public function validateValue(Mixed value) +
+ Validates a value according to the field's validation rules and marks the field as invalid +if the validation fails +
+ Parameters: +
  • value : Mixed
    The value to validate
+ Returns: +
    +
  • Boolean
    True if the value is valid, else false
  • +
+
+
+
This method is defined by TextField.
+
+
+ +

Event Details

+
+ +
+

autosize

+ public event autosize +
+ Fires when the autosize function is triggered. The field may or may not have actually changed size +according to the default logic, but this event provides a hook for the developer to apply additional +logic at runtime to resize the field if needed. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
    This text field
  • width : Number
    The new field width
+
+
+
This event is defined by TextField.
+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

blur

+ public event blur +
+ Fires when +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

change

+ public event change +
+ Fires just before the field blurs if the field value has changed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • value : Mixed
    The changed value
  • value : Mixed
    The original value
+
+
+
This event is defined by Field.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

focus

+ public event focus +
+ Fires when this field receives input focus +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

invalid

+ public event invalid +
+ Fires after the field has been marked as invalid +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • msg : String
    The validation message
+
+
+
This event is defined by Field.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

specialkey

+ public event specialkey +
+ Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check +Ext.EventObject.getKey to determine which key was pressed. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by Field.
+
+ +
+

valid

+ public event valid +
+ Fires after the field has been validated with no errors +
+ Subscribers will be called with the following parameters: +
  • this : Ext.form.Field
+
+
+
This event is defined by Field.
+
+
+

Config Details

+
+ +
+

allowBlank

+ allowBlank : Boolean +
+ False to validate that the value length > 0 (defaults to true)
+
This config option is defined by TextField.
+
+ +
+

autoCreate

+ autoCreate : String/Object +
+ A DomHelper element spec, or true for a default element spec (defaults to {tag: "input", type: "text", size: "16", autocomplete: "off"})
+
This config option is defined by TriggerField.
+
+ +
+

blankText

+ blankText : String +
+ Error text to display if the allow blank validation fails (defaults to "This field is required")
+
This config option is defined by TextField.
+
+ +
+

disableKeyFilter

+ disableKeyFilter : Boolean +
+ True to disable input keystroke filtering (defaults to false)
+
This config option is defined by TextField.
+
+ +
+

emptyClass

+ emptyClass : String +
+ The CSS class to apply to an empty field to style the emptyText (defaults to 'x-form-empty-field'). This class is automatically added and removed as needed depending on the current field value.
+
This config option is defined by TextField.
+
+ +
+

emptyText

+ emptyText : String +
+ The default text to display in an empty field (defaults to null).
+
This config option is defined by TextField.
+
+ +
+

fieldClass

+ fieldClass : String +
+ The default CSS class for the field (defaults to "x-form-field")
+
This config option is defined by Field.
+
+ +
+

focusClass

+ focusClass : String +
+ The CSS class to use when the field receives focus (defaults to "x-form-focus")
+
This config option is defined by Field.
+
+ +
+

grow

+ grow : Boolean +
+ True if this field should automatically grow and shrink to its content
+
This config option is defined by TextField.
+
+ +
+

growMax

+ growMax : Number +
+ The maximum width to allow when grow = true (defaults to 800)
+
This config option is defined by TextField.
+
+ +
+

growMin

+ growMin : Number +
+ The minimum width to allow when grow = true (defaults to 30)
+
This config option is defined by TextField.
+
+ +
+

hideTrigger

+ hideTrigger : Boolean +
+ True to hide the trigger element and display only the base text field (defaults to false)
+
This config option is defined by TriggerField.
+
+ +
+

inputType

+ inputType : String +
+ The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
+
This config option is defined by Field.
+
+ +
+

invalidClass

+ invalidClass : String +
+ The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
+
This config option is defined by Field.
+
+ +
+

invalidText

+ invalidText : String +
+ The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field is invalid")
+
This config option is defined by Field.
+
+ +
+

maskRe

+ maskRe : String +
+ An input mask regular expression that will be used to filter keystrokes that don't match (defaults to null)
+
This config option is defined by TextField.
+
+ +
+

maxLength

+ maxLength : Number +
+ Maximum input field length allowed (defaults to Number.MAX_VALUE)
+
This config option is defined by TextField.
+
+ +
+

maxLengthText

+ maxLengthText : String +
+ Error text to display if the maximum length validation fails (defaults to "The maximum length for this field is {maxLength}")
+
This config option is defined by TextField.
+
+ +
+

minLength

+ minLength : Number +
+ Minimum input field length required (defaults to 0)
+
This config option is defined by TextField.
+
+ +
+

minLengthText

+ minLengthText : String +
+ Error text to display if the minimum length validation fails (defaults to "The minimum length for this field is {minLength}")
+
This config option is defined by TextField.
+
+ +
+

msgFx

+ msgFx : String +
+ Experimental The effect used when displaying a validation message under the field (defaults to 'normal').
+
This config option is defined by Field.
+
+ +
+

msgTarget

+ msgTarget : String +
+ The location where error text should display. Should be one of the following values (defaults to 'qtip'):
 Value Description ----------- ---------------------------------------------------------------------- qtip Display a quick tip when the user hovers over the field title Display a default browser title attribute popup under Add a block div beneath the field containing the error text side Add an error icon to the right of the field with a popup on hover [element id] Add the error text directly to the innerHTML of the specified element 
+
This config option is defined by Field.
+
+ +
+

regex

+ regex : RegExp +
+ A JavaScript RegExp object to be tested against the field value during validation (defaults to null). If available, this regex will be evaluated only after the basic validators all return true, and will be passed the current field value. If the test fails, the field will be marked invalid using regexText.
+
This config option is defined by TextField.
+
+ +
+

regexText

+ regexText : String +
+ The error text to display if regex is used and the test fails during validation (defaults to "")
+
This config option is defined by TextField.
+
+ +
+

selectOnFocus

+ selectOnFocus : Boolean +
+ True to automatically select any existing field text when the field receives input focus (defaults to false)
+
This config option is defined by TextField.
+
+ +
+

triggerClass

+ triggerClass : String +
+ An additional CSS class used to style the trigger button. The trigger will always get the class 'x-form-trigger' by default and triggerClass will be appended if specified.
+
This config option is defined by TriggerField.
+
+ +
+

validateOnBlur

+ validateOnBlur : String/Boolean +
+ Defaults to true.
+
This config option is defined by Field.
+
+ +
+

validationDelay

+ validationDelay : Number +
+ The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
+
This config option is defined by Field.
+
+ +
+

validationEvent

+ validationEvent : String/Boolean +
+ The event that should initiate field validation. Set to false to disable automatic validation. (defaults to "keyup")
+
This config option is defined by Field.
+
+ +
+

validator

+ validator : Function +
+ A custom validation function to be called during field validation (defaults to null). If available, this function will be called only after the basic validators all return true, and will be passed the current field value and expected to return boolean true if the value is valid or a string error message if invalid.
+
This config option is defined by TextField.
+
+ +
+

value

+ value : Mixed +
+ A value to initialize this field with
+
This config option is defined by Field.
+
+ +
+

vtype

+ vtype : String +
+ A validation type name as defined in Ext.form.VTypes (defaults to null)
+
This config option is defined by TextField.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.form.VTypes.html b/www/extras/yui-ext/docs/output/Ext.form.VTypes.html new file mode 100644 index 000000000..67d62dd49 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.form.VTypes.html @@ -0,0 +1,275 @@ + + + + Ext.form.VTypes + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.form.VTypes

+ + + + + +
Package:Ext.form
Class:VTypes
Extends:Object
Defined In:VTypes.js
+
+ Overrideable validation definitions. The validations provided are basic and intended to be easily customizable and extended.

This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 alphaMask : RegExpVTypes
The keystroke filter mask to be applied on alpha input
 alphaText : StringVTypes
The error text to display when the alpha validation function returns false
 alphanumMask : RegExpVTypes
The keystroke filter mask to be applied on alphanumeric input
 alphanumText : StringVTypes
The error text to display when the alphanumeric validation function returns false
 emailMask : RegExpVTypes
The keystroke filter mask to be applied on email input
 emailText : StringVTypes
The error text to display when the email validation function returns false
 urlText : StringVTypes
The error text to display when the url validation function returns false
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 alpha(String value) : voidVTypes
The function used to validate alpha values
 alphanum(String value) : voidVTypes
The function used to validate alphanumeric values
 email(String value) : voidVTypes
The function used to validate email addresses
 url(String value) : voidVTypes
The function used to validate urls
+ +

Public Events

+
This class has no public events.

Property Details

+
+ +
+

alphaMask

+ public RegExp alphaMask +
+ The keystroke filter mask to be applied on alpha input
+
This property is defined by VTypes.
+
+ +
+

alphaText

+ public String alphaText +
+ The error text to display when the alpha validation function returns false
+
This property is defined by VTypes.
+
+ +
+

alphanumMask

+ public RegExp alphanumMask +
+ The keystroke filter mask to be applied on alphanumeric input
+
This property is defined by VTypes.
+
+ +
+

alphanumText

+ public String alphanumText +
+ The error text to display when the alphanumeric validation function returns false
+
This property is defined by VTypes.
+
+ +
+

emailMask

+ public RegExp emailMask +
+ The keystroke filter mask to be applied on email input
+
This property is defined by VTypes.
+
+ +
+

emailText

+ public String emailText +
+ The error text to display when the email validation function returns false
+
This property is defined by VTypes.
+
+ +
+

urlText

+ public String urlText +
+ The error text to display when the url validation function returns false
+
This property is defined by VTypes.
+
+
+ + +

Method Details

+
+ +
+

alpha

+ public function alpha(String value) +
+ The function used to validate alpha values +
+ Parameters: +
  • value : String
    The value
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by VTypes.
+
+ +
+

alphanum

+ public function alphanum(String value) +
+ The function used to validate alphanumeric values +
+ Parameters: +
  • value : String
    The value
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by VTypes.
+
+ +
+

email

+ public function email(String value) +
+ The function used to validate email addresses +
+ Parameters: +
  • value : String
    The email address
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by VTypes.
+
+ +
+

url

+ public function url(String value) +
+ The function used to validate urls +
+ Parameters: +
  • value : String
    The url
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by VTypes.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.grid.AbstractSelectionModel.html b/www/extras/yui-ext/docs/output/Ext.grid.AbstractSelectionModel.html new file mode 100644 index 000000000..00d7689c8 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.grid.AbstractSelectionModel.html @@ -0,0 +1,354 @@ + + + + Ext.grid.AbstractSelectionModel + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.grid.AbstractSelectionModel

+ + + + + + +
Package:Ext.grid
Class:AbstractSelectionModel
Extends:Observable
Subclasses:CellSelectionModel, RowSelectionModel
Defined In:AbstractSelectionModel.js
+
+
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 AbstractSelectionModel()AbstractSelectionModel
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 isLocked() : BooleanAbstractSelectionModel
Returns true if the selections are locked
 lock() : voidAbstractSelectionModel
Lock the selections
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 unlock() : voidAbstractSelectionModel
Unlock the selections
+ +

Public Events

+
This class has no public events.
+ +

Constructor Details

+
+
+

AbstractSelectionModel

+ public function AbstractSelectionModel() +
+
+ Parameters: +
  • None.
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

isLocked

+ public function isLocked() +
+ Returns true if the selections are locked +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by AbstractSelectionModel.
+
+ +
+

lock

+ public function lock() +
+ Lock the selections +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AbstractSelectionModel.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

unlock

+ public function unlock() +
+ Unlock the selections +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AbstractSelectionModel.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.grid.CellSelectionModel.html b/www/extras/yui-ext/docs/output/Ext.grid.CellSelectionModel.html new file mode 100644 index 000000000..00528c9ec --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.grid.CellSelectionModel.html @@ -0,0 +1,500 @@ + + + + Ext.grid.CellSelectionModel + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.grid.CellSelectionModel

+ + + + + +
Package:Ext.grid
Class:CellSelectionModel
Extends:AbstractSelectionModel
Defined In:CellSelectionModel.js
+
+
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 CellSelectionModel(Object config)CellSelectionModel
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 clearSelections() : voidCellSelectionModel
Clears all selections.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hasSelection() : BooleanCellSelectionModel
Returns True if there is a selection.
 isLocked() : BooleanAbstractSelectionModel
Returns true if the selections are locked
 lock() : voidAbstractSelectionModel
Lock the selections
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 select(Number rowIndex, Number collIndex) : voidCellSelectionModel
Selects a cell.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 unlock() : voidAbstractSelectionModel
Unlock the selections
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforerowselect : (SelectionModel this, Number rowIndex, Number colIndex)CellSelectionModel
Fires before a cell is selected.
 cellselect : (SelectionModel this, Number rowIndex, Number colIndex)CellSelectionModel
Fires when a cell is selected.
 selectionchange : (SelectionModel this, Object selection)CellSelectionModel
Fires when the active selection changes.
+ + +

Constructor Details

+
+
+

CellSelectionModel

+ public function CellSelectionModel(Object config) +
+
+ Parameters: +
  • config : Object
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

clearSelections

+ public function clearSelections() +
+ Clears all selections. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CellSelectionModel.
+
+ +
+

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.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hasSelection

+ public function hasSelection() +
+ Returns True if there is a selection. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by CellSelectionModel.
+
+ +
+

isLocked

+ public function isLocked() +
+ Returns true if the selections are locked +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by AbstractSelectionModel.
+
+ +
+

lock

+ public function lock() +
+ Lock the selections +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AbstractSelectionModel.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

select

+ public function select(Number rowIndex, Number collIndex) +
+ Selects a cell. +
+ Parameters: +
  • rowIndex : Number
  • collIndex : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CellSelectionModel.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

unlock

+ public function unlock() +
+ Unlock the selections +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AbstractSelectionModel.
+
+
+ +

Event Details

+
+ +
+

beforerowselect

+ public event beforerowselect +
+ Fires before a cell is selected. +
+ Subscribers will be called with the following parameters: +
  • this : SelectionModel
  • rowIndex : Number
    The selected row index
  • colIndex : Number
    The selected cell index
+
+
+
This event is defined by CellSelectionModel.
+
+ +
+

cellselect

+ public event cellselect +
+ Fires when a cell is selected. +
+ Subscribers will be called with the following parameters: +
  • this : SelectionModel
  • rowIndex : Number
    The selected row index
  • colIndex : Number
    The selected cell index
+
+
+
This event is defined by CellSelectionModel.
+
+ +
+

selectionchange

+ public event selectionchange +
+ Fires when the active selection changes. +
+ Subscribers will be called with the following parameters: +
  • this : SelectionModel
  • selection : Object
    null for no selection or an object (o) with two properties
    • o.record: the record object for the row the selection is in
    • o.cell: An array of [rowIndex, columnIndex]
+
+
+
This event is defined by CellSelectionModel.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.grid.ColumnModel.html b/www/extras/yui-ext/docs/output/Ext.grid.ColumnModel.html new file mode 100644 index 000000000..a665d52ed --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.grid.ColumnModel.html @@ -0,0 +1,1013 @@ + + + + Ext.grid.ColumnModel + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.grid.ColumnModel

+ + + + + +
Package:Ext.grid
Class:ColumnModel
Extends:Observable
Defined In:ColumnModel.js
+
+ This is the default implementation of a ColumnModel used by the Grid. It defines +the columns in the grid. +
Usage:
+
var colModel = new Ext.grid.ColumnModel([
+	{header: "Ticker", width: 60, sortable: true, locked: true},
+	{header: "Company Name", width: 150, sortable: true},
+	{header: "Market Cap.", width: 100, sortable: true},
+	{header: "$ Sales", width: 100, sortable: true, renderer: money},
+	{header: "Employees", width: 100, sortable: true, resizable: false}
+ ]);
+

+The config options listed for this class, are options which may appear in each +individual column definition.

+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 config : ObjectColumnModel
The config passed into the constructor
 defaultSortable : BooleanColumnModel
Default sortable of columns which have no sortable specified (defaults to false)
 defaultWidth : NumberColumnModel
The width of columns which have no width specified (defaults to 100)
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 ColumnModel(Object config)ColumnModel
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getCellEditor(Number colIndex, Number rowIndex) : ObjectColumnModel
Returns the editor defined for the cell/column.
 getColumnCount() : NumberColumnModel
Returns the number of columns.
 getColumnHeader(Number col) : StringColumnModel
Returns the header for the specified column.
 getColumnId(Number index) : StringColumnModel
* +Returns the id of the column at the specified index
 getColumnTooltip(Number col) : StringColumnModel
Returns the tooltip for the specified column.
 getColumnWidth(Number col) : NumberColumnModel
Returns the width for the specified column.
 getDataIndex(Number col) : NumberColumnModel
Returns the dataIndex for the specified column.
 getRenderer(Number col) : FunctionColumnModel
Returns the rendering (formatting) function defined for the column.
 getTotalWidth(Boolean includeHidden) : NumberColumnModel
Returns the total width of all columns.
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 isCellEditable(Number colIndex, Number rowIndex) : BooleanColumnModel
Returns true if the cell is editable.
 isFixed() : voidColumnModel
Returns true if the column width cannot be changed
 isHidden(Number colIndex) : BooleanColumnModel
Returns true if the column is hidden.
 isResizable() : BooleanColumnModel
Returns true if the column cannot be resized
 isSortable(Number col) : BooleanColumnModel
Returns true if the specified column is sortable.
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 setColumnHeader(Number col, String header) : voidColumnModel
Sets the header for a column.
 setColumnTooltip(Number col, String tooltip) : voidColumnModel
Sets the tooltip for a column.
 setColumnWidth(Number col, Number width) : voidColumnModel
Sets the width for a column.
 setDataIndex(Number col, Number dataIndex) : voidColumnModel
Sets the dataIndex for a column.
 setEditable(Number col, Boolean editable) : voidColumnModel
Sets if a column is editable.
 setEditor(Number col, Object editor) : voidColumnModel
Sets the editor for a column.
 setHidden(Number colIndex, Boolean hidden) : voidColumnModel
Sets if a column is hidden.
 setRenderer(Number col, Function fn) : voidColumnModel
Sets the rendering (formatting) function for a column.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 columlockchange : (ColumnModel this, Number colIndex, Boolean locked)ColumnModel
Fires when a column's locked state is changed
 columnmoved : (ColumnModel this, Number oldIndex, Number newIndex)ColumnModel
Fires when a column is moved
 headerchange : (ColumnModel this, Number columnIndex, Number newText)ColumnModel
Fires when the text of a header changes
 hiddenchange : (ColumnModel this, Number columnIndex, Number hidden)ColumnModel
Fires when a column is hidden or "unhidden"
 widthchange : (ColumnModel this, Number columnIndex, Number newWidth)ColumnModel
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 ColumnModel.
+
+ +
+

defaultSortable

+ public Boolean defaultSortable +
+ Default sortable of columns which have no sortable specified (defaults to false)
+
This property is defined by ColumnModel.
+
+ +
+

defaultWidth

+ public Number defaultWidth +
+ The width of columns which have no width specified (defaults to 100)
+
This property is defined by ColumnModel.
+
+
+ + +

Constructor Details

+
+
+

ColumnModel

+ public function ColumnModel(Object config) +
+
+ Parameters: +
  • config : Object
    An Array of column config objects. See this class's config objects for details.
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
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 ColumnModel.
+
+ +
+

getColumnCount

+ public function getColumnCount() +
+ Returns the number of columns. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by ColumnModel.
+
+ +
+

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 ColumnModel.
+
+ +
+

getColumnId

+ public function getColumnId(Number index) +
+ * +Returns the id of the column at the specified index +
+ Parameters: +
  • index : Number
+ Returns: +
    +
  • String
    the id
  • +
+
+
+
This method is defined by ColumnModel.
+
+ +
+

getColumnTooltip

+ public function getColumnTooltip(Number col) +
+ Returns the tooltip for the specified column. +
+ Parameters: +
  • col : Number
    The column index
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by ColumnModel.
+
+ +
+

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 ColumnModel.
+
+ +
+

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 ColumnModel.
+
+ +
+

getRenderer

+ public function getRenderer(Number col) +
+ Returns the rendering (formatting) function defined for the column. +
+ Parameters: +
  • col : Number
    The column index.
+ Returns: +
    +
  • Function
    The function used to render the cell. See {@link #setRenderer}.
  • +
+
+
+
This method is defined by ColumnModel.
+
+ +
+

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 ColumnModel.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

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 ColumnModel.
+
+ +
+

isFixed

+ public function isFixed() +
+ Returns true if the column width cannot be changed +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ColumnModel.
+
+ +
+

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 ColumnModel.
+
+ +
+

isResizable

+ public function isResizable() +
+ Returns true if the column cannot be resized +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by ColumnModel.
+
+ +
+

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 ColumnModel.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

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 ColumnModel.
+
+ +
+

setColumnTooltip

+ public function setColumnTooltip(Number col, String tooltip) +
+ Sets the tooltip for a column. +
+ Parameters: +
  • col : Number
    The column index
  • tooltip : String
    The new tooltip
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ColumnModel.
+
+ +
+

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 ColumnModel.
+
+ +
+

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 ColumnModel.
+
+ +
+

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 ColumnModel.
+
+ +
+

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 ColumnModel.
+
+ +
+

setHidden

+ public function setHidden(Number colIndex, Boolean hidden) +
+ Sets if a column is hidden. +
+ Parameters: +
  • colIndex : Number
    The column index
  • hidden : Boolean
    True if the column is hidden
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ColumnModel.
+
+ +
+

setRenderer

+ public function setRenderer(Number col, Function fn) +
+ Sets the rendering (formatting) function for a column. +
+ Parameters: +
  • col : Number
    The column index
  • fn : Function
    The function to use to process the cell's raw data to return HTML markup for the grid view. The render function is called with the following parameters:
    • Data value.
    • Cell metadata. An object in which you may set the following attributes:
      • css A CSS style string to apply to the table cell.
      • attr An HTML attribute definition string to apply to the data container element within the table cell.
    • The Ext.data.Record from which the data was extracted.
    • Row index
    • Column index
    • The Ext.data.Store object from which the Record was extracted
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ColumnModel.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

columlockchange

+ public event columlockchange +
+ Fires when a column's locked state is changed +
+ Subscribers will be called with the following parameters: +
  • this : ColumnModel
  • colIndex : Number
  • locked : Boolean
    true if locked
+
+
+
This event is defined by ColumnModel.
+
+ +
+

columnmoved

+ public event columnmoved +
+ Fires when a column is moved +
+ Subscribers will be called with the following parameters: +
  • this : ColumnModel
  • oldIndex : Number
  • newIndex : Number
+
+
+
This event is defined by ColumnModel.
+
+ +
+

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 ColumnModel.
+
+ +
+

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 ColumnModel.
+
+ +
+

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 ColumnModel.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.grid.EditorGrid.html b/www/extras/yui-ext/docs/output/Ext.grid.EditorGrid.html new file mode 100644 index 000000000..234050c8f --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.grid.EditorGrid.html @@ -0,0 +1,1305 @@ + + + + Ext.grid.EditorGrid + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.grid.EditorGrid

+ + + + + +
Package:Ext.grid
Class:EditorGrid
Extends:Grid
Defined In:EditorGrid.js
+
+ Class for creating and editable grid.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 ddText : StringGrid
Configures the text is the drag proxy (defaults to "%0 selected row(s)"). +%0 is replaced with the number of selected ...
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 autoSize() : voidGrid
Causes the grid to manually recalculate its dimensions. Generally this is done automatically, +but if manual update is...
 destroy(Boolean removeEl) : voidGrid
Destroy this grid.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getColumnModel() : ColumnModelGrid
Returns the grid's ColumnModel.
 getDataSource() : DataSourceGrid
Returns the grid's DataSource.
 getDragDropText() : StringGrid
Called to get grid's drag proxy text, by default returns this.ddText.
 getSelectionModel() : SelectionModelGrid
Returns the grid's SelectionModel.
 getView() : GridViewGrid
Returns the grid's GridView object.
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render() : Ext.grid.GridGrid
* +Called once after all setup has been completed and the grid is ready to be rendered.
 startEditing(Number rowIndex, Number colIndex) : voidEditorGrid
Starts editing the specified for the specified row/column
 stopEditing() : voidEditorGrid
Stops any active editing
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 afteredit : (Object e)EditorGrid
Fires after a cell is edited. + +grid - This grid +record - The record being edited +field - The field name being edited...
 beforeedit : (Object e)EditorGrid
Fires before cell editing is triggered. The edit event object has the following properties + +grid - This grid +record ...
 bodyscroll : (Number scrollLeft, Number scrollTop)Grid
Fires when the body element is scrolled
 cellclick : (Grid this, Number rowIndex, Number columnIndex, Ext.EventObject e)Grid
Fires when a cell is clicked
 cellcontextmenu : (Grid this, Number rowIndex, Number cellIndex, Ext.EventObject e)Grid
Fires when a cell is right clicked
 celldblclick : (Grid this, Number rowIndex, Number columnIndex, Ext.EventObject e)Grid
Fires when a cell is double clicked
 click : (Ext.EventObject e)Grid
The raw click event for the entire grid.
 columnmove : (Number oldIndex, Number newIndex)Grid
Fires when the user moves a column
 columnresize : (Number columnIndex, Number newSize)Grid
Fires when the user resizes a column
 contextmenu : (Ext.EventObject e)Grid
The raw contextmenu event for the entire grid.
 dblclick : (Ext.EventObject e)Grid
The raw dblclick event for the entire grid.
 dragdrop : (Grid this, Ext.GridDD dd, String targetId, event e)Grid
Fires when dragged row(s) are dropped on a valid DD target
 dragenter : (Grid this, 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, Ext.GridDD dd, String targetId, event e)Grid
Fires when the dragged row(s) leave another DD target while being dragged
 dragover : (Grid this, 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, Ext.GridDD dd, event e)Grid
Fires when a drag operation is complete
 headerclick : (Grid this, Number columnIndex, Ext.EventObject e)Grid
Fires when a header is clicked
 headercontextmenu : (Grid this, Number columnIndex, Ext.EventObject e)Grid
Fires when a header is right clicked
 headerdblclick : (Grid this, Number rowIndex, Number columnIndex, Ext.EventObject e)Grid
Fires when a header cell is double clicked
 keydown : (Ext.EventObject e)Grid
The raw keydown event for the entire grid.
 keypress : (Ext.EventObject e)Grid
The raw keypress event for the entire grid.
 mousedown : (Ext.EventObject e)Grid
The raw mousedown event for the entire grid.
 mouseout : (Ext.EventObject e)Grid
The raw mouseout event for the entire grid.
 mouseover : (Ext.EventObject e)Grid
The raw mouseover event for the entire grid.
 mouseup : (Ext.EventObject e)Grid
The raw mouseup event for the entire grid.
 rowclick : (Grid this, Number rowIndex, Ext.EventObject e)Grid
Fires when a row is clicked
 rowcontextmenu : (Grid this, Number rowIndex, Ext.EventObject e)Grid
Fires when a row is right clicked
 rowdblclick : (Grid this, Number rowIndex, Ext.EventObject e)Grid
Fires when a row is double clicked
 startdrag : (Grid this, Ext.GridDD dd, event e)Grid
Fires when row(s) start being dragged
 validateedit : (Object e)EditorGrid
Fires after a cell is edited, but before the value is set in the record. Return false +to cancel the change. The edit ...
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 A : ObjectGrid
javascript RegExp defining tagNames allowed to have text selection (Defaults to /INPUT|TEXTAREA|SELECT/i).
 An : ObjectGrid
Ext.LoadMask config or true to mask the grid while loading (defaults to false).
 If : BooleanGrid
autoSizeColumns is on, maxRowsToMeasure can be used to limit the number of rows measured to get a columns size - defa...
 The : ObjectGrid
Ext.grid.GridView used by the grid. This can be set before a call to render().
 True : BooleanGrid
to fit the height of the grid container to the height of the data. Defaults to false.
+

Property Details

+
+ +
+

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.
+
+
+ + +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

autoSize

+ public function autoSize() +
+ Causes the grid to manually recalculate its 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.
+
+ +
+

destroy

+ public function destroy(Boolean removeEl) +
+ Destroy this grid. +
+ Parameters: +
  • removeEl : Boolean
    True to remove the element
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

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.
+
+ +
+

getColumnModel

+ public function getColumnModel() +
+ Returns the grid's ColumnModel. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • ColumnModel
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getDataSource

+ public function getDataSource() +
+ Returns the grid's DataSource. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • DataSource
  • +
+
+
+
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.
+
+ +
+

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.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render() +
+ * +Called once after all setup has been completed and the grid is ready to be rendered. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.grid.Grid
    this
  • +
+
+
+
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 EditorGrid.
+
+ +
+

stopEditing

+ public function stopEditing() +
+ Stops any active editing +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by EditorGrid.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

afteredit

+ public event afteredit +
+ Fires after a cell is edited.
+
    +
  • grid - This grid
  • +
  • record - The record being edited
  • +
  • field - The field name being edited
  • +
  • value - The value being set
  • +
  • originalValue - The original value for the field, before the edit.
  • +
  • row - The grid row index
  • +
  • column - The grid column index
  • +
+
+ Subscribers will be called with the following parameters: +
  • e : Object
    An edit event (see above for description)
+
+
+
This event is defined by EditorGrid.
+
+ +
+

beforeedit

+ public event beforeedit +
+ Fires before cell editing is triggered. The edit event object has the following properties
+
    +
  • grid - This grid
  • +
  • record - The record being edited
  • +
  • field - The field name being edited
  • +
  • value - The value for the field being edited.
  • +
  • row - The grid row index
  • +
  • column - The grid column index
  • +
  • cancel - Set this to true to cancel the edit or return false from your handler.
  • +
+
+ Subscribers will be called with the following parameters: +
  • e : Object
    An edit event (see above for description)
+
+
+
This event is defined by EditorGrid.
+
+ +
+

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 : Ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

cellcontextmenu

+ public event cellcontextmenu +
+ Fires when a cell is right clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • cellIndex : Number
  • e : 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 : 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 : Ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

columnmove

+ public event columnmove +
+ Fires when the user moves a column +
+ Subscribers will be called with the following parameters: +
  • oldIndex : Number
  • newIndex : Number
+
+
+
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.
+
+ +
+

contextmenu

+ public event contextmenu +
+ The raw contextmenu event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : Ext.EventObject
+
+
+
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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : Ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

headerdblclick

+ public event headerdblclick +
+ Fires when a header cell is double clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • columnIndex : Number
  • e : 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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : Ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

rowdblclick

+ public event rowdblclick +
+ Fires when a row is double clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • e : 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 : Ext.GridDD
    The drag drop object
  • e : event
    The raw browser event
+
+
+
This event is defined by Grid.
+
+ +
+

validateedit

+ public event validateedit +
+ Fires after a cell is edited, but before the value is set in the record. Return false +to cancel the change. The edit event object has the following properties
+
    +
  • grid - This grid
  • +
  • record - The record being edited
  • +
  • field - The field name being edited
  • +
  • value - The value being set
  • +
  • originalValue - The original value for the field, before the edit.
  • +
  • row - The grid row index
  • +
  • column - The grid column index
  • +
  • cancel - Set this to true to cancel the edit or return false from your handler.
  • +
+
+ Subscribers will be called with the following parameters: +
  • e : Object
    An edit event (see above for description)
+
+
+
This event is defined by EditorGrid.
+
+
+

Config Details

+
+ +
+

A

+ A : Object +
+ javascript RegExp defining tagNames allowed to have text selection (Defaults to /INPUT|TEXTAREA|SELECT/i).
+
This config option is defined by Grid.
+
+ +
+

An

+ An : Object +
+ Ext.LoadMask config or true to mask the grid while loading (defaults to false).
+
This config option is defined by Grid.
+
+ +
+

If

+ If : Boolean +
+ 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 config option is defined by Grid.
+
+ +
+

The

+ The : Object +
+ Ext.grid.GridView used by the grid. This can be set before a call to render().
+
This config option is defined by Grid.
+
+ +
+

True

+ True : Boolean +
+ to fit the height of the grid container to the height of the data. Defaults to false.
+
This config option is defined by Grid.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.grid.Grid.html b/www/extras/yui-ext/docs/output/Ext.grid.Grid.html new file mode 100644 index 000000000..fcdcfcd24 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.grid.Grid.html @@ -0,0 +1,1196 @@ + + + + Ext.grid.Grid + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.grid.Grid

+ + + + + + +
Package: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 Ext.grid.Grid("my-container-id", {
+     ds: myDataStore,
+     cm: myColModel,
+     selModel: mySelectionModel,
+     autoSizeColumns: true,
+     monitorWindowResize: false,
+     trackMouseOver: true
+ });
+ // 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 render the grid into an element with display:none. Try using visibility:hidden. Otherwise there is no way for the +grid to calculate dimensions/offsets.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 ddText : StringGrid
Configures the text is the drag proxy (defaults to "%0 selected row(s)"). +%0 is replaced with the number of selected ...
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Grid(String/HTMLElement/Ext.Element container, Object config)Grid
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 autoSize() : voidGrid
Causes the grid to manually recalculate its dimensions. Generally this is done automatically, +but if manual update is...
 destroy(Boolean removeEl) : voidGrid
Destroy this grid.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getColumnModel() : ColumnModelGrid
Returns the grid's ColumnModel.
 getDataSource() : DataSourceGrid
Returns the grid's DataSource.
 getDragDropText() : StringGrid
Called to get grid's drag proxy text, by default returns this.ddText.
 getSelectionModel() : SelectionModelGrid
Returns the grid's SelectionModel.
 getView() : GridViewGrid
Returns the grid's GridView object.
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render() : Ext.grid.GridGrid
* +Called once after all setup has been completed and the grid is ready to be rendered.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 bodyscroll : (Number scrollLeft, Number scrollTop)Grid
Fires when the body element is scrolled
 cellclick : (Grid this, Number rowIndex, Number columnIndex, Ext.EventObject e)Grid
Fires when a cell is clicked
 cellcontextmenu : (Grid this, Number rowIndex, Number cellIndex, Ext.EventObject e)Grid
Fires when a cell is right clicked
 celldblclick : (Grid this, Number rowIndex, Number columnIndex, Ext.EventObject e)Grid
Fires when a cell is double clicked
 click : (Ext.EventObject e)Grid
The raw click event for the entire grid.
 columnmove : (Number oldIndex, Number newIndex)Grid
Fires when the user moves a column
 columnresize : (Number columnIndex, Number newSize)Grid
Fires when the user resizes a column
 contextmenu : (Ext.EventObject e)Grid
The raw contextmenu event for the entire grid.
 dblclick : (Ext.EventObject e)Grid
The raw dblclick event for the entire grid.
 dragdrop : (Grid this, Ext.GridDD dd, String targetId, event e)Grid
Fires when dragged row(s) are dropped on a valid DD target
 dragenter : (Grid this, 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, Ext.GridDD dd, String targetId, event e)Grid
Fires when the dragged row(s) leave another DD target while being dragged
 dragover : (Grid this, 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, Ext.GridDD dd, event e)Grid
Fires when a drag operation is complete
 headerclick : (Grid this, Number columnIndex, Ext.EventObject e)Grid
Fires when a header is clicked
 headercontextmenu : (Grid this, Number columnIndex, Ext.EventObject e)Grid
Fires when a header is right clicked
 headerdblclick : (Grid this, Number rowIndex, Number columnIndex, Ext.EventObject e)Grid
Fires when a header cell is double clicked
 keydown : (Ext.EventObject e)Grid
The raw keydown event for the entire grid.
 keypress : (Ext.EventObject e)Grid
The raw keypress event for the entire grid.
 mousedown : (Ext.EventObject e)Grid
The raw mousedown event for the entire grid.
 mouseout : (Ext.EventObject e)Grid
The raw mouseout event for the entire grid.
 mouseover : (Ext.EventObject e)Grid
The raw mouseover event for the entire grid.
 mouseup : (Ext.EventObject e)Grid
The raw mouseup event for the entire grid.
 rowclick : (Grid this, Number rowIndex, Ext.EventObject e)Grid
Fires when a row is clicked
 rowcontextmenu : (Grid this, Number rowIndex, Ext.EventObject e)Grid
Fires when a row is right clicked
 rowdblclick : (Grid this, Number rowIndex, Ext.EventObject e)Grid
Fires when a row is double clicked
 startdrag : (Grid this, Ext.GridDD dd, event e)Grid
Fires when row(s) start being dragged
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 A : ObjectGrid
javascript RegExp defining tagNames allowed to have text selection (Defaults to /INPUT|TEXTAREA|SELECT/i).
 An : ObjectGrid
Ext.LoadMask config or true to mask the grid while loading (defaults to false).
 If : BooleanGrid
autoSizeColumns is on, maxRowsToMeasure can be used to limit the number of rows measured to get a columns size - defa...
 The : ObjectGrid
Ext.grid.GridView used by the grid. This can be set before a call to render().
 True : BooleanGrid
to fit the height of the grid container to the height of the data. Defaults to false.
+

Property Details

+
+ +
+

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.
+
+
+ + +

Constructor Details

+
+
+

Grid

+ public function Grid(String/HTMLElement/Ext.Element container, Object config) +
+
+ Parameters: +
  • container : String/HTMLElement/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.
  • config : Object
    A config object that sets properties on this grid.
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

autoSize

+ public function autoSize() +
+ Causes the grid to manually recalculate its 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.
+
+ +
+

destroy

+ public function destroy(Boolean removeEl) +
+ Destroy this grid. +
+ Parameters: +
  • removeEl : Boolean
    True to remove the element
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

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.
+
+ +
+

getColumnModel

+ public function getColumnModel() +
+ Returns the grid's ColumnModel. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • ColumnModel
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getDataSource

+ public function getDataSource() +
+ Returns the grid's DataSource. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • DataSource
  • +
+
+
+
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.
+
+ +
+

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.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render() +
+ * +Called once after all setup has been completed and the grid is ready to be rendered. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.grid.Grid
    this
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

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 : Ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

cellcontextmenu

+ public event cellcontextmenu +
+ Fires when a cell is right clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • cellIndex : Number
  • e : 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 : 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 : Ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

columnmove

+ public event columnmove +
+ Fires when the user moves a column +
+ Subscribers will be called with the following parameters: +
  • oldIndex : Number
  • newIndex : Number
+
+
+
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.
+
+ +
+

contextmenu

+ public event contextmenu +
+ The raw contextmenu event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : Ext.EventObject
+
+
+
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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : Ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

headerdblclick

+ public event headerdblclick +
+ Fires when a header cell is double clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • columnIndex : Number
  • e : 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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : Ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

rowdblclick

+ public event rowdblclick +
+ Fires when a row is double clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • e : 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 : Ext.GridDD
    The drag drop object
  • e : event
    The raw browser event
+
+
+
This event is defined by Grid.
+
+
+

Config Details

+
+ +
+

A

+ A : Object +
+ javascript RegExp defining tagNames allowed to have text selection (Defaults to /INPUT|TEXTAREA|SELECT/i).
+
This config option is defined by Grid.
+
+ +
+

An

+ An : Object +
+ Ext.LoadMask config or true to mask the grid while loading (defaults to false).
+
This config option is defined by Grid.
+
+ +
+

If

+ If : Boolean +
+ 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 config option is defined by Grid.
+
+ +
+

The

+ The : Object +
+ Ext.grid.GridView used by the grid. This can be set before a call to render().
+
This config option is defined by Grid.
+
+ +
+

True

+ True : Boolean +
+ to fit the height of the grid container to the height of the data. Defaults to false.
+
This config option is defined by Grid.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.grid.GridView.html b/www/extras/yui-ext/docs/output/Ext.grid.GridView.html new file mode 100644 index 000000000..184e6b311 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.grid.GridView.html @@ -0,0 +1,357 @@ + + + + Ext.grid.GridView + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.grid.GridView

+ + + + + +
Package:Ext.grid
Class:GridView
Extends:AbstractGridView
Defined In:GridView.js
+
+ The default GridView implementation
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 GridView(Object config)GridView
 autoSizeColumn(Number colIndex, Boolean forceMinSize) : voidGridView
Autofit a column to its content.
 autoSizeColumns() : voidGridView
Autofits all columns to their content and then expands to fit any extra space in the grid
 ensureVisible(Number row, Number col, Boolean hscroll) : voidGridView
Scrolls the specified cell into view
 fitColumns(Boolean reserveScrollSpace) : voidGridView
Autofits all columns to the grid's width proportionate with their current size
 focusCell(Number row, Number col, Boolean hscroll) : voidGridView
Focuses the specified cell.
 focusRow(Number row) : voidGridView
Focuses the specified row.
 getFooterPanel(Boolean doShow) : Ext.ElementGridView
Gets a panel in the footer of the grid that can be used for toolbars etc. +After modifying the contents of this panel ...
 getHeaderPanel(Boolean doShow) : Ext.ElementGridView
Gets a panel in the header of the grid that can be used for toolbars etc. +After modifying the contents of this panel ...
 getRowClass(Record record, Number index) : voidGridView
Override this function to apply custom css classes to rows during rendering
 refresh(Boolean headersToo) : voidGridView
Refreshes the grid
 scrollToTop() : voidGridView
Scrolls the grid to the top
+ +

Public Events

+
This class has no public events.
+ +

Constructor Details

+
+
+

GridView

+ public function GridView(Object config) +
+
+ Parameters: +
  • config : Object
+
+
+
+
+ +

Method Details

+
+ +
+

autoSizeColumn

+ public function autoSizeColumn(Number colIndex, Boolean forceMinSize) +
+ Autofit a column to its 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 row, Number col, Boolean hscroll) +
+ Scrolls the specified cell into view +
+ Parameters: +
  • row : Number
    The row index
  • col : Number
    The column index
  • hscroll : Boolean
    false to disable horizontal scrolling
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

fitColumns

+ public function fitColumns(Boolean reserveScrollSpace) +
+ Autofits all columns to the grid's width proportionate with their current size +
+ Parameters: +
  • reserveScrollSpace : Boolean
    Reserve space for a scrollbar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

focusCell

+ public function focusCell(Number row, Number col, Boolean hscroll) +
+ Focuses the specified cell. +
+ Parameters: +
  • row : Number
    The row index
  • col : Number
    The column index
  • hscroll : Boolean
    false to disable horizontal scrolling
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

focusRow

+ public function focusRow(Number row) +
+ Focuses the specified row. +
+ Parameters: +
  • row : Number
    The row index
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

getFooterPanel

+ public function getFooterPanel(Boolean doShow) +
+ Gets a panel in the footer of the grid that can be used for toolbars etc. +After modifying the contents of this panel a call to grid.autoSize() may be +required to register any changes in size. +
+ Parameters: +
  • doShow : Boolean
    By default the footer is hidden. Pass true to show the panel
+ Returns: +
    +
  • Ext.Element
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

getHeaderPanel

+ public function getHeaderPanel(Boolean doShow) +
+ Gets a panel in the header of the grid that can be used for toolbars etc. +After modifying the contents of this panel a call to grid.autoSize() may be +required to register any changes in size. +
+ Parameters: +
  • doShow : Boolean
    By default the header is hidden. Pass true to show the panel
+ Returns: +
    +
  • Ext.Element
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

getRowClass

+ public function getRowClass(Record record, Number index) +
+ Override this function to apply custom css classes to rows during rendering +
+ Parameters: +
  • record : Record
    The record
  • index : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

refresh

+ public function refresh(Boolean headersToo) +
+ Refreshes the grid +
+ Parameters: +
  • headersToo : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

scrollToTop

+ public function scrollToTop() +
+ Scrolls the grid to the top +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.grid.RowSelectionModel.html b/www/extras/yui-ext/docs/output/Ext.grid.RowSelectionModel.html new file mode 100644 index 000000000..7efb4d6cf --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.grid.RowSelectionModel.html @@ -0,0 +1,904 @@ + + + + Ext.grid.RowSelectionModel + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.grid.RowSelectionModel

+ + + + + +
Package:Ext.grid
Class:RowSelectionModel
Extends:AbstractSelectionModel
Defined In:RowSelectionModel.js
+
+ The default SelectionModel used by Ext.grid.Grid. + It supports multiple selections and keyboard selection/navigation.

+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 RowSelectionModel(Object config)RowSelectionModel
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 clearSelections() : voidRowSelectionModel
Clears all selections.
 deselectRange(Number startRow, Number endRow) : voidRowSelectionModel
Deselects a range of rows. All rows in between startRow and endRow are also deselected.
 deselectRow(Number row) : voidRowSelectionModel
Deselects a row.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getCount() : NumberRowSelectionModel
Gets the number of selected rows.
 getSelected() : RecordRowSelectionModel
Returns the first selected record.
 getSelections() : ArrayRowSelectionModel
Returns the selected records
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hasSelection() : BooleanRowSelectionModel
Returns True if there is a selection.
 isIdSelected(String id) : BooleanRowSelectionModel
Returns True if the specified record id is selected.
 isLocked() : BooleanAbstractSelectionModel
Returns true if the selections are locked
 isSelected(Number/Record record) : BooleanRowSelectionModel
Returns True if the specified row is selected.
 lock() : voidAbstractSelectionModel
Lock the selections
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 selectAll() : voidRowSelectionModel
Selects all rows.
 selectFirstRow() : voidRowSelectionModel
Selects the first row in the grid.
 selectLastRow([Boolean keepExisting]) : voidRowSelectionModel
Select the last row.
 selectNext([Boolean keepExisting]) : voidRowSelectionModel
Selects the row immediately following the last selected row.
 selectPrevious([Boolean keepExisting]) : voidRowSelectionModel
Selects the row that precedes the last selected row.
 selectRange(Number startRow, Number endRow, [Boolean keepExisting]) : voidRowSelectionModel
Selects a range of rows. All rows in between startRow and endRow are also selected.
 selectRecords(Array records, [Boolean keepExisting]) : voidRowSelectionModel
Select records.
 selectRow(Number row, [Boolean keepExisting]) : voidRowSelectionModel
Selects a row.
 selectRows(Array rows, [Boolean keepExisting]) : voidRowSelectionModel
Selects multiple rows.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 unlock() : voidAbstractSelectionModel
Unlock the selections
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforerowselect : (SelectionModel this, Number rowIndex)RowSelectionModel
Fires when a row is selected being selected, return false to cancel.
 rowselect : (SelectionModel this, Number rowIndex)RowSelectionModel
Fires when a row is selected.
 selectionchange : (SelectionModel this)RowSelectionModel
Fires when the selection changes
+ +

Config Options

+ + + + + + + + + + + + + +
Config OptionsDefined By
 singleSelect : BooleanRowSelectionModel
True to allow selection of only one row at a time (defaults to false)
+ + +

Constructor Details

+
+
+

RowSelectionModel

+ public function RowSelectionModel(Object config) +
+
+ Parameters: +
  • config : Object
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

clearSelections

+ public function clearSelections() +
+ Clears all selections. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

deselectRange

+ public function deselectRange(Number startRow, Number endRow) +
+ Deselects a range of rows. All rows in between startRow and endRow are also deselected. +
+ Parameters: +
  • startRow : Number
    The index of the first row in the range
  • endRow : Number
    The index of the last row in the range
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

deselectRow

+ public function deselectRow(Number row) +
+ Deselects a row. +
+ Parameters: +
  • row : Number
    The index of the row to deselect
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

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.
+
+ +
+

getCount

+ public function getCount() +
+ Gets the number of selected rows. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

getSelected

+ public function getSelected() +
+ Returns the first selected record. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Record
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

getSelections

+ public function getSelections() +
+ Returns the selected records +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
    Array of selected records
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hasSelection

+ public function hasSelection() +
+ Returns True if there is a selection. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

isIdSelected

+ public function isIdSelected(String id) +
+ Returns True if the specified record id is selected. +
+ Parameters: +
  • id : String
    The id of record to check
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

isLocked

+ public function isLocked() +
+ Returns true if the selections are locked +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by AbstractSelectionModel.
+
+ +
+

isSelected

+ public function isSelected(Number/Record record) +
+ Returns True if the specified row is selected. +
+ Parameters: +
  • record : Number/Record
    The record or index of the record to check
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

lock

+ public function lock() +
+ Lock the selections +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AbstractSelectionModel.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

selectAll

+ public function selectAll() +
+ Selects all rows. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

selectFirstRow

+ public function selectFirstRow() +
+ Selects the first row in the grid. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

selectLastRow

+ public function selectLastRow([Boolean keepExisting]) +
+ Select the last row. +
+ Parameters: +
  • keepExisting : Boolean
    (optional) True to keep existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

selectNext

+ public function selectNext([Boolean keepExisting]) +
+ Selects the row immediately following the last selected row. +
+ Parameters: +
  • keepExisting : Boolean
    (optional) True to keep existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

selectPrevious

+ public function selectPrevious([Boolean keepExisting]) +
+ Selects the row that precedes the last selected row. +
+ Parameters: +
  • keepExisting : Boolean
    (optional) True to keep existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

selectRange

+ public function selectRange(Number startRow, Number endRow, [Boolean keepExisting]) +
+ Selects a range of rows. All rows in between startRow and endRow are also selected. +
+ Parameters: +
  • startRow : Number
    The index of the first row in the range
  • endRow : Number
    The index of the last row in the range
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

selectRecords

+ public function selectRecords(Array records, [Boolean keepExisting]) +
+ Select records. +
+ Parameters: +
  • records : Array
    The records to select
  • keepExisting : Boolean
    (optional) True to keep existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

selectRow

+ public function selectRow(Number row, [Boolean keepExisting]) +
+ Selects a row. +
+ Parameters: +
  • row : Number
    The index of the row to select
  • keepExisting : Boolean
    (optional) True to keep existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

selectRows

+ public function selectRows(Array rows, [Boolean keepExisting]) +
+ Selects multiple rows. +
+ Parameters: +
  • rows : Array
    Array of the indexes of the row to select
  • keepExisting : Boolean
    (optional) True to keep existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by RowSelectionModel.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

unlock

+ public function unlock() +
+ Unlock the selections +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AbstractSelectionModel.
+
+
+ +

Event Details

+
+ +
+

beforerowselect

+ public event beforerowselect +
+ Fires when a row is selected being selected, return false to cancel. +
+ Subscribers will be called with the following parameters: +
  • this : SelectionModel
  • rowIndex : Number
    The selected index
+
+
+
This event is defined by RowSelectionModel.
+
+ +
+

rowselect

+ public event rowselect +
+ Fires when a row is selected. +
+ Subscribers will be called with the following parameters: +
  • this : SelectionModel
  • rowIndex : Number
    The selected index
+
+
+
This event is defined by RowSelectionModel.
+
+ +
+

selectionchange

+ public event selectionchange +
+ Fires when the selection changes +
+ Subscribers will be called with the following parameters: +
  • this : SelectionModel
+
+
+
This event is defined by RowSelectionModel.
+
+
+

Config Details

+
+ +
+

singleSelect

+ singleSelect : Boolean +
+ True to allow selection of only one row at a time (defaults to false)
+
This config option is defined by RowSelectionModel.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.html b/www/extras/yui-ext/docs/output/Ext.html new file mode 100644 index 000000000..0830dcd60 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.html @@ -0,0 +1,668 @@ + + + + Ext + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext

+ + + + + +
Package:Global
Class:Ext
Extends:Object
Defined In:Ext.js
+
+ Ext core utilties and functions

This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 BLANK_IMAGE_URL : StringExt
URL to a 1x1 transparent gif image used by Ext to create inline icons with CSS background images. (Defaults to +"http:...
 SSL_SECURE_URL : StringExt
URL to a blank file used by Ext when in secure mode for iframe src and onReady src to prevent +the IE insecure content...
 isReady : BooleanExt
True when the document is fully initialized and ready for action
 isSecure : BooleanExt
True if the page is running over SSL
 isStrict : BooleanExt
True if the browser is in strict mode
 useShims : BooleanExt
By default, Ext intelligently decides whether floating elements should be shimmed. If you are using flash, + you ...
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 addBehaviors(Object obj) : voidExt
Applies event listeners to elements by selectors when the document is ready. +The event name is specified with an @ su...
 apply(Object obj, Object config, Object defaults) : ObjectExt
* +Copies all the properties of config to obj.
 applyIf(Object obj, Object config) : ObjectExt
Copies all the properties of config to obj if they don't already exist.
 decode() : voidExt
Shorthand for Ext.util.JSON.decode
 each(Array/NodeList/Mixed array, Function fn, Object scope) : voidExt
Iterates an array calling the passed function with each item, stopping if your function returns false. If the +passed ...
 encode() : voidExt
Shorthand for Ext.util.JSON.encode
 escapeRe(String str) : StringExt
Escapes the passed string for use in a regular expression
 extend(Object subclass, Object superclass, [Object overrides]) : voidExt
Extends one class with another class and optionally overrides members with the passed literal. This class +also adds t...
 fly(String/HTMLElement el, [String named]) : ElementExt
<static> Gets the globally shared flyweight Element, with the passed node as the active element. Do not store a...
 get(String/HTMLElement/Element el) : ElementExt
Static method to retrieve Element objects. Uses simple caching to consistently return the same object. +Automatically...
 getCmp(String id) : Ext.ComponentExt
Shorthand for Ext.ComponentMgr.get
 getDom(String/HTMLElement/Element) el) : HTMLElementExt
Return the dom node for the passed string (id), dom node, or Ext.Element
 id([String/HTMLElement/Element el], [String prefix]) : voidExt
Generates unique ids. If the element already has an id, it is unchanged
 namespace(String namespace1, String namespace2, String etc) : voidExt
Creates namespaces but does not assume YAHOO is the root.
 onReady(Function fn, Object scope, boolean override) : voidExt
Fires when the document is ready (before onload and before images are loaded). Shorthand of Ext.EventManager.onDocum...
 query(String path, [Node root]) : ArrayExt
Selects an array of DOM nodes by CSS/XPath selector. Shorthand of Ext.DomQuery.select
 select(String/Array selector, [Boolean unique]) : CompositeElementLite/CompositeElementExt
Selects elements based on the passed CSS selector to enable working on them as 1.
 urlDecode(String string, [Boolean overwrite]) : ObjectExt
Takes an encoded URL and and converts it to an object. e.g. Ext.urlDecode("foo=1&bar=2"); would return {foo: 1, bar: ...
 urlEncode(Object o) : StringExt
Takes an object and converts it to an encoded URL. e.g. Ext.urlEncode({foo: 1, bar: 2}); would return "foo=1&bar=2". ...
+ +

Public Events

+
This class has no public events.

Property Details

+
+ +
+

BLANK_IMAGE_URL

+ public String BLANK_IMAGE_URL +
+ URL to a 1x1 transparent gif image used by Ext to create inline icons with CSS background images. (Defaults to +"http://extjs.com/s.gif" and you should change this to a URL on your server).
+
This property is defined by Ext.
+
+ +
+

SSL_SECURE_URL

+ public String SSL_SECURE_URL +
+ URL to a blank file used by Ext when in secure mode for iframe src and onReady src to prevent +the IE insecure content warning (defaults to javascript:false).
+
This property is defined by Ext.
+
+ +
+

isReady

+ public Boolean isReady +
+ True when the document is fully initialized and ready for action
+
This property is defined by Ext.
+
+ +
+

isSecure

+ public Boolean isSecure +
+ True if the page is running over SSL
+
This property is defined by Ext.
+
+ +
+

isStrict

+ public Boolean isStrict +
+ True if the browser is in strict mode
+
This property is defined by Ext.
+
+ +
+

useShims

+ public Boolean useShims +
+ By default, Ext intelligently decides whether floating elements should be shimmed. If you are using flash, + you may want to set this to true.
+
This property is defined by Ext.
+
+
+ + +

Method Details

+
+ +
+

addBehaviors

+ public function addBehaviors(Object obj) +
+ Applies event listeners to elements by selectors when the document is ready. +The event name is specified with an @ suffix. +

+Ext.addBehaviors({
+   // add a listener for click on all anchors in element with id foo
+   '#foo a@click' : function(e, t){
+       // do something
+   },
+
+   // add the same listener to multiple selectors (separated by comma BEFORE the @)
+   '#foo a, #bar span.some-class@mouseover' : function(){
+       // do something
+   }
+});
+
+
+ Parameters: +
  • obj : Object
    The list of behaviors to apply
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Ext.
+
+ +
+

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 Ext.
+
+ +
+

applyIf

+ public function applyIf(Object obj, Object config) +
+ Copies all the properties of config to obj if they don't already exist. +
+ Parameters: +
  • obj : Object
    The receiver of the properties
  • config : Object
    The source of the properties
+ Returns: +
    +
  • Object
    returns obj
  • +
+
+
+
This method is defined by Ext.
+
+ +
+

decode

+ public function decode() +
+ Shorthand for Ext.util.JSON.decode +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Ext.
+
+ +
+

each

+ public function each(Array/NodeList/Mixed array, Function fn, Object scope) +
+ Iterates an array calling the passed function with each item, stopping if your function returns false. If the +passed array is not really an array, your function is called once with it. +The supplied function is called with (Object item, Number index, Array allItems). +
+ Parameters: +
  • array : Array/NodeList/Mixed
  • fn : Function
  • scope : Object
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Ext.
+
+ +
+

encode

+ public function encode() +
+ Shorthand for Ext.util.JSON.encode +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Ext.
+
+ +
+

escapeRe

+ public function escapeRe(String str) +
+ Escapes the passed string for use in a regular expression +
+ Parameters: +
  • str : String
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Ext.
+
+ +
+

extend

+ public function extend(Object subclass, Object superclass, [Object overrides]) +
+ Extends one class with another class and optionally overrides members with the passed literal. This class +also adds the function "override()" to the class that can be used to override +members on an instance. +
+ Parameters: +
  • subclass : Object
    The class inheriting the functionality
  • superclass : Object
    The class being extended
  • overrides : Object
    (optional) A literal with members
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Ext.
+
+ +
+

fly

+ public function fly(String/HTMLElement el, [String named]) +
+ <static> Gets the globally shared flyweight Element, with the passed node as the active element. Do not store a reference to this element - +the dom node can be overwritten by other code. +Shorthand of Ext.Element.fly +
+ Parameters: +
  • el : String/HTMLElement
    The dom node or id
  • named : String
    (optional) Allows for creation of named reusable flyweights to prevent conflicts (e.g. internally Ext uses "_internal")
+ Returns: +
    +
  • Element
    The shared Element object
  • +
+
+
+
This method is defined by Ext.
+
+ +
+

get

+ public function get(String/HTMLElement/Element el) +
+ Static method to retrieve 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. +Shorthand of Ext.Element.get +
+ Parameters: +
  • el : String/HTMLElement/Element
    The id of the node, a DOM Node or an existing Element.
+ Returns: +
    +
  • Element
    The Element object
  • +
+
+
+
This method is defined by Ext.
+
+ +
+

getCmp

+ public function getCmp(String id) +
+ Shorthand for Ext.ComponentMgr.get +
+ Parameters: +
  • id : String
+ Returns: +
    +
  • Ext.Component
  • +
+
+
+
This method is defined by Ext.
+
+ +
+

getDom

+ public function getDom(String/HTMLElement/Element) el) +
+ Return the dom node for the passed string (id), dom node, or Ext.Element +
+ Parameters: +
  • el : String/HTMLElement/Element)
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Ext.
+
+ +
+

id

+ public function id([String/HTMLElement/Element el], [String prefix]) +
+ Generates unique ids. If the element already has an id, it is unchanged +
+ Parameters: +
  • el : String/HTMLElement/Element
    (optional) The element to generate an id for
  • prefix : String
    (optional) Id prefix (defaults "ext-gen")
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Ext.
+
+ +
+

namespace

+ public function namespace(String namespace1, String namespace2, String etc) +
+ Creates namespaces but does not assume YAHOO is the root. +
+ Parameters: +
  • namespace1 : String
  • namespace2 : String
  • etc : String
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Ext.
+
+ +
+

onReady

+ public function onReady(Function fn, Object scope, boolean override) +
+ Fires when the document is ready (before onload and before images are loaded). Shorthand of Ext.EventManager.onDocumentReady. +
+ 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 Ext.
+
+ +
+

query

+ public function query(String path, [Node root]) +
+ Selects an array of DOM nodes by CSS/XPath selector. Shorthand of Ext.DomQuery.select +
+ Parameters: +
  • path : String
    The selector/xpath query
  • root : Node
    (optional) The start of the query (defaults to document).
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by Ext.
+
+ +
+

select

+ public function select(String/Array selector, [Boolean unique]) +
+ 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 Ext.Element for each element (defaults to a shared flyweight object)
+ Returns: +
    +
  • CompositeElementLite/CompositeElement
  • +
+
+
+
This method is defined by Ext.
+
+ +
+

urlDecode

+ public function urlDecode(String string, [Boolean overwrite]) +
+ Takes an encoded URL and and converts it to an object. e.g. Ext.urlDecode("foo=1&bar=2"); would return {foo: 1, bar: 2} or Ext.urlDecode("foo=1&bar=2&bar=3&bar=4", true); would return {foo: 1, bar: [2, 3, 4]}. +
+ Parameters: +
  • string : String
  • overwrite : Boolean
    (optional) Items of the same name will overwrite previous values instead of creating an an array (Defaults to false).
+ Returns: +
    +
  • Object
    A literal with members
  • +
+
+
+
This method is defined by Ext.
+
+ +
+

urlEncode

+ public function urlEncode(Object o) +
+ Takes an object and converts it to an encoded URL. e.g. Ext.urlEncode({foo: 1, bar: 2}); would return "foo=1&bar=2". Optionally, property values can be arrays, instead of keys and the resulting string that's returned will contain a name/value pair for each array value. +
+ Parameters: +
  • o : Object
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Ext.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.jss.html b/www/extras/yui-ext/docs/output/Ext.jss.html new file mode 100644 index 000000000..40e5bc462 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.jss.html @@ -0,0 +1,588 @@ +Ext.js

Ext.js


+Ext = {};
+
+// for old browsers
+window["undefined"] = window["undefined"];
+
+/**
+ * @class Ext
+ * Ext core utilties and functions
+ * @singleton
+ */
+// holder
+/***
+ * 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
+ * @member Ext apply
+ */
+Ext.apply = function(o, c, defaults){
+    if(defaults){
+        // no "this" reference for friendly out of scope calls
+        Ext.apply(o, defaults);
+    }
+    if(o && c && typeof c == 'object'){
+        for(var p in c){
+            o[p] = c[p];
+        }
+    }
+    return o;
+};
+
+(function(){
+    var idSeed = 0;
+    var ua = navigator.userAgent.toLowerCase();
+
+    var isStrict = document.compatMode == "CSS1Compat",
+        isOpera = ua.indexOf("opera") > -1,
+        isSafari = (/webkit|khtml/).test(ua),
+        isIE = ua.indexOf("msie") > -1,
+        isIE7 = ua.indexOf("msie 7") > -1,
+        isGecko = !isSafari && ua.indexOf("gecko") > -1,
+        isBorderBox = isIE && !isStrict,
+        isWindows = (ua.indexOf("windows") != -1 || ua.indexOf("win32") != -1),
+        isMac = (ua.indexOf("macintosh") != -1 || ua.indexOf("mac os x") != -1),
+        isSecure = window.location.href.toLowerCase().indexOf("https") === 0;
+
+    // remove css image flicker
+	if(isIE && !isIE7){
+        try{
+            document.execCommand("BackgroundImageCache", false, true);
+        }catch(e){}
+    }
+
+    Ext.apply(Ext, {
+        /**
+         * True if the browser is in strict mode
+         * @type Boolean
+         */
+        isStrict : isStrict,
+        /**
+         * True if the page is running over SSL
+         * @type Boolean
+         */
+        isSecure : isSecure,
+        /**
+         * True when the document is fully initialized and ready for action
+         * @type Boolean
+         */
+        isReady : false,
+        /**
+         * URL to a blank file used by Ext when in secure mode for iframe src and onReady src to prevent
+         * the IE insecure content warning (defaults to javascript:false).
+         * @type String
+         */
+        SSL_SECURE_URL : "javascript:false",
+
+        /**
+         * URL to a 1x1 transparent gif image used by Ext to create inline icons with CSS background images. (Defaults to
+         * "http://extjs.com/s.gif" and you should change this to a URL on your server).
+         * @type String
+         */
+        BLANK_IMAGE_URL : "http:/"+"/extjs.com/s.gif",
+
+        emptyFn : function(){},
+
+        /**
+         * Copies all the properties of config to obj if they don't already exist.
+         * @param {Object} obj The receiver of the properties
+         * @param {Object} config The source of the properties
+         * @return {Object} returns obj
+         */
+        applyIf : function(o, c){
+            if(o && c){
+                for(var p in c){
+                    if(typeof o[p] == "undefined"){ o[p] = c[p]; }
+                }
+            }
+            return o;
+        },
+
+        /**
+         * Applies event listeners to elements by selectors when the document is ready.
+         * The event name is specified with an @ suffix.
+<pre><code>
+Ext.addBehaviors({
+   // add a listener for click on all anchors in element with id foo
+   '#foo a@click' : function(e, t){
+       // do something
+   },
+
+   // add the same listener to multiple selectors (separated by comma BEFORE the @)
+   '#foo a, #bar span.some-class@mouseover' : function(){
+       // do something
+   }
+});
+</code></pre>
+         * @param {Object} obj The list of behaviors to apply
+         */
+        addBehaviors : function(o){
+            if(!Ext.isReady){
+                Ext.onReady(function(){
+                    Ext.addBehaviors(o);
+                });
+                return;
+            }
+            var cache = {}; // simple cache for applying multiple behaviors to same selector does query multiple times
+            for(var b in o){
+                var parts = b.split('@');
+                if(parts[1]){ // for Object prototype breakers
+                    var s = parts[0];
+                    if(!cache[s]){
+                        cache[s] = Ext.select(s);
+                    }
+                    cache[s].on(parts[1], o[b]);
+                }
+            }
+            cache = null;
+        },
+
+        /**
+         * Generates unique ids. If the element already has an id, it is unchanged
+         * @param {String/HTMLElement/Element} el (optional) The element to generate an id for
+         * @param {String} prefix (optional) Id prefix (defaults "ext-gen")
+         */
+        id : function(el, prefix){
+            prefix = prefix || "ext-gen";
+            el = Ext.getDom(el);
+            var id = prefix + (++idSeed);
+            return el ? (el.id ? el.id : (el.id = id)) : id;
+        },
+
+        /**
+         * Extends one class with another class and optionally overrides members with the passed literal. This class
+         * also adds the function "override()" to the class that can be used to override
+         * members on an instance.
+         * @param {Object} subclass The class inheriting the functionality
+         * @param {Object} superclass The class being extended
+         * @param {Object} overrides (optional) A literal with members
+         * @method extend
+         */
+        extend : function(){
+            // inline overrides
+            var io = function(o){
+                for(var m in o){
+                    this[m] = o[m];
+                }
+            };
+            return function(sb, sp, overrides){
+                if(typeof sp == 'object'){
+                    overrides = sp;
+                    sp = sb;
+                    sb = function(){sp.apply(this, arguments);};
+                }
+                var F = function(){}, sbp, spp = sp.prototype;
+                F.prototype = spp;
+                sbp = sb.prototype = new F();
+                sbp.constructor=sb;
+                sb.superclass=spp;
+                if(spp.constructor == Object.prototype.constructor){
+                    spp.constructor=sp;
+                }
+                sb.override = function(o){
+                    Ext.override(sb, o);
+                };
+                sbp.override = io;
+                sbp.__extcls = sb;
+                Ext.override(sb, overrides);
+                return sb;
+            };
+        }(),
+
+        override : function(origclass, overrides){
+            if(overrides){
+                var p = origclass.prototype;
+                for(var method in overrides){
+                    p[method] = overrides[method];
+                }
+            }
+        },
+        /**
+         * Creates namespaces but does not assume YAHOO is the root.
+         * @param {String} namespace1
+         * @param {String} namespace2
+         * @param {String} etc
+         * @method namespace
+         */
+        namespace : function(){
+            var a=arguments, o=null, i, j, d, rt;
+            for (i=0; i<a.length; ++i) {
+                d=a[i].split(".");
+                rt = d[0];
+                eval('if (typeof ' + rt + ' == "undefined"){' + rt + ' = {};} o = ' + rt + ';');
+                for (j=1; j<d.length; ++j) {
+                    o[d[j]]=o[d[j]] || {};
+                    o=o[d[j]];
+                }
+            }
+        },
+
+        /**
+         * Takes an object and converts it to an encoded URL. e.g. Ext.urlEncode({foo: 1, bar: 2}); would return "foo=1&bar=2".  Optionally, property values can be arrays, instead of keys and the resulting string that's returned will contain a name/value pair for each array value.
+         * @param {Object} o
+         * @return {String}
+         */
+        urlEncode : function(o){
+            if(!o){
+                return "";
+            }
+            var buf = [];
+            for(var key in o){
+                var ov = o[key];
+                var type = typeof ov;
+                if(type == 'undefined'){
+                    buf.push(encodeURIComponent(key), "=&");
+                }else if(type != "function" && type != "object"){
+                    buf.push(encodeURIComponent(key), "=", encodeURIComponent(ov), "&");
+                }else if(ov instanceof Array){
+                    for(var i = 0, len = ov.length; i < len; i++) {
+                        buf.push(encodeURIComponent(key), "=", encodeURIComponent(ov[i] === undefined ? '' : ov[i]), "&");
+                    }
+                }
+            }
+            buf.pop();
+            return buf.join("");
+        },
+
+        /**
+         * Takes an encoded URL and and converts it to an object. e.g. Ext.urlDecode("foo=1&bar=2"); would return {foo: 1, bar: 2} or Ext.urlDecode("foo=1&bar=2&bar=3&bar=4", true); would return {foo: 1, bar: [2, 3, 4]}.
+         * @param {String} string
+         * @param {Boolean} overwrite (optional) Items of the same name will overwrite previous values instead of creating an an array (Defaults to false).
+         * @return {Object} A literal with members
+         */
+        urlDecode : function(string, overwrite){
+            if(!string || !string.length){
+                return {};
+            }
+            var obj = {};
+            var pairs = string.split('&');
+            var pair, name, value;
+            for(var i = 0, len = pairs.length; i < len; i++){
+                pair = pairs[i].split('=');
+                name = decodeURIComponent(pair[0]);
+                value = decodeURIComponent(pair[1]);
+                if(overwrite !== true){
+                    if(typeof obj[name] == "undefined"){
+                        obj[name] = value;
+                    }else if(typeof obj[name] == "string"){
+                        obj[name] = [obj[name]];
+                        obj[name].push(value);
+                    }else{
+                        obj[name].push(value);
+                    }
+                }else{
+                    obj[name] = value;
+                }
+            }
+            return obj;
+        },
+
+        /**
+         * Iterates an array calling the passed function with each item, stopping if your function returns false. If the
+         * passed array is not really an array, your function is called once with it.
+         * The supplied function is called with (Object item, Number index, Array allItems).
+         * @param {Array/NodeList/Mixed} array
+         * @param {Function} fn
+         * @param {Object} scope
+         */
+        each : function(array, fn, scope){
+            if(typeof array.length == "undefined" || typeof array == "string"){
+                array = [array];
+            }
+            for(var i = 0, len = array.length; i < len; i++){
+                if(fn.call(scope || array[i], array[i], i, array) === false){ return i; };
+            }
+        },
+
+        // deprecated
+        combine : function(){
+            var as = arguments, l = as.length, r = [];
+            for(var i = 0; i < l; i++){
+                var a = as[i];
+                if(a instanceof Array){
+                    r = r.concat(a);
+                }else if(a.length !== undefined && !a.substr){
+                    r = r.concat(Array.prototype.slice.call(a, 0));
+                }else{
+                    r.push(a);
+                }
+            }
+            return r;
+        },
+
+        /**
+         * Escapes the passed string for use in a regular expression
+         * @param {String} str
+         * @return {String}
+         */
+        escapeRe : function(s) {
+            return s.replace(/([.*+?^${}()|[\]\/\\])/g, "\\$1");
+        },
+
+        // internal
+        callback : function(cb, scope, args, delay){
+            if(typeof cb == "function"){
+                if(delay){
+                    cb.defer(delay, scope, args || []);
+                }else{
+                    cb.apply(scope, args || []);
+                }
+            }
+        },
+
+        /**
+         * Return the dom node for the passed string (id), dom node, or Ext.Element
+         * @param {String/HTMLElement/Element) el
+         * @return HTMLElement
+         */
+        getDom : function(el){
+            if(!el){
+                return null;
+            }
+            return el.dom ? el.dom : (typeof el == 'string' ? document.getElementById(el) : el);
+        },
+
+        /**
+        * Shorthand for {@link Ext.ComponentMgr#get}
+        * @param {String} id
+        * @return Ext.Component
+        */
+        getCmp : function(id){
+            return Ext.ComponentMgr.get(id);
+        },
+
+        num : function(v, defaultValue){
+            if(typeof v != 'number'){
+                return defaultValue;
+            }
+            return v;
+        },
+
+        destroy : function(){
+            for(var i = 0, a = arguments, len = a.length; i < len; i++) {
+                var as = a[i];
+                if(as){
+                    if(as.dom){
+                        as.removeAllListeners();
+                        as.remove();
+                        continue;
+                    }
+                    if(typeof as.purgeListeners == 'function'){
+                        as.purgeListeners();
+                    }
+                    if(typeof as.destroy == 'function'){
+                        as.destroy();
+                    }
+                }
+            }
+        },
+
+        /* @type Boolean */
+        isOpera : isOpera,
+        /* @type Boolean */
+        isSafari : isSafari,
+        /* @type Boolean */
+        isIE : isIE,
+        /* @type Boolean */
+        isIE7 : isIE7,
+        /* @type Boolean */
+        isGecko : isGecko,
+        /* @type Boolean */
+        isBorderBox : isBorderBox,
+        /* @type Boolean */
+        isWindows : isWindows,
+        /* @type Boolean */
+        isMac : isMac,
+
+    /**
+     By default, Ext intelligently decides whether floating elements should be shimmed. If you are using flash,
+     you may want to set this to true.
+     @type Boolean
+     */
+        useShims : ((isIE && !isIE7) || (isGecko && isMac))
+    });
+
+
+})();
+
+Ext.namespace("Ext", "Ext.util", "Ext.grid", "Ext.dd", "Ext.tree", "Ext.data",
+                "Ext.form", "Ext.menu", "Ext.state", "Ext.lib", "Ext.layout");
+
+
+/**
+ * @class Function
+ * These functions are available on every Function object (any javascript function).
+ */
+Ext.apply(Function.prototype, {
+     /**
+     * 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
+    */
+    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 {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
+     */
+    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 (if 0 the function is executed immediately)
+     * @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
+     */
+    defer : function(millis, obj, args, appendArgs){
+        var fn = this.createDelegate(obj, args, appendArgs);
+        if(millis){
+            return setTimeout(fn, millis);
+        }
+        fn();
+        return 0;
+    },
+    /**
+     * 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
+     */
+    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
+     */
+    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);
+        };
+    }
+});
+
+Ext.applyIf(String, {
+
+    /*
+     * Escapes the passed string for ' and \
+     * @param {String} str
+     * @return {String}
+     */
+    escape : function(string) {
+        return string.replace(/('|\\)/g, "\\$1");
+    },
+
+    leftPad : function (val, size, ch) {
+        var result = new String(val);
+        if (ch == null) {
+            ch = " ";
+        }
+        while (result.length < size) {
+            result = ch + result;
+        }
+        return result;
+    },
+
+    format : function(format){
+        var args = Array.prototype.slice.call(arguments, 1);
+        return format.replace(/\{(\d+)\}/g, function(m, i){
+            return args[i];
+        });
+    }
+});
+
+String.prototype.toggle = function(value, other){
+    return this == value ? other : value;
+};
+
+Ext.applyIf(Number.prototype, {
+    constrain : function(min, max){
+        return Math.min(Math.max(this, min), max);
+    }
+});
+
+Ext.applyIf(Array.prototype, {
+    indexOf : function(o){
+       for (var i = 0, len = this.length; i < len; i++){
+ 	      if(this[i] == o) return i;
+       }
+ 	   return -1;
+    },
+
+    remove : function(o){
+       var index = this.indexOf(o);
+       if(index != -1){
+           this.splice(index, 1);
+       }
+    }
+});
+
+/**
+ Returns the number of milliseconds between this date and date
+ @param {Date} date (optional) Defaults to now
+ @return {Number} The diff in milliseconds
+ @member Date getElapsed
+ */
+Date.prototype.getElapsed = function(date) {
+	return Math.abs((date || new Date()).getTime()-this.getTime());
+};
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.menu.Adapter.html b/www/extras/yui-ext/docs/output/Ext.menu.Adapter.html new file mode 100644 index 000000000..852f60799 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.menu.Adapter.html @@ -0,0 +1,1002 @@ + + + + Ext.menu.Adapter + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.menu.Adapter

+ + + + + + +
Package:Ext.menu
Class:Adapter
Extends:BaseItem
Subclasses:ColorItem, DateItem
Defined In:Adapter.js
+
+ A base utility class that adapts a non-menu component so that it can be wrapped by a menu item and added to a menu. +It provides basic rendering, activation management and enable/disable logic required to work in menus.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Adapter(Object config)Adapter
Creates a new Adapter
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isVisible() : voidComponent
Returns true if this component is visible
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 activate : (Ext.menu.BaseItem this)BaseItem
Fires when this item is activated
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 click : (Ext.menu.BaseItem this, Ext.EventObject e)BaseItem
Fires when this item is clicked
 deactivate : (Ext.menu.BaseItem this)BaseItem
Fires when this item is deactivated
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 hide : (Ext.Component this)Component
Fires after the component is hidden
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 activeClass : StringBaseItem
The CSS class to use when the item becomes activated (defaults to "x-menu-item-active")
 canActivate : BooleanBaseItem
True if this item can be visually activated (defaults to false)
 handler : FunctionBaseItem
A function that will handle the click event of this menu item (defaults to undefined)
 hideDelay : NumberBaseItem
Length of time in milliseconds to wait before hiding after a click (defaults to 100)
 hideOnClick : BooleanBaseItem
True to hide the containing menu after this item is clicked (defaults to true)
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

Adapter

+ public function Adapter(Object config) +
+ Creates a new Adapter
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

activate

+ public event activate +
+ Fires when this item is activated +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
+
+
+
This event is defined by BaseItem.
+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

click

+ public event click +
+ Fires when this item is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
  • e : Ext.EventObject
+
+
+
This event is defined by BaseItem.
+
+ +
+

deactivate

+ public event deactivate +
+ Fires when this item is deactivated +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
+
+
+
This event is defined by BaseItem.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+
+

Config Details

+
+ +
+

activeClass

+ activeClass : String +
+ The CSS class to use when the item becomes activated (defaults to "x-menu-item-active")
+
This config option is defined by BaseItem.
+
+ +
+

canActivate

+ canActivate : Boolean +
+ True if this item can be visually activated (defaults to false)
+
This config option is defined by BaseItem.
+
+ +
+

handler

+ handler : Function +
+ A function that will handle the click event of this menu item (defaults to undefined)
+
This config option is defined by BaseItem.
+
+ +
+

hideDelay

+ hideDelay : Number +
+ Length of time in milliseconds to wait before hiding after a click (defaults to 100)
+
This config option is defined by BaseItem.
+
+ +
+

hideOnClick

+ hideOnClick : Boolean +
+ True to hide the containing menu after this item is clicked (defaults to true)
+
This config option is defined by BaseItem.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.menu.BaseItem.html b/www/extras/yui-ext/docs/output/Ext.menu.BaseItem.html new file mode 100644 index 000000000..a3d9cfb19 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.menu.BaseItem.html @@ -0,0 +1,1002 @@ + + + + Ext.menu.BaseItem + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.menu.BaseItem

+ + + + + + +
Package:Ext.menu
Class:BaseItem
Extends:Component
Subclasses:Adapter, Item, Separator, TextItem
Defined In:BaseItem.js
+
+ The base class for all items that render into menus. BaseItem provides default rendering, activated state +management and base configuration options shared by all menu components.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 BaseItem(Object config)BaseItem
Creates a new BaseItem
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isVisible() : voidComponent
Returns true if this component is visible
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 activate : (Ext.menu.BaseItem this)BaseItem
Fires when this item is activated
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 click : (Ext.menu.BaseItem this, Ext.EventObject e)BaseItem
Fires when this item is clicked
 deactivate : (Ext.menu.BaseItem this)BaseItem
Fires when this item is deactivated
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 hide : (Ext.Component this)Component
Fires after the component is hidden
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 activeClass : StringBaseItem
The CSS class to use when the item becomes activated (defaults to "x-menu-item-active")
 canActivate : BooleanBaseItem
True if this item can be visually activated (defaults to false)
 handler : FunctionBaseItem
A function that will handle the click event of this menu item (defaults to undefined)
 hideDelay : NumberBaseItem
Length of time in milliseconds to wait before hiding after a click (defaults to 100)
 hideOnClick : BooleanBaseItem
True to hide the containing menu after this item is clicked (defaults to true)
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

BaseItem

+ public function BaseItem(Object config) +
+ Creates a new BaseItem
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

activate

+ public event activate +
+ Fires when this item is activated +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
+
+
+
This event is defined by BaseItem.
+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

click

+ public event click +
+ Fires when this item is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
  • e : Ext.EventObject
+
+
+
This event is defined by BaseItem.
+
+ +
+

deactivate

+ public event deactivate +
+ Fires when this item is deactivated +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
+
+
+
This event is defined by BaseItem.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+
+

Config Details

+
+ +
+

activeClass

+ activeClass : String +
+ The CSS class to use when the item becomes activated (defaults to "x-menu-item-active")
+
This config option is defined by BaseItem.
+
+ +
+

canActivate

+ canActivate : Boolean +
+ True if this item can be visually activated (defaults to false)
+
This config option is defined by BaseItem.
+
+ +
+

handler

+ handler : Function +
+ A function that will handle the click event of this menu item (defaults to undefined)
+
This config option is defined by BaseItem.
+
+ +
+

hideDelay

+ hideDelay : Number +
+ Length of time in milliseconds to wait before hiding after a click (defaults to 100)
+
This config option is defined by BaseItem.
+
+ +
+

hideOnClick

+ hideOnClick : Boolean +
+ True to hide the containing menu after this item is clicked (defaults to true)
+
This config option is defined by BaseItem.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.menu.CheckItem.html b/www/extras/yui-ext/docs/output/Ext.menu.CheckItem.html new file mode 100644 index 000000000..9c5080a99 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.menu.CheckItem.html @@ -0,0 +1,1172 @@ + + + + Ext.menu.CheckItem + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.menu.CheckItem

+ + + + + +
Package:Ext.menu
Class:CheckItem
Extends:Item
Defined In:CheckItem.js
+
+ Adds a menu item that contains a checkbox by default, but can also be part of a radio group.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 CheckItem(Object config)CheckItem
Creates a new CheckItem
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isVisible() : voidComponent
Returns true if this component is visible
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 setChecked(Boolean checked, [Boolean suppressEvent]) : voidCheckItem
Set the checked state of this item
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setText(String text) : voidItem
Sets the text to display in this menu item
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 activate : (Ext.menu.BaseItem this)BaseItem
Fires when this item is activated
 beforecheckchange : (Ext.menu.CheckItem this, Boolean checked)CheckItem
Fires before the checked value is set, providing an opportunity to cancel if needed
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 checkchange : (Ext.menu.CheckItem this, Boolean checked)CheckItem
Fires after the checked value has been set
 click : (Ext.menu.BaseItem this, Ext.EventObject e)BaseItem
Fires when this item is clicked
 deactivate : (Ext.menu.BaseItem this)BaseItem
Fires when this item is deactivated
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 hide : (Ext.Component this)Component
Fires after the component is hidden
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 activeClass : StringBaseItem
The CSS class to use when the item becomes activated (defaults to "x-menu-item-active")
 canActivate : BooleanBaseItem
True if this item can be visually activated (defaults to false)
 checked : BooleanCheckItem
True to initialize this checkbox as checked (defaults to false). Note that if this checkbox is part of a radio group ...
 group : StringCheckItem
All check items with the same group name will automatically be grouped into a single-select radio button group (defau...
 groupClass : StringCheckItem
The default CSS class to use for radio group check items (defaults to "x-menu-group-item")
 handler : FunctionBaseItem
A function that will handle the click event of this menu item (defaults to undefined)
 hideDelay : NumberBaseItem
Length of time in milliseconds to wait before hiding after a click (defaults to 100)
 hideOnClick : BooleanBaseItem
True to hide the containing menu after this item is clicked (defaults to true)
 icon : StringItem
The path to an icon to display in this menu item (defaults to Ext.BLANK_IMAGE_URL)
 itemCls : StringCheckItem
The default CSS class to use for check items (defaults to "x-menu-item x-menu-check-item")
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

CheckItem

+ public function CheckItem(Object config) +
+ Creates a new CheckItem
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setChecked

+ public function setChecked(Boolean checked, [Boolean suppressEvent]) +
+ Set the checked state of this item +
+ Parameters: +
  • checked : Boolean
    The new checked value
  • suppressEvent : Boolean
    (optional) True to prevent the checkchange event from firing (defaults to false)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CheckItem.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setText

+ public function setText(String text) +
+ Sets the text to display in this menu item +
+ Parameters: +
  • text : String
    The text to display
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Item.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

activate

+ public event activate +
+ Fires when this item is activated +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
+
+
+
This event is defined by BaseItem.
+
+ +
+

beforecheckchange

+ public event beforecheckchange +
+ Fires before the checked value is set, providing an opportunity to cancel if needed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.CheckItem
  • checked : Boolean
    The new checked value that will be set
+
+
+
This event is defined by CheckItem.
+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

checkchange

+ public event checkchange +
+ Fires after the checked value has been set +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.CheckItem
  • checked : Boolean
    The checked value that was set
+
+
+
This event is defined by CheckItem.
+
+ +
+

click

+ public event click +
+ Fires when this item is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
  • e : Ext.EventObject
+
+
+
This event is defined by BaseItem.
+
+ +
+

deactivate

+ public event deactivate +
+ Fires when this item is deactivated +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
+
+
+
This event is defined by BaseItem.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+
+

Config Details

+
+ +
+

activeClass

+ activeClass : String +
+ The CSS class to use when the item becomes activated (defaults to "x-menu-item-active")
+
This config option is defined by BaseItem.
+
+ +
+

canActivate

+ canActivate : Boolean +
+ True if this item can be visually activated (defaults to false)
+
This config option is defined by BaseItem.
+
+ +
+

checked

+ checked : Boolean +
+ True to initialize this checkbox as checked (defaults to false). Note that if this checkbox is part of a radio group (group = true) only the last item in the group that is initialized with checked = true will be rendered as checked.
+
This config option is defined by CheckItem.
+
+ +
+

group

+ group : String +
+ All check items with the same group name will automatically be grouped into a single-select radio button group (defaults to '')
+
This config option is defined by CheckItem.
+
+ +
+

groupClass

+ groupClass : String +
+ The default CSS class to use for radio group check items (defaults to "x-menu-group-item")
+
This config option is defined by CheckItem.
+
+ +
+

handler

+ handler : Function +
+ A function that will handle the click event of this menu item (defaults to undefined)
+
This config option is defined by BaseItem.
+
+ +
+

hideDelay

+ hideDelay : Number +
+ Length of time in milliseconds to wait before hiding after a click (defaults to 100)
+
This config option is defined by BaseItem.
+
+ +
+

hideOnClick

+ hideOnClick : Boolean +
+ True to hide the containing menu after this item is clicked (defaults to true)
+
This config option is defined by BaseItem.
+
+ +
+

icon

+ icon : String +
+ The path to an icon to display in this menu item (defaults to Ext.BLANK_IMAGE_URL)
+
This config option is defined by Item.
+
+ +
+

itemCls

+ itemCls : String +
+ The default CSS class to use for check items (defaults to "x-menu-item x-menu-check-item")
+
This config option is defined by CheckItem.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.menu.ColorItem.html b/www/extras/yui-ext/docs/output/Ext.menu.ColorItem.html new file mode 100644 index 000000000..27f4c4b23 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.menu.ColorItem.html @@ -0,0 +1,1016 @@ + + + + Ext.menu.ColorItem + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.menu.ColorItem

+ + + + + +
Package:Ext.menu
Class:ColorItem
Extends:Adapter
Defined In:ColorItem.js
+
+ A menu item that wraps the Ext.ColorPalette component.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 palette : Ext.ColorPaletteColorItem
The Ext.ColorPalette object
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 ColorItem(Object config)ColorItem
Creates a new ColorItem
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isVisible() : voidComponent
Returns true if this component is visible
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 activate : (Ext.menu.BaseItem this)BaseItem
Fires when this item is activated
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 click : (Ext.menu.BaseItem this, Ext.EventObject e)BaseItem
Fires when this item is clicked
 deactivate : (Ext.menu.BaseItem this)BaseItem
Fires when this item is deactivated
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 hide : (Ext.Component this)Component
Fires after the component is hidden
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 activeClass : StringBaseItem
The CSS class to use when the item becomes activated (defaults to "x-menu-item-active")
 canActivate : BooleanBaseItem
True if this item can be visually activated (defaults to false)
 handler : FunctionBaseItem
A function that will handle the click event of this menu item (defaults to undefined)
 hideDelay : NumberBaseItem
Length of time in milliseconds to wait before hiding after a click (defaults to 100)
 hideOnClick : BooleanBaseItem
True to hide the containing menu after this item is clicked (defaults to true)
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

palette

+ public Ext.ColorPalette palette +
+ The Ext.ColorPalette object
+
This property is defined by ColorItem.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

ColorItem

+ public function ColorItem(Object config) +
+ Creates a new ColorItem
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

activate

+ public event activate +
+ Fires when this item is activated +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
+
+
+
This event is defined by BaseItem.
+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

click

+ public event click +
+ Fires when this item is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
  • e : Ext.EventObject
+
+
+
This event is defined by BaseItem.
+
+ +
+

deactivate

+ public event deactivate +
+ Fires when this item is deactivated +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
+
+
+
This event is defined by BaseItem.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+
+

Config Details

+
+ +
+

activeClass

+ activeClass : String +
+ The CSS class to use when the item becomes activated (defaults to "x-menu-item-active")
+
This config option is defined by BaseItem.
+
+ +
+

canActivate

+ canActivate : Boolean +
+ True if this item can be visually activated (defaults to false)
+
This config option is defined by BaseItem.
+
+ +
+

handler

+ handler : Function +
+ A function that will handle the click event of this menu item (defaults to undefined)
+
This config option is defined by BaseItem.
+
+ +
+

hideDelay

+ hideDelay : Number +
+ Length of time in milliseconds to wait before hiding after a click (defaults to 100)
+
This config option is defined by BaseItem.
+
+ +
+

hideOnClick

+ hideOnClick : Boolean +
+ True to hide the containing menu after this item is clicked (defaults to true)
+
This config option is defined by BaseItem.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.menu.ColorMenu.html b/www/extras/yui-ext/docs/output/Ext.menu.ColorMenu.html new file mode 100644 index 000000000..5666a80d1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.menu.ColorMenu.html @@ -0,0 +1,969 @@ + + + + Ext.menu.ColorMenu + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.menu.ColorMenu

+ + + + + +
Package:Ext.menu
Class:ColorMenu
Extends:Menu
Defined In:ColorMenu.js
+
+ A menu containing a Ext.menu.ColorItem component (which provides a basic color picker).
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 palette : ColorPaletteColorMenu
The Ext.ColorPalette instance for this ColorMenu
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 ColorMenu(Object config)ColorMenu
Creates a new ColorMenu
 add(Mixed args) : Ext.menu.ItemMenu
Addds one or more items of any type supported by the Menu class, or that can be converted into menu items. +Any of the...
 addElement(String/HTMLElement/Ext.Element el) : Ext.menu.ItemMenu
Adds an Ext.Element object to the menu
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addItem(Ext.menu.Item item) : Ext.menu.ItemMenu
Adds an existing object based on Ext.menu.Item to the menu
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 addMenuItem(Object config) : Ext.menu.ItemMenu
Creates a new Ext.menu.Item based an the supplied config object and adds it to the menu
 addSeparator() : Ext.menu.ItemMenu
Adds a separator bar to the menu
 addText(String text) : Ext.menu.ItemMenu
Creates a new Ext.menu.TextItem with the supplied text and adds it to the menu
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getEl() : Ext.ElementMenu
Returns this menu's underlying Ext.Element object
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide([Boolean deep]) : voidMenu
Hides this menu and optionally all parent menus
 insert(Number index, Ext.menu.Item item) : Ext.menu.ItemMenu
Inserts an existing object based on Ext.menu.Item to the menu at a specified index
 isVisible() : voidMenu
Read-only. Returns true if the menu is currently displayed, else false.
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 remove(Ext.menu.Item item) : voidMenu
Removes an Ext.menu.Item from the menu and destroys the object
 removeAll() : voidMenu
Removes and destroys all items in the menu
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 show(String/HTMLElement/Ext.Element element, [String position], [Ext.menu.Menu parentMenu]) : voidMenu
Displays this menu relative to another element
 showAt(Array xyPosition, [Ext.menu.Menu parentMenu]) : voidMenu
Displays this menu at a specific xy position
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforehide : (Ext.menu.Menu this)Menu
Fires before this menu is hidden
 beforeshow : (Ext.menu.Menu this)Menu
Fires before this menu is displayed
 click : (Ext.menu.Menu this, String menuItemId, Ext.EventObject e)Menu
Fires when this menu is clicked (or when the enter key is pressed while it is active)
 hide : (Ext.menu.Menu this)Menu
Fires after this menu is hidden
 itemclick : (Ext.menu.BaseItem baseItem, Ext.EventObject e)Menu
Fires when a menu item contained in this menu is clicked
 mouseout : (Ext.menu.Menu this, Ext.EventObject e, String menuItemId)Menu
Fires when the mouse exits this menu
 mouseover : (Ext.menu.Menu this, Ext.EventObject e, String menuItemId)Menu
Fires when the mouse is hovering over this menu
 select : (ColorPalette palette, String color)ColorMenu
 show : (Ext.menu.Menu this)Menu
Fires after this menu is displayed
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 allowOtherMenus : BooleanMenu
True to allow multiple menus to be displayed at the same time (defaults to false)
 defaultAlign : StringMenu
The default {@link Ext.Element#alignTo) anchor position value for this menu relative to its element of origin (defaul...
 minWidth : NumberMenu
The minimum width of the menu in pixels (defaults to 120)
 shadow : Boolean/StringMenu
True or "sides" for the default effect, "frame" for 4-way shadow, and "drop" for bottom-right shadow (defaults to "si...
 subMenuAlign : StringMenu
The {@link Ext.Element#alignTo) anchor position value to use for submenus of this menu (defaults to "tl-tr?")
+

Property Details

+
+ +
+

palette

+ public ColorPalette palette +
+ The Ext.ColorPalette instance for this ColorMenu
+
This property is defined by ColorMenu.
+
+
+ + +

Constructor Details

+
+
+

ColorMenu

+ public function ColorMenu(Object config) +
+ Creates a new ColorMenu
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

add

+ public function add(Mixed args) +
+ Addds one or more items of any type supported by the Menu class, or that can be converted into menu items. +Any of the following are valid: +
    +
  • Any menu item object based on Ext.menu.Item
  • +
  • An HTMLElement object which will be converted to a menu item
  • +
  • A menu item config object that will be created as a new menu item
  • +
  • A string, which can either be '-' or 'separator' to add a menu separator, otherwise +it will be converted into a Ext.menu.TextItem and added
  • +
+Usage: +

+// Create the menu
+var menu = new Ext.menu.Menu();
+
+// Create a menu item to add by reference
+var menuItem = new Ext.menu.Item({ text: 'New Item!' });
+
+// Add a bunch of items at once using different methods.
+// Only the last item added will be returned.
+var item = menu.add(
+    menuItem,                // add existing item by ref
+    'Dynamic Item',          // new TextItem
+    '-',                     // new separator
+    { text: 'Config Item' }  // new item by config
+);
+
+
+ Parameters: +
  • args : Mixed
    One or more menu items, menu item configs or other objects that can be converted to menu items
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added, or the last one if multiple items were added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

addElement

+ public function addElement(String/HTMLElement/Ext.Element el) +
+ Adds an Ext.Element object to the menu +
+ Parameters: +
  • el : String/HTMLElement/Ext.Element
    The element or DOM node to add, or its id
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addItem

+ public function addItem(Ext.menu.Item item) +
+ Adds an existing object based on Ext.menu.Item to the menu +
+ Parameters: +
  • item : Ext.menu.Item
    The menu item to add
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addMenuItem

+ public function addMenuItem(Object config) +
+ Creates a new Ext.menu.Item based an the supplied config object and adds it to the menu +
+ Parameters: +
  • config : Object
    A MenuItem config object
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

addSeparator

+ public function addSeparator() +
+ Adds a separator bar to the menu +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

addText

+ public function addText(String text) +
+ Creates a new Ext.menu.TextItem with the supplied text and adds it to the menu +
+ Parameters: +
  • text : String
    The text to display in the menu item
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

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 menu's underlying Ext.Element object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

+ public function hide([Boolean deep]) +
+ Hides this menu and optionally all parent menus +
+ Parameters: +
  • deep : Boolean
    (optional) True to hide all parent menus recursively, if any (defaults to false)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

insert

+ public function insert(Number index, Ext.menu.Item item) +
+ Inserts an existing object based on Ext.menu.Item to the menu at a specified index +
+ Parameters: +
  • index : Number
    The index in the menu's list of current items where the new item should be inserted
  • item : Ext.menu.Item
    The menu item to add
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

isVisible

+ public function isVisible() +
+ Read-only. Returns true if the menu is currently displayed, else false. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

remove

+ public function remove(Ext.menu.Item item) +
+ Removes an Ext.menu.Item from the menu and destroys the object +
+ Parameters: +
  • item : Ext.menu.Item
    The menu item to remove
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

removeAll

+ public function removeAll() +
+ Removes and destroys all items in the menu +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

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.
+
+ +
+

show

+ public function show(String/HTMLElement/Ext.Element element, [String position], [Ext.menu.Menu parentMenu]) +
+ Displays this menu relative to another element +
+ Parameters: +
  • element : String/HTMLElement/Ext.Element
    The element to align to
  • position : String
    (optional) The Ext.Element.alignTo anchor position to use in aligning to the element (defaults to this.defaultAlign)
  • parentMenu : Ext.menu.Menu
    (optional) This menu's parent menu, if applicable (defaults to undefined)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

showAt

+ public function showAt(Array xyPosition, [Ext.menu.Menu parentMenu]) +
+ Displays this menu at a specific xy position +
+ Parameters: +
  • xyPosition : Array
    Contains X & Y [x, y] values for the position at which to show the menu (coordinates are page-based)
  • parentMenu : Ext.menu.Menu
    (optional) This menu's parent menu, if applicable (defaults to undefined)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

beforehide

+ public event beforehide +
+ Fires before this menu is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
+
+
+
This event is defined by Menu.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before this menu is displayed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
+
+
+
This event is defined by Menu.
+
+ +
+

click

+ public event click +
+ Fires when this menu is clicked (or when the enter key is pressed while it is active) +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
  • menuItemId : String
    The id of the menu item that was clicked
  • e : Ext.EventObject
+
+
+
This event is defined by Menu.
+
+ +
+

hide

+ public event hide +
+ Fires after this menu is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
+
+
+
This event is defined by Menu.
+
+ +
+

itemclick

+ public event itemclick +
+ Fires when a menu item contained in this menu is clicked +
+ Subscribers will be called with the following parameters: +
  • baseItem : Ext.menu.BaseItem
    The BaseItem that was clicked
  • e : Ext.EventObject
+
+
+
This event is defined by Menu.
+
+ +
+

mouseout

+ public event mouseout +
+ Fires when the mouse exits this menu +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
  • e : Ext.EventObject
  • menuItemId : String
    The id of the menu item that the mouse has exited
+
+
+
This event is defined by Menu.
+
+ +
+

mouseover

+ public event mouseover +
+ Fires when the mouse is hovering over this menu +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
  • e : Ext.EventObject
  • menuItemId : String
    The id of the menu item that the mouse is over
+
+
+
This event is defined by Menu.
+
+ +
+

select

+ public event select +
+ +
+ Subscribers will be called with the following parameters: +
  • palette : ColorPalette
  • color : String
+
+
+
This event is defined by ColorMenu.
+
+ +
+

show

+ public event show +
+ Fires after this menu is displayed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
+
+
+
This event is defined by Menu.
+
+
+

Config Details

+
+ +
+

allowOtherMenus

+ allowOtherMenus : Boolean +
+ True to allow multiple menus to be displayed at the same time (defaults to false)
+
This config option is defined by Menu.
+
+ +
+

defaultAlign

+ defaultAlign : String +
+ The default {@link Ext.Element#alignTo) anchor position value for this menu relative to its element of origin (defaults to "tl-bl?")
+
This config option is defined by Menu.
+
+ +
+

minWidth

+ minWidth : Number +
+ The minimum width of the menu in pixels (defaults to 120)
+
This config option is defined by Menu.
+
+ +
+

shadow

+ shadow : Boolean/String +
+ True or "sides" for the default effect, "frame" for 4-way shadow, and "drop" for bottom-right shadow (defaults to "sides")
+
This config option is defined by Menu.
+
+ +
+

subMenuAlign

+ subMenuAlign : String +
+ The {@link Ext.Element#alignTo) anchor position value to use for submenus of this menu (defaults to "tl-tr?")
+
This config option is defined by Menu.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.menu.DateItem.html b/www/extras/yui-ext/docs/output/Ext.menu.DateItem.html new file mode 100644 index 000000000..59a717822 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.menu.DateItem.html @@ -0,0 +1,1016 @@ + + + + Ext.menu.DateItem + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.menu.DateItem

+ + + + + +
Package:Ext.menu
Class:DateItem
Extends:Adapter
Defined In:DateItem.js
+
+ A menu item that wraps the Ext.DatPicker component.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 picker : Ext.DatePickerDateItem
The Ext.DatePicker object
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 DateItem(Object config)DateItem
Creates a new DateItem
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isVisible() : voidComponent
Returns true if this component is visible
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 activate : (Ext.menu.BaseItem this)BaseItem
Fires when this item is activated
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 click : (Ext.menu.BaseItem this, Ext.EventObject e)BaseItem
Fires when this item is clicked
 deactivate : (Ext.menu.BaseItem this)BaseItem
Fires when this item is deactivated
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 hide : (Ext.Component this)Component
Fires after the component is hidden
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 activeClass : StringBaseItem
The CSS class to use when the item becomes activated (defaults to "x-menu-item-active")
 canActivate : BooleanBaseItem
True if this item can be visually activated (defaults to false)
 handler : FunctionBaseItem
A function that will handle the click event of this menu item (defaults to undefined)
 hideDelay : NumberBaseItem
Length of time in milliseconds to wait before hiding after a click (defaults to 100)
 hideOnClick : BooleanBaseItem
True to hide the containing menu after this item is clicked (defaults to true)
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

picker

+ public Ext.DatePicker picker +
+ The Ext.DatePicker object
+
This property is defined by DateItem.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

DateItem

+ public function DateItem(Object config) +
+ Creates a new DateItem
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

activate

+ public event activate +
+ Fires when this item is activated +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
+
+
+
This event is defined by BaseItem.
+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

click

+ public event click +
+ Fires when this item is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
  • e : Ext.EventObject
+
+
+
This event is defined by BaseItem.
+
+ +
+

deactivate

+ public event deactivate +
+ Fires when this item is deactivated +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
+
+
+
This event is defined by BaseItem.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+
+

Config Details

+
+ +
+

activeClass

+ activeClass : String +
+ The CSS class to use when the item becomes activated (defaults to "x-menu-item-active")
+
This config option is defined by BaseItem.
+
+ +
+

canActivate

+ canActivate : Boolean +
+ True if this item can be visually activated (defaults to false)
+
This config option is defined by BaseItem.
+
+ +
+

handler

+ handler : Function +
+ A function that will handle the click event of this menu item (defaults to undefined)
+
This config option is defined by BaseItem.
+
+ +
+

hideDelay

+ hideDelay : Number +
+ Length of time in milliseconds to wait before hiding after a click (defaults to 100)
+
This config option is defined by BaseItem.
+
+ +
+

hideOnClick

+ hideOnClick : Boolean +
+ True to hide the containing menu after this item is clicked (defaults to true)
+
This config option is defined by BaseItem.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.menu.DateMenu.html b/www/extras/yui-ext/docs/output/Ext.menu.DateMenu.html new file mode 100644 index 000000000..572668c7d --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.menu.DateMenu.html @@ -0,0 +1,969 @@ + + + + Ext.menu.DateMenu + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.menu.DateMenu

+ + + + + +
Package:Ext.menu
Class:DateMenu
Extends:Menu
Defined In:DateMenu.js
+
+ A menu containing a Ext.menu.DateItem component (which provides a date picker).
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 picker : DatePickerDateMenu
The Ext.DatePicker instance for this DateMenu
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 DateMenu(Object config)DateMenu
Creates a new DateMenu
 add(Mixed args) : Ext.menu.ItemMenu
Addds one or more items of any type supported by the Menu class, or that can be converted into menu items. +Any of the...
 addElement(String/HTMLElement/Ext.Element el) : Ext.menu.ItemMenu
Adds an Ext.Element object to the menu
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addItem(Ext.menu.Item item) : Ext.menu.ItemMenu
Adds an existing object based on Ext.menu.Item to the menu
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 addMenuItem(Object config) : Ext.menu.ItemMenu
Creates a new Ext.menu.Item based an the supplied config object and adds it to the menu
 addSeparator() : Ext.menu.ItemMenu
Adds a separator bar to the menu
 addText(String text) : Ext.menu.ItemMenu
Creates a new Ext.menu.TextItem with the supplied text and adds it to the menu
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getEl() : Ext.ElementMenu
Returns this menu's underlying Ext.Element object
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide([Boolean deep]) : voidMenu
Hides this menu and optionally all parent menus
 insert(Number index, Ext.menu.Item item) : Ext.menu.ItemMenu
Inserts an existing object based on Ext.menu.Item to the menu at a specified index
 isVisible() : voidMenu
Read-only. Returns true if the menu is currently displayed, else false.
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 remove(Ext.menu.Item item) : voidMenu
Removes an Ext.menu.Item from the menu and destroys the object
 removeAll() : voidMenu
Removes and destroys all items in the menu
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 show(String/HTMLElement/Ext.Element element, [String position], [Ext.menu.Menu parentMenu]) : voidMenu
Displays this menu relative to another element
 showAt(Array xyPosition, [Ext.menu.Menu parentMenu]) : voidMenu
Displays this menu at a specific xy position
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforehide : (Ext.menu.Menu this)Menu
Fires before this menu is hidden
 beforeshow : (Ext.menu.Menu this)Menu
Fires before this menu is displayed
 click : (Ext.menu.Menu this, String menuItemId, Ext.EventObject e)Menu
Fires when this menu is clicked (or when the enter key is pressed while it is active)
 hide : (Ext.menu.Menu this)Menu
Fires after this menu is hidden
 itemclick : (Ext.menu.BaseItem baseItem, Ext.EventObject e)Menu
Fires when a menu item contained in this menu is clicked
 mouseout : (Ext.menu.Menu this, Ext.EventObject e, String menuItemId)Menu
Fires when the mouse exits this menu
 mouseover : (Ext.menu.Menu this, Ext.EventObject e, String menuItemId)Menu
Fires when the mouse is hovering over this menu
 select : (DatePicker picker, Date date)DateMenu
 show : (Ext.menu.Menu this)Menu
Fires after this menu is displayed
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 allowOtherMenus : BooleanMenu
True to allow multiple menus to be displayed at the same time (defaults to false)
 defaultAlign : StringMenu
The default {@link Ext.Element#alignTo) anchor position value for this menu relative to its element of origin (defaul...
 minWidth : NumberMenu
The minimum width of the menu in pixels (defaults to 120)
 shadow : Boolean/StringMenu
True or "sides" for the default effect, "frame" for 4-way shadow, and "drop" for bottom-right shadow (defaults to "si...
 subMenuAlign : StringMenu
The {@link Ext.Element#alignTo) anchor position value to use for submenus of this menu (defaults to "tl-tr?")
+

Property Details

+
+ +
+

picker

+ public DatePicker picker +
+ The Ext.DatePicker instance for this DateMenu
+
This property is defined by DateMenu.
+
+
+ + +

Constructor Details

+
+
+

DateMenu

+ public function DateMenu(Object config) +
+ Creates a new DateMenu
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

add

+ public function add(Mixed args) +
+ Addds one or more items of any type supported by the Menu class, or that can be converted into menu items. +Any of the following are valid: +
    +
  • Any menu item object based on Ext.menu.Item
  • +
  • An HTMLElement object which will be converted to a menu item
  • +
  • A menu item config object that will be created as a new menu item
  • +
  • A string, which can either be '-' or 'separator' to add a menu separator, otherwise +it will be converted into a Ext.menu.TextItem and added
  • +
+Usage: +

+// Create the menu
+var menu = new Ext.menu.Menu();
+
+// Create a menu item to add by reference
+var menuItem = new Ext.menu.Item({ text: 'New Item!' });
+
+// Add a bunch of items at once using different methods.
+// Only the last item added will be returned.
+var item = menu.add(
+    menuItem,                // add existing item by ref
+    'Dynamic Item',          // new TextItem
+    '-',                     // new separator
+    { text: 'Config Item' }  // new item by config
+);
+
+
+ Parameters: +
  • args : Mixed
    One or more menu items, menu item configs or other objects that can be converted to menu items
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added, or the last one if multiple items were added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

addElement

+ public function addElement(String/HTMLElement/Ext.Element el) +
+ Adds an Ext.Element object to the menu +
+ Parameters: +
  • el : String/HTMLElement/Ext.Element
    The element or DOM node to add, or its id
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addItem

+ public function addItem(Ext.menu.Item item) +
+ Adds an existing object based on Ext.menu.Item to the menu +
+ Parameters: +
  • item : Ext.menu.Item
    The menu item to add
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addMenuItem

+ public function addMenuItem(Object config) +
+ Creates a new Ext.menu.Item based an the supplied config object and adds it to the menu +
+ Parameters: +
  • config : Object
    A MenuItem config object
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

addSeparator

+ public function addSeparator() +
+ Adds a separator bar to the menu +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

addText

+ public function addText(String text) +
+ Creates a new Ext.menu.TextItem with the supplied text and adds it to the menu +
+ Parameters: +
  • text : String
    The text to display in the menu item
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

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 menu's underlying Ext.Element object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

+ public function hide([Boolean deep]) +
+ Hides this menu and optionally all parent menus +
+ Parameters: +
  • deep : Boolean
    (optional) True to hide all parent menus recursively, if any (defaults to false)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

insert

+ public function insert(Number index, Ext.menu.Item item) +
+ Inserts an existing object based on Ext.menu.Item to the menu at a specified index +
+ Parameters: +
  • index : Number
    The index in the menu's list of current items where the new item should be inserted
  • item : Ext.menu.Item
    The menu item to add
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

isVisible

+ public function isVisible() +
+ Read-only. Returns true if the menu is currently displayed, else false. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

remove

+ public function remove(Ext.menu.Item item) +
+ Removes an Ext.menu.Item from the menu and destroys the object +
+ Parameters: +
  • item : Ext.menu.Item
    The menu item to remove
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

removeAll

+ public function removeAll() +
+ Removes and destroys all items in the menu +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

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.
+
+ +
+

show

+ public function show(String/HTMLElement/Ext.Element element, [String position], [Ext.menu.Menu parentMenu]) +
+ Displays this menu relative to another element +
+ Parameters: +
  • element : String/HTMLElement/Ext.Element
    The element to align to
  • position : String
    (optional) The Ext.Element.alignTo anchor position to use in aligning to the element (defaults to this.defaultAlign)
  • parentMenu : Ext.menu.Menu
    (optional) This menu's parent menu, if applicable (defaults to undefined)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

showAt

+ public function showAt(Array xyPosition, [Ext.menu.Menu parentMenu]) +
+ Displays this menu at a specific xy position +
+ Parameters: +
  • xyPosition : Array
    Contains X & Y [x, y] values for the position at which to show the menu (coordinates are page-based)
  • parentMenu : Ext.menu.Menu
    (optional) This menu's parent menu, if applicable (defaults to undefined)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

beforehide

+ public event beforehide +
+ Fires before this menu is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
+
+
+
This event is defined by Menu.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before this menu is displayed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
+
+
+
This event is defined by Menu.
+
+ +
+

click

+ public event click +
+ Fires when this menu is clicked (or when the enter key is pressed while it is active) +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
  • menuItemId : String
    The id of the menu item that was clicked
  • e : Ext.EventObject
+
+
+
This event is defined by Menu.
+
+ +
+

hide

+ public event hide +
+ Fires after this menu is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
+
+
+
This event is defined by Menu.
+
+ +
+

itemclick

+ public event itemclick +
+ Fires when a menu item contained in this menu is clicked +
+ Subscribers will be called with the following parameters: +
  • baseItem : Ext.menu.BaseItem
    The BaseItem that was clicked
  • e : Ext.EventObject
+
+
+
This event is defined by Menu.
+
+ +
+

mouseout

+ public event mouseout +
+ Fires when the mouse exits this menu +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
  • e : Ext.EventObject
  • menuItemId : String
    The id of the menu item that the mouse has exited
+
+
+
This event is defined by Menu.
+
+ +
+

mouseover

+ public event mouseover +
+ Fires when the mouse is hovering over this menu +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
  • e : Ext.EventObject
  • menuItemId : String
    The id of the menu item that the mouse is over
+
+
+
This event is defined by Menu.
+
+ +
+

select

+ public event select +
+ +
+ Subscribers will be called with the following parameters: +
  • picker : DatePicker
  • date : Date
+
+
+
This event is defined by DateMenu.
+
+ +
+

show

+ public event show +
+ Fires after this menu is displayed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
+
+
+
This event is defined by Menu.
+
+
+

Config Details

+
+ +
+

allowOtherMenus

+ allowOtherMenus : Boolean +
+ True to allow multiple menus to be displayed at the same time (defaults to false)
+
This config option is defined by Menu.
+
+ +
+

defaultAlign

+ defaultAlign : String +
+ The default {@link Ext.Element#alignTo) anchor position value for this menu relative to its element of origin (defaults to "tl-bl?")
+
This config option is defined by Menu.
+
+ +
+

minWidth

+ minWidth : Number +
+ The minimum width of the menu in pixels (defaults to 120)
+
This config option is defined by Menu.
+
+ +
+

shadow

+ shadow : Boolean/String +
+ True or "sides" for the default effect, "frame" for 4-way shadow, and "drop" for bottom-right shadow (defaults to "sides")
+
This config option is defined by Menu.
+
+ +
+

subMenuAlign

+ subMenuAlign : String +
+ The {@link Ext.Element#alignTo) anchor position value to use for submenus of this menu (defaults to "tl-tr?")
+
This config option is defined by Menu.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.menu.Item.html b/www/extras/yui-ext/docs/output/Ext.menu.Item.html new file mode 100644 index 000000000..574fa256b --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.menu.Item.html @@ -0,0 +1,1060 @@ + + + + Ext.menu.Item + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.menu.Item

+ + + + + + +
Package:Ext.menu
Class:Item
Extends:BaseItem
Subclasses:CheckItem
Defined In:Item.js
+
+ A base class for all menu items that require menu-related functionality (like sub-menus) and are not static +display items. Item extends the base functionality of Ext.menu.BaseItem by adding menu-specific +activation and click handling.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Item(Object config)Item
Creates a new Item
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isVisible() : voidComponent
Returns true if this component is visible
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setText(String text) : voidItem
Sets the text to display in this menu item
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 activate : (Ext.menu.BaseItem this)BaseItem
Fires when this item is activated
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 click : (Ext.menu.BaseItem this, Ext.EventObject e)BaseItem
Fires when this item is clicked
 deactivate : (Ext.menu.BaseItem this)BaseItem
Fires when this item is deactivated
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 hide : (Ext.Component this)Component
Fires after the component is hidden
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 activeClass : StringBaseItem
The CSS class to use when the item becomes activated (defaults to "x-menu-item-active")
 canActivate : BooleanItem
True if this item can be visually activated (defaults to true)
 handler : FunctionBaseItem
A function that will handle the click event of this menu item (defaults to undefined)
 hideDelay : NumberBaseItem
Length of time in milliseconds to wait before hiding after a click (defaults to 100)
 hideOnClick : BooleanBaseItem
True to hide the containing menu after this item is clicked (defaults to true)
 icon : StringItem
The path to an icon to display in this menu item (defaults to Ext.BLANK_IMAGE_URL)
 itemCls : StringItem
The default CSS class to use for menu items (defaults to "x-menu-item")
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

Item

+ public function Item(Object config) +
+ Creates a new Item
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setText

+ public function setText(String text) +
+ Sets the text to display in this menu item +
+ Parameters: +
  • text : String
    The text to display
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Item.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

activate

+ public event activate +
+ Fires when this item is activated +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
+
+
+
This event is defined by BaseItem.
+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

click

+ public event click +
+ Fires when this item is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
  • e : Ext.EventObject
+
+
+
This event is defined by BaseItem.
+
+ +
+

deactivate

+ public event deactivate +
+ Fires when this item is deactivated +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
+
+
+
This event is defined by BaseItem.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+
+

Config Details

+
+ +
+

activeClass

+ activeClass : String +
+ The CSS class to use when the item becomes activated (defaults to "x-menu-item-active")
+
This config option is defined by BaseItem.
+
+ +
+

canActivate

+ canActivate : Boolean +
+ True if this item can be visually activated (defaults to true)
+
This config option is defined by Item.
+
+ +
+

handler

+ handler : Function +
+ A function that will handle the click event of this menu item (defaults to undefined)
+
This config option is defined by BaseItem.
+
+ +
+

hideDelay

+ hideDelay : Number +
+ Length of time in milliseconds to wait before hiding after a click (defaults to 100)
+
This config option is defined by BaseItem.
+
+ +
+

hideOnClick

+ hideOnClick : Boolean +
+ True to hide the containing menu after this item is clicked (defaults to true)
+
This config option is defined by BaseItem.
+
+ +
+

icon

+ icon : String +
+ The path to an icon to display in this menu item (defaults to Ext.BLANK_IMAGE_URL)
+
This config option is defined by Item.
+
+ +
+

itemCls

+ itemCls : String +
+ The default CSS class to use for menu items (defaults to "x-menu-item")
+
This config option is defined by Item.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.menu.Menu.html b/www/extras/yui-ext/docs/output/Ext.menu.Menu.html new file mode 100644 index 000000000..193d098ff --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.menu.Menu.html @@ -0,0 +1,925 @@ + + + + Ext.menu.Menu + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.menu.Menu

+ + + + + + +
Package:Ext.menu
Class:Menu
Extends:Observable
Subclasses:ColorMenu, DateMenu
Defined In:Menu.js
+
+ A menu object. This is the container to which you add all other menu items. Menu can also serve a as a base class +when you want a specialzed menu based off of another component (like Ext.menu.DateMenu for example).
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Menu(Object config)Menu
Creates a new Menu
 add(Mixed args) : Ext.menu.ItemMenu
Addds one or more items of any type supported by the Menu class, or that can be converted into menu items. +Any of the...
 addElement(String/HTMLElement/Ext.Element el) : Ext.menu.ItemMenu
Adds an Ext.Element object to the menu
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addItem(Ext.menu.Item item) : Ext.menu.ItemMenu
Adds an existing object based on Ext.menu.Item to the menu
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 addMenuItem(Object config) : Ext.menu.ItemMenu
Creates a new Ext.menu.Item based an the supplied config object and adds it to the menu
 addSeparator() : Ext.menu.ItemMenu
Adds a separator bar to the menu
 addText(String text) : Ext.menu.ItemMenu
Creates a new Ext.menu.TextItem with the supplied text and adds it to the menu
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getEl() : Ext.ElementMenu
Returns this menu's underlying Ext.Element object
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide([Boolean deep]) : voidMenu
Hides this menu and optionally all parent menus
 insert(Number index, Ext.menu.Item item) : Ext.menu.ItemMenu
Inserts an existing object based on Ext.menu.Item to the menu at a specified index
 isVisible() : voidMenu
Read-only. Returns true if the menu is currently displayed, else false.
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 remove(Ext.menu.Item item) : voidMenu
Removes an Ext.menu.Item from the menu and destroys the object
 removeAll() : voidMenu
Removes and destroys all items in the menu
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 show(String/HTMLElement/Ext.Element element, [String position], [Ext.menu.Menu parentMenu]) : voidMenu
Displays this menu relative to another element
 showAt(Array xyPosition, [Ext.menu.Menu parentMenu]) : voidMenu
Displays this menu at a specific xy position
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforehide : (Ext.menu.Menu this)Menu
Fires before this menu is hidden
 beforeshow : (Ext.menu.Menu this)Menu
Fires before this menu is displayed
 click : (Ext.menu.Menu this, String menuItemId, Ext.EventObject e)Menu
Fires when this menu is clicked (or when the enter key is pressed while it is active)
 hide : (Ext.menu.Menu this)Menu
Fires after this menu is hidden
 itemclick : (Ext.menu.BaseItem baseItem, Ext.EventObject e)Menu
Fires when a menu item contained in this menu is clicked
 mouseout : (Ext.menu.Menu this, Ext.EventObject e, String menuItemId)Menu
Fires when the mouse exits this menu
 mouseover : (Ext.menu.Menu this, Ext.EventObject e, String menuItemId)Menu
Fires when the mouse is hovering over this menu
 show : (Ext.menu.Menu this)Menu
Fires after this menu is displayed
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 allowOtherMenus : BooleanMenu
True to allow multiple menus to be displayed at the same time (defaults to false)
 defaultAlign : StringMenu
The default {@link Ext.Element#alignTo) anchor position value for this menu relative to its element of origin (defaul...
 minWidth : NumberMenu
The minimum width of the menu in pixels (defaults to 120)
 shadow : Boolean/StringMenu
True or "sides" for the default effect, "frame" for 4-way shadow, and "drop" for bottom-right shadow (defaults to "si...
 subMenuAlign : StringMenu
The {@link Ext.Element#alignTo) anchor position value to use for submenus of this menu (defaults to "tl-tr?")
+ + +

Constructor Details

+
+
+

Menu

+ public function Menu(Object config) +
+ Creates a new Menu
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

add

+ public function add(Mixed args) +
+ Addds one or more items of any type supported by the Menu class, or that can be converted into menu items. +Any of the following are valid: +
    +
  • Any menu item object based on Ext.menu.Item
  • +
  • An HTMLElement object which will be converted to a menu item
  • +
  • A menu item config object that will be created as a new menu item
  • +
  • A string, which can either be '-' or 'separator' to add a menu separator, otherwise +it will be converted into a Ext.menu.TextItem and added
  • +
+Usage: +

+// Create the menu
+var menu = new Ext.menu.Menu();
+
+// Create a menu item to add by reference
+var menuItem = new Ext.menu.Item({ text: 'New Item!' });
+
+// Add a bunch of items at once using different methods.
+// Only the last item added will be returned.
+var item = menu.add(
+    menuItem,                // add existing item by ref
+    'Dynamic Item',          // new TextItem
+    '-',                     // new separator
+    { text: 'Config Item' }  // new item by config
+);
+
+
+ Parameters: +
  • args : Mixed
    One or more menu items, menu item configs or other objects that can be converted to menu items
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added, or the last one if multiple items were added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

addElement

+ public function addElement(String/HTMLElement/Ext.Element el) +
+ Adds an Ext.Element object to the menu +
+ Parameters: +
  • el : String/HTMLElement/Ext.Element
    The element or DOM node to add, or its id
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addItem

+ public function addItem(Ext.menu.Item item) +
+ Adds an existing object based on Ext.menu.Item to the menu +
+ Parameters: +
  • item : Ext.menu.Item
    The menu item to add
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addMenuItem

+ public function addMenuItem(Object config) +
+ Creates a new Ext.menu.Item based an the supplied config object and adds it to the menu +
+ Parameters: +
  • config : Object
    A MenuItem config object
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

addSeparator

+ public function addSeparator() +
+ Adds a separator bar to the menu +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

addText

+ public function addText(String text) +
+ Creates a new Ext.menu.TextItem with the supplied text and adds it to the menu +
+ Parameters: +
  • text : String
    The text to display in the menu item
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

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 menu's underlying Ext.Element object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

+ public function hide([Boolean deep]) +
+ Hides this menu and optionally all parent menus +
+ Parameters: +
  • deep : Boolean
    (optional) True to hide all parent menus recursively, if any (defaults to false)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

insert

+ public function insert(Number index, Ext.menu.Item item) +
+ Inserts an existing object based on Ext.menu.Item to the menu at a specified index +
+ Parameters: +
  • index : Number
    The index in the menu's list of current items where the new item should be inserted
  • item : Ext.menu.Item
    The menu item to add
+ Returns: +
    +
  • Ext.menu.Item
    The menu item that was added
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

isVisible

+ public function isVisible() +
+ Read-only. Returns true if the menu is currently displayed, else false. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

remove

+ public function remove(Ext.menu.Item item) +
+ Removes an Ext.menu.Item from the menu and destroys the object +
+ Parameters: +
  • item : Ext.menu.Item
    The menu item to remove
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

removeAll

+ public function removeAll() +
+ Removes and destroys all items in the menu +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

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.
+
+ +
+

show

+ public function show(String/HTMLElement/Ext.Element element, [String position], [Ext.menu.Menu parentMenu]) +
+ Displays this menu relative to another element +
+ Parameters: +
  • element : String/HTMLElement/Ext.Element
    The element to align to
  • position : String
    (optional) The Ext.Element.alignTo anchor position to use in aligning to the element (defaults to this.defaultAlign)
  • parentMenu : Ext.menu.Menu
    (optional) This menu's parent menu, if applicable (defaults to undefined)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

showAt

+ public function showAt(Array xyPosition, [Ext.menu.Menu parentMenu]) +
+ Displays this menu at a specific xy position +
+ Parameters: +
  • xyPosition : Array
    Contains X & Y [x, y] values for the position at which to show the menu (coordinates are page-based)
  • parentMenu : Ext.menu.Menu
    (optional) This menu's parent menu, if applicable (defaults to undefined)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

beforehide

+ public event beforehide +
+ Fires before this menu is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
+
+
+
This event is defined by Menu.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before this menu is displayed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
+
+
+
This event is defined by Menu.
+
+ +
+

click

+ public event click +
+ Fires when this menu is clicked (or when the enter key is pressed while it is active) +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
  • menuItemId : String
    The id of the menu item that was clicked
  • e : Ext.EventObject
+
+
+
This event is defined by Menu.
+
+ +
+

hide

+ public event hide +
+ Fires after this menu is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
+
+
+
This event is defined by Menu.
+
+ +
+

itemclick

+ public event itemclick +
+ Fires when a menu item contained in this menu is clicked +
+ Subscribers will be called with the following parameters: +
  • baseItem : Ext.menu.BaseItem
    The BaseItem that was clicked
  • e : Ext.EventObject
+
+
+
This event is defined by Menu.
+
+ +
+

mouseout

+ public event mouseout +
+ Fires when the mouse exits this menu +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
  • e : Ext.EventObject
  • menuItemId : String
    The id of the menu item that the mouse has exited
+
+
+
This event is defined by Menu.
+
+ +
+

mouseover

+ public event mouseover +
+ Fires when the mouse is hovering over this menu +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
  • e : Ext.EventObject
  • menuItemId : String
    The id of the menu item that the mouse is over
+
+
+
This event is defined by Menu.
+
+ +
+

show

+ public event show +
+ Fires after this menu is displayed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.Menu
+
+
+
This event is defined by Menu.
+
+
+

Config Details

+
+ +
+

allowOtherMenus

+ allowOtherMenus : Boolean +
+ True to allow multiple menus to be displayed at the same time (defaults to false)
+
This config option is defined by Menu.
+
+ +
+

defaultAlign

+ defaultAlign : String +
+ The default {@link Ext.Element#alignTo) anchor position value for this menu relative to its element of origin (defaults to "tl-bl?")
+
This config option is defined by Menu.
+
+ +
+

minWidth

+ minWidth : Number +
+ The minimum width of the menu in pixels (defaults to 120)
+
This config option is defined by Menu.
+
+ +
+

shadow

+ shadow : Boolean/String +
+ True or "sides" for the default effect, "frame" for 4-way shadow, and "drop" for bottom-right shadow (defaults to "sides")
+
This config option is defined by Menu.
+
+ +
+

subMenuAlign

+ subMenuAlign : String +
+ The {@link Ext.Element#alignTo) anchor position value to use for submenus of this menu (defaults to "tl-tr?")
+
This config option is defined by Menu.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.menu.MenuMgr.html b/www/extras/yui-ext/docs/output/Ext.menu.MenuMgr.html new file mode 100644 index 000000000..620f353fd --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.menu.MenuMgr.html @@ -0,0 +1,104 @@ + + + + Ext.menu.MenuMgr + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.menu.MenuMgr

+ + + + + +
Package:Ext.menu
Class:MenuMgr
Extends:Object
Defined In:MenuMgr.js
+
+ Provides a common registry of all menu items on a page so that they can be easily accessed by id.

This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 get(String/Object menu) : voidMenuMgr
Returns a Ext.menu.Menu object
 hideAll() : voidMenuMgr
Hides all menus that are currently visible
+ +

Public Events

+
This class has no public events.
+ +

Method Details

+
+ +
+

get

+ public function get(String/Object menu) +
+ Returns a Ext.menu.Menu object +
+ Parameters: +
  • menu : String/Object
    The string menu id, an existing menu object reference, or a Menu config that will be used to generate and return a new Menu instance.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by MenuMgr.
+
+ +
+

hideAll

+ public function hideAll() +
+ Hides all menus that are currently visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by MenuMgr.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.menu.Separator.html b/www/extras/yui-ext/docs/output/Ext.menu.Separator.html new file mode 100644 index 000000000..dc25c45d1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.menu.Separator.html @@ -0,0 +1,1017 @@ + + + + Ext.menu.Separator + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.menu.Separator

+ + + + + +
Package:Ext.menu
Class:Separator
Extends:BaseItem
Defined In:Separator.js
+
+ Adds a separator bar to a menu, used to divide logical groups of menu items. Generally you will +add one of these by using "-" in you call to add() or in your items config rather than creating one directly.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Separator(Object config)Separator
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isVisible() : voidComponent
Returns true if this component is visible
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 activate : (Ext.menu.BaseItem this)BaseItem
Fires when this item is activated
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 click : (Ext.menu.BaseItem this, Ext.EventObject e)BaseItem
Fires when this item is clicked
 deactivate : (Ext.menu.BaseItem this)BaseItem
Fires when this item is deactivated
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 hide : (Ext.Component this)Component
Fires after the component is hidden
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 activeClass : StringBaseItem
The CSS class to use when the item becomes activated (defaults to "x-menu-item-active")
 canActivate : BooleanBaseItem
True if this item can be visually activated (defaults to false)
 handler : FunctionBaseItem
A function that will handle the click event of this menu item (defaults to undefined)
 hideDelay : NumberBaseItem
Length of time in milliseconds to wait before hiding after a click (defaults to 100)
 hideOnClick : BooleanSeparator
True to hide the containing menu after this item is clicked (defaults to false)
 itemCls : StringSeparator
The default CSS class to use for separators (defaults to "x-menu-sep")
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

Separator

+ public function Separator(Object config) +
+
+ Parameters: +
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

activate

+ public event activate +
+ Fires when this item is activated +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
+
+
+
This event is defined by BaseItem.
+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

click

+ public event click +
+ Fires when this item is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
  • e : Ext.EventObject
+
+
+
This event is defined by BaseItem.
+
+ +
+

deactivate

+ public event deactivate +
+ Fires when this item is deactivated +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
+
+
+
This event is defined by BaseItem.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+
+

Config Details

+
+ +
+

activeClass

+ activeClass : String +
+ The CSS class to use when the item becomes activated (defaults to "x-menu-item-active")
+
This config option is defined by BaseItem.
+
+ +
+

canActivate

+ canActivate : Boolean +
+ True if this item can be visually activated (defaults to false)
+
This config option is defined by BaseItem.
+
+ +
+

handler

+ handler : Function +
+ A function that will handle the click event of this menu item (defaults to undefined)
+
This config option is defined by BaseItem.
+
+ +
+

hideDelay

+ hideDelay : Number +
+ Length of time in milliseconds to wait before hiding after a click (defaults to 100)
+
This config option is defined by BaseItem.
+
+ +
+

hideOnClick

+ hideOnClick : Boolean +
+ True to hide the containing menu after this item is clicked (defaults to false)
+
This config option is defined by Separator.
+
+ +
+

itemCls

+ itemCls : String +
+ The default CSS class to use for separators (defaults to "x-menu-sep")
+
This config option is defined by Separator.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.menu.TextItem.html b/www/extras/yui-ext/docs/output/Ext.menu.TextItem.html new file mode 100644 index 000000000..2b1733f40 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.menu.TextItem.html @@ -0,0 +1,1016 @@ + + + + Ext.menu.TextItem + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.menu.TextItem

+ + + + + +
Package:Ext.menu
Class:TextItem
Extends:BaseItem
Defined In:TextItem.js
+
+ Adds a static text string to a menu, usually used as either a heading or group separator.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 disabled : ObjectComponent
true if this component is disabled. Read-only.
 disabledClass : ObjectComponent
CSS class added to the component when it is disabled.
 hidden : ObjectComponent
true if this component is hidden. Read-only.
 rendered : ObjectComponent
true if this component has been rendered. Read-only.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 TextItem(String text)TextItem
Creates a new TextItem
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 disable() : voidComponent
Disable this component
 enable() : voidComponent
Enable this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focus(Boolean selectText) : voidComponent
Try to focus this component
 getEl() : Ext.ElementComponent
Returns the underlying Ext.Element
 getId() : StringComponent
Returns the id of this component
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 hide() : voidComponent
Hide this component
 isVisible() : voidComponent
Returns true if this component is visible
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render([String/HTMLElement/Element container]) : voidComponent
If this is a lazy rendering component, render it to its container element
 setDisabled(Boolean disabled) : voidComponent
Convenience function for setting disabled/enabled by boolean
 setVisible(Boolean visible) : voidComponent
Convenience function to hide or show this component by boolean
 show() : voidComponent
Show this component
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 activate : (Ext.menu.BaseItem this)BaseItem
Fires when this item is activated
 beforedestroy : (Ext.Component this)Component
Fires before the component is destroyed
 beforehide : (Ext.Component this)Component
Fires before the component is hidden
 beforerender : (Ext.Component this)Component
Fires before the component is rendered
 beforeshow : (Ext.Component this)Component
Fires before the component is shown
 click : (Ext.menu.BaseItem this, Ext.EventObject e)BaseItem
Fires when this item is clicked
 deactivate : (Ext.menu.BaseItem this)BaseItem
Fires when this item is deactivated
 destroy : (Ext.Component this)Component
Fires after the component is destroyed
 disable : (Ext.Component this)Component
Fires after the component is disabled
 enable : (Ext.Component this)Component
Fires after the component is enabled
 hide : (Ext.Component this)Component
Fires after the component is hidden
 render : (Ext.Component this)Component
Fires after the component is rendered
 show : (Ext.Component this)Component
Fires after the component is shown
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 activeClass : StringBaseItem
The CSS class to use when the item becomes activated (defaults to "x-menu-item-active")
 canActivate : BooleanBaseItem
True if this item can be visually activated (defaults to false)
 handler : FunctionBaseItem
A function that will handle the click event of this menu item (defaults to undefined)
 hideDelay : NumberBaseItem
Length of time in milliseconds to wait before hiding after a click (defaults to 100)
 hideOnClick : BooleanTextItem
True to hide the containing menu after this item is clicked (defaults to false)
 itemCls : StringTextItem
The default CSS class to use for text items (defaults to "x-menu-text")
+

Property Details

+
+ +
+

disabled

+ public Object disabled +
+ true if this component is disabled. Read-only.
+
This property is defined by Component.
+
+ +
+

disabledClass

+ public Object disabledClass +
+ CSS class added to the component when it is disabled.
+
This property is defined by Component.
+
+ +
+

hidden

+ public Object hidden +
+ true if this component is hidden. Read-only.
+
This property is defined by Component.
+
+ +
+

rendered

+ public Object rendered +
+ true if this component has been rendered. Read-only.
+
This property is defined by Component.
+
+
+ + +

Constructor Details

+
+
+

TextItem

+ public function TextItem(String text) +
+ Creates a new TextItem
+ Parameters: +
  • text : String
    The text to display
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

disable

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

enable

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

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.
+
+ +
+

focus

+ public function focus(Boolean selectText) +
+ Try to focus this component +
+ Parameters: +
  • selectText : Boolean
    True to also select the text in this component (if applicable)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the underlying Ext.Element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Ext.Element
    The element
  • +
+
+
+
This method is defined by Component.
+
+ +
+

getId

+ public function getId() +
+ Returns the id of this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Component.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

hide

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

isVisible

+ public function isVisible() +
+ Returns true if this component is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render([String/HTMLElement/Element container]) +
+ If this is a lazy rendering component, render it to its container element +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setDisabled

+ public function setDisabled(Boolean disabled) +
+ Convenience function for setting disabled/enabled by boolean +
+ Parameters: +
  • disabled : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function to hide or show this component by boolean +
+ Parameters: +
  • visible : Boolean
    True to show, false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

show

+ public function show() +
+ Show this component +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Component.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

activate

+ public event activate +
+ Fires when this item is activated +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
+
+
+
This event is defined by BaseItem.
+
+ +
+

beforedestroy

+ public event beforedestroy +
+ Fires before the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforehide

+ public event beforehide +
+ Fires before the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforerender

+ public event beforerender +
+ Fires before the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

click

+ public event click +
+ Fires when this item is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
  • e : Ext.EventObject
+
+
+
This event is defined by BaseItem.
+
+ +
+

deactivate

+ public event deactivate +
+ Fires when this item is deactivated +
+ Subscribers will be called with the following parameters: +
  • this : Ext.menu.BaseItem
+
+
+
This event is defined by BaseItem.
+
+ +
+

destroy

+ public event destroy +
+ Fires after the component is destroyed +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

disable

+ public event disable +
+ Fires after the component is disabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

enable

+ public event enable +
+ Fires after the component is enabled +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

hide

+ public event hide +
+ Fires after the component is hidden +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

render

+ public event render +
+ Fires after the component is rendered +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+ +
+

show

+ public event show +
+ Fires after the component is shown +
+ Subscribers will be called with the following parameters: +
  • this : Ext.Component
+
+
+
This event is defined by Component.
+
+
+

Config Details

+
+ +
+

activeClass

+ activeClass : String +
+ The CSS class to use when the item becomes activated (defaults to "x-menu-item-active")
+
This config option is defined by BaseItem.
+
+ +
+

canActivate

+ canActivate : Boolean +
+ True if this item can be visually activated (defaults to false)
+
This config option is defined by BaseItem.
+
+ +
+

handler

+ handler : Function +
+ A function that will handle the click event of this menu item (defaults to undefined)
+
This config option is defined by BaseItem.
+
+ +
+

hideDelay

+ hideDelay : Number +
+ Length of time in milliseconds to wait before hiding after a click (defaults to 100)
+
This config option is defined by BaseItem.
+
+ +
+

hideOnClick

+ hideOnClick : Boolean +
+ True to hide the containing menu after this item is clicked (defaults to false)
+
This config option is defined by TextItem.
+
+ +
+

itemCls

+ itemCls : String +
+ The default CSS class to use for text items (defaults to "x-menu-text")
+
This config option is defined by TextItem.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.state.CookieProvider.html b/www/extras/yui-ext/docs/output/Ext.state.CookieProvider.html new file mode 100644 index 000000000..53d3c8ba0 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.state.CookieProvider.html @@ -0,0 +1,314 @@ + + + + Ext.state.CookieProvider + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.state.CookieProvider

+ + + + + +
Package:Ext.state
Class:CookieProvider
Extends:Provider
Defined In:State.js
+
+ The default Provider implementation which saves state via cookies. +
Usage: +
var cp = new Ext.state.CookieProvider({
+       path: "/cgi-bin/",
+       expires: new Date(new Date().getTime()+(1000*60*60*24*30)); //30 days
+       domain: "extjs.com"
+   })
+   Ext.state.Manager.setProvider(cp);
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 CookieProvider(Object config)CookieProvider
Create a new CookieProvider
 clear(String name) : voidProvider
Clears a value from the state
 decodeValue(String value) : MixedProvider
Decodes a string previously encoded with encodeValue.
 encodeValue(Mixed value) : StringProvider
Encodes a value including type information. Decode with decodeValue.
 get(String name, Mixed defaultValue) : MixedProvider
Returns the current value for a key
 set(String name, Mixed value) : voidProvider
Sets the value for a key
+ +

Public Events

+ + + + + + + + + + + + + +
EventDefined By
 statechange : (Provider this, String key, String value)Provider
Fires when a state change occurs.
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 domain : StringCookieProvider
The domain to save the cookie for. Note that you cannot specify a different domain than your page is on, but you can ...
 expires : DateCookieProvider
The cookie expiration date (defaults to 7 days from now)
 path : StringCookieProvider
The path for which the cookie is active (defaults to root '/' which makes it active for all pages in the site)
 secure : BooleanCookieProvider
True if the site is using SSL (defaults to false)
+ + +

Constructor Details

+
+
+

CookieProvider

+ public function CookieProvider(Object config) +
+ Create a new CookieProvider
+ Parameters: +
  • config : Object
    The configuration object
+
+
+
+
+ +

Method Details

+
+ +
+

clear

+ public function clear(String name) +
+ Clears a value from the state +
+ Parameters: +
  • name : String
    The key name
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Provider.
+
+ +
+

decodeValue

+ public function decodeValue(String value) +
+ Decodes a string previously encoded with encodeValue. +
+ Parameters: +
  • value : String
    The value to decode
+ Returns: +
    +
  • Mixed
    The decoded value
  • +
+
+
+
This method is defined by Provider.
+
+ +
+

encodeValue

+ public function encodeValue(Mixed value) +
+ Encodes a value including type information. Decode with decodeValue. +
+ Parameters: +
  • value : Mixed
    The value to encode
+ Returns: +
    +
  • String
    The encoded value
  • +
+
+
+
This method is defined by Provider.
+
+ +
+

get

+ public function get(String name, Mixed defaultValue) +
+ Returns the current value for a key +
+ Parameters: +
  • name : String
    The key name
  • defaultValue : Mixed
    A default value to return if the key's value is not found
+ Returns: +
    +
  • Mixed
    The state data
  • +
+
+
+
This method is defined by Provider.
+
+ +
+

set

+ public function set(String name, Mixed value) +
+ Sets the value for a key +
+ Parameters: +
  • name : String
    The key name
  • value : Mixed
    The value to set
+ 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
    This state provider
  • key : String
    The state key which was changed
  • value : String
    The encoded value for the state
+
+
+
This event is defined by Provider.
+
+
+

Config Details

+
+ +
+

domain

+ domain : String +
+ The domain to save the cookie for. Note that you cannot specify a different domain than your page is on, but you can specify a sub-domain, or simply the domain itself like 'extjs.com' to include all sub-domains if you need to access cookies across different sub-domains (defaults to null which uses the same domain the page is running on including the 'www' like 'www.extjs.com')
+
This config option is defined by CookieProvider.
+
+ +
+

expires

+ expires : Date +
+ The cookie expiration date (defaults to 7 days from now)
+
This config option is defined by CookieProvider.
+
+ +
+

path

+ path : String +
+ The path for which the cookie is active (defaults to root '/' which makes it active for all pages in the site)
+
This config option is defined by CookieProvider.
+
+ +
+

secure

+ secure : Boolean +
+ True if the site is using SSL (defaults to false)
+
This config option is defined by CookieProvider.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.state.Manager.html b/www/extras/yui-ext/docs/output/Ext.state.Manager.html new file mode 100644 index 000000000..22d2addd7 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.state.Manager.html @@ -0,0 +1,191 @@ + + + + Ext.state.Manager + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.state.Manager

+ + + + + +
Package: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(){
+   Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
+   ...
+   // supposed you have a Ext.BorderLayout
+   var layout = new Ext.BorderLayout(...);
+   layout.restoreState();
+   // or a {Ext.BasicDialog}
+   var dialog = new Ext.BasicDialog(...);
+   dialog.restoreState();


This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 clear(String name) : voidManager
Clears a value from the state
 get(String name, Mixed defaultValue) : MixedManager
Returns the current value for a key
 getProvider() : ProviderManager
Gets the currently configured state provider
 set(String name, Mixed value) : voidManager
Sets the value for a key
 setProvider(Provider stateProvider) : voidManager
Configures the default state provider for your application
+ +

Public Events

+
This class has no public events.
+ +

Method Details

+
+ +
+

clear

+ public function clear(String name) +
+ Clears a value from the state +
+ Parameters: +
  • name : String
    The key name
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Manager.
+
+ +
+

get

+ public function get(String name, Mixed defaultValue) +
+ Returns the current value for a key +
+ Parameters: +
  • name : String
    The key name
  • defaultValue : Mixed
    The default value to return if the key lookup does not match
+ Returns: +
    +
  • Mixed
    The state data
  • +
+
+
+
This method is defined by Manager.
+
+ +
+

getProvider

+ public function getProvider() +
+ Gets the currently configured state provider +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Provider
    The state provider
  • +
+
+
+
This method is defined by Manager.
+
+ +
+

set

+ public function set(String name, Mixed value) +
+ Sets the value for a key +
+ Parameters: +
  • name : String
    The key name
  • value : Mixed
    The state data
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Manager.
+
+ +
+

setProvider

+ public function setProvider(Provider stateProvider) +
+ Configures the default state provider for your application +
+ Parameters: +
  • stateProvider : Provider
    The state provider to set
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Manager.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.state.Provider.html b/www/extras/yui-ext/docs/output/Ext.state.Provider.html new file mode 100644 index 000000000..3693a5589 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.state.Provider.html @@ -0,0 +1,212 @@ + + + + Ext.state.Provider + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.state.Provider

+ + + + + + +
Package:Ext.state
Class:Provider
Extends:Object
Subclasses:CookieProvider
Defined In:State.js
+
+ Abstract base class for state provider implementations. This class provides methods +for encoding and decoding typed variables including dates and defines the +Provider interface.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 clear(String name) : voidProvider
Clears a value from the state
 decodeValue(String value) : MixedProvider
Decodes a string previously encoded with encodeValue.
 encodeValue(Mixed value) : StringProvider
Encodes a value including type information. Decode with decodeValue.
 get(String name, Mixed defaultValue) : MixedProvider
Returns the current value for a key
 set(String name, Mixed value) : voidProvider
Sets 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(String name) +
+ Clears a value from the state +
+ Parameters: +
  • name : String
    The key name
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Provider.
+
+ +
+

decodeValue

+ public function decodeValue(String value) +
+ Decodes a string previously encoded with encodeValue. +
+ Parameters: +
  • value : String
    The value to decode
+ Returns: +
    +
  • Mixed
    The decoded value
  • +
+
+
+
This method is defined by Provider.
+
+ +
+

encodeValue

+ public function encodeValue(Mixed value) +
+ Encodes a value including type information. Decode with decodeValue. +
+ Parameters: +
  • value : Mixed
    The value to encode
+ Returns: +
    +
  • String
    The encoded value
  • +
+
+
+
This method is defined by Provider.
+
+ +
+

get

+ public function get(String name, Mixed defaultValue) +
+ Returns the current value for a key +
+ Parameters: +
  • name : String
    The key name
  • defaultValue : Mixed
    A default value to return if the key's value is not found
+ Returns: +
    +
  • Mixed
    The state data
  • +
+
+
+
This method is defined by Provider.
+
+ +
+

set

+ public function set(String name, Mixed value) +
+ Sets the value for a key +
+ Parameters: +
  • name : String
    The key name
  • value : Mixed
    The value to set
+ 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
    This state provider
  • key : String
    The state key which was changed
  • value : String
    The encoded value for the state
+
+
+
This event is defined by Provider.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.tree.AsyncTreeNode.html b/www/extras/yui-ext/docs/output/Ext.tree.AsyncTreeNode.html new file mode 100644 index 000000000..5778c21fb --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.tree.AsyncTreeNode.html @@ -0,0 +1,2138 @@ + + + + Ext.tree.AsyncTreeNode + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.tree.AsyncTreeNode

+ + + + + +
Package:Ext.tree
Class:AsyncTreeNode
Extends:TreeNode
Defined In:AsyncTreeNode.js
+
+
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 attributes : ObjectNode
The attributes supplied for the node. You can use this property to access any custom attributes you supplied.
 childNodes : ArrayNode
All child nodes of this node.
 disabled : BooleanTreeNode
True if this node is disabled.
 firstChild : NodeNode
The first direct child node of this node, or null if this node has no child nodes.
 id : StringNode
The node id.
 lastChild : NodeNode
The last direct child node of this node, or null if this node has no child nodes.
 loader : TreeLoaderAsyncTreeNode
* +The loader used by this node (defaults to using the tree's defined loader)
 nextSibling : NodeNode
The node immediately following this node in the tree, or null if there is no sibling node.
 parentNode : NodeNode
The parent node for this node.
 previousSibling : NodeNode
The node immediately preceding this node in the tree, or null if there is no sibling node.
 text : StringTreeNode
Read-only. The text for this node. To change it use setText().
 ui : TreeNodeUITreeNode
Read-only. The UI for this node
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 AsyncTreeNode(Object/String attributes)AsyncTreeNode
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 appendChild(Node/Array node) : NodeNode
Insert node(s) as the last child node of this node.
 bubble(Function fn, [Object scope], [Array args]) : voidNode
Bubbles up the tree from this node, calling the specified function with each node. The scope (this) of +function call...
 cascade(Function fn, [Object scope], [Array args]) : voidNode
Cascades down the tree from this node, calling the specified function with each node. The scope (this) of +function c...
 collapse([Boolean deep], [Boolean anim]) : voidTreeNode
Collapse this node.
 collapseChildNodes([Boolean deep]) : voidTreeNode
Collapse all child nodes
 contains(Node node) : BooleanNode
Returns true if this node is an ancestor (at any point) of the passed node.
 disable() : voidTreeNode
Disables this node
 eachChild(Function fn, [Object scope], [Array args]) : voidNode
Interates the child nodes of this node, calling the specified function with each node. The scope (this) of +function ...
 enable() : voidTreeNode
Enables this node
 ensureVisible() : voidTreeNode
Ensures all parent nodes are expanded
 expand([Boolean deep], [Boolean anim], [Function callback]) : voidTreeNode
Expand this node.
 expandChildNodes([Boolean deep]) : voidTreeNode
Expand all child nodes
 findChild(String attribute, Mixed value) : NodeNode
Finds the first child that has the attribute with the specified value.
 findChildBy(Function fn, [Object scope]) : NodeNode
Finds the first child by a custom function. The child matches if the function passed +returns true.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getDepth() : NumberNode
Returns depth of this node (the root node has a depth of 0)
 getOwnerTree() : TreeNode
Returns the tree this node is in.
 getPath([String attr]) : StringNode
Returns the path for this node. The path can be used to expand or select this node programmatically.
 getUI() : TreeNodeUITreeNode
Returns the UI object for this node
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 indexOf(Node node) : NumberNode
Returns the index of a child node
 insertBefore(Node node, Node refNode) : NodeNode
Inserts the first node before the second node in this nodes childNodes collection.
 isAncestor(Node node) : BooleanNode
Returns true if the passed node is an ancestor (at any point) of this node.
 isExpanded() : BooleanTreeNode
Returns true if this node is expanded
 isFirst() : BooleanNode
Returns true if this node is the first child of its parent
 isLast() : BooleanNode
Returns true if this node is the last child of its parent
 isLeaf() : BooleanNode
Returns true if this node is a leaf
 isLoaded() : BooleanAsyncTreeNode
Returns true if this node has been loaded
 isLoading() : BooleanAsyncTreeNode
Returns true if this node is currently loading
 isSelected() : BooleanTreeNode
Returns true if this node is selected
 item(Number index) : NodeNode
Returns the child node at the specified index.
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 reload(Function callback) : voidAsyncTreeNode
Trigger a reload for this node
 removeChild(Node node) : NodeNode
Removes a child node from this node.
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 replaceChild(Node newChild, Node oldChild) : NodeNode
Replaces one child node in this node with another.
 select() : voidTreeNode
Triggers selection of this node
 setText(String text) : voidTreeNode
Sets the text for this node
 sort(Function fn, [Object scope]) : voidNode
Sorts this nodes children using the supplied sort function
 toggle() : voidTreeNode
Toggles expanded/collapsed state of the node
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 unselect() : voidTreeNode
Triggers deselection of this node
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 append : (Tree tree, Node this, Node node, Number index)Node
Fires when a new child node is appended
 beforeappend : (Tree tree, Node this, Node node)Node
Fires before a new child is appended, return false to cancel the append.
 beforechildrenrendered : (Node this)TreeNode
Fires right before the child nodes for this node are rendered
 beforeclick : (Node this, Ext.EventObject e)TreeNode
Fires before click processing. Return false to cancel the default action.
 beforecollapse : (Node this, Boolean deep, Boolean anim)TreeNode
Fires before this node is collapsed, return false to cancel.
 beforeexpand : (Node this, Boolean deep, Boolean anim)TreeNode
Fires before this node is expanded, return false to cancel.
 beforeinsert : (Tree tree, Node this, Node node, Node refNode)Node
Fires before a new child is inserted, return false to cancel the insert.
 beforeload : (Node this)AsyncTreeNode
Fires before this node is loaded, return false to cancel
 beforemove : (Tree tree, Node this, Node oldParent, Node newParent, Number index)Node
Fires before this node is moved to a new location in the tree. Return false to cancel the move.
 beforeremove : (Tree tree, Node this, Node node)Node
Fires before a child is removed, return false to cancel the remove.
 click : (Node this, Ext.EventObject e)TreeNode
Fires when this node is clicked
 collapse : (Node this)TreeNode
Fires when this node is collapsed
 contextmenu : (Node this, Ext.EventObject e)TreeNode
Fires when this node is right clicked
 dblclick : (Node this, Ext.EventObject e)TreeNode
Fires when this node is double clicked
 disabledchange : (Node this, Boolean disabled)TreeNode
Fires when the disabled status of this node changes
 expand : (Node this)TreeNode
Fires when this node is expanded
 insert : (Tree tree, Node this, Node node, Node refNode)Node
Fires when a new child node is inserted.
 load : (Node this)AsyncTreeNode
Fires when this node is loaded
 move : (Tree tree, Node this, Node oldParent, Node newParent, Number index)Node
Fires when this node is moved to a new location in the tree
 remove : (Tree tree, Node this, Node node)Node
Fires when a child node is removed
 textchange : (Node this, String text, String oldText)TreeNode
Fires when the text for this node is changed
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 allowDrag : BooleanTreeNode
false to make this node undraggable if DD is on (defaults to true)
 allowDrop : BooleanTreeNode
false if this node cannot be drop on
 cls : StringTreeNode
A css class to be added to the node
 disabled : BooleanTreeNode
true to start the node disabled
 expanded : BooleanTreeNode
true to start the node expanded
 href : StringTreeNode
URL of the link used for the node (defaults to #)
 hrefTarget : StringTreeNode
target frame for the link
 icon : StringTreeNode
The path to an icon for the node. The preferred way to do this is to use the cls or iconCls attributes and add the ic...
 iconCls : StringTreeNode
A css class to be added to the nodes icon element for applying css background images
 id : StringNode
The id for this node. If one is not specified, one is generated.
 leaf : BooleanNode
true if this node is a leaf and does not have children
 loader : TreeLoaderAsyncTreeNode
A TreeLoader to be used by this node (defaults to the loader defined on the tree)
 qtip : StringTreeNode
An Ext QuickTip for the node
 singleClickExpand : BooleanTreeNode
True for single click expand on this node
 text : StringTreeNode
The text for this node
 uiProvider : FunctionTreeNode
A UI class to use for this node (defaults to Ext.tree.TreeNodeUI)
+

Property Details

+
+ +
+

attributes

+ public Object attributes +
+ The attributes supplied for the node. You can use this property to access any custom attributes you supplied.
+
This property is defined by Node.
+
+ +
+

childNodes

+ public Array childNodes +
+ All child nodes of this node.
+
This property is defined by Node.
+
+ +
+

disabled

+ public Boolean disabled +
+ True if this node is disabled.
+
This property is defined by TreeNode.
+
+ +
+

firstChild

+ public Node firstChild +
+ The first direct child node of this node, or null if this node has no child nodes.
+
This property is defined by Node.
+
+ +
+

id

+ public String id +
+ The node id.
+
This property is defined by Node.
+
+ +
+

lastChild

+ public Node lastChild +
+ The last direct child node of this node, or null if this node has no child nodes.
+
This property is defined by Node.
+
+ +
+

loader

+ public TreeLoader loader +
+ * +The loader used by this node (defaults to using the tree's defined loader)
+
This property is defined by AsyncTreeNode.
+
+ +
+

nextSibling

+ public Node nextSibling +
+ The node immediately following this node in the tree, or null if there is no sibling node.
+
This property is defined by Node.
+
+ +
+

parentNode

+ public Node parentNode +
+ The parent node for this node.
+
This property is defined by Node.
+
+ +
+

previousSibling

+ public Node previousSibling +
+ The node immediately preceding this node in the tree, or null if there is no sibling node.
+
This property is defined by Node.
+
+ +
+

text

+ public String text +
+ Read-only. The text for this node. To change it use setText().
+
This property is defined by TreeNode.
+
+ +
+

ui

+ public TreeNodeUI ui +
+ Read-only. The UI for this node
+
This property is defined by TreeNode.
+
+
+ + +

Constructor Details

+
+
+

AsyncTreeNode

+ public function AsyncTreeNode(Object/String attributes) +
+
+ Parameters: +
  • attributes : Object/String
    The attributes/config for the node or just a string with the text for the node
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

appendChild

+ public function appendChild(Node/Array node) +
+ Insert node(s) as the last child node of this node. +
+ Parameters: +
  • node : Node/Array
    The node or Array of nodes to append
+ Returns: +
    +
  • Node
    The appended node if single append, or null if an array was passed
  • +
+
+
+
This method is defined by Node.
+
+ +
+

bubble

+ public function bubble(Function fn, [Object scope], [Array args]) +
+ Bubbles up the tree from this node, calling the specified function with each node. The scope (this) of +function call will be the scope provided or the current node. The arguments to the function +will be the args provided or the current node. If the function returns false at any point, +the bubble is stopped. +
+ Parameters: +
  • fn : Function
    The function to call
  • scope : Object
    (optional) The scope of the function (defaults to current node)
  • args : Array
    (optional) The args to call the function with (default to passing the current node)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Node.
+
+ +
+

cascade

+ public function cascade(Function fn, [Object scope], [Array args]) +
+ Cascades down the tree from this node, calling the specified function with each node. The scope (this) of +function call will be the scope provided or the current node. The arguments to the function +will be the args provided or the current node. If the function returns false at any point, +the cascade is stopped on that branch. +
+ Parameters: +
  • fn : Function
    The function to call
  • scope : Object
    (optional) The scope of the function (defaults to current node)
  • args : Array
    (optional) The args to call the function with (default to passing the current node)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Node.
+
+ +
+

collapse

+ public function collapse([Boolean deep], [Boolean anim]) +
+ Collapse this node. +
+ Parameters: +
  • deep : Boolean
    (optional) True to collapse all children as well
  • anim : Boolean
    (optional) false to cancel the default animation
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

collapseChildNodes

+ public function collapseChildNodes([Boolean deep]) +
+ Collapse all child nodes +
+ Parameters: +
  • deep : Boolean
    (optional) true if the child nodes should also collapse their child nodes
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

contains

+ public function contains(Node node) +
+ Returns true if this node is an ancestor (at any point) of the passed node. +
+ Parameters: +
  • node : Node
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Node.
+
+ +
+

disable

+ public function disable() +
+ Disables this node +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

eachChild

+ public function eachChild(Function fn, [Object scope], [Array args]) +
+ Interates the child nodes of this node, calling the specified function with each node. The scope (this) of +function call will be the scope provided or the current node. The arguments to the function +will be the args provided or the current node. If the function returns false at any point, +the iteration stops. +
+ Parameters: +
  • fn : Function
    The function to call
  • scope : Object
    (optional) The scope of the function (defaults to current node)
  • args : Array
    (optional) The args to call the function with (default to passing the current node)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Node.
+
+ +
+

enable

+ public function enable() +
+ Enables this node +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

ensureVisible

+ public function ensureVisible() +
+ Ensures all parent nodes are expanded +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

expand

+ public function expand([Boolean deep], [Boolean anim], [Function callback]) +
+ Expand this node. +
+ Parameters: +
  • deep : Boolean
    (optional) True to expand all children as well
  • anim : Boolean
    (optional) false to cancel the default animation
  • callback : Function
    (optional) A callback to be called when expanding this node completes (does not wait for deep expand to complete). Called with 1 parameter, this node.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

expandChildNodes

+ public function expandChildNodes([Boolean deep]) +
+ Expand all child nodes +
+ Parameters: +
  • deep : Boolean
    (optional) true if the child nodes should also expand their child nodes
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

findChild

+ public function findChild(String attribute, Mixed value) +
+ Finds the first child that has the attribute with the specified value. +
+ Parameters: +
  • attribute : String
    The attribute name
  • value : Mixed
    The value to search for
+ Returns: +
    +
  • Node
    The found child or null if none was found
  • +
+
+
+
This method is defined by Node.
+
+ +
+

findChildBy

+ public function findChildBy(Function fn, [Object scope]) +
+ Finds the first child by a custom function. The child matches if the function passed +returns true. +
+ Parameters: +
  • fn : Function
  • scope : Object
    (optional)
+ Returns: +
    +
  • Node
    The found child or null if none was found
  • +
+
+
+
This method is defined by Node.
+
+ +
+

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.
+
+ +
+

getDepth

+ public function getDepth() +
+ Returns depth of this node (the root node has a depth of 0) +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Node.
+
+ +
+

getOwnerTree

+ public function getOwnerTree() +
+ Returns the tree this node is in. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Tree
  • +
+
+
+
This method is defined by Node.
+
+ +
+

getPath

+ public function getPath([String attr]) +
+ Returns the path for this node. The path can be used to expand or select this node programmatically. +
+ Parameters: +
  • attr : String
    (optional) The attr to use for the path (defaults to the node's id)
+ Returns: +
    +
  • String
    The path
  • +
+
+
+
This method is defined by Node.
+
+ +
+

getUI

+ public function getUI() +
+ Returns the UI object for this node +
+ Parameters: +
  • None.
+ Returns: +
    +
  • TreeNodeUI
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

indexOf

+ public function indexOf(Node node) +
+ Returns the index of a child node +
+ Parameters: +
  • node : Node
+ Returns: +
    +
  • Number
    The index of the node or -1 if it was not found
  • +
+
+
+
This method is defined by Node.
+
+ +
+

insertBefore

+ public function insertBefore(Node node, Node refNode) +
+ Inserts the first node before the second node in this nodes childNodes collection. +
+ Parameters: +
  • node : Node
    The node to insert
  • refNode : Node
    The node to insert before (if null the node is appended)
+ Returns: +
    +
  • Node
    The inserted node
  • +
+
+
+
This method is defined by Node.
+
+ +
+

isAncestor

+ public function isAncestor(Node node) +
+ Returns true if the passed node is an ancestor (at any point) of this node. +
+ Parameters: +
  • node : Node
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Node.
+
+ +
+

isExpanded

+ public function isExpanded() +
+ Returns true if this node is expanded +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

isFirst

+ public function isFirst() +
+ Returns true if this node is the first child of its parent +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Node.
+
+ +
+

isLast

+ public function isLast() +
+ Returns true if this node is the last child of its parent +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Node.
+
+ +
+

isLeaf

+ public function isLeaf() +
+ Returns true if this node is a leaf +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Node.
+
+ +
+

isLoaded

+ public function isLoaded() +
+ Returns true if this node has been loaded +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by AsyncTreeNode.
+
+ +
+

isLoading

+ public function isLoading() +
+ Returns true if this node is currently loading +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by AsyncTreeNode.
+
+ +
+

isSelected

+ public function isSelected() +
+ Returns true if this node is selected +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

item

+ public function item(Number index) +
+ Returns the child node at the specified index. +
+ Parameters: +
  • index : Number
+ Returns: +
    +
  • Node
  • +
+
+
+
This method is defined by Node.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

reload

+ public function reload(Function callback) +
+ Trigger a reload for this node +
+ Parameters: +
  • callback : Function
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AsyncTreeNode.
+
+ +
+

removeChild

+ public function removeChild(Node node) +
+ Removes a child node from this node. +
+ Parameters: +
  • node : Node
    The node to remove
+ Returns: +
    +
  • Node
    The removed node
  • +
+
+
+
This method is defined by Node.
+
+ +
+

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.
+
+ +
+

replaceChild

+ public function replaceChild(Node newChild, Node oldChild) +
+ Replaces one child node in this node with another. +
+ Parameters: +
  • newChild : Node
    The replacement node
  • oldChild : Node
    The node to replace
+ Returns: +
    +
  • Node
    The replaced node
  • +
+
+
+
This method is defined by Node.
+
+ +
+

select

+ public function select() +
+ Triggers selection of this node +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

setText

+ public function setText(String text) +
+ Sets the text for this node +
+ Parameters: +
  • text : String
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

sort

+ public function sort(Function fn, [Object scope]) +
+ Sorts this nodes children using the supplied sort function +
+ Parameters: +
  • fn : Function
  • scope : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Node.
+
+ +
+

toggle

+ public function toggle() +
+ Toggles expanded/collapsed state of the node +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

unselect

+ public function unselect() +
+ Triggers deselection of this node +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+
+ +

Event Details

+
+ +
+

append

+ public event append +
+ Fires when a new child node is appended +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The newly appended node
  • index : Number
    The index of the newly appended node
+
+
+
This event is defined by Node.
+
+ +
+

beforeappend

+ public event beforeappend +
+ Fires before a new child is appended, return false to cancel the append. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The child node to be appended
+
+
+
This event is defined by Node.
+
+ +
+

beforechildrenrendered

+ public event beforechildrenrendered +
+ Fires right before the child nodes for this node are rendered +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
+
+
+
This event is defined by TreeNode.
+
+ +
+

beforeclick

+ public event beforeclick +
+ Fires before click processing. Return false to cancel the default action. +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by TreeNode.
+
+ +
+

beforecollapse

+ public event beforecollapse +
+ Fires before this node is collapsed, return false to cancel. +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
  • deep : Boolean
  • anim : Boolean
+
+
+
This event is defined by TreeNode.
+
+ +
+

beforeexpand

+ public event beforeexpand +
+ Fires before this node is expanded, return false to cancel. +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
  • deep : Boolean
  • anim : Boolean
+
+
+
This event is defined by TreeNode.
+
+ +
+

beforeinsert

+ public event beforeinsert +
+ Fires before a new child is inserted, return false to cancel the insert. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The child node to be inserted
  • refNode : Node
    The child node the node is being inserted before
+
+
+
This event is defined by Node.
+
+ +
+

beforeload

+ public event beforeload +
+ Fires before this node is loaded, return false to cancel +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
+
+
+
This event is defined by AsyncTreeNode.
+
+ +
+

beforemove

+ public event beforemove +
+ Fires before this node is moved to a new location in the tree. Return false to cancel the move. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • oldParent : Node
    The parent of this node
  • newParent : Node
    The new parent this node is moving to
  • index : Number
    The index it is being moved to
+
+
+
This event is defined by Node.
+
+ +
+

beforeremove

+ public event beforeremove +
+ Fires before a child is removed, return false to cancel the remove. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The child node to be removed
+
+
+
This event is defined by Node.
+
+ +
+

click

+ public event click +
+ Fires when this node is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by TreeNode.
+
+ +
+

collapse

+ public event collapse +
+ Fires when this node is collapsed +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
+
+
+
This event is defined by TreeNode.
+
+ +
+

contextmenu

+ public event contextmenu +
+ Fires when this node is right clicked +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by TreeNode.
+
+ +
+

dblclick

+ public event dblclick +
+ Fires when this node is double clicked +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by TreeNode.
+
+ +
+

disabledchange

+ public event disabledchange +
+ Fires when the disabled status of this node changes +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
  • disabled : Boolean
+
+
+
This event is defined by TreeNode.
+
+ +
+

expand

+ public event expand +
+ Fires when this node is expanded +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
+
+
+
This event is defined by TreeNode.
+
+ +
+

insert

+ public event insert +
+ Fires when a new child node is inserted. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The child node inserted
  • refNode : Node
    The child node the node was inserted before
+
+
+
This event is defined by Node.
+
+ +
+

load

+ public event load +
+ Fires when this node is loaded +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
+
+
+
This event is defined by AsyncTreeNode.
+
+ +
+

move

+ public event move +
+ Fires when this node is moved to a new location in the tree +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • oldParent : Node
    The old parent of this node
  • newParent : Node
    The new parent of this node
  • index : Number
    The index it was moved to
+
+
+
This event is defined by Node.
+
+ +
+

remove

+ public event remove +
+ Fires when a child node is removed +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The removed node
+
+
+
This event is defined by Node.
+
+ +
+

textchange

+ public event textchange +
+ Fires when the text for this node is changed +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
  • text : String
    The new text
  • oldText : String
    The old text
+
+
+
This event is defined by TreeNode.
+
+
+

Config Details

+
+ +
+

allowDrag

+ allowDrag : Boolean +
+ false to make this node undraggable if DD is on (defaults to true)
+
This config option is defined by TreeNode.
+
+ +
+

allowDrop

+ allowDrop : Boolean +
+ false if this node cannot be drop on
+
This config option is defined by TreeNode.
+
+ +
+

cls

+ cls : String +
+ A css class to be added to the node
+
This config option is defined by TreeNode.
+
+ +
+

disabled

+ disabled : Boolean +
+ true to start the node disabled
+
This config option is defined by TreeNode.
+
+ +
+

expanded

+ expanded : Boolean +
+ true to start the node expanded
+
This config option is defined by TreeNode.
+
+ +
+

href

+ href : String +
+ URL of the link used for the node (defaults to #)
+
This config option is defined by TreeNode.
+
+ +
+

hrefTarget

+ hrefTarget : String +
+ target frame for the link
+
This config option is defined by TreeNode.
+
+ +
+

icon

+ icon : String +
+ The path to an icon for the node. The preferred way to do this is to use the cls or iconCls attributes and add the icon via a CSS background image.
+
This config option is defined by TreeNode.
+
+ +
+

iconCls

+ iconCls : String +
+ A css class to be added to the nodes icon element for applying css background images
+
This config option is defined by TreeNode.
+
+ +
+

id

+ id : String +
+ The id for this node. If one is not specified, one is generated.
+
This config option is defined by Node.
+
+ +
+

leaf

+ leaf : Boolean +
+ true if this node is a leaf and does not have children
+
This config option is defined by Node.
+
+ +
+

loader

+ loader : TreeLoader +
+ A TreeLoader to be used by this node (defaults to the loader defined on the tree)
+
This config option is defined by AsyncTreeNode.
+
+ +
+

qtip

+ qtip : String +
+ An Ext QuickTip for the node
+
This config option is defined by TreeNode.
+
+ +
+

singleClickExpand

+ singleClickExpand : Boolean +
+ True for single click expand on this node
+
This config option is defined by TreeNode.
+
+ +
+

text

+ text : String +
+ The text for this node
+
This config option is defined by TreeNode.
+
+ +
+

uiProvider

+ uiProvider : Function +
+ A UI class to use for this node (defaults to Ext.tree.TreeNodeUI)
+
This config option is defined by TreeNode.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.tree.DefaultSelectionModel.html b/www/extras/yui-ext/docs/output/Ext.tree.DefaultSelectionModel.html new file mode 100644 index 000000000..ac426ed5b --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.tree.DefaultSelectionModel.html @@ -0,0 +1,482 @@ + + + + Ext.tree.DefaultSelectionModel + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.tree.DefaultSelectionModel

+ + + + + +
Package:Ext.tree
Class:DefaultSelectionModel
Extends:Observable
Defined In:TreeSelectionModel.js
+
+ The default single selection for a TreePanel.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 clearSelections() : voidDefaultSelectionModel
Clear all selections
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getSelectedNode() : TreeNodeDefaultSelectionModel
Get the selected node
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 isSelected(TreeNode node) : BooleanDefaultSelectionModel
Returns true if the node is selected
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 select(TreeNode node) : TreeNodeDefaultSelectionModel
Select a node.
 selectNext() : TreeNodeDefaultSelectionModel
Selects the node above the selected node in the tree, intelligently walking the nodes
 selectPrevious() : TreeNodeDefaultSelectionModel
Selects the node above the selected node in the tree, intelligently walking the nodes
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 unselect(TreeNode node) : voidDefaultSelectionModel
Deselect a node.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeselect : (DefaultSelectionModel this, TreeNode node, TreeNode node)DefaultSelectionModel
Fires before the selected node changes, return false to cancel the change
 selectionchange : (DefaultSelectionModel this, TreeNode node)DefaultSelectionModel
Fires when the selected node changes
+ + +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

clearSelections

+ public function clearSelections() +
+ Clear all selections +
+ Parameters: +
  • None.
+ 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.
+
+ +
+

getSelectedNode

+ public function getSelectedNode() +
+ Get the selected node +
+ Parameters: +
  • None.
+ Returns: +
    +
  • TreeNode
    The selected node
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

isSelected

+ public function isSelected(TreeNode node) +
+ Returns true if the node is selected +
+ Parameters: +
  • node : TreeNode
    The node to check
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

select

+ public function select(TreeNode node) +
+ Select a node. +
+ Parameters: +
  • node : TreeNode
    The node to select
+ Returns: +
    +
  • TreeNode
    The selected node
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectNext

+ public function selectNext() +
+ Selects the node above the selected node in the tree, intelligently walking the nodes +
+ Parameters: +
  • None.
+ Returns: +
    +
  • TreeNode
    The new selection
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectPrevious

+ public function selectPrevious() +
+ Selects the node above the selected node in the tree, intelligently walking the nodes +
+ Parameters: +
  • None.
+ Returns: +
    +
  • TreeNode
    The new selection
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

unselect

+ public function unselect(TreeNode node) +
+ Deselect a node. +
+ Parameters: +
  • node : TreeNode
    The node to unselect
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+
+ +

Event Details

+
+ +
+

beforeselect

+ public event beforeselect +
+ Fires before the selected node changes, return false to cancel the change +
+ Subscribers will be called with the following parameters: +
  • this : DefaultSelectionModel
  • node : TreeNode
    the new selection
  • node : TreeNode
    the old selection
+
+
+
This event is defined by DefaultSelectionModel.
+
+ +
+

selectionchange

+ public event selectionchange +
+ Fires when the selected node changes +
+ Subscribers will be called with the following parameters: +
  • this : DefaultSelectionModel
  • node : TreeNode
    the new selection
+
+
+
This event is defined by DefaultSelectionModel.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.tree.MultiSelectionModel.html b/www/extras/yui-ext/docs/output/Ext.tree.MultiSelectionModel.html new file mode 100644 index 000000000..04afb2ea3 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.tree.MultiSelectionModel.html @@ -0,0 +1,411 @@ + + + + Ext.tree.MultiSelectionModel + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.tree.MultiSelectionModel

+ + + + + +
Package:Ext.tree
Class:MultiSelectionModel
Extends:Observable
Defined In:TreeSelectionModel.js
+
+ Multi selection for a TreePanel.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 clearSelections() : voidMultiSelectionModel
Clear all selections
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getSelectedNodes() : ArrayMultiSelectionModel
Returns an array of the selected nodes
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 isSelected(TreeNode node) : BooleanMultiSelectionModel
Returns true if the node is selected
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 select(TreeNode node, [EventObject e], Boolean keepExisting) : TreeNodeMultiSelectionModel
Select a node.
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 unselect(TreeNode node) : voidMultiSelectionModel
Deselect a node.
+ +

Public Events

+ + + + + + + + + + + + + +
EventDefined By
 selectionchange : (MultiSelectionModel this, Array nodes)MultiSelectionModel
Fires when the selected nodes change
+ + +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

clearSelections

+ public function clearSelections() +
+ Clear all selections +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by MultiSelectionModel.
+
+ +
+

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.
+
+ +
+

getSelectedNodes

+ public function getSelectedNodes() +
+ Returns an array of the selected nodes +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by MultiSelectionModel.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

isSelected

+ public function isSelected(TreeNode node) +
+ Returns true if the node is selected +
+ Parameters: +
  • node : TreeNode
    The node to check
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by MultiSelectionModel.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

select

+ public function select(TreeNode node, [EventObject e], Boolean keepExisting) +
+ Select a node. +
+ Parameters: +
  • node : TreeNode
    The node to select
  • e : EventObject
    (optional) An event associated with the selection
  • keepExisting : Boolean
    True to retain existing selections
+ Returns: +
    +
  • TreeNode
    The selected node
  • +
+
+
+
This method is defined by MultiSelectionModel.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

unselect

+ public function unselect(TreeNode node) +
+ Deselect a node. +
+ Parameters: +
  • node : TreeNode
    The node to unselect
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by MultiSelectionModel.
+
+
+ +

Event Details

+
+ +
+

selectionchange

+ public event selectionchange +
+ Fires when the selected nodes change +
+ Subscribers will be called with the following parameters: +
  • this : MultiSelectionModel
  • nodes : Array
    Array of the selected nodes
+
+
+
This event is defined by MultiSelectionModel.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.tree.TreeLoader.html b/www/extras/yui-ext/docs/output/Ext.tree.TreeLoader.html new file mode 100644 index 000000000..00a5bda98 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.tree.TreeLoader.html @@ -0,0 +1,79 @@ + + + + Ext.tree.TreeLoader + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.tree.TreeLoader

+ + + + + +
Package:Ext.tree
Class:TreeLoader
Extends:Object
Defined In:TreeLoader.js
+
+
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + +
MethodDefined By
 createNode() : voidTreeLoader
Override this function for custom TreeNode node implementation
+ +

Public Events

+
This class has no public events.
+ +

Method Details

+
+ +
+

createNode

+ public function createNode() +
+ Override this function for custom TreeNode node implementation +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeLoader.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.tree.TreeNode.html b/www/extras/yui-ext/docs/output/Ext.tree.TreeNode.html new file mode 100644 index 000000000..a17e23894 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.tree.TreeNode.html @@ -0,0 +1,1988 @@ + + + + Ext.tree.TreeNode + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.tree.TreeNode

+ + + + + + +
Package:Ext.tree
Class:TreeNode
Extends:Node
Subclasses:AsyncTreeNode
Defined In:TreeNode.js
+
+
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 attributes : ObjectNode
The attributes supplied for the node. You can use this property to access any custom attributes you supplied.
 childNodes : ArrayNode
All child nodes of this node.
 disabled : BooleanTreeNode
True if this node is disabled.
 firstChild : NodeNode
The first direct child node of this node, or null if this node has no child nodes.
 id : StringNode
The node id.
 lastChild : NodeNode
The last direct child node of this node, or null if this node has no child nodes.
 nextSibling : NodeNode
The node immediately following this node in the tree, or null if there is no sibling node.
 parentNode : NodeNode
The parent node for this node.
 previousSibling : NodeNode
The node immediately preceding this node in the tree, or null if there is no sibling node.
 text : StringTreeNode
Read-only. The text for this node. To change it use setText().
 ui : TreeNodeUITreeNode
Read-only. The UI for this node
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 TreeNode(Object/String attributes)TreeNode
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 appendChild(Node/Array node) : NodeNode
Insert node(s) as the last child node of this node.
 bubble(Function fn, [Object scope], [Array args]) : voidNode
Bubbles up the tree from this node, calling the specified function with each node. The scope (this) of +function call...
 cascade(Function fn, [Object scope], [Array args]) : voidNode
Cascades down the tree from this node, calling the specified function with each node. The scope (this) of +function c...
 collapse([Boolean deep], [Boolean anim]) : voidTreeNode
Collapse this node.
 collapseChildNodes([Boolean deep]) : voidTreeNode
Collapse all child nodes
 contains(Node node) : BooleanNode
Returns true if this node is an ancestor (at any point) of the passed node.
 disable() : voidTreeNode
Disables this node
 eachChild(Function fn, [Object scope], [Array args]) : voidNode
Interates the child nodes of this node, calling the specified function with each node. The scope (this) of +function ...
 enable() : voidTreeNode
Enables this node
 ensureVisible() : voidTreeNode
Ensures all parent nodes are expanded
 expand([Boolean deep], [Boolean anim], [Function callback]) : voidTreeNode
Expand this node.
 expandChildNodes([Boolean deep]) : voidTreeNode
Expand all child nodes
 findChild(String attribute, Mixed value) : NodeNode
Finds the first child that has the attribute with the specified value.
 findChildBy(Function fn, [Object scope]) : NodeNode
Finds the first child by a custom function. The child matches if the function passed +returns true.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getDepth() : NumberNode
Returns depth of this node (the root node has a depth of 0)
 getOwnerTree() : TreeNode
Returns the tree this node is in.
 getPath([String attr]) : StringNode
Returns the path for this node. The path can be used to expand or select this node programmatically.
 getUI() : TreeNodeUITreeNode
Returns the UI object for this node
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 indexOf(Node node) : NumberNode
Returns the index of a child node
 insertBefore(Node node, Node refNode) : NodeNode
Inserts the first node before the second node in this nodes childNodes collection.
 isAncestor(Node node) : BooleanNode
Returns true if the passed node is an ancestor (at any point) of this node.
 isExpanded() : BooleanTreeNode
Returns true if this node is expanded
 isFirst() : BooleanNode
Returns true if this node is the first child of its parent
 isLast() : BooleanNode
Returns true if this node is the last child of its parent
 isLeaf() : BooleanNode
Returns true if this node is a leaf
 isSelected() : BooleanTreeNode
Returns true if this node is selected
 item(Number index) : NodeNode
Returns the child node at the specified index.
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeChild(Node node) : NodeNode
Removes a child node from this node.
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 replaceChild(Node newChild, Node oldChild) : NodeNode
Replaces one child node in this node with another.
 select() : voidTreeNode
Triggers selection of this node
 setText(String text) : voidTreeNode
Sets the text for this node
 sort(Function fn, [Object scope]) : voidNode
Sorts this nodes children using the supplied sort function
 toggle() : voidTreeNode
Toggles expanded/collapsed state of the node
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
 unselect() : voidTreeNode
Triggers deselection of this node
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 append : (Tree tree, Node this, Node node, Number index)Node
Fires when a new child node is appended
 beforeappend : (Tree tree, Node this, Node node)Node
Fires before a new child is appended, return false to cancel the append.
 beforechildrenrendered : (Node this)TreeNode
Fires right before the child nodes for this node are rendered
 beforeclick : (Node this, Ext.EventObject e)TreeNode
Fires before click processing. Return false to cancel the default action.
 beforecollapse : (Node this, Boolean deep, Boolean anim)TreeNode
Fires before this node is collapsed, return false to cancel.
 beforeexpand : (Node this, Boolean deep, Boolean anim)TreeNode
Fires before this node is expanded, return false to cancel.
 beforeinsert : (Tree tree, Node this, Node node, Node refNode)Node
Fires before a new child is inserted, return false to cancel the insert.
 beforemove : (Tree tree, Node this, Node oldParent, Node newParent, Number index)Node
Fires before this node is moved to a new location in the tree. Return false to cancel the move.
 beforeremove : (Tree tree, Node this, Node node)Node
Fires before a child is removed, return false to cancel the remove.
 click : (Node this, Ext.EventObject e)TreeNode
Fires when this node is clicked
 collapse : (Node this)TreeNode
Fires when this node is collapsed
 contextmenu : (Node this, Ext.EventObject e)TreeNode
Fires when this node is right clicked
 dblclick : (Node this, Ext.EventObject e)TreeNode
Fires when this node is double clicked
 disabledchange : (Node this, Boolean disabled)TreeNode
Fires when the disabled status of this node changes
 expand : (Node this)TreeNode
Fires when this node is expanded
 insert : (Tree tree, Node this, Node node, Node refNode)Node
Fires when a new child node is inserted.
 move : (Tree tree, Node this, Node oldParent, Node newParent, Number index)Node
Fires when this node is moved to a new location in the tree
 remove : (Tree tree, Node this, Node node)Node
Fires when a child node is removed
 textchange : (Node this, String text, String oldText)TreeNode
Fires when the text for this node is changed
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 allowDrag : BooleanTreeNode
false to make this node undraggable if DD is on (defaults to true)
 allowDrop : BooleanTreeNode
false if this node cannot be drop on
 cls : StringTreeNode
A css class to be added to the node
 disabled : BooleanTreeNode
true to start the node disabled
 expanded : BooleanTreeNode
true to start the node expanded
 href : StringTreeNode
URL of the link used for the node (defaults to #)
 hrefTarget : StringTreeNode
target frame for the link
 icon : StringTreeNode
The path to an icon for the node. The preferred way to do this is to use the cls or iconCls attributes and add the ic...
 iconCls : StringTreeNode
A css class to be added to the nodes icon element for applying css background images
 id : StringNode
The id for this node. If one is not specified, one is generated.
 leaf : BooleanNode
true if this node is a leaf and does not have children
 qtip : StringTreeNode
An Ext QuickTip for the node
 singleClickExpand : BooleanTreeNode
True for single click expand on this node
 text : StringTreeNode
The text for this node
 uiProvider : FunctionTreeNode
A UI class to use for this node (defaults to Ext.tree.TreeNodeUI)
+

Property Details

+
+ +
+

attributes

+ public Object attributes +
+ The attributes supplied for the node. You can use this property to access any custom attributes you supplied.
+
This property is defined by Node.
+
+ +
+

childNodes

+ public Array childNodes +
+ All child nodes of this node.
+
This property is defined by Node.
+
+ +
+

disabled

+ public Boolean disabled +
+ True if this node is disabled.
+
This property is defined by TreeNode.
+
+ +
+

firstChild

+ public Node firstChild +
+ The first direct child node of this node, or null if this node has no child nodes.
+
This property is defined by Node.
+
+ +
+

id

+ public String id +
+ The node id.
+
This property is defined by Node.
+
+ +
+

lastChild

+ public Node lastChild +
+ The last direct child node of this node, or null if this node has no child nodes.
+
This property is defined by Node.
+
+ +
+

nextSibling

+ public Node nextSibling +
+ The node immediately following this node in the tree, or null if there is no sibling node.
+
This property is defined by Node.
+
+ +
+

parentNode

+ public Node parentNode +
+ The parent node for this node.
+
This property is defined by Node.
+
+ +
+

previousSibling

+ public Node previousSibling +
+ The node immediately preceding this node in the tree, or null if there is no sibling node.
+
This property is defined by Node.
+
+ +
+

text

+ public String text +
+ Read-only. The text for this node. To change it use setText().
+
This property is defined by TreeNode.
+
+ +
+

ui

+ public TreeNodeUI ui +
+ Read-only. The UI for this node
+
This property is defined by TreeNode.
+
+
+ + +

Constructor Details

+
+
+

TreeNode

+ public function TreeNode(Object/String attributes) +
+
+ Parameters: +
  • attributes : Object/String
    The attributes/config for the node or just a string with the text for the node
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

appendChild

+ public function appendChild(Node/Array node) +
+ Insert node(s) as the last child node of this node. +
+ Parameters: +
  • node : Node/Array
    The node or Array of nodes to append
+ Returns: +
    +
  • Node
    The appended node if single append, or null if an array was passed
  • +
+
+
+
This method is defined by Node.
+
+ +
+

bubble

+ public function bubble(Function fn, [Object scope], [Array args]) +
+ Bubbles up the tree from this node, calling the specified function with each node. The scope (this) of +function call will be the scope provided or the current node. The arguments to the function +will be the args provided or the current node. If the function returns false at any point, +the bubble is stopped. +
+ Parameters: +
  • fn : Function
    The function to call
  • scope : Object
    (optional) The scope of the function (defaults to current node)
  • args : Array
    (optional) The args to call the function with (default to passing the current node)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Node.
+
+ +
+

cascade

+ public function cascade(Function fn, [Object scope], [Array args]) +
+ Cascades down the tree from this node, calling the specified function with each node. The scope (this) of +function call will be the scope provided or the current node. The arguments to the function +will be the args provided or the current node. If the function returns false at any point, +the cascade is stopped on that branch. +
+ Parameters: +
  • fn : Function
    The function to call
  • scope : Object
    (optional) The scope of the function (defaults to current node)
  • args : Array
    (optional) The args to call the function with (default to passing the current node)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Node.
+
+ +
+

collapse

+ public function collapse([Boolean deep], [Boolean anim]) +
+ Collapse this node. +
+ Parameters: +
  • deep : Boolean
    (optional) True to collapse all children as well
  • anim : Boolean
    (optional) false to cancel the default animation
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

collapseChildNodes

+ public function collapseChildNodes([Boolean deep]) +
+ Collapse all child nodes +
+ Parameters: +
  • deep : Boolean
    (optional) true if the child nodes should also collapse their child nodes
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

contains

+ public function contains(Node node) +
+ Returns true if this node is an ancestor (at any point) of the passed node. +
+ Parameters: +
  • node : Node
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Node.
+
+ +
+

disable

+ public function disable() +
+ Disables this node +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

eachChild

+ public function eachChild(Function fn, [Object scope], [Array args]) +
+ Interates the child nodes of this node, calling the specified function with each node. The scope (this) of +function call will be the scope provided or the current node. The arguments to the function +will be the args provided or the current node. If the function returns false at any point, +the iteration stops. +
+ Parameters: +
  • fn : Function
    The function to call
  • scope : Object
    (optional) The scope of the function (defaults to current node)
  • args : Array
    (optional) The args to call the function with (default to passing the current node)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Node.
+
+ +
+

enable

+ public function enable() +
+ Enables this node +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

ensureVisible

+ public function ensureVisible() +
+ Ensures all parent nodes are expanded +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

expand

+ public function expand([Boolean deep], [Boolean anim], [Function callback]) +
+ Expand this node. +
+ Parameters: +
  • deep : Boolean
    (optional) True to expand all children as well
  • anim : Boolean
    (optional) false to cancel the default animation
  • callback : Function
    (optional) A callback to be called when expanding this node completes (does not wait for deep expand to complete). Called with 1 parameter, this node.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

expandChildNodes

+ public function expandChildNodes([Boolean deep]) +
+ Expand all child nodes +
+ Parameters: +
  • deep : Boolean
    (optional) true if the child nodes should also expand their child nodes
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

findChild

+ public function findChild(String attribute, Mixed value) +
+ Finds the first child that has the attribute with the specified value. +
+ Parameters: +
  • attribute : String
    The attribute name
  • value : Mixed
    The value to search for
+ Returns: +
    +
  • Node
    The found child or null if none was found
  • +
+
+
+
This method is defined by Node.
+
+ +
+

findChildBy

+ public function findChildBy(Function fn, [Object scope]) +
+ Finds the first child by a custom function. The child matches if the function passed +returns true. +
+ Parameters: +
  • fn : Function
  • scope : Object
    (optional)
+ Returns: +
    +
  • Node
    The found child or null if none was found
  • +
+
+
+
This method is defined by Node.
+
+ +
+

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.
+
+ +
+

getDepth

+ public function getDepth() +
+ Returns depth of this node (the root node has a depth of 0) +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Node.
+
+ +
+

getOwnerTree

+ public function getOwnerTree() +
+ Returns the tree this node is in. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Tree
  • +
+
+
+
This method is defined by Node.
+
+ +
+

getPath

+ public function getPath([String attr]) +
+ Returns the path for this node. The path can be used to expand or select this node programmatically. +
+ Parameters: +
  • attr : String
    (optional) The attr to use for the path (defaults to the node's id)
+ Returns: +
    +
  • String
    The path
  • +
+
+
+
This method is defined by Node.
+
+ +
+

getUI

+ public function getUI() +
+ Returns the UI object for this node +
+ Parameters: +
  • None.
+ Returns: +
    +
  • TreeNodeUI
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

indexOf

+ public function indexOf(Node node) +
+ Returns the index of a child node +
+ Parameters: +
  • node : Node
+ Returns: +
    +
  • Number
    The index of the node or -1 if it was not found
  • +
+
+
+
This method is defined by Node.
+
+ +
+

insertBefore

+ public function insertBefore(Node node, Node refNode) +
+ Inserts the first node before the second node in this nodes childNodes collection. +
+ Parameters: +
  • node : Node
    The node to insert
  • refNode : Node
    The node to insert before (if null the node is appended)
+ Returns: +
    +
  • Node
    The inserted node
  • +
+
+
+
This method is defined by Node.
+
+ +
+

isAncestor

+ public function isAncestor(Node node) +
+ Returns true if the passed node is an ancestor (at any point) of this node. +
+ Parameters: +
  • node : Node
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Node.
+
+ +
+

isExpanded

+ public function isExpanded() +
+ Returns true if this node is expanded +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

isFirst

+ public function isFirst() +
+ Returns true if this node is the first child of its parent +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Node.
+
+ +
+

isLast

+ public function isLast() +
+ Returns true if this node is the last child of its parent +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Node.
+
+ +
+

isLeaf

+ public function isLeaf() +
+ Returns true if this node is a leaf +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Node.
+
+ +
+

isSelected

+ public function isSelected() +
+ Returns true if this node is selected +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

item

+ public function item(Number index) +
+ Returns the child node at the specified index. +
+ Parameters: +
  • index : Number
+ Returns: +
    +
  • Node
  • +
+
+
+
This method is defined by Node.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

removeChild

+ public function removeChild(Node node) +
+ Removes a child node from this node. +
+ Parameters: +
  • node : Node
    The node to remove
+ Returns: +
    +
  • Node
    The removed node
  • +
+
+
+
This method is defined by Node.
+
+ +
+

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.
+
+ +
+

replaceChild

+ public function replaceChild(Node newChild, Node oldChild) +
+ Replaces one child node in this node with another. +
+ Parameters: +
  • newChild : Node
    The replacement node
  • oldChild : Node
    The node to replace
+ Returns: +
    +
  • Node
    The replaced node
  • +
+
+
+
This method is defined by Node.
+
+ +
+

select

+ public function select() +
+ Triggers selection of this node +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

setText

+ public function setText(String text) +
+ Sets the text for this node +
+ Parameters: +
  • text : String
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

sort

+ public function sort(Function fn, [Object scope]) +
+ Sorts this nodes children using the supplied sort function +
+ Parameters: +
  • fn : Function
  • scope : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Node.
+
+ +
+

toggle

+ public function toggle() +
+ Toggles expanded/collapsed state of the node +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+ +
+

unselect

+ public function unselect() +
+ Triggers deselection of this node +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreeNode.
+
+
+ +

Event Details

+
+ +
+

append

+ public event append +
+ Fires when a new child node is appended +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The newly appended node
  • index : Number
    The index of the newly appended node
+
+
+
This event is defined by Node.
+
+ +
+

beforeappend

+ public event beforeappend +
+ Fires before a new child is appended, return false to cancel the append. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The child node to be appended
+
+
+
This event is defined by Node.
+
+ +
+

beforechildrenrendered

+ public event beforechildrenrendered +
+ Fires right before the child nodes for this node are rendered +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
+
+
+
This event is defined by TreeNode.
+
+ +
+

beforeclick

+ public event beforeclick +
+ Fires before click processing. Return false to cancel the default action. +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by TreeNode.
+
+ +
+

beforecollapse

+ public event beforecollapse +
+ Fires before this node is collapsed, return false to cancel. +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
  • deep : Boolean
  • anim : Boolean
+
+
+
This event is defined by TreeNode.
+
+ +
+

beforeexpand

+ public event beforeexpand +
+ Fires before this node is expanded, return false to cancel. +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
  • deep : Boolean
  • anim : Boolean
+
+
+
This event is defined by TreeNode.
+
+ +
+

beforeinsert

+ public event beforeinsert +
+ Fires before a new child is inserted, return false to cancel the insert. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The child node to be inserted
  • refNode : Node
    The child node the node is being inserted before
+
+
+
This event is defined by Node.
+
+ +
+

beforemove

+ public event beforemove +
+ Fires before this node is moved to a new location in the tree. Return false to cancel the move. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • oldParent : Node
    The parent of this node
  • newParent : Node
    The new parent this node is moving to
  • index : Number
    The index it is being moved to
+
+
+
This event is defined by Node.
+
+ +
+

beforeremove

+ public event beforeremove +
+ Fires before a child is removed, return false to cancel the remove. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The child node to be removed
+
+
+
This event is defined by Node.
+
+ +
+

click

+ public event click +
+ Fires when this node is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by TreeNode.
+
+ +
+

collapse

+ public event collapse +
+ Fires when this node is collapsed +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
+
+
+
This event is defined by TreeNode.
+
+ +
+

contextmenu

+ public event contextmenu +
+ Fires when this node is right clicked +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by TreeNode.
+
+ +
+

dblclick

+ public event dblclick +
+ Fires when this node is double clicked +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by TreeNode.
+
+ +
+

disabledchange

+ public event disabledchange +
+ Fires when the disabled status of this node changes +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
  • disabled : Boolean
+
+
+
This event is defined by TreeNode.
+
+ +
+

expand

+ public event expand +
+ Fires when this node is expanded +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
+
+
+
This event is defined by TreeNode.
+
+ +
+

insert

+ public event insert +
+ Fires when a new child node is inserted. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The child node inserted
  • refNode : Node
    The child node the node was inserted before
+
+
+
This event is defined by Node.
+
+ +
+

move

+ public event move +
+ Fires when this node is moved to a new location in the tree +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • oldParent : Node
    The old parent of this node
  • newParent : Node
    The new parent of this node
  • index : Number
    The index it was moved to
+
+
+
This event is defined by Node.
+
+ +
+

remove

+ public event remove +
+ Fires when a child node is removed +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • this : Node
    This node
  • node : Node
    The removed node
+
+
+
This event is defined by Node.
+
+ +
+

textchange

+ public event textchange +
+ Fires when the text for this node is changed +
+ Subscribers will be called with the following parameters: +
  • this : Node
    This node
  • text : String
    The new text
  • oldText : String
    The old text
+
+
+
This event is defined by TreeNode.
+
+
+

Config Details

+
+ +
+

allowDrag

+ allowDrag : Boolean +
+ false to make this node undraggable if DD is on (defaults to true)
+
This config option is defined by TreeNode.
+
+ +
+

allowDrop

+ allowDrop : Boolean +
+ false if this node cannot be drop on
+
This config option is defined by TreeNode.
+
+ +
+

cls

+ cls : String +
+ A css class to be added to the node
+
This config option is defined by TreeNode.
+
+ +
+

disabled

+ disabled : Boolean +
+ true to start the node disabled
+
This config option is defined by TreeNode.
+
+ +
+

expanded

+ expanded : Boolean +
+ true to start the node expanded
+
This config option is defined by TreeNode.
+
+ +
+

href

+ href : String +
+ URL of the link used for the node (defaults to #)
+
This config option is defined by TreeNode.
+
+ +
+

hrefTarget

+ hrefTarget : String +
+ target frame for the link
+
This config option is defined by TreeNode.
+
+ +
+

icon

+ icon : String +
+ The path to an icon for the node. The preferred way to do this is to use the cls or iconCls attributes and add the icon via a CSS background image.
+
This config option is defined by TreeNode.
+
+ +
+

iconCls

+ iconCls : String +
+ A css class to be added to the nodes icon element for applying css background images
+
This config option is defined by TreeNode.
+
+ +
+

id

+ id : String +
+ The id for this node. If one is not specified, one is generated.
+
This config option is defined by Node.
+
+ +
+

leaf

+ leaf : Boolean +
+ true if this node is a leaf and does not have children
+
This config option is defined by Node.
+
+ +
+

qtip

+ qtip : String +
+ An Ext QuickTip for the node
+
This config option is defined by TreeNode.
+
+ +
+

singleClickExpand

+ singleClickExpand : Boolean +
+ True for single click expand on this node
+
This config option is defined by TreeNode.
+
+ +
+

text

+ text : String +
+ The text for this node
+
This config option is defined by TreeNode.
+
+ +
+

uiProvider

+ uiProvider : Function +
+ A UI class to use for this node (defaults to Ext.tree.TreeNodeUI)
+
This config option is defined by TreeNode.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.tree.TreePanel.html b/www/extras/yui-ext/docs/output/Ext.tree.TreePanel.html new file mode 100644 index 000000000..503e68164 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.tree.TreePanel.html @@ -0,0 +1,1521 @@ + + + + Ext.tree.TreePanel + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.tree.TreePanel

+ + + + + +
Package:Ext.tree
Class:TreePanel
Extends:Tree
Defined In:TreePanel.js
+
+
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 dragZone : Ext.tree.TreeDragZoneTreePanel
The dragZone used by this tree if drag is enabled
 dropZone : Ext.tree.TreeDropZoneTreePanel
The dropZone used by this tree if drop is enabled
 id : ObjectTreePanel
Read-only. The id of the container element becomes this TreePanel's id.
 root : NodeTree
The root node for this tree
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 TreePanel(String/HTMLElement/Element el, Object config)TreePanel
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 collapseAll() : voidTreePanel
Collapse all nodes
 expandAll() : voidTreePanel
Expand all nodes
 expandPath(String path, [String attr], [Function callback]) : voidTreePanel
Expands a specified path in this TreePanel. A path can be retrieved from a node with Ext.data.Node.getPath
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getEl() : voidTreePanel
Returns the container element for this TreePanel
 getLoader() : voidTreePanel
Returns the default TreeLoader for this TreePanel
 getNodeById(String id) : NodeTree
Gets a node in this tree by its id
 getRootNode() : NodeTree
Returns this root node for this tree
 getSelectionModel() : voidTreePanel
Returns the selection model used by this TreePanel
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render() : voidTreePanel
Trigger rendering of this TreePanel
 selectPath(String path, [String attr], [Function callback]) : voidTreePanel
Selects the node in this tree at the specified path. A path can be retrieved from a node with Ext.data.Node.getPath
 setRootNode(Node node) : NodeTree
Sets the root node for this tree
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 append : (Tree tree, Node parent, Node node, Number index)Tree
Fires when a new child node is appended to a node in this tree.
 beforeappend : (Tree tree, Node parent, Node node)Tree
Fires before a new child is appended to a node in this tree, return false to cancel the append.
 beforechildrenrendered : (Node node)TreePanel
Fires right before the child nodes for a node are rendered
 beforeclick : (Node node, Ext.EventObject e)TreePanel
Fires before click processing on a node. Return false to cancel the default action.
 beforecollapse : (Node node, Boolean deep, Boolean anim)TreePanel
Fires before a node is collapsed, return false to cancel.
 beforeexpand : (Node node, Boolean deep, Boolean anim)TreePanel
Fires before a node is expanded, return false to cancel.
 beforeinsert : (Tree tree, Node parent, Node node, Node refNode)Tree
Fires before a new child is inserted in a node in this tree, return false to cancel the insert.
 beforeload : (Node node)TreePanel
Fires before a node is loaded, return false to cancel
 beforemove : (Tree tree, Node node, Node oldParent, Node newParent, Number index)Tree
Fires before a node is moved to a new location in the tree. Return false to cancel the move.
 beforenodedrop : (Object dropEvent)TreePanel
Fires when a DD object is dropped on a node in this tree for preprocessing. Return false to cancel the drop. The drop...
 beforeremove : (Tree tree, Node parent, Node node)Tree
Fires before a child is removed from a node in this tree, return false to cancel the remove.
 click : (Node node, Ext.EventObject e)TreePanel
Fires when a node is clicked
 collapse : (Node node)TreePanel
Fires when a node is collapsed
 contextmenu : (Node node, Ext.EventObject e)TreePanel
Fires when a node is right clicked
 dblclick : (Node node, Ext.EventObject e)TreePanel
Fires when a node is double clicked
 disabledchange : (Node node, Boolean disabled)TreePanel
Fires when the disabled status of a node changes
 dragdrop : (Ext.tree.TreePanel this, Ext.tree.TreeNode node, DD dd, event e)TreePanel
Fires when a dragged node is dropped on a valid DD target
 enddrag : (Ext.tree.TreePanel this, Ext.tree.TreeNode node, event e)TreePanel
Fires when a drag operation is complete
 expand : (Node node)TreePanel
Fires when a node is expanded
 insert : (Tree tree, Node parent, Node node, Node refNode)Tree
Fires when a new child node is inserted in a node in this tree.
 load : (Node node)TreePanel
Fires when a node is loaded
 move : (Tree tree, Node node, Node oldParent, Node newParent, Number index)Tree
Fires when a node is moved to a new location in the tree
 nodedragover : (Object dragOverEvent)TreePanel
Fires when a tree node is being targeted for a drag drop, return false to signal drop not allowed. The dragOverEvent +...
 nodedrop : (Object dropEvent)TreePanel
Fires after a DD object is dropped on a node in this tree. The dropEvent +passed to handlers has the following propert...
 remove : (Tree tree, Node parent, Node node)Tree
Fires when a child node is removed from a node in this tree.
 startdrag : (Ext.tree.TreePanel this, Ext.tree.TreeNode node, event e)TreePanel
Fires when a node starts being dragged
 textchange : (Node node, String text, String oldText)TreePanel
Fires when the text for a node is changed
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 animate : BooleanTreePanel
true to enable animated expand/collapse
 containerScroll : BooleanTreePanel
true to register this container with ScrollManager
 ddAppendOnly : StringTreePanel
True if the tree should only allow append drops (use for trees which are sorted)
 ddGroup : StringTreePanel
The DD group this TreePanel belongs to
 ddScroll : BooleanTreePanel
true to enable YUI body scrolling
 dragConfig : ObjectTreePanel
Custom config to pass to the Ext.tree.TreeDragZone instance
 dropConfig : ObjectTreePanel
Custom config to pass to the Ext.tree.TreeDropZone instance
 enableDD : BooleanTreePanel
true to enable drag and drop
 enableDrag : BooleanTreePanel
true to enable just drag
 enableDrop : BooleanTreePanel
true to enable just drop
 hlColor : StringTreePanel
The color of the node highlight (defaults to C3DAF9)
 hlDrop : BooleanTreePanel
false to disable node highlight on drop (defaults to true)
 lines : BooleanTreePanel
false to disable tree lines (defaults to true)
 loader : BooleanTreePanel
A TreeLoader for use with this TreePanel
 rootVisible : BooleanTreePanel
false to hide the root node (defaults to true)
 selModel : BooleanTreePanel
A tree selection model to use with this TreePanel (defaults to a Ext.tree.DefaultSelectionModel)
 singleExpand : BooleanTreePanel
true if only 1 node per branch may be expanded
+

Property Details

+
+ +
+

dragZone

+ public Ext.tree.TreeDragZone dragZone +
+ The dragZone used by this tree if drag is enabled
+
This property is defined by TreePanel.
+
+ +
+

dropZone

+ public Ext.tree.TreeDropZone dropZone +
+ The dropZone used by this tree if drop is enabled
+
This property is defined by TreePanel.
+
+ +
+

id

+ public Object id +
+ Read-only. The id of the container element becomes this TreePanel's id.
+
This property is defined by TreePanel.
+
+ +
+

root

+ public Node root +
+ The root node for this tree
+
This property is defined by Tree.
+
+
+ + +

Constructor Details

+
+
+

TreePanel

+ public function TreePanel(String/HTMLElement/Element el, Object config) +
+
+ Parameters: +
  • el : String/HTMLElement/Element
    The container element
  • config : Object
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

collapseAll

+ public function collapseAll() +
+ Collapse all nodes +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreePanel.
+
+ +
+

expandAll

+ public function expandAll() +
+ Expand all nodes +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreePanel.
+
+ +
+

expandPath

+ public function expandPath(String path, [String attr], [Function callback]) +
+ Expands a specified path in this TreePanel. A path can be retrieved from a node with Ext.data.Node.getPath +
+ Parameters: +
  • path : String
  • attr : String
    (optional) The attribute used in the path (see Ext.data.Node.getPath for more info)
  • callback : Function
    (optional) The callback to call when the expand is complete. The callback will be called with (bSuccess, oLastNode) where bSuccess is if the expand was successful and oLastNode is the last node that was expanded.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreePanel.
+
+ +
+

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 container element for this TreePanel +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreePanel.
+
+ +
+

getLoader

+ public function getLoader() +
+ Returns the default TreeLoader for this TreePanel +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreePanel.
+
+ +
+

getNodeById

+ public function getNodeById(String id) +
+ Gets a node in this tree by its id +
+ Parameters: +
  • id : String
+ Returns: +
    +
  • Node
  • +
+
+
+
This method is defined by Tree.
+
+ +
+

getRootNode

+ public function getRootNode() +
+ Returns this root node for this tree +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Node
  • +
+
+
+
This method is defined by Tree.
+
+ +
+

getSelectionModel

+ public function getSelectionModel() +
+ Returns the selection model used by this TreePanel +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreePanel.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

render

+ public function render() +
+ Trigger rendering of this TreePanel +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreePanel.
+
+ +
+

selectPath

+ public function selectPath(String path, [String attr], [Function callback]) +
+ Selects the node in this tree at the specified path. A path can be retrieved from a node with Ext.data.Node.getPath +
+ Parameters: +
  • path : String
  • attr : String
    (optional) The attribute used in the path (see Ext.data.Node.getPath for more info)
  • callback : Function
    (optional) The callback to call when the selection is complete. The callback will be called with (bSuccess, oSelNode) where bSuccess is if the selection was successful and oSelNode is the selected node.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TreePanel.
+
+ +
+

setRootNode

+ public function setRootNode(Node node) +
+ Sets the root node for this tree +
+ Parameters: +
  • node : Node
+ Returns: +
    +
  • Node
  • +
+
+
+
This method is defined by Tree.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

append

+ public event append +
+ Fires when a new child node is appended to a node in this tree. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • parent : Node
    The parent node
  • node : Node
    The newly appended node
  • index : Number
    The index of the newly appended node
+
+
+
This event is defined by Tree.
+
+ +
+

beforeappend

+ public event beforeappend +
+ Fires before a new child is appended to a node in this tree, return false to cancel the append. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • parent : Node
    The parent node
  • node : Node
    The child node to be appended
+
+
+
This event is defined by Tree.
+
+ +
+

beforechildrenrendered

+ public event beforechildrenrendered +
+ Fires right before the child nodes for a node are rendered +
+ Subscribers will be called with the following parameters: +
  • node : Node
    The node
+
+
+
This event is defined by TreePanel.
+
+ +
+

beforeclick

+ public event beforeclick +
+ Fires before click processing on a node. Return false to cancel the default action. +
+ Subscribers will be called with the following parameters: +
  • node : Node
    The node
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by TreePanel.
+
+ +
+

beforecollapse

+ public event beforecollapse +
+ Fires before a node is collapsed, return false to cancel. +
+ Subscribers will be called with the following parameters: +
  • node : Node
    The node
  • deep : Boolean
  • anim : Boolean
+
+
+
This event is defined by TreePanel.
+
+ +
+

beforeexpand

+ public event beforeexpand +
+ Fires before a node is expanded, return false to cancel. +
+ Subscribers will be called with the following parameters: +
  • node : Node
    The node
  • deep : Boolean
  • anim : Boolean
+
+
+
This event is defined by TreePanel.
+
+ +
+

beforeinsert

+ public event beforeinsert +
+ Fires before a new child is inserted in a node in this tree, return false to cancel the insert. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • parent : Node
    The parent node
  • node : Node
    The child node to be inserted
  • refNode : Node
    The child node the node is being inserted before
+
+
+
This event is defined by Tree.
+
+ +
+

beforeload

+ public event beforeload +
+ Fires before a node is loaded, return false to cancel +
+ Subscribers will be called with the following parameters: +
  • node : Node
    The node being loaded
+
+
+
This event is defined by TreePanel.
+
+ +
+

beforemove

+ public event beforemove +
+ Fires before a node is moved to a new location in the tree. Return false to cancel the move. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • node : Node
    The node being moved
  • oldParent : Node
    The parent of the node
  • newParent : Node
    The new parent the node is moving to
  • index : Number
    The index it is being moved to
+
+
+
This event is defined by Tree.
+
+ +
+

beforenodedrop

+ public event beforenodedrop +
+ Fires when a DD object is dropped on a node in this tree for preprocessing. Return false to cancel the drop. The dropEvent +passed to handlers has the following properties:
+
    +
  • tree - The TreePanel
  • +
  • target - The node being targeted for the drop
  • +
  • data - The drag data from the drag source
  • +
  • point - The point of the drop - append, above or below
  • +
  • source - The drag source
  • +
  • rawEvent - Raw mouse event
  • +
  • dropNode - Drop node(s) provided by the source OR you can supply node(s) +to be inserted by setting them on this object.
  • +
  • cancel - Set this to true to cancel the drop.
  • +
+
+ Subscribers will be called with the following parameters: +
  • dropEvent : Object
+
+
+
This event is defined by TreePanel.
+
+ +
+

beforeremove

+ public event beforeremove +
+ Fires before a child is removed from a node in this tree, return false to cancel the remove. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • parent : Node
    The parent node
  • node : Node
    The child node to be removed
+
+
+
This event is defined by Tree.
+
+ +
+

click

+ public event click +
+ Fires when a node is clicked +
+ Subscribers will be called with the following parameters: +
  • node : Node
    The node
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by TreePanel.
+
+ +
+

collapse

+ public event collapse +
+ Fires when a node is collapsed +
+ Subscribers will be called with the following parameters: +
  • node : Node
    The node
+
+
+
This event is defined by TreePanel.
+
+ +
+

contextmenu

+ public event contextmenu +
+ Fires when a node is right clicked +
+ Subscribers will be called with the following parameters: +
  • node : Node
    The node
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by TreePanel.
+
+ +
+

dblclick

+ public event dblclick +
+ Fires when a node is double clicked +
+ Subscribers will be called with the following parameters: +
  • node : Node
    The node
  • e : Ext.EventObject
    The event object
+
+
+
This event is defined by TreePanel.
+
+ +
+

disabledchange

+ public event disabledchange +
+ Fires when the disabled status of a node changes +
+ Subscribers will be called with the following parameters: +
  • node : Node
    The node
  • disabled : Boolean
+
+
+
This event is defined by TreePanel.
+
+ +
+

dragdrop

+ public event dragdrop +
+ Fires when a dragged node is dropped on a valid DD target +
+ Subscribers will be called with the following parameters: +
  • this : Ext.tree.TreePanel
  • node : Ext.tree.TreeNode
  • dd : DD
    The dd it was dropped on
  • e : event
    The raw browser event
+
+
+
This event is defined by TreePanel.
+
+ +
+

enddrag

+ public event enddrag +
+ Fires when a drag operation is complete +
+ Subscribers will be called with the following parameters: +
  • this : Ext.tree.TreePanel
  • node : Ext.tree.TreeNode
  • e : event
    The raw browser event
+
+
+
This event is defined by TreePanel.
+
+ +
+

expand

+ public event expand +
+ Fires when a node is expanded +
+ Subscribers will be called with the following parameters: +
  • node : Node
    The node
+
+
+
This event is defined by TreePanel.
+
+ +
+

insert

+ public event insert +
+ Fires when a new child node is inserted in a node in this tree. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • parent : Node
    The parent node
  • node : Node
    The child node inserted
  • refNode : Node
    The child node the node was inserted before
+
+
+
This event is defined by Tree.
+
+ +
+

load

+ public event load +
+ Fires when a node is loaded +
+ Subscribers will be called with the following parameters: +
  • node : Node
    The node that was loaded
+
+
+
This event is defined by TreePanel.
+
+ +
+

move

+ public event move +
+ Fires when a node is moved to a new location in the tree +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • node : Node
    The node moved
  • oldParent : Node
    The old parent of this node
  • newParent : Node
    The new parent of this node
  • index : Number
    The index it was moved to
+
+
+
This event is defined by Tree.
+
+ +
+

nodedragover

+ public event nodedragover +
+ Fires when a tree node is being targeted for a drag drop, return false to signal drop not allowed. The dragOverEvent +passed to handlers has the following properties:
+
    +
  • tree - The TreePanel
  • +
  • target - The node being targeted for the drop
  • +
  • data - The drag data from the drag source
  • +
  • point - The point of the drop - append, above or below
  • +
  • source - The drag source
  • +
  • rawEvent - Raw mouse event
  • +
  • dropNode - Drop node(s) provided by the source.
  • +
  • cancel - Set this to true to signal drop not allowed.
  • +
+
+ Subscribers will be called with the following parameters: +
  • dragOverEvent : Object
+
+
+
This event is defined by TreePanel.
+
+ +
+

nodedrop

+ public event nodedrop +
+ Fires after a DD object is dropped on a node in this tree. The dropEvent +passed to handlers has the following properties:
+
    +
  • tree - The TreePanel
  • +
  • target - The node being targeted for the drop
  • +
  • data - The drag data from the drag source
  • +
  • point - The point of the drop - append, above or below
  • +
  • source - The drag source
  • +
  • rawEvent - Raw mouse event
  • +
  • dropNode - Dropped node(s).
  • +
+
+ Subscribers will be called with the following parameters: +
  • dropEvent : Object
+
+
+
This event is defined by TreePanel.
+
+ +
+

remove

+ public event remove +
+ Fires when a child node is removed from a node in this tree. +
+ Subscribers will be called with the following parameters: +
  • tree : Tree
    The owner tree
  • parent : Node
    The parent node
  • node : Node
    The child node removed
+
+
+
This event is defined by Tree.
+
+ +
+

startdrag

+ public event startdrag +
+ Fires when a node starts being dragged +
+ Subscribers will be called with the following parameters: +
  • this : Ext.tree.TreePanel
  • node : Ext.tree.TreeNode
  • e : event
    The raw browser event
+
+
+
This event is defined by TreePanel.
+
+ +
+

textchange

+ public event textchange +
+ Fires when the text for a node is changed +
+ Subscribers will be called with the following parameters: +
  • node : Node
    The node
  • text : String
    The new text
  • oldText : String
    The old text
+
+
+
This event is defined by TreePanel.
+
+
+

Config Details

+
+ +
+

animate

+ animate : Boolean +
+ true to enable animated expand/collapse
+
This config option is defined by TreePanel.
+
+ +
+

containerScroll

+ containerScroll : Boolean +
+ true to register this container with ScrollManager
+
This config option is defined by TreePanel.
+
+ +
+

ddAppendOnly

+ ddAppendOnly : String +
+ True if the tree should only allow append drops (use for trees which are sorted)
+
This config option is defined by TreePanel.
+
+ +
+

ddGroup

+ ddGroup : String +
+ The DD group this TreePanel belongs to
+
This config option is defined by TreePanel.
+
+ +
+

ddScroll

+ ddScroll : Boolean +
+ true to enable YUI body scrolling
+
This config option is defined by TreePanel.
+
+ +
+

dragConfig

+ dragConfig : Object +
+ Custom config to pass to the Ext.tree.TreeDragZone instance
+
This config option is defined by TreePanel.
+
+ +
+

dropConfig

+ dropConfig : Object +
+ Custom config to pass to the Ext.tree.TreeDropZone instance
+
This config option is defined by TreePanel.
+
+ +
+

enableDD

+ enableDD : Boolean +
+ true to enable drag and drop
+
This config option is defined by TreePanel.
+
+ +
+

enableDrag

+ enableDrag : Boolean +
+ true to enable just drag
+
This config option is defined by TreePanel.
+
+ +
+

enableDrop

+ enableDrop : Boolean +
+ true to enable just drop
+
This config option is defined by TreePanel.
+
+ +
+

hlColor

+ hlColor : String +
+ The color of the node highlight (defaults to C3DAF9)
+
This config option is defined by TreePanel.
+
+ +
+

hlDrop

+ hlDrop : Boolean +
+ false to disable node highlight on drop (defaults to true)
+
This config option is defined by TreePanel.
+
+ +
+

lines

+ lines : Boolean +
+ false to disable tree lines (defaults to true)
+
This config option is defined by TreePanel.
+
+ +
+

loader

+ loader : Boolean +
+ A TreeLoader for use with this TreePanel
+
This config option is defined by TreePanel.
+
+ +
+

rootVisible

+ rootVisible : Boolean +
+ false to hide the root node (defaults to true)
+
This config option is defined by TreePanel.
+
+ +
+

selModel

+ selModel : Boolean +
+ A tree selection model to use with this TreePanel (defaults to a Ext.tree.DefaultSelectionModel)
+
This config option is defined by TreePanel.
+
+ +
+

singleExpand

+ singleExpand : Boolean +
+ true if only 1 node per branch may be expanded
+
This config option is defined by TreePanel.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.tree.TreeSorter.html b/www/extras/yui-ext/docs/output/Ext.tree.TreeSorter.html new file mode 100644 index 000000000..fb73d6b8d --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.tree.TreeSorter.html @@ -0,0 +1,181 @@ + + + + Ext.tree.TreeSorter + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.tree.TreeSorter

+ + + + + +
Package:Ext.tree
Class:TreeSorter
Extends:Object
Defined In:TreeSorter.js
+
+ Provides sorting of nodes in a TreePanel
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + +
MethodDefined By
 TreeSorter(TreePanel tree, Object config)TreeSorter
+ +

Public Events

+
This class has no public events.
+

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 caseSensitive : BooleanTreeSorter
true for case sensitive sort (defaults to false)
 dir : StringTreeSorter
The direction to sort (asc or desc) (defaults to asc)
 folderSort : BooleanTreeSorter
True to sort leaf nodes under non leaf nodes
 leafAttr : StringTreeSorter
The attribute used to determine leaf nodes in folder sort (defaults to "leaf")
 property : StringTreeSorter
The named attribute on the node to sort by (defaults to text)
 sortType : FunctionTreeSorter
A custom "casting" function used to convert node values before sorting
+ + +

Constructor Details

+
+
+

TreeSorter

+ public function TreeSorter(TreePanel tree, Object config) +
+
+ Parameters: +
  • tree : TreePanel
  • config : Object
+
+
+
+
+ + +

Config Details

+
+ +
+

caseSensitive

+ caseSensitive : Boolean +
+ true for case sensitive sort (defaults to false)
+
This config option is defined by TreeSorter.
+
+ +
+

dir

+ dir : String +
+ The direction to sort (asc or desc) (defaults to asc)
+
This config option is defined by TreeSorter.
+
+ +
+

folderSort

+ folderSort : Boolean +
+ True to sort leaf nodes under non leaf nodes
+
This config option is defined by TreeSorter.
+
+ +
+

leafAttr

+ leafAttr : String +
+ The attribute used to determine leaf nodes in folder sort (defaults to "leaf")
+
This config option is defined by TreeSorter.
+
+ +
+

property

+ property : String +
+ The named attribute on the node to sort by (defaults to text)
+
This config option is defined by TreeSorter.
+
+ +
+

sortType

+ sortType : Function +
+ A custom "casting" function used to convert node values before sorting
+
This config option is defined by TreeSorter.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.util.CSS.html b/www/extras/yui-ext/docs/output/Ext.util.CSS.html new file mode 100644 index 000000000..5433adf06 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.util.CSS.html @@ -0,0 +1,231 @@ + + + + Ext.util.CSS + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.util.CSS

+ + + + + +
Package:Ext.util
Class:CSS
Extends:Object
Defined In:CSS.js
+
+ Utility class for manipulating CSS rules

This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 createStyleSheet(String cssText) : StyleSheetCSS
Very simple dynamic creation of stylesheets from a text blob of rules. The text will wrapped in a style +tag and appe...
 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
 refreshCache() : ObjectCSS
Refresh the rule cache if you have dynamically added stylesheets
 removeStyleSheet(String id) : voidCSS
Removes a style or link tag by id
 swapStyleSheet(String id, String url) : voidCSS
Dynamically swaps an existing stylesheet reference for a new one
 updateRule(String/Array selector, String property, String value) : BooleanCSS
Updates a rule property
+ +

Public Events

+
This class has no public events.
+ +

Method Details

+
+ +
+

createStyleSheet

+ public function createStyleSheet(String cssText) +
+ Very simple dynamic creation of stylesheets from a text blob of rules. The text will wrapped in a style +tag and appended to the HEAD of the document. +
+ Parameters: +
  • cssText : String
    The text containing the css rules
+ Returns: +
    +
  • StyleSheet
  • +
+
+
+
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 if you have recently updated any rules or added styles dynamically
+ 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.
+
+ +
+

refreshCache

+ public function refreshCache() +
+ Refresh the rule cache if you have dynamically added stylesheets +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Object
    An object (hash) of rules indexed by selector
  • +
+
+
+
This method is defined by CSS.
+
+ +
+

removeStyleSheet

+ public function removeStyleSheet(String id) +
+ Removes a style or link tag by id +
+ Parameters: +
  • id : String
    The id of the tag
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CSS.
+
+ +
+

swapStyleSheet

+ public function swapStyleSheet(String id, String url) +
+ Dynamically swaps an existing stylesheet reference for a new one +
+ Parameters: +
  • id : String
    The id of an existing link tag to remove
  • url : String
    The href of the new stylesheet to include
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.util.ClickRepeater.html b/www/extras/yui-ext/docs/output/Ext.util.ClickRepeater.html new file mode 100644 index 000000000..7ad1e12e0 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.util.ClickRepeater.html @@ -0,0 +1,478 @@ + + + + Ext.util.ClickRepeater + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.util.ClickRepeater

+ + + + + +
Package:Ext.util
Class:ClickRepeater
Extends:Observable
Defined In:ClickRepeater.js
+
+ A wrapper class which can be applied to any element. Fires a "click" event while the + mouse is pressed. The interval between firings may be specified in the config but + defaults to 10 milliseconds. + + Optionally, a CSS class may be applied to the element during the time it is pressed.
+
+ Properties +   -  Methods +   -  Events +   -  Config Options +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 ClickRepeater(String/HTMLElement/Element el, Object config)ClickRepeater
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 click : (Ext.util.ClickRepeater this)ClickRepeater
Fires on a specified interval during the time the element is pressed.
 mousedown : (Ext.util.ClickRepeater this)ClickRepeater
Fires when the mouse button is depressed.
 mouseup : (Ext.util.ClickRepeater this)ClickRepeater
Fires when the mouse key is released.
+ +

Config Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Config OptionsDefined By
 accelerate : BooleanClickRepeater
True if autorepeating should start slowly and accelerate. "interval" and "delay" are ignored. "immediate" is honored.
 delay : NumberClickRepeater
The initial delay before the repeating event begins firing. Similar to an autorepeat key delay.
 el : String/HTMLElement/ElementClickRepeater
The element to act as a button.
 interval : NumberClickRepeater
The interval between firings of the "click" event. Default 10 ms.
 pressClass : StringClickRepeater
A CSS class name to be applied to the element while pressed.
 preventDefault : BooleanClickRepeater
True to prevent the default click event
 stopDefault : BooleanClickRepeater
True to stop the default click event
+ + +

Constructor Details

+
+
+

ClickRepeater

+ public function ClickRepeater(String/HTMLElement/Element el, Object config) +
+
+ Parameters: +
  • el : String/HTMLElement/Element
    The element to listen on
  • config : Object
+
+
+
+
+ +

Method Details

+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

click

+ public event click +
+ Fires on a specified interval during the time the element is pressed. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.util.ClickRepeater
+
+
+
This event is defined by ClickRepeater.
+
+ +
+

mousedown

+ public event mousedown +
+ Fires when the mouse button is depressed. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.util.ClickRepeater
+
+
+
This event is defined by ClickRepeater.
+
+ +
+

mouseup

+ public event mouseup +
+ Fires when the mouse key is released. +
+ Subscribers will be called with the following parameters: +
  • this : Ext.util.ClickRepeater
+
+
+
This event is defined by ClickRepeater.
+
+
+

Config Details

+
+ +
+

accelerate

+ accelerate : Boolean +
+ True if autorepeating should start slowly and accelerate. "interval" and "delay" are ignored. "immediate" is honored.
+
This config option is defined by ClickRepeater.
+
+ +
+

delay

+ delay : Number +
+ The initial delay before the repeating event begins firing. Similar to an autorepeat key delay.
+
This config option is defined by ClickRepeater.
+
+ +
+

el

+ el : String/HTMLElement/Element +
+ The element to act as a button.
+
This config option is defined by ClickRepeater.
+
+ +
+

interval

+ interval : Number +
+ The interval between firings of the "click" event. Default 10 ms.
+
This config option is defined by ClickRepeater.
+
+ +
+

pressClass

+ pressClass : String +
+ A CSS class name to be applied to the element while pressed.
+
This config option is defined by ClickRepeater.
+
+ +
+

preventDefault

+ preventDefault : Boolean +
+ True to prevent the default click event
+
This config option is defined by ClickRepeater.
+
+ +
+

stopDefault

+ stopDefault : Boolean +
+ True to stop the default click event
+
This config option is defined by ClickRepeater.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.util.DelayedTask.html b/www/extras/yui-ext/docs/output/Ext.util.DelayedTask.html new file mode 100644 index 000000000..159f78e0a --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.util.DelayedTask.html @@ -0,0 +1,130 @@ + + + + Ext.util.DelayedTask + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.util.DelayedTask

+ + + + + +
Package:Ext.util
Class:DelayedTask
Extends:Object
Defined In:DelayedTask.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.
+
+ Properties +   -  Methods +   -  Events +
+ +

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.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.util.Format.html b/www/extras/yui-ext/docs/output/Ext.util.Format.html new file mode 100644 index 000000000..d1cb462d4 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.util.Format.html @@ -0,0 +1,354 @@ + + + + Ext.util.Format + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.util.Format

+ + + + + +
Package:Ext.util
Class:Format
Extends:Object
Defined In:Format.js
+
+ Reusable data formatting functions

This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 capitalize(String value) : StringFormat
Converts the first character only of a string to upper case
 date(Mixed value, [String format]) : StringFormat
Parse a value into a formatted date using the specified format pattern.
 dateRenderer(String format) : FunctionFormat
Returns a date rendering function that can be reused to apply a date format multiple times efficiently
 ellipsis(String value, Number length) : StringFormat
Truncate a string and add an ellipsis ('...') to the end if it exceeds the specified length
 htmlEncode(String value) : StringFormat
Convert certain characters (&, <, >, and ') to their HTML character equivalents for literal display in web pages.
 lowercase(String value) : StringFormat
Converts a string to all lower case letters
 stripTags(Mixed value) : StringFormat
Strips all HTML tags
 substr(String value, Number start, Number length) : StringFormat
Returns a substring from within an original string
 trim(String value) : StringFormat
Trims any whitespace from either side of a string
 undef(Mixed value) : MixedFormat
Checks a reference and converts it to empty string if it is undefined
 uppercase(String value) : StringFormat
Converts a string to all upper case letters
 usMoney(Number/String value) : StringFormat
Format a number as US currency
+ +

Public Events

+
This class has no public events.
+ +

Method Details

+
+ +
+

capitalize

+ public function capitalize(String value) +
+ Converts the first character only of a string to upper case +
+ Parameters: +
  • value : String
    The text to convert
+ Returns: +
    +
  • String
    The converted text
  • +
+
+
+
This method is defined by Format.
+
+ +
+

date

+ public function date(Mixed value, [String format]) +
+ Parse a value into a formatted date using the specified format pattern. +
+ Parameters: +
  • value : Mixed
    The value to format
  • format : String
    (optional) Any valid date format string (defaults to 'm/d/Y')
+ Returns: +
    +
  • String
    The formatted date string
  • +
+
+
+
This method is defined by Format.
+
+ +
+

dateRenderer

+ public function dateRenderer(String format) +
+ Returns a date rendering function that can be reused to apply a date format multiple times efficiently +
+ Parameters: +
  • format : String
    Any valid date format string
+ Returns: +
    +
  • Function
    The date formatting function
  • +
+
+
+
This method is defined by Format.
+
+ +
+

ellipsis

+ public function ellipsis(String value, Number length) +
+ Truncate a string and add an ellipsis ('...') to the end if it exceeds the specified length +
+ Parameters: +
  • value : String
    The string to truncate
  • length : Number
    The maximum length to allow before truncating
+ Returns: +
    +
  • String
    The converted text
  • +
+
+
+
This method is defined by Format.
+
+ +
+

htmlEncode

+ public function htmlEncode(String value) +
+ Convert certain characters (&, <, >, and ') to their HTML character equivalents for literal display in web pages. +
+ Parameters: +
  • value : String
    The string to encode
+ Returns: +
    +
  • String
    The encoded text
  • +
+
+
+
This method is defined by Format.
+
+ +
+

lowercase

+ public function lowercase(String value) +
+ Converts a string to all lower case letters +
+ Parameters: +
  • value : String
    The text to convert
+ Returns: +
    +
  • String
    The converted text
  • +
+
+
+
This method is defined by Format.
+
+ +
+

stripTags

+ public function stripTags(Mixed value) +
+ Strips all HTML tags +
+ Parameters: +
  • value : Mixed
    The text from which to strip tags
+ Returns: +
    +
  • String
    The stripped text
  • +
+
+
+
This method is defined by Format.
+
+ +
+

substr

+ public function substr(String value, Number start, Number length) +
+ Returns a substring from within an original string +
+ Parameters: +
  • value : String
    The original text
  • start : Number
    The start index of the substring
  • length : Number
    The length of the substring
+ Returns: +
    +
  • String
    The substring
  • +
+
+
+
This method is defined by Format.
+
+ +
+

trim

+ public function trim(String value) +
+ Trims any whitespace from either side of a string +
+ Parameters: +
  • value : String
    The text to trim
+ Returns: +
    +
  • String
    The trimmed text
  • +
+
+
+
This method is defined by Format.
+
+ +
+

undef

+ public function undef(Mixed value) +
+ Checks a reference and converts it to empty string if it is undefined +
+ Parameters: +
  • value : Mixed
    Reference to check
+ Returns: +
    +
  • Mixed
    Empty string if converted, otherwise the original value
  • +
+
+
+
This method is defined by Format.
+
+ +
+

uppercase

+ public function uppercase(String value) +
+ Converts a string to all upper case letters +
+ Parameters: +
  • value : String
    The text to convert
+ Returns: +
    +
  • String
    The converted text
  • +
+
+
+
This method is defined by Format.
+
+ +
+

usMoney

+ public function usMoney(Number/String value) +
+ Format a number as US currency +
+ Parameters: +
  • value : Number/String
    The numeric value to format
+ Returns: +
    +
  • String
    The formatted currency string
  • +
+
+
+
This method is defined by Format.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.util.JSON.html b/www/extras/yui-ext/docs/output/Ext.util.JSON.html new file mode 100644 index 000000000..8c3691d16 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.util.JSON.html @@ -0,0 +1,106 @@ + + + + Ext.util.JSON + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.util.JSON

+ + + + + +
Package: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.
+
+ Properties +   -  Methods +   -  Events +
+ +

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.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.util.MixedCollection.html b/www/extras/yui-ext/docs/output/Ext.util.MixedCollection.html new file mode 100644 index 000000000..0857ed58d --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.util.MixedCollection.html @@ -0,0 +1,1127 @@ + + + + Ext.util.MixedCollection + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.util.MixedCollection

+ + + + + +
Package:Ext.util
Class:MixedCollection
Extends:Observable
Defined In:MixedCollection.js
+
+ A Collection class that maintains both numeric indexes and keys and exposes events.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 MixedCollection(Boolean allowFunctions, Function keyFn)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.
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 clear() : voidMixedCollection
Removes all items from the collection.
 clone() : MixedCollectionMixedCollection
Creates a duplicate of this 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...
 filter(String property, String/RegExp value) : MixedCollectionMixedCollection
Filter the objects in this collection by a specific property. +Returns a new collection that has been filtered.
 filterBy(Function fn, [Object scope]) : MixedCollectionMixedCollection
Filter by a function. * Returns a new collection that has been filtered. +The passed function will be called with each...
 find(Function fn, [Object scope]) : ObjectMixedCollection
Returns the first item in the collection which elicits a true return value from the +passed selection function.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 first() : ObjectMixedCollection
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 E...
 getRange([Number startIndex], [Number endIndex]) : ArrayMixedCollection
Returns a range of items in this collection
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 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 OR index. Key has priority over index.
 itemAt(Number index) : ObjectMixedCollection
Returns the item at the specified index.
 key(String/Number key) : ObjectMixedCollection
Returns the item associated with the passed key.
 keySort([String direction], [Function fn]) : voidMixedCollection
Sorts this collection by keys
 last() : ObjectMixedCollection
Returns the last item in the collection.
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 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.
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 replace(String key, [o {Object}]) : ObjectMixedCollection
Replaces an item in the collection.
 sort([String direction], [Function fn]) : voidMixedCollection
Sorts this collection with the passed comparison function
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

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, Function keyFn) +
+
+ Parameters: +
  • allowFunctions : Boolean
    True if the addAll function should add function references to the collection (defaults to false)
  • keyFn : Function
    A function that can accept an item of the type(s) stored in this MixedCollection and return the key value for that item. This is used when available to look up the key on items that were passed without an explicit key parameter to a MixedCollection method. Passing this parameter is equivalent to providing an implementation for the getKey method.
+
+
+
+
+ +

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.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

clear

+ public function clear() +
+ Removes all items from the collection. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

clone

+ public function clone() +
+ Creates a duplicate of this collection +
+ Parameters: +
  • None.
+ Returns: +
    +
  • MixedCollection
  • +
+
+
+
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. returning false from the function will stop the iteration. +
+ 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.
+
+ +
+

filter

+ public function filter(String property, String/RegExp value) +
+ Filter the objects in this collection by a specific property. +Returns a new collection that has been filtered. +
+ Parameters: +
  • property : String
    A property on your objects
  • value : String/RegExp
    Either string that the property values should start with or a RegExp to test against the property
+ Returns: +
    +
  • MixedCollection
    The new filtered collection
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

filterBy

+ public function filterBy(Function fn, [Object scope]) +
+ Filter by a function. * Returns a new collection that has been filtered. +The passed function will be called with each +object in the collection. If the function returns true, the value is included +otherwise it is filtered. +
+ Parameters: +
  • fn : Function
    The function to be called, it will receive the args o (the object), k (the key)
  • scope : Object
    (optional) The scope of the function (defaults to this)
+ Returns: +
    +
  • MixedCollection
    The new filtered collection
  • +
+
+
+
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.
+
+ +
+

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.
+
+ +
+

first

+ public function first() +
+ Returns the first item in the collection. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Object
    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 Ext.util.MixedCollection();
+    mc.add(someEl.dom.id, someEl);
+    mc.add(otherEl.dom.id, otherEl);
+    //and so on
+    
+    // using getKey
+    var mc = new 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.
+
+ +
+

getRange

+ public function getRange([Number startIndex], [Number endIndex]) +
+ Returns a range of items in this collection +
+ Parameters: +
  • startIndex : Number
    (optional) defaults to 0
  • endIndex : Number
    (optional) default to the last item
+ Returns: +
    +
  • Array
    An array of items
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

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 OR index. Key has priority over 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.
+
+ +
+

itemAt

+ public function itemAt(Number index) +
+ Returns the item at the specified index. +
+ Parameters: +
  • index : Number
    The index of the item.
+ Returns: +
    +
  • Object
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

key

+ public function key(String/Number key) +
+ Returns the item associated with the passed key. +
+ Parameters: +
  • key : String/Number
    The key of the item.
+ Returns: +
    +
  • Object
    The item associated with the passed key.
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

keySort

+ public function keySort([String direction], [Function fn]) +
+ Sorts this collection by keys +
+ Parameters: +
  • direction : String
    (optional) "ASC" or "DESC"
  • fn : Function
    (optional) a comparison function (defaults to case insensitive string)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

last

+ public function last() +
+ Returns the last item in the collection. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Object
    the last item in the collection..
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

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.
+
+ +
+

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.
+
+ +
+

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.
+
+ +
+

sort

+ public function sort([String direction], [Function fn]) +
+ Sorts this collection with the passed comparison function +
+ Parameters: +
  • direction : String
    (optional) "ASC" or "DESC"
  • fn : Function
    (optional) comparison function
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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

+
+ +
+

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.
+
+
+ +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.util.Observable.html b/www/extras/yui-ext/docs/output/Ext.util.Observable.html new file mode 100644 index 000000000..86a860349 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.util.Observable.html @@ -0,0 +1,321 @@ + + + + Ext.util.Observable + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.util.Observable

+ + + + + + +
Package:Ext.util
Class:Observable
Extends:Object
Subclasses:BasicDialog, BasicLayoutRegion, Button, Component, ContentPanel, LayoutManager, Resizable, SplitBar, TabPanel, TabPanelItem, UpdateManager, View, Node, Store, Tree, BasicForm, AbstractSelectionModel, ColumnModel, Grid, Menu, DefaultSelectionModel, MultiSelectionModel, ClickRepeater, MixedCollection
Defined In:Observable.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: +
Employee = function(name){
+    this.name = name;
+    this.events = {
+        "fired" : true,
+        "quit" : true
+    }
+ }
+ Ext.extend(Employee, Ext.util.Observable);
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Observable.capture(Observable o, Function fn, [Object scope]) : voidObservable
<static> Starts capture on the specified Observable. All events will be passed +to the supplied function with th...
 Observable.releaseCapture(Observable o) : voidObservable
<static> Removes all added captures from the Observable.
 addEvents(Object object) : voidObservable
Copies any events from the passed object onto this object if they do not already exist. The passed object +must also ...
 addListener(String eventName, Function handler, [Object scope], [Object options]) : voidObservable
Appends an event handler to this component
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 hasListener(String eventName) : BooleanObservable
Checks to see if this object is currently listening for a specified event
 on(String eventName, Function handler, [Object options]) : voidObservable
Appends an event handler to this element (shorthand for addListener)
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 un(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener (shorthand for removeListener)
+ +

Public Events

+
This class has no public events.
+ +

Method Details

+
+ +
+

Observable.capture

+ public function Observable.capture(Observable o, Function fn, [Object scope]) +
+ <static> Starts capture on the specified Observable. All events will be passed +to the supplied function with the event name + standard signature of the event +before the event is fired. If the supplied function returns false, +the event will not fire. +
+ Parameters: +
  • o : Observable
    The Observable to capture
  • fn : Function
    The function to call
  • scope : Object
    (optional) The scope (this object) for the fn
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

Observable.releaseCapture

+ public function Observable.releaseCapture(Observable o) +
+ <static> Removes all added captures from the Observable. +
+ Parameters: +
  • o : Observable
    The Observable to release
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addEvents

+ public function addEvents(Object object) +
+ Copies any events from the passed object onto this object if they do not already exist. The passed object +must also inherit from Observable for this method to have any effect. +
+ Parameters: +
  • object : Object
    The object from which to copy events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [Object options]) +
+ Appends an event handler to this component +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope in which to execute the handler function. The handler function's "this" context.
  • options : Object
    (optional) An object containing handler configuration properties. This may contain any of the following properties:
    • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
    • delegate {String} A simple selector to filter the target or look for a descendant of the target
    • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
    • preventDefault {Boolean} True to prevent the default action
    • stopPropagation {Boolean} True to prevent event propagation
    • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
    • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
    • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
    • buffer {Number} Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    Combining Options
    Using the options argument, it is possible to combine different types of listeners:

    A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

    Code:
    el.on('click', this.onClick, this, { single: true, delay: 100, stopEvent : true, forumId: 4 });

    The method also allows for a single argument to be passed which is a config object containing properties which specify multiple handlers.

    Attaching multiple handlers in 1 call
    Code:

    el.on({ 'click' : { fn: this.onClick scope: this, delay: 100 }, 'mouseover' : { fn: this.onMouseOver scope: this }, 'mouseout' : { fn: this.onMouseOut scope: this } });

    Or a shorthand syntax:
    Code:

    el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut scope: this });
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

hasListener

+ public function hasListener(String eventName) +
+ Checks to see if this object is currently listening for a specified event +
+ Parameters: +
  • eventName : String
    The name of the event to check for
+ Returns: +
    +
  • Boolean
    True if the event is being listened for, else false
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object options]) +
+ Appends an event handler to this element (shorthand for addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • options : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
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.
+
+ +
+

un

+ public function un(String eventName, Function handler, [Object scope]) +
+ Removes a listener (shorthand for removeListener) +
+ 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.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Ext.util.TextMetrics.html b/www/extras/yui-ext/docs/output/Ext.util.TextMetrics.html new file mode 100644 index 000000000..5c729d297 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Ext.util.TextMetrics.html @@ -0,0 +1,238 @@ + + + + Ext.util.TextMetrics + + + + + + +
+
+  Print Friendly
+ +
+

Class Ext.util.TextMetrics

+ + + + + +
Package:Ext.util
Class:TextMetrics
Extends:Object
Defined In:TextMetrics.js
+
+ Provides precise pixel measurements for blocks of text so that you can determine exactly how high and +wide, in pixels, a given block of text will be.

This class is a singleton and cannot be created directly.
+
+ Properties +   -  Methods +   -  Events +
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 bind(String/HTMLElement el) : voidTextMetrics
Binds this TextMetrics instance to an element from which to copy existing CSS styles +that can affect the size of the ...
 createInstance(String/HTMLElement el, [Number fixedWidth]) : Ext.util.TextMetrics.InstanceTextMetrics
Return a unique TextMetrics instance that can be bound directly to an element and reused. This reduces +the overhead ...
 getHeight(String text) : NumberTextMetrics
Returns the measured height of the specified text. For multiline text, be sure to call +setFixedWidth if necessary.
 getSize(String text) : ObjectTextMetrics
Returns the size of the specified text based on the internal element's style and width properties
 getWidth(String text) : NumberTextMetrics
Returns the measured width of the specified text
 measure(String/HTMLElement el, String text, [Number fixedWidth]) : ObjectTextMetrics
Measures the size of the specified text
 setFixedWidth(Number width) : voidTextMetrics
Sets a fixed width on the internal measurement element. If the text will be multiline, you have +to set a fixed width...
+ +

Public Events

+
This class has no public events.
+ +

Method Details

+
+ +
+

bind

+ public function bind(String/HTMLElement el) +
+ Binds this TextMetrics instance to an element from which to copy existing CSS styles +that can affect the size of the rendered text +
+ Parameters: +
  • el : String/HTMLElement
    The element, dom node or id
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TextMetrics.
+
+ +
+

createInstance

+ public function createInstance(String/HTMLElement el, [Number fixedWidth]) +
+ Return a unique TextMetrics instance that can be bound directly to an element and reused. This reduces +the overhead of multiple calls to initialize the style properties on each measurement. +
+ Parameters: +
  • el : String/HTMLElement
    The element, dom node or id that the instance will be bound to
  • fixedWidth : Number
    (optional) If the text will be multiline, you have to set a fixed width in order to accurately measure the text height
+ Returns: +
    +
  • Ext.util.TextMetrics.Instance
    instance The new instance
  • +
+
+
+
This method is defined by TextMetrics.
+
+ +
+

getHeight

+ public function getHeight(String text) +
+ Returns the measured height of the specified text. For multiline text, be sure to call +setFixedWidth if necessary. +
+ Parameters: +
  • text : String
    The text to measure
+ Returns: +
    +
  • Number
    height The height in pixels
  • +
+
+
+
This method is defined by TextMetrics.
+
+ +
+

getSize

+ public function getSize(String text) +
+ Returns the size of the specified text based on the internal element's style and width properties +
+ Parameters: +
  • text : String
    The text to measure
+ Returns: +
    +
  • Object
    An object containing the text's size {width: (width), height: (height)}
  • +
+
+
+
This method is defined by TextMetrics.
+
+ +
+

getWidth

+ public function getWidth(String text) +
+ Returns the measured width of the specified text +
+ Parameters: +
  • text : String
    The text to measure
+ Returns: +
    +
  • Number
    width The width in pixels
  • +
+
+
+
This method is defined by TextMetrics.
+
+ +
+

measure

+ public function measure(String/HTMLElement el, String text, [Number fixedWidth]) +
+ Measures the size of the specified text +
+ Parameters: +
  • el : String/HTMLElement
    The element, dom node or id from which to copy existing CSS styles that can affect the size of the rendered text
  • text : String
    The text to measure
  • fixedWidth : Number
    (optional) If the text will be multiline, you have to set a fixed width in order to accurately measure the text height
+ Returns: +
    +
  • Object
    An object containing the text's size {width: (width), height: (height)}
  • +
+
+
+
This method is defined by TextMetrics.
+
+ +
+

setFixedWidth

+ public function setFixedWidth(Number width) +
+ Sets a fixed width on the internal measurement element. If the text will be multiline, you have +to set a fixed width in order to accurately measure the text height. +
+ Parameters: +
  • width : Number
    The width to set on the element
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TextMetrics.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Field.jss.html b/www/extras/yui-ext/docs/output/Field.jss.html new file mode 100644 index 000000000..b8e80032f --- /dev/null +++ b/www/extras/yui-ext/docs/output/Field.jss.html @@ -0,0 +1,491 @@ +Field.js

Field.js

/**
+ * @class Ext.form.Field
+ * @extends Ext.Component
+ * Base class for form fields that provides default event handling, sizing, value handling and other functionality.
+ * @constructor
+ * Creates a new Field 
+ * @param {Object} config Configuration options
+ */
+Ext.form.Field = function(config){
+    Ext.form.Field.superclass.constructor.call(this, config);
+    this.addEvents({
+        /**
+         * @event focus
+         * Fires when this field receives input focus
+	     * @param {Ext.form.Field} this
+	     */
+        focus : true,
+        /**
+         * @event blur
+         * Fires when
+	     * @param {Ext.form.Field} this
+	     */
+        blur : true,
+        /**
+         * @event specialkey
+         * Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed.  You can check
+         * {@link Ext.EventObject#getKey} to determine which key was pressed.
+	     * @param {Ext.form.Field} this
+	     * @param {Ext.EventObject} e The event object
+	     */
+        specialkey : true,
+        /**
+         * @event change
+         * Fires just before the field blurs if the field value has changed
+	     * @param {Ext.form.Field} this
+	     * @param {Mixed} value The changed value
+	     * @param {Mixed} value The original value
+	     */
+        change : true,
+        /**
+         * @event invalid
+         * Fires after the field has been marked as invalid
+	     * @param {Ext.form.Field} this
+	     * @param {String} msg The validation message
+	     */
+        invalid : true,
+        /**
+         * @event valid
+         * Fires after the field has been validated with no errors
+	     * @param {Ext.form.Field} this
+	     */
+        valid : true
+    });
+};
+
+Ext.extend(Ext.form.Field, Ext.Component,  {
+    /**
+     * @cfg {String} invalidClass The CSS class to use when marking a field invalid (defaults to "x-form-invalid")
+     */
+    invalidClass : "x-form-invalid",
+    /**
+     * @cfg {String} invalidText The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field is invalid")
+     */
+    invalidText : "The value in this field is invalid",
+    /**
+     * @cfg {String} focusClass The CSS class to use when the field receives focus (defaults to "x-form-focus")
+     */
+    focusClass : "x-form-focus",
+    /**
+     * @cfg {String/Boolean} validationEvent The event that should initiate field validation. Set to false to disable
+      automatic validation. (defaults to "keyup")
+     */
+    validationEvent : "keyup",
+    /**
+     * @cfg {String/Boolean} validateOnBlur Defaults to true.
+     */
+    validateOnBlur : true,
+    /**
+     * @cfg {Number} validationDelay The length of time in milliseconds after user input begins until validation is initiated (defaults to 250)
+     */
+    validationDelay : 250,
+    /**
+     * @cfg {String/Object} autoCreate A DomHelper element spec, or true for a default element spec (defaults to
+     * {tag: "input", type: "text", size: "20", autocomplete: "off"})
+     */
+    defaultAutoCreate : {tag: "input", type: "text", size: "20", autocomplete: "off"},
+    /**
+     * @cfg {String} fieldClass The default CSS class for the field (defaults to "x-form-field")
+     */
+    fieldClass: "x-form-field",
+    /**
+     * @cfg {String} msgTarget The location where error text should display.  Should be one of the following values (defaults to 'qtip'):
+     *<pre>
+Value         Description
+-----------   ----------------------------------------------------------------------
+qtip          Display a quick tip when the user hovers over the field
+title         Display a default browser title attribute popup
+under         Add a block div beneath the field containing the error text
+side          Add an error icon to the right of the field with a popup on hover
+[element id]  Add the error text directly to the innerHTML of the specified element
+</pre>
+     */
+    msgTarget: 'qtip',
+    /**
+     * @cfg {String} msgFx <b>Experimental</b> The effect used when displaying a validation message under the field (defaults to 'normal').
+     */
+    msgFx : 'normal',
+
+    /**
+     * @cfg {String} inputType The type attribute for input fields - e.g. radio, text, password. (defaults to "text")
+     */
+    inputType : undefined,
+
+    // private
+    isFormField : true,
+
+    // private
+    hasFocus : false,
+
+    /**
+     * @cfg {Mixed} value A value to initialize this field with
+     */
+    value : undefined,
+
+
+    /**
+     * Returns the name attribute of the field if available
+     * @return {String} name The field name
+     */
+    getName: function(){
+         return this.rendered && this.el.dom.name ? this.el.dom.name : (this.hiddenName || '');
+    },
+
+    /**
+     * Apply the behaviors of this component to an existing element. <b>This is used instead of render().</b>
+     * @param {String/HTMLElement/Element} el The id of the node, a DOM Node or an existing Element
+     * @return {Ext.form.Field} this
+     */
+    applyTo : function(target){
+        this.target = target;
+        this.el = Ext.get(target);
+        this.render(this.el.dom.parentNode);
+        return this;
+    },
+
+    // private
+    onRender : function(ct, position){
+        if(this.el){
+            this.el = Ext.get(this.el);
+            if(!this.target){
+                ct.dom.appendChild(this.el.dom);
+            }
+        }else {
+            var cfg = this.getAutoCreate();
+            if(!cfg.name){
+                cfg.name = this.name || this.id;
+            }
+            if(this.inputType){
+                cfg.type = this.inputType;
+            }
+            if(this.tabIndex !== undefined){
+                cfg.tabIndex = this.tabIndex;
+            }
+            this.el = ct.createChild(cfg, position);
+        }
+        var type = this.el.dom.type;
+        if(type){
+            if(type == 'password'){
+                type = 'text';
+            }
+            this.el.addClass('x-form-'+type);
+        }
+        if(!this.customSize && (this.width || this.height)){
+            this.setSize(this.width || "", this.height || "");
+        }
+        if(this.readOnly){
+            this.el.dom.readOnly = true;
+        }
+
+        this.el.addClass([this.fieldClass, this.cls]);
+        this.initValue();
+    },
+
+    // private
+    initValue : function(){
+        if(this.value !== undefined){
+            this.setValue(this.value);
+        }else if(this.el.dom.value.length > 0){
+            this.setValue(this.el.dom.value);
+        }
+    },
+
+    // private
+    afterRender : function(){
+        Ext.form.Field.superclass.afterRender.call(this);
+        this.initEvents();
+    },
+
+    // private
+    fireKey : function(e){
+        if(e.isNavKeyPress()){
+            this.fireEvent("specialkey", this, e);
+        }
+    },
+
+    /**
+     * Resets the current field value to the originally-loaded value and clears any validation messages
+     */
+    reset : function(){
+        this.setValue(this.originalValue);
+        this.clearInvalid();
+    },
+
+    // private
+    initEvents : function(){
+        this.el.on(Ext.isIE ? "keydown" : "keypress", this.fireKey,  this);
+        this.el.on("focus", this.onFocus,  this);
+        this.el.on("blur", this.onBlur,  this);
+
+        // reference to original value for reset
+        this.originalValue = this.getValue();
+    },
+
+    // private
+    onFocus : function(){
+        if(!Ext.isOpera){ // don't touch in Opera
+            this.el.addClass(this.focusClass);
+        }
+        this.hasFocus = true;
+        this.startValue = this.getValue();
+        this.fireEvent("focus", this);
+    },
+
+    // private
+    onBlur : function(){
+        this.el.removeClass(this.focusClass);
+        this.hasFocus = false;
+        if(this.validationEvent !== false && this.validateOnBlur && this.validationEvent != "blur"){
+            this.validate();
+        }
+        var v = this.getValue();
+        if(v != this.startValue){
+            this.fireEvent('change', this, v, this.startValue);
+        }
+        this.fireEvent("blur", this);
+    },
+
+    /**
+     * Sets the height and width of the field
+     * @param {Number} width The new field width in pixels
+     * @param {Number} height The new field height in pixels
+     */
+    setSize : function(w, h){
+        if(!this.rendered || !this.el){
+            this.width = w;
+            this.height = h;
+            return;
+        }
+        if(w){
+            w = this.adjustWidth(this.el.dom.tagName, w);
+            this.el.setWidth(w);
+        }
+        if(h){
+            this.el.setHeight(h);
+        }
+        var h = this.el.dom.offsetHeight; // force browser recalc
+    },
+
+    /**
+     * Returns whether or not the field value is currently valid
+     * @param {Boolean} preventMark True to disable marking the field invalid
+     * @return {Boolean} True if the value is valid, else false
+     */
+    isValid : function(preventMark){
+        if(this.disabled){
+            return true;
+        }
+        var restore = this.preventMark;
+        this.preventMark = preventMark === true;
+        var v = this.validateValue(this.getRawValue());
+        this.preventMark = restore;
+        return v;
+    },
+
+    /**
+     * Validates the field value
+     * @return {Boolean} True if the value is valid, else false
+     */
+    validate : function(){
+        if(this.disabled || this.validateValue(this.getRawValue())){
+            this.clearInvalid();
+            return true;
+        }
+        return false;
+    },
+
+    // private
+    // Subclasses should provide the validation implementation by overriding this
+    validateValue : function(value){
+        return true;
+    },
+
+    /**
+     * Mark this field as invalid
+     * @param {String} msg The validation message
+     */
+    markInvalid : function(msg){
+        if(!this.rendered || this.preventMark){ // not rendered
+            return;
+        }
+        this.el.addClass(this.invalidClass);
+        msg = msg || this.invalidText;
+        switch(this.msgTarget){
+            case 'qtip':
+                this.el.dom.qtip = msg;
+                this.el.dom.qclass = 'x-form-invalid-tip';
+                break;
+            case 'title':
+                this.el.dom.title = msg;
+                break;
+            case 'under':
+                if(!this.errorEl){
+                    var elp = this.el.findParent('.x-form-element', 5, true);
+                    this.errorEl = elp.createChild({cls:'x-form-invalid-msg'});
+                    this.errorEl.setWidth(elp.getWidth(true)-20);
+                }
+                this.errorEl.update(msg);
+                Ext.form.Field.msgFx[this.msgFx].show(this.errorEl, this);
+                break;
+            case 'side':
+                if(!this.errorIcon){
+                    var elp = this.el.findParent('.x-form-element', 5, true);
+                    this.errorIcon = elp.createChild({cls:'x-form-invalid-icon'});
+                }
+                this.alignErrorIcon();
+                this.errorIcon.dom.qtip = msg;
+                this.errorIcon.dom.qclass = 'x-form-invalid-tip';
+                this.errorIcon.show();
+                break;
+            default:
+                var t = Ext.getDom(this.msgTarget);
+                t.innerHTML = msg;
+                t.style.display = this.msgDisplay;
+                break;
+        }
+        this.fireEvent('invalid', this, msg);
+    },
+
+    // private
+    alignErrorIcon : function(){
+        this.errorIcon.alignTo(this.el, 'tl-tr', [2, 0]);
+    },
+
+    /**
+     * Clear any invalid styles/messages for this field
+     */
+    clearInvalid : function(){
+        if(!this.rendered || this.preventMark){ // not rendered
+            return;
+        }
+        this.el.removeClass(this.invalidClass);
+        switch(this.msgTarget){
+            case 'qtip':
+                this.el.dom.qtip = '';
+                break;
+            case 'title':
+                this.el.dom.title = '';
+                break;
+            case 'under':
+                if(this.errorEl){
+                    Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl, this);
+                }
+                break;
+            case 'side':
+                if(this.errorIcon){
+                    this.errorIcon.dom.qtip = '';
+                    this.errorIcon.hide();
+                }
+                break;
+            default:
+                var t = Ext.getDom(this.msgTarget);
+                t.innerHTML = '';
+                t.style.display = 'none';
+                break;
+        }
+        this.fireEvent('valid', this);
+    },
+
+    /**
+     * Returns the raw data value which may or may not be a valid, defined value.  To return a normalized value see {@link #getValue}.
+     * @return {Mixed} value The field value
+     */
+    getRawValue : function(){
+        return this.el.getValue();
+    },
+
+    /**
+     * Returns the normalized data value (undefined or emptyText will be returned as '').  To return the raw value see {@link #getRawValue}.
+     * @return {Mixed} value The field value
+     */
+    getValue : function(){
+        var v = this.el.getValue();
+        if(v == this.emptyText || v === undefined){
+            v = '';
+        }
+        return v;
+    },
+
+    /**
+     * Sets the underlying DOM field's value directly, bypassing validation.  To set the value with validation see {@link #setValue}.
+     * @param {Mixed} value The value to set
+     */
+    setRawValue : function(v){
+        return this.el.dom.value = v;
+    },
+
+    /**
+     * Sets a data value into the field and validates it.  To set the value directly without validation see {@link #setRawValue}.
+     * @param {Mixed} value The value to set
+     */
+    setValue : function(v){
+        this.value = v;
+        if(this.rendered){
+            this.el.dom.value = v;
+            this.validate();
+        }
+    },
+
+    // private
+    adjustWidth : function(tag, w){
+        tag = tag.toLowerCase();
+        if(typeof w == 'number' && Ext.isStrict && !Ext.isSafari){
+            if(Ext.isIE && (tag == 'input' || tag == 'textarea')){
+                if(tag == 'input'){
+                    return w + 2;
+                }
+                if(tag = 'textarea'){
+                    return w-2;
+                }
+            }else if(Ext.isGecko && tag == 'textarea'){
+                return w-6;
+            }else if(Ext.isOpera){
+                if(tag == 'input'){
+                    return w + 2;
+                }
+                if(tag = 'textarea'){
+                    return w-2;
+                }
+            }
+        }
+        return w;
+    }
+});
+
+
+// anything other than normal should be considered experimental
+Ext.form.Field.msgFx = {
+    normal : {
+        show: function(msgEl, f){
+            msgEl.setDisplayed('block');
+        },
+
+        hide : function(msgEl, f){
+            msgEl.setDisplayed(false).update('');
+        }
+    },
+
+    slide : {
+        show: function(msgEl, f){
+            msgEl.slideIn('t', {stopFx:true});
+        },
+
+        hide : function(msgEl, f){
+            msgEl.slideOut('t', {stopFx:true,useDisplay:true});
+        }
+    },
+
+    slideRight : {
+        show: function(msgEl, f){
+            msgEl.fixDisplay();
+            msgEl.alignTo(f.el, 'tl-tr');
+            msgEl.slideIn('l', {stopFx:true});
+        },
+
+        hide : function(msgEl, f){
+            msgEl.slideOut('l', {stopFx:true,useDisplay:true});
+        }
+    }
+};
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Form.jss.html b/www/extras/yui-ext/docs/output/Form.jss.html new file mode 100644 index 000000000..78ea7db02 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Form.jss.html @@ -0,0 +1,291 @@ +Form.js

Form.js

/**
+ * @class Ext.form.Form
+ * @extends Ext.form.BasicForm
+ * Adds the ability to dynamically render forms with JS to {@link Ext.form.BasicForm}.
+ * @constructor
+ * @param {Object} config Configuration options
+ */
+Ext.form.Form = function(config){
+    Ext.form.Form.superclass.constructor.call(this, null, config);
+    this.url = this.url || this.action;
+    if(!this.root){
+        this.root = new Ext.form.Layout(Ext.applyIf({
+            id: Ext.id()
+        }, config));
+    }
+    this.active = this.root;
+    /**
+     * Array of all the buttons that have been added to this form via addButton
+     * @type Array
+     */
+    this.buttons = [];
+    this.addEvents({
+        /**
+         * @event clientvalidation
+         * If the monitorValid config option is true, this event fires repetitively to notify of valid state
+         * @param {Form} this
+         * @param {Boolean} valid true if the form has passed client-side validation
+         */
+        clientvalidation: true
+    });
+};
+
+Ext.extend(Ext.form.Form, Ext.form.BasicForm, {
+    /**
+     * @cfg {Number} labelWidth The width of labels. This property cascades to child containers.
+     */
+// holder
+/***
+     * @cfg {String} itemCls A css class to apply to the x-form-item of fields. This property cascades to child containers.
+     */
+// holder
+/***
+     * @cfg {String} buttonAlign Valid values are "left," "center" and "right" (defaults to "center")
+     */
+    buttonAlign:'center',
+
+    /**
+     * @cfg {Number} minButtonWidth Minimum width of all buttons (defaults to 75)
+     */
+    minButtonWidth:75,
+
+    /**
+     * @cfg {String} labelAlign Valid values are "left," "top" and "right" (defaults to "left").
+     * This property cascades to child containers if not set.
+     */
+    labelAlign:'left',
+
+    /**
+     * @cfg {Boolean} monitorValid If true the form monitors it's valid state <b>client-side</b> and
+     * fires a looping event with that state. This is required to bind buttons to the valid
+     * state using the config value bindForm:true on the button.
+     */
+    monitorValid : false,
+
+    /**
+     * @cfg {Number} monitorPoll The milliseconds to poll valid state, ignored if monitorValid is not true (defaults to 200)
+     */
+    monitorPoll : 200,
+
+    /**
+     * Opens the a new {@link Ext.form.Column} container in the layout stack. If fields are passed after the config, the
+     * fields are added and the column is closed. If no fields are passed the column remains open
+     * until end() is called.
+     * @param {Object} config The config to pass to the column
+     * @param {Field} field1 (optional)
+     * @param {Field} field2 (optional)
+     * @param {Field} etc (optional)
+     * @return Column The column container object
+     */
+    column : function(c){
+        var col = new Ext.form.Column(c);
+        this.start(col);
+        if(arguments.length > 1){ // duplicate code required because of Opera
+            this.add.apply(this, Array.prototype.slice.call(arguments, 1));
+            this.end();
+        }
+        return col;
+    },
+
+    /**
+     * Opens the a new {@link Ext.form.FieldSet} container in the layout stack. If fields are passed after the config, the
+     * fields are added and the fieldset is closed. If no fields are passed the fieldset remains open
+     * until end() is called.
+     * @param {Object} config The config to pass to the fieldset
+     * @param {Field} field1 (optional)
+     * @param {Field} field2 (optional)
+     * @param {Field} etc (optional)
+     * @return FieldSet The fieldset container object
+     */
+    fieldset : function(c){
+        var fs = new Ext.form.FieldSet(c);
+        this.start(fs);
+        if(arguments.length > 1){ // duplicate code required because of Opera
+            this.add.apply(this, Array.prototype.slice.call(arguments, 1));
+            this.end();
+        }
+        return fs;
+    },
+
+    /**
+     * Opens the a new {@link Ext.form.Layout} container in the layout stack. If fields are passed after the config, the
+     * fields are added and the container is closed. If no fields are passed the container remains open
+     * until end() is called.
+     * @param {Object} config The config to pass to the Layout
+     * @param {Field} field1 (optional)
+     * @param {Field} field2 (optional)
+     * @param {Field} etc (optional)
+     * @return Layout The container object
+     */
+    container : function(c){
+        var l = new Ext.form.Layout(c);
+        this.start(l);
+        if(arguments.length > 1){ // duplicate code required because of Opera
+            this.add.apply(this, Array.prototype.slice.call(arguments, 1));
+            this.end();
+        }
+        return l;
+    },
+
+    /**
+     * Opens the passed container in the layout stack. The container can be any {@link Ext.form.Layout} or subclass.
+     * @param {Object} container A Ext.form.Layout or subclass of Layout
+     * @return {Form} this
+     */
+    start : function(c){
+        // cascade label info
+        Ext.applyIf(c, {'labelAlign': this.active.labelAlign, 'labelWidth': this.active.labelWidth, 'itemCls': this.active.itemCls});
+        this.active.stack.push(c);
+        c.ownerCt = this.active;
+        this.active = c;
+        return this;
+    },
+
+    /**
+     * Closes the current open container
+     * @return {Form} this
+     */
+    end : function(){
+        if(this.active == this.root){
+            return this;
+        }
+        this.active = this.active.ownerCt;
+        return this;
+    },
+
+    /**
+     * Add Ext.form components to the current open container (e.g. column, fieldset, etc)
+     * @param {Field} field1
+     * @param {Field} field2 (optional)
+     * @param {Field} etc (optional)
+     * @return {Form} this
+     */
+    add : function(){
+        this.active.stack.push.apply(this.active.stack, arguments);
+        var r = [];
+        for(var i = 0, a = arguments, len = a.length; i < len; i++) {
+            if(a[i].isFormField){
+                r.push(a[i]);
+            }
+        }
+        if(r.length > 0){
+            Ext.form.Form.superclass.add.apply(this, r);
+        }
+        return this;
+    },
+
+    /**
+     * Render this form into the passed container. This should only be called once!
+     * @param {String/HTMLElement/Element} container The element this component should be rendered into
+     * @return {Form} this
+     */
+    render : function(ct){
+        ct = Ext.get(ct);
+        var o = this.autoCreate || {
+            tag: 'form',
+            method : this.method || 'POST',
+            id : this.id || Ext.id()
+        };
+        this.initEl(ct.createChild(o));
+
+        this.root.render(this.el);
+
+        this.items.each(function(f){
+            f.render('x-form-el-'+f.id);
+        });
+
+        if(this.buttons.length > 0){
+            // tables are required to maintain order and for correct IE layout
+            var tb = this.el.createChild({cls:'x-form-btns-ct', cn: {
+                cls:"x-form-btns x-form-btns-"+this.buttonAlign,
+                html:'<table cellspacing="0"><tbody><tr></tr></tbody></table><div class="x-clear"></div>'
+            }}, null, true);
+            var tr = tb.getElementsByTagName('tr')[0];
+            for(var i = 0, len = this.buttons.length; i < len; i++) {
+                var b = this.buttons[i];
+                var td = document.createElement('td');
+                td.className = 'x-form-btn-td';
+                b.render(tr.appendChild(td));
+            }
+        }
+        if(this.monitorValid){ // initialize after render
+            this.startMonitoring();
+        }
+        return this;
+    },
+
+    /**
+     * Adds a button to the footer of the form - this <b>must</b> be called before the form is rendered.
+     * @param {String/Object} config A string becomes the button text, an object can either be a Button config
+     * object or a valid 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 {Ext.Button}
+     */
+    addButton : function(config, handler, scope){
+        var bc = {
+            handler: handler,
+            scope: scope,
+            minWidth: this.minButtonWidth,
+            hideParent:true
+        };
+        if(typeof config == "string"){
+            bc.text = config;
+        }else{
+            Ext.apply(bc, config);
+        }
+        var btn = new Ext.Button(null, bc);
+        this.buttons.push(btn);
+        return btn;
+    },
+
+    /**
+     * Starts monitoring of the valid state of this form. Usually this is don't by passing the config
+     * option "monitorValid"
+     */
+    startMonitoring : function(){
+        if(!this.bound){
+            this.bound = true;
+            Ext.TaskMgr.start({
+                run : this.bindHandler,
+                interval : this.monitorPoll || 200,
+                scope: this
+            });
+        }
+    },
+
+    /**
+     * Stops monitoring of the valid state of this form
+     */
+    stopMonitoring : function(){
+        this.bound = false;
+    },
+
+    // private
+    bindHandler : function(){
+        if(!this.bound){
+            return false; // stops binding
+        }
+        var valid = true;
+        this.items.each(function(f){
+            if(!f.isValid(true)){
+                valid = false;
+                return false;
+            }
+        });
+        for(var i = 0, len = this.buttons.length; i < len; i++){
+            var btn = this.buttons[i];
+            if(btn.formBind === true && btn.disabled === valid){
+                btn.setDisabled(!valid);
+            }
+        }
+        this.fireEvent('clientvalidation', this, valid);
+    }
+});
+
+
+// back compat
+Ext.Form = Ext.form.Form;
+
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Format.jss.html b/www/extras/yui-ext/docs/output/Format.jss.html new file mode 100644 index 000000000..04f5ca4fa --- /dev/null +++ b/www/extras/yui-ext/docs/output/Format.jss.html @@ -0,0 +1,149 @@ +Format.js

Format.js

/**
+ * @class Ext.util.Format
+ * Reusable data formatting functions
+ * @singleton
+ */
+Ext.util.Format = function(){
+    var trimRe = /^\s+|\s+$/g;
+    return {
+        /**
+         * Truncate a string and add an ellipsis ('...') to the end if it exceeds the specified length
+         * @param {String} value The string to truncate
+         * @param {Number} length The maximum length to allow before truncating
+         * @return {String} The converted text
+         */
+        ellipsis : function(value, len){
+            if(value && value.length > len){
+                return value.substr(0, len-3)+"...";
+            }
+            return value;
+        },
+
+        /**
+         * Checks a reference and converts it to empty string if it is undefined
+         * @param {Mixed} value Reference to check
+         * @return {Mixed} Empty string if converted, otherwise the original value
+         */
+        undef : function(value){
+            return typeof value != "undefined" ? value : "";
+        },
+
+        /**
+         * Convert certain characters (&, <, >, and ') to their HTML character equivalents for literal display in web pages.
+         * @param {String} value The string to encode
+         * @return {String} The encoded text
+         */
+        htmlEncode : function(value){
+            return !value ? value : String(value).replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;");
+        },
+
+        /**
+         * Trims any whitespace from either side of a string
+         * @param {String} value The text to trim
+         * @return {String} The trimmed text
+         */
+        trim : function(value){
+            return String(value).replace(trimRe, "");
+        },
+
+        /**
+         * Returns a substring from within an original string
+         * @param {String} value The original text
+         * @param {Number} start The start index of the substring
+         * @param {Number} length The length of the substring
+         * @return {String} The substring
+         */
+        substr : function(value, start, length){
+            return String(value).substr(start, length);
+        },
+
+        /**
+         * Converts a string to all lower case letters
+         * @param {String} value The text to convert
+         * @return {String} The converted text
+         */
+        lowercase : function(value){
+            return String(value).toLowerCase();
+        },
+
+        /**
+         * Converts a string to all upper case letters
+         * @param {String} value The text to convert
+         * @return {String} The converted text
+         */
+        uppercase : function(value){
+            return String(value).toUpperCase();
+        },
+
+        /**
+         * Converts the first character only of a string to upper case
+         * @param {String} value The text to convert
+         * @return {String} The converted text
+         */
+        capitalize : function(value){
+            return !value ? value : value.charAt(0).toUpperCase() + value.substr(1).toLowerCase();
+        },
+
+        // private
+        call : function(value, fn){
+            if(arguments.length > 2){
+                var args = Array.prototype.slice.call(arguments, 2);
+                args.unshift(value);
+                return eval(fn).apply(window, args);
+            }else{
+                return eval(fn).call(window, value);
+            }
+        },
+
+        /**
+         * Format a number as US currency
+         * @param {Number/String} value The numeric value to format
+         * @return {String} The formatted currency string
+         */
+        usMoney : function(v){
+            v = (Math.round((v-0)*100))/100;
+            v = (v == Math.floor(v)) ? v + ".00" : ((v*10 == Math.floor(v*10)) ? v + "0" : v);
+            return "$" + v ;
+        },
+
+        /**
+         * Parse a value into a formatted date using the specified format pattern.
+         * @param {Mixed} value The value to format
+         * @param {String} format (optional) Any valid date format string (defaults to 'm/d/Y')
+         * @return {String} The formatted date string
+         */
+        date : function(v, format){
+            if(!v){
+                return "";
+            }
+            if(!(v instanceof Date)){
+                v = new Date(Date.parse(v));
+            }
+            return v.dateFormat(format || "m/d/Y");
+        },
+
+        /**
+         * Returns a date rendering function that can be reused to apply a date format multiple times efficiently
+         * @param {String} format Any valid date format string
+         * @return {Function} The date formatting function
+         */
+        dateRenderer : function(format){
+            return function(v){
+                return Ext.util.Format.date(v, format);  
+            };
+        },
+
+        // private
+        stripTagsRE : /<\/?[^>]+>/gi,
+        
+        /**
+         * Strips all HTML tags
+         * @param {Mixed} value The text from which to strip tags
+         * @return {String} The stripped text
+         */
+        stripTags : function(v){
+            return !v ? v : String(v).replace(this.stripTagsRE, "");
+        }
+    };
+}();

Ext - Copyright © 2006-2007 Ext JS, LLC
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..54300ca2d --- /dev/null +++ b/www/extras/yui-ext/docs/output/Function.html @@ -0,0 +1,191 @@ + + + + Function + + + + + + +
+
+  Print Friendly
+ +
+

Class Function

+ + + + + +
Package:Global
Class:Function
Extends:Object
Defined In:Ext.js
+
+ These functions are available on every Function object (any javascript function).
+
+ Properties +   -  Methods +   -  Events +
+ +

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 (if 0 the function is executed immediately)
  • 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.
+
+
+ + +
+
+
Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Fx.jss.html b/www/extras/yui-ext/docs/output/Fx.jss.html new file mode 100644 index 000000000..a1aa92833 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Fx.jss.html @@ -0,0 +1,994 @@ +Fx.js

Fx.js


+//Notifies Element that fx methods are available
+Ext.enableFx = true;
+
+/**
+ * @class Ext.Fx
+ * <p>A class to provide basic animation and visual effects support.  <b>Note:</b> This class is automatically applied
+ * to the {@link Ext.Element} interface when included, so all effects calls should be performed via Element.
+ * Conversely, since the effects are not actually defined in Element, Ext.Fx <b>must</b> be included in order for the 
+ * Element effects to work.</p><br/>
+ *
+ * <p>It is important to note that although the Fx methods and many non-Fx Element methods support "method chaining" in that
+ * they return the Element object itself as the method return value, it is not always possible to mix the two in a single
+ * method chain.  The Fx methods use an internal effects queue so that each effect can be properly timed and sequenced.
+ * Non-Fx methods, on the other hand, have no such internal queueing and will always execute immediately.  For this reason,
+ * while it may be possible to mix certain Fx and non-Fx method calls in a single chain, it may not always provide the
+ * expected results and should be done with care.</p><br/>
+ *
+ * <p>Motion effects support 8-way anchoring, meaning that you can choose one of 8 different anchor points on the Element
+ * that will serve as either the start or end point of the animation.  Following are all of the supported anchor positions:</p>
+<pre>
+Value  Description
+-----  -----------------------------
+tl     The top left corner
+t      The center of the top edge
+tr     The top right corner
+l      The center of the left edge
+r      The center of the right edge
+bl     The bottom left corner
+b      The center of the bottom edge
+br     The bottom right corner
+</pre>
+ * <b>Although some Fx methods accept specific custom config parameters, the ones shown in the Config Options section
+ * below are common options that can be passed to any Fx method.</b>
+ * @cfg {Function} callback A function called when the effect is finished
+ * @cfg {Object} scope The scope of the effect function
+ * @cfg {String} easing A valid Easing value for the effect
+ * @cfg {String} afterCls A css class to apply after the effect
+ * @cfg {Number} duration The length of time (in seconds) that the effect should last
+ * @cfg {Boolean} remove Whether the Element should be removed from the DOM and destroyed after the effect finishes
+ * @cfg {Boolean} useDisplay Whether to use the display style attribute instead of visibility when hiding Elements (only applies to 
+ * effects that end with the element being visually hidden, ignored otherwise)
+ * @cfg {String/Object/Function} afterStyle A style specification string eg "width:100px", or object in the form {width:"100px"}, or
+ * a function which returns such a specification that will be applied to the Element after the effect finishes
+ * @cfg {Boolean} block Whether the effect should block other effects from queueing while it runs
+ * @cfg {Boolean} concurrent Whether to allow subsequently-queued effects to run at the same time as the current effect, or to ensure that they run in sequence
+ * @cfg {Boolean} stopFx Whether subsequent effects should be stopped and removed after the current effect finishes
+ */
+Ext.Fx = {
+	/**
+	 * Slides the element into view.  An anchor point can be optionally passed to set the point of
+	 * origin for the slide effect.  This function automatically handles wrapping the element with
+	 * a fixed-size container if needed.  See the Fx class overview for valid anchor point options.
+	 * Usage:
+	 *<pre><code>
+// default: slide the element in from the top
+el.slideIn();
+
+// custom: slide the element in from the right with a 2-second duration
+el.slideIn('r', { duration: 2 });
+
+// common config options shown with default values
+el.slideIn('t', {<br/>
+    easing: 'easeOut', <br/>
+    duration: .5<br/>
+});
+	</code></pre>
+	 * @param {String} anchor (optional) One of the valid Fx anchor positions (defaults to top: 't')
+	 * @param {Object} options (optional) Object literal with any of the Fx config options
+	 * @return {Element} The Element
+	 */
+    slideIn : function(anchor, o){
+        var el = this.getFxEl();
+        o = o || {};
+
+        el.queueFx(o, function(){
+
+            anchor = anchor || "t";
+
+            // fix display to visibility
+            this.fixDisplay();
+
+            // restore values after effect
+            var r = this.getFxRestore();
+            var b = this.getBox();
+            // fixed size for slide
+            this.setSize(b);
+
+            // wrap if needed
+            var wrap = this.fxWrap(r.pos, o, "hidden");
+
+            var st = this.dom.style;
+            st.visibility = "visible";
+            st.position = "absolute";
+
+            // clear out temp styles after slide and unwrap
+            var after = function(){
+                el.fxUnwrap(wrap, r.pos, o);
+                st.width = r.width;
+                st.height = r.height;
+                el.afterFx(o);
+            };
+            // time to calc the positions
+            var a, pt = {to: [b.x, b.y]}, bw = {to: b.width}, bh = {to: b.height};
+
+            switch(anchor.toLowerCase()){
+                case "t":
+                    wrap.setSize(b.width, 0);
+                    st.left = st.bottom = "0";
+                    a = {height: bh};
+                break;
+                case "l":
+                    wrap.setSize(0, b.height);
+                    st.right = st.top = "0";
+                    a = {width: bw};
+                break;
+                case "r":
+                    wrap.setSize(0, b.height);
+                    wrap.setX(b.right);
+                    st.left = st.top = "0";
+                    a = {width: bw, points: pt};
+                break;
+                case "b":
+                    wrap.setSize(b.width, 0);
+                    wrap.setY(b.bottom);
+                    st.left = st.top = "0";
+                    a = {height: bh, points: pt};
+                break;
+                case "tl":
+                    wrap.setSize(0, 0);
+                    st.right = st.bottom = "0";
+                    a = {width: bw, height: bh};
+                break;
+                case "bl":
+                    wrap.setSize(0, 0);
+                    wrap.setY(b.y+b.height);
+                    st.right = st.top = "0";
+                    a = {width: bw, height: bh, points: pt};
+                break;
+                case "br":
+                    wrap.setSize(0, 0);
+                    wrap.setXY([b.right, b.bottom]);
+                    st.left = st.top = "0";
+                    a = {width: bw, height: bh, points: pt};
+                break;
+                case "tr":
+                    wrap.setSize(0, 0);
+                    wrap.setX(b.x+b.width);
+                    st.left = st.bottom = "0";
+                    a = {width: bw, height: bh, points: pt};
+                break;
+            }
+            this.dom.style.visibility = "visible";
+            wrap.show();
+
+            arguments.callee.anim = wrap.fxanim(a,
+                o,
+                'motion',
+                .5,
+                'easeOut', after);
+        });
+        return this;
+    },
+    
+	/**
+	 * Slides the element out of view.  An anchor point can be optionally passed to set the end point
+	 * for the slide effect.  When the effect is completed, the element will be hidden (visibility = 
+	 * 'hidden') but block elements will still take up space in the document.  The element must be removed
+	 * from the DOM using the 'remove' config option if desired.  This function automatically handles 
+	 * wrapping the element with a fixed-size container if needed.  See the Fx class overview for valid anchor point options.
+	 * Usage:
+	 *<pre><code>
+// default: slide the element out to the top
+el.slideOut();
+
+// custom: slide the element out to the right with a 2-second duration
+el.slideOut('r', { duration: 2 });
+
+// common config options shown with default values
+el.slideOut('t', {<br/>
+    easing: 'easeOut', <br/>
+    duration: .5,<br/>
+    remove: false,<br />
+    useDisplay: false
+});
+	</code></pre>
+	 * @param {String} anchor (optional) One of the valid Fx anchor positions (defaults to top: 't')
+	 * @param {Object} options (optional) Object literal with any of the Fx config options
+	 * @return {Element} The Element
+	 */
+    slideOut : function(anchor, o){
+        var el = this.getFxEl();
+        o = o || {};
+
+        el.queueFx(o, function(){
+
+            anchor = anchor || "t";
+
+            // restore values after effect
+            var r = this.getFxRestore();
+            
+            var b = this.getBox();
+            // fixed size for slide
+            this.setSize(b);
+
+            // wrap if needed
+            var wrap = this.fxWrap(r.pos, o, "visible");
+
+            var st = this.dom.style;
+            st.visibility = "visible";
+            st.position = "absolute";
+
+            wrap.setSize(b);
+
+            var after = function(){
+                if(o.useDisplay){
+                    el.setDisplayed(false);
+                }else{
+                    el.hide();
+                }
+
+                el.fxUnwrap(wrap, r.pos, o);
+
+                st.width = r.width;
+                st.height = r.height;
+
+                el.afterFx(o);
+            };
+
+            var a, zero = {to: 0};
+            switch(anchor.toLowerCase()){
+                case "t":
+                    st.left = st.bottom = "0";
+                    a = {height: zero};
+                break;
+                case "l":
+                    st.right = st.top = "0";
+                    a = {width: zero};
+                break;
+                case "r":
+                    st.left = st.top = "0";
+                    a = {width: zero, points: {to:[b.right, b.y]}};
+                break;
+                case "b":
+                    st.left = st.top = "0";
+                    a = {height: zero, points: {to:[b.x, b.bottom]}};
+                break;
+                case "tl":
+                    st.right = st.bottom = "0";
+                    a = {width: zero, height: zero};
+                break;
+                case "bl":
+                    st.right = st.top = "0";
+                    a = {width: zero, height: zero, points: {to:[b.x, b.bottom]}};
+                break;
+                case "br":
+                    st.left = st.top = "0";
+                    a = {width: zero, height: zero, points: {to:[b.x+b.width, b.bottom]}};
+                break;
+                case "tr":
+                    st.left = st.bottom = "0";
+                    a = {width: zero, height: zero, points: {to:[b.right, b.y]}};
+                break;
+            }
+
+            arguments.callee.anim = wrap.fxanim(a,
+                o,
+                'motion',
+                .5,
+                "easeOut", after);
+        });
+        return this;
+    },
+
+	/**
+	 * Fades the element out while slowly expanding it in all directions.  When the effect is completed, the 
+	 * element will be hidden (visibility = 'hidden') but block elements will still take up space in the document. 
+	 * The element must be removed from the DOM using the 'remove' config option if desired.
+	 * Usage:
+	 *<pre><code>
+// default
+el.puff();
+
+// common config options shown with default values
+el.puff({<br/>
+    easing: 'easeOut', <br/>
+    duration: .5,<br/>
+    remove: false,<br />
+    useDisplay: false
+});
+	</code></pre>
+	 * @param {Object} options (optional) Object literal with any of the Fx config options
+	 * @return {Element} The Element
+	 */
+    puff : function(o){
+        var el = this.getFxEl();
+        o = o || {};
+
+        el.queueFx(o, function(){
+            this.clearOpacity();
+            this.show();
+
+            // restore values after effect
+            var r = this.getFxRestore();
+            var st = this.dom.style;
+
+            var after = function(){
+                if(o.useDisplay){
+                    el.setDisplayed(false);
+                }else{
+                    el.hide();
+                }
+
+                el.clearOpacity();
+
+                el.setPositioning(r.pos);
+                st.width = r.width;
+                st.height = r.height;
+                st.fontSize = '';
+                el.afterFx(o);
+            };
+
+            var width = this.getWidth();
+            var height = this.getHeight();
+
+            arguments.callee.anim = this.fxanim({
+                    width : {to: this.adjustWidth(width * 2)},
+                    height : {to: this.adjustHeight(height * 2)},
+                    points : {by: [-(width * .5), -(height * .5)]},
+                    opacity : {to: 0},
+                    fontSize: {to:200, unit: "%"}
+                },
+                o,
+                'motion',
+                .5,
+                "easeOut", after);
+        });
+        return this;
+    },
+
+	/**
+	 * Blinks the element as if it was clicked and then collapses on its center (similar to switching off a television).
+	 * When the effect is completed, the element will be hidden (visibility = 'hidden') but block elements will still 
+	 * take up space in the document. The element must be removed from the using the 'remove' config option if desired.
+	 * Usage:
+	 *<pre><code>
+// default
+el.switchOff();
+
+// all config options shown with default values
+el.switchOff({<br/>
+    easing: 'easeIn', <br/>
+    duration: .3,<br/>
+    remove: false,<br />
+    useDisplay: false
+});
+	</code></pre>
+	 * @param {Object} options (optional) Object literal with any of the Fx config options
+	 * @return {Element} The Element
+	 */
+    switchOff : function(o){
+        var el = this.getFxEl();
+        o = o || {};
+
+        el.queueFx(o, function(){
+            this.clearOpacity();
+            this.clip();
+
+            // restore values after effect
+            var r = this.getFxRestore();
+            var st = this.dom.style;
+
+            var after = function(){
+                if(o.useDisplay){
+                    el.setDisplayed(false);
+                }else{
+                    el.hide();
+                }
+
+                el.clearOpacity();
+                el.setPositioning(r.pos);
+                st.width = r.width;
+                st.height = r.height;
+
+                el.afterFx(o);
+            };
+
+            this.fxanim({opacity:{to:0.3}}, null, null, .1, null, function(){
+                this.clearOpacity();
+                (function(){
+                    this.fxanim({
+                        height:{to:1},
+                        points:{by:[0, this.getHeight() * .5]}
+                    }, o, 'motion', 0.3, 'easeIn', after);
+                }).defer(100, this);
+            });
+        });
+        return this;
+    },
+
+    /**
+     * Highlights the Element by setting a color (applies to the background-color by default, but can be
+     * changed using the "attr" config option) and then fading back to the original color. If no original
+     * color is available, you should provide the "endColor" config option which will be cleared after the animation.
+     * Usage:
+<pre><code>
+// default: highlight background to yellow
+el.highlight();
+
+// custom: highlight foreground text to blue for 2 seconds
+el.highlight("0000ff", { attr: 'color', duration: 2 });
+
+// common config options shown with default values
+el.highlight("ffff9c", {<br/>
+    attr: "background-color", //can be any valid css attribute that supports a color value<br/>
+    endColor: (current color) or "ffffff",<br/>
+    easing: 'easeIn',<br/>
+    duration: 1<br/>
+});
+</code></pre>
+     * @param {String} color (optional) The highlight color. Should be a 6 char hex color without the leading # (defaults to yellow: 'ffff9c')
+     * @param {Object} options (optional) Object literal with any of the Fx config options
+     * @return {Element} The Element
+     */	
+    highlight : function(color, o){
+        var el = this.getFxEl();
+        o = o || {};
+
+        el.queueFx(o, function(){
+            color = color || "ffff9c";
+            attr = o.attr || "backgroundColor";
+
+            this.clearOpacity();
+            this.show();
+
+            var origColor = this.getColor(attr);
+            var restoreColor = this.dom.style[attr];
+            endColor = (o.endColor || origColor) || "ffffff";
+
+            var after = function(){
+                el.dom.style[attr] = restoreColor;
+                el.afterFx(o);
+            };
+
+            var a = {};
+            a[attr] = {from: color, to: endColor};
+            arguments.callee.anim = this.fxanim(a,
+                o,
+                'color',
+                1,
+                'easeIn', after);
+        });
+        return this;
+    },
+
+   /**
+    * Shows a ripple of exploding, attenuating borders to draw attention to an Element.
+    * Usage:
+<pre><code>
+// default: a single light blue ripple
+el.frame();
+
+// custom: 3 red ripples lasting 3 seconds total
+el.frame("ff0000", 3, { duration: 3 });
+
+// common config options shown with default values
+el.frame("C3DAF9", 1, {<br/>
+    duration: 1 //duration of entire animation (not each individual ripple)<br/>
+    // Note: Easing is not configurable and will be ignored if included
+});
+</code></pre>
+    * @param {String} color (optional) The color of the border.  Should be a 6 char hex color without the leading # (defaults to light blue: 'C3DAF9').
+    * @param {Number} count (optional) The number of ripples to display (defaults to 1)
+    * @param {Object} options (optional) Object literal with any of the Fx config options
+    * @return {Element} The Element
+    */
+    frame : function(color, count, o){
+        var el = this.getFxEl();
+        o = o || {};
+
+        el.queueFx(o, function(){
+            color = color || "#C3DAF9";
+            if(color.length == 6){
+                color = "#" + color;
+            }
+            count = count || 1;
+            duration = o.duration || 1;
+            this.show();
+
+            var b = this.getBox();
+            var animFn = function(){
+                var proxy = this.createProxy({
+                     tag:"div",
+                     style:{
+                        visbility:"hidden",
+                        position:"absolute",
+                        "z-index":"35000", // yee haw
+                        border:"0px solid " + color
+                     }
+                  });
+                var scale = Ext.isBorderBox ? 2 : 1;
+                proxy.animate({
+                    top:{from:b.y, to:b.y - 20},
+                    left:{from:b.x, to:b.x - 20},
+                    borderWidth:{from:0, to:10},
+                    opacity:{from:1, to:0},
+                    height:{from:b.height, to:(b.height + (20*scale))},
+                    width:{from:b.width, to:(b.width + (20*scale))}
+                }, duration, function(){
+                    proxy.remove();
+                });
+                if(--count > 0){
+                     animFn.defer((duration/2)*1000, this);
+                }else{
+                    el.afterFx(o);
+                }
+            };
+            animFn.call(this);
+        });
+        return this;
+    },
+
+   /**
+    * Creates a pause before any subsequent queued effects begin.  If there are
+    * no effects queued after the pause it will have no affect.
+    * Usage:
+<pre><code>
+el.pause(1);
+</code></pre>
+    * @param {Number} seconds The length of time to pause (in seconds)
+    * @return {Element} The Element
+    */
+    pause : function(seconds){
+        var el = this.getFxEl();
+        var o = {};
+
+        el.queueFx(o, function(){
+            setTimeout(function(){
+                el.afterFx(o);
+            }, seconds * 1000);
+        });
+        return this;
+    },
+
+   /**
+    * Fade an element in (from transparent to opaque).  The ending opacity can be specified
+    * using the "endOpacity" config option.
+    * Usage:
+<pre><code>
+// default: fade in from opactiy 0 to 100%
+el.fadeIn();
+
+// custom: fade in from opcaity 0 to 75% over 2 seconds
+el.fadeIn({ endOpacity: .75, duration: 2});
+
+// common config options shown with default values
+el.fadeIn({<br/>
+	endOpacity: 1, //can be any value between 0 and 1 (e.g. .5)<br/>
+    easing: 'easeOut',<br/>
+    duration: .5<br/>
+});
+</code></pre>
+    * @param {Object} options (optional) Object literal with any of the Fx config options
+    * @return {Element} The Element
+    */
+    fadeIn : function(o){
+        var el = this.getFxEl();
+        o = o || {};
+        el.queueFx(o, function(){
+            this.setOpacity(0);
+            this.fixDisplay();
+            this.dom.style.visibility = 'visible';
+            var to = o.endOpacity || 1;
+            arguments.callee.anim = this.fxanim({opacity:{to:to}},
+                o, null, .5, "easeOut", function(){
+                if(to == 1){
+                    this.clearOpacity();
+                }
+                el.afterFx(o);
+            });
+        });
+        return this;
+    },
+
+   /**
+    * Fade an element out (from opaque to transparent).  The ending opacity can be specified
+    * using the "endOpacity" config option.
+    * Usage:
+<pre><code>
+// default: fade out from the element's current opacity to 0
+el.fadeOut();
+
+// custom: fade out from the element's current opacity to 25% over 2 seconds
+el.fadeOut({ endOpacity: .25, duration: 2});
+
+// common config options shown with default values
+el.fadeOut({<br/>
+	endOpacity: 0, //can be any value between 0 and 1 (e.g. .5)<br/>
+    easing: 'easeOut',<br/>
+    duration: .5<br/>
+    remove: false,<br />
+    useDisplay: false
+});
+</code></pre>
+    * @param {Object} options (optional) Object literal with any of the Fx config options
+    * @return {Element} The Element
+    */
+    fadeOut : function(o){
+        var el = this.getFxEl();
+        o = o || {};
+        el.queueFx(o, function(){
+            arguments.callee.anim = this.fxanim({opacity:{to:o.endOpacity || 0}},
+                o, null, .5, "easeOut", function(){
+                if(this.visibilityMode == Ext.Element.DISPLAY || o.useDisplay){
+                     this.dom.style.display = "none";
+                }else{
+                     this.dom.style.visibility = "hidden";
+                }
+                this.clearOpacity();
+                el.afterFx(o);
+            });
+        });
+        return this;
+    },
+
+   /**
+    * Animates the transition of an element's dimensions from a starting height/width
+    * to an ending height/width.
+    * Usage:
+<pre><code>
+// change height and width to 100x100 pixels
+el.scale(100, 100);
+
+// common config options shown with default values.  The height and width will default to
+// the element's existing values if passed as null.
+el.scale(
+	[element's width],<br/>
+	[element's height], {<br/>
+    easing: 'easeOut',<br/>
+    duration: .35<br/>
+});
+</code></pre>
+    * @param {Number} width  The new width (pass null to keep the original width)
+    * @param {Number} height  The new height (pass null to keep the original height)
+    * @param {Object} options (optional) Object literal with any of the Fx config options
+    * @return {Element} The Element
+    */
+    scale : function(w, h, o){
+        this.shift(Ext.apply({}, o, {
+            width: w,
+            height: h
+        }));
+        return this;
+    },
+
+   /**
+    * Animates the transition of any combination of an element's dimensions, xy position and/or opacity.
+    * Any of these properties not specified in the config object will not be changed.  This effect 
+    * requires that at least one new dimension, position or opacity setting must be passed in on
+    * the config object in order for the function to have any affect.
+    * Usage:
+<pre><code>
+// slide the element horizontally to x position 200 while changing the height and opacity
+el.shift({ x: 200, height: 50, opacity: .8 });
+
+// common config options shown with default values.
+el.shift({
+	width: [element's width],<br/>
+	height: [element's height],<br/>
+	x: [element's x position],<br/>
+	y: [element's y position],<br/>
+	opacity: [element's opacity],<br/>
+    easing: 'easeOut',<br/>
+    duration: .35<br/>
+});
+</code></pre>
+    * @param {Object} options  Object literal with any of the Fx config options
+    * @return {Element} The Element
+    */
+    shift : function(o){
+        var el = this.getFxEl();
+        o = o || {};
+        el.queueFx(o, function(){
+            var a = {}, w = o.width, h = o.height, x = o.x, y = o.y,  op = o.opacity;
+            if(w !== undefined){
+                a.width = {to: this.adjustWidth(w)};
+            }
+            if(h !== undefined){
+                a.height = {to: this.adjustHeight(h)};
+            }
+            if(x !== undefined || y !== undefined){
+                a.points = {to: [
+                    x !== undefined ? x : this.getX(),
+                    y !== undefined ? y : this.getY()
+                ]};
+            }
+            if(op !== undefined){
+                a.opacity = {to: op};
+            }
+            if(o.xy !== undefined){
+                a.points = {to: o.xy};
+            }
+            arguments.callee.anim = this.fxanim(a,
+                o, 'motion', .35, "easeOut", function(){
+                el.afterFx(o);
+            });
+        });
+        return this;
+    },
+
+	/**
+	 * Slides the element while fading it out of view.  An anchor point can be optionally passed to set the 
+	 * ending point of the effect.
+	 * Usage:
+	 *<pre><code>
+// default: slide the element downward while fading out
+el.ghost();
+
+// custom: slide the element out to the right with a 2-second duration
+el.ghost('r', { duration: 2 });
+
+// common config options shown with default values
+el.ghost('b', {<br/>
+    easing: 'easeOut', <br/>
+    duration: .5<br/>
+    remove: false,<br />
+    useDisplay: false
+});
+	</code></pre>
+	 * @param {String} anchor (optional) One of the valid Fx anchor positions (defaults to bottom: 'b')
+	 * @param {Object} options (optional) Object literal with any of the Fx config options
+	 * @return {Element} The Element
+	 */
+    ghost : function(anchor, o){
+        var el = this.getFxEl();
+        o = o || {};
+
+        el.queueFx(o, function(){
+            anchor = anchor || "b";
+
+            // restore values after effect
+            var r = this.getFxRestore();
+            var w = this.getWidth(),
+                h = this.getHeight();
+
+            var st = this.dom.style;
+
+            var after = function(){
+                if(o.useDisplay){
+                    el.setDisplayed(false);
+                }else{
+                    el.hide();
+                }
+
+                el.clearOpacity();
+                el.setPositioning(r.pos);
+                st.width = r.width;
+                st.height = r.height;
+
+                el.afterFx(o);
+            };
+
+            var a = {opacity: {to: 0}, points: {}}, pt = a.points;
+            switch(anchor.toLowerCase()){
+                case "t":
+                    pt.by = [0, -h];
+                break;
+                case "l":
+                    pt.by = [-w, 0];
+                break;
+                case "r":
+                    pt.by = [w, 0];
+                break;
+                case "b":
+                    pt.by = [0, h];
+                break;
+                case "tl":
+                    pt.by = [-w, -h];
+                break;
+                case "bl":
+                    pt.by = [-w, h];
+                break;
+                case "br":
+                    pt.by = [w, h];
+                break;
+                case "tr":
+                    pt.by = [w, -h];
+                break;
+            }
+
+            arguments.callee.anim = this.fxanim(a,
+                o,
+                'motion',
+                .5,
+                "easeOut", after);
+        });
+        return this;
+    },
+
+	/**
+	 * Ensures that all effects queued after syncFx is called on the element are
+	 * run concurrently.  This is the opposite of {@link #sequenceFx}.
+	 * @return {Element} The Element
+	 */
+    syncFx : function(){
+        this.fxDefaults = Ext.apply(this.fxDefaults || {}, {
+            block : false,
+            concurrent : true,
+            stopFx : false
+        });
+        return this;
+    },
+
+	/**
+	 * Ensures that all effects queued after sequenceFx is called on the element are
+	 * run in sequence.  This is the opposite of {@link #syncFx}.
+	 * @return {Element} The Element
+	 */
+    sequenceFx : function(){
+        this.fxDefaults = Ext.apply(this.fxDefaults || {}, {
+            block : false,
+            concurrent : false,
+            stopFx : false
+        });
+        return this;
+    },
+
+	/* @private */
+    nextFx : function(){
+        var ef = this.fxQueue[0];
+        if(ef){
+            ef.call(this);
+        }
+    },
+
+	/**
+	 * Returns true if the element has any effects actively running or queued, else returns false.
+	 * @return {Boolean} True if element has active effects, else false
+	 */
+    hasActiveFx : function(){
+        return this.fxQueue && this.fxQueue[0];
+    },
+
+	/**
+	 * Stops any running effects and clears the element's internal effects queue if it contains
+	 * any additional effects that haven't started yet.
+	 * @return {Element} The Element
+	 */
+    stopFx : function(){
+        if(this.hasActiveFx()){
+            var cur = this.fxQueue[0];
+            if(cur && cur.anim && cur.anim.isAnimated()){
+                this.fxQueue = [cur]; // clear out others
+                cur.anim.stop(true);
+            }
+        }
+        return this;
+    },
+
+	/* @private */
+    beforeFx : function(o){
+        if(this.hasActiveFx() && !o.concurrent){
+           if(o.stopFx){
+               this.stopFx();
+               return true;
+           }
+           return false;
+        }
+        return true;
+    },
+
+	/**
+	 * Returns true if the element is currently blocking so that no other effect can be queued
+	 * until this effect is finished, else returns false if blocking is not set.  This is commonly
+	 * used to ensure that an effect initiated by a user action runs to completion prior to the
+	 * same effect being restarted (e.g., firing only one effect even if the user clicks several times).
+	 * @return {Boolean} True if blocking, else false
+	 */
+    hasFxBlock : function(){
+        var q = this.fxQueue;
+        return q && q[0] && q[0].block;
+    },
+
+	/* @private */
+    queueFx : function(o, fn){
+        if(!this.fxQueue){
+            this.fxQueue = [];
+        }
+        if(!this.hasFxBlock()){
+            Ext.applyIf(o, this.fxDefaults);
+            if(!o.concurrent){
+                var run = this.beforeFx(o);
+                fn.block = o.block;
+                this.fxQueue.push(fn);
+                if(run){
+                    this.nextFx();
+                }
+            }else{
+                fn.call(this);
+            }
+        }
+        return this;
+    },
+
+	/* @private */
+    fxWrap : function(pos, o, vis){
+        var wrap;
+        if(!o.wrap || !(wrap = Ext.get(o.wrap))){
+            var wrapXY;
+            if(o.fixPosition){
+                wrapXY = this.getXY();
+            }
+            var div = document.createElement("div");
+            div.style.visibility = vis;
+            wrap = Ext.get(this.dom.parentNode.insertBefore(div, this.dom));
+            wrap.setPositioning(pos);
+            if(wrap.getStyle("position") == "static"){
+                wrap.position("relative");
+            }
+            this.clearPositioning('auto');
+            wrap.clip();
+            wrap.dom.appendChild(this.dom);
+            if(wrapXY){
+                wrap.setXY(wrapXY);
+            }
+        }
+        return wrap;
+    },
+
+	/* @private */
+    fxUnwrap : function(wrap, pos, o){
+        this.clearPositioning();
+        this.setPositioning(pos);
+        if(!o.wrap){
+            wrap.dom.parentNode.insertBefore(this.dom, wrap.dom);
+            wrap.remove();
+        }
+    },
+
+	/* @private */
+    getFxRestore : function(){
+        var st = this.dom.style;
+        return {pos: this.getPositioning(), width: st.width, height : st.height};
+    },
+
+	/* @private */
+    afterFx : function(o){
+        if(o.afterStyle){
+            this.applyStyles(o.afterStyle);
+        }
+        if(o.afterCls){
+            this.addClass(o.afterCls);
+        }
+        if(o.remove === true){
+            this.remove();
+        }
+        Ext.callback(o.callback, o.scope, [this]);
+        if(!o.concurrent){
+            this.fxQueue.shift();
+            this.nextFx();
+        }
+    },
+
+	/* @private */
+    getFxEl : function(){ // support for composite element fx
+        return Ext.get(this.dom);
+    },
+
+	/* @private */
+    fxanim : function(args, opt, animType, defaultDur, defaultEase, cb){
+        animType = animType || 'run';
+        opt = opt || {};
+        var anim = Ext.lib.Anim[animType](
+            this.dom, args,
+            (opt.duration || defaultDur) || .35,
+            (opt.easing || defaultEase) || 'easeOut',
+            function(){
+                Ext.callback(cb, this);
+            },
+            this
+        );
+        opt.anim = anim;
+        return anim;
+    }
+};
+
+// backwords compat
+Ext.Fx.resize = Ext.Fx.scale;
+
+//When included, Ext.Fx is automatically applied to Element so that all basic
+//effects are available directly via the Element API
+Ext.apply(Ext.Element.prototype, Ext.Fx);
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Grid.jss.html b/www/extras/yui-ext/docs/output/Grid.jss.html new file mode 100644 index 000000000..67d52659d --- /dev/null +++ b/www/extras/yui-ext/docs/output/Grid.jss.html @@ -0,0 +1,598 @@ +Grid.js

Grid.js

/**
+ * @class Ext.grid.Grid
+ * @extends Ext.util.Observable
+ * This class represents the primary interface of a component based grid control.
+ * <br><br>Usage:<pre><code>
+ var grid = new Ext.grid.Grid("my-container-id", {
+     ds: myDataStore,
+     cm: myColModel,
+     selModel: mySelectionModel,
+     autoSizeColumns: true,
+     monitorWindowResize: false,
+     trackMouseOver: true
+ });
+ // set any options
+ grid.render();
+ * </code></pre>
+ * <b>Common Problems:</b><br/>
+ * - Grid does not resize properly when going smaller: Setting overflow hidden on the container
+ * element will correct this<br/>
+ * - 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.<br/>
+ * - Do not render the grid into an element with display:none. Try using visibility:hidden. Otherwise there is no way for the
+ * grid to calculate dimensions/offsets.<br/>
+  * @constructor
+ * @param {String/HTMLElement/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} config A config object that sets properties on this grid.
+ */
+Ext.grid.Grid = function(container, config){
+	// initialize the container
+	this.container = Ext.get(container);
+	this.container.update("");
+	this.container.setStyle("overflow", "hidden");
+    this.container.addClass('x-grid-container');
+
+    this.id = this.container.id;
+
+    Ext.apply(this, config);
+    // check and correct shorthanded configs
+    if(this.ds){
+        this.dataSource = this.ds;
+        delete this.ds;
+    }
+    if(this.cm){
+        this.colModel = this.cm;
+        delete this.cm;
+    }
+    if(this.sm){
+        this.selModel = this.sm;
+        delete this.sm;
+    }
+
+    if(this.width){
+        this.container.setWidth(this.width);
+    }
+
+    if(this.height){
+        this.container.setHeight(this.height);
+    }
+    /** @private */
+	this.addEvents({
+	    // raw events
+	    /**
+	     * @event click
+	     * The raw click event for the entire grid.
+	     * @param {Ext.EventObject} e
+	     */
+	    "click" : true,
+	    /**
+	     * @event dblclick
+	     * The raw dblclick event for the entire grid.
+	     * @param {Ext.EventObject} e
+	     */
+	    "dblclick" : true,
+	    /**
+	     * @event contextmenu
+	     * The raw contextmenu event for the entire grid.
+	     * @param {Ext.EventObject} e
+	     */
+	    "contextmenu" : true,
+	    /**
+	     * @event mousedown
+	     * The raw mousedown event for the entire grid.
+	     * @param {Ext.EventObject} e
+	     */
+	    "mousedown" : true,
+	    /**
+	     * @event mouseup
+	     * The raw mouseup event for the entire grid.
+	     * @param {Ext.EventObject} e
+	     */
+	    "mouseup" : true,
+	    /**
+	     * @event mouseover
+	     * The raw mouseover event for the entire grid.
+	     * @param {Ext.EventObject} e
+	     */
+	    "mouseover" : true,
+	    /**
+	     * @event mouseout
+	     * The raw mouseout event for the entire grid.
+	     * @param {Ext.EventObject} e
+	     */
+	    "mouseout" : true,
+	    /**
+	     * @event keypress
+	     * The raw keypress event for the entire grid.
+	     * @param {Ext.EventObject} e
+	     */
+	    "keypress" : true,
+	    /**
+	     * @event keydown
+	     * The raw keydown event for the entire grid.
+	     * @param {Ext.EventObject} e
+	     */
+	    "keydown" : true,
+
+	    // custom events
+
+	    /**
+	     * @event cellclick
+	     * Fires when a cell is clicked
+	     * @param {Grid} this
+	     * @param {Number} rowIndex
+	     * @param {Number} columnIndex
+	     * @param {Ext.EventObject} e
+	     */
+	    "cellclick" : true,
+	    /**
+	     * @event celldblclick
+	     * Fires when a cell is double clicked
+	     * @param {Grid} this
+	     * @param {Number} rowIndex
+	     * @param {Number} columnIndex
+	     * @param {Ext.EventObject} e
+	     */
+	    "celldblclick" : true,
+	    /**
+	     * @event rowclick
+	     * Fires when a row is clicked
+	     * @param {Grid} this
+	     * @param {Number} rowIndex
+	     * @param {Ext.EventObject} e
+	     */
+	    "rowclick" : true,
+	    /**
+	     * @event rowdblclick
+	     * Fires when a row is double clicked
+	     * @param {Grid} this
+	     * @param {Number} rowIndex
+	     * @param {Ext.EventObject} e
+	     */
+	    "rowdblclick" : true,
+	    /**
+	     * @event headerclick
+	     * Fires when a header is clicked
+	     * @param {Grid} this
+	     * @param {Number} columnIndex
+	     * @param {Ext.EventObject} e
+	     */
+	    "headerclick" : true,
+	    /**
+	     * @event headerdblclick
+	     * Fires when a header cell is double clicked
+	     * @param {Grid} this
+	     * @param {Number} rowIndex
+	     * @param {Number} columnIndex
+	     * @param {Ext.EventObject} e
+	     */
+	    "headerdblclick" : true,
+	    /**
+	     * @event rowcontextmenu
+	     * Fires when a row is right clicked
+	     * @param {Grid} this
+	     * @param {Number} rowIndex
+	     * @param {Ext.EventObject} e
+	     */
+	    "rowcontextmenu" : true,
+	    /**
+         * @event cellcontextmenu
+         * Fires when a cell is right clicked
+         * @param {Grid} this
+         * @param {Number} rowIndex
+         * @param {Number} cellIndex
+         * @param {Ext.EventObject} e
+         */
+         "cellcontextmenu" : true,
+	    /**
+	     * @event headercontextmenu
+	     * Fires when a header is right clicked
+	     * @param {Grid} this
+	     * @param {Number} columnIndex
+	     * @param {Ext.EventObject} e
+	     */
+	    "headercontextmenu" : true,
+	    /**
+	     * @event bodyscroll
+	     * Fires when the body element is scrolled
+	     * @param {Number} scrollLeft
+	     * @param {Number} scrollTop
+	     */
+	    "bodyscroll" : true,
+	    /**
+	     * @event columnresize
+	     * Fires when the user resizes a column
+	     * @param {Number} columnIndex
+	     * @param {Number} newSize
+	     */
+	    "columnresize" : true,
+	    /**
+	     * @event columnmove
+	     * Fires when the user moves a column
+	     * @param {Number} oldIndex
+	     * @param {Number} newIndex
+	     */
+	    "columnmove" : true,
+	    /**
+	     * @event startdrag
+	     * Fires when row(s) start being dragged
+	     * @param {Grid} this
+	     * @param {Ext.GridDD} dd The drag drop object
+	     * @param {event} e The raw browser event
+	     */
+	    "startdrag" : true,
+	    /**
+	     * @event enddrag
+	     * Fires when a drag operation is complete
+	     * @param {Grid} this
+	     * @param {Ext.GridDD} dd The drag drop object
+	     * @param {event} e The raw browser event
+	     */
+	    "enddrag" : true,
+	    /**
+	     * @event dragdrop
+	     * Fires when dragged row(s) are dropped on a valid DD target
+	     * @param {Grid} this
+	     * @param {Ext.GridDD} dd The drag drop object
+	     * @param {String} targetId The target drag drop object
+	     * @param {event} e The raw browser event
+	     */
+	    "dragdrop" : true,
+	    /**
+	     * @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 {Ext.GridDD} dd The drag drop object
+	     * @param {String} targetId The target drag drop object
+	     * @param {event} e The raw browser event
+	     */
+	    "dragover" : true,
+	    /**
+	     * @event dragenter
+	     *  Fires when the dragged row(s) first cross another DD target while being dragged
+	     * @param {Grid} this
+	     * @param {Ext.GridDD} dd The drag drop object
+	     * @param {String} targetId The target drag drop object
+	     * @param {event} e The raw browser event
+	     */
+	    "dragenter" : true,
+	    /**
+	     * @event dragout
+	     * Fires when the dragged row(s) leave another DD target while being dragged
+	     * @param {Grid} this
+	     * @param {Ext.GridDD} dd The drag drop object
+	     * @param {String} targetId The target drag drop object
+	     * @param {event} e The raw browser event
+	     */
+	    "dragout" : true
+	});
+
+    Ext.grid.Grid.superclass.constructor.call(this);
+};
+Ext.extend(Ext.grid.Grid, Ext.util.Observable, {
+    /**
+     * @cfg {Number} The minimum width a column can be resized to. Defaults to 25.
+	 */
+	minColumnWidth : 25,
+
+    /**
+	 * @cfg {Boolean} True to automatically resize the columns to fit their content
+	 * <b>on initial render.</b> It is more efficient to explicitly size the columns
+	 * through the ColumnModel's {@link Ext.grid.ColumnModel#width} config option.
+	 */
+	autoSizeColumns : false,
+
+	/**
+	 * @cfg {Boolean} True to measure headers with column data when auto sizing columns.
+	 */
+	autoSizeHeaders : true,
+
+	/**
+	 * @cfg {Boolean} True to autoSize the grid when the window resizes. Defaults to true.
+	 */
+	monitorWindowResize : true,
+
+	/**
+	 * @cfg {Boolean} 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).
+	 */
+	maxRowsToMeasure : 0,
+
+	/**
+	 * @cfg {Boolean} True to highlight rows when the mouse is over. Default is false.
+	 */
+	trackMouseOver : true,
+
+	/**
+	 * @cfg {Boolean} True to enable drag and drop of rows.
+	 */
+	enableDragDrop : false,
+
+	/**
+	 * @cfg {Boolean} True to enable drag and drop reorder of columns.
+	 */
+	enableColumnMove : true,
+
+	/**
+	 * @cfg {Boolean} True to enable hiding of columns with the header context menu.
+	 */
+	enableColumnHide : true,
+
+	/**
+	 * @cfg {Boolean} True to manually sync row heights across locked and not locked rows.
+	 */
+	enableRowHeightSync : false,
+
+	/**
+	 * @cfg {Boolean} True to stripe the rows. Default is true.
+	 */
+	stripeRows : true,
+
+	/**
+	 * @cfg {Boolean} True to fit the height of the grid container to the height of the data. Defaults to false.
+	 */
+	autoHeight : false,
+
+    /**
+     * @cfg {String} The id of a column in this grid that should expand to fill unused space.
+     */
+    autoExpandColumn : false,
+
+    /**
+    * @cfg {Number} The minimum width the autoExpandColumn can have (if enabled).
+    * defaults to 50.
+    */
+    autoExpandMin : 50,
+
+    /**
+    * @cfg {Number} The maximum width the autoExpandColumn can have (if enabled). Defaults to 1000.
+    */
+    autoExpandMax : 1000,
+
+    /**
+	 * @cfg {Object} The {@link Ext.grid.GridView} used by the grid. This can be set before a call to render().
+	 */
+	view : null,
+
+	/**
+	 * @cfg {Object} A javascript RegExp defining tagNames
+     * allowed to have text selection (Defaults to <code>/INPUT|TEXTAREA|SELECT/i</code>).
+     */
+    allowTextSelectionPattern : /INPUT|TEXTAREA|SELECT/i,
+
+    /**
+     * @cfg {Object} An {@link Ext.LoadMask} config or true to mask the grid while loading (defaults to false).
+	 */
+	loadMask : false,
+
+    // private
+    rendered : false,
+
+    /**
+    * Sets the maximum height of the grid - ignored if autoHeight is not on.
+    * @type Number
+    */
+// holder
+/***
+     * Called once after all setup has been completed and the grid is ready to be rendered.
+     * @return {Ext.grid.Grid} this
+     */
+    render : function(){
+        var c = this.container;
+        // try to detect autoHeight/width mode
+        if((!c.dom.offsetHeight || c.dom.offsetHeight < 20) || c.getStyle("height") == "auto"){
+    	    this.autoHeight = true;
+    	}
+    	var view = this.getView();
+        view.init(this);
+
+        c.on("click", this.onClick, this);
+        c.on("dblclick", this.onDblClick, this);
+        c.on("contextmenu", this.onContextMenu, this);
+        c.on("keydown", this.onKeyDown, this);
+
+        this.relayEvents(c, ["mousedown","mouseup","mouseover","mouseout","keypress"]);
+
+        this.getSelectionModel().init(this);
+
+        view.render();
+
+        if(this.loadMask){
+            this.loadMask = new Ext.LoadMask(this.container,
+                    Ext.apply({store:this.dataSource}, this.loadMask));
+        }
+        this.rendered = true;
+        return this;
+    },
+
+    reconfigure : function(dataSource, colModel){
+        if(this.loadMask){
+            this.loadMask.destroy();
+            this.loadMask = new Ext.LoadMask(this.container,
+                    Ext.apply({store:dataSource}, this.loadMask));
+        }
+        this.view.bind(dataSource, colModel);
+        this.dataSource = dataSource;
+        this.colModel = colModel;
+        this.view.refresh(true);
+    },
+
+    onKeyDown : function(e){
+        this.fireEvent("keydown", e);
+    },
+
+    /**
+     * Destroy this grid.
+     * @param {Boolean} removeEl True to remove the element
+     */
+    destroy : function(removeEl, keepListeners){
+        if(this.loadMask){
+            this.loadMask.destroy();
+        }
+        var c = this.container;
+        c.removeAllListeners();
+        this.view.destroy();
+        this.colModel.purgeListeners();
+        if(!keepListeners){
+            this.purgeListeners();
+        }
+        c.update("");
+        if(removeEl === true){
+            c.remove();
+        }
+    },
+
+    // private
+    processEvent : function(name, e){
+        this.fireEvent(name, e);
+        var t = e.getTarget();
+        var v = this.view;
+        var header = v.findHeaderIndex(t);
+        if(header !== false){
+            this.fireEvent("header" + name, this, header, e);
+        }else{
+            var row = v.findRowIndex(t);
+            var cell = v.findCellIndex(t);
+            if(row !== false){
+                this.fireEvent("row" + name, this, row, e);
+                if(cell !== false){
+                    this.fireEvent("cell" + name, this, row, cell, e);
+                }
+            }
+        }
+    },
+
+    // private
+    onClick : function(e){
+        this.processEvent("click", e);
+    },
+
+    // private
+    onContextMenu : function(e, t){
+        this.processEvent("contextmenu", e);
+    },
+
+    // private
+    onDblClick : function(e){
+        this.processEvent("dblclick", e);
+    },
+
+    walkCells : function(row, col, step, fn, scope){
+        var cm = this.colModel, clen = cm.getColumnCount();
+        var ds = this.dataSource, rlen = ds.getCount(), first = true;
+        if(step < 0){
+            if(col < 0){
+                row--;
+                first = false;
+            }
+            while(row >= 0){
+                if(!first){
+                    col = clen-1;
+                }
+                first = false;
+                while(col >= 0){
+                    if(fn.call(scope || this, row, col, cm) === true){
+                        return [row, col];
+                    }
+                    col--;
+                }
+                row--;
+            }
+        } else {
+            if(col >= clen){
+                row++;
+                first = false;
+            }
+            while(row < rlen){
+                if(!first){
+                    col = 0;
+                }
+                first = false;
+                while(col < clen){
+                    if(fn.call(scope || this, row, col, cm) === true){
+                        return [row, col];
+                    }
+                    col++;
+                }
+                row++;
+            }
+        }
+        return null;
+    },
+
+    getSelections : function(){
+        return this.selModel.getSelections();
+    },
+
+    /**
+     * Causes the grid to manually recalculate its dimensions. Generally this is done automatically,
+     * but if manual update is required this method will initiate it.
+     */
+    autoSize : function(){
+        if(this.rendered){
+            this.view.layout();
+            if(this.view.adjustForScroll){
+                this.view.adjustForScroll();
+            }
+        }
+    },
+
+    // private for compatibility, overridden by editor grid
+    stopEditing : function(){},
+
+    /**
+     * Returns the grid's SelectionModel.
+     * @return {SelectionModel}
+     */
+    getSelectionModel : function(){
+        if(!this.selModel){
+            this.selModel = new Ext.grid.RowSelectionModel();
+        }
+        return this.selModel;
+    },
+
+    /**
+     * Returns the grid's DataSource.
+     * @return {DataSource}
+     */
+    getDataSource : function(){
+        return this.dataSource;
+    },
+
+    /**
+     * Returns the grid's ColumnModel.
+     * @return {ColumnModel}
+     */
+    getColumnModel : function(){
+        return this.colModel;
+    },
+
+    /**
+     * Returns the grid's GridView object.
+     * @return {GridView}
+     */
+    getView : function(){
+        if(!this.view){
+            this.view = new Ext.grid.GridView();
+        }
+        return this.view;
+    },
+    /**
+     * Called to get grid's drag proxy text, by default returns this.ddText.
+     * @return {String}
+     */
+    getDragDropText : function(){
+        var count = this.selModel.getCount();
+        return String.format(this.ddText, count, count == 1 ? '' : 's');
+    }
+});
+/**
+ * Configures the text is the drag proxy (defaults to "%0 selected row(s)").
+ * %0 is replaced with the number of selected rows.
+ * @type String
+ */
+Ext.grid.Grid.prototype.ddText = "{0} selected row{1}";

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/GridDD.jss.html b/www/extras/yui-ext/docs/output/GridDD.jss.html new file mode 100644 index 000000000..0c4b0d572 --- /dev/null +++ b/www/extras/yui-ext/docs/output/GridDD.jss.html @@ -0,0 +1,58 @@ +GridDD.js

GridDD.js

// private
+// This is a support class used internally by the Grid components
+Ext.grid.GridDragZone = function(grid, config){
+    this.view = grid.getView();
+    Ext.grid.GridDragZone.superclass.constructor.call(this, this.view.lockedBody.dom, config);
+    this.setHandleElId(Ext.id(this.view.lockedBody.dom));
+    this.setOuterHandleElId(Ext.id(this.view.mainBody.dom));
+    this.scroll = false;
+    this.grid = grid;
+    this.ddel = document.createElement('div');
+    this.ddel.className = 'x-grid-dd-wrap';
+};
+
+Ext.extend(Ext.grid.GridDragZone, Ext.dd.DragZone, {
+    ddGroup : "GridDD",
+
+    getDragData : function(e){
+        var t = Ext.lib.Event.getTarget(e);
+        var rowIndex = this.view.findRowIndex(t);
+        if(rowIndex !== false){
+            var sm = this.grid.selModel;
+            if(!sm.isSelected(rowIndex) || e.hasModifier()){
+                sm.handleMouseDown(e, t);
+            }
+            return {grid: this.grid, ddel: this.ddel, rowIndex: rowIndex, selections:sm.getSelections()};
+        }
+        return false;
+    },
+
+    onInitDrag : function(e){
+        var data = this.dragData;
+        this.ddel.innerHTML = this.grid.getDragDropText();
+        this.proxy.update(this.ddel);
+        // fire start drag?
+    },
+
+    afterRepair : function(){
+        this.dragging = false;
+    },
+
+    getRepairXY : function(e, data){
+        return false;
+    },
+
+    onEndDrag : function(data, e){
+        // fire end drag?
+    },
+
+    onValidDrop : function(dd, e, id){
+        // fire drag drop?
+        this.hideProxy();
+    },
+
+    beforeInvalidDrop : function(e, id){
+
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/GridEditor.jss.html b/www/extras/yui-ext/docs/output/GridEditor.jss.html new file mode 100644 index 000000000..dbe471f40 --- /dev/null +++ b/www/extras/yui-ext/docs/output/GridEditor.jss.html @@ -0,0 +1,16 @@ +GridEditor.js

GridEditor.js

// private
+// This is a support class used internally by the Grid components
+Ext.grid.GridEditor = function(field, config){
+    Ext.grid.GridEditor.superclass.constructor.call(this, field, config);
+    field.monitorTab = false;
+};
+
+Ext.extend(Ext.grid.GridEditor, Ext.Editor, {
+    alignment: "tl-tl",
+    autoSize: "width",
+    hideEl : false,
+    cls: "x-small-editor x-grid-editor",
+    shim:false,
+    shadow:"frame"
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/GridView.jss.html b/www/extras/yui-ext/docs/output/GridView.jss.html new file mode 100644 index 000000000..6eaeaaaeb --- /dev/null +++ b/www/extras/yui-ext/docs/output/GridView.jss.html @@ -0,0 +1,1505 @@ +GridView.js

GridView.js

/**
+ * @class Ext.grid.GridView
+ * @extends AbstractGridView
+ * The default GridView implementation
+ * @constructor
+ * @param {Object} config
+ */
+
+Ext.grid.GridView = function(config){
+    Ext.grid.GridView.superclass.constructor.call(this);
+    this.el = null;
+
+    Ext.apply(this, config);
+};
+
+Ext.extend(Ext.grid.GridView, Ext.grid.AbstractGridView, {
+
+    /**
+     * Override this function to apply custom css classes to rows during rendering
+     * @param {Record} record The record
+     * @param {Number} index
+     * @method getRowClass
+     */
+    rowClass : "x-grid-row",
+
+    cellClass : "x-grid-col",
+
+    tdClass : "x-grid-td",
+
+    hdClass : "x-grid-hd",
+
+    splitClass : "x-grid-split",
+
+    sortClasses : ["sort-asc", "sort-desc"],
+
+    enableMoveAnim : false,
+
+    hlColor: "C3DAF9",
+
+    dh : Ext.DomHelper,
+
+    fly : Ext.Element.fly,
+
+    css : Ext.util.CSS,
+
+    borderWidth: 1,
+
+    splitOffset: 3,
+
+    scrollIncrement : 22,
+
+    cellRE: /(?:.*?)x-grid-(?:hd|cell|csplit)-(?:[\d]+)-([\d]+)(?:.*?)/,
+
+    findRE: /\s?(?:x-grid-hd|x-grid-col|x-grid-csplit)\s/,
+
+    bind : function(ds, cm){
+        if(this.ds){
+            this.ds.un("load", this.onLoad, this);
+            this.ds.un("datachanged", this.onDataChange);
+            this.ds.un("add", this.onAdd);
+            this.ds.un("remove", this.onRemove);
+            this.ds.un("update", this.onUpdate);
+            this.ds.un("clear", this.onClear);
+        }
+        if(ds){
+            ds.on("load", this.onLoad, this);
+            ds.on("datachanged", this.onDataChange, this);
+            ds.on("add", this.onAdd, this);
+            ds.on("remove", this.onRemove, this);
+            ds.on("update", this.onUpdate, this);
+            ds.on("clear", this.onClear, this);
+        }
+        this.ds = ds;
+
+        if(this.cm){
+            this.cm.un("widthchange", this.onColWidthChange, this);
+            this.cm.un("headerchange", this.onHeaderChange, this);
+            this.cm.un("hiddenchange", this.onHiddenChange, this);
+            this.cm.un("columnmoved", this.onColumnMove, this);
+            this.cm.un("columnlockchange", this.onColumnLock, this);
+        }
+        if(cm){
+            this.generateRules(cm);
+            cm.on("widthchange", this.onColWidthChange, this);
+            cm.on("headerchange", this.onHeaderChange, this);
+            cm.on("hiddenchange", this.onHiddenChange, this);
+            cm.on("columnmoved", this.onColumnMove, this);
+            cm.on("columnlockchange", this.onColumnLock, this);
+        }
+        this.cm = cm;
+    },
+
+    init: function(grid){
+		Ext.grid.GridView.superclass.init.call(this, grid);
+
+		this.bind(grid.dataSource, grid.colModel);
+
+	    grid.on("headerclick", this.handleHeaderClick, this);
+
+        if(grid.trackMouseOver){
+            grid.on("mouseover", this.onRowOver, this);
+	        grid.on("mouseout", this.onRowOut, this);
+	    }
+	    grid.cancelTextSelection = function(){};
+		this.gridId = grid.id;
+
+		var tpls = this.templates || {};
+
+		if(!tpls.master){
+		    tpls.master = new Ext.Template(
+		       '<div class="x-grid" hidefocus="true">',
+		          '<div class="x-grid-topbar"></div>',
+		          '<div class="x-grid-scroller"><div></div></div>',
+		          '<div class="x-grid-locked">',
+		              '<div class="x-grid-header">{lockedHeader}</div>',
+		              '<div class="x-grid-body">{lockedBody}</div>',
+		          "</div>",
+		          '<div class="x-grid-viewport">',
+		              '<div class="x-grid-header">{header}</div>',
+		              '<div class="x-grid-body">{body}</div>',
+		          "</div>",
+		          '<div class="x-grid-bottombar"></div>',
+		          '<a href="#" class="x-grid-focus" tabIndex="-1"></a>',
+		          '<div class="x-grid-resize-proxy">&#160;</div>',
+		       "</div>"
+		    );
+		    tpls.master.disableformats = true;
+		}
+
+		if(!tpls.header){
+		    tpls.header = new Ext.Template(
+		       '<table border="0" cellspacing="0" cellpadding="0">',
+		       '<tbody><tr class="x-grid-hd-row">{cells}</tr></tbody>',
+		       "</table>{splits}"
+		    );
+		    tpls.header.disableformats = true;
+		}
+		tpls.header.compile();
+
+		if(!tpls.hcell){
+		    tpls.hcell = new Ext.Template(
+		        '<td class="x-grid-hd x-grid-td-{id} {cellId}"><div title="{title}" class="x-grid-hd-inner x-grid-hd-{id}">',
+		        '<div class="x-grid-hd-text" unselectable="on">{value}<img class="x-grid-sort-icon" src="', Ext.BLANK_IMAGE_URL, '" /></div>',
+		        "</div></td>"
+		     );
+		     tpls.hcell.disableFormats = true;
+		}
+		tpls.hcell.compile();
+
+		if(!tpls.hsplit){
+		    tpls.hsplit = new Ext.Template('<div class="x-grid-split {splitId} x-grid-split-{id}" style="{style}" unselectable="on">&#160;</div>');
+		    tpls.hsplit.disableFormats = true;
+		}
+		tpls.hsplit.compile();
+
+		if(!tpls.body){
+		    tpls.body = new Ext.Template(
+		       '<table border="0" cellspacing="0" cellpadding="0">',
+		       "<tbody>{rows}</tbody>",
+		       "</table>"
+		    );
+		    tpls.body.disableFormats = true;
+		}
+		tpls.body.compile();
+
+		if(!tpls.row){
+		    tpls.row = new Ext.Template('<tr class="x-grid-row {alt}">{cells}</tr>');
+		    tpls.row.disableFormats = true;
+		}
+		tpls.row.compile();
+
+		if(!tpls.cell){
+		    tpls.cell = new Ext.Template(
+		        '<td class="x-grid-col x-grid-td-{id} {cellId} {css}" tabIndex="0">',
+		        '<div class="x-grid-col-{id} x-grid-cell-inner"><div class="x-grid-cell-text" unselectable="on" {attr}>{value}</div></div>',
+		        "</td>"
+		    );
+            tpls.cell.disableFormats = true;
+        }
+		tpls.cell.compile();
+
+		this.templates = tpls;
+	},
+
+	// remap these for backwards compat
+    onColWidthChange : function(){
+        this.updateColumns.apply(this, arguments);
+    },
+    onHeaderChange : function(){
+        this.updateHeaders.apply(this, arguments);
+    }, 
+    onHiddenChange : function(){
+        this.handleHiddenChange.apply(this, arguments);
+    },
+    onColumnMove : function(){
+        this.handleColumnMove.apply(this, arguments);
+    },
+    onColumnLock : function(){
+        this.handleLockChange.apply(this, arguments);
+    },
+
+    onDataChange : function(){
+        this.refresh();
+        this.updateHeaderSortState();
+    },
+
+	onClear : function(){
+        this.refresh();
+    },
+
+	onUpdate : function(ds, record){
+        this.refreshRow(record);
+    },
+
+    refreshRow : function(record){
+        var ds = this.ds, index;
+        if(typeof record == 'number'){
+            index = record;
+            record = ds.getAt(index);
+        }else{
+            index = ds.indexOf(record);
+        }
+        var rows = this.getRowComposite(index);
+        var cls = [];
+        this.insertRows(ds, index, index, true);
+        this.onRemove(ds, record, index+1, true);
+        this.syncRowHeights(index, index);
+        this.layout();
+        this.fireEvent("rowupdated", this, index, record);
+    },
+
+    onAdd : function(ds, records, index){
+        this.insertRows(ds, index, index + (records.length-1));
+    },
+
+    onRemove : function(ds, record, index, isUpdate){
+        if(isUpdate !== true){
+            this.fireEvent("beforerowremoved", this, index, record);
+        }
+        var bt = this.getBodyTable(), lt = this.getLockedTable();
+        if(bt.rows[index]){
+            bt.firstChild.removeChild(bt.rows[index]);
+        }
+        if(lt.rows[index]){
+            lt.firstChild.removeChild(lt.rows[index]);
+        }
+        if(isUpdate !== true){
+            this.stripeRows(index);
+            this.syncRowHeights(index, index);
+            this.layout();
+            this.fireEvent("rowremoved", this, index, record);
+        }
+    },
+
+    onLoad : function(){
+        this.scrollToTop();
+    },
+
+    /**
+     * Scrolls the grid to the top
+     */
+    scrollToTop : function(){
+        if(this.scroller){
+            this.scroller.dom.scrollTop = 0;
+            this.syncScroll();
+        }
+    },
+
+    /**
+     * Gets a panel in the header of the grid that can be used for toolbars etc.
+     * After modifying the contents of this panel a call to grid.autoSize() may be
+     * required to register any changes in size.
+     * @param {Boolean} doShow By default the header is hidden. Pass true to show the panel
+     * @return Ext.Element
+     */
+    getHeaderPanel : function(doShow){
+        if(doShow){
+            this.headerPanel.show();
+        }
+        return this.headerPanel;
+	},
+
+	/**
+     * Gets a panel in the footer of the grid that can be used for toolbars etc.
+     * After modifying the contents of this panel a call to grid.autoSize() may be
+     * required to register any changes in size.
+     * @param {Boolean} doShow By default the footer is hidden. Pass true to show the panel
+     * @return Ext.Element
+     */
+    getFooterPanel : function(doShow){
+        if(doShow){
+            this.footerPanel.show();
+        }
+        return this.footerPanel;
+	},
+
+	initElements : function(){
+	    var E = Ext.Element;
+	    var el = this.grid.container.dom.firstChild;
+	    var cs = el.childNodes;
+
+	    this.el = new E(el);
+	    this.headerPanel = new E(el.firstChild);
+	    this.headerPanel.enableDisplayMode("block");
+
+        this.scroller = new E(cs[1]);
+	    this.scrollSizer = new E(this.scroller.dom.firstChild);
+
+	    this.lockedWrap = new E(cs[2]);
+	    this.lockedHd = new E(this.lockedWrap.dom.firstChild);
+	    this.lockedBody = new E(this.lockedWrap.dom.childNodes[1]);
+
+	    this.mainWrap = new E(cs[3]);
+	    this.mainHd = new E(this.mainWrap.dom.firstChild);
+	    this.mainBody = new E(this.mainWrap.dom.childNodes[1]);
+
+	    this.footerPanel = new E(cs[4]);
+	    this.footerPanel.enableDisplayMode("block");
+
+        this.focusEl = new E(cs[5]);
+        this.focusEl.swallowEvent("click", true);
+        this.resizeProxy = new E(cs[6]);
+
+	    this.headerSelector = String.format(
+	       '#{0} td.x-grid-hd, #{1} td.x-grid-hd',
+	       this.lockedHd.id, this.mainHd.id
+	    );
+
+	    this.splitterSelector = String.format(
+	       '#{0} div.x-grid-split, #{1} div.x-grid-split',
+	       this.lockedHd.id, this.mainHd.id
+	    );
+    },
+
+	getHeaderCell : function(index){
+	    return Ext.DomQuery.select(this.headerSelector)[index];
+	},
+
+	getHeaderCellMeasure : function(index){
+	    return this.getHeaderCell(index).firstChild;
+	},
+
+	getHeaderCellText : function(index){
+	    return this.getHeaderCell(index).firstChild.firstChild;
+	},
+
+	getLockedTable : function(){
+	    return this.lockedBody.dom.firstChild;
+	},
+
+	getBodyTable : function(){
+	    return this.mainBody.dom.firstChild;
+	},
+
+	getLockedRow : function(index){
+	    return this.getLockedTable().rows[index];
+	},
+
+	getRow : function(index){
+	    return this.getBodyTable().rows[index];
+	},
+
+	getRowComposite : function(index){
+	    if(!this.rowEl){
+	        this.rowEl = new Ext.CompositeElementLite();
+	    }
+        var els = [], lrow, mrow;
+        if(lrow = this.getLockedRow(index)){
+            els.push(lrow);
+        }
+        if(mrow = this.getRow(index)){
+            els.push(mrow);
+        }
+        this.rowEl.elements = els;
+	    return this.rowEl;
+	},
+
+	getCell : function(rowIndex, colIndex){
+	    var locked = this.cm.getLockedCount();
+	    var source;
+	    if(colIndex < locked){
+	        source = this.lockedBody.dom.firstChild;
+	    }else{
+	        source = this.mainBody.dom.firstChild;
+	        colIndex -= locked;
+	    }
+        return source.rows[rowIndex].childNodes[colIndex];
+	},
+
+	getCellText : function(rowIndex, colIndex){
+	    return this.getCell(rowIndex, colIndex).firstChild.firstChild;
+	},
+
+	getCellBox : function(cell){
+	    var b = this.fly(cell).getBox();
+        if(Ext.isOpera){ // opera fails to report the Y
+            b.y = cell.offsetTop + this.mainBody.getY();
+        }
+        return b;
+    },
+
+    getCellIndex : function(cell){
+        var id = String(cell.className).match(this.cellRE);
+        if(id){
+            return parseInt(id[1], 10);
+        }
+        return 0;
+    },
+
+    findHeaderIndex : function(n){
+        var r = Ext.fly(n).findParent("td." + this.hdClass, 6);
+        return r ? this.getCellIndex(r) : false;
+    },
+
+    findHeaderCell : function(n){
+        var r = Ext.fly(n).findParent("td." + this.hdClass, 6);
+        return r ? r : false;
+    },
+
+    findRowIndex : function(n){
+        if(!n){
+            return false;
+        }
+        var r = Ext.fly(n).findParent("tr." + this.rowClass, 6);
+        return r ? r.rowIndex : false;
+    },
+
+    findCellIndex : function(node){
+        var stop = this.el.dom;
+        while(node && node != stop){
+            if(this.findRE.test(node.className)){
+                return this.getCellIndex(node);
+            }
+            node = node.parentNode;
+        }
+        return false;
+    },
+
+    getColumnId : function(index){
+	    return this.cm.getColumnId(index);
+	},
+
+	getSplitters : function(){
+	    if(this.splitterSelector){
+	       return Ext.DomQuery.select(this.splitterSelector);
+	    }else{
+	        return null;
+	    }
+	},
+
+	getSplitter : function(index){
+	    return this.getSplitters()[index];
+	},
+
+    onRowOver : function(e, t){
+        var row;
+        if((row = this.findRowIndex(t)) !== false){
+            this.getRowComposite(row).addClass("x-grid-row-over");
+        }
+    },
+
+    onRowOut : function(e, t){
+        var row;
+        if((row = this.findRowIndex(t)) !== false && row !== this.findRowIndex(e.getRelatedTarget())){
+            this.getRowComposite(row).removeClass("x-grid-row-over");
+        }
+    },
+
+    renderHeaders : function(){
+	    var cm = this.cm;
+        var ct = this.templates.hcell, ht = this.templates.header, st = this.templates.hsplit;
+        var cb = [], lb = [], sb = [], lsb = [], p = {};
+        for(var i = 0, len = cm.getColumnCount(); i < len; i++){
+            p.cellId = "x-grid-hd-0-" + i;
+            p.splitId = "x-grid-csplit-0-" + i;
+            p.id = cm.getColumnId(i);
+            p.title = cm.getColumnTooltip(i) || "";
+            p.value = cm.getColumnHeader(i) || "";
+            p.style = (this.grid.enableColumnResize === false || !cm.isResizable(i) || cm.isFixed(i)) ? 'cursor:default' : '';
+            if(!cm.isLocked(i)){
+                cb[cb.length] = ct.apply(p);
+                sb[sb.length] = st.apply(p);
+            }else{
+                lb[lb.length] = ct.apply(p);
+                lsb[lsb.length] = st.apply(p);
+            }
+        }
+        return [ht.apply({cells: lb.join(""), splits:lsb.join("")}),
+                ht.apply({cells: cb.join(""), splits:sb.join("")})];
+	},
+
+	updateHeaders : function(){
+        var html = this.renderHeaders();
+        this.lockedHd.update(html[0]);
+        this.mainHd.update(html[1]);
+    },
+
+    /**
+     * Focuses the specified row.
+     * @param {Number} row The row index
+     */
+    focusRow : function(row){
+        var x = this.scroller.dom.scrollLeft;
+        this.focusCell(row, 0, false);
+        this.scroller.dom.scrollLeft = x;
+    },
+
+    /**
+     * Focuses the specified cell.
+     * @param {Number} row The row index
+     * @param {Number} col The column index
+     * @param {Boolean} hscroll false to disable horizontal scrolling
+     */
+    focusCell : function(row, col, hscroll){
+        var el = this.ensureVisible(row, col, hscroll);
+        this.focusEl.alignTo(el, "tl-tl");
+        if(Ext.isGecko){
+            this.focusEl.focus();
+        }else{
+            this.focusEl.focus.defer(1, this.focusEl);
+        }
+    },
+
+    /**
+     * Scrolls the specified cell into view
+     * @param {Number} row The row index
+     * @param {Number} col The column index
+     * @param {Boolean} hscroll false to disable horizontal scrolling
+     */
+    ensureVisible : function(row, col, hscroll){
+        if(typeof row != "number"){
+            row = row.rowIndex;
+        }
+        if(row < 0 && row >= this.ds.getCount()){
+            return;
+        }
+        col = (col !== undefined ? col : 0);
+        var cm = this.grid.colModel;
+        while(cm.isHidden(col)){
+            col++;
+        }
+
+        var el = this.getCell(row, col);
+        if(!el){
+            return;
+        }
+        var c = this.scroller.dom;
+
+        var ctop = parseInt(el.offsetTop, 10);
+        var cleft = parseInt(el.offsetLeft, 10);
+        var cbot = ctop + el.offsetHeight;
+        var cright = cleft + el.offsetWidth;
+
+        var ch = c.clientHeight - this.mainHd.dom.offsetHeight;
+        var stop = parseInt(c.scrollTop, 10);
+        var sleft = parseInt(c.scrollLeft, 10);
+        var sbot = stop + ch;
+        var sright = sleft + c.clientWidth;
+
+        if(ctop < stop){
+        	c.scrollTop = ctop;
+        }else if(cbot > sbot){
+            c.scrollTop = cbot-ch;
+        }
+
+        if(hscroll !== false){
+            if(cleft < sleft){
+                c.scrollLeft = cleft;
+            }else if(cright > sright){
+                c.scrollLeft = cright-c.clientWidth;
+            }
+        }
+        return el;
+    },
+
+    updateColumns : function(){
+        this.grid.stopEditing();
+        var cm = this.grid.colModel, colIds = this.getColumnIds();
+        //var totalWidth = cm.getTotalWidth();
+        var pos = 0;
+        for(var i = 0, len = cm.getColumnCount(); i < len; i++){
+            //if(cm.isHidden(i)) continue;
+            var w = cm.getColumnWidth(i);
+            this.css.updateRule(this.colSelector+colIds[i], "width", (w - this.borderWidth) + "px");
+            this.css.updateRule(this.hdSelector+colIds[i], "width", (w - this.borderWidth) + "px");
+        }
+        this.updateSplitters();
+    },
+
+    updateSplitters : function(){
+        var cm = this.cm, s = this.getSplitters();
+        if(s){ // splitters not created yet
+            var pos = 0, locked = true;
+            for(var i = 0, len = cm.getColumnCount(); i < len; i++){
+                if(cm.isHidden(i)) continue;
+                var w = cm.getColumnWidth(i);
+                if(!cm.isLocked(i) && locked){
+                    pos = 0;
+                    locked = false;
+                }
+                pos += w;
+                s[i].style.left = (pos-this.splitOffset) + "px";
+            }
+        }
+    },
+
+    handleHiddenChange : function(colModel, colIndex, hidden){
+        if(hidden){
+            this.hideColumn(colIndex);
+        }else{
+            this.unhideColumn(colIndex);
+        }
+    },
+
+    hideColumn : function(colIndex){
+        var cid = this.getColumnId(colIndex);
+        this.css.updateRule(this.tdSelector+cid, "display", "none");
+        this.css.updateRule(this.splitSelector+cid, "display", "none");
+        if(Ext.isSafari){
+            this.updateHeaders();
+        }
+        this.updateSplitters();
+        this.layout();
+    },
+
+    unhideColumn : function(colIndex){
+        var cid = this.getColumnId(colIndex);
+        this.css.updateRule(this.tdSelector+cid, "display", "");
+        this.css.updateRule(this.splitSelector+cid, "display", "");
+
+        if(Ext.isSafari){
+            this.updateHeaders();
+        }
+        this.updateSplitters();
+        this.layout();
+    },
+
+    insertRows : function(dm, firstRow, lastRow, isUpdate){
+        if(firstRow == 0 && lastRow == dm.getCount()-1){
+            this.refresh();
+        }else{
+            if(!isUpdate){
+                this.fireEvent("beforerowsinserted", this, firstRow, lastRow);
+            }
+            var s = this.getScrollState();
+            var markup = this.renderRows(firstRow, lastRow);
+            this.bufferRows(markup[0], this.getLockedTable(), firstRow);
+            this.bufferRows(markup[1], this.getBodyTable(), firstRow);
+            this.restoreScroll(s);
+            if(!isUpdate){
+                this.fireEvent("rowsinserted", this, firstRow, lastRow);
+                this.syncRowHeights(firstRow, lastRow);
+                this.stripeRows(firstRow);
+                this.layout();
+            }
+        }
+    },
+
+    bufferRows : function(markup, target, index){
+        var before = null, trows = target.rows, tbody = target.tBodies[0];
+        if(index < trows.length){
+            before = trows[index];
+        }
+        var b = document.createElement("div");
+        b.innerHTML = "<table><tbody>"+markup+"</tbody></table>";
+        var rows = b.firstChild.rows;
+        for(var i = 0, len = rows.length; i < len; i++){
+            if(before){
+                tbody.insertBefore(rows[0], before);
+            }else{
+                tbody.appendChild(rows[0]);
+            }
+        }
+        b.innerHTML = "";
+        b = null;
+    },
+
+    deleteRows : function(dm, firstRow, lastRow){
+        if(dm.getRowCount()<1){
+            this.fireEvent("beforerefresh", this);
+            this.mainBody.update("");
+            this.lockedBody.update("");
+            this.fireEvent("refresh", this);
+        }else{
+            this.fireEvent("beforerowsdeleted", this, firstRow, lastRow);
+            var bt = this.getBodyTable();
+            var tbody = bt.firstChild;
+            var rows = bt.rows;
+            for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){
+                tbody.removeChild(rows[firstRow]);
+            }
+            this.stripeRows(firstRow);
+            this.fireEvent("rowsdeleted", this, firstRow, lastRow);
+        }
+    },
+
+    updateRows : function(dataSource, firstRow, lastRow){
+        var s = this.getScrollState();
+        this.refresh();
+        this.restoreScroll(s);
+    },
+
+    handleSort : function(dataSource, sortColumnIndex, sortDir, noRefresh){
+        if(!noRefresh){
+           this.refresh();
+        }
+        this.updateHeaderSortState();
+    },
+
+    getScrollState : function(){
+        var sb = this.scroller.dom;
+        return {left: sb.scrollLeft, top: sb.scrollTop};
+    },
+
+    stripeRows : function(startRow){
+        if(!this.grid.stripeRows || this.ds.getCount() < 1){
+            return;
+        }
+        startRow = startRow || 0;
+        var rows = this.getBodyTable().rows;
+        var lrows = this.getLockedTable().rows;
+        var cls = ' x-grid-row-alt ';
+        for(var i = startRow, len = rows.length; i < len; i++){
+            var row = rows[i], lrow = lrows[i];
+            var isAlt = ((i+1) % 2 == 0);
+            var hasAlt = (' '+row.className + ' ').indexOf(cls) != -1;
+            if(isAlt == hasAlt){
+                continue;
+            }
+            if(isAlt){
+                row.className += " x-grid-row-alt";
+            }else{
+                row.className = row.className.replace("x-grid-row-alt", "");
+            }
+            if(lrow){
+                lrow.className = row.className;
+            }
+        }
+    },
+
+    restoreScroll : function(state){
+        var sb = this.scroller.dom;
+        sb.scrollLeft = state.left;
+        sb.scrollTop = state.top;
+        this.syncScroll();
+    },
+
+    syncScroll : function(){
+        var sb = this.scroller.dom;
+        var sh = this.mainHd.dom;
+        var bs = this.mainBody.dom;
+        var lv = this.lockedBody.dom;
+        sh.scrollLeft = bs.scrollLeft = sb.scrollLeft;
+        lv.scrollTop = bs.scrollTop = sb.scrollTop;
+    },
+
+    handleScroll : function(e){
+        this.syncScroll();
+        var sb = this.scroller.dom;
+        this.grid.fireEvent("bodyscroll", sb.scrollLeft, sb.scrollTop);
+        e.stopEvent();
+    },
+
+    handleWheel : function(e){
+        var d = e.getWheelDelta();
+        this.scroller.dom.scrollTop -= d*22;
+        // set this here to prevent jumpy scrolling on large tables
+        this.lockedBody.dom.scrollTop = this.mainBody.dom.scrollTop = this.scroller.dom.scrollTop;
+        e.stopEvent();
+    },
+
+    renderRows : function(startRow, endRow){
+        // pull in all the crap needed to render rows
+        var g = this.grid, cm = g.colModel, ds = g.dataSource, stripe = g.stripeRows;
+        var colCount = cm.getColumnCount();
+
+        if(ds.getCount() < 1){
+            return ["", ""];
+        }
+
+        // build a map for all the columns
+        var cs = [];
+        for(var i = 0; i < colCount; i++){
+            var name = cm.getDataIndex(i);
+            cs[i] = {
+                name : typeof name == 'undefined' ? ds.fields.get(i).name : name,
+                renderer : cm.getRenderer(i),
+                id : cm.getColumnId(i),
+                locked : cm.isLocked(i)
+            };
+        }
+
+        startRow = startRow || 0;
+        endRow = typeof endRow == "undefined"? ds.getCount()-1 : endRow;
+
+        // records to render
+        var rs = ds.getRange(startRow, endRow);
+
+        return this.doRender(cs, rs, ds, startRow, colCount, stripe);
+    },
+
+    // As much as I hate to duplicate code, this was branched because FireFox really hates
+    // [].join("") on strings. The performance difference was substantial enough to
+    // branch this function
+    doRender : Ext.isGecko ?
+            function(cs, rs, ds, startRow, colCount, stripe){
+                var ts = this.templates, ct = ts.cell, rt = ts.row;
+                // buffers
+                var buf = "", lbuf = "", cb, lcb, c, p = {}, rp = {}, r;
+                for(var j = 0, len = rs.length; j < len; j++){
+                    r = rs[j], cb = "", lcb = "", rowIndex = (j+startRow);
+                    for(var i = 0; i < colCount; i++){
+                        c = cs[i];
+                        p.cellId = "x-grid-cell-" + rowIndex + "-" + i;
+                        p.id = c.id;
+                        p.css = p.attr = "";
+                        p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds);
+                        if(p.value == undefined || p.value === "") p.value = "&#160;";
+                        if(r.dirty && typeof r.modified[c.name] !== 'undefined'){
+                            p.css += p.css ? ' x-grid-dirty-cell' : 'x-grid-dirty-cell';
+                        }
+                        var markup = ct.apply(p);
+                        if(!c.locked){
+                            cb+= markup;
+                        }else{
+                            lcb+= markup;
+                        }
+                    }
+                    var alt = [];
+                    if(stripe && ((rowIndex+1) % 2 == 0)){
+                        alt[0] = "x-grid-row-alt";
+                    }
+                    if(r.dirty){
+                        alt[1] = " x-grid-dirty-row";
+                    }
+                    rp.cells = lcb;
+                    if(this.getRowClass){
+                        alt[2] = this.getRowClass(r, rowIndex);
+                    }
+                    rp.alt = alt.join(" ");
+                    lbuf+= rt.apply(rp);
+                    rp.cells = cb;
+                    buf+=  rt.apply(rp);
+                }
+                return [lbuf, buf];
+            } :
+            function(cs, rs, ds, startRow, colCount, stripe){
+                var ts = this.templates, ct = ts.cell, rt = ts.row;
+                // buffers
+                var buf = [], lbuf = [], cb, lcb, c, p = {}, rp = {}, r;
+                for(var j = 0, len = rs.length; j < len; j++){
+                    r = rs[j], cb = [], lcb = [], rowIndex = (j+startRow);
+                    for(var i = 0; i < colCount; i++){
+                        c = cs[i];
+                        p.cellId = "x-grid-cell-" + rowIndex + "-" + i;
+                        p.id = c.id;
+                        p.css = p.attr = "";
+                        p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds);
+                        if(p.value == undefined || p.value === "") p.value = "&#160;";
+                        if(r.dirty && typeof r.modified[c.name] !== 'undefined'){
+                            p.css += p.css ? ' x-grid-dirty-cell' : 'x-grid-dirty-cell';
+                        }
+                        var markup = ct.apply(p);
+                        if(!c.locked){
+                            cb[cb.length] = markup;
+                        }else{
+                            lcb[lcb.length] = markup;
+                        }
+                    }
+                    var alt = [];
+                    if(stripe && ((rowIndex+1) % 2 == 0)){
+                        alt[0] = "x-grid-row-alt";
+                    }
+                    if(r.dirty){
+                        alt[1] = " x-grid-dirty-row";
+                    }
+                    rp.cells = lcb;
+                    if(this.getRowClass){
+                        alt[2] = this.getRowClass(r, rowIndex);
+                    }
+                    rp.alt = alt.join(" ");
+                    rp.cells = lcb.join("");
+                    lbuf[lbuf.length] = rt.apply(rp);
+                    rp.cells = cb.join("");
+                    buf[buf.length] =  rt.apply(rp);
+                }
+                return [lbuf.join(""), buf.join("")];
+            },
+
+    renderBody : function(){
+        var markup = this.renderRows();
+        var bt = this.templates.body;
+        return [bt.apply({rows: markup[0]}), bt.apply({rows: markup[1]})];
+    },
+
+    /**
+     * Refreshes the grid
+     * @param {Boolean} headersToo
+     */
+    refresh : function(headersToo){
+        this.fireEvent("beforerefresh", this);
+        this.grid.stopEditing();
+        var result = this.renderBody();
+        this.lockedBody.update(result[0]);
+        this.mainBody.update(result[1]);
+        if(headersToo === true){
+            this.updateHeaders();
+            this.updateColumns();
+            this.updateSplitters();
+            this.updateHeaderSortState();
+        }
+        this.syncRowHeights();
+        this.layout();
+        this.fireEvent("refresh", this);
+    },
+
+    handleColumnMove : function(cm, oldIndex, newIndex){
+        this.indexMap = null;
+        var s = this.getScrollState();
+        this.refresh(true);
+        this.restoreScroll(s);
+        this.afterMove(newIndex);
+    },
+
+    afterMove : function(colIndex){
+        if(this.enableMoveAnim && Ext.enableFx){
+            this.fly(this.getHeaderCell(colIndex).firstChild).highlight(this.hlColor);
+        }
+    },
+
+    updateCell : function(dm, rowIndex, dataIndex){
+        var colIndex = this.getColumnIndexByDataIndex(dataIndex);
+        if(typeof colIndex == "undefined"){ // not present in grid
+            return;
+        }
+        var cm = this.grid.colModel;
+        var cell = this.getCell(rowIndex, colIndex);
+        var cellText = this.getCellText(rowIndex, colIndex);
+
+        var p = {
+            cellId : "x-grid-cell-" + rowIndex + "-" + colIndex,
+            id : cm.getColumnId(colIndex),
+            css: colIndex == cm.getColumnCount()-1 ? "x-grid-col-last" : ""
+        };
+        var renderer = cm.getRenderer(colIndex);
+        var val = renderer(dm.getValueAt(rowIndex, dataIndex), p, rowIndex, colIndex, dm);
+        if(typeof val == "undefined" || val === "") val = "&#160;";
+        cellText.innerHTML = val;
+        cell.className = this.cellClass + " " + p.cellId + " " + p.css;
+        this.syncRowHeights(rowIndex, rowIndex);
+    },
+
+    calcColumnWidth : function(colIndex, maxRowsToMeasure){
+        var maxWidth = 0;
+        if(this.grid.autoSizeHeaders){
+            var h = this.getHeaderCellMeasure(colIndex);
+            maxWidth = Math.max(maxWidth, h.scrollWidth);
+        }
+        var tb, index;
+        if(this.cm.isLocked(colIndex)){
+            tb = this.getLockedTable();
+            index = colIndex;
+        }else{
+            tb = this.getBodyTable();
+            index = colIndex - this.cm.getLockedCount();
+        }
+        if(tb && tb.rows){
+            var rows = tb.rows;
+            var stopIndex = Math.min(maxRowsToMeasure || rows.length, rows.length);
+            for(var i = 0; i < stopIndex; i++){
+                var cell = rows[i].childNodes[index].firstChild;
+                maxWidth = Math.max(maxWidth, cell.scrollWidth);
+            }
+        }
+        return maxWidth + /*margin for error in IE*/ 5;
+    },
+    /**
+     * Autofit a column to its content.
+     * @param {Number} colIndex
+     * @param {Boolean} forceMinSize true to force the column to go smaller if possible
+     */
+     autoSizeColumn : function(colIndex, forceMinSize, suppressEvent){
+         if(this.cm.isHidden(colIndex)){
+             return; // can't calc a hidden column
+         }
+        if(forceMinSize){
+            var cid = this.cm.getColumnId(colIndex);
+            this.css.updateRule(this.colSelector + cid, "width", this.grid.minColumnWidth + "px");
+           if(this.grid.autoSizeHeaders){
+               this.css.updateRule(this.hdSelector + cid, "width", this.grid.minColumnWidth + "px");
+           }
+        }
+        var newWidth = this.calcColumnWidth(colIndex);
+        this.cm.setColumnWidth(colIndex,
+            Math.max(this.grid.minColumnWidth, newWidth), suppressEvent);
+        if(!suppressEvent){
+            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 cm = this.grid.colModel;
+        var colCount = cm.getColumnCount();
+        for(var i = 0; i < colCount; i++){
+            this.autoSizeColumn(i, true, true);
+        }
+        if(cm.getTotalWidth() < this.scroller.dom.clientWidth){
+            this.fitColumns();
+        }else{
+            this.updateColumns();
+            this.layout();
+        }
+    },
+
+    /**
+     * Autofits all columns to the grid's width proportionate with their current size
+     * @param {Boolean} reserveScrollSpace Reserve space for a scrollbar
+     */
+    fitColumns : function(reserveScrollSpace){
+        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 avail = Math.min(this.scroller.dom.clientWidth, this.el.getWidth());
+        if(reserveScrollSpace){
+            avail -= 17;
+        }
+        var frac = (avail - cm.getTotalWidth())/width;
+        while (cols.length){
+            w = cols.pop();
+            i = cols.pop();
+            cm.setColumnWidth(i, Math.floor(w + w*frac), true);
+        }
+        this.updateColumns();
+        this.layout();
+    },
+
+    onRowSelect : function(rowIndex){
+        var row = this.getRowComposite(rowIndex);
+        row.addClass("x-grid-row-selected");
+    },
+
+    onRowDeselect : function(rowIndex){
+        var row = this.getRowComposite(rowIndex);
+        row.removeClass("x-grid-row-selected");
+    },
+
+    onCellSelect : function(row, col){
+        var cell = this.getCell(row, col);
+        if(cell){
+            Ext.fly(cell).addClass("x-grid-cell-selected");
+        }
+    },
+
+    onCellDeselect : function(row, col){
+        var cell = this.getCell(row, col);
+        if(cell){
+            Ext.fly(cell).removeClass("x-grid-cell-selected");
+        }
+    },
+
+    updateHeaderSortState : function(){
+        var state = this.ds.getSortState();
+        if(!state){
+            return;
+        }
+        this.sortState = state;
+        var sortColumn = this.cm.findColumnIndex(state.field);
+        if(sortColumn != -1){
+            var sortDir = state.direction;
+            var sc = this.sortClasses;
+            var hds = this.el.select(this.headerSelector).removeClass(sc);
+            hds.item(sortColumn).addClass(sc[sortDir == "DESC" ? 1 : 0]);
+        }
+    },
+
+    handleHeaderClick : function(g, index){
+        if(this.headersDisabled){
+            return;
+        }
+        var dm = g.dataSource, cm = g.colModel;
+	    if(!cm.isSortable(index)){
+            return;
+        }
+	    g.stopEditing();
+        dm.sort(cm.getDataIndex(index));
+    },
+
+
+    destroy : function(){
+        if(this.colMenu){
+            this.colMenu.removeAll();
+            Ext.menu.MenuMgr.unregister(this.colMenu);
+            this.colMenu.getEl().remove();
+            delete this.colMenu;
+        }
+        if(this.hmenu){
+            this.hmenu.removeAll();
+            Ext.menu.MenuMgr.unregister(this.hmenu);
+            this.hmenu.getEl().remove();
+            delete this.hmenu;
+        }
+        if(this.grid.enableColumnMove){
+            var dds = Ext.dd.DDM.ids['gridHeader' + this.grid.container.id];
+            if(dds){
+                for(var dd in dds){
+                    if(!dds[dd].config.isTarget && dds[dd].dragElId){
+                        var elid = dds[dd].dragElId;
+                        dds[dd].unreg();
+                        Ext.get(elid).remove();
+                    } else if(dds[dd].config.isTarget){
+                        dds[dd].proxyTop.remove();
+                        dds[dd].proxyBottom.remove();
+                        dds[dd].unreg();
+                    }
+                    if(Ext.dd.DDM.locationCache[dd]){
+                        delete Ext.dd.DDM.locationCache[dd];
+                    }
+                }
+                delete Ext.dd.DDM.ids['gridHeader' + this.grid.container.id];
+            }
+        }
+
+        this.bind(null, null);
+        Ext.EventManager.removeResizeListener(this.onWindowResize, this);
+    },
+
+    handleLockChange : function(){
+        this.refresh(true);
+    },
+
+    onDenyColumnLock : function(){
+
+    },
+
+    onDenyColumnHide : function(){
+
+    },
+
+    handleHdMenuClick : function(item){
+        var index = this.hdCtxIndex;
+        var cm = this.cm, ds = this.ds;
+        switch(item.id){
+            case "asc":
+                ds.sort(cm.getDataIndex(index), "ASC");
+                break;
+            case "desc":
+                ds.sort(cm.getDataIndex(index), "DESC");
+                break;
+            case "lock":
+                var lc = cm.getLockedCount();
+                if(cm.getColumnCount(true) <= lc+1){
+                    this.onDenyColumnLock();
+                    return;
+                }
+                if(lc != index){
+                    cm.setLocked(index, true, true);
+                    cm.moveColumn(index, lc);
+                    this.grid.fireEvent("columnmove", index, lc);
+                }else{
+                    cm.setLocked(index, true);
+                }
+            break;
+            case "unlock":
+                var lc = cm.getLockedCount();
+                if((lc-1) != index){
+                    cm.setLocked(index, false, true);
+                    cm.moveColumn(index, lc-1);
+                    this.grid.fireEvent("columnmove", index, lc-1);
+                }else{
+                    cm.setLocked(index, false);
+                }
+            break;
+            default:
+                index = cm.getIndexById(item.id.substr(4));
+                if(index != -1){
+                    if(item.checked && cm.getColumnCount(true) <= 1){
+                        this.onDenyColumnHide();
+                        return false;
+                    }
+                    cm.setHidden(index, item.checked);
+                }
+        }
+        return true;
+    },
+
+    beforeColMenuShow : function(){
+        var cm = this.cm,  colCount = cm.getColumnCount();
+        this.colMenu.removeAll();
+        for(var i = 0; i < colCount; i++){
+            this.colMenu.add(new Ext.menu.CheckItem({
+                id: "col-"+cm.getColumnId(i),
+                text: cm.getColumnHeader(i),
+                checked: !cm.isHidden(i),
+                hideOnClick:false
+            }));
+        }
+    },
+
+    handleHdCtx : function(g, index, e){
+        e.stopEvent();
+        var hd = this.getHeaderCell(index);
+        this.hdCtxIndex = index;
+        var ms = this.hmenu.items, cm = this.cm;
+        ms.get("asc").setDisabled(!cm.isSortable(index));
+        ms.get("desc").setDisabled(!cm.isSortable(index));
+        if(this.grid.enableColLock !== false){
+            ms.get("lock").setDisabled(cm.isLocked(index));
+            ms.get("unlock").setDisabled(!cm.isLocked(index));
+        }
+        this.hmenu.show(hd, "tl-bl");
+    },
+
+    handleHdOver : function(e){
+        var hd = this.findHeaderCell(e.getTarget());
+        if(hd && !this.headersDisabled){
+            if(this.grid.colModel.isSortable(this.getCellIndex(hd))){
+               this.fly(hd).addClass("x-grid-hd-over");
+            }
+        }
+    },
+
+    handleHdOut : function(e){
+        var hd = this.findHeaderCell(e.getTarget());
+        if(hd){
+            this.fly(hd).removeClass("x-grid-hd-over");
+        }
+    },
+
+    handleSplitDblClick : function(e, t){
+        var i = this.getCellIndex(t);
+        if(this.grid.enableColumnResize !== false && this.cm.isResizable(i) && !this.cm.isFixed(i)){
+            this.autoSizeColumn(i, true);
+            this.layout();
+        }
+    },
+
+    render : function(){
+
+        var cm = this.cm;
+        var colCount = cm.getColumnCount();
+
+        if(this.grid.monitorWindowResize === true){
+            Ext.EventManager.onWindowResize(this.onWindowResize, this, true);
+        }
+        var header = this.renderHeaders();
+        var body = this.templates.body.apply({rows:""});
+        var html = this.templates.master.apply({
+            lockedBody: body,
+            body: body,
+            lockedHeader: header[0],
+            header: header[1]
+        });
+
+        this.updateColumns();
+
+        this.grid.container.dom.innerHTML = html;
+
+        this.initElements();
+
+        this.scroller.on("scroll", this.handleScroll, this);
+        this.lockedBody.on("mousewheel", this.handleWheel, this);
+        this.mainBody.on("mousewheel", this.handleWheel, this);
+
+        this.mainHd.on("mouseover", this.handleHdOver, this);
+        this.mainHd.on("mouseout", this.handleHdOut, this);
+        this.mainHd.on("dblclick", this.handleSplitDblClick, this,
+                {delegate: "."+this.splitClass});
+
+        this.lockedHd.on("mouseover", this.handleHdOver, this);
+        this.lockedHd.on("mouseout", this.handleHdOut, this);
+        this.lockedHd.on("dblclick", this.handleSplitDblClick, this,
+                {delegate: "."+this.splitClass});
+
+        if(this.grid.enableColumnResize !== false && Ext.grid.SplitDragZone){
+            new Ext.grid.SplitDragZone(this.grid, this.lockedHd.dom, this.mainHd.dom);
+        }
+
+        this.updateSplitters();
+
+        if(this.grid.enableColumnMove && Ext.grid.HeaderDragZone){
+            new Ext.grid.HeaderDragZone(this.grid, this.lockedHd.dom, this.mainHd.dom);
+            new Ext.grid.HeaderDropZone(this.grid, this.lockedHd.dom, this.mainHd.dom);
+        }
+
+        if(this.grid.enableCtxMenu !== false && Ext.menu.Menu){
+            this.hmenu = new Ext.menu.Menu({id: this.grid.id + "-hctx"});
+            this.hmenu.add(
+                {id:"asc", text: this.sortAscText, cls: "xg-hmenu-sort-asc"},
+                {id:"desc", text: this.sortDescText, cls: "xg-hmenu-sort-desc"}
+            );
+            if(this.grid.enableColLock !== false){
+                this.hmenu.add('-',
+                    {id:"lock", text: this.lockText, cls: "xg-hmenu-lock"},
+                    {id:"unlock", text: this.unlockText, cls: "xg-hmenu-unlock"}
+                );
+            }
+            if(this.grid.enableColumnHide !== false){
+
+                this.colMenu = new Ext.menu.Menu({id:this.grid.id + "-hcols-menu"});
+                this.colMenu.on("beforeshow", this.beforeColMenuShow, this);
+                this.colMenu.on("itemclick", this.handleHdMenuClick, this);
+
+                this.hmenu.add('-',
+                    {id:"columns", text: this.columnsText, menu: this.colMenu}
+                );
+            }
+            this.hmenu.on("itemclick", this.handleHdMenuClick, this);
+
+            this.grid.on("headercontextmenu", this.handleHdCtx, this);
+        }
+
+        if((this.grid.enableDragDrop || this.grid.enableDrag) && Ext.grid.GridDragZone){
+            this.dd = new Ext.grid.GridDragZone(this.grid, {
+                ddGroup : this.grid.ddGroup || 'GridDD'
+            });
+        }
+        for(var i = 0; i < colCount; i++){
+            if(cm.isHidden(i)){
+                this.hideColumn(i);
+            }
+            if(cm.config[i].align){
+                this.css.updateRule(this.colSelector + i, "textAlign", cm.config[i].align);
+                this.css.updateRule(this.hdSelector + i, "textAlign", cm.config[i].align);
+            }
+        }
+
+        this.updateHeaderSortState();
+
+        this.beforeInitialResize();
+        this.layout(true);
+
+        // two part rendering gives faster view to the user
+        this.renderPhase2.defer(1, this);
+    },
+
+    renderPhase2 : function(){
+        // render the rows now
+        this.refresh();
+        if(this.grid.autoSizeColumns){
+            this.autoSizeColumns();
+        }
+    },
+
+    beforeInitialResize : function(){
+
+    },
+
+    onColumnSplitterMoved : function(i, w){
+        this.userResized = true;
+        var cm = this.grid.colModel;
+        cm.setColumnWidth(i, w, true);
+        var cid = cm.getColumnId(i);
+        this.css.updateRule(this.colSelector + cid, "width", (w-this.borderWidth) + "px");
+        this.css.updateRule(this.hdSelector + cid, "width", (w-this.borderWidth) + "px");
+        this.updateSplitters();
+        this.layout();
+        this.grid.fireEvent("columnresize", i, w);
+    },
+
+    syncRowHeights : function(startIndex, endIndex){
+        if(this.grid.enableRowHeightSync === true && this.cm.getLockedCount() > 0){
+            startIndex = startIndex || 0;
+            var mrows = this.getBodyTable().rows;
+            var lrows = this.getLockedTable().rows;
+            var len = mrows.length-1;
+            endIndex = Math.min(endIndex || len, len);
+            for(var i = startIndex; i <= endIndex; i++){
+                var m = mrows[i], l = lrows[i];
+                var h = Math.max(m.offsetHeight, l.offsetHeight);
+                m.style.height = l.style.height = h + "px";
+            }
+        }
+    },
+
+    layout : function(initialRender, is2ndPass){
+        var g = this.grid;
+        var auto = g.autoHeight;
+        var scrollOffset = 16;
+        var c = g.container, cm = this.cm,
+                expandCol = g.autoExpandColumn,
+                gv = this;
+        //c.beginMeasure();
+
+        if(!c.dom.offsetWidth){ // display:none?
+            if(initialRender){
+                this.lockedWrap.show();
+                this.mainWrap.show();
+            }
+            return;
+        }
+
+        var hasLock = this.cm.isLocked(0);
+
+        var tbh = this.headerPanel.getHeight();
+        var bbh = this.footerPanel.getHeight();
+
+        if(auto){
+            var ch = this.getBodyTable().offsetHeight + tbh + bbh + this.mainHd.getHeight();
+            var newHeight = ch + c.getBorderWidth("tb");
+            if(g.maxHeight){
+                newHeight = Math.min(g.maxHeight, newHeight);
+            }
+            c.setHeight(newHeight);
+        }
+
+        if(g.autoWidth){
+            c.setWidth(cm.getTotalWidth()+c.getBorderWidth('lr'));
+        }
+
+        var s = this.scroller;
+
+        var csize = c.getSize(true);
+
+        this.el.setSize(csize.width, csize.height);
+
+        this.headerPanel.setWidth(csize.width);
+        this.footerPanel.setWidth(csize.width);
+
+        var hdHeight = this.mainHd.getHeight();
+        var vw = csize.width;
+        var vh = csize.height - (tbh + bbh);
+
+        s.setSize(vw, vh);
+
+        var bt = this.getBodyTable();
+        var ltWidth = hasLock ?
+                      Math.max(this.getLockedTable().offsetWidth, this.lockedHd.dom.firstChild.offsetWidth) : 0;
+
+        var scrollHeight = bt.offsetHeight;
+        var scrollWidth = ltWidth + bt.offsetWidth;
+        var vscroll = false, hscroll = false;
+
+        this.scrollSizer.setSize(scrollWidth, scrollHeight+hdHeight);
+
+        var lw = this.lockedWrap, mw = this.mainWrap;
+        var lb = this.lockedBody, mb = this.mainBody;
+
+        setTimeout(function(){
+            var t = s.dom.offsetTop;
+            var w = s.dom.clientWidth,
+                h = s.dom.clientHeight;
+
+            lw.setTop(t);
+            lw.setSize(ltWidth, h);
+
+            mw.setLeftTop(ltWidth, t);
+            mw.setSize(w-ltWidth, h);
+
+            lb.setHeight(h-hdHeight);
+            mb.setHeight(h-hdHeight);
+
+            if(is2ndPass !== true && !gv.userResized && expandCol){
+                // high speed resize without full column calculation
+                var ci = cm.getIndexById(expandCol);
+                var tw = cm.getTotalWidth(false);
+                var currentWidth = cm.getColumnWidth(ci);
+                var cw = Math.min(Math.max(((w-tw)+currentWidth-2)-/*scrollbar*/(w <= s.dom.offsetWidth ? 0 : 18), g.autoExpandMin), g.autoExpandMax);
+                if(currentWidth != cw){
+                    cm.setColumnWidth(ci, cw, true);
+                    gv.css.updateRule(gv.colSelector+expandCol, "width", (cw - gv.borderWidth) + "px");
+                    gv.css.updateRule(gv.hdSelector+expandCol, "width", (cw - gv.borderWidth) + "px");
+                    gv.updateSplitters();
+                    gv.layout(false, true);
+                }
+            }
+
+            if(initialRender){
+                lw.show();
+                mw.show();
+            }
+            //c.endMeasure();
+        }, 10);
+    },
+
+    onWindowResize : function(){
+        if(!this.grid.monitorWindowResize || this.grid.autoHeight){
+            return;
+        }
+        this.layout();
+    },
+
+    appendFooter : function(parentEl){
+        return null;
+    },
+
+    sortAscText : "Sort Ascending",
+    sortDescText : "Sort Descending",
+    lockText : "Lock Column",
+    unlockText : "Unlock Column",
+    columnsText : "Columns"
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/HttpProxy.jss.html b/www/extras/yui-ext/docs/output/HttpProxy.jss.html new file mode 100644 index 000000000..9dc853f14 --- /dev/null +++ b/www/extras/yui-ext/docs/output/HttpProxy.jss.html @@ -0,0 +1,94 @@ +HttpProxy.js

HttpProxy.js

/**
+ * @class Ext.data.HttpProxy
+ * An implementation of Ext.data.DataProxy that reads a data object from an Ext.data.Connection object
+ * configured to reference a certain URL.
+ * <p>
+ * <em>Note that this class cannot be used to retrieve data from a domain other than the domain
+ * from which the running page was served.
+ * <p>
+ * For cross-domain access to remote data, use an Ext.data.ScriptTagProxy.
+ * </em>
+ * <p>
+ * Be aware that to enable the browser to parse an XML document, the server <strong>must</strong> set
+ * the Content-Type header to "text/xml".
+ * @constructor
+ * @param {Object} conn An Ext.data.Connection object referencing the URL from which the data object
+ * is to be read, or a configuration object for an Ext.data.Connection.
+ */
+Ext.data.HttpProxy = function(conn){
+    Ext.data.HttpProxy.superclass.constructor.call(this);
+    // is conn a conn config or a real conn?
+    this.conn = conn.events ? conn : new Ext.data.Connection(conn);
+};
+
+Ext.extend(Ext.data.HttpProxy, Ext.data.DataProxy, {
+    // private
+    getConnection : function(){
+        return this.conn;
+    },
+
+    /**
+     * Load data from the configured Ext.data.Connection, read the data object into
+     * a block of Ext.data.Records using the passed Ext.data.DataReader implementation, and
+     * process that block using the passed callback.
+     * @param {Object} params An object containing properties which are to be used as HTTP parameters
+     * for the request to the remote server.
+     * @param {Ext.data.DataReader) reader The Reader object which converts the data
+     * object into a block of Ext.data.Records.
+     * @param {Function} callback The function into which to pass the block of Ext.data.Records.
+     * The function must be passed <ul>
+     * <li>The Record block object</li>
+     * <li>The "arg" argument from the load function</li>
+     * <li>A boolean success indicator</li>
+     * </ul>
+     * @param {Object} scope The scope in which to call the callback
+     * @param {Object} arg An optional argument which is passed to the callback as its second parameter.
+     */
+    load : function(params, reader, callback, scope, arg){
+        if(this.fireEvent("beforeload", this, params) !== false){
+            this.conn.request({
+                params : params || {}, 
+                request: {
+                    callback : callback,
+                    scope : scope,
+                    arg : arg
+                },
+                reader: reader,
+                callback : this.loadResponse,
+                scope: this
+            });
+        }else{
+            callback.call(scope||this, null, arg, false);
+        }
+    },
+    
+    // private
+    loadResponse : function(o, success, response){
+        if(!success){
+            this.fireEvent("loadexception", this, o, response);
+            o.request.callback.call(o.request.scope, null, o.request.arg, false);
+            return;
+        }
+        var result;
+        try {
+            result = o.reader.read(response);
+        }catch(e){
+            this.fireEvent("loadexception", this, o, response, e);
+            o.request.callback.call(o.request.scope, null, o.request.arg, false);
+            return;
+        }
+        this.fireEvent("load", this, o, o.request.arg);
+        o.request.callback.call(o.request.scope, result, o.request.arg, true);
+    },
+    
+    // private
+    update : function(dataSet){
+        
+    },
+    
+    // private
+    updateResponse : function(dataSet){
+        
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Item.jss.html b/www/extras/yui-ext/docs/output/Item.jss.html new file mode 100644 index 000000000..3957c77fb --- /dev/null +++ b/www/extras/yui-ext/docs/output/Item.jss.html @@ -0,0 +1,121 @@ +Item.js

Item.js

/**
+ * @class Ext.menu.Item
+ * @extends Ext.menu.BaseItem
+ * A base class for all menu items that require menu-related functionality (like sub-menus) and are not static
+ * display items.  Item extends the base functionality of {@link Ext.menu.BaseItem} by adding menu-specific
+ * activation and click handling.
+ * @constructor
+ * Creates a new Item
+ * @param {Object} config Configuration options
+ */
+Ext.menu.Item = function(config){
+    Ext.menu.Item.superclass.constructor.call(this, config);
+    if(this.menu){
+        this.menu = Ext.menu.MenuMgr.get(this.menu);
+    }
+};
+Ext.extend(Ext.menu.Item, Ext.menu.BaseItem, {
+    /**
+     * @cfg {String} icon
+     * The path to an icon to display in this menu item (defaults to Ext.BLANK_IMAGE_URL)
+     */
+// holder
+/***
+     * @cfg {String} itemCls The default CSS class to use for menu items (defaults to "x-menu-item")
+     */
+    itemCls : "x-menu-item",
+    /**
+     * @cfg {Boolean} canActivate True if this item can be visually activated (defaults to true)
+     */
+    canActivate : true,
+
+    // private
+    ctype: "Ext.menu.Item",
+
+    // private
+    onRender : function(container, position){
+        var el = document.createElement("a");
+        el.hideFocus = true;
+        el.unselectable = "on";
+        el.href = this.href || "#";
+        if(this.hrefTarget){
+            el.target = this.hrefTarget;
+        }
+        el.className = this.itemCls + (this.menu ?  " x-menu-item-arrow" : "") + (this.cls ?  " " + this.cls : "");
+        el.innerHTML = String.format(
+                '<img src="{0}" class="x-menu-item-icon">{1}',
+                this.icon || Ext.BLANK_IMAGE_URL, this.text);
+        this.el = el;
+        Ext.menu.Item.superclass.onRender.call(this, container, position);
+    },
+
+    /**
+     * Sets the text to display in this menu item
+     * @param {String} text The text to display
+     */
+    setText : function(text){
+        this.text = text;
+        if(this.rendered){
+            this.el.update(String.format(
+                '<img src="{0}" class="x-menu-item-icon">{1}',
+                this.icon || Ext.BLANK_IMAGE_URL, this.text));
+            this.parentMenu.autoWidth();
+        }
+    },
+
+    // private
+    handleClick : function(e){
+        if(!this.href){ // if no link defined, stop the event automatically
+            e.stopEvent();
+        }
+        Ext.menu.Item.superclass.handleClick.apply(this, arguments);
+    },
+
+    // private
+    activate : function(autoExpand){
+        if(Ext.menu.Item.superclass.activate.apply(this, arguments)){
+            this.focus();
+            if(autoExpand){
+                this.expandMenu();
+            }
+        }
+        return true;
+    },
+
+    // private
+    shouldDeactivate : function(e){
+        if(Ext.menu.Item.superclass.shouldDeactivate.call(this, e)){
+            if(this.menu && this.menu.isVisible()){
+                return !this.menu.getEl().getRegion().contains(e.getPoint());
+            }
+            return true;
+        }
+        return false;
+    },
+
+    // private
+    deactivate : function(){
+        Ext.menu.Item.superclass.deactivate.apply(this, arguments);
+        this.hideMenu();
+    },
+
+    // private
+    expandMenu : function(autoActivate){
+        if(!this.disabled && this.menu){
+            if(!this.menu.isVisible()){
+                this.menu.show(this.container, this.parentMenu.subMenuAlign || "tl-tr?", this.parentMenu);
+            }
+            if(autoActivate){
+                this.menu.tryActivate(0, 1);
+            }
+        }
+    },
+
+    // private
+    hideMenu : function(){
+        if(this.menu && this.menu.isVisible()){
+            this.menu.hide();
+        }
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/JSON.jss.html b/www/extras/yui-ext/docs/output/JSON.jss.html new file mode 100644 index 000000000..e968c76c1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/JSON.jss.html @@ -0,0 +1,137 @@ +JSON.js

JSON.js

/**
+ * @class 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
+ */
+Ext.util.JSON = new (function(){
+    var useHasOwn = {}.hasOwnProperty ? true : false;
+    
+    // crashes Safari in some instances
+    //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" : 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 (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){
+        return eval("(" + json + ')');
+    };
+})();
+/** 
+ * Shorthand for {@link Ext.util.JSON#encode}
+ * @member Ext encode 
+ * @method */
+Ext.encode = Ext.util.JSON.encode;
+/** 
+ * Shorthand for {@link Ext.util.JSON#decode}
+ * @member Ext decode 
+ * @method */
+Ext.decode = Ext.util.JSON.decode;
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/JsonReader.jss.html b/www/extras/yui-ext/docs/output/JsonReader.jss.html new file mode 100644 index 000000000..c57007f26 --- /dev/null +++ b/www/extras/yui-ext/docs/output/JsonReader.jss.html @@ -0,0 +1,158 @@ +JsonReader.js

JsonReader.js

/**
+ * @class Ext.data.JsonReader
+ * @extends Ext.data.DataReader
+ * Data reader class to create an Array of Ext.data.Record objects from a JSON response
+ * based on mappings in a provided Ext.data.Record constructor.
+ * <p>
+ * The code below lists all configuration options.
+ * <pre><code>
+   var RecordDef = Ext.data.Record.create([
+       {name: 'name', mapping: 'name'},     // "mapping" property not needed if it's the same as "name"
+       {name: 'occupation'},                // This field will use "occupation" as the mapping.
+   ]);
+   var myReader = new Ext.data.JsonReader({
+       totalProperty: "results",    // The property which contains the number of returned records (optional)
+       root: "rows",                // The property which contains an Array of record objects
+       id: "id"                     // The property within the record object that provides an ID for the record (optional)
+   }, RecordDef);
+  </code></pre>
+ * <p>
+ * This would consume a JSON file like this:
+ * <pre><code>
+   { 'results': 2, 'rows': [
+     { 'id': 1, 'name': 'Bill', occupation: 'Gardener' },
+     { 'id': 2, 'name': 'Ben', occupation: 'Horticulturalist' } ]
+   }
+  </code></pre>
+ * @cfg {String} totalProperty Name of the property from which to retrieve the total number of records
+ * in the dataset. This is only needed if the whole dataset is not passed in one go, but is being
+ * paged from the remote server.
+ * @cfg {String} successProperty Name of the property from which to retrieve the success attribute used by forms.
+ * @cfg {String} root name of the property which contains the Array of row objects.
+ * @cfg {String} id Name of the property within a row object that contains a record identifier value.
+ * @constructor
+ * Create a new JsonReader
+ * @param {Object} meta Metadata configuration options
+ * @param {Object[]/Ext.data.Record constructor} recordType The record definition of the data record to produce.
+ */
+Ext.data.JsonReader = function(meta, recordType){
+    Ext.data.JsonReader.superclass.constructor.call(this, meta, recordType);
+};
+Ext.extend(Ext.data.JsonReader, Ext.data.DataReader, {
+    /**
+     * This method is only used by a DataProxy which has retrieved data from a remote server.
+     * @param {Object} response The XHR object which contains the JSON data in its responseText.
+     * @return {Object} data A data block which is used by an Ext.data.Store object as
+     * a cache of Ext.data.Records.
+     */
+    read : function(response){
+        var json = response.responseText;
+        var o = eval("("+json+")");
+        if(!o) {
+            throw {message: "JsonReader.read: Json object not found"};
+        }
+        return this.readRecords(o);
+    },
+
+	/**
+	 * @ignore
+	 */
+    simpleAccess: function(obj, subsc) {
+    	return obj[subsc];
+    },
+
+	/**
+	 * @ignore
+	 */
+    getJsonAccessor: function(){
+        var re = /[\[\.]/;
+        return function(expr) {
+            try {
+                return(re.test(expr))
+                    ? new Function("obj", "return obj." + expr)
+                    : function(obj){
+                        return obj[expr];
+                    };
+            } catch(e){}
+            return Ext.emptyFn;
+        };
+    }(),
+
+    /**
+     * Create a data block containing Ext.data.Records from an XML document.
+     * @param {Object} o An object which contains an Array of row objects in the property specified
+     * in the config as 'root, and optionally a property, specified in the config as 'totalProperty'
+     * which contains the total size of the dataset.
+     * @return {Object} data A data block which is used by an Ext.data.Store object as
+     * a cache of Ext.data.Records.
+     */
+    readRecords : function(o){
+        /**
+         * After any data loads, the raw JSON data is available for further custom processing.
+         * @type Object
+         */
+        this.jsonData = o;
+        var s = this.meta, Record = this.recordType,
+            f = Record.prototype.fields, fi = f.items, fl = f.length;
+
+//      Generate extraction functions for the totalProperty, the root, the id, and for each field
+        if (!this.ef) {
+            if(s.totalProperty) {
+	            this.getTotal = this.getJsonAccessor(s.totalProperty);
+	        }
+	        if(s.successProperty) {
+	            this.getSuccess = this.getJsonAccessor(s.successProperty);
+	        }
+	        this.getRoot = s.root ? this.getJsonAccessor(s.root) : function(p){return p;};
+	        if (s.id) {
+	        	var g = this.getJsonAccessor(s.id);
+	        	this.getId = function(rec) {
+	        		var r = g(rec);
+		        	return (r === undefined || r === "") ? null : r;
+	        	};
+	        } else {
+	        	this.getId = function(){return null;};
+	        }
+            this.ef = [];
+            for(var i = 0; i < fl; i++){
+                f = fi[i];
+                var map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name;
+                this.ef[i] = this.getJsonAccessor(map);
+            }
+        }
+
+    	var root = this.getRoot(o), c = root.length, totalRecords = c, success = true;
+    	if(s.totalProperty){
+            var v = parseInt(this.getTotal(o), 10);
+            if(!isNaN(v)){
+                totalRecords = v;
+            }
+        }
+        if(s.successProperty){
+            var v = this.getSuccess(o);
+            if(v === false || v === 'false'){
+                success = false;
+            }
+        }
+        var records = [];
+	    for(var i = 0; i < c; i++){
+		    var n = root[i];
+	        var values = {};
+	        var id = this.getId(n);
+	        for(var j = 0; j < fl; j++){
+	            f = fi[j];
+                var v = this.ef[j](n);
+                values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue);
+	        }
+	        var record = new Record(values, id);
+	        record.json = n;
+	        records[i] = record;
+	    }
+	    return {
+	        success : success,
+	        records : records,
+	        totalRecords : totalRecords
+	    };
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/JsonView.jss.html b/www/extras/yui-ext/docs/output/JsonView.jss.html new file mode 100644 index 000000000..a38f71adf --- /dev/null +++ b/www/extras/yui-ext/docs/output/JsonView.jss.html @@ -0,0 +1,295 @@ +JsonView.js

JsonView.js

/**
+ * @class Ext.JsonView
+ * @extends Ext.View
+ * Shortcut class to create a JSON + UpdateManager template view. Usage:
+ <pre><code>
+ var view = new Ext.JsonView("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");
+
+
+ // Example from my blog list
+ var tpl = new Ext.Template(
+ '&lt;div class="entry"&gt;' +
+ '&lt;a class="entry-title" href="{link}"&gt;{title}&lt;/a&gt;' +
+ "&lt;h4&gt;{date} by {author} | {comments} Comments&lt;/h4&gt;{description}" +
+ "&lt;/div&gt;&lt;hr /&gt;"
+ );
+
+ var moreView = new Ext.JsonView("entry-list", tpl, {
+ jsonRoot: "posts"
+ });
+ moreView.on("beforerender", this.sortEntries, this);
+ moreView.load({
+ url:"/blog/get-posts.php",
+ params: "allposts=true",
+ text:"Loading Blog Entries..."
+ });
+ </code></pre>
+ * @constructor
+ * Create a new JsonView
+ * @param {String/HTMLElement/Element} container The container element where the view is to be rendered.
+ * @param {Template} tpl The rendering template
+ * @param {Object} config The config object
+ */
+Ext.JsonView = function(container, tpl, config){
+    Ext.JsonView.superclass.constructor.call(this, container, tpl, config);
+
+    var um = this.el.getUpdateManager();
+    um.setRenderer(this);
+    um.on("update", this.onLoad, this);
+    um.on("failure", this.onLoadException, this);
+
+    /**
+     * @event beforerender
+     * Fires before rendering of the downloaded json data.
+     * @param {Ext.View} this
+     * @param {Object} data The json data loaded
+     */
+// holder
+/***
+     * @event load
+     * Fires when data is loaded.
+     * @param {Ext.View} this
+     * @param {Object} data The json data loaded
+     * @param {Object} response The raw Connect response object
+     */
+// holder
+/***
+     * @event loadexception
+     * Fires when loading fails.
+     * @param {Ext.View} this
+     * @param {Object} response The raw Connect response object
+     */
+    this.addEvents({
+        'beforerender' : true,
+        'load' : true,
+        'loadexception' : true
+    });
+};
+Ext.extend(Ext.JsonView, Ext.View, {
+    /**
+     * The root property in the loaded json object that contains the data
+     * @type {String}
+     */
+    jsonRoot : "",
+
+    /**
+     * Refreshes the view.
+     */
+    refresh : function(){
+        this.clearSelections();
+        this.el.update("");
+        var html = [];
+        var o = this.jsonData;
+        if(o && o.length > 0){
+            for(var i = 0, len = o.length; i < len; i++){
+                var data = this.prepareData(o[i], i, o);
+                html[html.length] = this.tpl.apply(data);
+            }
+        }else{
+            html.push(this.emptyText);
+        }
+        this.el.update(html.join(""));
+        this.nodes = this.el.dom.childNodes;
+        this.updateIndexes(0);
+    },
+
+    /**
+     * Performs an async request, loading the JSON from 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>
+     view.load({
+     url: "your-url.php",<br/>
+     params: {param1: "foo", param2: "bar"}, // or a URL encoded string<br/>
+     callback: yourFunction,<br/>
+     scope: yourObject, //(optional scope)  <br/>
+     discardUrl: false, <br/>
+     nocache: false,<br/>
+     text: "Loading...",<br/>
+     timeout: 30,<br/>
+     scripts: false<br/>
+     });
+     </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 {String/Object} 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 {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);
+    },
+
+    render : function(el, response){
+        this.clearSelections();
+        this.el.update("");
+        var o;
+        try{
+            o = Ext.util.JSON.decode(response.responseText);
+            if(this.jsonRoot){
+                o = eval("o." + this.jsonRoot);
+            }
+        } catch(e){
+        }
+        /**
+         * The current json data or null
+         */
+        this.jsonData = o;
+        this.beforeRender();
+        this.refresh();
+    },
+
+/**
+ * Get the number of records in the current JSON dataset
+ * @return {Number}
+ */
+    getCount : function(){
+        return this.jsonData ? this.jsonData.length : 0;
+    },
+
+/**
+ * Returns the JSON object for the specified node(s)
+ * @param {HTMLElement/Array} node The node or an array of nodes
+ * @return {Object/Array} If you pass in an array, you get an array back, otherwise
+ * you get the JSON object for the node
+ */
+    getNodeData : function(node){
+        if(node instanceof Array){
+            var data = [];
+            for(var i = 0, len = node.length; i < len; i++){
+                data.push(this.getNodeData(node[i]));
+            }
+            return data;
+        }
+        return this.jsonData[this.indexOf(node)] || null;
+    },
+
+    beforeRender : function(){
+        this.snapshot = this.jsonData;
+        if(this.sortInfo){
+            this.sort.apply(this, this.sortInfo);
+        }
+        this.fireEvent("beforerender", this, this.jsonData);
+    },
+
+    onLoad : function(el, o){
+        this.fireEvent("load", this, this.jsonData, o);
+    },
+
+    onLoadException : function(el, o){
+        this.fireEvent("loadexception", this, o);
+    },
+
+/**
+ * Filter the data by a specific property.
+ * @param {String} property A property on your JSON objects
+ * @param {String/RegExp} value Either string that the property values
+ * should start with or a RegExp to test against the property
+ */
+    filter : function(property, value){
+        if(this.jsonData){
+            var data = [];
+            var ss = this.snapshot;
+            if(typeof value == "string"){
+                var vlen = value.length;
+                if(vlen == 0){
+                    this.clearFilter();
+                    return;
+                }
+                value = value.toLowerCase();
+                for(var i = 0, len = ss.length; i < len; i++){
+                    var o = ss[i];
+                    if(o[property].substr(0, vlen).toLowerCase() == value){
+                        data.push(o);
+                    }
+                }
+            } else if(value.exec){ // regex?
+                for(var i = 0, len = ss.length; i < len; i++){
+                    var o = ss[i];
+                    if(value.test(o[property])){
+                        data.push(o);
+                    }
+                }
+            } else{
+                return;
+            }
+            this.jsonData = data;
+            this.refresh();
+        }
+    },
+
+/**
+ * Filter by a function. The passed function will be called with each
+ * object in the current dataset. If the function returns true, the value is kept
+ * otherwise it is filtered.
+ * @param {Function} fn
+ * @param {Object} scope (optional) The scope of the function (defaults to this JsonView)
+ */
+    filterBy : function(fn, scope){
+        if(this.jsonData){
+            var data = [];
+            var ss = this.snapshot;
+            for(var i = 0, len = ss.length; i < len; i++){
+                var o = ss[i];
+                if(fn.call(scope || this, o)){
+                    data.push(o);
+                }
+            }
+            this.jsonData = data;
+            this.refresh();
+        }
+    },
+
+/**
+ * Clears the current filter.
+ */
+    clearFilter : function(){
+        if(this.snapshot && this.jsonData != this.snapshot){
+            this.jsonData = this.snapshot;
+            this.refresh();
+        }
+    },
+
+
+/**
+ * Sorts the data for this view and refreshes it.
+ * @param {String} property A property on your JSON objects to sort on
+ * @param {String} direction (optional) desc or asc (defaults to asc)
+ * @param {Function} sortType (optional) A function to call to convert the data to a sortable value.
+ */
+    sort : function(property, dir, sortType){
+        this.sortInfo = Array.prototype.slice.call(arguments, 0);
+        if(this.jsonData){
+            var p = property;
+            var dsc = dir && dir.toLowerCase() == "desc";
+            var f = function(o1, o2){
+                var v1 = sortType ? sortType(o1[p]) : o1[p];
+                var v2 = sortType ? sortType(o2[p]) : o2[p];
+                ;
+                if(v1 < v2){
+                    return dsc ? +1 : -1;
+                } else if(v1 > v2){
+                    return dsc ? -1 : +1;
+                } else{
+                    return 0;
+                }
+            };
+            this.jsonData.sort(f);
+            this.refresh();
+            if(this.jsonData != this.snapshot){
+                this.snapshot.sort(f);
+            }
+        }
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/KeyMap.jss.html b/www/extras/yui-ext/docs/output/KeyMap.jss.html new file mode 100644 index 000000000..685eb70f1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/KeyMap.jss.html @@ -0,0 +1,182 @@ +KeyMap.js

KeyMap.js

/**
+ * @class Ext.KeyMap
+ * Handles mapping keys to actions for an element. One key map can be used for multiple actions.
+ * The constructor accepts the same config object as defined by {@link #addBinding}.
+ * If you bind a callback function to a KeyMap, anytime the KeyMap handles an expected key
+ * combination it will call the function with this signature (if the match is a multi-key
+ * combination the callback will still be called only once): (String key, Ext.EventObject e)
+ * A KeyMap can also handle a string representation of keys.<br />
+ * Usage:
+ <pre><code>
+ // map one key by key code
+ var map = new Ext.KeyMap("my-element", {
+     key: 13, // or Ext.EventObject.ENTER
+     fn: myHandler,
+     scope: myObject
+ });
+ 
+ // map multiple keys to one action by string
+ var map = new Ext.KeyMap("my-element", {
+     key: "a\r\n\t",
+     fn: myHandler,
+     scope: myObject
+ });
+ 
+ // map multiple keys to multiple actions by strings and array of codes
+ var map = new Ext.KeyMap("my-element", [
+    {
+        key: [10,13],
+        fn: function(){ alert("Return was pressed"); }
+    }, {
+        key: "abc",
+        fn: function(){ alert('a, b or c was pressed'); }
+    }, {
+        key: "\t",
+        ctrl:true,
+        shift:true,
+        fn: function(){ alert('Control + shift + tab was pressed.'); }
+    }
+]);
+</code></pre>
+ * <b>Note: A KepMap starts enabled</b>
+ * @constructor
+ * @param {String/HTMLElement/Ext.Element} el The element to bind to
+ * @param {Object} config The config
+ * @param {String} eventName (optional) The event to bind to (defaults to "keydown")
+ */
+Ext.KeyMap = function(el, config, eventName){
+    this.el  = Ext.get(el);
+    this.eventName = eventName || "keydown";
+    this.bindings = [];
+    if(config instanceof Array){
+	    for(var i = 0, len = config.length; i < len; i++){
+	        this.addBinding(config[i]);
+	    }
+    }else{
+        this.addBinding(config);
+    }
+    this.keyDownDelegate = Ext.EventManager.wrap(this.handleKeyDown, this, true);
+    this.enable();
+};
+
+Ext.KeyMap.prototype = {
+    /**
+     * True to stop the event from bubbling and prevent the default browser action if the
+     * key was handled by the KeyMap (defaults to false)
+     * @type Boolean
+     */
+    stopEvent : false,
+
+    /**
+     * Add a new binding to this KeyMap. The following config object properties are supported:
+     * <pre>
+Property    Type             Description
+----------  ---------------  ----------------------------------------------------------------------
+key         String/Array     A single keycode or an array of keycodes to handle
+shift       Boolean          True to handle key only when shift is pressed (defaults to false)
+ctrl        Boolean          True to handle key only when ctrl is pressed (defaults to false)
+alt         Boolean          True to handle key only when alt is pressed (defaults to false)
+fn          Function         The function to call when KeyMap finds the expected key combination
+scope       Object           The scope of the callback function
+</pre>
+     *
+     * Usage:
+     * <pre><code>
+// Create a KeyMap
+var map = new Ext.KeyMap(document, {
+    key: Ext.EventObject.ENTER,
+    fn: handleKey,
+    scope: this
+});
+
+//Add a new binding to the existing KeyMap later
+map.addBinding({
+    key: 'abc',
+    shift: true,
+    fn: handleKey,
+    scope: this
+});
+</code></pre>
+     * @param {Object} config A single KeyMap config
+     */
+	addBinding : function(config){
+        var keyCode = config.key, 
+            shift = config.shift, 
+            ctrl = config.ctrl, 
+            alt = config.alt,
+            fn = config.fn,
+            scope = config.scope;
+        if(typeof keyCode == "string"){
+            var ks = [];
+            var keyString = keyCode.toUpperCase();
+            for(var j = 0, len = keyString.length; j < len; j++){
+                ks.push(keyString.charCodeAt(j));
+            }
+            keyCode = ks;
+        }
+        var keyArray = keyCode instanceof Array;
+        var handler = function(e){
+            if((!shift || e.shiftKey) && (!ctrl || e.ctrlKey) &&  (!alt || e.altKey)){
+                var k = e.getKey();
+                if(keyArray){
+                    for(var i = 0, len = keyCode.length; i < len; i++){
+                        if(keyCode[i] == k){
+                          if(this.stopEvent){
+                              e.stopEvent();
+                          }
+                          fn.call(scope || window, k, e);
+                          return;
+                        }
+                    }
+                }else{
+                    if(k == keyCode){
+                        if(this.stopEvent){
+                           e.stopEvent();
+                        }
+                        fn.call(scope || window, k, e);
+                    }
+                }
+            }
+        };
+        this.bindings.push(handler);  
+	},
+
+    // private
+    handleKeyDown : function(e){
+	    if(this.enabled){ //just in case
+    	    var b = this.bindings;
+    	    for(var i = 0, len = b.length; i < len; i++){
+    	        b[i].call(this, e);
+    	    }
+	    }
+	},
+	
+	/**
+	 * Returns true if this KepMap is enabled
+	 * @return {Boolean} 
+	 */
+	isEnabled : function(){
+	    return this.enabled;  
+	},
+	
+	/**
+	 * Enable this KeyMap
+	 */
+	enable: function(){
+		if(!this.enabled){
+		    this.el.on(this.eventName, this.keyDownDelegate);
+		    this.enabled = true;
+		}
+	},
+
+	/**
+	 * Disable this KeyMap
+	 */
+	disable: function(){
+		if(this.enabled){
+		    this.el.removeListener(this.eventName, this.keyDownDelegate);
+		    this.enabled = false;
+		}
+	}
+};

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/KeyNav.jss.html b/www/extras/yui-ext/docs/output/KeyNav.jss.html new file mode 100644 index 000000000..15de1c5ab --- /dev/null +++ b/www/extras/yui-ext/docs/output/KeyNav.jss.html @@ -0,0 +1,124 @@ +KeyNav.js

KeyNav.js

/**
+ * @class Ext.KeyNav
+ * Provides a convenient wrapper for normalized keyboard navigation.  KeyNav allows you to bind
+ * navigation keys to function calls that will get called when the keys are pressed.
+ * <br />Usage:
+ <pre><code>
+var nav = new Ext.KeyNav("my-element", {
+    "left" : function(e){
+        this.moveLeft(e.ctrlKey);
+    },
+    "right" : function(e){
+        this.moveRight(e.ctrlKey);
+    },
+    "enter" : function(e){
+        this.save();
+    },
+    scope : this
+});
+</code></pre>
+ * @constructor
+ * @param {String/HTMLElement/Ext.Element} el The element to bind to
+ * @param {Object} config The config
+ */
+Ext.KeyNav = function(el, config){
+    this.el = Ext.get(el);
+    Ext.apply(this, config);
+    if(!this.disabled){
+        this.disabled = true;
+        this.enable();
+    }
+};
+
+Ext.KeyNav.prototype = {
+    disabled : false,
+    defaultEventAction: "stopEvent",
+
+    prepareEvent : function(e){
+        var k = e.getKey();
+        var h = this.keyToHandler[k];
+        //if(h && this[h]){
+        //    e.stopPropagation();
+        //}
+        if(Ext.isSafari && h && k >= 37 && k <= 40){
+            e.stopEvent();
+        }
+    },
+
+    relay : function(e){
+        var k = e.getKey();
+        var h = this.keyToHandler[k];
+        if(h && this[h]){
+            if(this.doRelay(e, this[h], h) !== true){
+                e[this.defaultEventAction]();
+            }
+        }
+    },
+
+    doRelay : function(e, h, hname){
+        return h.call(this.scope || this, e);
+    },
+
+    // possible handlers
+    enter : false,
+    left : false,
+    right : false,
+    up : false,
+    down : false,
+    tab : false,
+    esc : false,
+    pageUp : false,
+    pageDown : false,
+    del : false,
+    home : false,
+    end : false,
+
+    // quick lookup hash
+    keyToHandler : {
+        37 : "left",
+        39 : "right",
+        38 : "up",
+        40 : "down",
+        33 : "pageUp",
+        34 : "pageDown",
+        46 : "del",
+        36 : "home",
+        35 : "end",
+        13 : "enter",
+        27 : "esc",
+        9  : "tab"
+    },
+
+	/**
+	 * Enable this KeyNav
+	 */
+	enable: function(){
+		if(this.disabled){
+            // ie won't do special keys on keypress, no one else will repeat keys with keydown
+            // the EventObject will normalize Safari automatically
+            if(Ext.isIE){
+                this.el.on("keydown", this.relay,  this);
+            }else{
+                this.el.on("keydown", this.prepareEvent,  this);
+                this.el.on("keypress", this.relay,  this);
+            }
+		    this.disabled = false;
+		}
+	},
+
+	/**
+	 * Disable this KeyNav
+	 */
+	disable: function(){
+		if(!this.disabled){
+		    if(Ext.isIE){
+                this.el.un("keydown", this.relay);
+            }else{
+                this.el.un("keydown", this.prepareEvent);
+                this.el.un("keypress", this.relay);
+            }
+		    this.disabled = true;
+		}
+	}
+};

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Layer.jss.html b/www/extras/yui-ext/docs/output/Layer.jss.html new file mode 100644 index 000000000..8fbc9a993 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Layer.jss.html @@ -0,0 +1,448 @@ +Layer.js

Layer.js

/**
+ * @class Ext.Layer
+ * @extends Ext.Element
+ * An extended Element object that supports a shadow and shim, constrain to viewport and
+ * automatic maintaining of shadow/shim positions.
+ * @cfg {Boolean} shim False to disable the iframe shim in browsers which need one (defaults to true)
+ * @cfg {String/Boolean} shadow True to create a shadow element with default class "x-layer-shadow" or
+ * you can pass a string with a css class name. False turns off the shadow.
+ * @cfg {Object} dh DomHelper object config to create element with (defaults to {tag: "div", cls: "x-layer"}).
+ * @cfg {Boolean} constrain False to disable constrain to viewport (defaults to true)
+ * @cfg {String} cls CSS class to add to the element
+ * @cfg {Number} zindex Starting z-index (defaults to 11000!)
+ * @cfg {Number} shadowOffset Number of pixels to offset the shadow (defaults to 3)
+ * @constructor
+ * @param {Object} config
+ * @param {String/HTMLElement} existingEl (optional) Uses an existing dom element. If the element is not found it creates it.
+ */
+(function(){ 
+Ext.Layer = function(config, existingEl){
+    config = config || {};
+    var dh = Ext.DomHelper;
+    var cp = config.parentEl, pel = cp ? Ext.getDom(cp) : document.body;
+    if(existingEl){
+        this.dom = Ext.getDom(existingEl);
+    }
+    if(!this.dom){
+        var o = config.dh || {tag: "div", cls: "x-layer"};
+        this.dom = dh.append(pel, o);
+    }
+    if(config.cls){
+        this.addClass(config.cls);
+    }
+    this.constrain = config.constrain !== false;
+    this.visibilityMode = Ext.Element.VISIBILITY;
+    if(config.id){
+        this.id = this.dom.id = config.id;
+    }else{
+        this.id = Ext.id(this.dom);
+    }
+    this.zindex = config.zindex || this.getZIndex();
+    this.position("absolute", this.zindex);
+    if(config.shadow){
+        this.shadowOffset = config.shadowOffset || 4;
+        this.shadow = new Ext.Shadow({
+            offset : this.shadowOffset,
+            mode : config.shadow
+        });
+    }else{
+        this.shadowOffset = 0;
+    }
+    this.useShim = config.shim !== false && Ext.useShims;
+    this.useDisplay = config.useDisplay;
+    this.hide();
+};
+
+var supr = Ext.Element.prototype;
+
+// shims are shared among layer to keep from having 100 iframes
+var shims = [];
+
+Ext.extend(Ext.Layer, Ext.Element, {
+
+    getZIndex : function(){
+        return this.zindex || parseInt(this.getStyle("z-index"), 10) || 11000;
+    },
+
+    getShim : function(){
+        if(!this.useShim){
+            return null;
+        }
+        if(this.shim){
+            return this.shim;
+        }
+        var shim = shims.shift();
+        if(!shim){
+            shim = this.createShim();
+            shim.enableDisplayMode('block');
+            shim.dom.style.display = 'none';
+            shim.dom.style.visibility = 'visible';
+        }
+        var pn = this.dom.parentNode;
+        if(shim.dom.parentNode != pn){
+            pn.insertBefore(shim.dom, this.dom);
+        }
+        shim.setStyle('z-index', this.getZIndex()-2);
+        this.shim = shim;
+        return shim;
+    },
+
+    hideShim : function(){
+        if(this.shim){
+            this.shim.setDisplayed(false);
+            shims.push(this.shim);
+            delete this.shim;
+        }
+    },
+
+    disableShadow : function(){
+        if(this.shadow){
+            this.shadowDisabled = true;
+            this.shadow.hide();
+            this.lastShadowOffset = this.shadowOffset;
+            this.shadowOffset = 0;
+        }
+    },
+
+    enableShadow : function(show){
+        if(this.shadow){
+            this.shadowDisabled = false;
+            this.shadowOffset = this.lastShadowOffset;
+            delete this.lastShadowOffset;
+            if(show){
+                this.sync(true);
+            }
+        }
+    },
+
+    // private
+    // this code can execute repeatedly in milliseconds (i.e. during a drag) so
+    // code size was sacrificed for effeciency (e.g. no getBox/setBox, no XY calls)
+    sync : function(doShow){
+        var sw = this.shadow;
+        if(!this.updating && this.isVisible() && (sw || this.useShim)){
+            var sh = this.getShim();
+
+            var w = this.getWidth(),
+                h = this.getHeight();
+
+            var l = this.getLeft(true),
+                t = this.getTop(true);
+
+            if(sw && !this.shadowDisabled){
+                if(doShow && !sw.isVisible()){
+                    sw.show(this);
+                }else{
+                    sw.realign(l, t, w, h);
+                }
+                if(sh){
+                    if(doShow){
+                       sh.show();
+                    }
+                    // fit the shim behind the shadow, so it is shimmed too
+                    var a = sw.adjusts, s = sh.dom.style;
+                    s.left = (Math.min(l, l+a.l))+"px";
+                    s.top = (Math.min(t, t+a.t))+"px";
+                    s.width = (w+a.w)+"px";
+                    s.height = (h+a.h)+"px";
+                }
+            }else if(sh){
+                if(doShow){
+                   sh.show();
+                }
+                sh.setSize(w, h);
+                sh.setLeftTop(l, t);
+            }
+            
+        }
+    },
+
+    // private
+    destroy : function(){
+        this.hideShim();
+        if(this.shadow){
+            this.shadow.hide();
+        }
+        this.removeAllListeners();
+        var pn = this.dom.parentNode;
+        if(pn){
+            pn.removeChild(this.dom);
+        }
+        Ext.Element.uncache(this.id);
+    },
+
+    remove : function(){
+        this.destroy();
+    },
+
+    // private
+    beginUpdate : function(){
+        this.updating = true;
+    },
+
+    // private
+    endUpdate : function(){
+        this.updating = false;
+        this.sync(true);
+    },
+
+    // private
+    hideUnders : function(negOffset){
+        if(this.shadow){
+            this.shadow.hide();
+        }
+        this.hideShim();
+    },
+
+    // private
+    constrainXY : function(){
+        if(this.constrain){
+            var vw = Ext.lib.Dom.getViewWidth(),
+                vh = Ext.lib.Dom.getViewHeight();
+            var s = Ext.get(document).getScroll();
+
+            var xy = this.getXY();
+            var x = xy[0], y = xy[1];   
+            var w = this.dom.offsetWidth+this.shadowOffset, h = this.dom.offsetHeight+this.shadowOffset;
+            // only move it if it needs it
+            var moved = false;
+            // first validate right/bottom
+            if((x + w) > vw+s.left){
+                x = vw - w - this.shadowOffset;
+                moved = true;
+            }
+            if((y + h) > vh+s.top){
+                y = vh - h - this.shadowOffset;
+                moved = true;
+            }
+            // then make sure top/left isn't negative
+            if(x < s.left){
+                x = s.left;
+                moved = true;
+            }
+            if(y < s.top){
+                y = s.top;
+                moved = true;
+            }
+            if(moved){
+                if(this.avoidY){
+                    var ay = this.avoidY;
+                    if(y <= ay && (y+h) >= ay){
+                        y = ay-h-5;   
+                    }
+                }
+                xy = [x, y];
+                this.storeXY(xy);
+                supr.setXY.call(this, xy);
+                this.sync();
+            }
+        }
+    },
+
+    isVisible : function(){
+        return this.visible;    
+    },
+
+    // private
+    showAction : function(){
+        this.visible = true; // track visibility to prevent getStyle calls
+        if(this.useDisplay === true){
+            this.setDisplayed("");
+        }else if(this.lastXY){
+            supr.setXY.call(this, this.lastXY);
+        }else if(this.lastLT){
+            supr.setLeftTop.call(this, this.lastLT[0], this.lastLT[1]);
+        }
+    },
+
+    // private
+    hideAction : function(){
+        this.visible = false;
+        if(this.useDisplay === true){
+            this.setDisplayed(false);
+        }else{
+            this.setLeftTop(-10000,-10000);
+        }
+    },
+
+    // overridden Element method
+    setVisible : function(v, a, d, c, e){
+        if(v){
+            this.showAction();
+        }
+        if(a && v){
+            var cb = function(){
+                this.sync(true);
+                if(c){
+                    c();
+                }
+            }.createDelegate(this);
+            supr.setVisible.call(this, true, true, d, cb, e);
+        }else{
+            if(!v){
+                this.hideUnders(true);
+            }
+            var cb = c;
+            if(a){
+                cb = function(){
+                    this.hideAction();
+                    if(c){
+                        c();
+                    }
+                }.createDelegate(this);
+            }
+            supr.setVisible.call(this, v, a, d, cb, e);
+            if(v){
+                this.sync(true);
+            }else if(!a){
+                this.hideAction();
+            }
+        }
+    },
+
+    storeXY : function(xy){
+        delete this.lastLT;
+        this.lastXY = xy;
+    },
+
+    storeLeftTop : function(left, top){
+        delete this.lastXY;
+        this.lastLT = [left, top];
+    },
+
+    // private
+    beforeFx : function(){
+        this.beforeAction();
+        return Ext.Layer.superclass.beforeFx.apply(this, arguments);
+    },
+
+    // private
+    afterFx : function(){
+        Ext.Layer.superclass.afterFx.apply(this, arguments);
+        this.sync(this.isVisible());
+    },
+
+    // private
+    beforeAction : function(){
+        if(!this.updating && this.shadow){
+            this.shadow.hide();
+        }
+    },
+
+    // overridden Element method
+    setLeft : function(left){
+        this.storeLeftTop(left, this.getTop(true));
+        supr.setLeft.apply(this, arguments);
+        this.sync();
+    },
+
+    setTop : function(top){
+        this.storeLeftTop(this.getLeft(true), top);
+        supr.setTop.apply(this, arguments);
+        this.sync();
+    },
+
+    setLeftTop : function(left, top){
+        this.storeLeftTop(left, top);
+        supr.setLeftTop.apply(this, arguments);
+        this.sync();
+    },
+
+    setXY : function(xy, a, d, c, e){
+        this.fixDisplay();
+        this.beforeAction();
+        this.storeXY(xy);
+        var cb = this.createCB(c);
+        supr.setXY.call(this, xy, a, d, cb, e);
+        if(!a){
+            cb();
+        }
+    },
+
+    // private
+    createCB : function(c){
+        var el = this;
+        return function(){
+            el.constrainXY();
+            el.sync(true);
+            if(c){
+                c();
+            }
+        };
+    },
+
+    // overridden Element method
+    setX : function(x, a, d, c, e){
+        this.setXY([x, this.getY()], a, d, c, e);
+    },
+
+    // overridden Element method
+    setY : function(y, a, d, c, e){
+        this.setXY([this.getX(), y], a, d, c, e);
+    },
+
+    // overridden Element method
+    setSize : function(w, h, a, d, c, e){
+        this.beforeAction();
+        var cb = this.createCB(c);
+        supr.setSize.call(this, w, h, a, d, cb, e);
+        if(!a){
+            cb();
+        }
+    },
+
+    // overridden Element method
+    setWidth : function(w, a, d, c, e){
+        this.beforeAction();
+        var cb = this.createCB(c);
+        supr.setWidth.call(this, w, a, d, cb, e);
+        if(!a){
+            cb();
+        }
+    },
+
+    // overridden Element method
+    setHeight : function(h, a, d, c, e){
+        this.beforeAction();
+        var cb = this.createCB(c);
+        supr.setHeight.call(this, h, a, d, cb, e);
+        if(!a){
+            cb();
+        }
+    },
+
+    // overridden Element method
+    setBounds : function(x, y, w, h, a, d, c, e){
+        this.beforeAction();
+        var cb = this.createCB(c);
+        if(!a){
+            this.storeXY([x, y]);
+            supr.setXY.call(this, [x, y]);
+            supr.setSize.call(this, w, h, a, d, cb, e);
+            cb();
+        }else{
+            supr.setBounds.call(this, x, y, w, h, a, d, cb, e);
+        }
+        return this;
+    },
+    
+    /**
+     * Set the z-index of this layer and adjusts any shadow and shim z-indexes. The layer z-index is automatically
+     * incremented by two more than the value passed in so that it always shows above any shadow or shim (the shadow
+     * element, if any, will be assigned z-index + 1, and the shim element, if any, will be assigned the unmodified z-index).
+     * @param {Number} zindex The new z-index to set
+     * @return {this} The Layer
+     */
+    setZIndex : function(zindex){
+        this.zindex = zindex;
+        this.setStyle("z-index", zindex + 2);
+        if(this.shadow){
+            this.shadow.setZIndex(zindex + 1);
+        }
+        if(this.shim){
+            this.shim.setStyle("z-index", zindex);
+        }
+    }
+});
+})();

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Layout.jss.html b/www/extras/yui-ext/docs/output/Layout.jss.html new file mode 100644 index 000000000..5b1e9d6eb --- /dev/null +++ b/www/extras/yui-ext/docs/output/Layout.jss.html @@ -0,0 +1,200 @@ +Layout.js

Layout.js

/**
+ * @class Ext.form.Layout
+ * @extends Ext.Component
+ * Creates a container for layout and rendering of fields in an {@link Ext.form.Form}.
+ * @constructor
+ * @param {Object} config Configuration options
+ */
+Ext.form.Layout = function(config){
+    Ext.form.Layout.superclass.constructor.call(this, config);
+    this.stack = [];
+};
+
+Ext.extend(Ext.form.Layout, Ext.Component, {
+    /**
+     * @cfg {String/Object} autoCreate
+     * A DomHelper element spec used to autocreate the layout (defaults to {tag: 'div', cls: 'x-form-ct'})
+     */
+// holder
+/***
+     * @cfg {String/Object/Function} style
+     * A style specification string eg "width:100px", or object in the form {width:"100px"}, or
+     * a function which returns such a specification.
+     */
+// holder
+/***
+     * @cfg {String} labelAlign
+     * Valid values are "left," "top" and "right" (defaults to "left")
+     */
+// holder
+/***
+     * @cfg {Number} labelWidth
+     * Fixed width in pixels of all field labels (defaults to undefined)
+     */
+// holder
+/***
+     * @cfg {Boolean} clear
+     * True to add a clearing element at the end of this layout, equivalent to CSS clear: both (defaults to true)
+     */
+    clear : true,
+    /**
+     * @cfg {String} labelSeparator
+     * The separator to use after field labels (defaults to ':')
+     */
+    labelSeparator : ':',
+    /**
+     * @cfg {Boolean} hideLabels
+     * True to suppress the display of field labels in this layout (defaults to false)
+     */
+    hideLabels : false,
+
+    // private
+    defaultAutoCreate : {tag: 'div', cls: 'x-form-ct'},
+
+    // private
+    onRender : function(ct, position){
+        if(this.el){ // from markup
+            this.el = Ext.get(this.el);
+        }else {  // generate
+            var cfg = this.getAutoCreate();
+            this.el = ct.createChild(cfg, position);
+        }
+        if(this.style){
+            this.el.applyStyles(this.style);
+        }
+        if(this.labelAlign){
+            this.el.addClass('x-form-label-'+this.labelAlign);
+        }
+        if(this.hideLabels){
+            this.labelStyle = "display:none";
+            this.elementStyle = "padding-left:0;";
+        }else{
+            if(typeof this.labelWidth == 'number'){
+                this.labelStyle = "width:"+this.labelWidth+"px;";
+                this.elementStyle = "padding-left:"+((this.labelWidth+(typeof this.labelPad == 'number' ? this.labelPad : 5))+'px')+";";
+            }
+            if(this.labelAlign == 'top'){
+                this.labelStyle = "width:auto;";
+                this.elementStyle = "padding-left:0;";
+            }
+        }
+        var stack = this.stack;
+        var slen = stack.length;
+        if(slen > 0){
+            if(!this.fieldTpl){
+                var t = new Ext.Template(
+                    '<div class="x-form-item {5}">',
+                        '<label for="{0}" style="{2}">{1}{4}</label>',
+                        '<div class="x-form-element" id="x-form-el-{0}" style="{3}">',
+                        '</div>',
+                    '</div><div class="x-form-clear-left"></div>'
+                );
+                t.disableFormats = true;
+                t.compile();
+                Ext.form.Layout.prototype.fieldTpl = t;
+            }
+            for(var i = 0; i < slen; i++) {
+                if(stack[i].isFormField){
+                    this.renderField(stack[i]);
+                }else{
+                    this.renderComponent(stack[i]);
+                }
+            }
+        }
+        if(this.clear){
+            this.el.createChild({cls:'x-form-clear'});
+        }
+    },
+
+    // private
+    renderField : function(f){
+       this.fieldTpl.append(this.el, [
+               f.id, f.fieldLabel,
+               f.labelStyle||this.labelStyle||'',
+               this.elementStyle||'',
+               typeof f.labelSeparator == 'undefined' ? this.labelSeparator : f.labelSeparator,
+               f.itemCls||this.itemCls||''
+       ]);
+    },
+
+    // private
+    renderComponent : function(c){
+        c.render(this.el);
+    }
+});
+
+/**
+ * @class Ext.form.Column
+ * @extends Ext.form.Layout
+ * Creates a column container for layout and rendering of fields in an {@link Ext.form.Form}.
+ * @constructor
+ * @param {Object} config Configuration options
+ */
+Ext.form.Column = function(config){
+    Ext.form.Column.superclass.constructor.call(this, config);
+};
+
+Ext.extend(Ext.form.Column, Ext.form.Layout, {
+    /**
+     * @cfg {Number} width
+     * The fixed width of the column in pixels (defaults to auto)
+     */
+// holder
+/***
+     * @cfg {String/Object} autoCreate
+     * A DomHelper element spec used to autocreate the column (defaults to {tag: 'div', cls: 'x-form-ct x-form-column'})
+     */
+
+    // private
+    defaultAutoCreate : {tag: 'div', cls: 'x-form-ct x-form-column'},
+
+    // private
+    onRender : function(ct, position){
+        Ext.form.Column.superclass.onRender.call(this, ct, position);
+        if(this.width){
+            this.el.setWidth(this.width);
+        }
+    }
+});
+
+/**
+ * @class Ext.form.FieldSet
+ * @extends Ext.form.Layout
+ * Creates a fieldset container for layout and rendering of fields in an {@link Ext.form.Form}.
+ * @constructor
+ * @param {Object} config Configuration options
+ */
+Ext.form.FieldSet = function(config){
+    Ext.form.FieldSet.superclass.constructor.call(this, config);
+};
+
+Ext.extend(Ext.form.FieldSet, Ext.form.Layout, {
+    /**
+     * @cfg {String} legend
+     * The text to display as the legend for the FieldSet (defaults to '')
+     */
+// holder
+/***
+     * @cfg {String/Object} autoCreate
+     * A DomHelper element spec used to autocreate the fieldset (defaults to {tag: 'fieldset', cn: {tag:'legend'}})
+     */
+
+    // private
+    defaultAutoCreate : {tag: 'fieldset', cn: {tag:'legend'}},
+
+    // private
+    onRender : function(ct, position){
+        Ext.form.FieldSet.superclass.onRender.call(this, ct, position);
+        if(this.legend){
+            this.setLegend(this.legend);
+        }
+    },
+
+    // private
+    setLegend : function(text){
+        if(this.rendered){
+            this.el.child('legend').update(text);
+        }
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/LayoutManager.jss.html b/www/extras/yui-ext/docs/output/LayoutManager.jss.html new file mode 100644 index 000000000..e1c665dd7 --- /dev/null +++ b/www/extras/yui-ext/docs/output/LayoutManager.jss.html @@ -0,0 +1,136 @@ +LayoutManager.js

LayoutManager.js

/**
+ * @class Ext.LayoutManager
+ * @extends Ext.util.Observable
+ * Base class for layout managers.
+ */
+Ext.LayoutManager = function(container, config){
+    Ext.LayoutManager.superclass.constructor.call(this);
+    this.el = Ext.get(container);
+    // ie scrollbar fix
+    if(this.el.dom == document.body && Ext.isIE && !config.allowScroll){
+        document.body.scroll = "no";
+    }else if(this.el.dom != document.body && this.el.getStyle('position') == 'static'){
+        this.el.position('relative');
+    }
+    this.id = this.el.id;
+    this.el.addClass("x-layout-container");
+    /** false to disable window resize monitoring @type Boolean */
+    this.monitorWindowResize = true;
+    this.regions = {};
+    this.addEvents({
+        /**
+         * @event layout
+         * Fires when a layout is performed. 
+         * @param {Ext.LayoutManager} this
+         */
+        "layout" : true,
+        /**
+         * @event regionresized
+         * Fires when the user resizes a region. 
+         * @param {Ext.LayoutRegion} region
+         * @param {Number} newSize The new size (width for east/west, height for north/south)
+         */
+        "regionresized" : true,
+        /**
+         * @event regioncollapsed
+         * Fires when a region is collapsed. 
+         * @param {Ext.LayoutRegion} region
+         */
+        "regioncollapsed" : true,
+        /**
+         * @event regionexpanded
+         * Fires when a region is expanded.  
+         * @param {Ext.LayoutRegion} region
+         */
+        "regionexpanded" : true
+    });
+    this.updating = false;
+    Ext.EventManager.onWindowResize(this.onWindowResize, this, true);
+};
+
+Ext.extend(Ext.LayoutManager, 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){
+            size = this.el.getSize();
+        }else{
+            size = {width: Ext.lib.Dom.getViewWidth(), height: Ext.lib.Dom.getViewHeight()};
+        }
+        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 {Ext.Element}
+     */
+    getEl : function(){
+        return this.el;
+    },
+    
+    /**
+     * Returns the specified region.
+     * @param {String} target The region key
+     * @return {Ext.LayoutRegion}
+     */
+    getRegion : function(target){
+        return this.regions[target.toLowerCase()];
+    },
+    
+    onWindowResize : function(){
+        if(this.monitorWindowResize){
+            this.layout();
+        }
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/LayoutRegion.jss.html b/www/extras/yui-ext/docs/output/LayoutRegion.jss.html new file mode 100644 index 000000000..88d9154e6 --- /dev/null +++ b/www/extras/yui-ext/docs/output/LayoutRegion.jss.html @@ -0,0 +1,585 @@ +LayoutRegion.js

LayoutRegion.js

/**
+ * @class Ext.LayoutRegion
+ * @extends Ext.BasicLayoutRegion
+ * This class represents a region in a layout manager.
+ * @cfg {Boolean} collapsible False to disable collapsing (defaults to true)
+ * @cfg {Boolean} collapsed True to set the initial display to collapsed (defaults to false)
+ * @cfg {Boolean} floatable False to disable floating (defaults to true)
+ * @cfg {Object} margins Margins for the element (defaults to {top: 0, left: 0, right:0, bottom: 0})
+ * @cfg {Object} cmargins Margins for the element when collapsed (defaults to: north/south {top: 2, left: 0, right:0, bottom: 2} or east/west {top: 0, left: 2, right:2, bottom: 0})
+ * @cfg {String} tabPosition "top" or "bottom" (defaults to "bottom")
+ * @cfg {String} collapsedTitle Optional string message to display in the collapsed block of a north or south region
+ * @cfg {Boolean} alwaysShowTabs True to always display tabs even when only 1 panel (defaults to false)
+ * @cfg {Boolean} autoScroll True to enable overflow scrolling (defaults to false)
+ * @cfg {Boolean} titlebar True to display a title bar (defaults to true)
+ * @cfg {String} title The title for the region (overrides panel titles)
+ * @cfg {Boolean} animate True to animate expand/collapse (defaults to false)
+ * @cfg {Boolean} autoHide False to disable autoHide when the mouse leaves the "floated" region (defaults to true)
+ * @cfg {Boolean} preservePanels True to preserve removed panels so they can be readded later (defaults to false)
+ * @cfg {Boolean} closeOnTab True to place the close icon on the tabs instead of the region titlebar (defaults to false)
+ * @cfg {Boolean} hideTabs True to hide the tab strip (defaults to false)
+ * @cfg {Boolean} resizeTabs True to enable automatic tab resizing. This will resize the tabs so they are all the same size and fit within
+ * the space available, similar to FireFox 1.5 tabs (defaults to false)
+ * @cfg {Number} minTabWidth The minimum tab width (defaults to 40)
+ * @cfg {Number} preferredTabWidth The preferred tab width (defaults to 150)
+ * @cfg {Boolean} showPin True to show a pin button
+* @cfg {Boolean} hidden True to start the region hidden
+* @cfg {Boolean} hideWhenEmpty True to hide the region when it has no panels
+* @cfg {Boolean} disableTabTips True to disable tab tooltips
+ */
+Ext.LayoutRegion = function(mgr, config, pos){
+    Ext.LayoutRegion.superclass.constructor.call(this, mgr, config, pos, true);
+    var dh = Ext.DomHelper;
+    /** This regions container element @type Ext.Element */
+    this.el = dh.append(mgr.el.dom, {tag: "div", cls: "x-layout-panel x-layout-panel-" + this.position}, true);
+    /** This regions title element @type Ext.Element */
+
+    if(config.titlebar !== false){
+        this.titleEl = dh.append(this.el.dom, {tag: "div", unselectable: "on", cls: "x-unselectable x-layout-panel-hd x-layout-title-"+this.position, children:[
+            {tag: "span", cls: "x-unselectable x-layout-panel-hd-text", unselectable: "on", html: "&#160;"},
+            {tag: "div", cls: "x-unselectable x-layout-panel-hd-tools", unselectable: "on"}
+        ]}, true);
+        this.titleEl.enableDisplayMode();
+        /** This regions title text element @type HTMLElement */
+        this.titleTextEl = this.titleEl.dom.firstChild;
+        this.tools = Ext.get(this.titleEl.dom.childNodes[1], true);
+        this.closeBtn = this.createTool(this.tools.dom, "x-layout-close");
+        this.closeBtn.enableDisplayMode();
+        this.closeBtn.on("click", this.closeClicked, this);
+        this.closeBtn.hide();
+    }
+    
+    this.createBody(config);
+    this.visible = true;
+    this.collapsed = false;
+
+    if(config.hideWhenEmpty){
+        this.hide();
+        this.on("paneladded", this.validateVisibility, this);
+        this.on("panelremoved", this.validateVisibility, this);
+    }
+    this.applyConfig(config);
+};
+
+Ext.extend(Ext.LayoutRegion, Ext.BasicLayoutRegion, {
+
+    createBody : function(){
+        /** This regions body element @type Ext.Element */
+        this.bodyEl = this.el.createChild({tag: "div", cls: "x-layout-panel-body"});
+    },
+
+    applyConfig : function(c){
+        if(c.collapsible && this.position != "center" && !this.collapsedEl){
+            var dh = Ext.DomHelper;
+            if(c.titlebar !== false){
+                this.collapseBtn = this.createTool(this.tools.dom, "x-layout-collapse-"+this.position);
+                this.collapseBtn.on("click", this.collapse, this);
+                this.collapseBtn.enableDisplayMode();
+
+                if(c.showPin === true || this.showPin){
+                    this.stickBtn = this.createTool(this.tools.dom, "x-layout-stick");
+                    this.stickBtn.enableDisplayMode();
+                    this.stickBtn.on("click", this.expand, this);
+                    this.stickBtn.hide();
+                }
+            }
+            /** This region's collapsed element @type Ext.Element */
+            this.collapsedEl = dh.append(this.mgr.el.dom, {cls: "x-layout-collapsed x-layout-collapsed-"+this.position, children:[
+                {cls: "x-layout-collapsed-tools", children:[{cls: "x-layout-ctools-inner"}]}
+            ]}, true);
+            if(c.floatable !== false){
+               this.collapsedEl.addClassOnOver("x-layout-collapsed-over");
+               this.collapsedEl.on("click", this.collapseClick, this);
+            }
+
+            if(c.collapsedTitle && (this.position == "north" || this.position== "south")) {
+                this.collapsedTitleTextEl = dh.append(this.collapsedEl.dom, {tag: "div", cls: "x-unselectable x-layout-panel-hd-text",
+                   id: "message", unselectable: "on", style:{"float":"left"}});
+               this.collapsedTitleTextEl.innerHTML = c.collapsedTitle;
+             }
+            this.expandBtn = this.createTool(this.collapsedEl.dom.firstChild.firstChild, "x-layout-expand-"+this.position);
+            this.expandBtn.on("click", this.expand, this);
+        }
+        if(this.collapseBtn){
+            this.collapseBtn.setVisible(c.collapsible == true);
+        }
+        this.cmargins = c.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 = c.margins || this.margins || {top: 0, left: 0, right:0, bottom: 0};
+        this.bottomTabs = c.tabPosition != "top";
+        this.autoScroll = c.autoScroll || false;
+        if(this.autoScroll){
+            this.bodyEl.setStyle("overflow", "auto");
+        }else{
+            this.bodyEl.setStyle("overflow", "hidden");
+        }
+        if(c.titlebar !== false){
+            if((!c.titlebar && !c.title) || c.titlebar === false){
+                this.titleEl.hide();
+            }else{
+                this.titleEl.show();
+                if(c.title){
+                    this.titleTextEl.innerHTML = c.title;
+                }
+            }
+        }
+        this.duration = c.duration || .30;
+        this.slideDuration = c.slideDuration || .45;
+        this.config = c;
+        if(c.collapsed){
+            this.collapse(true);
+        }
+        if(c.hidden){
+            this.hide();
+        }
+    },
+    /**
+     * Returns true if this region is currently visible.
+     * @return {Boolean}
+     */
+    isVisible : function(){
+        return this.visible;
+    },
+
+    /**
+     * Updates the collapsed text for north/south regions (used with collapsedTitle config option)
+     */
+    setCollapsedTitle : function(title){
+        title = title || "&#160;";
+        if(this.collapsedTitleTextEl){
+            this.collapsedTitleTextEl.innerHTML = title;
+        }
+    },
+
+    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("x-layout-panel-dragover");
+    },
+
+    unhighlight : function(){
+        this.el.removeClass("x-layout-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.updateBody(box.width, box.height);
+        }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();
+        }
+    },
+
+    updateBody : function(w, h){
+        if(w !== null){
+            this.el.setWidth(w);
+            w -= this.el.getBorderWidth("rl");
+            if(this.config.adjustments){
+                w += this.config.adjustments[0];
+            }
+        }
+        if(h !== null){
+            this.el.setHeight(h);
+            h = this.titleEl && this.titleEl.isDisplayed() ? h - (this.titleEl.getHeight()||0) : h;
+            h -= this.el.getBorderWidth("tb");
+            if(this.config.adjustments){
+                h += this.config.adjustments[1];
+            }
+            this.bodyEl.setHeight(h);
+            if(this.tabs){
+                h = this.tabs.syncHeight(h);
+            }
+        }
+        if(this.panelSize){
+            w = w !== null ? w : this.panelSize.width;
+            h = h !== null ? h : this.panelSize.height;
+        }
+        if(this.activePanel){
+            var el = this.activePanel.getEl();
+            w = w !== null ? w : el.getWidth();
+            h = h !== null ? h : el.getHeight();
+            this.panelSize = {width: w, height: h};
+            this.activePanel.setSize(w, h);
+        }
+        if(Ext.isIE && this.tabs){
+            this.tabs.el.repaint();
+        }
+    },
+
+    /**
+     * Returns the container element for this region.
+     * @return {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);
+    },
+
+    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.fireEvent("invalidated", this);
+            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 {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 || this.el.hasActiveFx()) return;
+        if(this.isSlid){
+            this.afterSlideIn();
+            skipAnim = true;
+        }
+        this.collapsed = false;
+        if(this.config.animate && skipAnim !== true){
+            this.animateExpand();
+        }else{
+            this.el.show();
+            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 Ext.TabPanel(this.bodyEl.dom, {
+            tabPosition: this.bottomTabs ? 'bottom' : 'top',
+            disableTooltips: this.config.disableTabTips
+        });
+        if(this.config.hideTabs){
+            ts.stripWrap.setDisplayed(false);
+        }
+        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");
+        ts.bodyEl.addClass('x-layout-tabs-body');
+        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());
+        if(panel.tabTip !== undefined){
+            ti.setTooltip(panel.tabTip);
+        }
+        ti.on("activate", function(){
+              this.setActivePanel(panel);
+        }, this);
+        if(this.config.closeOnTab){
+            ti.on("beforeclose", function(t, e){
+                e.cancel = true;
+                this.remove(panel);
+            }, this);
+        }
+        return ti;
+    },
+
+    updatePanelTitle : function(panel, title){
+        if(this.activePanel == panel){
+            this.updateTitle(title);
+        }
+        if(this.tabs){
+            var ti = this.tabs.getTab(panel.getEl().id);
+            ti.setText(title);
+            if(panel.tabTip !== undefined){
+                ti.setTooltip(panel.tabTip);
+            }
+        }
+    },
+
+    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);
+        }
+        if(this.closeBtn){
+            this.closeBtn.setVisible(!this.config.closeOnTab && !this.isSlid && panel.isClosable());
+        }
+        this.updateTitle(panel.getTitle());
+        if(this.tabs){
+            this.fireEvent("invalidated", this);
+        }
+        this.fireEvent("panelactivated", this, panel);
+    },
+
+    /**
+     * Show the specified panel.
+     * @param {Number/String/ContentPanel} panelId The panels index, id or the panel itself
+     * @return {Ext.ContentPanel} The shown panel or null
+     */
+    showPanel : function(panel){
+        if(panel = this.getPanel(panel)){
+            if(this.tabs){
+                var tab = this.tabs.getTab(panel.getEl().id);
+                if(tab.isHidden()){
+                    this.tabs.unhideTab(tab.id);
+                }
+                tab.activate();
+            }else{
+                this.setActivePanel(panel);
+            }
+        }
+        return panel;
+    },
+
+    /**
+     * Get the active panel for this region.
+     * @return {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 {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;
+        }
+        if(this.hasPanel(panel)){
+            this.showPanel(panel);
+            return panel;
+        }
+        panel.setRegion(this);
+        this.panels.add(panel);
+        if(this.panels.getCount() == 1 && !this.config.alwaysShowTabs){
+            this.bodyEl.dom.appendChild(panel.getEl().dom);
+            if(panel.background !== true){
+                this.setActivePanel(panel);
+            }
+            this.fireEvent("paneladded", this, panel);
+            return panel;
+        }
+        if(!this.tabs){
+            this.initTabs();
+        }else{
+            this.initPanelAsTab(panel);
+        }
+        if(panel.background !== true){
+            this.tabs.activate(panel.getEl().id);
+        }
+        this.fireEvent("paneladded", this, panel);
+        return panel;
+    },
+
+    /**
+     * 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);
+        }
+    },
+
+    clearPanels : function(){
+        while(this.panels.getCount() > 0){
+             this.remove(this.panels.first());
+        }
+    },
+
+    /**
+     * 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 {Ext.ContentPanel} The panel that was removed
+     */
+    remove : function(panel, preservePanel){
+        panel = this.getPanel(panel);
+        if(!panel){
+            return null;
+        }
+        var e = {};
+        this.fireEvent("beforeremove", this, panel, e);
+        if(e.cancel === true){
+            return null;
+        }
+        preservePanel = (typeof preservePanel != "undefined" ? preservePanel : (this.config.preservePanels === true || panel.preserve === 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("div"); // 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 {Ext.TabPanel}
+     */
+    getTabs : function(){
+        return this.tabs;
+    },
+
+    createTool : function(parentEl, className){
+        var btn = Ext.DomHelper.append(parentEl, {tag: "div", cls: "x-layout-tools-button",
+            children: [{tag: "div", cls: "x-layout-tools-button-inner " + className, html: "&#160;"}]}, true);
+        btn.addClassOnOver("x-layout-tools-button-over");
+        return btn;
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/LayoutStateManager.jss.html b/www/extras/yui-ext/docs/output/LayoutStateManager.jss.html new file mode 100644 index 000000000..b7a78982c --- /dev/null +++ b/www/extras/yui-ext/docs/output/LayoutStateManager.jss.html @@ -0,0 +1,69 @@ +LayoutStateManager.js

LayoutStateManager.js

/*
+ * Private internal class for reading and applying state
+ */
+Ext.LayoutStateManager = function(layout){
+     // default empty state
+     this.state = {
+        north: {},
+        south: {},
+        east: {},
+        west: {}       
+    };
+};
+
+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);
+        layout.on("regioncollapsed", this.onRegionCollapsed, this);
+        layout.on("regionexpanded", this.onRegionExpanded, this);
+    },
+    
+    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();
+    }
+};

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/LoadMask.jss.html b/www/extras/yui-ext/docs/output/LoadMask.jss.html new file mode 100644 index 000000000..6a6c2beef --- /dev/null +++ b/www/extras/yui-ext/docs/output/LoadMask.jss.html @@ -0,0 +1,93 @@ +LoadMask.js

LoadMask.js

/**
+ * @class Ext.LoadMask
+ * A simple utility class for generically masking elements while loading data.  If the element being masked has
+ * an underlying {@link Ext.data.Store}, the masking will be automatically synchronized with the store's loading
+ * process and the mask element will be cached for reuse.  For all other elements, this mask will replace the
+ * element's UpdateManager load indicator and will be destroyed after the initial load.
+ * @constructor
+ * Create a new LoadMask
+ * @param {Object} config The config object
+ */
+Ext.LoadMask = function(el, config){
+    this.el = Ext.get(el);
+    Ext.apply(this, config);
+    if(this.store){
+        this.store.on('beforeload', this.onBeforeLoad, this);
+        this.store.on('load', this.onLoad, this);
+        this.store.on('loadexception', this.onLoad, this);
+        this.removeMask = false;
+    }else{
+        var um = this.el.getUpdateManager();
+        um.showLoadIndicator = false; // disable the default indicator
+        um.on('beforeupdate', this.onBeforeLoad, this);
+        um.on('update', this.onLoad, this);
+        um.on('failure', this.onLoad, this);
+        this.removeMask = true;
+    }
+};
+
+Ext.LoadMask.prototype = {
+    /**
+     * @cfg {Boolean} removeMask
+     * True to create a single-use mask that is automatically destroyed after loading (useful for page loads),
+     * False to persist the mask element reference for multiple uses (e.g., for paged data widgets).  Defaults to false.
+     */
+// holder
+/***
+     * @cfg {String} msg
+     * The text to display in a centered loading message box (defaults to 'Loading...')
+     */
+    msg : 'Loading...',
+    /**
+     * @cfg {String} msgCls
+     * The CSS class to apply to the loading message element (defaults to "x-mask-loading")
+     */
+    msgCls : 'x-mask-loading',
+
+    /**
+     * Read-only. True if the mask is currently disabled so that it will not be displayed (defaults to false)
+     * @type Boolean
+     */
+    disabled: false,
+
+    /**
+     * Disables the mask to prevent it from being displayed
+     */
+    disable : function(){
+       this.disabled = true;
+    },
+
+    /**
+     * Enables the mask so that it can be displayed
+     */
+    enable : function(){
+        this.disabled = false;
+    },
+
+    // private
+    onLoad : function(){
+        this.el.unmask(this.removeMask);
+    },
+
+    // private
+    onBeforeLoad : function(){
+        if(!this.disabled){
+            this.el.mask(this.msg, this.msgCls);
+        }
+    },
+
+    // private
+    destroy : function(){
+        if(this.store){
+            this.store.un('beforeload', this.onBeforeLoad, this);
+            this.store.un('load', this.onLoad, this);
+            this.store.un('loadexception', this.onLoad, this);
+        }else{
+            var um = this.el.getUpdateManager();
+            um.un('beforeupdate', this.onBeforeLoad, this);
+            um.un('update', this.onLoad, this);
+            um.un('failure', this.onLoad, this);
+        }
+    }
+};

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/MemoryProxy.jss.html b/www/extras/yui-ext/docs/output/MemoryProxy.jss.html new file mode 100644 index 000000000..977456327 --- /dev/null +++ b/www/extras/yui-ext/docs/output/MemoryProxy.jss.html @@ -0,0 +1,49 @@ +MemoryProxy.js

MemoryProxy.js

/**
+ * @class Ext.data.MemoryProxy
+ * An implementation of Ext.data.DataProxy that simply passes the data specified in its constructor
+ * to the Reader when its load method is called.
+ * @constructor
+ * @param {Object} data The data object which the Reader uses to construct a block of Ext.data.Records.
+ */
+Ext.data.MemoryProxy = function(data){
+    Ext.data.MemoryProxy.superclass.constructor.call(this);
+    this.data = data;
+};
+
+Ext.extend(Ext.data.MemoryProxy, Ext.data.DataProxy, {
+    /**
+     * Load data from the requested source (in this case an in-memory
+     * data object passed to the constructor), read the data object into
+     * a block of Ext.data.Records using the passed Ext.data.DataReader implementation, and
+     * process that block using the passed callback.
+     * @param {Object} params This parameter is not used by the MemoryProxy class.
+     * @param {Ext.data.DataReader) reader The Reader object which converts the data
+     * object into a block of Ext.data.Records.
+     * @param {Function} callback The function into which to pass the block of Ext.data.records.
+     * The function must be passed <ul>
+     * <li>The Record block object</li>
+     * <li>The "arg" argument from the load function</li>
+     * <li>A boolean success indicator</li>
+     * </ul>
+     * @param {Object} scope The scope in which to call the callback
+     * @param {Object} arg An optional argument which is passed to the callback as its second parameter.
+     */
+    load : function(params, reader, callback, scope, arg){
+        params = params || {};
+        var result;
+        try {
+            result = reader.readRecords(this.data);
+        }catch(e){
+            this.fireEvent("loadexception", this, arg, null, e);
+            callback.call(scope, null, arg, false);
+            return;
+        }
+        callback.call(scope, result, arg, true);
+    },
+    
+    // private
+    update : function(params, records){
+        
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Menu.jss.html b/www/extras/yui-ext/docs/output/Menu.jss.html new file mode 100644 index 000000000..daa16b9ec --- /dev/null +++ b/www/extras/yui-ext/docs/output/Menu.jss.html @@ -0,0 +1,501 @@ +Menu.js

Menu.js

/**
+ * @class Ext.menu.Menu
+ * @extends Ext.util.Observable
+ * A menu object.  This is the container to which you add all other menu items.  Menu can also serve a as a base class
+ * when you want a specialzed menu based off of another component (like {@link Ext.menu.DateMenu} for example).
+ * @constructor
+ * Creates a new Menu
+ * @param {Object} config Configuration options
+ */
+Ext.menu.Menu = function(config){
+    Ext.apply(this, config);
+    this.id = this.id || Ext.id();
+    this.addEvents({
+        /**
+         * @event beforeshow
+         * Fires before this menu is displayed
+         * @param {Ext.menu.Menu} this
+         */
+        beforeshow : true,
+        /**
+         * @event beforehide
+         * Fires before this menu is hidden
+         * @param {Ext.menu.Menu} this
+         */
+        beforehide : true,
+        /**
+         * @event show
+         * Fires after this menu is displayed
+         * @param {Ext.menu.Menu} this
+         */
+        show : true,
+        /**
+         * @event hide
+         * Fires after this menu is hidden
+         * @param {Ext.menu.Menu} this
+         */
+        hide : true,
+        /**
+         * @event click
+         * Fires when this menu is clicked (or when the enter key is pressed while it is active)
+         * @param {Ext.menu.Menu} this
+         * @param {String} menuItemId The id of the menu item that was clicked
+         * @param {Ext.EventObject} e
+         */
+        click : true,
+        /**
+         * @event mouseover
+         * Fires when the mouse is hovering over this menu
+         * @param {Ext.menu.Menu} this
+         * @param {Ext.EventObject} e
+         * @param {String} menuItemId The id of the menu item that the mouse is over
+         */
+        mouseover : true,
+        /**
+         * @event mouseout
+         * Fires when the mouse exits this menu
+         * @param {Ext.menu.Menu} this
+         * @param {Ext.EventObject} e
+         * @param {String} menuItemId The id of the menu item that the mouse has exited
+         */
+        mouseout : true,
+        /**
+         * @event itemclick
+         * Fires when a menu item contained in this menu is clicked
+         * @param {Ext.menu.BaseItem} baseItem The BaseItem that was clicked
+         * @param {Ext.EventObject} e
+         */
+        itemclick: true
+    });
+    Ext.menu.MenuMgr.register(this);
+    var mis = this.items;
+    this.items = new Ext.util.MixedCollection();
+    if(mis){
+        this.add.apply(this, mis);
+    }
+};
+
+Ext.extend(Ext.menu.Menu, Ext.util.Observable, {
+    /**
+     * @cfg {Number} minWidth The minimum width of the menu in pixels (defaults to 120)
+     */
+    minWidth : 120,
+    /**
+     * @cfg {Boolean/String} shadow True or "sides" for the default effect, "frame" for 4-way shadow, and "drop"
+     * for bottom-right shadow (defaults to "sides")
+     */
+    shadow : "sides",
+    /**
+     * @cfg {String} subMenuAlign The {@link Ext.Element#alignTo) anchor position value to use for submenus of
+     * this menu (defaults to "tl-tr?")
+     */
+    subMenuAlign : "tl-tr?",
+    /**
+     * @cfg {String} defaultAlign The default {@link Ext.Element#alignTo) anchor position value for this menu
+     * relative to its element of origin (defaults to "tl-bl?")
+     */
+    defaultAlign : "tl-bl?",
+    /**
+     * @cfg {Boolean} allowOtherMenus True to allow multiple menus to be displayed at the same time (defaults to false)
+     */
+    allowOtherMenus : false,
+
+    // private
+    render : function(){
+        if(this.el){
+            return;
+        }
+        var el = this.el = new Ext.Layer({
+            cls: "x-menu",
+            shadow:this.shadow,
+            constrain: false,
+            parentEl: this.parentEl || document.body,
+            zindex:15000
+        });
+
+        this.keyNav = new Ext.menu.MenuNav(this);
+
+        if(this.plain){
+            el.addClass("x-menu-plain");
+        }
+        if(this.cls){
+            el.addClass(this.cls);
+        }
+        // generic focus element
+        this.focusEl = el.createChild({
+            tag: "a", cls: "x-menu-focus", href: "#", onclick: "return false;", tabIndex:"-1"
+        });
+        var ul = el.createChild({tag: "ul", cls: "x-menu-list"});
+        ul.on("click", this.onClick, this);
+        ul.on("mouseover", this.onMouseOver, this);
+        ul.on("mouseout", this.onMouseOut, this);
+        this.items.each(function(item){
+            var li = document.createElement("li");
+            li.className = "x-menu-list-item";
+            ul.dom.appendChild(li);
+            item.render(li, this);
+        }, this);
+        this.ul = ul;
+        this.autoWidth();
+    },
+
+    // private
+    autoWidth : function(){
+        var el = this.el, ul = this.ul;
+        if(!el){
+            return;
+        }
+        var w = this.width;
+        if(w){
+            el.setWidth(w);
+        }else if(Ext.isIE){
+            el.setWidth(this.minWidth);
+            var t = el.dom.offsetWidth; // force recalc
+            el.setWidth(ul.getWidth()+el.getFrameWidth("lr"));
+        }
+    },
+
+    // private
+    delayAutoWidth : function(){
+        if(this.rendered){
+            if(!this.awTask){
+                this.awTask = new Ext.util.DelayedTask(this.autoWidth, this);
+            }
+            this.awTask.delay(20);
+        }
+    },
+
+    // private
+    findTargetItem : function(e){
+        var t = e.getTarget(".x-menu-list-item", this.ul,  true);
+        if(t && t.menuItemId){
+            return this.items.get(t.menuItemId);
+        }
+    },
+
+    // private
+    onClick : function(e){
+        var t;
+        if(t = this.findTargetItem(e)){
+            t.onClick(e);
+            this.fireEvent("click", this, t, e);
+        }
+    },
+
+    // private
+    setActiveItem : function(item, autoExpand){
+        if(item != this.activeItem){
+            if(this.activeItem){
+                this.activeItem.deactivate();
+            }
+            this.activeItem = item;
+            item.activate(autoExpand);
+        }else if(autoExpand){
+            item.expandMenu();
+        }
+    },
+
+    // private
+    tryActivate : function(start, step){
+        var items = this.items;
+        for(var i = start, len = items.length; i >= 0 && i < len; i+= step){
+            var item = items.get(i);
+            if(!item.disabled && item.canActivate){
+                this.setActiveItem(item, false);
+                return item;
+            }
+        }
+        return false;
+    },
+
+    // private
+    onMouseOver : function(e){
+        var t;
+        if(t = this.findTargetItem(e)){
+            if(t.canActivate && !t.disabled){
+                this.setActiveItem(t, true);
+            }
+        }
+        this.fireEvent("mouseover", this, e, t);
+    },
+
+    // private
+    onMouseOut : function(e){
+        var t;
+        if(t = this.findTargetItem(e)){
+            if(t == this.activeItem && t.shouldDeactivate(e)){
+                this.activeItem.deactivate();
+                delete this.activeItem;
+            }
+        }
+        this.fireEvent("mouseout", this, e, t);
+    },
+
+    /**
+     * Read-only.  Returns true if the menu is currently displayed, else false.
+     * @type Boolean
+     */
+    isVisible : function(){
+        return this.el && this.el.isVisible();
+    },
+
+    /**
+     * Displays this menu relative to another element
+     * @param {String/HTMLElement/Ext.Element} element The element to align to
+     * @param {String} position (optional) The {@link Ext.Element#alignTo} anchor position to use in aligning to
+     * the element (defaults to this.defaultAlign)
+     * @param {Ext.menu.Menu} parentMenu (optional) This menu's parent menu, if applicable (defaults to undefined)
+     */
+    show : function(el, pos, parentMenu){
+        this.parentMenu = parentMenu;
+        if(!this.el){
+            this.render();
+        }
+        this.fireEvent("beforeshow", this);
+        this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign), parentMenu, false);
+    },
+
+    /**
+     * Displays this menu at a specific xy position
+     * @param {Array} xyPosition Contains X & Y [x, y] values for the position at which to show the menu (coordinates are page-based)
+     * @param {Ext.menu.Menu} parentMenu (optional) This menu's parent menu, if applicable (defaults to undefined)
+     */
+    showAt : function(xy, parentMenu, /* private: */_fireBefore){
+        this.parentMenu = parentMenu;
+        if(!this.el){
+            this.render();
+        }
+        if(_fireBefore !== false){
+            this.fireEvent("beforeshow", this);
+        }
+        this.el.setXY(xy);
+        this.el.show();
+        this.focusEl.focus.defer(50, this.focusEl);
+        this.fireEvent("show", this);
+    },
+
+    /**
+     * Hides this menu and optionally all parent menus
+     * @param {Boolean} deep (optional) True to hide all parent menus recursively, if any (defaults to false)
+     */
+    hide : function(deep){
+        if(this.el && this.isVisible()){
+            this.fireEvent("beforehide", this);
+            if(this.activeItem){
+                this.activeItem.deactivate();
+                this.activeItem = null;
+            }
+            this.el.hide();
+            this.fireEvent("hide", this);
+        }
+        if(deep === true && this.parentMenu){
+            this.parentMenu.hide(true);
+        }
+    },
+
+    /**
+     * Addds one or more items of any type supported by the Menu class, or that can be converted into menu items.
+     * Any of the following are valid:
+     * <ul>
+     * <li>Any menu item object based on {@link Ext.menu.Item}</li>
+     * <li>An HTMLElement object which will be converted to a menu item</li>
+     * <li>A menu item config object that will be created as a new menu item</li>
+     * <li>A string, which can either be '-' or 'separator' to add a menu separator, otherwise
+     * it will be converted into a {@link Ext.menu.TextItem} and added</li>
+     * </ul>
+     * Usage:
+     * <pre><code>
+// Create the menu
+var menu = new Ext.menu.Menu();
+
+// Create a menu item to add by reference
+var menuItem = new Ext.menu.Item({ text: 'New Item!' });
+
+// Add a bunch of items at once using different methods.
+// Only the last item added will be returned.
+var item = menu.add(
+    menuItem,                // add existing item by ref
+    'Dynamic Item',          // new TextItem
+    '-',                     // new separator
+    { text: 'Config Item' }  // new item by config
+);
+</code></pre>
+     * @param {Mixed} args One or more menu items, menu item configs or other objects that can be converted to menu items
+     * @return {Ext.menu.Item} The menu item that was added, or the last one if multiple items were added
+     */
+    add : function(){
+        var a = arguments, l = a.length, item;
+        for(var i = 0; i < l; i++){
+            var el = a[i];
+            if(el.render){ // some kind of Item
+                item = this.addItem(el);
+            }else if(typeof el == "string"){ // string
+                if(el == "separator" || el == "-"){
+                    item = this.addSeparator();
+                }else{
+                    item = this.addText(el);
+                }
+            }else if(el.tagName || el.el){ // element
+                item = this.addElement(el);
+            }else if(typeof el == "object"){ // must be menu item config?
+                item = this.addMenuItem(el);
+            }
+        }
+        return item;
+    },
+
+    /**
+     * Returns this menu's underlying {@link Ext.Element} object
+     * @return {Ext.Element} The element
+     */
+    getEl : function(){
+        if(!this.el){
+            this.render();
+        }
+        return this.el;
+    },
+
+    /**
+     * Adds a separator bar to the menu
+     * @return {Ext.menu.Item} The menu item that was added
+     */
+    addSeparator : function(){
+        return this.addItem(new Ext.menu.Separator());
+    },
+
+    /**
+     * Adds an {@link Ext.Element} object to the menu
+     * @param {String/HTMLElement/Ext.Element} el The element or DOM node to add, or its id
+     * @return {Ext.menu.Item} The menu item that was added
+     */
+    addElement : function(el){
+        return this.addItem(new Ext.menu.BaseItem(el));
+    },
+
+    /**
+     * Adds an existing object based on {@link Ext.menu.Item} to the menu
+     * @param {Ext.menu.Item} item The menu item to add
+     * @return {Ext.menu.Item} The menu item that was added
+     */
+    addItem : function(item){
+        this.items.add(item);
+        if(this.ul){
+            var li = document.createElement("li");
+            li.className = "x-menu-list-item";
+            this.ul.dom.appendChild(li);
+            item.render(li, this);
+            this.delayAutoWidth();
+        }
+        return item;
+    },
+
+    /**
+     * Creates a new {@link Ext.menu.Item} based an the supplied config object and adds it to the menu
+     * @param {Object} config A MenuItem config object
+     * @return {Ext.menu.Item} The menu item that was added
+     */
+    addMenuItem : function(config){
+        if(!(config instanceof Ext.menu.Item)){
+             config = new Ext.menu.Item(config);
+        }
+        return this.addItem(config);
+    },
+
+    /**
+     * Creates a new {@link Ext.menu.TextItem} with the supplied text and adds it to the menu
+     * @param {String} text The text to display in the menu item
+     * @return {Ext.menu.Item} The menu item that was added
+     */
+    addText : function(text){
+        return this.addItem(new Ext.menu.TextItem(text));
+    },
+
+    /**
+     * Inserts an existing object based on {@link Ext.menu.Item} to the menu at a specified index
+     * @param {Number} index The index in the menu's list of current items where the new item should be inserted
+     * @param {Ext.menu.Item} item The menu item to add
+     * @return {Ext.menu.Item} The menu item that was added
+     */
+    insert : function(index, item){
+        this.items.insert(index, item);
+        if(this.ul){
+            var li = document.createElement("li");
+            li.className = "x-menu-list-item";
+            this.ul.dom.insertBefore(li, this.ul.dom.childNodes[index]);
+            item.render(li, this);
+            this.delayAutoWidth();
+        }
+        return item;
+    },
+
+    /**
+     * Removes an {@link Ext.menu.Item} from the menu and destroys the object
+     * @param {Ext.menu.Item} item The menu item to remove
+     */
+    remove : function(item){
+        this.items.removeKey(item.id);
+        item.destroy();
+    },
+
+    /**
+     * Removes and destroys all items in the menu
+     */
+    removeAll : function(){
+        var f;
+        while(f = this.items.first()){
+            this.remove(f);
+        }
+    }
+});
+
+// MenuNav is a private utility class used internally by the Menu
+Ext.menu.MenuNav = function(menu){
+    Ext.menu.MenuNav.superclass.constructor.call(this, menu.el);
+    this.scope = this.menu = menu;
+};
+
+Ext.extend(Ext.menu.MenuNav, Ext.KeyNav, {
+    doRelay : function(e, h){
+        var k = e.getKey();
+        if(!this.menu.activeItem && e.isNavKeyPress() && k != e.SPACE && k != e.RETURN){
+            this.menu.tryActivate(0, 1);
+            return false;
+        }
+        return h.call(this.scope || this, e, this.menu);
+    },
+
+    up : function(e, m){
+        if(!m.tryActivate(m.items.indexOf(m.activeItem)-1, -1)){
+            m.tryActivate(m.items.length-1, -1);
+        }
+    },
+
+    down : function(e, m){
+        if(!m.tryActivate(m.items.indexOf(m.activeItem)+1, 1)){
+            m.tryActivate(0, 1);
+        }
+    },
+
+    right : function(e, m){
+        if(m.activeItem){
+            m.activeItem.expandMenu(true);
+        }
+    },
+
+    left : function(e, m){
+        m.hide();
+        if(m.parentMenu && m.parentMenu.activeItem){
+            m.parentMenu.activeItem.activate();
+        }
+    },
+
+    enter : function(e, m){
+        if(m.activeItem){
+            e.stopPropagation();
+            m.activeItem.onClick(e);
+            m.fireEvent("click", this, m.activeItem);
+            return true;
+        }
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/MenuButton.jss.html b/www/extras/yui-ext/docs/output/MenuButton.jss.html new file mode 100644 index 000000000..ff724cecc --- /dev/null +++ b/www/extras/yui-ext/docs/output/MenuButton.jss.html @@ -0,0 +1,167 @@ +MenuButton.js

MenuButton.js

/**
+ * @class Ext.MenuButton
+ * @extends Ext.Button
+ * A split button that provides a built-in dropdown arrow that can fire an event separately from the default
+ * click event of the button.  Typically this would be used to display a dropdown menu that provides additional
+ * options to the primary button action, but any custom handler can provide the arrowclick implementation.
+ * @cfg {Function} arrowHandler A function called when the arrow button is clicked (can be used instead of click event)
+ * @cfg {String} arrowTooltip The title attribute of the arrow
+ * @constructor
+ * Create a new menu button
+ * @param {String/HTMLElement/Element} renderTo The element to append the button to
+ * @param {Object} config The config object
+ */
+Ext.MenuButton = function(renderTo, config){
+    Ext.MenuButton.superclass.constructor.call(this, renderTo, config);
+    /**
+     * @event arrowclick
+     * Fires when this button's arrow is clicked
+     * @param {MenuButton} this
+     * @param {EventObject} e The click event
+     */
+    this.addEvents({"arrowclick":true});
+};
+
+Ext.extend(Ext.MenuButton, Ext.Button, {
+    render : function(renderTo){
+        // this is one sweet looking template!
+        var tpl = new Ext.Template(
+            '<table cellspacing="0" class="x-btn-menu-wrap x-btn"><tr><td>',
+            '<table cellspacing="0" class="x-btn-wrap x-btn-menu-text-wrap"><tbody>',
+            '<tr><td class="x-btn-left"><i>&#160;</i></td><td class="x-btn-center"><button class="x-btn-text">{0}</button></td></tr>',
+            "</tbody></table></td><td>",
+            '<table cellspacing="0" class="x-btn-wrap x-btn-menu-arrow-wrap"><tbody>',
+            '<tr><td class="x-btn-center"><button class="x-btn-menu-arrow-el">&#160;</button></td><td class="x-btn-right"><i>&#160;</i></td></tr>',
+            "</tbody></table></td></tr></table>"
+        );
+        var btn = tpl.append(renderTo, [this.text], true);
+        if(this.cls){
+            btn.addClass(this.cls);
+        }
+        if(this.icon){
+            btn.child("button").setStyle('background-image', 'url(' +this.icon +')');
+        }
+        this.el = btn;
+        this.autoWidth();
+        if(this.handleMouseEvents){
+            btn.on("mouseover", this.onMouseOver, this);
+            btn.on("mouseout", this.onMouseOut, this);
+            btn.on("mousedown", this.onMouseDown, this);
+            btn.on("mouseup", this.onMouseUp, this);
+        }
+        btn.on(this.clickEvent, this.onClick, this);
+        if(this.tooltip){
+            var btnEl = btn.child("button:first");
+            if(typeof this.tooltip == 'object'){
+                Ext.QuickTips.tips(Ext.apply({
+                      target: btnEl.id
+                }, this.tooltip));
+            } else {
+                btnEl.dom[this.tooltipType] = this.tooltip;
+            }
+        }
+        if(this.arrowTooltip){
+            var btnEl = btn.child("button:nth(2)");
+            btnEl.dom[this.tooltipType] = this.arrowTooltip;
+        }
+        if(this.hidden){
+            this.hide();
+        }
+        if(this.disabled){
+            this.disable();
+        }
+        if(this.menu){
+            this.menu.on("show", this.onMenuShow, this);
+            this.menu.on("hide", this.onMenuHide, this);
+        }
+    },
+
+    // private
+    autoWidth : function(){
+        if(this.el){
+            var tbl = this.el.child("table:first");
+            var tbl2 = this.el.child("table:last");
+            this.el.setWidth("auto");
+            tbl.setWidth("auto");
+            if(Ext.isIE7 && Ext.isStrict){
+                var ib = this.el.child('button:first');
+                if(ib && ib.getWidth() > 20){
+                    ib.clip();
+                    ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr'));
+                }
+            }
+            if(this.minWidth){
+                if(this.hidden){
+                    this.el.beginMeasure();
+                }
+                if((tbl.getWidth()+tbl2.getWidth()) < this.minWidth){
+                    tbl.setWidth(this.minWidth-tbl2.getWidth());
+                }
+                if(this.hidden){
+                    this.el.endMeasure();
+                }
+            }
+            this.el.setWidth(tbl.getWidth()+tbl2.getWidth());
+        } 
+    },
+    /**
+     * Sets this button's 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;  
+    },
+    
+    /**
+     * Sets this button's arrow click handler
+     * @param {Function} handler The function to call when the arrow is clicked
+     * @param {Object} scope (optional) Scope for the function passed above
+     */
+    setArrowHandler : function(handler, scope){
+        this.arrowHandler = handler;
+        this.scope = scope;  
+    },
+    
+    /**
+     * Focus the button
+     */
+    focus : function(){
+        if(this.el){
+            this.el.child("a:first").focus();
+        }
+    },
+
+    // private
+    onClick : function(e){
+        e.preventDefault();
+        if(!this.disabled){
+            if(e.getTarget(".x-btn-menu-arrow-wrap")){
+                if(this.menu && !this.menu.isVisible()){
+                    this.menu.show(this.el, this.menuAlign);
+                }
+                this.fireEvent("arrowclick", this, e);
+                if(this.arrowHandler){
+                    this.arrowHandler.call(this.scope || this, this, e);
+                }
+            }else{
+                this.fireEvent("click", this, e);
+                if(this.handler){
+                    this.handler.call(this.scope || this, this, e);
+                }
+            }
+        }
+    },
+    // private
+    onMouseDown : function(e){
+        if(!this.disabled){
+            Ext.fly(e.getTarget("table")).addClass("x-btn-click");
+        }
+    },
+    // private
+    onMouseUp : function(e){
+        Ext.fly(e.getTarget("table")).removeClass("x-btn-click");
+    }   
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/MenuMgr.jss.html b/www/extras/yui-ext/docs/output/MenuMgr.jss.html new file mode 100644 index 000000000..bdce58adc --- /dev/null +++ b/www/extras/yui-ext/docs/output/MenuMgr.jss.html @@ -0,0 +1,176 @@ +MenuMgr.js

MenuMgr.js

/**
+ * @class Ext.menu.MenuMgr
+ * Provides a common registry of all menu items on a page so that they can be easily accessed by id.
+ * @singleton
+ */
+Ext.menu.MenuMgr = function(){
+   var menus, active, groups = {}, attached = false, lastShow = new Date();
+
+   // private - called when first menu is created
+   function init(){
+       menus = {}, active = new Ext.util.MixedCollection();
+       Ext.get(document).addKeyListener(27, function(){
+           if(active.length > 0){
+               hideAll();
+           }
+       });
+   }
+
+   // private
+   function hideAll(){
+       if(active.length > 0){
+           var c = active.clone();
+           c.each(function(m){
+               m.hide();
+           });
+       }
+   }
+
+   // private
+   function onHide(m){
+       active.remove(m);
+       if(active.length < 1){
+           Ext.get(document).un("mousedown", onMouseDown);
+           attached = false;
+       }
+   }
+
+   // private
+   function onShow(m){
+       var last = active.last();
+       lastShow = new Date();
+       active.add(m);
+       if(!attached){
+           Ext.get(document).on("mousedown", onMouseDown);
+           attached = true;
+       }
+       if(m.parentMenu){
+          m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3);
+          m.parentMenu.activeChild = m;
+       }else if(last && last.isVisible()){
+          m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3);
+       }
+   }
+
+   // private
+   function onBeforeHide(m){
+       if(m.activeChild){
+           m.activeChild.hide();
+       }
+       if(m.autoHideTimer){
+           clearTimeout(m.autoHideTimer);
+           delete m.autoHideTimer;
+       }
+   }
+
+   // private
+   function onBeforeShow(m){
+       var pm = m.parentMenu;
+       if(!pm && !m.allowOtherMenus){
+           hideAll();
+       }else if(pm && pm.activeChild){
+           pm.activeChild.hide();
+       }
+   }
+
+   // private
+   function onMouseDown(e){
+       if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){
+           hideAll();
+       }
+   }
+
+   // private
+   function onBeforeCheck(mi, state){
+       if(state){
+           var g = groups[mi.group];
+           for(var i = 0, l = g.length; i < l; i++){
+               if(g[i] != mi){
+                   g[i].setChecked(false);
+               }
+           }
+       }
+   }
+
+   return {
+
+       /**
+        * Hides all menus that are currently visible
+        */
+       hideAll : function(){
+            hideAll();  
+       },
+
+       // private
+       register : function(menu){
+           if(!menus){
+               init();
+           }
+           menus[menu.id] = menu;
+           menu.on("beforehide", onBeforeHide);
+           menu.on("hide", onHide);
+           menu.on("beforeshow", onBeforeShow);
+           menu.on("show", onShow);
+           var g = menu.group;
+           if(g && menu.events["checkchange"]){
+               if(!groups[g]){
+                   groups[g] = [];
+               }
+               groups[g].push(menu);
+               menu.on("checkchange", onCheck);
+           }
+       },
+
+        /**
+         * Returns a {@link Ext.menu.Menu} object
+         * @param {String/Object} menu The string menu id, an existing menu object reference, or a Menu config that will
+         * be used to generate and return a new Menu instance.
+         */
+       get : function(menu){
+           if(typeof menu == "string"){ // menu id
+               return menus[menu];
+           }else if(menu.events){  // menu instance
+               return menu;
+           }else{ // otherwise, must be a config
+               return new Ext.menu.Menu(menu);
+           }
+       },
+
+       // private
+       unregister : function(menu){
+           delete menus[menu.id];
+           menu.un("beforehide", onBeforeHide);
+           menu.un("hide", onHide);
+           menu.un("beforeshow", onBeforeShow);
+           menu.un("show", onShow);
+           var g = menu.group;
+           if(g && menu.events["checkchange"]){
+               groups[g].remove(menu);
+               menu.un("checkchange", onCheck);
+           }
+       },
+
+       // private
+       registerCheckable : function(menuItem){
+           var g = menuItem.group;
+           if(g){
+               if(!groups[g]){
+                   groups[g] = [];
+               }
+               groups[g].push(menuItem);
+               menuItem.on("beforecheckchange", onBeforeCheck);
+           }
+       },
+
+       // private
+       unregisterCheckable : function(menuItem){
+           var g = menuItem.group;
+           if(g){
+               groups[g].remove(menuItem);
+               menuItem.un("beforecheckchange", onBeforeCheck);
+           }
+       }
+   };
+}();
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/MessageBox.jss.html b/www/extras/yui-ext/docs/output/MessageBox.jss.html new file mode 100644 index 000000000..39622cd35 --- /dev/null +++ b/www/extras/yui-ext/docs/output/MessageBox.jss.html @@ -0,0 +1,479 @@ +MessageBox.js

MessageBox.js

/**
+ * @class Ext.MessageBox
+ * Utility class for generating different styles of message boxes.  The alias Ext.Msg can also be used.
+ * Example usage:
+ *<pre><code>
+// Basic alert:
+Ext.Msg.alert('Status', 'Changes saved successfully.');
+
+// Prompt for user data:
+Ext.Msg.prompt('Name', 'Please enter your name:', function(btn, text){
+    if (btn == 'ok'){
+        // process text value...
+    }
+});
+
+// Show a dialog using config options:
+Ext.Msg.show({
+   title:'Save Changes?',
+   msg: 'Your are closing a tab that has unsaved changes. Would you like to save your changes?',
+   buttons: Ext.Msg.YESNOCANCEL,
+   fn: processResult,
+   animEl: 'elId'
+});
+ </code></pre>
+ * @singleton
+ */
+Ext.MessageBox = function(){
+    var dlg, opt, mask, waitTimer;
+    var bodyEl, msgEl, textboxEl, textareaEl, progressEl, pp;
+    var buttons, activeTextEl, bwidth;
+
+    // private
+    var handleButton = function(button){
+        dlg.hide();
+        Ext.callback(opt.fn, opt.scope||window, [button, activeTextEl.dom.value], 1);
+    };
+
+    // private
+    var handleHide = function(){
+        if(opt && opt.cls){
+            dlg.el.removeClass(opt.cls);
+        }
+        if(waitTimer){
+            Ext.TaskMgr.stop(waitTimer);
+            waitTimer = null;
+        }
+    };
+
+    // private
+    var updateButtons = function(b){
+        var width = 0;
+        if(!b){
+            buttons["ok"].hide();
+            buttons["cancel"].hide();
+            buttons["yes"].hide();
+            buttons["no"].hide();
+            dlg.footer.dom.style.display = 'none';
+            return width;
+        }
+        dlg.footer.dom.style.display = '';
+        for(var k in buttons){
+            if(typeof buttons[k] != "function"){
+                if(b[k]){
+                    buttons[k].show();
+                    buttons[k].setText(typeof b[k] == "string" ? b[k] : Ext.MessageBox.buttonText[k]);
+                    width += buttons[k].el.getWidth()+15;
+                }else{
+                    buttons[k].hide();
+                }
+            }
+        }
+        return width;
+    };
+
+    // private
+    var handleEsc = function(d, k, e){
+        if(opt && opt.closable !== false){
+            dlg.hide();
+        }
+        if(e){
+            e.stopEvent();
+        }
+    };
+
+    return {
+        /**
+         * Returns a reference to the underlying {@link Ext.BasicDialog} element
+         * @return {Ext.BasicDialog} dialog The BasicDialog element
+         */
+        getDialog : function(){
+           if(!dlg){
+                dlg = new Ext.BasicDialog("x-msg-box", {
+                    autoCreate : true,
+                    shadow: true,
+                    draggable: true,
+                    resizable:false,
+                    constraintoviewport:false,
+                    fixedcenter:true,
+                    collapsible : false,
+                    shim:true,
+                    modal: true,
+                    width:400, height:100,
+                    buttonAlign:"center",
+                    closeClick : function(){
+                        if(opt && opt.buttons && opt.buttons.no && !opt.buttons.cancel){
+                            handleButton("no");
+                        }else{
+                            handleButton("cancel");
+                        }
+                    }
+                });
+                dlg.on("hide", handleHide);
+                mask = dlg.mask;
+                dlg.addKeyListener(27, handleEsc);
+                buttons = {};
+                var bt = this.buttonText;
+                buttons["ok"] = dlg.addButton(bt["ok"], handleButton.createCallback("ok"));
+                buttons["yes"] = dlg.addButton(bt["yes"], handleButton.createCallback("yes"));
+                buttons["no"] = dlg.addButton(bt["no"], handleButton.createCallback("no"));
+                buttons["cancel"] = dlg.addButton(bt["cancel"], handleButton.createCallback("cancel"));
+                bodyEl = dlg.body.createChild({
+                    tag:"div",
+                    html:'<span class="ext-mb-text"></span><br /><input type="text" class="ext-mb-input" /><textarea class="ext-mb-textarea"></textarea><div class="ext-mb-progress-wrap"><div class="ext-mb-progress"><div class="ext-mb-progress-bar">&#160;</div></div></div>'
+                });
+                msgEl = bodyEl.dom.firstChild;
+                textboxEl = Ext.get(bodyEl.dom.childNodes[2]);
+                textboxEl.enableDisplayMode();
+                textboxEl.addKeyListener([10,13], function(){
+                    if(dlg.isVisible() && opt && opt.buttons){
+                        if(opt.buttons.ok){
+                            handleButton("ok");
+                        }else if(opt.buttons.yes){
+                            handleButton("yes");
+                        }
+                    }
+                });
+                textareaEl = Ext.get(bodyEl.dom.childNodes[3]);
+                textareaEl.enableDisplayMode();
+                progressEl = Ext.get(bodyEl.dom.childNodes[4]);
+                progressEl.enableDisplayMode();
+                var pf = progressEl.dom.firstChild;
+                pp = Ext.get(pf.firstChild);
+                pp.setHeight(pf.offsetHeight);
+            }
+            return dlg;
+        },
+
+        /**
+         * Updates the message box body text
+         * @param {String} text Replaces the message box element's innerHTML with the specified string (defaults to
+         * the XHTML-compliant non-breaking space character &#160;)
+         * @return {Ext.MessageBox} messageBox This message box
+         */
+        updateText : function(text){
+            if(!dlg.isVisible() && !opt.width){
+                dlg.resizeTo(this.maxWidth, 100); // resize first so content is never clipped from previous shows
+            }
+            msgEl.innerHTML = text || '&#160;';
+            var w = Math.max(Math.min(opt.width || msgEl.offsetWidth, this.maxWidth), 
+                        Math.max(opt.minWidth || this.minWidth, bwidth));
+            if(opt.prompt){
+                activeTextEl.setWidth(w);
+            }
+            if(dlg.isVisible()){
+                dlg.fixedcenter = false;
+            }
+            dlg.setContentSize(w, bodyEl.getHeight());
+            if(dlg.isVisible()){
+                dlg.fixedcenter = true;
+            }
+            return this;
+        },
+
+        /**
+         * Updates a progress-style message box's text and progress bar.  Only relevant on message boxes
+         * initiated via {@link Ext.MessageBox#progress} or by calling {@link Ext.MessageBox#show} with progress: true.
+         * @param {Number} value Any number between 0 and 1 (e.g., .5)
+         * @param {String} text If defined, the message box's body text is replaced with the specified string (defaults to undefined)
+         * @return {Ext.MessageBox} messageBox This message box
+         */
+        updateProgress : function(value, text){
+            if(text){
+                this.updateText(text);
+            }
+            pp.setWidth(Math.floor(value*progressEl.dom.firstChild.offsetWidth));
+            return this;
+        },        
+
+        /**
+         * Returns true if the message box is currently displayed
+         * @return {Boolean} isVisible True if the message box is visible, else false
+         */
+        isVisible : function(){
+            return dlg && dlg.isVisible();  
+        },
+
+        /**
+         * Hides the message box if it is displayed
+         */
+        hide : function(){
+            if(this.isVisible()){
+                dlg.hide();
+            }  
+        },
+
+        /**
+         * Displays a new message box, or reinitializes an existing message box, based on the config options
+         * passed in. All functions (e.g. prompt, alert, etc) on MessageBox call this function internally.
+         * The following config object properties are supported:
+         * <pre>
+Property    Type             Description
+----------  ---------------  ----------------------------------------------------------------------
+title       String           The title text
+closable    Boolean          False to hide the top-right close box (defaults to true)
+prompt      Boolean          True to prompt the user to enter single-line text (defaults to false)
+multiline   Boolean          True to prompt the user to enter multi-line text (defaults to false)
+progress    Boolean          True to display a progress bar (defaults to false)
+value       String           The string value to set into the active textbox element if displayed
+buttons     Object/Boolean   A button config object (e.g., Ext.MessageBox.OKCANCEL or {ok:'Foo',
+                             cancel:'Bar'}), or false to not show any buttons (defaults to false)
+msg         String           A string that will replace the existing message box body text (defaults
+                             to the XHTML-compliant non-breaking space character &#160;)
+cls         String           A custom CSS class to apply to the message box element
+proxyDrag   Boolean          True to display a lightweight proxy while dragging (defaults to false)
+modal       Boolean          False to allow user interaction with the page while the message box is
+                             displayed (defaults to true)
+</pre>
+         *
+         * Example usage:
+         * <pre><code>
+Ext.Msg.show({
+   title: 'Address',
+   msg: 'Please enter your address:',
+   width: 300,
+   buttons: Ext.MessageBox.OKCANCEL,
+   multiline: true,
+   fn: saveAddress,
+   animEl: 'addAddressBtn'
+});
+</code></pre>
+         * @param {Object} config Configuration options
+         * @return {Ext.MessageBox} messageBox This message box
+         */
+        show : function(options){
+            if(this.isVisible()){
+                this.hide();
+            }
+            var d = this.getDialog();
+            opt = options;
+            d.setTitle(opt.title || "&#160;");
+            d.close.setDisplayed(opt.closable !== false);
+            activeTextEl = textboxEl;
+            opt.prompt = opt.prompt || (opt.multiline ? true : false);
+            if(opt.prompt){
+                if(opt.multiline){
+                    textboxEl.hide();
+                    textareaEl.show();
+                    textareaEl.setHeight(typeof opt.multiline == "number" ?
+                        opt.multiline : this.defaultTextHeight);
+                    activeTextEl = textareaEl;
+                }else{
+                    textboxEl.show();
+                    textareaEl.hide();
+                }
+            }else{
+                textboxEl.hide();
+                textareaEl.hide();
+            }
+            progressEl.setDisplayed(opt.progress === true);
+            this.updateProgress(0);
+            activeTextEl.dom.value = opt.value || "";
+            if(opt.prompt){
+                dlg.setDefaultButton(activeTextEl);
+            }else{
+                var bs = opt.buttons;
+                var db = null;
+                if(bs && bs.ok){
+                    db = buttons["ok"];
+                }else if(bs && bs.yes){
+                    db = buttons["yes"];
+                }
+                dlg.setDefaultButton(db);
+            }
+            bwidth = updateButtons(opt.buttons);
+            this.updateText(opt.msg);
+            if(opt.cls){
+                d.el.addClass(opt.cls);
+            }
+            d.proxyDrag = opt.proxyDrag === true;
+            d.modal = opt.modal !== false;
+            d.mask = opt.modal !== false ? mask : false;
+            if(!d.isVisible()){
+                // force it to the end of the z-index stack so it gets a cursor in FF
+                document.body.appendChild(dlg.el.dom);
+                d.animateTarget = null;
+                d.show(options.animEl);
+            }
+            return this;
+        },
+
+        /**
+         * Displays a message box with a progress bar.  This message box has no buttons and is not closeable by
+         * the user.  You are responsible for updating the progress bar as needed via {@link Ext.MessageBox#updateProgress}
+         * and closing the message box when the process is complete.
+         * @param {String} title The title bar text
+         * @param {String} msg The message box body text
+         * @return {Ext.MessageBox} messageBox This message box
+         */
+        progress : function(title, msg){
+            this.show({
+                title : title,
+                msg : msg,
+                buttons: false,
+                progress:true,
+                closable:false,
+                minWidth: this.minProgressWidth
+            });
+            return this;
+        },
+
+        /**
+         * Displays a standard read-only message box (comparable to the basic JavaScript alert prompt) with an OK
+         * button. If a callback function is passed it will be called after the user clicks the button, and the
+         * id of the button that was clicked will be passed as the only parameter to the callback
+         * (could also be the top-right close button).
+         * @param {String} title The title bar text
+         * @param {String} msg The message box body text
+         * @param {Function} fn (optional) The callback function invoked after the message box is closed
+         * @param {Object} scope (optional) The scope of the callback function
+         * @return {Ext.MessageBox} messageBox This message box
+         */
+        alert : function(title, msg, fn, scope){
+            this.show({
+                title : title,
+                msg : msg,
+                buttons: this.OK,
+                fn: fn,
+                scope : scope
+            });
+            return this;
+        },
+
+        /**
+         * Displays a message box with an infinitely auto-updating progress bar.  This can be used to block user
+         * interaction while waiting for a long-running process to complete that does not have defined intervals.
+         * You are responsible for closing the message box when the process is complete.
+         * @param {String} msg The message box body text
+         * @param {String} title (optional) The title bar text
+         * @return {Ext.MessageBox} messageBox This message box
+         */
+        wait : function(msg, title){
+            this.show({
+                title : title,
+                msg : msg,
+                buttons: false,
+                closable:false,
+                progress:true,
+                modal:true,
+                width:300,
+                wait:true
+            });
+            waitTimer = Ext.TaskMgr.start({
+                run: function(i){
+                    Ext.MessageBox.updateProgress(((((i+20)%20)+1)*5)*.01);
+                },
+                interval: 1000
+            });
+            return this;
+        },
+
+        /**
+         * Displays a confirmation message box with Yes and No buttons.  If a callback function is passed it will
+         * be called after the user clicks either button, and the id of the button that was clicked
+         * will be passed as the only parameter to the callback (could also be the top-right close button).
+         * @param {String} title The title bar text
+         * @param {String} msg The message box body text
+         * @param {Function} fn (optional) The callback function invoked after the message box is closed
+         * @param {Object} scope (optional) The scope of the callback function
+         * @return {Ext.MessageBox} messageBox This message box
+         */
+        confirm : function(title, msg, fn, scope){
+            this.show({
+                title : title,
+                msg : msg,
+                buttons: this.YESNO,
+                fn: fn,
+                scope : scope
+            });
+            return this;
+        },
+
+        /**
+         * Displays a message box with OK and Cancel buttons prompting the user to enter some text.  The prompt can
+         * be a single-line or multi-line textbox.  If a callback function is passed it will be called after the user
+         * clicks either button, and the id of the button that was clicked (could also be the top-right
+         * close button) and the text that was entered will be passed as the two parameters to the callback.
+         * @param {String} title The title bar text
+         * @param {String} msg The message box body text
+         * @param {Function} fn (optional) The callback function invoked after the message box is closed
+         * @param {Object} scope (optional) The scope of the callback function
+         * @param {Boolean/Number} multiline (optional) True to create a multiline textbox using the defaultTextHeight
+         * property, or the height in pixels to create the textbox (defaults to false / single-line)
+         * @return {Ext.MessageBox} messageBox This message box
+         */
+        prompt : function(title, msg, fn, scope, multiline){
+            this.show({
+                title : title,
+                msg : msg,
+                buttons: this.OKCANCEL,
+                fn: fn,
+                minWidth:250,
+                scope : scope,
+                prompt:true,
+                multiline: multiline
+            });
+            return this;
+        },
+
+        /**
+         * Button config that displays a single OK button
+         * @type Object
+         */
+        OK : {ok:true},
+        /**
+         * Button config that displays Yes and No buttons
+         * @type Object
+         */
+        YESNO : {yes:true, no:true},
+        /**
+         * Button config that displays OK and Cancel buttons
+         * @type Object
+         */
+        OKCANCEL : {ok:true, cancel:true},
+        /**
+         * Button config that displays Yes, No and Cancel buttons
+         * @type Object
+         */
+        YESNOCANCEL : {yes:true, no:true, cancel:true},
+
+        /**
+         * The default height in pixels of the message box's multiline textarea if displayed (defaults to 75)
+         * @type Number
+         */
+        defaultTextHeight : 75,
+        /**
+         * The maximum width in pixels of the message box (defaults to 600)
+         * @type Number
+         */
+        maxWidth : 600,
+        /**
+         * The minimum width in pixels of the message box (defaults to 100)
+         * @type Number
+         */
+        minWidth : 100,
+        /**
+         * The minimum width in pixels of the message box progress bar if displayed (defaults to 250)
+         * @type Number
+         */
+        minProgressWidth : 250,
+        /**
+         * An object containing the default button text strings that can be overriden for localized language support.
+         * Supported properties are: ok, cancel, yes and no.
+         * Customize the default text like so: Ext.MessageBox.buttonText.yes = "Si";
+         * @type Object
+         */
+        buttonText : {
+            ok : "OK",
+            cancel : "Cancel",
+            yes : "Yes",
+            no : "No"
+        }
+    };
+}();
+
+/**
+ * Shorthand for {@link Ext.MessageBox}
+ */
+Ext.Msg = Ext.MessageBox;

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/MixedCollection.jss.html b/www/extras/yui-ext/docs/output/MixedCollection.jss.html new file mode 100644 index 000000000..34074b649 --- /dev/null +++ b/www/extras/yui-ext/docs/output/MixedCollection.jss.html @@ -0,0 +1,503 @@ +MixedCollection.js

MixedCollection.js

/**
+ * @class Ext.util.MixedCollection
+ * @extends Ext.util.Observable
+ * 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 (defaults to false)
+ * @param {Function} keyFn A function that can accept an item of the type(s) stored in this MixedCollection
+ * and return the key value for that item.  This is used when available to look up the key on items that
+ * were passed without an explicit key parameter to a MixedCollection method.  Passing this parameter is
+ * equivalent to providing an implementation for the {@link #getKey} method.
+ */
+Ext.util.MixedCollection = function(allowFunctions, keyFn){
+    this.items = [];
+    this.map = {};
+    this.keys = [];
+    this.length = 0;
+    this.addEvents({
+        /**
+         * @event clear
+         * Fires when the collection is cleared.
+         */
+        "clear" : true,
+        /**
+         * @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" : true,
+        /**
+         * @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" : true,
+        /**
+         * @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" : true,
+        "sort" : true
+    });
+    this.allowFunctions = allowFunctions === true;
+    if(keyFn){
+        this.getKey = keyFn;
+    }
+    Ext.util.MixedCollection.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.util.MixedCollection, 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);
+        }
+        if(typeof key == "undefined" || key === null){
+            this.length++;
+            this.items.push(o);
+            this.keys.push(null);
+        }else{
+            var old = this.map[key];
+            if(old){
+                return this.replace(key, o);
+            }
+            this.length++;
+            this.items.push(o);
+            this.map[key] = o;
+            this.keys.push(key);
+        }
+        this.fireEvent("add", this.length-1, o, key);
+        return o;
+    },
+   
+/**
+  * MixedCollection has a generic way to fetch keys if you implement getKey.
+    <pre><code>
+    // normal way
+    var mc = new Ext.util.MixedCollection();
+    mc.add(someEl.dom.id, someEl);
+    mc.add(otherEl.dom.id, otherEl);
+    //and so on
+    
+    // using getKey
+    var mc = new Ext.util.MixedCollection();
+    mc.getKey = function(el){
+       return el.dom.id;
+    }
+    mc.add(someEl);
+    mc.add(otherEl);
+    // etc
+    </code>
+ * @param o {Object} The item for which to find the key.
+ * @return {Object} The key for the passed item.
+ */
+    getKey : function(o){
+         return o.id; 
+    },
+   
+/**
+ * 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);
+        }
+        var old = this.item(key);
+        if(typeof key == "undefined" || key === null || typeof old == "undefined"){
+             return this.add(key, o);
+        }
+        var index = this.indexOfKey(key);
+        this.items[index] = o;
+        this.map[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. returning false from the function will stop the iteration.
+ * @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){
+        var items = [].concat(this.items); // each safe for removal
+        for(var i = 0, len = items.length; i < len; i++){
+            if(fn.call(scope || items[i], items[i], i, len) === false){
+                break;
+            }
+        }
+    },
+   
+/**
+ * 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], i, len);
+        }
+    },
+   
+/**
+ * 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], this.keys[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.length){
+            return this.add(key, o);
+        }
+        this.length++;
+        this.items.splice(index, 0, o);
+        if(typeof key != "undefined" && key != null){
+            this.map[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){
+        return this.removeAt(this.indexOf(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){
+        if(index < this.length && index >= 0){
+            this.length--;
+            var o = this.items[index];
+            this.items.splice(index, 1);
+            var key = this.keys[index];
+            if(typeof key != "undefined"){
+                delete this.map[key];
+            }
+            this.keys.splice(index, 1);
+            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){
+        return this.removeAt(this.indexOfKey(key));
+    },
+   
+/**
+ * Returns the number of items in the collection.
+ * @return {Number} the number of items in the collection.
+ */
+    getCount : function(){
+        return this.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 OR index. Key has priority over index.
+ * @param {String/Number} key The key or index of the item.
+ * @return {Object} The item associated with the passed key.
+ */
+    item : function(key){
+        var item = typeof this.map[key] != "undefined" ? this.map[key] : this.items[key];
+        return typeof item != 'function' || this.allowFunctions ? item : null; // for prototype!
+    },
+    
+/**
+ * Returns the item at the specified index.
+ * @param {Number} index The index of the item.
+ * @return {Object}
+ */
+    itemAt : function(index){
+        return this.items[index];
+    },
+    
+/**
+ * Returns the item associated with the passed key.
+ * @param {String/Number} key The key of the item.
+ * @return {Object} The item associated with the passed key.
+ */
+    key : function(key){
+        return this.map[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.map[key] != "undefined";
+    },
+   
+/**
+ * Removes all items from the collection.
+ */
+    clear : function(){
+        this.length = 0;
+        this.items = [];
+        this.keys = [];
+        this.map = {};
+        this.fireEvent("clear");
+    },
+   
+/**
+ * Returns the first item in the collection.
+ * @return {Object} the first item in the collection..
+ */
+    first : function(){
+        return this.items[0]; 
+    },
+   
+/**
+ * Returns the last item in the collection.
+ * @return {Object} the last item in the collection..
+ */
+    last : function(){
+        return this.items[this.length-1];   
+    },
+    
+    _sort : function(property, dir, fn){
+        var dsc = String(dir).toUpperCase() == "DESC" ? -1 : 1;
+        fn = fn || function(a, b){
+            return a-b;
+        };
+        var c = [], k = this.keys, items = this.items;
+        for(var i = 0, len = items.length; i < len; i++){
+            c[c.length] = {key: k[i], value: items[i], index: i};
+        }
+        c.sort(function(a, b){
+            var v = fn(a[property], b[property]) * dsc;
+            if(v == 0){
+                v = (a.index < b.index ? -1 : 1);
+            }
+            return v;
+        });
+        for(var i = 0, len = c.length; i < len; i++){
+            items[i] = c[i].value;
+            k[i] = c[i].key;
+        }
+        this.fireEvent("sort", this);
+    },
+    
+    /**
+     * Sorts this collection with the passed comparison function
+     * @param {String} direction (optional) "ASC" or "DESC"
+     * @param {Function} fn (optional) comparison function
+     */
+    sort : function(dir, fn){
+        this._sort("value", dir, fn);
+    },
+    
+    /**
+     * Sorts this collection by keys
+     * @param {String} direction (optional) "ASC" or "DESC"
+     * @param {Function} fn (optional) a comparison function (defaults to case insensitive string)
+     */
+    keySort : function(dir, fn){
+        this._sort("key", dir, fn || function(a, b){
+            return String(a).toUpperCase()-String(b).toUpperCase();
+        });
+    },
+    
+    /**
+     * Returns a range of items in this collection
+     * @param {Number} startIndex (optional) defaults to 0
+     * @param {Number} endIndex (optional) default to the last item
+     * @return {Array} An array of items
+     */
+    getRange : function(start, end){
+        var items = this.items;
+        if(items.length < 1){
+            return [];
+        }
+        start = start || 0;
+        end = Math.min(typeof end == "undefined" ? this.length-1 : end, this.length-1);
+        var r = [];
+        if(start <= end){
+            for(var i = start; i <= end; i++) {
+        	    r[r.length] = items[i];
+            }
+        }else{
+            for(var i = start; i >= end; i--) {
+        	    r[r.length] = items[i];
+            }
+        }
+        return r;
+    },
+        
+    /**
+     * Filter the <i>objects</i> in this collection by a specific property. 
+     * Returns a new collection that has been filtered.
+     * @param {String} property A property on your objects
+     * @param {String/RegExp} value Either string that the property values 
+     * should start with or a RegExp to test against the property
+     * @return {MixedCollection} The new filtered collection
+     */
+    filter : function(property, value){
+        if(!value.exec){ // not a regex
+            value = String(value);
+            if(value.length == 0){
+                return this.clone();
+            }
+            value = new RegExp("^" + Ext.escapeRe(value), "i");
+        }
+        return this.filterBy(function(o){
+            return o && value.test(o[property]);
+        });
+	},
+    
+    /**
+     * Filter by a function. * Returns a new collection that has been filtered.
+     * The passed function will be called with each 
+     * object in the collection. If the function returns true, the value is included 
+     * otherwise it is filtered.
+     * @param {Function} fn The function to be called, it will receive the args o (the object), k (the key)
+     * @param {Object} scope (optional) The scope of the function (defaults to this) 
+     * @return {MixedCollection} The new filtered collection
+     */
+    filterBy : function(fn, scope){
+        var r = new Ext.util.MixedCollection();
+        r.getKey = this.getKey;
+        var k = this.keys, it = this.items;
+        for(var i = 0, len = it.length; i < len; i++){
+            if(fn.call(scope||this, it[i], k[i])){
+				r.add(k[i], it[i]);
+			}
+        }
+        return r;
+    },
+    
+    /**
+     * Creates a duplicate of this collection
+     * @return {MixedCollection}
+     */
+    clone : function(){
+        var r = new Ext.util.MixedCollection();
+        var k = this.keys, it = this.items;
+        for(var i = 0, len = it.length; i < len; i++){
+            r.add(k[i], it[i]);
+        }
+        r.getKey = this.getKey;
+        return r;
+    }
+});
+/**
+ * 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.
+ */
+Ext.util.MixedCollection.prototype.get = Ext.util.MixedCollection.prototype.item;

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/NumberField.jss.html b/www/extras/yui-ext/docs/output/NumberField.jss.html new file mode 100644 index 000000000..081a36542 --- /dev/null +++ b/www/extras/yui-ext/docs/output/NumberField.jss.html @@ -0,0 +1,131 @@ +NumberField.js

NumberField.js

/**
+ * @class Ext.form.NumberField
+ * @extends Ext.form.TextField
+ * Numeric text field that provides automatic keystroke filtering and numeric validation.
+ * @constructor
+ * Creates a new NumberField
+ * @param {Object} config Configuration options
+ */
+Ext.form.NumberField = function(config){
+    Ext.form.NumberField.superclass.constructor.call(this, config);
+};
+
+Ext.extend(Ext.form.NumberField, Ext.form.TextField,  {
+    /**
+     * @cfg {String} fieldClass The default CSS class for the field (defaults to "x-form-field x-form-num-field")
+     */
+    fieldClass: "x-form-field x-form-num-field",
+    /**
+     * @cfg {Boolean} allowDecimals False to disallow decimal values (defaults to true)
+     */
+    allowDecimals : true,
+    /**
+     * @cfg {String} decimalSeparator Character(s) to allow as the decimal separator (defaults to '.')
+     */
+    decimalSeparator : ".",
+    /**
+     * @cfg {Number} decimalPrecision The maximum precision to display after the decimal separator (defaults to 2)
+     */
+    decimalPrecision : 2,
+    /**
+     * @cfg {Boolean} allowNegative False to require only positive numbers (defaults to true)
+     */
+    allowNegative : true,
+    /**
+     * @cfg {Number} minValue The minimum allowed value (defaults to Number.NEGATIVE_INFINITY)
+     */
+    minValue : Number.NEGATIVE_INFINITY,
+    /**
+     * @cfg {Number} maxValue The maximum allowed value (defaults to Number.MAX_VALUE)
+     */
+    maxValue : Number.MAX_VALUE,
+    /**
+     * @cfg {String} minText Error text to display if the minimum value validation fails (defaults to "The minimum value for this field is {minValue}")
+     */
+    minText : "The minimum value for this field is {0}",
+    /**
+     * @cfg {String} maxText Error text to display if the maximum value validation fails (defaults to "The maximum value for this field is {maxValue}")
+     */
+    maxText : "The maximum value for this field is {0}",
+    /**
+     * @cfg {String} nanText Error text to display if the value is not a valid number.  For example, this can happen
+     * if a valid character like '.' or '-' is left in the field with no number (defaults to "{value} is not a valid number")
+     */
+    nanText : "{0} is not a valid number",
+
+    // private
+    initEvents : function(){
+        Ext.form.NumberField.superclass.initEvents.call(this);
+        var allowed = "0123456789";
+        if(this.allowDecimals){
+            allowed += this.decimalSeparator;
+        }
+        if(this.allowNegative){
+            allowed += "-";
+        }
+        var keyPress = function(e){
+            var k = e.getKey();
+            if(!Ext.isIE && (e.isNavKeyPress() || k == e.BACKSPACE || (k == e.DELETE && e.button == -1))){
+                return;
+            }
+            var c = e.getCharCode();
+            if(allowed.indexOf(String.fromCharCode(c)) === -1){
+                e.stopEvent();
+            }
+        };
+        this.el.on("keypress", keyPress, this);
+    },
+
+    // private
+    validateValue : function(value){
+        if(!Ext.form.NumberField.superclass.validateValue.call(this, value)){
+            return false;
+        }
+        if(value.length < 1){ // if it's blank and textfield didn't flag it then it's valid
+             return true;
+        }
+        value = String(value).replace(this.decimalSeparator, ".");
+        if(isNaN(value)){
+            this.markInvalid(String.format(this.nanText, value));
+            return false;
+        }
+        var num = this.parseValue(value);
+        if(num < this.minValue){
+            this.markInvalid(String.format(this.minText, this.minValue));
+            return false;
+        }
+        if(num > this.maxValue){
+            this.markInvalid(String.format(this.maxText, this.maxValue));
+            return false;
+        }
+        return true;
+    },
+
+    // private
+    parseValue : function(value){
+        return parseFloat(String(value).replace(this.decimalSeparator, "."));
+    },
+
+    // private
+    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);
+    },
+
+    // private
+    decimalPrecisionFcn : function(v){
+        return Math.floor(v);
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Observable.jss.html b/www/extras/yui-ext/docs/output/Observable.jss.html new file mode 100644 index 000000000..96a13ff53 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Observable.jss.html @@ -0,0 +1,341 @@ +Observable.js

Observable.js


+/**
+ * @class 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>
+ Employee = function(name){
+    this.name = name;
+    this.events = {
+        "fired" : true,
+        "quit" : true
+    }
+ }
+ Ext.extend(Employee, Ext.util.Observable);
+</code></pre>
+ */
+Ext.util.Observable = function(){
+    if(this.listeners){
+        this.on(this.listeners);
+        delete this.listeners;
+    }
+};
+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()];
+        if(typeof ce == "object"){
+            return ce.fire.apply(ce, Array.prototype.slice.call(arguments, 1));
+        }else{
+            return true;
+        }
+    },
+
+    // private
+    filterOptRe : /^(?:scope|delay|buffer|single)$/,
+
+    /**
+     * Appends an event handler to this component
+     * @param {String}   eventName The type of event to listen for
+     * @param {Function} handler The method the event invokes
+     * @param {Object}   scope (optional) The scope in which to execute the handler
+     * function. The handler function's "this" context.
+     * @param {Object}   options (optional) An object containing handler configuration
+     * properties. This may contain any of the following properties:<ul>
+     * <li>scope {Object} The scope in which to execute the handler function. The handler function's "this" context.</li>
+     * <li>delegate {String} A simple selector to filter the target or look for a descendant of the target</li>
+     * <li>stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.</li>
+     * <li>preventDefault {Boolean} True to prevent the default action</li>
+     * <li>stopPropagation {Boolean} True to prevent event propagation</li>
+     * <li>normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject</li>
+     * <li>delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.</li>
+     * <li>single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.</li>
+     * <li>buffer {Number} Causes the handler to be scheduled to run in an {@link Ext.util.DelayedTask} delayed
+     * by the specified number of milliseconds. If the event fires again within that time, the original
+     * handler is <em>not</em> invoked, but the new handler is scheduled in its place.</li>
+     * </ul>
+     * <p>
+     * <b>Combining Options</b><br>
+     * Using the options argument, it is possible to combine different types of listeners:<br>
+     * <br>
+     * A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)<div style="margin: 5px 20px 20px;">
+     * Code:
+     * 	<pre><code>el.on('click', this.onClick, this, {
+     * 	single: true,
+     * 	delay: 100,
+     * 	stopEvent : true,
+     *  forumId: 4
+     * });</pre>
+     * <p>
+     * The method also allows for a single argument to be passed which is a config object containing properties
+     * which specify multiple handlers.
+     * <p>
+     * <b>Attaching multiple handlers in 1 call</b><br>
+     * Code:
+     * 	<pre><code>el.on({
+     * 	'click' : {
+     *     	fn: this.onClick
+     * 		scope: this,
+     * 		delay: 100
+     *     }, 
+     * 	'mouseover' : {
+     *     	fn: this.onMouseOver
+     * 		scope: this
+     *     },
+     * 	'mouseout' : {
+     *     	fn: this.onMouseOut
+     * 		scope: this
+     *     }
+     * });</pre>
+     * <p>
+     * Or a shorthand syntax:<br>
+     * Code:
+     * 	<pre><code>el.on({
+     * 	'click' : this.onClick,
+     * 	'mouseover' : this.onMouseOver,
+     * 	'mouseout' : this.onMouseOut
+     * 	scope: this
+     * });</pre>
+     */
+    addListener : function(eventName, fn, scope, o){
+        if(typeof eventName == "object"){
+            o = eventName;
+            for(var e in o){
+                if(this.filterOptRe.test(e)){
+                    continue;
+                }
+                if(typeof o[e] == "function"){
+                    // shared options
+                    this.addListener(e, o[e], o.scope,  o);
+                }else{
+                    // individual options
+                    this.addListener(e, o[e].fn, o[e].scope, o[e]);
+                }
+            }
+            return;
+        }
+        o = (!o || typeof o == "boolean") ? {} : o;
+        eventName = eventName.toLowerCase();
+        var ce = this.events[eventName] || true;
+        if(typeof ce == "boolean"){
+            ce = new Ext.util.Event(this, eventName);
+            this.events[eventName] = ce;
+        }
+        ce.addListener(fn, scope, o);
+    },
+
+    /**
+     * 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){
+        var ce = this.events[eventName.toLowerCase()];
+        if(typeof ce == "object"){
+            ce.removeListener(fn, scope);
+        }
+    },
+
+    /**
+     * Removes all listeners for this object
+     */
+    purgeListeners : function(){
+        for(var evt in this.events){
+            if(typeof this.events[evt] == "object"){
+                 this.events[evt].clearListeners();
+            }
+        }
+    },
+
+    relayEvents : function(o, events){
+        var createHandler = function(ename){
+            return function(){
+                return this.fireEvent.apply(this, Ext.combine(ename, Array.prototype.slice.call(arguments, 0)));
+            };
+        };
+        for(var i = 0, len = events.length; i < len; i++){
+            var ename = events[i];
+            if(!this.events[ename]){ this.events[ename] = true; };
+            o.on(ename, createHandler(ename), this);
+        }
+    },
+
+    /**
+     * Copies any events from the passed object onto this object if they do not already exist.  The passed object
+     * must also inherit from Observable for this method to have any effect.
+     * @param {Object} object The object from which to copy events
+     */
+    addEvents : function(o){
+        if(!this.events){
+            this.events = {};
+        }
+        Ext.applyIf(this.events, o);
+    },
+
+    /**
+     * Checks to see if this object is currently listening for a specified event
+     * @param {String} eventName The name of the event to check for
+     * @return {Boolean} True if the event is being listened for, else false
+     */
+    hasListener : function(eventName){
+        var e = this.events[eventName];
+        return typeof e == "object" && e.listeners.length > 0;
+    }
+};
+/**
+ * Appends an event handler to this element (shorthand for addListener)
+ * @param {String}   eventName     The type of event to listen for
+ * @param {Function} handler        The method the event invokes
+ * @param {Object}   options  (optional)
+ * @method
+ */
+Ext.util.Observable.prototype.on = Ext.util.Observable.prototype.addListener;
+/**
+ * Removes a listener (shorthand for removeListener)
+ * @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
+ * @method
+ */
+Ext.util.Observable.prototype.un = Ext.util.Observable.prototype.removeListener;
+
+/**
+ * Starts capture on the specified Observable. All events will be passed
+ * to the supplied function with the event name + standard signature of the event
+ * <b>before</b> the event is fired. If the supplied function returns false,
+ * the event will not fire.
+ * @param {Observable} o The Observable to capture
+ * @param {Function} fn The function to call
+ * @param {Object} scope (optional) The scope (this object) for the fn
+ * @static
+ */
+Ext.util.Observable.capture = function(o, fn, scope){
+    o.fireEvent = o.fireEvent.createInterceptor(fn, scope);
+};
+
+/**
+ * Removes <b>all</b> added captures from the Observable.
+ * @param {Observable} o The Observable to release
+ * @static
+ */
+Ext.util.Observable.releaseCapture = function(o){
+    o.fireEvent = Ext.util.Observable.prototype.fireEvent;
+};
+
+(function(){
+
+    var createBuffered = function(h, o, scope){
+        var task = new Ext.util.DelayedTask();
+        return function(){
+            task.delay(o.buffer, h, scope, Array.prototype.slice.call(arguments, 0));
+        };
+    };
+
+    var createSingle = function(h, e, fn, scope){
+        return function(){
+            e.removeListener(fn, scope);
+            return h.apply(scope, arguments);
+        };
+    };
+
+    var createDelayed = function(h, o, scope){
+        return function(){
+            var args = Array.prototype.slice.call(arguments, 0);
+            setTimeout(function(){
+                h.apply(scope, args);
+            }, o.delay || 10);
+        };
+    };
+
+    Ext.util.Event = function(obj, name){
+        this.name = name;
+        this.obj = obj;
+        this.listeners = [];
+    };
+
+    Ext.util.Event.prototype = {
+        addListener : function(fn, scope, options){
+            var o = options || {};
+            scope = scope || this.obj;
+            if(!this.isListening(fn, scope)){
+                var l = {fn: fn, scope: scope, options: o};
+                var h = fn;
+                if(o.delay){
+                    h = createDelayed(h, o, scope);
+                }
+                if(o.single){
+                    h = createSingle(h, this, fn, scope);
+                }
+                if(o.buffer){
+                    h = createBuffered(h, o, scope);
+                }
+                l.fireFn = h;
+                if(!this.firing){ // if we are currently firing this event, don't disturb the listener loop
+                    this.listeners.push(l);
+                }else{
+                    this.listeners = this.listeners.slice(0);
+                    this.listeners.push(l);
+                }
+            }
+        },
+
+        findListener : function(fn, scope){
+            scope = scope || this.obj;
+            var ls = this.listeners;
+            for(var i = 0, len = ls.length; i < len; i++){
+                var l = ls[i];
+                if(l.fn == fn && l.scope == scope){
+                    return i;
+                }
+            }
+            return -1;
+        },
+
+        isListening : function(fn, scope){
+            return this.findListener(fn, scope) != -1;
+        },
+
+        removeListener : function(fn, scope){
+            var index;
+            if((index = this.findListener(fn, scope)) != -1){
+                if(!this.firing){
+                    this.listeners.splice(index, 1);
+                }else{
+                    this.listeners = this.listeners.slice(0);
+                    this.listeners.splice(index, 1);
+                }
+                return true;
+            }
+            return false;
+        },
+
+        clearListeners : function(){
+            this.listeners = [];
+        },
+
+        fire : function(){
+            var ls = this.listeners, scope, len = ls.length;
+            if(len > 0){
+                this.firing = true;
+                var args = Array.prototype.slice.call(arguments, 0);
+                for(var i = 0; i < len; i++){
+                    var l = ls[i];
+                    if(l.fireFn.apply(l.scope, arguments) === false){
+                        this.firing = false;
+                        return false;
+                    }
+                }
+                this.firing = false;
+            }
+            return true;
+        }
+    };
+})();

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/PagingToolbar.jss.html b/www/extras/yui-ext/docs/output/PagingToolbar.jss.html new file mode 100644 index 000000000..cb54f2a43 --- /dev/null +++ b/www/extras/yui-ext/docs/output/PagingToolbar.jss.html @@ -0,0 +1,261 @@ +PagingToolbar.js

PagingToolbar.js

/**
+ * @class Ext.PagingToolbar
+ * @extends Ext.Toolbar
+ * A specialized toolbar that is bound to a {@link Ext.data.Store} and provides automatic paging controls.
+ * @constructor
+ * Create a new PagingToolbar
+ * @param {String/HTMLElement/Element} container The id or element that will contain the toolbar
+ * @param {Ext.data.Store} store The underlying data store providing the paged data
+ * @param {Object} config The config object
+ */
+Ext.PagingToolbar = function(el, ds, config){
+    Ext.PagingToolbar.superclass.constructor.call(this, el, null, config);
+    this.ds = ds;
+    this.cursor = 0;
+    this.render(this.el);
+    this.bind(ds);
+};
+
+Ext.extend(Ext.PagingToolbar, Ext.Toolbar, {
+    /**
+     * @cfg {Number} pageSize
+     * The number of records to display per page (defaults to 20)
+     */
+    pageSize: 20,
+    /**
+     * @cfg {String} displayMsg
+     * The paging status message to display (defaults to "Displaying {start} - {end} of {total}")
+     */
+    displayMsg : 'Displaying {0} - {1} of {2}',
+    /**
+     * @cfg {String} emptyMsg
+     * The message to display when no records are found (defaults to "No data to display")
+     */
+    emptyMsg : 'No data to display',
+    /**
+     * 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",
+
+    // private
+    render : function(el){
+        this.first = this.addButton({
+            tooltip: this.firstText,
+            cls: "x-btn-icon x-grid-page-first",
+            disabled: true,
+            handler: this.onClick.createDelegate(this, ["first"])
+        });
+        this.prev = this.addButton({
+            tooltip: this.prevText,
+            cls: "x-btn-icon x-grid-page-prev",
+            disabled: true,
+            handler: this.onClick.createDelegate(this, ["prev"])
+        });
+        this.addSeparator();
+        this.add(this.beforePageText);
+        this.field = Ext.get(this.addDom({
+           tag: "input",
+           type: "text",
+           size: "3",
+           value: "1",
+           cls: "x-grid-page-number"
+        }).el);
+        this.field.on("keydown", this.onPagingKeydown, this);
+        this.field.on("focus", function(){this.dom.select();});
+        this.afterTextEl = this.addText(String.format(this.afterPageText, 1));
+        this.field.setHeight(18);
+        this.addSeparator();
+        this.next = this.addButton({
+            tooltip: this.nextText,
+            cls: "x-btn-icon x-grid-page-next",
+            disabled: true,
+            handler: this.onClick.createDelegate(this, ["next"])
+        });
+        this.last = this.addButton({
+            tooltip: this.lastText,
+            cls: "x-btn-icon x-grid-page-last",
+            disabled: true,
+            handler: this.onClick.createDelegate(this, ["last"])
+        });
+        this.addSeparator();
+        this.loading = this.addButton({
+            tooltip: this.refreshText,
+            cls: "x-btn-icon x-grid-loading",
+            disabled: true,
+            handler: this.onClick.createDelegate(this, ["refresh"])
+        });
+
+        if(this.displayInfo){
+            this.displayEl = this.el.createChild({cls:'x-paging-info'});
+        }
+    },
+
+    // private
+    updateInfo : function(){
+        if(this.displayEl){
+            var count = this.ds.getCount();
+            var msg = count == 0 ?
+                this.emptyMsg :
+                String.format(
+                    this.displayMsg,
+                    this.cursor+1, this.cursor+count, this.ds.getTotalCount()    
+                );
+            this.displayEl.update(msg);
+        }
+    },
+
+    // private
+    onLoad : function(ds, r, o){
+       this.cursor = o.params ? o.params.start : 0;
+       var d = this.getPageData(), ap = d.activePage, ps = d.pages;
+
+       this.afterTextEl.el.innerHTML = String.format(this.afterPageText, d.pages);
+       this.field.dom.value = ap;
+       this.first.setDisabled(ap == 1);
+       this.prev.setDisabled(ap == 1);
+       this.next.setDisabled(ap == ps);
+       this.last.setDisabled(ap == ps);
+       this.loading.enable();
+       this.updateInfo();
+    },
+
+    // private
+    getPageData : function(){
+        var total = this.ds.getTotalCount();
+        return {
+            total : total,
+            activePage : Math.ceil((this.cursor+this.pageSize)/this.pageSize),
+            pages :  total < this.pageSize ? 1 : Math.ceil(total/this.pageSize)
+        };
+    },
+
+    // private
+    onLoadError : function(){
+        this.loading.enable();
+    },
+
+    // private
+    onPagingKeydown : function(e){
+        var k = e.getKey();
+        var d = this.getPageData();
+        if(k == e.RETURN){
+            var v = this.field.dom.value, pageNum;
+            if(!v || isNaN(pageNum = parseInt(v, 10))){
+                this.field.dom.value = d.activePage;
+                return;
+            }
+            pageNum = Math.min(Math.max(1, pageNum), d.pages) - 1;
+            this.ds.load({params:{start: pageNum * this.pageSize, limit: this.pageSize}});
+            e.stopEvent();
+        }
+        else if(k == e.HOME || (k == e.UP && e.ctrlKey) || (k == e.PAGEUP && e.ctrlKey) || (k == e.RIGHT && e.ctrlKey) || k == e.END || (k == e.DOWN && e.ctrlKey) || (k == e.LEFT && e.ctrlKey) || (k == e.PAGEDOWN && e.ctrlKey))
+        {
+          var pageNum = (k == e.HOME || (k == e.DOWN && e.ctrlKey) || (k == e.LEFT && e.ctrlKey) || (k == e.PAGEDOWN && e.ctrlKey)) ? 1 : d.pages;
+          this.field.dom.value = pageNum;
+          this.ds.load({params:{start: (pageNum - 1) * this.pageSize, limit: this.pageSize}});
+          e.stopEvent();
+        }
+        else if(k == e.UP || k == e.RIGHT || k == e.PAGEUP || k == e.DOWN || k == e.LEFT || k == e.PAGEDOWN)
+        {
+          var v = this.field.dom.value, pageNum; 
+          var increment = (e.shiftKey) ? 10 : 1;
+          if(k == e.DOWN || k == e.LEFT || k == e.PAGEDOWN)
+            increment *= -1;
+          if(!v || isNaN(pageNum = parseInt(v, 10))) {
+            this.field.dom.value = d.activePage;
+            return;
+          }
+          else if(parseInt(v, 10) + increment >= 1 & parseInt(v, 10) + increment <= d.pages)
+          {
+            this.field.dom.value = parseInt(v, 10) + increment;
+            pageNum = Math.min(Math.max(1, pageNum + increment), d.pages) - 1;
+            this.ds.load({params:{start: pageNum * this.pageSize, limit: this.pageSize}});
+          }
+          e.stopEvent();
+        }
+    },
+
+    // private
+    beforeLoad : function(){
+        if(this.loading){
+            this.loading.disable();
+        }
+    },
+
+    // private
+    onClick : function(which){
+        var ds = this.ds;
+        switch(which){
+            case "first":
+                ds.load({params:{start: 0, limit: this.pageSize}});
+            break;
+            case "prev":
+                ds.load({params:{start: Math.max(0, this.cursor-this.pageSize), limit: this.pageSize}});
+            break;
+            case "next":
+                ds.load({params:{start: this.cursor+this.pageSize, limit: this.pageSize}});
+            break;
+            case "last":
+                var total = ds.getTotalCount();
+                var extra = total % this.pageSize;
+                var lastStart = extra ? (total - extra) : total-this.pageSize;
+                ds.load({params:{start: lastStart, limit: this.pageSize}});
+            break;
+            case "refresh":
+                ds.load({params:{start: this.cursor, limit: this.pageSize}});
+            break;
+        }
+    },
+
+    /**
+     * Unbinds the paging toolbar from the specified {@link Ext.data.Store}
+     * @param {Ext.data.Store} store The data store to unbind
+     */
+    unbind : function(ds){
+        ds.un("beforeload", this.beforeLoad, this);
+        ds.un("load", this.onLoad, this);
+        ds.un("loadexception", this.onLoadError, this);
+    },
+
+    /**
+     * Binds the paging toolbar to the specified {@link Ext.data.Store}
+     * @param {Ext.data.Store} store The data store to bind
+     */
+    bind : function(ds){
+        ds.on("beforeload", this.beforeLoad, this);
+        ds.on("load", this.onLoad, this);
+        ds.on("loadexception", this.onLoadError, this);
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Panel.jss.html b/www/extras/yui-ext/docs/output/Panel.jss.html new file mode 100644 index 000000000..01e0b83be --- /dev/null +++ b/www/extras/yui-ext/docs/output/Panel.jss.html @@ -0,0 +1,547 @@ +Panel.js

Panel.js

Ext.Panel = function(config){
+    Ext.Panel.superclass.constructor.call(this, config);
+};
+
+Ext.extend(Ext.Panel, Ext.Container, {
+    baseCls : 'x-panel',
+    collapsedCls : 'x-panel-collapsed',
+    elements : 'header,body,footer',
+    maskDisabled: true,
+    collapsed : false,
+    animCollapse:Ext.enableFx,
+    toolTarget : 'header',
+    headerAsText:true,
+    buttonAlign:'right',
+    /**
+     * @cfg {Number} minButtonWidth Minimum width of all buttons (defaults to 75)
+     */
+    minButtonWidth:75,
+
+    initComponent : function(){
+        Ext.Panel.superclass.initComponent.call(this);
+        this.addEvents({
+            bodyresize : true,
+            titlechange: true,
+            collapse : true,
+            expand:true,
+            beforecollapse : true,
+            beforeexpand:true,
+
+            // these 4 events are only fired if used within
+            // a container that supports them
+            beforeclose: true,
+            close: true,
+            activate: true,
+            deactivate: true
+        });
+
+        // shortcuts
+        if(this.tbar){
+            this.elements += ',tbar';
+            if(typeof this.tbar == 'object'){
+                this.topToolbar = this.tbar;
+            }
+            delete this.tbar;
+        }
+        if(this.bbar){
+            this.elements += ',bbar';
+            if(typeof this.bbar == 'object'){
+                this.bottomToolbar = this.bbar;
+            }
+            delete this.bbar;
+        }
+
+        if(this.buttons){
+            var btns = this.buttons;
+            delete this.buttons;
+            for(var i = 0, len = btns.length; i < len; i++) {
+                this.addButton(btns[i]);
+            }
+        }
+    },
+
+    // private, notify box this class will handle heights
+    deferHeight:true,
+
+    createElement : function(name, pnode){
+        if(name !== 'bwrap' && this.elements.indexOf(name) == -1){
+            return;
+        }
+        if(this[name]){
+            pnode.appendChild(this[name].dom);
+        }else{
+            if(this[name+'Cfg']){
+                this[name] = Ext.fly(pnode).createChild(this[name+'Cfg']);
+            }else{
+                var el = document.createElement('div');
+                el.className = this[name+'Cls'];
+                this[name] = Ext.get(pnode.appendChild(el));
+            }
+        }
+    },
+
+    onRender : function(ct, position){
+        Ext.Panel.superclass.onRender.call(this, ct, position);
+
+        this.createClasses();
+
+        if(this.el){ // existing markup
+            this.header = this.el.down('.'+this.headerCls);
+            this.bwrap = this.el.down('.'+this.bwrapCls);
+            var cp = this.bwrap ? this.bwrap : this.el;
+            this.tbar = cp.down('.'+this.tbarCls);
+            this.body = cp.down('.'+this.bodyCls);
+            this.bbar = cp.down('.'+this.bbarCls);
+            this.footer = cp.down('.'+this.footerCls);
+        }else{
+            this.el = ct.createChild({
+                id: this.id,
+                cls: this.baseCls
+            }, position);
+        }
+        var el = this.el, d = el.dom;
+        if(this.cls){
+            this.el.addClass(this.cls);
+        }
+        // This block allows for maximum flexibility and performance when using existing markup
+
+        // framing requires special markup
+        if(this.frame){
+            el.insertHtml('afterBegin', String.format(Ext.Element.boxMarkup, this.baseCls));
+
+            this.createElement('header', d.firstChild.firstChild.firstChild);
+            this.createElement('bwrap', d);
+
+            // append the mid and bottom frame to the bwrap
+            var bw = this.bwrap.dom;
+            var ml = d.childNodes[1], bl = d.childNodes[2];
+            bw.appendChild(ml);
+            bw.appendChild(bl);
+
+            var mc = bw.firstChild.firstChild.firstChild;
+            this.createElement('tbar', mc);
+            this.createElement('body', mc);
+            this.createElement('bbar', mc);
+            this.createElement('footer', bw.lastChild.firstChild.firstChild);
+        }else{
+            this.createElement('header', d);
+            this.createElement('bwrap', d);
+
+            // append the mid and bottom frame to the bwrap
+            var bw = this.bwrap.dom;
+            this.createElement('tbar', bw);
+            this.createElement('body', bw);
+            this.createElement('bbar', bw);
+            this.createElement('footer', bw);
+
+            if(!this.header){
+                this.body.addClass(this.bodyCls + '-noheader');
+            }
+        }
+
+        this.bwrap.enableDisplayMode('block');
+
+        if(this.header){
+            this.header.unselectable();
+        }
+
+        if(this.iconCls){
+            this.header.addClass('x-panel-icon '+this.iconCls);
+        }
+
+        if(this.ownerCt){
+            this.el.addClass(this.baseCls + '-nested');
+        }
+
+        // for tools, we need to wrap any existing header markup
+        if(this.header && this.headerAsText){
+            this.header.dom.innerHTML =
+                '<span class="' + this.headerTextCls + '">'+this.header.dom.innerHTML+'</span>';
+        }
+        if(this.floating){
+            this.el = new Ext.Layer(
+                typeof this.floating == 'object' ? this.floating : {
+                    shadow:this.shadow||'sides', constrain:false, shim: this.shim === false ? false : undefined
+                }, this.el
+            );
+        }
+        if(this.collapsible){
+            this.tools = this.tools || [];
+            this.tools.unshift({
+                id: 'toggle',
+                on : {
+                    'click' : this.toggleCollapse,
+                    'scope': this
+                }
+            });
+        }
+        if(this.tools){
+            var ts = this.tools;
+            this.tools = {};
+            this.addTool.apply(this, ts);
+        }else{
+            this.tools = {};
+        }
+
+        if(this.buttons && this.buttons.length > 0){
+            // tables are required to maintain order and for correct IE layout
+            var tb = this.footer.createChild({cls:'x-panel-btns-ct', cn: {
+                cls:"x-panel-btns x-panel-btns-"+this.buttonAlign,
+                html:'<table cellspacing="0"><tbody><tr></tr></tbody></table><div class="x-clear"></div>'
+            }}, null, true);
+            var tr = tb.getElementsByTagName('tr')[0];
+            for(var i = 0, len = this.buttons.length; i < len; i++) {
+                var b = this.buttons[i];
+                var td = document.createElement('td');
+                td.className = 'x-panel-btn-td';
+                b.render(tr.appendChild(td));
+            }
+        }
+
+        if(this.tbar && this.topToolbar){
+            if(this.topToolbar instanceof Array){
+                this.topToolbar = new Ext.Toolbar(this.topToolbar);
+            }
+            this.topToolbar.render(this.tbar);
+        }
+        if(this.bbar && this.bottomToolbar){
+            if(this.bottomToolbar instanceof Array){
+                this.bottomToolbar = new Ext.Toolbar(this.bottomToolbar);
+            }
+            this.bottomToolbar.render(this.bbar);
+        }
+    },
+
+    // must be called before rendering
+    addButton : function(config, handler, scope){
+        var bc = {
+            handler: handler,
+            scope: scope,
+            minWidth: this.minButtonWidth,
+            hideParent:true
+        };
+        if(typeof config == "string"){
+            bc.text = config;
+        }else{
+            Ext.apply(bc, config);
+        }
+        var btn = new Ext.Button(null, bc);
+        if(!this.buttons){
+            this.buttons = [];
+        }
+        this.buttons.push(btn);
+        return btn;
+    },
+
+    addTool : function(){
+        if(!this.toolTemplate){
+            // initialize the global tool template on first use
+            var tt = new Ext.Template(
+                 '<div class="x-tool x-tool-{id}">&#160</div>'
+            );
+            tt.disableFormats = true;
+            tt.compile();
+            Ext.Panel.prototype.toolTemplate = tt;
+        }
+        for(var i = 0, a = arguments, len = a.length; i < len; i++) {
+            var tc = a[i];
+            var t = this.toolTemplate.insertFirst(this[this.toolTarget], tc, true);
+            this.tools[tc.id] = t;
+            t.enableDisplayMode('block');
+            if(tc.on){
+                t.on(tc.on);
+            }
+            if(tc.hidden){
+                t.hide();
+            }
+            t.addClassOnOver('x-tool-'+tc.id+'-over');
+        }
+    },
+
+    afterRender : function(){
+        if(this.floating && !this.hidden && !this.initHidden){
+            this.el.show();
+        }
+        if(this.title){
+            this.setTitle(this.title);
+        }
+        if(this.autoScroll){
+            this.body.dom.style.overflow = 'auto';
+        }
+        if(this.html){
+            this.body.update(this.html);
+            delete this.html;
+        }
+        if(this.contentEl){
+            this.body.dom.appendChild(Ext.getDom(this.contentEl));
+        }
+        if(this.loadContent){
+            this.load.defer(10, this, [this.loadContent]);
+            delete this.loadContent;
+        }
+        if(this.collapsed){
+            this.collapsed = false;
+            this.collapse(false);
+        }
+        Ext.Panel.superclass.afterRender.call(this); // do sizing calcs last
+        this.initEvents();
+    },
+
+    initEvents : function(){
+
+    },
+
+    beforeEffect : function(){
+        if(this.floating){
+            this.el.beforeAction();
+        }
+        if(Ext.isGecko){
+            this.body.clip();
+        }
+    },
+
+    afterEffect : function(){
+        this.syncShadow();
+        if(Ext.isGecko){
+            this.body.unclip();
+        }
+    },
+
+    // private - wraps up an animation param with internal callbacks
+    createEffect : function(a, cb, scope){
+        var o = {
+            scope:scope,
+            block:true
+        };
+        if(a === true){
+            o.callback = cb;
+            return o;
+        }else if(!a.callback){
+            o.callback = cb;
+        }else { // wrap it up
+            o.callback = function(){
+                cb.call(scope);
+                Ext.callback(a.callback, a.scope);
+            };
+        }
+        return Ext.applyIf(o, a);
+    },
+
+    collapse : function(animate){
+        if(this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforecollapse', this, animate) === false){
+            return;
+        }
+        var a = animate === true || (animate !== false && this.animCollapse);
+        this.beforeEffect();
+        if(a){
+            this.bwrap.slideOut('t', this.createEffect(a, this.afterCollapse, this));
+        }else{
+            this.bwrap.hide();
+            this.afterCollapse();
+        }
+        return this;
+    },
+
+    afterCollapse : function(){
+        this.collapsed = true;
+        this.el.addClass(this.collapsedCls);
+        this.afterEffect();
+        this.fireEvent('collapse', this);
+    },
+
+    expand : function(animate){
+        if(!this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforeexpand', this, animate) === false){
+            return;
+        }
+        var a = animate === true || (animate !== false && this.animCollapse);
+        this.el.removeClass(this.collapsedCls);
+        this.beforeEffect();
+        if(a){
+            this.bwrap.slideIn('t', this.createEffect(a, this.afterExpand, this));
+        }else{
+            this.bwrap.show();
+            this.afterExpand();
+        }
+        return this;
+    },
+
+    afterExpand : function(){
+        this.collapsed = false;
+        this.afterEffect();
+        this.fireEvent('expand', this);
+    },
+
+    toggleCollapse : function(animate){
+        this[this.collapsed ? 'expand' : 'collapse'](animate);
+        return this;
+    },
+
+    onDisable : function(){
+        if(this.rendered && this.maskDisabled){
+            this.el.mask();
+        }
+        Ext.Panel.superclass.onDisable.call(this);
+    },
+
+    onEnable : function(){
+        if(this.rendered && this.maskDisabled){
+            this.el.unmask();
+        }
+        Ext.Panel.superclass.onEnable.call(this);
+    },
+
+    onResize : function(w, h){
+        if(w !== undefined || h !== undefined){
+            if(typeof w == 'number'){
+                this.body.setWidth(w - this.getFrameWidth());
+            }else if(w == 'auto'){
+                this.body.setWidth(w);
+            }
+
+            if(typeof h == 'number'){
+                this.body.setHeight(h - this.getFrameHeight());
+            }else if(h == 'auto'){
+                this.body.setHeight(h);
+            }
+            this.syncShadow();
+            this.fireEvent('bodyresize', this, w, h);
+        }
+    },
+
+    onPosition : function(){
+        this.syncShadow();
+    },
+
+    getFrameWidth : function(){
+        var w = this.el.getFrameWidth('lr');
+
+        if(this.frame){
+            var l = this.bwrap.dom.firstChild;
+            w += (Ext.fly(l).getFrameWidth('l') + Ext.fly(l.firstChild).getFrameWidth('r'));
+            var mc = this.bwrap.dom.firstChild.firstChild.firstChild;
+            w += Ext.fly(mc).getFrameWidth('lr');
+        }
+        return w;
+    },
+
+    getFrameHeight : function(){
+        var h  = this.el.getFrameWidth('tb');
+        h += (this.tbar ? this.tbar.getHeight() : 0) +
+             (this.bbar ? this.bbar.getHeight() : 0);
+
+        if(this.frame){
+            var hd = this.el.dom.firstChild;
+            var ft = this.bwrap.dom.lastChild;
+            h += (hd.offsetHeight + ft.offsetHeight);
+            var mc = this.bwrap.dom.firstChild.firstChild.firstChild;
+            h += Ext.fly(mc).getFrameWidth('tb');
+        }else{
+            h += (this.header ? this.header.getHeight() : 0) +
+                (this.footer ? this.footer.getHeight() : 0);
+        }
+        return h;
+    },
+
+    getInnerWidth : function(){
+        return this.getSize().width - this.getFrameWidth();
+    },
+
+    getInnerHeight : function(){
+        return this.getSize().height - this.getFrameHeight();
+    },
+
+    syncShadow : function(){
+        if(this.floating){
+            this.el.sync(true);
+        }
+    },
+
+    getLayoutTarget : function(){
+        return this.body;
+    },
+
+    setTitle : function(title){
+        this.title = title;
+        if(this.header && this.headerAsText){
+            this.header.child('span').update(title);
+            this.fireEvent('titlechange', this, title);
+        }
+        return this;
+    },
+
+    /**
+     * Get the {@link Ext.UpdateManager} for this panel. Enables you to perform Ajax updates.
+     * @return {Ext.UpdateManager} The UpdateManager
+     */
+    getUpdateManager : function(){
+        return this.body.getUpdateManager();
+    },
+
+     /**
+     * Loads this content panel immediately with content from XHR.
+     * @param {Object/String/Function} config A config object containing any of the following options:
+<pre><code>
+panel.load({<br/>
+    url: "your-url.php",<br/>
+    params: {param1: "foo", param2: "bar"}, // or a URL encoded string<br/>
+    callback: yourFunction,<br/>
+    scope: yourObject, //(optional scope)  <br/>
+    discardUrl: false, <br/>
+    nocache: false,<br/>
+    text: "Loading...",<br/>
+    timeout: 30,<br/>
+    scripts: false<br/>
+});
+</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 panel UpdateManager instance.
+     * @return {Ext.Panel} this
+     */
+    load : function(){
+        var um = this.body.getUpdateManager();
+        um.update.apply(um, arguments);
+        return this;
+    },
+
+    beforeDestroy : function(){
+        Ext.Element.uncache(
+            this.header,
+            this.tbar,
+            this.bbar,
+            this.footer,
+            this.body
+        );
+    },
+
+    createClasses : function(){
+        this.headerCls = this.baseCls + '-header';
+        this.headerTextCls = this.baseCls + '-header-text';
+        this.bwrapCls = this.baseCls + '-bwrap';
+        this.tbarCls = this.baseCls + '-tbar';
+        this.bodyCls = this.baseCls + '-body';
+        this.bbarCls = this.baseCls + '-bbar';
+        this.footerCls = this.baseCls + '-footer';
+    },
+
+    createGhost : function(cls, useShim, preventAppend){
+        var el = document.createElement('div');
+        el.className = 'x-panel-ghost ' + (cls ? cls : '');
+        if(this.header){
+            el.appendChild(this.el.dom.firstChild.cloneNode(true));
+        }
+        Ext.fly(el.appendChild(document.createElement('ul'))).setSize(this.bwrap.getSize());
+        if(!preventAppend){
+            this.container.dom.appendChild(el);
+        }
+        if(useShim !== false && this.el.useShim !== false){
+            var layer = new Ext.Layer({shadow:false, useDisplay:true, constrain:false}, el);
+            layer.show();
+            return layer;
+        }else{
+            return new Ext.Element(el);
+        }
+    }
+});
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/PropertyGrid.jss.html b/www/extras/yui-ext/docs/output/PropertyGrid.jss.html new file mode 100644 index 000000000..d7619e490 --- /dev/null +++ b/www/extras/yui-ext/docs/output/PropertyGrid.jss.html @@ -0,0 +1,201 @@ +PropertyGrid.js

PropertyGrid.js

Ext.grid.PropertyRecord = Ext.data.Record.create([
+    {name:'name',type:'string'}, 'value'
+]);
+
+Ext.grid.PropertyStore = function(grid, source){
+    this.grid = grid;
+    this.store = new Ext.data.Store({
+        recordType : Ext.grid.PropertyRecord
+    });
+    this.store.on('update', this.onUpdate,  this);
+    if(source){
+        this.setSource(source);
+    }
+    Ext.grid.PropertyStore.superclass.constructor.call(this);
+};
+Ext.extend(Ext.grid.PropertyStore, Ext.util.Observable, {
+    setSource : function(o){
+        this.source = o;
+        this.store.removeAll();
+        var data = [];
+        for(var k in o){
+            if(this.isEditableValue(o[k])){
+                data.push(new Ext.grid.PropertyRecord({name: k, value: o[k]}, k));
+            }
+        }
+        this.store.loadRecords({records: data}, {}, true);
+    },
+
+    onUpdate : function(ds, record, type){
+        if(type == Ext.data.Record.EDIT){
+            var v = record.data['value'];
+            var oldValue = record.modified['value'];
+            if(this.grid.fireEvent('beforepropertychange', this.source, record.id, v, oldValue) !== false){
+                this.source[record.id] = v;
+                record.commit();
+                this.grid.fireEvent('propertychange', this.source, record.id, v, oldValue);
+            }else{
+                record.reject();
+            }
+        }
+    },
+
+    getProperty : function(row){
+       return this.store.getAt(row);
+    },
+
+    isEditableValue: function(val){
+        if(val && val instanceof Date){
+            return true;
+        }else if(typeof val == 'object' || typeof val == 'function'){
+            return false;
+        }
+        return true;
+    },
+
+    setValue : function(prop, value){
+        this.source[prop] = value;
+        this.store.getById(prop).set('value', value);
+    },
+
+    getSource : function(){
+        return this.source;
+    }
+});
+
+Ext.grid.PropertyColumnModel = function(grid, store){
+    this.grid = grid;
+    var g = Ext.grid;
+    g.PropertyColumnModel.superclass.constructor.call(this, [
+        {header: this.nameText, sortable: true, dataIndex:'name', id: 'name'},
+        {header: this.valueText, resizable:false, dataIndex: 'value', id: 'value'}
+    ]);
+    this.store = store;
+    this.bselect = Ext.DomHelper.append(document.body, {
+        tag: 'select', style:'display:none', cls: 'x-grid-editor', children: [
+            {tag: 'option', value: 'true', html: 'true'},
+            {tag: 'option', value: 'false', html: 'false'}
+        ]
+    });
+    Ext.id(this.bselect);
+    var f = Ext.form;
+    this.editors = {
+        'date' : new g.GridEditor(new f.DateField({selectOnFocus:true})),
+        'string' : new g.GridEditor(new f.TextField({selectOnFocus:true})),
+        'number' : new g.GridEditor(new f.NumberField({selectOnFocus:true, style:'text-align:left;'})),
+        'boolean' : new g.GridEditor(new f.Field({el:this.beselect,selectOnFocus:true}))
+    };
+    this.renderCellDelegate = this.renderCell.createDelegate(this);
+    this.renderPropDelegate = this.renderProp.createDelegate(this);
+};
+
+Ext.extend(Ext.grid.PropertyColumnModel, Ext.grid.ColumnModel, {
+    nameText : 'Name',
+    valueText : 'Value',
+    dateFormat : 'm/j/Y',
+    renderDate : function(dateVal){
+        return dateVal.dateFormat(this.dateFormat);
+    },
+
+    renderBool : function(bVal){
+        return bVal ? 'true' : 'false';
+    },
+
+    isCellEditable : function(colIndex, rowIndex){
+        return colIndex == 1;
+    },
+
+    getRenderer : function(col){
+        return col == 1 ?
+            this.renderCellDelegate : this.renderPropDelegate;
+    },
+
+    renderProp : function(v){
+        return this.getPropertyName(v);
+    },
+
+    renderCell : function(val){
+        var rv = val;
+        if(val instanceof Date){
+            rv = this.renderDate(val);
+        }else if(typeof val == 'boolean'){
+            rv = this.renderBool(val);
+        }
+        return Ext.util.Format.htmlEncode(rv);
+    },
+
+    getPropertyName : function(name){
+        var pn = this.grid.propertyNames;
+        return pn && pn[name] ? pn[name] : name;
+    },
+
+    getCellEditor : function(colIndex, rowIndex){
+        var p = this.store.getProperty(rowIndex);
+        var n = p.data['name'], val = p.data['value'];
+        if(this.grid.customEditors[n]){
+            return this.grid.customEditors[n];
+        }
+        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'];
+        }
+    }
+});
+
+Ext.grid.PropertyGrid = function(container, config){
+    config = config || {};
+    var store = new Ext.grid.PropertyStore(this);
+    this.store = store;
+    var cm = new Ext.grid.PropertyColumnModel(this, store);
+    store.store.sort('name', 'ASC');
+    Ext.grid.PropertyGrid.superclass.constructor.call(this, container, Ext.apply({
+        ds: store.store,
+        cm: cm,
+        enableColLock:false,
+        enableColumnMove:false,
+        stripeRows:false,
+        trackMouseOver: false,
+        clicksToEdit:1
+    }, config));
+    this.container.addClass('x-props-grid');
+    this.lastEditRow = null;
+    this.on('columnresize', this.onColumnResize, this);
+    this.addEvents({
+        beforepropertychange: true,
+        propertychange: true
+    });
+    this.customEditors = this.customEditors || {};
+};
+Ext.extend(Ext.grid.PropertyGrid, Ext.grid.EditorGrid, {
+    render : function(){
+        Ext.grid.PropertyGrid.superclass.render.call(this);
+        this.autoSize.defer(100, this);
+    },
+
+    autoSize : function(){
+        Ext.grid.PropertyGrid.superclass.autoSize.call(this);
+        if(this.view){
+            this.view.fitColumns();
+        }
+    },
+
+    onColumnResize : function(){
+        this.colModel.setColumnWidth(1, this.container.getWidth(true)-this.colModel.getColumnWidth(0));
+        this.autoSize();
+    },
+
+    setSource : function(source){
+        this.store.setSource(source);
+        //this.autoSize();
+    },
+
+    getSource : function(){
+        return this.store.getSource();
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/QuickTips.jss.html b/www/extras/yui-ext/docs/output/QuickTips.jss.html new file mode 100644 index 000000000..16af142ce --- /dev/null +++ b/www/extras/yui-ext/docs/output/QuickTips.jss.html @@ -0,0 +1,358 @@ +QuickTips.js

QuickTips.js

/**
+ * @class Ext.QuickTips
+ * Provides attractive and customizable tooltips for any element.
+ * @singleton
+ */
+Ext.QuickTips = function(){
+    var el, tipBody, tipBodyText, tipTitle, tm, cfg, close, tagEls = {}, esc, removeCls = null, bdLeft, bdRight;
+    var ce, bd, xy, dd;
+    var visible = false, disabled = true, inited = false;
+    var showProc = 1, hideProc = 1, dismissProc = 1, locks = [];
+    
+    var onOver = function(e){
+        if(disabled){
+            return;
+        }
+        var t = e.getTarget();
+        if(!t || t.nodeType !== 1 || t == document || t == document.body){
+            return;
+        }
+        if(ce && t == ce.el){
+            clearTimeout(hideProc);
+            return;
+        }
+        if(t && tagEls[t.id]){
+            tagEls[t.id].el = t;
+            showProc = show.defer(tm.showDelay, tm, [tagEls[t.id]]);
+            return;
+        }
+        var ttp, et = Ext.fly(t);
+        var ns = cfg.namespace;
+        if(tm.interceptTitles && t.title){
+            ttp = t.title;
+            t.qtip = ttp;
+            t.removeAttribute("title");
+            e.preventDefault();
+        }else{
+            ttp = t.qtip || et.getAttributeNS(ns, cfg.attribute);
+        }
+        if(ttp){
+            showProc = show.defer(tm.showDelay, tm, [{
+                el: t, 
+                text: ttp, 
+                width: et.getAttributeNS(ns, cfg.width),
+                autoHide: et.getAttributeNS(ns, cfg.hide) != "user",
+                title: et.getAttributeNS(ns, cfg.title),
+           	    cls: et.getAttributeNS(ns, cfg.cls)
+            }]);
+        }
+    };
+    
+    var onOut = function(e){
+        clearTimeout(showProc);
+        var t = e.getTarget();
+        if(t && ce && ce.el == t && (tm.autoHide && ce.autoHide !== false)){
+            hideProc = setTimeout(hide, tm.hideDelay);
+        }
+    };
+    
+    var onMove = function(e){
+        if(disabled){
+            return;
+        }
+        xy = e.getXY();
+        xy[1] += 18;
+        if(tm.trackMouse && ce){
+            el.setXY(xy);
+        }
+    };
+    
+    var onDown = function(e){
+        clearTimeout(showProc);
+        clearTimeout(hideProc);
+        if(!e.within(el)){
+            if(tm.hideOnClick){
+                hide();
+                tm.disable();
+            }
+        }
+    };
+    
+    var onUp = function(e){
+        tm.enable();
+    };
+
+    var getPad = function(){
+        return bdLeft.getPadding('l')+bdRight.getPadding('r');
+    };
+
+    var show = function(o){
+        if(disabled){
+            return;
+        }
+        clearTimeout(dismissProc);
+        ce = o;
+        if(removeCls){ // in case manually hidden
+            el.removeClass(removeCls);
+            removeCls = null;
+        }
+        if(ce.cls){
+            el.addClass(ce.cls);
+            removeCls = ce.cls;
+        }
+        if(ce.title){
+            tipTitle.update(ce.title);
+            tipTitle.show();
+        }else{
+            tipTitle.update('');
+            tipTitle.hide();
+        }
+        el.dom.style.width  = tm.maxWidth+'px';
+        //tipBody.dom.style.width = '';
+        tipBodyText.update(o.text);
+        var p = getPad(), w = ce.width;
+        if(!w){
+            var td = tipBodyText.dom;
+            var aw = Math.max(td.offsetWidth, td.clientWidth, td.scrollWidth);
+            if(aw > tm.maxWidth){
+                w = tm.maxWidth;
+            }else if(aw < tm.minWidth){
+                w = tm.minWidth;
+            }else{
+                w = aw;
+            }
+        }
+        //tipBody.setWidth(w);
+        el.setWidth(parseInt(w, 10) + p);
+        if(!ce.autoHide){
+            close.setDisplayed(true);
+            if(dd){
+                dd.unlock();
+            }
+        }else{
+            close.setDisplayed(false);
+            if(dd){
+                dd.lock();
+            }
+        }
+        if(xy){
+            el.avoidY = xy[1]-18;
+            el.setXY(xy);
+        }
+        if(tm.animate){
+            el.setOpacity(.1);
+            el.setStyle("visibility", "visible");
+            el.fadeIn({callback: afterShow});
+        }else{
+            afterShow();
+        }
+    };
+    
+    var afterShow = function(){
+        if(ce){
+            el.show();
+            esc.enable();
+            if(tm.autoDismiss && ce.autoHide !== false){
+                dismissProc = setTimeout(hide, tm.autoDismissDelay);
+            }
+        }
+    };
+    
+    var hide = function(noanim){
+        clearTimeout(dismissProc);
+        clearTimeout(hideProc);
+        ce = null;
+        if(el.isVisible()){
+            esc.disable();
+            if(noanim !== true && tm.animate){
+                el.fadeOut({callback: afterHide});
+            }else{
+                afterHide();
+            } 
+        }
+    };
+    
+    var afterHide = function(){
+        el.hide();
+        if(removeCls){
+            el.removeClass(removeCls);
+            removeCls = null;
+        }
+    };
+    
+    return {
+        /**
+        * @cfg {Number} minWidth
+        * The minimum width of the quick tip (defaults to 40)
+        */
+       minWidth : 40,
+        /**
+        * @cfg {Number} maxWidth
+        * The maximum width of the quick tip (defaults to 300)
+        */
+       maxWidth : 300,
+        /**
+        * @cfg {Boolean} interceptTitles
+        * True to automatically use the element's DOM title value if available (defaults to false)
+        */
+       interceptTitles : false,
+        /**
+        * @cfg {Boolean} trackMouse
+        * True to have the quick tip follow the mouse as it moves over the target element (defaults to false)
+        */
+       trackMouse : false,
+        /**
+        * @cfg {Boolean} hideOnClick
+        * True to hide the quick tip if the user clicks anywhere in the document (defaults to true)
+        */
+       hideOnClick : true,
+        /**
+        * @cfg {Number} showDelay
+        * Delay in milliseconds before the quick tip displays after the mouse enters the target element (defaults to 500)
+        */
+       showDelay : 500,
+        /**
+        * @cfg {Number} hideDelay
+        * Delay in milliseconds before the quick tip hides when autoHide = true (defaults to 200)
+        */
+       hideDelay : 200,
+        /**
+        * @cfg {Boolean} autoHide
+        * True to automatically hide the quick tip after the mouse exits the target element (defaults to true).
+        * Used in conjunction with hideDelay.
+        */
+       autoHide : true,
+        /**
+        * @cfg {Boolean}
+        * True to automatically hide the quick tip after a set period of time, regardless of the user's actions
+        * (defaults to true).  Used in conjunction with autoDismissDelay.
+        */
+       autoDismiss : true,
+        /**
+        * @cfg {Number}
+        * Delay in milliseconds before the quick tip hides when autoDismiss = true (defaults to 5000)
+        */
+       autoDismissDelay : 5000,
+       /**
+        * @cfg {Boolean} animate
+        * True to turn on fade animation. Defaults to false (ClearType/scrollbar flicker issues in IE7).
+        */
+       animate : false,
+               
+        // private
+       init : function(){
+          tm = Ext.QuickTips;
+          cfg = tm.tagConfig;
+          if(!inited){
+              el = new Ext.Layer({cls:"x-tip", shadow:"drop", shim: true, constrain:true, shadowOffset:3});
+              el.fxDefaults = {stopFx: true};
+              // maximum custom styling
+              el.update('<div class="x-tip-top-left"><div class="x-tip-top-right"><div class="x-tip-top"></div></div></div><div class="x-tip-bd-left"><div class="x-tip-bd-right"><div class="x-tip-bd"><div class="x-tip-close"></div><h3></h3><div class="x-tip-bd-inner"></div><div class="x-clear"></div></div></div></div><div class="x-tip-ft-left"><div class="x-tip-ft-right"><div class="x-tip-ft"></div></div></div>');
+              tipTitle = el.child('h3');
+              tipTitle.enableDisplayMode("block");
+              tipBody = el.child('div.x-tip-bd');
+              tipBodyText = el.child('div.x-tip-bd-inner');
+              bdLeft = el.child('div.x-tip-bd-left');
+              bdRight = el.child('div.x-tip-bd-right');
+              close = el.child('div.x-tip-close');
+              close.enableDisplayMode("block");
+              close.on("click", hide);
+              d = Ext.get(document);
+              d.on("mousedown", onDown);
+              d.on("mouseup", onUp);
+              d.on("mouseover", onOver);
+              d.on("mouseout", onOut);
+              d.on("mousemove", onMove);
+              esc = d.addKeyListener(27, hide);
+              esc.disable();
+              if(Ext.dd.DD){
+                  dd = el.initDD("default", null, {
+                      onDrag : function(){
+                          el.sync();  
+                      }
+                  });
+                  dd.setHandleElId(tipTitle.id);
+                  dd.lock();
+              }
+              inited = true;
+          }
+          this.enable(); 
+       },
+
+    /**
+     * Configures a new quick tip instance and assigns it to a target element
+     * @param {Object} config The config object
+     */
+       register : function(config){
+           var cs = config instanceof Array ? config : arguments;
+           for(var i = 0, len = cs.length; i < len; i++) {
+               var c = cs[i];
+               var target = c.target;
+               if(target){
+                   if(target instanceof Array){
+                       for(var j = 0, jlen = target.length; j < jlen; j++){
+                           tagEls[target[j]] = c;
+                       }
+                   }else{
+                       tagEls[typeof target == 'string' ? target : Ext.id(target.id)] = c;
+                   }
+               }
+           }
+       },
+
+    /**
+     * Removes this quick tip from its element and destroys it
+     */
+       unregister : function(el){
+           delete tagEls[Ext.id(el)];
+       },
+
+    /**
+     * Enable this quick tip
+     */
+       enable : function(){
+           if(inited){
+               locks.pop();
+               if(locks.length < 1){
+                   disabled = false;
+               }
+           }
+       },
+
+    /**
+     * Disable this quick tip
+     */
+       disable : function(){
+          disabled = true;
+          clearTimeout(showProc);
+          clearTimeout(hideProc);
+          clearTimeout(dismissProc);
+          if(ce){
+              hide(true);
+          }
+          locks.push(1);
+       },
+
+    /**
+     * Returns true if the quick tip is enabled, else false
+     */
+       isEnabled : function(){
+            return !disabled;
+       },
+
+        // private
+       tagConfig : {
+           namespace : "ext",
+           attribute : "qtip",
+           width : "width",
+           target : "target",
+           title : "qtitle",
+           hide : "hide",
+           cls : "qclass"
+       }
+   };
+}();
+
+// backwards compat
+Ext.QuickTips.tips = Ext.QuickTips.register;

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Radio.jss.html b/www/extras/yui-ext/docs/output/Radio.jss.html new file mode 100644 index 000000000..5b8e4bcd5 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Radio.jss.html @@ -0,0 +1,16 @@ +Radio.js

Radio.js

/**
+ * @class Ext.form.Radio
+ * @extends Ext.form.Checkbox
+ * Single radio field.  Same as Checkbox, but provided as a convenience for automatically setting the input type.
+ * Radio grouping is handled automatically by the browser if you give each radio in a group the same name.
+ * @constructor
+ * Creates a new Radio
+ * @param {Object} config Configuration options
+ */
+Ext.form.Radio = function(){
+    Ext.form.Radio.superclass.constructor.apply(this, arguments);
+};
+Ext.extend(Ext.form.Radio, Ext.form.Checkbox, {
+    inputType: 'radio'
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ReaderLayout.jss.html b/www/extras/yui-ext/docs/output/ReaderLayout.jss.html new file mode 100644 index 000000000..1292ac077 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ReaderLayout.jss.html @@ -0,0 +1,98 @@ +ReaderLayout.js

ReaderLayout.js

/**
+ * @class Ext.ReaderLayout
+ * @extends Ext.BorderLayout
+ * This is a pre-built layout that represents a classic, 5-pane application.  It consists of a header, a primary
+ * center region containing two nested regions (a top one for a list view and one for item preview below),
+ * and regions on either side that can be used for navigation, application commands, informational displays, etc.
+ * The setup and configuration work exactly the same as it does for a {@link Ext.BorderLayout} - this class simply
+ * expedites the setup of the overall layout and regions for this common application style.
+ * Example:
+ <pre><code>
+var reader = new Ext.ReaderLayout();
+var CP = Ext.ContentPanel;  // shortcut for adding
+
+reader.beginUpdate();
+reader.add("north", new CP("north", "North"));
+reader.add("west", new CP("west", {title: "West"}));
+reader.add("east", new CP("east", {title: "East"}));
+
+reader.regions.listView.add(new CP("listView", "List"));
+reader.regions.preview.add(new CP("preview", "Preview"));
+reader.endUpdate();
+</code></pre>
+* @constructor
+* Create a new ReaderLayout
+* @param {Object} config Configuration options
+* @param {String/HTMLElement/Element} container (optional) The container this layout is bound to (defaults to
+* document.body if omitted)
+*/
+Ext.ReaderLayout = function(config, renderTo){
+    var c = config || {size:{}};
+    Ext.ReaderLayout.superclass.constructor.call(this, renderTo || document.body, {
+        north: c.north !== false ? Ext.apply({
+            split:false,
+            initialSize: 32,
+            titlebar: false
+        }, c.north) : false,
+        west: c.west !== false ? Ext.apply({
+            split:true,
+            initialSize: 200,
+            minSize: 175,
+            maxSize: 400,
+            titlebar: true,
+            collapsible: true,
+            animate: true,
+            margins:{left:5,right:0,bottom:5,top:5},
+            cmargins:{left:5,right:5,bottom:5,top:5}
+        }, c.west) : false,
+        east: c.east !== false ? Ext.apply({
+            split:true,
+            initialSize: 200,
+            minSize: 175,
+            maxSize: 400,
+            titlebar: true,
+            collapsible: true,
+            animate: true,
+            margins:{left:0,right:5,bottom:5,top:5},
+            cmargins:{left:5,right:5,bottom:5,top:5}
+        }, c.east) : false,
+        center: Ext.apply({
+            tabPosition: 'top',
+            autoScroll:false,
+            closeOnTab: true,
+            titlebar:false,
+            margins:{left:c.west!==false ? 0 : 5,right:c.east!==false ? 0 : 5,bottom:5,top:2}
+        }, c.center)
+    });
+
+    this.el.addClass('x-reader');
+
+    this.beginUpdate();
+
+    var inner = new Ext.BorderLayout(Ext.get(document.body).createChild(), {
+        south: c.preview !== false ? Ext.apply({
+            split:true,
+            initialSize: 200,
+            minSize: 100,
+            autoScroll:true,
+            collapsible:true,
+            titlebar: true,
+            cmargins:{top:5,left:0, right:0, bottom:0}
+        }, c.preview) : false,
+        center: Ext.apply({
+            autoScroll:false,
+            titlebar:false,
+            minHeight:200
+        }, c.listView)
+    });
+    this.add('center', new Ext.NestedLayoutPanel(inner,
+            Ext.apply({title: c.mainTitle || '',tabTip:''},c.innerPanelCfg)));
+
+    this.endUpdate();
+
+    this.regions.preview = inner.getRegion('south');
+    this.regions.listView = inner.getRegion('center');
+};
+
+Ext.extend(Ext.ReaderLayout, Ext.BorderLayout);

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Record.jss.html b/www/extras/yui-ext/docs/output/Record.jss.html new file mode 100644 index 000000000..93d379528 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Record.jss.html @@ -0,0 +1,209 @@ +Record.js

Record.js

/**
+* @class Ext.data.Record
+ * Instances of this class encapsulate both record <em>definition</em> information, and record
+ * <em>value</em> information for use in {@link Ext.data.Store} objects, or any code which needs
+ * to access Records cached in an {@link Ext.data.Store} object.
+ * <p>
+ * Constructors for this class are generated by passing an Array of field definition objects to {@link #create}
+ * and instances are usually only created by {@link Ext.data.Reader} objects when processing unformatted data
+ * objects.
+ * <p>
+ * Record objects generated by this constructor inherit all the methods of Ext.data.Record listed below.
+ * @constructor
+ * This constructor should not be used to create Record objects. Instead, use the constructor generated by
+ * {@link #create}. The parameters are the same.
+ * @param data {Array} An associative Array of data values keyed by the field name.
+ * @param id (Optional) The id of the record. This id should be unique, and is used by the
+ * @link Ext.data.Store} object which owns the Record to index its collection of Records. If
+ * not specified an integer id is generated.
+ */
+Ext.data.Record = function(data, id){
+    this.id = (id || id === 0) ? id : ++Ext.data.Record.AUTO_ID;
+    this.data = data;
+};
+
+/**
+ * Generate a constructor for a specific record layout.
+ * @param {Array} o An Array of field definition objects which specify field names, and optionally,
+ * data types, and a mapping for an {@link Ext.data.Reader} to extract the field's value from a data object.
+ * Each field definition object may contain the following properties: <ul>
+ * <li>name {String} The name by which the field is referenced within the Record. This is referenced by,
+ * for example the <em>dataIndex</em> property in column definition objects passed to {@link Ext.grid.ColumnModel}</li>
+ * <li>mapping {String} (Optional) A path specification for use by the {@link Ext.data.Reader} implementation
+ * that is creating the Record to access the data value from the data object. If an {@link Ext.data.JsonReader}
+ * is being used, then this is a string containing the javascript expression to reference the data relative to 
+ * the record item's root. If an {@link Ext.data.XmlReader} is being used, this is an {@link Ext.DomQuery} path
+ * to the data item relative to the record element. If the mapping expression is the same as the field name,
+ * this may be omitted.</li>
+ * <li>type {String} (Optional) The data type for conversion to displayable value. Possible values are
+ * <ul><li>auto (Default, implies no conversion)</li>
+ * <li>string</li>
+ * <li>int</li>
+ * <li>float</li>
+ * <li>boolean</li>
+ * <li>date</li></ul></li>
+ * <li>sortType {Mixed} (Optional) A member of {@link Ext.data.SortTypes}.</li>
+ * <li>sortDir {String} (Optional) Initial direction to sort. "ASC" or "DESC"</li>
+ * <li>convert {Function} (Optional) A function which accepts a data value and returns it formatted for display.</li>
+ * <li>dateFormat {String} (Optional) A format String for the Date.parseDate function.</li>
+ * </ul>
+ * <br>usage:<br><pre><code>
+    var TopicRecord = Ext.data.Record.create(
+        {name: 'title', mapping: 'topic_title'},
+        {name: 'author', mapping: 'username'},
+        {name: 'totalPosts', mapping: 'topic_replies', type: 'int'},
+        {name: 'lastPost', mapping: 'post_time', type: 'date'},
+        {name: 'lastPoster', mapping: 'user2'},
+        {name: 'excerpt', mapping: 'post_text'}
+    );
+    
+    var myNewRecord = new TopicRecord({
+        title: 'Do my job please',
+        author: 'noobie',
+        totalPosts: 1,
+        lastPost: new Date(),
+        lastPoster: 'Animal',
+        excerpt: 'No way dude!'
+    });
+    myStore.add(myNewRecord);
+</code></pre>
+ */
+Ext.data.Record.create = function(o){
+    var f = function(){
+        f.superclass.constructor.apply(this, arguments);
+    };
+    Ext.extend(f, Ext.data.Record);
+    var p = f.prototype;
+    p.fields = new Ext.util.MixedCollection(false, function(field){
+        return field.name;
+    });
+    for(var i = 0, len = o.length; i < len; i++){
+        p.fields.add(new Ext.data.Field(o[i]));
+    }
+    f.getField = function(name){
+        return p.fields.get(name);  
+    };
+    return f;
+};
+
+Ext.data.Record.AUTO_ID = 1000;
+Ext.data.Record.EDIT = 'edit';
+Ext.data.Record.REJECT = 'reject';
+Ext.data.Record.COMMIT = 'commit';
+
+Ext.data.Record.prototype = {
+    /**
+     * Readonly flag - true if this record has been modified.
+     * @type Boolean
+     */
+    dirty : false,
+    editing : false,
+    error: null,
+    modified: null,
+
+    // private
+    join : function(store){
+        this.store = store;
+    },
+
+    /**
+     * Set the named field to the specified value.
+     * @param name {String} The name of the field to set.
+     * @param value {Object} The value to set the field to.
+     */
+    set : function(name, value){
+        if(this.data[name] == value){
+            return;
+        }
+        this.dirty = true;
+        if(!this.modified){
+            this.modified = {};
+        }
+        if(typeof this.modified[name] == 'undefined'){
+            this.modified[name] = this.data[name];
+        }
+        this.data[name] = value;
+        if(!this.editing){
+            this.store.afterEdit(this);
+        }       
+    },
+
+    /**
+     * Get the value of the named field.
+     * @param name {String} The name of the field to get the value of.
+     * @return {Object} The value of the field.
+     */
+    get : function(name){
+        return this.data[name]; 
+    },
+
+    // private
+    beginEdit : function(){
+        this.editing = true;
+        this.modified = {}; 
+    },
+
+    // private
+    cancelEdit : function(){
+        this.editing = false;
+        delete this.modified;
+    },
+
+    // private
+    endEdit : function(){
+        this.editing = false;
+        if(this.dirty && this.store){
+            this.store.afterEdit(this);
+        }
+    },
+
+    /**
+     * Usually called by the {@link Ext.data.Store} which owns the Record.
+     * Rejects all changes made to the Record since either creation, or the last commit operation.
+     * Modified fields are reverted to their original values.
+     * <p>
+     * Developers should subscribe to the {@link Ext.data.Store#update} event to have their code notified
+     * of reject operations.
+     */
+    reject : function(){
+        var m = this.modified;
+        for(var n in m){
+            if(typeof m[n] != "function"){
+                this.data[n] = m[n];
+            }
+        }
+        this.dirty = false;
+        delete this.modified;
+        this.editing = false;
+        if(this.store){
+            this.store.afterReject(this);
+        }
+    },
+
+    /**
+     * Usually called by the {@link Ext.data.Store} which owns the Record.
+     * Commits all changes made to the Record since either creation, or the last commit operation.
+     * <p>
+     * Developers should subscribe to the {@link Ext.data.Store#update} event to have their code notified
+     * of commit operations.
+     */
+    commit : function(){
+        this.dirty = false;
+        delete this.modified;
+        this.editing = false;
+        if(this.store){
+            this.store.afterCommit(this);
+        }
+    },
+
+    // private
+    hasError : function(){
+        return this.error != null;
+    },
+
+    // private
+    clearError : function(){
+        this.error = null;
+    }
+};

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Registry.jss.html b/www/extras/yui-ext/docs/output/Registry.jss.html new file mode 100644 index 000000000..f658015fd --- /dev/null +++ b/www/extras/yui-ext/docs/output/Registry.jss.html @@ -0,0 +1,122 @@ +Registry.js

Registry.js

/**
+ * @class Ext.dd.Registry
+ * Provides easy access to all drag drop components that are registered on a page.  Items can be retrieved either
+ * directly by DOM node id, or by passing in the drag drop event that occurred and looking up the event target.
+ * @singleton
+ */
+Ext.dd.Registry = function(){
+    var elements = {}; 
+    var handles = {}; 
+    var autoIdSeed = 0;
+
+    var getId = function(el, autogen){
+        if(typeof el == "string"){
+            return el;
+        }
+        var id = el.id;
+        if(!id && autogen !== false){
+            id = "extdd-" + (++autoIdSeed);
+            el.id = id;
+        }
+        return id;
+    };
+    
+    return {
+    /**
+     * Resgister a drag drop element
+     * @param {String/HTMLElement) element The id or DOM node to register
+     * @param {Object} data (optional) An custom data object that will be passed between the elements that are involved
+     * in drag drop operations.  You can populate this object with any arbitrary properties that your own code
+     * knows how to interpret, plus there are some specific properties known to the Registry that should be
+     * populated in the data object (if applicable):
+     * <pre>
+Value      Description<br />
+---------  ------------------------------------------<br />
+handles    Array of DOM nodes that trigger dragging<br />
+           for the element being registered<br />
+isHandle   True if the element passed in triggers<br />
+           dragging itself, else false
+</pre>
+     */
+        register : function(el, data){
+            data = data || {};
+            if(typeof el == "string"){
+                el = document.getElementById(el);
+            }
+            data.ddel = el;
+            elements[getId(el)] = data;
+            if(data.isHandle !== false){
+                handles[data.ddel.id] = data;
+            }
+            if(data.handles){
+                var hs = data.handles;
+                for(var i = 0, len = hs.length; i < len; i++){
+                	handles[getId(hs[i])] = data;
+                }
+            }
+        },
+
+    /**
+     * Unregister a drag drop element
+     * @param {String/HTMLElement) element The id or DOM node to unregister
+     */
+        unregister : function(el){
+            var id = getId(el, false);
+            var data = elements[id];
+            if(data){
+                delete elements[id];
+                if(data.handles){
+                    var hs = data.handles;
+                    for(var i = 0, len = hs.length; i < len; i++){
+                    	delete handles[getId(hs[i], false)];
+                    }
+                }
+            }
+        },
+
+    /**
+     * Returns the handle registered for a DOM Node by id
+     * @param {String/HTMLElement} id The DOM node or id to look up
+     * @return {Object} handle The custom handle data
+     */
+        getHandle : function(id){
+            if(typeof id != "string"){ // must be element?
+                id = id.id;
+            }
+            return handles[id];
+        },
+
+    /**
+     * Returns the handle that is registered for the DOM node that is the target of the event
+     * @param {Event} e The event
+     * @return {Object} handle The custom handle data
+     */
+        getHandleFromEvent : function(e){
+            var t = Ext.lib.Event.getTarget(e);
+            return t ? handles[t.id] : null;
+        },
+
+    /**
+     * Returns a custom data object that is registered for a DOM node by id
+     * @param {String/HTMLElement} id The DOM node or id to look up
+     * @return {Object} data The custom data
+     */
+        getTarget : function(id){
+            if(typeof id != "string"){ // must be element?
+                id = id.id;
+            }
+            return elements[id];
+        },
+
+    /**
+     * Returns a custom data object that is registered for the DOM node that is the target of the event
+     * @param {Event} e The event
+     * @return {Object} data The custom data
+     */
+        getTargetFromEvent : function(e){
+            var t = Ext.lib.Event.getTarget(e);
+            return t ? elements[t.id] || handles[t.id] : null;
+        }
+    };
+}();

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Resizable.jss.html b/www/extras/yui-ext/docs/output/Resizable.jss.html new file mode 100644 index 000000000..24e1678f1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Resizable.jss.html @@ -0,0 +1,2 @@ +Resizable.js

Resizable.js

/**
 * @class Ext.Resizable
 * @extends 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 to the id of the element), <b>or</b> set wrap:true in your config and
 * the element will be wrapped for you automatically.</p>
 * <p>Here is the list of valid resize handles:</p>
 * <pre>
Value   Description
------  -------------------
 'n'     north
 's'     south
 'e'     east
 'w'     west
 'nw'    northwest
 'sw'    southwest
 'se'    southeast
 'ne'    northeast
 'all'   all
</pre>
 * <p>Here's an example showing the creation of a typical Resizable:</p>
 * <pre><code>
var resizer = new Ext.Resizable("element-id", {
    handles: 'all',
    minWidth: 200,
    minHeight: 100,
    maxWidth: 500,
    maxHeight: 400,
    pinned: true
});
resizer.on("resize", myHandler);
</code></pre>
 * <p>To hide a particular handle, set its display to none in CSS, or through script:<br>
 * resizer.east.setDisplayed(false);</p>
 * @cfg {Boolean/String/Element} resizeChild True to resize the first child, or id/element to resize (defaults to false)
 * @cfg {Array/String} adjustments String "auto" or an array [width, height] with values to be <b>added</b> to the
 * resize operation's new size (defaults to [0, 0])
 * @cfg {Number} minWidth The minimum width for the element (defaults to 5)
 * @cfg {Number} minHeight The minimum height for the element (defaults to 5)
 * @cfg {Number} maxWidth The maximum width for the element (defaults to 10000)
 * @cfg {Number} maxHeight The maximum height for the element (defaults to 10000)
 * @cfg {Boolean} enabled False to disable resizing (defaults to true)
 * @cfg {Boolean} wrap True to wrap an element with a div if needed (required for textareas and images, defaults to false)
 * @cfg {Number} width The width of the element in pixels (defaults to null)
 * @cfg {Number} height The height of the element in pixels (defaults to null)
 * @cfg {Boolean} animate True to animate the resize (not compatible with dynamic sizing, defaults to false)
 * @cfg {Number} duration Animation duration if animate = true (defaults to .35)
 * @cfg {Boolean} dynamic True to resize the element while dragging instead of using a proxy (defaults to false)
 * @cfg {Boolean/String} handles String consisting of the resize handles to display (defaults to false)
 * @cfg {Boolean} multiDirectional <b>Deprecated</b>.  The old style of adding multi-direction resize handles, deprecated
 * in favor of the handles config option (defaults to false)
 * @cfg {Boolean} disableTrackOver True to disable mouse tracking. This is only applied at config time. (defaults to false)
 * @cfg {String} easing Animation easing if animate = true (defaults to 'easingOutStrong')
 * @cfg {Number} widthIncrement The increment to snap the width resize in pixels (dynamic must be true, defaults to 0)
 * @cfg {Number} heightIncrement The increment to snap the height resize in pixels (dynamic must be true, defaults to 0)
 * @cfg {Boolean} pinned True to ensure that the resize handles are always visible, false to display them only when the
 * user mouses over the resizable borders. This is only applied at config time. (defaults to false)
 * @cfg {Boolean} preserveRatio True to preserve the original ratio between height and width during resize (defaults to false)
 * @cfg {Boolean} transparent True for transparent handles. This is only applied at config time. (defaults to false)
 * @cfg {Number} minX The minimum allowed page X for the element (only used for west resizing, defaults to 0)
 * @cfg {Number} minY The minimum allowed page Y for the element (only used for north resizing, defaults to 0)
 * @cfg {Boolean} draggable Convenience to initialize drag drop (defaults to false)
 * @constructor
 * Create a new resizable component
 * @param {String/HTMLElement/Ext.Element} el The id or element to resize
 * @param {Object} config configuration options
  */
Ext.Resizable = function(el, config){
    this.el = Ext.get(el);
    
    if(config && config.wrap){
        config.resizeChild = this.el;
        this.el = this.el.wrap(typeof config.wrap == "object" ? config.wrap : {cls:"xresizable-wrap"});
        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: "x-resizable-proxy", id: this.el.id + "-rzproxy"});
    this.proxy.unselectable();
    this.proxy.enableDisplayMode('block');

    Ext.apply(this, config);
    
    if(this.pinned){
        this.disableTrackOver = true;
        this.el.addClass("x-resizable-pinned");
    }
    // if the element isn't positioned, make it relative
    var position = this.el.getStyle("position");
    if(position != "absolute" && position != "fixed"){
        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 = 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 Ext.Resizable.Handle(this, pos, this.disableTrackOver, this.transparent);
        }
    }
    // legacy
    this.corner = this.southeast;
    
    if(this.handles.indexOf("n") != -1 || this.handles.indexOf("w") != -1){
        this.updateBox = true;
    }   
   
    this.activeHandle = null;
    
    if(this.resizeChild){
        if(typeof this.resizeChild == "boolean"){
            this.resizeChild = Ext.get(this.el.dom.firstChild, true);
        }else{
            this.resizeChild = Ext.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.position("relative");
            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.addEvents({
        /**
         * @event beforeresize
         * Fired before resize is allowed. Set enabled to false to cancel resize. 
         * @param {Ext.Resizable} this
         * @param {Ext.EventObject} e The mousedown event
         */
        "beforeresize" : true,
        /**
         * @event resize
         * Fired after a resize. 
         * @param {Ext.Resizable} this
         * @param {Number} width The new width
         * @param {Number} height The new height
         * @param {Ext.EventObject} e The mouseup event
         */
        "resize" : true
    });
    
    if(this.width !== null && this.height !== null){
        this.resizeTo(this.width, this.height);
    }else{
        this.updateChildSize();
    }
    if(Ext.isIE){
        this.el.dom.style.zoom = 1;
    }
    Ext.Resizable.superclass.constructor.call(this);
};

Ext.extend(Ext.Resizable, Ext.util.Observable, {
        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 : 'easeOutStrong',
        widthIncrement : 0,
        heightIncrement : 0,
        pinned : false,
        width : null,
        height : null,
        preserveRatio : false,
        transparent: false,
        minX: 0,
        minY: 0,
        draggable: false,
    /**
     * 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);
    },

    // private
    startSizing : function(e, handle){
        this.fireEvent("beforeresize", this, e);
        if(this.enabled){ // 2nd enabled check in case disabled before beforeresize handler

            if(!this.overlay){
                this.overlay = this.el.createProxy({tag: "div", cls: "x-resizable-overlay", html: "&#160;"});
                this.overlay.unselectable();
                this.overlay.enableDisplayMode("block");
                this.overlay.on("mousemove", this.onMouseMove, this);
                this.overlay.on("mouseup", this.onMouseUp, this);
            }
            this.overlay.setStyle("cursor", handle.el.getStyle("cursor"));

            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.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
            this.overlay.show();

            this.proxy.setStyle('visibility', 'hidden'); // workaround display none
            this.proxy.show();
            this.proxy.setBox(this.startBox);
            if(!this.dynamic){
                this.proxy.setStyle('visibility', 'visible');
            }
        }
    },

    // private
    onMouseDown : function(handle, e){
        if(this.enabled){
            e.stopEvent();
            this.activeHandle = handle;
            this.startSizing(e, handle);
        }          
    },

    // private
    onMouseUp : function(e){
        var size = this.resizeElement();
        this.resizing = false;
        this.handleOut();
        this.overlay.hide();
        this.fireEvent("resize", this, size.width, size.height, e);
    },

    // private
    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(Ext.isIE){
                setTimeout(function(){
                    if(el.dom.offsetWidth){
                        var b = el.getSize(true);
                        child.setSize(b.width+adj[0], b.height+adj[1]);
                    }
                }, 10);
            }
        }
    },

    // private
    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);
    },

    // private
    resizeElement : function(){
        var box = this.proxy.getBox();
        if(this.updateBox){
            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;
    },

    // private
    constrain : function(v, diff, m, mx){
        if(v - diff < m){
            diff = v - m;    
        }else if(v - diff > mx){
            diff = mx - v; 
        }
        return diff;                
    },

    // private
    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){}
        }
    },

    // private
    handleOver : function(){
        if(this.enabled){
            this.el.addClass("x-resizable-over");
        }
    },

    // private
    handleOut : function(){
        if(!this.resizing){
            this.el.removeClass("x-resizable-over");
        }
    },
    
    /**
     * Returns the element this component is bound to.
     * @return {Ext.Element}
     */
    getEl : function(){
        return this.el;
    },
    
    /**
     * Returns the resizeChild element (or null).
     * @return {Ext.Element}
     */
    getResizeChild : function(){
        return this.resizeChild;
    },
    
    /**
     * Destroys this resizable. If the element was wrapped and 
     * removeEl is not true then the element remains.
     * @param {Boolean} removeEl (optional) true to remove the element from the DOM
     */
    destroy : function(removeEl){
        this.proxy.remove();
        this.overlay.removeAllListeners();
        this.overlay.remove();
        var ps = Ext.Resizable.positions;
        for(var k in ps){
            if(typeof ps[k] != "function" && this[ps[k]]){
                var h = this[ps[k]];
                h.el.removeAllListeners();
                h.el.remove();
            }
        }
        if(removeEl){
            this.el.update("");
            this.el.remove();
        }
    }
});

// private
// hash to map config positions to true positions
Ext.Resizable.positions = {
    n: "north", s: "south", e: "east", w: "west", se: "southeast", sw: "southwest", nw: "northwest", ne: "northeast"
};

// private
Ext.Resizable.Handle = function(rz, pos, disableTrackOver, transparent){
    if(!this.tpl){
        // only initialize the template if resizable is used
        var tpl = Ext.DomHelper.createTemplate(
            {tag: "div", cls: "x-resizable-handle x-resizable-handle-{0}"}
        );
        tpl.compile();
        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.on("mousedown", this.onMouseDown, this);
    if(!disableTrackOver){
        this.el.on("mouseover", this.onMouseOver, this);
        this.el.on("mouseout", this.onMouseOut, this);
    }
};

// private
Ext.Resizable.Handle.prototype = {
    afterResize : function(rz){
        // do nothing    
    },
    // private
    onMouseDown : function(e){
        this.rz.onMouseDown(this, e);
    },
    // private
    onMouseOver : function(e){
        this.rz.handleOver(this, e);
    },
    // private
    onMouseOut : function(e){
        this.rz.handleOut(this, e);
    }  
};




Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/RowSelectionModel.jss.html b/www/extras/yui-ext/docs/output/RowSelectionModel.jss.html new file mode 100644 index 000000000..015a6f84e --- /dev/null +++ b/www/extras/yui-ext/docs/output/RowSelectionModel.jss.html @@ -0,0 +1,411 @@ +RowSelectionModel.js

RowSelectionModel.js

/**
+ @class Ext.grid.RowSelectionModel
+ * @extends Ext.grid.AbstractSelectionModel
+ * The default SelectionModel used by {@link Ext.grid.Grid}. 
+ It supports multiple selections and keyboard selection/navigation. <br><br>
+ @constructor
+ * @param {Object} config
+ */
+Ext.grid.RowSelectionModel = function(config){
+    Ext.apply(this, config);
+    this.selections = new Ext.util.MixedCollection(false, function(o){
+        return o.id;
+    });
+    
+    this.last = false;
+    this.lastActive = false;
+
+    this.addEvents({
+        /**
+	     * @event selectionchange
+	     * Fires when the selection changes 
+	     * @param {SelectionModel} this
+	     */
+	    "selectionchange" : true,
+        /**
+	     * @event beforerowselect
+	     * Fires when a row is selected being selected, return false to cancel.
+	     * @param {SelectionModel} this
+	     * @param {Number} rowIndex The selected index
+	     */
+	    "beforerowselect" : true,
+        /**
+	     * @event rowselect
+	     * Fires when a row is selected.
+	     * @param {SelectionModel} this
+	     * @param {Number} rowIndex The selected index
+	     */
+	    "rowselect" : true,
+        
+        "rowdeselect" : true
+    });
+    
+    this.locked = false;
+};
+
+Ext.extend(Ext.grid.RowSelectionModel, Ext.grid.AbstractSelectionModel,  {
+    /**
+     * @cfg {Boolean} singleSelect
+     * True to allow selection of only one row at a time (defaults to false)
+     */
+    singleSelect : false,
+
+    // private
+    initEvents : function(){
+
+        if(!this.grid.enableDragDrop && !this.grid.enableDrag){
+            this.grid.on("mousedown", this.handleMouseDown, this);
+        }
+
+        this.rowNav = new Ext.KeyNav(this.grid.container, {
+            "up" : function(e){
+                if(!e.shiftKey){
+                    this.selectPrevious(e.shiftKey);
+                }else if(this.last !== false && this.lastActive !== false){
+                    var last = this.last;
+                    this.selectRange(this.last,  this.lastActive-1);
+                    this.grid.getView().focusRow(this.lastActive);
+                    if(last !== false){
+                        this.last = last;
+                    }
+                }else{
+                    this.selectFirstRow();
+                }
+            },
+            "down" : function(e){
+                if(!e.shiftKey){
+                    this.selectNext(e.shiftKey);
+                }else if(this.last !== false && this.lastActive !== false){
+                    var last = this.last;
+                    this.selectRange(this.last,  this.lastActive+1);
+                    this.grid.getView().focusRow(this.lastActive);
+                    if(last !== false){
+                        this.last = last;
+                    }
+                }else{
+                    this.selectFirstRow();
+                }
+            },
+            scope: this
+        });
+
+        var view = this.grid.view;
+        view.on("refresh", this.onRefresh, this);
+        view.on("rowupdated", this.onRowUpdated, this);
+        view.on("rowremoved", this.onRemove, this);
+    },
+
+    // private
+    onRefresh : function(){
+        var ds = this.grid.dataSource, i, v = this.grid.view;
+        var s = this.selections;
+        s.each(function(r){
+            if((i = ds.indexOfId(r.id)) != -1){
+                v.onRowSelect(i);
+            }else{
+                s.remove(r);
+            }
+        });
+    },
+
+    // private
+    onRemove : function(v, index, r){
+        this.selections.remove(r);
+    },
+
+    // private
+    onRowUpdated : function(v, index, r){
+        if(this.isSelected(r)){
+            v.onRowSelect(index);
+        }
+    },
+
+    /**
+     * Select records.
+     * @param {Array} records The records to select
+     * @param {Boolean} keepExisting (optional) True to keep existing selections
+     */
+    selectRecords : function(records, keepExisting){
+        if(!keepExisting){
+            this.clearSelections();
+        }
+        var ds = this.grid.dataSource;
+        for(var i = 0, len = records.length; i < len; i++){
+            this.selectRow(ds.indexOf(records[i]), true);
+        }
+    },
+    
+    /**
+     * Gets the number of selected rows.
+     * @return {Number}
+     */
+    getCount : function(){
+        return this.selections.length;
+    },
+    
+    /**
+     * Selects the first row in the grid.
+     */
+    selectFirstRow : function(){
+        this.selectRow(0);
+    },
+
+    /**
+     * Select the last row.
+     * @param {Boolean} keepExisting (optional) True to keep existing selections
+     */
+    selectLastRow : function(keepExisting){
+        this.selectRow(this.grid.dataSource.getCount() - 1, keepExisting);
+    },
+
+    /**
+     * Selects the row immediately following the last selected row.
+     * @param {Boolean} keepExisting (optional) True to keep existing selections
+     */
+    selectNext : function(keepExisting){
+        if(this.last !== false && (this.last+1) < this.grid.dataSource.getCount()){
+            this.selectRow(this.last+1, keepExisting);
+            this.grid.getView().focusRow(this.last);
+        }
+    },
+    
+    /**
+     * Selects the row that precedes the last selected row.
+     * @param {Boolean} keepExisting (optional) True to keep existing selections
+     */
+    selectPrevious : function(keepExisting){
+        if(this.last){
+            this.selectRow(this.last-1, keepExisting);
+            this.grid.getView().focusRow(this.last);
+        }
+    },
+    
+    /**
+     * Returns the selected records
+     * @return {Array} Array of selected records
+     */
+    getSelections : function(){
+        return [].concat(this.selections.items);
+    },
+    
+    /**
+     * Returns the first selected record.
+     * @return {Record}
+     */
+    getSelected : function(){
+        return this.selections.itemAt(0);
+    },
+    
+    
+    /**
+     * Clears all selections.
+     */
+    clearSelections : function(fast){
+        if(this.locked) return;
+        if(fast !== true){
+            var ds = this.grid.dataSource;
+            var s = this.selections;
+            s.each(function(r){
+                this.deselectRow(ds.indexOfId(r.id));
+            }, this);
+            s.clear();
+        }else{
+            this.selections.clear();
+        }
+        this.last = false;
+    },
+    
+        
+    /**
+     * Selects all rows.
+     */
+    selectAll : function(){
+        if(this.locked) return;
+        this.selections.clear();
+        for(var i = 0, len = this.grid.dataSource.getCount(); i < len; i++){
+            this.selectRow(i, true);
+        }
+    },
+    
+    /**
+     * Returns True if there is a selection.
+     * @return {Boolean}
+     */
+    hasSelection : function(){
+        return this.selections.length > 0;
+    },
+
+    /**
+     * Returns True if the specified row is selected.
+     * @param {Number/Record} record The record or index of the record to check
+     * @return {Boolean}
+     */
+    isSelected : function(index){
+        var r = typeof index == "number" ? this.grid.dataSource.getAt(index) : index;
+        return (r && this.selections.key(r.id) ? true : false);
+    },
+
+    /**
+     * Returns True if the specified record id is selected.
+     * @param {String} id The id of record to check
+     * @return {Boolean}
+     */
+    isIdSelected : function(id){
+        return (this.selections.key(id) ? true : false);
+    },
+
+    // private
+    handleMouseDown : function(e, t){
+        var view = this.grid.getView(), rowIndex;
+        if(this.isLocked() || (rowIndex = view.findRowIndex(t)) === false){
+            return;
+        };
+        if(e.shiftKey && this.last !== false){
+            var last = this.last;
+            this.selectRange(last, rowIndex, e.ctrlKey);
+            this.last = last; // reset the last
+            view.focusRow(rowIndex);
+        }else{
+            var isSelected = this.isSelected(rowIndex);
+            if(e.button != 0 && isSelected){
+                view.focusRow(rowIndex);
+            }else if(e.ctrlKey && isSelected){
+                this.deselectRow(rowIndex);
+            }else{
+                this.selectRow(rowIndex, e.button == 0 && (e.ctrlKey || e.shiftKey));
+                view.focusRow(rowIndex);
+            }
+        }
+    },
+    
+    /**
+     * Selects multiple rows.
+     * @param {Array} rows Array of the indexes of the row to select
+     * @param {Boolean} keepExisting (optional) True to keep existing selections
+     */
+    selectRows : function(rows, keepExisting){
+        if(!keepExisting){
+            this.clearSelections();
+        }
+        for(var i = 0, len = rows.length; i < len; i++){
+            this.selectRow(rows[i], true);
+        }
+    },
+    
+    /**
+     * Selects a range of rows. All rows in between startRow and endRow are also selected.
+     * @param {Number} startRow The index of the first row in the range
+     * @param {Number} endRow The index of the last row in the range
+     * @param {Boolean} keepExisting (optional) True to retain existing selections
+     */
+    selectRange : function(startRow, endRow, keepExisting){
+        if(this.locked) return;
+        if(!keepExisting){
+            this.clearSelections();
+        }
+        if(startRow <= endRow){
+            for(var i = startRow; i <= endRow; i++){
+                this.selectRow(i, true);
+            }
+        }else{
+            for(var i = startRow; i >= endRow; i--){
+                this.selectRow(i, true);
+            }
+        }
+    },
+    
+    /**
+     * Deselects a range of rows. All rows in between startRow and endRow are also deselected.
+     * @param {Number} startRow The index of the first row in the range
+     * @param {Number} endRow The index of the last row in the range
+     */
+    deselectRange : function(startRow, endRow, preventViewNotify){
+        if(this.locked) return;
+        for(var i = startRow; i <= endRow; i++){
+            this.deselectRow(i, preventViewNotify);
+        }
+    },
+    
+    /**
+     * Selects a row.
+     * @param {Number} row The index of the row to select
+     * @param {Boolean} keepExisting (optional) True to keep existing selections
+     */
+    selectRow : function(index, keepExisting, preventViewNotify){
+        if(this.locked || (index < 0 || index >= this.grid.dataSource.getCount())) return;
+        if(this.fireEvent("beforerowselect", this, index, keepExisting) !== false){
+            if(!keepExisting || this.singleSelect){
+                this.clearSelections();
+            }
+            var r = this.grid.dataSource.getAt(index);
+            this.selections.add(r);
+            this.last = this.lastActive = index;
+            if(!preventViewNotify){
+                this.grid.getView().onRowSelect(index);
+            }
+            this.fireEvent("rowselect", this, index, r);
+            this.fireEvent("selectionchange", this);
+        }
+    },
+
+    /**
+     * Deselects a row.
+     * @param {Number} row The index of the row to deselect
+     */
+    deselectRow : function(index, preventViewNotify){
+        if(this.locked) return;
+        if(this.last == index){
+            this.last = false;
+        }
+        if(this.lastActive == index){
+            this.lastActive = false;
+        }
+        var r = this.grid.dataSource.getAt(index);
+        this.selections.remove(r);
+        if(!preventViewNotify){
+            this.grid.getView().onRowDeselect(index);
+        }
+        this.fireEvent("rowdeselect", this, index);
+        this.fireEvent("selectionchange", this);
+    },
+
+    // private
+    restoreLast : function(){
+        if(this._last){
+            this.last = this._last;
+        }    
+    },
+
+    // private
+    acceptsNav : function(row, col, cm){
+        return !cm.isHidden(col) && cm.isCellEditable(col, row);
+    },
+
+    // private
+    onEditorKey : function(field, e){
+        var k = e.getKey(), newCell, g = this.grid, ed = g.activeEditor;
+        if(k == e.TAB){
+            ed.completeEdit();
+            if(e.shiftKey){
+                newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this);
+            }else{
+                newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this);
+            }
+            e.stopEvent();
+        }else if(k == e.ENTER && !e.ctrlKey){
+            ed.completeEdit();
+            if(e.shiftKey){
+                newCell = g.walkCells(ed.row-1, ed.col, -1, this.acceptsNav, this);
+            }else{
+                newCell = g.walkCells(ed.row+1, ed.col, 1, this.acceptsNav, this);
+            }
+            e.stopEvent();
+        }else if(k == e.ESC){
+            ed.cancelEdit();
+        }
+        if(newCell){
+            g.startEditing(newCell[0], newCell[1]);
+        }
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ScriptTagProxy.jss.html b/www/extras/yui-ext/docs/output/ScriptTagProxy.jss.html new file mode 100644 index 000000000..6f7d80218 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ScriptTagProxy.jss.html @@ -0,0 +1,162 @@ +ScriptTagProxy.js

ScriptTagProxy.js

/**
+ * @class Ext.data.ScriptTagProxy
+ * An implementation of Ext.data.DataProxy that reads a data object from a URL which may be in a domain
+ * other than the originating domain of the running page.
+ * <p>
+ * <em>Note that this class must be used to retrieve data from a domain other than the domain
+ * from which the running page was served.</em>
+ * 
+ * @cfg {String} url The url from which to request the data object.
+ * @constructor
+ * @param {Object} conn A configuration object.
+ */
+Ext.data.ScriptTagProxy = function(config){
+    Ext.data.ScriptTagProxy.superclass.constructor.call(this);
+    Ext.apply(this, config);
+    this.head = document.getElementsByTagName("head")[0];
+};
+
+Ext.data.ScriptTagProxy.TRANS_ID = 1000;
+
+Ext.extend(Ext.data.ScriptTagProxy, Ext.data.DataProxy, {
+    /**
+     * @cfg {Number} timeout (Optional) The number of milliseconds to wait for a response. Defaults to 30 seconds.
+     */
+    timeout : 30000,
+    /**
+     * @cfg {String} callbackParam (Optional) The name of the parameter to pass to the server which tells
+     * the server the name of the callback function set up by the load call to process the returned data object.
+     * Defaults to "callback".<p>The server-side processing must read this parameter value, and generate
+     * javascript output which calls this named function passing the data object as its only parameter.
+     */
+    callbackParam : "callback",
+    /**
+     *  @cfg nocache {Boolean} (Optional) Defaults to true. Disable cacheing by adding a unique parameter
+     * name to the request.
+     */
+    nocache : true,
+    
+    /**
+     * Load data from the configured URL, read the data object into
+     * a block of Ext.data.Records using the passed Ext.data.DataReader implementation, and
+     * process that block using the passed callback.
+     * @param {Object} params An object containing properties which are to be used as HTTP parameters
+     * for the request to the remote server.
+     * @param {Ext.data.DataReader} reader The Reader object which converts the data
+     * object into a block of Ext.data.Records.
+     * @param {Function} callback The function into which to pass the block of Ext.data.Records.
+     * The function must be passed <ul>
+     * <li>The Record block object</li>
+     * <li>The "arg" argument from the load function</li>
+     * <li>A boolean success indicator</li>
+     * </ul>
+     * @param {Object} scope The scope in which to call the callback
+     * @param {Object} arg An optional argument which is passed to the callback as its second parameter.
+     */
+    load : function(params, reader, callback, scope, arg){
+        if(this.fireEvent("beforeload", this, params) !== false){
+            
+            var p = Ext.urlEncode(Ext.apply(params, this.extraParams));
+            
+            var url = this.url;
+            url += (url.indexOf("?") != -1 ? "&" : "?") + p;
+            if(this.nocache){
+                url += "&_dc=" + (new Date().getTime());
+            }
+            var transId = ++Ext.data.ScriptTagProxy.TRANS_ID;
+            var trans = {
+                id : transId,
+                cb : "stcCallback"+transId,
+                scriptId : "stcScript"+transId,
+                params : params,
+                arg : arg,
+                url : url,
+                callback : callback,
+                scope : scope,
+                reader : reader
+            };
+            var conn = this;
+            
+            window[trans.cb] = function(o){
+                conn.handleResponse(o, trans);
+            };
+            
+            url += String.format("&{0}={1}", this.callbackParam, trans.cb);
+            
+            if(this.autoAbort !== false){
+                this.abort();
+            }
+            
+            trans.timeoutId = this.handleFailure.defer(this.timeout, this, [trans]);
+            
+            var script = document.createElement("script");
+            script.setAttribute("src", url);
+            script.setAttribute("type", "text/javascript");
+            script.setAttribute("id", trans.scriptId);
+            this.head.appendChild(script);
+            
+            this.trans = trans;
+        }else{
+            callback.call(scope||this, null, arg, false);
+        }
+    },
+
+    // private
+    isLoading : function(){
+        return this.trans ? true : false;  
+    },
+
+    /**
+     * Abort the current server request.
+     */
+    abort : function(){
+        if(this.isLoading()){
+            this.destroyTrans(this.trans);
+        }
+    },
+    
+    // private
+    destroyTrans : function(trans, isLoaded){
+        this.head.removeChild(document.getElementById(trans.scriptId));
+        clearTimeout(trans.timeoutId);
+        if(isLoaded){
+            window[trans.cb] = undefined;
+            try{
+                delete window[trans.cb];
+            }catch(e){}
+        }else{
+            // if hasn't been loaded, wait for load to remove it to prevent script error
+            window[trans.cb] = function(){
+                window[trans.cb] = undefined;
+                try{
+                    delete window[trans.cb];
+                }catch(e){}
+            }; 
+        }
+    },
+    
+    // private
+    handleResponse : function(o, trans){
+        this.trans = false;
+        this.destroyTrans(trans, true);
+        var result;
+        try {
+            result = trans.reader.readRecords(o);
+        }catch(e){
+            this.fireEvent("loadexception", this, o, trans.arg, e);
+            trans.callback.call(trans.scope||window, null, trans.arg, false);
+            return;
+        }
+        this.fireEvent("load", this, o, trans.arg);
+        trans.callback.call(trans.scope||window, result, trans.arg, true);
+    },
+    
+    // private
+    handleFailure : function(trans){
+        this.trans = false;
+        this.destroyTrans(trans, false);
+        this.fireEvent("loadexception", this, null, trans.arg);
+        trans.callback.call(trans.scope||window, null, trans.arg, false);
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ScrollManager.jss.html b/www/extras/yui-ext/docs/output/ScrollManager.jss.html new file mode 100644 index 000000000..f3c21fa8f --- /dev/null +++ b/www/extras/yui-ext/docs/output/ScrollManager.jss.html @@ -0,0 +1,171 @@ +ScrollManager.js

ScrollManager.js

/**
+ * @class Ext.dd.ScrollManager
+ * Provides automatic scrolling of overflow regions in the page during drag operations.<br><br>
+ * <b>Note: This class uses "Point Mode" and is untested in "Intersect Mode".</b>
+ * @singleton
+ */
+Ext.dd.ScrollManager = function(){
+    var ddm = Ext.dd.DragDropMgr;
+    var els = {};
+    var dragEl = null;
+    var proc = {};
+    
+    var onStop = function(e){
+        dragEl = null;
+        clearProc();
+    };
+    
+    var triggerRefresh = function(){
+        if(ddm.dragCurrent){
+             ddm.refreshCache(ddm.dragCurrent.groups);
+        }
+    };
+    
+    var doScroll = function(){
+        if(ddm.dragCurrent){
+            var dds = Ext.dd.ScrollManager;
+            if(!dds.animate){
+                if(proc.el.scroll(proc.dir, dds.increment)){
+                    triggerRefresh();
+                }
+            }else{
+                proc.el.scroll(proc.dir, dds.increment, true, dds.animDuration, triggerRefresh);
+            }
+        }
+    };
+    
+    var clearProc = function(){
+        if(proc.id){
+            clearInterval(proc.id);
+        }
+        proc.id = 0;
+        proc.el = null;
+        proc.dir = "";
+    };
+    
+    var startProc = function(el, dir){
+        clearProc();
+        proc.el = el;
+        proc.dir = dir;
+        proc.id = setInterval(doScroll, Ext.dd.ScrollManager.frequency);
+    };
+    
+    var onFire = function(e, isDrop){
+        if(isDrop || !ddm.dragCurrent){ return; }
+        var dds = Ext.dd.ScrollManager;
+        if(!dragEl || dragEl != ddm.dragCurrent){
+            dragEl = ddm.dragCurrent;
+            // refresh regions on drag start
+            dds.refreshCache();
+        }
+        
+        var xy = Ext.lib.Event.getXY(e);
+        var pt = new Ext.lib.Point(xy[0], xy[1]);
+        for(var id in els){
+            var el = els[id], r = el._region;
+            if(r.contains(pt) && el.isScrollable()){
+                if(r.bottom - pt.y <= dds.thresh){
+                    if(proc.el != el){
+                        startProc(el, "down");
+                    }
+                    return;
+                }else if(r.right - pt.x <= dds.thresh){
+                    if(proc.el != el){
+                        startProc(el, "left");
+                    }
+                    return;
+                }else if(pt.y - r.top <= dds.thresh){
+                    if(proc.el != el){
+                        startProc(el, "up");
+                    }
+                    return;
+                }else if(pt.x - r.left <= dds.thresh){
+                    if(proc.el != el){
+                        startProc(el, "right");
+                    }
+                    return;
+                }
+            }
+        }
+        clearProc();
+    };
+    
+    ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm);
+    ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm);
+    
+    return {
+        /**
+         * Registers new overflow element(s) to auto scroll
+         * @param {String/HTMLElement/Element/Array} el The id of or the element to be scrolled or an array of either
+         */
+        register : function(el){
+            if(el instanceof Array){
+                for(var i = 0, len = el.length; i < len; i++) {
+                	this.register(el[i]);
+                }
+            }else{
+                el = Ext.get(el);
+                els[el.id] = el;
+            }
+        },
+        
+        /**
+         * Unregisters overflow element(s) so they are no longer scrolled
+         * @param {String/HTMLElement/Element/Array} el The id of or the element to be removed or an array of either
+         */
+        unregister : function(el){
+            if(el instanceof Array){
+                for(var i = 0, len = el.length; i < len; i++) {
+                	this.unregister(el[i]);
+                }
+            }else{
+                el = Ext.get(el);
+                delete els[el.id];
+            }
+        },
+        
+        /**
+         * The number of pixels from the edge of a container the pointer needs to be to 
+         * trigger scrolling (defaults to 25)
+         * @type Number
+         */
+        thresh : 25,
+        
+        /**
+         * The number of pixels to scroll in each scroll increment (defaults to 50)
+         * @type Number
+         */
+        increment : 100,
+        
+        /**
+         * The frequency of scrolls in milliseconds (defaults to 500)
+         * @type Number
+         */
+        frequency : 500,
+        
+        /**
+         * True to animate the scroll (defaults to true)
+         * @type Boolean
+         */
+        animate: true,
+        
+        /**
+         * The animation duration in seconds - 
+         * MUST BE less than Ext.dd.ScrollManager.frequency! (defaults to .4)
+         * @type Number
+         */
+        animDuration: .4,
+        
+        /**
+         * Manually trigger a cache refresh.
+         */
+        refreshCache : function(){
+            for(var id in els){
+                if(typeof els[id] == 'object'){ // for people extending the object prototype
+                    els[id]._region = els[id].getRegion();
+                }
+            }
+        }
+    };
+}();

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Separator.jss.html b/www/extras/yui-ext/docs/output/Separator.jss.html new file mode 100644 index 000000000..e5f14090b --- /dev/null +++ b/www/extras/yui-ext/docs/output/Separator.jss.html @@ -0,0 +1,33 @@ +Separator.js

Separator.js

/**
+ * @class Ext.menu.Separator
+ * @extends Ext.menu.BaseItem
+ * Adds a separator bar to a menu, used to divide logical groups of menu items. Generally you will
+ * add one of these by using "-" in you call to add() or in your items config rather than creating one directly.
+ * @constructor
+ * @param {Object} config Configuration options
+ */
+Ext.menu.Separator = function(config){
+    Ext.menu.Separator.superclass.constructor.call(this, config);
+};
+
+Ext.extend(Ext.menu.Separator, Ext.menu.BaseItem, {
+    /**
+     * @cfg {String} itemCls The default CSS class to use for separators (defaults to "x-menu-sep")
+     */
+    itemCls : "x-menu-sep",
+    /**
+     * @cfg {Boolean} hideOnClick True to hide the containing menu after this item is clicked (defaults to false)
+     */
+    hideOnClick : false,
+
+    // private
+    onRender : function(li){
+        var s = document.createElement("span");
+        s.className = this.itemCls;
+        s.innerHTML = "&#160;";
+        this.el = s;
+        li.addClass("x-menu-sep-li");
+        Ext.menu.Separator.superclass.onRender.apply(this, arguments);
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Shadow.jss.html b/www/extras/yui-ext/docs/output/Shadow.jss.html new file mode 100644 index 000000000..7b7cfaac8 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Shadow.jss.html @@ -0,0 +1,166 @@ +Shadow.js

Shadow.js

/**
+ * @class Ext.Shadow
+ * Simple class that can provide a shadow effect for any element.  Note that the element MUST be absolutely positioned,
+ * and the shadow does not provide any shimming.  This should be used only in simple cases -- for more advanced
+ * functionality that can also provide the same shadow effect, see the {@link Ext.Layer} class.
+ * @constructor
+ * Create a new Shadow
+ * @param {Object} config The config object
+ */
+Ext.Shadow = function(config){
+    Ext.apply(this, config);
+    if(typeof this.mode != "string"){
+        this.mode = this.defaultMode;
+    }
+    var o = this.offset, a = {h: 0};
+    switch(this.mode.toLowerCase()){
+        case "drop":
+            a.w = 0;
+            a.l = a.t = o;
+        break;
+        case "sides":
+            a.w = (o*2);
+            a.l = -o;
+            a.t = o;
+        break;
+        case "frame":
+            a.w = a.h = (o*2);
+            a.l = a.t = -o;
+        break;
+    };
+    this.adjusts = a;
+};
+
+Ext.Shadow.prototype = {
+    /**
+     * @cfg {String} mode
+     * The shadow display mode.  Supports the following options:
+     * <pre>
+Option   Description
+-------  ----------------------------------------------
+sides    Shadow displays on both sides and bottom only
+frame    Shadow displays equally on all four sides
+drop     Traditional bottom-right drop shadow
+</pre>
+     */
+// holder
+/***
+     * @cfg {String} offset
+     * The number of pixels to offset the shadow from the element (defaults to 4)
+     */
+    offset: 4,
+
+    // private
+    defaultMode: "drop",
+
+    /**
+     * Displays the shadow under the target element
+     * @param {String/HTMLElement/Element} targetEl The id or element under which the shadow should display
+     */
+    show : function(target){
+        target = Ext.get(target);
+        if(!this.el){
+            this.el = Ext.Shadow.Pool.pull();
+            if(this.el.dom.nextSibling != target.dom){
+                this.el.insertBefore(target);
+            }
+        }
+        this.el.setStyle("z-index", this.zIndex || parseInt(target.getStyle("z-index"), 10)-1);
+        if(Ext.isIE){
+            this.el.dom.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius="+this.offset+")";
+        }
+        this.realign(
+            target.getLeft(true),
+            target.getTop(true),
+            target.getWidth(),
+            target.getHeight()
+        );
+        this.el.dom.style.display = "block";
+    },
+
+    /**
+     * Returns true if the shadow is visible, else false
+     */
+    isVisible : function(){
+        return this.el ? true : false;  
+    },
+
+    /**
+     * Direct alignment when values are already available. Show must be called at least once before
+     * calling this method to ensure it is initialized.
+     * @param {Number} left The target element left position
+     * @param {Number} top The target element top position
+     * @param {Number} width The target element width
+     * @param {Number} height The target element height
+     */
+    realign : function(l, t, w, h){
+        if(!this.el){
+            return;
+        }
+        var a = this.adjusts, d = this.el.dom, s = d.style;
+        var iea = 0;
+        if(Ext.isIE){
+            iea = -(this.offset);
+        }
+        s.left = (l+a.l+iea)+"px";
+        s.top = (t+a.t+iea)+"px";
+        var sw = (w+a.w), sh = (h+a.h), sws = sw +"px", shs = sh + "px";
+        if(s.width != sws || s.height != shs){
+            s.width = sws;
+            s.height = shs;
+            if(!Ext.isIE){
+                var cn = d.childNodes;
+                var sww = Math.max(0, (sw-12))+"px";
+                cn[0].childNodes[1].style.width = sww;
+                cn[1].childNodes[1].style.width = sww;
+                cn[2].childNodes[1].style.width = sww;
+                cn[1].style.height = Math.max(0, (sh-12))+"px";
+            }
+        }
+    },
+
+    /**
+     * Hides this shadow
+     */
+    hide : function(){
+        if(this.el){
+            this.el.dom.style.display = "none";
+            Ext.Shadow.Pool.push(this.el);
+            delete this.el;
+        }
+    },
+
+    /**
+     * Adjust the z-index of this shadow
+     * @param {Number} zindex The new z-index
+     */
+    setZIndex : function(z){
+        this.zIndex = z;
+        if(this.el){
+            this.el.setStyle("z-index", z);
+        }
+    }
+};
+
+// Private utility class that manages the internal Shadow cache
+Ext.Shadow.Pool = function(){
+    var p = [];
+    var markup = Ext.isIE ?
+                 '<div class="x-ie-shadow"></div>' :
+                 '<div class="x-shadow"><div class="xst"><div class="xstl"></div><div class="xstc"></div><div class="xstr"></div></div><div class="xsc"><div class="xsml"></div><div class="xsmc"></div><div class="xsmr"></div></div><div class="xsb"><div class="xsbl"></div><div class="xsbc"></div><div class="xsbr"></div></div></div>';
+    return {
+        pull : function(){
+            var sh = p.shift();
+            if(!sh){
+                sh = Ext.get(Ext.DomHelper.insertHtml("beforeBegin", document.body.firstChild, markup));
+                sh.autoBoxAdjust = false;
+            }
+            return sh;
+        },
+
+        push : function(sh){
+            p.push(sh);
+        }
+    };
+}();

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/SimpleStore.jss.html b/www/extras/yui-ext/docs/output/SimpleStore.jss.html new file mode 100644 index 000000000..7eec6ef85 --- /dev/null +++ b/www/extras/yui-ext/docs/output/SimpleStore.jss.html @@ -0,0 +1,23 @@ +SimpleStore.js

SimpleStore.js

/**
+ * @class Ext.data.SimpleStore
+ * @extends Ext.data.Store
+ * Smaller help class to make creating Stores from Array data easier.
+ * @cfg {Number} id The index in the array that be used for record ids. Leave blank to auto generate ids.
+ * @cfg {Array} fields An standard field array consisting of string name or object literal field definitions
+ * @cfg {Array} data The multi-dimensional array of data
+ * @constructor
+ * @param {Object} config
+ */
+Ext.data.SimpleStore = function(config){
+    Ext.data.SimpleStore.superclass.constructor.call(this, {
+        reader: new Ext.data.ArrayReader({
+                id: config.id
+            },
+            Ext.data.Record.create(config.fields)
+        ),
+        proxy : new Ext.data.MemoryProxy(config.data)
+    });
+    this.load();
+};
+Ext.extend(Ext.data.SimpleStore, Ext.data.Store);

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/SortTypes.jss.html b/www/extras/yui-ext/docs/output/SortTypes.jss.html new file mode 100644 index 000000000..2e1af165e --- /dev/null +++ b/www/extras/yui-ext/docs/output/SortTypes.jss.html @@ -0,0 +1,88 @@ +SortTypes.js

SortTypes.js


+/**
+ * @class Ext.data.SortTypes
+ * @singleton
+ * Defines the default sorting (casting?) comparison functions used when sorting data.
+ */
+Ext.data.SortTypes = {
+    /**
+     * Default sort that does nothing
+     * @param {Mixed} s The value being converted
+     * @return {Mixed} The comparison value
+     */
+    none : function(s){
+        return s;
+    },
+    
+    /**
+     * The regular expression used to strip tags
+     * @type {RegExp}
+     * @property
+     */
+    stripTagsRE : /<\/?[^>]+>/gi,
+    
+    /**
+     * Strips all HTML tags to sort on text only
+     * @param {Mixed} s The value being converted
+     * @return {String} The comparison value
+     */
+    asText : function(s){
+        return String(s).replace(this.stripTagsRE, "");
+    },
+    
+    /**
+     * Strips all HTML tags to sort on text only - Case insensitive
+     * @param {Mixed} s The value being converted
+     * @return {String} The comparison value
+     */
+    asUCText : function(s){
+        return String(s).toUpperCase().replace(this.stripTagsRE, "");
+    },
+    
+    /**
+     * Case insensitive string
+     * @param {Mixed} s The value being converted
+     * @return {String} The comparison value
+     */
+    asUCString : function(s) {
+    	return String(s).toUpperCase();
+    },
+    
+    /**
+     * Date sorting
+     * @param {Mixed} s The value being converted
+     * @return {Number} The comparison value
+     */
+    asDate : function(s) {
+        if(!s){
+            return 0;
+        }
+        if(s instanceof Date){
+            return s.getTime();
+        }
+    	return Date.parse(String(s));
+    },
+    
+    /**
+     * Float sorting
+     * @param {Mixed} s The value being converted
+     * @return {Float} The comparison value
+     */
+    asFloat : function(s) {
+    	var val = parseFloat(String(s).replace(/,/g, ""));
+        if(isNaN(val)) val = 0;
+    	return val;
+    },
+    
+    /**
+     * Integer sorting
+     * @param {Mixed} s The value being converted
+     * @return {Number} The comparison value
+     */
+    asInt : function(s) {
+        var val = parseInt(String(s).replace(/,/g, ""));
+        if(isNaN(val)) val = 0;
+    	return val;
+    }
+};

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/SplitBar.jss.html b/www/extras/yui-ext/docs/output/SplitBar.jss.html new file mode 100644 index 000000000..60613d28a --- /dev/null +++ b/www/extras/yui-ext/docs/output/SplitBar.jss.html @@ -0,0 +1,431 @@ +SplitBar.js

SplitBar.js

/**
+ * @class Ext.SplitBar
+ * @extends Ext.util.Observable
+ * Creates draggable splitter bar functionality from two elements.
+ * <br><br>
+ * Usage:
+ * <pre><code>
+var split = new Ext.SplitBar("elementToDrag", "elementToSize",
+                   Ext.SplitBar.HORIZONTAL, Ext.SplitBar.LEFT);
+split.setAdapter(new Ext.SplitBar.AbsoluteLayoutAdapter("container"));
+split.minSize = 100;
+split.maxSize = 600;
+split.animate = true;
+split.on('moved', splitterMoved);
+</code></pre>
+ * @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 Ext.SplitBar.HORIZONTAL or Ext.SplitBar.VERTICAL. (Defaults to HORIZONTAL)
+ * @param {Number} placement (optional) Either Ext.SplitBar.LEFT or Ext.SplitBar.RIGHT for horizontal or  
+                        Ext.SplitBar.TOP or Ext.SplitBar.BOTTOM for vertical. (By default, this is determined automatically by the intial position 
+                        position of the SplitBar).
+ */
+Ext.SplitBar = function(dragElement, resizingElement, orientation, placement, existingProxy){
+    
+    /** @private */
+    this.el = Ext.get(dragElement, true);
+    this.el.dom.unselectable = "on";
+    /** @private */
+    this.resizingEl = Ext.get(resizingElement, true);
+
+    /**
+     * @private
+     * The orientation of the split. Either Ext.SplitBar.HORIZONTAL or 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 || 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;
+    
+    /**
+     * 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;
+    
+    if(!existingProxy){
+        /** @private */
+        this.proxy = Ext.SplitBar.createProxy(this.orientation);
+    }else{
+        this.proxy = Ext.get(existingProxy).dom;
+    }
+    /** @private */
+    this.dd = new Ext.dd.DDProxy(this.el.dom.id, "XSplitBars", {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 Ext.SplitBar.BasicLayoutAdapter();
+    this.adapter.init(this);
+    
+    if(this.orientation == Ext.SplitBar.HORIZONTAL){
+        /** @private */
+        this.placement = placement || (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT : Ext.SplitBar.RIGHT);
+        this.el.addClass("x-splitbar-h");
+    }else{
+        /** @private */
+        this.placement = placement || (this.el.getY() > this.resizingEl.getY() ? Ext.SplitBar.TOP : Ext.SplitBar.BOTTOM);
+        this.el.addClass("x-splitbar-v");
+    }
+    
+    this.addEvents({
+        /**
+         * @event resize
+         * Fires when the splitter is moved (alias for moved)
+         * @param {Ext.SplitBar} this
+         * @param {Number} newSize the new width or height
+         */
+        "resize" : true,
+        /**
+         * @event moved
+         * Fires when the splitter is moved
+         * @param {Ext.SplitBar} this
+         * @param {Number} newSize the new width or height
+         */
+        "moved" : true,
+        /**
+         * @event beforeresize
+         * Fires before the splitter is dragged
+         * @param {Ext.SplitBar} this
+         */
+        "beforeresize" : true,
+
+        "beforeapply" : true
+    });
+
+    Ext.SplitBar.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.SplitBar, Ext.util.Observable, {
+    onStartProxyDrag : function(x, y){
+        this.fireEvent("beforeresize", this);
+        if(!this.overlay){
+            var o = Ext.DomHelper.insertFirst(document.body,  {cls: "x-drag-overlay", html: "&#160;"}, true);
+            o.unselectable();
+            o.enableDisplayMode("block");
+            // all splitbars share the same overlay
+            Ext.SplitBar.prototype.overlay = o;
+        }
+        this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
+        this.overlay.show();
+        Ext.get(this.proxy).setDisplayed("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 == Ext.SplitBar.HORIZONTAL){
+            this.dd.resetConstraints();
+            this.dd.setXConstraint(
+                this.placement == Ext.SplitBar.LEFT ? c1 : c2, 
+                this.placement == Ext.SplitBar.LEFT ? c2 : c1
+            );
+            this.dd.setYConstraint(0, 0);
+        }else{
+            this.dd.resetConstraints();
+            this.dd.setXConstraint(0, 0);
+            this.dd.setYConstraint(
+                this.placement == Ext.SplitBar.TOP ? c1 : c2, 
+                this.placement == Ext.SplitBar.TOP ? c2 : c1
+            );
+         }
+        this.dragSpecs.startSize = size;
+        this.dragSpecs.startPoint = [x, y];
+        Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd, x, y);
+    },
+    
+    /** 
+     * @private Called after the drag operation by the DDProxy
+     */
+    onEndProxyDrag : function(e){
+        Ext.get(this.proxy).setDisplayed(false);
+        var endPoint = Ext.lib.Event.getXY(e);
+        if(this.overlay){
+            this.overlay.hide();
+        }
+        var newSize;
+        if(this.orientation == Ext.SplitBar.HORIZONTAL){
+            newSize = this.dragSpecs.startSize + 
+                (this.placement == Ext.SplitBar.LEFT ?
+                    endPoint[0] - this.dragSpecs.startPoint[0] :
+                    this.dragSpecs.startPoint[0] - endPoint[0]
+                );
+        }else{
+            newSize = this.dragSpecs.startSize + 
+                (this.placement == 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){
+            if(this.fireEvent('beforeapply', this, newSize) !== false){
+                this.adapter.setElementSize(this, newSize);
+                this.fireEvent("moved", this, newSize);
+                this.fireEvent("resize", 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;
+    },
+    
+    /**
+     * Destroy this splitbar. 
+     * @param {Boolean} removeEl True to remove the element
+     */
+    destroy : function(removeEl){
+        if(this.shim){
+            this.shim.remove();
+        }
+        this.dd.unreg();
+        this.proxy.parentNode.removeChild(this.proxy);
+        if(removeEl){
+            this.el.remove();
+        }
+    }
+});
+
+/**
+ * @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.
+ */
+Ext.SplitBar.createProxy = function(dir){
+    var proxy = new Ext.Element(document.createElement("div"));
+    proxy.unselectable();
+    var cls = 'x-splitbar-proxy';
+    proxy.addClass(cls + ' ' + (dir == Ext.SplitBar.HORIZONTAL ? cls +'-h' : cls + '-v'));
+    document.body.appendChild(proxy.dom);
+    return proxy.dom;
+};
+
+/** 
+ * @class 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.
+ */
+Ext.SplitBar.BasicLayoutAdapter = function(){
+};
+
+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 {Ext.SplitBar} s The SplitBar using this adapter
+     */
+     getElementSize : function(s){
+        if(s.orientation == 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 {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 == Ext.SplitBar.HORIZONTAL){
+            if(!s.animate){
+                s.resizingEl.setWidth(newSize);
+                if(onComplete){
+                    onComplete(s, newSize);
+                }
+            }else{
+                s.resizingEl.setWidth(newSize, true, .1, onComplete, 'easeOut');
+            }
+        }else{
+            
+            if(!s.animate){
+                s.resizingEl.setHeight(newSize);
+                if(onComplete){
+                    onComplete(s, newSize);
+                }
+            }else{
+                s.resizingEl.setHeight(newSize, true, .1, onComplete, 'easeOut');
+            }
+        }
+    }
+};
+
+/** 
+ *@class Ext.SplitBar.AbsoluteLayoutAdapter
+ * @extends 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.
+ */
+Ext.SplitBar.AbsoluteLayoutAdapter = function(container){
+    this.basic = new Ext.SplitBar.BasicLayoutAdapter();
+    this.container = Ext.get(container);
+};
+
+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 = 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
+ */
+Ext.SplitBar.VERTICAL = 1;
+
+/**
+ * Orientation constant - Create a horizontal SplitBar
+ * @static
+ * @type Number
+ */
+Ext.SplitBar.HORIZONTAL = 2;
+
+/**
+ * Placement constant - The resizing element is to the left of the splitter element
+ * @static
+ * @type Number
+ */
+Ext.SplitBar.LEFT = 1;
+
+/**
+ * Placement constant - The resizing element is to the right of the splitter element
+ * @static
+ * @type Number
+ */
+Ext.SplitBar.RIGHT = 2;
+
+/**
+ * Placement constant - The resizing element is positioned above the splitter element
+ * @static
+ * @type Number
+ */
+Ext.SplitBar.TOP = 3;
+
+/**
+ * Placement constant - The resizing element is positioned under splitter element
+ * @static
+ * @type Number
+ */
+Ext.SplitBar.BOTTOM = 4;
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/SplitLayoutRegion.jss.html b/www/extras/yui-ext/docs/output/SplitLayoutRegion.jss.html new file mode 100644 index 000000000..e9a6fea2c --- /dev/null +++ b/www/extras/yui-ext/docs/output/SplitLayoutRegion.jss.html @@ -0,0 +1,326 @@ +SplitLayoutRegion.js

SplitLayoutRegion.js

/**
+ * @class Ext.SplitLayoutRegion
+ * @extends Ext.LayoutRegion
+ * Adds a splitbar and other (private) useful functionality to a LayoutRegion
+ */
+Ext.SplitLayoutRegion = function(mgr, config, pos, cursor){
+    this.cursor = cursor;
+    Ext.SplitLayoutRegion.superclass.constructor.call(this, mgr, config, pos);
+};
+
+Ext.extend(Ext.SplitLayoutRegion, Ext.LayoutRegion, {
+    splitTip : "Drag to resize.",
+    collapsibleSplitTip : "Drag to resize. Double click to hide.",
+    useSplitTips : false,
+
+    applyConfig : function(config){
+        Ext.SplitLayoutRegion.superclass.applyConfig.call(this, config);
+        if(config.split){
+            if(!this.split){
+                var splitEl = Ext.DomHelper.append(this.mgr.el.dom, 
+                        {tag: "div", id: this.el.id + "-split", cls: "x-layout-split x-layout-split-"+this.position, html: "&#160;"});
+                /** The SplitBar for this region @type Ext.SplitBar */
+                this.split = new Ext.SplitBar(splitEl, this.el, this.orientation);
+                this.split.on("moved", this.onSplitMove, this);
+                this.split.useShim = config.useShim === true;
+                this.split.getMaximumSize = this[this.position == 'north' || this.position == 'south' ? 'getVMaxSize' : 'getHMaxSize'].createDelegate(this);
+                if(this.useSplitTips){
+                    this.split.el.dom.title = config.collapsible ? this.collapsibleSplitTip : this.splitTip;
+                }
+                if(config.collapsible){
+                    this.split.el.on("dblclick", this.collapse,  this);
+                }
+            }
+            if(typeof config.minSize != "undefined"){
+                this.split.minSize = config.minSize;
+            }
+            if(typeof config.maxSize != "undefined"){
+                this.split.maxSize = config.maxSize;
+            }
+            if(config.hideWhenEmpty || config.hidden){
+                this.hideSplitter();
+            }
+        }
+    },
+
+    getHMaxSize : 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());
+    },
+
+    getVMaxSize : function(){
+         var cmax = this.config.maxSize || 10000;
+         var center = this.mgr.getRegion("center");
+         return Math.min(cmax, (this.el.getHeight()+center.getEl().getHeight())-center.getMinHeight());
+    },
+
+    onSplitMove : function(split, newSize){
+        this.fireEvent("resized", this, newSize);
+    },
+    
+    /** 
+     * Returns the SplitBar for this region.
+     * @return {Ext.SplitBar}
+     */
+    getSplitBar : function(){
+        return this.split;
+    },
+    
+    hide : function(){
+        this.hideSplitter();
+        Ext.SplitLayoutRegion.superclass.hide.call(this);
+    },
+
+    hideSplitter : function(){
+        if(this.split){
+            this.split.el.setLocation(-2000,-2000);
+            this.split.el.hide();
+        }
+    },
+
+    show : function(){
+        if(this.split){
+            this.split.el.show();
+        }
+        Ext.SplitLayoutRegion.superclass.show.call(this);
+    },
+    
+    beforeSlide: function(){
+        if(Ext.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(Ext.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();
+                }
+            }
+        }
+    },
+
+    initAutoHide : function(){
+        if(this.autoHide !== false){
+            if(!this.autoHideHd){
+                var st = new Ext.util.DelayedTask(this.slideIn, this);
+                this.autoHideHd = {
+                    "mouseout": function(e){
+                        if(!e.within(this.el, true)){
+                            st.delay(500);
+                        }
+                    },
+                    "mouseover" : function(e){
+                        st.cancel();
+                    },
+                    scope : this
+                };
+            }
+            this.el.on(this.autoHideHd);
+        }
+    },
+
+    clearAutoHide : function(){
+        if(this.autoHide !== false){
+            this.el.un("mouseout", this.autoHideHd.mouseout);
+            this.el.un("mouseover", this.autoHideHd.mouseover);
+        }
+    },
+
+    clearMonitor : function(){
+        Ext.get(document).un("click", this.slideInIf, this);
+    },
+
+    // these names are backwards but not changed for compat
+    slideOut : function(){
+        if(this.isSlid || this.el.hasActiveFx()){
+            return;
+        }
+        this.isSlid = true;
+        if(this.collapseBtn){
+            this.collapseBtn.hide();
+        }
+        this.closeBtnState = this.closeBtn.getStyle('display');
+        this.closeBtn.hide();
+        if(this.stickBtn){
+            this.stickBtn.show();
+        }
+        this.el.show();
+        this.el.alignTo(this.collapsedEl, this.getCollapseAnchor());
+        this.beforeSlide();
+        this.el.setStyle("z-index", 20000);
+        this.el.slideIn(this.getSlideAnchor(), {
+            callback: function(){
+                this.afterSlide();
+                this.initAutoHide();
+                Ext.get(document).on("click", this.slideInIf, this);
+                this.fireEvent("slideshow", this);
+            },
+            scope: this,
+            block: true
+        });
+    },
+
+    afterSlideIn : function(){
+        this.clearAutoHide();
+        this.isSlid = false;
+        this.clearMonitor();
+        this.el.setStyle("z-index", "");
+        if(this.collapseBtn){
+            this.collapseBtn.show();
+        }
+        this.closeBtn.setStyle('display', this.closeBtnState);
+        if(this.stickBtn){
+            this.stickBtn.hide();
+        }
+        this.fireEvent("slidehide", this);
+    },
+
+    slideIn : function(cb){
+        if(!this.isSlid || this.el.hasActiveFx()){
+            Ext.callback(cb);
+            return;
+        }
+        this.isSlid = false;
+        this.beforeSlide();
+        this.el.slideOut(this.getSlideAnchor(), {
+            callback: function(){
+                this.el.setLeftTop(-10000, -10000);
+                this.afterSlide();
+                this.afterSlideIn();
+                Ext.callback(cb);
+            },
+            scope: this,
+            block: true
+        });
+    },
+    
+    slideInIf : function(e){
+        if(!e.within(this.el)){
+            this.slideIn();
+        }
+    },
+
+    animateCollapse : function(){
+        this.beforeSlide();
+        this.el.setStyle("z-index", 20000);
+        var anchor = this.getSlideAnchor();
+        this.el.slideOut(anchor, {
+            callback : function(){
+                this.el.setStyle("z-index", "");
+                this.collapsedEl.slideIn(anchor, {duration:.3});
+                this.afterSlide();
+                this.el.setLocation(-10000,-10000);
+                this.el.hide();
+                this.fireEvent("collapsed", this);
+            },
+            scope: this,
+            block: true
+        });
+    },
+
+    animateExpand : function(){
+        this.beforeSlide();
+        this.el.alignTo(this.collapsedEl, this.getCollapseAnchor(), this.getExpandAdj());
+        this.el.setStyle("z-index", 20000);
+        this.collapsedEl.hide({
+            duration:.1
+        });
+        this.el.slideIn(this.getSlideAnchor(), {
+            callback : function(){
+                this.el.setStyle("z-index", "");
+                this.afterSlide();
+                if(this.split){
+                    this.split.el.show();
+                }
+                this.fireEvent("invalidated", this);
+                this.fireEvent("expanded", this);
+            },
+            scope: this,
+            block: true
+        });
+    },
+
+    anchors : {
+        "west" : "left",
+        "east" : "right",
+        "north" : "top",
+        "south" : "bottom"
+    },
+
+    sanchors : {
+        "west" : "l",
+        "east" : "r",
+        "north" : "t",
+        "south" : "b"
+    },
+
+    canchors : {
+        "west" : "tl-tr",
+        "east" : "tr-tl",
+        "north" : "tl-bl",
+        "south" : "bl-tl"
+    },
+
+    getAnchor : function(){
+        return this.anchors[this.position];
+    },
+
+    getCollapseAnchor : function(){
+        return this.canchors[this.position];
+    },
+
+    getSlideAnchor : function(){
+        return this.sanchors[this.position];
+    },
+
+    getAlignAdj : function(){
+        var cm = this.cmargins;
+        switch(this.position){
+            case "west":
+                return [0, 0];
+            break;
+            case "east":
+                return [0, 0];
+            break;
+            case "north":
+                return [0, 0];
+            break;
+            case "south":
+                return [0, 0];
+            break;
+        }
+    },
+
+    getExpandAdj : function(){
+        var c = this.collapsedEl, cm = this.cmargins;
+        switch(this.position){
+            case "west":
+                return [-(cm.right+c.getWidth()+cm.left), 0];
+            break;
+            case "east":
+                return [cm.right+c.getWidth()+cm.left, 0];
+            break;
+            case "north":
+                return [0, -(cm.top+cm.bottom+c.getHeight())];
+            break;
+            case "south":
+                return [0, cm.top+cm.bottom+c.getHeight()];
+            break;
+        }
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/State.jss.html b/www/extras/yui-ext/docs/output/State.jss.html new file mode 100644 index 000000000..bd8b38b4e --- /dev/null +++ b/www/extras/yui-ext/docs/output/State.jss.html @@ -0,0 +1,279 @@ +State.js

State.js

/**
+ * @class Ext.state.Provider
+ * Abstract base class for state provider implementations. This class provides methods
+ * for encoding and decoding <b>typed</b> variables including dates and defines the 
+ * Provider interface.
+ */
+Ext.state.Provider = function(){
+    Ext.state.Provider.superclass.constructor.call(this);
+    /**
+     * @event statechange
+     * Fires when a state change occurs.
+     * @param {Provider} this This state provider
+     * @param {String} key The state key which was changed
+     * @param {String} value The encoded value for the state
+     */
+    this.addEvents({
+        "statechange": true
+    });
+    this.state = {};
+    Ext.state.Provider.superclass.constructor.call(this);
+};
+Ext.extend(Ext.state.Provider, Ext.util.Observable, {
+    /**
+     * Returns the current value for a key
+     * @param {String} name The key name
+     * @param {Mixed} defaultValue A default value to return if the key's value is not found
+     * @return {Mixed} The state data
+     */
+    get : function(name, defaultValue){
+        return typeof this.state[name] == "undefined" ?
+            defaultValue : this.state[name];
+    },
+    
+    /**
+     * Clears a value from the state
+     * @param {String} name The key name
+     */
+    clear : function(name){
+        delete this.state[name];
+        this.fireEvent("statechange", this, name, null);
+    },
+    
+    /**
+     * Sets the value for a key
+     * @param {String} name The key name
+     * @param {Mixed} value The value to set
+     */
+    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 The value to decode
+     * @return {Mixed} The decoded 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;
+        }
+    },
+    
+    /**
+     * Encodes a value including type information.  Decode with {@link #decodeValue}.
+     * @param {Mixed} value The value to encode
+     * @return {String} The encoded value
+     */
+    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 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(){
+   Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
+   ...
+   // supposed you have a {@link Ext.BorderLayout}
+   var layout = new Ext.BorderLayout(...);
+   layout.restoreState();
+   // or a {Ext.BasicDialog}
+   var dialog = new Ext.BasicDialog(...);
+   dialog.restoreState();
+ </code></pre>
+ * @singleton
+ */
+Ext.state.Manager = function(){
+    var provider = new Ext.state.Provider();
+    
+    return {
+        /**
+         * Configures the default state provider for your application
+         * @param {Provider} stateProvider The state provider to set
+         */
+        setProvider : function(stateProvider){
+            provider = stateProvider;
+        },
+        
+        /**
+         * Returns the current value for a key
+         * @param {String} name The key name
+         * @param {Mixed} defaultValue The default value to return if the key lookup does not match
+         * @return {Mixed} The state data
+         */
+        get : function(key, defaultValue){
+            return provider.get(key, defaultValue);
+        },
+        
+        /**
+         * Sets the value for a key
+         * @param {String} name The key name
+         * @param {Mixed} value The state data
+         */
+         set : function(key, value){
+            provider.set(key, value);
+        },
+        
+        /**
+         * Clears a value from the state
+         * @param {String} name The key name
+         */
+        clear : function(key){
+            provider.clear(key);
+        },
+        
+        /**
+         * Gets the currently configured state provider
+         * @return {Provider} The state provider
+         */
+        getProvider : function(){
+            return provider;
+        }
+    };
+}();
+
+/**
+ * @class Ext.state.CookieProvider
+ * @extends Ext.state.Provider
+ * The default Provider implementation which saves state via cookies.
+ * <br />Usage:
+ <pre><code>
+   var cp = new Ext.state.CookieProvider({
+       path: "/cgi-bin/",
+       expires: new Date(new Date().getTime()+(1000*60*60*24*30)); //30 days
+       domain: "extjs.com"
+   })
+   Ext.state.Manager.setProvider(cp);
+ </code></pre>
+ * @cfg {String} path The path for which the cookie is active (defaults to root '/' which makes it active for all pages in the site)
+ * @cfg {Date} expires The cookie expiration date (defaults to 7 days from now)
+ * @cfg {String} domain The domain to save the cookie for.  Note that you cannot specify a different domain than
+ * your page is on, but you can specify a sub-domain, or simply the domain itself like 'extjs.com' to include
+ * all sub-domains if you need to access cookies across different sub-domains (defaults to null which uses the same
+ * domain the page is running on including the 'www' like 'www.extjs.com')
+ * @cfg {Boolean} secure True if the site is using SSL (defaults to false)
+ * @constructor
+ * Create a new CookieProvider
+ * @param {Object} config The configuration object
+ */
+Ext.state.CookieProvider = function(config){
+    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;
+    Ext.apply(this, config);
+    this.state = this.readCookies();
+};
+
+Ext.extend(Ext.state.CookieProvider, Ext.state.Provider, {
+    // private
+    set : function(name, value){
+        if(typeof value == "undefined" || value === null){
+            this.clear(name);
+            return;
+        }
+        this.setCookie(name, value);
+        Ext.state.CookieProvider.superclass.set.call(this, name, value);
+    },
+
+    // private
+    clear : function(name){
+        this.clearCookie(name);
+        Ext.state.CookieProvider.superclass.clear.call(this, name);
+    },
+
+    // private
+    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;
+    },
+
+    // private
+    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" : "");
+    },
+
+    // private
+    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" : "");
+    }
+});
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/StatusProxy.jss.html b/www/extras/yui-ext/docs/output/StatusProxy.jss.html new file mode 100644 index 000000000..4a44c5b80 --- /dev/null +++ b/www/extras/yui-ext/docs/output/StatusProxy.jss.html @@ -0,0 +1,161 @@ +StatusProxy.js

StatusProxy.js

/**
+ * @class Ext.dd.StatusProxy
+ * A specialized drag proxy that supports a drop status icon, {@link Ext.Layer} styles and auto-repair.  This is the
+ * default drag proxy used by all Ext.dd components.
+ * @constructor
+ * @param {Object} config
+ */
+Ext.dd.StatusProxy = function(config){
+    Ext.apply(this, config);
+    this.id = this.id || Ext.id();
+    this.el = new Ext.Layer({
+        dh: {
+            id: this.id, tag: "div", cls: "x-dd-drag-proxy "+this.dropNotAllowed, children: [
+                {tag: "div", cls: "x-dd-drop-icon"},
+                {tag: "div", cls: "x-dd-drag-ghost"}
+            ]
+        }, 
+        shadow: !config || config.shadow !== false
+    });
+    this.ghost = Ext.get(this.el.dom.childNodes[1]);
+    this.dropStatus = this.dropNotAllowed;
+};
+
+Ext.dd.StatusProxy.prototype = {
+    /**
+     * @cfg {String} dropAllowed
+     * The CSS class to apply to the status element when drop is allowed (defaults to "x-dd-drop-ok").
+     */
+    dropAllowed : "x-dd-drop-ok",
+    /**
+     * @cfg {String} dropNotAllowed
+     * The CSS class to apply to the status element when drop is not allowed (defaults to "x-dd-drop-nodrop").
+     */
+    dropNotAllowed : "x-dd-drop-nodrop",
+
+    /**
+     * Updates the proxy's visual element to indicate the status of whether or not drop is allowed
+     * over the current target element.
+     * @param {String} cssClass The css class for the new drop status indicator image
+     */
+    setStatus : function(cssClass){
+        cssClass = cssClass || this.dropNotAllowed;
+        if(this.dropStatus != cssClass){
+            this.el.replaceClass(this.dropStatus, cssClass);
+            this.dropStatus = cssClass;
+        }
+    },
+
+    /**
+     * Resets the status indicator to the default dropNotAllowed value
+     * @param {Boolean} clearGhost True to also remove all content from the ghost, false to preserve it
+     */
+    reset : function(clearGhost){
+        this.el.dom.className = "x-dd-drag-proxy " + this.dropNotAllowed;
+        this.dropStatus = this.dropNotAllowed;
+        if(clearGhost){
+            this.ghost.update("");
+        }
+    },
+
+    /**
+     * Updates the contents of the ghost element
+     * @param {String} html The html that will replace the current innerHTML of the ghost element
+     */
+    update : function(html){
+        if(typeof html == "string"){
+            this.ghost.update(html);
+        }else{
+            this.ghost.update("");
+            html.style.margin = "0";
+            this.ghost.dom.appendChild(html);
+        }        
+    },
+
+    /**
+     * Returns the underlying proxy {@link Ext.Layer}
+     * @return {Ext.Layer} el
+    */
+    getEl : function(){
+        return this.el;
+    },
+
+    /**
+     * Returns the ghost element
+     * @return {Ext.Element} el
+     */
+    getGhost : function(){
+        return this.ghost;
+    },
+
+    /**
+     * Hides the proxy
+     * @param {Boolean} clear True to reset the status and clear the ghost contents, false to preserve them
+     */
+    hide : function(clear){
+        this.el.hide();
+        if(clear){
+            this.reset(true);
+        }
+    },
+
+    /**
+     * Stops the repair animation if it's currently running
+     */
+    stop : function(){
+        if(this.anim && this.anim.isAnimated && this.anim.isAnimated()){
+            this.anim.stop();
+        }
+    },
+
+    /**
+     * Displays this proxy
+     */
+    show : function(){
+        this.el.show();
+    },
+
+    /**
+     * Force the Layer to sync its shadow and shim positions to the element
+     */
+    sync : function(){
+        this.el.sync();
+    },
+
+    /**
+     * Causes the proxy to return to its position of origin via an animation.  Should be called after an
+     * invalid drop operation by the item being dragged.
+     * @param {Array} xy The XY position of the element ([x, y])
+     * @param {Function} callback The function to call after the repair is complete
+     * @param {Object} scope The scope in which to execute the callback
+     */
+    repair : function(xy, callback, scope){
+        this.callback = callback;
+        this.scope = scope;
+        if(xy && this.animRepair !== false){
+            this.el.addClass("x-dd-drag-repair");
+            this.el.hideUnders(true);
+            this.anim = this.el.shift({
+                duration: this.repairDuration || .5,
+                easing: 'easeOut',
+                xy: xy,
+                stopFx: true,
+                callback: this.afterRepair,
+                scope: this
+            });
+        }else{
+            this.afterRepair();
+        }
+    },
+
+    // private
+    afterRepair : function(){
+        this.hide(true);
+        if(typeof this.callback == "function"){
+            this.callback.call(this.scope || this);
+        }
+        this.callback == null;
+        this.scope == null;
+    }
+};

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Store.jss.html b/www/extras/yui-ext/docs/output/Store.jss.html new file mode 100644 index 000000000..62af3b249 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Store.jss.html @@ -0,0 +1,523 @@ +Store.js

Store.js

/**
+ * @class Ext.data.Store
+ * @extends Ext.util.Observable
+ * The Store class encapsulates a client side cache of {@link Ext.data.Record} objects which provide input data
+ * for widgets such as the Ext.grid.Grid, or the Ext.form.ComboBox.
+ * A Store object uses an implementation of {@link Ext.data.DataProxy} to access a data object unless you call loadData() directly and pass in your data. The Store object
+ * has no knowledge of the format of the data returned by the Proxy.
+ * The Store object uses its configured implementation of Ext.data.DataReader to create Ext.data.Record
+ * instances from the data object. These records are cached and made available through accessor functions.
+ * @constructor
+ * Creates a new Store
+ * @param {Object} config A config object containing the objects needed for the Store to access data,
+ * and read the data into Records.
+ */
+Ext.data.Store = function(config){
+    this.data = new Ext.util.MixedCollection(false);
+    this.data.getKey = function(o){
+        return o.id;
+    };
+    this.baseParams = {};
+    this.paramNames = {
+        "start" : "start",
+        "limit" : "limit",
+        "sort" : "sort",
+        "dir" : "dir"
+    };
+    Ext.apply(this, config);
+
+    if(this.reader && !this.recordType){ // reader passed
+        this.recordType = this.reader.recordType;
+    }
+
+    this.fields = this.recordType.prototype.fields;
+
+    this.modified = [];
+
+    this.addEvents({
+        /**
+         * @event datachanged
+         * Fires when the data cache has changed, and a widget which is using this Store
+         * as a Record cache should refresh its view.
+         * @param {Store} this
+         */
+        datachanged : true,
+        /**
+         * @event add
+         * Fires when Records have been added to the Store
+         * @param {Store} this
+         * @param {Ext.data.Record[]} records The array of Records added
+         * @param {Number} index The index at which the record(s) were added
+         */
+        add : true,
+        /**
+         * @event remove
+         * Fires when Records have been removed from the Store
+         * @param {Store} this
+         * @param {Ext.data.Record} record The Record that was removed
+         * @param {Number} index The index at which the record was removed
+         */
+        remove : true,
+        /**
+         * @event update
+         * Fires when Records have been updated
+         * @param {Store} this
+         * @param {Ext.data.Record} record The Record that was updated
+         * @param {String} operation The update operation being performed.  Value may be one of:
+         * <pre><code>
+ Ext.data.Record.EDIT
+ Ext.data.Record.REJECT
+ Ext.data.Record.COMMIT
+         * </code></pre>
+         */
+        update : true,
+        /**
+         * @event clear
+         * Fires when the data cache has been cleared.
+         * @param {Store} this
+         */
+        clear : true,
+        /**
+         * @event beforeload
+         * Fires before a request is made for a new data object.  If the beforeload handler returns false
+         * the load action will be canceled.
+         * @param {Store} this
+         * @param {Object} options The loading options that were specified (see {@link #load} for details)
+         */
+        beforeload : true,
+        /**
+         * @event load
+         * Fires after a new set of Records has been loaded.
+         * @param {Store} this
+         * @param {Ext.data.Record[]} records The Records that were loaded
+         * @param {Object} options The loading options that were specified (see {@link #load} for details)
+         */
+        load : true,
+        /**
+         * @event loadexception
+         * Fires if an exception occurs in the Proxy during loading.
+         * Called with the signature of the Proxy's "loadexception" event.
+         */
+        loadexception : true
+    });
+
+    if(this.proxy){
+        this.relayEvents(this.proxy,  ["loadexception"]);
+    }
+    this.sortToggle = {};
+    
+    Ext.data.Store.superclass.constructor.call(this);
+};
+Ext.extend(Ext.data.Store, Ext.util.Observable, {
+    /**
+    * @cfg {Ext.data.DataProxy} proxy The Proxy object which provides access to a data object.
+    */
+// holder
+/***
+    * @cfg {Ext.data.Reader} reader The Reader object which processes the data object and returns
+    * an Array of Ext.data.record objects which are cached keyed by their <em>id</em> property.
+    */
+// holder
+/***
+    * @cfg {Object} baseParams An object containing properties which are to be sent as parameters
+    * on any HTTP request
+    */
+// holder
+/***
+    * @cfg {Object} sortInfo A config object in the format: {field: "fieldName", direction: "ASC|DESC"}
+    */
+// holder
+/***
+    * @cfg {boolean} remoteSort True if sorting is to be handled by requesting the Proxy to provide a refreshed
+    * version of the data object in sorted order, as opposed to sorting the Record cache in place (defaults to false).
+    */
+    remoteSort : false,
+
+    // private
+    lastOptions : null,
+
+    /**
+     * Add Records to the Store and fires the add event.
+     * @param {Ext.data.Record[]} records An Array of Ext.data.Record objects to add to the cache.
+     */
+    add : function(records){
+        records = [].concat(records);
+        for(var i = 0, len = records.length; i < len; i++){
+            records[i].join(this);
+        }
+        var index = this.data.length;
+        this.data.addAll(records);
+        this.fireEvent("add", this, records, index);
+    },
+
+    /**
+     * Remove a Record from the Store and fires the remove event.
+     * @param {Ext.data.Record} record Th Ext.data.Record object to remove from the cache.
+     */
+    remove : function(record){
+        var index = this.data.indexOf(record);
+        this.data.removeAt(index);
+        this.fireEvent("remove", this, record, index);
+    },
+
+    /**
+     * Remove all Records from the Store and fires the clear event.
+     */
+    removeAll : function(){
+        this.data.clear();
+        this.fireEvent("clear", this);
+    },
+
+    /**
+     * Inserts Records to the Store at the given index and fires the add event.
+     * @param {Number} index The start index at which to insert the passed Records.
+     * @param {Ext.data.Record[]} records An Array of Ext.data.Record objects to add to the cache.
+     */
+    insert : function(index, records){
+        records = [].concat(records);
+        for(var i = 0, len = records.length; i < len; i++){
+            this.data.insert(index, records[i]);
+            records[i].join(this);
+        }
+        this.fireEvent("add", this, records, index);
+    },
+
+    /**
+     * Get the index within the cache of the passed Record.
+     * @param {Ext.data.Record[]} records An Array of Ext.data.Record objects to add to the cache.
+     * @return {Number} The index of the passed Record. Returns -1 if not found.
+     */
+    indexOf : function(record){
+        return this.data.indexOf(record);
+    },
+
+    /**
+     * Get the index within the cache of the Record with the passed id.
+     * @param {String} id The id of the Record to find.
+     * @return {Number} The index of the Record. Returns -1 if not found.
+     */
+    indexOfId : function(id){
+        return this.data.indexOfKey(id);
+    },
+
+    /**
+     * Get the Record with the specified id.
+     * @param {String} id The id of the Record to find.
+     * @return {Ext.data.Record} The Record with the passed id. Returns undefined if not found.
+     */
+    getById : function(id){
+        return this.data.key(id);
+    },
+
+    /**
+     * Get the Record at the specified index.
+     * @param {String} index The index of the Record to find.
+     * @return {Ext.data.Record} The Record at the passed index. Returns undefined if not found.
+     */
+    getAt : function(index){
+        return this.data.itemAt(index);
+    },
+
+    /**
+     * Returns a range of Records between specified indices.
+     * @param {Number} startIndex (optional) The starting index (defaults to 0)
+     * @param {Number} endIndex (optional) The ending index (defaults to the last Record in the Store)
+     * @return {Ext.data.Record[]} An array of Records
+     */
+    getRange : function(start, end){
+        return this.data.getRange(start, end);
+    },
+
+    // private
+    storeOptions : function(o){
+        o = Ext.apply({}, o);
+        delete o.callback;
+        delete o.scope;
+        this.lastOptions = o;
+    },
+
+    /**
+     * Loads the Record cache from the configured Proxy using the configured Reader.
+     * <p>
+     * If using remote paging, then the first load call must specify the <em>start</em>
+     * and <em>limit</em> properties in the options.params property to establish the initial
+     * position within the dataset, and the number of Records to cache on each read from the Proxy.
+     * <p>
+     * <strong>It is important to note that for remote data sources, loading is asynchronous,
+     * and this call will return before the new data has been loaded. Perform any post-processing
+     * in a callback function, or in a "load" event handler.</strong>
+     * <p>
+     * @param {Object} options An object containing properties which control loading options:
+     * <pre><code>
+ params {Object} An object containing properties to pass as HTTP parameters to a remote data source.
+ callback {Function} A function to be called after the Records have been loaded. The callback is
+ passed the following arguments:
+   r : Ext.data.Record[]
+   options: Options object from the load call
+   success: Boolean success indicator
+ scope {Object} Scope with which to call the callback (defaults to the Store object)
+ append {Boolean} indicator to append loaded records rather than replace the current cache.
+ * </code></pre>
+     */
+    load : function(options){
+        options = options || {};
+        if(this.fireEvent("beforeload", this, options) !== false){
+            this.storeOptions(options);
+            var p = Ext.apply(options.params || {}, this.baseParams);
+            if(this.sortInfo && this.remoteSort){
+                var pn = this.paramNames;
+                p[pn["sort"]] = this.sortInfo.field;
+                p[pn["dir"]] = this.sortInfo.direction;
+            }
+            this.proxy.load(p, this.reader, this.loadRecords, this, options);
+        }
+    },
+
+    /**
+     * Reloads the Record cache from the configured Proxy using the configured Reader and
+     * the options from the last load operation performed.
+     * @param {Object} options (optional) An object containing properties which may override the options
+     * used in the last load operation. See {@link #load} for details (defaults to null, in which case
+     * the most recently used options are reused).
+     */
+    reload : function(options){
+        this.load(Ext.applyIf(options||{}, this.lastOptions));
+    },
+
+    // private
+    // Called as a callback by the Reader during a load operation.
+    loadRecords : function(o, options, success){
+        if(!o || success === false){
+            if(success !== false){
+                this.fireEvent("load", this, [], options);
+            }
+            if(options.callback){
+                options.callback.call(options.scope || this, [], options, false);
+            }
+            return;
+        }
+        var r = o.records, t = o.totalRecords || r.length;
+        for(var i = 0, len = r.length; i < len; i++){
+            r[i].join(this);
+        }
+        if(!options || options.add !== true){
+            this.data.clear();
+            this.data.addAll(r);
+            this.totalLength = t;
+            this.applySort();
+            this.fireEvent("datachanged", this);
+        }else{
+            this.totalLength = Math.max(t, this.data.length+r.length);
+            this.data.addAll(r);
+        }
+        this.fireEvent("load", this, r, options);
+        if(options.callback){
+            options.callback.call(options.scope || this, r, options, true);
+        }
+    },
+
+    /**
+     * Loads data from a passed data block. A Reader which understands the format of the data
+     * must have been configured in the constructor.
+     * @param {Object} data The data block from which to read the Records.  The format of the data expected
+     * is dependent on the type of Reader that is configured and should correspond to that Reader's readRecords parameter.
+     * @param {Boolean} append (Optional) True to append the new Records rather than replace the existing cache.
+     */
+    loadData : function(o, append){
+        var r = this.reader.readRecords(o);
+        this.loadRecords(r, {add: append}, true);
+    },
+
+    /**
+     * Gets the number of cached records.
+     * <p>
+     * <em>If using paging, this may not be the total size of the dataset. If the data object
+     * used by the Reader contains the dataset size, then the getTotalCount() function returns
+     * the data set size</em>
+     */
+    getCount : function(){
+        return this.data.length || 0;
+    },
+
+    /**
+     * Gets the total number of records in the dataset.
+     * <p>
+     * <em>If using paging, for this to be accurate, the data object used by the Reader must contain
+     * the dataset size</em>
+     */
+    getTotalCount : function(){
+        return this.totalLength || 0;
+    },
+
+    /**
+     * Returns the sort state of the Store as an object with two properties:
+     * <pre><code>
+ field {String} The name of the field by which the Records are sorted
+ direction {String} The sort order, "ASC" or "DESC"
+     * </code></pre>
+     */
+    getSortState : function(){
+        return this.sortInfo;
+    },
+
+    // private
+    applySort : function(){
+        if(this.sortInfo && !this.remoteSort){
+            var s = this.sortInfo, f = s.field;
+            var st = this.fields.get(f).sortType;
+            var fn = function(r1, r2){
+                var v1 = st(r1.data[f]), v2 = st(r2.data[f]);
+                return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);
+            };
+            this.data.sort(s.direction, fn);
+            if(this.snapshot && this.snapshot != this.data){
+                this.snapshot.sort(s.direction, fn);
+            }
+        }
+    },
+
+    /**
+     * Sets the default sort column and order to be used by the next load operation.
+     * @param {String} fieldName The name of the field to sort by.
+     * @param {String} dir (optional) The sort order, "ASC" or "DESC" (defaults to "ASC")
+     */
+    setDefaultSort : function(field, dir){
+        this.sortInfo = {field: field, direction: dir ? dir.toUpperCase() : "ASC"};
+    },
+
+    /**
+     * Sort the Records.
+     * If remote sorting is used, the sort is performed on the server, and the cache is
+     * reloaded. If local sorting is used, the cache is sorted internally.
+     * @param {String} fieldName The name of the field to sort by.
+     * @param {String} dir (optional) The sort order, "ASC" or "DESC" (defaults to "ASC")
+     */
+    sort : function(fieldName, dir){
+        var f = this.fields.get(fieldName);
+        if(!dir){
+            if(this.sortInfo && this.sortInfo.field == f.name){ // toggle sort dir
+                dir = (this.sortToggle[f.name] || "ASC").toggle("ASC", "DESC");
+            }else{
+                dir = f.sortDir;
+            }
+        }
+        this.sortToggle[f.name] = dir;
+        this.sortInfo = {field: f.name, direction: dir};
+        if(!this.remoteSort){
+            this.applySort();
+            this.fireEvent("datachanged", this);
+        }else{
+            this.load(this.lastOptions);
+        }
+    },
+
+    /**
+     * Calls the specified function for each of the Records in the cache.
+     * @param {Function} fn The function to call. The Record is passed as the first parameter.
+     * Returning <em>false</em> aborts and exits the iteration.
+     * @param {Object} scope (optional) The scope in which to call the function (defaults to the Record).
+     */
+    each : function(fn, scope){
+        this.data.each(fn, scope);
+    },
+
+    /**
+     * Get all records modified since the last load, or since the last commit.
+     * @return {Ext.data.Record[]} An array of Records containing outstanding modifications.
+     */
+    getModifiedRecords : function(){
+        return this.modified;
+    },
+
+    /**
+     * Filter the records by a specified property.
+     * @param {String} field A field on your records
+     * @param {String/RegExp} value Either a string that the field
+     * should start with or a RegExp to test against the field
+     * @return {Boolean} True if the filter matched at least one record, else false
+     */
+    filter : function(property, value){
+        if(!value.exec){ // not a regex
+            value = String(value);
+            if(value.length == 0){
+                return this.clearFilter();
+            }
+            value = new RegExp("^" + Ext.escapeRe(value), "i");
+        }
+        this.filterBy(function(r){
+            return value.test(r.data[property]);
+        });
+    },
+
+    /**
+     * Filter by a function. The specified function will be called with each
+     * record in this data source. If the function returns true the record is included,
+     * otherwise it is filtered.
+     * @param {Function} fn The function to be called, it will receive 2 args (record, id)
+     * @param {Object} scope (optional) The scope of the function (defaults to this)
+     */
+    filterBy : function(fn, scope){
+        var data = this.snapshot || this.data;
+        this.snapshot = data;
+        this.data = data.filterBy(fn, scope);
+        this.fireEvent("datachanged", this);
+    },
+
+    /**
+     * Revert to a view of the Record cache with no filtering applied.
+     * @param {Boolean} suppressEvent If true the filter is cleared silently without notifying listeners
+     */
+    clearFilter : function(suppressEvent){
+        if(this.snapshot && this.snapshot != this.data){
+            this.data = this.snapshot;
+            delete this.snapshot;
+            if(suppressEvent !== true){
+                this.fireEvent("datachanged", this);
+            }
+        }
+    },
+
+    // private
+    afterEdit : function(record){
+        if(this.modified.indexOf(record) == -1){
+            this.modified.push(record);
+        }
+        this.fireEvent("update", this, record, Ext.data.Record.EDIT);
+    },
+
+    // private
+    afterReject : function(record){
+        this.modified.remove(record);
+        this.fireEvent("update", this, record, Ext.data.Record.REJECT);
+    },
+
+    // private
+    afterCommit : function(record){
+        this.modified.remove(record);
+        this.fireEvent("update", this, record, Ext.data.Record.COMMIT);
+    },
+
+    /**
+     * Commit all Records with outstanding changes. To handle updates for changes, subscribe to the
+     * Store's "update" event, and perform updating when the third parameter is Ext.data.Record.COMMIT.
+     */
+    commitChanges : function(){
+        var m = this.modified.slice(0);
+        this.modified = [];
+        for(var i = 0, len = m.length; i < len; i++){
+            m[i].commit();
+        }
+    },
+
+    /**
+     * Cancel outstanding changes on all changed records.
+     */
+    rejectChanges : function(){
+        var m = this.modified.slice(0);
+        this.modified = [];
+        for(var i = 0, len = m.length; i < len; i++){
+            m[i].reject();
+        }
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TabPanel.jss.html b/www/extras/yui-ext/docs/output/TabPanel.jss.html new file mode 100644 index 000000000..8845436d7 --- /dev/null +++ b/www/extras/yui-ext/docs/output/TabPanel.jss.html @@ -0,0 +1,744 @@ +TabPanel.js

TabPanel.js

/**
+ * @class Ext.TabPanel
+ * @extends 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 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 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.on('activate', 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>
+ * @constructor
+ * Create new TabPanel.
+ * @param {String/HTMLElement/Element} container The id, DOM element or 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. 
+ */
+Ext.TabPanel = function(container, config){
+    /**
+    * The container element for this TabPanel.
+    * @type Ext.Element
+    */
+    this.el = Ext.get(container, true);
+    if(config){
+        if(typeof config == "boolean"){
+            this.tabPosition = config ? "bottom" : "top";
+        }else{
+            Ext.apply(this, config);
+        }
+    }
+    if(this.tabPosition == "bottom"){
+        this.bodyEl = Ext.get(this.createBody(this.el.dom));
+        this.el.addClass("x-tabs-bottom");
+    }
+    this.stripWrap = Ext.get(this.createStrip(this.el.dom), true);
+    this.stripEl = Ext.get(this.createStripList(this.stripWrap.dom), true);
+    this.stripBody = Ext.get(this.stripWrap.dom.firstChild.firstChild, true);
+    if(Ext.isIE){
+        Ext.fly(this.stripWrap.dom.firstChild).setStyle("overflow-x", "hidden");
+    }
+    if(this.tabPosition != "bottom"){
+    /** The body element that contains TabPaneItem bodies. 
+     * @type Ext.Element
+     */
+      this.bodyEl = Ext.get(this.createBody(this.el.dom));
+      this.el.addClass("x-tabs-top");
+    }
+    this.items = [];
+    
+    this.bodyEl.setStyle("position", "relative");
+    
+    this.active = null;
+    this.activateDelegate = this.activate.createDelegate(this);
+    
+    this.addEvents({
+        /**
+         * @event tabchange
+         * Fires when the active tab changes
+         * @param {Ext.TabPanel} this
+         * @param {Ext.TabPanelItem} activePanel The new active tab
+         */
+        "tabchange": true,
+        /**
+         * @event beforetabchange
+         * Fires before the active tab changes, set cancel to true on the "e" parameter to cancel the change
+         * @param {Ext.TabPanel} this
+         * @param {Object} e Set cancel to true on this object to cancel the tab change
+         * @param {Ext.TabPanelItem} tab The tab being changed to
+         */
+        "beforetabchange" : true
+    });
+    
+    Ext.EventManager.onWindowResize(this.onResize, this);
+    this.cpad = this.el.getPadding("lr");
+    this.hiddenCount = 0;
+
+    Ext.TabPanel.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.TabPanel, Ext.util.Observable, {
+    /** The position of the tabs. Can be "top" or "bottom" @type String */
+    tabPosition : "top",
+    currentTabWidth : 0,
+    /** The minimum width of a tab (ignored if resizeTabs is not true). @type Number */
+    minTabWidth : 40,
+    /** The maximum width of a tab (ignored if resizeTabs is not true). @type Number */
+    maxTabWidth : 250,
+    /** The preferred (default) width of a tab (ignored if resizeTabs is not true). @type Number */
+    preferredTabWidth : 175,
+    /** Set this to true to enable dynamic tab resizing. @type Boolean */
+    resizeTabs : false,
+    /** Set this to true to turn on window resizing monitoring (ignored if resizeTabs is not true). @type Boolean */
+    monitorResize : true,
+
+    /**
+     * 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 {String} content (optional) Content to put in the TabPanelItem body
+     * @param {Boolean} closable (optional) True to create a close icon on the tab
+     * @return {Ext.TabPanelItem} The created TabPanelItem
+     */
+    addTab : function(id, text, content, closable){
+        var item = new 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 {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 {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();
+        }
+        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];
+        tab.fireEvent("close", tab);
+        tab.purgeListeners();
+        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)
+        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){
+            return null;
+        }
+        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.fireEvent("tabchange", this, this.active);
+        }
+        return tab;
+    },
+    
+    /**
+     * Get the active TabPanelItem
+     * @return {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()||0)-(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)-2);
+            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)-2);
+            }
+        }
+    },
+    
+    /**
+     * Returns the number of tabs
+     * @return {Number}
+     */
+     getCount : function(){
+         return this.items.length;  
+     },
+    
+    /**
+     * 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){
+        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 Ext.TabPanelItem
+* @extends Ext.util.Observable
+*/ 
+Ext.TabPanelItem = function(tabPanel, id, text, closable){
+    /**
+     * The TabPanel this TabPanelItem belongs to
+     * @type 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 Ext.Element
+     */
+    this.bodyEl = Ext.get(tabPanel.createItemBody(tabPanel.bodyEl.dom, id));
+    this.bodyEl.setVisibilityMode(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 = Ext.get(els.el, true);
+    this.inner = Ext.get(els.inner, true);
+    this.textEl = Ext.get(this.el.dom.firstChild.firstChild.firstChild, true);
+    this.pnode = Ext.get(els.el.parentNode, true);
+    this.el.on("mousedown", this.onTabMouseDown, this);
+    this.el.on("click", this.onTabClick, this);
+    /** @private */
+    if(closable){
+        var c = Ext.get(els.close, true);
+        c.dom.title = this.closeText;
+        c.addClassOnOver("close-over");
+        c.on("click", this.closeClick, this);
+     }
+    
+    this.addEvents({
+         /**
+         * @event activate
+         * Fires when this tab becomes the active tab
+         * @param {Ext.TabPanel} tabPanel
+         * @param {Ext.TabPanelItem} this
+         */
+        "activate": true,
+        /**
+         * @event beforeclose
+         * Fires before this tab is closed. To cancal the close, set cancel to true on e. (e.cancel = true)
+         * @param {Ext.TabPanelItem} this
+         * @param {Object} e Set cancel to true on this object to cancel the close.
+         */
+        "beforeclose": true,
+        /**
+         * @event close
+         * Fires when this tab is closed
+         * @param {Ext.TabPanelItem} this
+         */
+         "close": true,
+        /**
+         * @event deactivate
+         * Fires when this tab is no longer the active tab
+         * @param {Ext.TabPanel} tabPanel
+         * @param {Ext.TabPanelItem} this
+         */
+         "deactivate" : true
+    });
+    this.hidden = false;
+
+    Ext.TabPanelItem.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.TabPanelItem, Ext.util.Observable, {
+    purgeListeners : function(){
+       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(Ext.isOpera){
+            this.tabPanel.stripWrap.repaint();
+        }
+        this.fireEvent("activate", this.tabPanel, this);
+    },
+    
+    /**
+     * Returns true if this tab is the active tab
+     * @return {Boolean}
+     */
+    isActive : function(){
+        return this.tabPanel.getActiveTab() == this;  
+    },
+    
+    /**
+     * Hide this TabPanelItem - if you don't activate another TabPanelItem this could look odd.
+     */
+    hide : function(){
+        this.pnode.removeClass("on");
+        this.hideAction();
+        this.fireEvent("deactivate", this.tabPanel, this);
+    },
+    
+    hideAction : function(){
+        this.bodyEl.hide();
+        this.bodyEl.setStyle("position", "absolute");
+        this.bodyEl.setLeft("-20000px");
+        this.bodyEl.setTop("-20000px");
+    },
+    
+    showAction : function(){
+        this.bodyEl.setStyle("position", "relative");
+        this.bodyEl.setTop("");
+        this.bodyEl.setLeft("");
+        this.bodyEl.show();
+    },
+    
+    /**
+     * Set the tooltip for the tab
+     * @param {String} tooltip
+     */
+    setTooltip : function(text){
+        if(Ext.QuickTips && Ext.QuickTips.isEnabled()){
+            this.textEl.dom.qtip = text;
+            this.textEl.dom.removeAttribute('title');
+        }else{
+            this.textEl.dom.title = text;
+        }
+    },
+    
+    onTabClick : function(e){
+        e.preventDefault();
+        this.tabPanel.activate(this.id);
+    },
+
+    onTabMouseDown : 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" : "");
+    },
+    
+    /**
+     * Returns true if this tab is "hidden"
+     * @return {Boolean}
+     */
+    isHidden : function(){
+        return this.hidden;  
+    },
+    
+    /**
+     * Returns the text for this tab
+     * @return {String}
+     */
+    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();
+    },
+    
+    /**
+     * Sets the text for the tab (Note: this also sets the tooltip)
+     * @param {String} text
+     */
+    setText : function(text){
+        this.text = text;
+        this.textEl.update(text);
+        this.setTooltip(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 Ext.UpdateManager} for the body of this TabPanelItem. Enables you to perform Ajax updates.
+     * @return {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 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 {Ext.UpdateManager} The UpdateManager
+     */
+    setUrl : function(url, params, loadOnce){
+        if(this.refreshDelegate){
+            this.un('activate', this.refreshDelegate);
+        }
+        this.refreshDelegate = this._handleRefresh.createDelegate(this, [url, params, loadOnce]);
+        this.on("activate", 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));
+        }
+    },
+    
+    /**
+     *   Force a content refresh from the URL specified in the setUrl() method.
+     *   Will fail silently if the setUrl method has not been called.
+     *   This does not activate the panel, just updates its content.
+     */
+    refresh : function(){
+        if(this.refreshDelegate){
+           this.loaded = false;
+           this.refreshDelegate();
+        }
+    }, 
+    
+    /** @private */
+    _setLoaded : function(){
+        this.loaded = true;
+    },
+    
+    /** @private */
+    closeClick : function(e){
+        var o = {};
+        e.stopEvent();
+        this.fireEvent("beforeclose", this, o);
+        if(o.cancel !== true){
+            this.tabPanel.removeTab(this.id);
+        }
+    },
+    /**
+     * The text displayed in the tooltip for the close icon.
+     * @type String
+     */
+    closeText : "Close this tab"
+});
+
+/** @private */
+Ext.TabPanel.prototype.createStrip = function(container){
+    var strip = document.createElement("div");
+    strip.className = "x-tabs-wrap";
+    container.appendChild(strip);
+    return strip;
+};
+/** @private */
+Ext.TabPanel.prototype.createStripList = function(strip){
+    // div wrapper for retard IE
+    strip.innerHTML = '<div class="x-tabs-strip-wrap"><table class="x-tabs-strip" cellspacing="0" cellpadding="0" border="0"><tbody><tr></tr></tbody></table></div>';
+    return strip.firstChild.firstChild.firstChild.firstChild;
+};
+/** @private */
+Ext.TabPanel.prototype.createBody = function(container){
+    var body = document.createElement("div");
+    Ext.id(body, "tab-body");
+    Ext.fly(body).addClass("x-tabs-body");
+    container.appendChild(body);
+    return body;
+};
+/** @private */
+Ext.TabPanel.prototype.createItemBody = function(bodyEl, id){
+    var body = Ext.getDom(id);
+    if(!body){
+        body = document.createElement("div");
+        body.id = id;
+    }
+    Ext.fly(body).addClass("x-tabs-item-body");
+    bodyEl.insertBefore(body, bodyEl.firstChild);
+    return body;
+};
+/** @private */
+Ext.TabPanel.prototype.createStripElements = function(stripEl, text, closable){
+    var td = document.createElement("td");
+    stripEl.appendChild(td);
+    if(closable){
+        td.className = "x-tabs-closable";
+        if(!this.closeTpl){
+            this.closeTpl = new Ext.Template(
+               '<a href="#" class="x-tabs-right"><span class="x-tabs-left"><em class="x-tabs-inner">' +
+               '<span unselectable="on"' + (this.disableTooltips ? '' : ' title="{text}"') +' class="x-tabs-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 Ext.Template(
+               '<a href="#" class="x-tabs-right"><span class="x-tabs-left"><em class="x-tabs-inner">' +
+               '<span unselectable="on"' + (this.disableTooltips ? '' : ' title="{text}"') +' class="x-tabs-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};
+    }
+};

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TaskMgr.jss.html b/www/extras/yui-ext/docs/output/TaskMgr.jss.html new file mode 100644 index 000000000..5abb47707 --- /dev/null +++ b/www/extras/yui-ext/docs/output/TaskMgr.jss.html @@ -0,0 +1,87 @@ +TaskMgr.js

TaskMgr.js

Ext.util.TaskRunner = function(interval){
+    interval = interval || 10;
+    var tasks = [], removeQueue = [];
+    var id = 0;
+    var running = false;
+
+    var stopThread = function(){
+        running = false;
+        clearInterval(id);
+        id = 0;
+    };
+
+    var startThread = function(){
+        if(!running){
+            running = true;
+            id = setInterval(runTasks, interval);
+        }
+    };
+
+    var removeTask = function(task){
+        removeQueue.push(task);
+        if(task.onStop){
+            task.onStop();
+        }
+    };
+
+    var runTasks = function(){
+        if(removeQueue.length > 0){
+            for(var i = 0, len = removeQueue.length; i < len; i++){
+                tasks.remove(removeQueue[i]);
+            }
+            removeQueue = [];
+            if(tasks.length < 1){
+                stopThread();
+                return;
+            }
+        }
+        var now = new Date().getTime();
+        for(var i = 0, len = tasks.length; i < len; ++i){
+            var t = tasks[i];
+            var itime = now - t.taskRunTime;
+            if(t.interval <= itime){
+                var rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]);
+                t.taskRunTime = now;
+                if(rt === false || t.taskRunCount === t.repeat){
+                    removeTask(t);
+                    return;
+                }
+            }
+            if(t.duration && t.duration <= (now - t.taskStartTime)){
+                removeTask(t);
+            }
+        }
+    };
+
+    /**
+     * Queues a new task.
+     * @param {Object} task
+     */
+    this.start = function(task){
+        tasks.push(task);
+        task.taskStartTime = new Date().getTime();
+        task.taskRunTime = 0;
+        task.taskRunCount = 0;
+        startThread();
+        return task;
+    };
+
+    this.stop = function(task){
+        removeTask(task);
+        return task;
+    };
+
+    this.stopAll = function(){
+        stopThread();
+        for(var i = 0, len = tasks.length; i < len; i++){
+            if(tasks[i].onStop){
+                tasks[i].onStop();
+            }
+        }
+        tasks = [];
+        removeQueue = [];
+    };
+};
+
+Ext.TaskMgr = new Ext.util.TaskRunner();

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Template.jss.html b/www/extras/yui-ext/docs/output/Template.jss.html new file mode 100644 index 000000000..4b23600a2 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Template.jss.html @@ -0,0 +1,357 @@ +Template.js

Template.js

/**
+* @class Ext.Template
+* Represents an HTML fragment template. Templates can be precompiled for greater performance.
+* For a list of available format functions, see {@link Ext.util.Format}.
+<pre><code>
+var t = new Ext.Template(
+	'&lt;div name="{id}"&gt;',
+		'&lt;span class="{cls}"&gt;{name:trim} {value:ellipsis(10)}&lt;/span&gt;',
+	'&lt;/div&gt;'
+);
+t.append('some-element', {id: 'myid', name: 'foo', value: 'bar'});
+</code></pre>
+* 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>
+* @constructor
+* @param {String/Array} html The HTML fragment or an array of fragments to join('') or multiple arguments to join('')
+*/
+Ext.Template = function(html){
+    if(html instanceof Array){
+        html = html.join("");
+    }else if(arguments.length > 1){
+        html = Array.prototype.join.call(arguments, "");
+    }
+    /**@private*/
+    this.html = html;
+    
+};
+Ext.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 useF = this.disableFormats !== true;
+        var fm = Ext.util.Format, tpl = this;
+        var fn = function(m, name, format, args){
+            if(format && useF){
+                if(format.substr(0, 5) == "this."){
+                    return tpl.call(format.substr(5), values[name]);
+                }else{
+                    if(args){
+                        // quoted values are required for strings in compiled templates, 
+                        // but for non compiled we need to strip them
+                        // quoted reversed for jsmin
+                        var re = /^\s*['"](.*)["']\s*$/;
+                        args = args.split(',');
+                        for(var i = 0, len = args.length; i < len; i++){
+                            args[i] = args[i].replace(re, "$1");
+                        }
+                        args = [values[name]].concat(args);
+                    }else{
+                        args = [values[name]];
+                    }
+                    return fm[format].apply(fm, args);
+                }
+            }else{
+                return values[name] !== undefined ? values[name] : "";
+            }
+        };
+        return this.html.replace(this.re, fn);
+    },
+    
+    /**
+     * Sets the html used as the template and optionally compiles it
+     * @param {String} html
+     * @param {Boolean} compile (optional)
+     * @return {Template} this
+     */
+    set : function(html, compile){
+        this.html = html;
+        this.compiled = null;
+        if(compile){
+            this.compile();
+        }
+        return this;
+    },
+    
+    /**
+     * True to disable format functions (default to false)
+     * @type Boolean
+     */
+    disableFormats : false,
+    
+    /**
+    * The regular expression used to match template variables 
+    * @type RegExp
+    * @property 
+    */
+    re : /\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,
+    
+    /**
+     * Compiles the template into an internal function, eliminating the RegEx overhead
+     */
+    compile : function(){
+        var fm = Ext.util.Format;
+        var useF = this.disableFormats !== true;
+        var sep = Ext.isGecko ? "+" : ",";
+        var fn = function(m, name, format, args){
+            if(format && useF){
+                args = args ? ',' + args : "";
+                if(format.substr(0, 5) != "this."){
+                    format = "fm." + format + '(';
+                }else{
+                    format = 'this.call("'+ format.substr(5) + '", ';
+                    args = "";
+                }
+            }else{
+                args= '', format = "(values['" + name + "'] == undefined ? '' : ";
+            }
+            return "'"+ sep + format + "values['" + name + "']" + args + ")"+sep+"'";
+        };
+        var body;
+        // branched to use + in gecko and [].join() in others
+        if(Ext.isGecko){
+            body = "this.compiled = function(values){ return '" +
+                   this.html.replace(/(\r\n|\n)/g, '\\n').replace("'", "\\'").replace(this.re, fn) +
+                    "';};";
+        }else{
+            body = ["this.compiled = function(values){ return ['"];
+            body.push(this.html.replace(/(\r\n|\n)/g, '\\n').replace("'", "\\'").replace(this.re, fn));
+            body.push("'].join('');};");
+            body = body.join('');
+        }
+        eval(body);
+        return this;
+    },
+    
+    // private function used to call members
+    call : function(fnName, value){
+        return this[fnName](value);
+    },
+    
+    /**
+     * Applies the supplied values to the template and inserts the new node(s) as the first child of el
+     * @param {String/HTMLElement/Element} 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 Ext.Element
+     * @return {HTMLElement} The new node
+     */
+    insertFirst: function(el, values, returnElement){
+        return this.doInsert('afterBegin', el, values, returnElement);
+    },
+
+    /**
+     * Applies the supplied values to the template and inserts the new node(s) before el
+     * @param {String/HTMLElement/Element} 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 Ext.Element
+     * @return {HTMLElement} The new node
+     */
+    insertBefore: function(el, values, returnElement){
+        return this.doInsert('beforeBegin', el, values, returnElement);
+    },
+
+    /**
+     * Applies the supplied values to the template and inserts the new node(s) after el
+     * @param {String/HTMLElement/Element} 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 Ext.Element
+     * @return {HTMLElement} The new node
+     */
+    insertAfter : function(el, values, returnElement){
+        return this.doInsert('afterEnd', el, values, returnElement);
+    },
+    
+    /**
+     * Applies the supplied values to the template and append the new node(s) to el
+     * @param {String/HTMLElement/Element} 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 Ext.Element
+     * @return {HTMLElement} The new node
+     */
+    append : function(el, values, returnElement){
+        return this.doInsert('beforeEnd', el, values, returnElement);
+    },
+
+    doInsert : function(where, el, values, returnEl){
+        el = Ext.getDom(el);
+        var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values));
+        return returnEl ? Ext.get(newNode, true) : newNode;
+    },
+
+    /**
+     * Applies the supplied values to the template and overwrites the content of el with the new node(s)
+     * @param {String/HTMLElement/Element} 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 Ext.Element
+     * @return {HTMLElement} The new node
+     */
+    overwrite : function(el, values, returnElement){
+        el = Ext.getDom(el);
+        el.innerHTML = this.applyTemplate(values);
+        return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;
+    }
+};
+/**
+ * Alias for applyTemplate
+ * @method
+ */
+Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate;
+
+// backwards compat
+Ext.DomHelper.Template = Ext.Template;
+
+/**
+ * Creates a template from the passed element's value (display:none textarea, preferred) or innerHTML
+ * @param {String/HTMLElement} el
+ * @static
+ */
+Ext.Template.from = function(el){
+    el = Ext.getDom(el);
+    return new Ext.Template(el.value || el.innerHTML);  
+};
+
+/**
+ * @class Ext.MasterTemplate
+ * @extends Ext.Template
+ * Provides a template that can have child templates. The syntax is:
+<pre><code>
+var t = new Ext.MasterTemplate(
+	'&lt;select name="{name}"&gt;',
+		'&lt;tpl name="options"&gt;&lt;option value="{value:trim}"&gt;{text:ellipsis(10)}&lt;/option&gt;&lt;/tpl&gt;',
+	'&lt;/select&gt;'
+);
+t.add('options', {value: 'foo', text: 'bar'});
+// or you can add multiple child elements in one shot
+t.addAll('options', [
+    {value: 'foo', text: 'bar'},
+    {value: 'foo2', text: 'bar2'},
+    {value: 'foo3', text: 'bar3'}
+]);
+// then append, applying the master template values
+t.append('my-form', {name: 'my-select'});
+</code></pre>
+* A name attribute for the child template is not required if you have only one child 
+* template or you want to refer to them by index.
+ */
+Ext.MasterTemplate = function(){
+    Ext.MasterTemplate.superclass.constructor.apply(this, arguments);
+    this.originalHtml = this.html;
+    var st = {};
+    var m, re = this.subTemplateRe;
+    re.lastIndex = 0;
+    var subIndex = 0;
+    while(m = re.exec(this.html)){
+        var name = m[1], content = m[2];
+        st[subIndex] = {
+            name: name,
+            index: subIndex,
+            buffer: [],
+            tpl : new Ext.Template(content)
+        };
+        if(name){
+            st[name] = st[subIndex];
+        }
+        st[subIndex].tpl.compile();
+        st[subIndex].tpl.call = this.call.createDelegate(this);
+        subIndex++;
+    }
+    this.subCount = subIndex;
+    this.subs = st;
+};
+Ext.extend(Ext.MasterTemplate, Ext.Template, {
+    /**
+    * The regular expression used to match sub templates 
+    * @type RegExp
+    * @property 
+    */
+    subTemplateRe : /<tpl(?:\sname="([\w-]+)")?>((?:.|\n)*?)<\/tpl>/gi,
+    
+    /**
+     * Applies the passed values to a child template.
+     * @param {String/Number} name (optional) The name or index of the child template
+     * @param {Array/Object} values The values to be applied to the template
+     * @return {MasterTemplate} this
+     */
+     add : function(name, values){
+        if(arguments.length == 1){
+            values = arguments[0];
+            name = 0;
+        }
+        var s = this.subs[name];
+        s.buffer[s.buffer.length] = s.tpl.apply(values);
+        return this;
+    },
+    
+    /**
+     * Applies all the passed values to a child template.
+     * @param {String/Number} name (optional) The name or index of the child template
+     * @param {Array} values The values to be applied to the template, this should be an array of objects.
+     * @param {Boolean} reset (optional) True to reset the template first
+     * @return {MasterTemplate} this
+     */
+    fill : function(name, values, reset){
+        var a = arguments;
+        if(a.length == 1 || (a.length == 2 && typeof a[1] == "boolean")){
+            values = a[0];
+            name = 0;
+            reset = a[1];
+        }
+        if(reset){
+            this.reset();
+        }
+        for(var i = 0, len = values.length; i < len; i++){
+            this.add(name, values[i]);
+        }
+        return this;
+    },
+    
+    /**
+     * Resets the template for reuse
+     * @return {MasterTemplate} this
+     */
+     reset : function(){
+        var s = this.subs;
+        for(var i = 0; i < this.subCount; i++){
+            s[i].buffer = [];
+        }
+        return this;
+    },
+    
+    applyTemplate : function(values){
+        var s = this.subs;
+        var replaceIndex = -1;
+        this.html = this.originalHtml.replace(this.subTemplateRe, function(m, name){
+            return s[++replaceIndex].buffer.join("");
+        });
+        return Ext.MasterTemplate.superclass.applyTemplate.call(this, values);
+    },
+    
+    apply : function(){
+        return this.applyTemplate.apply(this, arguments);
+    },
+    
+    compile : function(){return this;}
+});
+
+/**
+ * Alias for fill().
+ * @method
+ */
+Ext.MasterTemplate.prototype.addAll = Ext.MasterTemplate.prototype.fill;
+ /**
+ * Creates a template from the passed element's value (display:none textarea, preferred) or innerHTML. e.g.
+ * var tpl = Ext.MasterTemplate.from('element-id');
+ * @param {String/HTMLElement} el
+ * @static
+ */
+Ext.MasterTemplate.from = function(el){
+    el = Ext.getDom(el);
+    return new Ext.MasterTemplate(el.value || el.innerHTML);  
+};

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TextArea.jss.html b/www/extras/yui-ext/docs/output/TextArea.jss.html new file mode 100644 index 000000000..978ca5988 --- /dev/null +++ b/www/extras/yui-ext/docs/output/TextArea.jss.html @@ -0,0 +1,101 @@ +TextArea.js

TextArea.js

/**
+ * @class Ext.form.TextArea
+ * @extends Ext.form.TextField
+ * Multiline text field.  Can be used as a direct replacement for traditional textarea fields, plus adds
+ * support for auto-sizing.
+ * @constructor
+ * Creates a new TextArea
+ * @param {Object} config Configuration options
+ */
+Ext.form.TextArea = function(config){
+    Ext.form.TextArea.superclass.constructor.call(this, config);
+    // these are provided exchanges for backwards compat
+    // minHeight/maxHeight were replaced by growMin/growMax to be
+    // compatible with TextField growing config values
+    if(this.minHeight !== undefined){
+        this.growMin = this.minHeight;
+    }
+    if(this.maxHeight !== undefined){
+        this.growMax = this.maxHeight;
+    }
+};
+
+Ext.extend(Ext.form.TextArea, Ext.form.TextField,  {
+    /**
+     * @cfg {Number} growMin The minimum height to allow when grow = true (defaults to 60)
+     */
+    growMin : 60,
+    /**
+     * @cfg {Number} growMax The maximum height to allow when grow = true (defaults to 1000)
+     */
+    growMax: 1000,
+    /**
+     * @cfg {Boolean} preventScrollbars True to prevent scrollbars from appearing regardless of how much text is
+     * in the field (equivalent to setting overflow: hidden, defaults to false)
+     */
+    preventScrollbars: false,
+
+    // private
+    onRender : function(ct, position){
+        if(!this.el){
+            this.defaultAutoCreate = {
+                tag: "textarea",
+                style:"width:300px;height:60px;",
+                autocomplete: "off"
+            };
+        }
+        Ext.form.TextArea.superclass.onRender.call(this, ct, position);
+        if(this.grow){
+            this.textSizeEl = Ext.DomHelper.append(document.body, {
+                tag: "pre", cls: "x-form-grow-sizer"
+            });
+            if(this.preventScrollbars){
+                this.el.setStyle("overflow", "hidden");
+            }
+            this.el.setHeight(this.growMin);
+        }
+    },
+
+    // private
+    onKeyUp : function(e){
+        if(!e.isNavKeyPress() || e.getKey() == e.ENTER){
+            this.autoSize();
+        }
+    },
+
+    /**
+     * Automatically grows the field to accomodate the height of the text up to the maximum field height allowed.
+     * This only takes effect if grow = true and fires the autosize event.
+     */
+    autoSize : function(){
+        if(!this.grow || !this.textSizeEl){
+            return;
+        }
+        var el = this.el;
+        var v = el.dom.value;
+        var ts = this.textSizeEl;
+        Ext.fly(ts).setWidth(this.el.getWidth());
+        if(v.length < 1){
+            v = "&#160;&#160;";
+        }else{
+            v += "&#160;\n&#160;";
+        }
+        if(Ext.isIE){
+            v = v.replace(/\n/g, '<br />');
+        }
+        ts.innerHTML = v;
+        var h = Math.min(this.growMax, Math.max(ts.offsetHeight, this.growMin));
+        if(h != this.lastHeight){
+            this.lastHeight = h;
+            this.el.setHeight(h);
+            this.fireEvent("autosize", this, h);
+        }
+    },
+
+    // private
+    setValue : function(v){
+        Ext.form.TextArea.superclass.setValue.call(this, v);
+        this.autoSize();
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TextField.jss.html b/www/extras/yui-ext/docs/output/TextField.jss.html new file mode 100644 index 000000000..5b52cc569 --- /dev/null +++ b/www/extras/yui-ext/docs/output/TextField.jss.html @@ -0,0 +1,281 @@ +TextField.js

TextField.js

/**
+ * @class Ext.form.TextField
+ * @extends Ext.form.Field
+ * Basic text field.  Can be used as a direct replacement for traditional text inputs, or as the base
+ * class for more sophisticated input controls (like {@link Ext.form.TextArea} and {@link Ext.form.ComboBox}).
+ * @constructor
+ * Creates a new TextField
+ * @param {Object} config Configuration options
+ */
+Ext.form.TextField = function(config){
+    Ext.form.TextField.superclass.constructor.call(this, config);
+    this.addEvents({
+        /**
+         * @event autosize
+         * Fires when the autosize function is triggered.  The field may or may not have actually changed size
+         * according to the default logic, but this event provides a hook for the developer to apply additional
+         * logic at runtime to resize the field if needed.
+	     * @param {Ext.form.Field} this This text field
+	     * @param {Number} width The new field width
+	     */
+        autosize : true
+    });
+};
+
+Ext.extend(Ext.form.TextField, Ext.form.Field,  {
+    /**
+     * @cfg {Boolean} grow True if this field should automatically grow and shrink to its content
+     */
+    grow : false,
+    /**
+     * @cfg {Number} growMin The minimum width to allow when grow = true (defaults to 30)
+     */
+    growMin : 30,
+    /**
+     * @cfg {Number} growMax The maximum width to allow when grow = true (defaults to 800)
+     */
+    growMax : 800,
+    /**
+     * @cfg {String} vtype A validation type name as defined in {@link Ext.form.VTypes} (defaults to null)
+     */
+    vtype : null,
+    /**
+     * @cfg {String} maskRe An input mask regular expression that will be used to filter keystrokes that don't match (defaults to null)
+     */
+    maskRe : null,
+    /**
+     * @cfg {Boolean} disableKeyFilter True to disable input keystroke filtering (defaults to false)
+     */
+    disableKeyFilter : false,
+    /**
+     * @cfg {Boolean} allowBlank False to validate that the value length > 0 (defaults to true)
+     */
+    allowBlank : true,
+    /**
+     * @cfg {Number} minLength Minimum input field length required (defaults to 0)
+     */
+    minLength : 0,
+    /**
+     * @cfg {Number} maxLength Maximum input field length allowed (defaults to Number.MAX_VALUE)
+     */
+    maxLength : Number.MAX_VALUE,
+    /**
+     * @cfg {String} minLengthText Error text to display if the minimum length validation fails (defaults to "The minimum length for this field is {minLength}")
+     */
+    minLengthText : "The minimum length for this field is {0}",
+    /**
+     * @cfg {String} maxLengthText Error text to display if the maximum length validation fails (defaults to "The maximum length for this field is {maxLength}")
+     */
+    maxLengthText : "The maximum length for this field is {0}",
+    /**
+     * @cfg {Boolean} selectOnFocus True to automatically select any existing field text when the field receives input focus (defaults to false)
+     */
+    selectOnFocus : false,
+    /**
+     * @cfg {String} blankText Error text to display if the allow blank validation fails (defaults to "This field is required")
+     */
+    blankText : "This field is required",
+    /**
+     * @cfg {Function} validator A custom validation function to be called during field validation (defaults to null).
+     * If available, this function will be called only after the basic validators all return true, and will be passed the
+     * current field value and expected to return boolean true if the value is valid or a string error message if invalid.
+     */
+    validator : null,
+    /**
+     * @cfg {RegExp} regex A JavaScript RegExp object to be tested against the field value during validation (defaults to null).
+     * If available, this regex will be evaluated only after the basic validators all return true, and will be passed the
+     * current field value.  If the test fails, the field will be marked invalid using {@link #regexText}.
+     */
+    regex : null,
+    /**
+     * @cfg {String} regexText The error text to display if {@link #regex} is used and the test fails during validation (defaults to "")
+     */
+    regexText : "",
+    /**
+     * @cfg {String} emptyText The default text to display in an empty field (defaults to null).
+     */
+    emptyText : null,
+    /**
+     * @cfg {String} emptyClass The CSS class to apply to an empty field to style the {@link #emptyText} (defaults to
+     * 'x-form-empty-field').  This class is automatically added and removed as needed depending on the current field value.
+     */
+    emptyClass : 'x-form-empty-field',
+
+    // private
+    initEvents : function(){
+        Ext.form.TextField.superclass.initEvents.call(this);
+        if(this.validationEvent == 'keyup'){
+            this.validationTask = new Ext.util.DelayedTask(this.validate, this);
+            this.el.on('keyup', this.filterValidation, this);
+        }
+        else if(this.validationEvent !== false){
+            this.el.on(this.validationEvent, this.validate, this, {buffer: this.validationDelay});
+        }
+        if(this.selectOnFocus || this.emptyText){
+            this.on("focus", this.preFocus, this);
+            if(this.emptyText){
+                this.on('blur', this.postBlur, this);
+                this.applyEmptyText();
+            }
+        }
+        if(this.maskRe || (this.vtype && this.disableKeyFilter !== true && (this.maskRe = Ext.form.VTypes[this.vtype+'Mask']))){
+            this.el.on("keypress", this.filterKeys, this);
+        }
+        if(this.grow){
+            this.el.on("keyup", this.onKeyUp,  this, {buffer:50});
+            this.el.on("click", this.autoSize,  this);
+        }
+    },
+
+    filterValidation : function(e){
+        if(!e.isNavKeyPress()){
+            this.validationTask.delay(this.validationDelay);
+        }
+    },
+
+    // private
+    onKeyUp : function(e){
+        if(!e.isNavKeyPress()){
+            this.autoSize();
+        }
+    },
+
+    /**
+     * Resets the current field value to the originally-loaded value and clears any validation messages.
+     * Also adds emptyText and emptyClass if the original value was blank.
+     */
+    reset : function(){
+        Ext.form.TextField.superclass.reset.call(this);
+        this.applyEmptyText();
+    },
+
+    applyEmptyText : function(){
+        if(this.rendered && this.emptyText && this.getRawValue().length < 1){
+            this.setRawValue(this.emptyText);
+            this.el.addClass(this.emptyClass);
+        }
+    },
+
+    // private
+    preFocus : function(){
+        if(this.emptyText){
+            if(this.getRawValue() == this.emptyText){
+                this.setRawValue('');
+            }
+            this.el.removeClass(this.emptyClass);
+        }
+        if(this.selectOnFocus){
+            this.el.dom.select();
+        }
+    },
+
+    // private
+    postBlur : function(){
+        this.applyEmptyText();
+    },
+
+    // private
+    filterKeys : function(e){
+        var k = e.getKey();
+        if(!Ext.isIE && (e.isNavKeyPress() || k == e.BACKSPACE || (k == e.DELETE && e.button == -1))){
+            return;
+        }
+        var c = e.getCharCode();
+        if(!this.maskRe.test(String.fromCharCode(c) || '')){
+            e.stopEvent();
+        }
+    },
+
+    setValue : function(v){
+        if(this.emptyText && v !== undefined && v !== null && v !== ''){
+            this.el.removeClass(this.emptyClass);
+        }
+        Ext.form.TextField.superclass.setValue.apply(this, arguments);
+    },
+
+    /**
+     * Validates a value according to the field's validation rules and marks the field as invalid
+     * if the validation fails
+     * @param {Mixed} value The value to validate
+     * @return {Boolean} True if the value is valid, else false
+     */
+    validateValue : function(value){
+        if(value.length < 1 || value === this.emptyText){ // if it's blank
+             if(this.allowBlank){
+                 this.clearInvalid();
+                 return true;
+             }else{
+                 this.markInvalid(this.blankText);
+                 return false;
+             }
+        }
+        if(value.length < this.minLength){
+            this.markInvalid(String.format(this.minLengthText, this.minLength));
+            return false;
+        }
+        if(value.length > this.maxLength){
+            this.markInvalid(String.format(this.maxLengthText, this.maxLength));
+            return false;
+        }
+        if(this.vtype){
+            var vt = Ext.form.VTypes;
+            if(!vt[this.vtype](value)){
+                this.markInvalid(this.vtypeText || vt[this.vtype +'Text']);
+                return false;
+            }
+        }
+        if(typeof this.validator == "function"){
+            var msg = this.validator(value);
+            if(msg !== true){
+                this.markInvalid(msg);
+                return false;
+            }
+        }
+        if(this.regex && !this.regex.test(value)){
+            this.markInvalid(this.regexText);
+            return false;
+        }
+        return true;
+    },
+
+    /**
+     * Selects text in this field
+     * @param {Number} start (optional) The index where the selection should start (defaults to 0)
+     * @param {Number} end (optional) The index where the selection should end (defaults to the text length)
+     */
+    selectText : function(start, end){
+        var v = this.getRawValue();
+        if(v.length > 0){
+            start = start === undefined ? 0 : start;
+            end = end === undefined ? v.length : end;
+            var d = this.el.dom;
+            if(d.setSelectionRange){
+                d.setSelectionRange(start, end);
+            }else if(d.createTextRange){
+                var range = d.createTextRange();
+                range.moveStart("character", start);
+                range.moveEnd("character", v.length-end);
+                range.select();
+            }
+        }
+    },
+
+    /**
+     * Automatically grows the field to accomodate the width of the text up to the maximum field width allowed.
+     * This only takes effect if grow = true and fires the autosize event.
+     */
+    autoSize : function(){
+        if(!this.grow || !this.rendered){
+            return;
+        }
+        if(!this.metrics){
+            this.metrics = Ext.util.TextMetrics.createInstance(this.el);
+        }
+        var el = this.el;
+        var v = el.dom.value + "&#160;";
+        var w = Math.min(this.growMax, Math.max(this.metrics.getWidth(v) + /* add extra padding */ 10, this.growMin));
+        this.el.setWidth(w);
+        this.fireEvent("autosize", this, w);
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TextItem.jss.html b/www/extras/yui-ext/docs/output/TextItem.jss.html new file mode 100644 index 000000000..a91f0ef2e --- /dev/null +++ b/www/extras/yui-ext/docs/output/TextItem.jss.html @@ -0,0 +1,33 @@ +TextItem.js

TextItem.js

/**
+ * @class Ext.menu.TextItem
+ * @extends Ext.menu.BaseItem
+ * Adds a static text string to a menu, usually used as either a heading or group separator.
+ * @constructor
+ * Creates a new TextItem
+ * @param {String} text The text to display
+ */
+Ext.menu.TextItem = function(text){
+    this.text = text;
+    Ext.menu.TextItem.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.menu.TextItem, Ext.menu.BaseItem, {
+    /**
+     * @cfg {Boolean} hideOnClick True to hide the containing menu after this item is clicked (defaults to false)
+     */
+    hideOnClick : false,
+    /**
+     * @cfg {String} itemCls The default CSS class to use for text items (defaults to "x-menu-text")
+     */
+    itemCls : "x-menu-text",
+
+    // private
+    onRender : function(){
+        var s = document.createElement("span");
+        s.className = this.itemCls;
+        s.innerHTML = this.text;
+        this.el = s;
+        Ext.menu.TextItem.superclass.onRender.apply(this, arguments);
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TextMetrics.jss.html b/www/extras/yui-ext/docs/output/TextMetrics.jss.html new file mode 100644 index 000000000..5ae9f5fc6 --- /dev/null +++ b/www/extras/yui-ext/docs/output/TextMetrics.jss.html @@ -0,0 +1,114 @@ +TextMetrics.js

TextMetrics.js

/**
+ * @class Ext.util.TextMetrics
+ * Provides precise pixel measurements for blocks of text so that you can determine exactly how high and
+ * wide, in pixels, a given block of text will be.
+ * @singleton
+ */
+Ext.util.TextMetrics = function(){
+    var shared;
+    return {
+        /**
+         * Measures the size of the specified text
+         * @param {String/HTMLElement} el The element, dom node or id from which to copy existing CSS styles
+         * that can affect the size of the rendered text
+         * @param {String} text The text to measure
+         * @param {Number} fixedWidth (optional) If the text will be multiline, you have to set a fixed width
+         * in order to accurately measure the text height
+         * @return {Object} An object containing the text's size {width: (width), height: (height)}
+         */
+        measure : function(el, text, fixedWidth){
+            if(!shared){
+                shared = Ext.util.TextMetrics.Instance(el, fixedWidth);
+            }
+            shared.bind(el);
+            shared.setFixedWidth(fixedWidth || 'auto');
+            return shared.getSize(text);
+        },
+
+        /**
+         * Return a unique TextMetrics instance that can be bound directly to an element and reused.  This reduces
+         * the overhead of multiple calls to initialize the style properties on each measurement.
+         * @param {String/HTMLElement} el The element, dom node or id that the instance will be bound to
+         * @param {Number} fixedWidth (optional) If the text will be multiline, you have to set a fixed width
+         * in order to accurately measure the text height
+         * @return {Ext.util.TextMetrics.Instance} instance The new instance
+         */
+        createInstance : function(el, fixedWidth){
+            return Ext.util.TextMetrics.Instance(el, fixedWidth);
+        }
+    };
+}();
+
+Ext.util.TextMetrics.Instance = function(bindTo, fixedWidth){
+    var ml = new Ext.Element(document.createElement('div'));
+    document.body.appendChild(ml.dom);
+    ml.position('absolute');
+    ml.setLeftTop(-1000, -1000);
+    ml.hide();
+
+    if(fixedWidth){
+        mi.setWidth(fixedWidth);
+    }
+
+    var instance = {
+        /**
+         * Returns the size of the specified text based on the internal element's style and width properties
+         * @param {String} text The text to measure
+         * @return {Object} An object containing the text's size {width: (width), height: (height)}
+         */
+        getSize : function(text){
+            ml.update(text);
+            var s = ml.getSize();
+            ml.update('');
+            return s;
+        },
+
+        /**
+         * Binds this TextMetrics instance to an element from which to copy existing CSS styles
+         * that can affect the size of the rendered text
+         * @param {String/HTMLElement} el The element, dom node or id
+         */
+        bind : function(el){
+            ml.setStyle(
+                Ext.fly(el).getStyles('font-size','font-style', 'font-weight', 'font-family','line-height')
+            );
+        },
+
+        /**
+         * Sets a fixed width on the internal measurement element.  If the text will be multiline, you have
+         * to set a fixed width in order to accurately measure the text height.
+         * @param {Number} width The width to set on the element
+         */
+        setFixedWidth : function(width){
+            ml.setWidth(width);
+        },
+
+        /**
+         * Returns the measured width of the specified text
+         * @param {String} text The text to measure
+         * @return {Number} width The width in pixels
+         */
+        getWidth : function(text){
+            ml.dom.style.width = 'auto';
+            return this.getSize(text).width;
+        },
+
+        /**
+         * Returns the measured height of the specified text.  For multiline text, be sure to call
+         * {@link #setFixedWidth} if necessary.
+         * @param {String} text The text to measure
+         * @return {Number} height The height in pixels
+         */
+        getHeight : function(text){
+            return this.getSize(text).height;
+        }
+    };
+
+    instance.bind(bindTo);
+
+    return instance;
+};
+
+// backwards compat
+Ext.Element.measureText = Ext.util.TextMetrics.measure;

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Toolbar.jss.html b/www/extras/yui-ext/docs/output/Toolbar.jss.html new file mode 100644 index 000000000..00c773507 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Toolbar.jss.html @@ -0,0 +1,452 @@ +Toolbar.js

Toolbar.js

/**
+ * @class Ext.Toolbar
+ * Basic Toolbar class.
+ * @constructor
+ * Creates a new Toolbar
+ * @param {String/HTMLElement/Element} container The id or element that will contain the toolbar
+ * @param {Array} buttons (optional) array of button configs or elements to add
+ * @param {Object} config The config object
+ */ 
+ Ext.Toolbar = function(container, buttons, config){
+     if(container instanceof Array){ // omit the container for later rendering
+         buttons = container;
+         config = buttons;
+         container = null;
+     }
+     Ext.apply(this, config);
+     this.buttons = buttons;
+     if(container){
+         this.render(container);
+     }
+};
+
+Ext.Toolbar.prototype = {
+
+    render : function(ct){
+        this.el = Ext.get(ct);
+        if(this.cls){
+            this.el.addClass(this.cls);
+        }
+        // using a table allows for vertical alignment
+        this.el.update('<div class="x-toolbar x-small-editor"><table cellspacing="0"><tr></tr></table></div>');
+        this.tr = this.el.child("tr", true);
+        var autoId = 0;
+        this.items = new Ext.util.MixedCollection(false, function(o){
+            return o.id || ("item" + (++autoId));
+        });
+        if(this.buttons){
+            this.add.apply(this, this.buttons);
+            delete this.buttons;
+        }
+    },
+
+    /**
+     * 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} arg1 If arg is a Toolbar.Button, 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.
+     * @param {Mixed} arg2
+     * @param {Mixed} etc
+     */
+    add : function(){
+        var a = arguments, l = a.length;
+        for(var i = 0; i < l; i++){
+            var el = a[i];
+            if(el.applyTo){ // some kind of form field
+                this.addField(el);
+            }else if(el.render){ // some kind of Toolbar.Item
+                this.addItem(el);
+            }else if(typeof el == "string"){ // string
+                if(el == "separator" || el == "-"){
+                    this.addSeparator();
+                }else if(el == " "){
+                    this.addSpacer();
+                }else{
+                    this.addText(el);
+                }
+            }else if(el.tagName){ // element
+                this.addElement(el);
+            }else if(typeof el == "object"){ // must be button config?
+                this.addButton(el);
+            }
+        }
+    },
+    
+    /**
+     * Returns the element for this toolbar
+     * @return {Ext.Element}
+     */
+    getEl : function(){
+        return this.el;  
+    },
+    
+    /**
+     * Adds a separator
+     * @return {Ext.Toolbar.Item} The separator item
+     */
+    addSeparator : function(){
+        return this.addItem(new Ext.Toolbar.Separator());
+    },
+
+    /**
+     * Adds a spacer element
+     * @return {Ext.Toolbar.Item} The spacer item
+     */
+    addSpacer : function(){
+        return this.addItem(new Ext.Toolbar.Spacer());
+    },
+
+    /**
+     * Adds any standard HTML element to the toolbar
+     * @param {String/HTMLElement/Element} el The element or id of the element to add
+     * @return {Ext.Toolbar.Item} The element's item
+     */
+    addElement : function(el){
+        return this.addItem(new Ext.Toolbar.Item(el));
+    },
+    
+    /**
+     * Adds any Toolbar.Item or subclass
+     * @param {Toolbar.Item} item
+     * @return {Ext.Toolbar.Item} The item
+     */
+    addItem : function(item){
+        var td = this.nextBlock();
+        item.render(td);
+        this.items.add(item);
+        return item;
+    },
+    
+    /**
+     * Add a button (or buttons), see {@link Ext.Toolbar.Button} for more info on the config
+     * @param {Object/Array} config A button config or array of configs
+     * @return {Ext.Toolbar.Button/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 Ext.Toolbar.Button)){
+             b = new Ext.Toolbar.Button(config);
+        }
+        var td = this.nextBlock();
+        b.render(td);
+        this.items.add(b);
+        return b;
+    },
+    
+    /**
+     * Adds text to the toolbar
+     * @param {String} text The text to add
+     * @return {Ext.Toolbar.Item} The element's item
+     */
+    addText : function(text){
+        return this.addItem(new Ext.Toolbar.TextItem(text));
+    },
+    
+    /**
+     * Inserts any Toolbar.Item/Toolbar.Button at the specified index
+     * @param {Number} index The index where the item is to be inserted
+     * @param {Object/Toolbar.Item/Toolbar.Button (may be Array)} item The button, or button config object to be inserted.
+     * @return {Ext.Toolbar.Button/Item}
+     */
+    insertButton : function(index, item){
+        if(item instanceof Array){
+            var buttons = [];
+            for(var i = 0, len = item.length; i < len; i++) {
+               buttons.push(this.insertButton(index + i, item[i]));
+            }
+            return buttons;
+        }
+        if (!(item instanceof Ext.Toolbar.Button)){
+           item = new Ext.Toolbar.Button(item);
+        }
+        var td = document.createElement("td");
+        this.tr.insertBefore(td, this.tr.childNodes[index]);
+        item.render(td);
+        this.items.insert(index, item);
+        return item;
+    },
+    
+    /**
+     * Adds a new element to the toolbar from the passed DomHelper config
+     * @param {Object} config
+     * @return {Ext.Toolbar.Item} The element's item
+     */
+    addDom : function(config, returnEl){
+        var td = this.nextBlock();
+        Ext.DomHelper.overwrite(td, config);
+        var ti = new Ext.Toolbar.Item(td.firstChild);
+        ti.render(td);
+        this.items.add(ti);
+        return ti;
+    },
+
+    /**
+     * Add a dynamically rendered Ext.form field (TextField, ComboBox, etc). Note: the field should not have
+     * been rendered yet. For a field that has already been rendered, use addElement.
+     * @param {Field} field
+     * @return {ToolbarItem}
+     */
+    addField : function(field){
+        var td = this.nextBlock();
+        field.render(td);
+        var ti = new Ext.Toolbar.Item(td.firstChild);
+        ti.render(td);
+        this.items.add(ti);
+        return ti;
+    },
+
+    // private
+    nextBlock : function(){
+        var td = document.createElement("td");
+        this.tr.appendChild(td);
+        return td;
+    }
+};
+
+/**
+ * @class Ext.Toolbar.Item
+ * The base class that other classes should extend in order to get some basic common toolbar item functionality.
+ * @constructor
+ * Creates a new Item
+ * @param {HTMLElement} el 
+ */
+Ext.Toolbar.Item = function(el){
+    this.el = Ext.getDom(el);
+    this.id = Ext.id(this.el);
+    this.hidden = false;
+};
+
+Ext.Toolbar.Item.prototype = {
+    
+    /**
+     * Get this item's HTML Element
+     * @return {HTMLElement}
+     */
+    getEl : function(){
+       return this.el;  
+    },
+
+    // private
+    render : function(td){
+        this.td = td;
+        td.appendChild(this.el);
+    },
+    
+    /**
+     * Remove and destroy this button
+     */
+    destroy : function(){
+        this.td.parentNode.removeChild(this.td);
+    },
+    
+    /**
+     * Show this item
+     */
+    show: function(){
+        this.hidden = false;
+        this.td.style.display = "";
+    },
+    
+    /**
+     * Hide this item
+     */
+    hide: function(){
+        this.hidden = true;
+        this.td.style.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();
+        }
+    },
+    
+    /**
+     * Try to focus this item
+     */
+    focus : function(){
+        Ext.fly(this.el).focus();
+    },
+    
+    /**
+     * Disable this item
+     */
+    disable : function(){
+        Ext.fly(this.td).addClass("x-item-disabled");
+        this.disabled = true;
+        this.el.disabled = true;
+    },
+    
+    /**
+     * Enable this item
+     */
+    enable : function(){
+        Ext.fly(this.td).removeClass("x-item-disabled");
+        this.disabled = false;
+        this.el.disabled = false;
+    }
+};
+
+
+/**
+ * @class Ext.Toolbar.Separator
+ * @extends Ext.Toolbar.Item
+ * A simple toolbar separator class
+ * @constructor
+ * Creates a new Separator
+ */
+Ext.Toolbar.Separator = function(){
+    var s = document.createElement("span");
+    s.className = "ytb-sep";
+    Ext.Toolbar.Separator.superclass.constructor.call(this, s);
+};
+Ext.extend(Ext.Toolbar.Separator, Ext.Toolbar.Item);
+
+/**
+ * @class Ext.Toolbar.Spacer
+ * @extends Ext.Toolbar.Item
+ * A simple element that adds extra horizontal space to a toolbar.
+ * @constructor
+ * Creates a new Spacer
+ */
+Ext.Toolbar.Spacer = function(){
+    var s = document.createElement("div");
+    s.className = "ytb-spacer";
+    Ext.Toolbar.Separator.superclass.constructor.call(this, s);
+};
+Ext.extend(Ext.Toolbar.Spacer, Ext.Toolbar.Item);
+
+/**
+ * @class Ext.Toolbar.TextItem
+ * @extends Ext.Toolbar.Item
+ * A simple class that renders text directly into a toolbar.
+ * @constructor
+ * Creates a new TextItem
+ * @param {String} text
+ */
+Ext.Toolbar.TextItem = function(text){
+    var s = document.createElement("span");
+    s.className = "ytb-text";
+    s.innerHTML = text;
+    Ext.Toolbar.TextItem.superclass.constructor.call(this, s);
+};
+Ext.extend(Ext.Toolbar.TextItem, Ext.Toolbar.Item);
+
+/**
+ * @class Ext.Toolbar.Button
+ * @extends Ext.Button
+ * A button that renders into a toolbar.
+ * @constructor
+ * Creates a new Button
+ * @param {Object} config A standard {@link Ext.Button} config object
+ */
+Ext.Toolbar.Button = function(config){
+    Ext.Toolbar.Button.superclass.constructor.call(this, null, config);
+};
+Ext.extend(Ext.Toolbar.Button, Ext.Button, {
+    render : function(td){
+        this.td = td;
+        Ext.Toolbar.Button.superclass.render.call(this, td);
+    },
+    
+    /**
+     * Remove and destroy this button
+     */
+    destroy : function(){
+        Ext.Toolbar.Button.superclass.destroy.call(this);
+        this.td.parentNode.removeChild(this.td);
+    },
+    
+    /**
+     * Show this button
+     */
+    show: function(){
+        this.hidden = false;
+        this.td.style.display = "";
+    },
+    
+    /**
+     * Hide this button
+     */
+    hide: function(){
+        this.hidden = true;
+        this.td.style.display = "none";
+    },
+
+    /**
+     * Disable this item
+     */
+    disable : function(){
+        Ext.fly(this.td).addClass("x-item-disabled");
+        this.disabled = true;
+    },
+
+    /**
+     * Enable this item
+     */
+    enable : function(){
+        Ext.fly(this.td).removeClass("x-item-disabled");
+        this.disabled = false;
+    }
+});
+// backwards compat
+Ext.ToolbarButton = Ext.Toolbar.Button;
+
+/**
+ * @class Ext.Toolbar.MenuButton
+ * @extends Ext.MenuButton
+ * A menu button that renders into a toolbar.
+ * @constructor
+ * Creates a new MenuButton
+ * @param {Object} config A standard {@link Ext.MenuButton} config object
+ */
+Ext.Toolbar.MenuButton = function(config){
+    Ext.Toolbar.MenuButton.superclass.constructor.call(this, null, config);
+};
+Ext.extend(Ext.Toolbar.MenuButton, Ext.MenuButton, {
+    render : function(td){
+        this.td = td;
+        Ext.Toolbar.MenuButton.superclass.render.call(this, td);
+    },
+    
+    /**
+     * Remove and destroy this button
+     */
+    destroy : function(){
+        Ext.Toolbar.MenuButton.superclass.destroy.call(this);
+        this.td.parentNode.removeChild(this.td);
+    },
+    
+    /**
+     * Show this button
+     */
+    show: function(){
+        this.hidden = false;
+        this.td.style.display = "";
+    },
+    
+    /**
+     * Hide this button
+     */
+    hide: function(){
+        this.hidden = true;
+        this.td.style.display = "none";
+    }
+});
+
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Tree.jss.html b/www/extras/yui-ext/docs/output/Tree.jss.html new file mode 100644 index 000000000..d01bc867d --- /dev/null +++ b/www/extras/yui-ext/docs/output/Tree.jss.html @@ -0,0 +1,722 @@ +Tree.js

Tree.js

/**
+ * @class Ext.data.Tree
+ * @extends Ext.util.Observable
+ * Represents a tree data structure and bubbles all the events for its nodes. The nodes
+ * in the tree have most standard DOM functionality.
+ * @constructor
+ * @param {Node} root (optional) The root node 
+ */
+Ext.data.Tree = function(root){
+   this.nodeHash = {};
+   /**
+    * The root node for this tree
+    * @type Node
+    */
+   this.root = null;
+   if(root){
+       this.setRootNode(root);
+   }
+   this.addEvents({
+       /**
+        * @event append
+        * Fires when a new child node is appended to a node in this tree.
+        * @param {Tree} tree The owner tree
+        * @param {Node} parent The parent node
+        * @param {Node} node The newly appended node
+        * @param {Number} index The index of the newly appended node
+        */
+       "append" : true,
+       /**
+        * @event remove
+        * Fires when a child node is removed from a node in this tree.
+        * @param {Tree} tree The owner tree
+        * @param {Node} parent The parent node
+        * @param {Node} node The child node removed
+        */
+       "remove" : true,
+       /**
+        * @event move
+        * Fires when a node is moved to a new location in the tree
+        * @param {Tree} tree The owner tree
+        * @param {Node} node The node moved
+        * @param {Node} oldParent The old parent of this node
+        * @param {Node} newParent The new parent of this node
+        * @param {Number} index The index it was moved to
+        */
+       "move" : true,
+       /**
+        * @event insert
+        * Fires when a new child node is inserted in a node in this tree.
+        * @param {Tree} tree The owner tree
+        * @param {Node} parent The parent node 
+        * @param {Node} node The child node inserted
+        * @param {Node} refNode The child node the node was inserted before
+        */
+       "insert" : true,
+       /**
+        * @event beforeappend
+        * Fires before a new child is appended to a node in this tree, return false to cancel the append.
+        * @param {Tree} tree The owner tree
+        * @param {Node} parent The parent node 
+        * @param {Node} node The child node to be appended
+        */
+       "beforeappend" : true,
+       /**
+        * @event beforeremove
+        * Fires before a child is removed from a node in this tree, return false to cancel the remove.
+        * @param {Tree} tree The owner tree
+        * @param {Node} parent The parent node 
+        * @param {Node} node The child node to be removed
+        */
+       "beforeremove" : true,
+       /**
+        * @event beforemove
+        * Fires before a node is moved to a new location in the tree. Return false to cancel the move.
+        * @param {Tree} tree The owner tree
+        * @param {Node} node The node being moved
+        * @param {Node} oldParent The parent of the node
+        * @param {Node} newParent The new parent the node is moving to
+        * @param {Number} index The index it is being moved to
+        */
+       "beforemove" : true,
+       /**
+        * @event beforeinsert
+        * Fires before a new child is inserted in a node in this tree, return false to cancel the insert.
+        * @param {Tree} tree The owner tree
+        * @param {Node} parent The parent node 
+        * @param {Node} node The child node to be inserted
+        * @param {Node} refNode The child node the node is being inserted before
+        */
+       "beforeinsert" : true
+   });
+
+    Ext.data.Tree.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.data.Tree, Ext.util.Observable, {
+    pathSeparator: "/",
+    
+    /**
+     * Returns this root node for this tree
+     * @return {Node}
+     */
+    getRootNode : function(){
+        return this.root;
+    },
+    
+    /**
+     * Sets the root node for this tree
+     * @param {Node} node
+     * @return {Node}
+     */
+    setRootNode : function(node){
+        this.root = node;
+        node.ownerTree = this;
+        node.isRoot = true;
+        this.registerNode(node);
+        return node;
+    },
+    
+    /**
+     * Gets a node in this tree by its id
+     * @param {String} id
+     * @return {Node}
+     */
+    getNodeById : function(id){
+        return this.nodeHash[id];
+    },
+    
+    registerNode : function(node){
+        this.nodeHash[node.id] = node;
+    },
+    
+    unregisterNode : function(node){
+        delete this.nodeHash[node.id];
+    },
+    
+    toString : function(){
+        return "[Tree"+(this.id?" "+this.id:"")+"]";
+    }  
+});
+
+/**
+ * @class Ext.data.Node
+ * @extends Ext.util.Observable
+ * @cfg {Boolean} leaf true if this node is a leaf and does not have children
+ * @cfg {String} id The id for this node. If one is not specified, one is generated.
+ * @constructor
+ * @param {Object} attributes The attributes/config for the node 
+ */
+Ext.data.Node = function(attributes){
+    /**
+     * The attributes supplied for the node. You can use this property to access any custom attributes you supplied.
+     * @type {Object}
+     */
+    this.attributes = attributes || {};
+    this.leaf = this.attributes.leaf;
+    /**
+     * The node id. @type String
+     */
+    this.id = this.attributes.id;
+    if(!this.id){
+        this.id = Ext.id(null, "ynode-");
+        this.attributes.id = this.id;
+    }
+    /**
+     * All child nodes of this node. @type Array
+     */
+    this.childNodes = [];
+    if(!this.childNodes.indexOf){ // indexOf is a must
+        this.childNodes.indexOf = function(o){
+            for(var i = 0, len = this.length; i < len; i++){
+                if(this[i] == o) return i;
+            }
+            return -1;
+        };
+    }
+    /**
+     * The parent node for this node. @type Node
+     */
+    this.parentNode = null;
+    /**
+     * The first direct child node of this node, or null if this node has no child nodes. @type Node
+     */
+    this.firstChild = null;
+    /**
+     * The last direct child node of this node, or null if this node has no child nodes. @type Node
+     */
+    this.lastChild = null;
+    /**
+     * The node immediately preceding this node in the tree, or null if there is no sibling node. @type Node
+     */
+    this.previousSibling = null;
+    /**
+     * The node immediately following this node in the tree, or null if there is no sibling node. @type Node
+     */
+    this.nextSibling = null;
+    
+    this.addEvents({
+       /**
+        * @event append
+        * Fires when a new child node is appended
+        * @param {Tree} tree The owner tree
+        * @param {Node} this This node
+        * @param {Node} node The newly appended node
+        * @param {Number} index The index of the newly appended node
+        */
+       "append" : true,
+       /**
+        * @event remove
+        * Fires when a child node is removed
+        * @param {Tree} tree The owner tree
+        * @param {Node} this This node
+        * @param {Node} node The removed node
+        */
+       "remove" : true,
+       /**
+        * @event move
+        * Fires when this node is moved to a new location in the tree
+        * @param {Tree} tree The owner tree
+        * @param {Node} this This node
+        * @param {Node} oldParent The old parent of this node
+        * @param {Node} newParent The new parent of this node
+        * @param {Number} index The index it was moved to
+        */
+       "move" : true,
+       /**
+        * @event insert
+        * Fires when a new child node is inserted.
+        * @param {Tree} tree The owner tree
+        * @param {Node} this This node
+        * @param {Node} node The child node inserted
+        * @param {Node} refNode The child node the node was inserted before
+        */
+       "insert" : true,
+       /**
+        * @event beforeappend
+        * Fires before a new child is appended, return false to cancel the append.
+        * @param {Tree} tree The owner tree
+        * @param {Node} this This node
+        * @param {Node} node The child node to be appended
+        */
+       "beforeappend" : true,
+       /**
+        * @event beforeremove
+        * Fires before a child is removed, return false to cancel the remove.
+        * @param {Tree} tree The owner tree
+        * @param {Node} this This node
+        * @param {Node} node The child node to be removed
+        */
+       "beforeremove" : true,
+       /**
+        * @event beforemove
+        * Fires before this node is moved to a new location in the tree. Return false to cancel the move.
+        * @param {Tree} tree The owner tree
+        * @param {Node} this This node
+        * @param {Node} oldParent The parent of this node
+        * @param {Node} newParent The new parent this node is moving to
+        * @param {Number} index The index it is being moved to
+        */
+       "beforemove" : true,
+       /**
+        * @event beforeinsert
+        * Fires before a new child is inserted, return false to cancel the insert.
+        * @param {Tree} tree The owner tree
+        * @param {Node} this This node
+        * @param {Node} node The child node to be inserted
+        * @param {Node} refNode The child node the node is being inserted before
+        */
+       "beforeinsert" : true
+   });
+    this.listeners = this.attributes.listeners;
+    Ext.data.Node.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.data.Node, Ext.util.Observable, {
+    fireEvent : function(evtName){
+        // first do standard event for this node
+        if(Ext.data.Node.superclass.fireEvent.apply(this, arguments) === false){
+            return false;
+        }
+        // then bubble it up to the tree if the event wasn't cancelled
+        var ot = this.getOwnerTree();
+        if(ot){
+            if(ot.fireEvent.apply(this.ownerTree, arguments) === false){
+                return false;
+            }
+        }
+        return true;
+    },
+    
+    /**
+     * Returns true if this node is a leaf 
+     * @return {Boolean}
+     */
+    isLeaf : function(){
+        return this.leaf === true;  
+    },
+    
+    // private
+    setFirstChild : function(node){
+        this.firstChild = node;  
+    },
+    
+    //private
+    setLastChild : function(node){
+        this.lastChild = node;
+    },
+    
+    
+    /**
+     * Returns true if this node is the last child of its parent
+     * @return {Boolean}
+     */
+    isLast : function(){
+       return (!this.parentNode ? true : this.parentNode.lastChild == this);   
+    },
+    
+    /**
+     * Returns true if this node is the first child of its parent
+     * @return {Boolean}
+     */
+    isFirst : function(){
+       return (!this.parentNode ? true : this.parentNode.firstChild == this);   
+    },
+    
+    hasChildNodes : function(){
+        return !this.isLeaf() && this.childNodes.length > 0;
+    },
+    
+    /**
+     * Insert node(s) as the last child node of this node.
+     * @param {Node/Array} node The node or Array of nodes to append
+     * @return {Node} The appended node if single append, or null if an array was passed
+     */
+    appendChild : function(node){
+        var multi = false;
+        if(node instanceof Array){
+            multi = node;
+        }else if(arguments.length > 1){
+            multi = arguments;
+        }
+        // if passed an array or multiple args do them one by one
+        if(multi){
+            for(var i = 0, len = multi.length; i < len; i++) {
+            	this.appendChild(multi[i]);
+            }
+        }else{
+            if(this.fireEvent("beforeappend", this.ownerTree, this, node) === false){
+                return false;
+            }
+            var index = this.childNodes.length;
+            var oldParent = node.parentNode;
+            // it's a move, make sure we move it cleanly
+            if(oldParent){
+                if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index) === false){
+                    return false;
+                }
+                oldParent.removeChild(node);
+            }
+            index = this.childNodes.length;
+            if(index == 0){
+                this.setFirstChild(node);
+            }
+            this.childNodes.push(node);
+            node.parentNode = this;
+            var ps = this.childNodes[index-1];
+            if(ps){
+                node.previousSibling = ps;
+                ps.nextSibling = node;
+            }else{
+                node.previousSibling = null;
+            }
+            node.nextSibling = null;
+            this.setLastChild(node);
+            node.setOwnerTree(this.getOwnerTree());
+            this.fireEvent("append", this.ownerTree, this, node, index);
+            if(oldParent){
+                node.fireEvent("move", this.ownerTree, node, oldParent, this, index);
+            }
+            return node;
+        }
+    },
+    
+    /**
+     * Removes a child node from this node.
+     * @param {Node} node The node to remove
+     * @return {Node} The removed node
+     */
+    removeChild : function(node){
+        var index = this.childNodes.indexOf(node);
+        if(index == -1){
+            return false;
+        }
+        if(this.fireEvent("beforeremove", this.ownerTree, this, node) === false){
+            return false;
+        }
+            
+        // remove it from childNodes collection
+        this.childNodes.splice(index, 1);
+        
+        // update siblings
+        if(node.previousSibling){
+            node.previousSibling.nextSibling = node.nextSibling;
+        }
+        if(node.nextSibling){
+            node.nextSibling.previousSibling = node.previousSibling;
+        }
+        
+        // update child refs
+        if(this.firstChild == node){
+            this.setFirstChild(node.nextSibling);
+        }
+        if(this.lastChild == node){
+            this.setLastChild(node.previousSibling);
+        }
+        
+        node.setOwnerTree(null);
+        // clear any references from the node
+        node.parentNode = null;
+        node.previousSibling = null;
+        node.nextSibling = null;
+        this.fireEvent("remove", this.ownerTree, this, node);
+        return node;
+    },
+    
+    /**
+     * Inserts the first node before the second node in this nodes childNodes collection.
+     * @param {Node} node The node to insert
+     * @param {Node} refNode The node to insert before (if null the node is appended)
+     * @return {Node} The inserted node
+     */
+    insertBefore : function(node, refNode){
+        if(!refNode){ // like standard Dom, refNode can be null for append
+            return this.appendChild(node);
+        }
+        // nothing to do
+        if(node == refNode){
+            return false;
+        }
+        
+        if(this.fireEvent("beforeinsert", this.ownerTree, this, node, refNode) === false){
+            return false;
+        }
+        var index = this.childNodes.indexOf(refNode);
+        var oldParent = node.parentNode;
+        var refIndex = index;
+        
+        // when moving internally, indexes will change after remove
+        if(oldParent == this && this.childNodes.indexOf(node) < index){
+            refIndex--;
+        }
+        
+        // it's a move, make sure we move it cleanly
+        if(oldParent){
+            if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index, refNode) === false){
+                return false;
+            }
+            oldParent.removeChild(node);
+        }
+        if(refIndex == 0){
+            this.setFirstChild(node);
+        }
+        this.childNodes.splice(refIndex, 0, node);
+        node.parentNode = this;
+        var ps = this.childNodes[refIndex-1];
+        if(ps){
+            node.previousSibling = ps;
+            ps.nextSibling = node;
+        }else{
+            node.previousSibling = null;
+        }
+        node.nextSibling = refNode;
+        refNode.previousSibling = node;
+        node.setOwnerTree(this.getOwnerTree());
+        this.fireEvent("insert", this.ownerTree, this, node, refNode);
+        if(oldParent){
+            node.fireEvent("move", this.ownerTree, node, oldParent, this, refIndex, refNode);
+        }
+        return node;
+    },
+
+    /**
+     * Returns the child node at the specified index.
+     * @param {Number} index
+     * @return {Node}
+     */
+    item : function(index){
+        return this.childNodes[index];  
+    },
+    
+    /**
+     * Replaces one child node in this node with another.
+     * @param {Node} newChild The replacement node
+     * @param {Node} oldChild The node to replace
+     * @return {Node} The replaced node
+     */
+    replaceChild : function(newChild, oldChild){
+        this.insertBefore(newChild, oldChild);
+        this.removeChild(oldChild);
+        return oldChild;
+    },
+    
+    /**
+     * Returns the index of a child node
+     * @param {Node} node
+     * @return {Number} The index of the node or -1 if it was not found
+     */
+    indexOf : function(child){
+        return this.childNodes.indexOf(child);  
+    },
+    
+    /**
+     * Returns the tree this node is in.
+     * @return {Tree}
+     */
+    getOwnerTree : function(){
+        // if it doesn't have one, look for one
+        if(!this.ownerTree){
+            var p = this;
+            while(p){
+                if(p.ownerTree){
+                    this.ownerTree = p.ownerTree;
+                    break;
+                }
+                p = p.parentNode;
+            }
+        }
+        return this.ownerTree;
+    },
+    
+    /**
+     * Returns depth of this node (the root node has a depth of 0)
+     * @return {Number}
+     */
+    getDepth : function(){
+        var depth = 0;
+        var p = this;
+        while(p.parentNode){
+            ++depth;
+            p = p.parentNode;
+        }
+        return depth;
+    },
+
+    // private
+    setOwnerTree : function(tree){
+        // if it's move, we need to update everyone
+        if(tree != this.ownerTree){
+            if(this.ownerTree){
+                this.ownerTree.unregisterNode(this);
+            }
+            this.ownerTree = tree;
+            var cs = this.childNodes;
+            for(var i = 0, len = cs.length; i < len; i++) {
+            	cs[i].setOwnerTree(tree);
+            }
+            if(tree){
+                tree.registerNode(this);
+            }
+        }
+    },
+    
+    /**
+     * Returns the path for this node. The path can be used to expand or select this node programmatically.
+     * @param {String} attr (optional) The attr to use for the path (defaults to the node's id)
+     * @return {String} The path
+     */
+    getPath : function(attr){
+        attr = attr || "id";
+        var p = this.parentNode;
+        var b = [this.attributes[attr]];
+        while(p){
+            b.unshift(p.attributes[attr]);
+            p = p.parentNode;
+        }
+        var sep = this.getOwnerTree().pathSeparator;
+        return sep + b.join(sep);
+    },
+    
+    /**
+     * Bubbles up the tree from this node, calling the specified function with each node. The scope (<i>this</i>) of 
+     * function call will be the scope provided or the current node. The arguments to the function
+     * will be the args provided or the current node. If the function returns false at any point, 
+     * the bubble is stopped.
+     * @param {Function} fn The function to call
+     * @param {Object} scope (optional) The scope of the function (defaults to current node)
+     * @param {Array} args (optional) The args to call the function with (default to passing the current node)
+     */
+    bubble : function(fn, scope, args){
+        var p = this;
+        while(p){
+            if(fn.call(scope || p, args || p) === false){
+                break;
+            }
+            p = p.parentNode;
+        }
+    },
+    
+    /**
+     * Cascades down the tree from this node, calling the specified function with each node. The scope (<i>this</i>) of 
+     * function call will be the scope provided or the current node. The arguments to the function
+     * will be the args provided or the current node. If the function returns false at any point, 
+     * the cascade is stopped on that branch.
+     * @param {Function} fn The function to call
+     * @param {Object} scope (optional) The scope of the function (defaults to current node)
+     * @param {Array} args (optional) The args to call the function with (default to passing the current node)
+     */
+    cascade : function(fn, scope, args){
+        if(fn.call(scope || this, args || this) !== false){
+            var cs = this.childNodes;
+            for(var i = 0, len = cs.length; i < len; i++) {
+            	cs[i].cascade(fn, scope, args);
+            }
+        }
+    },
+    
+    /**
+     * Interates the child nodes of this node, calling the specified function with each node. The scope (<i>this</i>) of 
+     * function call will be the scope provided or the current node. The arguments to the function
+     * will be the args provided or the current node. If the function returns false at any point, 
+     * the iteration stops.
+     * @param {Function} fn The function to call
+     * @param {Object} scope (optional) The scope of the function (defaults to current node)
+     * @param {Array} args (optional) The args to call the function with (default to passing the current node)
+     */
+    eachChild : function(fn, scope, args){
+        var cs = this.childNodes;
+        for(var i = 0, len = cs.length; i < len; i++) {
+        	if(fn.call(scope || this, args || cs[i]) === false){
+        	    break;
+        	}
+        }
+    },
+    
+    /**
+     * Finds the first child that has the attribute with the specified value.
+     * @param {String} attribute The attribute name
+     * @param {Mixed} value The value to search for
+     * @return {Node} The found child or null if none was found
+     */
+    findChild : function(attribute, value){
+        var cs = this.childNodes;
+        for(var i = 0, len = cs.length; i < len; i++) {
+        	if(cs[i].attributes[attribute] == value){
+        	    return cs[i];
+        	}
+        }
+        return null;
+    },
+
+    /**
+     * Finds the first child by a custom function. The child matches if the function passed
+     * returns true.
+     * @param {Function} fn
+     * @param {Object} scope (optional)
+     * @return {Node} The found child or null if none was found
+     */
+    findChildBy : function(fn, scope){
+        var cs = this.childNodes;
+        for(var i = 0, len = cs.length; i < len; i++) {
+        	if(fn.call(scope||cs[i], cs[i]) === true){
+        	    return cs[i];
+        	}
+        }
+        return null;
+    },
+
+    /**
+     * Sorts this nodes children using the supplied sort function
+     * @param {Function} fn
+     * @param {Object} scope (optional)
+     */
+    sort : function(fn, scope){
+        var cs = this.childNodes;
+        var len = cs.length;
+        if(len > 0){
+            var sortFn = scope ? function(){fn.apply(scope, arguments);} : fn;
+            cs.sort(sortFn);
+            for(var i = 0; i < len; i++){
+                var n = cs[i];
+                n.previousSibling = cs[i-1];
+                n.nextSibling = cs[i+1];
+                if(i == 0){
+                    this.setFirstChild(n);
+                }
+                if(i == len-1){
+                    this.setLastChild(n);
+                }
+            }
+        }
+    },
+    
+    /**
+     * Returns true if this node is an ancestor (at any point) of the passed node.
+     * @param {Node} node
+     * @return {Boolean}
+     */
+    contains : function(node){
+        return node.isAncestor(this);
+    },
+    
+    /**
+     * Returns true if the passed node is an ancestor (at any point) of this node.
+     * @param {Node} node
+     * @return {Boolean}
+     */
+    isAncestor : function(node){
+        var p = this.parentNode;
+        while(p){
+            if(p == node){
+                return true;
+            }
+            p = p.parentNode;
+        }
+        return false;
+    },
+    
+    toString : function(){
+        return "[Node"+(this.id?" "+this.id:"")+"]";
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TreeDragZone.jss.html b/www/extras/yui-ext/docs/output/TreeDragZone.jss.html new file mode 100644 index 000000000..8c0c05ac7 --- /dev/null +++ b/www/extras/yui-ext/docs/output/TreeDragZone.jss.html @@ -0,0 +1,44 @@ +TreeDragZone.js

TreeDragZone.js

if(Ext.dd.DragZone){
+Ext.tree.TreeDragZone = function(tree, config){
+    Ext.tree.TreeDragZone.superclass.constructor.call(this, tree.getEl(), config);
+    this.tree = tree;
+};
+
+Ext.extend(Ext.tree.TreeDragZone, Ext.dd.DragZone, {
+    ddGroup : "TreeDD",
+    
+    onBeforeDrag : function(data, e){
+        var n = data.node;
+        return n && n.draggable && !n.disabled;
+    },
+    
+    onInitDrag : function(e){
+        var data = this.dragData;
+        this.tree.getSelectionModel().select(data.node);
+        this.proxy.update("");
+        data.node.ui.appendDDGhost(this.proxy.ghost.dom);
+        this.tree.fireEvent("startdrag", this.tree, data.node, e);
+    },
+    
+    getRepairXY : function(e, data){
+        return data.node.ui.getDDRepairXY();
+    },
+    
+    onEndDrag : function(data, e){
+        this.tree.fireEvent("enddrag", this.tree, data.node, e);
+    },
+    
+    onValidDrop : function(dd, e, id){
+        this.tree.fireEvent("dragdrop", this.tree, this.dragData.node, dd, e);
+        this.hideProxy();
+    },
+    
+    beforeInvalidDrop : function(e, id){
+        // this scrolls the original position back into view
+        var sm = this.tree.getSelectionModel();
+        sm.clearSelections();
+        sm.select(this.dragData.node);
+    }
+});
+}

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TreeDropZone.jss.html b/www/extras/yui-ext/docs/output/TreeDropZone.jss.html new file mode 100644 index 000000000..fb8ac94fe --- /dev/null +++ b/www/extras/yui-ext/docs/output/TreeDropZone.jss.html @@ -0,0 +1,235 @@ +TreeDropZone.js

TreeDropZone.js

if(Ext.dd.DropZone){
+    
+Ext.tree.TreeDropZone = function(tree, config){
+    this.allowParentInsert = false;
+    this.allowContainerDrop = false;
+    this.appendOnly = false;
+    Ext.tree.TreeDropZone.superclass.constructor.call(this, tree.container, config);
+    this.tree = tree;
+    this.lastInsertClass = "x-tree-no-status";
+    this.dragOverData = {};
+};
+
+Ext.extend(Ext.tree.TreeDropZone, Ext.dd.DropZone, {
+    ddGroup : "TreeDD",
+    
+    expandDelay : 1000,
+    
+    expandNode : function(node){
+        if(node.hasChildNodes() && !node.isExpanded()){
+            node.expand(false, null, this.triggerCacheRefresh.createDelegate(this));
+        }
+    },
+    
+    queueExpand : function(node){
+        this.expandProcId = this.expandNode.defer(this.expandDelay, this, [node]);
+    },
+    
+    cancelExpand : function(){
+        if(this.expandProcId){
+            clearTimeout(this.expandProcId);
+            this.expandProcId = false;
+        }
+    },
+    
+    isValidDropPoint : function(n, pt, dd, e, data){
+        if(!n || !data){ return false; }
+        var targetNode = n.node;
+        var dropNode = data.node;
+        // default drop rules
+        if(!(targetNode && targetNode.isTarget && pt)){
+            return false;
+        }
+        if(pt == "append" && targetNode.allowChildren === false){
+            return false;
+        }
+        if((pt == "above" || pt == "below") && (targetNode.parentNode && targetNode.parentNode.allowChildren === false)){
+            return false;
+        }
+        if(dropNode && (targetNode == dropNode || dropNode.contains(targetNode))){
+            return false;
+        }
+        // reuse the object
+        var overEvent = this.dragOverData;
+        overEvent.tree = this.tree;
+        overEvent.target = targetNode;
+        overEvent.data = data;
+        overEvent.point = pt;
+        overEvent.source = dd;
+        overEvent.rawEvent = e;
+        overEvent.dropNode = dropNode;
+        overEvent.cancel = false;  
+        var result = this.tree.fireEvent("nodedragover", overEvent);
+        return overEvent.cancel === false && result !== false;
+    },
+    
+    getDropPoint : function(e, n, dd){
+        var tn = n.node;
+        if(tn.isRoot){
+            return tn.allowChildren !== false ? "append" : false; // always append for root
+        }
+        var dragEl = n.ddel;
+        var t = Ext.lib.Dom.getY(dragEl), b = t + dragEl.offsetHeight;
+        var y = Ext.lib.Event.getPageY(e);
+        var noAppend = tn.allowChildren === false || tn.isLeaf();
+        if(this.appendOnly || tn.parentNode.allowChildren === false){
+            return noAppend ? false : "append";
+        }
+        var noBelow = false;
+        if(!this.allowParentInsert){
+            noBelow = tn.hasChildNodes() && tn.isExpanded();
+        }
+        var q = (b - t) / (noAppend ? 2 : 3);
+        if(y >= t && y < (t + q)){
+            return "above";
+        }else if(!noBelow && (noAppend || y >= b-q && y <= b)){
+            return "below";
+        }else{
+            return "append";
+        }
+    },
+    
+    onNodeEnter : function(n, dd, e, data){
+        this.cancelExpand();
+    },
+    
+    onNodeOver : function(n, dd, e, data){
+        var pt = this.getDropPoint(e, n, dd);
+        var node = n.node;
+        
+        // auto node expand check
+        if(!this.expandProcId && pt == "append" && node.hasChildNodes() && !n.node.isExpanded()){
+            this.queueExpand(node);
+        }else if(pt != "append"){
+            this.cancelExpand();
+        }
+        
+        // set the insert point style on the target node
+        var returnCls = this.dropNotAllowed;
+        if(this.isValidDropPoint(n, pt, dd, e, data)){
+           if(pt){
+               var el = n.ddel;
+               var cls;
+               if(pt == "above"){
+                   returnCls = n.node.isFirst() ? "x-tree-drop-ok-above" : "x-tree-drop-ok-between";
+                   cls = "x-tree-drag-insert-above";
+               }else if(pt == "below"){
+                   returnCls = n.node.isLast() ? "x-tree-drop-ok-below" : "x-tree-drop-ok-between";
+                   cls = "x-tree-drag-insert-below";
+               }else{
+                   returnCls = "x-tree-drop-ok-append";
+                   cls = "x-tree-drag-append";
+               }
+               if(this.lastInsertClass != cls){
+                   Ext.fly(el).replaceClass(this.lastInsertClass, cls);
+                   this.lastInsertClass = cls;
+               }
+           }
+       }
+       return returnCls;
+    },
+    
+    onNodeOut : function(n, dd, e, data){
+        this.cancelExpand();
+        this.removeDropIndicators(n);
+    },
+    
+    onNodeDrop : function(n, dd, e, data){
+        var point = this.getDropPoint(e, n, dd);
+        var targetNode = n.node;
+        targetNode.ui.startDrop();
+        if(!this.isValidDropPoint(n, point, dd, e, data)){
+            targetNode.ui.endDrop();
+            return false;
+        }
+        // first try to find the drop node
+        var dropNode = data.node || (dd.getTreeNode ? dd.getTreeNode(data, targetNode, point, e) : null);
+        var dropEvent = {
+            tree : this.tree,
+            target: targetNode,
+            data: data,
+            point: point,
+            source: dd,
+            rawEvent: e,
+            dropNode: dropNode,
+            cancel: !dropNode   
+        };
+        var retval = this.tree.fireEvent("beforenodedrop", dropEvent);
+        if(retval === false || dropEvent.cancel === true || !dropEvent.dropNode){
+            targetNode.ui.endDrop();
+            return false;
+        }
+        // allow target changing
+        targetNode = dropEvent.target;
+        if(point == "append" && !targetNode.isExpanded()){
+            targetNode.expand(false, null, function(){
+                this.completeDrop(dropEvent);
+            }.createDelegate(this));
+        }else{
+            this.completeDrop(dropEvent);
+        }
+        return true;
+    },
+    
+    completeDrop : function(de){
+        var ns = de.dropNode, p = de.point, t = de.target;
+        if(!(ns instanceof Array)){
+            ns = [ns];
+        }
+        var n;
+        for(var i = 0, len = ns.length; i < len; i++){
+            n = ns[i];
+            if(p == "above"){
+                t.parentNode.insertBefore(n, t);
+            }else if(p == "below"){
+                t.parentNode.insertBefore(n, t.nextSibling);
+            }else{
+                t.appendChild(n);
+            }
+        }
+        n.ui.focus();
+        if(this.tree.hlDrop){
+            n.ui.highlight();
+        }
+        t.ui.endDrop();
+        this.tree.fireEvent("nodedrop", de);
+    },
+    
+    afterNodeMoved : function(dd, data, e, targetNode, dropNode){
+        if(this.tree.hlDrop){
+            dropNode.ui.focus();
+            dropNode.ui.highlight();
+        }
+        this.tree.fireEvent("nodedrop", this.tree, targetNode, data, dd, e);
+    },
+    
+    getTree : function(){
+        return this.tree;
+    },
+    
+    removeDropIndicators : function(n){
+        if(n && n.ddel){
+            var el = n.ddel;
+            Ext.fly(el).removeClass([
+                    "x-tree-drag-insert-above",
+                    "x-tree-drag-insert-below",
+                    "x-tree-drag-append"]);
+            this.lastInsertClass = "_noclass";
+        }
+    },
+    
+    beforeDragDrop : function(target, e, id){
+        this.cancelExpand();
+        return true;
+    },
+    
+    afterRepair : function(data){
+        if(data && Ext.enableFx){
+            data.node.ui.highlight();
+        }
+        this.hideProxy();
+    }    
+});
+
+}

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TreeEditor.jss.html b/www/extras/yui-ext/docs/output/TreeEditor.jss.html new file mode 100644 index 000000000..98b2b1297 --- /dev/null +++ b/www/extras/yui-ext/docs/output/TreeEditor.jss.html @@ -0,0 +1,70 @@ +TreeEditor.js

TreeEditor.js

Ext.tree.TreeEditor = function(tree, config){
+    config = config || {};
+    // config can either be a prebuilt field, or a field config
+    var field = config.events ? config : new Ext.form.TextField(config);
+    Ext.tree.TreeEditor.superclass.constructor.call(this, field);
+
+    this.tree = tree;
+
+    tree.on('beforeclick', this.beforeNodeClick, this);
+    tree.el.on('mousedown', this.hide, this);
+    this.on('complete', this.updateNode, this);
+    this.on('beforestartedit', this.fitToTree, this);
+    this.on('startedit', this.bindScroll, this, {delay:10});
+    this.on('specialkey', this.onSpecialKey, this);
+};
+
+Ext.extend(Ext.tree.TreeEditor, Ext.Editor, {
+    alignment: "l-l",
+    autoSize: false,
+    hideEl : false,
+    cls: "x-small-editor x-tree-editor",
+    shim:false,
+    shadow:"frame",
+    maxWidth: 250,
+
+    fitToTree : function(ed, el){
+        var td = this.tree.el.dom, nd = el.dom;
+        if(td.scrollLeft >  nd.offsetLeft){ // ensure the node left point is visible
+            td.scrollLeft = nd.offsetLeft;
+        }
+        var w = Math.min(
+                this.maxWidth,
+                (td.clientWidth > 20 ? td.clientWidth : td.offsetWidth) - Math.max(0, nd.offsetLeft-td.scrollLeft) - /*cushion*/5);
+        this.setSize(w, '');
+    },
+
+    triggerEdit : function(node){
+        this.completeEdit();
+        this.editNode = node;
+        this.startEdit(node.ui.textNode, node.text);
+    },
+
+    bindScroll : function(){
+        this.tree.el.on('scroll', this.cancelEdit, this);
+    },
+
+    beforeNodeClick : function(node){
+        if(this.tree.getSelectionModel().isSelected(node)){
+            this.triggerEdit(node);
+            return false;
+        }
+    },
+
+    updateNode : function(ed, value){
+        this.tree.el.un('scroll', this.cancelEdit, this);
+        this.editNode.setText(value);
+    },
+
+    onSpecialKey : function(field, e){
+        var k = e.getKey();
+        if(k == e.ESC){
+            this.cancelEdit();
+            e.stopEvent();
+        }else if(k == e.ENTER && !e.hasModifier()){
+            this.completeEdit();
+            e.stopEvent();
+        }
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TreeFilter.jss.html b/www/extras/yui-ext/docs/output/TreeFilter.jss.html new file mode 100644 index 000000000..91cb85e69 --- /dev/null +++ b/www/extras/yui-ext/docs/output/TreeFilter.jss.html @@ -0,0 +1,107 @@ +TreeFilter.js

TreeFilter.js

/**
+ * This doesn't update the indent (lines) or expand collapse icons of the nodes
+ */
+Ext.tree.TreeFilter = function(tree, config){
+    this.tree = tree;
+    this.filtered = {};
+    Ext.apply(this, config, {
+        clearBlank:false,
+        reverse:false,
+        autoClear:false,
+        remove:false
+    });
+};
+
+Ext.tree.TreeFilter.prototype = {
+     /**
+     * Filter the data by a specific attribute.
+     * @param {String/RegExp} value Either string that the attribute value 
+     * should start with or a RegExp to test against the attribute
+     * @param {String} attr (optional) The attribute passed in your node's attributes collection. Defaults to "text".
+     * @param {TreeNode} startNode (optional) The node to start the filter at.
+     */
+    filter : function(value, attr, startNode){
+        attr = attr || "text";
+        var f;
+        if(typeof value == "string"){
+            var vlen = value.length;
+            // auto clear empty filter
+            if(vlen == 0 && this.clearBlank){
+                this.clearFilter();
+                return;
+            }
+            value = value.toLowerCase();
+            f = function(n){
+                return n.attributes[attr].substr(0, vlen).toLowerCase() == value;
+            };
+        }else if(value.exec){ // regex?
+            f = function(n){
+                return value.test(n.attributes[attr]);
+            };
+        }else{
+            throw 'Illegal filter type, must be string or regex';
+        }
+        this.filterBy(f, null, startNode);
+	},
+    
+    /**
+     * Filter by a function. The passed function will be called with each 
+     * node in the tree (or from the startNode). If the function returns true, the node is kept 
+     * otherwise it is filtered. If a node is filtered, its children are also filtered.
+     * @param {Function} fn The filter function
+     * @param {Object} scope (optional) The scope of the function (defaults to the current node) 
+     */
+    filterBy : function(fn, scope, startNode){
+        startNode = startNode || this.tree.root;
+        if(this.autoClear){
+            this.clearFilter();
+        }
+        var af = this.filtered, rv = this.reverse;
+        var f = function(n){
+            if(n == startNode){
+                return true;
+            }
+            if(af[n.id]){
+                return false;
+            }
+            var m = fn.call(scope || n, n);
+            if(!m || rv){
+                af[n.id] = n;
+                n.ui.hide();
+                return false;
+            }
+            return true;
+        };
+        startNode.cascade(f);
+        if(this.remove){
+           for(var id in af){
+               if(typeof id != "function"){
+                   var n = af[id];
+                   if(n && n.parentNode){
+                       n.parentNode.removeChild(n);
+                   }
+               }
+           } 
+        }
+    },
+    
+    /**
+     * Clears the current filter. Note: with the "remove" option
+     * set a filter cannot be cleared.
+     */
+    clear : function(){
+        var t = this.tree;
+        var af = this.filtered;
+        for(var id in af){
+            if(typeof id != "function"){
+                var n = af[id];
+                if(n){
+                    n.ui.show();
+                }
+            }
+        }
+        this.filtered = {}; 
+    }
+};
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TreeLoader.jss.html b/www/extras/yui-ext/docs/output/TreeLoader.jss.html new file mode 100644 index 000000000..c94dfcd6a --- /dev/null +++ b/www/extras/yui-ext/docs/output/TreeLoader.jss.html @@ -0,0 +1,127 @@ +TreeLoader.js

TreeLoader.js

/**
+ * @class Ext.tree.TreeLoader
+ */
+Ext.tree.TreeLoader = function(config){
+    this.baseParams = {};
+    this.requestMethod = "POST";
+    Ext.apply(this, config);
+    
+    this.addEvents({
+        "beforeload" : true,
+        "load" : true,
+        "loadexception" : true
+    });
+};
+
+Ext.extend(Ext.tree.TreeLoader, Ext.util.Observable, {
+    uiProviders : {},
+    clearOnLoad : true,
+    load : function(node, callback){
+        if(this.clearOnLoad){
+            while(node.firstChild){
+                node.removeChild(node.firstChild);
+            }
+        }
+        if(node.attributes.children){ // preloaded json children
+            var cs = node.attributes.children;
+            for(var i = 0, len = cs.length; i < len; i++){
+                node.appendChild(this.createNode(cs[i]));
+            }
+            if(typeof callback == "function"){
+                callback();
+            }
+        }else if(this.dataUrl){
+            this.requestData(node, callback);
+        }
+    },
+    
+    getParams: function(node){
+        var buf = [], bp = this.baseParams;
+        for(var key in bp){
+            if(typeof bp[key] != "function"){
+                buf.push(encodeURIComponent(key), "=", encodeURIComponent(bp[key]), "&");
+            }
+        }
+        buf.push("node=", encodeURIComponent(node.id));
+        return buf.join("");
+    },
+    
+    requestData : function(node, callback){
+        if(this.fireEvent("beforeload", this, node, callback) !== false){
+            var params = this.getParams(node);
+            var cb = {
+                success: this.handleResponse,
+                failure: this.handleFailure,
+                scope: this,
+        		argument: {callback: callback, node: node}
+            };
+            this.transId = Ext.lib.Ajax.request(this.requestMethod, this.dataUrl, cb, params);
+        }else{
+            // if the load is cancelled, make sure we notify 
+            // the node that we are done
+            if(typeof callback == "function"){
+                callback();
+            }
+        }
+    },
+    
+    isLoading : function(){
+        return this.transId ? true : false;  
+    },
+    
+    abort : function(){
+        if(this.isLoading()){
+            Ext.lib.Ajax.abort(this.transId);
+        }
+    },
+
+    /**
+    * Override this function for custom TreeNode node implementation
+    */
+    createNode : function(attr){
+        if(this.applyLoader !== false){
+            attr.loader = this;
+        }
+        if(typeof attr.uiProvider == 'string'){
+           attr.uiProvider = this.uiProviders[attr.uiProvider] || eval(attr.uiProvider);
+        }
+        return(attr.leaf ?
+                        new Ext.tree.TreeNode(attr) : 
+                        new Ext.tree.AsyncTreeNode(attr));  
+    },
+    
+    processResponse : function(response, node, callback){
+        var json = response.responseText;
+        try {
+            var o = eval("("+json+")");
+	        for(var i = 0, len = o.length; i < len; i++){
+                var n = this.createNode(o[i]);
+                if(n){
+                    node.appendChild(n); 
+                }
+	        }
+	        if(typeof callback == "function"){
+                callback(this, node);
+            }
+        }catch(e){
+            this.handleFailure(response);
+        }
+    },
+    
+    handleResponse : function(response){
+        this.transId = false;
+        var a = response.argument;
+        this.processResponse(response, a.node, a.callback);
+        this.fireEvent("load", this, a.node, response);
+    },
+    
+    handleFailure : function(response){
+        this.transId = false;
+        var a = response.argument;
+        this.fireEvent("loadexception", this, a.node, response);
+        if(typeof a.callback == "function"){
+            a.callback(this, a.node);
+        }
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TreeNode.jss.html b/www/extras/yui-ext/docs/output/TreeNode.jss.html new file mode 100644 index 000000000..99fe7dc92 --- /dev/null +++ b/www/extras/yui-ext/docs/output/TreeNode.jss.html @@ -0,0 +1,461 @@ +TreeNode.js

TreeNode.js

/**
+ * @class Ext.tree.TreeNode
+ * @extends Ext.data.Node
+ * @cfg {String} text The text for this node
+ * @cfg {Boolean} expanded true to start the node expanded
+ * @cfg {Boolean} allowDrag false to make this node undraggable if DD is on (defaults to true)
+ * @cfg {Boolean} allowDrop false if this node cannot be drop on
+ * @cfg {Boolean} disabled true to start the node disabled
+ * @cfg {String} icon The path to an icon for the node. The preferred way to do this
+ * is to use the cls or iconCls attributes and add the icon via a CSS background image.
+ * @cfg {String} cls A css class to be added to the node
+ * @cfg {String} iconCls A css class to be added to the nodes icon element for applying css background images
+ * @cfg {String} href URL of the link used for the node (defaults to #)
+ * @cfg {String} hrefTarget target frame for the link
+ * @cfg {String} qtip An Ext QuickTip for the node
+ * @cfg {Boolean} singleClickExpand True for single click expand on this node
+ * @cfg {Function} uiProvider A UI <b>class</b> to use for this node (defaults to Ext.tree.TreeNodeUI)
+ * @constructor
+ * @param {Object/String} attributes The attributes/config for the node or just a string with the text for the node
+ */
+Ext.tree.TreeNode = function(attributes){
+    attributes = attributes || {};
+    if(typeof attributes == "string"){
+        attributes = {text: attributes};
+    }
+    this.childrenRendered = false;
+    this.rendered = false;
+    Ext.tree.TreeNode.superclass.constructor.call(this, attributes);
+    this.expanded = attributes.expanded === true;
+    this.isTarget = attributes.isTarget !== false;
+    this.draggable = attributes.draggable !== false && attributes.allowDrag !== false;
+    this.allowChildren = attributes.allowChildren !== false && attributes.allowDrop !== false;
+
+    /**
+     * Read-only. The text for this node. To change it use setText().
+     * @type String
+     */
+    this.text = attributes.text;
+    /**
+     * True if this node is disabled.
+     * @type Boolean
+     */
+    this.disabled = attributes.disabled === true;
+
+    this.addEvents({
+        /**
+        * @event textchange
+        * Fires when the text for this node is changed
+        * @param {Node} this This node
+        * @param {String} text The new text
+        * @param {String} oldText The old text
+        */
+        "textchange" : true,
+        /**
+        * @event beforeexpand
+        * Fires before this node is expanded, return false to cancel.
+        * @param {Node} this This node
+        * @param {Boolean} deep
+        * @param {Boolean} anim
+        */
+        "beforeexpand" : true,
+        /**
+        * @event beforecollapse
+        * Fires before this node is collapsed, return false to cancel.
+        * @param {Node} this This node
+        * @param {Boolean} deep
+        * @param {Boolean} anim
+        */
+        "beforecollapse" : true,
+        /**
+        * @event expand
+        * Fires when this node is expanded
+        * @param {Node} this This node
+        */
+        "expand" : true,
+        /**
+        * @event disabledchange
+        * Fires when the disabled status of this node changes
+        * @param {Node} this This node
+        * @param {Boolean} disabled
+        */
+        "disabledchange" : true,
+        /**
+        * @event collapse
+        * Fires when this node is collapsed
+        * @param {Node} this This node
+        */
+        "collapse" : true,
+        /**
+        * @event beforeclick
+        * Fires before click processing. Return false to cancel the default action.
+        * @param {Node} this This node
+        * @param {Ext.EventObject} e The event object
+        */
+        "beforeclick":true,
+        /**
+        * @event click
+        * Fires when this node is clicked
+        * @param {Node} this This node
+        * @param {Ext.EventObject} e The event object
+        */
+        "click":true,
+        /**
+        * @event dblclick
+        * Fires when this node is double clicked
+        * @param {Node} this This node
+        * @param {Ext.EventObject} e The event object
+        */
+        "dblclick":true,
+        /**
+        * @event contextmenu
+        * Fires when this node is right clicked
+        * @param {Node} this This node
+        * @param {Ext.EventObject} e The event object
+        */
+        "contextmenu":true,
+        /**
+        * @event beforechildrenrendered
+        * Fires right before the child nodes for this node are rendered
+        * @param {Node} this This node
+        */
+        "beforechildrenrendered":true
+    });
+
+    var uiClass = this.attributes.uiProvider || Ext.tree.TreeNodeUI;
+
+    /**
+     * Read-only. The UI for this node
+     * @type TreeNodeUI
+     */
+    this.ui = new uiClass(this);
+};
+Ext.extend(Ext.tree.TreeNode, Ext.data.Node, {
+    preventHScroll: true,
+
+    /**
+     * Returns true if this node is expanded
+     * @return {Boolean}
+     */
+    isExpanded : function(){
+        return this.expanded;
+    },
+
+    /**
+     * Returns the UI object for this node
+     * @return {TreeNodeUI}
+     */
+    getUI : function(){
+        return this.ui;
+    },
+
+    // private override
+    setFirstChild : function(node){
+        var of = this.firstChild;
+        Ext.tree.TreeNode.superclass.setFirstChild.call(this, node);
+        if(this.childrenRendered && of && node != of){
+            of.renderIndent(true, true);
+        }
+        if(this.rendered){
+            this.renderIndent(true, true);
+        }
+    },
+
+    // private override
+    setLastChild : function(node){
+        var ol = this.lastChild;
+        Ext.tree.TreeNode.superclass.setLastChild.call(this, node);
+        if(this.childrenRendered && ol && node != ol){
+            ol.renderIndent(true, true);
+        }
+        if(this.rendered){
+            this.renderIndent(true, true);
+        }
+    },
+
+    // these methods are overridden to provide lazy rendering support
+    // private override
+    appendChild : function(){
+        var node = Ext.tree.TreeNode.superclass.appendChild.apply(this, arguments);
+        if(node && this.childrenRendered){
+            node.render();
+        }
+        this.ui.updateExpandIcon();
+        return node;
+    },
+
+    // private override
+    removeChild : function(node){
+        this.ownerTree.getSelectionModel().unselect(node);
+        Ext.tree.TreeNode.superclass.removeChild.apply(this, arguments);
+        // if it's been rendered remove dom node
+        if(this.childrenRendered){
+            node.ui.remove();
+        }
+        if(this.childNodes.length < 1){
+            this.collapse(false, false);
+        }else{
+            this.ui.updateExpandIcon();
+        }
+        return node;
+    },
+
+    // private override
+    insertBefore : function(node, refNode){
+        var newNode = Ext.tree.TreeNode.superclass.insertBefore.apply(this, arguments);
+        if(newNode && refNode && this.childrenRendered){
+            node.render();
+        }
+        this.ui.updateExpandIcon();
+        return newNode;
+    },
+
+    /**
+     * Sets the text for this node
+     * @param {String} text
+     */
+    setText : function(text){
+        var oldText = this.text;
+        this.text = text;
+        this.attributes.text = text;
+        if(this.rendered){ // event without subscribing
+            this.ui.onTextChange(this, text, oldText);
+        }
+        this.fireEvent("textchange", this, text, oldText);
+    },
+
+    /**
+     * Triggers selection of this node
+     */
+    select : function(){
+        this.getOwnerTree().getSelectionModel().select(this);
+    },
+
+    /**
+     * Triggers deselection of this node
+     */
+    unselect : function(){
+        this.getOwnerTree().getSelectionModel().unselect(this);
+    },
+
+    /**
+     * Returns true if this node is selected
+     * @return {Boolean}
+     */
+    isSelected : function(){
+        return this.getOwnerTree().getSelectionModel().isSelected(this);
+    },
+
+    /**
+     * Expand this node.
+     * @param {Boolean} deep (optional) True to expand all children as well
+     * @param {Boolean} anim (optional) false to cancel the default animation
+     * @param {Function} callback (optional) A callback to be called when
+     * expanding this node completes (does not wait for deep expand to complete).
+     * Called with 1 parameter, this node.
+     */
+    expand : function(deep, anim, callback){
+        if(!this.expanded){
+            if(this.fireEvent("beforeexpand", this, deep, anim) === false){
+                return;
+            }
+            if(!this.childrenRendered){
+                this.renderChildren();
+            }
+            this.expanded = true;
+            if(!this.isHiddenRoot() && (this.getOwnerTree().animate && anim !== false) || anim){
+                this.ui.animExpand(function(){
+                    this.fireEvent("expand", this);
+                    if(typeof callback == "function"){
+                        callback(this);
+                    }
+                    if(deep === true){
+                        this.expandChildNodes(true);
+                    }
+                }.createDelegate(this));
+                return;
+            }else{
+                this.ui.expand();
+                this.fireEvent("expand", this);
+                if(typeof callback == "function"){
+                    callback(this);
+                }
+            }
+        }else{
+           if(typeof callback == "function"){
+               callback(this);
+           }
+        }
+        if(deep === true){
+            this.expandChildNodes(true);
+        }
+    },
+
+    isHiddenRoot : function(){
+        return this.isRoot && !this.getOwnerTree().rootVisible;
+    },
+
+    /**
+     * Collapse this node.
+     * @param {Boolean} deep (optional) True to collapse all children as well
+     * @param {Boolean} anim (optional) false to cancel the default animation
+     */
+    collapse : function(deep, anim){
+        if(this.expanded && !this.isHiddenRoot()){
+            if(this.fireEvent("beforecollapse", this, deep, anim) === false){
+                return;
+            }
+            this.expanded = false;
+            if((this.getOwnerTree().animate && anim !== false) || anim){
+                this.ui.animCollapse(function(){
+                    this.fireEvent("collapse", this);
+                    if(deep === true){
+                        this.collapseChildNodes(true);
+                    }
+                }.createDelegate(this));
+                return;
+            }else{
+                this.ui.collapse();
+                this.fireEvent("collapse", this);
+            }
+        }
+        if(deep === true){
+            var cs = this.childNodes;
+            for(var i = 0, len = cs.length; i < len; i++) {
+            	cs[i].collapse(true);
+            }
+        }
+    },
+
+    // private
+    delayedExpand : function(delay){
+        if(!this.expandProcId){
+            this.expandProcId = this.expand.defer(delay, this);
+        }
+    },
+
+    // private
+    cancelExpand : function(){
+        if(this.expandProcId){
+            clearTimeout(this.expandProcId);
+        }
+        this.expandProcId = false;
+    },
+
+    /**
+     * Toggles expanded/collapsed state of the node
+     */
+    toggle : function(){
+        if(this.expanded){
+            this.collapse();
+        }else{
+            this.expand();
+        }
+    },
+
+    /**
+     * Ensures all parent nodes are expanded
+     */
+    ensureVisible : function(callback){
+        var tree = this.getOwnerTree();
+        tree.expandPath(this.getPath(), false, function(){
+            tree.getEl().scrollChildIntoView(this.ui.anchor);
+            Ext.callback(callback);
+        }.createDelegate(this));
+    },
+
+    /**
+     * Expand all child nodes
+     * @param {Boolean} deep (optional) true if the child nodes should also expand their child nodes
+     */
+    expandChildNodes : function(deep){
+        var cs = this.childNodes;
+        for(var i = 0, len = cs.length; i < len; i++) {
+        	cs[i].expand(deep);
+        }
+    },
+
+    /**
+     * Collapse all child nodes
+     * @param {Boolean} deep (optional) true if the child nodes should also collapse their child nodes
+     */
+    collapseChildNodes : function(deep){
+        var cs = this.childNodes;
+        for(var i = 0, len = cs.length; i < len; i++) {
+        	cs[i].collapse(deep);
+        }
+    },
+
+    /**
+     * Disables this node
+     */
+    disable : function(){
+        this.disabled = true;
+        this.unselect();
+        if(this.rendered && this.ui.onDisableChange){ // event without subscribing
+            this.ui.onDisableChange(this, true);
+        }
+        this.fireEvent("disabledchange", this, true);
+    },
+
+    /**
+     * Enables this node
+     */
+    enable : function(){
+        this.disabled = false;
+        if(this.rendered && this.ui.onDisableChange){ // event without subscribing
+            this.ui.onDisableChange(this, false);
+        }
+        this.fireEvent("disabledchange", this, false);
+    },
+
+    // private
+    renderChildren : function(suppressEvent){
+        if(suppressEvent !== false){
+            this.fireEvent("beforechildrenrendered", this);
+        }
+        var cs = this.childNodes;
+        for(var i = 0, len = cs.length; i < len; i++){
+            cs[i].render(true);
+        }
+        this.childrenRendered = true;
+    },
+
+    // private
+    sort : function(fn, scope){
+        Ext.tree.TreeNode.superclass.sort.apply(this, arguments);
+        if(this.childrenRendered){
+            var cs = this.childNodes;
+            for(var i = 0, len = cs.length; i < len; i++){
+                cs[i].render(true);
+            }
+        }
+    },
+
+    // private
+    render : function(bulkRender){
+        this.ui.render(bulkRender);
+        if(!this.rendered){
+            this.rendered = true;
+            if(this.expanded){
+                this.expanded = false;
+                this.expand(false, false);
+            }
+        }
+    },
+
+    // private
+    renderIndent : function(deep, refresh){
+        if(refresh){
+            this.ui.childIndent = null;
+        }
+        this.ui.renderIndent();
+        if(deep === true && this.childrenRendered){
+            var cs = this.childNodes;
+            for(var i = 0, len = cs.length; i < len; i++){
+                cs[i].renderIndent(true, refresh);
+            }
+        }
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TreeNodeUI.jss.html b/www/extras/yui-ext/docs/output/TreeNodeUI.jss.html new file mode 100644 index 000000000..1a6dc1589 --- /dev/null +++ b/www/extras/yui-ext/docs/output/TreeNodeUI.jss.html @@ -0,0 +1,464 @@ +TreeNodeUI.js

TreeNodeUI.js

/**
+ * The TreeNode UI implementation is separate from the 
+ * tree implementation. Unless you are customizing the tree UI,
+ * you should never have to use this directly.
+ */
+Ext.tree.TreeNodeUI = function(node){
+    this.node = node;
+    this.rendered = false;
+    this.animating = false;
+    this.emptyIcon = Ext.BLANK_IMAGE_URL;
+};
+
+Ext.tree.TreeNodeUI.prototype = {
+    removeChild : function(node){
+        if(this.rendered){
+            this.ctNode.removeChild(node.ui.getEl());
+        } 
+    },
+    
+    beforeLoad : function(){
+         this.addClass("x-tree-node-loading");
+    },
+    
+    afterLoad : function(){
+         this.removeClass("x-tree-node-loading");
+    },
+    
+    onTextChange : function(node, text, oldText){
+        if(this.rendered){
+            this.textNode.innerHTML = text;
+        }
+    },
+    
+    onDisableChange : function(node, state){
+        this.disabled = state;
+        if(state){
+            this.addClass("x-tree-node-disabled");
+        }else{
+            this.removeClass("x-tree-node-disabled");
+        } 
+    },
+    
+    onSelectedChange : function(state){
+        if(state){
+            this.focus();
+            this.addClass("x-tree-selected");
+        }else{
+            //this.blur();
+            this.removeClass("x-tree-selected");
+        }
+    },
+    
+    onMove : function(tree, node, oldParent, newParent, index, refNode){
+        this.childIndent = null;
+        if(this.rendered){
+            var targetNode = newParent.ui.getContainer();
+            if(!targetNode){//target not rendered
+                this.holder = document.createElement("div");
+                this.holder.appendChild(this.wrap);
+                return;
+            }
+            var insertBefore = refNode ? refNode.ui.getEl() : null;
+            if(insertBefore){
+                targetNode.insertBefore(this.wrap, insertBefore);
+            }else{
+                targetNode.appendChild(this.wrap);
+            }
+            this.node.renderIndent(true);
+        }
+    },
+
+    addClass : function(cls){
+        if(this.elNode){
+            Ext.fly(this.elNode).addClass(cls);
+        }
+    },
+
+    removeClass : function(cls){
+        if(this.elNode){
+            Ext.fly(this.elNode).removeClass(cls);  
+        }
+    },
+
+    remove : function(){
+        if(this.rendered){
+            this.holder = document.createElement("div");
+            this.holder.appendChild(this.wrap);
+        }  
+    },
+    
+    fireEvent : function(){
+        return this.node.fireEvent.apply(this.node, arguments);  
+    },
+    
+    initEvents : function(){
+        this.node.on("move", this.onMove, this);
+        var E = Ext.EventManager;
+        var a = this.anchor;
+        
+        var el = Ext.fly(a);
+        
+        if(Ext.isOpera){ // opera render bug ignores the CSS
+            el.setStyle("text-decoration", "none");
+        }
+        
+        el.on("click", this.onClick, this);
+        el.on("dblclick", this.onDblClick, this);
+        el.on("contextmenu", this.onContextMenu, this);
+        
+        var icon = Ext.fly(this.iconNode);
+        icon.on("click", this.onClick, this);
+        icon.on("dblclick", this.onDblClick, this);
+        icon.on("contextmenu", this.onContextMenu, this);
+        E.on(this.ecNode, "click", this.ecClick, this, true);
+        
+        if(this.node.disabled){
+            this.addClass("x-tree-node-disabled");
+        }
+        if(this.node.hidden){
+            this.addClass("x-tree-node-disabled");
+        }
+        var ot = this.node.getOwnerTree();
+        var dd = ot.enableDD || ot.enableDrag || ot.enableDrop;
+        if(dd && (!this.node.isRoot || ot.rootVisible)){
+            Ext.dd.Registry.register(this.elNode, {
+                node: this.node,
+                handles: [this.iconNode, this.textNode],
+                isHandle: false
+            });
+        }
+    },
+    
+    hide : function(){
+        if(this.rendered){
+            this.wrap.style.display = "none";
+        }  
+    },
+    
+    show : function(){
+        if(this.rendered){
+            this.wrap.style.display = "";
+        } 
+    },
+    
+    onContextMenu : function(e){
+        e.preventDefault();
+        this.focus();
+        this.fireEvent("contextmenu", this.node, e);
+    },
+    
+    onClick : function(e){
+        if(this.dropping){
+            return;
+        }
+        if(this.fireEvent("beforeclick", this.node, e) !== false){
+            if(!this.disabled && this.node.attributes.href){
+                this.fireEvent("click", this.node, e);
+                return;
+            }
+            e.preventDefault();
+            if(this.disabled){
+                return;
+            }
+
+            if(this.node.attributes.singleClickExpand && !this.animating && this.node.hasChildNodes()){
+                this.node.toggle();
+            }
+
+            this.fireEvent("click", this.node, e);
+        }else{
+            e.stopEvent();
+        }
+    },
+    
+    onDblClick : function(e){
+        e.preventDefault();
+        if(this.disabled){
+            return;
+        }
+        if(!this.animating && this.node.hasChildNodes()){
+            this.node.toggle();
+        }
+        this.fireEvent("dblclick", this.node, e);
+    },
+    
+    ecClick : function(e){
+        if(!this.animating && this.node.hasChildNodes()){
+            this.node.toggle();
+        }
+    },
+    
+    startDrop : function(){
+        this.dropping = true;
+    },
+    
+    // delayed drop so the click event doesn't get fired on a drop
+    endDrop : function(){ 
+       setTimeout(function(){
+           this.dropping = false;
+       }.createDelegate(this), 50); 
+    },
+    
+    expand : function(){
+        this.updateExpandIcon();
+        this.ctNode.style.display = "";
+    },
+
+    focus : function(){
+        if(!this.node.preventHScroll){
+            try{this.anchor.focus();
+            }catch(e){}
+        }else if(!Ext.isIE){
+            try{
+                var noscroll = this.node.getOwnerTree().el.dom;
+                var l = noscroll.scrollLeft;
+                this.anchor.focus();
+                noscroll.scrollLeft = l;
+            }catch(e){}
+        }
+    },
+    
+    blur : function(){
+        try{
+            this.anchor.blur();
+        }catch(e){} 
+    },
+    
+    animExpand : function(callback){
+        var ct = Ext.get(this.ctNode);
+        ct.stopFx();
+        if(!this.node.hasChildNodes()){
+            this.updateExpandIcon();
+            this.ctNode.style.display = "";
+            Ext.callback(callback);
+            return;
+        }
+        this.animating = true;
+        this.updateExpandIcon();
+        
+        ct.slideIn('t', {
+           callback : function(){
+               this.animating = false;
+               Ext.callback(callback);
+            },
+            scope: this,
+            duration: this.node.ownerTree.duration || .25
+        });
+    },
+    
+    highlight : function(){
+        var tree = this.node.getOwnerTree();
+        Ext.fly(this.wrap).highlight(
+            tree.hlColor || "C3DAF9",
+            {endColor: tree.hlBaseColor}
+        );
+    },
+    
+    collapse : function(){
+        this.updateExpandIcon();
+        this.ctNode.style.display = "none";
+    },
+    
+    animCollapse : function(callback){
+        var ct = Ext.get(this.ctNode);
+        ct.enableDisplayMode('block');
+        ct.stopFx();
+
+        this.animating = true;
+        this.updateExpandIcon();
+
+        ct.slideOut('t', {
+            callback : function(){
+               this.animating = false;
+               Ext.callback(callback);
+            },
+            scope: this,
+            duration: this.node.ownerTree.duration || .25
+        });
+    },
+    
+    getContainer : function(){
+        return this.ctNode;  
+    },
+    
+    getEl : function(){
+        return this.wrap;  
+    },
+    
+    appendDDGhost : function(ghostNode){
+        ghostNode.appendChild(this.elNode.cloneNode(true));
+    },
+    
+    getDDRepairXY : function(){
+        return Ext.lib.Dom.getXY(this.iconNode);
+    },
+    
+    onRender : function(){
+        this.render();    
+    },
+    
+    render : function(bulkRender){
+        var n = this.node;
+        var targetNode = n.parentNode ? 
+              n.parentNode.ui.getContainer() : n.ownerTree.container.dom;
+        if(!this.rendered){
+            this.rendered = true;
+            var a = n.attributes;
+        
+            // add some indent caching, this helps performance when rendering a large tree
+            this.indentMarkup = "";
+            if(n.parentNode){
+                this.indentMarkup = n.parentNode.ui.getChildIndent();
+            }
+            
+            var buf = ['<li class="x-tree-node"><div class="x-tree-node-el ', n.attributes.cls,'">',
+                '<span class="x-tree-node-indent">',this.indentMarkup,"</span>",
+                '<img src="', this.emptyIcon, '" class="x-tree-ec-icon">',
+                '<img src="', a.icon || this.emptyIcon, '" class="x-tree-node-icon',(a.icon ? " x-tree-node-inline-icon" : ""),(a.iconCls ? " "+a.iconCls : ""),'" unselectable="on">',
+                '<a hidefocus="on" href="',a.href ? a.href : "#",'" tabIndex="1" ',
+                 a.hrefTarget ? ' target="'+a.hrefTarget+'"' : "", '><span unselectable="on">',n.text,"</span></a></div>",
+                '<ul class="x-tree-node-ct" style="display:none;"></ul>',
+                "</li>"];
+                
+            if(bulkRender !== true && n.nextSibling && n.nextSibling.ui.getEl()){
+                this.wrap = Ext.DomHelper.insertHtml("beforeBegin",
+                                    n.nextSibling.ui.getEl(), buf.join(""));
+            }else{
+                this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf.join(""));
+            }
+            this.elNode = this.wrap.childNodes[0];
+            this.ctNode = this.wrap.childNodes[1];
+            var cs = this.elNode.childNodes;
+            this.indentNode = cs[0];
+            this.ecNode = cs[1];
+            this.iconNode = cs[2];
+            this.anchor = cs[3];
+            this.textNode = cs[3].firstChild;
+            if(a.qtip){
+               if(this.textNode.setAttributeNS){
+                   this.textNode.setAttributeNS("ext", "qtip", a.qtip);
+                   if(a.qtipTitle){
+                       this.textNode.setAttributeNS("ext", "qtitle", a.qtipTitle);
+                   }
+               }else{
+                   this.textNode.setAttribute("ext:qtip", a.qtip);
+                   if(a.qtipTitle){
+                       this.textNode.setAttribute("ext:qtitle", a.qtipTitle);
+                   }
+               } 
+            }
+            this.initEvents();
+            if(!this.node.expanded){
+                this.updateExpandIcon();
+            }
+        }else{
+            if(bulkRender === true) {
+                targetNode.appendChild(this.wrap);
+            }
+        }
+    },
+    
+    getAnchor : function(){
+        return this.anchor;
+    },
+    
+    getTextEl : function(){
+        return this.textNode;
+    },
+    
+    getIconEl : function(){
+        return this.iconNode;
+    },
+    
+    updateExpandIcon : function(){
+        if(this.rendered){
+            var n = this.node, c1, c2;
+            //console.log(n.id)
+            var cls = n.isLast() ? "x-tree-elbow-end" : "x-tree-elbow";
+            var hasChild = n.hasChildNodes();
+            if(hasChild){
+                if(n.expanded){
+                    cls += "-minus";
+                    c1 = "x-tree-node-collapsed";
+                    c2 = "x-tree-node-expanded";
+                }else{
+                    cls += "-plus";
+                    c1 = "x-tree-node-expanded";
+                    c2 = "x-tree-node-collapsed";
+                }
+                if(this.wasLeaf){
+                    this.removeClass("x-tree-node-leaf");
+                    this.wasLeaf = false;
+                }
+                if(this.c1 != c1 || this.c2 != c2){
+                    Ext.fly(this.elNode).replaceClass(c1, c2);
+                    this.c1 = c1; this.c2 = c2;
+                }
+            }else{
+                if(!this.wasLeaf){
+                    Ext.fly(this.elNode).replaceClass("x-tree-node-expanded", "x-tree-node-leaf");
+                    this.wasLeaf = true;
+                }
+            }
+            var ecc = "x-tree-ec-icon "+cls;
+            if(this.ecc != ecc){
+                this.ecNode.className = ecc;
+                this.ecc = ecc;
+            }
+        }
+    },
+    
+    getChildIndent : function(){
+        if(!this.childIndent){
+            var buf = [];
+            var p = this.node;
+            while(p){
+                if(!p.isRoot || (p.isRoot && p.ownerTree.rootVisible)){
+                    if(!p.isLast()) {
+                        buf.unshift('<img src="'+this.emptyIcon+'" class="x-tree-elbow-line">');
+                    } else {
+                        buf.unshift('<img src="'+this.emptyIcon+'" class="x-tree-icon">');
+                    }
+                }
+                p = p.parentNode;
+            }
+            this.childIndent = buf.join("");
+        }
+        return this.childIndent;
+    },
+    
+    renderIndent : function(){
+        if(this.rendered){
+            var indent = "";
+            var p = this.node.parentNode;
+            if(p){
+                indent = p.ui.getChildIndent();
+            }
+            if(this.indentMarkup != indent){ // don't rerender if not required
+                this.indentNode.innerHTML = indent;
+                this.indentMarkup = indent;
+            }
+            this.updateExpandIcon();
+        }
+    }
+};
+
+Ext.tree.RootTreeNodeUI = function(){
+    Ext.tree.RootTreeNodeUI.superclass.constructor.apply(this, arguments);
+};
+Ext.extend(Ext.tree.RootTreeNodeUI, Ext.tree.TreeNodeUI, {
+    render : function(){
+        if(!this.rendered){
+            var targetNode = this.node.ownerTree.container.dom;
+            this.node.expanded = true;
+            targetNode.innerHTML = '<div class="x-tree-root-node"></div>';
+            this.wrap = this.ctNode = targetNode.firstChild;
+        }
+    },
+    collapse : function(){
+    },
+    expand : function(){
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TreePanel.jss.html b/www/extras/yui-ext/docs/output/TreePanel.jss.html new file mode 100644 index 000000000..4dd8088bb --- /dev/null +++ b/www/extras/yui-ext/docs/output/TreePanel.jss.html @@ -0,0 +1,383 @@ +TreePanel.js

TreePanel.js

/**
+ * @class Ext.tree.TreePanel
+ * @extends Ext.data.Tree
+
+ * @cfg {Boolean} rootVisible false to hide the root node (defaults to true)
+ * @cfg {Boolean} lines false to disable tree lines (defaults to true)
+ * @cfg {Boolean} enableDD true to enable drag and drop
+ * @cfg {Boolean} enableDrag true to enable just drag
+ * @cfg {Boolean} enableDrop true to enable just drop
+ * @cfg {Object} dragConfig Custom config to pass to the {@link Ext.tree.TreeDragZone} instance
+ * @cfg {Object} dropConfig Custom config to pass to the {@link Ext.tree.TreeDropZone} instance
+ * @cfg {String} ddGroup The DD group this TreePanel belongs to
+ * @cfg {String} ddAppendOnly True if the tree should only allow append drops (use for trees which are sorted)
+ * @cfg {Boolean} ddScroll true to enable YUI body scrolling
+ * @cfg {Boolean} containerScroll true to register this container with ScrollManager
+ * @cfg {Boolean} hlDrop false to disable node highlight on drop (defaults to true)
+ * @cfg {String} hlColor The color of the node highlight (defaults to C3DAF9)
+ * @cfg {Boolean} animate true to enable animated expand/collapse
+ * @cfg {Boolean} singleExpand true if only 1 node per branch may be expanded
+ * @cfg {Boolean} selModel A tree selection model to use with this TreePanel (defaults to a {@link Ext.tree.DefaultSelectionModel})
+ * @cfg {Boolean} loader A TreeLoader for use with this TreePanel
+ * @constructor
+ * @param {String/HTMLElement/Element} el The container element
+ * @param {Object} config
+ */
+Ext.tree.TreePanel = function(el, config){
+   Ext.tree.TreePanel.superclass.constructor.call(this);
+   this.el = Ext.get(el);
+    this.el.addClass('x-tree');
+   /**
+    * Read-only. The id of the container element becomes this TreePanel's id.
+    */
+   this.id = this.el.id;
+   Ext.apply(this, config);
+   this.addEvents({
+        /**
+        * @event beforeload
+        * Fires before a node is loaded, return false to cancel
+        * @param {Node} node The node being loaded
+        */
+        "beforeload" : true,
+        /**
+        * @event load
+        * Fires when a node is loaded
+        * @param {Node} node The node that was loaded
+        */
+        "load" : true,
+        /**
+        * @event textchange
+        * Fires when the text for a node is changed
+        * @param {Node} node The node
+        * @param {String} text The new text
+        * @param {String} oldText The old text
+        */
+        "textchange" : true,
+        /**
+        * @event beforeexpand
+        * Fires before a node is expanded, return false to cancel.
+        * @param {Node} node The node
+        * @param {Boolean} deep
+        * @param {Boolean} anim
+        */
+        "beforeexpand" : true,
+        /**
+        * @event beforecollapse
+        * Fires before a node is collapsed, return false to cancel.
+        * @param {Node} node The node
+        * @param {Boolean} deep
+        * @param {Boolean} anim
+        */
+        "beforecollapse" : true,
+        /**
+        * @event expand
+        * Fires when a node is expanded
+        * @param {Node} node The node
+        */
+        "expand" : true,
+        /**
+        * @event disabledchange
+        * Fires when the disabled status of a node changes
+        * @param {Node} node The node
+        * @param {Boolean} disabled
+        */
+        "disabledchange" : true,
+        /**
+        * @event collapse
+        * Fires when a node is collapsed
+        * @param {Node} node The node
+        */
+        "collapse" : true,
+        /**
+        * @event beforeclick
+        * Fires before click processing on a node. Return false to cancel the default action.
+        * @param {Node} node The node
+        * @param {Ext.EventObject} e The event object
+        */
+        "beforeclick":true,
+        /**
+        * @event click
+        * Fires when a node is clicked
+        * @param {Node} node The node
+        * @param {Ext.EventObject} e The event object
+        */
+        "click":true,
+        /**
+        * @event dblclick
+        * Fires when a node is double clicked
+        * @param {Node} node The node
+        * @param {Ext.EventObject} e The event object
+        */
+        "dblclick":true,
+        /**
+        * @event contextmenu
+        * Fires when a node is right clicked
+        * @param {Node} node The node
+        * @param {Ext.EventObject} e The event object
+        */
+        "contextmenu":true,
+        /**
+        * @event beforechildrenrendered
+        * Fires right before the child nodes for a node are rendered
+        * @param {Node} node The node
+        */
+        "beforechildrenrendered":true,
+       /**
+	     * @event startdrag
+	     * Fires when a node starts being dragged
+	     * @param {Ext.tree.TreePanel} this
+	     * @param {Ext.tree.TreeNode} node
+	     * @param {event} e The raw browser event
+	     */
+	    "startdrag" : true,
+	    /**
+	     * @event enddrag
+	     * Fires when a drag operation is complete
+	     * @param {Ext.tree.TreePanel} this
+	     * @param {Ext.tree.TreeNode} node
+	     * @param {event} e The raw browser event
+	     */
+	    "enddrag" : true,
+	    /**
+	     * @event dragdrop
+	     * Fires when a dragged node is dropped on a valid DD target
+	     * @param {Ext.tree.TreePanel} this
+	     * @param {Ext.tree.TreeNode} node
+	     * @param {DD} dd The dd it was dropped on
+	     * @param {event} e The raw browser event
+	     */
+	    "dragdrop" : true,
+	    /**
+	     * @event beforenodedrop
+	     * Fires when a DD object is dropped on a node in this tree for preprocessing. Return false to cancel the drop. The dropEvent
+	     * passed to handlers has the following properties:<br />
+	     * <ul style="padding:5px;padding-left:16px;">
+	     * <li>tree - The TreePanel</li>
+	     * <li>target - The node being targeted for the drop</li>
+	     * <li>data - The drag data from the drag source</li>
+	     * <li>point - The point of the drop - append, above or below</li>
+	     * <li>source - The drag source</li>
+	     * <li>rawEvent - Raw mouse event</li>
+	     * <li>dropNode - Drop node(s) provided by the source <b>OR</b> you can supply node(s)
+	     * to be inserted by setting them on this object.</li>
+	     * <li>cancel - Set this to true to cancel the drop.</li>
+	     * </ul>
+	     * @param {Object} dropEvent
+	     */
+	    "beforenodedrop" : true,
+	    /**
+	     * @event nodedrop
+	     * Fires after a DD object is dropped on a node in this tree. The dropEvent
+	     * passed to handlers has the following properties:<br />
+	     * <ul style="padding:5px;padding-left:16px;">
+	     * <li>tree - The TreePanel</li>
+	     * <li>target - The node being targeted for the drop</li>
+	     * <li>data - The drag data from the drag source</li>
+	     * <li>point - The point of the drop - append, above or below</li>
+	     * <li>source - The drag source</li>
+	     * <li>rawEvent - Raw mouse event</li>
+	     * <li>dropNode - Dropped node(s).</li>
+	     * </ul>
+	     * @param {Object} dropEvent
+	     */
+	    "nodedrop" : true,
+	     /**
+	     * @event nodedragover
+	     * Fires when a tree node is being targeted for a drag drop, return false to signal drop not allowed. The dragOverEvent
+	     * passed to handlers has the following properties:<br />
+	     * <ul style="padding:5px;padding-left:16px;">
+	     * <li>tree - The TreePanel</li>
+	     * <li>target - The node being targeted for the drop</li>
+	     * <li>data - The drag data from the drag source</li>
+	     * <li>point - The point of the drop - append, above or below</li>
+	     * <li>source - The drag source</li>
+	     * <li>rawEvent - Raw mouse event</li>
+	     * <li>dropNode - Drop node(s) provided by the source.</li>
+	     * <li>cancel - Set this to true to signal drop not allowed.</li>
+	     * </ul>
+	     * @param {Object} dragOverEvent
+	     */
+	    "nodedragover" : true
+   });
+   if(this.singleExpand){
+       this.on("beforeexpand", this.restrictExpand, this);
+   }
+};
+Ext.extend(Ext.tree.TreePanel, Ext.data.Tree, {
+    rootVisible : true,
+    animate: Ext.enableFx,
+    lines : true,
+    enableDD : false,
+    hlDrop : Ext.enableFx,
+
+    // private
+    restrictExpand : function(node){
+        var p = node.parentNode;
+        if(p){
+            if(p.expandedChild && p.expandedChild.parentNode == p){
+                p.expandedChild.collapse();
+            }
+            p.expandedChild = node;
+        }
+    },
+
+    // private override
+    setRootNode : function(node){
+        Ext.tree.TreePanel.superclass.setRootNode.call(this, node);
+        if(!this.rootVisible){
+            node.ui = new Ext.tree.RootTreeNodeUI(node);
+        }
+        return node;
+    },
+
+    /**
+     * Returns the container element for this TreePanel
+     */
+    getEl : function(){
+        return this.el;
+    },
+
+    /**
+     * Returns the default TreeLoader for this TreePanel
+     */
+    getLoader : function(){
+        return this.loader;
+    },
+
+    /**
+     * Expand all nodes
+     */
+    expandAll : function(){
+        this.root.expand(true);
+    },
+
+    /**
+     * Collapse all nodes
+     */
+    collapseAll : function(){
+        this.root.collapse(true);
+    },
+
+    /**
+     * Returns the selection model used by this TreePanel
+     */
+    getSelectionModel : function(){
+        if(!this.selModel){
+            this.selModel = new Ext.tree.DefaultSelectionModel();
+        }
+        return this.selModel;
+    },
+
+    /**
+     * Expands a specified path in this TreePanel. A path can be retrieved from a node with {@link Ext.data.Node#getPath}
+     * @param {String} path
+     * @param {String} attr (optional) The attribute used in the path (see {@link Ext.data.Node#getPath} for more info)
+     * @param {Function} callback (optional) The callback to call when the expand is complete. The callback will be called with
+     * (bSuccess, oLastNode) where bSuccess is if the expand was successful and oLastNode is the last node that was expanded.
+     */
+    expandPath : function(path, attr, callback){
+        attr = attr || "id";
+        var keys = path.split(this.pathSeparator);
+        var curNode = this.root;
+        if(curNode.attributes[attr] != keys[1]){ // invalid root
+            if(callback){
+                callback(false, null);
+            }
+            return;
+        }
+        var index = 1;
+        var f = function(){
+            if(++index == keys.length){
+                if(callback){
+                    callback(true, curNode);
+                }
+                return;
+            }
+            var c = curNode.findChild(attr, keys[index]);
+            if(!c){
+                if(callback){
+                    callback(false, curNode);
+                }
+                return;
+            }
+            curNode = c;
+            c.expand(false, false, f);
+        };
+        curNode.expand(false, false, f);
+    },
+
+    /**
+     * Selects the node in this tree at the specified path. A path can be retrieved from a node with {@link Ext.data.Node#getPath}
+     * @param {String} path
+     * @param {String} attr (optional) The attribute used in the path (see {@link Ext.data.Node#getPath} for more info)
+     * @param {Function} callback (optional) The callback to call when the selection is complete. The callback will be called with
+     * (bSuccess, oSelNode) where bSuccess is if the selection was successful and oSelNode is the selected node.
+     */
+    selectPath : function(path, attr, callback){
+        attr = attr || "id";
+        var keys = path.split(this.pathSeparator);
+        var v = keys.pop();
+        if(keys.length > 0){
+            var f = function(success, node){
+                if(success && node){
+                    var n = node.findChild(attr, v);
+                    if(n){
+                        n.select();
+                        if(callback){
+                            callback(true, n);
+                        }
+                    }
+                }else{
+                    if(callback){
+                        callback(false, n);
+                    }
+                }
+            };
+            this.expandPath(keys.join(this.pathSeparator), attr, f);
+        }else{
+            this.root.select();
+            if(callback){
+                callback(true, this.root);
+            }
+        }
+    },
+
+    /**
+     * Trigger rendering of this TreePanel
+     */
+    render : function(){
+        this.container = this.el.createChild({tag:"ul",
+               cls:"x-tree-root-ct " +
+               (this.lines ? "x-tree-lines" : "x-tree-no-lines")});
+
+        if(this.containerScroll){
+            Ext.dd.ScrollManager.register(this.el);
+        }
+        if((this.enableDD || this.enableDrop) && !this.dropZone){
+           /**
+            * The dropZone used by this tree if drop is enabled
+            * @type Ext.tree.TreeDropZone
+            */
+             this.dropZone = new Ext.tree.TreeDropZone(this, this.dropConfig || {
+               ddGroup: this.ddGroup || "TreeDD", appendOnly: this.ddAppendOnly === true
+           });
+        }
+        if((this.enableDD || this.enableDrag) && !this.dragZone){
+           /**
+            * The dragZone used by this tree if drag is enabled
+            * @type Ext.tree.TreeDragZone
+            */
+            this.dragZone = new Ext.tree.TreeDragZone(this, this.dragConfig || {
+               ddGroup: this.ddGroup || "TreeDD",
+               scroll: this.ddScroll
+           });
+        }
+        this.getSelectionModel().init(this);
+        this.root.render();
+        if(!this.rootVisible){
+            this.root.renderChildren();
+        }
+        return this;
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TreeSelectionModel.jss.html b/www/extras/yui-ext/docs/output/TreeSelectionModel.jss.html new file mode 100644 index 000000000..98c9328ba --- /dev/null +++ b/www/extras/yui-ext/docs/output/TreeSelectionModel.jss.html @@ -0,0 +1,309 @@ +TreeSelectionModel.js

TreeSelectionModel.js

/**
+ * @class Ext.tree.DefaultSelectionModel
+ * @extends Ext.util.Observable
+ * The default single selection for a TreePanel.
+ */
+Ext.tree.DefaultSelectionModel = function(){
+   this.selNode = null;
+   
+   this.addEvents({
+       /**
+        * @event selectionchange
+        * Fires when the selected node changes
+        * @param {DefaultSelectionModel} this
+        * @param {TreeNode} node the new selection
+        */
+       "selectionchange" : true,
+
+       /**
+        * @event beforeselect
+        * Fires before the selected node changes, return false to cancel the change
+        * @param {DefaultSelectionModel} this
+        * @param {TreeNode} node the new selection
+        * @param {TreeNode} node the old selection
+        */
+       "beforeselect" : true
+   });
+};
+
+Ext.extend(Ext.tree.DefaultSelectionModel, Ext.util.Observable, {
+    init : function(tree){
+        this.tree = tree;
+        tree.el.on("keydown", this.onKeyDown, this);
+        tree.on("click", this.onNodeClick, this);
+    },
+    
+    onNodeClick : function(node, e){
+        this.select(node);
+    },
+    
+    /**
+     * Select a node.
+     * @param {TreeNode} node The node to select
+     * @return {TreeNode} The selected node
+     */
+    select : function(node){
+        var last = this.selNode;
+        if(last != node && this.fireEvent('beforeselect', this, node, last) !== false){
+            if(last){
+                last.ui.onSelectedChange(false);
+            }
+            this.selNode = node;
+            node.ui.onSelectedChange(true);
+            this.fireEvent("selectionchange", this, node, last);
+        }
+        return node;
+    },
+    
+    /**
+     * Deselect a node.
+     * @param {TreeNode} node The node to unselect
+     */
+    unselect : function(node){
+        if(this.selNode == node){
+            this.clearSelections();
+        }    
+    },
+    
+    /**
+     * Clear all selections
+     */
+    clearSelections : function(){
+        var n = this.selNode;
+        if(n){
+            n.ui.onSelectedChange(false);
+            this.selNode = null;
+            this.fireEvent("selectionchange", this, null);
+        }
+        return n;
+    },
+    
+    /**
+     * Get the selected node
+     * @return {TreeNode} The selected node
+     */
+    getSelectedNode : function(){
+        return this.selNode;    
+    },
+    
+    /**
+     * Returns true if the node is selected
+     * @param {TreeNode} node The node to check
+     * @return {Boolean}
+     */
+    isSelected : function(node){
+        return this.selNode == node;  
+    },
+
+    /**
+     * Selects the node above the selected node in the tree, intelligently walking the nodes
+     * @return TreeNode The new selection
+     */
+    selectPrevious : function(){
+        var s = this.selNode || this.lastSelNode;
+        if(!s){
+            return null;
+        }
+        var ps = s.previousSibling;
+        if(ps){
+            if(!ps.isExpanded() || ps.childNodes.length < 1){
+                return this.select(ps);
+            } else{
+                var lc = ps.lastChild;
+                while(lc && lc.isExpanded() && lc.childNodes.length > 0){
+                    lc = lc.lastChild;
+                }
+                return this.select(lc);
+            }
+        } else if(s.parentNode && (this.tree.rootVisible || !s.parentNode.isRoot)){
+            return this.select(s.parentNode);
+        }
+        return null;
+    },
+
+    /**
+     * Selects the node above the selected node in the tree, intelligently walking the nodes
+     * @return TreeNode The new selection
+     */
+    selectNext : function(){
+        var s = this.selNode || this.lastSelNode;
+        if(!s){
+            return null;
+        }
+        if(s.firstChild && s.isExpanded()){
+             return this.select(s.firstChild);
+         }else if(s.nextSibling){
+             return this.select(s.nextSibling);
+         }else if(s.parentNode){
+            var newS = null;
+            s.parentNode.bubble(function(){
+                if(this.nextSibling){
+                    newS = this.getOwnerTree().selModel.select(this.nextSibling);
+                    return false;
+                }
+            });
+            return newS;
+         }
+        return null;
+    },
+
+    onKeyDown : function(e){
+        var s = this.selNode || this.lastSelNode;
+        // undesirable, but required
+        var sm = this;
+        if(!s){
+            return;
+        }
+        var k = e.getKey();
+        switch(k){
+             case e.DOWN:
+                 e.stopEvent();
+                 this.selectNext();
+             break;
+             case e.UP:
+                 e.stopEvent();
+                 this.selectPrevious();
+             break;
+             case e.RIGHT:
+                 e.preventDefault();
+                 if(s.hasChildNodes()){
+                     if(!s.isExpanded()){
+                         s.expand();
+                     }else if(s.firstChild){
+                         this.select(s.firstChild, e);
+                     }
+                 }
+             break;
+             case e.LEFT:
+                 e.preventDefault();
+                 if(s.hasChildNodes() && s.isExpanded()){
+                     s.collapse();
+                 }else if(s.parentNode && (this.tree.rootVisible || s.parentNode != this.tree.getRootNode())){
+                     this.select(s.parentNode, e);
+                 }
+             break;
+        };
+    }
+});
+
+/**
+ * @class Ext.tree.MultiSelectionModel
+ * @extends Ext.util.Observable
+ * Multi selection for a TreePanel.
+ */
+Ext.tree.MultiSelectionModel = function(){
+   this.selNodes = [];
+   this.selMap = {};
+   this.addEvents({
+       /**
+        * @event selectionchange
+        * Fires when the selected nodes change
+        * @param {MultiSelectionModel} this
+        * @param {Array} nodes Array of the selected nodes
+        */
+       "selectionchange" : true
+   });
+};
+
+Ext.extend(Ext.tree.MultiSelectionModel, Ext.util.Observable, {
+    init : function(tree){
+        this.tree = tree;
+        tree.el.on("keydown", this.onKeyDown, this);
+        tree.on("click", this.onNodeClick, this);
+    },
+    
+    onNodeClick : function(node, e){
+        this.select(node, e, e.ctrlKey);
+    },
+    
+    /**
+     * Select a node.
+     * @param {TreeNode} node The node to select
+     * @param {EventObject} e (optional) An event associated with the selection
+     * @param {Boolean} keepExisting True to retain existing selections
+     * @return {TreeNode} The selected node
+     */
+    select : function(node, e, keepExisting){
+        if(keepExisting !== true){
+            this.clearSelections(true);
+        }
+        if(this.isSelected(node)){
+            this.lastSelNode = node;
+            return node;
+        }
+        this.selNodes.push(node);
+        this.selMap[node.id] = node;
+        this.lastSelNode = node;
+        node.ui.onSelectedChange(true);
+        this.fireEvent("selectionchange", this, this.selNodes);
+        return node;
+    },
+    
+    /**
+     * Deselect a node.
+     * @param {TreeNode} node The node to unselect
+     */
+    unselect : function(node){
+        if(this.selMap[node.id]){
+            node.ui.onSelectedChange(false);
+            var sn = this.selNodes;
+            var index = -1;
+            if(sn.indexOf){
+                index = sn.indexOf(node);
+            }else{
+                for(var i = 0, len = sn.length; i < len; i++){
+                    if(sn[i] == node){
+                        index = i;
+                        break;
+                    }
+                }
+            }
+            if(index != -1){
+                this.selNodes.splice(index, 1);
+            }
+            delete this.selMap[node.id];
+            this.fireEvent("selectionchange", this, this.selNodes);
+        }
+    },
+    
+    /**
+     * Clear all selections
+     */
+    clearSelections : function(suppressEvent){
+        var sn = this.selNodes;
+        if(sn.length > 0){
+            for(var i = 0, len = sn.length; i < len; i++){
+                sn[i].ui.onSelectedChange(false);
+            }
+            this.selNodes = [];
+            this.selMap = {};
+            if(suppressEvent !== true){
+                this.fireEvent("selectionchange", this, this.selNodes);
+            }
+        }
+    },
+    
+    /**
+     * Returns true if the node is selected
+     * @param {TreeNode} node The node to check
+     * @return {Boolean}
+     */
+    isSelected : function(node){
+        return this.selMap[node.id] ? true : false;  
+    },
+    
+    /**
+     * Returns an array of the selected nodes
+     * @return {Array}
+     */
+    getSelectedNodes : function(){
+        return this.selNodes;    
+    },
+
+    onKeyDown : Ext.tree.DefaultSelectionModel.prototype.onKeyDown,
+
+    selectNext : Ext.tree.DefaultSelectionModel.prototype.selectNext,
+
+    selectPrevious : Ext.tree.DefaultSelectionModel.prototype.selectPrevious
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TreeSorter.jss.html b/www/extras/yui-ext/docs/output/TreeSorter.jss.html new file mode 100644 index 000000000..21ffcdee1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/TreeSorter.jss.html @@ -0,0 +1,65 @@ +TreeSorter.js

TreeSorter.js

/**
+ * @class Ext.tree.TreeSorter
+ * Provides sorting of nodes in a TreePanel
+ * 
+ * @cfg {Boolean} folderSort True to sort leaf nodes under non leaf nodes
+ * @cfg {String} property The named attribute on the node to sort by (defaults to text)
+ * @cfg {String} dir The direction to sort (asc or desc) (defaults to asc)
+ * @cfg {String} leafAttr The attribute used to determine leaf nodes in folder sort (defaults to "leaf")
+ * @cfg {Boolean} caseSensitive true for case sensitive sort (defaults to false)
+ * @cfg {Function} sortType A custom "casting" function used to convert node values before sorting
+ * @constructor
+ * @param {TreePanel} tree
+ * @param {Object} config
+ */
+Ext.tree.TreeSorter = function(tree, config){
+    Ext.apply(this, config);
+    tree.on("beforechildrenrendered", this.doSort, this);
+    tree.on("append", this.updateSort, this);
+    tree.on("insert", this.updateSort, this);
+    
+    var dsc = this.dir && this.dir.toLowerCase() == "desc";
+    var p = this.property || "text";
+    var sortType = this.sortType;
+    var fs = this.folderSort;
+    var cs = this.caseSensitive === true;
+    var leafAttr = this.leafAttr || 'leaf';
+
+    this.sortFn = function(n1, n2){
+        if(fs){
+            if(n1.attributes[leafAttr] && !n2.attributes[leafAttr]){
+                return 1;
+            }
+            if(!n1.attributes[leafAttr] && n2.attributes[leafAttr]){
+                return -1;
+            }
+        }
+    	var v1 = sortType ? sortType(n1) : (cs ? n1[p] : n1[p].toUpperCase());
+    	var v2 = sortType ? sortType(n2) : (cs ? n2[p] : n2[p].toUpperCase());
+    	if(v1 < v2){
+			return dsc ? +1 : -1;
+		}else if(v1 > v2){
+			return dsc ? -1 : +1;
+        }else{
+	    	return 0;
+        }
+    };
+};
+
+Ext.tree.TreeSorter.prototype = {
+    doSort : function(node){
+        node.sort(this.sortFn);
+    },
+    
+    compareNodes : function(n1, n2){
+        
+        return (n1.text.toUpperCase() > n2.text.toUpperCase() ? 1 : -1);
+    },
+    
+    updateSort : function(tree, node){
+        if(node.childrenRendered){
+            this.doSort.defer(1, this, [node]);
+        }
+    }
+};

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TriggerField.jss.html b/www/extras/yui-ext/docs/output/TriggerField.jss.html new file mode 100644 index 000000000..f5fc0e6d9 --- /dev/null +++ b/www/extras/yui-ext/docs/output/TriggerField.jss.html @@ -0,0 +1,194 @@ +TriggerField.js

TriggerField.js

/**
+ * @class Ext.form.TriggerField
+ * @extends Ext.form.TextField
+ * Provides a convenient wrapper for TextFields that adds a clickable trigger button (looks like a combobox by default).
+ * The trigger has no default action, so you must assign a function to implement the trigger click handler by
+ * overriding {@link #onTriggerClick}. You can create a TriggerField directly, as it renders exactly like a combobox
+ * for which you can provide a custom implementation.  For example:
+ * <pre><code>
+var trigger = new Ext.form.TriggerField();
+trigger.onTriggerClick = myTriggerFn;
+trigger.applyTo('my-field');
+</code></pre>
+ *
+ * However, in general you will most likely want to use TriggerField as the base class for a reusable component.
+ * {@link Ext.form.DateField} and {@link Ext.form.ComboBox} are perfect examples of this.
+ * @cfg {String} triggerClass An additional CSS class used to style the trigger button.  The trigger will always get the
+ * class 'x-form-trigger' by default and triggerClass will be <b>appended</b> if specified.
+ * @constructor
+ * Create a new TriggerField.
+ * @param {Object} config Configuration options (valid {@Ext.form.TextField} config options will also be applied
+ * to the base TextField)
+ */
+Ext.form.TriggerField = function(config){
+    Ext.form.TriggerField.superclass.constructor.call(this, config);
+    this.mimicing = false;
+    this.on('disable', this.disableWrapper, this);
+    this.on('enable', this.enableWrapper, this);
+};
+
+Ext.extend(Ext.form.TriggerField, Ext.form.TextField,  {
+    /**
+     * @cfg {String/Object} autoCreate A DomHelper element spec, or true for a default element spec (defaults to
+     * {tag: "input", type: "text", size: "16", autocomplete: "off"})
+     */
+
+    // private
+    defaultAutoCreate : {tag: "input", type: "text", size: "16", autocomplete: "off"},
+    /**
+     * @cfg {Boolean} hideTrigger True to hide the trigger element and display only the base text field (defaults to false)
+     */
+    hideTrigger:false,
+
+    /** @cfg {Boolean} grow @hide */
+// holder
+/*** @cfg {Number} growMin @hide */
+// holder
+/*** @cfg {Number} growMax @hide */
+// holder
+/***
+     * @hide 
+     * @method
+     */
+    autoSize: Ext.emptyFn,
+
+    monitorTab : true,
+
+    // private
+    customSize : true,
+
+    // private
+    setSize : function(w, h){
+        if(!this.wrap){
+            this.width = w;
+            this.height = h;
+            return;
+        }
+        if(w){
+            var wrapWidth = w;
+            w = w - this.trigger.getWidth();
+            Ext.form.TriggerField.superclass.setSize.call(this, w, h);
+            this.wrap.setWidth(wrapWidth);
+            if(this.onResize){
+                this.onResize(wrapWidth, h);
+            }
+        }else{
+            Ext.form.TriggerField.superclass.setSize.call(this, w, h);
+            this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth());
+        }
+    },
+
+    // private
+    alignErrorIcon : function(){
+        this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]);
+    },
+
+    // private
+    onRender : function(ct, position){
+        Ext.form.TriggerField.superclass.onRender.call(this, ct, position);
+        this.wrap = this.el.wrap({cls: "x-form-field-wrap"});
+        this.trigger = this.wrap.createChild({
+            tag: "img", src: Ext.BLANK_IMAGE_URL, cls: "x-form-trigger "+this.triggerClass});
+        this.trigger.on("click", this.onTriggerClick, this, {preventDefault:true});
+        this.trigger.addClassOnOver('x-form-trigger-over');
+        this.trigger.addClassOnClick('x-form-trigger-click');
+        if(this.hideTrigger){
+            this.trigger.setDisplayed(false);
+        }
+        this.setSize(this.width||'', this.height||'');
+    },
+
+    onDestroy : function(){
+        if(this.trigger){
+            this.trigger.removeAllListeners();
+            this.trigger.remove();
+        }
+        if(this.wrap){
+            this.wrap.remove();
+        }
+        Ext.form.TriggerField.superclass.onDestroy.call(this);
+    },
+
+    // private
+    onFocus : function(){
+        Ext.form.TriggerField.superclass.onFocus.call(this);
+        if(!this.mimicing){
+            this.mimicing = true;
+            Ext.get(Ext.isIE ? document.body : document).on("mousedown", this.mimicBlur, this);
+            if(this.monitorTab){
+                this.el.on("keydown", this.checkTab, this);
+            }
+        }
+    },
+
+    // private
+    checkTab : function(e){
+        if(e.getKey() == e.TAB){
+            this.triggerBlur();
+        }
+    },
+
+    // private
+    onBlur : function(){
+        // do nothing
+    },
+
+    // private
+    mimicBlur : function(e, t){
+        if(!this.wrap.contains(t) && this.validateBlur()){
+            this.triggerBlur();
+        }
+    },
+
+    // private
+    triggerBlur : function(){
+        this.mimicing = false;
+        Ext.get(Ext.isIE ? document.body : document).un("mousedown", this.mimicBlur);
+        if(this.monitorTab){
+            this.el.un("keydown", this.checkTab, this);
+        }
+        Ext.form.TriggerField.superclass.onBlur.call(this);
+    },
+
+    // private
+    // This should be overriden by any subclass that needs to check whether or not the field can be blurred.
+    validateBlur : function(e, t){
+        return true;
+    },
+
+    // private
+    disableWrapper : function(){
+        if(this.wrap){
+            this.wrap.addClass('x-item-disabled');
+        }
+    },
+
+    // private
+    enableWrapper : function(){
+        if(this.wrap){
+            this.wrap.removeClass('x-item-disabled');
+        }
+    },
+
+    // private
+    onShow : function(){
+        if(this.wrap){
+            this.wrap.dom.style.display = '';
+            this.wrap.dom.style.visibility = 'visible';
+        }
+    },
+
+    // private
+    onHide : function(){
+        this.wrap.dom.style.display = 'none';
+    },
+
+    /**
+     * The function that should handle the trigger's click event.  This method does nothing by default until overridden
+     * by a handler implementation.
+     * @method
+     * @param {EventObject} e
+     */
+    onTriggerClick : Ext.emptyFn
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/UpdateManager.jss.html b/www/extras/yui-ext/docs/output/UpdateManager.jss.html new file mode 100644 index 000000000..963bec0d7 --- /dev/null +++ b/www/extras/yui-ext/docs/output/UpdateManager.jss.html @@ -0,0 +1,487 @@ +UpdateManager.js

UpdateManager.js

/**
+ * @class Ext.UpdateManager
+ * @extends Ext.util.Observable
+ * Provides AJAX-style update for Element object.<br><br>
+ * Usage:<br>
+ * <pre><code>
+ * // Get it from a Ext.Element object
+ * var el = Ext.get("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 Ext.UpdateManager("myElementId");
+ * mgr.startAutoRefresh(60, "http://myserver.com/index.php");
+ * mgr.on("update", myFcnNeedsToKnow);
+ * <br>
+   // short handed call directly from the element object
+   Ext.get("foo").load({
+        url: "bar.php",
+        scripts:true, 
+        params: "for=bar",
+        text: "Loading Foo..."
+   });
+ * </code></pre>
+ * @constructor
+ * Create new UpdateManager directly.
+ * @param {String/HTMLElement/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).
+ */
+Ext.UpdateManager = function(el, forceNew){
+    el = Ext.get(el);
+    if(!forceNew && el.updateManager){
+        return el.updateManager;
+    }
+    /**
+     * The Element object
+     * @type 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.addEvents({
+        /**
+         * @event beforeupdate
+         * Fired before an update is made, return false from your handler and the update is cancelled. 
+         * @param {Ext.Element} el
+         * @param {String/Object/Function} url
+         * @param {String/Object} params
+         */
+        "beforeupdate": true,
+        /**
+         * @event update
+         * Fired after successful update is made. 
+         * @param {Ext.Element} el
+         * @param {Object} oResponseObject The response Object
+         */
+        "update": true,
+        /**
+         * @event failure
+         * Fired on update failure.
+         * @param {Ext.Element} el
+         * @param {Object} oResponseObject The response Object
+         */
+        "failure": true
+    });
+    var d = Ext.UpdateManager.defaults;
+    /**
+     * Blank page URL to use with SSL file uploads (Defaults to Ext.UpdateManager.defaults.sslBlankUrl or "about:blank").
+     * @type String
+     */
+    this.sslBlankUrl = d.sslBlankUrl;
+    /**
+     * Whether to append unique parameter on get request to disable caching (Defaults to Ext.UpdateManager.defaults.disableCaching or false). 
+     * @type Boolean
+     */
+    this.disableCaching = d.disableCaching;
+    /**
+     * Text for loading indicator (Defaults to Ext.UpdateManager.defaults.indicatorText or '&lt;div class="loading-indicator"&gt;Loading...&lt;/div&gt;'). 
+     * @type String
+     */
+    this.indicatorText = d.indicatorText;
+    /**
+     * Whether to show indicatorText when loading (Defaults to Ext.UpdateManager.defaults.showLoadIndicator or true). 
+     * @type String
+     */
+    this.showLoadIndicator = d.showLoadIndicator;
+    /**
+     * Timeout for requests or form posts in seconds (Defaults to Ext.UpdateManager.defaults.timeout or 30 seconds). 
+     * @type Number
+     */
+    this.timeout = d.timeout;
+    
+    /**
+     * True to process scripts in the output (Defaults to Ext.UpdateManager.defaults.loadScripts (false)). 
+     * @type Boolean
+     */
+    this.loadScripts = d.loadScripts;
+    
+    /**
+     * 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 Ext.UpdateManager.BasicRenderer}. 
+      */
+    this.renderer = new Ext.UpdateManager.BasicRenderer();
+
+    Ext.UpdateManager.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.UpdateManager, Ext.util.Observable, {
+    /**
+     * Get the Element this UpdateManager is bound to
+     * @return {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({<br/>
+    url: "your-url.php",<br/>
+    params: {param1: "foo", param2: "bar"}, // or a URL encoded string<br/>
+    callback: yourFunction,<br/>
+    scope: yourObject, //(optional scope)  <br/>
+    discardUrl: false, <br/>
+    nocache: false,<br/>
+    text: "Loading...",<br/>
+    timeout: 30,<br/>
+    scripts: false<br/>
+});   
+</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 {String/Object} 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 {Function} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess, oResponse)
+     * @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.fireEvent("beforeupdate", this.el, url, params) !== false){
+            var method = this.method;
+            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.method != "undefined"){method = cfg.method;};
+                if(typeof cfg.nocache != "undefined"){this.disableCaching = cfg.nocache;};
+                if(typeof cfg.text != "undefined"){this.indicatorText = '<div class="loading-indicator">'+cfg.text+"</div>";};
+                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.call(this);
+            }
+            if(typeof params == "function"){
+                params = params();
+            }
+            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.successDelegate,
+                failure: this.failureDelegate,
+                timeout: (this.timeout*1000),
+                argument: {"url": url, "form": null, "callback": callback, "params": params}
+            };
+            method = method || (params ? "POST" : "GET");
+            if(method == "GET"){
+                url = this.prepareUrl(url);
+            }
+            this.transaction = Ext.lib.Ajax.request(method, url, cb, 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, oResponse)
+     */
+    formUpdate : function(form, url, reset, callback){
+        if(this.fireEvent("beforeupdate", this.el, form, url) !== false){
+            formEl = Ext.getDom(form);
+            if(typeof url == "function"){
+                url = url.call(this);
+            }
+            if(typeof params == "function"){
+                params = params();
+            }
+            url = url || formEl.action;
+            var cb = {
+                success: this.successDelegate,
+                failure: this.failureDelegate,
+                timeout: (this.timeout*1000),
+                argument: {"url": url, "form": formEl, "callback": callback, "reset": reset}
+            };
+            var isUpload = false;
+            var enctype = formEl.getAttribute("enctype");
+            if(enctype && enctype.toLowerCase() == "multipart/form-data"){
+                isUpload = true;
+                cb.upload = this.successDelegate;
+            }
+            this.transaction = Ext.lib.Ajax.formRequest(formEl, url, cb, null, isUpload, this.sslBlankUrl);
+            this.showLoading.defer(1, this);
+        }
+    },
+    
+    /**
+     * 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 "&param1=1&param2=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);
+            delete this.autoRefreshProcId;
+        }
+    },
+
+    isAutoRefreshing : function(){
+       return this.autoRefreshProcId ? true : false;  
+    },
+    /**
+     * 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, response);
+        }
+    },
+    
+    /**
+     * @private
+     */
+    processFailure : function(response){
+        this.transaction = null;
+        this.fireEvent("failure", this.el, response);
+        if(typeof response.argument.callback == "function"){
+            response.argument.callback(this.el, false, response);
+        }
+    },
+    
+    /**
+     * Set the content renderer for this UpdateManager. See {@link 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){
+            Ext.lib.Ajax.abort(this.transaction);
+        }
+    },
+    
+    /**
+     * Returns true if an update is in progress
+     * @return {Boolean}
+     */
+    isUpdating : function(){
+        if(this.transaction){
+            return Ext.lib.Ajax.isCallInProgress(this.transaction);
+        }
+        return false;
+    }
+});
+
+/**
+ * @class Ext.UpdateManager.defaults
+ * The defaults collection enables customizing the default properties of UpdateManager
+ */
+   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 Boolean
+         */
+        loadScripts : false,
+         
+        /**
+        * Blank page URL to use with SSL file uploads (Defaults to "javascript:false").
+        * @type String
+        */
+        sslBlankUrl : (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 Boolean
+         */
+        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. This method is deprecated in favor of el.load({url:'foo.php', ...}).
+ *Usage:
+ * <pre><code>Ext.UpdateManager.updateElement("my-div", "stuff.php");</code></pre>
+ * @param {String/HTMLElement/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
+ * @deprecated
+ * @member Ext.UpdateManager
+ */
+Ext.UpdateManager.updateElement = function(el, url, params, options){
+    var um = Ext.get(el, true).getUpdateManager();
+    Ext.apply(um, options);
+    um.update(url, params, options ? options.callback : null);
+};
+// alias for backwards compat
+Ext.UpdateManager.update = Ext.UpdateManager.updateElement;
+/**
+ * @class Ext.UpdateManager.BasicRenderer
+ * Default Content renderer. Updates the elements innerHTML with the responseText.
+ */ 
+Ext.UpdateManager.BasicRenderer = function(){};
+
+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 {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);
+    }
+};
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/VTypes.jss.html b/www/extras/yui-ext/docs/output/VTypes.jss.html new file mode 100644 index 000000000..16b2e3392 --- /dev/null +++ b/www/extras/yui-ext/docs/output/VTypes.jss.html @@ -0,0 +1,83 @@ +VTypes.js

VTypes.js

/**
+ * @class Ext.form.VTypes
+ * Overrideable validation definitions. The validations provided are basic and intended to be easily customizable and extended.
+ * @singleton
+ */
+Ext.form.VTypes = function(){
+    // closure these in so they are only created once.
+    var alpha = /^[a-zA-Z_]+$/;
+    var alphanum = /^[a-zA-Z0-9_]+$/;
+    var email = /^([\w]+)(.[\w]+)*@([\w-]+\.){1,5}([A-Za-z]){2,4}$/;
+    var url = /(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;
+
+    // All these messages and functions are configurable
+    return {
+        /**
+         * The function used to validate email addresses
+         * @param {String} value The email address
+         */
+        'email' : function(v){
+            return email.test(v);
+        },
+        /**
+         * The error text to display when the email validation function returns false
+         * @type String
+         */
+        'emailText' : 'This field should be an e-mail address in the format "user@domain.com"',
+        /**
+         * The keystroke filter mask to be applied on email input
+         * @type RegExp
+         */
+        'emailMask' : /[a-z0-9_\.\-@]/i,
+
+        /**
+         * The function used to validate urls
+         * @param {String} value The url
+         */
+        'url' : function(v){
+            return url.test(v);
+        },
+        /**
+         * The error text to display when the url validation function returns false
+         * @type String
+         */
+        'urlText' : 'This field should be a URL in the format "http:/'+'/www.domain.com"',
+        
+        /**
+         * The function used to validate alpha values
+         * @param {String} value The value
+         */
+        'alpha' : function(v){
+            return alpha.test(v);
+        },
+        /**
+         * The error text to display when the alpha validation function returns false
+         * @type String
+         */
+        'alphaText' : 'This field should only contain letters and _',
+        /**
+         * The keystroke filter mask to be applied on alpha input
+         * @type RegExp
+         */
+        'alphaMask' : /[a-z_]/i,
+
+        /**
+         * The function used to validate alphanumeric values
+         * @param {String} value The value
+         */
+        'alphanum' : function(v){
+            return alphanum.test(v);
+        },
+        /**
+         * The error text to display when the alphanumeric validation function returns false
+         * @type String
+         */
+        'alphanumText' : 'This field should only contain letters, numbers and _',
+        /**
+         * The keystroke filter mask to be applied on alphanumeric input
+         * @type RegExp
+         */
+        'alphanumMask' : /[a-z0-9_]/i
+    };
+}();

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/View.jss.html b/www/extras/yui-ext/docs/output/View.jss.html new file mode 100644 index 000000000..a250acaf0 --- /dev/null +++ b/www/extras/yui-ext/docs/output/View.jss.html @@ -0,0 +1,453 @@ +View.js

View.js

/**
+ * @class Ext.View
+ * @extends 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 store = new Ext.data.Store(...);
+
+ var view = new Ext.View("my-element",
+ '&lt;div id="{0}"&gt;{2} - {1}&lt;/div&gt;', // auto create template
+ {
+ singleSelect: true,
+ selectedClass: "ydataview-selected",
+ store: store
+ });
+
+ // 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 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 {Object} config The config object
+ */
+Ext.View = function(container, tpl, config){
+    this.el = Ext.get(container, true);
+    if(typeof tpl == "string"){
+        tpl = new Ext.Template(tpl);
+    }
+    tpl.compile();
+    /**
+     * The template used by this View
+     * @type {Ext.DomHelper.Template}
+     */
+    this.tpl = tpl;
+
+    Ext.apply(this, config);
+
+    /** @private */
+    this.addEvents({
+    /**
+     * @event beforeclick
+     * Fires before a click is processed. Returns false to cancel the default action.
+     * @param {Ext.View} this
+     * @param {Number} index The index of the target node
+     * @param {HTMLElement} node The target node
+     * @param {Ext.EventObject} e The raw event object
+     */
+        "beforeclick" : true,
+    /**
+     * @event click
+     * Fires when a template node is clicked.
+     * @param {Ext.View} this
+     * @param {Number} index The index of the target node
+     * @param {HTMLElement} node The target node
+     * @param {Ext.EventObject} e The raw event object
+     */
+        "click" : true,
+    /**
+     * @event dblclick
+     * Fires when a template node is double clicked.
+     * @param {Ext.View} this
+     * @param {Number} index The index of the target node
+     * @param {HTMLElement} node The target node
+     * @param {Ext.EventObject} e The raw event object
+     */
+        "dblclick" : true,
+    /**
+     * @event contextmenu
+     * Fires when a template node is right clicked.
+     * @param {Ext.View} this
+     * @param {Number} index The index of the target node
+     * @param {HTMLElement} node The target node
+     * @param {Ext.EventObject} e The raw event object
+     */
+        "contextmenu" : true,
+    /**
+     * @event selectionchange
+     * Fires when the selected nodes change.
+     * @param {Ext.View} this
+     * @param {Array} selections Array of the selected nodes
+     */
+        "selectionchange" : true,
+
+    /**
+     * @event beforeselect
+     * Fires before a selection is made. If any handlers return false, the selection is cancelled.
+     * @param {Ext.View} this
+     * @param {HTMLElement} node The node to be selected
+     * @param {Array} selections Array of currently selected nodes
+     */
+        "beforeselect" : true
+    });
+
+    this.el.on({
+        "click": this.onClick,
+        "dblclick": this.onDblClick,
+        "contextmenu": this.onContextMenu,
+        scope:this
+    });
+
+    this.selections = [];
+    this.nodes = [];
+    this.cmp = new Ext.CompositeElementLite([]);
+    if(this.store){
+        this.setStore(this.store, true);
+    }
+    Ext.View.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.View, Ext.util.Observable, {
+    /**
+     * The css class to add to selected nodes
+     * @type {Ext.DomHelper.Template}
+     */
+    selectedClass : "x-view-selected",
+    
+    emptyText : "",
+    /**
+     * Returns the element this view is bound to.
+     * @return {Ext.Element}
+     */
+    getEl : function(){
+        return this.el;
+    },
+
+    /**
+     * Refreshes the view.
+     */
+    refresh : function(){
+        var t = this.tpl;
+        this.clearSelections();
+        this.el.update("");
+        var html = [];
+        var records = this.store.getRange();
+        if(records.length < 1){
+            this.el.update(this.emptyText);
+            return;
+        }
+        for(var i = 0, len = records.length; i < len; i++){
+            var data = this.prepareData(records[i].data, i, records[i]);
+            html[html.length] = t.apply(data);
+        }
+        this.el.update(html.join(""));
+        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).
+     */
+    prepareData : function(data){
+        return data;
+    },
+
+    onUpdate : function(ds, record){
+        this.clearSelections();
+        var index = this.store.indexOf(record);
+        var n = this.nodes[index];
+        this.tpl.insertBefore(n, this.prepareData(record.data));
+        n.parentNode.removeChild(n);
+        this.updateIndexes(index, index);
+    },
+
+    onAdd : function(ds, records, index){
+        this.clearSelections();
+        if(this.nodes.length == 0){
+            this.refresh();
+            return;
+        }
+        var n = this.nodes[index];
+        for(var i = 0, len = records.length; i < len; i++){
+            var d = this.prepareData(records[i].data);
+            if(n){
+                this.tpl.insertBefore(n, d);
+            }else{
+                this.tpl.append(this.el, d);
+            }
+        }
+        this.updateIndexes(index);
+    },
+
+    onRemove : function(ds, record, index){
+        this.clearSelections();
+        this.el.dom.removeChild(this.nodes[index]);
+        this.updateIndexes(index);
+    },
+
+    /**
+     * Refresh an individual node.
+     * @param {Number} index
+     */
+    refreshNode : function(index){
+        this.onUpdate(this.store, this.store.getAt(index));
+    },
+
+    updateIndexes : function(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 store this view uses and refresh the view.
+     * @param {Store} store
+     */
+    setStore : function(store, initial){
+        if(!initial && this.store){
+            this.store.un("datachanged", this.refresh);
+            this.store.un("add", this.onAdd);
+            this.store.un("remove", this.onRemove);
+            this.store.un("update", this.onUpdate);
+            this.store.un("clear", this.refresh);
+        }
+        if(store){
+            store.on("datachanged", this.refresh, this);
+            store.on("add", this.onAdd, this);
+            store.on("remove", this.onRemove, this);
+            store.on("update", this.onUpdate, this);
+            store.on("clear", this.refresh, this);
+        }
+        this.store = store;
+        this.refresh();
+    },
+
+    /**
+     * 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);
+            if(this.onItemClick(item, index, e) !== false){
+                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.fireEvent("beforeclick", this, index, item, e) === false){
+            return false;
+        }
+        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;
+            }
+            e.preventDefault();
+        }
+        return true;
+    },
+
+    /**
+     * 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 = [], s = this.selections;
+        for(var i = 0, len = s.length; i < len; i++){
+            indexes.push(s[i].nodeIndex);
+        }
+        return indexes;
+    },
+
+    /**
+     * Clear all selections
+     * @param {Boolean} suppressEvent (optional) true to skip firing of the selectionchange event
+     */
+    clearSelections : function(suppressEvent){
+        if(this.nodes && (this.multiSelect || this.singleSelect) && this.selections.length > 0){
+            this.cmp.elements = this.selections;
+            this.cmp.removeClass(this.selectedClass);
+            this.selections = [];
+            if(!suppressEvent){
+                this.fireEvent("selectionchange", this, this.selections);
+            }
+        }
+    },
+
+    /**
+     * Returns true if the passed node is selected
+     * @param {HTMLElement/Number} node The node or node index
+     * @return {Boolean}
+     */
+    isSelected : function(node){
+        var s = this.selections;
+        if(s.length < 1){
+            return false;
+        }
+        node = this.getNode(node);
+        return s.indexOf(node) !== -1;
+    },
+
+    /**
+     * 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(nodeInfo instanceof Array){
+            if(!keepExisting){
+                this.clearSelections(true);
+            }
+            for(var i = 0, len = nodeInfo.length; i < len; i++){
+                this.select(nodeInfo[i], true, true);
+            }
+        } else{
+            var node = this.getNode(nodeInfo);
+            if(node && !this.isSelected(node)){
+                if(!keepExisting){
+                    this.clearSelections(true);
+                }
+                if(this.fireEvent("beforeselect", this, node, this.selections) !== false){
+                    Ext.fly(node).addClass(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 == "string"){
+            return document.getElementById(nodeInfo);
+        }else if(typeof nodeInfo == "number"){
+            return this.nodes[nodeInfo];
+        }
+        return nodeInfo;
+    },
+
+    /**
+     * 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;
+        start = start || 0;
+        end = typeof end == "undefined" ? ns.length - 1 : end;
+        var nodes = [];
+        if(start <= end){
+            for(var i = start; i <= end; i++){
+                nodes.push(ns[i]);
+            }
+        } else{
+            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;
+    }
+});
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Window.jss.html b/www/extras/yui-ext/docs/output/Window.jss.html new file mode 100644 index 000000000..a7bd9c1e4 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Window.jss.html @@ -0,0 +1,509 @@ +Window.js

Window.js


+Ext.Window = function(config){
+    Ext.Window.superclass.constructor.call(this, config);
+};
+
+Ext.extend(Ext.Window, Ext.Panel, {
+    baseCls : 'x-window',
+    frame:true,
+    floating:true,
+    collapsible:true,
+    resizable:true,
+    draggable:true,
+    closable : true,
+    constrain:true,
+
+    minimizable : true,
+    maximizable : true,
+
+    minHeight: 80,
+    minWidth: 200,
+
+    initHidden : true,
+    monitorResize : true,
+
+    //tools:[{id:'minimize'},{id:'maximize'},{id:'restore', hidden:true},{id:'close'}],
+
+    initComponent : function(){
+        Ext.Window.superclass.initComponent.call(this);
+        this.addEvents({
+            resize: true,
+            maximize : true,
+            minimize: true,
+            restore : true
+        });
+    },
+
+    onRender : function(ct, position){
+        Ext.Window.superclass.onRender.call(this, ct, position);
+
+        // this element allows the Window to be focused for keyboard events
+        this.focusEl = this.el.createChild({
+                    tag: "a", href:"#", cls:"x-dlg-focus",
+                    tabIndex:"-1", html: "&#160;"});
+        this.focusEl.swallowEvent('click', true);
+
+        this.proxy = this.el.createProxy("x-window-proxy");
+        this.proxy.enableDisplayMode('block');
+
+        if(this.modal){
+            this.mask = this.container.createChild({cls:"ext-el-mask"});
+            this.mask.enableDisplayMode("block");
+        }
+    },
+
+    initEvents : function(){
+        if(this.animateTarget){
+            this.setAnimateTarget(this.animateTarget);
+        }
+
+        if(this.resizable){
+            this.resizer = new Ext.Resizable(this.el, {
+                minWidth: this.minWidth,
+                minHeight:this.minHeight,
+                handles: this.resizeHandles || "all",
+                pinned: true,
+                resizeElement : this.resizerAction
+            });
+            this.resizer.window = this;
+            this.resizer.on("beforeresize", this.beforeResize, this);
+        }
+
+        if(this.draggable){
+            this.header.addClass("x-window-draggable");
+            this.dd = new Ext.Window.DD(this);
+        }
+        this.initTools();
+
+        this.el.on("mousedown", this.toFront, this);
+        this.manager = this.manager || Ext.WindowMgr;
+        this.manager.register(this);
+        this.hidden = true;
+        if(this.maximized){
+            this.maximized = false;
+            this.maximize();
+        }
+    },
+
+    initTools : function(){
+        if(this.minimizable){
+            this.addTool({
+                id: 'minimize',
+                on: {
+                    'click' : this.onMinimize.createDelegate(this, [])
+                }
+            });
+        }
+        if(this.maximizable){
+            this.addTool({
+                id: 'maximize',
+                on: {
+                    'click' : this.maximize.createDelegate(this, [])
+                }
+            });
+            this.addTool({
+                id: 'restore',
+                on: {
+                    'click' : this.restore.createDelegate(this, [])
+                },
+                hidden:true
+            });
+            this.header.on('dblclick', this.toggleMaximize, this);
+        }
+        if(this.closable){
+            this.addTool({
+                id: 'close',
+                on: {
+                    'click' : this.onClose.createDelegate(this, [])
+                }
+            });
+        }
+    },
+
+    resizerAction : function(){
+        var box = this.proxy.getBox();
+        this.proxy.hide();
+        this.window.handleResize(box);
+        return box;
+    },
+
+    beforeResize : function(){
+        this.resizer.minHeight = Math.max(this.minHeight, this.getFrameHeight() + 40); // 40 is a magic minimum content size?
+        this.resizer.minWidth = Math.max(this.minWidth, this.getFrameWidth() + 40);
+    },
+
+    // private
+    handleResize : function(box){
+        this.updateBox(box);
+        this.focus();
+        this.fireEvent("resize", this, box.width, box.height);
+    },
+
+    /**
+     * Focuses the Window.  If a defaultButton is set, it will receive focus, otherwise the
+     * Window itself will receive focus.
+     */
+    focus : function(){
+        this.focusEl.focus.defer(10, this.focusEl);
+    },
+
+    setAnimateTarget : function(el){
+        el = Ext.get(el);
+        this.animateTarget = el;
+    },
+
+    beforeShow : function(){
+        delete this.el.lastXY;
+        delete this.el.lastLT;
+        if(this.x === undefined){
+            var xy = this.el.getAlignToXY(this.container, 'c-c');
+            var pos = this.el.translatePoints(xy[0], xy[1]);
+            this.x = pos.left;
+            this.y = pos.top;
+        }
+        this.el.setLeftTop(this.x, this.y);
+        this.expand(false);
+
+        if(this.modal){
+            Ext.get(document.body).addClass("x-body-masked");
+            this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
+            this.mask.show();
+        }
+    },
+
+    show : function(animateTarget, cb, scope){
+        if(this.hidden === false){
+            this.toFront();
+            return;
+        }
+        if(this.fireEvent("beforeshow", this) === false){
+            return;
+        }
+        if(cb){
+            this.on('show', cb, scope, {single:true});
+        }
+        this.hidden = false;
+        if(animateTarget !== undefined){
+            this.setAnimateTarget(animateTarget);
+        }
+        this.beforeShow();
+        if(this.animateTarget){
+            this.animShow();
+        }else{
+            this.afterShow();
+        }
+    },
+
+    afterShow : function(){
+        this.proxy.hide();
+        this.el.setStyle('display', 'block');
+        this.el.show();
+
+        if(this.monitorResize && this.constrain){
+            Ext.EventManager.onWindowResize(this.onWindowResize, this);
+            this.doConstrain();
+        }
+        if(this.layout){
+            this.doLayout();
+        }
+        this.toFront();
+        this.fireEvent("show", this);
+    },
+
+    // private
+    animShow : function(){
+        this.proxy.show();
+        this.proxy.setBox(this.animateTarget.getBox());
+        var b = this.getBox(false);
+        b.callback = this.afterShow;
+        b.scope = this;
+        b.duration = .25;
+        b.easing = 'easeNone';
+        b.block = true;
+        this.el.setStyle('display', 'none');
+        this.proxy.shift(b);
+    },
+
+
+    hide : function(animateTarget, cb, scope){
+        if(this.hidden || this.fireEvent("beforehide", this) === false){
+            return;
+        }
+        if(cb){
+            this.on('hide', cb, scope, {single:true});
+        }
+        this.hidden = true;
+        if(animateTarget !== undefined){
+            this.setAnimateTarget(animateTarget);
+        }
+        if(this.animateTarget){
+            this.animHide();
+        }else{
+            this.el.hide();
+            this.afterHide();
+        }
+    },
+
+    afterHide : function(){
+        this.proxy.hide();
+        if(this.monitorResize && this.constrain){
+            Ext.EventManager.removeResizeListener(this.onWindowResize, this);
+        }
+        if(this.modal){
+            this.mask.hide();
+            Ext.get(document.body).removeClass("x-body-masked");
+        }
+        this.fireEvent("hide", this);
+    },
+
+    animHide : function(){
+        this.proxy.show();
+        var tb = this.getBox(false);
+        this.proxy.setBox(tb);
+        this.el.hide();
+        var b = this.animateTarget.getBox();
+        b.callback = this.afterHide;
+        b.scope = this;
+        b.duration = .25;
+        b.easing = 'easeNone';
+        b.block = true;
+        this.proxy.shift(b);
+    },
+
+    onWindowResize : function(){
+        if(this.maximized){
+            this.fitContainer();
+        }
+        this.doConstrain();
+    },
+
+    doConstrain : function(){
+        if(this.constrain){
+            var xy = this.el.getConstrainToXY(this.container, true,
+                    {   right:this.el.shadowOffset,
+                        left:this.el.shadowOffset,
+                        bottom:this.el.shadowOffset});
+            if(xy){
+                this.setPosition(xy[0], xy[1]);
+            }
+        }
+    },
+
+    ghost : function(cls){
+        var ghost = this.createGhost(cls);
+        var box = this.getBox(true);
+        ghost.setLeftTop(box.x, box.y);
+        ghost.setWidth(box.width);
+        this.el.hide();
+        this.activeGhost = ghost;
+        return ghost;
+    },
+
+    unghost : function(show, matchPosition){
+        if(show !== false){
+            this.el.show();
+            this.focus();
+        }
+        if(matchPosition !== false){
+            this.setPosition(this.activeGhost.getLeft(true), this.activeGhost.getTop(true));
+        }
+        this.activeGhost.hide();
+        this.activeGhost.remove();
+        delete this.activeGhost;
+    },
+
+    onMinimize : function(){
+        this.fireEvent('minimize', this);
+    },
+
+    onClose : function(){
+        if(this.fireEvent("beforeclose", this) === false){
+            return;
+        }
+        this.hide(null, function(){
+            this.fireEvent('close', this);
+            this.destroy();
+        }, this);
+    },
+
+    maximize : function(){
+        if(!this.maximized){
+            this.expand(false);
+            this.restoreSize = this.getSize();
+            this.restorePos = this.getPosition(true);
+            this.tools.maximize.hide();
+            this.tools.restore.show();
+            this.maximized = true;
+            this.el.disableShadow();
+
+            if(this.dd){
+                this.dd.lock();
+            }
+            if(this.collapsible){
+                this.tools.toggle.hide();
+            }
+            this.el.addClass('x-window-maximized');
+            this.container.addClass('x-window-maximized-ct');
+
+            this.setPosition(0, 0);
+            this.fitContainer();
+            this.fireEvent('maximize', this);
+        }
+    },
+
+    restore : function(){
+        if(this.maximized){
+            this.el.removeClass('x-window-maximized');
+            this.tools.restore.hide();
+            this.tools.maximize.show();
+            this.setPosition(this.restorePos[0], this.restorePos[1]);
+            this.setSize(this.restoreSize.width, this.restoreSize.height);
+            delete this.restorePos;
+            delete this.restoreSize;
+            this.maximized = false;
+            this.el.enableShadow(true);
+
+            if(this.dd){
+                this.dd.unlock();
+            }
+            if(this.collapsible){
+                this.tools.toggle.show();
+            }
+            this.container.removeClass('x-window-maximized-ct');
+
+            this.doConstrain();
+            this.fireEvent('restore', this);
+        }
+    },
+
+    toggleMaximize : function(){
+        this[this.maximized ? 'restore' : 'maximize']();
+    },
+
+    fitContainer : function(){
+        var vs = this.container.getViewSize();
+        this.setSize(vs.width, vs.height);
+    },
+
+    // private
+    // z-index is managed by the WindowManager and may be overwritten at any time
+    setZIndex : function(index){
+        if(this.modal){
+            this.mask.setStyle("z-index", index);
+        }
+        this.el.setZIndex(++index);
+        index += 5;
+
+        if(this.resizer){
+            this.resizer.proxy.setStyle("z-index", ++index);
+        }
+
+        this.lastZIndex = index;
+    },
+
+    /**
+     * Aligns the window to the specified element
+     * @param {String/HTMLElement/Ext.Element} element The element to align to.
+     * @param {String} position The position to align to (see {@link Ext.Element#alignTo} for more details).
+     * @param {Array} offsets (optional) Offset the positioning by [x, y]
+     * @return {Ext.Window} this
+     */
+    alignTo : function(element, position, offsets){
+        var xy = this.el.getAlignToXY(element, position, offsets);
+        this.setPagePosition(xy[0], xy[1]);
+        return this;
+    },
+
+    /**
+     * Anchors this window to another element and realigns it when the window is resized or scrolled.
+     * @param {String/HTMLElement/Ext.Element} element The element to align to.
+     * @param {String} position The position to align to (see {@link Ext.Element#alignTo} for more details)
+     * @param {Array} offsets (optional) Offset the positioning by [x, y]
+     * @param {Boolean/Number} monitorScroll (optional) true to monitor body scroll and reposition. If this parameter
+     * is a number, it is used as the buffer delay (defaults to 50ms).
+     * @return {Ext.Window} this
+     */
+    anchorTo : function(el, alignment, offsets, monitorScroll){
+        var action = function(){
+            this.alignTo(el, alignment, offsets);
+        };
+        Ext.EventManager.onWindowResize(action, this);
+        var tm = typeof monitorScroll;
+        if(tm != 'undefined'){
+            Ext.EventManager.on(window, 'scroll', action, this,
+                {buffer: tm == 'number' ? monitorScroll : 50});
+        }
+        action.call(this);
+        return this;
+    },
+
+    /**
+     * Brings this Window to the front of any other visible Windows
+     * @return {Ext.Window} this
+     */
+    toFront : function(){
+        this.manager.bringToFront(this);
+        this.focus();
+        return this;
+    },
+
+    setActive : function(active){
+        if(active){
+            if(!this.maximized){
+                this.el.enableShadow(true);
+            }
+            this.fireEvent('activate', this);
+        }else{
+            this.el.disableShadow();
+            this.fireEvent('deactivate', this);
+        }
+    },
+
+    /**
+     * Sends this Window to the back (under) of any other visible Windows
+     * @return {Ext.Window} this
+     */
+    toBack : function(){
+        this.manager.sendToBack(this);
+        return this;
+    },
+
+    /**
+     * Centers this Window in the viewport
+     * @return {Ext.Window} this
+     */
+    center : function(){
+        var xy = this.el.getAlignToXY(this.container, 'c-c');
+        this.setPagePosition(xy[0], xy[1]);
+        return this;
+    }
+});
+
+Ext.Window.DD = function(win){
+    this.win = win;
+    Ext.Window.DD.superclass.constructor.call(this, win.el.id, 'WindowDD-'+win.id);
+    this.setHandleElId(win.header.id);
+    this.scroll = false;
+};
+
+Ext.extend(Ext.Window.DD, Ext.dd.DD, {
+    moveOnly:true,
+    startDrag : function(){
+        var w = this.win;
+        this.proxy = w.ghost();
+        if(w.constrain !== false){
+            var so = w.el.shadowOffset;
+            this.constrainTo(w.container, {right: so, left: so, bottom: so});
+        }
+    },
+    b4Drag : Ext.emptyFn,
+
+    onDrag : function(e){
+        this.alignElWithMouse(this.proxy, e.getPageX(), e.getPageY());
+    },
+
+    endDrag : function(e){
+        this.win.unghost();
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/WindowManager.jss.html b/www/extras/yui-ext/docs/output/WindowManager.jss.html new file mode 100644 index 000000000..3307ee4dd --- /dev/null +++ b/www/extras/yui-ext/docs/output/WindowManager.jss.html @@ -0,0 +1,137 @@ +WindowManager.js

WindowManager.js

Ext.WindowGroup = function(){
+    var list = {};
+    var accessList = [];
+    var front = null;
+
+    // private
+    var sortWindows = function(d1, d2){
+        return (!d1._lastAccess || d1._lastAccess < d2._lastAccess) ? -1 : 1;
+    };
+
+    // private
+    var orderWindows = function(){
+        accessList.sort(sortWindows);
+        var seed = Ext.DialogManager.zseed;
+        for(var i = 0, len = accessList.length; i < len; i++){
+            var win = accessList[i];
+            if(win && !win.hidden){
+                win.setZIndex(seed + (i*10));
+            }
+        }
+        activateLast();
+    };
+
+    var setActiveWin = function(win){
+        if(win != front){
+            if(front){
+                front.setActive(false);
+            }
+            front = win;
+            if(win){
+                win.setActive(true);
+            }
+        }
+    };
+
+    var activateLast = function(){
+        for(var i = accessList.length-1; i >=0; --i) {
+            if(!accessList[i].hidden){
+                setActiveWin(accessList[i]);
+                return;
+            }
+        }
+        // none to activate
+        setActiveWin(null);
+    };
+
+    return {
+        /**
+         * The starting z-index for windows (defaults to 9000)
+         * @type Number The z-index value
+         */
+        zseed : 9000,
+
+        // private
+        register : function(win){
+            list[win.id] = win;
+            accessList.push(win);
+            win.on('hide', activateLast);
+        },
+
+        // private
+        unregister : function(win){
+            delete list[win.id];
+            win.un('hide', activateLast);
+            accessList.remove(win);
+        },
+
+        /**
+         * Gets a registered Window by id
+         * @param {String/Object} id The id of the Window or a Window
+         * @return {Ext.BasicDialog} this
+         */
+        get : function(id){
+            return typeof id == "object" ? id : list[id];
+        },
+
+        /**
+         * Brings the specified Window to the front
+         * @param {String/Object} win The id of the Window or a Window
+         * @return {Ext.BasicDialog} this
+         */
+        bringToFront : function(win){
+            win = this.get(win);
+            if(win != front){
+                win._lastAccess = new Date().getTime();
+                orderWindows();
+            }
+            return win;
+        },
+
+        /**
+         * Sends the specified Window to the back
+         * @param {String/Object} win The id of the Window or a Window
+         * @return {Ext.BasicDialog} this
+         */
+        sendToBack : function(win){
+            win = this.get(win);
+            win._lastAccess = -(new Date().getTime());
+            orderWindows();
+            return win;
+        },
+
+        /**
+         * Hides all Windows
+         */
+        hideAll : function(){
+            for(var id in list){
+                if(list[id] && typeof list[id] != "function" && list[id].isVisible()){
+                    list[id].hide();
+                }
+            }
+        },
+
+
+
+        getBy : function(fn, scope){
+            var r = [];
+            for(var i = accessList.length-1; i >=0; --i) {
+                var win = accessList[i];
+                if(fn.call(scope||win, win) !== false){
+                    r.push(win);
+                }
+            }
+            return r;
+        }
+    };
+};
+
+
+/**
+ * @class Ext.WindowManager
+ * @extends Ext.WindowGroup
+ * The default global group of windows.
+ * @singleton
+ */
+Ext.WindowMgr = new Ext.WindowGroup();

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/XmlReader.jss.html b/www/extras/yui-ext/docs/output/XmlReader.jss.html new file mode 100644 index 000000000..e1170ebfa --- /dev/null +++ b/www/extras/yui-ext/docs/output/XmlReader.jss.html @@ -0,0 +1,113 @@ +XmlReader.js

XmlReader.js

/**
+ * @class Ext.data.XmlReader
+ * @extends Ext.data.DataReader
+ * Data reader class to create an Array of {@link Ext.data.Record} objects from an XML document
+ * based on mappings in a provided Ext.data.Record constructor.
+ * <p>
+ * The code below lists all configuration options.
+ * <pre><code>
+var myReader = new Ext.data.XmlReader({
+   record: "row",           // The repeated element which contains record information
+   totalRecords: "results", // The element which contains the number of returned records (optional)
+   id: "id"                 // The element within the record that provides an ID for the record (optional)
+}, myRecordDefinition);
+</code></pre>
+ * <p>
+ * This would consume an XML file like this:
+ * <pre><code>
+&lt;?xml?>
+&lt;dataset>
+ &lt;results>2&lt;/results>
+ &lt;row>
+   &lt;id>1&lt;/id>
+   &lt;name>Bill&lt;/name>
+ &lt;/row>
+ &lt;row>
+   &lt;id>2&lt;/id>
+   &lt;name>Ben&lt;/name>
+ &lt;/row>
+&lt;/dataset>
+</code></pre>
+ * @cfg {String} totalRecords The DomQuery path from which to retrieve the total number of records
+ * in the dataset. This is only needed if the whole dataset is not passed in one go, but is being
+ * paged from the remote server.
+ * @cfg {String} record The DomQuery path to the repeated element which contains record information.
+ * @cfg {String} success The DomQuery path to the success attribute used by forms.
+ * @cfg {String} id The DomQuery path relative from the record element to the element that contains
+ * a record identifier value.
+ * @constructor
+ * Create a new XmlReader
+ * @param {Object} meta Metadata configuration options
+ * @param {Mixed} recordType The definition of the data record type to produce.  This can be either a valid
+ * Record subclass created with {@link Ext.data.Record#create}, or an array of objects with which to call
+ * Ext.data.Record.create.  See the {@link Ext.data.Record} class for more details.
+ */
+Ext.data.XmlReader = function(meta, recordType){
+    Ext.data.XmlReader.superclass.constructor.call(this, meta, recordType);
+};
+Ext.extend(Ext.data.XmlReader, Ext.data.DataReader, {
+    /**
+     * This method is only used by a DataProxy which has retrieved data from a remote server.
+	 * @param {Object} response The XHR object which contains the parsed XML document.  The response is expected
+	 * to contain a method called 'responseXML' that returns an XML document object.
+     * @return {Object} records A data block which is used by an {@link Ext.data.Store} as
+     * a cache of Ext.data.Records.
+     */
+    read : function(response){
+        var doc = response.responseXML;
+        if(!doc) {
+            throw {message: "XmlReader.read: XML Document not available"};
+        }
+        return this.readRecords(doc);
+    },
+
+    /**
+     * Create a data block containing Ext.data.Records from an XML document.
+	 * @param {Object} doc A parsed XML document.
+     * @return {Object} records A data block which is used by an {@link Ext.data.Store} as
+     * a cache of Ext.data.Records.
+     */
+    readRecords : function(doc){
+        /**
+         * After any data loads/reads, the raw XML Document is available for further custom processing.
+         * @type XMLDocument
+         */
+        this.xmlData = doc;
+        var root = doc.documentElement || doc;
+    	var q = Ext.DomQuery;
+    	var recordType = this.recordType, fields = recordType.prototype.fields;
+    	var sid = this.meta.id;
+    	var totalRecords = 0, success = true;
+    	if(this.meta.totalRecords){
+    	    totalRecords = q.selectNumber(this.meta.totalRecords, root, 0);
+    	}
+        
+        if(this.meta.success){
+            var sv = q.selectValue(this.meta.success, root, true);
+            success = sv !== false && sv !== 'false';
+    	}
+    	var records = [];
+    	var ns = q.select(this.meta.record, root);
+        for(var i = 0, len = ns.length; i < len; i++) {
+	        var n = ns[i];
+	        var values = {};
+	        var id = sid ? q.selectValue(sid, n) : undefined;
+	        for(var j = 0, jlen = fields.length; j < jlen; j++){
+	            var f = fields.items[j];
+                var v = q.selectValue(f.mapping || f.name, n, f.defaultValue);
+	            v = f.convert(v);
+	            values[f.name] = v;
+	        }
+	        var record = new recordType(values, id);
+	        record.node = n;
+	        records[records.length] = record;
+	    }
+
+	    return {
+	        success : success,
+	        records : records,
+	        totalRecords : totalRecords || records.length
+	    };
+    }
+});

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/debug.jss.html b/www/extras/yui-ext/docs/output/debug.jss.html new file mode 100644 index 000000000..adeb64413 --- /dev/null +++ b/www/extras/yui-ext/docs/output/debug.jss.html @@ -0,0 +1,727 @@ +debug.js

debug.js

/*
+ * These functions are only included in -debug files
+ *
+*/Ext.debug = {
+    init : function(){
+        var CP = Ext.ContentPanel;
+        var bd = Ext.get(document.body);
+
+        // create the dialog
+        var dlg = new Ext.LayoutDialog('x-debug-browser', {
+            autoCreate:true,
+            width:800,
+            height:450,
+            title: 'Ext Debug Console &amp; Inspector',
+            proxyDrag:true,
+            shadow:true,
+            center:{alwaysShowTabs:true},
+            constraintoviewport:false
+        });
+
+        // prevent dialog events from bubbling
+        dlg.el.swallowEvent('click');
+
+        // build the layout
+        var mainLayout = dlg.getLayout();
+        mainLayout.beginUpdate();
+
+        // create the nested layouts
+        var clayout = mainLayout.add('center',
+            new Ext.debug.InnerLayout('x-debug-console', 400, {
+                title: 'Debug Console'
+            }
+        ));
+
+        var ilayout = mainLayout.add('center',
+            new Ext.debug.InnerLayout('x-debug-inspector', 250, {
+                title: 'DOM Inspector'
+            }
+        ));
+
+        var scriptPanel = clayout.add('east', new CP({
+            autoCreate:{
+                tag: 'div', children: [
+                    {tag: 'div'},
+                    {tag:'textarea'}
+                ]
+            },
+            fitContainer:true,
+            fitToFrame:true,
+            title:'Script Console',
+            autoScroll: Ext.isGecko, // hideous block for firefox missing cursor AND bad sizing textareas
+            setSize : function(w, h){
+                Ext.ContentPanel.prototype.setSize.call(this, w, h);
+                if(Ext.isGecko && Ext.isStrict){
+                    var s = this.adjustForComponents(w, h);
+                    this.resizeEl.setSize(s.width-2, s.height-2);
+                }
+            }
+        }));
+        var sel = scriptPanel.el;
+        var script = sel.child('textarea');
+        scriptPanel.resizeEl = script;
+        var sctb = scriptPanel.toolbar = new Ext.Toolbar(sel.child('div'));
+        sctb.add({
+            text: 'Run',
+            handler: function(){
+                var s = script.dom.value;
+                if(trap.checked){
+                    try{
+                        var rt = eval(s);
+                        Ext.debug.dump(rt === undefined? '(no return)' : rt);
+                    }catch(e){
+                        Ext.debug.log(e.message || e.descript);
+                    }
+                }else{
+                    var rt = eval(s);
+                    Ext.debug.dump(rt === undefined? '(no return)' : rt);
+                }
+            }
+        }, {
+            text: 'Clear',
+            handler: function(){
+                script.dom.value = '';
+                script.dom.focus();
+            }
+        });
+
+        var trap = Ext.DomHelper.append(sctb.el, {tag:'input', type:'checkbox', checked: 'checked'});
+        trap.checked = true;
+        sctb.add('-', trap, 'Trap Errors');
+
+
+        var stylesGrid = new Ext.grid.PropertyGrid(bd.createChild(), {
+            nameText: 'Style',
+            enableCtxMenu: false,
+            enableColumnResize: false
+        });
+
+        var stylePanel = ilayout.add('east', new Ext.GridPanel(stylesGrid,
+            {title: '(No element selected)'}));
+
+        stylesGrid.render();
+
+        // hide the header
+        stylesGrid.getView().mainHd.setDisplayed(false);
+
+        clayout.tbar.add({
+            text: 'Clear',
+            handler: function(){
+                Ext.debug.console.jsonData = [];
+                Ext.debug.console.refresh();
+            }
+        });
+
+        var treeEl = ilayout.main.getEl();
+        // create main inspector toolbar
+        var tb = ilayout.tbar;
+
+        var inspectIgnore, inspecting;
+
+        function inspectListener(e, t){
+            if(!inspectIgnore.contains(e.getPoint())){
+                findNode(t);
+            }
+        }
+
+        function stopInspecting(e, t){
+            if(!inspectIgnore.contains(e.getPoint())){
+                inspect.toggle(false);
+                if(findNode(t) !== false){
+                    e.stopEvent();
+                }
+            }
+        }
+
+        function stopInspectingEsc(e, t){
+            if(e.getKey() == e.ESC){
+                inspect.toggle(false);
+            }
+        }
+
+        var inspect = tb.addButton({
+            text: 'Inspect',
+            enableToggle: true,
+            pressed:false,
+            toggleHandler: function(n, pressed){
+                var d = Ext.get(document);
+                if(pressed){
+                    d.on('mouseover', inspectListener, window, {buffer:50});
+                    d.on('mousedown', stopInspecting);
+                    d.on('keydown', stopInspectingEsc);
+                    inspectIgnore = dlg.el.getRegion();
+                    inspecting = true;
+                }else{
+                    d.un('mouseover', inspectListener);
+                    d.un('mousedown', stopInspecting);
+                    d.on('keydown', stopInspectingEsc);
+                    inspecting = false;
+                    var n = tree.getSelectionModel().getSelectedNode();
+                    if(n && n.htmlNode){
+                        onNodeSelect(tree, n, false);
+                    }
+                }
+            }
+        });
+
+        tb.addSeparator();
+
+        var frameEl = tb.addButton({
+            text: 'Highlight Selection',
+            enableToggle: true,
+            pressed:false,
+            toggleHandler: function(n, pressed){
+                var n = tree.getSelectionModel().getSelectedNode();
+                if(n && n.htmlNode){
+                    n[pressed ? 'frame' : 'unframe']();
+                }
+            }
+        });
+
+        tb.addSeparator();
+
+        var reload = tb.addButton({
+            text: 'Refresh Children',
+            disabled:true,
+            handler: function(){
+                var n = tree.getSelectionModel().getSelectedNode();
+                if(n && n.reload){
+                    n.reload();
+                }
+            }
+        });
+
+        tb.add( '-', {
+            text: 'Collapse All',
+            handler: function(){
+                tree.root.collapse(true);
+            }
+        });
+
+        // perform the main layout
+        mainLayout.endUpdate();
+
+        mainLayout.getRegion('center').showPanel(0);
+
+        stylesGrid.on('propertychange', function(s, name, value){
+            var node = stylesGrid.treeNode;
+            if(styles){
+                node.htmlNode.style[name] = value;
+            }else{
+                node.htmlNode[name] = value;
+            }
+            node.refresh(true);
+        });
+
+        // Create the style toolbar
+        var stb = new Ext.Toolbar(stylesGrid.view.getHeaderPanel(true));
+
+        var swap = stb.addButton({
+            text: 'DOM Attributes',
+            menu: {
+                items: [
+                    new Ext.menu.CheckItem({id:'dom', text:'DOM Attributes', checked: true, group:'xdb-styles'}),
+                    new Ext.menu.CheckItem({id:'styles', text:'CSS Properties', group:'xdb-styles'})
+                ]
+            }
+        });
+
+        swap.menu.on('click', function(){
+            styles = swap.menu.items.get('styles').checked;
+            showAll[styles? 'show' : 'hide']();
+            swap.setText(styles ? 'CSS Properties' : 'DOM Attributes');
+            var n = tree.getSelectionModel().getSelectedNode();
+            if(n){
+                onNodeSelect(tree, n);
+            }
+        });
+        
+        var addStyle = stb.addButton({
+            text: 'Add',
+            disabled: true,
+            handler: function(){
+                Ext.MessageBox.prompt('Add Property', 'Property Name:', function(btn, v){
+                    // store.store is disgusting TODO: clean up the API
+                    var store = stylesGrid.store.store;
+                    if(btn == 'ok' && v && !store.getById(v)){
+                        var r = new Ext.grid.PropertyRecord({name:v, value: ''}, v);
+                        store.add(r);
+                        stylesGrid.startEditing(store.getCount()-1, 1);
+                    }
+                });
+            }
+        });
+
+        var showAll = stb.addButton({
+            text: 'Computed Styles',
+            hidden: true,
+            pressed: false,
+            enableToggle: true,
+            toggleHandler: function(){
+                var n = tree.getSelectionModel().getSelectedNode();
+                if(n){
+                    onNodeSelect(tree, n);
+                }
+            }
+        });
+
+        // tree related stuff
+        var styles = false, hnode;
+        var nonSpace = /^\s*$/;
+        var html = Ext.util.Format.htmlEncode;
+        var ellipsis = Ext.util.Format.ellipsis;
+        var styleRe = /\s?([a-z\-]*)\:([^;]*)(?:[;\s\n\r]*)/gi;
+
+        function findNode(n){
+            if(!n || n.nodeType != 1 || n == document.body || n == document){
+                return false;
+            }
+            var pn = [n], p = n;
+            while((p = p.parentNode) && p.nodeType == 1 && p.tagName.toUpperCase() != 'HTML'){
+                pn.unshift(p);
+            }
+            var cn = hnode;
+            for(var i = 0, len = pn.length; i < len; i++){
+                cn.expand();
+                cn = cn.findChild('htmlNode', pn[i]);
+                if(!cn){ // in this dialog?
+                    return false;
+                }
+            }
+            cn.select();
+            var a = cn.ui.anchor;
+            treeEl.dom.scrollTop = Math.max(0 ,a.offsetTop-10);
+            //treeEl.dom.scrollLeft = Math.max(0 ,a.offsetLeft-10); no likey
+            cn.highlight();
+            return true;
+        }
+
+        function nodeTitle(n){
+            var s = n.tagName;
+            if(n.id){
+                s += '#'+n.id;
+            }else if(n.className){
+                s += '.'+n.className;
+            }
+            return s;
+        }
+
+        function onNodeSelect(t, n, last){
+            if(last && last.unframe){
+                last.unframe();
+            }
+            var props = {};
+            if(n && n.htmlNode){
+                if(frameEl.pressed){
+                    n.frame();
+                }
+                if(inspecting){
+                    return;
+                }
+                addStyle.enable();
+                reload.setDisabled(n.leaf);
+                var dom = n.htmlNode;
+                stylePanel.setTitle(nodeTitle(dom));
+                if(styles && !showAll.pressed){
+                    var s = dom.style ? dom.style.cssText : '';
+                    if(s){
+                        var m;
+                        while ((m = styleRe.exec(s)) != null){
+                            props[m[1].toLowerCase()] = m[2];
+                        }
+                    }
+                }else if(styles){
+                    var cl = Ext.debug.cssList;
+                    var s = dom.style, fly = Ext.fly(dom);
+                    if(s){
+                        for(var i = 0, len = cl.length; i<len; i++){
+                            var st = cl[i];
+                            var v = s[st] || fly.getStyle(st);
+                            if(v != undefined && v !== null && v !== ''){
+                                props[st] = v;
+                            }
+                        }
+                    }
+                }else{
+                    for(var a in dom){
+                        var v = dom[a];
+                        if((isNaN(a+10)) && v != undefined && v !== null && v !== '' && !(Ext.isGecko && a[0] == a[0].toUpperCase())){
+                            props[a] = v;
+                        }
+                    }
+                }
+            }else{
+                if(inspecting){
+                    return;
+                }
+                addStyle.disable();
+                reload.disabled();
+            }
+            stylesGrid.setSource(props);
+            stylesGrid.treeNode = n;
+            stylesGrid.view.fitColumns();
+        }
+
+        // lets build a list of nodes to filter from the tree
+        // this is gonna be nasty
+        var filterIds = '^(?:';
+        var eds = stylesGrid.colModel.editors;
+        for(var edType in eds){
+            filterIds += eds[edType].id +'|';
+        }
+        Ext.each([dlg.shim? dlg.shim.id : 'noshim', dlg.proxyDrag.id], function(id){
+             filterIds += id +'|';
+        });
+        filterIds += dlg.el.id;
+        filterIds += ')$';
+        var filterRe = new RegExp(filterIds);
+
+        var loader = new Ext.tree.TreeLoader();
+        loader.load = function(n, cb){
+            var isBody = n.htmlNode == bd.dom;
+            var cn = n.htmlNode.childNodes;
+            for(var i = 0, c; c = cn[i]; i++){
+                if(isBody && filterRe.test(c.id)){
+                    continue;
+                }
+                if(c.nodeType == 1){
+                    n.appendChild(new Ext.debug.HtmlNode(c));
+                }else if(c.nodeType == 3 && !nonSpace.test(c.nodeValue)){
+                    n.appendChild(new Ext.tree.TreeNode({
+                        text:'<em>' + ellipsis(html(String(c.nodeValue)), 35) + '</em>',
+                        cls: 'x-tree-noicon'
+                    }));
+                }
+            }
+            cb();
+        };
+
+        var tree = new Ext.tree.TreePanel(treeEl, {
+            enableDD:false ,
+            loader: loader,
+            lines:false,
+            rootVisible:false,
+            animate:false,
+            hlColor:'ffff9c'
+        });
+        tree.getSelectionModel().on('selectionchange', onNodeSelect, null, {buffer:250});
+
+        var root = tree.setRootNode(new Ext.tree.TreeNode('Ext'));
+
+        hnode = root.appendChild(new Ext.debug.HtmlNode(
+                document.getElementsByTagName('html')[0]
+        ));
+
+        tree.render();
+
+        Ext.debug.console = new Ext.JsonView(clayout.main.getEl(),
+                '<pre><xmp>> {msg}</xmp></pre>');
+        Ext.debug.console.jsonData = [];
+
+        Ext.debug.dialog = dlg;
+    },
+
+    show : function(){
+        var d = Ext.debug;
+        if(!d.dialog){
+            d.init();
+        }
+        if(!d.dialog.isVisible()){
+            d.dialog.show();
+        }
+    },
+
+    hide : function(){
+        if(Ext.debug.dialog){
+            Ext.debug.dialog.hide();
+        }
+    },
+
+    /**
+     * Debugging function. Prints all arguments to a resizable, movable, scrolling region without
+     * the need to include separate js or css. Double click it to hide it.
+     * @param {Mixed} arg1
+     * @param {Mixed} arg2
+     * @param {Mixed} etc
+     * @method print
+     */
+    log : function(arg1, arg2, etc){
+       Ext.debug.show();
+        var m = "";
+        for(var i = 0, len = arguments.length; i < len; i++){
+            m += (i == 0 ? "" : ", ") + arguments[i];
+        }
+        var cn = Ext.debug.console;
+        cn.jsonData.unshift({msg: m});
+        cn.refresh();
+    },
+
+    /**
+     * Applies the passed C#/DomHelper style format (e.g. "The variable {0} is equal to {1}") before calling Ext.debug.log
+     * @param {String} format
+     * @param {Mixed} arg1
+     * @param {Mixed} arg2
+     * @param {Mixed} etc
+     * @method printf
+     */
+    logf : function(format, arg1, arg2, etc){
+        Ext.debug.log(String.format.apply(String, arguments));
+    },
+
+    /**
+     * Dumps an object to Ext.debug.log
+     * @param {Object} o
+     * @method dump
+     */
+    dump : function(o){
+        if(typeof o == 'string' || typeof o == 'number' || typeof o == 'undefined' || o instanceof Date){
+            Ext.debug.log(o);
+        }else if(!o){
+            Ext.debug.log("null");
+        }else if(typeof o != "object"){
+            Ext.debug.log('Unknown return type');
+        }else if(o instanceof Array){
+            Ext.debug.log('['+o.join(',')+']');
+        }else{
+            var b = ["{\n"];
+            for(var key in o){
+                var to = typeof o[key];
+                if(to != "function" && to != "object"){
+                    b.push(String.format("  {0}: {1},\n", key, o[key]));
+                }
+            }
+            var s = b.join("");
+            if(s.length > 3){
+                s = s.substr(0, s.length-2);
+            }
+            Ext.debug.log(s + "\n}");
+        }
+    },
+
+    _timers : {},
+    /**
+     * Starts a timer.
+     * @param {String} name (optional)
+     * @method timer
+     */
+    time : function(name){
+        name = name || "def";
+        Ext._timers[name] = new Date().getTime();
+    },
+
+    /**
+     * Ends a timer, returns the results (formatted "{1} ms") and optionally prints them to Ext.print()
+     * @param {String} name (optional)
+     * @param {Boolean} printResults (optional) false to stop printing the results to Ext.print
+     * @method timerEnd
+     */
+    timeEnd : function(name, printResults){
+        var t = new Date().getTime();
+        name = name || "def";
+        var v = String.format("{0} ms", t-Ext._timers[name]);
+        Ext._timers[name] = new Date().getTime();
+        if(printResults !== false){
+            Ext.debug.log('Timer ' + (name == "def" ? v : name + ": " + v));
+        }
+        return v;
+    }
+};
+
+// highly unusual class declaration
+Ext.debug.HtmlNode = function(){
+    var html = Ext.util.Format.htmlEncode;
+    var ellipsis = Ext.util.Format.ellipsis;
+    var nonSpace = /^\s*$/;
+
+    var attrs = [
+        {n: 'id', v: 'id'},
+        {n: 'className', v: 'class'},
+        {n: 'name', v: 'name'},
+        {n: 'type', v: 'type'},
+        {n: 'src', v: 'src'},
+        {n: 'href', v: 'href'}
+    ];
+
+    function hasChild(n){
+        for(var i = 0, c; c = n.childNodes[i]; i++){
+            if(c.nodeType == 1){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    function renderNode(n, leaf){
+        var tag = n.tagName.toLowerCase();
+        var s = '&lt;' + tag;
+        for(var i = 0, len = attrs.length; i < len; i++){
+            var a = attrs[i];
+            var v = n[a.n];
+            if(v && !nonSpace.test(v)){
+                s += ' ' + a.v + '=&quot;<i>' + html(v) +'</i>&quot;';
+            }
+        }
+        var style = n.style ? n.style.cssText : '';
+        if(style){
+            s += ' style=&quot;<i>' + html(style.toLowerCase()) +'</i>&quot;';
+        }
+        if(leaf && n.childNodes.length > 0){
+            s+='&gt;<em>' + ellipsis(html(String(n.innerHTML)), 35) + '</em>&lt;/'+tag+'&gt;';
+        }else if(leaf){
+            s += ' /&gt;';
+        }else{
+            s += '&gt;';
+        }
+        return s;
+    }
+
+    var HtmlNode = function(n){
+        var leaf = !hasChild(n);
+        this.htmlNode = n;
+        this.tagName = n.tagName.toLowerCase();
+        var attr = {
+            text : renderNode(n, leaf),
+            leaf : leaf,
+            cls: 'x-tree-noicon'
+        };
+        HtmlNode.superclass.constructor.call(this, attr);
+        this.attributes.htmlNode = n; // for searching
+        if(!leaf){
+            this.on('expand', this.onExpand,  this);
+            this.on('collapse', this.onCollapse,  this);
+        }
+    };
+
+
+    Ext.extend(HtmlNode, Ext.tree.AsyncTreeNode, {
+        cls: 'x-tree-noicon',
+        preventHScroll: true,
+        refresh : function(highlight){
+            var leaf = !hasChild(this.htmlNode);
+            this.setText(renderNode(this.htmlNode, leaf));
+            if(highlight){
+                Ext.fly(this.ui.textNode).highlight();
+            }
+        },
+
+        onExpand : function(){
+            if(!this.closeNode && this.parentNode){
+                this.closeNode = this.parentNode.insertBefore(new Ext.tree.TreeNode({
+                    text:'&lt;/' + this.tagName + '&gt;',
+                    cls: 'x-tree-noicon'
+                }), this.nextSibling);
+            }else if(this.closeNode){
+                this.closeNode.ui.show();
+            }
+        },
+
+        onCollapse : function(){
+            if(this.closeNode){
+                this.closeNode.ui.hide();
+            }
+        },
+
+        render : function(bulkRender){
+            HtmlNode.superclass.render.call(this, bulkRender);
+        },
+
+        highlightNode : function(){
+            //Ext.fly(this.htmlNode).highlight();
+        },
+
+        highlight : function(){
+            //Ext.fly(this.ui.textNode).highlight();
+        },
+
+        frame : function(){
+            this.htmlNode.style.border = '1px solid #0000ff';
+            //this.highlightNode();
+        },
+
+        unframe : function(){
+            //Ext.fly(this.htmlNode).removeClass('x-debug-frame');
+            this.htmlNode.style.border = '';
+        }
+    });
+
+    return HtmlNode;
+}();
+
+// subclass for the standard layout panels
+Ext.debug.InnerLayout = function(id, w, cfg){
+    // console layout
+    var el = Ext.DomHelper.append(document.body, {id:id});
+    var layout = new Ext.BorderLayout(el, {
+        north: {
+            initialSize:28
+        },
+        center: {
+            titlebar: false
+        },
+        east: {
+            split:true,
+            initialSize:w,
+            titlebar:true
+        }
+    });
+    Ext.debug.InnerLayout.superclass.constructor.call(this, layout, cfg);
+
+    layout.beginUpdate();
+
+    var tbPanel = layout.add('north', new Ext.ContentPanel({
+            autoCreate:true, fitToFrame:true}));
+
+    this.main = layout.add('center', new Ext.ContentPanel({
+            autoCreate:true, fitToFrame:true, autoScroll:true}));
+
+    this.tbar = new Ext.Toolbar(tbPanel.el);
+
+    var mtbEl = tbPanel.resizeEl = tbPanel.el.child('div.x-toolbar');
+    mtbEl.setStyle('border-bottom', '0 none');
+
+    layout.endUpdate(true);
+};
+
+Ext.extend(Ext.debug.InnerLayout, Ext.NestedLayoutPanel, {
+    add : function(){
+        return this.layout.add.apply(this.layout, arguments);
+    }
+});
+
+Ext.debug.cssList = ['background-color','border','border-color','border-spacing',
+'border-style','border-top','border-right','border-bottom','border-left','border-top-color',
+'border-right-color','border-bottom-color','border-left-color','border-top-width','border-right-width',
+'border-bottom-width','border-left-width','border-width','bottom','color','font-size','font-size-adjust',
+'font-stretch','font-style','height','left','letter-spacing','line-height','margin','margin-top',
+'margin-right','margin-bottom','margin-left','marker-offset','max-height','max-width','min-height',
+'min-width','orphans','outline','outline-color','outline-style','outline-width','overflow','padding',
+'padding-top','padding-right','padding-bottom','padding-left','quotes','right','size','text-indent',
+'top','width','word-spacing','z-index','opacity','outline-offset'];
+
+if(typeof console == 'undefined'){
+    console = Ext.debug;
+}
+/*
+if(Ext.isSafari || Ext.isIE || Ext.isOpera){
+    window.onerror = function(msg, url, line){
+        Ext.log.apply(Ext, arguments);
+    };
+}*/
+
+// attach shortcut key
+Ext.EventManager.on(window, 'load', function(){
+    Ext.get(document).on('keydown', function(e){
+        if(e.ctrlKey && e.shiftKey && e.getKey() == e.HOME){
+            Ext.debug.show();
+        }
+    });
+});
+
+// backwards compat
+Ext.print = Ext.log = Ext.debug.log;
+Ext.printf = Ext.logf = Ext.debug.logf;
+Ext.dump = Ext.debug.dump;
+Ext.timer = Ext.debug.time;
+Ext.timerEnd = Ext.debug.timeEnd;
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-da.jss.html b/www/extras/yui-ext/docs/output/ext-lang-da.jss.html new file mode 100644 index 000000000..8667d6373 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-da.jss.html @@ -0,0 +1,169 @@ +ext-lang-da.js

ext-lang-da.js

/*
+ * Danish translation
+ * By JohnF
+ * 04-09-2007, 05:28 AM
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">Henter...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} markerede rækker";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Luk denne fane";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "Værdien i dette felt er ikke tilladt";
+}
+
+Date.monthNames = [
+   "Januar",
+   "Februar",
+   "Marts",
+   "April",
+   "Maj",
+   "Juni",
+   "Juli",
+   "August",
+   "September",
+   "Oktober",
+   "November",
+   "December"
+];
+
+Date.dayNames = [
+   "Søndag",
+   "Mandag",
+   "Tirsdag",
+   "Onsdag",
+   "Torsdag",
+   "Fredag",
+   "Lørdag"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "OK",
+      cancel : "Fortryd",
+      yes    : "Ja",
+      no     : "Nej"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "d/m/Y");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "I dag",
+      minText           : "Denne dato er før den tidligst tilladte",
+      maxText           : "Denne dato er senere end den senest tilladte",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames        : Date.monthNames,
+      dayNames          : Date.dayNames,      
+      nextText          : 'Næste måned (Ctrl + højre piltast)',
+      prevText          : 'Forrige måned (Ctrl + venstre piltast)',
+      monthYearText     : 'Vælg en måned (Ctrl + op/ned pil for at ændre årstal)',
+      todayTip          : "{0} (mellemrum)",
+      format            : "d/m/y",
+      startDay          : 1
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Side",
+      afterPageText  : "af {0}",
+      firstText      : "Første side",
+      prevText       : "Forrige side",
+      nextText       : "Næste side",
+      lastText       : "Sidste side",
+      refreshText    : "Opfrisk",
+      displayMsg     : "Viser {0} - {1} af {2}",
+      emptyMsg       : 'Der er ingen data at vise'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "Minimum længden for dette felt er {0}",
+      maxLengthText : "Maksimum længden for dette felt er {0}",
+      blankText     : "Dette felt skal udfyldes",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "Mindste-værdien for dette felt er {0}",
+      maxText : "Maksimum-værdien for dette felt er {0}",
+      nanText : "{0} er ikke et tilladt nummer"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "Inaktiveret",
+      disabledDatesText : "Inaktiveret",
+      minText           : "Datoen i dette felt skal være efter  {0}",
+      maxText           : "Datoen i dette felt skal være før {0}",
+      invalidText       : "{0} er ikke en tilladt dato - datoer skal angives i formatet {1}",
+      format            : "d/m/y"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "Henter...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'Dette felt skal være en email adresse i formatet "navn@domæne.dk"',
+      urlText      : 'Dette felt skal være et link (URL) i formatet "http:/'+'/www.domæne.dk"',
+      alphaText    : 'Dette felt kan kun indeholde bogstaver og "_" (understregning)',
+      alphanumText : 'Dette felt kan kun indeholde bogstaver, tal og "_" (understregning)'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "Sortér stigende",
+      sortDescText : "Sortér faldende",
+      lockText     : "LÃ¥s kolonne",
+      unlockText   : "Fjern lås fra kolonne",
+      columnsText  : "Kolonner"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "Navn",
+      valueText  : "Værdi",
+      dateFormat : "d/m/Y"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "Træk for at ændre størrelsen.",
+      collapsibleSplitTip : "Træk for at ændre størrelsen. Dobbelt-klik for at skjule."
+   });
+}
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-de.jss.html b/www/extras/yui-ext/docs/output/ext-lang-de.jss.html new file mode 100644 index 000000000..7ff09fb88 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-de.jss.html @@ -0,0 +1,168 @@ +ext-lang-de.js

ext-lang-de.js

/*
+ * German translation
+ * By schmidetzki and humpdi
+ * 04-07-2007
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">übertrage Daten ...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} Zeile(n) ausgewält";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Diesen Tab schließen";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "Der Wert des Feldes ist nicht korrekt";
+}
+
+Date.monthNames = [
+   "Januar",
+   "Februar",
+   "März",
+   "April",
+   "Mai",
+   "Juni",
+   "Juli",
+   "August",
+   "September",
+   "Oktober",
+   "November",
+   "Dezember"
+];
+
+Date.dayNames = [
+   "Sonntag",
+   "Montag",
+   "Dienstag",
+   "Mittwoch",
+   "Donnerstag",
+   "Fritag",
+   "Samstag"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "OK",
+      cancel : "Abbrechen",
+      yes    : "Ja",
+      no     : "Nein"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "d.m.Y");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "Heute",
+      minText           : "Dieses Datum liegt von dem erstmöglichen Datum",
+      maxText           : "Dieses Datum liegt nach dem letztmöglichen Datum",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames	: Date.monthNames,
+      dayNames		: Date.dayNames,
+      nextText          : 'Nächster Monat (Strg/Control + Rechts)',
+      prevText          : 'Vorheriger Monat (Strg/Control + Links)',
+      monthYearText     : 'Monat auswählen (Strg/Control + Hoch/Runter, um ein Jahr auszuwählen)',
+      todayTip          : "Heute ({0}) (Leertaste)",
+      format            : "d.m.Y"
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Seite",
+      afterPageText  : "von {0}",
+      firstText      : "Erste Seite",
+      prevText       : "vorherige Seite",
+      nextText       : "nächste Siete",
+      lastText       : "letzte Seite",
+      refreshText    : "Aktualisieren",
+      displayMsg     : "Anzeige Eintrag {0} - {1} von {2}",
+      emptyMsg       : 'Keine Daten vorhanden'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "Bitte geben Sie mindestens {0} Zeichen ein",
+      maxLengthText : "Bitte geben Sie maximal {0} Zeichen ein",
+      blankText     : "Dieses Feld darf nich leer sein",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "Der Mindestwert für dieses Feld ist {0}",
+      maxText : "Der Maximalwert für dieses Feld ist {0}",
+      nanText : "{0} ist keine Zahl"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "nicht erlaubt",
+      disabledDatesText : "nicht erlaubt",
+      minText           : "Das Datum in diesem Feld muß nach dem {0} liegen",
+      maxText           : "Das Datum in diesem Feld muß vor dem {0} liegen",
+      invalidText       : "{0} ist kein valides Datum - es muß im Format {1} eingegeben werden",
+      format            : "Tag.Monat.Jahr"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "Lade Daten ...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'Dieses Feld sollte eine E-Mail-Adresse enthalten. Format: "user@domain.com"',
+      urlText      : 'Dieses Feld sollte eine URL enthalten. Format "http:/'+'/www.domain.com"',
+      alphaText    : 'Dieses Feld darf zur Buchstaben enthalten und _',
+      alphanumText : 'Dieses Feld darf zur Buchstaben und Zahlen enthalten und _'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "Aufsteigend sortieren",
+      sortDescText : "Absteigend sortieren",
+      lockText     : "Spalte sperren",
+      unlockText   : "Spalte freigeben (entsperren)",
+      columnsText  : "Spalten"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "Name",
+      valueText  : "Wert",
+      dateFormat : "d.m.Y"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "Ziehen, um Größe zu ändern.",
+      collapsibleSplitTip : "Ziehen, um Größe zu ändern. Doppelklick um Panel auszublenden."
+   });
+}
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-en.jss.html b/www/extras/yui-ext/docs/output/ext-lang-en.jss.html new file mode 100644 index 000000000..861bee962 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-en.jss.html @@ -0,0 +1,172 @@ +ext-lang-en.js

ext-lang-en.js

/**
+ * List compiled by mystix on the extjs.com forums.
+ * Thank you Mystix!
+ *
+ * English Translations
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">Loading...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} selected row(s)";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Close this tab";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "The value in this field is invalid";
+}
+
+if(Ext.LoadMask){
+    Ext.LoadMask.prototype.msg = "Loading...";
+}
+
+Date.monthNames = [
+   "January",
+   "February",
+   "March",
+   "April",
+   "May",
+   "June",
+   "July",
+   "August",
+   "September",
+   "October",
+   "November",
+   "December"
+];
+
+Date.dayNames = [
+   "Sunday",
+   "Monday",
+   "Tuesday",
+   "Wednesday",
+   "Thursday",
+   "Friday",
+   "Saturday"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "OK",
+      cancel : "Cancel",
+      yes    : "Yes",
+      no     : "No"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "m/d/Y");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "Today",
+      minText           : "This date is before the minimum date",
+      maxText           : "This date is after the maximum date",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames	: Date.monthNames,
+      dayNames		: Date.dayNames,
+      nextText          : 'Next Month (Control+Right)',
+      prevText          : 'Previous Month (Control+Left)',
+      monthYearText     : 'Choose a month (Control+Up/Down to move years)',
+      todayTip          : "{0} (Spacebar)",
+      format            : "m/d/y"
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Page",
+      afterPageText  : "of {0}",
+      firstText      : "First Page",
+      prevText       : "Previous Page",
+      nextText       : "Next Page",
+      lastText       : "Last Page",
+      refreshText    : "Refresh",
+      displayMsg     : "Displaying {0} - {1} of {2}",
+      emptyMsg       : 'No data to display'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "The minimum length for this field is {0}",
+      maxLengthText : "The maximum length for this field is {0}",
+      blankText     : "This field is required",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "The minimum value for this field is {0}",
+      maxText : "The maximum value for this field is {0}",
+      nanText : "{0} is not a valid number"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "Disabled",
+      disabledDatesText : "Disabled",
+      minText           : "The date in this field must be after {0}",
+      maxText           : "The date in this field must be before {0}",
+      invalidText       : "{0} is not a valid date - it must be in the format {1}",
+      format            : "m/d/y"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "Loading...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'This field should be an e-mail address in the format "user@domain.com"',
+      urlText      : 'This field should be a URL in the format "http:/'+'/www.domain.com"',
+      alphaText    : 'This field should only contain letters and _',
+      alphanumText : 'This field should only contain letters, numbers and _'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "Sort Ascending",
+      sortDescText : "Sort Descending",
+      lockText     : "Lock Column",
+      unlockText   : "Unlock Column",
+      columnsText  : "Columns"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "Name",
+      valueText  : "Value",
+      dateFormat : "m/j/Y"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "Drag to resize.",
+      collapsibleSplitTip : "Drag to resize. Double click to hide."
+   });
+}

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-fr_CA.jss.html b/www/extras/yui-ext/docs/output/ext-lang-fr_CA.jss.html new file mode 100644 index 000000000..97ea5c9a1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-fr_CA.jss.html @@ -0,0 +1,168 @@ +ext-lang-fr_CA.js

ext-lang-fr_CA.js

/*
+ * France (Canadian) translation
+ * By BernardChhun
+ * 04-08-2007, 03:07 AM
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">En cours de chargement...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} ligne(s) sélectionné(s)";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Fermer cette onglet";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "La valeur de ce champ est invalide";
+}
+
+Date.monthNames = [
+   "Janvier",
+   "Février",
+   "Mars",
+   "Avril",
+   "Mai",
+   "Juin",
+   "Juillet",
+   "Août",
+   "Septembre",
+   "Octobre",
+   "Novembre",
+   "Décembre"
+];
+
+Date.dayNames = [
+   "Dimanche",
+   "Lundi",
+   "Mardi",
+   "Mercredi",
+   "Jeudi",
+   "Vendredi",
+   "Samedi"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "OK",
+      cancel : "Annuler",
+      yes    : "Oui",
+      no     : "Non"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "d/m/Y");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "Aujourd'hui",
+      minText           : "Cette date est plus petite que la date minimum",
+      maxText           : "Cette date est plus grande que la date maximum",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames	: Date.monthNames,
+      dayNames		: Date.dayNames,
+      nextText          : 'Prochain mois (CTRL+Fléche droite)',
+      prevText          : 'Mois précédent (CTRL+Fléche gauche)',
+      monthYearText     : 'Choissisez un mois (CTRL+Fléche haut ou bas pour changer d\'année.)',
+      todayTip          : "{0} (Barre d'espace)",
+      format            : "d/m/y"
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Page",
+      afterPageText  : "de {0}",
+      firstText      : "Première page",
+      prevText       : "Page précédente",
+      nextText       : "Prochaine page",
+      lastText       : "Dernière page",
+      refreshText    : "Recharger la page",
+      displayMsg     : "Page courante {0} - {1} de {2}",
+      emptyMsg       : 'Aucune donnée à afficher'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "La longueur minimum de ce champ est de {0} caractères",
+      maxLengthText : "La longueur maximum de ce champ est de {0} caractères",
+      blankText     : "Ce champ est obligatoire",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "La valeur minimum de ce champ doit être de {0}",
+      maxText : "La valeur maximum de ce champ doit être de {0}",
+      nanText : "{0} n'est pas un nombre valide"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "Désactivé",
+      disabledDatesText : "Désactivé",
+      minText           : "La date de ce champ doit être avant le {0}",
+      maxText           : "La date de ce champ doit être après le {0}",
+      invalidText       : "{0} n'est pas une date valide - il doit être au format suivant: {1}",
+      format            : "d/m/y"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "En cours de chargement...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'Ce champ doit contenir un courriel et doit être sous ce format: "usager@domaine.com"',
+      urlText      : 'Ce champ doit contenir une URL sous le format suivant: "http:/'+'/www.domaine.com"',
+      alphaText    : 'Ce champ ne peut contenir que des lettres et le caractère souligné (_)',
+      alphanumText : 'Ce champ ne peut contenir que des caractères alphanumériques ainsi que le caractère souligné (_)'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "Tri ascendant",
+      sortDescText : "Tri descendant",
+      lockText     : "Verrouillé la colonne",
+      unlockText   : "Déverrouillé la colonne",
+      columnsText  : "Colonnes"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "Propriété",
+      valueText  : "Valeur",
+      dateFormat : "d/m/Y"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "Cliquer et glisser pour redimensionner le panneau.",
+      collapsibleSplitTip : "Cliquer et glisser pour redimensionner le panneau. Double-cliquer pour cacher le panneau."
+   });
+}
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-hr.jss.html b/www/extras/yui-ext/docs/output/ext-lang-hr.jss.html new file mode 100644 index 000000000..821902181 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-hr.jss.html @@ -0,0 +1,169 @@ +ext-lang-hr.js

ext-lang-hr.js

/*
+ * Croatian translation
+ * By Ylodi (utf8 encoding)
+ * 10 April 2007
+ */
+ 
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">UÄitavanje...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} odabranih redova";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Zatvori ovaj tab";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "Vrijednost u ovom polju je neispravna";
+}
+
+Date.monthNames = [
+   "SijeÄanj",
+   "VeljaÄa",
+   "Ožujak",
+   "Travanj",
+   "Svibanj",
+   "Lipanj",
+   "Srpanj",
+   "Kolovoz",
+   "Rujan",
+   "Listopad",
+   "Studeni",
+   "Prosinac"
+];
+
+Date.dayNames = [
+   "Nedelja",
+   "Ponedeljak",
+   "Utorak",
+   "Srijeda",
+   "ÄŒetvrtak",
+   "Petak",
+   "Subota"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "U redu",
+      cancel : "Odustani",
+      yes    : "Da",
+      no     : "Ne"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "d/m/Y");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "Danas",
+      minText           : "Taj datum je prije najmanjeg datuma",
+      maxText           : "Taj datum je poslije najvećeg datuma",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames	: Date.monthNames,
+      dayNames		: Date.dayNames,
+      nextText          : 'Slijedeći mjesec (Control+Desno)',
+      prevText          : 'Prethodni mjesec (Control+Lijevo)',
+      monthYearText     : 'Odaberite mjesec (Control+Gore/Dolje za promjenu godine)',
+      todayTip          : "{0} (Razmaknica)",
+      format            : "d/m/y",
+      startDay 		 : 1
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Stranica",
+      afterPageText  : "od {0}",
+      firstText      : "Prva stranica",
+      prevText       : "Prethodna stranica",
+      nextText       : "Slijedeća stranica",
+      lastText       : "Zadnja stranica",
+      refreshText    : "Obnovi",
+      displayMsg     : "Prikazujem {0} - {1} od {2}",
+      emptyMsg       : 'Nema podataka za prikaz'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "Minimalna dužina za ovo polje je {0}",
+      maxLengthText : "Maksimalna dužina za ovo polje je {0}",
+      blankText     : "Ovo polje je obavezno",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "Minimalna vrijednost za ovo polje je {0}",
+      maxText : "Maksimalna vrijednost za ovo polje je {0}",
+      nanText : "{0} is not a valid number"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "Neaktivno",
+      disabledDatesText : "Neaktivno",
+      minText           : "Datum u ovom polje mora biti poslije {0}",
+      maxText           : "Datum u ovom polju mora biti prije {0}",
+      invalidText       : "{0} nije ispravan datum - mora biti u obliku {1}",
+      format            : "d/m/y"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "UÄitavanje...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'Ovo polje treba biti e-mail adresa u obliku "korisnik@domena.com"',
+      urlText      : 'Ovo polje treba biti URL u obliku "http:/'+'/www.domena.com"',
+      alphaText    : 'Ovo polje treba sadržavati samo slova i znak _',
+      alphanumText : 'Ovo polje treba sadržavati samo slova, brojeve i znak _'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "Sortiraj rastućim redoslijedom",
+      sortDescText : "Sortiraj padajućim redoslijedom",
+      lockText     : "ZakljuÄaj stupac",
+      unlockText   : "OtkljuÄaj stupac",
+      columnsText  : "Stupci"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "Naziv",
+      valueText  : "Vrijednost",
+      dateFormat : "j/m/Y"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "Povuci za promjenu veliÄine.",
+      collapsibleSplitTip : "Povuci za promjenu veliÄine. Dvostruki klik za skrivanje."
+   });
+}
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-hu.jss.html b/www/extras/yui-ext/docs/output/ext-lang-hu.jss.html new file mode 100644 index 000000000..587732f61 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-hu.jss.html @@ -0,0 +1,174 @@ +ext-lang-hu.js

ext-lang-hu.js

/**
+ * List compiled by mystix on the extjs.com forums.
+ * Thank you Mystix!
+ */
+// holder
+/**
+ * Hungarian translation
+ * By amon (utf-8 encoded)
+ * 14 April 2007
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">Betöltés...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} kiválasztott sor";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Fül bezárása";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "A mező tartalma érvénytelen";
+}
+
+Date.monthNames = [
+   "Január",
+   "Február",
+   "Március",
+   "Ãprilis",
+   "Május",
+   "Június",
+   "Július",
+   "Augusztus",
+   "Szeptember",
+   "Október",
+   "November",
+   "December"
+];
+
+Date.dayNames = [
+   "Vasárnap",
+   "Hétfő",
+   "Kedd",
+   "Szerda",
+   "Csütörtök",
+   "Péntek",
+   "Szombat"
+];
+   
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "OK",
+      cancel : "Mégsem",
+      yes    : "Igen",
+      no     : "Nem"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "y.m.d");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "Ma",
+      minText           : "Ez a dátum korábbi a megengedettnél",
+      maxText           : "Ez a dátum későbbi a megengedettnél",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames        : Date.monthNames,
+      dayNames          : Date.dayNames,
+      nextText          : 'Következő hónap (Control+Jobbra)',
+      prevText          : 'Előző hónap (Control+Balra)',
+      monthYearText     : 'Hónaőválasztás (Control+Fel/Le: év választás)',
+      todayTip          : "{0} (Szóköz)",
+      format            : "y.m.d",
+      startDay          : 1
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Oldal",
+      afterPageText  : "a {0}-ból/ből",
+      firstText      : "Első oldal",
+      prevText       : "Előző oldal",
+      nextText       : "Következő",
+      lastText       : "Utolsó oldal",
+      refreshText    : "Frissít",
+      displayMsg     : "{0} - {1} a {2}-ból/ből",
+      emptyMsg       : 'Nincs megjeleníthető adat'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "A mező hossza minimum {0}",
+      maxLengthText : "A mező hossza maximum {0}",
+      blankText     : "Kötelező mező",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "A mező minimum értéke {0} lehet",
+      maxText : "A mező maximum értéke {0} lehet",
+      nanText : "{0} nem értelmezhető számként"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "Letiltva",
+      disabledDatesText : "Letiltva",
+      minText           : "A dátum későbbi kell legyen {0}-nál/nél",
+      maxText           : "A dátum korábbi kell legyen {0}-nál/nél",
+      invalidText       : "{0} nem valódi dátum - a mező formátuma: {1}",
+      format            : "y.m.d"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "Betöltés...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'A mező tartalma e-mail cím lehet, formátum: "user@domain.com"',
+      urlText      : 'A mező tartalma webcím lehet, formátum: "http:/'+'/www.domain.com"',
+      alphaText    : 'A mező csak betűket (a-z) és aláhúzás (_) karaktert tartalmazhat.',
+      alphanumText : 'A mező csak betűket (a-z), számokat (0-9) és aláhúzás (_) karaktert tartalmazhat'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "Növekvő rendezés",
+      sortDescText : "Csökkenő rendezés",
+      lockText     : "Oszlop lezárás",
+      unlockText   : "Oszlop felengedés",
+      columnsText  : "Oszlopok"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "Név",
+      valueText  : "Érték",
+      dateFormat : "Y m j"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "Húzás: átméretezés",
+      collapsibleSplitTip : "Húzás: átméretezés, duplaklikk: eltüntetés."
+   });
+}
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-it.jss.html b/www/extras/yui-ext/docs/output/ext-lang-it.jss.html new file mode 100644 index 000000000..d6fca0b96 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-it.jss.html @@ -0,0 +1,169 @@ +ext-lang-it.js

ext-lang-it.js

/*
+ * Italian translation
+ * By eric_void
+ * 04-10-2007, 11:25 AM
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">Caricamento in corso...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} righe selezionate";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Chiudi pannello";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "Valore del campo non valido";
+}
+
+Date.monthNames = [
+   "Gennaio",
+   "Febbraio",
+   "Marzo",
+   "Aprile",
+   "Maggio",
+   "Giugno",
+   "Luglio",
+   "Agosto",
+   "Settembre",
+   "Ottobre",
+   "Novembre",
+   "Dicembre"
+];
+
+Date.dayNames = [
+   "Domenica",
+   "Lunedi",
+   "Martedi",
+   "Mercoledi",
+   "Giovedi",
+   "Venerdi",
+   "Sabato"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "OK",
+      cancel : "Annulla",
+      yes    : "Si",
+      no     : "No"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "d/m/Y");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "Oggi",
+      minText           : "Data precedente alla data minima",
+      maxText           : "Data successiva alla data massima",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames	: Date.monthNames,
+      dayNames		: Date.dayNames,
+      nextText          : 'Mese successivo (Ctrl+Destra)',
+      prevText          : 'Mese precedente (Ctrl+Sinistra)',
+      monthYearText     : 'Scegli un mese (Ctrl+Su/Giu per cambiare anno)',
+      todayTip          : "{0} (Barra spaziatrice)",
+      format            : "d/m/y"
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Pagina",
+      afterPageText  : "di {0}",
+      firstText      : "Prima pagina",
+      prevText       : "Pagina precedente",
+      nextText       : "Pagina successiva",
+      lastText       : "Ultima pagina",
+      refreshText    : "Aggiorna",
+      displayMsg     : "Vista {0} - {1} di {2}",
+      emptyMsg       : 'Nessun dato da mostrare'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "La lunghezza minima del campo risulta {0}",
+      maxLengthText : "La lunghezza massima del campo risulta {0}",
+      blankText     : "Campo obbligatorio",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "Il valore minimo del campo risulta {0}",
+      maxText : "Il valore massimo del campo risulta {0}",
+      nanText : "{0} non &grave; un numero corretto"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "Disabilitato",
+      disabledDatesText : "Disabilitato",
+      minText           : "La data del campo deve essere successiva a {0}",
+      maxText           : "La data del campo deve essere precedente a {0}",
+      invalidText       : "{0} non &grave; una data valida. Deve essere nel formato {1}",
+      format            : "d/m/y"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "Caricamento in corso...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'Il campo deve essere un indirizzo e-mail nel formato "user@domain.com"',
+      urlText      : 'Il campo deve essere un indirizzo web nel formato "http:/'+'/www.domain.com"',
+      alphaText    : 'Il campo deve contenere solo lettere e _',
+      alphanumText : 'Il campo deve contenere solo lettere, numeri e _'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "Ordinamento crescente",
+      sortDescText : "Ordinamento decrescente",
+      lockText     : "Blocca colonna",
+      unlockText   : "Sblocca colonna",
+      columnsText  : "Colonne"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "Nome",
+      valueText  : "Valore",
+      dateFormat : "j/m/Y"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "Trascina per cambiare dimensioni.",
+      collapsibleSplitTip : "Trascina per cambiare dimensioni. Doppio click per nascondere."
+   });
+}
+
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-ja.jss.html b/www/extras/yui-ext/docs/output/ext-lang-ja.jss.html new file mode 100644 index 000000000..629262657 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-ja.jss.html @@ -0,0 +1,154 @@ +ext-lang-ja.js

ext-lang-ja.js

/*
+ * Japanese translation
+ * By tyama
+ * 04-08-2007, 05:49 AM
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">読ã¿è¾¼ã¿ä¸­...</div>';
+
+if(Ext.View){
+  Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+  Ext.grid.Grid.prototype.ddText = "{0} è¡Œé¸æŠž";
+}
+
+if(Ext.TabPanelItem){
+  Ext.TabPanelItem.prototype.closeText = "ã“ã®ã‚¿ãƒ–ã‚’é–‰ã˜ã‚‹";
+}
+
+if(Ext.form.Field){
+  Ext.form.Field.prototype.invalidText = "フィールドã®å€¤ãŒä¸æ­£ã§ã™ã€‚";
+}
+
+Date.monthNames = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月','11月','12月'];
+
+Date.dayNames = [
+ "æ—¥",
+ "月",
+ "ç«",
+ "æ°´",
+ "木",
+ "金",
+ "土"];
+
+if(Ext.MessageBox){
+  Ext.MessageBox.buttonText = {
+    ok : "OK",
+    cancel : "キャンセル",
+    yes : "ã¯ã„",
+    no : "ã„ã„ãˆ"
+  };
+}
+
+if(Ext.util.Format){
+  Ext.util.Format.date = function(v, format){
+     if(!v) return "";
+     if(!(v instanceof Date)) v = new Date(Date.parse(v));
+     return v.dateFormat(format || "Y/m/d");
+  };
+}
+
+if(Ext.DatePicker){
+  Ext.apply(Ext.DatePicker.prototype, {
+     todayText         : "今日",
+     minText           : "é¸æŠžã—ãŸæ—¥ä»˜ã¯æœ€å°å€¤ä»¥ä¸‹ã§ã™ã€‚",
+     maxText           : "é¸æŠžã—ãŸæ—¥ä»˜ã¯æœ€å¤§å€¤ä»¥ä¸Šã§ã™ã€‚",
+     disabledDaysText  : "",
+     disabledDatesText : "",
+     monthNames	       : Date.monthNames,
+     dayNames	       : Date.dayNames,
+     nextText          : '次月㸠(コントロール+å³)',
+     prevText          : '剿œˆã¸ (コントロール+å·¦)',
+     monthYearText     : 'æœˆé¸æŠž (コントロール+上/下ã§å¹´ç§»å‹•)',
+     todayTip          : "{0} (スペースキー)",
+     format            : "Y/m/d"
+  });
+}
+
+if(Ext.PagingToolbar){
+  Ext.apply(Ext.PagingToolbar.prototype, {
+     beforePageText : "ページ",
+     afterPageText  : "/ {0}",
+     firstText      : "最åˆã®ãƒšãƒ¼ã‚¸",
+     prevText       : "å‰ã®ãƒšãƒ¼ã‚¸",
+     nextText       : "次ã®ãƒšãƒ¼ã‚¸",
+     lastText       : "最後ã®ãƒšãƒ¼ã‚¸",
+     refreshText    : "æ›´æ–°",
+     displayMsg     : "{2} 件中 {0} - {1} を表示",
+     emptyMsg       : '表示ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãŒã‚りã¾ã›ã‚“。'
+  });
+}
+
+if(Ext.form.TextField){
+  Ext.apply(Ext.form.TextField.prototype, {
+     minLengthText : "ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã®æœ€å°å€¤ã¯ {0} ã§ã™ã€‚",
+     maxLengthText : "ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã®æœ€å¤§å€¤ã¯ {0} ã§ã™ã€‚",
+     blankText     : "必須項目ã§ã™ã€‚",
+     regexText     : "",
+     emptyText     : null
+  });
+}
+
+if(Ext.form.NumberField){
+  Ext.apply(Ext.form.NumberField.prototype, {
+     minText : "ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã®æœ€å°å€¤ã¯ {0} ã§ã™ã€‚",
+     maxText : "ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã®æœ€å¤§å€¤ã¯ {0} ã§ã™ã€‚",
+     nanText : "{0} ã¯æ•°å€¤ã§ã¯ã‚りã¾ã›ã‚“。"
+  });
+}
+
+if(Ext.form.DateField){
+  Ext.apply(Ext.form.DateField.prototype, {
+     disabledDaysText  : "無効",
+     disabledDatesText : "無効",
+     minText           : "ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã®æ—¥ä»˜ã¯ã€ {0} 以é™ã®æ—¥ä»˜ã«è¨­å®šã—ã¦ãã ã•ã„。",
+     maxText           : "ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã®æ—¥ä»˜ã¯ã€ {0} 以å‰ã®æ—¥ä»˜ã«è¨­å®šã—ã¦ãã ã•ã„。",
+     invalidText       : "{0} ã¯é–“é•ã£ãŸæ—¥ä»˜å…¥åŠ›ã§ã™ã€‚ - 入力形å¼ã¯ã€Œ{1}ã€ã§ã™ã€‚",
+     format            : "Y/m/d"
+  });
+}
+
+if(Ext.form.ComboBox){
+  Ext.apply(Ext.form.ComboBox.prototype, {
+     loadingText       : "読ã¿è¾¼ã¿ä¸­...",
+     valueNotFoundText : undefined
+  });
+}
+
+if(Ext.form.VTypes){
+  Ext.apply(Ext.form.VTypes, {
+     emailText    : 'メールアドレスを"user@domain.com"ã®å½¢å¼ã§å…¥åŠ›ã—ã¦ãã ã•ã„。',
+     urlText      : 'URLã‚’"http:/'+'/www.domain.com"ã®å½¢å¼ã§å…¥åŠ›ã—ã¦ãã ã•ã„。',
+     alphaText    : 'åŠè§’英字ã¨"_"ã®ã¿ã§ã™ã€‚',
+     alphanumText : 'åŠè§’英数ã¨"_"ã®ã¿ã§ã™ã€‚'
+  });
+}
+
+if(Ext.grid.GridView){
+  Ext.apply(Ext.grid.GridView.prototype, {
+     sortAscText  : "昇順",
+     sortDescText : "é™é †",
+     lockText     : "カラムロック",
+     unlockText   : "カラムロック解除",
+     columnsText  : "Columns"
+  });
+}
+
+if(Ext.grid.PropertyColumnModel){
+  Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+     nameText   : "åç§°",
+     valueText  : "値",
+     dateFormat : "Y/m/d"
+  });
+}
+
+if(Ext.SplitLayoutRegion){
+  Ext.apply(Ext.SplitLayoutRegion.prototype, {
+     splitTip            : "ドラッグã™ã‚‹ã¨ãƒªã‚µã‚¤ã‚ºã§ãã¾ã™ã€‚",
+     collapsibleSplitTip : "ドラッグã§ãƒªã‚µã‚¤ã‚ºã€‚ ダブルクリックã§éš ã™ã€‚"
+  });
+}
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-lv.jss.html b/www/extras/yui-ext/docs/output/ext-lang-lv.jss.html new file mode 100644 index 000000000..f47044a51 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-lv.jss.html @@ -0,0 +1,171 @@ +ext-lang-lv.js

ext-lang-lv.js

/**
+ * Latvian Translations
+ * By salix 17 April 2007
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">Notiek ielÄde...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} iezīmētu rindu";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Aizver šo zīmni";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "VÄ“rtÄ«ba Å¡ajÄ laukÄ nav pareiza";
+}
+
+if(Ext.LoadMask){
+    Ext.LoadMask.prototype.msg = "IelÄdÄ“...";
+}
+
+Date.monthNames = [
+   "JanvÄris",
+   "FebruÄris",
+   "Marts",
+   "Aprīlis",
+   "Maijs",
+   "Jūnijs",
+   "Jūlijs",
+   "Augusts",
+   "Septembris",
+   "Oktobris",
+   "Novembris",
+   "Decembris"
+];
+
+Date.dayNames = [
+   "Svētdiena",
+   "Pirmdiena",
+   "Otrdiena",
+   "Trešdiena",
+   "Ceturtdiena",
+   "Piektdiena",
+   "Sestdiena"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "Labi",
+      cancel : "Atcelt",
+      yes    : "JÄ",
+      no     : "NÄ“"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "d.m.Y");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "Å odiena",
+      minText           : "NorÄdÄ«tais datums ir mazÄks par minimÄlo datumu",
+      maxText           : "NorÄdÄ«tais datums ir lielÄks par maksimÄlo datumu",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames	: Date.monthNames,
+      dayNames		: Date.dayNames,
+      nextText          : 'NÄkamais mÄ“nesis (Control+pa labi)',
+      prevText          : 'Iepriekšējais mēnesis (Control+pa kreisi)',
+      monthYearText     : 'MÄ“neÅ¡a izvÄ“le (Control+uz augÅ¡u/uz leju lai pÄrslÄ“gtu gadus)',
+      todayTip          : "{0} (Tukšumzīme)",
+      format            : "d.m.Y",
+      startDay          : 1
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Lapa",
+      afterPageText  : "no {0}",
+      firstText      : "PirmÄ lapa",
+      prevText       : "iepriekšējÄ lapa",
+      nextText       : "NÄkamÄ lapa",
+      lastText       : "PÄ“dÄ“jÄ lapa",
+      refreshText    : "AtsvaidzinÄt",
+      displayMsg     : "RÄda no {0} lÄ«dz {1} ierakstiem, kopÄ {2}",
+      emptyMsg       : 'Nav datu, ko parÄdÄ«t'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "MinimÄlais garums Å¡im laukam ir {0}",
+      maxLengthText : "MaksimÄlais garums Å¡im laukam ir {0}",
+      blankText     : "Å is ir obligÄts lauks",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "MinimÄlais garums Å¡im laukam ir  {0}",
+      maxText : "MaksimÄlais garums Å¡im laukam ir  {0}",
+      nanText : "{0} nav pareizs skaitlis"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "Atspējots",
+      disabledDatesText : "Atspējots",
+      minText           : "Datumam Å¡ajÄ laukÄ jÄbÅ«t lielÄkam kÄ {0}",
+      maxText           : "Datumam Å¡ajÄ laukÄ jÄbÅ«t mazÄkam kÄ {0}",
+      invalidText       : "{0} nav pareizs datums - tam jÄbÅ«t Å¡ÄdÄ formÄtÄ: {1}",
+      format            : "d.m.Y"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "IelÄdÄ“...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'Å ajÄ laukÄ jÄieraksta e-pasta adrese formÄtÄ "lietotÄs@domÄ“ns.lv"',
+      urlText      : 'Å ajÄ laukÄ jÄieraksta URL formÄtÄ "http:/'+'/www.domÄ“ns.lv"',
+      alphaText    : 'Šis lauks drīkst saturēt tikai burtus un _ zīmi',
+      alphanumText : 'Šis lauks drīkst saturēt tikai burtus, ciparus un _ zīmi'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "KÄrtot pieaugoÅ¡Ä secÄ«bÄ",
+      sortDescText : "KÄrtot dilstoÅ¡Ä secÄ«bÄ",
+      lockText     : "Noslēgt kolonnu",
+      unlockText   : "Atslēgt kolonnu",
+      columnsText  : "Kolonnas"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "Nosaukums",
+      valueText  : "Vērtība",
+      dateFormat : "j.m.Y"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "Velc, lai mainītu izmēru.",
+      collapsibleSplitTip : "Velc, lai mainītu izmēru. Dubultklikšķis noslēpj apgabalu."
+   });
+}

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-mk.jss.html b/www/extras/yui-ext/docs/output/ext-lang-mk.jss.html new file mode 100644 index 000000000..475226cf8 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-mk.jss.html @@ -0,0 +1,171 @@ +ext-lang-mk.js

ext-lang-mk.js

/*
+ * Macedonia translation
+ * By PetarD petar.dimitrijevic@vorteksed.com.mk (utf8 encoding)
+ * 23 April 2007
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">Вчитувам...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} избрани редици";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Затвори tab";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "ВредноÑта во ова поле е невалидна";
+}
+
+if(Ext.LoadMask){
+    Ext.LoadMask.prototype.msg = "Вчитувам...";
+}
+
+Date.monthNames = [
+   "Јануари",
+   "Февруари",
+   "Март",
+   "Ðприл",
+   "Мај",
+   "Јуни",
+   "Јули",
+   "ÐвгуÑÑ‚",
+   "Септември",
+   "Октомври",
+   "Ðоември",
+   "Декември"
+];
+
+Date.dayNames = [
+   "Ðедела",
+   "Понеделник",
+   "Вторник",
+   "Среда",
+   "Четврток",
+   "Петок",
+   "Сабота"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "Потврди",
+      cancel : "Поништи",
+      yes    : "Да",
+      no     : "Ðе"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "d.m.y");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "ДенеÑка",
+      minText           : "Овој датум е пред најмалиот датум",
+      maxText           : "Овој датум е пред најголемиот датум",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames	: Date.monthNames,
+      dayNames		: Date.dayNames,
+      nextText          : 'Следен меÑец (Control+Стрелка деÑно)',
+      prevText          : 'Претходен меÑец (Control+Стрелка лево)',
+      monthYearText     : 'Изберете меÑец (Control+Стрелка горе/Стрелка деÑно за менување година)',
+      todayTip          : "{0} (Spacebar)",
+      format            : "d.m.y"
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Страница",
+      afterPageText  : "од {0}",
+      firstText      : "Прва Страница",
+      prevText       : "Претходна Страница",
+      nextText       : "Следна Страница",
+      lastText       : "ПоÑледна Страница",
+      refreshText    : "ОÑвежи",
+      displayMsg     : "Прикажувам {0} - {1} од {2}",
+      emptyMsg       : 'Ðема податоци за приказ'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "Минималната должина за ова поле е {0}",
+      maxLengthText : "МакÑималната должина за ова поле е {0}",
+      blankText     : "Податоците во ова поле Ñе потребни",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "Минималната вредноÑÑ‚ за ова поле е {0}",
+      maxText : "МакÑималната вредноÑÑ‚ за ова поле е {0}",
+      nanText : "{0} не е валиден број"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "Ðеактивно",
+      disabledDatesText : "Ðеактивно",
+      minText           : "Датумот во ова поле мора да биде пред {0}",
+      maxText           : "Датумот во ова поле мора да биде по {0}",
+      invalidText       : "{0} не е валиден датум - мора да биде во формат {1}",
+      format            : "d.m.y"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "Вчитувам...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'Ова поле треба да биде e-mail адреÑа во формат "user@domain.com"',
+      urlText      : 'Ова поле треба да биде URL во формат "http:/'+'/www.domain.com"',
+      alphaText    : 'Ова поле треба да Ñодржи Ñамо букви и _',
+      alphanumText : 'Ова поле треба да Ñодржи Ñамо букви, бројки и _'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "Сортирај РаÑтечки",
+      sortDescText : "Сортирај Опаѓачки",
+      lockText     : "Заклучи Колона",
+      unlockText   : "Отклучи колона",
+      columnsText  : "Колони"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "Име",
+      valueText  : "ВредноÑÑ‚",
+      dateFormat : "m.d.Y"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "Повлечете за менување на големината.",
+      collapsibleSplitTip : "Повлечете за менување на големината. Дупли клик за криење."
+   });
+}

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-nl.jss.html b/www/extras/yui-ext/docs/output/ext-lang-nl.jss.html new file mode 100644 index 000000000..a2aa7348e --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-nl.jss.html @@ -0,0 +1,179 @@ +ext-lang-nl.js

ext-lang-nl.js

/*
+ * List compiled by mystix on the extjs.com forums.
+ * Thank you Mystix!
+ *
+ * Dutch Translations
+ * by Bas van Oostveen (04 April 2007)
+ */
+// holder
+/** Ext Core translations */
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">Bezig met laden...</div>';
+
+/* Ext single string translations */
+if(Ext.View){
+    Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+    Ext.grid.Grid.prototype.ddText = "{0} geselecteerde rij(en)";
+}
+
+if(Ext.TabPanelItem){
+    Ext.TabPanelItem.prototype.closeText = "Sluit dit tabblad";
+}
+
+if(Ext.form.Field){
+    Ext.form.Field.prototype.invalidText = "De waarde in dit veld is onjuist";
+}
+
+if(Ext.LoadMask){
+    Ext.LoadMask.prototype.msg = "Bezig met laden...";
+}
+
+/* Javascript month and days translations */
+Date.monthNames = [
+   "Januari",
+   "Februari",
+   "Maart",
+   "April",
+   "Mei",
+   "Juni",
+   "Juli",
+   "Augustus",
+   "September",
+   "Oktober",
+   "November",
+   "December"
+];
+
+Date.dayNames = [
+   "Zondag",
+   "Maandag",
+   "Dinsdag",
+   "Woensdag",
+   "Donderdag",
+   "Vrijdag",
+   "Zaterdag"
+];
+
+/* Ext components translations */
+if(Ext.MessageBox){
+    Ext.MessageBox.buttonText = {
+       ok     : "OK",
+       cancel : "Annuleren",
+       yes    : "Ja",
+       no     : "Nee"
+    };
+}
+
+if(Ext.util.Format){
+    Ext.util.Format.date = function(v, format){
+       if(!v) return "";
+       if(!(v instanceof Date)) v = new Date(Date.parse(v));
+       return v.dateFormat(format || "y/m/d");
+    };
+}
+
+if(Ext.DatePicker){
+    Ext.apply(Ext.DatePicker.prototype, {
+       todayText         : "Vandaag",
+       minText           : "Deze datum is eerder dan de minimum datum",
+       maxText           : "Deze datum is later dan de maximum datum",
+       disabledDaysText  : "",
+       disabledDatesText : "",
+       monthNames	 : Date.monthNames,
+       dayNames		 : Date.dayNames,
+       nextText          : 'Volgende Maand (Control+Rechts)',
+       prevText          : 'Vorige Maand (Control+Links)',
+       monthYearText     : 'Kies een maand (Control+Omhoog/Beneden volgend/vorige jaar)',
+       todayTip          : "{0} (Spatie)",
+       format            : "d/m/y",
+       startDay          : 1
+    });
+}
+
+if(Ext.PagingToolbar){
+    Ext.apply(Ext.PagingToolbar.prototype, {
+       beforePageText : "Pagina",
+       afterPageText  : "van {0}",
+       firstText      : "Eerste Pagina",
+       prevText       : "Vorige Pagina",
+       nextText       : "Volgende Pagina",
+       lastText       : "Laatste Pagina",
+       refreshText    : "Ververs",
+       displayMsg     : "Getoond {0} - {1} of {2}",
+       emptyMsg       : 'Geen gegeven om weer te geven'
+    });
+}
+
+if(Ext.form.TextField){
+    Ext.apply(Ext.form.TextField.prototype, {
+       minLengthText : "De minimale lengte voor dit veld is {0}",
+       maxLengthText : "De maximale lengte voor dit veld is {0}",
+       blankText     : "Dit veld is verplicht",
+       regexText     : "",
+       emptyText     : null
+    });
+}
+
+if(Ext.form.NumberField){
+    Ext.apply(Ext.form.NumberField.prototype, {
+       minText : "De minimale lengte voor dit veld is {0}",
+       maxText : "De maximale lengte voor dit veld is {0}",
+       nanText : "{0} is geen geldig getal"
+    });
+}
+
+if(Ext.form.DateField){
+    Ext.apply(Ext.form.DateField.prototype, {
+       disabledDaysText  : "Uitgeschakeld",
+       disabledDatesText : "Uitgeschakeld",
+       minText           : "De datum in dit veld moet na {0} liggen",
+       maxText           : "De datum in dit veld moet voor {0} liggen",
+       invalidText       : "{0} is geen geldige datum - formaat voor datum is {1}",
+       format            : "d/m/y"
+    });
+}
+
+if(Ext.form.ComboBox){
+    Ext.apply(Ext.form.ComboBox.prototype, {
+       loadingText       : "Bezig met laden...",
+       valueNotFoundText : undefined
+    });
+}
+
+if(Ext.form.VTypes){
+    Ext.apply(Ext.form.VTypes, {
+       emailText    : 'Dit veld moet een e-mail adres in het formaat "gebruiker@domein.nl"',
+       urlText      : 'Dit veld moet een URL zijn in het formaat "http:/'+'/www.domein.nl"',
+       alphaText    : 'Dit veld mag alleen letters en _ bevatten',
+       alphanumText : 'Dit veld mag alleen letters, cijfers en _ bevatten'
+    });
+}
+
+if(Ext.grid.GridView){
+    Ext.apply(Ext.grid.GridView.prototype, {
+       sortAscText  : "Sorteer Oplopend",
+       sortDescText : "Sorteer Aflopend",
+       lockText     : "Kolom Vastzetten",
+       unlockText   : "Kolom Vrijgeven",
+       columnsText  : "Kolommen"
+    });
+}
+
+if(Ext.grid.PropertyColumnModel){
+    Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+       nameText   : "Naam",
+       valueText  : "Waarde",
+       dateFormat : "Y/m/j"
+    });
+}
+
+if(Ext.SplitLayoutRegion){
+    Ext.apply(Ext.SplitLayoutRegion.prototype, {
+       splitTip            : "Sleep om grote aan te passen.",
+       collapsibleSplitTip : "Sleep om grote aan te passen. Dubbel klikken om te verbergen."
+    });
+}
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-no.jss.html b/www/extras/yui-ext/docs/output/ext-lang-no.jss.html new file mode 100644 index 000000000..103af84fd --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-no.jss.html @@ -0,0 +1,166 @@ +ext-lang-no.js

ext-lang-no.js

/*
+ * Norwegian translation
+ * By grEvenX 16-April-2007
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">Laster...</div>';
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} markerte rader";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Lukk denne fanen";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "Verdien i dette felter er ugyldig";
+}
+
+if(Ext.LoadMask){
+    Ext.LoadMask.prototype.msg = "Laster...";
+}
+
+Date.monthNames = [
+   "Januar",
+   "Februar",
+   "Mars",
+   "April",
+   "Mai",
+   "Juni",
+   "Juli",
+   "August",
+   "September",
+   "Oktober",
+   "November",
+   "Desember"
+];
+
+Date.dayNames = [
+   "Søndag",
+   "Mandag",
+   "Tirsdag",
+   "Onsdag",
+   "Torsdag",
+   "Fredag",
+   "Lørdag"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "OK",
+      cancel : "Avbryt",
+      yes    : "Ja",
+      no     : "Nei"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "d/m/Y");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "I dag",
+      minText           : "Denne datoen er tidligere enn den tidligste tillatte",
+      maxText           : "Denne datoen er senere enn den seneste tillatte",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames	: Date.monthNames,
+      dayNames		: Date.dayNames,
+      nextText          : 'Neste måned (Control+Pil Høyre)',
+      prevText          : 'Forrige måned (Control+Pil Venstre)',
+      monthYearText     : 'Velg en måned (Control+Pil Opp/Ned for å skifte år)',
+      todayTip          : "{0} (mellomrom)",
+      format            : "d/m/y"
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Side",
+      afterPageText  : "av {0}",
+      firstText      : "Første side",
+      prevText       : "Forrige side",
+      nextText       : "Neste side",
+      lastText       : "Siste side",
+      refreshText    : "Oppdater",
+      displayMsg     : "Viser {0} - {1} of {2}",
+      emptyMsg       : 'Ingen data å vise'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "Den minste lengden for dette feltet er {0}",
+      maxLengthText : "Den største lengden for dette feltet er {0}",
+      blankText     : "Dette feltet er påkrevd",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "Den minste verdien for dette feltet er {0}",
+      maxText : "Den største verdien for dette feltet er {0}",
+      nanText : "{0} er ikke et gyldig nummer"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "Deaktivert",
+      disabledDatesText : "Deaktivert",
+      minText           : "Datoen i dette feltet må være etter {0}",
+      maxText           : "Datoen i dette feltet må være før {0}",
+      invalidText       : "{0} is not a valid date - it must be in the format {1}",
+      format            : "m/d/y"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "Laster...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'Dette feltet skal være en epost adresse i formatet "user@domain.com"',
+      urlText      : 'Dette feltet skal være en link (URL) i formatet "http:/'+'/www.domain.com"',
+      alphaText    : 'Dette feltet skal kun inneholde bokstaver og _',
+      alphanumText : 'Dette feltet skal kun inneholde bokstaver, tall og _'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "Sorter stigende",
+      sortDescText : "Sorter synkende",
+      lockText     : "LÃ¥s kolonne",
+      unlockText   : "LÃ¥s opp kolonne",
+      columnsText  : "Kolonner"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "Navn",
+      valueText  : "Verdi",
+      dateFormat : "d/m/Y"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "Dra for å endre størrelse.",
+      collapsibleSplitTip : "Dra for å endre størrelse, dobbelklikk for å skjule."
+   });
+}

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-pl.jss.html b/www/extras/yui-ext/docs/output/ext-lang-pl.jss.html new file mode 100644 index 000000000..37552faaf --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-pl.jss.html @@ -0,0 +1,173 @@ +ext-lang-pl.js

ext-lang-pl.js

/**
+ * Polish Translations
+ * By vbert 17-April-2007
+ * Encoding: utf-8
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">Wczytywanie danych...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} wybrano wiersze(y)";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Zamknij zakładkę";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "Wartość tego pola jest niewłaściwa";
+}
+
+if(Ext.LoadMask){
+    Ext.LoadMask.prototype.msg = "Wczytywanie danych...";
+}
+
+Date.monthNames = [
+    "Styczeń",
+    "Luty",
+    "Marzec",
+    "Kwiecień",
+    "Maj",
+    "Czerwiec",
+    "Lipiec",
+    "Sierpień",
+    "Wrzesień",
+    "Październik",
+    "Listopad",
+    "Grudzień"
+];
+
+Date.dayNames = [
+    "Niedziela",
+    "Poniedziałek",
+    "Wtorek",
+    "Åšroda",
+    "Czwartek",
+    "PiÄ…tek",
+    "Sobota"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "OK",
+      cancel : "Anuluj",
+      yes    : "Tak",
+      no     : "Nie"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "Y-m-d");
+   };
+}
+
+if(Ext.DatePicker){
+	Ext.apply(Ext.DatePicker.prototype, {
+		startDay			: 1,
+		todayText			: "Dzisiaj",
+		minText				: "Data jest wcześniejsza od daty minimalnej",
+		maxText				: "Data jest późniejsza od daty maksymalnej",
+		disabledDaysText	: "",
+		disabledDatesText	: "",
+		monthNames			: Date.monthNames,
+		dayNames			: Date.dayNames,
+		nextText			: "Następny miesiąc (Control+StrzałkaWPrawo)",
+		prevText			: "Poprzedni miesiąc (Control+StrzałkaWLewo)",
+		monthYearText		: "Wybierz miesiąc (Control+Up/Down aby zmienić rok)",
+		todayTip			: "{0} (Spacja)",
+		format				: "Y-m-d"
+	});
+}
+
+if(Ext.PagingToolbar){
+	Ext.apply(Ext.PagingToolbar.prototype, {
+		beforePageText	: "Strona",
+		afterPageText	: "z {0}",
+		firstText		: "Pierwsza strona",
+	    prevText		: "Poprzednia strona",
+		nextText		: "Następna strona",
+	    lastText		: "Ostatnia strona",
+		refreshText		: "Odśwież",
+	    displayMsg		: "Wyświetlono {0} - {1} z {2}",
+		emptyMsg		: "Brak danych do wyświetlenia"
+	});
+}
+
+if(Ext.form.TextField){
+	Ext.apply(Ext.form.TextField.prototype, {
+	    minLengthText	: "Minimalna ilość znaków dla tego pola to {0}",
+		maxLengthText	: "Maksymalna ilość znaków dla tego pola to {0}",
+	    blankText		: "To pole jest wymagane",
+		regexText		: "",
+	    emptyText		: null
+	});
+}
+
+if(Ext.form.NumberField){
+	Ext.apply(Ext.form.NumberField.prototype, {
+	    minText	: "Minimalna wartość dla tego pola to {0}",
+	    maxText	: "Maksymalna wartość dla tego pola to {0}",
+		nanText	: "{0} to nie jest właściwa wartość"
+	});
+}
+
+if(Ext.form.DateField){
+	Ext.apply(Ext.form.DateField.prototype, {
+	    disabledDaysText	: "Wyłączony",
+	    disabledDatesText	: "Wyłączony",
+		minText				: "Data w tym polu musi być późniejsza od {0}",
+	    maxText				: "Data w tym polu musi być wcześniejsza od {0}",
+		invalidText			: "{0} to nie jest prawidłowa data - prawidłowy format daty {1}",
+	    format				: "Y-m-d"
+	});
+}
+
+if(Ext.form.ComboBox){
+	Ext.apply(Ext.form.ComboBox.prototype, {
+		loadingText       : "WczytujÄ™...",
+		valueNotFoundText : undefined
+	});
+}
+
+if(Ext.form.VTypes){
+	Ext.apply(Ext.form.VTypes, {
+	    emailText		: 'To pole wymaga podania adresu e-mail w formacie: "nazwa@domena.pl"',
+	    urlText			: 'To pole wymaga podania adresu strony www w formacie: "http:/'+'/www.domena.pl"',
+		alphaText		: 'To pole wymaga podania tylko liter i _',
+		alphanumText	: 'To pole wymaga podania tylko liter, cyfr i _'
+	});
+}
+
+if(Ext.grid.GridView){
+	Ext.apply(Ext.grid.GridView.prototype, {
+	    sortAscText		: "Sortuj rosnÄ…co",
+	    sortDescText	: "Sortuj malejÄ…co",
+		lockText		: "Zablokuj kolumnÄ™",
+	    unlockText		: "Odblokuj kolumnÄ™",
+		columnsText		: "Kolumny"
+	});
+}
+
+if(Ext.grid.PropertyColumnModel){
+	Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+	    nameText	: "Nazwa",
+	    valueText	: "Wartość",
+		dateFormat	: "Y-m-d"
+	});
+}
+
+if(Ext.SplitLayoutRegion){
+	Ext.apply(Ext.SplitLayoutRegion.prototype, {
+	    splitTip			: "Przeciągnij aby zmienić rozmiar.",
+		collapsibleSplitTip	: "Przeciągnij aby zmienić rozmiar. Kliknij dwukrotnie aby ukryć."
+	});
+}
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-pt_br.jss.html b/www/extras/yui-ext/docs/output/ext-lang-pt_br.jss.html new file mode 100644 index 000000000..46b387553 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-pt_br.jss.html @@ -0,0 +1,167 @@ +ext-lang-pt_br.js

ext-lang-pt_br.js

/*
+ * Portuguese/Brazil Translation by Weber Souza
+ * 08 April 2007
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">Carregando...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} linha(s) selecionada(s)";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Fechar Região";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "O valor para este campo é inválido";
+}
+
+Date.monthNames = [
+   "Janeiro",
+   "Fevereiro",
+   "Março",
+   "Abril",
+   "Maio",
+   "Junho",
+   "Julho",
+   "Agosto",
+   "Setembro",
+   "Outubro",
+   "Novembro",
+   "Dezembro"
+];
+
+Date.dayNames = [
+   "Domingo",
+   "Segunda",
+   "Terça",
+   "Quarta",
+   "Quinta",
+   "Sexta",
+   "Sábado"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "OK",
+      cancel : "Cancelar",
+      yes    : "Sim",
+      no     : "Não"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "m/d/Y");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "Hoje",
+      minText           : "Esta data é anterior a menor data",
+      maxText           : "Esta data é posterior a maior data",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames        : Date.monthNames,
+      dayNames          : Date.dayNames,
+      nextText          : 'Próximo Mês (Control+Direito)',
+      prevText          : 'Previous Month (Control+Esquerdo)',
+      monthYearText     : 'Choose a month (Control+Cima/Baixo para mover entre os anos)',
+      todayTip          : "{0} (Espaço)",
+      format            : "m/d/y"
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Página",
+      afterPageText  : "de {0}",
+      firstText      : "Primeira Página",
+      prevText       : "Página Anterior",
+      nextText       : "Próxima Página",
+      lastText       : "Última Página",
+      refreshText    : "Atualizar Listagem",
+      displayMsg     : "<b>{0} a {1} de {2} registro(s)</b>",
+      emptyMsg       : 'Sem registros para exibir'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "O tamanho mínimo permitido para este campo é {0}",
+      maxLengthText : "O tamanho máximo para este campo é {0}",
+      blankText     : "Este campo é obrigatório, favor preencher.",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "O valor mínimo para este campo é {0}",
+      maxText : "O valor máximo para este campo é {0}",
+      nanText : "{0} não é um número válido"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "Desabilitado",
+      disabledDatesText : "Desabilitado",
+      minText           : "A data deste campo deve ser posterior a {0}",
+      maxText           : "A data deste campo deve ser anterior a {0}",
+      invalidText       : "{0} não é uma data válida - deve ser informado no formato {1}",
+      format            : "m/d/y"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "Carregando...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'Este campo deve ser um endereço de e-mail válido no formado "usuario@dominio.com"',
+      urlText      : 'Este campo deve ser uma URL no formato "http:/'+'/www.dominio.com"',
+      alphaText    : 'Este campo deve conter apenas letras e _',
+      alphanumText : 'Este campo devve conter apenas letras, números e _'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "Ordenar Ascendente",
+      sortDescText : "Ordenar Descendente",
+      lockText     : "Bloquear Coluna",
+      unlockText   : "Desbloquear Coluna",
+      columnsText  : "Colunas"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "Nome",
+      valueText  : "Valor",
+      dateFormat : "m/j/Y"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "Arraste para redimencionar.",
+      collapsibleSplitTip : "Arraste para redimencionar. Duplo clique para esconder."
+   });
+}
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-ro.jss.html b/www/extras/yui-ext/docs/output/ext-lang-ro.jss.html new file mode 100644 index 000000000..d536df4c0 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-ro.jss.html @@ -0,0 +1,170 @@ +ext-lang-ro.js

ext-lang-ro.js

/**
+ * Translation by Lucian Lature 04-24-2007
+ * Romanian Translations
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">Încărcare...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} rând(uri) selectate";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "ÃŽnchide acest tab";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "Valoarea acestui câmp este invalidă";
+}
+
+if(Ext.LoadMask){
+    Ext.LoadMask.prototype.msg = "Încărcare...";
+}
+
+Date.monthNames = [
+   "Ianuarie",
+   "Februarie",
+   "Martie",
+   "Aprilie",
+   "Mai",
+   "Iunie",
+   "Iulie",
+   "August",
+   "Septembrie",
+   "Octombrie",
+   "Noiembrie",
+   "Decembrie"
+];
+
+Date.dayNames = [
+   "Duminică",
+   "Luni",
+   "Marţi",
+   "Miercuri",
+   "Joi",
+   "Vineri",
+   "Sâmbătă"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "OK",
+      cancel : "Renunţă",
+      yes    : "Da",
+      no     : "Nu"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "d-m-Y");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "Astăzi",
+      minText           : "Această zi este înaintea datei de început",
+      maxText           : "Această zi este după ultimul termen",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames	: Date.monthNames,
+      dayNames		: Date.dayNames,
+      nextText          : 'Următoarea lună (Control+Right)',
+      prevText          : 'Luna anterioară (Control+Left)',
+      monthYearText     : 'Alege o lună (Control+Up/Down pentru a parcurge anii)',
+      todayTip          : "{0} (Spacebar)",
+      format            : "d-m-y"
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Pagina",
+      afterPageText  : "din {0}",
+      firstText      : "Prima pagină",
+      prevText       : "Pagina precedentă",
+      nextText       : "Următoarea pagină",
+      lastText       : "Ultima pagină",
+      refreshText    : "Reîmprospătare",
+      displayMsg     : "Afişează {0} - {1} din {2}",
+      emptyMsg       : 'Nu sunt date de afiÅŸat'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "Lungimea minimă pentru acest câmp este de {0}",
+      maxLengthText : "Lungimea maximă pentru acest câmp este {0}",
+      blankText     : "Acest câmp este obligatoriu",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "Valoarea minimă permisă a acestui câmp este {0}",
+      maxText : "Valaorea maximă permisă a acestui câmp este {0}",
+      nanText : "{0} nu este un număr valid"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "Inactiv",
+      disabledDatesText : "Inactiv",
+      minText           : "Data acestui câmp trebuie să fie după {0}",
+      maxText           : "Data acestui câmp trebuie sa fie înainte de {0}",
+      invalidText       : "{0} nu este o dată validă - trebuie să fie în formatul {1}",
+      format            : "d-m-y"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "Încărcare...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'Acest câmp trebuie să conţină o adresă de e-mail în formatul "user@domain.com"',
+      urlText      : 'Acest câmp trebuie să conţină o adresă URL în formatul "http:/'+'/www.domain.com"',
+      alphaText    : 'Acest câmp trebuie să conţină doar litere şi _',
+      alphanumText : 'Acest câmp trebuie să conţină doar litere, cifre şi _'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "Sortare ascendentă",
+      sortDescText : "Sortare descendentă",
+      lockText     : "Blochează coloana",
+      unlockText   : "Deblochează coloana",
+      columnsText  : "Coloane"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "Nume",
+      valueText  : "Valoare",
+      dateFormat : "m/j/Y"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "Trage pentru redimensionare.",
+      collapsibleSplitTip : "Trage pentru redimensionare. Dublu-click pentru ascundere."
+   });
+}

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-ru.jss.html b/www/extras/yui-ext/docs/output/ext-lang-ru.jss.html new file mode 100644 index 000000000..6010cca9a --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-ru.jss.html @@ -0,0 +1,169 @@ +ext-lang-ru.js

ext-lang-ru.js

/*
+ * Russian translation
+ * By Arikon (utf-8 encoding)
+ * 08 April 2007
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">Идет загрузка...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} выбранных Ñтрок";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Закрыть Ñту вкладку";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "Значение в Ñтом поле неверное";
+}
+
+Date.monthNames = [
+   "Январь",
+   "Февраль",
+   "Март",
+   "Ðпрель",
+   "Май",
+   "Июнь",
+   "Июль",
+   "ÐвгуÑÑ‚",
+   "СентÑбрь",
+   "ОктÑбрь",
+   "ÐоÑбрь",
+   "Декабрь"
+];
+
+Date.dayNames = [
+   "ВоÑкреÑенье",
+   "Понедельник",
+   "Вторник",
+   "Среда",
+   "Четверг",
+   "ПÑтница",
+   "Суббота"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "OK",
+      cancel : "Отмена",
+      yes    : "Да",
+      no     : "Ðет"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "d.m.Y");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "СегоднÑ",
+      minText           : "Эта дата раньше минимальной даты",
+      maxText           : "Эта дата позже макÑимальной даты",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames        : Date.monthNames,
+      dayNames	        : Date.dayNames,
+      nextText          : 'Следующий меÑÑц (Control+Вправо)',
+      prevText          : 'Предыдущий меÑÑц (Control+Влево)',
+      monthYearText     : 'Выбор меÑÑца (Control+Вверх/Вниз Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° года)',
+      todayTip          : "{0} (Пробел)",
+      format            : "d.m.y",
+      startDay          : 1
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Страница",
+      afterPageText  : "из {0}",
+      firstText      : "ÐŸÐµÑ€Ð²Ð°Ñ Ñтраница",
+      prevText       : "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ñтраница",
+      nextText       : "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтраница",
+      lastText       : "ПоÑледнÑÑ Ñтраница",
+      refreshText    : "Обновить",
+      displayMsg     : "ОтображаютÑÑ Ð·Ð°Ð¿Ð¸Ñи Ñ {0} по {1}, вÑего {2}",
+      emptyMsg       : 'Ðет данных Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Ñтого Ð¿Ð¾Ð»Ñ {0}",
+      maxLengthText : "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Ñтого Ð¿Ð¾Ð»Ñ {0}",
+      blankText     : "Это поле обÑзательно Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "Значение Ñтого Ð¿Ð¾Ð»Ñ Ð½Ðµ может быть меньше {0}",
+      maxText : "Значение Ñтого Ð¿Ð¾Ð»Ñ Ð½Ðµ может быть больше {0}",
+      nanText : "{0} не ÑвлÑетÑÑ Ñ‡Ð¸Ñлом"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "Ðе доÑтупно",
+      disabledDatesText : "Ðе доÑтупно",
+      minText           : "Дата в Ñтом поле должна быть позде {0}",
+      maxText           : "Дата в Ñтом поле должна быть раньше {0}",
+      invalidText       : "{0} не ÑвлÑетÑÑ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾Ð¹ датой - дата должна быть указана в формате {1}",
+      format            : "d.m.y"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "Загрузка...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'Это поле должно Ñодержать Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в формате "user@domain.com"',
+      urlText      : 'Это поле должно Ñодержать URL в формате "http:/'+'/www.domain.com"',
+      alphaText    : 'Это поле должно Ñодержать только латинÑкие буквы и Ñимвол Ð¿Ð¾Ð´Ñ‡ÐµÑ€ÐºÐ¸Ð²Ð°Ð½Ð¸Ñ "_"',
+      alphanumText : 'Это поле должно Ñодержать только латинÑкие буквы, цифры и Ñимвол Ð¿Ð¾Ð´Ñ‡ÐµÑ€ÐºÐ¸Ð²Ð°Ð½Ð¸Ñ "_"'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "Сортировать по возраÑтанию",
+      sortDescText : "Сортировать по убыванию",
+      lockText     : "Закрепить Ñтолбец",
+      unlockText   : "СнÑть закрепление Ñтолбца",
+      columnsText  : "Столбцы"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "Ðазвание",
+      valueText  : "Значение",
+      dateFormat : "j.m.Y"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "ТÑните Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð°.",
+      collapsibleSplitTip : "ТÑните Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð°. Двойной щелчок ÑпрÑчет панель."
+   });
+}
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-sk.jss.html b/www/extras/yui-ext/docs/output/ext-lang-sk.jss.html new file mode 100644 index 000000000..1a47c247d --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-sk.jss.html @@ -0,0 +1,174 @@ +ext-lang-sk.js

ext-lang-sk.js

/**
+ * List compiled by mystix on the extjs.com forums.
+ * Thank you Mystix!
+ */
+// holder
+/**  Translation to Slovak by Michal Thomka
+  *  14 April 2007
+  */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">Nahrávam...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} oznaèených riadkov";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Zavrie túto záložku";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "Hodnota v tomto poli je nesprávna";
+}
+
+Date.monthNames = [
+   "Január",
+   "Február",
+   "Marec",
+   "Apríl",
+   "Máj",
+   "Jún",
+   "Júl",
+   "August",
+   "September",
+   "Október",
+   "November",
+   "December"
+];
+
+Date.dayNames = [
+   "Nede¾a",
+   "Pondelok",
+   "Utorok",
+   "Streda",
+   "Štvrtok",
+   "Piatok",
+   "Sobota"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "OK",
+      cancel : "Zruši",
+      yes    : "Áno",
+      no     : "Nie"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "m/d/R");
+   };
+}
+
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "Dnes",
+      minText           : "Tento dátum je menší ako minimálny možný dátum",
+      maxText           : "Tento dátum je väèší ako maximálny možný dátum",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames        : Date.monthNames,
+      dayNames          : Date.dayNames,
+      nextText          : 'Ïalší Mesiac (Control+Doprava)',
+      prevText          : 'Predch. Mesiac (Control+Do¾ava)',
+      monthYearText     : 'Vyberte Mesiac (Control+Hore/Dole pre posun rokov)',
+      todayTip          : "{0} (Medzerník)",
+      format            : "m/d/r"
+   });
+}
+
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Strana",
+      afterPageText  : "z {0}",
+      firstText      : "Prvá Strana",
+      prevText       : "Predch. Strana",
+      nextText       : "Ïalšia Strana",
+      lastText       : "Posledná strana",
+      refreshText    : "Obnovi",
+      displayMsg     : "Zobrazujem {0} - {1} z {2}",
+      emptyMsg       : 'Žiadne dáta'
+   });
+}
+
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "Minimálna dåžka pre toto pole je {0}",
+      maxLengthText : "Maximálna dåžka pre toto pole je {0}",
+      blankText     : "Toto pole je povinné",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "Minimálna hodnota pre toto pole je {0}",
+      maxText : "Maximálna hodnota pre toto pole je {0}",
+      nanText : "{0} je nesprávne èíslo"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "Zablokované",
+      disabledDatesText : "Zablokované",
+      minText           : "Dátum v tomto poli musí by až po {0}",
+      maxText           : "Dátum v tomto poli musí by pred {0}",
+      invalidText       : "{0} nie je správny dátum - musí by vo formáte {1}",
+      format            : "m/d/r"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "Nahrávam...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'Toto pole musí by e-mailová adresa vo formáte "user@domain.com"',
+      urlText      : 'Toto pole musí by URL vo formáte "http:/'+'/www.domain.com"',
+      alphaText    : 'Toto po¾e može obsahova iba písmená a znak _',
+      alphanumText : 'Toto po¾e može obsahova iba písmená,èísla a znak _'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "Zoradi vzostupne",
+      sortDescText : "Zoradi zostupne",
+      lockText     : "Zamknú ståpec",
+      unlockText   : "Odomknú st¾pec",
+      columnsText  : "Ståpce"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "Názov",
+      valueText  : "Hodnota",
+      dateFormat : "m/j/Y"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "Potiahnite pre zmenu rozmeru",
+      collapsibleSplitTip : "Potiahnite pre zmenu rozmeru. Dvojklikom schováte."
+   });
+}
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-sp.jss.html b/www/extras/yui-ext/docs/output/ext-lang-sp.jss.html new file mode 100644 index 000000000..8278bc639 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-sp.jss.html @@ -0,0 +1,167 @@ +ext-lang-sp.js

ext-lang-sp.js

/*
+ * Español/Latinoamerica Translation by genius551v 04-08-2007
+ * Revised by efege, 2007-04-15.
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">Cargando...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} fila(s) seleccionada(s)";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Cerrar esta pestaña";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "El valor en este campo es inválido";
+}
+
+Date.monthNames = [
+   "Enero",
+   "Febrero",
+   "Marzo",
+   "Abril",
+   "Mayo",
+   "Junio",
+   "Julio",
+   "Agosto",
+   "Septiembre",
+   "Octubre",
+   "Noviembre",
+   "Diciembre"
+];
+
+Date.dayNames = [
+   "Domingo",
+   "Lunes",
+   "Martes",
+   "Miércoles",
+   "Jueves",
+   "Viernes",
+   "Sábado"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "Aceptar",
+      cancel : "Cancelar",
+      yes    : "Sí",
+      no     : "No"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "d/m/Y");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "Hoy",
+      minText           : "Esta fecha es anterior a la fecha mínima",
+      maxText           : "Esta fecha es posterior a la fecha máxima",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames	: Date.monthNames,
+      dayNames		: Date.dayNames,
+      nextText          : 'Mes Siguiente (Control+Right)',
+      prevText          : 'Mes Anterior (Control+Left)',
+      monthYearText     : 'Seleccione un mes (Control+Up/Down para desplazar el año)',
+      todayTip          : "{0} (Barra espaciadora)",
+      format            : "d/m/Y"
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Página",
+      afterPageText  : "de {0}",
+      firstText      : "Primera página",
+      prevText       : "Página anterior",
+      nextText       : "Página siguiente",
+      lastText       : "Última página",
+      refreshText    : "Actualizar",
+      displayMsg     : "Mostrando {0} - {1} de {2}",
+      emptyMsg       : 'Sin datos para mostrar'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "El tamaño mínimo para este campo es de {0}",
+      maxLengthText : "El tamaño máximo para este campo es de {0}",
+      blankText     : "Este campo es obligatorio",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "El valor mínimo para este campo es de {0}",
+      maxText : "El valor máximo para este campo es de {0}",
+      nanText : "{0} no es un número válido"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "Deshabilitado",
+      disabledDatesText : "Deshabilitado",
+      minText           : "La fecha para este campo debe ser posterior a {0}",
+      maxText           : "La fecha para este campo debe ser anterior a {0}",
+      invalidText       : "{0} no es una fecha válida - debe tener el formato {1}",
+      format            : "d/m/Y"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "Cargando...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'Este campo debe ser una dirección de correo electrónico con el formato "usuario@dominio.com"',
+      urlText      : 'Este campo debe ser una URL con el formato "http:/'+'/www.dominio.com"',
+      alphaText    : 'Este campo solo debe contener letras y _',
+      alphanumText : 'Este campo solo debe contener letras, números y _'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "Ordenar en forma ascendente",
+      sortDescText : "Ordenar en forma descendente",
+      lockText     : "Bloquear Columna",
+      unlockText   : "Desbloquear Columna",
+      columnsText  : "Columnas"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "Nombre",
+      valueText  : "Valor",
+      dateFormat : "j/m/Y"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "Arrastre para redimensionar.",
+      collapsibleSplitTip : "Arrastre para redimensionar. Doble clic para ocultar."
+   });
+}
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-sv_se.jss.html b/www/extras/yui-ext/docs/output/ext-lang-sv_se.jss.html new file mode 100644 index 000000000..af84d9f33 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-sv_se.jss.html @@ -0,0 +1,172 @@ +ext-lang-sv_se.js

ext-lang-sv_se.js

/**
+ * Swedish translation (utf8-encoding)
+ * By Erik Andersson, Monator Technologies
+ * 24 April 2007
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">Laddar...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} markerade rad(er)";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Stäng denna tabb";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "Värdet i detta fält är icke tillåtet";
+}
+
+if(Ext.LoadMask){
+    Ext.LoadMask.prototype.msg = "Laddar...";
+}
+
+Date.monthNames = [
+   "Januari",
+   "Februari",
+   "Mars",
+   "April",
+   "Maj",
+   "Juni",
+   "Juli",
+   "Augusti",
+   "September",
+   "Oktober",
+   "November",
+   "December"
+];
+
+Date.dayNames = [
+   "Söndag",
+   "MÃ¥ndag",
+   "Tisdag",
+   "Onsdag",
+   "Torsdag",
+   "Fredag",
+   "Lördag"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "OK",
+      cancel : "Avbryt",
+      yes    : "Ja",
+      no     : "Nej"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "Y/m/d");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "Idag",
+      minText           : "Detta datum är före det tidigast tillåtna",
+      maxText           : "Detta datum är efter det senast tillåtna",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames	: Date.monthNames,
+      dayNames		: Date.dayNames,
+      nextText          : 'Nästa Månad (Ctrl + höger piltangent)',
+      prevText          : 'Föregående Månad (Ctrl + vänster piltangent)',
+      monthYearText     : 'Välj en månad (Ctrl + Uppåt/Neråt pil för att ändra årtal)',
+      todayTip          : "{0} (Mellanslag)",
+      format            : "y/m/d",
+      startDay          : 1
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Sida",
+      afterPageText  : "av {0}",
+      firstText      : "Första sidan",
+      prevText       : "Föregående sida",
+      nextText       : "Nästa sida",
+      lastText       : "Sista sidan",
+      refreshText    : "Uppdatera",
+      displayMsg     : "Visar {0} - {1} av {2}",
+      emptyMsg       : 'Det finns ingen data att visa'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "Minsta tillåtna längden för detta fält är {0}",
+      maxLengthText : "Största tillåtna längden för detta fält är {0}",
+      blankText     : "Detta fält är obligatoriskt",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "Minsta tillåtna värdet för detta fält är {0}",
+      maxText : "Största tillåtna värdet för detta fält är {0}",
+      nanText : "{0} är inte ett tillåtet nummer"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "Inaktiverad",
+      disabledDatesText : "Inaktiverad",
+      minText           : "Datumet i detta fält måste vara efter {0}",
+      maxText           : "Datumet i detta fält måste vara före {0}",
+      invalidText       : "{0} är inte ett tillåtet datum - datum skall anges på formatet {1}",
+      format            : "y/m/d"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "Laddar...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'Detta fält skall vara en e-post adress på formatet "user@domain.com"',
+      urlText      : 'Detta fält skall vara en länk (URL) på formatet "http:/'+'/www.domain.com"',
+      alphaText    : 'Detta fält får bara innehålla bokstäver och "_"',
+      alphanumText : 'Detta fält får bara innehålla bokstäver, nummer och "_"'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "Sortera stigande",
+      sortDescText : "Sortera fallande",
+      lockText     : "LÃ¥s kolumn",
+      unlockText   : "LÃ¥s upp kolumn",
+      columnsText  : "Kolumner"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "Namn",
+      valueText  : "Värde",
+      dateFormat : "Y/m/d"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "Drag för att ändra storleken.",
+      collapsibleSplitTip : "Drag för att ändra storleken. Dubbelklicka för att gömma."
+   });
+}

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-tr.jss.html b/www/extras/yui-ext/docs/output/ext-lang-tr.jss.html new file mode 100644 index 000000000..2d157c53b --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-tr.jss.html @@ -0,0 +1,172 @@ +ext-lang-tr.js

ext-lang-tr.js

/**
+ * List compiled by mystix on the extjs.com forums.
+ * Thank you Mystix!
+ */
+// holder
+/***
+ * Turkish translation by Hüseyin Tüfekçilerli
+ * 04-11-2007, 09:52 AM 
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">Yükleniyor...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} seçili satır";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Bu sekmeyi kapat";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "Bu alandaki değer geçersiz";
+}
+
+Date.monthNames = [
+   "Ocak",
+   "Åžubat",
+   "Mart",
+   "Nisan",
+   "Mayıs",
+   "Haziran",
+   "Temmuz",
+   "AÄŸustos",
+   "Eylül",
+   "Ekim",
+   "Kasım",
+   "Aralık"
+];
+
+Date.dayNames = [
+   "Pazar",
+   "Pazartesi",
+   "Salı",
+   "Çarşamba",
+   "PerÅŸembe",
+   "Cuma",
+   "Cumartesi"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "Tamam",
+      cancel : "İptal",
+      yes    : "Evet",
+      no     : "Hayır"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "d/m/Y");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "Bugün",
+      minText           : "Bu tarih minimum tarihten önce",
+      maxText           : "Bu tarih maximum tarihten sonra",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames	: Date.monthNames,
+      dayNames		: Date.dayNames,
+      nextText          : 'Sonraki Ay (Ctrl+SaÄŸ)',
+      prevText          : 'Önceki Ay (Ctrl+Sol)',
+      monthYearText     : 'Bir ay seçin (Yılları değiştirmek için Ctrl+Yukarı/Aşağı)',
+      todayTip          : "{0} (BoÅŸluk)",
+      format            : "d/m/y",
+      startDay          : 1
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Sayfa",
+      afterPageText  : " / {0}",
+      firstText      : "İlk Sayfa",
+      prevText       : "Önceki Sayfa",
+      nextText       : "Sonraki Sayfa",
+      lastText       : "Son Sayfa",
+      refreshText    : "Yenile",
+      displayMsg     : "{2} satırdan {0} - {1} arası gösteriliyor",
+      emptyMsg       : 'Gösterilecek veri yok'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "Bu alan için minimum uzunluk {0}",
+      maxLengthText : "Bu alan için maximum uzunluk {0}",
+      blankText     : "Bu alan gerekli",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "Bu alan için minimum değer {0}",
+      maxText : "Bu alan için maximum değer {0}",
+      nanText : "{0} geçerli bir sayı değil"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "Pasif",
+      disabledDatesText : "Pasif",
+      minText           : "Bu alana {0} tarihinden sonraki bir tarih girilmeli",
+      maxText           : "Bu alana {0} tarihinden önceki bir tarih girilmeli",
+      invalidText       : "{0} geçerli bir tarih değil - şu formatta olmalı {1}",
+      format            : "d/m/y"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "Yükleniyor...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'Bu alan bir e-mail adresi formatında olmalı "kullanici@alanadi.com"',
+      urlText      : 'Bu alan bir URL formatında olmalı "http:/'+'/www.alanadi.com"',
+      alphaText    : 'Bu alan sadece harf ve _ içermeli',
+      alphanumText : 'Bu alan sadece harf, sayı ve _ içermeli'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "Artarak Sırala",
+      sortDescText : "Azalarak Sırala",
+      lockText     : "Sütünu Kilitle",
+      unlockText   : "Sütunun Kilidini Kaldır",
+      columnsText  : "Sütunlar"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "İsim",
+      valueText  : "DeÄŸer",
+      dateFormat : "j/m/Y"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "Boyutlandırmak için sürükleyin.",
+      collapsibleSplitTip : "Boyutlandırmak için sürükleyin. Gizlemek için çift tıklayın."
+   });
+}

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-vn.jss.html b/www/extras/yui-ext/docs/output/ext-lang-vn.jss.html new file mode 100644 index 000000000..be7948d8c --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-vn.jss.html @@ -0,0 +1,173 @@ +ext-lang-vn.js

ext-lang-vn.js

/**
+ * List compiled by mystix on the extjs.com forums.
+ * Thank you Mystix!
+ */
+// holder
+/***
+ * Vietnamese translation
+ * By bpmtri
+ * 12-April-2007 04:06PM
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">Äang tải...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} dòng được chá»n";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "Äóng thẻ này";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "Giá trị của ô này không hợp lệ.";
+}
+
+Date.monthNames = [
+   "Tháng 1",
+   "Tháng 2",
+   "Tháng 3",
+   "Tháng 4",
+   "Tháng 5",
+   "Tháng 6",
+   "Tháng 7",
+   "Tháng 8",
+   "Tháng 9",
+   "Tháng 10",
+   "Tháng 11",
+   "Tháng 12"
+];
+
+Date.dayNames = [
+   "Chủ nhật",
+   "Thứ hai",
+   "Thứ ba",
+   "Thứ tư",
+   "Thứ năm",
+   "Thứ sáu",
+   "Thứ bảy"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "Äồng ý",
+      cancel : "Há»§y bá»",
+      yes    : "Có",
+      no     : "Không"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "d/m/Y");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "Hôm nay",
+      minText           : "Ngày này nhỠhơn ngày nhỠnhất",
+      maxText           : "Ngày này lớn hơn ngày lớn nhất",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames	: Date.monthNames,
+      dayNames		: Date.dayNames,
+      nextText          : 'Tháng sau (Control+Right)',
+      prevText          : 'Tháng trước (Control+Left)',
+      monthYearText     : 'Chá»n má»™t tháng (Control+Up/Down để thay đổi năm)',
+      todayTip          : "{0} (Spacebar - Phím trắng)",
+      format            : "d/m/y"
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "Trang",
+      afterPageText  : "of {0}",
+      firstText      : "Trang đầu",
+      prevText       : "Trang trước",
+      nextText       : "Trang sau",
+      lastText       : "Trang cuối",
+      refreshText    : "Tải lại",
+      displayMsg     : "Hiển thị {0} - {1} của {2}",
+      emptyMsg       : 'Không có dữ liệu để hiển thị'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "Chiá»u dài tối thiểu cá»§a ô này là {0}",
+      maxLengthText : "Chiá»u dài tối Ä‘a cá»§a ô này là {0}",
+      blankText     : "Ô này cần phải nhập giá trị",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "Giá trị nhỠnhất của ô này là {0}",
+      maxText : "Giá trị lớn nhất của ô này là  {0}",
+      nanText : "{0} hông phải là một số hợp lệ"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "Vô hiệu",
+      disabledDatesText : "Vô hiệu",
+      minText           : "Ngày nhập trong ô này phải sau ngày {0}",
+      maxText           : "Ngày nhập trong ô này phải trước ngày {0}",
+      invalidText       : "{0} không phải là một ngày hợp lệ - phải có dạng {1}",
+      format            : "d/m/y"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "Äang tải...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : 'Giá trị của ô này phải là một địa chỉ email có dạng như "ten@abc.com"',
+      urlText      : 'Giá trị của ô này phải là một địa chỉ web(URL) hợp lệ, có dạng như "http:/'+'/www.domain.com"',
+      alphaText    : 'Ô này chỉ được nhập các kí tự và gạch dưới(_)',
+      alphanumText : 'Ô này chỉ được nhập các kí tự, số và gạch dưới(_)'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "Tăng dần",
+      sortDescText : "Giảm dần",
+      lockText     : "Khóa cột",
+      unlockText   : "BỠkhóa cột",
+      columnsText  : "Các cột"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "Tên",
+      valueText  : "Giá trị",
+      dateFormat : "j/m/Y"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "Kéo giữ chuột để thay đổi kích thước.",
+      collapsibleSplitTip : "Kéo giữ chuột để thay đổi kích thước. Nhấp đúp để ẩn đi."
+   });
+}
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-zh_CN.jss.html b/www/extras/yui-ext/docs/output/ext-lang-zh_CN.jss.html new file mode 100644 index 000000000..efec25ce0 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-zh_CN.jss.html @@ -0,0 +1,168 @@ +ext-lang-zh_CN.js

ext-lang-zh_CN.js

/*
+ * Simplified Chinese translation
+ * By DavidHu
+ * 09 April 2007
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">加载中...</div>';
+
+if(Ext.View){
+   Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+   Ext.grid.Grid.prototype.ddText = "{0} 选择行";
+}
+
+if(Ext.TabPanelItem){
+   Ext.TabPanelItem.prototype.closeText = "关闭";
+}
+
+if(Ext.form.Field){
+   Ext.form.Field.prototype.invalidText = "è¾“å…¥å€¼éžæ³•";
+}
+
+Date.monthNames = [
+   "一月",
+   "二月",
+   "三月",
+   "四月",
+   "五月",
+   "六月",
+   "七月",
+   "八月",
+   "乿œˆ",
+   "åæœˆ",
+   "å一月",
+   "å二月"
+];
+
+Date.dayNames = [
+   "周日",
+   "周一",
+   "周二",
+   "周三",
+   "周四",
+   "周五",
+   "周六"
+];
+
+if(Ext.MessageBox){
+   Ext.MessageBox.buttonText = {
+      ok     : "确定",
+      cancel : "å–æ¶ˆ",
+      yes    : "是",
+      no     : "å¦"
+   };
+}
+
+if(Ext.util.Format){
+   Ext.util.Format.date = function(v, format){
+      if(!v) return "";
+      if(!(v instanceof Date)) v = new Date(Date.parse(v));
+      return v.dateFormat(format || "y年m月d日");
+   };
+}
+
+if(Ext.DatePicker){
+   Ext.apply(Ext.DatePicker.prototype, {
+      todayText         : "今天",
+      minText           : "æ—¥æœŸåœ¨æœ€å°æ—¥æœŸä¹‹å‰",
+      maxText           : "日期在最大日期之åŽ",
+      disabledDaysText  : "",
+      disabledDatesText : "",
+      monthNames	: Date.monthNames,
+      dayNames		: Date.dayNames,      
+      nextText          : '下月 (Control+Right)',
+      prevText          : '上月 (Control+Left)',
+      monthYearText     : '选择一个月 (Control+Up/Down æ¥æ”¹å˜å¹´)',
+      todayTip          : "{0} (Spacebar)",
+      format            : "y年m月d日"
+   });
+}
+
+if(Ext.PagingToolbar){
+   Ext.apply(Ext.PagingToolbar.prototype, {
+      beforePageText : "页",
+      afterPageText  : "of {0}",
+      firstText      : "第一页",
+      prevText       : "å‰ä¸€é¡µ",
+      nextText       : "下一页",
+      lastText       : "最åŽé¡µ",
+      refreshText    : "刷新",
+      displayMsg     : "显示 {0} - {1} of {2}",
+      emptyMsg       : '没有数æ®éœ€è¦æ˜¾ç¤º'
+   });
+}
+
+if(Ext.form.TextField){
+   Ext.apply(Ext.form.TextField.prototype, {
+      minLengthText : "该输入项的最å°é•¿åº¦æ˜¯ {0}",
+      maxLengthText : "该输入项的最大长度是 {0}",
+      blankText     : "该输入项为必输项",
+      regexText     : "",
+      emptyText     : null
+   });
+}
+
+if(Ext.form.NumberField){
+   Ext.apply(Ext.form.NumberField.prototype, {
+      minText : "该输入项的最å°å€¼æ˜¯ {0}",
+      maxText : "该输入项的最大值是 {0}",
+      nanText : "{0} 䏿˜¯æœ‰æ•ˆæ•°å€¼"
+   });
+}
+
+if(Ext.form.DateField){
+   Ext.apply(Ext.form.DateField.prototype, {
+      disabledDaysText  : "ç¦ç”¨",
+      disabledDatesText : "ç¦ç”¨",
+      minText           : "该输入项的日期必须在 {0} 之åŽ",
+      maxText           : "该输入项的日期必须在 {0} 之å‰",
+      invalidText       : "{0} 是无效的日期 - å¿…é¡»ç¬¦åˆæ ¼å¼ï¼š {1}",
+      format            : "y年m月d日"
+   });
+}
+
+if(Ext.form.ComboBox){
+   Ext.apply(Ext.form.ComboBox.prototype, {
+      loadingText       : "加载...",
+      valueNotFoundText : undefined
+   });
+}
+
+if(Ext.form.VTypes){
+   Ext.apply(Ext.form.VTypes, {
+      emailText    : '该输入项必须是电å­é‚®ä»¶åœ°å€ï¼Œæ ¼å¼å¦‚: "user@domain.com"',
+      urlText      : '该输入项必须是URL地å€ï¼Œæ ¼å¼å¦‚: "http:/'+'/www.domain.com"',
+      alphaText    : '该输入项åªèƒ½åŒ…å«å­—符和_',
+      alphanumText : '该输入项åªèƒ½åŒ…å«å­—符,æ•°å­—å’Œ_'
+   });
+}
+
+if(Ext.grid.GridView){
+   Ext.apply(Ext.grid.GridView.prototype, {
+      sortAscText  : "æ­£åº",
+      sortDescText : "逆åº",
+      lockText     : "é”列",
+      unlockText   : "è§£é”列",
+      columnsText  : "列"
+   });
+}
+
+if(Ext.grid.PropertyColumnModel){
+   Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+      nameText   : "åç§°",
+      valueText  : "值",
+      dateFormat : "y年m月d日"
+   });
+}
+
+if(Ext.SplitLayoutRegion){
+   Ext.apply(Ext.SplitLayoutRegion.prototype, {
+      splitTip            : "æ‹–åŠ¨æ¥æ”¹å˜å°ºå¯¸.",
+      collapsibleSplitTip : "æ‹–åŠ¨æ¥æ”¹å˜å°ºå¯¸. åŒå‡»éšè—."
+   });
+}
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ext-lang-zh_TW.jss.html b/www/extras/yui-ext/docs/output/ext-lang-zh_TW.jss.html new file mode 100644 index 000000000..fbcfdeb00 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ext-lang-zh_TW.jss.html @@ -0,0 +1,168 @@ +ext-lang-zh_TW.js

ext-lang-zh_TW.js

/*
+ * Traditional Chinese translation
+ * By hata1234
+ * 09 April 2007
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '<div class="loading-indicator">讀å–中...</div>';
+
+if(Ext.View){
+    Ext.View.prototype.emptyText = "";
+}
+
+if(Ext.grid.Grid){
+    Ext.grid.Grid.prototype.ddText = "鏿“‡äº† {0} 行";
+}
+
+if(Ext.TabPanelItem){
+    Ext.TabPanelItem.prototype.closeText = "關閉此標籤";
+}
+
+if(Ext.form.Field){
+    Ext.form.Field.prototype.invalidText = "數值ä¸ç¬¦åˆæ¬„ä½è¦å®š";
+}
+
+Date.monthNames = [
+    "一月",
+    "二月",
+    "三月",
+    "四月",
+    "五月",
+    "六月",
+    "七月",
+    "八月",
+    "乿œˆ",
+    "åæœˆ",
+    "å一月",
+    "å二月"
+];
+
+Date.dayNames = [
+    "æ—¥",
+    "一",
+    "二",
+    "三",
+    "å››",
+    "五",
+    "å…­"
+];
+
+if(Ext.MessageBox){
+    Ext.MessageBox.buttonText = {
+        ok : "確定",
+        cancel : "å–æ¶ˆ",
+        yes : "是",
+        no : "å¦"
+    };
+}
+
+if(Ext.util.Format){
+    Ext.util.Format.date = function(v, format){
+       if(!v) return "";
+       if(!(v instanceof Date)) v = new Date(Date.parse(v));
+       return v.dateFormat(format || "Y/m/d");
+    };
+}
+
+if(Ext.DatePicker){
+    Ext.apply(Ext.DatePicker.prototype, {
+       todayText         : "今天",
+       minText           : "日期必須大於最å°å®¹è¨±æ—¥æœŸ",
+       maxText           : "æ—¥æœŸå¿…é ˆå°æ–¼æœ€å¤§å®¹è¨±æ—¥æœŸ",
+       disabledDaysText  : "",
+       disabledDatesText : "",
+       monthNames	 : Date.monthNames,
+       dayNames		 : Date.dayNames,       
+       nextText          : "下個月 (Ctrl+峿–¹å‘éµ)",
+       prevText          : "上個月 (Ctrl+左方å‘éµ)",
+       monthYearText     : "鏿“‡æœˆä»½ (Ctrl+上/下方å‘éµé¸æ“‡å¹´ä»½)",
+       todayTip          : "{0} (空白éµ)",
+       format            : "y/m/d"
+    });
+}
+
+if(Ext.PagingToolbar){
+    Ext.apply(Ext.PagingToolbar.prototype, {
+       beforePageText : "第",
+       afterPageText  : "é ï¼Œå…±{0}é ",
+       firstText      : "第一é ",
+       prevText       : "上一é ",
+       nextText       : "下一é ",
+       lastText       : "最後é ",
+       refreshText    : "釿–°æ•´ç†",
+       displayMsg     : "顯示{0} - {1}é ,å…±{2}é ",
+       emptyMsg       : '沒有任何資料'
+    });
+}
+
+if(Ext.form.TextField){
+    Ext.apply(Ext.form.TextField.prototype, {
+       minLengthText : "æ­¤æ¬„ä½æœ€å°‘è¦è¼¸å…¥ {0} 個字",
+       maxLengthText : "æ­¤æ¬„ä½æœ€å¤šè¼¸å…¥ {0} 個字",
+       blankText     : "此欄ä½ç‚ºå¿…å¡«",
+       regexText     : "",
+       emptyText     : null
+    });
+}
+
+if(Ext.form.NumberField){
+    Ext.apply(Ext.form.NumberField.prototype, {
+       minText : "此欄ä½ä¹‹æ•¸å€¼å¿…須大於 {0}",
+       maxText : "此欄ä½ä¹‹æ•¸å€¼å¿…é ˆå°æ–¼ {0}",
+       nanText : "{0} 䏿˜¯åˆæ³•的數字"
+    });
+}
+
+if(Ext.form.DateField){
+    Ext.apply(Ext.form.DateField.prototype, {
+       disabledDaysText  : "無法使用",
+       disabledDatesText : "無法使用",
+       minText           : "此欄ä½ä¹‹æ—¥æœŸå¿…須在 {0} 之後",
+       maxText           : "此欄ä½ä¹‹æ—¥æœŸå¿…須在 {0} 之å‰",
+       invalidText       : "{0} 䏿˜¯æ­£ç¢ºçš„æ—¥æœŸæ ¼å¼ - å¿…é ˆåƒæ˜¯ 「 {1} 〠這樣的格å¼",
+       format            : "Y/m/d"
+    });
+}
+
+if(Ext.form.ComboBox){
+    Ext.apply(Ext.form.ComboBox.prototype, {
+       loadingText       : "讀å–中 ...",
+       valueNotFoundText : undefined
+    });
+}
+
+if(Ext.form.VTypes){
+    Ext.apply(Ext.form.VTypes, {
+       emailText    : '此欄ä½å¿…é ˆè¼¸å…¥åƒ "user@domain.com" 之E-Mailæ ¼å¼',
+       urlText      : '此欄ä½å¿…é ˆè¼¸å…¥åƒ "http:/'+'/www.domain.com" ä¹‹ç¶²å€æ ¼å¼',
+       alphaText    : '此欄ä½åƒ…能輸入åŠå½¢è‹±æ–‡å­—æ¯åŠåº•ç·š( _ )符號',
+       alphanumText : '此欄ä½åƒ…能輸入åŠå½¢è‹±æ–‡å­—æ¯ã€æ•¸å­—åŠåº•ç·š( _ )符號'
+    });
+}
+
+if(Ext.grid.GridView){
+    Ext.apply(Ext.grid.GridView.prototype, {
+       sortAscText  : "æ­£å‘æŽ’åº",
+       sortDescText : "å呿ޒåº",
+       lockText     : "鎖定欄ä½",
+       unlockText   : "解開欄ä½éŽ–å®š",
+       columnsText  : "欄ä½"
+    });
+}
+
+if(Ext.grid.PropertyColumnModel){
+    Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+       nameText   : "å稱",
+       valueText  : "數值",
+       dateFormat : "Y/m/d"
+    });
+}
+
+if(Ext.SplitLayoutRegion){
+    Ext.apply(Ext.SplitLayoutRegion.prototype, {
+       splitTip            : "拖曳縮放大å°.",
+       collapsibleSplitTip : "拖曳縮放大å°. 滑鼠雙擊隱è—."
+    });
+}
+

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/jquery-bridge.jss.html b/www/extras/yui-ext/docs/output/jquery-bridge.jss.html new file mode 100644 index 000000000..10aa92f81 --- /dev/null +++ b/www/extras/yui-ext/docs/output/jquery-bridge.jss.html @@ -0,0 +1,391 @@ +jquery-bridge.js

jquery-bridge.js

if(typeof jQuery == "undefined"){
+    throw "Unable to load Ext, jQuery not found.";
+}
+
+(function(){
+
+Ext.lib.Dom = {
+    getViewWidth : function(full){
+        // jQuery doesn't report full window size on document query, so max both
+        return full ? Math.max(jQuery(document).width(),jQuery(window).width()) : jQuery(window).width();
+    },
+
+    getViewHeight : function(full){
+        // jQuery doesn't report full window size on document query, so max both
+        return full ? Math.max(jQuery(document).height(),jQuery(window).height()) : jQuery(window).height();
+    },
+
+    isAncestor : function(p, c){
+        p = Ext.getDom(p);
+        c = Ext.getDom(c);
+        if (!p || !c) {return false;}
+
+        if(p.contains && !Ext.isSafari) {
+            return p.contains(c);
+        }else if(p.compareDocumentPosition) {
+            return !!(p.compareDocumentPosition(c) & 16);
+        }else{
+            var parent = c.parentNode;
+            while (parent) {
+                if (parent == p) {
+                    return true;
+                }
+                else if (!parent.tagName || parent.tagName.toUpperCase() == "HTML") {
+                    return false;
+                }
+                parent = parent.parentNode;
+            }
+            return false;
+        }
+    },
+
+    getRegion : function(el){
+        return Ext.lib.Region.getRegion(el);
+    },
+
+    getY : function(el){
+        return jQuery(el).offset({scroll:false}).top;
+    },
+
+    getX : function(el){
+        return jQuery(el).offset({scroll:false}).left;
+    },
+
+    getXY : function(el){
+        var o = jQuery(el).offset({scroll:false});
+        return [o.left,  o.top];
+    },
+
+    setXY : function(el, xy){
+        el = Ext.fly(el, '_setXY');
+        el.position();
+        var pts = el.translatePoints(xy);
+        if(xy[0] !== false){
+            el.dom.style.left = pts.left + "px";
+        }
+        if(xy[1] !== false){
+            el.dom.style.top = pts.top + "px";
+        }
+    },
+
+    setX : function(el, x){
+        this.setXY(el, [x, false]);
+    },
+
+    setY : function(el, y){
+        this.setXY(el, [false, y]);
+    }
+};
+
+Ext.lib.Event = {
+    getPageX : function(e){
+        e = e.browserEvent || e;
+        return e.pageX;
+    },
+
+    getPageY : function(e){
+        e = e.browserEvent || e;
+        return e.pageY;
+    },
+
+    getXY : function(e){
+        e = e.browserEvent || e;
+        return [e.pageX, e.pageY];
+    },
+
+    getTarget : function(e){
+        return e.target;
+    },
+
+    // all Ext events will go through event manager which provides scoping
+    on : function(el, eventName, fn, scope, override){
+        jQuery(el).bind(eventName, fn);
+    },
+
+    un : function(el, eventName, fn){
+        jQuery(el).unbind(eventName, fn);
+    },
+
+    purgeElement : function(el){
+        jQuery(el).unbind();
+    },
+
+    preventDefault : function(e){
+        e = e.browserEvent || e;
+        e.preventDefault();
+    },
+
+    stopPropagation : function(e){
+        e = e.browserEvent || e;
+        e.stopPropagation();
+    },
+
+    stopEvent : function(e){
+        e = e.browserEvent || e;
+        e.preventDefault();
+        e.stopPropagation();
+    },
+
+    onAvailable : function(id, fn, scope){
+        var start = new Date();
+        var f = function(){
+            if(start.getElapsed() > 10000){
+                clearInterval(iid);
+            }
+            var el = document.getElementById(id);
+            if(el){
+                clearInterval(iid);
+                fn.call(scope||window, el);
+            }
+        };
+        var iid = setInterval(f, 50);
+    },
+    
+    resolveTextNode: function(node) {
+        if (node && 3 == node.nodeType) {
+            return node.parentNode;
+        } else {
+            return node;
+        }
+    },
+
+    getRelatedTarget: function(ev) {
+        ev = ev.browserEvent || 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);
+    }
+};
+
+Ext.lib.Ajax = function(){
+    var createComplete = function(cb){
+         return function(xhr, status){
+            if((status == 'error' || status == 'timeout') && cb.failure){
+                cb.failure.call(cb.scope||window, {
+                    responseText: xhr.responseText,
+                    responseXML : xhr.responseXML,
+                    argument: cb.argument
+                });
+            }else if(cb.success){
+                cb.success.call(cb.scope||window, {
+                    responseText: xhr.responseText,
+                    responseXML : xhr.responseXML,
+                    argument: cb.argument
+                });
+            }
+         };
+    };
+    return {
+        request : function(method, uri, cb, data){
+            jQuery.ajax({
+                type: method,
+                url: uri,
+                data: data,
+                timeout: cb.timeout,
+                complete: createComplete(cb)
+            });
+        },
+
+        formRequest : function(form, uri, cb, data, isUpload, sslUri){
+            jQuery.ajax({
+                type: Ext.getDom(form).method ||'POST',
+                url: uri,
+                data: jQuery(form).formSerialize()+(data?'&'+data:''),
+                timeout: cb.timeout,
+                complete: createComplete(cb)
+            });
+        },
+
+        isCallInProgress : function(trans){
+            return false;
+        },
+
+        abort : function(trans){
+            return false;
+        },
+
+        serializeForm : function(form){
+            return jQuery(form.dom||form).formSerialize();
+        }
+    };
+}();
+
+Ext.lib.Anim = function(){
+    var createAnim = function(cb, scope){
+        var animated = true;
+        return {
+            stop : function(skipToLast){
+                // do nothing
+            },
+
+            isAnimated : function(){
+                return animated;
+            },
+
+            proxyCallback : function(){
+                animated = false;
+                Ext.callback(cb, scope);
+            }
+        };
+    };
+    return {
+        scroll : function(el, args, duration, easing, cb, scope){
+            // scroll anim not supported so just scroll immediately
+            var anim = createAnim(cb, scope);
+            el = Ext.getDom(el);
+            el.scrollLeft = args.scroll.to[0];
+            el.scrollTop = args.scroll.to[1];
+            anim.proxyCallback();
+            return anim;
+        },
+
+        motion : function(el, args, duration, easing, cb, scope){
+            return this.run(el, args, duration, easing, cb, scope);
+        },
+
+        color : function(el, args, duration, easing, cb, scope){
+            // color anim not supported, so execute callback immediately
+            var anim = createAnim(cb, scope);
+            anim.proxyCallback();
+            return anim;
+        },
+
+        run : function(el, args, duration, easing, cb, scope, type){
+            var anim = createAnim(cb, scope);
+            var o = {};
+            for(var k in args){
+                switch(k){   // jquery doesn't support, so convert
+                    case 'points':
+                        var by, pts, e = Ext.fly(el, '_animrun');
+                        e.position();
+                        if(by = args.points.by){
+                            var xy = e.getXY();
+                            pts = e.translatePoints([xy[0]+by[0], xy[1]+by[1]]);
+                        }else{
+                            pts = e.translatePoints(args.points.to);
+                        }
+                        o.left = pts.left;
+                        o.top = pts.top;
+                        if(!parseInt(e.getStyle('left'), 10)){ // auto bug
+                            e.setLeft(0);
+                        }
+                        if(!parseInt(e.getStyle('top'), 10)){
+                            e.setTop(0);
+                        }
+                    break;
+                    case 'width':
+                        o.width = args.width.to;
+                    break;
+                    case 'height':
+                        o.height = args.height.to;
+                    break;
+                    case 'opacity':
+                        o.opacity = args.opacity.to;
+                    break;
+                    default:
+                        o[k] = args[k].to;
+                    break;
+                }
+            }
+            // TODO: find out about easing plug in?
+            jQuery(el).animate(o, duration*1000, undefined, anim.proxyCallback);
+            return anim;
+        }
+    };
+}();
+
+
+Ext.lib.Region = function(t, r, b, l) {
+    this.top = t;
+    this[1] = t;
+    this.right = r;
+    this.bottom = b;
+    this.left = l;
+    this[0] = l;
+};
+
+Ext.lib.Region.prototype = {
+    contains : function(region) {
+        return ( region.left   >= this.left   &&
+                 region.right  <= this.right  &&
+                 region.top    >= this.top    &&
+                 region.bottom <= this.bottom    );
+
+    },
+
+    getArea : function() {
+        return ( (this.bottom - this.top) * (this.right - this.left) );
+    },
+
+    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 Ext.lib.Region(t, r, b, l);
+        } else {
+            return null;
+        }
+    },
+    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 Ext.lib.Region(t, r, b, l);
+    },
+
+    adjust : function(t, l, b, r){
+        this.top += t;
+        this.left += l;
+        this.right += r;
+        this.bottom += b;
+        return this;
+    }
+};
+
+Ext.lib.Region.getRegion = function(el) {
+    var p = Ext.lib.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 Ext.lib.Region(t, r, b, l);
+};
+
+Ext.lib.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;
+};
+
+Ext.lib.Point.prototype = new Ext.lib.Region();
+
+// prevent IE leaks
+if(Ext.isIE){
+    jQuery(window).unload(function(){
+        var p = Function.prototype;
+        delete p.createSequence;
+        delete p.defer;
+        delete p.createDelegate;
+        delete p.createCallback;
+        delete p.createInterceptor;
+    });
+}
+})();

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/prototype-bridge.jss.html b/www/extras/yui-ext/docs/output/prototype-bridge.jss.html new file mode 100644 index 000000000..31e77c7a2 --- /dev/null +++ b/www/extras/yui-ext/docs/output/prototype-bridge.jss.html @@ -0,0 +1,499 @@ +prototype-bridge.js

prototype-bridge.js

(function(){
+
+var libFlyweight;
+
+Ext.lib.Dom = {
+    getViewWidth : function(full){
+        return full ? this.getDocumentWidth() : this.getViewportWidth();
+    },
+
+    getViewHeight : function(full){
+        return full ? this.getDocumentHeight() : this.getViewportHeight();
+    },
+
+    getDocumentHeight: function() { // missing from prototype?
+        var scrollHeight = (document.compatMode != "CSS1Compat") ? document.body.scrollHeight : document.documentElement.scrollHeight;
+        return Math.max(scrollHeight, this.getViewportHeight());
+    },
+
+    getDocumentWidth: function() { // missing from prototype?
+        var scrollWidth = (document.compatMode != "CSS1Compat") ? document.body.scrollWidth : document.documentElement.scrollWidth;
+        return Math.max(scrollWidth, this.getViewportWidth());
+    },
+
+    getViewportHeight: function() { // missing from prototype?
+        var height = self.innerHeight;
+        var mode = document.compatMode;
+
+        if ( (mode || Ext.isIE) && !Ext.isOpera ) {
+            height = (mode == "CSS1Compat") ?
+                    document.documentElement.clientHeight : // Standards
+                    document.body.clientHeight; // Quirks
+        }
+
+        return height;
+    },
+
+    getViewportWidth: function() { // missing from prototype?
+        var width = self.innerWidth;  // Safari
+        var mode = document.compatMode;
+
+        if (mode || Ext.isIE) { // IE, Gecko, Opera
+            width = (mode == "CSS1Compat") ?
+                    document.documentElement.clientWidth : // Standards
+                    document.body.clientWidth; // Quirks
+        }
+        return width;
+    },
+
+    isAncestor : function(p, c){ // missing from prototype?
+        p = Ext.getDom(p);
+        c = Ext.getDom(c);
+        if (!p || !c) {return false;}
+
+        if(p.contains && !Ext.isSafari) {
+            return p.contains(c);
+        }else if(p.compareDocumentPosition) {
+            return !!(p.compareDocumentPosition(c) & 16);
+        }else{
+            var parent = c.parentNode;
+            while (parent) {
+                if (parent == p) {
+                    return true;
+                }
+                else if (!parent.tagName || parent.tagName.toUpperCase() == "HTML") {
+                    return false;
+                }
+                parent = parent.parentNode;
+            }
+            return false;
+        }
+    },
+
+    getRegion : function(el){
+        return Ext.lib.Region.getRegion(el);
+    },
+
+    getY : function(el){
+        return this.getXY(el)[1];
+    },
+
+    getX : function(el){
+        return this.getXY(el)[0];
+    },
+
+    getXY : function(el){ // this initially used Position.cumulativeOffset but it is not accurate enough
+        var p, pe, b, scroll, bd = document.body;
+        el = Ext.getDom(el);
+
+        if(el.getBoundingClientRect){ // IE
+            b = el.getBoundingClientRect();
+            scroll = fly(document).getScroll();
+            return [b.left + scroll.left, b.top + scroll.top];
+        } else{
+            var x = el.offsetLeft, y = el.offsetTop;
+            p = el.offsetParent;
+
+            // ** flag if a parent is positioned for Safari
+            var hasAbsolute = false;
+
+            if(p != el){
+                while(p){
+                    x += p.offsetLeft;
+                    y += p.offsetTop;
+
+                    // ** flag Safari abs position bug - only check if needed
+                    if(Ext.isSafari && !hasAbsolute && fly(p).getStyle("position") == "absolute"){
+                        hasAbsolute = true;
+                    }
+
+                    // ** Fix gecko borders measurements
+                    // Credit jQuery dimensions plugin for the workaround
+                    if(Ext.isGecko){
+                        pe = fly(p);
+                        var bt = parseInt(pe.getStyle("borderTopWidth"), 10) || 0;
+                        var bl = parseInt(pe.getStyle("borderLeftWidth"), 10) || 0;
+
+                        // add borders to offset
+                        x += bl;
+                        y += bt;
+
+                        // Mozilla removes the border if the parent has overflow property other than visible
+                        if(p != el && pe.getStyle('overflow') != 'visible'){
+                            x += bl;
+                            y += bt;
+                        }
+                    }
+                    p = p.offsetParent;
+                }
+            }
+            // ** safari doubles in some cases, use flag from offsetParent's as well
+            if(Ext.isSafari && (hasAbsolute || fly(el).getStyle("position") == "absolute")){
+                x -= bd.offsetLeft;
+                y -= bd.offsetTop;
+            }
+        }
+
+        p = el.parentNode;
+
+        while(p && p != bd){
+            // ** opera TR has bad scroll values, so filter them jvs
+            if(!Ext.isOpera || (Ext.isOpera && p.tagName != 'TR' && fly(p).getStyle("display") != "inline")){
+                x -= p.scrollLeft;
+                y -= p.scrollTop;
+            }
+            p = p.parentNode;
+        }
+        return [x, y];
+    },
+
+    setXY : function(el, xy){ // this initially used Position.cumulativeOffset but it is not accurate enough
+        el = Ext.fly(el, '_setXY');
+        el.position();
+        var pts = el.translatePoints(xy);
+        if(xy[0] !== false){
+            el.dom.style.left = pts.left + "px";
+        }
+        if(xy[1] !== false){
+            el.dom.style.top = pts.top + "px";
+        }
+    },
+
+    setX : function(el, x){
+        this.setXY(el, [x, false]);
+    },
+
+    setY : function(el, y){
+        this.setXY(el, [false, y]);
+    }
+};
+
+Ext.lib.Event = {
+    getPageX : function(e){
+        return Event.pointerX(e.browserEvent || e);
+    },
+
+    getPageY : function(e){
+        return Event.pointerY(e.browserEvent || e);
+    },
+
+    getXY : function(e){
+        e = e.browserEvent || e;
+        return [Event.pointerX(e), Event.pointerY(e)];
+    },
+
+    getTarget : function(e){
+        return Event.element(e.browserEvent || e);
+    },
+
+    resolveTextNode: function(node) {
+        if (node && 3 == node.nodeType) {
+            return node.parentNode;
+        } else {
+            return node;
+        }
+    },
+
+    getRelatedTarget: function(ev) { // missing from prototype?
+        ev = ev.browserEvent || 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);
+    },
+
+    on : function(el, eventName, fn){
+        Event.observe(el, eventName, fn, false);
+    },
+
+    un : function(el, eventName, fn){
+        Event.stopObserving(el, eventName, fn, false);
+    },
+
+    purgeElement : function(el){
+        // no equiv?
+    },
+
+    preventDefault : function(e){   // missing from prototype?
+        e = e.browserEvent || e;
+        if(e.preventDefault) {
+            e.preventDefault();
+        } else {
+            e.returnValue = false;
+        }
+    },
+
+    stopPropagation : function(e){   // missing from prototype?
+        e = e.browserEvent || e;
+        if(e.stopPropagation) {
+            e.stopPropagation();
+        } else {
+            e.cancelBubble = true;
+        }
+    },
+
+    stopEvent : function(e){
+        Event.stop(e.browserEvent || e);
+    },
+
+    onAvailable : function(el, fn, scope, override){  // no equiv
+        var start = new Date(), iid;
+        var f = function(){
+            if(start.getElapsed() > 10000){
+                clearInterval(iid);
+            }
+            var el = document.getElementById(id);
+            if(el){
+                clearInterval(iid);
+                fn.call(scope||window, el);
+            }
+        };
+        iid = setInterval(f, 50);
+    }
+};
+
+Ext.lib.Ajax = function(){
+    var createSuccess = function(cb){
+         return cb.success ? function(xhr){
+            cb.success.call(cb.scope||window, {
+                responseText: xhr.responseText,
+                responseXML : xhr.responseXML,
+                argument: cb.argument
+            });
+         } : Ext.emptyFn;
+    };
+    var createFailure = function(cb){
+         return cb.failure ? function(xhr){
+            cb.failure.call(cb.scope||window, {
+                responseText: xhr.responseText,
+                responseXML : xhr.responseXML,
+                argument: cb.argument
+            });
+         } : Ext.emptyFn;
+    };
+    return {
+        request : function(method, uri, cb, data){
+            new Ajax.Request(uri, {
+                method: method,
+                parameters: data || '',
+                timeout: cb.timeout,
+                onSuccess: createSuccess(cb),
+                onFailure: createFailure(cb)
+            });
+        },
+
+        formRequest : function(form, uri, cb, data, isUpload, sslUri){
+            new Ajax.Request(uri, {
+                method: Ext.getDom(form).method ||'POST',
+                parameters: Form.serialize(form)+(data?'&'+data:''),
+                timeout: cb.timeout,
+                onSuccess: createSuccess(cb),
+                onFailure: createFailure(cb)
+            });
+        },
+
+        isCallInProgress : function(trans){
+            return false;
+        },
+
+        abort : function(trans){
+            return false;
+        },
+        
+        serializeForm : function(form){
+            return Form.serialize(form.dom||form, true);
+        }
+    };
+}();
+
+
+Ext.lib.Anim = function(){
+    
+    var easings = {
+        easeOut: function(pos) {
+            return 1-Math.pow(1-pos,2);
+        },
+        easeIn: function(pos) {
+            return 1-Math.pow(1-pos,2);
+        }
+    };
+    var createAnim = function(cb, scope){
+        return {
+            stop : function(skipToLast){
+                this.effect.cancel();
+            },
+
+            isAnimated : function(){
+                return this.effect.state == 'running';
+            },
+
+            proxyCallback : function(){
+                Ext.callback(cb, scope);
+            }
+        };
+    };
+    return {
+        scroll : function(el, args, duration, easing, cb, scope){
+            // not supported so scroll immediately?
+            var anim = createAnim(cb, scope);
+            el = Ext.getDom(el);
+            el.scrollLeft = args.to[0];
+            el.scrollTop = args.to[1];
+            anim.proxyCallback();
+            return anim;
+        },
+
+        motion : function(el, args, duration, easing, cb, scope){
+            return this.run(el, args, duration, easing, cb, scope);
+        },
+
+        color : function(el, args, duration, easing, cb, scope){
+            return this.run(el, args, duration, easing, cb, scope);
+        },
+
+        run : function(el, args, duration, easing, cb, scope, type){
+            var o = {};
+            for(var k in args){
+                switch(k){   // scriptaculous doesn't support, so convert these
+                    case 'points':
+                        var by, pts, e = Ext.fly(el, '_animrun');
+                        e.position();
+                        if(by = args.points.by){
+                            var xy = e.getXY();
+                            pts = e.translatePoints([xy[0]+by[0], xy[1]+by[1]]);
+                        }else{
+                            pts = e.translatePoints(args.points.to);
+                        }
+                        o.left = pts.left+'px';
+                        o.top = pts.top+'px';
+                    break;
+                    case 'width':
+                        o.width = args.width.to+'px';
+                    break;
+                    case 'height':
+                        o.height = args.height.to+'px';
+                    break;
+                    case 'opacity':
+                        o.opacity = String(args.opacity.to);
+                    break;
+                    default:
+                        o[k] = String(args[k].to);
+                    break;
+                }
+            }
+            var anim = createAnim(cb, scope);
+            anim.effect = new Effect.Morph(Ext.id(el), {
+                duration: duration,
+                afterFinish: anim.proxyCallback,
+                transition: easings[easing] || Effect.Transitions.linear,
+                style: o
+            });
+            return anim;
+        }
+    };
+}();
+
+
+// all lib flyweight calls use their own flyweight to prevent collisions with developer flyweights
+function fly(el){
+    if(!libFlyweight){
+        libFlyweight = new Ext.Element.Flyweight();
+    }
+    libFlyweight.dom = el;
+    return libFlyweight;
+}
+    
+Ext.lib.Region = function(t, r, b, l) {
+    this.top = t;
+    this[1] = t;
+    this.right = r;
+    this.bottom = b;
+    this.left = l;
+    this[0] = l;
+};
+
+Ext.lib.Region.prototype = {
+    contains : function(region) {
+        return ( region.left   >= this.left   &&
+                 region.right  <= this.right  &&
+                 region.top    >= this.top    &&
+                 region.bottom <= this.bottom    );
+
+    },
+
+    getArea : function() {
+        return ( (this.bottom - this.top) * (this.right - this.left) );
+    },
+
+    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 Ext.lib.Region(t, r, b, l);
+        } else {
+            return null;
+        }
+    },
+    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 Ext.lib.Region(t, r, b, l);
+    },
+
+    adjust : function(t, l, b, r){
+        this.top += t;
+        this.left += l;
+        this.right += r;
+        this.bottom += b;
+        return this;
+    }
+};
+
+Ext.lib.Region.getRegion = function(el) {
+    var p = Ext.lib.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 Ext.lib.Region(t, r, b, l);
+};
+
+Ext.lib.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;
+};
+
+Ext.lib.Point.prototype = new Ext.lib.Region();
+
+
+// prevent IE leaks
+if(Ext.isIE){
+    Event.observe(window, "unload", function(){
+        var p = Function.prototype;
+        delete p.createSequence;
+        delete p.defer;
+        delete p.createDelegate;
+        delete p.createCallback;
+        delete p.createInterceptor;
+    });
+}
+})();

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.
+ \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/yui-bridge.jss.html b/www/extras/yui-ext/docs/output/yui-bridge.jss.html new file mode 100644 index 000000000..9ffd32c4e --- /dev/null +++ b/www/extras/yui-ext/docs/output/yui-bridge.jss.html @@ -0,0 +1,297 @@ +yui-bridge.js

yui-bridge.js

if(typeof YAHOO == "undefined"){
+    throw "Unable to load Ext, core YUI utilities (yahoo, dom, event) not found.";
+}
+
+(function(){
+var E = YAHOO.util.Event;
+var D = YAHOO.util.Dom;
+var CN = YAHOO.util.Connect;    
+
+var ES = YAHOO.util.Easing;
+var A = YAHOO.util.Anim;
+var libFlyweight;
+
+Ext.lib.Dom = {
+    getViewWidth : function(full){
+        return full ? D.getDocumentWidth() : D.getViewportWidth();
+    },
+
+    getViewHeight : function(full){
+        return full ? D.getDocumentHeight() : D.getViewportHeight();
+    },
+
+    isAncestor : function(haystack, needle){
+        return D.isAncestor(haystack, needle);
+    },
+
+    getRegion : function(el){
+        return D.getRegion(el);
+    },
+
+    getY : function(el){
+        return this.getXY(el)[1];
+    },
+
+    getX : function(el){
+        return this.getXY(el)[0];
+    },
+
+    // original version based on YahooUI getXY
+    // this version fixes several issues in Safari and FF
+    // and boosts performance by removing the batch overhead, repetitive dom lookups and array index calls
+    getXY : function(el){
+        var p, pe, b, scroll, bd = document.body;
+        el = Ext.getDom(el);
+
+        if(el.getBoundingClientRect){ // IE
+            b = el.getBoundingClientRect();
+            scroll = fly(document).getScroll();
+            return [b.left + scroll.left, b.top + scroll.top];
+        } else{
+            var x = el.offsetLeft, y = el.offsetTop;
+            p = el.offsetParent;
+
+            // ** flag if a parent is positioned for Safari
+            var hasAbsolute = false;
+
+            if(p != el){
+                while(p){
+                    x += p.offsetLeft;
+                    y += p.offsetTop;
+
+                    // ** flag Safari abs position bug - only check if needed
+                    if(Ext.isSafari && !hasAbsolute && fly(p).getStyle("position") == "absolute"){
+                        hasAbsolute = true;
+                    }
+
+                    // ** Fix gecko borders measurements
+                    // Credit jQuery dimensions plugin for the workaround
+                    if(Ext.isGecko){
+                        pe = fly(p);
+                        var bt = parseInt(pe.getStyle("borderTopWidth"), 10) || 0;
+                        var bl = parseInt(pe.getStyle("borderLeftWidth"), 10) || 0;
+
+                        // add borders to offset
+                        x += bl;
+                        y += bt;
+
+                        // Mozilla removes the border if the parent has overflow property other than visible
+                        if(p != el && pe.getStyle('overflow') != 'visible'){
+                            x += bl;
+                            y += bt;
+                        }
+                    }
+                    p = p.offsetParent;
+                }
+            }
+            // ** safari doubles in some cases, use flag from offsetParent's as well
+            if(Ext.isSafari && (hasAbsolute || fly(el).getStyle("position") == "absolute")){
+                x -= bd.offsetLeft;
+                y -= bd.offsetTop;
+            }
+        }
+
+        p = el.parentNode;
+
+        while(p && p != bd){
+            // ** opera TR has bad scroll values, so filter them jvs
+            if(!Ext.isOpera || (Ext.isOpera && p.tagName != 'TR' && fly(p).getStyle("display") != "inline")){
+                x -= p.scrollLeft;
+                y -= p.scrollTop;
+            }
+            p = p.parentNode;
+        }
+        return [x, y];
+    },
+
+    setXY : function(el, xy){
+        el = Ext.fly(el, '_setXY');
+        el.position();
+        var pts = el.translatePoints(xy);
+        if(xy[0] !== false){
+            el.dom.style.left = pts.left + "px";
+        }
+        if(xy[1] !== false){
+            el.dom.style.top = pts.top + "px";
+        }
+    },
+
+    setX : function(el, x){
+        this.setXY(el, [x, false]);
+    },
+
+    setY : function(el, y){
+        this.setXY(el, [false, y]);
+    }
+};
+
+Ext.lib.Event = {
+    getPageX : function(e){
+        return E.getPageX(e.browserEvent || e);
+    },
+
+    getPageY : function(e){
+        return E.getPageY(e.browserEvent || e);
+    },
+
+    getXY : function(e){
+        return E.getXY(e.browserEvent || e);
+    },
+
+    getTarget : function(e){
+        return E.getTarget(e.browserEvent || e);
+    },
+
+    getRelatedTarget : function(e){
+        return E.getRelatedTarget(e.browserEvent || e);
+    },
+
+    on : function(el, eventName, fn, scope, override){
+        E.on(el, eventName, fn, scope, override);
+    },
+
+    un : function(el, eventName, fn){
+        E.removeListener(el, eventName, fn);
+    },
+
+    purgeElement : function(el){
+        E.purgeElement(el);
+    },
+
+    preventDefault : function(e){
+        E.preventDefault(e.browserEvent || e);
+    },
+
+    stopPropagation : function(e){
+        E.stopPropagation(e.browserEvent || e);
+    },
+
+    stopEvent : function(e){
+        E.stopEvent(e.browserEvent || e);
+    },
+
+    onAvailable : function(el, fn, scope, override){
+        return E.onAvailable(el, fn, scope, override);
+    }
+};
+
+Ext.lib.Ajax = {
+    request : function(method, uri, cb, data){
+        return CN.asyncRequest(method, uri, cb, data);
+    },
+
+    formRequest : function(form, uri, cb, data, isUpload, sslUri){
+        CN.setForm(form, isUpload, sslUri);
+        return CN.asyncRequest(Ext.getDom(form).method ||'POST', uri, cb, data);
+    },
+
+    isCallInProgress : function(trans){
+        return CN.isCallInProgress(trans);
+    },
+
+    abort : function(trans){
+        return CN.abort(trans);
+    },
+    
+    serializeForm : function(form){
+        var d = CN.setForm(form.dom || form);
+        CN.resetFormState();
+        return d;
+    }
+};
+
+Ext.lib.Region = YAHOO.util.Region;
+Ext.lib.Point = YAHOO.util.Point;
+
+
+Ext.lib.Anim = {
+    scroll : function(el, args, duration, easing, cb, scope){
+        this.run(el, args, duration, easing, cb, scope, YAHOO.util.Scroll);
+    },
+
+    motion : function(el, args, duration, easing, cb, scope){
+        this.run(el, args, duration, easing, cb, scope, YAHOO.util.Motion);
+    },
+
+    color : function(el, args, duration, easing, cb, scope){
+        this.run(el, args, duration, easing, cb, scope, YAHOO.util.ColorAnim);
+    },
+
+    run : function(el, args, duration, easing, cb, scope, type){
+        type = type || YAHOO.util.Anim;
+        if(typeof easing == "string"){
+            easing = YAHOO.util.Easing[easing];
+        }
+        var anim = new type(el, args, duration, easing);
+        anim.animateX(function(){
+            Ext.callback(cb, scope);
+        });
+        return anim;
+    }
+};
+
+// all lib flyweight calls use their own flyweight to prevent collisions with developer flyweights
+function fly(el){
+    if(!libFlyweight){
+        libFlyweight = new Ext.Element.Flyweight();
+    }
+    libFlyweight.dom = el;
+    return libFlyweight;
+}
+
+// prevent IE leaks
+if(Ext.isIE){
+    YAHOO.util.Event.on(window, "unload", function(){
+        var p = Function.prototype;
+        delete p.createSequence;
+        delete p.defer;
+        delete p.createDelegate;
+        delete p.createCallback;
+        delete p.createInterceptor;
+    });
+}
+
+// various overrides
+
+// add ability for callbacks with animations
+if(YAHOO.util.Anim){
+    YAHOO.util.Anim.prototype.animateX = function(callback, scope){
+        var f = function(){
+            this.onComplete.unsubscribe(f);
+            if(typeof callback == "function"){
+                callback.call(scope || this, this);
+            }
+        };
+        this.onComplete.subscribe(f, this, true);
+        this.animate();
+    };
+}
+
+if(YAHOO.util.DragDrop && Ext.dd.DragDrop){
+    YAHOO.util.DragDrop.defaultPadding = Ext.dd.DragDrop.defaultPadding;
+    YAHOO.util.DragDrop.constrainTo = Ext.dd.DragDrop.constrainTo;
+}
+
+YAHOO.util.Dom.getXY = function(el) {
+    var f = function(el) {
+        return Ext.lib.Dom.getXY(el);
+    };
+    return YAHOO.util.Dom.batch(el, f, YAHOO.util.Dom, true);
+};
+
+
+// workaround for Safari anim duration speed problems
+if(YAHOO.util.AnimMgr){
+    YAHOO.util.AnimMgr.fps = 1000;
+}
+
+YAHOO.util.Region.prototype.adjust = function(t, l, b, r){
+    this.top += t;
+    this.left += l;
+    this.right += r;
+    this.bottom += b;
+    return this;
+};
+
+})();

Ext - Copyright © 2006-2007 Ext JS, LLC
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/collapser.css b/www/extras/yui-ext/docs/resources/collapser.css new file mode 100644 index 000000000..d1c7b4681 --- /dev/null +++ b/www/extras/yui-ext/docs/resources/collapser.css @@ -0,0 +1,34 @@ +.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; +} \ No newline at end of file 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..16aae9ee7 --- /dev/null +++ b/www/extras/yui-ext/docs/resources/docs.css @@ -0,0 +1,77 @@ +#class .loading-indicator{ + font-size:12px; + height:18px; +} +#docs .x-layout-panel-north{ + border:0px none; + background:#0000aa url(../../resources/images/default/basic-dialog/hd-sprite.gif) repeat-x 0px -83px; + padding-top:3px; + padding-left:3px; +} +#docs .x-layout-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:1px solid #6593cf; + padding:2px; + background:#c3daf9; + width:150px; + text-align:center; + z-index:20001; +} +#loading .loading-indicator{ + border:1px solid #a3bad9; + background:white url(block-bg.gif) repeat-x; + color:#003366; + font:bold 13px tahoma,arial,helvetica; + padding:10px; + margin:0; +} +#classes{ + overflow:auto; + padding:5px; +} +#classes a span { + font:normal 11px verdana,helvetica,tahoma,sans-serif; +} +#classes .cls a:hover span { + text-decoration:underline; + color:#003366; +} + +#classes .x-tree-selected a span { + background:#c3daf9; + border:1px dashed #99bbe8; + color:#000; +} +#classes .x-tree-selected a:hover span { + text-decoration:none; + color:#000; +} \ 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..122f2f0a4 --- /dev/null +++ b/www/extras/yui-ext/docs/resources/docs.js @@ -0,0 +1,148 @@ +var Docs = function(){ + var layout, center; + + var classClicked = function(e, target){ + Docs.loadDoc(target.href); + }; + + return { + init : function(){ + // initialize state manager, we will use cookies + Ext.state.Manager.setProvider(new Ext.state.CookieProvider()); + + // create the main layout + layout = new 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 Ext.ContentPanel('header')); + + layout.add('west', new Ext.ContentPanel('classes', {title: 'Documentation Explorer', fitToFrame:true})); + center = layout.getRegion('center'); + center.add(new Ext.ContentPanel('main', {fitToFrame:true})); + + layout.restoreState(); + layout.endUpdate(); + + var classes = Ext.get('classes'); + if(Docs.classData){ + var tree = new Ext.tree.TreePanel(classes, { + loader: new Ext.tree.TreeLoader(), + rootVisible:false, + animate:false + }); + new Ext.tree.TreeSorter(tree, {folderSort:true,leafAttr:'isClass'}); + var root = new Ext.tree.AsyncTreeNode({ + text:'Ext Docs', + children: [Docs.classData] + }); + tree.setRootNode(root); + + tree.on('click', function(n){ + if(n.isLeaf()){ + Docs.loadDoc('output/'+n.attributes.fullName+'.html'); + } + }); + + tree.render(); + }else{ + classes.on('click', classClicked, null, {delegate: 'a', stopEvent:true}); + classes.select('h3').each(function(el){ + var c = new NavNode(el.dom); + if(!/^\s*(?:API Reference|Examples and Demos)\s*$/.test(el.dom.innerHTML)){ + c.collapse(); + } + }); + } + var page = window.location.href.split('#')[1]; + if(!page){ + page = 'welcome.html'; + } + this.loadDoc(page); + // safari and opera have iframe sizing issue, relayout fixes it + if(Ext.isSafari || Ext.isOpera){ + layout.layout(); + } + + var loading = Ext.get('loading'); + var mask = Ext.get('loading-mask'); + mask.setOpacity(.8); + mask.shift({ + xy:loading.getXY(), + width:loading.getWidth(), + height:loading.getHeight(), + remove:true, + duration:1, + opacity:.3, + easing:'bounceOut', + callback : function(){ + loading.fadeOut({duration:.2,remove:true}); + } + }); + }, + + loadDoc : function(url){ + Ext.get('main').dom.src = url; + } + }; +}(); +Ext.onReady(Docs.init, Docs, true); + +/** + * Simple tree node class based on Collapser and predetermined markup. + */ +var NavNode = function(clickEl, collapseEl){ + this.clickEl = Ext.get(clickEl); + if(!collapseEl){ + collapseEl = this.clickEl.dom.nextSibling; + while(collapseEl.nodeType != 1){ + collapseEl = collapseEl.nextSibling; + } + } + this.collapseEl = Ext.get(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..16180f7f9 --- /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..74d198e4f --- /dev/null +++ b/www/extras/yui-ext/docs/resources/style.css @@ -0,0 +1,216 @@ +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-weight: bold; + font-size: 15px; + 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; + font-size: 12px; + line-height:14px; + 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; +} +pre.highlighted code{ + font-family:courier,"courier new",monospace; + font-size:12px !important; + color:#000; +} +.highlighted b{ + font-weight: normal; + color: #800080; +} +.highlighted i,.highlighted i b{ + font-weight: normal; + font-style: normal; + color: #999; +} \ 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..5817a185c --- /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..c3e8d7bd6 --- /dev/null +++ b/www/extras/yui-ext/docs/welcome.html @@ -0,0 +1,64 @@ + + + Ext - Welcome + + + + +

+
+

Welcome!

+
+ Welcome to the Ext Documentation Center. Click on a class or example in the tree on the left to begin learning about Ext.

+ If you need help, it's only a click away: Help Forums.
+
+
+
+

API Reference

+
+ The API Reference contains documentation for all the classes and components found in the Ext library. + The most common classes: + + Ext 1.0.1 +
+
+
+
+
+

Examples and Demos

+
+ New examples: +
+ Other 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/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/debug/debug-console.html b/www/extras/yui-ext/examples/debug/debug-console.html new file mode 100644 index 000000000..caba20d35 --- /dev/null +++ b/www/extras/yui-ext/examples/debug/debug-console.html @@ -0,0 +1,42 @@ + + + + +Ext Debug Console + + + + + + + + + + + +

Ext Debug Console

+
+

Included in ext-all-debug.js is the Ext Debug Console. It offers a limited amount of FireBug + functionality cross browser. The most important feature is the "DOM Inspector" and CSS and DOM attribute editing. In any browser where "console" + is not already defined, the Ext console will handle console.log(), time() and other calls. +

+

+ Try It
+ This page includes ext-all-debug.js and some test markup so you can try it out. Hit control+shift+home to bring up the console or click on the image below. +

+ + +

+ The full source is available in the "source" directory of the Ext download. +

+
+

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/debug/inspector.gif b/www/extras/yui-ext/examples/debug/inspector.gif new file mode 100644 index 0000000000000000000000000000000000000000..d02e467fc30fe41d6f3c6c6e117f565ad26c6fd0 GIT binary patch literal 51396 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 literal 0 HcmV?d00001 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..72f0b4b08 --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/blog.html @@ -0,0 +1,81 @@ + + + + +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.

+

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..3ae5bfc94 --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/hello.html @@ -0,0 +1,64 @@ + + + + +Hello World Dialog Example + + + + + + + + + + + + + + + + + +

Hello World Dialog

+

This example shows how to create a very simple modal BasicDialog with "autoTabs".

+

+

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 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..7762b85f0 --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/hello.js @@ -0,0 +1,46 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +// 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; + + // return a public interface + return { + init : function(){ + showBtn = Ext.get('show-dialog-btn'); + // attach to click event + showBtn.on('click', this.showDialog, this); + }, + + showDialog : function(){ + if(!dialog){ // lazy initialize the dialog and only create it once + dialog = new Ext.BasicDialog("hello-dlg", { + autoTabs:true, + width:500, + height:300, + shadow:true, + minWidth:300, + minHeight:250, + proxyDrag: true + }); + dialog.addKeyListener(27, dialog.hide, dialog); + dialog.addButton('Submit', dialog.hide, dialog).disable(); + dialog.addButton('Close', dialog.hide, dialog); + } + 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 +Ext.onReady(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..8549abddb --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/layout.html @@ -0,0 +1,39 @@ + + + + +Layout Dialog Example + + + + + + + + + + + + +

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..b8c6334db --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/layout.js @@ -0,0 +1,77 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + + +// 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(){ + Ext.get(document.body, true).toggleClass('ytheme-gray'); + }; + // return a public interface + return { + init : function(){ + showBtn = Ext.get('show-dialog-btn'); + // attach to click event + showBtn.on('click', this.showDialog, this); + + }, + + showDialog : function(){ + if(!dialog){ // lazy initialize the dialog and only create it once + dialog = new Ext.LayoutDialog("hello-dlg", { + modal:true, + width:600, + height:400, + shadow:true, + minWidth:300, + minHeight:300, + proxyDrag: true, + 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('Submit', dialog.hide, dialog); + dialog.addButton('Close', dialog.hide, dialog); + + var layout = dialog.getLayout(); + layout.beginUpdate(); + layout.add('west', new Ext.ContentPanel('west', {title: 'West'})); + layout.add('center', new Ext.ContentPanel('center', {title: 'The First Tab'})); + // generate some other tabs + layout.add('center', new Ext.ContentPanel(Ext.id(), { + autoCreate:true, title: 'Another Tab', background:true})); + layout.add('center', new Ext.ContentPanel(Ext.id(), { + autoCreate:true, title: 'Third Tab', closable:true, background:true})); + layout.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 +Ext.EventManager.onDocumentReady(LayoutExample.init, LayoutExample, true); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/dialog/msg-box.html b/www/extras/yui-ext/examples/dialog/msg-box.html new file mode 100644 index 000000000..87955a00d --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/msg-box.html @@ -0,0 +1,57 @@ + + + +MessageBox + + + + + + + + + + + + +

MessageBox Dialogs

+

The example shows how to use the MessageBox class. Some of the buttons have animations, some are normal.

+

The js is not minified so it is readable. See msg-box.js.

+ +

+ Confirm
+ Standard Yes/No dialog. + +

+ +

+ Prompt
+ Standard prompt dialog. + +

+ +

+ Multi-line Prompt
+ A multi-line prompt dialog. + +

+ +

+ Yes/No/Cancel
+ Standard Yes/No/Cancel dialog. + +

+ +

+ Progress Dialog
+ You can set a progress on a progress MessageBox. + +

+ +

+ Alert
+ Standard alert message dialog. + +

+ + diff --git a/www/extras/yui-ext/examples/dialog/msg-box.js b/www/extras/yui-ext/examples/dialog/msg-box.js new file mode 100644 index 000000000..e3a728c9a --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/msg-box.js @@ -0,0 +1,77 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.onReady(function(){ + Ext.get('mb1').on('click', function(e){ + Ext.MessageBox.confirm('Confirm', 'Are you sure you want to do that?', showResult); + }); + + Ext.get('mb2').on('click', function(e){ + Ext.MessageBox.prompt('Name', 'Please enter your name:', showResultText); + }); + + Ext.get('mb3').on('click', function(e){ + Ext.MessageBox.show({ + title: 'Address', + msg: 'Please enter your address:', + width:300, + buttons: Ext.MessageBox.OKCANCEL, + multiline: true, + fn: showResultText, + animEl: 'mb3' + }); + }); + + Ext.get('mb4').on('click', function(e){ + Ext.MessageBox.show({ + title:'Save Changes?', + msg: 'Your are closing a tab that has unsaved changes. Would you like to save your changes?', + buttons: Ext.MessageBox.YESNOCANCEL, + fn: showResult, + animEl: 'mb4' + }); + }); + + Ext.get('mb6').on('click', function(){ + Ext.MessageBox.show({ + title: 'Please wait...', + msg: 'Initializing...', + width:240, + progress:true, + closable:false, + animEl: 'mb6' + }); + + // this hideous block creates the bogus progress + var f = function(v){ + return function(){ + if(v == 11){ + Ext.MessageBox.hide(); + }else{ + Ext.MessageBox.updateProgress(v/10, 'Loading item ' + v + ' of 10...'); + } + }; + }; + for(var i = 1; i < 12; i++){ + setTimeout(f(i), i*1000); + } + }); + + Ext.get('mb7').on('click', function(){ + Ext.MessageBox.alert('Status', 'Changes saved successfully.', showResult); + }); + + + function showResult(btn){ + Ext.example.msg('Button Click', 'You clicked the {0} button', btn); + }; + + function showResultText(btn, text){ + Ext.example.msg('Button Click', 'You clicked the {0} button and entered the text "{1}".', btn, text); + }; +}); \ 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..46ed27259 --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/post.css @@ -0,0 +1,132 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +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 */ +.x-dlg-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..ae564b929 --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/post.js @@ -0,0 +1,162 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +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 = Ext.get('comment'); + commentsList = Ext.get('comments-list'); + postLink = Ext.get('post-comment'); + viewLink = Ext.get('view-comments'); + wait = Ext.get('post-wait'); + error = Ext.get('post-error'); + errorMsg = Ext.get('post-error-msg'); + + this.createDialog(); + + postLink.on('click', function(e){ + e.stopEvent(); + tabs.activate('post-tab'); + dialog.show(postLink); + }); + + viewLink.on('click', function(e){ + e.stopEvent(); + tabs.activate('view-tab'); + dialog.show(viewLink); + }); + }, + + // submit the comment to the server + submitComment : function(){ + postBtn.disable(); + wait.radioClass('active-msg'); + + 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.'); + }; + + Ext.lib.Ajax.formRequest('comment-form', 'post.php', + {success: commentSuccess, failure: commentFailure}); + }, + + createDialog : function(){ + dialog = new Ext.BasicDialog("comments-dlg", { + autoTabs:true, + width:500, + height:300, + shadow:true, + minWidth:300, + minHeight:300 + }); + dialog.addKeyListener(27, dialog.hide, dialog); + postBtn = dialog.addButton('Post', this.submitComment, this); + dialog.addButton('Close', dialog.hide, dialog); + + + // 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 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); + }; +}; + +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..d3381d984 --- /dev/null +++ b/www/extras/yui-ext/examples/examples.css @@ -0,0 +1,51 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +body { + font-family:verdana,tahoma,helvetica; + padding:20px; + padding-top:32px; + font-size:13px; + background-color:#fff !important; +} +p { + margin-bottom:15px; +} +h1 { + font-size:large; + margin-bottom:20px; +} +.example-info{ + 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; +} +.msg .x-box-mc { + font-size:14px; +} +#msg-div { + position:absolute; + left:35%; + top:10px; + width:250px; + z-index:20000; +} diff --git a/www/extras/yui-ext/examples/examples.js b/www/extras/yui-ext/examples/examples.js new file mode 100644 index 000000000..8ddab299e --- /dev/null +++ b/www/extras/yui-ext/examples/examples.js @@ -0,0 +1,112 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.BLANK_IMAGE_URL = '../../resources/images/default/s.gif'; + +Ext.example = function(){ + var msgCt; + + function createBox(t, s){ + return ['
    ', + '
    ', + '

    ', t, '

    ', s, '
    ', + '
    ', + '
    '].join(''); + } + return { + msg : function(title, format){ + if(!msgCt){ + msgCt = Ext.DomHelper.insertFirst(document.body, {id:'msg-div'}, true); + } + msgCt.alignTo(document, 't-t'); + var s = String.format.apply(String, Array.prototype.slice.call(arguments, 1)); + var m = Ext.DomHelper.append(msgCt, {html:createBox(title, s)}, true); + m.slideIn('t').pause(1).ghost("t", {remove:true}); + }, + + init : function(){ + var s = Ext.get('extlib'), t = Ext.get('exttheme'); + if(!s || !t){ // run locally? + return; + } + var lib = Cookies.get('extlib') || 'yahoo', + theme = Cookies.get('exttheme') || 'aero'; + if(lib){ + s.dom.value = lib; + } + if(theme){ + t.dom.value = theme; + Ext.get(document.body).addClass('x-'+theme); + } + s.on('change', function(){ + Cookies.set('extlib', s.getValue()); + setTimeout(function(){ + window.location.reload(); + }, 250); + }); + + t.on('change', function(){ + Cookies.set('exttheme', t.getValue()); + setTimeout(function(){ + window.location.reload(); + }, 250); + }); + } + }; +}(); + +Ext.onReady(Ext.example.init, Ext.example); + + +// old school cookie functions grabbed off the web +var Cookies = {}; +Cookies.set = function(name, value){ + var argv = arguments; + var argc = arguments.length; + var expires = (argc > 2) ? argv[2] : null; + var path = (argc > 3) ? argv[3] : '/'; + var domain = (argc > 4) ? argv[4] : null; + var secure = (argc > 5) ? argv[5] : false; + document.cookie = name + "=" + escape (value) + + ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) + + ((path == null) ? "" : ("; path=" + path)) + + ((domain == null) ? "" : ("; domain=" + domain)) + + ((secure == true) ? "; secure" : ""); +}; + +Cookies.get = function(name){ + var arg = name + "="; + var alen = arg.length; + var clen = document.cookie.length; + var i = 0; + var j = 0; + while(i < clen){ + j = i + alen; + if (document.cookie.substring(i, j) == arg) + return Cookies.getCookieVal(j); + i = document.cookie.indexOf(" ", i) + 1; + if(i == 0) + break; + } + return null; +}; + +Cookies.clear = function(name) { + if(Cookies.get(name)){ + document.cookie = name + "=" + + "; expires=Thu, 01-Jan-70 00:00:01 GMT"; + } +}; + +Cookies.getCookieVal = function(offset){ + var endstr = document.cookie.indexOf(";", offset); + if(endstr == -1){ + endstr = document.cookie.length; + } + return unescape(document.cookie.substring(offset, endstr)); +}; \ No newline at end of file diff --git a/www/extras/yui-ext/examples/examples.jsb b/www/extras/yui-ext/examples/examples.jsb new file mode 100644 index 000000000..6501e9e61 --- /dev/null +++ b/www/extras/yui-ext/examples/examples.jsb @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/www/extras/yui-ext/examples/form/combos.css b/www/extras/yui-ext/examples/form/combos.css new file mode 100644 index 000000000..eeafd9168 --- /dev/null +++ b/www/extras/yui-ext/examples/form/combos.css @@ -0,0 +1,29 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.search-item { + font:normal 11px tahoma, arial, helvetica, sans-serif; + padding:3px 10px 3px 10px; + border:1px solid #fff; + border-bottom:1px solid #eeeeee; + white-space:normal; +} +.search-item h3 { + display:block; + font:inherit; + font-weight:bold; +} + +.search-item h3 span { + float: right; + font-weight:normal; + margin:0 0 5px 5px; + width:100px; + display:block; + clear:none; +} \ No newline at end of file diff --git a/www/extras/yui-ext/examples/form/combos.html b/www/extras/yui-ext/examples/form/combos.html new file mode 100644 index 000000000..d33a6c011 --- /dev/null +++ b/www/extras/yui-ext/examples/form/combos.html @@ -0,0 +1,184 @@ + + + + + Combo Boxes + + + + + + + + + + + + + + + +

    Combo Boxes

    +

    The js is not minified so it is readable. See combos.js.

    + +

    +Data Sources
    +The combo box can use any type of Ext.data.Store as it's data source. + This means your data can be XML, JSON, arrays or any other supported format. It can be loaded using Ajax, script tags or be local. + This combo uses local data from a JS array. +

    +
    + +
    +
    // simple array store
    +var store = new Ext.data.SimpleStore({
    +    fields: ['abbr', 'state'],
    +    data : exampleData
    +});
    +var combo = new Ext.form.ComboBox({
    +    store: store,
    +    displayField:'state',
    +    typeAhead: true,
    +    mode: 'local',
    +    triggerAction: 'all',
    +    emptyText:'Select a state...',
    +    selectOnFocus:true
    +});
    +combo.applyTo('local-states');
    +
    +
    +

    +Unobtrusive
    +The combo box can very easily be used to convert existing select elements into auto-completing, filtering combos. +

    +
    +Transformed select:
    +

    +

    +Originally looked like:
    +

    +
    var converted = new Ext.form.ComboBox({
    +    typeAhead: true,
    +    triggerAction: 'all',
    +    transform:'state',
    +    width:135,
    +    forceSelection:true
    +});
    +
    +
    +

    + Grid Editor
    + Click here to see the combo as a grid editor. +

    +
    +

    + Templates and Ajax
    + Click here for a more advanced example. +

    +



    + + diff --git a/www/extras/yui-ext/examples/form/combos.js b/www/extras/yui-ext/examples/form/combos.js new file mode 100644 index 000000000..31a04db2b --- /dev/null +++ b/www/extras/yui-ext/examples/form/combos.js @@ -0,0 +1,35 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.onReady(function(){ + // simple array store + var store = new Ext.data.SimpleStore({ + fields: ['abbr', 'state'], + data : Ext.exampledata.states // from states.js + }); + var combo = new Ext.form.ComboBox({ + store: store, + displayField:'state', + typeAhead: true, + mode: 'local', + triggerAction: 'all', + emptyText:'Select a state...', + selectOnFocus:true + }); + combo.applyTo('local-states'); + + + + var converted = new Ext.form.ComboBox({ + typeAhead: true, + triggerAction: 'all', + transform:'state', + width:135, + forceSelection:true + }); +}); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/form/dynamic.html b/www/extras/yui-ext/examples/form/dynamic.html new file mode 100644 index 000000000..d1e17bc00 --- /dev/null +++ b/www/extras/yui-ext/examples/form/dynamic.html @@ -0,0 +1,73 @@ + + + + +Forms + + + + + + + + + + + + + + +

    Dynamic Forms built with JavaScript

    +

    + These forms do not do anything and have very little validation. They solely demonstrate + how you can use Ext Forms to build and layout forms on the fly. +

    + +

    The js is not minified so it is readable. See dynamic.js.

    + +
    +
    +
    +

    Simple Form

    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +

    Multi-column and labels top

    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +

    Fieldsets, labels right and complex fields

    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +

    Multi-column, nesting and fieldsets

    +
    + +
    +
    +
    +
    +
    + + diff --git a/www/extras/yui-ext/examples/form/dynamic.js b/www/extras/yui-ext/examples/form/dynamic.js new file mode 100644 index 000000000..5fe529fae --- /dev/null +++ b/www/extras/yui-ext/examples/form/dynamic.js @@ -0,0 +1,285 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.onReady(function(){ + + Ext.QuickTips.init(); + + // turn on validation errors beside the field globally + Ext.form.Field.prototype.msgTarget = 'side'; + + /* + * ================ Simple form ======================= + */ + var simple = new Ext.form.Form({ + labelWidth: 75, // label settings here cascade unless overridden + url:'save-form.php' + }); + simple.add( + new Ext.form.TextField({ + fieldLabel: 'First Name', + name: 'first', + width:175, + allowBlank:false + }), + + new Ext.form.TextField({ + fieldLabel: 'Last Name', + name: 'last', + width:175 + }), + + new Ext.form.TextField({ + fieldLabel: 'Company', + name: 'company', + width:175 + }), + + new Ext.form.TextField({ + fieldLabel: 'Email', + name: 'email', + vtype:'email', + width:175 + }) + ); + + simple.addButton('Save'); + simple.addButton('Cancel'); + + simple.render('form-ct'); + + + /* + * ================ Form 2 ======================= + */ + var top = new Ext.form.Form({ + labelAlign: 'top' + }); + + top.column( + {width:232}, // precise column sizes or percentages or straight CSS + new Ext.form.TextField({ + fieldLabel: 'First Name', + name: 'first', + width:200 + }), + + new Ext.form.TextField({ + fieldLabel: 'Company', + name: 'company', + width:200 + }) + ); + + top.column( + {width:222, style:'margin-left:10px', clear:true}, // apply custom css, clear:true means it is the last column + new Ext.form.TextField({ + fieldLabel: 'Last Name', + name: 'last', + width:200 + }), + + new Ext.form.TextField({ + fieldLabel: 'Email', + name: 'email', + vtype:'email', + width:200 + }) + ); + + top.addButton('Save'); + top.addButton('Cancel'); + + top.render('form-ct2'); + + + /* + * ================ Form 3 ======================= + */ + var fs = new Ext.form.Form({ + labelAlign: 'right', + labelWidth: 75 + }); + + fs.fieldset( + {legend:'Contact Information'}, + new Ext.form.TextField({ + fieldLabel: 'First Name', + name: 'first', + width:190 + }), + + new Ext.form.TextField({ + fieldLabel: 'Last Name', + name: 'last', + width:190 + }), + + new Ext.form.TextField({ + fieldLabel: 'Company', + name: 'company', + width:190 + }), + + new Ext.form.TextField({ + fieldLabel: 'Email', + name: 'email', + vtype:'email', + width:190 + }), + + new Ext.form.ComboBox({ + fieldLabel: 'State', + hiddenName:'state', + store: new Ext.data.SimpleStore({ + fields: ['abbr', 'state'], + data : Ext.exampledata.states // from states.js + }), + displayField:'state', + typeAhead: true, + mode: 'local', + triggerAction: 'all', + emptyText:'Select a state...', + selectOnFocus:true, + width:190 + }), + + new Ext.form.DateField({ + fieldLabel: 'Date of Birth', + name: 'dob', + width:190, + allowBlank:false + }) + ); + + fs.addButton('Save'); + fs.addButton('Cancel'); + + fs.render('form-ct3'); + + /* + * ================ Form 4 ======================= + */ + var form = new Ext.form.Form({ + labelAlign: 'right', + labelWidth: 75 + }); + + form.column({width:342, labelWidth:75}); // open column, without auto close + form.fieldset( + {legend:'Contact Information'}, + new Ext.form.TextField({ + fieldLabel: 'Full Name', + name: 'fullName', + allowBlank:false, + value: 'Jack Slocum' + }), + + new Ext.form.TextField({ + fieldLabel: 'Job Title', + name: 'title', + value: 'Jr. Developer' + }), + + new Ext.form.TextField({ + fieldLabel: 'Company', + name: 'company', + value: 'Ext JS' + }), + + new Ext.form.TextArea({ + fieldLabel: 'Address', + name: 'address', + grow: true, + preventScrollbars:true, + value: '4 Redbulls Drive' + }) + ); + form.fieldset( + {legend:'Phone Numbers'}, + new Ext.form.TextField({ + fieldLabel: 'Home', + name: 'home', + value: '(888) 555-1212' + }), + + new Ext.form.TextField({ + fieldLabel: 'Business', + name: 'business' + }), + + new Ext.form.TextField({ + fieldLabel: 'Mobile', + name: 'mobile' + }), + + new Ext.form.TextField({ + fieldLabel: 'Fax', + name: 'fax' + }) + ); + form.end(); // closes the last container element (column, layout, fieldset, etc) and moves up 1 level in the stack + + + form.column( + {width:202, style:'margin-left:10px', clear:true} + ); + + form.fieldset( + {id:'photo', legend:'Photo'} + ); + form.end(); + + form.fieldset( + {legend:'Options', hideLabels:true}, + new Ext.form.Checkbox({ + boxLabel:'Ext 1.0 User', + name:'extuser' + }), + new Ext.form.Checkbox({ + boxLabel:'Ext Commercial User', + name:'extcomm' + }), + new Ext.form.Checkbox({ + boxLabel:'Ext Premium Member', + name:'extprem' + }), + new Ext.form.Checkbox({ + boxLabel:'Ext Team Member', + name:'extteam', + checked:true + }) + ); + + form.end(); // close the column + + + form.applyIfToFields({ + width:230 + }); + + form.addButton('Save'); + form.addButton('Cancel'); + + form.render('form-ct4'); + + // The form elements are standard HTML elements. By assigning an id (as we did above) + // we can manipulate them like any other element + var photo = Ext.get('photo'); + var c = photo.createChild({ + tag:'center', + cn: { + tag:'img', + src: 'http://extjs.com/forum/image.php?u=2&dateline=1175747336', + style:'margin-bottom:5px;' + } + }); + new Ext.Button(c, { + text: 'Change Photo' + }); +}); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/form/forms.css b/www/extras/yui-ext/examples/form/forms.css new file mode 100644 index 000000000..a2e6a8341 --- /dev/null +++ b/www/extras/yui-ext/examples/form/forms.css @@ -0,0 +1,31 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.calendar .x-menu-item-icon { + background-image:url(../../resources/images/default/shared/calendar.gif); +} + +.search-item { + font:normal 11px tahoma, arial, helvetica, sans-serif; + padding:3px 10px 3px 10px; + border-bottom:1px solid #eeeeee; +} +.search-item h3 { + display:block; + font:inherit; + font-weight:bold; +} + +.search-item h3 span { + float: right; + font-weight:normal; + margin:0 0 5px 5px; + width:100px; + display:block; + clear:none; +} \ No newline at end of file diff --git a/www/extras/yui-ext/examples/form/forms.html b/www/extras/yui-ext/examples/form/forms.html new file mode 100644 index 000000000..b68eb5e4d --- /dev/null +++ b/www/extras/yui-ext/examples/form/forms.html @@ -0,0 +1,147 @@ + + + + +Forms + + + + + + + + + + + + + +

    Forms

    +

    The js is not minified so it is readable. See forms.js.

    + +
    +
    +
    +
    +

    Ext Live Forms

    + +
    +
    + ComboBox Fields + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + Component Fields + +
    + +
    + +
    +
    +
    + +
    + Live Validation and key filtering + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + + diff --git a/www/extras/yui-ext/examples/form/forms.js b/www/extras/yui-ext/examples/form/forms.js new file mode 100644 index 000000000..476f083b9 --- /dev/null +++ b/www/extras/yui-ext/examples/form/forms.js @@ -0,0 +1,69 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.onReady(function(){ + Ext.QuickTips.init(); + + Ext.MessageBox.alert("Warning", "This example is not done and results may vary."); + + // Change field to default to validation message "under" instead of tooltips + Ext.form.Field.prototype.msgTarget = 'under'; + + + var date = new Ext.form.DateField({ + allowBlank:false + }); + + date.applyTo('markup-date'); + + var tranny = new Ext.form.ComboBox({ + typeAhead: true, + triggerAction: 'all', + transform:'light', + width:120, + forceSelection:true + }); + + var required = new Ext.form.TextField({ + allowBlank:false + }); + required.applyTo('required'); + + var alpha = new Ext.form.TextField({ + vtype:'alpha' + }); + alpha.applyTo('alpha'); + + var alpha2 = new Ext.form.TextField({ + vtype:'alpha', + disableKeyFilter:true + }); + alpha2.applyTo('alpha2'); + + var alphanum = new Ext.form.TextField({ + vtype:'alphanum' + }); + alphanum.applyTo('alphanum'); + + var email = new Ext.form.TextField({ + allowBlank:false, + vtype:'email' + }); + email.applyTo('email'); + + var url = new Ext.form.TextField({ + vtype:'url' + }); + url.applyTo('url'); + + var grow = new Ext.form.TextArea({ + width:200, grow:true + }); + grow.applyTo('grow'); + +}); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/form/forum-search.html b/www/extras/yui-ext/examples/form/forum-search.html new file mode 100644 index 000000000..9ac41f295 --- /dev/null +++ b/www/extras/yui-ext/examples/form/forum-search.html @@ -0,0 +1,43 @@ + + + + + ComboBox - Live Search + + + + + + + + + + + + + + +

    + Combo with Templates and Ajax
    + This is a more advanced example that shows how you can combine paging, Ext.Template and a remote data store + to create a "live search" feature. +

    +

    The js is not minified so it is readable. See forum-search.js.

    + + +
    +
    +
    +

    Search the Ext Forums

    + +
    + Live search requires a minimum of 4 characters. +
    +
    +
    +
    + + + diff --git a/www/extras/yui-ext/examples/form/forum-search.js b/www/extras/yui-ext/examples/form/forum-search.js new file mode 100644 index 000000000..0d37b9e71 --- /dev/null +++ b/www/extras/yui-ext/examples/form/forum-search.js @@ -0,0 +1,54 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.onReady(function(){ + + Ext.MessageBox.alert("Sorry", "This example is not compatible with the new site, no longer functions and is for reference only"); + + var ds = new Ext.data.Store({ + proxy: new Ext.data.HttpProxy({ + url: '/forum2/topics-remote.php' + }), + reader: new Ext.data.JsonReader({ + root: 'topics', + totalProperty: 'totalCount', + id: 'post_id' + }, [ + {name: 'title', mapping: 'topic_title'}, + {name: 'topicId', mapping: 'topic_id'}, + {name: 'author', mapping: 'author'}, + {name: 'lastPost', mapping: 'post_time', type: 'date', dateFormat: 'timestamp'}, + {name: 'excerpt', mapping: 'post_text'} + ]) + }); + + // Custom rendering Template + var resultTpl = new Ext.Template( + '
    ', + '

    {lastPost:date("M j, Y")}
    by {author}
    {title}

    ', + '{excerpt}', + '
    ' + ); + + var search = new Ext.form.ComboBox({ + store: ds, + displayField:'title', + typeAhead: false, + loadingText: 'Searching...', + width: 570, + pageSize:10, + hideTrigger:true, + tpl: resultTpl, + onSelect: function(record){ // override default onSelect to do redirect + window.location = + String.format('/forum/viewtopic.php?t={0}#{1}', record.data.topicId, record.id); + } + }); + // apply it to the exsting input element + search.applyTo('search'); +}); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/form/states.js b/www/extras/yui-ext/examples/form/states.js new file mode 100644 index 000000000..c0f7d55fa --- /dev/null +++ b/www/extras/yui-ext/examples/form/states.js @@ -0,0 +1,64 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +// some data used in the examples +Ext.namespace('Ext.exampledata'); + +Ext.exampledata.states = [ + ['AL', 'Alabama'], + ['AK', 'Alaska'], + ['AZ', 'Arizona'], + ['AR', 'Arkansas'], + ['CA', 'California'], + ['CO', 'Colorado'], + ['CN', 'Connecticut'], + ['DE', 'Delaware'], + ['DC', 'District of Columbia'], + ['FL', 'Florida'], + ['GA', 'Georgia'], + ['HW', 'Hawaii'], + ['ID', 'Idaho'], + ['IL', 'Illinois'], + ['IN', 'Indiana'], + ['IA', 'Iowa'], + ['KS', 'Kansas'], + ['KY', 'Kentucky'], + ['LA', 'Louisiana'], + ['MA', 'Maine'], + ['MD', 'Maryland'], + ['MS', 'Massachusetts'], + ['MI', 'Michigan'], + ['MN', 'Minnesota'], + ['MS', 'Mississippi'], + ['MO', 'Missouri'], + ['MT', 'Montana'], + ['NE', 'Nebraska'], + ['NV', 'Nevada'], + ['NH', 'New Hampshire'], + ['NJ', 'New Jersey'], + ['NM', 'New Mexico'], + ['NY', 'New York'], + ['NC', 'North Carolina'], + ['ND', 'North Dakota'], + ['OH', 'Ohio'], + ['OK', 'Oklahoma'], + ['OR', 'Oregon'], + ['PA', 'Pennsylvania'], + ['RH', 'Rhode Island'], + ['SC', 'South Carolina'], + ['SD', 'South Dakota'], + ['TE', 'Tennessee'], + ['TX', 'Texas'], + ['UT', 'Utah'], + ['VE', 'Vermont'], + ['VA', 'Virginia'], + ['WA', 'Washington'], + ['WV', 'West Virginia'], + ['WI', 'Wisconsin'], + ['WY', 'Wyoming'] + ]; \ No newline at end of file diff --git a/www/extras/yui-ext/examples/form/xml-errors.xml b/www/extras/yui-ext/examples/form/xml-errors.xml new file mode 100644 index 000000000..c778e30bf --- /dev/null +++ b/www/extras/yui-ext/examples/form/xml-errors.xml @@ -0,0 +1,17 @@ + + + + + first + This is a test validation message from the server + ]]> + + + dob + This is a test validation message from the server + ]]> + + + \ No newline at end of file diff --git a/www/extras/yui-ext/examples/form/xml-form.html b/www/extras/yui-ext/examples/form/xml-form.html new file mode 100644 index 000000000..a76c56e18 --- /dev/null +++ b/www/extras/yui-ext/examples/form/xml-form.html @@ -0,0 +1,48 @@ + + + +XML Form + + + + + + + + + + + + + + +

    Loading/Saving a Dynamic Form using XML

    +

    + This is a very simple example of using XML for load and submit of data with an Ext dynamic form. +

    +

    + Click "Load" to load the dummy XML data from the server using an XmlReader. +

    +

    + After loading the form, you will be able to hit submit. The submit action will make a post to the server, + and the dummy XML file on the server with test server-side validation failure messages will be sent back. + Those messages will be applied to the appropriate fields in the form. +

    +

    + Note: The built-in JSON support does not require any special readers for mapping. However, If you don't like the Form's built-in JSON format, you could also use a JsonReader for reading data into a form. +

    +

    The js is not minified so it is readable. See xml-form.js.

    + +
    +
    +
    +

    XML Form

    +
    + +
    +
    +
    +
    +
    + + diff --git a/www/extras/yui-ext/examples/form/xml-form.js b/www/extras/yui-ext/examples/form/xml-form.js new file mode 100644 index 000000000..cf53172b8 --- /dev/null +++ b/www/extras/yui-ext/examples/form/xml-form.js @@ -0,0 +1,124 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.onReady(function(){ + + Ext.QuickTips.init(); + + // turn on validation errors beside the field globally + Ext.form.Field.prototype.msgTarget = 'side'; + + var fs = new Ext.form.Form({ + labelAlign: 'right', + labelWidth: 75, + waitMsgTarget: 'box-bd', + + // configure how to read the XML Data + reader : new Ext.data.XmlReader({ + record : 'contact', + success: '@success' + }, [ + {name: 'first', mapping:'name/first'}, // custom mapping + {name: 'last', mapping:'name/last'}, + 'company', 'email', 'state', + {name: 'dob', type:'date', dateFormat:'m/d/Y'} // custom data types + ]), + + // reusable eror reader class defined at the end of this file + errorReader: new Ext.form.XmlErrorReader() + }); + + fs.fieldset( + {legend:'Contact Information'}, + new Ext.form.TextField({ + fieldLabel: 'First Name', + name: 'first', + width:190 + }), + + new Ext.form.TextField({ + fieldLabel: 'Last Name', + name: 'last', + width:190 + }), + + new Ext.form.TextField({ + fieldLabel: 'Company', + name: 'company', + width:190 + }), + + new Ext.form.TextField({ + fieldLabel: 'Email', + name: 'email', + vtype:'email', + width:190 + }), + + new Ext.form.ComboBox({ + fieldLabel: 'State', + hiddenName:'state', + store: new Ext.data.SimpleStore({ + fields: ['abbr', 'state'], + data : Ext.exampledata.states // from states.js + }), + valueField:'abbr', + displayField:'state', + typeAhead: true, + mode: 'local', + triggerAction: 'all', + emptyText:'Select a state...', + selectOnFocus:true, + width:190 + }), + + new Ext.form.DateField({ + fieldLabel: 'Date of Birth', + name: 'dob', + width:190, + allowBlank:false + }) + ); + + // simple button add + fs.addButton('Load', function(){ + fs.load({url:'xml-form.xml', waitMsg:'Loading'}); + }); + + // explicit add + var submit = fs.addButton({ + text: 'Submit', + disabled:true, + handler: function(){ + fs.submit({url:'xml-errors.xml', waitMsg:'Saving Data...'}); + } + }); + + fs.render('form-ct'); + + fs.on({ + actioncomplete: function(form, action){ + if(action.type == 'load'){ + submit.enable(); + } + } + }); + +}); + +// A reusable error reader class for XML forms +Ext.form.XmlErrorReader = function(){ + Ext.form.XmlErrorReader.superclass.constructor.call(this, { + record : 'field', + success: '@success' + }, [ + 'id', 'msg' + ] + ); +}; +Ext.extend(Ext.form.XmlErrorReader, Ext.data.XmlReader); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/form/xml-form.xml b/www/extras/yui-ext/examples/form/xml-form.xml new file mode 100644 index 000000000..9eaa5ee60 --- /dev/null +++ b/www/extras/yui-ext/examples/form/xml-form.xml @@ -0,0 +1,13 @@ + + + + + Jack + Slocum + + Ext JS + support@extjs.com + OH + 04/15/2007 + + \ 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..07587991a --- /dev/null +++ b/www/extras/yui-ext/examples/grid/array-grid.html @@ -0,0 +1,28 @@ + + + +Array Grid Example + + + + + + + + + + + + + + +

    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..784f62dd1 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/array-grid.js @@ -0,0 +1,112 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +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 ds = new Ext.data.Store({ + proxy: new Ext.data.MemoryProxy(myData), + reader: new Ext.data.ArrayReader({}, [ + {name: 'company'}, + {name: 'price', type: 'float'}, + {name: 'change', type: 'float'}, + {name: 'pctChange', type: 'float'}, + {name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'} + ]) + }); + ds.load(); + + // example of custom renderer function + function italic(value){ + return '' + value + ''; + } + + // example of custom renderer function + function change(val){ + if(val > 0){ + return '' + val + ''; + }else if(val < 0){ + return '' + val + ''; + } + return val; + } + // example of custom renderer function + function pctChange(val){ + if(val > 0){ + return '' + val + '%'; + }else if(val < 0){ + return '' + val + '%'; + } + return val; + } + + // the DefaultColumnModel expects this blob to define columns. It can be extended to provide + // custom or reusable ColumnModels + var colModel = new Ext.grid.ColumnModel([ + {header: "Company", width: 160, sortable: true, locked:false, dataIndex: 'company'}, + {header: "Price", width: 75, sortable: true, renderer: Ext.util.Format.usMoney, dataIndex: 'price'}, + {id:'change',header: "Change", width: 75, sortable: true, renderer: change, dataIndex: 'change'}, + {header: "% Change", width: 75, sortable: true, renderer: pctChange, dataIndex: 'pctChange'}, + {header: "Last Updated", width: 85, sortable: true, renderer: Ext.util.Format.dateRenderer('m/d/Y'), dataIndex: 'lastChange'} + ]); + + + // create the Grid + var grid = new Ext.grid.Grid('grid-example', { + ds: ds, + cm: colModel, + autoExpandColumn: 'change' + }); + + var layout = Ext.BorderLayout.create({ + center: { + margins:{left:3,top:3,right:3,bottom:3}, + panels: [new Ext.GridPanel(grid)] + } + }, 'grid-panel'); + + grid.render(); + + + grid.getSelectionModel().selectFirstRow(); + } +}; +Ext.onReady(Example.init, Example); \ 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..0e90ba9ee --- /dev/null +++ b/www/extras/yui-ext/examples/grid/custom-grid.html @@ -0,0 +1,56 @@ + + + +Customizing the Grid + + + + + + + + + + + + + + +

    Property Grid

    + + +
    + + + 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..2324b9ff0 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/custom-grid.js @@ -0,0 +1,8 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + diff --git a/www/extras/yui-ext/examples/grid/details.gif b/www/extras/yui-ext/examples/grid/details.gif new file mode 100644 index 0000000000000000000000000000000000000000..add0ef2acbbdc3def0e84e6e6143d0edc3519020 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|UUMg|5h1|5)1pgh6A(Z?XlA>*-O!NF!$M-7&b z2M@Kd^GWGABrIrf5YP;mqG0Ic!oef1<ENsed*j@4Yk?RR_1qN#XfEb@Q literal 0 HcmV?d00001 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..48acaa162 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/edit-grid.html @@ -0,0 +1,40 @@ + + + +Editor Grid Example + + + + + + + + + + + + + + +

    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..18114af09 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/edit-grid.js @@ -0,0 +1,138 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.onReady(function(){ + + function formatBoolean(value){ + return value ? 'Yes' : 'No'; + }; + + function formatDate(value){ + return value ? value.dateFormat('M d, Y') : ''; + }; + // shorthand alias + var fm = Ext.form, Ed = Ext.grid.GridEditor; + + // the column model has information about grid columns + // dataIndex maps the column to the specific data field in + // the data store (created below) + var cm = new Ext.grid.ColumnModel([{ + header: "Common Name", + dataIndex: 'common', + width: 220, + editor: new Ed(new fm.TextField({ + allowBlank: false + })) + },{ + header: "Light", + dataIndex: 'light', + width: 130, + editor: new Ed(new Ext.form.ComboBox({ + typeAhead: true, + triggerAction: 'all', + transform:'light', + lazyRender:true + })) + },{ + header: "Price", + dataIndex: 'price', + width: 70, + align: 'right', + renderer: 'usMoney', + editor: new Ed(new fm.NumberField({ + allowBlank: false, + allowNegative: false, + maxValue: 10 + })) + },{ + header: "Available", + dataIndex: 'availDate', + width: 95, + renderer: formatDate, + editor: new Ed(new fm.DateField({ + format: 'm/d/y', + minValue: '01/01/06', + disabledDays: [0, 6], + disabledDaysText: 'Plants are not available on the weekends' + })) + },{ + header: "Indoor?", + dataIndex: 'indoor', + width: 55, + renderer: formatBoolean, + editor: new Ed(new fm.Checkbox()) + }]); + + // by default columns are sortable + cm.defaultSortable = true; + + // this could be inline, but we want to define the Plant record + // type so we can add records dynamically + var Plant = Ext.data.Record.create([ + // the "name" below matches the tag name to read, except "availDate" + // which is mapped to the tag "availability" + {name: 'common', type: 'string'}, + {name: 'botanical', type: 'string'}, + {name: 'light'}, + {name: 'price', type: 'float'}, // automatic date conversions + {name: 'availDate', mapping: 'availability', type: 'date', dateFormat: 'm/d/Y'}, + {name: 'indoor', type: 'bool'} + ]); + + // create the Data Store + var ds = new Ext.data.Store({ + // load using HTTP + proxy: new Ext.data.HttpProxy({url: 'plants.xml'}), + + // the return will be XML, so lets set up a reader + reader: new Ext.data.XmlReader({ + // records will have a "plant" tag + record: 'plant' + }, Plant) + }); + + // create the editor grid + var grid = new Ext.grid.EditorGrid('editor-grid', { + ds: ds, + cm: cm, + //selModel: new Ext.grid.RowSelectionModel(), + enableColLock:false + }); + + var layout = Ext.BorderLayout.create({ + center: { + margins:{left:3,top:3,right:3,bottom:3}, + panels: [new Ext.GridPanel(grid)] + } + }, 'grid-panel'); + + + // render it + grid.render(); + + + var gridHead = grid.getView().getHeaderPanel(true); + var tb = new Ext.Toolbar(gridHead, [{ + text: 'Add Plant', + handler : function(){ + var p = new Plant({ + common: 'New Plant 1', + light: 'Mostly Shade', + price: 0, + availDate: new Date(), + indoor: false + }); + grid.stopEditing(); + ds.insert(0, p); + grid.startEditing(0, 0); + } + }]); + + // trigger the data store load + ds.load(); +}); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/grid/from-markup.html b/www/extras/yui-ext/examples/grid/from-markup.html new file mode 100644 index 000000000..812c6a1c5 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/from-markup.html @@ -0,0 +1,64 @@ + + + + +From Markup Grid Example + + + + + + + + + + + +

    From Markup Grid Example

    +

    This example shows how to create a grid with from an existing, unformatted HTML table.

    +

    Note that the js is not minified so it is readable. See from-markup.js.

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameAgeSex
    Barney Rubble32Male
    Fred Flintstone33Male
    Betty Rubble32Female
    Pebbles1Female
    Bamm Bamm2Male
    + + + \ No newline at end of file diff --git a/www/extras/yui-ext/examples/grid/from-markup.js b/www/extras/yui-ext/examples/grid/from-markup.js new file mode 100644 index 000000000..b1d623fbc --- /dev/null +++ b/www/extras/yui-ext/examples/grid/from-markup.js @@ -0,0 +1,90 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.onReady(function() { + var btn = Ext.get("create-grid"); + btn.on("click", function(){ + btn.dom.disabled = true; + + // create the grid + var grid = new Ext.grid.TableGrid("the-table"); + grid.render(); + + }, false, {single:true}); // run once +}); + +/** + * @class Ext.grid.TableGrid + * @extends Ext.grid.Grid + * A Grid which creates itself from an existing HTML table element. + * @constructor + * @param {String/HTMLElement/Ext.Element} table The table element from which this grid will be created - + * The table 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} config A config object that sets properties on this grid and has two additional (optional) + * properties: fields and columns which allow for customizing data fields and columns for this grid. + * @history + * 2007-03-01 Original version by Nige "Animal" White + * 2007-03-10 jvs Slightly refactored to reuse existing classes + */ +Ext.grid.TableGrid = function(table, config) { + config = config || {}; + var cf = config.fields || [], ch = config.columns || []; + table = Ext.get(table); + + var ct = table.insertSibling(); + + var fields = [], cols = []; + var headers = table.query("thead th"); + for (var i = 0, h; h = headers[i]; i++) { + var text = h.innerHTML; + var name = 'tcol-'+i; + + fields.push(Ext.applyIf(cf[i] || {}, { + name: name, + mapping: 'td:nth('+(i+1)+')/@innerHTML' + })); + + cols.push(Ext.applyIf(ch[i] || {}, { + 'header': text, + 'dataIndex': name, + 'width': h.offsetWidth, + 'tooltip': h.title, + 'sortable': true + })); + } + + var ds = new Ext.data.Store({ + reader: new Ext.data.XmlReader({ + record:'tbody tr' + }, fields) + }); + + ds.loadData(table.dom); + + var cm = new Ext.grid.ColumnModel(cols); + + if(config.width || config.height){ + ct.setSize(config.width || 'auto', config.height || 'auto'); + } + if(config.remove !== false){ + table.remove(); + } + + Ext.grid.TableGrid.superclass.constructor.call(this, ct, + Ext.applyIf(config, { + 'ds': ds, + 'cm': cm, + 'sm': new Ext.grid.RowSelectionModel(), + autoHeight:true, + autoWidth:true + } + )); +}; + +Ext.extend(Ext.grid.TableGrid, Ext.grid.Grid); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/grid/grid-examples.css b/www/extras/yui-ext/examples/grid/grid-examples.css new file mode 100644 index 000000000..5f54449d6 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/grid-examples.css @@ -0,0 +1,62 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +#grid-example .x-grid-col-1 { + text-align: right; +} +#grid-example .x-grid-col-2{ + text-align: right; +} +#grid-example .x-grid-col-3 { + text-align: right; +} +#grid-example .x-grid-col-4 { + text-align: right; +} +#grid-example.x-grid-mso{ + border: 1px solid #6593cf; +} +#grid-example.x-grid-vista{ + border: 1px solid #b3bcc0; +} +#xml-grid-example{ + border: 1px solid #cbc7b8; + left: 0; + position: relative; + top: 0; +} +#xml-grid-example.x-grid-mso{ + border: 1px solid #6593cf; +} +#xml-grid-example.x-grid-vista{ + border: 1px solid #b3bcc0; +} +#editor-grid .x-grid-col-2{ + text-align:right; +} +.x-grid-col-topic b { + font-family:tahoma, verdana; + color:#333; + display:block; + padding-left:18px; + line-height:18px; + vertical-align:middle; + background:transparent url(topic.gif) no-repeat left 1px; +} +.x-grid-col-topic b i { + font-weight:normal; + font-style: normal; + color:#000; +} +.details .x-btn-text { + background-image: url(details.gif); +} +.x-resizable-pinned .x-resizable-handle-south{ + background:url(../../resources/images/default/sizer/s-handle-dark.gif); + background-position: top; +} \ No newline at end of file diff --git a/www/extras/yui-ext/examples/grid/paging.html b/www/extras/yui-ext/examples/grid/paging.html new file mode 100644 index 000000000..d6831e42b --- /dev/null +++ b/www/extras/yui-ext/examples/grid/paging.html @@ -0,0 +1,36 @@ + + + + +Paging Grid Example + + + + + + + + + + + + + + +

    Paging Grid Example

    +

    This example shows how to create a grid with paging. This grid uses a ScriptTagProxy to fetch cross-domain + remote data (from the Ext forums).

    +

    Note that the js is not minified so it is readable. See paging.js.

    + +
    +
    +
    +

    Ext - Help Forum

    +
    +
    +
    +
    + + + + diff --git a/www/extras/yui-ext/examples/grid/paging.js b/www/extras/yui-ext/examples/grid/paging.js new file mode 100644 index 000000000..eb6a40fd2 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/paging.js @@ -0,0 +1,130 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.onReady(function(){ + + // create the Data Store + var ds = new Ext.data.Store({ + // load using script tags for cross domain, if the data in on the same domain as + // this page, an HttpProxy would be better + proxy: new Ext.data.ScriptTagProxy({ + url: 'http://www.yui-ext.com/forum2/topics-remote.php' + }), + + // create reader that reads the Topic records + reader: new Ext.data.JsonReader({ + root: 'topics', + totalProperty: 'totalCount', + id: 'topic_id' + }, [ + {name: 'title', mapping: 'topic_title'}, + {name: 'author', mapping: 'username'}, + {name: 'totalPosts', mapping: 'topic_replies', type: 'int'}, + {name: 'lastPost', mapping: 'post_time', type: 'date', dateFormat: 'timestamp'}, + {name: 'lastPoster', mapping: 'user2'}, + {name: 'excerpt', mapping: 'post_text'} + ]), + + // turn on remote sorting + remoteSort: true + }); + ds.setDefaultSort('lastPost', 'desc'); + + // pluggable renders + function renderTopic(value, p, record){ + return String.format('{0}{1}', value, record.data['excerpt']); + } + function renderTopicPlain(value){ + return String.format('{0}', value); + } + function renderLast(value, p, r){ + return String.format('{0}
    by {1}', value.dateFormat('M j, Y, g:i a'), r.data['lastPoster']); + } + function renderLastPlain(value){ + return value.dateFormat('M j, Y, g:i a'); + } + + // the column model has information about grid columns + // dataIndex maps the column to the specific data field in + // the data store + var cm = new Ext.grid.ColumnModel([{ + id: 'topic', // id assigned so we can apply custom css (e.g. .x-grid-col-topic b { color:#333 }) + header: "Topic", + dataIndex: 'title', + width: 420, + renderer: renderTopic, + css: 'white-space:normal;' + },{ + header: "Author", + dataIndex: 'author', + width: 100, + hidden: true + },{ + header: "Total Posts", + dataIndex: 'totalPosts', + width: 70, + align: 'right' + },{ + id: 'last', + header: "Last Post", + dataIndex: 'lastPost', + width: 150, + renderer: renderLast + }]); + + // by default columns are sortable + cm.defaultSortable = true; + + // create the editor grid + var grid = new Ext.grid.Grid('topic-grid', { + ds: ds, + cm: cm, + selModel: new Ext.grid.RowSelectionModel({singleSelect:true}), + enableColLock:false, + loadMask: true + }); + + // make the grid resizable, do before render for better performance + var rz = new Ext.Resizable('topic-grid', { + wrap:true, + minHeight:100, + pinned:true, + handles: 's' + }); + rz.on('resize', grid.autoSize, grid); + + // render it + grid.render(); + + var gridFoot = grid.getView().getFooterPanel(true); + + // add a paging toolbar to the grid's footer + var paging = new Ext.PagingToolbar(gridFoot, ds, { + pageSize: 25, + displayInfo: true, + displayMsg: 'Displaying topics {0} - {1} of {2}', + emptyMsg: "No topics to display" + }); + // add the detailed view button + paging.add('-', { + pressed: true, + enableToggle:true, + text: 'Detailed View', + cls: 'x-btn-text-icon details', + toggleHandler: toggleDetails + }); + + // trigger the data store load + ds.load({params:{start:0, limit:25, forumId: 4}}); + + function toggleDetails(btn, pressed){ + cm.getColumnById('topic').renderer = pressed ? renderTopic : renderTopicPlain; + cm.getColumnById('last').renderer = pressed ? renderLast : renderLastPlain; + grid.getView().refresh(); + } +}); 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..2ab61f036 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/sheldon.xml @@ -0,0 +1,151 @@ + + + + +
    +
    + 18CZWZFXKSV8F601AGMF + + + + + + + + + + 1.05041599273682 +
    + + + True + + Sidney Sheldon + Books + + + 203 + 21 + + 0446355453 + + http://www.amazon.com/gp/redirect.html%3FASIN=0446355453%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446355453%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2 + + + Sidney Sheldon + Warner Books + Book + Master of the Game + + + + 0446613657 + + http://www.amazon.com/gp/redirect.html%3FASIN=0446613657%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446613657%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2 + + + Sidney Sheldon + Warner Books + Book + Are You Afraid of the Dark? + + + + 0446357421 + + http://www.amazon.com/gp/redirect.html%3FASIN=0446357421%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446357421%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2 + + + Sidney Sheldon + Warner Books + Book + If Tomorrow Comes + + + + 0446607207 + + http://www.amazon.com/gp/redirect.html%3FASIN=0446607207%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446607207%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2 + + + Sidney Sheldon + Warner Vision + Book + Tell Me Your Dreams + + + + 0446357448 + + http://www.amazon.com/gp/redirect.html%3FASIN=0446357448%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446357448%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2 + + + Sidney Sheldon + Warner Books + Book + Bloodline + + + + 0446532673 + + http://www.amazon.com/gp/redirect.html%3FASIN=0446532673%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446532673%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2 + + + Sidney Sheldon + Warner Books + Book + The Other Side of Me + + + + 0446356573 + + http://www.amazon.com/gp/redirect.html%3FASIN=0446356573%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446356573%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2 + + + Sidney Sheldon + Warner Books + Book + A Stranger in the Mirror + + + + 0060198346 + + http://www.amazon.com/gp/redirect.html%3FASIN=0060198346%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0060198346%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2 + + + Sidney Sheldon + William Morrow & Company + Book + The Sky Is Falling + + + + 0446354732 + + http://www.amazon.com/gp/redirect.html%3FASIN=0446354732%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446354732%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2 + + + Sidney Sheldon + Warner Books + Book + Nothing Lasts Forever + + + + 0446341916 + + http://www.amazon.com/gp/redirect.html%3FASIN=0446341916%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446341916%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2 + + + Sidney Sheldon + Warner Books + Book + The Naked Face + + + +
    \ No newline at end of file diff --git a/www/extras/yui-ext/examples/grid/topic.gif b/www/extras/yui-ext/examples/grid/topic.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 + + +XML Grid Example + + + + + + + + + + + + + +

    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..292813d3c --- /dev/null +++ b/www/extras/yui-ext/examples/grid/xml-grid.js @@ -0,0 +1,46 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.onReady(function(){ + + // create the Data Store + var ds = new Ext.data.Store({ + // load using HTTP + proxy: new Ext.data.HttpProxy({url: 'sheldon.xml'}), + + // the return will be XML, so lets set up a reader + reader: new Ext.data.XmlReader({ + // records will have an "Item" tag + record: 'Item', + id: 'ASIN', + totalRecords: '@total' + }, [ + // set up the fields mapping into the xml doc + // The first needs mapping, the others are very basic + {name: 'Author', mapping: 'ItemAttributes > Author'}, + 'Title', 'Manufacturer', 'ProductGroup' + ]) + }); + + var cm = new Ext.grid.ColumnModel([ + {header: "Author", width: 120, dataIndex: 'Author'}, + {header: "Title", width: 180, dataIndex: 'Title'}, + {header: "Manufacturer", width: 115, dataIndex: 'Manufacturer'}, + {header: "Product Group", width: 100, dataIndex: 'ProductGroup'} + ]); + cm.defaultSortable = true; + + // create the grid + var grid = new Ext.grid.Grid('example-grid', { + ds: ds, + cm: cm + }); + grid.render(); + + ds.load(); +}); 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..fd2e3bcec --- /dev/null +++ b/www/extras/yui-ext/examples/layout/complex.html @@ -0,0 +1,153 @@ + + + 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.ashx b/www/extras/yui-ext/examples/layout/feed-proxy.ashx new file mode 100644 index 000000000..8211aa13d --- /dev/null +++ b/www/extras/yui-ext/examples/layout/feed-proxy.ashx @@ -0,0 +1 @@ +<%@ WebHandler Language="VB" CodeBehind="feed-proxy.ashx.vb" Class="SendGate.feedproxy1" %> diff --git a/www/extras/yui-ext/examples/layout/feed-proxy.ashx.vb b/www/extras/yui-ext/examples/layout/feed-proxy.ashx.vb new file mode 100644 index 000000000..66e0bae57 --- /dev/null +++ b/www/extras/yui-ext/examples/layout/feed-proxy.ashx.vb @@ -0,0 +1,54 @@ +Imports System.Web +Imports System.Web.Services +Imports System +Imports System.IO +Imports System.Net + +Public Class feedproxy1 + Implements System.Web.IHttpHandler + + Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest + + 'Address of URL + 'Dim URL As String = "http://www.jackslocum.com/yui/feed/" + Dim URL As String = context.Request.Form("feed") + 'Only allow http:// prefix + If IsNothing(URL) Then + Exit Sub + End If + If URL.Substring(0, 7) = "http://" Then + Try + 'Dim enc As Encoding = Encoding.GetEncoding("UTF-8") + Dim enc As Encoding = Encoding.GetEncoding("ISO-8859-1") + + Dim request As HttpWebRequest = WebRequest.Create(URL) + Dim response As HttpWebResponse = request.GetResponse() + Dim reader As StreamReader = New StreamReader(response.GetResponseStream(), enc) + Dim str As String '= reader.ReadLine() + Dim reply As String = "" + 'Do While str.Length > 0 And Not reader.EndOfStream + Do While Not reader.EndOfStream + str = reader.ReadLine() + reply &= str & vbCrLf + 'Console.WriteLine(str) + Loop + context.Response.ContentType = "text/xml" + context.Response.ContentEncoding = enc + context.Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)) + context.Response.Cache.SetCacheability(HttpCacheability.Public) + + context.Response.Write(reply) + Catch ex As Exception + End Try + + End If + + End Sub + + ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable + Get + Return False + End Get + End Property + +End Class \ No newline at end of file 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..8d902ac84 --- /dev/null +++ b/www/extras/yui-ext/examples/layout/feed-viewer.css @@ -0,0 +1,216 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* + * Ext - JS Library 1.0 Alpha 2 + * Copyright(c) 2006-2007, Jack Slocum. + */ + +html, body { + font: normal 9pt tahoma; + margin: 0px; + padding:0px; + border:0px; +} +.x-layout-panel-south{ + background:#c3daf9; + border:0px none; + border-top:1px solid #ddecfe; +} +.x-layout-panel-north, .ytheme-gray .x-layout-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 .x-layout-panel-north{ + border-bottom:2px solid #f3f2e7; +} +.x-layout-panel-hd-text{ + font: bold 11px tahoma,verdana,helvetica; + color:#083772; +} +.ytheme-gray .x-layout-panel-hd-text{ + font: bold 11px tahoma,verdana,helvetica; + color:#333333; +} +#preview-body{ + background:white; +} +#main .x-layout-panel-center{ + border-bottom:1px solid #98c0f4; +} +#preview-body { + padding:10px; + overflow:auto; + line-height: 18px; +} +#preview-body p{ + margin:5px; + margin-bottom:10px; +} +.x-toolbar{ + 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; +} +.add-feed { + background-image: url('images/add-feed.gif'); +} +#myfeeds-body{ + overflow:auto; +} +.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('../../resources/images/default/grid/loading.gif'); + background-repeat: no-repeat; + background-position: left; + padding-left:20px; + padding-top:3px; + height:18px; +} +#status.done { + background-image: url('../../resources/images/default/grid/loading.gif'); +} +.x-layout-collapsed-west{ + background-image:url(images/myfeeds.gif); + background-repeat:no-repeat; + background-position:center; +} +.x-layout-collapsed-east{ + background-image:url(images/suggested.gif); + background-repeat:no-repeat; + background-position:center; +} +#main .x-layout-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..192c0da5c --- /dev/null +++ b/www/extras/yui-ext/examples/layout/feed-viewer.html @@ -0,0 +1,39 @@ + + + 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..0897bbb04 --- /dev/null +++ b/www/extras/yui-ext/examples/layout/feed-viewer.js @@ -0,0 +1,341 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +var Viewer = function(){ + // a bunch of private variables accessible by member function + var layout, statusPanel, south, preview, previewBody, feedPanel; + var grid, ds, 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.getTarget('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 + Ext.state.Manager.setProvider(new Ext.state.CookieProvider()); + + // initialize the add feed overlay and buttons + addFeed = Ext.get('add-feed'); + var addBtn = Ext.get('add-btn'); + addBtn.on('click', this.validateFeed, this); + var closeBtn = Ext.get('add-feed-close'); + closeBtn.on('click', addFeed.hide, addFeed, true); + + // create Elements for the feed and suggested lists + feeds = Ext.get('feeds'), suggested = Ext.get('suggested'); + + // delegate clicks on the lists + feeds.on('click', feedClicked); + suggested.on('click', feedClicked); + + //create feed template + tpl = new Ext.DomHelper.Template('{name}
    {desc}
    '); + + // collection of feeds added by the user + myfeeds = {}; + + // some default feeds + sfeeds = { + '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 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 Ext.ContentPanel('header')); + + // initialize the statusbar + statusPanel = new Ext.ContentPanel('status'); + south = layout.getRegion('south'); + south.add(statusPanel); + + // create the add feed toolbar + var feedtb = new Ext.Toolbar('myfeeds-tb'); + // They can also be referenced by id in or components + feedtb.add( { + id:'add-feed-btn', + icon: 'images/add-feed.gif', // icons can also be specified inline + cls: 'x-btn-text-icon', + text: 'Add feed', + handler: this.showAddFeed.createDelegate(this), + tooltip: 'Add Feed
    Button with tooltip' + }); + + layout.add('west', new Ext.ContentPanel('feeds', {title: 'My Feeds', fitToFrame:true, toolbar: feedtb, resizeEl:'myfeeds-body'})); + layout.add('east', new Ext.ContentPanel('suggested', {title: 'Suggested Feeds', fitToFrame:true})); + + // the inner layout houses the grid panel and the preview panel + var innerLayout = new 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 Ext.NestedLayoutPanel(innerLayout, 'View Feed'); + layout.add('center', feedPanel); + + innerLayout.beginUpdate(); + + var lv = innerLayout.add('center', new Ext.ContentPanel('feed-grid', {title: 'Feed Articles', fitToFrame:true})); + this.createView(lv.getEl()); + + // create the preview panel and toolbar + previewBody = Ext.get('preview-body'); + var tb = new Ext.Toolbar('preview-tb'); + + tb.addButton({text: 'View in New Tab',icon: 'images/new_tab.gif',cls: 'x-btn-text-icon', handler: this.showInTab.createDelegate(this)}); + tb.addSeparator(); + tb.addButton({text: 'View in New Window',icon: 'images/new_window.gif',cls: 'x-btn-text-icon', handler: this.showInWindow.createDelegate(this)}); + + preview = new 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(); + + this.loadFeed('http://feeds.feedburner.com/ajaxian'); + this.changeActiveFeed('ajaxian'); + }, + + createView : function(el){ + function reformatDate(feedDate){ + var d = new Date(Date.parse(feedDate)); + return d ? d.dateFormat('D M j, Y, g:i a') : ''; + } + + var reader = new Ext.data.XmlReader({record: 'item'}, + ['title', {name:'pubDate', type:'date'}, 'link', 'description'] + ); + + ds = new Ext.data.Store({ + proxy: new Ext.data.HttpProxy({ + url: 'feed-proxy.php' + }), + reader : reader + }); + + ds.on('load', this.onLoad, this); + + var tpl = new Ext.Template( + '
    ' + + '
    {title}
    ' + + '
    {date}
    ' + + '{desc}
    ' + ); + + var view = new Ext.View(el, tpl, {store: ds, singleSelect:true, selectedClass:'selected-article'}); + view.prepareData = function(data){ + return { + title: data.title, + date: reformatDate(data.pubDate), + desc: data.description.replace(/<\/?[^>]+>/gi, '').ellipse(350) + + }; + }; + view.on('click', this.showPost, this); + view.on('dblclick', this.showFullPost, this); + }, + + onLoad : function(){ + if(ds.getCount() < 1){ + preview.setContent(''); + } + statusPanel.getEl().addClass('done'); + statusPanel.setContent('Done.'); + }, + + loadFeed : function(feed){ + statusPanel.setContent('Loading feed ' + feed + '...'); + statusPanel.getEl().removeClass('done'); + //ds.load({'feed': feed}); + //cgsktca + ds.load({params:{'feed': feed}}); + }, + + showPost : function(view, dataIndex){ + var node = ds.getAt(dataIndex); + var title = node.data.title; + var link = node.data.link; + var desc = node.data.description; + + currentItem = { + index: dataIndex, link: link + }; + preview.setTitle(title.ellipse(80)); + previewBody.update(desc); + }, + + showFullPost : function(view, rowIndex){ + var node = ds.getAt(rowIndex); + var link = node.data.link; + var title = node.data.title; + + if(!title){ + title = 'View Post'; + } + var iframe = Ext.DomHelper.append(document.body, + {tag: 'iframe', frameBorder: 0, src: link}); + var panel = new 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(btn){ + Ext.get('feed-url').dom.value = ''; + Ext.get('add-title').radioClass('active-msg'); + var el = Ext.get('myfeeds-tb'); + + addFeed.alignTo('myfeeds-tb', 'tl', [3,3]); + addFeed.show(); + }, + + validateFeed : function(){ + var url = Ext.get('feed-url').dom.value; + Ext.get('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]); + + addFeed.hide(); + + + ds.loadData(xml); + this.changeActiveFeed(id); + + }catch(e){ + Ext.get('invalid-feed').radioClass('active-msg'); + } + }.createDelegate(this); + var failure = function(o){ + Ext.get('invalid-feed').radioClass('active-msg'); + }; + Ext.lib.Ajax.request('POST', 'feed-proxy.php', {success:success, failure:failure}, 'feed='+encodeURIComponent(url)); + } + }; +}(); +Ext.onReady(Viewer.init, Viewer); + +String.prototype.ellipse = function(maxLength){ + if(this.length > maxLength){ + return this.substr(0, maxLength-3) + '...'; + } + return this; +}; + 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..3a8602bf09dcd4896bba079c1aa02c0e143d628d GIT binary patch literal 35840 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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/tab-close-on.gif b/www/extras/yui-ext/examples/layout/images/tab-close-on.gif new file mode 100644 index 0000000000000000000000000000000000000000..eacea39b623348f656de9a8f0df4ac4b74ceccbd GIT binary patch literal 880 zcmZ?wbhEHb)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/examples/layout/images/tab-close.gif b/www/extras/yui-ext/examples/layout/images/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/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/images/wait.gif b/www/extras/yui-ext/examples/layout/images/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;HSY^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/layout/nested.html b/www/extras/yui-ext/examples/layout/nested.html new file mode 100644 index 000000000..e974017b8 --- /dev/null +++ b/www/extras/yui-ext/examples/layout/nested.html @@ -0,0 +1,126 @@ + + + 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..dce8333ad --- /dev/null +++ b/www/extras/yui-ext/examples/layout/simple.html @@ -0,0 +1,129 @@ + + + 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/lib.css b/www/extras/yui-ext/examples/lib.css new file mode 100644 index 000000000..ecc847a3f --- /dev/null +++ b/www/extras/yui-ext/examples/lib.css @@ -0,0 +1,20 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +#lib-bar { + position:absolute; + top:0; + right:0; + z-index:100; +} +#lib-bar-inner { + padding:4px; +} +#lib-bar * { + font-size:11px; +} \ No newline at end of file diff --git a/www/extras/yui-ext/examples/locale/create_languages_js.py b/www/extras/yui-ext/examples/locale/create_languages_js.py new file mode 100644 index 000000000..1998a8155 --- /dev/null +++ b/www/extras/yui-ext/examples/locale/create_languages_js.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python + +import sys, os, re + +try: + import chardet +except ImportError: + print "You need universal encoding detector for this script" + print " http://chardet.feedparser.org or apt-get install python-chardet" + sys.exit() + +regexp_language = re.compile("\* +(.+) +translation", re.IGNORECASE) +js_template = """/* This file is automaticly generated by create_language_js.py */ + +// some data used in the examples +Ext.namespace('Ext.exampledata'); + +// TODO: complete and sort the list +Ext.exampledata.languages = [ +%s +]; +""" + +def lang_name(file): + language = os.path.basename(file) + m = regexp_language.search(open(file).read(512)) + if m: + language = m.groups()[0] + return language + +def main(): + base_dir = "../../src/locale" + base_file = lambda f: os.path.join(base_dir, f) + try: + locales = os.listdir(base_dir) + except IOError: + print "Cannot find source locale directory: %s ... exiting" % base_dir + sys.exit() + + valid_file = lambda e: e.endswith(".js") and e.startswith("ext-lang-") + char_set = lambda f: chardet.detect(open(f).read())['encoding'] + lang_code = lambda f: f[9:f.rfind(".js")] + info_set = lambda f: (lang_name(base_file(f)), (lang_code(f), char_set(base_file(f)))) + locales = dict(info_set(file) for file in locales if valid_file(file)) + locale_strarray = ',\n'.join(["\t[%r, %r, %r]" % (code, name, charset) \ + for name, (code, charset) in sorted(locales.items())]) + # create languages.js + open("languages.js", "w").write(js_template % locale_strarray) + +if __name__=="__main__": + main() diff --git a/www/extras/yui-ext/examples/locale/dutch-form.html b/www/extras/yui-ext/examples/locale/dutch-form.html new file mode 100644 index 000000000..cbe2711fd --- /dev/null +++ b/www/extras/yui-ext/examples/locale/dutch-form.html @@ -0,0 +1,41 @@ + + + + + Dutch Form + + + + + + + + + + + + + + + + +

    Localization with Ext

    +

    The js is not minified so it is readable. See dutch-form.js.

    + +

    + This demonstrates a dutch location of Ext using the form component. It includes the localization + file "ext-lang-nl.js" from the source/locale folder of the Ext download. +

    + +
    +
    +
    +

    Persoons Gegevens

    +
    +
    +
    +
    +
    +
    + + diff --git a/www/extras/yui-ext/examples/locale/dutch-form.js b/www/extras/yui-ext/examples/locale/dutch-form.js new file mode 100644 index 000000000..d4b8a7f89 --- /dev/null +++ b/www/extras/yui-ext/examples/locale/dutch-form.js @@ -0,0 +1,76 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.onReady(function(){ + + Ext.QuickTips.init(); + + // turn on validation errors beside the field globally + Ext.form.Field.prototype.msgTarget = 'side'; + + var fs = new Ext.form.Form({ + labelAlign: 'right', + labelWidth: 95 + }); + + fs.fieldset( + {legend:'Contact Informatie'}, + new Ext.form.TextField({ + fieldLabel: 'Voornaam', + name: 'first', + width:190 + }), + + new Ext.form.TextField({ + fieldLabel: 'Achternaam', + name: 'last', + width:190 + }), + + new Ext.form.TextField({ + fieldLabel: 'Bedrijf', + name: 'company', + width:190 + }), + + new Ext.form.TextField({ + fieldLabel: 'E-mail', + name: 'email', + vtype:'email', + width:190 + }), + + new Ext.form.ComboBox({ + fieldLabel: 'Provincie', + hiddenName: 'state', + store: new Ext.data.SimpleStore({ + fields: ['province'], + data : Ext.exampledata.dutch_provinces // from dutch-provinces.js + }), + displayField: 'province', + typeAhead: true, + mode: 'local', + triggerAction: 'all', + emptyText:'Kies uw provincie...', + selectOnFocus:true, + width:190 + }), + + new Ext.form.DateField({ + fieldLabel: 'Geboorte datum', + name: 'dob', + width:190, + allowBlank:false + }) + ); + + fs.addButton('Opslaan'); + fs.addButton('Annuleren'); + + fs.render('form-ct'); +}); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/locale/dutch-provinces.js b/www/extras/yui-ext/examples/locale/dutch-provinces.js new file mode 100644 index 000000000..09019e327 --- /dev/null +++ b/www/extras/yui-ext/examples/locale/dutch-provinces.js @@ -0,0 +1,25 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +// some data used in the examples +Ext.namespace('Ext.exampledata'); + +Ext.exampledata.dutch_provinces = [ + ['Drenthe'], + ['Flevoland'], + ['Friesland'], + ['Gelderland'], + ['Groningen'], + ['Limburg'], + ['Noord-Brabant'], + ['Noord-Holland'], + ['Overijsel'], + ['Utrecht'], + ['Zeeland'], + ['Zuid-Holland'] + ]; diff --git a/www/extras/yui-ext/examples/locale/languages.js b/www/extras/yui-ext/examples/locale/languages.js new file mode 100644 index 000000000..568b96134 --- /dev/null +++ b/www/extras/yui-ext/examples/locale/languages.js @@ -0,0 +1,39 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* This file is automaticly generated by create_language_js.py */ + +// some data used in the examples +Ext.namespace('Ext.exampledata'); + +// TODO: complete and sort the list +Ext.exampledata.languages = [ + ['hr', 'Croatian', 'utf-8'], + ['da', 'Danish', 'utf-8'], + ['nl', 'Dutch', 'ascii'], + ['en', 'English', 'ascii'], + ['fr_CA', 'France (Canadian)', 'UTF-8'], + ['de', 'German', 'ISO-8859-7'], + ['hu', 'Hungarian', 'utf-8'], + ['it', 'Italian', 'ascii'], + ['ja', 'Japanese', 'utf-8'], + ['lv', 'Latvian', 'utf-8'], + ['mk', 'Macedonia', 'utf-8'], + ['no', 'Norwegian', 'utf-8'], + ['pl', 'Polish', 'utf-8'], + ['pt_br', 'Portuguese/Brazil', 'ISO-8859-2'], + ['ro', 'Romanian', 'utf-8'], + ['ru', 'Russian', 'utf-8'], + ['zh_CN', 'Simplified Chinese', 'UTF-8'], + ['sk', 'Slovak', 'windows-1251'], + ['sp', 'Spanish/Latin American', 'utf-8'], + ['sv_se', 'Swedish', 'UTF-8'], + ['zh_TW', 'Traditional Chinese', 'UTF-8'], + ['tr', 'Turkish', 'utf-8'], + ['vn', 'Vietnamese', 'UTF-8'] +]; diff --git a/www/extras/yui-ext/examples/locale/multi-lang.html b/www/extras/yui-ext/examples/locale/multi-lang.html new file mode 100644 index 000000000..3bee7ceb4 --- /dev/null +++ b/www/extras/yui-ext/examples/locale/multi-lang.html @@ -0,0 +1,78 @@ + + + + +Multiple Languages + + + + + + + + + + + + + + + +

    Localization with Extjs

    +

    The js is not minified so it is readable. See multi-lang.js.

    + +

    +This demonstrates multiple language with some of the Ext components.
    +Select a language from the combobox below (default is english) and try out the components in different languages. +

    + +
    + Language selector:  + +
    +
    +

    Email Field

    +

    +
    +
    +
    +

    Localized Email Field

    +
    +
    +
    +
    +
    +

    Datepicker

    +
    +
    +
    +
    +

    Localized Datepicker

    +
    +
    +
    +
    +
    +

    Grid

    +
    +
    +
    +
    +

    Localized Grid

    +
    +
    +
    +
    +
    +
    + + diff --git a/www/extras/yui-ext/examples/locale/multi-lang.js b/www/extras/yui-ext/examples/locale/multi-lang.js new file mode 100644 index 000000000..eb8f5c3f6 --- /dev/null +++ b/www/extras/yui-ext/examples/locale/multi-lang.js @@ -0,0 +1,166 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* Fix for Opera, which does not seem to include the map function on Array's */ +if(!Array.prototype.map){ + Array.prototype.map = function(fun){ + var len = this.length; + if(typeof fun != "function"){ + throw new TypeError(); + } + var res = new Array(len); + var thisp = arguments[1]; + for(var i = 0; i < len; i++){ + if(i in this){ + res[i] = fun.call(thisp, this[i], i, this); + } + } + return res; + }; +} + +/* Paging Memory Proxy, allows to use paging grid with in memory dataset */ +Ext.data.PagingMemoryProxy = function(data) { + Ext.data.PagingMemoryProxy.superclass.constructor.call(this); + this.data = data; +}; + +Ext.extend(Ext.data.PagingMemoryProxy, Ext.data.MemoryProxy, { + load : function(params, reader, callback, scope, arg) { + params = params || {}; + var result; + try { + result = reader.readRecords(this.data); + }catch(e){ + this.fireEvent("loadexception", this, arg, null, e); + callback.call(scope, null, arg, false); + return; + } + if ( (params.start!==undefined) && (params.limit!==undefined) ) { + result.records = result.records.slice(params.start, params.start+params.limit); + } + callback.call(scope, result, arg, true); + } +}); + +/* multi-lang.js extscript */ +Ext.onReady(function(){ + Ext.QuickTips.init(); + Ext.form.Field.prototype.msgTarget = 'side'; + + /* Language chooser combobox */ + var store = new Ext.data.SimpleStore({ + fields: ['code', 'language', 'charset'], + data : Ext.exampledata.languages // from languages.js + }); + var combo = new Ext.form.ComboBox({ + store: store, + displayField:'language', + typeAhead: true, + mode: 'local', + triggerAction: 'all', + emptyText:'Select a language...', + selectOnFocus:true, + onSelect: function(record) { + window.location.search = Ext.urlEncode({"lang":record.get("code"),"charset":record.get("charset")}); + } + }); + combo.applyTo('languages'); + + // get the selected language code parameter from url (if exists) + var params = Ext.urlDecode(window.location.search.substring(1)); + if (params.lang) { + // check if there's really a language with that language code + record = store.data.find(function(item, key) { + if (item.data.code==params.lang){ + return true; + } + }); + // if language was found in store assign it as current value in combobox + if (record) { + combo.setValue(record.data.language); + } + } + + /* Email field */ + var efield = new Ext.form.Form({ labelWidth: 75 }); + efield.add(new Ext.form.TextField({ + fieldLabel: 'Email', + name: 'email', + vtype: 'email', + width: 175 + })); + efield.render('form-ct'); + + /* Datepicker */ + var efield = new Ext.form.Form({ labelWidth: 75 }); + efield.add(new Ext.form.DateField({ + fieldLabel: 'Date', + name: 'date', + width: 175 + })); + efield.render('form-ct2'); +}); + +Ext.onReady(function(){ + // shorthand alias + var fm = Ext.form, Ed = Ext.grid.GridEditor; + // the column model has information about grid columns + // dataIndex maps the column to the specific data field in + // the data store (created below) + var cm = new Ext.grid.ColumnModel([{ + header: "Months of the year", + dataIndex: 'month', + editor: new Ed(new fm.TextField({ + allowBlank: false + })), + width: 240 + }]); + + // by default columns are sortable + cm.defaultSortable = true; + + var monthArray = Date.monthNames.map(function (e) { return [e]; }); + + // create the Data Store + var ds = new Ext.data.Store({ + proxy: new Ext.data.PagingMemoryProxy(monthArray), + reader: new Ext.data.ArrayReader({}, [ + {name: 'month'} + ]) + }); + + // create the editor grid + var grid = new Ext.grid.EditorGrid('editor-grid', { + ds: ds, + cm: cm, + selModel: new Ext.grid.RowSelectionModel(), + enableColLock:false + }); + + var layout = Ext.BorderLayout.create({ + center: { + margins:{left:3,top:3,right:3,bottom:3}, + panels: [new Ext.GridPanel(grid)] + } + }, 'grid-panel'); + + // render it + grid.render(); + + var gridFoot = grid.getView().getFooterPanel(true); + + // add a paging toolbar to the grid's footer + var paging = new Ext.PagingToolbar(gridFoot, ds, { + pageSize: 6, + displayInfo: false + }); + + // trigger the data store load + ds.load({params:{start:0, limit:6}}); +}); diff --git a/www/extras/yui-ext/examples/menu/list-items.gif b/www/extras/yui-ext/examples/menu/list-items.gif new file mode 100644 index 0000000000000000000000000000000000000000..ecbdfc9df60fc37d02b95698e574baa8a3e01a90 GIT binary patch literal 1044 zcmeIx+fPyf00!{mVvTYZtJYRornTy!HSH?t0~L|vtXw|m))G^ZBm9JCATp%Tai`VeuG7^iXJt_-g*knby4mfmAh9B>I~gK# z*(n2L7@CHMr#+)4kYJ2vYzTD+51@1)IZwECuOKGUGiGu)3FhkR28tJ5+A`AmLx z#B4__^N7Xahguzobpf$CkhujE`h!7E)b7OWi|D)yb1b5cMQp)^{c&RpZrr(qQw|H| zgcg@D7mT}Me940^dkNS}czlEhA-pJoV1y4P5kHJXaT3Ex+>aoM6%;{IlpjR_|MM>k zgd(&600;v1uas6k0nlB*HhOSO3vbny2ws|+mr_znXY2?LzrY89EwR@OidK=fGH7df z!gJQlm9G0iA)JQ9Y}Wd?@YIYhwoV_$zK_ywDmgvnhwBf--Ojtn2-z2P9kN@#FFN@3&g*~w|NjTej1r?EFw8?h@h1y2 z0|PUI4#=ONJi)+G#K6uY;IJXVv5|w7OXI+XL`FtVK|L0SiH{CA0xSz|6qG zCNa~%fst8(e@Tesf+wC`TH)JVGK8KUpCO;l#S`#B&7;eT{lgYcVFpG<$4V)Y4~8k1 hCL0DnE6H52=qj^+pj+?Ek|o#Is~C3qN(eAm0{}C;ISc>* literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/menu/menus.css b/www/extras/yui-ext/examples/menu/menus.css new file mode 100644 index 000000000..66de76fb3 --- /dev/null +++ b/www/extras/yui-ext/examples/menu/menus.css @@ -0,0 +1,17 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +#container { + width:600px; + height:300px; + border:3px solid #c3daf9; +} + +.calendar .x-menu-item-icon { + background-image:url(../../resources/images/default/shared/calendar.gif); +} \ No newline at end of file diff --git a/www/extras/yui-ext/examples/menu/menus.html b/www/extras/yui-ext/examples/menu/menus.html new file mode 100644 index 000000000..7c61eb35b --- /dev/null +++ b/www/extras/yui-ext/examples/menu/menus.html @@ -0,0 +1,45 @@ + + + + +Toolbar with Menus + + + + + + + + + + + + + + + +

    Toolbar with Menus

    +

    The js is not minified so it is readable. See menus.js.

    + +
    +
    +
    + +




    + + diff --git a/www/extras/yui-ext/examples/menu/menus.js b/www/extras/yui-ext/examples/menu/menus.js new file mode 100644 index 000000000..bf3154c31 --- /dev/null +++ b/www/extras/yui-ext/examples/menu/menus.js @@ -0,0 +1,174 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.onReady(function(){ + Ext.QuickTips.init(); + + // Menus can be prebuilt and passed by reference + var dateMenu = new Ext.menu.DateMenu({ + handler : function(dp, date){ + Ext.example.msg('Date Selected', 'You chose {0}.', date.format('M j, Y')); + } + }); + + // Menus can be prebuilt and passed by reference + var colorMenu = new Ext.menu.ColorMenu({ + handler : function(cm, color){ + Ext.example.msg('Color Selected', 'You chose {0}.', color); + } + }); + + var menu = new Ext.menu.Menu({ + id: 'mainMenu', + items: [ + new Ext.menu.CheckItem({ + text: 'I like Ext', + checked: true, + checkHandler: onItemCheck + }), + new Ext.menu.CheckItem({ + text: 'Ext for jQuery', + checked: true, + checkHandler: onItemCheck + }), + new Ext.menu.CheckItem({ + text: 'I donated!', + checked:false, + checkHandler: onItemCheck + }), '-', { + text: 'Radio Options', + menu: { // <-- submenu by nested config object + items: [ + // stick any markup in a menu + 'Choose a Theme', + new Ext.menu.CheckItem({ + text: 'Aero Glass', + checked: true, + group: 'theme', + checkHandler: onItemCheck + }), + new Ext.menu.CheckItem({ + text: 'Vista Black', + group: 'theme', + checkHandler: onItemCheck + }), + new Ext.menu.CheckItem({ + text: 'Gray Theme', + group: 'theme', + checkHandler: onItemCheck + }), + new Ext.menu.CheckItem({ + text: 'Default Theme', + group: 'theme', + checkHandler: onItemCheck + }) + ] + } + },{ + text: 'Choose a Date', + cls: 'calendar', + menu: dateMenu // <-- submenu by reference + },{ + text: 'Choose a Color', + menu: colorMenu // <-- submenu by reference + } + ] + }); + + var tb = new Ext.Toolbar('toolbar'); + tb.add({ + cls: 'x-btn-text-icon bmenu', // icon and text class + text:'Button w/ Menu', + menu: menu // assign menu by instance + }, + new Ext.Toolbar.MenuButton({ + text: 'Split Button', + handler: onButtonClick, + tooltip: {text:'This is a QuickTip with autoHide set to false and a title', title:'Tip Title', autoHide:false}, + cls: 'x-btn-text-icon blist', + // Menus can be built/referenced by using nested menu config objects + menu : {items: [ + {text: 'Bold', handler: onItemClick}, + {text: 'Italic', handler: onItemClick}, + {text: 'Underline', handler: onItemClick}, '-',{ + text: 'Pick a Color', handler: onItemClick, menu: { + items: [ + new Ext.menu.ColorItem({selectHandler:function(cp, color){ + Ext.example.msg('Color Selected', 'You chose {0}.', color); + }}), '-', + {text:'More Colors...', handler:onItemClick} + ] + }}, + {text: 'Extellent!', handler: onItemClick} + ]} + }), '-', { + text: 'Toggle Me', + enableToggle: true, + toggleHandler: onItemToggle, + pressed: true + }); + + menu.addSeparator(); + // Menus have a rich api for + // adding and removing elements dynamically + var item = menu.add({ + text: 'Dynamically added Item' + }); + // items support full Observable API + item.on('click', onItemClick); + + // items can easily be looked up + menu.add({ + text: 'Disabled Item', + id: 'disableMe' // <-- Items can also have an id for easy lookup + // disabled: true <-- allowed but for sake of example we use long way below + }); + // access items by id or index + menu.items.get('disableMe').disable(); + + // They can also be referenced by id in or components + tb.add('-', { + icon: 'list-items.gif', // icons can also be specified inline + cls: 'x-btn-icon', + tooltip: 'Quick Tips
    Icon only button with tooltip' + }, '-'); + + // add a combobox to the toolbar + var store = new Ext.data.SimpleStore({ + fields: ['abbr', 'state'], + data : Ext.exampledata.states // from states.js + }); + var combo = new Ext.form.ComboBox({ + store: store, + displayField:'state', + typeAhead: true, + mode: 'local', + triggerAction: 'all', + emptyText:'Select a state...', + selectOnFocus:true, + width:135 + }); + tb.addField(combo); + + // functions to display feedback + function onButtonClick(btn){ + Ext.example.msg('Button Click','You clicked the "{0}" button.', btn.text); + } + + function onItemClick(item){ + Ext.example.msg('Menu Click', 'You clicked the "{0}" menu item.', item.text); + } + + function onItemCheck(item, checked){ + Ext.example.msg('Item Check', 'You {1} the "{0}" menu item.', item.text, checked ? 'checked' : 'unchecked'); + } + + function onItemToggle(item, pressed){ + Ext.example.msg('Button Toggled', 'Button "{0}" was toggled to {1}.', item.text, pressed); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/resizable/basic.css b/www/extras/yui-ext/examples/resizable/basic.css new file mode 100644 index 000000000..7a2640cab --- /dev/null +++ b/www/extras/yui-ext/examples/resizable/basic.css @@ -0,0 +1,40 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +#basic, #animated { + border:1px solid #c3daf9; + color:#1e4e8f; + font:bold 14px tahoma,verdana,helvetica; + text-align:center; + padding-top:20px; + width:200px; + height:80px; +} +#snap { + border:1px solid #c3daf9; + overflow:hidden; +} +#custom { + cursor:move; +} +#custom-rzwrap{ + z-index: 10000; +} +#custom-rzwrap .x-resizable-handle{ + width:11px; + height:11px; + background:transparent url(../../resources/images/sizer/square.gif) no-repeat; + margin:0px; + line-height:11px; +} +#custom-rzwrap .x-resizable-handle-east, #custom-rzwrap .x-resizable-handle-west{ + top:45%; +} +#custom-rzwrap .x-resizable-handle-north, #custom-rzwrap .x-resizable-handle-south{ + left:45%; +} \ No newline at end of file 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..11a044c78 --- /dev/null +++ b/www/extras/yui-ext/examples/resizable/basic.html @@ -0,0 +1,180 @@ + + + +Resizable Examples + + + + + + + + + + + + + +

    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 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 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 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 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 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 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 Ext.Resizable('animated', {
    +    width: 200,
    +    height: 100,
    +    minWidth:100,
    +    minHeight:50,
    +    animate:true,
    +    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..654d346c9 --- /dev/null +++ b/www/extras/yui-ext/examples/resizable/basic.js @@ -0,0 +1,92 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +var ResizableExample = { + init : function(){ + + var basic = new Ext.Resizable('basic', { + width: 200, + height: 100, + minWidth:100, + minHeight:50 + }); + + var animated = new Ext.Resizable('animated', { + width: 200, + pinned: true, + height: 100, + minWidth:100, + minHeight:50, + animate:true, + easing: 'backIn', + duration:.6 + }); + + var wrapped = new Ext.Resizable('wrapped', { + wrap:true, + pinned:true, + minWidth:50, + minHeight: 50, + preserveRatio: true + }); + + var transparent = new Ext.Resizable('transparent', { + wrap:true, + minWidth:50, + minHeight: 50, + preserveRatio: true, + transparent:true + }); + + var custom = new Ext.Resizable('custom', { + wrap:true, + pinned:true, + minWidth:50, + minHeight: 50, + preserveRatio: true, + handles: 'all', + draggable:true, + dynamic:true + }); + var customEl = custom.getEl(); + // move to the body to prevent overlap on my blog + document.body.insertBefore(customEl.dom, document.body.firstChild); + + customEl.on('dblclick', function(){ + customEl.hide(true); + }); + customEl.hide(); + + Ext.get('showMe').on('click', function(){ + customEl.center(); + customEl.show(true); + }); + + var dwrapped = new Ext.Resizable('dwrapped', { + wrap:true, + pinned:true, + width:450, + height:150, + minWidth:200, + minHeight: 50, + dynamic: true + }); + + var snap = new Ext.Resizable('snap', { + pinned:true, + width:250, + height:100, + handles: 'e', + widthIncrement:50, + minWidth: 50, + dynamic: true + }); + } +}; + +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/shared/icons/arrow-down.gif b/www/extras/yui-ext/examples/shared/icons/arrow-down.gif new file mode 100644 index 0000000000000000000000000000000000000000..954a505dda32d6731aa5b3c5be617e175a813047 GIT binary patch literal 881 zcmZ?wbhEHb6krfwXlGzB2v}ec0Yn=d5;izw0MUVff&&2+Ky)FX;sL{dhJc0#0Ubc} zA)(_!!h{bA6aE)Wcu+6{h&~i70HXg5EB-fZ_&))NcKly(;6KAC7!84;69S4qS(q6Z zxEORmP6p)(1`a<4Q4Sf84GRu7a|mn2SWIYY;oy_enX*8UnT?rSIb*|zh67IQ;tD1b t6D}mO^l>xre5m+vpoNP^K!jmIz=0+fV@WOzfrf<+jCRdjyix)T)&M#rN!( 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/examples/shared/icons/fam/SILK.txt b/www/extras/yui-ext/examples/shared/icons/fam/SILK.txt new file mode 100644 index 000000000..5584ada41 --- /dev/null +++ b/www/extras/yui-ext/examples/shared/icons/fam/SILK.txt @@ -0,0 +1,3 @@ +The icons in this folder are direct gif conversions of the fam fam fam silk icons. + +Please see http://www.famfamfam.com/lab/icons/silk/ for more details. \ No newline at end of file diff --git a/www/extras/yui-ext/examples/shared/icons/fam/add.gif b/www/extras/yui-ext/examples/shared/icons/fam/add.gif new file mode 100644 index 0000000000000000000000000000000000000000..93195256dc0abb6a451c41be3cba50fabb28781f GIT binary patch literal 994 zcmZ?wbhEHb6krfwXlG!sZ8LT1HFNH_aOtsj?X~gjxA*9E^z3&Ep6U}i%{O4CWB5GR zxH(~o^CD6fgr+PAPg@j`zBoE{b!f)w;OtcqS!<$mRz>A)jmQU~$dc{RCEH^Pc0?BK zj4s|4Q@Ag_Y)yK_x{UHY2^CvX>NjQ8>`JNKlUBPgy>f3}?ar*)o!Rv}a~=LW6dX*h zJeX2-EW74#cHP0uy5spxTl1Q?=Cy4v?ATG>v%9QoXJzNUir#(IllRv*o+)iRS=Dy3 zruA%P*P+V(L$#eJ>buU@PTk+sbGotbOiSOT=1E5zrXFaTe!O-1nbyf?J7%12n{lRn z#+k0!2dB?IIAhA?u4$J$r(WrrcBOmz)$W-WyXW4RwB+2BW#^|YyD)9R&8Z7+PFs3= z_Nps$S6`X4?8JiQCl{{2zjXcmWt(p<-2z0nmTkJdV)NaVTW_z}erwg1yQ{X|U$gD* znjKfy@3^~u_nq~-u5H}@VEw*F+x9-$cI3{Eqjz^6eR1IQv%}|Jp1kt<{PlO2?tHxQ z;M1M||Nk?Lf&mQy#h)z93=BFz2n3)!!N9SfA(BJJW5a@j)}C2s4k#Xfa6mTl)0>OT z>8>2@=8t}?e7y9ugpGrO$eoSL_{G%RRs~oZxx2PBmQDHaP|5Yge0%$Z6B(NwdK{GU zPKbPLe3Zs2D7Q`_Q(*#|thQ~Q*Wbg6$EGtec`lJWl>EwVMicT~*I!ki1b6H6&Jl5GM`0wyURsET+-b-EmSNeu8P0U}Ln7y;Le`DwH(cbZ`gX3FA z=XXvn@0?xVySTr1^L+2_^~u%!gPX?(5ARPt{$D)2zIpk4@eTOu7w|na{A*amx6p`h zVUgb=qP|5$e~XO%78Ub7I`&(1-1nHc{~_W3!y^AjME?hJV-vo|C;o^_{1Kn@D>3;; zV#<%ClwV1yzmn5_rKJB)O8%Le@jpG|XGYfV%$#3YxxaGqe&^=@2ayGTatr?F75pzK z{9jP?zo7VUVacE3vj2r8|B6cg7nS@iDgR$m_OGn+KM<7zQPuy->c5pW|3RqsUsdgY zAgZqWUsLz5uJM0e!+#*z)b_u$nBtN*a{ZK9ZJWih_ZA#9K3X-%|X;+(UKVf6WS+gJH;&6agc?zrP;VFWa1;2 zlO60Fj2#t4hmHucTQatI1T`Ju=d^S@qQSJJy^n{Tudcyxi8C{cct(Ojz=gxy@-h+} mIs%Svt&A+D8*Xf9SkS;C#v!s~!GQ#ZosOShu?h$`0ubQ$Yg)8)xI#xeK8LEV;m0p8XpNTIS^`lAkzL!kj({u zyW3&j*JA?@rTZL7@j0FyayB9GTvEuHw9u2;VP`WUt|f$A%S*YPnR+KX<6d^woxIE| zg{gNditkmHJPY%A7UAlI>^%bAW zlRsA`ziO_1*HZhwt?pe{>9?kgZ!I|=S_?ijSAXa!|JYacqpjdaPuYiw_1`DfeV<(S zb5h-}$@M>`)ZbY)?auP)?|K^FPVRd*ssBq~sLL|Nji5U@(P% z;!hT4kb87M1Sn51aO`4Ww_yhq8#fCULHB56%)3>aIyn;H1jHEskh_2Ok_k>R?-q}a&79%Rz3CLzFJ F4FJtTGqV5y literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/shared/icons/fam/plugin.gif b/www/extras/yui-ext/examples/shared/icons/fam/plugin.gif new file mode 100644 index 0000000000000000000000000000000000000000..209c121c5a0000353a9ee0effdddf71e23e57075 GIT binary patch literal 988 zcmZ?wbhEHb6krfwXlG!s?X|S;vvQnZ<2b?AX`-#uBs=ag=Hxlu z#doTg*GyNxxgP%WJcH-^1upOoTIdtH#6NO*P}Iuc*wtZiYr`YA`bTdIjNKj-zauzt zeN@t#nB=vwsaxU_c7`VI3`^VWj7E-rtOYO+Z~&+CpvRaZ06qBti5qL`{Hx9 zrsi%<%iWfmwIeBeXL9!5q}=@pd3#dx_on6VPc7V)S-LmZ;lD%vfuzENDTN2piVmh0 z9|EHEqJx>`hcn9$`8ctL+ovvs)ThV^Hvh`$5%Za+y6LrlOD%(#rbbwG}=c%U7Q_Wqco4e06 z_nc|zJ=@xMwr#@sj)~_xCY|q^e7<|i`K~GFyQc!tg`Q~_d#7FKpMI%#`t|-97yD;k znlR_eK6#ra)z!Eia%o2kk0#u5WVrWQ8Im<=(S3KQ6Pl+ryqZcJcop2o+`!6Lxn+$*V& ze5mGO(Ic*=Cizn>0+*c*G4uP);?OvuxL%x-Nz}lSX~665Id) literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/shared/icons/fam/plugin_add.gif b/www/extras/yui-ext/examples/shared/icons/fam/plugin_add.gif new file mode 100644 index 0000000000000000000000000000000000000000..5c95312bcdf1e76fdd74228494ddc1979a8da15d GIT binary patch literal 1010 zcmZ?wbhEHb6krfwXlGzB&z7{#m$NNUu&LE@ELQcYHgs(@3+~Yf@7Hyi?BF)d(S4ee z*GyNxxgP%WJfqv4V>?}g=lcaN@D5t&6S~Ada(PhH%HY`5VR382qqhadZV!sz5uDcN zpFce+aZy0x`l#f!vAHYbQn$n<>EgOmC3UAu8doQ_?@ValmC(H_ zsdraO&z{u&J?Z_svl`BpHk>PKJXh9mqN3?^Mbp`e_S2QECu^E7R8CyiIAudi$Ek*n zQ;nUcnmSK4cb#tTKGWQDrlt36Yv0+n3FkW|p6{4+zH9RN?kVTHrkwAd3Pcxrrd{lv zcAePkTr!Blbec|<4i>}XDbYuFW8#5N)n7QP} z%w;!cFTXiw_ z{M^Rd*5vu`#YLqj?EDJ0w<0tuT26>r+m-D|n8?K2!^tZluqCkFjayX1>yCo(vu>s) z;|FUz5|dim1Y|923=}rB^(bZgO}R1QAhWP@$1;T%i=5k}O&!lokz{5&w7{uzk%!;{ zXBR1P*7|-z{1Supvdx+A-27r0FWG30+dC69aN;JOL_&~F2(scw=8lWm6vCV~i)r>G#TFK0w}Qpo zEhHyt*3;t3@jys9BEo^qqzPNefK3XE@uLt#m{O~C)-r!Xemp$I`&RD{-p#Fh?#+$` zEU*Xi*ba1@z;UqyA#^d)@i7XpLorem 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..8bb27c2b4 --- /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 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-adv.html b/www/extras/yui-ext/examples/tabs/tabs-adv.html new file mode 100644 index 000000000..1c965675e --- /dev/null +++ b/www/extras/yui-ext/examples/tabs/tabs-adv.html @@ -0,0 +1,35 @@ + + + +Tabs Example + + + + + + + + + + + + + +

      Tab Panel Example 2

      +

      Note that the js and css is not minified so it is readable. See tabs-adv.js for the tab creation code +and tabs-example.css for the css.

      + +

      Closable tabs with auto tab resize turned on.



      +
      +
      + Add a new Tab +
      +
      +

      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.

      +
      +
      +
      + + \ No newline at end of file diff --git a/www/extras/yui-ext/examples/tabs/tabs-adv.js b/www/extras/yui-ext/examples/tabs/tabs-adv.js new file mode 100644 index 000000000..75c56fecc --- /dev/null +++ b/www/extras/yui-ext/examples/tabs/tabs-adv.js @@ -0,0 +1,29 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.onReady(function(){ + var tabs = new Ext.TabPanel('tab-panel1', { + resizeTabs:true, // turn on tab resizing + minTabWidth: 20, + preferredTabWidth:150 + }); + + tabs.addTab('root-tab', 'Home Tab'); + tabs.activate(0); + + var content = Ext.getDom('content').innerHTML; // bogus markup for tabs + var index = 0; + Ext.get('add-link').on('click', function(){ + tabs.addTab( + Ext.id(), + 'New Tab ' + (++index), + 'Tab Body ' + index + content, + true + ); + }); +}); \ No newline at end of file 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..1cdd15259 --- /dev/null +++ b/www/extras/yui-ext/examples/tabs/tabs-example.css @@ -0,0 +1,36 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.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 .x-tabs-item-body {display:none;padding:10px;} + +#jtabs {width:600px;} +#jtabs .x-tabs-body {height:200px;overflow:auto;} +#jtabs .x-tabs-item-body {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; +} + +#tab-panel1 .x-tabs-body {height:300px;overflow:auto;} +#tab-panel1 .x-tabs-item-body {padding:10px;} \ 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..aafc96579 --- /dev/null +++ b/www/extras/yui-ext/examples/tabs/tabs-example.js @@ -0,0 +1,41 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +var TabsExample = { + init : function(){ + // basic tabs 1, built from existing content + var tabs = new Ext.TabPanel('tabs1'); + tabs.addTab('script', "View Script"); + tabs.addTab('markup', "View Markup"); + tabs.activate('script'); + + // second tabs built from JS + var jtabs = new 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.on('activate', 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.on('activate', 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'); + } +} +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..e112f4d7c --- /dev/null +++ b/www/extras/yui-ext/examples/tabs/tabs.html @@ -0,0 +1,75 @@ + + + + + Tabs Example + + + + + + + + + + + + + + + + + + +

      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 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/examples/tree/Thumbs.db b/www/extras/yui-ext/examples/tree/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..e1532821827454e0cee826da3094a9e6e3a0dd03 GIT binary patch literal 4096 zcmca`Uhu)fjZzO8(10BSGsD0CoD6J8;*3Bx2!nwD0|OI~0pkDr|NlQkkbwcn90fxt z1pWfu3W`4vW&uVbD-eU?9K;_5!#@Oq81jLzgh7G9l_3vE7co@AvNBP$7%;`aLW!Ax zjtOsLD}uF;GlJ9|fEFx<1oRM+W&xH$F#AC?A@wl%eo)~B1kMbJKwl>^$ zDL{t(+&~*jptcy1WE-Ypp#K>`WiZG)#QL8HsMZ-8SunjIE^_{72l6?9m=lP(fEZLB zNC9bHAm#&Nejo-`0StmbECj^DKr8~pqChML#Nt3K0mPC(3@cwi?i&SzD+EAk0h9)s zfeGmUjsFiA1iail-53~wi7EjI8UEh}W)Ws4CJ+Jw79e8fU}a@tVdY|HXXD`E;^E=u z;^yY%6B6L%6XfIO77!B<6c!N`73JXWnyY(ZeeNV?BeR??&0Yb91<+v*#~fzWVs-^OvvRzW@073*;|G24;x2;66k1mmttzOe`$SEbJhEF*20{F|!~G ztD+&BkYgZwVxh2-Q6qGeQ$1KQT&+ymw-@)zw8I-y-*8W}cd&VdCjsI`L;*e-sfPo!c_9XyyfUq7A zgHyt}o3k{4bxkruD!5)t1=ei33`xK;UJr;f8Pb627#PeLVCml+SO5-%^e@05Fq;0s z`FhBw|KIn$KL%A?d-X5=t?^>b-girc?wxbpVi&rz=g*{Lt0yWOzCOP`_|y;KW3$$E ze$2Y=WVQC$>g1L8WbK?+a^7L&-FoLxhUC+PHP1}%HiWF7-Xn8;TBf{6jrf8aoL~PI zUG!{{oi=@Tta2ht;EBTR%yvONLjF8e25bH^a8|rObYI?1BjX?Uhshb&HyWG1TU(ec zqUK$#v2n)}O|95l76<<`u)KY)LuThqkL+2<BE6>zR9>#oe7#EV%^JgZ8%#cIHvhEE`s+^n`#lLa`Z6!B47;)^ z>+-(3@4Fqp?s5FS&+Y5(>R$&ve;x7pbJY9Kald~j1OJ~6{eL#(|JjKD=VJb!kN3a@nkD_4mvwAd*0W)G z-^LZa+gEk%T+_XE?d+*bj?Z6nZsz(c3)Y=qzwP9T?Uy#}zqDw_vo-r)Z`%KM!@)Zn z4&K{x;^V#foyT|e99nna+@a262R7ZhwBY^q#*cS8|K4l-cemmH{l@5 zdF)K5O;#nSKU3A8pu~D>^6^Fo!=7CUP0Y{FN*N^|SmBV^bfiPSdz(jAvB$({*Uohj z3lAyxh&c=0Vc4X!G=H*+Yu%9q0}XFQ^&A1;iA=7Y6BR77GCUj~9uYQaTICX1l;XiB zZ5$&Z;j*x$-y~v&f+EusHeN}6BOL*aLq7dtJ0fd7Y+yXx%3R3O#&B?9V-pJpmw*v%K!iX literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/tree/center-bg.gif b/www/extras/yui-ext/examples/tree/center-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f9b25b30c61c74b96b7f9daf63f926f32ff9043f GIT binary patch literal 811 zcmZ?wbhEHbWMp7vXlG!!^Xku&_kZ4e`TOLast Modified: Apr 14, 2007, 4:51 am
      Size: 14 KB","qtipTitle":"DomHelper.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Template.js","id":"source/core/Template.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 4:51 am
      Size: 13 KB","qtipTitle":"Template.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DomQuery.js","id":"source/core/DomQuery.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 4:51 am
      Size: 24 KB","qtipTitle":"DomQuery.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Observable.js","id":"source/util/Observable.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 4:51 am
      Size: 9.4 KB","qtipTitle":"Observable.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"EventManager.js","id":"source/core/EventManager.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 4:51 am
      Size: 24 KB","qtipTitle":"EventManager.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Element.js","id":"source/core/Element.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 4:51 am
      Size: 101 KB","qtipTitle":"Element.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Fx.js","id":"source/core/Fx.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 4:51 am
      Size: 33 KB","qtipTitle":"Fx.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"CompositeElement.js","id":"source/core/CompositeElement.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 4:51 am
      Size: 7.1 KB","qtipTitle":"CompositeElement.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"UpdateManager.js","id":"source/core/UpdateManager.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 4:51 am
      Size: 19 KB","qtipTitle":"UpdateManager.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DelayedTask.js","id":"source/util/DelayedTask.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 4:51 am
      Size: 2 KB","qtipTitle":"DelayedTask.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[]},{"text":"Core - Utilities","id":"c-1176547092092","options":[],"files":[{"allowDelete":true,"text":"ClickRepeater.js","id":"source/util/ClickRepeater.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:31 am
      Size: 4.9 KB","qtipTitle":"ClickRepeater.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"CSS.js","id":"source/util/CSS.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:31 am
      Size: 5 KB","qtipTitle":"CSS.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Format.js","id":"source/util/Format.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:31 am
      Size: 5.4 KB","qtipTitle":"Format.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"JSON.js","id":"source/util/JSON.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:31 am
      Size: 4.3 KB","qtipTitle":"JSON.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"KeyMap.js","id":"source/util/KeyMap.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:31 am
      Size: 5.9 KB","qtipTitle":"KeyMap.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"KeyNav.js","id":"source/util/KeyNav.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:31 am
      Size: 3 KB","qtipTitle":"KeyNav.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"MixedCollection.js","id":"source/util/MixedCollection.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:31 am
      Size: 17 KB","qtipTitle":"MixedCollection.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"TaskMgr.js","id":"source/util/TaskMgr.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:31 am
      Size: 2.3 KB","qtipTitle":"TaskMgr.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"TextMetrics.js","id":"source/util/TextMetrics.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:31 am
      Size: 1.8 KB","qtipTitle":"TextMetrics.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[]},{"text":"Core - Date Parsing and Formatting","id":"c-1176614560128","options":[],"files":[{"allowDelete":true,"expanded":true,"text":"Date.js","id":"source/util/Date.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 11:01 pm
      Size: 23 KB","qtipTitle":"Date.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}}],"dep":[]},{"text":"Core - Layers","id":"c-1176548288067","options":[],"files":[{"allowDelete":true,"text":"Component.js","id":"source/widgets/Component.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 9 KB","qtipTitle":"Component.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Layer.js","id":"source/widgets/Layer.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 9.9 KB","qtipTitle":"Layer.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Shadow.js","id":"source/widgets/Shadow.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 3.4 KB","qtipTitle":"Shadow.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[]},{"text":"Core - Drag and Drop","id":"c-1176548288338","options":[{"text":"Overflow Scrolling Support","cmpId":"c-1176548288338","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176599383444","children":[{"allowDelete":true,"text":"ScrollManager.js","id":"source/dd/ScrollManager.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 5.5 KB","qtipTitle":"ScrollManager.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"files":[{"allowDelete":true,"text":"DDCore.js","id":"source/dd/DDCore.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 95 KB","qtipTitle":"DDCore.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"StatusProxy.js","id":"source/dd/StatusProxy.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 3.1 KB","qtipTitle":"StatusProxy.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Registry.js","id":"source/dd/Registry.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 2.3 KB","qtipTitle":"Registry.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DragSource.js","id":"source/dd/DragSource.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 6.3 KB","qtipTitle":"DragSource.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DropTarget.js","id":"source/dd/DropTarget.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 1.2 KB","qtipTitle":"DropTarget.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DragZone.js","id":"source/dd/DragZone.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 2.6 KB","qtipTitle":"DragZone.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DropZone.js","id":"source/dd/DropZone.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 2.3 KB","qtipTitle":"DropZone.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"Layer.js","id":"source/widgets/Layer.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 9.9 KB","qtipTitle":"Layer.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Shadow.js","id":"source/widgets/Shadow.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 3.4 KB","qtipTitle":"Shadow.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Core - State Management","id":"c-1176681140293","options":[],"files":[{"allowDelete":true,"expanded":true,"text":"State.js","id":"source/state/State.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 15, 2007, 5:18 pm
      Size: 9.8 KB","qtipTitle":"State.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}}],"dep":[]},{"text":"Resizable","id":"c-1176548288611","options":[],"files":[{"allowDelete":true,"text":"Resizable.js","id":"source/widgets/Resizable.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 21 KB","qtipTitle":"Resizable.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[]},{"text":"QuickTips - Tooltip Widget","id":"c-1176548289178","options":[],"files":[{"allowDelete":true,"text":"QuickTips.js","id":"source/widgets/QuickTips.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 9.1 KB","qtipTitle":"QuickTips.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"Shadow.js","id":"source/widgets/Shadow.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 3.4 KB","qtipTitle":"Shadow.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Layer.js","id":"source/widgets/Layer.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 9.9 KB","qtipTitle":"Layer.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Button Widget","id":"c-1176548288907","options":[{"text":"Button QuickTips","cmpId":"c-1176548288907","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176590302846","children":[{"allowDelete":true,"text":"QuickTips.js","id":"source/widgets/QuickTips.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 9.1 KB","qtipTitle":"QuickTips.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"files":[{"allowDelete":true,"text":"Button.js","id":"source/widgets/Button.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 13 KB","qtipTitle":"Button.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"MenuButton.js","id":"source/widgets/MenuButton.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 6.3 KB","qtipTitle":"MenuButton.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"TextMetrics.js","id":"source/util/TextMetrics.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 1.8 KB","qtipTitle":"TextMetrics.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Tabs Widget","id":"c-1176590622815","options":[],"files":[{"allowDelete":true,"text":"TabPanel.js","id":"source/widgets/TabPanel.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 25 KB","qtipTitle":"TabPanel.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[]},{"text":"SplitBar Widget","id":"c-1176548289426","options":[],"files":[{"allowDelete":true,"text":"SplitBar.js","id":"source/widgets/SplitBar.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 14 KB","qtipTitle":"SplitBar.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"DDCore.js","id":"source/dd/DDCore.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 95 KB","qtipTitle":"DDCore.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Menu Widget","id":"c-1176548289698","options":[{"text":"Color Palette Item","cmpId":"c-1176548289698","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176600135917","children":[{"allowDelete":true,"text":"ColorPalette.js","id":"source/widgets/ColorPalette.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 4.5 KB","qtipTitle":"ColorPalette.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"text":"Date Picker Item","cmpId":"c-1176548289698","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176600141997","children":[{"allowDelete":true,"text":"DatePicker.js","id":"source/widgets/DatePicker.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 16 KB","qtipTitle":"DatePicker.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"files":[{"allowDelete":true,"text":"Adapter.js","id":"source/widgets/menu/Adapter.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 1.5 KB","qtipTitle":"Adapter.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"BaseItem.js","id":"source/widgets/menu/BaseItem.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 3.7 KB","qtipTitle":"BaseItem.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"CheckItem.js","id":"source/widgets/menu/CheckItem.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 3.7 KB","qtipTitle":"CheckItem.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Item.js","id":"source/widgets/menu/Item.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 3.8 KB","qtipTitle":"Item.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Menu.js","id":"source/widgets/menu/Menu.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 16 KB","qtipTitle":"Menu.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"MenuMgr.js","id":"source/widgets/menu/MenuMgr.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 4.7 KB","qtipTitle":"MenuMgr.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Separator.js","id":"source/widgets/menu/Separator.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 1.2 KB","qtipTitle":"Separator.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"TextItem.js","id":"source/widgets/menu/TextItem.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 1.1 KB","qtipTitle":"TextItem.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"MixedCollection.js","id":"source/util/MixedCollection.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 17 KB","qtipTitle":"MixedCollection.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Shadow.js","id":"source/widgets/Shadow.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 3.4 KB","qtipTitle":"Shadow.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Layer.js","id":"source/widgets/Layer.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 9.9 KB","qtipTitle":"Layer.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Component.js","id":"source/widgets/Component.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 9 KB","qtipTitle":"Component.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"KeyNav.js","id":"source/util/KeyNav.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3 KB","qtipTitle":"KeyNav.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Loading Mask Widget","id":"c-1176682522794","options":[],"files":[{"allowDelete":true,"expanded":true,"text":"LoadMask.js","id":"source/widgets/LoadMask.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 15, 2007, 5:18 pm
      Size: 3.1 KB","qtipTitle":"LoadMask.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}}],"dep":[]},{"text":"Date Picker Popup (DateMenu)","id":"c-1176548289970","options":[],"files":[{"allowDelete":true,"text":"DateMenu.js","id":"source/widgets/menu/DateMenu.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 888 B","qtipTitle":"DateMenu.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DatePicker.js","id":"source/widgets/DatePicker.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 16 KB","qtipTitle":"DatePicker.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DateItem.js","id":"source/widgets/menu/DateItem.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 1.1 KB","qtipTitle":"DateItem.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"Date.js","id":"source/util/Date.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 23 KB","qtipTitle":"Date.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Layer.js","id":"source/widgets/Layer.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 9.9 KB","qtipTitle":"Layer.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Shadow.js","id":"source/widgets/Shadow.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 3.4 KB","qtipTitle":"Shadow.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"MenuMgr.js","id":"source/widgets/menu/MenuMgr.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 4.7 KB","qtipTitle":"MenuMgr.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Menu.js","id":"source/widgets/menu/Menu.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 16 KB","qtipTitle":"Menu.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"BaseItem.js","id":"source/widgets/menu/BaseItem.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 3.7 KB","qtipTitle":"BaseItem.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Adapter.js","id":"source/widgets/menu/Adapter.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 1.5 KB","qtipTitle":"Adapter.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Component.js","id":"source/widgets/Component.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 9 KB","qtipTitle":"Component.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"KeyNav.js","id":"source/util/KeyNav.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3 KB","qtipTitle":"KeyNav.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"ClickRepeater.js","id":"source/util/ClickRepeater.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 4.9 KB","qtipTitle":"ClickRepeater.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Color Picker Popup (ColorMenu)","id":"c-1176548290251","options":[],"files":[{"allowDelete":true,"text":"ColorMenu.js","id":"source/widgets/menu/ColorMenu.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 915 B","qtipTitle":"ColorMenu.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"ColorItem.js","id":"source/widgets/menu/ColorItem.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 792 B","qtipTitle":"ColorItem.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"ColorPalette.js","id":"source/widgets/ColorPalette.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 4.5 KB","qtipTitle":"ColorPalette.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"Layer.js","id":"source/widgets/Layer.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 9.9 KB","qtipTitle":"Layer.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Shadow.js","id":"source/widgets/Shadow.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 3.4 KB","qtipTitle":"Shadow.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"MenuMgr.js","id":"source/widgets/menu/MenuMgr.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 4.7 KB","qtipTitle":"MenuMgr.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Menu.js","id":"source/widgets/menu/Menu.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 16 KB","qtipTitle":"Menu.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"BaseItem.js","id":"source/widgets/menu/BaseItem.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 3.7 KB","qtipTitle":"BaseItem.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Adapter.js","id":"source/widgets/menu/Adapter.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 1.5 KB","qtipTitle":"Adapter.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Component.js","id":"source/widgets/Component.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 9 KB","qtipTitle":"Component.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Border Layout Widget","id":"c-1176590622527","options":[{"text":"Preconfigured Outlook Style Layout","cmpId":"c-1176590622527","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176600285242","children":[{"allowDelete":true,"text":"ReaderLayout.js","id":"source/widgets/layout/ReaderLayout.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 2.4 KB","qtipTitle":"ReaderLayout.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"files":[{"allowDelete":true,"text":"BasicLayoutRegion.js","id":"source/widgets/layout/BasicLayoutRegion.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 9.5 KB","qtipTitle":"BasicLayoutRegion.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"BorderLayout.js","id":"source/widgets/layout/BorderLayout.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 11 KB","qtipTitle":"BorderLayout.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"BorderLayoutRegions.js","id":"source/widgets/layout/BorderLayoutRegions.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 6.2 KB","qtipTitle":"BorderLayoutRegions.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"ContentPanels.js","id":"source/widgets/layout/ContentPanels.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 17 KB","qtipTitle":"ContentPanels.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"LayoutManager.js","id":"source/widgets/layout/LayoutManager.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 4.2 KB","qtipTitle":"LayoutManager.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"LayoutRegion.js","id":"source/widgets/layout/LayoutRegion.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 21 KB","qtipTitle":"LayoutRegion.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"LayoutStateManager.js","id":"source/widgets/layout/LayoutStateManager.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 2.3 KB","qtipTitle":"LayoutStateManager.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"SplitLayoutRegion.js","id":"source/widgets/layout/SplitLayoutRegion.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 10 KB","qtipTitle":"SplitLayoutRegion.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"MixedCollection.js","id":"source/util/MixedCollection.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 17 KB","qtipTitle":"MixedCollection.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"SplitBar.js","id":"source/widgets/SplitBar.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 14 KB","qtipTitle":"SplitBar.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DDCore.js","id":"source/dd/DDCore.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 95 KB","qtipTitle":"DDCore.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"TabPanel.js","id":"source/widgets/TabPanel.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 25 KB","qtipTitle":"TabPanel.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Toolbar Widget","id":"c-1176590623103","options":[{"text":"Menu Buttons","cmpId":"c-1176590623103","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176600354384","children":[{"allowDelete":true,"text":"MenuButton.js","id":"source/widgets/MenuButton.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 6.3 KB","qtipTitle":"MenuButton.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"text":"Paging Toolbar","cmpId":"c-1176590623103","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176683220697","children":[{"allowDelete":true,"expanded":true,"text":"PagingToolbar.js","id":"source/widgets/PagingToolbar.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 15, 2007, 5:18 pm
      Size: 9.2 KB","qtipTitle":"PagingToolbar.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}}]}],"files":[{"allowDelete":true,"text":"Toolbar.js","id":"source/widgets/Toolbar.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 12 KB","qtipTitle":"Toolbar.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"MixedCollection.js","id":"source/util/MixedCollection.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 17 KB","qtipTitle":"MixedCollection.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Button.js","id":"source/widgets/Button.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 13 KB","qtipTitle":"Button.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"TextMetrics.js","id":"source/util/TextMetrics.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:56 am
      Size: 1.8 KB","qtipTitle":"TextMetrics.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Dialog - Basic Widget","id":"c-1176590621920","options":[{"text":"Dialog Resize Support","cmpId":"c-1176590621920","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176591083447","children":[{"allowDelete":true,"text":"Resizable.js","id":"source/widgets/Resizable.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 21 KB","qtipTitle":"Resizable.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"text":"Dialog Drag and Drop Support","cmpId":"c-1176590621920","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176591106528","children":[{"allowDelete":true,"text":"DDCore.js","id":"source/dd/DDCore.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 95 KB","qtipTitle":"DDCore.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"text":"Tabs Support","cmpId":"c-1176590621920","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176593460681","children":[{"allowDelete":true,"text":"TabPanel.js","id":"source/widgets/TabPanel.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 25 KB","qtipTitle":"TabPanel.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"files":[{"allowDelete":true,"text":"BasicDialog.js","id":"source/widgets/BasicDialog.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 41 KB","qtipTitle":"BasicDialog.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"Shadow.js","id":"source/widgets/Shadow.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 3.4 KB","qtipTitle":"Shadow.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Dialog - MessageBox","id":"c-1176590623375","options":[],"files":[{"allowDelete":true,"text":"MessageBox.js","id":"source/widgets/MessageBox.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 20 KB","qtipTitle":"MessageBox.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"BasicDialog.js","id":"source/widgets/BasicDialog.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 41 KB","qtipTitle":"BasicDialog.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Shadow.js","id":"source/widgets/Shadow.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 3.4 KB","qtipTitle":"Shadow.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Data - Core","id":"c-1176590623903","options":[],"files":[{"allowDelete":true,"text":"Connection.js","id":"source/data/Connection.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 2.6 KB","qtipTitle":"Connection.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DataField.js","id":"source/data/DataField.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3 KB","qtipTitle":"DataField.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DataProxy.js","id":"source/data/DataProxy.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 1.7 KB","qtipTitle":"DataProxy.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DataReader.js","id":"source/data/DataReader.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 379 B","qtipTitle":"DataReader.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Record.js","id":"source/data/Record.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 7.5 KB","qtipTitle":"Record.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"SortTypes.js","id":"source/data/SortTypes.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 2.4 KB","qtipTitle":"SortTypes.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Store.js","id":"source/data/Store.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 20 KB","qtipTitle":"Store.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"HttpProxy.js","id":"source/data/HttpProxy.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3.7 KB","qtipTitle":"HttpProxy.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"ScriptTagProxy.js","id":"source/data/ScriptTagProxy.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 6.2 KB","qtipTitle":"ScriptTagProxy.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"MemoryProxy.js","id":"source/data/MemoryProxy.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 2.1 KB","qtipTitle":"MemoryProxy.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"MixedCollection.js","id":"source/util/MixedCollection.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 17 KB","qtipTitle":"MixedCollection.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Data - JSON Support","id":"c-1176590624144","options":[],"files":[{"allowDelete":true,"text":"JsonReader.js","id":"source/data/JsonReader.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 6 KB","qtipTitle":"JsonReader.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"ArrayReader.js","id":"source/data/ArrayReader.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3.4 KB","qtipTitle":"ArrayReader.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"JSON.js","id":"source/util/JSON.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 4.3 KB","qtipTitle":"JSON.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Connection.js","id":"source/data/Connection.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 2.6 KB","qtipTitle":"Connection.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DataField.js","id":"source/data/DataField.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3 KB","qtipTitle":"DataField.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DataProxy.js","id":"source/data/DataProxy.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 1.7 KB","qtipTitle":"DataProxy.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DataReader.js","id":"source/data/DataReader.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 379 B","qtipTitle":"DataReader.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Record.js","id":"source/data/Record.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 7.5 KB","qtipTitle":"Record.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"SortTypes.js","id":"source/data/SortTypes.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 2.4 KB","qtipTitle":"SortTypes.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Store.js","id":"source/data/Store.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 20 KB","qtipTitle":"Store.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"HttpProxy.js","id":"source/data/HttpProxy.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3.7 KB","qtipTitle":"HttpProxy.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"ScriptTagProxy.js","id":"source/data/ScriptTagProxy.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 6.2 KB","qtipTitle":"ScriptTagProxy.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"MemoryProxy.js","id":"source/data/MemoryProxy.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 2.1 KB","qtipTitle":"MemoryProxy.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"MixedCollection.js","id":"source/util/MixedCollection.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 17 KB","qtipTitle":"MixedCollection.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Data - XML Support","id":"c-1176594563024","options":[],"files":[{"allowDelete":true,"text":"XmlReader.js","id":"source/data/XmlReader.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 4.7 KB","qtipTitle":"XmlReader.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"Connection.js","id":"source/data/Connection.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 2.6 KB","qtipTitle":"Connection.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DataField.js","id":"source/data/DataField.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3 KB","qtipTitle":"DataField.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DataProxy.js","id":"source/data/DataProxy.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 1.7 KB","qtipTitle":"DataProxy.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DataReader.js","id":"source/data/DataReader.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 379 B","qtipTitle":"DataReader.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Record.js","id":"source/data/Record.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 7.5 KB","qtipTitle":"Record.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"SortTypes.js","id":"source/data/SortTypes.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 2.4 KB","qtipTitle":"SortTypes.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Store.js","id":"source/data/Store.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 20 KB","qtipTitle":"Store.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"HttpProxy.js","id":"source/data/HttpProxy.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3.7 KB","qtipTitle":"HttpProxy.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"ScriptTagProxy.js","id":"source/data/ScriptTagProxy.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 6.2 KB","qtipTitle":"ScriptTagProxy.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"MemoryProxy.js","id":"source/data/MemoryProxy.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 2.1 KB","qtipTitle":"MemoryProxy.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"MixedCollection.js","id":"source/util/MixedCollection.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 17 KB","qtipTitle":"MixedCollection.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Data - Simple Store","id":"c-1176594562552","options":[],"files":[{"allowDelete":true,"text":"SimpleStore.js","id":"source/data/SimpleStore.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 976 B","qtipTitle":"SimpleStore.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"JsonReader.js","id":"source/data/JsonReader.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 6 KB","qtipTitle":"JsonReader.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"ArrayReader.js","id":"source/data/ArrayReader.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3.4 KB","qtipTitle":"ArrayReader.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Connection.js","id":"source/data/Connection.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 2.6 KB","qtipTitle":"Connection.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DataField.js","id":"source/data/DataField.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3 KB","qtipTitle":"DataField.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DataReader.js","id":"source/data/DataReader.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 379 B","qtipTitle":"DataReader.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Record.js","id":"source/data/Record.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 7.5 KB","qtipTitle":"Record.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"SortTypes.js","id":"source/data/SortTypes.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 2.4 KB","qtipTitle":"SortTypes.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Store.js","id":"source/data/Store.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 20 KB","qtipTitle":"Store.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"MixedCollection.js","id":"source/util/MixedCollection.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 17 KB","qtipTitle":"MixedCollection.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Views - Data Bound Views","id":"c-1176590623664","options":[{"text":"JSON Support","cmpId":"c-1176590623664","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176594452492","children":[{"allowDelete":true,"expanded":true,"text":"JSON.js","id":"source/util/JSON.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 11:01 pm
      Size: 4.3 KB","qtipTitle":"JSON.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"files":[{"allowDelete":true,"text":"View.js","id":"source/widgets/View.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 24 KB","qtipTitle":"View.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"JsonView.js","id":"source/widgets/JsonView.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 9.9 KB","qtipTitle":"JsonView.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[]},{"text":"Form - Basic Fields","id":"c-1176596007536","options":[{"text":"Custom Validations","cmpId":"c-1176596007536","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176596661900","children":[{"allowDelete":true,"text":"VTypes.js","id":"source/widgets/form/VTypes.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 2.9 KB","qtipTitle":"VTypes.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"files":[{"allowDelete":true,"text":"Field.js","id":"source/widgets/form/Field.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 15 KB","qtipTitle":"Field.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Checkbox.js","id":"source/widgets/form/Checkbox.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3.6 KB","qtipTitle":"Checkbox.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"NumberField.js","id":"source/widgets/form/NumberField.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 4.8 KB","qtipTitle":"NumberField.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Radio.js","id":"source/widgets/form/Radio.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 489 B","qtipTitle":"Radio.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"TextArea.js","id":"source/widgets/form/TextArea.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3.2 KB","qtipTitle":"TextArea.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"TextField.js","id":"source/widgets/form/TextField.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 11 KB","qtipTitle":"TextField.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"Component.js","id":"source/widgets/Component.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 9 KB","qtipTitle":"Component.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Form - ComboBox Widget","id":"c-1176594563568","options":[{"text":"Custom Validations","cmpId":"c-1176594563568","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176596097474","children":[{"allowDelete":true,"text":"VTypes.js","id":"source/widgets/form/VTypes.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 2.9 KB","qtipTitle":"VTypes.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"files":[{"allowDelete":true,"text":"Combo.js","id":"source/widgets/form/Combo.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 28 KB","qtipTitle":"Combo.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"Component.js","id":"source/widgets/Component.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 9 KB","qtipTitle":"Component.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Field.js","id":"source/widgets/form/Field.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 15 KB","qtipTitle":"Field.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"TextField.js","id":"source/widgets/form/TextField.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 11 KB","qtipTitle":"TextField.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"TriggerField.js","id":"source/widgets/form/TriggerField.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 6 KB","qtipTitle":"TriggerField.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"View.js","id":"source/widgets/View.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 24 KB","qtipTitle":"View.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"KeyNav.js","id":"source/util/KeyNav.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3 KB","qtipTitle":"KeyNav.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Form - Date Field","id":"c-1176596008487","options":[],"files":[{"allowDelete":true,"text":"DateField.js","id":"source/widgets/form/DateField.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 9 KB","qtipTitle":"DateField.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"TriggerField.js","id":"source/widgets/form/TriggerField.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 6 KB","qtipTitle":"TriggerField.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Field.js","id":"source/widgets/form/Field.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 15 KB","qtipTitle":"Field.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"TextField.js","id":"source/widgets/form/TextField.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 11 KB","qtipTitle":"TextField.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Component.js","id":"source/widgets/Component.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 9 KB","qtipTitle":"Component.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DateMenu.js","id":"source/widgets/menu/DateMenu.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 888 B","qtipTitle":"DateMenu.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DatePicker.js","id":"source/widgets/DatePicker.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 16 KB","qtipTitle":"DatePicker.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"DateItem.js","id":"source/widgets/menu/DateItem.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 1.1 KB","qtipTitle":"DateItem.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Date.js","id":"source/util/Date.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 23 KB","qtipTitle":"Date.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Layer.js","id":"source/widgets/Layer.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 9.9 KB","qtipTitle":"Layer.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Shadow.js","id":"source/widgets/Shadow.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 3.4 KB","qtipTitle":"Shadow.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"MenuMgr.js","id":"source/widgets/menu/MenuMgr.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 4.7 KB","qtipTitle":"MenuMgr.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Menu.js","id":"source/widgets/menu/Menu.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 16 KB","qtipTitle":"Menu.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"BaseItem.js","id":"source/widgets/menu/BaseItem.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 3.7 KB","qtipTitle":"BaseItem.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Adapter.js","id":"source/widgets/menu/Adapter.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 6:04 pm
      Size: 1.5 KB","qtipTitle":"Adapter.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"KeyNav.js","id":"source/util/KeyNav.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3 KB","qtipTitle":"KeyNav.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"ClickRepeater.js","id":"source/util/ClickRepeater.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 4.9 KB","qtipTitle":"ClickRepeater.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Form - Ajax and Loading Support","id":"c-1176596009103","options":[{"text":"XML Loading Support","cmpId":"c-1176596009103","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176596755855","children":[{"allowDelete":true,"text":"XmlReader.js","id":"source/data/XmlReader.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 4.7 KB","qtipTitle":"XmlReader.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"files":[{"allowDelete":true,"text":"BasicForm.js","id":"source/widgets/form/BasicForm.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 9.9 KB","qtipTitle":"BasicForm.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Action.js","id":"source/widgets/form/Action.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 5.6 KB","qtipTitle":"Action.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[]},{"text":"Form - Dynamic Rendering","id":"c-1176596009599","options":[],"files":[{"allowDelete":true,"text":"Form.js","id":"source/widgets/form/Form.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 7.7 KB","qtipTitle":"Form.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Layout.js","id":"source/widgets/form/Layout.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 4.3 KB","qtipTitle":"Layout.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"BasicForm.js","id":"source/widgets/form/BasicForm.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 9.9 KB","qtipTitle":"BasicForm.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Action.js","id":"source/widgets/form/Action.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 5.6 KB","qtipTitle":"Action.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Form - Floating Editor","id":"c-1176596675069","options":[],"files":[{"allowDelete":true,"text":"Editor.js","id":"source/widgets/Editor.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 4.5 KB","qtipTitle":"Editor.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"Layer.js","id":"source/widgets/Layer.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 9.9 KB","qtipTitle":"Layer.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Shadow.js","id":"source/widgets/Shadow.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3.4 KB","qtipTitle":"Shadow.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Component.js","id":"source/widgets/Component.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 9 KB","qtipTitle":"Component.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Grid - Core","id":"c-1176596674270","options":[{"text":"CellSelectionModel.js","cmpId":"c-1176596674270","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176598193101","children":[{"allowDelete":true,"text":"CellSelectionModel.js","id":"source/widgets/grid/CellSelectionModel.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 6.7 KB","qtipTitle":"CellSelectionModel.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"text":"Drag and Drop Column Reorder","cmpId":"c-1176596674270","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176598971151","children":[{"allowDelete":true,"text":"ColumnDD.js","id":"source/widgets/grid/ColumnDD.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 5.7 KB","qtipTitle":"ColumnDD.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"text":"Column Resizing","cmpId":"c-1176596674270","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176598974743","children":[{"allowDelete":true,"text":"ColumnSplitDD.js","id":"source/widgets/grid/ColumnSplitDD.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 2 KB","qtipTitle":"ColumnSplitDD.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"text":"Drag Grid Rows","cmpId":"c-1176596674270","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176598980335","children":[{"allowDelete":true,"text":"GridDD.js","id":"source/widgets/grid/GridDD.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 1.7 KB","qtipTitle":"GridDD.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"text":"Loading Mask","cmpId":"c-1176596674270","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176682774459","children":[{"allowDelete":true,"expanded":true,"text":"LoadMask.js","id":"source/widgets/LoadMask.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 15, 2007, 5:18 pm
      Size: 3.1 KB","qtipTitle":"LoadMask.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}}]},{"text":"Paging Toolbar","cmpId":"c-1176596674270","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176683284876","children":[{"allowDelete":true,"expanded":true,"text":"PagingToolbar.js","id":"source/widgets/PagingToolbar.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 15, 2007, 5:18 pm
      Size: 9.2 KB","qtipTitle":"PagingToolbar.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}},{"allowDelete":true,"expanded":true,"text":"Toolbar.js","id":"source/widgets/Toolbar.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 15, 2007, 5:18 pm
      Size: 12 KB","qtipTitle":"Toolbar.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}},{"allowDelete":true,"expanded":true,"text":"Button.js","id":"source/widgets/Button.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 15, 2007, 5:18 pm
      Size: 14 KB","qtipTitle":"Button.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}},{"allowDelete":true,"expanded":true,"text":"TextMetrics.js","id":"source/util/TextMetrics.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 15, 2007, 5:18 pm
      Size: 1.8 KB","qtipTitle":"TextMetrics.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}},{"allowDelete":true,"expanded":true,"text":"MixedCollection.js","id":"source/util/MixedCollection.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 15, 2007, 5:18 pm
      Size: 17 KB","qtipTitle":"MixedCollection.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}}]}],"files":[{"allowDelete":true,"text":"AbstractGridView.js","id":"source/widgets/grid/AbstractGridView.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3.1 KB","qtipTitle":"AbstractGridView.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"AbstractSelectionModel.js","id":"source/widgets/grid/AbstractSelectionModel.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 1 KB","qtipTitle":"AbstractSelectionModel.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"RowSelectionModel.js","id":"source/widgets/grid/RowSelectionModel.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 13 KB","qtipTitle":"RowSelectionModel.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Grid.js","id":"source/widgets/grid/Grid.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 18 KB","qtipTitle":"Grid.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"ColumnModel.js","id":"source/widgets/grid/ColumnModel.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 12 KB","qtipTitle":"ColumnModel.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"GridView.js","id":"source/widgets/grid/GridView.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 58 KB","qtipTitle":"GridView.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"expanded":true,"text":"CSS.js","id":"source/util/CSS.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 11:01 pm
      Size: 5 KB","qtipTitle":"CSS.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Grid - Editing Support","id":"c-1176596839124","options":[],"files":[{"allowDelete":true,"text":"GridEditor.js","id":"source/widgets/grid/GridEditor.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 461 B","qtipTitle":"GridEditor.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"EditorGrid.js","id":"source/widgets/grid/EditorGrid.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 6.2 KB","qtipTitle":"EditorGrid.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"Editor.js","id":"source/widgets/Editor.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 4.5 KB","qtipTitle":"Editor.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Layer.js","id":"source/widgets/Layer.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 9.9 KB","qtipTitle":"Layer.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Shadow.js","id":"source/widgets/Shadow.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3.4 KB","qtipTitle":"Shadow.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Component.js","id":"source/widgets/Component.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 9 KB","qtipTitle":"Component.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Grid - Property Grid","id":"c-1176596839827","options":[],"files":[{"allowDelete":true,"text":"PropertyGrid.js","id":"source/widgets/grid/PropertyGrid.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 6.3 KB","qtipTitle":"PropertyGrid.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"GridEditor.js","id":"source/widgets/grid/GridEditor.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 461 B","qtipTitle":"GridEditor.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"EditorGrid.js","id":"source/widgets/grid/EditorGrid.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 6.2 KB","qtipTitle":"EditorGrid.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Editor.js","id":"source/widgets/Editor.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 4.5 KB","qtipTitle":"Editor.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Layer.js","id":"source/widgets/Layer.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 9.9 KB","qtipTitle":"Layer.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Shadow.js","id":"source/widgets/Shadow.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 3.4 KB","qtipTitle":"Shadow.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"Component.js","id":"source/widgets/Component.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 9 KB","qtipTitle":"Component.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Tree - Core","id":"c-1176596840547","options":[{"text":"Sorting Support","cmpId":"c-1176596840547","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176599045969","children":[{"allowDelete":true,"text":"TreeSorter.js","id":"source/widgets/tree/TreeSorter.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 2.3 KB","qtipTitle":"TreeSorter.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"text":"Filtering Support","cmpId":"c-1176596840547","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176599073554","children":[{"allowDelete":true,"text":"TreeFilter.js","id":"source/widgets/tree/TreeFilter.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 3.6 KB","qtipTitle":"TreeFilter.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"text":"Drag and Drop Support","cmpId":"c-1176596840547","iconCls":"folder","type":"fileCt","allowDelete":true,"allowEdit":true,"id":"o-1176599245706","children":[{"allowDelete":true,"text":"TreeDragZone.js","id":"source/widgets/tree/TreeDragZone.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 1.5 KB","qtipTitle":"TreeDragZone.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}},{"allowDelete":true,"text":"TreeDropZone.js","id":"source/widgets/tree/TreeDropZone.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 7.9 KB","qtipTitle":"TreeDropZone.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}}],"loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"files":[{"allowDelete":true,"text":"Tree.js","id":"source/data/Tree.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 7:44 pm
      Size: 25 KB","qtipTitle":"Tree.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"TreePanel.js","id":"source/widgets/tree/TreePanel.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 14 KB","qtipTitle":"TreePanel.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"TreeSelectionModel.js","id":"source/widgets/tree/TreeSelectionModel.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 9.1 KB","qtipTitle":"TreeSelectionModel.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"TreeNode.js","id":"source/widgets/tree/TreeNode.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 15 KB","qtipTitle":"TreeNode.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"TreeNodeUI.js","id":"source/widgets/tree/TreeNodeUI.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 14 KB","qtipTitle":"TreeNodeUI.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[]},{"text":"Tree - Ajax Loading Support","id":"c-1176598286138","options":[],"files":[{"allowDelete":true,"text":"AsyncTreeNode.js","id":"source/widgets/tree/AsyncTreeNode.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 3.5 KB","qtipTitle":"AsyncTreeNode.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}},{"allowDelete":true,"text":"TreeLoader.js","id":"source/widgets/tree/TreeLoader.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 4.1 KB","qtipTitle":"TreeLoader.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}],"dep":[{"allowDelete":true,"text":"JSON.js","id":"source/util/JSON.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 14, 2007, 9:02 pm
      Size: 4.3 KB","qtipTitle":"JSON.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","events":{"beforeload":true,"load":true,"loadexception":true}}}]},{"text":"Tree - Editing Support","id":"c-1176682872198","options":[],"files":[{"allowDelete":true,"expanded":true,"text":"TreeEditor.js","id":"source/widgets/tree/TreeEditor.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 15, 2007, 5:18 pm
      Size: 2.2 KB","qtipTitle":"TreeEditor.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}}],"dep":[{"allowDelete":true,"expanded":true,"text":"Editor.js","id":"source/widgets/Editor.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 15, 2007, 5:18 pm
      Size: 8.7 KB","qtipTitle":"Editor.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}},{"allowDelete":true,"expanded":true,"text":"Shadow.js","id":"source/widgets/Shadow.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 15, 2007, 5:18 pm
      Size: 5 KB","qtipTitle":"Shadow.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}},{"allowDelete":true,"expanded":true,"text":"Layer.js","id":"source/widgets/Layer.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 15, 2007, 5:18 pm
      Size: 11 KB","qtipTitle":"Layer.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}},{"allowDelete":true,"expanded":true,"text":"Component.js","id":"source/widgets/Component.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 15, 2007, 5:18 pm
      Size: 9 KB","qtipTitle":"Component.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}},{"allowDelete":true,"expanded":true,"text":"Field.js","id":"source/widgets/form/Field.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 15, 2007, 5:18 pm
      Size: 15 KB","qtipTitle":"Field.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}},{"allowDelete":true,"expanded":true,"text":"TextField.js","id":"source/widgets/form/TextField.js","leaf":true,"qtip":"Type: JavaScript File
      Last Modified: Apr 15, 2007, 5:18 pm
      Size: 11 KB","qtipTitle":"TextField.js","cls":"file","loader":{"baseParams":{},"requestMethod":"POST","dataUrl":"dependency.php","events":{"beforeload":true,"load":true,"loadexception":true},"transId":false}}]}] \ No newline at end of file diff --git a/www/extras/yui-ext/examples/tree/dependency.css b/www/extras/yui-ext/examples/tree/dependency.css new file mode 100644 index 000000000..606752578 --- /dev/null +++ b/www/extras/yui-ext/examples/tree/dependency.css @@ -0,0 +1,52 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.x-tree-node img.folder, .x-tree-node-collapsed img.folder{ + background-image:url(../../resources/images/default/tree/folder.gif); +} + +.x-tree-node-expanded img.folder { + background-image:url(../../resources/images/default/tree/folder-open.gif); +} + +.x-tree-node .croot{ + background:#c3daf9; +} +.x-tree-node div.cmp{ + background:#eee url(images/cmp-bg.gif) repeat-x; + margin-top:1px; + border-top:1px solid #ddd; + border-bottom:1px solid #ccc; + padding-top:2px; + padding-bottom:1px; +} +.add-cmp .x-btn-text { + background-image:url(../shared/icons/fam/plugin_add.gif); +} + +.add-opt .x-btn-text { + background-image:url(../shared/icons/fam/add.gif); +} + +.remove .x-btn-text, .remove-mi .x-menu-item-icon { + background-image:url(../shared/icons/fam/delete.gif); +} + +.save .x-btn-text { + background-image:url(../shared/icons/save.gif); +} +.expand-all .x-menu-item-icon { + background-image:url(../shared/icons/arrow-down.gif); +} +.collapse-all .x-menu-item-icon { + background-image:url(../shared/icons/arrow-up.gif); +} + +.x-tree-node img.cmp, .menu-cmp .x-menu-item-icon{ + background-image:url(../shared/icons/fam/plugin.gif); +} \ No newline at end of file diff --git a/www/extras/yui-ext/examples/tree/dependency.html b/www/extras/yui-ext/examples/tree/dependency.html new file mode 100644 index 000000000..da5403617 --- /dev/null +++ b/www/extras/yui-ext/examples/tree/dependency.html @@ -0,0 +1,33 @@ + + + +Ext Dependency Builder + + + + + + + + + + + + + +

      Ext Dependency Builder

      +

      This is a piece of the application we use to build the Ext dependency tree.
      + Key features it demonstrates:
      + * Restrictive drag and drop of nodes from tree to tree
      + * Restrictive reordering of nodes
      + * Loading and saving to/from different structures
      + * Dynamic tree context menu
      + * Inline editing of tree nodes
      + * Custom tree styles with CSS +

      +

      The js is not minified so it is readable. See dependency.js.

      + +
      + + + diff --git a/www/extras/yui-ext/examples/tree/dependency.js b/www/extras/yui-ext/examples/tree/dependency.js new file mode 100644 index 000000000..a6573e2e7 --- /dev/null +++ b/www/extras/yui-ext/examples/tree/dependency.js @@ -0,0 +1,436 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.onReady(function(){ + var xt = Ext.tree; + // seeds for the new node suffix + var cseed = 0, oseed = 0; + + // turn on quick tips + Ext.QuickTips.init(); + + var cview = Ext.DomHelper.append('main-ct', + {cn:[{id:'main-tb'},{id:'cbody'}]} + ); + + + // create the primary toolbar + var tb = new Ext.Toolbar('main-tb'); + tb.add({ + id:'save', + text:'Save', + disabled:true, + handler:save, + cls:'x-btn-text-icon save', + tooltip:'Saves all components to the server' + },'-', { + id:'add', + text:'Component', + handler:addComponent, + cls:'x-btn-text-icon add-cmp', + tooltip:'Add a new Component to the dependency builder' + }, { + id:'option', + text:'Option', + disabled:true, + handler:addOption, + cls:'x-btn-text-icon add-opt', + tooltip:'Add a new optional dependency to the selected component' + },'-',{ + id:'remove', + text:'Remove', + disabled:true, + handler:removeNode, + cls:'x-btn-text-icon remove', + tooltip:'Remove the selected item' + }); + // for enabling and disabling + var btns = tb.items.map; + + + + // create our layout + var layout = new Ext.BorderLayout('main-ct', { + west: { + split:true, + initialSize: 200, + minSize: 175, + maxSize: 400, + titlebar: true, + margins:{left:5,right:0,bottom:5,top:5} + }, + center: { + title:'Components', + margins:{left:0,right:5,bottom:5,top:5} + } + }, 'main-ct'); + + layout.batchAdd({ + west: { + id: 'source-files', + autoCreate:true, + title:'Ext Source Files', + autoScroll:true, + fitToFrame:true + }, + center : { + el: cview, + autoScroll:true, + fitToFrame:true, + toolbar: tb, + resizeEl:'cbody' + } + }); + + + + // this is the source code tree + var stree = new xt.TreePanel('source-files', { + animate:true, + loader: new xt.TreeLoader({dataUrl:'dependency.php'}), + enableDrag:true, + containerScroll: true + }); + + new xt.TreeSorter(stree, {folderSort:true}); + + var sroot = new xt.AsyncTreeNode({ + text: 'Ext JS', + draggable:false, + id:'source' + }); + stree.setRootNode(sroot); + stree.render(); + sroot.expand(false, false); + + + // the component tree + var ctree = new xt.TreePanel('cbody', { + animate:true, + enableDD:true, + containerScroll: true, + lines:false, + rootVisible:false, + loader: new Ext.tree.TreeLoader() + }); + + ctree.el.addKeyListener(Ext.EventObject.DELETE, removeNode); + + var croot = new xt.AsyncTreeNode({ + allowDrag:false, + allowDrop:true, + id:'croot', + text:'Packages and Components', + cls:'croot', + loader:new Ext.tree.TreeLoader({ + dataUrl:'dep-tree.json', + createNode: readNode + }) + }); + ctree.setRootNode(croot); + ctree.render(); + croot.expand(); + + // some functions to determine whether is not the drop is allowed + function hasNode(t, n){ + return (t.attributes.type == 'fileCt' && t.findChild('id', n.id)) || + (t.leaf === true && t.parentNode.findChild('id', n.id)); + }; + + function isSourceCopy(e, n){ + var a = e.target.attributes; + return n.getOwnerTree() == stree && !hasNode(e.target, n) && + ((e.point == 'append' && a.type == 'fileCt') || a.leaf === true); + }; + + function isReorder(e, n){ + return n.parentNode == e.target.parentNode && e.point != 'append'; + }; + + // handle drag over and drag drop + ctree.on('nodedragover', function(e){ + var n = e.dropNode; + return isSourceCopy(e, n) || isReorder(e, n); + }); + + ctree.on('beforenodedrop', function(e){ + var n = e.dropNode; + + // copy node from source tree + if(isSourceCopy(e, n)){ + var copy = new xt.TreeNode( + Ext.apply({allowDelete:true,expanded:true}, n.attributes) + ); + copy.loader = undefined; + if(e.target.attributes.options){ + e.target = createOption(e.target, copy.text); + //return false; + } + e.dropNode = copy; + return true; + } + + return isReorder(e, n); + }); + + ctree.on('contextmenu', prepareCtx); + + // track whether save is allowed + ctree.on('append', trackSave); + ctree.on('remove', trackSave); + ctree.el.swallowEvent('contextmenu', true); + ctree.el.on('keypress', function(e){ + if(e.isNavKeyPress()){ + e.stopEvent(); + } + }); + // when the tree selection changes, enable/disable the toolbar buttons + var sm = ctree.getSelectionModel(); + sm.on('selectionchange', function(){ + var n = sm.getSelectedNode(); + if(!n){ + btns.remove.disable(); + btns.option.disable(); + return; + } + var a = n.attributes; + btns.remove.setDisabled(!a.allowDelete); + btns.option.setDisabled(!a.cmpId); + }); + + + + // create the editor for the component tree + var ge = new xt.TreeEditor(ctree, { + allowBlank:false, + blankText:'A name is required', + selectOnFocus:true + }); + + ge.on('beforestartedit', function(){ + if(!ge.editNode.attributes.allowEdit){ + return false; + } + }); + + + // add component handler + function addComponent(){ + var id = guid('c-'); + var text = 'Component '+(++cseed); + var node = createComponent(id, text); + node.expand(false, false); + node.select(); + node.lastChild.ensureVisible(); + ge.triggerEdit(node); + } + + function createComponent(id, text, cfiles, cdep, coptions){ + var node = new xt.TreeNode({ + text: text, + iconCls:'cmp', + cls:'cmp', + type:'cmp', + id: id, + cmpId:id, + allowDelete:true, + allowEdit:true + }); + croot.appendChild(node); + + var files = new xt.AsyncTreeNode({ + text: 'Files', + allowDrag:false, + allowDrop:true, + iconCls:'folder', + type:'fileCt', + cmpId:id, + allowDelete:false, + children:cfiles||[], + expanded:true + }); + + var dep = new xt.AsyncTreeNode({ + text: 'Dependencies', + allowDrag:false, + allowDrop:true, + iconCls:'folder', + type:'fileCt', + cmpId:id, + allowDelete:false, + children:cdep||[], + expanded:true, + allowCopy:true + }); + + var options = new xt.AsyncTreeNode({ + text: 'Optional Dependencies', + allowDrag:false, + allowDrop:true, + iconCls:'folder', + type:'fileCt', + options:true, + cmpId:id, + allowDelete:false, + children:coptions||[], + expanded:true, + allowCopy:true + }); + + node.appendChild(files); + node.appendChild(dep); + node.appendChild(options); + + return node; + } + + // remove handler + function removeNode(){ + var n = sm.getSelectedNode(); + if(n && n.attributes.allowDelete){ + ctree.getSelectionModel().selectPrevious(); + n.parentNode.removeChild(n); + } + } + + + // add option handler + function addOption(){ + var n = sm.getSelectedNode(); + if(n){ + createOption(n, 'Option'+(++oseed)); + node.select(); + ge.triggerEdit(node); + } + } + + function createOption(n, text){ + var cnode = ctree.getNodeById(n.attributes.cmpId); + + var node = new xt.TreeNode({ + text: text, + cmpId:cnode.id, + iconCls:'folder', + type:'fileCt', + allowDelete:true, + allowEdit:true, + id:guid('o-') + }); + cnode.childNodes[2].appendChild(node); + cnode.childNodes[2].expand(false, false); + + return node; + } + + // semi unique ids across edits + function guid(prefix){ + return prefix+(new Date().getTime()); + } + + + function trackSave(){ + btns.save.setDisabled(!croot.hasChildNodes()); + } + + function storeChildren(cmp, n, name){ + if(n.childrenRendered){ + cmp[name] = []; + n.eachChild(function(f){ + cmp[name].push(f.attributes); + }); + }else{ + cmp[name] = n.attributes.children || []; + } + } + + // save to the server in a format usable in PHP + function save(){ + var ch = []; + croot.eachChild(function(c){ + var cmp = { + text:c.text, + id: c.id, + options:[] + }; + + storeChildren(cmp, c.childNodes[0], 'files'); + storeChildren(cmp, c.childNodes[1], 'dep'); + + var onode = c.childNodes[2]; + if(!onode.childrenRendered){ + cmp.options = onode.attributes.children || []; + }else{ + onode.eachChild(function(o){ + var opt = Ext.apply({}, o.attributes); + storeChildren(opt, o, 'children'); + cmp.options.push(opt); + }); + } + ch.push(cmp); + }); + + layout.el.mask('Sending data to server...', 'x-mask-loading'); + var hide = layout.el.unmask.createDelegate(layout.el); + Ext.lib.Ajax.request( + 'POST', + 'save-dep.php', + {success:hide,failure:hide}, + 'data='+encodeURIComponent(Ext.encode(ch)) + ); + } + + function readNode(o){ + createComponent(o.id, o.text, o.files, o.dep, o.options); + } + + // context menus + + var ctxMenu = new Ext.menu.Menu({ + id:'copyCtx', + items: [{ + id:'expand', + handler:expandAll, + cls:'expand-all', + text:'Expand All' + },{ + id:'collapse', + handler:collapseAll, + cls:'collapse-all', + text:'Collapse All' + },'-',{ + id:'remove', + handler:removeNode, + cls:'remove-mi', + text: 'Remove Item' + }] + }); + + function prepareCtx(node, e){ + node.select(); + ctxMenu.items.get('remove')[node.attributes.allowDelete ? 'enable' : 'disable'](); + ctxMenu.showAt(e.getXY()); + } + + function collapseAll(){ + ctxMenu.hide(); + setTimeout(function(){ + croot.eachChild(function(n){ + n.collapse(false, false); + }); + }, 10); + } + + function expandAll(){ + ctxMenu.hide(); + setTimeout(function(){ + croot.eachChild(function(n){ + n.expand(false, false); + }); + }, 10); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/tree/dependency.php b/www/extras/yui-ext/examples/tree/dependency.php new file mode 100644 index 000000000..f06076769 --- /dev/null +++ b/www/extras/yui-ext/examples/tree/dependency.php @@ -0,0 +1,46 @@ +=$factor;$i++) + $val /= $factor; + $p = strpos($val, "."); + if($p !== false && $p > $digits) $val = round($val); + elseif($p !== false) $val = round($val, $digits-$p); + return round($val, $digits) . " " . $symbols[$i] . $bB; +} + + +$dir = $_REQUEST['lib'] == 'yui' ? '../../../' : '../../'; +$node = $_REQUEST['node']; +if(strpos($node, '..') !== false){ + die('Nice try buddy.'); +} + +$nodes = array(); +$d = dir($dir.$node); +while($f = $d->read()){ + if($f == '.' || $f == '..' || substr($f, 0, 1) == '.')continue; + $lastmod = date('M j, Y, g:i a',filemtime($dir.$node.'/'.$f)); + if(is_dir($dir.$node.'/'.$f)){ + $qtip = 'Type: Folder
      Last Modified: '.$lastmod; + $nodes[] = array('text'=>$f, id=>$node.'/'.$f, qtip=>$qtip, iconCls=>'folder', allowDrag=>false); + }else{ + $size = formatBytes(filesize($dir.$node.'/'.$f), 2); + $qtip = 'Type: JavaScript File
      Last Modified: '.$lastmod.'
      Size: '.$size; + $nodes[] = array('text'=>$f, id=>$node.'/'.$f, leaf=>true, qtip=>$qtip, qtipTitle=>$f, cls=>'file'); + } +} +$d->close(); +echo json_encode($nodes); +?> \ No newline at end of file diff --git a/www/extras/yui-ext/examples/tree/get-nodes.php b/www/extras/yui-ext/examples/tree/get-nodes.php new file mode 100644 index 000000000..ab2029c80 --- /dev/null +++ b/www/extras/yui-ext/examples/tree/get-nodes.php @@ -0,0 +1,43 @@ +=$factor;$i++) + $val /= $factor; + $p = strpos($val, "."); + if($p !== false && $p > $digits) $val = round($val); + elseif($p !== false) $val = round($val, $digits-$p); + return round($val, $digits) . " " . $symbols[$i] . $bB; +} +$dir = $_REQUEST['lib'] == 'yui' ? '../../../' : '../../'; +$node = $_REQUEST['node']; +if(strpos($node, '..') !== false){ + die('Nice try buddy.'); +} +$nodes = array(); +$d = dir($dir.$node); +while($f = $d->read()){ + if($f == '.' || $f == '..' || substr($f, 0, 1) == '.')continue; + $lastmod = date('M j, Y, g:i a',filemtime($dir.$node.'/'.$f)); + if(is_dir($dir.$node.'/'.$f)){ + $qtip = 'Type: Folder
      Last Modified: '.$lastmod; + $nodes[] = array('text'=>$f, id=>$node.'/'.$f/*, qtip=>$qtip*/, cls=>'folder'); + }else{ + $size = formatBytes(filesize($dir.$node.'/'.$f), 2); + $qtip = 'Type: JavaScript File
      Last Modified: '.$lastmod.'
      Size: '.$size; + $nodes[] = array('text'=>$f, id=>$node.'/'.$f, leaf=>true/*, qtip=>$qtip, qtipTitle=>$f */, cls=>'file'); + } +} +$d->close(); +echo json_encode($nodes); +?> \ No newline at end of file diff --git a/www/extras/yui-ext/examples/tree/images/cmp-bg.gif b/www/extras/yui-ext/examples/tree/images/cmp-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..5eb8b88a44e83581288092d5dadb4e7df49c319e GIT binary patch literal 830 zcmZ?wbhEHbWMmL$XlGz}^yty!$B&;pdGhq>)925hzj*QD<;$0^U%!6y=FQu;Z{NRv z|KY=jj~_pN{`~pNmoHzxe*O0C+xPF^8Aicq2n>r5Q2faP^v8b&9guH8d4hpMnn9VP ehk@}BGdr(@PQV0)gN)3q96SO73=9no4AuZ8bvvT~ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/tree/images/thumbs/dance_fever.jpg b/www/extras/yui-ext/examples/tree/images/thumbs/dance_fever.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52e708186246fa5921b70463e15726f8a0ec1d12 GIT binary patch literal 2067 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 I<_8o11qnTHt^fc4 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/tree/images/thumbs/sara_pink.jpg b/www/extras/yui-ext/examples/tree/images/thumbs/sara_pink.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a443c04ea961f17558a9abcafa4146993220a713 GIT binary patch literal 2154 zcmb7;X*`q*8^)h!#>`m8zGNA@v85bLn28wM;E;8YLrqZ$BV&(_Pzu?GNZDz!4v}3d zWl4&%PPW7#Tdy)qapb5E@9+KkUiXLl!*yT(``Tyh&jJG07FHGj2!g=k!2tV{fGNNU zha=!HP6PtM#l^{u6yZhk@E|3Gg!x6JC1qu#B~d6jrK2ix3L1(il&YSZ#vfW33`SN3 zYpAbna8w7Q{R;wead9Dekm9_&;@a{kdF}sO`_BPEPQV?AfPxADL=c1ug8N+n3IIUZ zueSdc2LOS>;0TcOz||K3ARrV9!Xcb+2=vzpc(6DGVM6j+aA5_!!&yqKh@v*NxUTcP zs2JMB)DfX`E-3gQDG3751ML5BeEc@ zyLvu^0abJ1dZozWT(2_9+AN)wv8gG~8R^{zG-ui_ljeD7%Z?cqO40d*gpiuEwN^^F zr2Hfu*&9n(2~2;$(5mhu0*t;^N02~^ozN<85^&>}HHp5^qEUU+ zh?#Q1T-=FroOC6k^3ir~!()MuHf=!$yB)n>;R$Qg^tHA(cU><9KBx!_cWh@A8lA!Q zSkTYS(}-ai2A51{hOr$^f_$Mob~~A-^=^Jg(^0j zMwm;-cJ;o|IxP5=K1$Ct*M2)A#JN0xbCF?2ob_J{kt^?*{4rJKyYhT= zvJy4@d?2S>WTd^I&*r7{K9RxpOHzM#nA@J57R|=FsE(&L;^^91-8LnamXUNrbF|3T zsu?2IZ@OWH7^6p4r_jt0V*k-AsokkTeDpkIL*DT$jePMeE7)BBSYz|(+%QW@S?>59 zKzR)nq~qi+9Y8IHKT)~=W@bfCFTJEIDGycIYE;&UY};aoknY5MG0;pk7u)g*%z7Ul zS{<&(D?+JKM`@`Hr08+rXDqOx8@t{vxN+(2GwLn!_d2my))pO}7L4v;l1`)jFTUZs zS^V01s!e0Iv1|3d2EW){GUkw=Midb0-KWCXae+1opLX{%yOy-Hs?a%`JkO$s-Kc+> z{YXEI@f6|0V0%zXO6Jwk?QlLjl6P<^}F<^3$Mht zStSDFCi)X)cpf|V6g!a(pQIBVwIJ=joB_>}MRP;&OZ(0%c&blEI3AJ<9&|6;tYV~o z8R%Wf{G;OO&4fW(H$;5wXpnYy;$Ydjy=BiSII}-CIRLs*ix%w5`tqSr;`LH0Zn!Cl|3XZZXWdUYh7r`U7hwO zs=Q3)rz2|%bA=_VoiK0%lm*Sv6AS^d-{QpV}Xww=CM8E!B9L$W(-z2fvb<^tXZ4BM1JaOAjDA4 z;^6R)Xwy^H>g+#~6NaB&_Z$i|q`2K}+{t9QxFk+i7*w#1 zJ$(0&N`7#YXzWn0%j&H3B3pjh?khh}+0_)IBqya>)t|s9|JzuSJszvVBy^oC#@3|Cj(XqpxGcGD2uakkJLTIEAlUPHGDyaGC+XXtv^X(p zD-Y9PufqSEgb$isd`v2%iH2Vo_;@$pxq6&!EoC^Qr`Ww~UloP9EBx1#fDNCstivk4 z-?->{vSazF?{isl-3yDkUZIio!6Kdv=_xO$;@~&hW#wE_2CUiGRX+?&WEWF&vipqu z#%?qbqn4Xh^}Ui)?^swKb}jrqkaL9U+F>Fsi@G?xXk`7;woT86IVEwDyFlx&L@Q*G z5bQ#`8Di*@Kkr*Ht1af(qe*vl7Yigell1kv`%L$g=5P(VfT<(Ot>Dkx%%92mR-Lq& zx8t16al7S}{_$tls;>i%U_w&x3RlpfFg%vSK05`uW_<25PI$>Q&bHwScGfA%Xs)?G zD7@gA6yLCjvCp za25L#U8C`g8ez4qJM(ky{U$QrB6`q1n&>Cf6mVbZ9)y%(9T!CD>}_^04rmC=MqFJ& x#m|nRnIn6;O7`F^A0X=T_IBdKpUYB4+yuJCh?Io<;(Th5n*E@4Y})>Ze*yL)yRZNN literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/tree/images/thumbs/sara_pumpkin.jpg b/www/extras/yui-ext/examples/tree/images/thumbs/sara_pumpkin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce9a90b717b51796096f3b254699621311a8ca37 GIT binary patch literal 2588 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 Sn(?L4V-$0l<+}T4GyevG3ZTmX literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/tree/images/thumbs/sara_smile.jpg b/www/extras/yui-ext/examples/tree/images/thumbs/sara_smile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..08919e25e8b734b659be0fafccc95df7e3254872 GIT binary patch literal 2410 zcmb7;c|6mPAICr2*e0V*@|`ueZ;t5u9itq}8KZJv%{P&d+>JRx7D{T)mfRs{QtlKQ z(MsRUkt5d9ffhLya?O6ezsKYEdpv%B{$B4tpRf1x{T7T1rU0b1g_Q*W0)YVH?f`;G zzzl#xp)ja090r4lh`{$CB*hS-q6le;eS0NkFmkdo7%Wy^`LK$-qJ|O{t9nFD<4+tO zkC#)?BOKK-Jgkk^`bPp15fMR%BG6)DXe|Y-g4X{X0Ruq60TK`e0Vx7t6bOO>33>o5 z0Dy%5`S!mN0wBUr7zhmCrALtf7z6=Bpde8p$iF)vFa!`n2`fn8OrZM|?Y+XNl1f_I z_{@^}uE8akslz2@vrp!`o6;Zv@;}<$I}ost@Gg=^?IHjS-ZlLvAQTv~tK4U@D-=us zh<`W=f&z>HhMHr6&P!Pg6q%`Tyf4jp=JW674rS8#dH0u{BX8<|0vjmfKOGBv+sB@7 za$kKmP3`f+!_Q?nFu|#~d)QljiMN zH|3LV;&Mvgs_tX=UP>E7=9E~?L|dBKi>vw@8}C+2H@d{zXdt5fHSLDaw<-2#i^c8R z6W-eTZ%XF4;*NKl;f3pG-^djzl%4X5sr^O?;ve_TUww52jI+NO=HT3*6E}5L20n><{Z^p-dT~>!GH7@ax}4=>r0Q_RCda6Ws9^KWCu=fe4WLo z9@o2#@Eh)@9cH9Z`*lkKb5dP%ih)T^YRg}LJ^IbjZFo~Hc?5r~kEB8=xkh1Bzj-Th zAVqnJ+H-#|&5Uw!`rM8CO0k~4mC*Yq2VREmzYi2!=j&f8RhbVbzI?_}Oi*lbdTCVT zGPOC946W&#iv!M_-UiQ zRHku){-5%Xg=W#?Uqr~W6#nX zif2i|>}}3Y_`Cq{37I8<5*{g8axp&rm1H&}DKX*gfE`XP65c*O4T{HH6hvg9<26qj8eGA@oj=)lI<-8RD zC%_3hl+$(4qgjMZ{i&kB_)jF4-0}(kQErgW#XH}CrDQ|POg8!FOn?U_zRR$3u*kOT zBBf6v;7~3dDZZ=#@fr(`7zf%~kK4sc?Dw>Q>r{mz-}mp$Wlk5Y;0c_>{VO3_Rqk~% z`5Cd{Mja|Iw$$4MfU;OKy3BOsPh+E6X-(msVMR*KcGiA(tl+0w9vcYM^y)CJj^&eLIR4dvJ}f$kfr=Ul>Ar zu{n?!_rPeU=Ytv5h#A^E%T3uMY+5y+OU(Q{S|P7!#F1{Tx*NSN&q-&0}r-j(Z@G09U*Nk_9= zJ{(&-9MP!c_=o6KlPN3{ICd5_nwqlYEzMLUs78ZxfAgZVQT39Wp*2}1D|j6JVSMkG ztkW(!cR02vhqg~TmPLJ|6mQ9c^3NJAro%`drChI>|8BaN?OYhr7I(=S4H$+F} zu54%gYV?4CUP$G{4W|bN;__}Q$_sIXsyP~=LT{-+0JJW-#CvEwsL$odd|u9E+_1AQDw%e&Rher;xk2E1n~Sq4=SY6j+w-7 zi}sxNv^gTL%2+?oU%j=!i;|2gi1*1qQQtfi{!OD+X{sq1tRBJmX*4}sbot$Fo6FBp z;|qJmjaLN#OaC_kP{uC}+~k#NN+&e{J&41MF?%FcSJE@XV&lM4{2c4=nc^F{=bY^x z6r6{CHKfj&dPD`s8U(g?*sO%?sSWDB=j}!15>@HEd6T2uPLtKrR%g`mE!i^Z9SlI5 zUf*fjPJkCs6N|23O!fQGd@V)+)-R)KlA~65=ZGgd(1iPUo*}=&c114to?O5b^o6qb za9=?u!#FbRcFNV%vOwONT>7+qtJZV0I9$exec4a1Z1HZbZ8woAg|lC%Q97wA4KpCK pM@!d)JgVyOuiZV-VdsBN)A*6)9ucLk>LQ|S9=4ONZWk_i|1UnHN2~w< literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/tree/images/thumbs/up_to_something.jpg b/www/extras/yui-ext/examples/tree/images/thumbs/up_to_something.jpg new file mode 100644 index 0000000000000000000000000000000000000000..771ea91f10c95e863fcc573cb926b46e77487d8b GIT binary patch literal 2120 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 N+GH22e5!TvY literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/tree/images/thumbs/zack_dress.jpg b/www/extras/yui-ext/examples/tree/images/thumbs/zack_dress.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b15f551920a769c6e3960078da0bf2d6d2e093d9 GIT binary patch literal 2645 zcmb7^_aoGgAIIM}+&O!sj5F@2bVfNx#F?25S#iUaS$;48UhUcG* zrlK+q`v(F-AP`)fT*BPk!dMg%h5f(9Y6bY&fonhz1cU~_{2&NFh}8}t0RRF({?z>| zC>sobz`-E)Ll@5nfI$#27zSs9Lm_`QKwt;})wfJ}N;^Ck{lh(k|3x2WfdSBAz@aC{e;5n~0}wXEU;B{Fk5YmP=(3@) z=1zjr%6fkHsny?DV*nQfbXXa}4`>6k7!zqBJI(CC^Z9pr^decnv5w;p%r1DE+(C6B z_B16EmDXHXfO|u}rZgGo@=Jrm%D0@6TMGI`^g5jzI=+6BSAW40SB_cE5mi!$)@LHH zhGxOj*}7X=-q7TGmIIkaXm>nymvB7J$c(YX;m_sdU2h07RtmF)-sU<;X{)2Bni(<|_vCr)0 zaDc}w>QCm5O494A$6}h)YD07gYevG=T1*^i0nd;~t;^Ev6%H*)Hw4@h{9Gd-U4g<{ zgp;cTJMa2ewPIcz*$+HXcqa;8(2g68+pLlk| zG;{bN^OoI4*;t%cBBB^c$kf5>;o1^a@GRimsn_vhms>wM_iz2a6^n0bdg)OBdamAF zFTt@q8&BUv_2spU^Y2m#b~mWqLeZ$9VZj=n&5O`pN>HAPBE#v;PM%rH*o;eIv%KRE z1%IBT56o3k`*@6#{kZAF5CO1GoAkWRq)>)L_b@rYRp#q^N2`!H{IMU6JksgpoKYeX z!#h|{H}vJX+Zpl62Sw>#47PS5*wkKrClx=gSowTYavXhfWVC2T%i!EWng0?kMz*2* z%Lyx;aoGt)v!rr*8c7@@TC~;RUCO0A)-P8klQ&+g7r6vK2O&1auND2U=#UD^pHj}?I%V125!FCwGeT(d9+|7*SQF>Z19>Xl^ESnC#VrK&i*kCXN_`juM0DbzK^ zPDh+4|2EmLC(Og3JvgpYqck-vZVdM6Y;;%TT}*$0GW$lQ%fZc=uC$-OtcVXoEoFa* zmV6Y8S+c^fQopE_tQW5o7~ScTyf&vm%NWTCD^>ncIVKHo3<)Y-jKH>M_X<86zYrRP zM&e(exx5GJ*_Si8dw$qYh|%rXaic!t%5Kh!&Z%EcA0LFjA*9Us)>|Sx@AL(faED%i z4frVJE1by17?T?(bwwPo7_owoufGCKP%)DyQ%>CBjJibMk&p=W3|x$~YTBKduOJRE zDr_G=p}{7HdcJ=3-rA$c4xUM1M_%a2)f_etpjZUHmrK?iVb~b^f0Dz}pjcT??p9n- zIc9;7wpeItP&QH4QRwRCHX~gMflOXPH|`x*@>O&DJRB<(+8I0;Fz9_BV;;8hhEtHc zM@Ol@(watzK}qO$$JF#y!a-Tx@8X$<@MMVOGCLs? zhDkhDjM~Q2y=j<&vg2LDroQcfIShm(#=(38+vuKL! zhRj2lyouUw(m6+zadv@cwPtm-`Rq%#Igc%j7r`%(ocAcfS!a-PeWHq_GE|xWx&HRZ z>IyLoS1B4{OKsl%(zk0?^h;A9PVq`Wntt=0>7T>3jE(0lr^I_;ZcsCUW>cz8T?3CD zC0zHTomi-_J{ylB9G4V7V#sRuJa-zpNKqsdVyL0l^

      ie{x#qi%=4A!%wA6y)>0ieI&y56C$7E-s0|G#^R-Cs-_k z5-IhOBcUgx}tzgj8A z0zxwLtzlL&)m;IYP>Tb+cGt31-Cm#8xAGKK%9Jw4j4CH^M&0Kkv`{cQIdaP2mcyjM zPArrBRpnCssL3skU%g)yr7}cq3(3D`B6OCk;ZlsZErfvYu>r^9=3UaX2E*LnI!tu$ zn9&R5TfbE#@qUIm$LePkrd(;uW^f&KiIxCoFX`_WYk$}(Y!aE0OJD&bT2{XUE9_YS zxvxwTtU{@g+}!uDUz1Nhw+QMq?0P(5t|q+b5V~RjOX!v{-M#4WE>1hNOz}3tGGAbSoe1xU)sFpmUd1qBXuchnH)m5#b8t$1~r`MgCY9m+$x~SgH U**vZNmPTXd!Zz!MPqIe;2N6lShyVZp literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/tree/images/thumbs/zack_hat.jpg b/www/extras/yui-ext/examples/tree/images/thumbs/zack_hat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df475ba6e9c8e88a344d1dbe720664826e5bf0ac GIT binary patch literal 2323 zcmb8pdpOe#8wc>;Y_k@|SS6dY#gNz>Mnfnlr#U>a<`_Z|_Qb2}eXr}i-ap^_{^S1Rd*7ey-W%PU0z@oK%}oIi2n5XTH?TJj zm;eX(`CFiJW&Rdo$b zO-*S*~Y;jm^=1k zZ%co6`>F;ql%hQtRXvS&t#Q~&TOjmSS*MFfU9+`C@{^Z31A`^wzRl=koGL_ZEyIH` z>0J7FBWn4xmRHGE+=?-6TOm6ZG#i};j7M&;y#lHh@b}$a`LCP23f(NT5){bA4WOZE zo_$9N9pW8(z%^k3GChB)Apu<<#^%Sxo2$W-y5M;JIyeJ7gC1> zL5m=?~<* zez4gLw>LDAT6RXf1HKsLBNL2T3Y*PAklBXE=by=h=N=w@e@pig<1r_VwnYhJF6reA zM}?O&y(Urw>Y zS=WU!3kbLk0XmUq_rd2pcRS|qvqLO!k6W9e&$@xkh?a_w+V1yrakwj|6+hnC1CnmM zPTrcw>EJAr^dw6K97##b-4}ea0~OOd{M6$E9v>XtoN?CCv6*lo6*Cof!mHlFKH2I; z@j1SKd)r)>ev`BHXI_!ib{UW1vl+B%BGDOdbU87`X<@7(LMydG8K2y^9=cmm=JzlI zn?MR%-vj!y2%($vycM18k$^*%MZIEVnmo~6-GDx(b=Z~S_0@7TE#1UUN9owDfJ6%A zojPHoq+KRYeS+Ah?!DE1dDPT9kcx_fy)?$uUJivt`fFI+U66A8$|a{YWG z=_Kf#kdF8qRiutu4wny1bbn|r>vCLS^c{|3Y_Lm!VzRqNO<+g@x3eP=N^K#=BnH-FQ0I%Q|uun3zo5}cAQRYI(Da3^NBpqxK}b3#m5UOZg@y|s5QOL?xLY}^nRu~8KF#iQmZd{u+}0X z%8r@RQ}JoV?J8t-jxV>5qR8rf-y7ljFgy3>^_ilcP_ZqlMlOL>2V z0zq@a>!U{+`?J<0qUovA6ucYJOMFUxvU9N9?5#p{r`Y#);MeAJmFt`pW6p%s(mkGC zV@cDK$>>&MQd7x!^KxPrntCp0t!2G=uAVpW)L&e)F!s*E!f@v0I5LXWJRXDt^m~Zm zcZ0)DYyOCYHf8m-Yxk@6ah*leP74<&BZRJ*-w5=JYX0Me!Gw4pZ=kY=|9ZFYPI%Gf z_yBms6xJ7X?!Y3L?ggTC*wU zvPd_psxvy(zSVc?zaG4bnjsbI6IKUPyNH=}kHz{)rkR z`;@-J=S80<@8d@dL>h0#7Q_k)2O&ON)W^vx;IsT8hRCJDUpza*_~#yV|LE7%nQ|Uj zh8Ny~_&Edx`ohI=PfFxxFLA{zKN3eHH^gqtonm}*A+s10q^#?M1{thx=_cX}3^Tv` z&tg{&5YfVoB=fw20#%I{tSoJ!jDOg$b3{%ebN)r;U{85#LVW&gO=%5RTaQP5+>p-2 zSFp7qZ8g~4s#^G=p@r5vUDcT!8>N*9 zW?Q)|D2VfAx_U*LF-?qL6_Y$r6H||@-l7=RvXAgz2G|hwidf`XGfeSdFbvz&TwcPu zP@fQoZJ=M70H@f08ccfbYcGmQTd_{qu?fDRHX2$=t0! ztUYP{9Ze^dR=1xEKGEuAr92lFclsVMhn`!4QWvr*SguXu8^3^LXN}a-!}AXQ+9#KM znH@O|pLZ=F%-$(z-Z^A?xBlzp3z_G+v7$Tyv}nmqogXQOgUGG9YGR4~di1bUl z9~F&;-s94&UyJ4eKEi1mIk+#~_!)BBcWF75c-OO@bnnrrHH1N7R+z1D%^ccZi`|xr z?30WAb#L|J_+;P|AypmU>?T^X3a0CK+?u6+IsMplnTC+64 HY>)jfy73bA literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/tree/images/thumbs/zack_sink.jpg b/www/extras/yui-ext/examples/tree/images/thumbs/zack_sink.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01badd3da721725bfc34c041425b973ac8484854 GIT binary patch literal 2303 zcmb7=c|6mPAICql*xc5pn9Xdi+{}ELGs&GJBwOSP-%v}MqtrJfCCBDYZkBuv;ps=et-U6??0cf_w)UDybnGdOaVd`Cgvsp2m}J=4+l6H1&jbF z7Z-$!6AFPqxVfP`ds+oT4NObwX24QB{pVAYf#P zdRlm0Wpx7nw*WDvkbw{|2nTS$Kwuc?pcN1U01gf? z2>4IHM>x3v4#;n)F9dLaz#JS9Fcb>;cLT%$29Cfuu}9Uo;5fsx?sR-WI70H2U0y}Y z3Pe~+-Tr#-G{NY!M_@$a;l3yc0RR5Pf8|hcg!2$#V29{`PlGsM;6pJSZ-_e>0r-An z7#Ic^0E`VU1OF`GQ!b@;cc9vRG)=yE!)?Zi=T5T!s~n3ardxT_xiyuAfQ2&O5p?(R zRtD!8s=K*&hdc@`@=}0TT`r=uYn)>$vwAd(zf%hTDek;>q)+4};gA`fH;@ zhf0+5u14#2YPiL-gnKS!W@c6x#Oa{q#vZK-TbPu9C%>30M_#$Keu3JVhxGCYVa+D$ zZT6_VGUZleyds~#tbSfC3m?dBk;e;|rttT}GX*VbhNaaDUceIy;%>0l%hm7dWurW0 zJ6J_X#n}Ex6Txd6d6f=Ror5v=dL14~b0^+~$1C5m>uVd;kTA3jux$7U6O$r|w0RM} zkWR+b+~@gvt#T{t*K@yI!;zC_Wz-^PjhcchvKnk)H-6w_nsmLVZ(rJy4W@vKFczK? zu6w39ZY*ql!lM=edTIV_&(a~<`kX+yRQZxgW={^S=jrVtkeZuSLFAP^ST>6h_s;!=CZhwOf@5bae zS*{hb5JD$e!>hXrS`A~~nN5KTXLVmku+x2c2RpPHV_e$s8<1R1XGg~#k{M6jM4Ik# zH70i6`I69+xNVH~f@;N|9-i-?^)Mu|8maCZ_xF>>>-Xq__vHo}e#j-q6+SM=<^TuH zP3Z&n(@D(5t+WJ`GjUQ}Lp119jUxo59+_kD(Xa1VHE!mHE^%5!!FjCd061P1GP5RQ zEM!Y|Fu^i_@XQb%#Lat0jS#)vgQkjEc9qxJzhcJKbok;^>Mb4b+y;9e4?&^g3I)Er#UEahV^tXBfvEhN42^*NQ6mg z**2Y_$4iFWqmhr5nHN`K=ez^&3YdXu`c#Vqn}&gcB#ygzv7qUZxT1$^D z$3~JDGV&@P7p2OW#iU4RD!UAHTM++{i?2T~T-@)1{x%zp8ytVi8|CB7_cQpjFuAVJ zr|+MQ3ylj(50bm08=%}eSLn0yS9{1+ujqOA?J%Nm1mFqs>=#m1*&VJ85$x&t8)4k& zN5@btU27V>#I3Fy8U3!V7cVH&^j>6b#(oWHDNJ?bL?n%Mh$1__<## z;^Yzy)0MlLL~8Ey0hb2rfErb}rGBX`1duP3GRlgTW?{N$?{6Z@IoNR$mDxN}7z%QY z=9YRmOw_p>w#urYXk__?Io`thZ;n<+u~UDrCHv=(mYIln0^6QC*NeLapE4gmI+v1- zAAb~~c{YI&@5##Fw1U1H8gHF;s`V8{XXAp-b(C$oq&>t^sqz7tu(;yx?*->|gB6!~ zwJnidVkHH9C32mTtw`Q3hl>%5%q#PKP6XDSd6> zqER$F&1W!Xx>-28(Bjz!UF-?JW~^H4(;idn(|XgcOr*RL$EGaB5m@o1F-a0J=7Jx+ z=f15x6HmP%@YSjQLJ4=Nq+2*y_PTofN`Rvwm2Jupx~Ms%VGmajlCx_%+r4xE81KCA z0|f?pQ82ftS?*ha0rHFXok-!hd&lzGnocwoSVFeW_RuQ@O4&s9bc2D@&VYv;bz#JX zr)%^j7K=RS3}4XG;~US}{D{+;fpHILfK`<_^EJRjJ7F>$x1u|CY;2J-<(Ay97Hd9Wk9}NEsLK+Ze literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/tree/images/thumbs/zacks_grill.jpg b/www/extras/yui-ext/examples/tree/images/thumbs/zacks_grill.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5ca1ef630f6b3302e631497aabd1b537ad595570 GIT binary patch literal 2825 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 + + +Organizing Images into Albums + + + + + + + + + + + + + + +

      Organizing Images into Albums

      +

      This example shows demonstrates how you can drop anything into the tree.

      +

      This example also shows how a customized DragZone can be +applied to a JsonView to get automatic lightweight drag and drop of asynchronously loaded data.

      +

      The js is not minified so it is readable. See organizer.js. The multi image drag drop added a little complexity to the code, but hopefully it is still easy to follow. +

      For simplicity, there is no validation on the names you enter in the tree node editor and you can drag the same picture +into an album as many times as you want.

      +

      Hold shift/control to select multiple images in the main images view. You can drag those images into the tree. + +

      +




      + + diff --git a/www/extras/yui-ext/examples/tree/organizer.js b/www/extras/yui-ext/examples/tree/organizer.js new file mode 100644 index 000000000..5ed181656 --- /dev/null +++ b/www/extras/yui-ext/examples/tree/organizer.js @@ -0,0 +1,241 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +var TreeTest = function(){ + // shorthand + var Tree = Ext.tree; + var newIndex = 3; + + return { + init : function(){ + Ext.QuickTips.init(); + var layout = new Ext.BorderLayout('layout', { + west: { + initialSize:200, + split:true, + titlebar:true + }, + center: { + alwaysShowTabs:true, + tabPosition:'top' + } + }); + + var albums = layout.getEl().createChild({tag:'div', id:'albums'}); + var tb = new Ext.Toolbar(albums.createChild({tag:'div'})); + tb.addButton({ + text: 'New Album', + cls: 'x-btn-text-icon album-btn', + handler: function(){ + var node = root.appendChild(new Tree.TreeNode({ + text:'Album ' + (++newIndex), + cls:'album-node', + allowDrag:false + })); + tree.getSelectionModel().select(node); + setTimeout(function(){ + ge.editNode = node; + ge.startEdit(node.ui.textNode); + }, 10); + } + }); + var viewEl = albums.createChild({tag:'div', id:'folders'}); + + var folders = layout.add('west', new Ext.ContentPanel(albums, { + title:'My Albums', + fitToFrame:true, + autoScroll:true, + autoCreate:true, + toolbar: tb, + resizeEl:viewEl + })); + + var images = layout.add('center', new Ext.ContentPanel('images', { + title:'My Images', + fitToFrame:true, + autoScroll:true, + autoCreate:true + })); + var imgBody = images.getEl(); + + var tree = new Tree.TreePanel(viewEl, { + animate:true, + enableDD:true, + containerScroll: true, + ddGroup: 'organizerDD', + rootVisible:false + }); + var root = new Tree.TreeNode({ + text: 'Albums', + allowDrag:false, + allowDrop:false + }); + tree.setRootNode(root); + + root.appendChild( + new Tree.TreeNode({text:'Album 1', cls:'album-node', allowDrag:false}), + new Tree.TreeNode({text:'Album 2', cls:'album-node', allowDrag:false}), + new Tree.TreeNode({text:'Album 3', cls:'album-node', allowDrag:false}) + ); + + tree.render(); + root.expand(); + + // add an inline editor for the nodes + var ge = new Ext.tree.TreeEditor(tree, { + allowBlank:false, + blankText:'A name is required', + selectOnFocus:true + }); + + // create the required templates + var tpl = new Ext.Template( + '
      ' + + '
      ' + + '{shortName}
      ' + ); + + var qtipTpl = new Ext.Template( + '
      '+ + 'Image Name:' + + '{name}' + + 'Size:' + + '{sizeString}
      ' + ); + qtipTpl.compile(); + + // initialize the View + var view = new Ext.JsonView(imgBody, tpl, { + multiSelect: true, + jsonRoot: 'images' + }); + + var lookup = {}; + + view.prepareData = function(data){ + data.shortName = data.name.ellipse(15); + data.sizeString = (Math.round(((data.size*10) / 1024))/10) + " KB"; + //data.dateString = new Date(data.lastmod).format("m/d/Y g:i a"); + data.qtip = new String(qtipTpl.applyTemplate(data)); + lookup[data.name] = data; + return data; + }; + + var dragZone = new ImageDragZone(view, {containerScroll:true, + ddGroup: 'organizerDD'}); + + view.load({ + url: '../view/get-images.php' + }); + + var rz = new Ext.Resizable('layout', { + wrap:true, + pinned:true, + adjustments:[-6,-6], + minWidth:300 + }); + rz.on('resize', function(){ + layout.layout(); + }); + rz.resizeTo(650, 350); + } + }; +}(); + +Ext.EventManager.onDocumentReady(TreeTest.init, TreeTest, true); + +/** + * Create a DragZone instance for our JsonView + */ +ImageDragZone = function(view, config){ + this.view = view; + ImageDragZone.superclass.constructor.call(this, view.getEl(), config); +}; +Ext.extend(ImageDragZone, Ext.dd.DragZone, { + // We don't want to register our image elements, so let's + // override the default registry lookup to fetch the image + // from the event instead + getDragData : function(e){ + e = Ext.EventObject.setEvent(e); + var target = e.getTarget('.thumb-wrap'); + if(target){ + var view = this.view; + if(!view.isSelected(target)){ + view.select(target, e.ctrlKey); + } + var selNodes = view.getSelectedNodes(); + var dragData = { + nodes: selNodes + }; + if(selNodes.length == 1){ + dragData.ddel = target.firstChild.firstChild; // the img element + dragData.single = true; + }else{ + var div = document.createElement('div'); // create the multi element drag "ghost" + div.className = 'multi-proxy'; + for(var i = 0, len = selNodes.length; i < len; i++){ + div.appendChild(selNodes[i].firstChild.firstChild.cloneNode(true)); + if((i+1) % 3 == 0){ + div.appendChild(document.createElement('br')); + } + } + dragData.ddel = div; + dragData.multi = true; + } + return dragData; + } + return false; + }, + + // this method is called by the TreeDropZone after a node drop + // to get the new tree node (there are also other way, but this is easiest) + getTreeNode : function(){ + var treeNodes = []; + var nodeData = this.view.getNodeData(this.dragData.nodes); + for(var i = 0, len = nodeData.length; i < len; i++){ + var data = nodeData[i]; + treeNodes.push(new Ext.tree.TreeNode({ + text: data.name, + icon: data.url, + data: data, + leaf:true, + cls: 'image-node', + qtip: data.qtip + })); + } + return treeNodes; + }, + + // the default action is to "highlight" after a bad drop + // but since an image can't be highlighted, let's frame it + afterRepair:function(){ + for(var i = 0, len = this.dragData.nodes.length; i < len; i++){ + Ext.fly(this.dragData.nodes[i]).frame('#8db2e3', 1); + } + this.dragging = false; + }, + + // override the default repairXY with one offset for the margins and padding + getRepairXY : function(e){ + if(!this.dragData.multi){ + var xy = Ext.Element.fly(this.dragData.ddel).getXY(); + xy[0]+=3;xy[1]+=3; + return xy; + } + return false; + } +}); + +// Utility functions + +String.prototype.ellipse = function(maxLength){ + if(this.length > maxLength){ + return this.substr(0, maxLength-3) + '...'; + } + return this; +}; \ No newline at end of file diff --git a/www/extras/yui-ext/examples/tree/reorder.html b/www/extras/yui-ext/examples/tree/reorder.html new file mode 100644 index 000000000..72403d7e2 --- /dev/null +++ b/www/extras/yui-ext/examples/tree/reorder.html @@ -0,0 +1,27 @@ + + + +Reorder TreePanel + + + + + + + + + + + +

      Drag and Drop ordering in a TreePanel

      +

      This example shows basic drag and drop node moving in a tree. In this implementation there are no restrictions and +anything can be dropped anywhere except appending to nodes marked "leaf" (the files).

      +

      Drag along the edge of the tree to trigger auto scrolling while performing a drag and drop.

      +

      In order to demonstrate drag and drop insertion points, sorting was not enabled.

      +

      The data for this tree is asynchronously loaded with a JSON TreeLoader.

      +

      The js is not minified so it is readable. See reorder.js.

      + +
      + + + diff --git a/www/extras/yui-ext/examples/tree/reorder.js b/www/extras/yui-ext/examples/tree/reorder.js new file mode 100644 index 000000000..53186bfb2 --- /dev/null +++ b/www/extras/yui-ext/examples/tree/reorder.js @@ -0,0 +1,31 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.onReady(function(){ + // shorthand + var Tree = Ext.tree; + + var tree = new Tree.TreePanel('tree-div', { + animate:true, + loader: new Tree.TreeLoader({dataUrl:'get-nodes.php'}), + enableDD:true, + containerScroll: true + }); + + // set the root node + var root = new Tree.AsyncTreeNode({ + text: 'Ext JS', + draggable:false, + id:'source' + }); + tree.setRootNode(root); + + // render the tree + tree.render(); + root.expand(); +}); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/tree/save-dep.php b/www/extras/yui-ext/examples/tree/save-dep.php new file mode 100644 index 000000000..d8d4d8f6e --- /dev/null +++ b/www/extras/yui-ext/examples/tree/save-dep.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/www/extras/yui-ext/examples/tree/two-trees.html b/www/extras/yui-ext/examples/tree/two-trees.html new file mode 100644 index 000000000..dd3d34fef --- /dev/null +++ b/www/extras/yui-ext/examples/tree/two-trees.html @@ -0,0 +1,43 @@ + + + +Drag and Drop between 2 TreePanels + + + + + + + + + + + + +

      Drag and Drop betweens two TreePanels

      +

      The TreePanels have a TreeSorter applied in "folderSort" mode.

      +

      Both TreePanels are in "appendOnly" drop mode since they are sorted.

      +

      Drag along the edge of the tree to trigger auto scrolling while performing a drag and drop.

      +

      The data for this tree is asynchronously loaded with a JSON TreeLoader.

      +

      The js is not minified so it is readable. See two-trees.js.

      + +
      +
      + + + diff --git a/www/extras/yui-ext/examples/tree/two-trees.js b/www/extras/yui-ext/examples/tree/two-trees.js new file mode 100644 index 000000000..f770d177f --- /dev/null +++ b/www/extras/yui-ext/examples/tree/two-trees.js @@ -0,0 +1,72 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +var TreeTest = function(){ + // shorthand + var Tree = Ext.tree; + + return { + init : function(){ + // yui-ext tree + var tree = new Tree.TreePanel('tree', { + animate:true, + loader: new Tree.TreeLoader({dataUrl:'get-nodes.php'}), + enableDD:true, + containerScroll: true, + dropConfig: {appendOnly:true} + }); + + // add a tree sorter in folder mode + new Tree.TreeSorter(tree, {folderSort:true}); + + // set the root node + var root = new Tree.AsyncTreeNode({ + text: 'Ext JS', + draggable:false, // disable root node dragging + id:'source' + }); + tree.setRootNode(root); + + // render the tree + tree.render(); + + root.expand(false, /*no anim*/ false); + + //------------------------------------------------------------- + + // YUI tree + var tree2 = new Tree.TreePanel('tree2', { + animate:true, + //rootVisible: false, + loader: new Ext.tree.TreeLoader({ + dataUrl:'get-nodes.php', + baseParams: {lib:'yui'} // custom http params + }), + containerScroll: true, + enableDD:true, + dropConfig: {appendOnly:true} + }); + + // add a tree sorter in folder mode + new Tree.TreeSorter(tree2, {folderSort:true}); + + // add the root node + var root2 = new Tree.AsyncTreeNode({ + text: 'Yahoo! UI Source', + draggable:false, + id:'yui' + }); + tree2.setRootNode(root2); + tree2.render(); + + root2.expand(false, /*no anim*/ false); + } + }; +}(); + +Ext.EventManager.onDocumentReady(TreeTest.init, TreeTest, true); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/view/chooser-example.js b/www/extras/yui-ext/examples/view/chooser-example.js new file mode 100644 index 000000000..93859830b --- /dev/null +++ b/www/extras/yui-ext/examples/view/chooser-example.js @@ -0,0 +1,34 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.onReady(function(){ + var chooser, btn; + + function insertImage(data){ + Ext.DomHelper.append('images', { + tag: 'img', src: data.url, style:'margin:10px;visibility:hidden;' + }, true).show(true); + btn.getEl().focus(); + }; + + function choose(btn){ + if(!chooser){ + chooser = new ImageChooser({ + url:'get-images.php', + width:515, + height:400 + }); + } + chooser.show(btn.getEl(), insertImage); + }; + + btn = new Ext.Button('buttons', { + text: "Insert Image", + handler: choose + }); +}); diff --git a/www/extras/yui-ext/examples/view/chooser.css b/www/extras/yui-ext/examples/view/chooser.css new file mode 100644 index 000000000..4aee1ea3e --- /dev/null +++ b/www/extras/yui-ext/examples/view/chooser.css @@ -0,0 +1,72 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.details{ + padding: 10px; + text-align: center; +} +.details-info{ + border-top: 1px solid #cccccc; + font: 11px Arial, Helvetica, sans-serif; + margin-top: 5px; + padding-top: 5px; + text-align: left; +} +.details-info b{ + color: #555555; + display: block; + margin-bottom: 4px; +} +.details-info span{ + display: block; + margin-bottom: 5px; + margin-left: 5px; +} +.ychooser-dlg select{ + font-size: 12px; +} +.ychooser-view{ + background: white; + font: 11px Arial, Helvetica, sans-serif; + overflow: auto; +} +.ychooser-view .thumb{ + background: #dddddd; + padding: 3px; +} +.ychooser-view .thumb img{ + height: 60px; + width: 80px; +} +.ychooser-view .thumb-wrap{ + float: left; + margin: 4px; + margin-right: 0; + padding: 5px; +} +.ychooser-view .thumb-wrap span{ + display: block; + overflow: hidden; + text-align: center; +} +.ychooser-view .x-view-selected{ + background: #c3daf9; + border: 2px solid #6593cf; + padding: 3px; +} +.ychooser-view .x-view-selected .thumb{ + background:transparent; +} +.ychooser-view .loading-indicator { + font-size:11px; + background-image:url('../../resources/images/grid/loading.gif'); + background-repeat: no-repeat; + background-position: left; + padding-left:20px; + margin:10px; +} diff --git a/www/extras/yui-ext/examples/view/chooser.html b/www/extras/yui-ext/examples/view/chooser.html new file mode 100644 index 000000000..58353ad6f --- /dev/null +++ b/www/extras/yui-ext/examples/view/chooser.html @@ -0,0 +1,26 @@ + + + + + JsonView Example + + + + + + + + + + + + + + +

      JsonView Example

      +

      This example demonstrates how to use some of the advanced features of a JsonView. It also shows how + to use the LayoutDialog and DomHelper.Template classes.

      +
      +
      + + \ No newline at end of file diff --git a/www/extras/yui-ext/examples/view/chooser.js b/www/extras/yui-ext/examples/view/chooser.js new file mode 100644 index 000000000..ec36461f3 --- /dev/null +++ b/www/extras/yui-ext/examples/view/chooser.js @@ -0,0 +1,204 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +var ImageChooser = function(config){ + // create the dialog from scratch + var dlg = new Ext.LayoutDialog(config.id || Ext.id(), { + autoCreate : true, + minWidth:400, + minHeight:300, + syncHeightBeforeShow: true, + shadow:true, + fixedcenter:true, + center:{autoScroll:false}, + east:{split:true,initialSize:150,minSize:150,maxSize:250} + }); + dlg.setTitle('Choose an Image'); + dlg.getEl().addClass('ychooser-dlg'); + dlg.addKeyListener(27, dlg.hide, dlg); + + // add some buttons + this.ok = dlg.addButton('OK', this.doCallback, this); + this.ok.disable(); + dlg.setDefaultButton(dlg.addButton('Cancel', dlg.hide, dlg)); + dlg.on('show', this.load, this); + this.dlg = dlg; + var layout = dlg.getLayout(); + + // filter/sorting toolbar + this.tb = new Ext.Toolbar(this.dlg.body.createChild({tag:'div'})); + this.sortSelect = Ext.DomHelper.append(this.dlg.body.dom, { + tag:'select', children: [ + {tag: 'option', value:'name', selected: 'true', html:'Name'}, + {tag: 'option', value:'size', html:'File Size'}, + {tag: 'option', value:'lastmod', html:'Last Modified'} + ] + }, true); + this.sortSelect.on('change', this.sortImages, this, true); + + this.txtFilter = Ext.DomHelper.append(this.dlg.body.dom, { + tag:'input', type:'text', size:'12'}, true); + + this.txtFilter.on('focus', function(){this.dom.select();}); + this.txtFilter.on('keyup', this.filter, this, {buffer:500}); + + this.tb.add('Filter:', this.txtFilter.dom, 'separator', 'Sort By:', this.sortSelect.dom); + + // add the panels to the layout + layout.beginUpdate(); + var vp = layout.add('center', new Ext.ContentPanel(Ext.id(), { + autoCreate : true, + toolbar: this.tb, + fitToFrame:true + })); + var dp = layout.add('east', new Ext.ContentPanel(Ext.id(), { + autoCreate : true, + fitToFrame:true + })); + layout.endUpdate(); + + var bodyEl = vp.getEl(); + bodyEl.appendChild(this.tb.getEl()); + var viewBody = bodyEl.createChild({tag:'div', cls:'ychooser-view'}); + vp.resizeEl = viewBody; + + this.detailEl = dp.getEl(); + + // create the required templates + this.thumbTemplate = new Ext.Template( + '
      ' + + '
      ' + + '{shortName}
      ' + ); + this.thumbTemplate.compile(); + + this.detailsTemplate = new Ext.Template( + '
      ' + + 'Image Name:' + + '{name}' + + 'Size:' + + '{sizeString}' + + 'Last Modified:' + + '{dateString}
      ' + ); + this.detailsTemplate.compile(); + + // initialize the View + this.view = new Ext.JsonView(viewBody, this.thumbTemplate, { + singleSelect: true, + jsonRoot: 'images', + emptyText : '
      No images match the specified filter
      ' + }); + this.view.on('selectionchange', this.showDetails, this, {buffer:100}); + this.view.on('dblclick', this.doCallback, this); + this.view.on('loadexception', this.onLoadException, this); + this.view.on('beforeselect', function(view){ + return view.getCount() > 0; + }); + Ext.apply(this, config, { + width: 540, height: 400 + }); + + var formatSize = function(size){ + if(size < 1024) { + return size + " bytes"; + } else { + return (Math.round(((size*10) / 1024))/10) + " KB"; + } + }; + + // cache data by image name for easy lookup + var lookup = {}; + // make some values pretty for display + this.view.prepareData = function(data){ + data.shortName = data.name.ellipse(15); + data.sizeString = formatSize(data.size); + data.dateString = new Date(data.lastmod).format("m/d/Y g:i a"); + lookup[data.name] = data; + return data; + }; + this.lookup = lookup; + + dlg.resizeTo(this.width, this.height); + this.loaded = false; +}; +ImageChooser.prototype = { + show : function(el, callback){ + this.reset(); + this.dlg.show(el); + this.callback = callback; + }, + + reset : function(){ + this.view.getEl().dom.scrollTop = 0; + this.view.clearFilter(); + this.txtFilter.dom.value = ''; + this.view.select(0); + }, + + load : function(){ + if(!this.loaded){ + this.view.load({url: this.url, params:this.params, callback:this.onLoad.createDelegate(this)}); + } + }, + + onLoadException : function(v,o){ + this.view.getEl().update('
      Error loading images.
      '); + }, + + filter : function(){ + var filter = this.txtFilter.dom.value; + this.view.filter('name', filter); + this.view.select(0); + }, + + onLoad : function(){ + this.loaded = true; + this.view.select(0); + }, + + sortImages : function(){ + var p = this.sortSelect.dom.value; + this.view.sort(p, p != 'name' ? 'desc' : 'asc'); + this.view.select(0); + }, + + showDetails : function(view, nodes){ + var selNode = nodes[0]; + if(selNode && this.view.getCount() > 0){ + this.ok.enable(); + var data = this.lookup[selNode.id]; + this.detailEl.hide(); + this.detailsTemplate.overwrite(this.detailEl, data); + this.detailEl.slideIn('l', {stopFx:true,duration:.2}); + + }else{ + this.ok.disable(); + this.detailEl.update(''); + } + }, + + doCallback : function(){ + var selNode = this.view.getSelectedNodes()[0]; + var callback = this.callback; + var lookup = this.lookup; + this.dlg.hide(function(){ + if(selNode && callback){ + var data = lookup[selNode.id]; + callback(data); + } + }); + } +}; + +String.prototype.ellipse = function(maxLength){ + if(this.length > maxLength){ + return this.substr(0, maxLength-3) + '...'; + } + return this; +}; \ No newline at end of file diff --git a/www/extras/yui-ext/examples/view/get-images.php b/www/extras/yui-ext/examples/view/get-images.php new file mode 100644 index 000000000..208ed83d5 --- /dev/null +++ b/www/extras/yui-ext/examples/view/get-images.php @@ -0,0 +1,15 @@ +read()){ + if(!preg_match('/\.(jpg|gif|png)$/', $name)) continue; + $size = filesize($dir.$name); + $lastmod = filemtime($dir.$name)*1000; + $images[] = array('name'=>$name, 'size'=>$size, + 'lastmod'=>$lastmod, 'url'=>$dir.$name); +} +$d->close(); +$o = array('images'=>$images); +echo json_encode($o); +?> \ No newline at end of file diff --git a/www/extras/yui-ext/examples/view/images/thumbs/dance_fever.jpg b/www/extras/yui-ext/examples/view/images/thumbs/dance_fever.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52e708186246fa5921b70463e15726f8a0ec1d12 GIT binary patch literal 2067 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 I<_8o11qnTHt^fc4 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/view/images/thumbs/sara_pink.jpg b/www/extras/yui-ext/examples/view/images/thumbs/sara_pink.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a443c04ea961f17558a9abcafa4146993220a713 GIT binary patch literal 2154 zcmb7;X*`q*8^)h!#>`m8zGNA@v85bLn28wM;E;8YLrqZ$BV&(_Pzu?GNZDz!4v}3d zWl4&%PPW7#Tdy)qapb5E@9+KkUiXLl!*yT(``Tyh&jJG07FHGj2!g=k!2tV{fGNNU zha=!HP6PtM#l^{u6yZhk@E|3Gg!x6JC1qu#B~d6jrK2ix3L1(il&YSZ#vfW33`SN3 zYpAbna8w7Q{R;wead9Dekm9_&;@a{kdF}sO`_BPEPQV?AfPxADL=c1ug8N+n3IIUZ zueSdc2LOS>;0TcOz||K3ARrV9!Xcb+2=vzpc(6DGVM6j+aA5_!!&yqKh@v*NxUTcP zs2JMB)DfX`E-3gQDG3751ML5BeEc@ zyLvu^0abJ1dZozWT(2_9+AN)wv8gG~8R^{zG-ui_ljeD7%Z?cqO40d*gpiuEwN^^F zr2Hfu*&9n(2~2;$(5mhu0*t;^N02~^ozN<85^&>}HHp5^qEUU+ zh?#Q1T-=FroOC6k^3ir~!()MuHf=!$yB)n>;R$Qg^tHA(cU><9KBx!_cWh@A8lA!Q zSkTYS(}-ai2A51{hOr$^f_$Mob~~A-^=^Jg(^0j zMwm;-cJ;o|IxP5=K1$Ct*M2)A#JN0xbCF?2ob_J{kt^?*{4rJKyYhT= zvJy4@d?2S>WTd^I&*r7{K9RxpOHzM#nA@J57R|=FsE(&L;^^91-8LnamXUNrbF|3T zsu?2IZ@OWH7^6p4r_jt0V*k-AsokkTeDpkIL*DT$jePMeE7)BBSYz|(+%QW@S?>59 zKzR)nq~qi+9Y8IHKT)~=W@bfCFTJEIDGycIYE;&UY};aoknY5MG0;pk7u)g*%z7Ul zS{<&(D?+JKM`@`Hr08+rXDqOx8@t{vxN+(2GwLn!_d2my))pO}7L4v;l1`)jFTUZs zS^V01s!e0Iv1|3d2EW){GUkw=Midb0-KWCXae+1opLX{%yOy-Hs?a%`JkO$s-Kc+> z{YXEI@f6|0V0%zXO6Jwk?QlLjl6P<^}F<^3$Mht zStSDFCi)X)cpf|V6g!a(pQIBVwIJ=joB_>}MRP;&OZ(0%c&blEI3AJ<9&|6;tYV~o z8R%Wf{G;OO&4fW(H$;5wXpnYy;$Ydjy=BiSII}-CIRLs*ix%w5`tqSr;`LH0Zn!Cl|3XZZXWdUYh7r`U7hwO zs=Q3)rz2|%bA=_VoiK0%lm*Sv6AS^d-{QpV}Xww=CM8E!B9L$W(-z2fvb<^tXZ4BM1JaOAjDA4 z;^6R)Xwy^H>g+#~6NaB&_Z$i|q`2K}+{t9QxFk+i7*w#1 zJ$(0&N`7#YXzWn0%j&H3B3pjh?khh}+0_)IBqya>)t|s9|JzuSJszvVBy^oC#@3|Cj(XqpxGcGD2uakkJLTIEAlUPHGDyaGC+XXtv^X(p zD-Y9PufqSEgb$isd`v2%iH2Vo_;@$pxq6&!EoC^Qr`Ww~UloP9EBx1#fDNCstivk4 z-?->{vSazF?{isl-3yDkUZIio!6Kdv=_xO$;@~&hW#wE_2CUiGRX+?&WEWF&vipqu z#%?qbqn4Xh^}Ui)?^swKb}jrqkaL9U+F>Fsi@G?xXk`7;woT86IVEwDyFlx&L@Q*G z5bQ#`8Di*@Kkr*Ht1af(qe*vl7Yigell1kv`%L$g=5P(VfT<(Ot>Dkx%%92mR-Lq& zx8t16al7S}{_$tls;>i%U_w&x3RlpfFg%vSK05`uW_<25PI$>Q&bHwScGfA%Xs)?G zD7@gA6yLCjvCp za25L#U8C`g8ez4qJM(ky{U$QrB6`q1n&>Cf6mVbZ9)y%(9T!CD>}_^04rmC=MqFJ& x#m|nRnIn6;O7`F^A0X=T_IBdKpUYB4+yuJCh?Io<;(Th5n*E@4Y})>Ze*yL)yRZNN literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/view/images/thumbs/sara_pumpkin.jpg b/www/extras/yui-ext/examples/view/images/thumbs/sara_pumpkin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce9a90b717b51796096f3b254699621311a8ca37 GIT binary patch literal 2588 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 Sn(?L4V-$0l<+}T4GyevG3ZTmX literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/view/images/thumbs/sara_smile.jpg b/www/extras/yui-ext/examples/view/images/thumbs/sara_smile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..08919e25e8b734b659be0fafccc95df7e3254872 GIT binary patch literal 2410 zcmb7;c|6mPAICr2*e0V*@|`ueZ;t5u9itq}8KZJv%{P&d+>JRx7D{T)mfRs{QtlKQ z(MsRUkt5d9ffhLya?O6ezsKYEdpv%B{$B4tpRf1x{T7T1rU0b1g_Q*W0)YVH?f`;G zzzl#xp)ja090r4lh`{$CB*hS-q6le;eS0NkFmkdo7%Wy^`LK$-qJ|O{t9nFD<4+tO zkC#)?BOKK-Jgkk^`bPp15fMR%BG6)DXe|Y-g4X{X0Ruq60TK`e0Vx7t6bOO>33>o5 z0Dy%5`S!mN0wBUr7zhmCrALtf7z6=Bpde8p$iF)vFa!`n2`fn8OrZM|?Y+XNl1f_I z_{@^}uE8akslz2@vrp!`o6;Zv@;}<$I}ost@Gg=^?IHjS-ZlLvAQTv~tK4U@D-=us zh<`W=f&z>HhMHr6&P!Pg6q%`Tyf4jp=JW674rS8#dH0u{BX8<|0vjmfKOGBv+sB@7 za$kKmP3`f+!_Q?nFu|#~d)QljiMN zH|3LV;&Mvgs_tX=UP>E7=9E~?L|dBKi>vw@8}C+2H@d{zXdt5fHSLDaw<-2#i^c8R z6W-eTZ%XF4;*NKl;f3pG-^djzl%4X5sr^O?;ve_TUww52jI+NO=HT3*6E}5L20n><{Z^p-dT~>!GH7@ax}4=>r0Q_RCda6Ws9^KWCu=fe4WLo z9@o2#@Eh)@9cH9Z`*lkKb5dP%ih)T^YRg}LJ^IbjZFo~Hc?5r~kEB8=xkh1Bzj-Th zAVqnJ+H-#|&5Uw!`rM8CO0k~4mC*Yq2VREmzYi2!=j&f8RhbVbzI?_}Oi*lbdTCVT zGPOC946W&#iv!M_-UiQ zRHku){-5%Xg=W#?Uqr~W6#nX zif2i|>}}3Y_`Cq{37I8<5*{g8axp&rm1H&}DKX*gfE`XP65c*O4T{HH6hvg9<26qj8eGA@oj=)lI<-8RD zC%_3hl+$(4qgjMZ{i&kB_)jF4-0}(kQErgW#XH}CrDQ|POg8!FOn?U_zRR$3u*kOT zBBf6v;7~3dDZZ=#@fr(`7zf%~kK4sc?Dw>Q>r{mz-}mp$Wlk5Y;0c_>{VO3_Rqk~% z`5Cd{Mja|Iw$$4MfU;OKy3BOsPh+E6X-(msVMR*KcGiA(tl+0w9vcYM^y)CJj^&eLIR4dvJ}f$kfr=Ul>Ar zu{n?!_rPeU=Ytv5h#A^E%T3uMY+5y+OU(Q{S|P7!#F1{Tx*NSN&q-&0}r-j(Z@G09U*Nk_9= zJ{(&-9MP!c_=o6KlPN3{ICd5_nwqlYEzMLUs78ZxfAgZVQT39Wp*2}1D|j6JVSMkG ztkW(!cR02vhqg~TmPLJ|6mQ9c^3NJAro%`drChI>|8BaN?OYhr7I(=S4H$+F} zu54%gYV?4CUP$G{4W|bN;__}Q$_sIXsyP~=LT{-+0JJW-#CvEwsL$odd|u9E+_1AQDw%e&Rher;xk2E1n~Sq4=SY6j+w-7 zi}sxNv^gTL%2+?oU%j=!i;|2gi1*1qQQtfi{!OD+X{sq1tRBJmX*4}sbot$Fo6FBp z;|qJmjaLN#OaC_kP{uC}+~k#NN+&e{J&41MF?%FcSJE@XV&lM4{2c4=nc^F{=bY^x z6r6{CHKfj&dPD`s8U(g?*sO%?sSWDB=j}!15>@HEd6T2uPLtKrR%g`mE!i^Z9SlI5 zUf*fjPJkCs6N|23O!fQGd@V)+)-R)KlA~65=ZGgd(1iPUo*}=&c114to?O5b^o6qb za9=?u!#FbRcFNV%vOwONT>7+qtJZV0I9$exec4a1Z1HZbZ8woAg|lC%Q97wA4KpCK pM@!d)JgVyOuiZV-VdsBN)A*6)9ucLk>LQ|S9=4ONZWk_i|1UnHN2~w< literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/view/images/thumbs/up_to_something.jpg b/www/extras/yui-ext/examples/view/images/thumbs/up_to_something.jpg new file mode 100644 index 0000000000000000000000000000000000000000..771ea91f10c95e863fcc573cb926b46e77487d8b GIT binary patch literal 2120 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 N+GH22e5!TvY literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/view/images/thumbs/zack_dress.jpg b/www/extras/yui-ext/examples/view/images/thumbs/zack_dress.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b15f551920a769c6e3960078da0bf2d6d2e093d9 GIT binary patch literal 2645 zcmb7^_aoGgAIIM}+&O!sj5F@2bVfNx#F?25S#iUaS$;48UhUcG* zrlK+q`v(F-AP`)fT*BPk!dMg%h5f(9Y6bY&fonhz1cU~_{2&NFh}8}t0RRF({?z>| zC>sobz`-E)Ll@5nfI$#27zSs9Lm_`QKwt;})wfJ}N;^Ck{lh(k|3x2WfdSBAz@aC{e;5n~0}wXEU;B{Fk5YmP=(3@) z=1zjr%6fkHsny?DV*nQfbXXa}4`>6k7!zqBJI(CC^Z9pr^decnv5w;p%r1DE+(C6B z_B16EmDXHXfO|u}rZgGo@=Jrm%D0@6TMGI`^g5jzI=+6BSAW40SB_cE5mi!$)@LHH zhGxOj*}7X=-q7TGmIIkaXm>nymvB7J$c(YX;m_sdU2h07RtmF)-sU<;X{)2Bni(<|_vCr)0 zaDc}w>QCm5O494A$6}h)YD07gYevG=T1*^i0nd;~t;^Ev6%H*)Hw4@h{9Gd-U4g<{ zgp;cTJMa2ewPIcz*$+HXcqa;8(2g68+pLlk| zG;{bN^OoI4*;t%cBBB^c$kf5>;o1^a@GRimsn_vhms>wM_iz2a6^n0bdg)OBdamAF zFTt@q8&BUv_2spU^Y2m#b~mWqLeZ$9VZj=n&5O`pN>HAPBE#v;PM%rH*o;eIv%KRE z1%IBT56o3k`*@6#{kZAF5CO1GoAkWRq)>)L_b@rYRp#q^N2`!H{IMU6JksgpoKYeX z!#h|{H}vJX+Zpl62Sw>#47PS5*wkKrClx=gSowTYavXhfWVC2T%i!EWng0?kMz*2* z%Lyx;aoGt)v!rr*8c7@@TC~;RUCO0A)-P8klQ&+g7r6vK2O&1auND2U=#UD^pHj}?I%V125!FCwGeT(d9+|7*SQF>Z19>Xl^ESnC#VrK&i*kCXN_`juM0DbzK^ zPDh+4|2EmLC(Og3JvgpYqck-vZVdM6Y;;%TT}*$0GW$lQ%fZc=uC$-OtcVXoEoFa* zmV6Y8S+c^fQopE_tQW5o7~ScTyf&vm%NWTCD^>ncIVKHo3<)Y-jKH>M_X<86zYrRP zM&e(exx5GJ*_Si8dw$qYh|%rXaic!t%5Kh!&Z%EcA0LFjA*9Us)>|Sx@AL(faED%i z4frVJE1by17?T?(bwwPo7_owoufGCKP%)DyQ%>CBjJibMk&p=W3|x$~YTBKduOJRE zDr_G=p}{7HdcJ=3-rA$c4xUM1M_%a2)f_etpjZUHmrK?iVb~b^f0Dz}pjcT??p9n- zIc9;7wpeItP&QH4QRwRCHX~gMflOXPH|`x*@>O&DJRB<(+8I0;Fz9_BV;;8hhEtHc zM@Ol@(watzK}qO$$JF#y!a-Tx@8X$<@MMVOGCLs? zhDkhDjM~Q2y=j<&vg2LDroQcfIShm(#=(38+vuKL! zhRj2lyouUw(m6+zadv@cwPtm-`Rq%#Igc%j7r`%(ocAcfS!a-PeWHq_GE|xWx&HRZ z>IyLoS1B4{OKsl%(zk0?^h;A9PVq`Wntt=0>7T>3jE(0lr^I_;ZcsCUW>cz8T?3CD zC0zHTomi-_J{ylB9G4V7V#sRuJa-zpNKqsdVyL0l^

      ie{x#qi%=4A!%wA6y)>0ieI&y56C$7E-s0|G#^R-Cs-_k z5-IhOBcUgx}tzgj8A z0zxwLtzlL&)m;IYP>Tb+cGt31-Cm#8xAGKK%9Jw4j4CH^M&0Kkv`{cQIdaP2mcyjM zPArrBRpnCssL3skU%g)yr7}cq3(3D`B6OCk;ZlsZErfvYu>r^9=3UaX2E*LnI!tu$ zn9&R5TfbE#@qUIm$LePkrd(;uW^f&KiIxCoFX`_WYk$}(Y!aE0OJD&bT2{XUE9_YS zxvxwTtU{@g+}!uDUz1Nhw+QMq?0P(5t|q+b5V~RjOX!v{-M#4WE>1hNOz}3tGGAbSoe1xU)sFpmUd1qBXuchnH)m5#b8t$1~r`MgCY9m+$x~SgH U**vZNmPTXd!Zz!MPqIe;2N6lShyVZp literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/view/images/thumbs/zack_hat.jpg b/www/extras/yui-ext/examples/view/images/thumbs/zack_hat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df475ba6e9c8e88a344d1dbe720664826e5bf0ac GIT binary patch literal 2323 zcmb8pdpOe#8wc>;Y_k@|SS6dY#gNz>Mnfnlr#U>a<`_Z|_Qb2}eXr}i-ap^_{^S1Rd*7ey-W%PU0z@oK%}oIi2n5XTH?TJj zm;eX(`CFiJW&Rdo$b zO-*S*~Y;jm^=1k zZ%co6`>F;ql%hQtRXvS&t#Q~&TOjmSS*MFfU9+`C@{^Z31A`^wzRl=koGL_ZEyIH` z>0J7FBWn4xmRHGE+=?-6TOm6ZG#i};j7M&;y#lHh@b}$a`LCP23f(NT5){bA4WOZE zo_$9N9pW8(z%^k3GChB)Apu<<#^%Sxo2$W-y5M;JIyeJ7gC1> zL5m=?~<* zez4gLw>LDAT6RXf1HKsLBNL2T3Y*PAklBXE=by=h=N=w@e@pig<1r_VwnYhJF6reA zM}?O&y(Urw>Y zS=WU!3kbLk0XmUq_rd2pcRS|qvqLO!k6W9e&$@xkh?a_w+V1yrakwj|6+hnC1CnmM zPTrcw>EJAr^dw6K97##b-4}ea0~OOd{M6$E9v>XtoN?CCv6*lo6*Cof!mHlFKH2I; z@j1SKd)r)>ev`BHXI_!ib{UW1vl+B%BGDOdbU87`X<@7(LMydG8K2y^9=cmm=JzlI zn?MR%-vj!y2%($vycM18k$^*%MZIEVnmo~6-GDx(b=Z~S_0@7TE#1UUN9owDfJ6%A zojPHoq+KRYeS+Ah?!DE1dDPT9kcx_fy)?$uUJivt`fFI+U66A8$|a{YWG z=_Kf#kdF8qRiutu4wny1bbn|r>vCLS^c{|3Y_Lm!VzRqNO<+g@x3eP=N^K#=BnH-FQ0I%Q|uun3zo5}cAQRYI(Da3^NBpqxK}b3#m5UOZg@y|s5QOL?xLY}^nRu~8KF#iQmZd{u+}0X z%8r@RQ}JoV?J8t-jxV>5qR8rf-y7ljFgy3>^_ilcP_ZqlMlOL>2V z0zq@a>!U{+`?J<0qUovA6ucYJOMFUxvU9N9?5#p{r`Y#);MeAJmFt`pW6p%s(mkGC zV@cDK$>>&MQd7x!^KxPrntCp0t!2G=uAVpW)L&e)F!s*E!f@v0I5LXWJRXDt^m~Zm zcZ0)DYyOCYHf8m-Yxk@6ah*leP74<&BZRJ*-w5=JYX0Me!Gw4pZ=kY=|9ZFYPI%Gf z_yBms6xJ7X?!Y3L?ggTC*wU zvPd_psxvy(zSVc?zaG4bnjsbI6IKUPyNH=}kHz{)rkR z`;@-J=S80<@8d@dL>h0#7Q_k)2O&ON)W^vx;IsT8hRCJDUpza*_~#yV|LE7%nQ|Uj zh8Ny~_&Edx`ohI=PfFxxFLA{zKN3eHH^gqtonm}*A+s10q^#?M1{thx=_cX}3^Tv` z&tg{&5YfVoB=fw20#%I{tSoJ!jDOg$b3{%ebN)r;U{85#LVW&gO=%5RTaQP5+>p-2 zSFp7qZ8g~4s#^G=p@r5vUDcT!8>N*9 zW?Q)|D2VfAx_U*LF-?qL6_Y$r6H||@-l7=RvXAgz2G|hwidf`XGfeSdFbvz&TwcPu zP@fQoZJ=M70H@f08ccfbYcGmQTd_{qu?fDRHX2$=t0! ztUYP{9Ze^dR=1xEKGEuAr92lFclsVMhn`!4QWvr*SguXu8^3^LXN}a-!}AXQ+9#KM znH@O|pLZ=F%-$(z-Z^A?xBlzp3z_G+v7$Tyv}nmqogXQOgUGG9YGR4~di1bUl z9~F&;-s94&UyJ4eKEi1mIk+#~_!)BBcWF75c-OO@bnnrrHH1N7R+z1D%^ccZi`|xr z?30WAb#L|J_+;P|AypmU>?T^X3a0CK+?u6+IsMplnTC+64 HY>)jfy73bA literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/view/images/thumbs/zack_sink.jpg b/www/extras/yui-ext/examples/view/images/thumbs/zack_sink.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01badd3da721725bfc34c041425b973ac8484854 GIT binary patch literal 2303 zcmb7=c|6mPAICql*xc5pn9Xdi+{}ELGs&GJBwOSP-%v}MqtrJfCCBDYZkBuv;ps=et-U6??0cf_w)UDybnGdOaVd`Cgvsp2m}J=4+l6H1&jbF z7Z-$!6AFPqxVfP`ds+oT4NObwX24QB{pVAYf#P zdRlm0Wpx7nw*WDvkbw{|2nTS$Kwuc?pcN1U01gf? z2>4IHM>x3v4#;n)F9dLaz#JS9Fcb>;cLT%$29Cfuu}9Uo;5fsx?sR-WI70H2U0y}Y z3Pe~+-Tr#-G{NY!M_@$a;l3yc0RR5Pf8|hcg!2$#V29{`PlGsM;6pJSZ-_e>0r-An z7#Ic^0E`VU1OF`GQ!b@;cc9vRG)=yE!)?Zi=T5T!s~n3ardxT_xiyuAfQ2&O5p?(R zRtD!8s=K*&hdc@`@=}0TT`r=uYn)>$vwAd(zf%hTDek;>q)+4};gA`fH;@ zhf0+5u14#2YPiL-gnKS!W@c6x#Oa{q#vZK-TbPu9C%>30M_#$Keu3JVhxGCYVa+D$ zZT6_VGUZleyds~#tbSfC3m?dBk;e;|rttT}GX*VbhNaaDUceIy;%>0l%hm7dWurW0 zJ6J_X#n}Ex6Txd6d6f=Ror5v=dL14~b0^+~$1C5m>uVd;kTA3jux$7U6O$r|w0RM} zkWR+b+~@gvt#T{t*K@yI!;zC_Wz-^PjhcchvKnk)H-6w_nsmLVZ(rJy4W@vKFczK? zu6w39ZY*ql!lM=edTIV_&(a~<`kX+yRQZxgW={^S=jrVtkeZuSLFAP^ST>6h_s;!=CZhwOf@5bae zS*{hb5JD$e!>hXrS`A~~nN5KTXLVmku+x2c2RpPHV_e$s8<1R1XGg~#k{M6jM4Ik# zH70i6`I69+xNVH~f@;N|9-i-?^)Mu|8maCZ_xF>>>-Xq__vHo}e#j-q6+SM=<^TuH zP3Z&n(@D(5t+WJ`GjUQ}Lp119jUxo59+_kD(Xa1VHE!mHE^%5!!FjCd061P1GP5RQ zEM!Y|Fu^i_@XQb%#Lat0jS#)vgQkjEc9qxJzhcJKbok;^>Mb4b+y;9e4?&^g3I)Er#UEahV^tXBfvEhN42^*NQ6mg z**2Y_$4iFWqmhr5nHN`K=ez^&3YdXu`c#Vqn}&gcB#ygzv7qUZxT1$^D z$3~JDGV&@P7p2OW#iU4RD!UAHTM++{i?2T~T-@)1{x%zp8ytVi8|CB7_cQpjFuAVJ zr|+MQ3ylj(50bm08=%}eSLn0yS9{1+ujqOA?J%Nm1mFqs>=#m1*&VJ85$x&t8)4k& zN5@btU27V>#I3Fy8U3!V7cVH&^j>6b#(oWHDNJ?bL?n%Mh$1__<## z;^Yzy)0MlLL~8Ey0hb2rfErb}rGBX`1duP3GRlgTW?{N$?{6Z@IoNR$mDxN}7z%QY z=9YRmOw_p>w#urYXk__?Io`thZ;n<+u~UDrCHv=(mYIln0^6QC*NeLapE4gmI+v1- zAAb~~c{YI&@5##Fw1U1H8gHF;s`V8{XXAp-b(C$oq&>t^sqz7tu(;yx?*->|gB6!~ zwJnidVkHH9C32mTtw`Q3hl>%5%q#PKP6XDSd6> zqER$F&1W!Xx>-28(Bjz!UF-?JW~^H4(;idn(|XgcOr*RL$EGaB5m@o1F-a0J=7Jx+ z=f15x6HmP%@YSjQLJ4=Nq+2*y_PTofN`Rvwm2Jupx~Ms%VGmajlCx_%+r4xE81KCA z0|f?pQ82ftS?*ha0rHFXok-!hd&lzGnocwoSVFeW_RuQ@O4&s9bc2D@&VYv;bz#JX zr)%^j7K=RS3}4XG;~US}{D{+;fpHILfK`<_^EJRjJ7F>$x1u|CY;2J-<(Ay97Hd9Wk9}NEsLK+Ze literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/view/images/thumbs/zacks_grill.jpg b/www/extras/yui-ext/examples/view/images/thumbs/zacks_grill.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5ca1ef630f6b3302e631497aabd1b537ad595570 GIT binary patch literal 2825 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"; + } + return b; + }; + + + + var createDom = function(o, parentNode){ + var el = document.createElement(o.tag); + var useSet = el.setAttribute ? true : false; + for(var attr in o){ + if(attr == "tag" || attr == "children" || attr == "cn" || 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]; + } + } + Ext.DomHelper.applyStyles(el, o.style); + var cn = o.children || o.cn; + if(cn){ + if(cn instanceof Array){ + for(var i = 0, len = cn.length; i < len; i++) { + createDom(cn[i], el); + } + }else{ + createDom(cn, el); + } + } + if(o.html){ + el.innerHTML = o.html; + } + if(parentNode){ + parentNode.appendChild(el); + } + return el; + }; + + var ieTable = function(depth, s, h, e){ + tempTableEl.innerHTML = [s, h, e].join(''); + var i = -1, el = tempTableEl; + while(++i < depth){ + el = el.firstChild; + } + return el; + }; + + + var ts = '', + te = '
      ', + tbs = ts+'', + tbe = ''+te, + trs = tbs + '', + tre = ''+tbe; + + + var insertIntoTable = function(tag, where, el, html){ + if(!tempTableEl){ + tempTableEl = document.createElement('div'); + } + var node; + var before = null; + if(tag == 'td'){ + if(where == 'afterbegin' || where == 'beforeend'){ + return; + } + if(where == 'beforebegin'){ + before = el; + el = el.parentNode; + } else{ + before = el.nextSibling; + el = el.parentNode; + } + node = ieTable(4, trs, html, tre); + } + else if(tag == 'tr'){ + if(where == 'beforebegin'){ + before = el; + el = el.parentNode; + node = ieTable(3, tbs, html, tbe); + } else if(where == 'afterend'){ + before = el.nextSibling; + el = el.parentNode; + node = ieTable(3, tbs, html, tbe); + } else{ + if(where == 'afterbegin'){ + before = el.firstChild; + } + node = ieTable(4, trs, html, tre); + } + } else if(tag == 'tbody'){ + if(where == 'beforebegin'){ + before = el; + el = el.parentNode; + node = ieTable(2, ts, html, te); + } else if(where == 'afterend'){ + before = el.nextSibling; + el = el.parentNode; + node = ieTable(2, ts, html, te); + } else{ + if(where == 'afterbegin'){ + before = el.firstChild; + } + node = ieTable(3, tbs, html, tbe); + } + } else{ + if(where == 'beforebegin' || where == 'afterend'){ + return; + } + if(where == 'afterbegin'){ + before = el.firstChild; + } + node = ieTable(2, ts, html, te); + } + el.insertBefore(node, before); + return node; + }; + + return { + + useDom : false, + + + markup : function(o){ + return createHtml(o); + }, + + + applyStyles : function(el, styles){ + if(styles){ + el = Ext.fly(el); + if(typeof styles == "string"){ + var re = /\s?([a-z\-]*)\:\s?([^;]*);?/gi; + var matches; + while ((matches = re.exec(styles)) != null){ + el.setStyle(matches[1], matches[2]); + } + }else if (typeof styles == "object"){ + for (var style in styles){ + el.setStyle(style, styles[style]); + } + }else if (typeof styles == "function"){ + Ext.DomHelper.applyStyles(el, styles.call()); + } + } + }, + + + insertHtml : function(where, el, html){ + where = where.toLowerCase(); + if(el.insertAdjacentHTML){ + var tag = el.tagName.toLowerCase(); + if(tag == "table" || tag == "tbody" || tag == "tr" || tag == 'td'){ + var rs; + if(rs = insertIntoTable(tag, where, el, html)){ + return rs; + } + } + 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); + frag = range.createContextualFragment(html); + el.insertBefore(frag, el.firstChild); + return el.firstChild; + }else{ + el.innerHTML = html; + return el.firstChild; + } + case "beforeend": + if(el.lastChild){ + range.setStartAfter(el.lastChild); + frag = range.createContextualFragment(html); + el.appendChild(frag); + return el.lastChild; + }else{ + el.innerHTML = html; + 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 + '"'; + }, + + + insertBefore : function(el, o, returnElement){ + return this.doInsert(el, o, returnElement, "beforeBegin"); + }, + + + insertAfter : function(el, o, returnElement){ + return this.doInsert(el, o, returnElement, "afterEnd", "nextSibling"); + }, + + + insertFirst : function(el, o, returnElement){ + return this.doInsert(el, o, returnElement, "afterBegin"); + }, + + + doInsert : function(el, o, returnElement, pos, sibling){ + el = Ext.getDom(el); + var newNode; + if(this.useDom){ + newNode = createDom(o, null); + el.parentNode.insertBefore(newNode, sibling ? el[sibling] : el); + }else{ + var html = createHtml(o); + newNode = this.insertHtml(pos, el, html); + } + return returnElement ? Ext.get(newNode, true) : newNode; + }, + + + append : function(el, o, returnElement){ + el = Ext.getDom(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 ? Ext.get(newNode, true) : newNode; + }, + + + overwrite : function(el, o, returnElement){ + el = Ext.getDom(el); + el.innerHTML = createHtml(o); + return returnElement ? Ext.get(el.firstChild, true) : el.firstChild; + }, + + + createTemplate : function(o){ + var html = createHtml(o); + return new Ext.Template(html); + } + }; +}(); + + +Ext.Template = function(html){ + if(html instanceof Array){ + html = html.join(""); + }else if(arguments.length > 1){ + html = Array.prototype.join.call(arguments, ""); + } + + this.html = html; + +}; +Ext.Template.prototype = { + + applyTemplate : function(values){ + if(this.compiled){ + return this.compiled(values); + } + var useF = this.disableFormats !== true; + var fm = Ext.util.Format, tpl = this; + var fn = function(m, name, format, args){ + if(format && useF){ + if(format.substr(0, 5) == "this."){ + return tpl.call(format.substr(5), values[name]); + }else{ + if(args){ + + + + var re = /^\s*['"](.*)["']\s*$/; + args = args.split(','); + for(var i = 0, len = args.length; i < len; i++){ + args[i] = args[i].replace(re, "$1"); + } + args = [values[name]].concat(args); + }else{ + args = [values[name]]; + } + return fm[format].apply(fm, args); + } + }else{ + return values[name] !== undefined ? values[name] : ""; + } + }; + return this.html.replace(this.re, fn); + }, + + + set : function(html, compile){ + this.html = html; + this.compiled = null; + if(compile){ + this.compile(); + } + return this; + }, + + + disableFormats : false, + + + re : /\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g, + + + compile : function(){ + var fm = Ext.util.Format; + var useF = this.disableFormats !== true; + var sep = Ext.isGecko ? "+" : ","; + var fn = function(m, name, format, args){ + if(format && useF){ + args = args ? ',' + args : ""; + if(format.substr(0, 5) != "this."){ + format = "fm." + format + '('; + }else{ + format = 'this.call("'+ format.substr(5) + '", '; + args = ""; + } + }else{ + args= '', format = "(values['" + name + "'] == undefined ? '' : "; + } + return "'"+ sep + format + "values['" + name + "']" + args + ")"+sep+"'"; + }; + var body; + + if(Ext.isGecko){ + body = "this.compiled = function(values){ return '" + + this.html.replace(/(\r\n|\n)/g, '\\n').replace("'", "\\'").replace(this.re, fn) + + "';};"; + }else{ + body = ["this.compiled = function(values){ return ['"]; + body.push(this.html.replace(/(\r\n|\n)/g, '\\n').replace("'", "\\'").replace(this.re, fn)); + body.push("'].join('');};"); + body = body.join(''); + } + eval(body); + return this; + }, + + + call : function(fnName, value){ + return this[fnName](value); + }, + + + insertFirst: function(el, values, returnElement){ + return this.doInsert('afterBegin', el, values, returnElement); + }, + + + insertBefore: function(el, values, returnElement){ + return this.doInsert('beforeBegin', el, values, returnElement); + }, + + + insertAfter : function(el, values, returnElement){ + return this.doInsert('afterEnd', el, values, returnElement); + }, + + + append : function(el, values, returnElement){ + return this.doInsert('beforeEnd', el, values, returnElement); + }, + + doInsert : function(where, el, values, returnEl){ + el = Ext.getDom(el); + var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values)); + return returnEl ? Ext.get(newNode, true) : newNode; + }, + + + overwrite : function(el, values, returnElement){ + el = Ext.getDom(el); + el.innerHTML = this.applyTemplate(values); + return returnElement ? Ext.get(el.firstChild, true) : el.firstChild; + } +}; + +Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate; + + +Ext.DomHelper.Template = Ext.Template; + + +Ext.Template.from = function(el){ + el = Ext.getDom(el); + return new Ext.Template(el.value || el.innerHTML); +}; + + +Ext.MasterTemplate = function(){ + Ext.MasterTemplate.superclass.constructor.apply(this, arguments); + this.originalHtml = this.html; + var st = {}; + var m, re = this.subTemplateRe; + re.lastIndex = 0; + var subIndex = 0; + while(m = re.exec(this.html)){ + var name = m[1], content = m[2]; + st[subIndex] = { + name: name, + index: subIndex, + buffer: [], + tpl : new Ext.Template(content) + }; + if(name){ + st[name] = st[subIndex]; + } + st[subIndex].tpl.compile(); + st[subIndex].tpl.call = this.call.createDelegate(this); + subIndex++; + } + this.subCount = subIndex; + this.subs = st; +}; +Ext.extend(Ext.MasterTemplate, Ext.Template, { + + subTemplateRe : /((?:.|\n)*?)<\/tpl>/gi, + + + add : function(name, values){ + if(arguments.length == 1){ + values = arguments[0]; + name = 0; + } + var s = this.subs[name]; + s.buffer[s.buffer.length] = s.tpl.apply(values); + return this; + }, + + + fill : function(name, values, reset){ + var a = arguments; + if(a.length == 1 || (a.length == 2 && typeof a[1] == "boolean")){ + values = a[0]; + name = 0; + reset = a[1]; + } + if(reset){ + this.reset(); + } + for(var i = 0, len = values.length; i < len; i++){ + this.add(name, values[i]); + } + return this; + }, + + + reset : function(){ + var s = this.subs; + for(var i = 0; i < this.subCount; i++){ + s[i].buffer = []; + } + return this; + }, + + applyTemplate : function(values){ + var s = this.subs; + var replaceIndex = -1; + this.html = this.originalHtml.replace(this.subTemplateRe, function(m, name){ + return s[++replaceIndex].buffer.join(""); + }); + return Ext.MasterTemplate.superclass.applyTemplate.call(this, values); + }, + + apply : function(){ + return this.applyTemplate.apply(this, arguments); + }, + + compile : function(){return this;} +}); + + +Ext.MasterTemplate.prototype.addAll = Ext.MasterTemplate.prototype.fill; + +Ext.MasterTemplate.from = function(el){ + el = Ext.getDom(el); + return new Ext.MasterTemplate(el.value || el.innerHTML); +}; + + +Ext.DomQuery = function(){ + var cache = {}, simpleCache = {}, valueCache = {}; + var nonSpace = /\S/; + var trimRe = /^\s+|\s+$/g; + var tplRe = /\{(\d+)\}/g; + var modeRe = /^(\s?[\/>]\s?|\s|$)/; + var tagTokenRe = /^(#)?([\w-\*]+)/; + + function child(p, index){ + var i = 0; + var n = p.firstChild; + while(n){ + if(n.nodeType == 1){ + if(++i == index){ + return n; + } + } + n = n.nextSibling; + } + return null; + }; + + function next(n){ + while((n = n.nextSibling) && n.nodeType != 1); + return n; + }; + + function prev(n){ + while((n = n.previousSibling) && n.nodeType != 1); + return n; + }; + + function clean(d){ + var n = d.firstChild, ni = -1; + while(n){ + var nx = n.nextSibling; + if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){ + d.removeChild(n); + }else{ + n.nodeIndex = ++ni; + } + n = nx; + } + return this; + }; + + function byClassName(c, a, v, re, cn){ + if(!v){ + return c; + } + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + cn = ci.className; + if(cn && (' '+cn+' ').indexOf(v) != -1){ + r[r.length] = ci; + } + } + return r; + }; + + function attrValue(n, attr){ + if(!n.tagName && typeof n.length != "undefined"){ + n = n[0]; + } + if(!n){ + return null; + } + if(attr == "for"){ + return n.htmlFor; + } + if(attr == "class" || attr == "className"){ + return n.className; + } + return n.getAttribute(attr) || n[attr]; + + }; + + function getNodes(ns, mode, tagName){ + var result = [], cs; + if(!ns){ + return result; + } + mode = mode ? mode.replace(trimRe, "") : ""; + tagName = tagName || "*"; + if(typeof ns.getElementsByTagName != "undefined"){ + ns = [ns]; + } + if(mode != "/" && mode != ">"){ + for(var i = 0, ni; ni = ns[i]; i++){ + cs = ni.getElementsByTagName(tagName); + for(var j = 0, ci; ci = cs[j]; j++){ + result[result.length] = ci; + } + } + }else{ + for(var i = 0, ni; ni = ns[i]; i++){ + var cn = ni.getElementsByTagName(tagName); + for(var j = 0, cj; cj = cn[j]; j++){ + if(cj.parentNode == ni){ + result[result.length] = cj; + } + } + } + } + return result; + }; + + function concat(a, b){ + if(b.slice){ + return a.concat(b); + } + for(var i = 0, l = b.length; i < l; i++){ + a[a.length] = b[i]; + } + return a; + } + + function byTag(cs, tagName){ + if(cs.tagName || cs == document){ + cs = [cs]; + } + if(!tagName){ + return cs; + } + var r = []; tagName = tagName.toLowerCase(); + for(var i = 0, ci; ci = cs[i]; i++){ + if(ci.nodeType == 1 && ci.tagName.toLowerCase()==tagName){ + r[r.length] = ci; + } + } + return r; + }; + + function byId(cs, attr, id){ + if(cs.tagName || cs == document){ + cs = [cs]; + } + if(!id){ + return cs; + } + var r = []; + for(var i = 0,ci; ci = cs[i]; i++){ + if(ci && ci.id == id){ + r[r.length] = ci; + return r; + } + } + return r; + }; + + function byAttribute(cs, attr, value, op, custom){ + var r = [], st = custom=="{"; + var f = Ext.DomQuery.operators[op]; + for(var i = 0; ci = cs[i]; i++){ + var a; + if(st){ + a = Ext.DomQuery.getStyle(ci, attr); + } + else if(attr == "class" || attr == "className"){ + a = ci.className; + }else if(attr == "for"){ + a = ci.htmlFor; + }else if(attr == "href"){ + a = ci.getAttribute("href", 2); + }else{ + a = ci.getAttribute(attr); + } + if((f && f(a, value)) || (!f && a)){ + r[r.length] = ci; + } + } + return r; + }; + + function byPseudo(cs, name, value){ + return Ext.DomQuery.pseudos[name](cs, value); + }; + + + + + var isIE = window.ActiveXObject ? true : false; + + var key = 30803; + + function nodupIEXml(cs){ + var d = ++key; + cs[0].setAttribute("_nodup", d); + var r = [cs[0]]; + for(var i = 1, len = cs.length; i < len; i++){ + var c = cs[i]; + if(!c.getAttribute("_nodup") != d){ + c.setAttribute("_nodup", d); + r[r.length] = c; + } + } + for(var i = 0, len = cs.length; i < len; i++){ + cs[i].removeAttribute("_nodup"); + } + return r; + } + + function nodup(cs){ + if(!cs){ + return []; + } + var len = cs.length, c, i, r = cs, cj; + if(!len || typeof cs.nodeType != "undefined" || len == 1){ + return cs; + } + if(isIE && typeof cs[0].selectSingleNode != "undefined"){ + return nodupIEXml(cs); + } + var d = ++key; + cs[0]._nodup = d; + for(i = 1; c = cs[i]; i++){ + if(c._nodup != d){ + c._nodup = d; + }else{ + r = []; + for(var j = 0; j < i; j++){ + r[r.length] = cs[j]; + } + for(j = i+1; cj = cs[j]; j++){ + if(cj._nodup != d){ + cj._nodup = d; + r[r.length] = cj; + } + } + return r; + } + } + return r; + } + + function quickDiffIEXml(c1, c2){ + var d = ++key; + for(var i = 0, len = c1.length; i < len; i++){ + c1[i].setAttribute("_qdiff", d); + } + var r = []; + for(var i = 0, len = c2.length; i < len; i++){ + if(c2[i].getAttribute("_qdiff") != d){ + r[r.length] = c2[i]; + } + } + for(var i = 0, len = c1.length; i < len; i++){ + c1[i].removeAttribute("_qdiff"); + } + return r; + } + + function quickDiff(c1, c2){ + var len1 = c1.length; + if(!len1){ + return c2; + } + if(isIE && c1[0].selectSingleNode){ + return quickDiffIEXml(c1, c2); + } + var d = ++key; + for(var i = 0; i < len1; i++){ + c1[i]._qdiff = d; + } + var r = []; + for(var i = 0, len = c2.length; i < len; i++){ + if(c2[i]._qdiff != d){ + r[r.length] = c2[i]; + } + } + return r; + } + + function quickId(ns, mode, root, id){ + if(ns == root){ + var d = root.ownerDocument || root; + return d.getElementById(id); + } + ns = getNodes(ns, mode, "*"); + return byId(ns, null, id); + } + + return { + getStyle : function(el, name){ + return Ext.fly(el).getStyle(name); + }, + + compile : function(path, type){ + + while(path.substr(0, 1)=="/"){ + path = path.substr(1); + } + type = type || "select"; + + var fn = ["var f = function(root){\n var mode; var n = root || document;\n"]; + var q = path, mode, lq; + var tk = Ext.DomQuery.matchers; + var tklen = tk.length; + var mm; + while(q && lq != q){ + lq = q; + var tm = q.match(tagTokenRe); + if(type == "select"){ + if(tm){ + if(tm[1] == "#"){ + fn[fn.length] = 'n = quickId(n, mode, root, "'+tm[2]+'");'; + }else{ + fn[fn.length] = 'n = getNodes(n, mode, "'+tm[2]+'");'; + } + q = q.replace(tm[0], ""); + }else if(q.substr(0, 1) != '@'){ + fn[fn.length] = 'n = getNodes(n, mode, "*");'; + } + }else{ + if(tm){ + if(tm[1] == "#"){ + fn[fn.length] = 'n = byId(n, null, "'+tm[2]+'");'; + }else{ + fn[fn.length] = 'n = byTag(n, "'+tm[2]+'");'; + } + q = q.replace(tm[0], ""); + } + } + while(!(mm = q.match(modeRe))){ + var matched = false; + for(var j = 0; j < tklen; j++){ + var t = tk[j]; + var m = q.match(t.re); + if(m){ + fn[fn.length] = t.select.replace(tplRe, function(x, i){ + return m[i]; + }); + q = q.replace(m[0], ""); + matched = true; + break; + } + } + + if(!matched){ + throw 'Error parsing selector, parsing failed at "' + q + '"'; + } + } + if(mm[1]){ + fn[fn.length] = 'mode="'+mm[1]+'";'; + q = q.replace(mm[1], ""); + } + } + fn[fn.length] = "return nodup(n);\n}"; + eval(fn.join("")); + return f; + }, + + + select : function(path, root, type){ + if(!root || root == document){ + root = document; + } + if(typeof root == "string"){ + root = document.getElementById(root); + } + var paths = path.split(","); + var results = []; + for(var i = 0, len = paths.length; i < len; i++){ + var p = paths[i].replace(trimRe, ""); + if(!cache[p]){ + cache[p] = Ext.DomQuery.compile(p); + if(!cache[p]){ + throw p + " is not a valid selector"; + } + } + var result = cache[p](root); + if(result && result != document){ + results = results.concat(result); + } + } + return results; + }, + + + selectNode : function(path, root){ + return Ext.DomQuery.select(path, root)[0]; + }, + + + selectValue : function(path, root, defaultValue){ + path = path.replace(trimRe, ""); + if(!valueCache[path]){ + valueCache[path] = Ext.DomQuery.compile(path, "select"); + } + var n = valueCache[path](root); + n = n[0] ? n[0] : n; + var v = (n && n.firstChild ? n.firstChild.nodeValue : null); + return (v === null ? defaultValue : v); + }, + + + selectNumber : function(path, root, defaultValue){ + var v = Ext.DomQuery.selectValue(path, root, defaultValue || 0); + return parseFloat(v); + }, + + + is : function(el, ss){ + if(typeof el == "string"){ + el = document.getElementById(el); + } + var isArray = (el instanceof Array); + var result = Ext.DomQuery.filter(isArray ? el : [el], ss); + return isArray ? (result.length == el.length) : (result.length > 0); + }, + + + filter : function(els, ss, nonMatches){ + ss = ss.replace(trimRe, ""); + if(!simpleCache[ss]){ + simpleCache[ss] = Ext.DomQuery.compile(ss, "simple"); + } + var result = simpleCache[ss](els); + return nonMatches ? quickDiff(result, els) : result; + }, + + + matchers : [{ + re: /^\.([\w-]+)/, + select: 'n = byClassName(n, null, " {1} ");' + }, { + re: /^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/, + select: 'n = byPseudo(n, "{1}", "{2}");' + },{ + re: /^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/, + select: 'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");' + }, { + re: /^#([\w-]+)/, + select: 'n = byId(n, null, "{1}");' + },{ + re: /^@([\w-]+)/, + select: 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};' + } + ], + + + operators : { + "=" : function(a, v){ + return a == v; + }, + "!=" : function(a, v){ + return a != v; + }, + "^=" : function(a, v){ + return a && a.substr(0, v.length) == v; + }, + "$=" : function(a, v){ + return a && a.substr(a.length-v.length) == v; + }, + "*=" : function(a, v){ + return a && a.indexOf(v) !== -1; + }, + "%=" : function(a, v){ + return (a % v) == 0; + } + }, + + + pseudos : { + "first-child" : function(c){ + var r = [], n; + for(var i = 0, ci; ci = n = c[i]; i++){ + while((n = n.previousSibling) && n.nodeType != 1); + if(!n){ + r[r.length] = ci; + } + } + return r; + }, + + "last-child" : function(c){ + var r = []; + for(var i = 0, ci; ci = n = c[i]; i++){ + while((n = n.nextSibling) && n.nodeType != 1); + if(!n){ + r[r.length] = ci; + } + } + return r; + }, + + "nth-child" : function(c, a){ + var r = []; + if(a != "odd" && a != "even"){ + for(var i = 0, ci; ci = c[i]; i++){ + var m = child(ci.parentNode, a); + if(m == ci){ + r[r.length] = m; + } + } + return r; + } + var p; + + for(var i = 0, l = c.length; i < l; i++){ + var cp = c[i].parentNode; + if(cp != p){ + clean(cp); + p = cp; + } + } + + for(var i = 0, ci; ci = c[i]; i++){ + var m = false; + if(a == "odd"){ + m = ((ci.nodeIndex+1) % 2 == 1); + }else if(a == "even"){ + m = ((ci.nodeIndex+1) % 2 == 0); + } + if(m){ + r[r.length] = ci; + } + } + return r; + }, + + "only-child" : function(c){ + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + if(!prev(ci) && !next(ci)){ + r[r.length] = ci; + } + } + return r; + }, + + "empty" : function(c){ + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + var cns = ci.childNodes, j = 0, cn, empty = true; + while(cn = cns[j]){ + ++j; + if(cn.nodeType == 1 || cn.nodeType == 3){ + empty = false; + break; + } + } + if(empty){ + r[r.length] = ci; + } + } + return r; + }, + + "contains" : function(c, v){ + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + if(ci.innerHTML.indexOf(v) !== -1){ + r[r.length] = ci; + } + } + return r; + }, + + "nodeValue" : function(c, v){ + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + if(ci.firstChild && ci.firstChild.nodeValue == v){ + r[r.length] = ci; + } + } + return r; + }, + + "checked" : function(c){ + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + if(ci.checked == true){ + r[r.length] = ci; + } + } + return r; + }, + + "not" : function(c, ss){ + return Ext.DomQuery.filter(c, ss, true); + }, + + "odd" : function(c){ + return this["nth-child"](c, "odd"); + }, + + "even" : function(c){ + return this["nth-child"](c, "even"); + }, + + "nth" : function(c, a){ + return c[a-1] || []; + }, + + "first" : function(c){ + return c[0] || []; + }, + + "last" : function(c){ + return c[c.length-1] || []; + }, + + "has" : function(c, ss){ + var s = Ext.DomQuery.select; + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + if(s(ss, ci).length > 0){ + r[r.length] = ci; + } + } + return r; + }, + + "next" : function(c, ss){ + var is = Ext.DomQuery.is; + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + var n = next(ci); + if(n && is(n, ss)){ + r[r.length] = ci; + } + } + return r; + }, + + "prev" : function(c, ss){ + var is = Ext.DomQuery.is; + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + var n = prev(ci); + if(n && is(n, ss)){ + r[r.length] = ci; + } + } + return r; + } + } + }; +}(); + + +Ext.query = Ext.DomQuery.select; + + + +Ext.util.Observable = function(){ + if(this.listeners){ + this.on(this.listeners); + delete this.listeners; + } +}; +Ext.util.Observable.prototype = { + + fireEvent : function(){ + var ce = this.events[arguments[0].toLowerCase()]; + if(typeof ce == "object"){ + return ce.fire.apply(ce, Array.prototype.slice.call(arguments, 1)); + }else{ + return true; + } + }, + + filterOptRe : /^(?:scope|delay|buffer|single)$/, + + + addListener : function(eventName, fn, scope, o){ + if(typeof eventName == "object"){ + o = eventName; + for(var e in o){ + if(this.filterOptRe.test(e)){ + continue; + } + if(typeof o[e] == "function"){ + this.addListener(e, o[e], o.scope, o); + }else{ + this.addListener(e, o[e].fn, o[e].scope, o[e]); + } + } + return; + } + o = (!o || typeof o == "boolean") ? {} : o; + eventName = eventName.toLowerCase(); + var ce = this.events[eventName] || true; + if(typeof ce == "boolean"){ + ce = new Ext.util.Event(this, eventName); + this.events[eventName] = ce; + } + ce.addListener(fn, scope, o); + }, + + + removeListener : function(eventName, fn, scope){ + var ce = this.events[eventName.toLowerCase()]; + if(typeof ce == "object"){ + ce.removeListener(fn, scope); + } + }, + + + purgeListeners : function(){ + for(var evt in this.events){ + if(typeof this.events[evt] == "object"){ + this.events[evt].clearListeners(); + } + } + }, + + relayEvents : function(o, events){ + var createHandler = function(ename){ + return function(){ + return this.fireEvent.apply(this, Ext.combine(ename, Array.prototype.slice.call(arguments, 0))); + }; + }; + for(var i = 0, len = events.length; i < len; i++){ + var ename = events[i]; + if(!this.events[ename]){ this.events[ename] = true; }; + o.on(ename, createHandler(ename), this); + } + }, + + + addEvents : function(o){ + if(!this.events){ + this.events = {}; + } + Ext.applyIf(this.events, o); + }, + + + hasListener : function(eventName){ + var e = this.events[eventName]; + return typeof e == "object" && e.listeners.length > 0; + } +}; + +Ext.util.Observable.prototype.on = Ext.util.Observable.prototype.addListener; + +Ext.util.Observable.prototype.un = Ext.util.Observable.prototype.removeListener; + + +Ext.util.Observable.capture = function(o, fn, scope){ + o.fireEvent = o.fireEvent.createInterceptor(fn, scope); +}; + + +Ext.util.Observable.releaseCapture = function(o){ + o.fireEvent = Ext.util.Observable.prototype.fireEvent; +}; + +(function(){ + + var createBuffered = function(h, o, scope){ + var task = new Ext.util.DelayedTask(); + return function(){ + task.delay(o.buffer, h, scope, Array.prototype.slice.call(arguments, 0)); + }; + }; + + var createSingle = function(h, e, fn, scope){ + return function(){ + e.removeListener(fn, scope); + return h.apply(scope, arguments); + }; + }; + + var createDelayed = function(h, o, scope){ + return function(){ + var args = Array.prototype.slice.call(arguments, 0); + setTimeout(function(){ + h.apply(scope, args); + }, o.delay || 10); + }; + }; + + Ext.util.Event = function(obj, name){ + this.name = name; + this.obj = obj; + this.listeners = []; + }; + + Ext.util.Event.prototype = { + addListener : function(fn, scope, options){ + var o = options || {}; + scope = scope || this.obj; + if(!this.isListening(fn, scope)){ + var l = {fn: fn, scope: scope, options: o}; + var h = fn; + if(o.delay){ + h = createDelayed(h, o, scope); + } + if(o.single){ + h = createSingle(h, this, fn, scope); + } + if(o.buffer){ + h = createBuffered(h, o, scope); + } + l.fireFn = h; + if(!this.firing){ this.listeners.push(l); + }else{ + this.listeners = this.listeners.slice(0); + this.listeners.push(l); + } + } + }, + + findListener : function(fn, scope){ + scope = scope || this.obj; + var ls = this.listeners; + for(var i = 0, len = ls.length; i < len; i++){ + var l = ls[i]; + if(l.fn == fn && l.scope == scope){ + return i; + } + } + return -1; + }, + + isListening : function(fn, scope){ + return this.findListener(fn, scope) != -1; + }, + + removeListener : function(fn, scope){ + var index; + if((index = this.findListener(fn, scope)) != -1){ + if(!this.firing){ + this.listeners.splice(index, 1); + }else{ + this.listeners = this.listeners.slice(0); + this.listeners.splice(index, 1); + } + return true; + } + return false; + }, + + clearListeners : function(){ + this.listeners = []; + }, + + fire : function(){ + var ls = this.listeners, scope, len = ls.length; + if(len > 0){ + this.firing = true; + var args = Array.prototype.slice.call(arguments, 0); + for(var i = 0; i < len; i++){ + var l = ls[i]; + if(l.fireFn.apply(l.scope, arguments) === false){ + this.firing = false; + return false; + } + } + this.firing = false; + } + return true; + } + }; +})(); + +Ext.EventManager = function(){ + var docReadyEvent, docReadyProcId, docReadyState = false; + var resizeEvent, resizeTask, textEvent, textSize; + var E = Ext.lib.Event; + var D = Ext.lib.Dom; + + + var fireDocReady = function(){ + if(!docReadyState){ + docReadyState = true; + Ext.isReady = true; + if(docReadyProcId){ + clearInterval(docReadyProcId); + } + if(Ext.isGecko || Ext.isOpera) { + document.removeEventListener("DOMContentLoaded", fireDocReady, false); + } + if(docReadyEvent){ + docReadyEvent.fire(); + docReadyEvent.clearListeners(); + } + } + }; + + var initDocReady = function(){ + docReadyEvent = new Ext.util.Event(); + if(Ext.isGecko || Ext.isOpera) { + document.addEventListener("DOMContentLoaded", fireDocReady, false); + }else if(Ext.isIE){ + + document.write(""); + var defer = document.getElementById("ie-deferred-loader"); + defer.onreadystatechange = function(){ + if(this.readyState == "complete"){ + fireDocReady(); + defer.onreadystatechange = null; + defer.parentNode.removeChild(defer); + } + }; + }else if(Ext.isSafari){ + docReadyProcId = setInterval(function(){ + var rs = document.readyState; + if(rs == "complete") { + fireDocReady(); + } + }, 10); + } + + E.on(window, "load", fireDocReady); + }; + + var createBuffered = function(h, o){ + var task = new Ext.util.DelayedTask(h); + return function(e){ + + e = new Ext.EventObjectImpl(e); + task.delay(o.buffer, h, null, [e]); + }; + }; + + var createSingle = function(h, el, ename, fn){ + return function(e){ + Ext.EventManager.removeListener(el, ename, fn); + h(e); + }; + }; + + var createDelayed = function(h, o){ + return function(e){ + + e = new Ext.EventObjectImpl(e); + setTimeout(function(){ + h(e); + }, o.delay || 10); + }; + }; + + var listen = function(element, ename, opt, fn, scope){ + var o = (!opt || typeof opt == "boolean") ? {} : opt; + fn = fn || o.fn; scope = scope || o.scope; + var el = Ext.getDom(element); + if(!el){ + throw "Error listening for \"" + ename + '\". Element "' + element + '" doesn\'t exist.'; + } + var h = function(e){ + e = Ext.EventObject.setEvent(e); + var t; + if(o.delegate){ + t = e.getTarget(o.delegate, el); + if(!t){ + return; + } + }else{ + t = e.target; + } + if(o.stopEvent === true){ + e.stopEvent(); + } + if(o.preventDefault === true){ + e.preventDefault(); + } + if(o.stopPropagation === true){ + e.stopPropagation(); + } + + if(o.normalized === false){ + e = e.browserEvent; + } + + fn.call(scope || el, e, t, o); + }; + if(o.delay){ + h = createDelayed(h, o); + } + if(o.single){ + h = createSingle(h, el, ename, fn); + } + if(o.buffer){ + h = createBuffered(h, o); + } + fn._handlers = fn._handlers || []; + fn._handlers.push([Ext.id(el), ename, h]); + + E.on(el, ename, h); + if(ename == "mousewheel" && el.addEventListener){ + el.addEventListener("DOMMouseScroll", h, false); + E.on(window, 'unload', function(){ + el.removeEventListener("DOMMouseScroll", h, false); + }); + } + if(ename == "mousedown" && el == document){ + Ext.EventManager.stoppedMouseDownEvent.addListener(h); + } + return h; + }; + + var stopListening = function(el, ename, fn){ + var id = Ext.id(el), hds = fn._handlers, hd = fn; + if(hds){ + for(var i = 0, len = hds.length; i < len; i++){ + var h = hds[i]; + if(h[0] == id && h[1] == ename){ + hd = h[2]; + hds.splice(i, 1); + break; + } + } + } + E.un(el, ename, hd); + el = Ext.getDom(el); + if(ename == "mousewheel" && el.addEventListener){ + el.removeEventListener("DOMMouseScroll", hd, false); + } + if(ename == "mousedown" && el == document){ + Ext.EventManager.stoppedMouseDownEvent.removeListener(hd); + } + }; + + var propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized)$/; + var pub = { + + + wrap : function(fn, scope, override){ + return function(e){ + Ext.EventObject.setEvent(e); + fn.call(override ? scope || window : window, Ext.EventObject, scope); + }; + }, + + + addListener : function(element, eventName, fn, scope, options){ + if(typeof eventName == "object"){ + var o = eventName; + for(var e in o){ + if(propRe.test(e)){ + continue; + } + if(typeof o[e] == "function"){ + + listen(element, e, o, o[e], o.scope); + }else{ + + listen(element, e, o[e]); + } + } + return; + } + return listen(element, eventName, options, fn, scope); + }, + + + removeListener : function(element, eventName, fn){ + return stopListening(element, eventName, fn); + }, + + + onDocumentReady : function(fn, scope, options){ + if(docReadyState){ + fn.call(scope || window, scope); + return; + } + if(!docReadyEvent){ + initDocReady(); + } + docReadyEvent.addListener(fn, scope, options); + }, + + + onWindowResize : function(fn, scope, options){ + if(!resizeEvent){ + resizeEvent = new Ext.util.Event(); + resizeTask = new Ext.util.DelayedTask(function(){ + resizeEvent.fire(D.getViewWidth(), D.getViewHeight()); + }); + E.on(window, "resize", function(){ + if(Ext.isIE){ + resizeTask.delay(50); + }else{ + resizeEvent.fire(D.getViewWidth(), D.getViewHeight()); + } + }); + } + resizeEvent.addListener(fn, scope, options); + }, + + + onTextResize : function(fn, scope, options){ + if(!textEvent){ + textEvent = new Ext.util.Event(); + var textEl = new Ext.Element(document.createElement('div')); + textEl.dom.className = 'x-text-resize'; + textEl.dom.innerHTML = 'X'; + textEl.appendTo(document.body); + textSize = textEl.dom.offsetHeight; + setInterval(function(){ + if(textEl.dom.offsetHeight != textSize){ + textEvent.fire(textSize, textSize = textEl.dom.offsetHeight); + } + }, this.textResizeInterval); + } + textEvent.addListener(fn, scope, options); + }, + + + removeResizeListener : function(fn, scope){ + if(resizeEvent){ + resizeEvent.removeListener(fn, scope); + } + }, + + fireResize : function(){ + if(resizeEvent){ + resizeEvent.fire(D.getViewWidth(), D.getViewHeight()); + } + }, + + ieDeferSrc : false, + textResizeInterval : 50 + }; + + pub.on = pub.addListener; + pub.un = pub.removeListener; + + pub.stoppedMouseDownEvent = new Ext.util.Event(); + return pub; +}(); + +Ext.onReady = Ext.EventManager.onDocumentReady; + +Ext.onReady(function(){ + var bd = Ext.get(document.body); + if(!bd){ return; } + var cls = Ext.isIE ? "ext-ie" + : Ext.isGecko ? "ext-gecko" + : Ext.isOpera ? "ext-opera" + : Ext.isSafari ? "ext-safari" : ""; + if(Ext.isBorderBox){ + cls += ' ext-border-box'; + } + if(Ext.isStrict){ + cls += ' ext-strict'; + } + bd.addClass(cls); +}); + +Ext.EventObject = function(){ + + var E = Ext.lib.Event; + + + var safariKeys = { + 63234 : 37, + 63235 : 39, + 63232 : 38, + 63233 : 40, + 63276 : 33, + 63277 : 34, + 63272 : 46, + 63273 : 36, + 63275 : 35 + }; + + + var btnMap = Ext.isIE ? {1:0,4:1,2:2} : + (Ext.isSafari ? {1:0,2:1,3:2} : {0:0,1:1,2:2}); + + Ext.EventObjectImpl = function(e){ + if(e){ + this.setEvent(e.browserEvent || e); + } + }; + Ext.EventObjectImpl.prototype = { + + browserEvent : null, + + button : -1, + + shiftKey : false, + + ctrlKey : false, + + altKey : false, + + + BACKSPACE : 8, + + TAB : 9, + + RETURN : 13, + + ENTER : 13, + + SHIFT : 16, + + CONTROL : 17, + + ESC : 27, + + SPACE : 32, + + PAGEUP : 33, + + PAGEDOWN : 34, + + END : 35, + + HOME : 36, + + LEFT : 37, + + UP : 38, + + RIGHT : 39, + + DOWN : 40, + + DELETE : 46, + + F5 : 116, + + + setEvent : function(e){ + if(e == this || (e && e.browserEvent)){ + return e; + } + this.browserEvent = e; + if(e){ + + this.button = e.button ? btnMap[e.button] : (e.which ? e.which-1 : -1); + this.shiftKey = e.shiftKey; + + this.ctrlKey = e.ctrlKey || e.metaKey; + this.altKey = e.altKey; + + this.keyCode = e.keyCode; + this.charCode = e.charCode; + + this.target = E.getTarget(e); + + this.xy = E.getXY(e); + }else{ + this.button = -1; + this.shiftKey = false; + this.ctrlKey = false; + this.altKey = false; + this.keyCode = 0; + this.charCode =0; + this.target = null; + this.xy = [0, 0]; + } + return this; + }, + + + stopEvent : function(){ + if(this.browserEvent){ + if(this.browserEvent.type == 'mousedown'){ + Ext.EventManager.stoppedMouseDownEvent.fire(this); + } + E.stopEvent(this.browserEvent); + } + }, + + + preventDefault : function(){ + if(this.browserEvent){ + E.preventDefault(this.browserEvent); + } + }, + + + isNavKeyPress : function(){ + var k = this.keyCode; + k = Ext.isSafari ? (safariKeys[k] || k) : k; + return (k >= 33 && k <= 40) || k == this.RETURN || k == this.TAB || k == this.ESC; + }, + + isSpecialKey : function(){ + var k = this.keyCode; + return k == 9 || k == 13 || k == 40 || k == 27 || + (k == 16) || (k == 17) || + (k >= 18 && k <= 20) || + (k >= 33 && k <= 35) || + (k >= 36 && k <= 39) || + (k >= 44 && k <= 45); + }, + + stopPropagation : function(){ + if(this.browserEvent){ + if(this.browserEvent.type == 'mousedown'){ + Ext.EventManager.stoppedMouseDownEvent.fire(this); + } + E.stopPropagation(this.browserEvent); + } + }, + + + getCharCode : function(){ + return this.charCode || this.keyCode; + }, + + + getKey : function(){ + var k = this.keyCode || this.charCode; + return Ext.isSafari ? (safariKeys[k] || k) : k; + }, + + + getPageX : function(){ + return this.xy[0]; + }, + + + getPageY : function(){ + return this.xy[1]; + }, + + + getTime : function(){ + if(this.browserEvent){ + return E.getTime(this.browserEvent); + } + return null; + }, + + + getXY : function(){ + return this.xy; + }, + + + getTarget : function(selector, maxDepth, returnEl){ + return selector ? Ext.fly(this.target).findParent(selector, maxDepth, returnEl) : this.target; + }, + + getRelatedTarget : function(){ + if(this.browserEvent){ + return E.getRelatedTarget(this.browserEvent); + } + return null; + }, + + + 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; + }, + + + hasModifier : function(){ + return ((this.ctrlKey || this.altKey) || this.shiftKey) ? true : false; + }, + + + within : function(el, related){ + var t = this[related ? "getRelatedTarget" : "getTarget"](); + return t && Ext.fly(el).contains(t); + }, + + getPoint : function(){ + return new Ext.lib.Point(this.xy[0], this.xy[1]); + } + }; + + return new Ext.EventObjectImpl(); +}(); + + + +(function(){ +var D = Ext.lib.Dom; +var E = Ext.lib.Event; +var A = Ext.lib.Anim; + + +var propCache = {}; +var camelRe = /(-[a-z])/gi; +var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); }; +var view = document.defaultView; + +Ext.Element = function(element, forceNew){ + var dom = typeof element == "string" ? + document.getElementById(element) : element; + if(!dom){ + return null; + } + if(!forceNew && Ext.Element.cache[dom.id]){ + return Ext.Element.cache[dom.id]; + } + + this.dom = dom; + + + this.id = dom.id || Ext.id(dom); +}; + +var El = Ext.Element; + +El.prototype = { + + originalDisplay : "", + + visibilityMode : 1, + + defaultUnit : "px", + + setVisibilityMode : function(visMode){ + this.visibilityMode = visMode; + return this; + }, + + enableDisplayMode : function(display){ + this.setVisibilityMode(El.DISPLAY); + if(typeof display != "undefined") this.originalDisplay = display; + return this; + }, + + + findParent : function(simpleSelector, maxDepth, returnEl){ + var p = this.dom, b = document.body, depth = 0, dq = Ext.DomQuery, stopEl; + maxDepth = maxDepth || 50; + if(typeof maxDepth != "number"){ + stopEl = Ext.getDom(maxDepth); + maxDepth = 10; + } + while(p && p.nodeType == 1 && depth < maxDepth && p != b && p != stopEl){ + if(dq.is(p, simpleSelector)){ + return returnEl ? Ext.get(p) : p; + } + depth++; + p = p.parentNode; + } + return null; + }, + + + + findParentNode : function(simpleSelector, maxDepth, returnEl){ + var p = Ext.fly(this.dom.parentNode, '_internal'); + return p ? p.findParent(simpleSelector, maxDepth, returnEl) : null; + }, + + + up : function(simpleSelector, maxDepth){ + return this.findParentNode(simpleSelector, maxDepth, true); + }, + + + + + is : function(simpleSelector){ + return Ext.DomQuery.is(this.dom, simpleSelector); + }, + + + animate : function(args, duration, onComplete, easing, animType){ + this.anim(args, {duration: duration, callback: onComplete, easing: easing}, animType); + return this; + }, + + + anim : function(args, opt, animType, defaultDur, defaultEase, cb){ + animType = animType || 'run'; + opt = opt || {}; + var anim = Ext.lib.Anim[animType]( + this.dom, args, + (opt.duration || defaultDur) || .35, + (opt.easing || defaultEase) || 'easeOut', + function(){ + Ext.callback(cb, this); + Ext.callback(opt.callback, opt.scope || this, [this, opt]); + }, + this + ); + opt.anim = anim; + return anim; + }, + + + preanim : function(a, i){ + return !a[i] ? false : (typeof a[i] == "object" ? a[i]: {duration: a[i+1], callback: a[i+2], easing: a[i+3]}); + }, + + + clean : function(forceReclean){ + if(this.isCleaned && forceReclean !== true){ + return this; + } + var ns = /\S/; + var d = this.dom, n = d.firstChild, ni = -1; + while(n){ + var nx = n.nextSibling; + if(n.nodeType == 3 && !ns.test(n.nodeValue)){ + d.removeChild(n); + }else{ + n.nodeIndex = ++ni; + } + n = nx; + } + this.isCleaned = true; + return this; + }, + + calcOffsetsTo : function(el){ + el = Ext.get(el), d = el.dom; + var restorePos = false; + if(el.getStyle('position') == 'static'){ + el.position('relative'); + restorePos = true; + } + var x = 0, y =0; + var op = this.dom; + while(op && op != d && op.tagName != 'HTML'){ + x+= op.offsetLeft; + y+= op.offsetTop; + op = op.offsetParent; + } + if(restorePos){ + el.position('static'); + } + return [x, y]; + }, + + + scrollIntoView : function(container, hscroll){ + var c = Ext.getDom(container) || document.body; + var el = this.dom; + + var o = this.calcOffsetsTo(c), + l = o[0], + t = o[1], + b = t+el.offsetHeight, + r = l+el.offsetWidth; + + var ch = c.clientHeight; + var ct = parseInt(c.scrollTop, 10); + var cl = parseInt(c.scrollLeft, 10); + var cb = ct + ch; + var cr = cl + c.clientWidth; + + if(t < ct){ + c.scrollTop = t; + }else if(b > cb){ + c.scrollTop = b-ch; + } + + if(hscroll !== false){ + if(l < cl){ + c.scrollLeft = l; + }else if(r > cr){ + c.scrollLeft = r-c.clientWidth; + } + } + return this; + }, + + scrollChildIntoView : function(child){ + Ext.fly(child, '_scrollChildIntoView').scrollIntoView(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; + }, + + + contains : function(el){ + if(!el){return false;} + return D.isAncestor(this.dom, el.dom ? el.dom : el); + }, + + + isVisible : function(deep) { + var vis = !(this.getStyle("visibility") == "hidden" || this.getStyle("display") == "none"); + if(deep !== true || !vis){ + return vis; + } + var p = this.dom.parentNode; + while(p && p.tagName.toLowerCase() != "body"){ + if(!Ext.fly(p, '_isVisible').isVisible()){ + return false; + } + p = p.parentNode; + } + return true; + }, + + + select : function(selector, unique){ + return El.select("#" + Ext.id(this.dom) + " " + selector, unique); + }, + + + query : function(selector, unique){ + return Ext.DomQuery.select("#" + Ext.id(this.dom) + " " + selector); + }, + + + child : function(selector, returnDom){ + var n = Ext.DomQuery.selectNode("#" + Ext.id(this.dom) + " " + selector); + return returnDom ? n : Ext.get(n); + }, + + + down : function(selector, returnDom){ + var n = Ext.DomQuery.selectNode("#" + Ext.id(this.dom) + " > " + selector); + return returnDom ? n : Ext.get(n); + }, + + + initDD : function(group, config, overrides){ + var dd = new Ext.dd.DD(Ext.id(this.dom), group, config); + return Ext.apply(dd, overrides); + }, + + + initDDProxy : function(group, config, overrides){ + var dd = new Ext.dd.DDProxy(Ext.id(this.dom), group, config); + return Ext.apply(dd, overrides); + }, + + + initDDTarget : function(group, config, overrides){ + var dd = new Ext.dd.DDTarget(Ext.id(this.dom), group, config); + return Ext.apply(dd, overrides); + }, + + + setVisible : function(visible, animate){ + if(!animate || !A){ + if(this.visibilityMode == El.DISPLAY){ + this.setDisplayed(visible); + }else{ + this.fixDisplay(); + this.dom.style.visibility = visible ? "visible" : "hidden"; + } + }else{ + + var dom = this.dom; + var visMode = this.visibilityMode; + if(visible){ + this.setOpacity(.01); + this.setVisible(true); + } + this.anim({opacity: { to: (visible?1:0) }}, + this.preanim(arguments, 1), + null, .35, 'easeIn', function(){ + if(!visible){ + if(visMode == El.DISPLAY){ + dom.style.display = "none"; + }else{ + dom.style.visibility = "hidden"; + } + Ext.get(dom).setOpacity(1); + } + }); + } + return this; + }, + + + isDisplayed : function() { + return this.getStyle("display") != "none"; + }, + + + toggle : function(animate){ + this.setVisible(!this.isVisible(), this.preanim(arguments, 0)); + return this; + }, + + + setDisplayed : function(value) { + if(typeof value == "boolean"){ + value = value ? this.originalDisplay : "none"; + } + this.setStyle("display", value); + return this; + }, + + + focus : function() { + try{ + this.dom.focus(); + }catch(e){} + return this; + }, + + + blur : function() { + try{ + this.dom.blur(); + }catch(e){} + return this; + }, + + + addClass : function(className){ + if(className instanceof Array){ + for(var i = 0, len = className.length; i < len; i++) { + this.addClass(className[i]); + } + }else{ + if(className && !this.hasClass(className)){ + this.dom.className = this.dom.className + " " + 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){ + Ext.get(s).removeClass(className); + } + } + this.addClass(className); + return this; + }, + + + removeClass : function(className){ + if(!className || !this.dom.className){ + return this; + } + if(className instanceof Array){ + for(var i = 0, len = className.length; i < len; i++) { + this.removeClass(className[i]); + } + }else{ + if(this.hasClass(className)){ + var re = this.classReCache[className]; + if (!re) { + re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)', "g"); + this.classReCache[className] = re; + } + this.dom.className = + this.dom.className.replace(re, " "); + } + } + return this; + }, + + classReCache: {}, + + + toggleClass : function(className){ + if(this.hasClass(className)){ + this.removeClass(className); + }else{ + this.addClass(className); + } + return this; + }, + + + hasClass : function(className){ + return className && (' '+this.dom.className+' ').indexOf(' '+className+' ') != -1; + }, + + + replaceClass : function(oldClassName, newClassName){ + this.removeClass(oldClassName); + this.addClass(newClassName); + return this; + }, + + + getStyles : function(){ + var a = arguments, len = a.length, r = {}; + for(var i = 0; i < len; i++){ + r[a[i]] = this.getStyle(a[i]); + } + return r; + }, + + + getStyle : function(){ + return view && view.getComputedStyle ? + function(prop){ + var el = this.dom, v, cs, camel; + if(prop == 'float'){ + prop = "cssFloat"; + } + if(v = el.style[prop]){ + return v; + } + if(cs = view.getComputedStyle(el, "")){ + if(!(camel = propCache[prop])){ + camel = propCache[prop] = prop.replace(camelRe, camelFn); + } + return cs[camel]; + } + return null; + } : + function(prop){ + var el = this.dom, v, cs, camel; + if(prop == 'opacity'){ + if(typeof el.filter == 'string'){ + var fv = parseFloat(el.filter.match(/alpha\(opacity=(.*)\)/i)[1]); + if(!isNaN(fv)){ + return fv ? fv / 100 : 0; + } + } + return 1; + }else if(prop == 'float'){ + prop = "styleFloat"; + } + if(!(camel = propCache[prop])){ + camel = propCache[prop] = prop.replace(camelRe, camelFn); + } + if(v = el.style[camel]){ + return v; + } + if(cs = el.currentStyle){ + return cs[camel]; + } + return null; + }; + }(), + + + setStyle : function(prop, value){ + if(typeof prop == "string"){ + var camel; + if(!(camel = propCache[prop])){ + camel = propCache[prop] = prop.replace(camelRe, camelFn); + } + if(camel == 'opacity') { + this.setOpacity(value); + }else{ + this.dom.style[camel] = value; + } + }else{ + for(var style in prop){ + if(typeof prop[style] != "function"){ + this.setStyle(style, prop[style]); + } + } + } + return this; + }, + + + applyStyles : function(style){ + Ext.DomHelper.applyStyles(this.dom, style); + return this; + }, + + + getX : function(){ + return D.getX(this.dom); + }, + + + getY : function(){ + return D.getY(this.dom); + }, + + + getXY : function(){ + return D.getXY(this.dom); + }, + + + setX : function(x, animate){ + if(!animate || !A){ + D.setX(this.dom, x); + }else{ + this.setXY([x, this.getY()], this.preanim(arguments, 1)); + } + return this; + }, + + + setY : function(y, animate){ + if(!animate || !A){ + D.setY(this.dom, y); + }else{ + this.setXY([this.getX(), y], this.preanim(arguments, 1)); + } + return this; + }, + + + setLeft : function(left){ + this.setStyle("left", this.addUnits(left)); + return this; + }, + + + setTop : function(top){ + this.setStyle("top", this.addUnits(top)); + return this; + }, + + + setRight : function(right){ + this.setStyle("right", this.addUnits(right)); + return this; + }, + + + setBottom : function(bottom){ + this.setStyle("bottom", this.addUnits(bottom)); + return this; + }, + + + setXY : function(pos, animate){ + if(!animate || !A){ + D.setXY(this.dom, pos); + }else{ + this.anim({points: {to: pos}}, this.preanim(arguments, 1), 'motion'); + } + return this; + }, + + + setLocation : function(x, y, animate){ + this.setXY([x, y], this.preanim(arguments, 2)); + return this; + }, + + + moveTo : function(x, y, animate){ + this.setXY([x, y], this.preanim(arguments, 2)); + return this; + }, + + + getRegion : function(){ + return D.getRegion(this.dom); + }, + + + getHeight : function(contentHeight){ + var h = this.dom.offsetHeight || 0; + return contentHeight !== true ? h : h-this.getBorderWidth("tb")-this.getPadding("tb"); + }, + + + getWidth : function(contentWidth){ + var w = this.dom.offsetWidth || 0; + return contentWidth !== true ? w : w-this.getBorderWidth("lr")-this.getPadding("lr"); + }, + + + getComputedHeight : function(){ + var h = Math.max(this.dom.offsetHeight, this.dom.clientHeight); + if(!h){ + h = parseInt(this.getStyle('height'), 10) || 0; + if(!this.isBorderBox()){ + h += this.getFrameWidth('tb'); + } + } + return h; + }, + + + getComputedWidth : function(){ + var w = Math.max(this.dom.offsetWidth, this.dom.clientWidth); + if(!w){ + w = parseInt(this.getStyle('width'), 10) || 0; + if(!this.isBorderBox()){ + w += this.getFrameWidth('lr'); + } + } + return w; + }, + + + getSize : function(contentSize){ + return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)}; + }, + + getViewSize : function(){ + var d = this.dom, doc = document, aw = 0, ah = 0; + if(d == doc || d == doc.body){ + return {width : D.getViewWidth(), height: D.getViewHeight()}; + }else{ + return { + width : d.clientWidth, + height: d.clientHeight + }; + } + }, + + + getValue : function(asNumber){ + return asNumber ? parseInt(this.dom.value, 10) : this.dom.value; + }, + + + 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){ + width = this.adjustWidth(width); + if(!animate || !A){ + this.dom.style.width = this.addUnits(width); + }else{ + this.anim({width: {to: width}}, this.preanim(arguments, 1)); + } + return this; + }, + + + setHeight : function(height, animate){ + height = this.adjustHeight(height); + if(!animate || !A){ + this.dom.style.height = this.addUnits(height); + }else{ + this.anim({height: {to: height}}, this.preanim(arguments, 1)); + } + return this; + }, + + + setSize : function(width, height, animate){ + if(typeof width == "object"){ + height = width.height; width = width.width; + } + width = this.adjustWidth(width); height = this.adjustHeight(height); + if(!animate || !A){ + this.dom.style.width = this.addUnits(width); + this.dom.style.height = this.addUnits(height); + }else{ + this.anim({width: {to: width}, height: {to: height}}, this.preanim(arguments, 2)); + } + return this; + }, + + + setBounds : function(x, y, width, height, animate){ + if(!animate || !A){ + this.setSize(width, 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}}, + this.preanim(arguments, 4), 'motion'); + } + return this; + }, + + + setRegion : function(region, animate){ + this.setBounds(region.left, region.top, region.right-region.left, region.bottom-region.top, this.preanim(arguments, 1)); + return this; + }, + + + addListener : function(eventName, fn, scope, options){ + Ext.EventManager.on(this.dom, eventName, fn, scope || this, options); + }, + + + removeListener : function(eventName, fn){ + Ext.EventManager.removeListener(this.dom, eventName, fn); + return this; + }, + + + removeAllListeners : function(){ + E.purgeElement(this.dom); + return this; + }, + + relayEvent : function(eventName, observable){ + this.on(eventName, function(e){ + observable.fireEvent(eventName, e); + }); + }, + + + setOpacity : function(opacity, animate){ + if(!animate || !A){ + var s = this.dom.style; + if(Ext.isIE){ + s.zoom = 1; + s.filter = (s.filter || '').replace(/alpha\([^\)]*\)/gi,"") + + (opacity == 1 ? "" : "alpha(opacity=" + opacity * 100 + ")"); + }else{ + s.opacity = opacity; + } + }else{ + this.anim({opacity: {to: opacity}}, this.preanim(arguments, 1), null, .35, 'easeIn'); + } + 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; + } + }, + + + position : function(pos, zIndex, x, y){ + if(!pos){ + if(this.getStyle('position') == 'static'){ + this.setStyle('position', 'relative'); + } + }else{ + this.setStyle("position", pos); + } + if(zIndex){ + this.setStyle("z-index", zIndex); + } + if(x !== undefined && y !== undefined){ + this.setXY([x, y]); + }else if(x !== undefined){ + this.setX(x); + }else if(y !== undefined){ + this.setY(y); + } + }, + + + clearPositioning : function(value){ + value = value ||''; + this.setStyle({ + "left": value, + "right": value, + "top": value, + "bottom": value, + "z-index": "", + "position" : "static" + }); + return this; + }, + + + getPositioning : function(){ + var l = this.getStyle("left"); + var t = this.getStyle("top"); + return { + "position" : this.getStyle("position"), + "left" : l, + "right" : l ? "" : this.getStyle("right"), + "top" : t, + "bottom" : t ? "" : this.getStyle("bottom"), + "z-index" : this.getStyle("z-index") + }; + }, + + + getBorderWidth : function(side){ + return this.addStyles(side, El.borders); + }, + + + getPadding : function(side){ + return this.addStyles(side, El.paddings); + }, + + + setPositioning : function(pc){ + this.applyStyles(pc); + if(pc.right == "auto"){ + this.dom.style.right = ""; + } + if(pc.bottom == "auto"){ + this.dom.style.bottom = ""; + } + return this; + }, + + fixDisplay : function(){ + if(this.getStyle("display") == "none"){ + this.setStyle("visibility", "hidden"); + this.setStyle("display", this.originalDisplay); + if(this.getStyle("display") == "none"){ + this.setStyle("display", "block"); + } + } + }, + + + 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){ + var xy = this.getXY(); + direction = direction.toLowerCase(); + switch(direction){ + case "l": + case "left": + this.moveTo(xy[0]-distance, xy[1], this.preanim(arguments, 2)); + break; + case "r": + case "right": + this.moveTo(xy[0]+distance, xy[1], this.preanim(arguments, 2)); + break; + case "t": + case "top": + case "up": + this.moveTo(xy[0], xy[1]-distance, this.preanim(arguments, 2)); + break; + case "b": + case "bottom": + case "down": + this.moveTo(xy[0], xy[1]+distance, this.preanim(arguments, 2)); + 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; + }, + + + + getAnchorXY : function(anchor, local, s){ + + + + var w, h, vp = false; + if(!s){ + var d = this.dom; + if(d == document.body || d == document){ + vp = true; + w = D.getViewWidth(); h = D.getViewHeight(); + }else{ + w = this.getWidth(); h = this.getHeight(); + } + }else{ + w = s.width; h = s.height; + } + var x = 0, y = 0, r = Math.round; + switch((anchor || "tl").toLowerCase()){ + case "c": + x = r(w*.5); + y = r(h*.5); + break; + case "t": + x = r(w*.5); + y = 0; + break; + case "l": + x = 0; + y = r(h*.5); + break; + case "r": + x = w; + y = r(h*.5); + break; + case "b": + x = r(w*.5); + y = h; + break; + case "tl": + x = 0; + y = 0; + break; + case "bl": + x = 0; + y = h; + break; + case "br": + x = w; + y = h; + break; + case "tr": + x = w; + y = 0; + break; + } + if(local === true){ + return [x, y]; + } + if(vp){ + var sc = this.getScroll(); + return [x + sc.left, y + sc.top]; + } + + var o = this.getXY(); + return [x+o[0], y+o[1]]; + }, + + + getAlignToXY : function(el, p, o){ + el = Ext.get(el), d = this.dom; + if(!el.dom){ + throw "Element.alignTo with an element that doesn't exist"; + } + var c = false; + var p1 = "", p2 = ""; + o = o || [0,0]; + + if(!p){ + p = "tl-bl"; + }else if(p == "?"){ + p = "tl-bl?"; + }else if(p.indexOf("-") == -1){ + p = "tl-" + p; + } + p = p.toLowerCase(); + var m = p.match(/^([a-z]+)-([a-z]+)(\?)?$/); + if(!m){ + throw "Element.alignTo with an invalid alignment " + p; + } + p1 = m[1], p2 = m[2], c = m[3] ? true : false; + + + + var a1 = this.getAnchorXY(p1, true); + var a2 = el.getAnchorXY(p2, false); + var x = a2[0] - a1[0] + o[0]; + var y = a2[1] - a1[1] + o[1]; + if(c){ + + var w = this.getWidth(), h = this.getHeight(), r = el.getRegion(); + + var dw = D.getViewWidth()-5, dh = D.getViewHeight()-5; + + + + + var p1y = p1.charAt(0), p1x = p1.charAt(p1.length-1); + var p2y = p2.charAt(0), p2x = p2.charAt(p2.length-1); + var swapY = ((p1y=="t" && p2y=="b") || (p1y=="b" && p2y=="t")); + var swapX = ((p1x=="r" && p2x=="l") || (p1x=="l" && p2x=="r")); + + var doc = document; + var scrollX = (doc.documentElement.scrollLeft || doc.body.scrollLeft || 0)+5; + var scrollY = (doc.documentElement.scrollTop || doc.body.scrollTop || 0)+5; + + if((x+w) > dw){ + x = swapX ? r.left-w : dw-w; + } + if(x < scrollX){ + x = swapX ? r.right : scrollX; + } + if((y+h) > dh){ + y = swapY ? r.top-h : dh-h; + } + if (y < scrollY){ + y = swapY ? r.bottom : scrollY; + } + } + return [x,y]; + }, + + getConstrainToXY : function(){ + var os = {top:0, left:0, bottom:0, right: 0}; + + return function(el, local, offsets){ + el = Ext.get(el); + offsets = offsets ? Ext.applyIf(offsets, os) : os; + + var vw, vh, vx = 0, vy = 0; + if(el.dom == document.body || el.dom == document){ + vw = Ext.lib.Dom.getViewWidth(); + vh = Ext.lib.Dom.getViewHeight(); + }else{ + vw = el.dom.clientWidth; + vh = el.dom.clientHeight; + if(!local){ + var vxy = el.getXY(); + vx = vxy[0]; + vy = vxy[1]; + } + } + + var s = el.getScroll(); + + vx += offsets.left + s.left; + vy += offsets.top + s.top; + + vw -= offsets.right; + vh -= offsets.bottom; + + var vr = vx+vw; + var vb = vy+vh; + + var xy = !local ? this.getXY() : [this.getLeft(true), this.getTop(true)]; + var x = xy[0], y = xy[1]; + var w = this.dom.offsetWidth, h = this.dom.offsetHeight; + + + var moved = false; + + + if((x + w) > vr){ + x = vr - w; + moved = true; + } + if((y + h) > vb){ + y = vb - h; + moved = true; + } + + if(x < vx){ + x = vx; + moved = true; + } + if(y < vy){ + y = vy; + moved = true; + } + return moved ? [x, y] : false; + }; + }(), + + + alignTo : function(element, position, offsets, animate){ + var xy = this.getAlignToXY(element, position, offsets); + this.setXY(xy, this.preanim(arguments, 3)); + return this; + }, + + + anchorTo : function(el, alignment, offsets, animate, monitorScroll, callback){ + var action = function(){ + this.alignTo(el, alignment, offsets, animate); + Ext.callback(callback, this); + }; + Ext.EventManager.onWindowResize(action, this); + var tm = typeof monitorScroll; + if(tm != 'undefined'){ + Ext.EventManager.on(window, 'scroll', action, this, + {buffer: tm == 'number' ? monitorScroll : 50}); + } + action.call(this); + 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){ + this.setVisible(false, this.preanim(arguments, 0)); + return this; + }, + + + show : function(animate){ + this.setVisible(true, this.preanim(arguments, 0)); + return this; + }, + + + addUnits : function(size){ + return Ext.Element.addUnits(size, this.defaultUnit); + }, + + + beginMeasure : function(){ + var el = this.dom; + if(el.offsetWidth || el.offsetHeight){ + return this; + } + var changed = []; + var p = this.dom, b = document.body; + while((!el.offsetWidth && !el.offsetHeight) && p && p.tagName && p != b){ + var pe = Ext.get(p); + if(pe.getStyle('display') == 'none'){ + changed.push({el: p, visibility: pe.getStyle("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 = Ext.id(); + var dom = this.dom; + + html += ''; + + E.onAvailable(id, function(){ + var hd = document.getElementsByTagName("head")[0]; + var re = /(?:]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig; + var srcRe = /\ssrc=([\'\"])(.*?)\1/i; + var typeRe = /\stype=([\'\"])(.*?)\1/i; + + var match; + while(match = re.exec(html)){ + var attrs = match[1]; + var srcMatch = attrs ? attrs.match(srcRe) : false; + if(srcMatch && srcMatch[2]){ + var s = document.createElement("script"); + s.src = srcMatch[2]; + var typeMatch = attrs.match(typeRe); + if(typeMatch && typeMatch[2]){ + s.type = typeMatch[2]; + } + hd.appendChild(s); + }else if(match[2] && match[2].length > 0){ + eval(match[2]); + } + } + var el = document.getElementById(id); + if(el){el.parentNode.removeChild(el);} + if(typeof callback == "function"){ + callback(); + } + }); + dom.innerHTML = html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/ig, ""); + return this; + }, + + + load : function(){ + var um = this.getUpdateManager(); + um.update.apply(um, arguments); + return this; + }, + + + getUpdateManager : function(){ + if(!this.updateManager){ + this.updateManager = new 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;"); + this.addClass("x-unselectable"); + return this; + }, + + + getCenterXY : function(){ + return this.getAlignToXY(document, 'c-c'); + }, + + + center : function(centerIn){ + this.alignTo(centerIn || document, 'c-c'); + return this; + }, + + + isBorderBox : function(){ + return noBoxAdjust[this.dom.tagName.toLowerCase()] || Ext.isBorderBox; + }, + + + getBox : function(contentBox, local){ + var xy; + if(!local){ + xy = this.getXY(); + }else{ + var left = parseInt(this.getStyle("left"), 10) || 0; + var top = parseInt(this.getStyle("top"), 10) || 0; + xy = [left, top]; + } + var el = this.dom, w = el.offsetWidth, h = el.offsetHeight, bx; + if(!contentBox){ + bx = {x: xy[0], y: xy[1], 0: xy[0], 1: 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"); + bx = {x: xy[0]+l, y: xy[1]+t, 0: xy[0]+l, 1: xy[1]+t, width: w-(l+r), height: h-(t+b)}; + } + bx.right = bx.x + bx.width; + bx.bottom = bx.y + bx.height; + return bx; + }, + + + getFrameWidth : function(sides){ + return this.getPadding(sides) + this.getBorderWidth(sides); + }, + + + setBox : function(box, adjust, animate){ + 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, this.preanim(arguments, 2)); + return this; + }, + + + repaint : function(){ + var dom = this.dom; + this.addClass("x-repaint"); + setTimeout(function(){ + Ext.get(dom).removeClass("x-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, El.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 = Ext.getDom(renderTo); + }else{ + renderTo = document.body; + } + config = typeof config == "object" ? + config : {tag : "div", cls: config}; + var proxy = Ext.DomHelper.append(renderTo, config, true); + if(matchBox){ + proxy.setBox(this.getBox()); + } + return proxy; + }, + + + mask : function(msg, msgCls){ + if(this.getStyle("position") == "static"){ + this.setStyle("position", "relative"); + } + if(!this._mask){ + this._mask = Ext.DomHelper.append(this.dom, {tag:"div", cls:"ext-el-mask"}, true); + } + this.addClass("x-masked"); + this._mask.setDisplayed(true); + if(typeof msg == 'string'){ + if(!this._maskMsg){ + this._maskMsg = Ext.DomHelper.append(this.dom, {tag:"div", cls:"ext-el-mask-msg", cn:{tag:'div'}}, true); + } + var mm = this._maskMsg; + mm.dom.className = msgCls ? "ext-el-mask-msg " + msgCls : "ext-el-mask-msg"; + mm.dom.firstChild.innerHTML = msg; + mm.setDisplayed(true); + mm.center(this); + } + return this._mask; + }, + + + unmask : function(removeEl){ + if(this._mask){ + if(removeEl === true){ + this._mask.remove(); + delete this._mask; + if(this._maskMsg){ + this._maskMsg.remove(); + delete this._maskMsg; + } + }else{ + this._mask.setDisplayed(false); + if(this._maskMsg){ + this._maskMsg.setDisplayed(false); + } + } + } + this.removeClass("x-masked"); + }, + + + isMasked : function(){ + return this._mask && this._mask.isVisible(); + }, + + + createShim : function(){ + var el = document.createElement('iframe'); + el.frameBorder = 'no'; + el.className = 'ext-shim'; + if(Ext.isIE && Ext.isSecure){ + el.src = Ext.SSL_SECURE_URL; + } + var shim = Ext.get(this.dom.parentNode.insertBefore(el, this.dom)); + shim.autoBoxAdjust = false; + return shim; + }, + + + remove : function(){ + if(this.dom.parentNode){ + this.dom.parentNode.removeChild(this.dom); + } + delete El.cache[this.dom.id]; + }, + + + addClassOnOver : function(className, preventFlicker){ + this.on("mouseover", function(){ + Ext.fly(this, '_internal').addClass(className); + }, this.dom); + var removeFn = function(e){ + if(preventFlicker !== true || !e.within(this, true)){ + Ext.fly(this, '_internal').removeClass(className); + } + }; + this.on("mouseout", removeFn, this.dom); + return this; + }, + + + addClassOnFocus : function(className){ + this.on("focus", function(){ + Ext.fly(this, '_internal').addClass(className); + }, this.dom); + this.on("blur", function(){ + Ext.fly(this, '_internal').removeClass(className); + }, this.dom); + return this; + }, + + addClassOnClick : function(className){ + var dom = this.dom; + this.on("mousedown", function(){ + Ext.fly(dom, '_internal').addClass(className); + var d = Ext.get(document); + var fn = function(){ + Ext.fly(dom, '_internal').removeClass(className); + d.removeListener("mouseup", fn); + }; + d.on("mouseup", fn); + }); + return this; + }, + + + swallowEvent : function(eventName, preventDefault){ + var fn = function(e){ + e.stopPropagation(); + if(preventDefault){ + e.preventDefault(); + } + }; + if(eventName instanceof Array){ + for(var i = 0, len = eventName.length; i < len; i++){ + this.on(eventName[i], fn); + } + return this; + } + this.on(eventName, fn); + return this; + }, + + + fitToParent : function(monitorResize, targetParent){ + var p = Ext.get(targetParent || this.dom.parentNode); + this.setSize(p.getComputedWidth()-p.getFrameWidth('lr'), p.getComputedHeight()-p.getFrameWidth('tb')); + if(monitorResize === true){ + Ext.EventManager.onWindowResize(this.fitToParent.createDelegate(this, [])); + } + 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 = Ext.get(el); + el.appendTo(this); + return this; + }, + + + createChild: function(config, insertBefore, returnDom){ + config = config || {tag:'div'}; + if(insertBefore){ + return Ext.DomHelper.insertBefore(insertBefore, config, returnDom !== true); + } + return Ext.DomHelper[!this.dom.firstChild ? 'overwrite' : 'append'](this.dom, config, returnDom !== true); + }, + + + appendTo: function(el){ + el = Ext.getDom(el); + el.appendChild(this.dom); + return this; + }, + + + insertBefore: function(el){ + el = Ext.getDom(el); + el.parentNode.insertBefore(this.dom, el); + return this; + }, + + + insertAfter: function(el){ + el = Ext.getDom(el); + el.parentNode.insertBefore(this.dom, el.nextSibling); + return this; + }, + + + insertFirst: function(el, returnDom){ + el = el || {}; + if(typeof el == 'object' && !el.nodeType){ + return this.createChild(el, this.dom.firstChild, returnDom); + }else{ + el = Ext.getDom(el); + this.dom.insertBefore(el, this.dom.firstChild); + return !returnDom ? Ext.get(el) : el; + } + }, + + + insertSibling: function(el, where, returnDom){ + where = where ? where.toLowerCase() : 'before'; + el = el || {}; + var rt, refNode = where == 'before' ? this.dom : this.dom.nextSibling; + + if(typeof el == 'object' && !el.nodeType){ + if(where == 'after' && !this.dom.nextSibling){ + rt = Ext.DomHelper.append(this.dom.parentNode, el, !returnDom); + }else{ + rt = Ext.DomHelper[where == 'after' ? 'insertAfter' : 'insertBefore'](this.dom, el, !returnDom); + } + + }else{ + rt = this.dom.parentNode.insertBefore(Ext.getDom(el), + where == 'before' ? this.dom : this.dom.nextSibling); + if(!returnDom){ + rt = Ext.get(rt); + } + } + return rt; + }, + + + wrap: function(config, returnDom){ + if(!config){ + config = {tag: "div"}; + } + var newEl = Ext.DomHelper.insertBefore(this.dom, config, !returnDom); + newEl.dom ? newEl.dom.appendChild(this.dom) : newEl.appendChild(this.dom); + return newEl; + }, + + + replace: function(el){ + el = Ext.get(el); + this.insertBefore(el); + el.remove(); + return this; + }, + + + insertHtml : function(where, html){ + return Ext.DomHelper.insertHtml(where, this.dom, html); + }, + + + set : function(o, useSet){ + var el = this.dom; + useSet = typeof useSet == 'undefined' ? (el.setAttribute ? true : false) : useSet; + 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]; + } + } + Ext.DomHelper.applyStyles(el, o.style); + return this; + }, + + + addKeyListener : function(key, fn, scope){ + var config; + if(typeof key != "object" || key instanceof Array){ + config = { + key: key, + fn: fn, + scope: scope + }; + }else{ + config = { + key : key.key, + shift : key.shift, + ctrl : key.ctrl, + alt : key.alt, + fn: fn, + scope: scope + }; + } + return new Ext.KeyMap(this, config); + }, + + + addKeyMap : function(config){ + return new Ext.KeyMap(this, config); + }, + + + isScrollable : function(){ + var dom = this.dom; + return dom.scrollHeight > dom.clientHeight || dom.scrollWidth > dom.clientWidth; + }, + + + + scrollTo : function(side, value, animate){ + var prop = side.toLowerCase() == "left" ? "scrollLeft" : "scrollTop"; + if(!animate || !A){ + this.dom[prop] = value; + }else{ + var to = prop == "scrollLeft" ? [value, this.dom.scrollTop] : [this.dom.scrollLeft, value]; + this.anim({scroll: {"to": to}}, this.preanim(arguments, 2), 'scroll'); + } + return this; + }, + + + scroll : function(direction, distance, animate){ + if(!this.isScrollable()){ + return; + } + var el = this.dom; + var l = el.scrollLeft, t = el.scrollTop; + var w = el.scrollWidth, h = el.scrollHeight; + var cw = el.clientWidth, ch = el.clientHeight; + direction = direction.toLowerCase(); + var scrolled = false; + var a = this.preanim(arguments, 2); + switch(direction){ + case "l": + case "left": + if(w - l > cw){ + var v = Math.min(l + distance, w-cw); + this.scrollTo("left", v, a); + scrolled = true; + } + break; + case "r": + case "right": + if(l > 0){ + var v = Math.max(l - distance, 0); + this.scrollTo("left", v, a); + scrolled = true; + } + break; + case "t": + case "top": + case "up": + if(t > 0){ + var v = Math.max(t - distance, 0); + this.scrollTo("top", v, a); + scrolled = true; + } + break; + case "b": + case "bottom": + case "down": + if(h - t > ch){ + var v = Math.min(t + distance, h-ch); + this.scrollTo("top", v, a); + scrolled = true; + } + break; + } + return scrolled; + }, + + + translatePoints : function(x, y){ + if(typeof x == 'object' || x instanceof Array){ + y = x[1]; x = x[0]; + } + var p = this.getStyle('position'); + var o = this.getXY(); + + var l = parseInt(this.getStyle('left'), 10); + var t = parseInt(this.getStyle('top'), 10); + + if(isNaN(l)){ + l = (p == "relative") ? 0 : this.dom.offsetLeft; + } + if(isNaN(t)){ + t = (p == "relative") ? 0 : this.dom.offsetTop; + } + + return {left: (x - o[0] + l), top: (y - o[1] + t)}; + }, + + getScroll : function(){ + var d = this.dom, doc = document; + if(d == doc || d == doc.body){ + var l = window.pageXOffset || doc.documentElement.scrollLeft || doc.body.scrollLeft || 0; + var t = window.pageYOffset || doc.documentElement.scrollTop || doc.body.scrollTop || 0; + return {left: l, top: t}; + }else{ + return {left: d.scrollLeft, top: d.scrollTop}; + } + }, + + + getColor : function(attr, defaultValue, prefix){ + var v = this.getStyle(attr); + if(!v || v == "transparent" || v == "inherit") { + return defaultValue; + } + var color = typeof prefix == "undefined" ? "#" : prefix; + if(v.substr(0, 4) == "rgb("){ + var rvs = v.slice(4, v.length -1).split(","); + for(var i = 0; i < 3; i++){ + var h = parseInt(rvs[i]).toString(16); + if(h < 16){ + h = "0" + h; + } + color += h; + } + } else { + if(v.substr(0, 1) == "#"){ + if(v.length == 4) { + for(var i = 1; i < 4; i++){ + var c = v.charAt(i); + color += c + c; + } + }else if(v.length == 7){ + color += v.substr(1); + } + } + } + return(color.length > 5 ? color.toLowerCase() : defaultValue); + }, + + boxWrap : function(cls){ + cls = cls || 'x-box'; + var el = Ext.get(this.insertHtml('beforeBegin', String.format('
      '+El.boxMarkup+'
      ', cls))); + el.child('.'+cls+'-mc').dom.appendChild(this.dom); + return el; + }, + + getAttributeNS : Ext.isIE ? function(ns, name){ + var d = this.dom; + var type = typeof d[ns+":"+name]; + if(type != 'undefined' && type != 'unknown'){ + return d[ns+":"+name]; + } + return d[name]; + } : function(ns, name){ + var d = this.dom; + return d.getAttributeNS(ns, name) || d.getAttribute(ns+":"+name) || d.getAttribute(name) || d[name]; + } +}; + +var ep = El.prototype; + + +ep.on = ep.addListener; + +ep.mon = ep.addListener; + + +ep.un = ep.removeListener; + + +ep.autoBoxAdjust = true; + +ep.autoDisplayMode = true; + +El.unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i; + +El.addUnits = function(v, defaultUnit){ + if(v === "" || v == "auto"){ + return v; + } + if(v === undefined){ + return ''; + } + if(typeof v == "number" || !El.unitPattern.test(v)){ + return v + (defaultUnit || 'px'); + } + return v; +}; + + +El.boxMarkup = '
      '; + +El.VISIBILITY = 1; + +El.DISPLAY = 2; + +El.borders = {l: "border-left-width", r: "border-right-width", t: "border-top-width", b: "border-bottom-width"}; +El.paddings = {l: "padding-left", r: "padding-right", t: "padding-top", b: "padding-bottom"}; +El.margins = {l: "margin-left", r: "margin-right", t: "margin-top", b: "margin-bottom"}; + + + + +El.cache = {}; + +var docEl; + + +El.get = function(el){ + var ex, elm, id; + if(!el){ return null; } + if(typeof el == "string"){ + if(!(elm = document.getElementById(el))){ + return null; + } + if(ex = El.cache[el]){ + ex.dom = elm; + }else{ + ex = El.cache[el] = new El(elm); + } + return ex; + }else if(el.tagName){ + if(!(id = el.id)){ + id = Ext.id(el); + } + if(ex = El.cache[id]){ + ex.dom = el; + }else{ + ex = El.cache[id] = new El(el); + } + return ex; + }else if(el instanceof El){ + if(el != docEl){ + el.dom = document.getElementById(el.id) || el.dom; + + El.cache[el.id] = el; + } + return el; + }else if(el.isComposite){ + return el; + }else if(el instanceof Array){ + return El.select(el); + }else if(el == document){ + + if(!docEl){ + var f = function(){}; + f.prototype = El.prototype; + docEl = new f(); + docEl.dom = document; + } + return docEl; + } + return null; +}; + +El.uncache = function(el){ + for(var i = 0, a = arguments, len = a.length; i < len; i++) { + if(a[i]){ + delete El.cache[a[i].id || a[i]]; + } + } +}; + + +El.Flyweight = function(dom){ + this.dom = dom; +}; +El.Flyweight.prototype = El.prototype; + +El._flyweights = {}; + +El.fly = function(el, named){ + named = named || '_global'; + el = Ext.getDom(el); + if(!el){ + return null; + } + if(!El._flyweights[named]){ + El._flyweights[named] = new El.Flyweight(); + } + El._flyweights[named].dom = el; + return El._flyweights[named]; +}; + + +Ext.get = El.get; + +Ext.fly = El.fly; + + +var noBoxAdjust = Ext.isStrict ? { + select:1 +} : { + input:1, select:1, textarea:1 +}; +if(Ext.isIE || Ext.isGecko){ + noBoxAdjust['button'] = 1; +} + + +Ext.EventManager.on(window, 'unload', function(){ + delete El.cache; + delete El._flyweights; +}); +})(); + + + +Ext.enableFx = true; + + +Ext.Fx = { + + slideIn : function(anchor, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + + anchor = anchor || "t"; + + this.fixDisplay(); + + var r = this.getFxRestore(); + var b = this.getBox(); + this.setSize(b); + + var wrap = this.fxWrap(r.pos, o, "hidden"); + + var st = this.dom.style; + st.visibility = "visible"; + st.position = "absolute"; + + var after = function(){ + el.fxUnwrap(wrap, r.pos, o); + st.width = r.width; + st.height = r.height; + el.afterFx(o); + }; + var a, pt = {to: [b.x, b.y]}, bw = {to: b.width}, bh = {to: b.height}; + + switch(anchor.toLowerCase()){ + case "t": + wrap.setSize(b.width, 0); + st.left = st.bottom = "0"; + a = {height: bh}; + break; + case "l": + wrap.setSize(0, b.height); + st.right = st.top = "0"; + a = {width: bw}; + break; + case "r": + wrap.setSize(0, b.height); + wrap.setX(b.right); + st.left = st.top = "0"; + a = {width: bw, points: pt}; + break; + case "b": + wrap.setSize(b.width, 0); + wrap.setY(b.bottom); + st.left = st.top = "0"; + a = {height: bh, points: pt}; + break; + case "tl": + wrap.setSize(0, 0); + st.right = st.bottom = "0"; + a = {width: bw, height: bh}; + break; + case "bl": + wrap.setSize(0, 0); + wrap.setY(b.y+b.height); + st.right = st.top = "0"; + a = {width: bw, height: bh, points: pt}; + break; + case "br": + wrap.setSize(0, 0); + wrap.setXY([b.right, b.bottom]); + st.left = st.top = "0"; + a = {width: bw, height: bh, points: pt}; + break; + case "tr": + wrap.setSize(0, 0); + wrap.setX(b.x+b.width); + st.left = st.bottom = "0"; + a = {width: bw, height: bh, points: pt}; + break; + } + this.dom.style.visibility = "visible"; + wrap.show(); + + arguments.callee.anim = wrap.fxanim(a, + o, + 'motion', + .5, + 'easeOut', after); + }); + return this; + }, + + + slideOut : function(anchor, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + + anchor = anchor || "t"; + + var r = this.getFxRestore(); + + var b = this.getBox(); + this.setSize(b); + + var wrap = this.fxWrap(r.pos, o, "visible"); + + var st = this.dom.style; + st.visibility = "visible"; + st.position = "absolute"; + + wrap.setSize(b); + + var after = function(){ + if(o.useDisplay){ + el.setDisplayed(false); + }else{ + el.hide(); + } + + el.fxUnwrap(wrap, r.pos, o); + + st.width = r.width; + st.height = r.height; + + el.afterFx(o); + }; + + var a, zero = {to: 0}; + switch(anchor.toLowerCase()){ + case "t": + st.left = st.bottom = "0"; + a = {height: zero}; + break; + case "l": + st.right = st.top = "0"; + a = {width: zero}; + break; + case "r": + st.left = st.top = "0"; + a = {width: zero, points: {to:[b.right, b.y]}}; + break; + case "b": + st.left = st.top = "0"; + a = {height: zero, points: {to:[b.x, b.bottom]}}; + break; + case "tl": + st.right = st.bottom = "0"; + a = {width: zero, height: zero}; + break; + case "bl": + st.right = st.top = "0"; + a = {width: zero, height: zero, points: {to:[b.x, b.bottom]}}; + break; + case "br": + st.left = st.top = "0"; + a = {width: zero, height: zero, points: {to:[b.x+b.width, b.bottom]}}; + break; + case "tr": + st.left = st.bottom = "0"; + a = {width: zero, height: zero, points: {to:[b.right, b.y]}}; + break; + } + + arguments.callee.anim = wrap.fxanim(a, + o, + 'motion', + .5, + "easeOut", after); + }); + return this; + }, + + + puff : function(o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + this.clearOpacity(); + this.show(); + + var r = this.getFxRestore(); + var st = this.dom.style; + + var after = function(){ + if(o.useDisplay){ + el.setDisplayed(false); + }else{ + el.hide(); + } + + el.clearOpacity(); + + el.setPositioning(r.pos); + st.width = r.width; + st.height = r.height; + st.fontSize = ''; + el.afterFx(o); + }; + + var width = this.getWidth(); + var height = this.getHeight(); + + arguments.callee.anim = this.fxanim({ + width : {to: this.adjustWidth(width * 2)}, + height : {to: this.adjustHeight(height * 2)}, + points : {by: [-(width * .5), -(height * .5)]}, + opacity : {to: 0}, + fontSize: {to:200, unit: "%"} + }, + o, + 'motion', + .5, + "easeOut", after); + }); + return this; + }, + + + switchOff : function(o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + this.clearOpacity(); + this.clip(); + + var r = this.getFxRestore(); + var st = this.dom.style; + + var after = function(){ + if(o.useDisplay){ + el.setDisplayed(false); + }else{ + el.hide(); + } + + el.clearOpacity(); + el.setPositioning(r.pos); + st.width = r.width; + st.height = r.height; + + el.afterFx(o); + }; + + this.fxanim({opacity:{to:0.3}}, null, null, .1, null, function(){ + this.clearOpacity(); + (function(){ + this.fxanim({ + height:{to:1}, + points:{by:[0, this.getHeight() * .5]} + }, o, 'motion', 0.3, 'easeIn', after); + }).defer(100, this); + }); + }); + return this; + }, + + + highlight : function(color, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + color = color || "ffff9c"; + attr = o.attr || "backgroundColor"; + + this.clearOpacity(); + this.show(); + + var origColor = this.getColor(attr); + var restoreColor = this.dom.style[attr]; + endColor = (o.endColor || origColor) || "ffffff"; + + var after = function(){ + el.dom.style[attr] = restoreColor; + el.afterFx(o); + }; + + var a = {}; + a[attr] = {from: color, to: endColor}; + arguments.callee.anim = this.fxanim(a, + o, + 'color', + 1, + 'easeIn', after); + }); + return this; + }, + + + frame : function(color, count, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + color = color || "#C3DAF9"; + if(color.length == 6){ + color = "#" + color; + } + count = count || 1; + duration = o.duration || 1; + this.show(); + + var b = this.getBox(); + var animFn = function(){ + var proxy = this.createProxy({ + tag:"div", + style:{ + visbility:"hidden", + position:"absolute", + "z-index":"35000", border:"0px solid " + color + } + }); + var scale = Ext.isBorderBox ? 2 : 1; + proxy.animate({ + top:{from:b.y, to:b.y - 20}, + left:{from:b.x, to:b.x - 20}, + borderWidth:{from:0, to:10}, + opacity:{from:1, to:0}, + height:{from:b.height, to:(b.height + (20*scale))}, + width:{from:b.width, to:(b.width + (20*scale))} + }, duration, function(){ + proxy.remove(); + }); + if(--count > 0){ + animFn.defer((duration/2)*1000, this); + }else{ + el.afterFx(o); + } + }; + animFn.call(this); + }); + return this; + }, + + + pause : function(seconds){ + var el = this.getFxEl(); + var o = {}; + + el.queueFx(o, function(){ + setTimeout(function(){ + el.afterFx(o); + }, seconds * 1000); + }); + return this; + }, + + + fadeIn : function(o){ + var el = this.getFxEl(); + o = o || {}; + el.queueFx(o, function(){ + this.setOpacity(0); + this.fixDisplay(); + this.dom.style.visibility = 'visible'; + var to = o.endOpacity || 1; + arguments.callee.anim = this.fxanim({opacity:{to:to}}, + o, null, .5, "easeOut", function(){ + if(to == 1){ + this.clearOpacity(); + } + el.afterFx(o); + }); + }); + return this; + }, + + + fadeOut : function(o){ + var el = this.getFxEl(); + o = o || {}; + el.queueFx(o, function(){ + arguments.callee.anim = this.fxanim({opacity:{to:o.endOpacity || 0}}, + o, null, .5, "easeOut", function(){ + if(this.visibilityMode == Ext.Element.DISPLAY || o.useDisplay){ + this.dom.style.display = "none"; + }else{ + this.dom.style.visibility = "hidden"; + } + this.clearOpacity(); + el.afterFx(o); + }); + }); + return this; + }, + + + scale : function(w, h, o){ + this.shift(Ext.apply({}, o, { + width: w, + height: h + })); + return this; + }, + + + shift : function(o){ + var el = this.getFxEl(); + o = o || {}; + el.queueFx(o, function(){ + var a = {}, w = o.width, h = o.height, x = o.x, y = o.y, op = o.opacity; + if(w !== undefined){ + a.width = {to: this.adjustWidth(w)}; + } + if(h !== undefined){ + a.height = {to: this.adjustHeight(h)}; + } + if(x !== undefined || y !== undefined){ + a.points = {to: [ + x !== undefined ? x : this.getX(), + y !== undefined ? y : this.getY() + ]}; + } + if(op !== undefined){ + a.opacity = {to: op}; + } + if(o.xy !== undefined){ + a.points = {to: o.xy}; + } + arguments.callee.anim = this.fxanim(a, + o, 'motion', .35, "easeOut", function(){ + el.afterFx(o); + }); + }); + return this; + }, + + + ghost : function(anchor, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + anchor = anchor || "b"; + + var r = this.getFxRestore(); + var w = this.getWidth(), + h = this.getHeight(); + + var st = this.dom.style; + + var after = function(){ + if(o.useDisplay){ + el.setDisplayed(false); + }else{ + el.hide(); + } + + el.clearOpacity(); + el.setPositioning(r.pos); + st.width = r.width; + st.height = r.height; + + el.afterFx(o); + }; + + var a = {opacity: {to: 0}, points: {}}, pt = a.points; + switch(anchor.toLowerCase()){ + case "t": + pt.by = [0, -h]; + break; + case "l": + pt.by = [-w, 0]; + break; + case "r": + pt.by = [w, 0]; + break; + case "b": + pt.by = [0, h]; + break; + case "tl": + pt.by = [-w, -h]; + break; + case "bl": + pt.by = [-w, h]; + break; + case "br": + pt.by = [w, h]; + break; + case "tr": + pt.by = [w, -h]; + break; + } + + arguments.callee.anim = this.fxanim(a, + o, + 'motion', + .5, + "easeOut", after); + }); + return this; + }, + + + syncFx : function(){ + this.fxDefaults = Ext.apply(this.fxDefaults || {}, { + block : false, + concurrent : true, + stopFx : false + }); + return this; + }, + + + sequenceFx : function(){ + this.fxDefaults = Ext.apply(this.fxDefaults || {}, { + block : false, + concurrent : false, + stopFx : false + }); + return this; + }, + + + nextFx : function(){ + var ef = this.fxQueue[0]; + if(ef){ + ef.call(this); + } + }, + + + hasActiveFx : function(){ + return this.fxQueue && this.fxQueue[0]; + }, + + + stopFx : function(){ + if(this.hasActiveFx()){ + var cur = this.fxQueue[0]; + if(cur && cur.anim && cur.anim.isAnimated()){ + this.fxQueue = [cur]; cur.anim.stop(true); + } + } + return this; + }, + + + beforeFx : function(o){ + if(this.hasActiveFx() && !o.concurrent){ + if(o.stopFx){ + this.stopFx(); + return true; + } + return false; + } + return true; + }, + + + hasFxBlock : function(){ + var q = this.fxQueue; + return q && q[0] && q[0].block; + }, + + + queueFx : function(o, fn){ + if(!this.fxQueue){ + this.fxQueue = []; + } + if(!this.hasFxBlock()){ + Ext.applyIf(o, this.fxDefaults); + if(!o.concurrent){ + var run = this.beforeFx(o); + fn.block = o.block; + this.fxQueue.push(fn); + if(run){ + this.nextFx(); + } + }else{ + fn.call(this); + } + } + return this; + }, + + + fxWrap : function(pos, o, vis){ + var wrap; + if(!o.wrap || !(wrap = Ext.get(o.wrap))){ + var wrapXY; + if(o.fixPosition){ + wrapXY = this.getXY(); + } + var div = document.createElement("div"); + div.style.visibility = vis; + wrap = Ext.get(this.dom.parentNode.insertBefore(div, this.dom)); + wrap.setPositioning(pos); + if(wrap.getStyle("position") == "static"){ + wrap.position("relative"); + } + this.clearPositioning('auto'); + wrap.clip(); + wrap.dom.appendChild(this.dom); + if(wrapXY){ + wrap.setXY(wrapXY); + } + } + return wrap; + }, + + + fxUnwrap : function(wrap, pos, o){ + this.clearPositioning(); + this.setPositioning(pos); + if(!o.wrap){ + wrap.dom.parentNode.insertBefore(this.dom, wrap.dom); + wrap.remove(); + } + }, + + + getFxRestore : function(){ + var st = this.dom.style; + return {pos: this.getPositioning(), width: st.width, height : st.height}; + }, + + + afterFx : function(o){ + if(o.afterStyle){ + this.applyStyles(o.afterStyle); + } + if(o.afterCls){ + this.addClass(o.afterCls); + } + if(o.remove === true){ + this.remove(); + } + Ext.callback(o.callback, o.scope, [this]); + if(!o.concurrent){ + this.fxQueue.shift(); + this.nextFx(); + } + }, + + + getFxEl : function(){ return Ext.get(this.dom); + }, + + + fxanim : function(args, opt, animType, defaultDur, defaultEase, cb){ + animType = animType || 'run'; + opt = opt || {}; + var anim = Ext.lib.Anim[animType]( + this.dom, args, + (opt.duration || defaultDur) || .35, + (opt.easing || defaultEase) || 'easeOut', + function(){ + Ext.callback(cb, this); + }, + this + ); + opt.anim = anim; + return anim; + } +}; + +Ext.Fx.resize = Ext.Fx.scale; + +Ext.apply(Ext.Element.prototype, Ext.Fx); + + +Ext.CompositeElement = function(els){ + this.elements = []; + this.addElements(els); +}; +Ext.CompositeElement.prototype = { + isComposite: true, + addElements : function(els){ + if(!els) return this; + if(typeof els == "string"){ + els = Ext.Element.selectorFunction(els); + } + var yels = this.elements; + var index = yels.length-1; + for(var i = 0, len = els.length; i < len; i++) { + yels[++index] = Ext.get(els[i], true); + } + return this; + }, + invoke : function(fn, args){ + var els = this.elements; + for(var i = 0, len = els.length; i < len; i++) { + Ext.Element.prototype[fn].apply(els[i], args); + } + return this; + }, + + add : function(els){ + if(typeof els == "string"){ + this.addElements(Ext.Element.selectorFunction(els)); + }else if(els.length !== undefined){ + 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++){ + if(fn.call(scope || els[i], els[i], this, i) === false) { + break; + } + } + return this; + }, + + + item : function(index){ + return this.elements[index]; + } +}; +(function(){ +Ext.CompositeElement.createCall = function(proto, fnName){ + if(!proto[fnName]){ + proto[fnName] = function(){ + return this.invoke(fnName, arguments); + }; + } +}; +for(var fnName in Ext.Element.prototype){ + if(typeof Ext.Element.prototype[fnName] == "function"){ + Ext.CompositeElement.createCall(Ext.CompositeElement.prototype, fnName); + } +}; +})(); + + +Ext.CompositeElementLite = function(els){ + Ext.CompositeElementLite.superclass.constructor.call(this, els); + var flyEl = function(){}; + flyEl.prototype = Ext.Element.prototype; + this.el = new Ext.Element.Flyweight(); +}; +Ext.extend(Ext.CompositeElementLite, Ext.CompositeElement, { + addElements : function(els){ + if(els){ + if(els instanceof Array){ + this.elements = this.elements.concat(els); + }else{ + var yels = this.elements; + var index = yels.length-1; + for(var i = 0, len = els.length; i < len; i++) { + yels[++index] = els[i]; + } + } + } + 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]; + Ext.Element.prototype[fn].apply(el, args); + } + return this; + }, + + item : function(index){ + this.el.dom = this.elements[index]; + return this.el; + }, + + + addListener : function(eventName, handler, scope, opt){ + var els = this.elements; + for(var i = 0, len = els.length; i < len; i++) { + Ext.EventManager.on(els[i], eventName, handler, scope || els[i], opt); + } + return this; + }, + + + each : function(fn, scope){ + var els = this.elements; + var el = this.el; + for(var i = 0, len = els.length; i < len; i++){ + el.dom = els[i]; + if(fn.call(scope || el, el, this, i) === false){ + break; + } + } + return this; + } +}); +Ext.CompositeElementLite.prototype.on = Ext.CompositeElementLite.prototype.addListener; +if(Ext.DomQuery){ + Ext.Element.selectorFunction = Ext.DomQuery.select; +} + +Ext.Element.select = function(selector, unique){ + var els; + if(typeof selector == "string"){ + els = Ext.Element.selectorFunction(selector); + }else if(selector.length !== undefined){ + els = selector; + }else{ + throw "Invalid selector"; + } + if(unique === true){ + return new Ext.CompositeElement(els); + }else{ + return new Ext.CompositeElementLite(els); + } +}; + +Ext.select = Ext.Element.select; + +Ext.UpdateManager = function(el, forceNew){ + el = Ext.get(el); + if(!forceNew && el.updateManager){ + return el.updateManager; + } + + this.el = el; + + this.defaultUrl = null; + + this.addEvents({ + + "beforeupdate": true, + + "update": true, + + "failure": true + }); + var d = Ext.UpdateManager.defaults; + + this.sslBlankUrl = d.sslBlankUrl; + + this.disableCaching = d.disableCaching; + + this.indicatorText = d.indicatorText; + + this.showLoadIndicator = d.showLoadIndicator; + + this.timeout = d.timeout; + + + this.loadScripts = d.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 Ext.UpdateManager.BasicRenderer(); + + Ext.UpdateManager.superclass.constructor.call(this); +}; + +Ext.extend(Ext.UpdateManager, Ext.util.Observable, { + + getEl : function(){ + return this.el; + }, + + update : function(url, params, callback, discardUrl){ + if(this.fireEvent("beforeupdate", this.el, url, params) !== false){ + var method = this.method; + 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.method != "undefined"){method = cfg.method;}; + 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.call(this); + } + if(typeof params == "function"){ + params = params(); + } + 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.successDelegate, + failure: this.failureDelegate, + timeout: (this.timeout*1000), + argument: {"url": url, "form": null, "callback": callback, "params": params} + }; + method = method || (params ? "POST" : "GET"); + if(method == "GET"){ + url = this.prepareUrl(url); + } + this.transaction = Ext.lib.Ajax.request(method, url, cb, params); + } + }, + + + formUpdate : function(form, url, reset, callback){ + if(this.fireEvent("beforeupdate", this.el, form, url) !== false){ + formEl = Ext.getDom(form); + if(typeof url == "function"){ + url = url.call(this); + } + if(typeof params == "function"){ + params = params(); + } + url = url || formEl.action; + var cb = { + success: this.successDelegate, + failure: this.failureDelegate, + timeout: (this.timeout*1000), + argument: {"url": url, "form": formEl, "callback": callback, "reset": reset} + }; + var isUpload = false; + var enctype = formEl.getAttribute("enctype"); + if(enctype && enctype.toLowerCase() == "multipart/form-data"){ + isUpload = true; + cb.upload = this.successDelegate; + } + this.transaction = Ext.lib.Ajax.formRequest(formEl, url, cb, null, isUpload, this.sslBlankUrl); + this.showLoading.defer(1, this); + } + }, + + + 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); + delete this.autoRefreshProcId; + } + }, + + isAutoRefreshing : function(){ + return this.autoRefreshProcId ? true : false; + }, + + 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, response); + } + }, + + + processFailure : function(response){ + this.transaction = null; + this.fireEvent("failure", this.el, response); + if(typeof response.argument.callback == "function"){ + response.argument.callback(this.el, false, response); + } + }, + + + setRenderer : function(renderer){ + this.renderer = renderer; + }, + + getRenderer : function(){ + return this.renderer; + }, + + + setDefaultUrl : function(defaultUrl){ + this.defaultUrl = defaultUrl; + }, + + + abort : function(){ + if(this.transaction){ + Ext.lib.Ajax.abort(this.transaction); + } + }, + + + isUpdating : function(){ + if(this.transaction){ + return Ext.lib.Ajax.isCallInProgress(this.transaction); + } + return false; + } +}); + + + Ext.UpdateManager.defaults = { + + timeout : 30, + + + loadScripts : false, + + + sslBlankUrl : (Ext.SSL_SECURE_URL || "javascript:false"), + + disableCaching : false, + + showLoadIndicator : true, + + indicatorText : '
      Loading...
      ' + }; + + +Ext.UpdateManager.updateElement = function(el, url, params, options){ + var um = Ext.get(el, true).getUpdateManager(); + Ext.apply(um, options); + um.update(url, params, options ? options.callback : null); +}; + +Ext.UpdateManager.update = Ext.UpdateManager.updateElement; + +Ext.UpdateManager.BasicRenderer = function(){}; + +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 { + var 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); + 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.getFirstDateOfMonth = function() { + return new Date(this.getFullYear(), this.getMonth(), 1); +}; + + +Date.prototype.getLastDateOfMonth = function() { + return new Date(this.getFullYear(), this.getMonth(), this.getDaysInMonth()); +}; + +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}; + + +Date.prototype.clone = function() { + return new Date(this.getTime()); +}; + + +Date.prototype.clearTime = function(clone){ + if(clone){ + return this.clone().clearTime(); + } + this.setHours(0); + this.setMinutes(0); + this.setSeconds(0); + this.setMilliseconds(0); + return this; +}; + + + +if(Ext.isSafari){ + Date.brokenSetMonth = Date.prototype.setMonth; + Date.prototype.setMonth = function(num){ + if(num <= -1){ + var n = Math.ceil(-num); + var back_year = Math.ceil(n/12); + var month = (n % 12) ? 12 - n % 12 : 0 ; + this.setFullYear(this.getFullYear() - back_year); + return Date.brokenSetMonth.call(this, month); + } else { + return Date.brokenSetMonth.apply(this, arguments); + } + }; +} + + +Date.MILLI = "ms"; + +Date.SECOND = "s"; + +Date.MINUTE = "mi"; + +Date.HOUR = "h"; + +Date.DAY = "d"; + +Date.MONTH = "mo"; + +Date.YEAR = "y"; + + +Date.prototype.add = function(interval, value){ + var d = this.clone(); + if (!interval || value === 0) return d; + switch(interval.toLowerCase()){ + case Date.MILLI: + d.setMilliseconds(this.getMilliseconds() + value); + break; + case Date.SECOND: + d.setSeconds(this.getSeconds() + value); + break; + case Date.MINUTE: + d.setMinutes(this.getMinutes() + value); + break; + case Date.HOUR: + d.setHours(this.getHours() + value); + break; + case Date.DAY: + d.setDate(this.getDate() + value); + break; + case Date.MONTH: + var day = this.getDate(); + if(day > 28){ + day = Math.min(day, this.getFirstDateOfMonth().add('mo', value).getLastDateOfMonth().getDate()); + } + d.setDate(day); + d.setMonth(this.getMonth() + value); + break; + case Date.YEAR: + d.setFullYear(this.getFullYear() + value); + break; + } + return d; +}; + +Ext.util.DelayedTask = function(fn, scope, args){ + var id = null, d, t; + + var call = function(){ + var now = new Date().getTime(); + if(now - t >= d){ + clearInterval(id); + id = null; + fn.apply(scope, args || []); + } + }; + + this.delay = function(delay, newFn, newScope, newArgs){ + if(id && delay != d){ + this.cancel(); + } + d = delay; + t = new Date().getTime(); + fn = newFn || fn; + scope = newScope || scope; + args = newArgs || args; + if(!id){ + id = setInterval(call, d); + } + }; + + + this.cancel = function(){ + if(id){ + clearInterval(id); + id = null; + } + }; +}; +Ext.util.TaskRunner = function(interval){ + interval = interval || 10; + var tasks = [], removeQueue = []; + var id = 0; + var running = false; + + var stopThread = function(){ + running = false; + clearInterval(id); + id = 0; + }; + + var startThread = function(){ + if(!running){ + running = true; + id = setInterval(runTasks, interval); + } + }; + + var removeTask = function(task){ + removeQueue.push(task); + if(task.onStop){ + task.onStop(); + } + }; + + var runTasks = function(){ + if(removeQueue.length > 0){ + for(var i = 0, len = removeQueue.length; i < len; i++){ + tasks.remove(removeQueue[i]); + } + removeQueue = []; + if(tasks.length < 1){ + stopThread(); + return; + } + } + var now = new Date().getTime(); + for(var i = 0, len = tasks.length; i < len; ++i){ + var t = tasks[i]; + var itime = now - t.taskRunTime; + if(t.interval <= itime){ + var rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]); + t.taskRunTime = now; + if(rt === false || t.taskRunCount === t.repeat){ + removeTask(t); + return; + } + } + if(t.duration && t.duration <= (now - t.taskStartTime)){ + removeTask(t); + } + } + }; + + + this.start = function(task){ + tasks.push(task); + task.taskStartTime = new Date().getTime(); + task.taskRunTime = 0; + task.taskRunCount = 0; + startThread(); + return task; + }; + + this.stop = function(task){ + removeTask(task); + return task; + }; + + this.stopAll = function(){ + stopThread(); + for(var i = 0, len = tasks.length; i < len; i++){ + if(tasks[i].onStop){ + tasks[i].onStop(); + } + } + tasks = []; + removeQueue = []; + }; +}; + +Ext.TaskMgr = new Ext.util.TaskRunner(); + +Ext.util.MixedCollection = function(allowFunctions, keyFn){ + this.items = []; + this.map = {}; + this.keys = []; + this.length = 0; + this.addEvents({ + + "clear" : true, + + "add" : true, + + "replace" : true, + + "remove" : true, + "sort" : true + }); + this.allowFunctions = allowFunctions === true; + if(keyFn){ + this.getKey = keyFn; + } + Ext.util.MixedCollection.superclass.constructor.call(this); +}; + +Ext.extend(Ext.util.MixedCollection, Ext.util.Observable, { + allowFunctions : false, + + + add : function(key, o){ + if(arguments.length == 1){ + o = arguments[0]; + key = this.getKey(o); + } + if(typeof key == "undefined" || key === null){ + this.length++; + this.items.push(o); + this.keys.push(null); + }else{ + var old = this.map[key]; + if(old){ + return this.replace(key, o); + } + this.length++; + this.items.push(o); + this.map[key] = o; + this.keys.push(key); + } + this.fireEvent("add", this.length-1, o, key); + return o; + }, + + + getKey : function(o){ + return o.id; + }, + + + replace : function(key, o){ + if(arguments.length == 1){ + o = arguments[0]; + key = this.getKey(o); + } + var old = this.item(key); + if(typeof key == "undefined" || key === null || typeof old == "undefined"){ + return this.add(key, o); + } + var index = this.indexOfKey(key); + this.items[index] = o; + this.map[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){ + var items = [].concat(this.items); + for(var i = 0, len = items.length; i < len; i++){ + if(fn.call(scope || items[i], items[i], i, len) === false){ + break; + } + } + }, + + + 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], i, len); + } + }, + + + find : function(fn, scope){ + for(var i = 0, len = this.items.length; i < len; i++){ + if(fn.call(scope || window, this.items[i], this.keys[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.length){ + return this.add(key, o); + } + this.length++; + this.items.splice(index, 0, o); + if(typeof key != "undefined" && key != null){ + this.map[key] = o; + } + this.keys.splice(index, 0, key); + this.fireEvent("add", index, o, key); + return o; + }, + + + remove : function(o){ + return this.removeAt(this.indexOf(o)); + }, + + + removeAt : function(index){ + if(index < this.length && index >= 0){ + this.length--; + var o = this.items[index]; + this.items.splice(index, 1); + var key = this.keys[index]; + if(typeof key != "undefined"){ + delete this.map[key]; + } + this.keys.splice(index, 1); + this.fireEvent("remove", o, key); + } + }, + + + removeKey : function(key){ + return this.removeAt(this.indexOfKey(key)); + }, + + + getCount : function(){ + return this.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){ + var item = typeof this.map[key] != "undefined" ? this.map[key] : this.items[key]; + return typeof item != 'function' || this.allowFunctions ? item : null; + }, + + + itemAt : function(index){ + return this.items[index]; + }, + + + key : function(key){ + return this.map[key]; + }, + + + contains : function(o){ + return this.indexOf(o) != -1; + }, + + + containsKey : function(key){ + return typeof this.map[key] != "undefined"; + }, + + + clear : function(){ + this.length = 0; + this.items = []; + this.keys = []; + this.map = {}; + this.fireEvent("clear"); + }, + + + first : function(){ + return this.items[0]; + }, + + + last : function(){ + return this.items[this.length-1]; + }, + + _sort : function(property, dir, fn){ + var dsc = String(dir).toUpperCase() == "DESC" ? -1 : 1; + fn = fn || function(a, b){ + return a-b; + }; + var c = [], k = this.keys, items = this.items; + for(var i = 0, len = items.length; i < len; i++){ + c[c.length] = {key: k[i], value: items[i], index: i}; + } + c.sort(function(a, b){ + var v = fn(a[property], b[property]) * dsc; + if(v == 0){ + v = (a.index < b.index ? -1 : 1); + } + return v; + }); + for(var i = 0, len = c.length; i < len; i++){ + items[i] = c[i].value; + k[i] = c[i].key; + } + this.fireEvent("sort", this); + }, + + + sort : function(dir, fn){ + this._sort("value", dir, fn); + }, + + + keySort : function(dir, fn){ + this._sort("key", dir, fn || function(a, b){ + return String(a).toUpperCase()-String(b).toUpperCase(); + }); + }, + + + getRange : function(start, end){ + var items = this.items; + if(items.length < 1){ + return []; + } + start = start || 0; + end = Math.min(typeof end == "undefined" ? this.length-1 : end, this.length-1); + var r = []; + if(start <= end){ + for(var i = start; i <= end; i++) { + r[r.length] = items[i]; + } + }else{ + for(var i = start; i >= end; i--) { + r[r.length] = items[i]; + } + } + return r; + }, + + + filter : function(property, value){ + if(!value.exec){ + value = String(value); + if(value.length == 0){ + return this.clone(); + } + value = new RegExp("^" + Ext.escapeRe(value), "i"); + } + return this.filterBy(function(o){ + return o && value.test(o[property]); + }); + }, + + + filterBy : function(fn, scope){ + var r = new Ext.util.MixedCollection(); + r.getKey = this.getKey; + var k = this.keys, it = this.items; + for(var i = 0, len = it.length; i < len; i++){ + if(fn.call(scope||this, it[i], k[i])){ + r.add(k[i], it[i]); + } + } + return r; + }, + + + clone : function(){ + var r = new Ext.util.MixedCollection(); + var k = this.keys, it = this.items; + for(var i = 0, len = it.length; i < len; i++){ + r.add(k[i], it[i]); + } + r.getKey = this.getKey; + return r; + } +}); + +Ext.util.MixedCollection.prototype.get = Ext.util.MixedCollection.prototype.item; + +Ext.util.JSON = new (function(){ + var useHasOwn = {}.hasOwnProperty ? true : false; + + + + + 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" : 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 (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){ + return eval("(" + json + ')'); + }; +})(); + +Ext.encode = Ext.util.JSON.encode; + +Ext.decode = Ext.util.JSON.decode; + + +Ext.util.Format = function(){ + var trimRe = /^\s+|\s+$/g; + return { + + ellipsis : function(value, len){ + if(value && value.length > len){ + return value.substr(0, len-3)+"..."; + } + return value; + }, + + + undef : function(value){ + return typeof value != "undefined" ? value : ""; + }, + + + htmlEncode : function(value){ + return !value ? value : String(value).replace(/&/g, "&").replace(/>/g, ">").replace(/ 2){ + var args = Array.prototype.slice.call(arguments, 2); + args.unshift(value); + return eval(fn).apply(window, args); + }else{ + return eval(fn).call(window, value); + } + }, + + + usMoney : function(v){ + v = (Math.round((v-0)*100))/100; + v = (v == Math.floor(v)) ? v + ".00" : ((v*10 == Math.floor(v*10)) ? v + "0" : v); + return "$" + v ; + }, + + + date : function(v, format){ + if(!v){ + return ""; + } + if(!(v instanceof Date)){ + v = new Date(Date.parse(v)); + } + return v.dateFormat(format || "m/d/Y"); + }, + + + dateRenderer : function(format){ + return function(v){ + return Ext.util.Format.date(v, format); + }; + }, + + + stripTagsRE : /<\/?[^>]+>/gi, + + + stripTags : function(v){ + return !v ? v : String(v).replace(this.stripTagsRE, ""); + } + }; +}(); + +Ext.util.CSS = function(){ + var rules = null; + var doc = document; + + var camelRe = /(-[a-z])/gi; + var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); }; + + return { + + createStyleSheet : function(cssText){ + var ss; + if(Ext.isIE){ + ss = doc.createStyleSheet(); + ss.cssText = cssText; + }else{ + var head = doc.getElementsByTagName("head")[0]; + var rules = doc.createElement("style"); + rules.setAttribute("type", "text/css"); + try{ + rules.appendChild(doc.createTextNode(cssText)); + }catch(e){ + rules.cssText = cssText; + } + head.appendChild(rules); + ss = rules.styleSheet ? rules.styleSheet : (rules.sheet || doc.styleSheets[doc.styleSheets.length-1]); + } + this.cacheStyleSheet(ss); + return ss; + }, + + + removeStyleSheet : function(id){ + var existing = doc.getElementById(id); + if(existing){ + existing.parentNode.removeChild(existing); + } + }, + + + swapStyleSheet : function(id, url){ + this.removeStyleSheet(id); + var ss = doc.createElement("link"); + ss.setAttribute("rel", "stylesheet"); + ss.setAttribute("type", "text/css"); + ss.setAttribute("id", id); + ss.setAttribute("href", url); + doc.getElementsByTagName("head")[0].appendChild(ss); + }, + + + refreshCache : function(){ + return this.getRules(true); + }, + + + cacheStyleSheet : function(ss){ + if(!rules){ + rules = {}; + } + try{ + var ssRules = ss.cssRules || ss.rules; + for(var j = ssRules.length-1; j >= 0; --j){ + rules[ssRules[j].selectorText] = ssRules[j]; + } + }catch(e){} + }, + + + getRules : function(refreshCache){ + if(rules == null || refreshCache){ + rules = {}; + var ds = doc.styleSheets; + for(var i =0, len = ds.length; i < len; i++){ + try{ + this.cacheStyleSheet(ds[i]); + }catch(e){} + } + } + return rules; + }, + + + 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; + }, + + + + updateRule : function(selector, property, value){ + if(!(selector instanceof Array)){ + var rule = this.getRule(selector); + if(rule){ + rule.style[property.replace(camelRe, camelFn)] = value; + return true; + } + }else{ + for(var i = 0; i < selector.length; i++){ + if(this.updateRule(selector[i], property, value)){ + return true; + } + } + } + return false; + } + }; +}(); + +Ext.util.ClickRepeater = function(el, config) +{ + this.el = Ext.get(el); + this.el.unselectable(); + + Ext.apply(this, config); + + this.addEvents({ + + "mousedown" : true, + + "click" : true, + + "mouseup" : true + }); + + this.el.on("mousedown", this.handleMouseDown, this); + if(this.preventDefault || this.stopDefault){ + this.el.on("click", function(e){ + if(this.preventDefault){ + e.preventDefault(); + } + if(this.stopDefault){ + e.stopEvent(); + } + }, this); + } + + if(this.handler){ + this.on("click", this.handler, this.scope || this); + } + + Ext.util.ClickRepeater.superclass.constructor.call(this); +}; + +Ext.extend(Ext.util.ClickRepeater, Ext.util.Observable, { + interval : 20, + delay: 250, + preventDefault : true, + stopDefault : false, + timer : 0, + docEl : Ext.get(document), + + handleMouseDown : function(){ + clearTimeout(this.timer); + this.el.blur(); + if(this.pressClass){ + this.el.addClass(this.pressClass); + } + this.mousedownTime = new Date(); + + this.docEl.on("mouseup", this.handleMouseUp, this); + this.el.on("mouseout", this.handleMouseOut, this); + + this.fireEvent("mousedown", this); + this.fireEvent("click", this); + + this.timer = this.click.defer(this.delay || this.interval, this); + }, + + click : function(){ + this.fireEvent("click", this); + this.timer = this.click.defer(this.getInterval(), this); + }, + + getInterval: function(){ + if(!this.accelerate){ + return this.interval; + } + var pressTime = this.mousedownTime.getElapsed(); + if(pressTime < 500){ + return 400; + }else if(pressTime < 1700){ + return 320; + }else if(pressTime < 2600){ + return 250; + }else if(pressTime < 3500){ + return 180; + }else if(pressTime < 4400){ + return 140; + }else if(pressTime < 5300){ + return 80; + }else if(pressTime < 6200){ + return 50; + }else{ + return 10; + } + }, + + handleMouseOut : function(){ + clearTimeout(this.timer); + if(this.pressClass){ + this.el.removeClass(this.pressClass); + } + this.el.on("mouseover", this.handleMouseReturn, this); + }, + + handleMouseReturn : function(){ + this.el.un("mouseover", this.handleMouseReturn); + if(this.pressClass){ + this.el.addClass(this.pressClass); + } + this.click(); + }, + + handleMouseUp : function(){ + clearTimeout(this.timer); + this.el.un("mouseover", this.handleMouseReturn); + this.el.un("mouseout", this.handleMouseOut); + this.docEl.un("mouseup", this.handleMouseUp); + this.el.removeClass(this.pressClass); + this.fireEvent("mouseup", this); + } +}); + +Ext.KeyNav = function(el, config){ + this.el = Ext.get(el); + Ext.apply(this, config); + if(!this.disabled){ + this.disabled = true; + this.enable(); + } +}; + +Ext.KeyNav.prototype = { + disabled : false, + defaultEventAction: "stopEvent", + + prepareEvent : function(e){ + var k = e.getKey(); + var h = this.keyToHandler[k]; + if(Ext.isSafari && h && k >= 37 && k <= 40){ + e.stopEvent(); + } + }, + + relay : function(e){ + var k = e.getKey(); + var h = this.keyToHandler[k]; + if(h && this[h]){ + if(this.doRelay(e, this[h], h) !== true){ + e[this.defaultEventAction](); + } + } + }, + + doRelay : function(e, h, hname){ + return h.call(this.scope || this, e); + }, + + enter : false, + left : false, + right : false, + up : false, + down : false, + tab : false, + esc : false, + pageUp : false, + pageDown : false, + del : false, + home : false, + end : false, + + keyToHandler : { + 37 : "left", + 39 : "right", + 38 : "up", + 40 : "down", + 33 : "pageUp", + 34 : "pageDown", + 46 : "del", + 36 : "home", + 35 : "end", + 13 : "enter", + 27 : "esc", + 9 : "tab" + }, + + + enable: function(){ + if(this.disabled){ + if(Ext.isIE){ + this.el.on("keydown", this.relay, this); + }else{ + this.el.on("keydown", this.prepareEvent, this); + this.el.on("keypress", this.relay, this); + } + this.disabled = false; + } + }, + + + disable: function(){ + if(!this.disabled){ + if(Ext.isIE){ + this.el.un("keydown", this.relay); + }else{ + this.el.un("keydown", this.prepareEvent); + this.el.un("keypress", this.relay); + } + this.disabled = true; + } + } +}; + +Ext.KeyMap = function(el, config, eventName){ + this.el = Ext.get(el); + this.eventName = eventName || "keydown"; + this.bindings = []; + if(config instanceof Array){ + for(var i = 0, len = config.length; i < len; i++){ + this.addBinding(config[i]); + } + }else{ + this.addBinding(config); + } + this.keyDownDelegate = Ext.EventManager.wrap(this.handleKeyDown, this, true); + this.enable(); +}; + +Ext.KeyMap.prototype = { + + stopEvent : false, + + + addBinding : function(config){ + var keyCode = config.key, + shift = config.shift, + ctrl = config.ctrl, + alt = config.alt, + fn = config.fn, + scope = config.scope; + if(typeof keyCode == "string"){ + var ks = []; + var keyString = keyCode.toUpperCase(); + for(var j = 0, len = keyString.length; j < len; j++){ + ks.push(keyString.charCodeAt(j)); + } + keyCode = ks; + } + var keyArray = keyCode instanceof Array; + var handler = function(e){ + if((!shift || e.shiftKey) && (!ctrl || e.ctrlKey) && (!alt || e.altKey)){ + var k = e.getKey(); + if(keyArray){ + for(var i = 0, len = keyCode.length; i < len; i++){ + if(keyCode[i] == k){ + if(this.stopEvent){ + e.stopEvent(); + } + fn.call(scope || window, k, e); + return; + } + } + }else{ + if(k == keyCode){ + if(this.stopEvent){ + e.stopEvent(); + } + fn.call(scope || window, k, e); + } + } + } + }; + this.bindings.push(handler); + }, + + + handleKeyDown : function(e){ + if(this.enabled){ + var b = this.bindings; + for(var i = 0, len = b.length; i < len; i++){ + b[i].call(this, e); + } + } + }, + + + isEnabled : function(){ + return this.enabled; + }, + + + enable: function(){ + if(!this.enabled){ + this.el.on(this.eventName, this.keyDownDelegate); + this.enabled = true; + } + }, + + + disable: function(){ + if(this.enabled){ + this.el.removeListener(this.eventName, this.keyDownDelegate); + this.enabled = false; + } + } +}; + +Ext.util.TextMetrics = function(){ + var shared; + return { + + measure : function(el, text, fixedWidth){ + if(!shared){ + shared = Ext.util.TextMetrics.Instance(el, fixedWidth); + } + shared.bind(el); + shared.setFixedWidth(fixedWidth || 'auto'); + return shared.getSize(text); + }, + + + createInstance : function(el, fixedWidth){ + return Ext.util.TextMetrics.Instance(el, fixedWidth); + } + }; +}(); + +Ext.util.TextMetrics.Instance = function(bindTo, fixedWidth){ + var ml = new Ext.Element(document.createElement('div')); + document.body.appendChild(ml.dom); + ml.position('absolute'); + ml.setLeftTop(-1000, -1000); + ml.hide(); + + if(fixedWidth){ + mi.setWidth(fixedWidth); + } + + var instance = { + + getSize : function(text){ + ml.update(text); + var s = ml.getSize(); + ml.update(''); + return s; + }, + + + bind : function(el){ + ml.setStyle( + Ext.fly(el).getStyles('font-size','font-style', 'font-weight', 'font-family','line-height') + ); + }, + + + setFixedWidth : function(width){ + ml.setWidth(width); + }, + + + getWidth : function(text){ + ml.dom.style.width = 'auto'; + return this.getSize(text).width; + }, + + + getHeight : function(text){ + return this.getSize(text).height; + } + }; + + instance.bind(bindTo); + + return instance; +}; + +Ext.Element.measureText = Ext.util.TextMetrics.measure; + +Ext.state.Provider = function(){ + Ext.state.Provider.superclass.constructor.call(this); + + this.addEvents({ + "statechange": true + }); + this.state = {}; + Ext.state.Provider.superclass.constructor.call(this); +}; +Ext.extend(Ext.state.Provider, 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); + } +}); + + +Ext.state.Manager = function(){ + var provider = new 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; + } + }; +}(); + + +Ext.state.CookieProvider = function(config){ + 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; + Ext.apply(this, config); + this.state = this.readCookies(); +}; + +Ext.extend(Ext.state.CookieProvider, Ext.state.Provider, { + + set : function(name, value){ + if(typeof value == "undefined" || value === null){ + this.clear(name); + return; + } + this.setCookie(name, value); + Ext.state.CookieProvider.superclass.set.call(this, name, value); + }, + + + clear : function(name){ + this.clearCookie(name); + 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" : ""); + } +}); + + + +(function() { + +var Event=Ext.EventManager; +var Dom=Ext.lib.Dom; + + +Ext.dd.DragDrop = function(id, sGroup, config) { + if (id) { + this.init(id, sGroup, config); + } +}; + +Ext.dd.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 () { + }, + + + defaultPadding : {left:0, right:0, top:0, bottom:0}, + + + constrainTo : function(constrainTo, pad, inContent){ + if(typeof pad == "number"){ + pad = {left: pad, right:pad, top:pad, bottom:pad}; + } + pad = pad || this.defaultPadding; + var b = Ext.get(this.getEl()).getBox(); + var ce = Ext.get(constrainTo); + var s = ce.getScroll(); + var c, cd = ce.dom; + if(cd == document.body){ + c = { x: s.left, y: s.top, width: Ext.lib.Dom.getViewWidth(), height: Ext.lib.Dom.getViewHeight()}; + }else{ + xy = ce.getXY(); + c = {x : xy[0]+s.left, y: xy[1]+s.top, width: cd.clientWidth, height: cd.clientHeight}; + } + + + var topSpace = b.y - c.y; + var leftSpace = b.x - c.x; + + this.resetConstraints(); + this.setXConstraint(leftSpace - (pad.left||0), + c.width - leftSpace - b.width - (pad.right||0) + ); + this.setYConstraint(topSpace - (pad.top||0), + c.height - topSpace - b.height - (pad.bottom||0) + ); + }, + + + getEl: function() { + if (!this._domRef) { + this._domRef = Ext.getDom(this.id); + } + + return this._domRef; + }, + + + getDragEl: function() { + return Ext.getDom(this.dragElId); + }, + + + init: function(id, sGroup, config) { + this.initTarget(id, sGroup, config); + Event.on(this.id, "mousedown", this.handleMouseDown, this); + + }, + + + initTarget: function(id, sGroup, config) { + + + this.config = config || {}; + + + this.DDM = Ext.dd.DDM; + + this.groups = {}; + + + + if (typeof id !== "string") { + id = Ext.id(id); + } + + + this.id = id; + + + this.addToGroup((sGroup) ? sGroup : "default"); + + + + this.handleElId = id; + + + this.setDragElId(id); + + + this.invalidHandleTypes = { A: "A" }; + this.invalidHandleIds = {}; + this.invalidHandleClasses = []; + + this.applyConfig(); + + this.handleOnAvailable(); + }, + + + 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(iTop, iRight, iBot, iLeft) { + + 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]; + } + }, + + + 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); + }, + + + setStartPosition: function(pos) { + var p = pos || Dom.getXY( this.getEl() ); + this.deltaSetXY = null; + + this.startPageX = p[0]; + this.startPageY = p[1]; + }, + + + addToGroup: function(sGroup) { + this.groups[sGroup] = true; + this.DDM.regDragDrop(this, sGroup); + }, + + + removeFromGroup: function(sGroup) { + if (this.groups[sGroup]) { + delete this.groups[sGroup]; + } + + this.DDM.removeDDFromGroup(this, sGroup); + }, + + + setDragElId: function(id) { + this.dragElId = id; + }, + + + setHandleElId: function(id) { + if (typeof id !== "string") { + id = Ext.id(id); + } + this.handleElId = id; + this.DDM.regHandle(this.id, id); + }, + + + setOuterHandleElId: function(id) { + if (typeof id !== "string") { + id = Ext.id(id); + } + Event.on(id, "mousedown", + this.handleMouseDown, this); + this.setHandleElId(id); + + this.hasOuterHandles = true; + }, + + + unreg: function() { + Event.un(this.id, "mousedown", + this.handleMouseDown); + this._domRef = null; + this.DDM._remove(this); + }, + + + isLocked: function() { + return (this.DDM.isLocked() || this.locked); + }, + + + handleMouseDown: function(e, oDD){ + if (this.primaryButtonOnly && e.button != 0) { + return; + } + + if (this.isLocked()) { + return; + } + + this.DDM.refreshCache(this.groups); + + var pt = new Ext.lib.Point(Ext.lib.Event.getPageX(e), Ext.lib.Event.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 target = Ext.lib.Event.getTarget(e); + return ( this.isValidHandleChild(target) && + (this.id == this.handleElId || + this.DDM.handleWasClicked(target, this.id)) ); + }, + + + addInvalidHandleType: function(tagName) { + var type = tagName.toUpperCase(); + this.invalidHandleTypes[type] = type; + }, + + + addInvalidHandleId: function(id) { + if (typeof id !== "string") { + id = Ext.id(id); + } + this.invalidHandleIds[id] = id; + }, + + + addInvalidHandleClass: function(cssClass) { + this.invalidHandleClasses.push(cssClass); + }, + + + removeInvalidHandleType: function(tagName) { + var type = tagName.toUpperCase(); + + delete this.invalidHandleTypes[type]; + }, + + + removeInvalidHandleId: function(id) { + if (typeof id !== "string") { + id = Ext.id(id); + } + delete this.invalidHandleIds[id]; + }, + + + 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) ; + }, + + + 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) ; + }, + + + 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; + }, + + + 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, 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: 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, tickArray) { + + if (!tickArray) { + + + return val; + } else if (tickArray[0] >= val) { + + + 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]; + } + } + + + + return tickArray[tickArray.length - 1]; + } + }, + + + toString: function() { + return ("DragDrop " + this.id); + } + +}; + +})(); + + + + +if (!Ext.dd.DragDropMgr) { + + +Ext.dd.DragDropMgr = function() { + + var Event = Ext.EventManager; + + 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(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); + } + } + }, + + + _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); + + + }, + + + _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: 350, + + + dragThreshMet: false, + + + clickTimeout: null, + + + startX: 0, + + + startY: 0, + + + regDragDrop: function(oDD, sGroup) { + if (!this.initialized) { this.init(); } + + if (!this.ids[sGroup]) { + this.ids[sGroup] = {}; + } + this.ids[sGroup][oDD.id] = oDD; + }, + + + 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]; + } + }, + + + _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(sDDId, sHandleId) { + if (!this.handleIds[sDDId]) { + this.handleIds[sDDId] = {}; + } + this.handleIds[sDDId][sHandleId] = sHandleId; + }, + + + isDragDrop: function(id) { + return ( this.getDDById(id) ) ? true : false; + }, + + + 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; + }, + + + 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); + if(!this.dragCurrent.moveOnly){ + this.fireEvents(e, false); + } + } + + this.stopEvent(e); + + return true; + }, + + + fireEvents: function(e, isDrop) { + var dc = this.dragCurrent; + + + + if (!dc || dc.isLocked()) { + return; + } + + var x = Ext.lib.Event.getPageX(e); + var y = Ext.lib.Event.getPageY(e); + var pt = new Ext.lib.Point(x,y); + + + var oldOvers = []; + + var outEvts = []; + var overEvts = []; + var dropEvts = []; + var enterEvts = []; + + + + 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)) { + + if (isDrop) { + dropEvts.push( oDD ); + + } else { + + + if (!oldOvers[oDD.id]) { + enterEvts.push( oDD ); + + } 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 { + + var len = 0; + for (i=0, len=outEvts.length; i 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; + } + + }; + +}(); + + +Ext.dd.DDM = Ext.dd.DragDropMgr; +Ext.dd.DDM._addListeners(); + +} + + +Ext.dd.DD = function(id, sGroup, config) { + if (id) { + this.init(id, sGroup, config); + } +}; + +Ext.extend(Ext.dd.DD, Ext.dd.DragDrop, { + + + scroll: true, + + + autoOffset: function(iPageX, iPageY) { + var x = iPageX - this.startPageX; + var y = iPageY - this.startPageY; + this.setDelta(x, y); + }, + + + setDelta: function(iDeltaX, iDeltaY) { + this.deltaX = iDeltaX; + this.deltaY = iDeltaY; + }, + + + setDragElPos: function(iPageX, iPageY) { + + + + var el = this.getDragEl(); + this.alignElWithMouse(el, iPageX, iPageY); + }, + + + alignElWithMouse: function(el, iPageX, iPageY) { + var oCoord = this.getTargetCoord(iPageX, iPageY); + var fly = el.dom ? el : Ext.fly(el); + if (!this.deltaSetXY) { + var aCoord = [oCoord.x, oCoord.y]; + fly.setXY(aCoord); + var newLeft = fly.getLeft(true); + var newTop = fly.getTop(true); + this.deltaSetXY = [ newLeft - oCoord.x, newTop - oCoord.y ]; + } else { + fly.setLeftTop(oCoord.x + this.deltaSetXY[0], oCoord.y + this.deltaSetXY[1]); + } + + this.cachePosition(oCoord.x, oCoord.y); + this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth); + return oCoord; + }, + + + cachePosition: function(iPageX, iPageY) { + if (iPageX) { + this.lastPageX = iPageX; + this.lastPageY = iPageY; + } else { + var aCoord = Ext.lib.Dom.getXY(this.getEl()); + this.lastPageX = aCoord[0]; + this.lastPageY = aCoord[1]; + } + }, + + + autoScroll: function(x, y, h, w) { + + if (this.scroll) { + + var clientH = Ext.lib.Dom.getViewWidth(); + + + var clientW = Ext.lib.Dom.getViewHeight(); + + + var st = this.DDM.getScrollTop(); + + + var sl = this.DDM.getScrollLeft(); + + + var bot = h + y; + + + var right = w + x; + + + + + var toBot = (clientH + st - y - this.deltaY); + + + var toRight = (clientW + sl - x - this.deltaX); + + + + + var thresh = 40; + + + + + var scrAmt = (document.all) ? 80 : 30; + + + + if ( bot > clientH && toBot < thresh ) { + window.scrollTo(sl, st + scrAmt); + } + + + + if ( y < st && st > 0 && y - st < thresh ) { + window.scrollTo(sl, st - scrAmt); + } + + + + if ( right > clientW && toRight < thresh ) { + window.scrollTo(sl + scrAmt, st); + } + + + + if ( x < sl && sl > 0 && x - sl < thresh ) { + window.scrollTo(sl - scrAmt, st); + } + } + }, + + + 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}; + }, + + + applyConfig: function() { + Ext.dd.DD.superclass.applyConfig.call(this); + this.scroll = (this.config.scroll !== false); + }, + + + b4MouseDown: function(e) { + + this.autoOffset(Ext.lib.Event.getPageX(e), + Ext.lib.Event.getPageY(e)); + }, + + + b4Drag: function(e) { + this.setDragElPos(Ext.lib.Event.getPageX(e), + Ext.lib.Event.getPageY(e)); + }, + + toString: function() { + return ("DD " + this.id); + } + + + + + + +}); + +Ext.dd.DDProxy = function(id, sGroup, config) { + if (id) { + this.init(id, sGroup, config); + this.initFrame(); + } +}; + + +Ext.dd.DDProxy.dragElId = "ygddfdiv"; + +Ext.extend(Ext.dd.DDProxy, Ext.dd.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() { + Ext.dd.DDProxy.superclass.applyConfig.call(this); + + this.resizeFrame = (this.config.resizeFrame !== false); + this.centerFrame = (this.config.centerFrame); + this.setDragElId(this.config.dragElId || Ext.dd.DDProxy.dragElId); + }, + + + 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); + + Ext.fly(dragEl).show(); + }, + + + _resizeProxy: function() { + if (this.resizeFrame) { + var el = this.getEl(); + Ext.fly(this.getDragEl()).setSize(el.offsetWidth, el.offsetHeight); + } + }, + + + b4MouseDown: function(e) { + var x = Ext.lib.Event.getPageX(e); + var y = Ext.lib.Event.getPageY(e); + this.autoOffset(x, y); + this.setDragElPos(x, y); + }, + + + b4StartDrag: function(x, y) { + + this.showFrame(x, y); + }, + + + b4EndDrag: function(e) { + Ext.fly(this.getDragEl()).hide(); + }, + + + + + endDrag: function(e) { + + var lel = this.getEl(); + var del = this.getDragEl(); + + + del.style.visibility = ""; + + this.beforeMove(); + + + lel.style.visibility = "hidden"; + Ext.dd.DDM.moveToEl(lel, del); + del.style.visibility = "hidden"; + lel.style.visibility = ""; + + this.afterDrag(); + }, + + beforeMove : function(){ + + }, + + afterDrag : function(){ + + }, + + toString: function() { + return ("DDProxy " + this.id); + } + +}); + +Ext.dd.DDTarget = function(id, sGroup, config) { + if (id) { + this.initTarget(id, sGroup, config); + } +}; + + +Ext.extend(Ext.dd.DDTarget, Ext.dd.DragDrop, { + toString: function() { + return ("DDTarget " + this.id); + } +}); + + +Ext.dd.ScrollManager = function(){ + var ddm = Ext.dd.DragDropMgr; + var els = {}; + var dragEl = null; + var proc = {}; + + var onStop = function(e){ + dragEl = null; + clearProc(); + }; + + var triggerRefresh = function(){ + if(ddm.dragCurrent){ + ddm.refreshCache(ddm.dragCurrent.groups); + } + }; + + var doScroll = function(){ + if(ddm.dragCurrent){ + var dds = Ext.dd.ScrollManager; + if(!dds.animate){ + if(proc.el.scroll(proc.dir, dds.increment)){ + triggerRefresh(); + } + }else{ + proc.el.scroll(proc.dir, dds.increment, true, dds.animDuration, triggerRefresh); + } + } + }; + + var clearProc = function(){ + if(proc.id){ + clearInterval(proc.id); + } + proc.id = 0; + proc.el = null; + proc.dir = ""; + }; + + var startProc = function(el, dir){ + clearProc(); + proc.el = el; + proc.dir = dir; + proc.id = setInterval(doScroll, Ext.dd.ScrollManager.frequency); + }; + + var onFire = function(e, isDrop){ + if(isDrop || !ddm.dragCurrent){ return; } + var dds = Ext.dd.ScrollManager; + if(!dragEl || dragEl != ddm.dragCurrent){ + dragEl = ddm.dragCurrent; + + dds.refreshCache(); + } + + var xy = Ext.lib.Event.getXY(e); + var pt = new Ext.lib.Point(xy[0], xy[1]); + for(var id in els){ + var el = els[id], r = el._region; + if(r.contains(pt) && el.isScrollable()){ + if(r.bottom - pt.y <= dds.thresh){ + if(proc.el != el){ + startProc(el, "down"); + } + return; + }else if(r.right - pt.x <= dds.thresh){ + if(proc.el != el){ + startProc(el, "left"); + } + return; + }else if(pt.y - r.top <= dds.thresh){ + if(proc.el != el){ + startProc(el, "up"); + } + return; + }else if(pt.x - r.left <= dds.thresh){ + if(proc.el != el){ + startProc(el, "right"); + } + return; + } + } + } + clearProc(); + }; + + ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm); + ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm); + + return { + + register : function(el){ + if(el instanceof Array){ + for(var i = 0, len = el.length; i < len; i++) { + this.register(el[i]); + } + }else{ + el = Ext.get(el); + els[el.id] = el; + } + }, + + + unregister : function(el){ + if(el instanceof Array){ + for(var i = 0, len = el.length; i < len; i++) { + this.unregister(el[i]); + } + }else{ + el = Ext.get(el); + delete els[el.id]; + } + }, + + + thresh : 25, + + + increment : 100, + + + frequency : 500, + + + animate: true, + + + animDuration: .4, + + + refreshCache : function(){ + for(var id in els){ + if(typeof els[id] == 'object'){ + els[id]._region = els[id].getRegion(); + } + } + } + }; +}(); + +Ext.dd.Registry = function(){ + var elements = {}; + var handles = {}; + var autoIdSeed = 0; + + var getId = function(el, autogen){ + if(typeof el == "string"){ + return el; + } + var id = el.id; + if(!id && autogen !== false){ + id = "extdd-" + (++autoIdSeed); + el.id = id; + } + return id; + }; + + return { + + register : function(el, data){ + data = data || {}; + if(typeof el == "string"){ + el = document.getElementById(el); + } + data.ddel = el; + elements[getId(el)] = data; + if(data.isHandle !== false){ + handles[data.ddel.id] = data; + } + if(data.handles){ + var hs = data.handles; + for(var i = 0, len = hs.length; i < len; i++){ + handles[getId(hs[i])] = data; + } + } + }, + + + unregister : function(el){ + var id = getId(el, false); + var data = elements[id]; + if(data){ + delete elements[id]; + if(data.handles){ + var hs = data.handles; + for(var i = 0, len = hs.length; i < len; i++){ + delete handles[getId(hs[i], false)]; + } + } + } + }, + + + getHandle : function(id){ + if(typeof id != "string"){ + id = id.id; + } + return handles[id]; + }, + + + getHandleFromEvent : function(e){ + var t = Ext.lib.Event.getTarget(e); + return t ? handles[t.id] : null; + }, + + + getTarget : function(id){ + if(typeof id != "string"){ + id = id.id; + } + return elements[id]; + }, + + + getTargetFromEvent : function(e){ + var t = Ext.lib.Event.getTarget(e); + return t ? elements[t.id] || handles[t.id] : null; + } + }; +}(); + +Ext.dd.StatusProxy = function(config){ + Ext.apply(this, config); + this.id = this.id || Ext.id(); + this.el = new Ext.Layer({ + dh: { + id: this.id, tag: "div", cls: "x-dd-drag-proxy "+this.dropNotAllowed, children: [ + {tag: "div", cls: "x-dd-drop-icon"}, + {tag: "div", cls: "x-dd-drag-ghost"} + ] + }, + shadow: !config || config.shadow !== false + }); + this.ghost = Ext.get(this.el.dom.childNodes[1]); + this.dropStatus = this.dropNotAllowed; +}; + +Ext.dd.StatusProxy.prototype = { + + dropAllowed : "x-dd-drop-ok", + + dropNotAllowed : "x-dd-drop-nodrop", + + + setStatus : function(cssClass){ + cssClass = cssClass || this.dropNotAllowed; + if(this.dropStatus != cssClass){ + this.el.replaceClass(this.dropStatus, cssClass); + this.dropStatus = cssClass; + } + }, + + + reset : function(clearGhost){ + this.el.dom.className = "x-dd-drag-proxy " + this.dropNotAllowed; + this.dropStatus = this.dropNotAllowed; + if(clearGhost){ + this.ghost.update(""); + } + }, + + + update : function(html){ + if(typeof html == "string"){ + this.ghost.update(html); + }else{ + this.ghost.update(""); + html.style.margin = "0"; + this.ghost.dom.appendChild(html); + } + }, + + + getEl : function(){ + return this.el; + }, + + + getGhost : function(){ + return this.ghost; + }, + + + hide : function(clear){ + this.el.hide(); + if(clear){ + this.reset(true); + } + }, + + + stop : function(){ + if(this.anim && this.anim.isAnimated && this.anim.isAnimated()){ + this.anim.stop(); + } + }, + + + show : function(){ + this.el.show(); + }, + + + sync : function(){ + this.el.sync(); + }, + + + repair : function(xy, callback, scope){ + this.callback = callback; + this.scope = scope; + if(xy && this.animRepair !== false){ + this.el.addClass("x-dd-drag-repair"); + this.el.hideUnders(true); + this.anim = this.el.shift({ + duration: this.repairDuration || .5, + easing: 'easeOut', + xy: xy, + stopFx: true, + callback: this.afterRepair, + scope: this + }); + }else{ + this.afterRepair(); + } + }, + + + afterRepair : function(){ + this.hide(true); + if(typeof this.callback == "function"){ + this.callback.call(this.scope || this); + } + this.callback == null; + this.scope == null; + } +}; + +Ext.dd.DragSource = function(el, config){ + this.el = Ext.get(el); + this.dragData = {}; + + Ext.apply(this, config); + + if(!this.proxy){ + this.proxy = new Ext.dd.StatusProxy(); + } + this.el.on("mouseup", this.handleMouseUp); + Ext.dd.DragSource.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, + {dragElId : this.proxy.id, resizeFrame: false, isTarget: false, scroll: this.scroll === true}); + + this.dragging = false; +}; + +Ext.extend(Ext.dd.DragSource, Ext.dd.DDProxy, { + + dropAllowed : "x-dd-drop-ok", + + dropNotAllowed : "x-dd-drop-nodrop", + + + getDragData : function(e){ + return this.dragData; + }, + + + onDragEnter : function(e, id){ + var target = Ext.dd.DragDropMgr.getDDById(id); + this.cachedTarget = target; + if(this.beforeDragEnter(target, e, id) !== false){ + if(target.isNotifyTarget){ + var status = target.notifyEnter(this, e, this.dragData); + this.proxy.setStatus(status); + }else{ + this.proxy.setStatus(this.dropAllowed); + } + + if(this.afterDragEnter){ + + this.afterDragEnter(target, e, id); + } + } + }, + + + beforeDragEnter : function(target, e, id){ + return true; + }, + + + alignElWithMouse: function() { + Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments); + this.proxy.sync(); + }, + + + onDragOver : function(e, id){ + var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id); + if(this.beforeDragOver(target, e, id) !== false){ + if(target.isNotifyTarget){ + var status = target.notifyOver(this, e, this.dragData); + this.proxy.setStatus(status); + } + + if(this.afterDragOver){ + + this.afterDragOver(target, e, id); + } + } + }, + + + beforeDragOver : function(target, e, id){ + return true; + }, + + + onDragOut : function(e, id){ + var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id); + if(this.beforeDragOut(target, e, id) !== false){ + if(target.isNotifyTarget){ + target.notifyOut(this, e, this.dragData); + } + this.proxy.reset(); + if(this.afterDragOut){ + + this.afterDragOut(target, e, id); + } + } + this.cachedTarget = null; + }, + + + beforeDragOut : function(target, e, id){ + return true; + }, + + + onDragDrop : function(e, id){ + var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id); + if(this.beforeDragDrop(target, e, id) !== false){ + if(target.isNotifyTarget){ + if(target.notifyDrop(this, e, this.dragData)){ + this.onValidDrop(target, e, id); + }else{ + this.onInvalidDrop(target, e, id); + } + }else{ + this.onValidDrop(target, e, id); + } + + if(this.afterDragDrop){ + + this.afterDragDrop(target, e, id); + } + } + }, + + + beforeDragDrop : function(target, e, id){ + return true; + }, + + + onValidDrop : function(target, e, id){ + this.hideProxy(); + }, + + + getRepairXY : function(e, data){ + return this.el.getXY(); + }, + + + onInvalidDrop : function(target, e, id){ + this.beforeInvalidDrop(target, e, id); + if(this.cachedTarget){ + if(this.cachedTarget.isNotifyTarget){ + this.cachedTarget.notifyOut(this, e, this.dragData); + } + this.cacheTarget = null; + } + this.proxy.repair(this.getRepairXY(e, this.dragData), this.afterRepair, this); + + if(this.afterInvalidDrop){ + + this.afterInvalidDrop(e, id); + } + }, + + + afterRepair : function(){ + if(Ext.enableFx){ + this.el.highlight(this.hlColor || "c3daf9"); + } + this.dragging = false; + }, + + + beforeInvalidDrop : function(target, e, id){ + return true; + }, + + + handleMouseDown : function(e){ + if(this.dragging) { + return; + } + if(Ext.QuickTips){ + Ext.QuickTips.disable(); + } + var data = this.getDragData(e); + if(data && this.onBeforeDrag(data, e) !== false){ + this.dragData = data; + this.proxy.stop(); + Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments); + } + }, + + + handleMouseUp : function(e){ + if(Ext.QuickTips){ + Ext.QuickTips.enable(); + } + }, + + + onBeforeDrag : function(data, e){ + return true; + }, + + + onStartDrag : Ext.emptyFn, + + + startDrag : function(x, y){ + this.proxy.reset(); + this.dragging = true; + this.proxy.update(""); + this.onInitDrag(x, y); + this.proxy.show(); + }, + + + onInitDrag : function(x, y){ + var clone = this.el.dom.cloneNode(true); + clone.id = Ext.id(); + this.proxy.update(clone); + this.onStartDrag(x, y); + return true; + }, + + + getProxy : function(){ + return this.proxy; + }, + + + hideProxy : function(){ + this.proxy.hide(); + this.proxy.reset(true); + this.dragging = false; + }, + + + triggerCacheRefresh : function(){ + Ext.dd.DDM.refreshCache(this.groups); + }, + + + b4EndDrag: function(e) { + }, + + + endDrag : function(e){ + this.onEndDrag(this.dragData, e); + }, + + + onEndDrag : function(data, e){ + }, + + + autoOffset : function(x, y) { + this.setDelta(-12, -20); + } +}); + +Ext.dd.DropTarget = function(el, config){ + this.el = Ext.get(el); + + Ext.apply(this, config); + + if(this.containerScroll){ + Ext.dd.ScrollManager.register(this.el); + } + + Ext.dd.DropTarget.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, + {isTarget: true}); + +}; + +Ext.extend(Ext.dd.DropTarget, Ext.dd.DDTarget, { + + + dropAllowed : "x-dd-drop-ok", + + dropNotAllowed : "x-dd-drop-nodrop", + + + isTarget : true, + + + isNotifyTarget : true, + + + notifyEnter : function(dd, e, data){ + if(this.overClass){ + this.el.addClass(this.overClass); + } + return this.dropAllowed; + }, + + + notifyOver : function(dd, e, data){ + return this.dropAllowed; + }, + + + notifyOut : function(dd, e, data){ + if(this.overClass){ + this.el.removeClass(this.overClass); + } + }, + + + notifyDrop : function(dd, e, data){ + return false; + } +}); + +Ext.dd.DragZone = function(el, config){ + Ext.dd.DragZone.superclass.constructor.call(this, el, config); + if(this.containerScroll){ + Ext.dd.ScrollManager.register(this.el); + } +}; + +Ext.extend(Ext.dd.DragZone, Ext.dd.DragSource, { + + + + + getDragData : function(e){ + return Ext.dd.Registry.getHandleFromEvent(e); + }, + + + onInitDrag : function(x, y){ + this.proxy.update(this.dragData.ddel.cloneNode(true)); + this.onStartDrag(x, y); + return true; + }, + + + afterRepair : function(){ + if(Ext.enableFx){ + Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9"); + } + this.dragging = false; + }, + + + getRepairXY : function(e){ + return Ext.Element.fly(this.dragData.ddel).getXY(); + } +}); + +Ext.dd.DropZone = function(el, config){ + Ext.dd.DropZone.superclass.constructor.call(this, el, config); +}; + +Ext.extend(Ext.dd.DropZone, Ext.dd.DropTarget, { + + getTargetFromEvent : function(e){ + return Ext.dd.Registry.getTargetFromEvent(e); + }, + + + onNodeEnter : function(n, dd, e, data){ + + }, + + + onNodeOver : function(n, dd, e, data){ + return this.dropAllowed; + }, + + + onNodeOut : function(n, dd, e, data){ + + }, + + + onNodeDrop : function(n, dd, e, data){ + return false; + }, + + + onContainerOver : function(dd, e, data){ + return this.dropNotAllowed; + }, + + + onContainerDrop : function(dd, e, data){ + return false; + }, + + + notifyEnter : function(dd, e, data){ + return this.dropNotAllowed; + }, + + + notifyOver : function(dd, e, data){ + var n = this.getTargetFromEvent(e); + if(!n){ + if(this.lastOverNode){ + this.onNodeOut(this.lastOverNode, dd, e, data); + this.lastOverNode = null; + } + return this.onContainerOver(dd, e, data); + } + if(this.lastOverNode != n){ + if(this.lastOverNode){ + this.onNodeOut(this.lastOverNode, dd, e, data); + } + this.onNodeEnter(n, dd, e, data); + this.lastOverNode = n; + } + return this.onNodeOver(n, dd, e, data); + }, + + + notifyOut : function(dd, e, data){ + if(this.lastOverNode){ + this.onNodeOut(this.lastOverNode, dd, e, data); + this.lastOverNode = null; + } + }, + + + notifyDrop : function(dd, e, data){ + if(this.lastOverNode){ + this.onNodeOut(this.lastOverNode, dd, e, data); + this.lastOverNode = null; + } + var n = this.getTargetFromEvent(e); + return n ? + this.onNodeDrop(n, dd, e, data) : + this.onContainerDrop(dd, e, data); + }, + + + triggerCacheRefresh : function(){ + Ext.dd.DDM.refreshCache(this.groups); + } +}); + + +Ext.data.SortTypes = { + + none : function(s){ + return s; + }, + + + stripTagsRE : /<\/?[^>]+>/gi, + + + asText : function(s){ + return String(s).replace(this.stripTagsRE, ""); + }, + + + asUCText : function(s){ + return String(s).toUpperCase().replace(this.stripTagsRE, ""); + }, + + + asUCString : function(s) { + return String(s).toUpperCase(); + }, + + + asDate : function(s) { + if(!s){ + return 0; + } + 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; + } +}; + +Ext.data.Record = function(data, id){ + this.id = (id || id === 0) ? id : ++Ext.data.Record.AUTO_ID; + this.data = data; +}; + + +Ext.data.Record.create = function(o){ + var f = function(){ + f.superclass.constructor.apply(this, arguments); + }; + Ext.extend(f, Ext.data.Record); + var p = f.prototype; + p.fields = new Ext.util.MixedCollection(false, function(field){ + return field.name; + }); + for(var i = 0, len = o.length; i < len; i++){ + p.fields.add(new Ext.data.Field(o[i])); + } + f.getField = function(name){ + return p.fields.get(name); + }; + return f; +}; + +Ext.data.Record.AUTO_ID = 1000; +Ext.data.Record.EDIT = 'edit'; +Ext.data.Record.REJECT = 'reject'; +Ext.data.Record.COMMIT = 'commit'; + +Ext.data.Record.prototype = { + + dirty : false, + editing : false, + error: null, + modified: null, + + + join : function(store){ + this.store = store; + }, + + + set : function(name, value){ + if(this.data[name] == value){ + return; + } + this.dirty = true; + if(!this.modified){ + this.modified = {}; + } + if(typeof this.modified[name] == 'undefined'){ + this.modified[name] = this.data[name]; + } + this.data[name] = value; + if(!this.editing){ + this.store.afterEdit(this); + } + }, + + + get : function(name){ + return this.data[name]; + }, + + + beginEdit : function(){ + this.editing = true; + this.modified = {}; + }, + + + cancelEdit : function(){ + this.editing = false; + delete this.modified; + }, + + + endEdit : function(){ + this.editing = false; + if(this.dirty && this.store){ + this.store.afterEdit(this); + } + }, + + + reject : function(){ + var m = this.modified; + for(var n in m){ + if(typeof m[n] != "function"){ + this.data[n] = m[n]; + } + } + this.dirty = false; + delete this.modified; + this.editing = false; + if(this.store){ + this.store.afterReject(this); + } + }, + + + commit : function(){ + this.dirty = false; + delete this.modified; + this.editing = false; + if(this.store){ + this.store.afterCommit(this); + } + }, + + + hasError : function(){ + return this.error != null; + }, + + + clearError : function(){ + this.error = null; + } +}; + +Ext.data.Store = function(config){ + this.data = new Ext.util.MixedCollection(false); + this.data.getKey = function(o){ + return o.id; + }; + this.baseParams = {}; + this.paramNames = { + "start" : "start", + "limit" : "limit", + "sort" : "sort", + "dir" : "dir" + }; + Ext.apply(this, config); + + if(this.reader && !this.recordType){ + this.recordType = this.reader.recordType; + } + + this.fields = this.recordType.prototype.fields; + + this.modified = []; + + this.addEvents({ + + datachanged : true, + + add : true, + + remove : true, + + update : true, + + clear : true, + + beforeload : true, + + load : true, + + loadexception : true + }); + + if(this.proxy){ + this.relayEvents(this.proxy, ["loadexception"]); + } + this.sortToggle = {}; + + Ext.data.Store.superclass.constructor.call(this); +}; +Ext.extend(Ext.data.Store, Ext.util.Observable, { + + + + + + remoteSort : false, + + + lastOptions : null, + + + add : function(records){ + records = [].concat(records); + for(var i = 0, len = records.length; i < len; i++){ + records[i].join(this); + } + var index = this.data.length; + this.data.addAll(records); + this.fireEvent("add", this, records, index); + }, + + + remove : function(record){ + var index = this.data.indexOf(record); + this.data.removeAt(index); + this.fireEvent("remove", this, record, index); + }, + + + removeAll : function(){ + this.data.clear(); + this.fireEvent("clear", this); + }, + + + insert : function(index, records){ + records = [].concat(records); + for(var i = 0, len = records.length; i < len; i++){ + this.data.insert(index, records[i]); + records[i].join(this); + } + this.fireEvent("add", this, records, index); + }, + + + indexOf : function(record){ + return this.data.indexOf(record); + }, + + + indexOfId : function(id){ + return this.data.indexOfKey(id); + }, + + + getById : function(id){ + return this.data.key(id); + }, + + + getAt : function(index){ + return this.data.itemAt(index); + }, + + + getRange : function(start, end){ + return this.data.getRange(start, end); + }, + + + storeOptions : function(o){ + o = Ext.apply({}, o); + delete o.callback; + delete o.scope; + this.lastOptions = o; + }, + + + load : function(options){ + options = options || {}; + if(this.fireEvent("beforeload", this, options) !== false){ + this.storeOptions(options); + var p = Ext.apply(options.params || {}, this.baseParams); + if(this.sortInfo && this.remoteSort){ + var pn = this.paramNames; + p[pn["sort"]] = this.sortInfo.field; + p[pn["dir"]] = this.sortInfo.direction; + } + this.proxy.load(p, this.reader, this.loadRecords, this, options); + } + }, + + + reload : function(options){ + this.load(Ext.applyIf(options||{}, this.lastOptions)); + }, + + + + loadRecords : function(o, options, success){ + if(!o || success === false){ + if(success !== false){ + this.fireEvent("load", this, [], options); + } + if(options.callback){ + options.callback.call(options.scope || this, [], options, false); + } + return; + } + var r = o.records, t = o.totalRecords || r.length; + for(var i = 0, len = r.length; i < len; i++){ + r[i].join(this); + } + if(!options || options.add !== true){ + this.data.clear(); + this.data.addAll(r); + this.totalLength = t; + this.applySort(); + this.fireEvent("datachanged", this); + }else{ + this.totalLength = Math.max(t, this.data.length+r.length); + this.data.addAll(r); + } + this.fireEvent("load", this, r, options); + if(options.callback){ + options.callback.call(options.scope || this, r, options, true); + } + }, + + + loadData : function(o, append){ + var r = this.reader.readRecords(o); + this.loadRecords(r, {add: append}, true); + }, + + + getCount : function(){ + return this.data.length || 0; + }, + + + getTotalCount : function(){ + return this.totalLength || 0; + }, + + + getSortState : function(){ + return this.sortInfo; + }, + + + applySort : function(){ + if(this.sortInfo && !this.remoteSort){ + var s = this.sortInfo, f = s.field; + var st = this.fields.get(f).sortType; + var fn = function(r1, r2){ + var v1 = st(r1.data[f]), v2 = st(r2.data[f]); + return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0); + }; + this.data.sort(s.direction, fn); + if(this.snapshot && this.snapshot != this.data){ + this.snapshot.sort(s.direction, fn); + } + } + }, + + + setDefaultSort : function(field, dir){ + this.sortInfo = {field: field, direction: dir ? dir.toUpperCase() : "ASC"}; + }, + + + sort : function(fieldName, dir){ + var f = this.fields.get(fieldName); + if(!dir){ + if(this.sortInfo && this.sortInfo.field == f.name){ + dir = (this.sortToggle[f.name] || "ASC").toggle("ASC", "DESC"); + }else{ + dir = f.sortDir; + } + } + this.sortToggle[f.name] = dir; + this.sortInfo = {field: f.name, direction: dir}; + if(!this.remoteSort){ + this.applySort(); + this.fireEvent("datachanged", this); + }else{ + this.load(this.lastOptions); + } + }, + + + each : function(fn, scope){ + this.data.each(fn, scope); + }, + + + getModifiedRecords : function(){ + return this.modified; + }, + + + filter : function(property, value){ + if(!value.exec){ + value = String(value); + if(value.length == 0){ + return this.clearFilter(); + } + value = new RegExp("^" + Ext.escapeRe(value), "i"); + } + this.filterBy(function(r){ + return value.test(r.data[property]); + }); + }, + + + filterBy : function(fn, scope){ + var data = this.snapshot || this.data; + this.snapshot = data; + this.data = data.filterBy(fn, scope); + this.fireEvent("datachanged", this); + }, + + + clearFilter : function(suppressEvent){ + if(this.snapshot && this.snapshot != this.data){ + this.data = this.snapshot; + delete this.snapshot; + if(suppressEvent !== true){ + this.fireEvent("datachanged", this); + } + } + }, + + + afterEdit : function(record){ + if(this.modified.indexOf(record) == -1){ + this.modified.push(record); + } + this.fireEvent("update", this, record, Ext.data.Record.EDIT); + }, + + + afterReject : function(record){ + this.modified.remove(record); + this.fireEvent("update", this, record, Ext.data.Record.REJECT); + }, + + + afterCommit : function(record){ + this.modified.remove(record); + this.fireEvent("update", this, record, Ext.data.Record.COMMIT); + }, + + + commitChanges : function(){ + var m = this.modified.slice(0); + this.modified = []; + for(var i = 0, len = m.length; i < len; i++){ + m[i].commit(); + } + }, + + + rejectChanges : function(){ + var m = this.modified.slice(0); + this.modified = []; + for(var i = 0, len = m.length; i < len; i++){ + m[i].reject(); + } + } +}); + +Ext.data.SimpleStore = function(config){ + Ext.data.SimpleStore.superclass.constructor.call(this, { + reader: new Ext.data.ArrayReader({ + id: config.id + }, + Ext.data.Record.create(config.fields) + ), + proxy : new Ext.data.MemoryProxy(config.data) + }); + this.load(); +}; +Ext.extend(Ext.data.SimpleStore, Ext.data.Store); + +Ext.data.Connection = function(config){ + Ext.apply(this, config); + this.addEvents({ + "beforerequest" : true, + "requestcomplete" : true, + "requestexception" : true + }); + Ext.data.Connection.superclass.constructor.call(this); +}; + +Ext.extend(Ext.data.Connection, Ext.util.Observable, { + + + + + timeout : 30000, + + + request : function(options){ + if(this.fireEvent("beforerequest", this, options) !== false){ + var p = options.params; + if(typeof p == "object"){ + p = Ext.urlEncode(Ext.apply(options.params, this.extraParams)); + } + var cb = { + success: this.handleResponse, + failure: this.handleFailure, + scope: this, + argument: {options: options}, + timeout : this.timeout + }; + var method = options.method||this.method||(p ? "POST" : "GET"); + var url = options.url || this.url; + if(this.autoAbort !== false){ + this.abort(); + } + if(method == 'GET' && p){ + url += (url.indexOf('?') != -1 ? '&' : '?') + p; + p = ''; + } + this.transId = Ext.lib.Ajax.request(method, url, cb, p); + }else{ + if(typeof options.callback == "function"){ + options.callback.call(options.scope||window, options, null, null); + } + } + }, + + + isLoading : function(){ + return this.transId ? true : false; + }, + + + abort : function(){ + if(this.isLoading()){ + Ext.lib.Ajax.abort(this.transId); + } + }, + + + handleResponse : function(response){ + this.transId = false; + var options = response.argument.options; + this.fireEvent("requestcomplete", this, response, options); + if(typeof options.callback == "function"){ + options.callback.call(options.scope||window, options, true, response); + } + }, + + + handleFailure : function(response, e){ + this.transId = false; + var options = response.argument.options; + this.fireEvent("requestexception", this, response, options, e); + if(typeof options.callback == "function"){ + options.callback.call(options.scope||window, options, false, response); + } + } +}); +Ext.data.Field = function(config){ + if(typeof config == "string"){ + config = {name: config}; + } + Ext.apply(this, config); + + if(!this.type){ + this.type = "auto"; + } + + var st = Ext.data.SortTypes; + + if(typeof this.sortType == "string"){ + this.sortType = st[this.sortType]; + } + + + if(!this.sortType){ + switch(this.type){ + case "string": + this.sortType = st.asUCString; + break; + case "date": + this.sortType = st.asDate; + break; + default: + this.sortType = st.none; + } + } + + + var stripRe = /[\$,%]/g; + + + + if(!this.convert){ + var cv, dateFormat = this.dateFormat; + switch(this.type){ + case "": + case "auto": + case undefined: + cv = function(v){ return v; }; + break; + case "string": + cv = function(v){ return String(v); }; + break; + case "int": + cv = function(v){ + return v !== undefined && v !== null && v !== '' ? + parseInt(String(v).replace(stripRe, ""), 10) : ''; + }; + break; + case "float": + cv = function(v){ + return v !== undefined && v !== null && v !== '' ? + parseFloat(String(v).replace(stripRe, ""), 10) : ''; + }; + break; + case "bool": + case "boolean": + cv = function(v){ return v === true || v === "true" || v == 1; }; + break; + case "date": + cv = function(v){ + if(!v){ + return ''; + } + if(v instanceof Date){ + return v; + } + if(dateFormat){ + if(dateFormat == "timestamp"){ + return new Date(v*1000); + } + return Date.parseDate(v, dateFormat); + } + var parsed = Date.parse(v); + return parsed ? new Date(parsed) : null; + }; + break; + + } + this.convert = cv; + } +}; + +Ext.data.Field.prototype = { + dateFormat: null, + defaultValue: "", + mapping: null, + sortType : null, + sortDir : "ASC" +}; +Ext.data.DataReader = function(meta, recordType){ + this.meta = meta; + this.recordType = recordType instanceof Array ? + Ext.data.Record.create(recordType) : recordType; +}; + +Ext.data.DataReader.prototype = { + +}; + +Ext.data.DataProxy = function(){ + this.addEvents({ + + beforeload : true, + + load : true, + + loadexception : true + }); + Ext.data.DataProxy.superclass.constructor.call(this); +}; + +Ext.extend(Ext.data.DataProxy, Ext.util.Observable); + +Ext.data.MemoryProxy = function(data){ + Ext.data.MemoryProxy.superclass.constructor.call(this); + this.data = data; +}; + +Ext.extend(Ext.data.MemoryProxy, Ext.data.DataProxy, { + + load : function(params, reader, callback, scope, arg){ + params = params || {}; + var result; + try { + result = reader.readRecords(this.data); + }catch(e){ + this.fireEvent("loadexception", this, arg, null, e); + callback.call(scope, null, arg, false); + return; + } + callback.call(scope, result, arg, true); + }, + + + update : function(params, records){ + + } +}); + +Ext.data.HttpProxy = function(conn){ + Ext.data.HttpProxy.superclass.constructor.call(this); + + this.conn = conn.events ? conn : new Ext.data.Connection(conn); +}; + +Ext.extend(Ext.data.HttpProxy, Ext.data.DataProxy, { + + getConnection : function(){ + return this.conn; + }, + + + load : function(params, reader, callback, scope, arg){ + if(this.fireEvent("beforeload", this, params) !== false){ + this.conn.request({ + params : params || {}, + request: { + callback : callback, + scope : scope, + arg : arg + }, + reader: reader, + callback : this.loadResponse, + scope: this + }); + }else{ + callback.call(scope||this, null, arg, false); + } + }, + + + loadResponse : function(o, success, response){ + if(!success){ + this.fireEvent("loadexception", this, o, response); + o.request.callback.call(o.request.scope, null, o.request.arg, false); + return; + } + var result; + try { + result = o.reader.read(response); + }catch(e){ + this.fireEvent("loadexception", this, o, response, e); + o.request.callback.call(o.request.scope, null, o.request.arg, false); + return; + } + this.fireEvent("load", this, o, o.request.arg); + o.request.callback.call(o.request.scope, result, o.request.arg, true); + }, + + + update : function(dataSet){ + + }, + + + updateResponse : function(dataSet){ + + } +}); + +Ext.data.ScriptTagProxy = function(config){ + Ext.data.ScriptTagProxy.superclass.constructor.call(this); + Ext.apply(this, config); + this.head = document.getElementsByTagName("head")[0]; +}; + +Ext.data.ScriptTagProxy.TRANS_ID = 1000; + +Ext.extend(Ext.data.ScriptTagProxy, Ext.data.DataProxy, { + + timeout : 30000, + + callbackParam : "callback", + + nocache : true, + + + load : function(params, reader, callback, scope, arg){ + if(this.fireEvent("beforeload", this, params) !== false){ + + var p = Ext.urlEncode(Ext.apply(params, this.extraParams)); + + var url = this.url; + url += (url.indexOf("?") != -1 ? "&" : "?") + p; + if(this.nocache){ + url += "&_dc=" + (new Date().getTime()); + } + var transId = ++Ext.data.ScriptTagProxy.TRANS_ID; + var trans = { + id : transId, + cb : "stcCallback"+transId, + scriptId : "stcScript"+transId, + params : params, + arg : arg, + url : url, + callback : callback, + scope : scope, + reader : reader + }; + var conn = this; + + window[trans.cb] = function(o){ + conn.handleResponse(o, trans); + }; + + url += String.format("&{0}={1}", this.callbackParam, trans.cb); + + if(this.autoAbort !== false){ + this.abort(); + } + + trans.timeoutId = this.handleFailure.defer(this.timeout, this, [trans]); + + var script = document.createElement("script"); + script.setAttribute("src", url); + script.setAttribute("type", "text/javascript"); + script.setAttribute("id", trans.scriptId); + this.head.appendChild(script); + + this.trans = trans; + }else{ + callback.call(scope||this, null, arg, false); + } + }, + + + isLoading : function(){ + return this.trans ? true : false; + }, + + + abort : function(){ + if(this.isLoading()){ + this.destroyTrans(this.trans); + } + }, + + + destroyTrans : function(trans, isLoaded){ + this.head.removeChild(document.getElementById(trans.scriptId)); + clearTimeout(trans.timeoutId); + if(isLoaded){ + window[trans.cb] = undefined; + try{ + delete window[trans.cb]; + }catch(e){} + }else{ + + window[trans.cb] = function(){ + window[trans.cb] = undefined; + try{ + delete window[trans.cb]; + }catch(e){} + }; + } + }, + + + handleResponse : function(o, trans){ + this.trans = false; + this.destroyTrans(trans, true); + var result; + try { + result = trans.reader.readRecords(o); + }catch(e){ + this.fireEvent("loadexception", this, o, trans.arg, e); + trans.callback.call(trans.scope||window, null, trans.arg, false); + return; + } + this.fireEvent("load", this, o, trans.arg); + trans.callback.call(trans.scope||window, result, trans.arg, true); + }, + + + handleFailure : function(trans){ + this.trans = false; + this.destroyTrans(trans, false); + this.fireEvent("loadexception", this, null, trans.arg); + trans.callback.call(trans.scope||window, null, trans.arg, false); + } +}); + +Ext.data.JsonReader = function(meta, recordType){ + Ext.data.JsonReader.superclass.constructor.call(this, meta, recordType); +}; +Ext.extend(Ext.data.JsonReader, Ext.data.DataReader, { + + read : function(response){ + var json = response.responseText; + var o = eval("("+json+")"); + if(!o) { + throw {message: "JsonReader.read: Json object not found"}; + } + return this.readRecords(o); + }, + + + simpleAccess: function(obj, subsc) { + return obj[subsc]; + }, + + + getJsonAccessor: function(){ + var re = /[\[\.]/; + return function(expr) { + try { + return(re.test(expr)) + ? new Function("obj", "return obj." + expr) + : function(obj){ + return obj[expr]; + }; + } catch(e){} + return Ext.emptyFn; + }; + }(), + + + readRecords : function(o){ + + this.jsonData = o; + var s = this.meta, Record = this.recordType, + f = Record.prototype.fields, fi = f.items, fl = f.length; + + + if (!this.ef) { + if(s.totalProperty) { + this.getTotal = this.getJsonAccessor(s.totalProperty); + } + if(s.successProperty) { + this.getSuccess = this.getJsonAccessor(s.successProperty); + } + this.getRoot = s.root ? this.getJsonAccessor(s.root) : function(p){return p;}; + if (s.id) { + var g = this.getJsonAccessor(s.id); + this.getId = function(rec) { + var r = g(rec); + return (r === undefined || r === "") ? null : r; + }; + } else { + this.getId = function(){return null;}; + } + this.ef = []; + for(var i = 0; i < fl; i++){ + f = fi[i]; + var map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name; + this.ef[i] = this.getJsonAccessor(map); + } + } + + var root = this.getRoot(o), c = root.length, totalRecords = c, success = true; + if(s.totalProperty){ + var v = parseInt(this.getTotal(o), 10); + if(!isNaN(v)){ + totalRecords = v; + } + } + if(s.successProperty){ + var v = this.getSuccess(o); + if(v === false || v === 'false'){ + success = false; + } + } + var records = []; + for(var i = 0; i < c; i++){ + var n = root[i]; + var values = {}; + var id = this.getId(n); + for(var j = 0; j < fl; j++){ + f = fi[j]; + var v = this.ef[j](n); + values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue); + } + var record = new Record(values, id); + record.json = n; + records[i] = record; + } + return { + success : success, + records : records, + totalRecords : totalRecords + }; + } +}); + +Ext.data.XmlReader = function(meta, recordType){ + Ext.data.XmlReader.superclass.constructor.call(this, meta, recordType); +}; +Ext.extend(Ext.data.XmlReader, Ext.data.DataReader, { + + read : function(response){ + var doc = response.responseXML; + if(!doc) { + throw {message: "XmlReader.read: XML Document not available"}; + } + return this.readRecords(doc); + }, + + + readRecords : function(doc){ + + this.xmlData = doc; + var root = doc.documentElement || doc; + var q = Ext.DomQuery; + var recordType = this.recordType, fields = recordType.prototype.fields; + var sid = this.meta.id; + var totalRecords = 0, success = true; + if(this.meta.totalRecords){ + totalRecords = q.selectNumber(this.meta.totalRecords, root, 0); + } + + if(this.meta.success){ + var sv = q.selectValue(this.meta.success, root, true); + success = sv !== false && sv !== 'false'; + } + var records = []; + var ns = q.select(this.meta.record, root); + for(var i = 0, len = ns.length; i < len; i++) { + var n = ns[i]; + var values = {}; + var id = sid ? q.selectValue(sid, n) : undefined; + for(var j = 0, jlen = fields.length; j < jlen; j++){ + var f = fields.items[j]; + var v = q.selectValue(f.mapping || f.name, n, f.defaultValue); + v = f.convert(v); + values[f.name] = v; + } + var record = new recordType(values, id); + record.node = n; + records[records.length] = record; + } + + return { + success : success, + records : records, + totalRecords : totalRecords || records.length + }; + } +}); + +Ext.data.ArrayReader = function(meta, recordType){ + Ext.data.ArrayReader.superclass.constructor.call(this, meta, recordType); +}; + +Ext.extend(Ext.data.ArrayReader, Ext.data.JsonReader, { + + readRecords : function(o){ + var sid = this.meta ? this.meta.id : null; + var recordType = this.recordType, fields = recordType.prototype.fields; + var records = []; + var root = o; + for(var i = 0; i < root.length; i++){ + var n = root[i]; + var values = {}; + var id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null); + for(var j = 0, jlen = fields.length; j < jlen; j++){ + var f = fields.items[j]; + var k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j; + var v = n[k] !== undefined ? n[k] : f.defaultValue; + v = f.convert(v); + values[f.name] = v; + } + var record = new recordType(values, id); + record.json = n; + records[records.length] = record; + } + return { + records : records, + totalRecords : records.length + }; + } +}); + +Ext.data.Tree = function(root){ + this.nodeHash = {}; + + this.root = null; + if(root){ + this.setRootNode(root); + } + this.addEvents({ + + "append" : true, + + "remove" : true, + + "move" : true, + + "insert" : true, + + "beforeappend" : true, + + "beforeremove" : true, + + "beforemove" : true, + + "beforeinsert" : true + }); + + Ext.data.Tree.superclass.constructor.call(this); +}; + +Ext.extend(Ext.data.Tree, Ext.util.Observable, { + pathSeparator: "/", + + + getRootNode : function(){ + return this.root; + }, + + + setRootNode : function(node){ + this.root = node; + node.ownerTree = this; + node.isRoot = true; + this.registerNode(node); + return node; + }, + + + getNodeById : function(id){ + return this.nodeHash[id]; + }, + + registerNode : function(node){ + this.nodeHash[node.id] = node; + }, + + unregisterNode : function(node){ + delete this.nodeHash[node.id]; + }, + + toString : function(){ + return "[Tree"+(this.id?" "+this.id:"")+"]"; + } +}); + + +Ext.data.Node = function(attributes){ + + this.attributes = attributes || {}; + this.leaf = this.attributes.leaf; + + this.id = this.attributes.id; + if(!this.id){ + this.id = Ext.id(null, "ynode-"); + this.attributes.id = this.id; + } + + this.childNodes = []; + if(!this.childNodes.indexOf){ + this.childNodes.indexOf = function(o){ + for(var i = 0, len = this.length; i < len; i++){ + if(this[i] == o) return i; + } + return -1; + }; + } + + this.parentNode = null; + + this.firstChild = null; + + this.lastChild = null; + + this.previousSibling = null; + + this.nextSibling = null; + + this.addEvents({ + + "append" : true, + + "remove" : true, + + "move" : true, + + "insert" : true, + + "beforeappend" : true, + + "beforeremove" : true, + + "beforemove" : true, + + "beforeinsert" : true + }); + this.listeners = this.attributes.listeners; + Ext.data.Node.superclass.constructor.call(this); +}; + +Ext.extend(Ext.data.Node, Ext.util.Observable, { + fireEvent : function(evtName){ + + if(Ext.data.Node.superclass.fireEvent.apply(this, arguments) === false){ + return false; + } + + var ot = this.getOwnerTree(); + if(ot){ + if(ot.fireEvent.apply(this.ownerTree, arguments) === false){ + return false; + } + } + return true; + }, + + + isLeaf : function(){ + return this.leaf === true; + }, + + + setFirstChild : function(node){ + this.firstChild = node; + }, + + + setLastChild : function(node){ + this.lastChild = node; + }, + + + + isLast : function(){ + return (!this.parentNode ? true : this.parentNode.lastChild == this); + }, + + + isFirst : function(){ + return (!this.parentNode ? true : this.parentNode.firstChild == this); + }, + + hasChildNodes : function(){ + return !this.isLeaf() && this.childNodes.length > 0; + }, + + + appendChild : function(node){ + var multi = false; + if(node instanceof Array){ + multi = node; + }else if(arguments.length > 1){ + multi = arguments; + } + + if(multi){ + for(var i = 0, len = multi.length; i < len; i++) { + this.appendChild(multi[i]); + } + }else{ + if(this.fireEvent("beforeappend", this.ownerTree, this, node) === false){ + return false; + } + var index = this.childNodes.length; + var oldParent = node.parentNode; + + if(oldParent){ + if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index) === false){ + return false; + } + oldParent.removeChild(node); + } + index = this.childNodes.length; + if(index == 0){ + this.setFirstChild(node); + } + this.childNodes.push(node); + node.parentNode = this; + var ps = this.childNodes[index-1]; + if(ps){ + node.previousSibling = ps; + ps.nextSibling = node; + }else{ + node.previousSibling = null; + } + node.nextSibling = null; + this.setLastChild(node); + node.setOwnerTree(this.getOwnerTree()); + this.fireEvent("append", this.ownerTree, this, node, index); + if(oldParent){ + node.fireEvent("move", this.ownerTree, node, oldParent, this, index); + } + return node; + } + }, + + + removeChild : function(node){ + var index = this.childNodes.indexOf(node); + if(index == -1){ + return false; + } + if(this.fireEvent("beforeremove", this.ownerTree, this, node) === false){ + return false; + } + + + this.childNodes.splice(index, 1); + + + if(node.previousSibling){ + node.previousSibling.nextSibling = node.nextSibling; + } + if(node.nextSibling){ + node.nextSibling.previousSibling = node.previousSibling; + } + + + if(this.firstChild == node){ + this.setFirstChild(node.nextSibling); + } + if(this.lastChild == node){ + this.setLastChild(node.previousSibling); + } + + node.setOwnerTree(null); + + node.parentNode = null; + node.previousSibling = null; + node.nextSibling = null; + this.fireEvent("remove", this.ownerTree, this, node); + return node; + }, + + + insertBefore : function(node, refNode){ + if(!refNode){ + return this.appendChild(node); + } + + if(node == refNode){ + return false; + } + + if(this.fireEvent("beforeinsert", this.ownerTree, this, node, refNode) === false){ + return false; + } + var index = this.childNodes.indexOf(refNode); + var oldParent = node.parentNode; + var refIndex = index; + + + if(oldParent == this && this.childNodes.indexOf(node) < index){ + refIndex--; + } + + + if(oldParent){ + if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index, refNode) === false){ + return false; + } + oldParent.removeChild(node); + } + if(refIndex == 0){ + this.setFirstChild(node); + } + this.childNodes.splice(refIndex, 0, node); + node.parentNode = this; + var ps = this.childNodes[refIndex-1]; + if(ps){ + node.previousSibling = ps; + ps.nextSibling = node; + }else{ + node.previousSibling = null; + } + node.nextSibling = refNode; + refNode.previousSibling = node; + node.setOwnerTree(this.getOwnerTree()); + this.fireEvent("insert", this.ownerTree, this, node, refNode); + if(oldParent){ + node.fireEvent("move", this.ownerTree, node, oldParent, this, refIndex, refNode); + } + return node; + }, + + + item : function(index){ + return this.childNodes[index]; + }, + + + replaceChild : function(newChild, oldChild){ + this.insertBefore(newChild, oldChild); + this.removeChild(oldChild); + return oldChild; + }, + + + indexOf : function(child){ + return this.childNodes.indexOf(child); + }, + + + getOwnerTree : function(){ + + if(!this.ownerTree){ + var p = this; + while(p){ + if(p.ownerTree){ + this.ownerTree = p.ownerTree; + break; + } + p = p.parentNode; + } + } + return this.ownerTree; + }, + + + getDepth : function(){ + var depth = 0; + var p = this; + while(p.parentNode){ + ++depth; + p = p.parentNode; + } + return depth; + }, + + + setOwnerTree : function(tree){ + + if(tree != this.ownerTree){ + if(this.ownerTree){ + this.ownerTree.unregisterNode(this); + } + this.ownerTree = tree; + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + cs[i].setOwnerTree(tree); + } + if(tree){ + tree.registerNode(this); + } + } + }, + + + getPath : function(attr){ + attr = attr || "id"; + var p = this.parentNode; + var b = [this.attributes[attr]]; + while(p){ + b.unshift(p.attributes[attr]); + p = p.parentNode; + } + var sep = this.getOwnerTree().pathSeparator; + return sep + b.join(sep); + }, + + + bubble : function(fn, scope, args){ + var p = this; + while(p){ + if(fn.call(scope || p, args || p) === false){ + break; + } + p = p.parentNode; + } + }, + + + cascade : function(fn, scope, args){ + if(fn.call(scope || this, args || this) !== false){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + cs[i].cascade(fn, scope, args); + } + } + }, + + + eachChild : function(fn, scope, args){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + if(fn.call(scope || this, args || cs[i]) === false){ + break; + } + } + }, + + + findChild : function(attribute, value){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + if(cs[i].attributes[attribute] == value){ + return cs[i]; + } + } + return null; + }, + + + findChildBy : function(fn, scope){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + if(fn.call(scope||cs[i], cs[i]) === true){ + return cs[i]; + } + } + return null; + }, + + + sort : function(fn, scope){ + var cs = this.childNodes; + var len = cs.length; + if(len > 0){ + var sortFn = scope ? function(){fn.apply(scope, arguments);} : fn; + cs.sort(sortFn); + for(var i = 0; i < len; i++){ + var n = cs[i]; + n.previousSibling = cs[i-1]; + n.nextSibling = cs[i+1]; + if(i == 0){ + this.setFirstChild(n); + } + if(i == len-1){ + this.setLastChild(n); + } + } + } + }, + + + contains : function(node){ + return node.isAncestor(this); + }, + + + isAncestor : function(node){ + var p = this.parentNode; + while(p){ + if(p == node){ + return true; + } + p = p.parentNode; + } + return false; + }, + + toString : function(){ + return "[Node"+(this.id?" "+this.id:"")+"]"; + } +}); + +Ext.ComponentMgr = function(){ + var all = new Ext.util.MixedCollection(); + + return { + register : function(c){ + all.add(c); + }, + + unregister : function(c){ + all.remove(c); + }, + + + get : function(id){ + return all.get(id); + }, + + + onAvailable : function(id, fn, scope){ + all.on("add", function(index, o){ + if(o.id == id){ + fn.call(scope || o, o); + all.un("add", fn, scope); + } + }); + } + }; +}(); + + +Ext.Component = function(config){ + config = config || {}; + if(config.tagName || config.dom || typeof config == "string"){ config = {el: config, id: config.id || config}; + } + this.initialConfig = config; + + Ext.apply(this, config); + this.addEvents({ + + disable : true, + + enable : true, + + beforeshow : true, + + show : true, + + beforehide : true, + + hide : true, + + beforerender : true, + + render : true, + + beforedestroy : true, + + destroy : true + }); + if(!this.id){ + this.id = "ext-comp-" + (++Ext.Component.AUTO_ID); + } + Ext.ComponentMgr.register(this); + Ext.Component.superclass.constructor.call(this); + this.initComponent(); +}; + +Ext.Component.AUTO_ID = 1000; + +Ext.extend(Ext.Component, Ext.util.Observable, { + + hidden : false, + + disabled : false, + + disabledClass : "x-item-disabled", + + rendered : false, + + allowDomMove: true, + + ctype : "Ext.Component", + + actionMode : "el", + + getActionEl : function(){ + return this[this.actionMode]; + }, + + initComponent : Ext.emptyFn, + + render : function(container, position){ + if(!this.rendered && this.fireEvent("beforerender", this) !== false){ + if(!container && this.el){ + this.el = Ext.get(this.el); + container = this.el.dom.parentNode; + this.allowDomMove = false; + } + this.container = Ext.get(container); + this.rendered = true; + if(position !== undefined){ + if(typeof position == 'number'){ + position = this.container.dom.childNodes[position]; + }else{ + position = Ext.getDom(position); + } + } + this.onRender(this.container, position || null); + if(this.cls){ + this.el.addClass(this.cls); + delete this.cls; + } + if(this.style){ + this.el.applyStyles(this.style); + delete this.style; + } + this.fireEvent("render", this); + this.afterRender(this.container); + if(this.hidden){ + this.hide(); + } + if(this.disabled){ + this.disable(); + } + } + return this; + }, + + onRender : function(ct, position){ + if(this.el){ + this.el = Ext.get(this.el); + if(this.allowDomMove !== false){ + ct.dom.insertBefore(this.el.dom, position); + } + } + }, + + getAutoCreate : function(){ + var cfg = typeof this.autoCreate == "object" ? + this.autoCreate : Ext.apply({}, this.defaultAutoCreate); + if(this.id && !cfg.id){ + cfg.id = this.id; + } + return cfg; + }, + + afterRender : Ext.emptyFn, + + destroy : function(){ + if(this.fireEvent("beforedestroy", this) !== false){ + this.purgeListeners(); + this.beforeDestroy(); + if(this.rendered){ + this.el.removeAllListeners(); + this.el.remove(); + if(this.actionMode == "container"){ + this.container.remove(); + } + } + this.onDestroy(); + Ext.ComponentMgr.unregister(this); + this.fireEvent("destroy", this); + } + }, + + beforeDestroy : function(){ + + }, + + onDestroy : function(){ + + }, + + + getEl : function(){ + return this.el; + }, + + + getId : function(){ + return this.id; + }, + + + focus : function(selectText){ + if(this.rendered){ + this.el.focus(); + if(selectText === true){ + this.el.dom.select(); + } + } + return this; + }, + + blur : function(){ + if(this.rendered){ + this.el.blur(); + } + return this; + }, + + + disable : function(){ + if(this.rendered){ + this.onDisable(); + } + this.disabled = true; + this.fireEvent("disable", this); + return this; + }, + + onDisable : function(){ + this.getActionEl().addClass(this.disabledClass); + this.el.dom.disabled = true; + }, + + + enable : function(){ + if(this.rendered){ + this.onEnable(); + } + this.disabled = false; + this.fireEvent("enable", this); + return this; + }, + + onEnable : function(){ + this.getActionEl().removeClass(this.disabledClass); + this.el.dom.disabled = false; + }, + + + setDisabled : function(disabled){ + this[disabled ? "disable" : "enable"](); + }, + + + show: function(){ + if(this.fireEvent("beforeshow", this) !== false){ + this.hidden = false; + if(this.rendered){ + this.onShow(); + } + this.fireEvent("show", this); + } + return this; + }, + + onShow : function(){ + var st = this.getActionEl().dom.style; + st.display = ""; + st.visibility = "visible"; + }, + + + hide: function(){ + if(this.fireEvent("beforehide", this) !== false){ + this.hidden = true; + if(this.rendered){ + this.onHide(); + } + this.fireEvent("hide", this); + } + return this; + }, + + onHide : function(){ + this.getActionEl().dom.style.display = "none"; + }, + + + setVisible: function(visible){ + if(visible) { + this.show(); + }else{ + this.hide(); + } + return this; + }, + + + isVisible : function(){ + return this.getActionEl().isVisible(); + }, + + cloneConfig : function(overrides){ + overrides = overrides || {}; + var id = overrides.id || Ext.id(); + var cfg = Ext.applyIf(overrides, this.initialConfig); + cfg.id = id; return new this.__extcls(cfg); + } +}); + +(function(){ +Ext.Layer = function(config, existingEl){ + config = config || {}; + var dh = Ext.DomHelper; + var cp = config.parentEl, pel = cp ? Ext.getDom(cp) : document.body; + if(existingEl){ + this.dom = Ext.getDom(existingEl); + } + if(!this.dom){ + var o = config.dh || {tag: "div", cls: "x-layer"}; + this.dom = dh.append(pel, o); + } + if(config.cls){ + this.addClass(config.cls); + } + this.constrain = config.constrain !== false; + this.visibilityMode = Ext.Element.VISIBILITY; + if(config.id){ + this.id = this.dom.id = config.id; + }else{ + this.id = Ext.id(this.dom); + } + this.zindex = config.zindex || this.getZIndex(); + this.position("absolute", this.zindex); + if(config.shadow){ + this.shadowOffset = config.shadowOffset || 4; + this.shadow = new Ext.Shadow({ + offset : this.shadowOffset, + mode : config.shadow + }); + }else{ + this.shadowOffset = 0; + } + this.useShim = config.shim !== false && Ext.useShims; + this.useDisplay = config.useDisplay; + this.hide(); +}; + +var supr = Ext.Element.prototype; + + +var shims = []; + +Ext.extend(Ext.Layer, Ext.Element, { + + getZIndex : function(){ + return this.zindex || parseInt(this.getStyle("z-index"), 10) || 11000; + }, + + getShim : function(){ + if(!this.useShim){ + return null; + } + if(this.shim){ + return this.shim; + } + var shim = shims.shift(); + if(!shim){ + shim = this.createShim(); + shim.enableDisplayMode('block'); + shim.dom.style.display = 'none'; + shim.dom.style.visibility = 'visible'; + } + var pn = this.dom.parentNode; + if(shim.dom.parentNode != pn){ + pn.insertBefore(shim.dom, this.dom); + } + shim.setStyle('z-index', this.getZIndex()-2); + this.shim = shim; + return shim; + }, + + hideShim : function(){ + if(this.shim){ + this.shim.setDisplayed(false); + shims.push(this.shim); + delete this.shim; + } + }, + + disableShadow : function(){ + if(this.shadow){ + this.shadowDisabled = true; + this.shadow.hide(); + this.lastShadowOffset = this.shadowOffset; + this.shadowOffset = 0; + } + }, + + enableShadow : function(show){ + if(this.shadow){ + this.shadowDisabled = false; + this.shadowOffset = this.lastShadowOffset; + delete this.lastShadowOffset; + if(show){ + this.sync(true); + } + } + }, + + + + + sync : function(doShow){ + var sw = this.shadow; + if(!this.updating && this.isVisible() && (sw || this.useShim)){ + var sh = this.getShim(); + + var w = this.getWidth(), + h = this.getHeight(); + + var l = this.getLeft(true), + t = this.getTop(true); + + if(sw && !this.shadowDisabled){ + if(doShow && !sw.isVisible()){ + sw.show(this); + }else{ + sw.realign(l, t, w, h); + } + if(sh){ + if(doShow){ + sh.show(); + } + + var a = sw.adjusts, s = sh.dom.style; + s.left = (Math.min(l, l+a.l))+"px"; + s.top = (Math.min(t, t+a.t))+"px"; + s.width = (w+a.w)+"px"; + s.height = (h+a.h)+"px"; + } + }else if(sh){ + if(doShow){ + sh.show(); + } + sh.setSize(w, h); + sh.setLeftTop(l, t); + } + + } + }, + + + destroy : function(){ + this.hideShim(); + if(this.shadow){ + this.shadow.hide(); + } + this.removeAllListeners(); + var pn = this.dom.parentNode; + if(pn){ + pn.removeChild(this.dom); + } + Ext.Element.uncache(this.id); + }, + + remove : function(){ + this.destroy(); + }, + + + beginUpdate : function(){ + this.updating = true; + }, + + + endUpdate : function(){ + this.updating = false; + this.sync(true); + }, + + + hideUnders : function(negOffset){ + if(this.shadow){ + this.shadow.hide(); + } + this.hideShim(); + }, + + + constrainXY : function(){ + if(this.constrain){ + var vw = Ext.lib.Dom.getViewWidth(), + vh = Ext.lib.Dom.getViewHeight(); + var s = Ext.get(document).getScroll(); + + var xy = this.getXY(); + var x = xy[0], y = xy[1]; + var w = this.dom.offsetWidth+this.shadowOffset, h = this.dom.offsetHeight+this.shadowOffset; + + var moved = false; + + if((x + w) > vw+s.left){ + x = vw - w - this.shadowOffset; + moved = true; + } + if((y + h) > vh+s.top){ + y = vh - h - this.shadowOffset; + moved = true; + } + + if(x < s.left){ + x = s.left; + moved = true; + } + if(y < s.top){ + y = s.top; + moved = true; + } + if(moved){ + if(this.avoidY){ + var ay = this.avoidY; + if(y <= ay && (y+h) >= ay){ + y = ay-h-5; + } + } + xy = [x, y]; + this.storeXY(xy); + supr.setXY.call(this, xy); + this.sync(); + } + } + }, + + isVisible : function(){ + return this.visible; + }, + + + showAction : function(){ + this.visible = true; + if(this.useDisplay === true){ + this.setDisplayed(""); + }else if(this.lastXY){ + supr.setXY.call(this, this.lastXY); + }else if(this.lastLT){ + supr.setLeftTop.call(this, this.lastLT[0], this.lastLT[1]); + } + }, + + + hideAction : function(){ + this.visible = false; + if(this.useDisplay === true){ + this.setDisplayed(false); + }else{ + this.setLeftTop(-10000,-10000); + } + }, + + + setVisible : function(v, a, d, c, e){ + if(v){ + this.showAction(); + } + if(a && v){ + var cb = function(){ + this.sync(true); + if(c){ + c(); + } + }.createDelegate(this); + supr.setVisible.call(this, true, true, d, cb, e); + }else{ + if(!v){ + this.hideUnders(true); + } + var cb = c; + if(a){ + cb = function(){ + this.hideAction(); + if(c){ + c(); + } + }.createDelegate(this); + } + supr.setVisible.call(this, v, a, d, cb, e); + if(v){ + this.sync(true); + }else if(!a){ + this.hideAction(); + } + } + }, + + storeXY : function(xy){ + delete this.lastLT; + this.lastXY = xy; + }, + + storeLeftTop : function(left, top){ + delete this.lastXY; + this.lastLT = [left, top]; + }, + + + beforeFx : function(){ + this.beforeAction(); + return Ext.Layer.superclass.beforeFx.apply(this, arguments); + }, + + + afterFx : function(){ + Ext.Layer.superclass.afterFx.apply(this, arguments); + this.sync(this.isVisible()); + }, + + + beforeAction : function(){ + if(!this.updating && this.shadow){ + this.shadow.hide(); + } + }, + + + setLeft : function(left){ + this.storeLeftTop(left, this.getTop(true)); + supr.setLeft.apply(this, arguments); + this.sync(); + }, + + setTop : function(top){ + this.storeLeftTop(this.getLeft(true), top); + supr.setTop.apply(this, arguments); + this.sync(); + }, + + setLeftTop : function(left, top){ + this.storeLeftTop(left, top); + supr.setLeftTop.apply(this, arguments); + this.sync(); + }, + + setXY : function(xy, a, d, c, e){ + this.fixDisplay(); + this.beforeAction(); + this.storeXY(xy); + var cb = this.createCB(c); + supr.setXY.call(this, xy, a, d, cb, e); + if(!a){ + cb(); + } + }, + + + createCB : function(c){ + var el = this; + return function(){ + el.constrainXY(); + el.sync(true); + if(c){ + c(); + } + }; + }, + + + setX : function(x, a, d, c, e){ + this.setXY([x, this.getY()], a, d, c, e); + }, + + + setY : function(y, a, d, c, e){ + this.setXY([this.getX(), y], a, d, c, e); + }, + + + setSize : function(w, h, a, d, c, e){ + this.beforeAction(); + var cb = this.createCB(c); + supr.setSize.call(this, w, h, a, d, cb, e); + if(!a){ + cb(); + } + }, + + + setWidth : function(w, a, d, c, e){ + this.beforeAction(); + var cb = this.createCB(c); + supr.setWidth.call(this, w, a, d, cb, e); + if(!a){ + cb(); + } + }, + + + setHeight : function(h, a, d, c, e){ + this.beforeAction(); + var cb = this.createCB(c); + supr.setHeight.call(this, h, a, d, cb, e); + if(!a){ + cb(); + } + }, + + + setBounds : function(x, y, w, h, a, d, c, e){ + this.beforeAction(); + var cb = this.createCB(c); + if(!a){ + this.storeXY([x, y]); + supr.setXY.call(this, [x, y]); + supr.setSize.call(this, w, h, a, d, cb, e); + cb(); + }else{ + supr.setBounds.call(this, x, y, w, h, a, d, cb, e); + } + return this; + }, + + + setZIndex : function(zindex){ + this.zindex = zindex; + this.setStyle("z-index", zindex + 2); + if(this.shadow){ + this.shadow.setZIndex(zindex + 1); + } + if(this.shim){ + this.shim.setStyle("z-index", zindex); + } + } +}); +})(); + +Ext.Shadow = function(config){ + Ext.apply(this, config); + if(typeof this.mode != "string"){ + this.mode = this.defaultMode; + } + var o = this.offset, a = {h: 0}; + switch(this.mode.toLowerCase()){ + case "drop": + a.w = 0; + a.l = a.t = o; + break; + case "sides": + a.w = (o*2); + a.l = -o; + a.t = o; + break; + case "frame": + a.w = a.h = (o*2); + a.l = a.t = -o; + break; + }; + this.adjusts = a; +}; + +Ext.Shadow.prototype = { + + + offset: 4, + + defaultMode: "drop", + + + show : function(target){ + target = Ext.get(target); + if(!this.el){ + this.el = Ext.Shadow.Pool.pull(); + if(this.el.dom.nextSibling != target.dom){ + this.el.insertBefore(target); + } + } + this.el.setStyle("z-index", this.zIndex || parseInt(target.getStyle("z-index"), 10)-1); + if(Ext.isIE){ + this.el.dom.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius="+this.offset+")"; + } + this.realign( + target.getLeft(true), + target.getTop(true), + target.getWidth(), + target.getHeight() + ); + this.el.dom.style.display = "block"; + }, + + + isVisible : function(){ + return this.el ? true : false; + }, + + + realign : function(l, t, w, h){ + if(!this.el){ + return; + } + var a = this.adjusts, d = this.el.dom, s = d.style; + var iea = 0; + if(Ext.isIE){ + iea = -(this.offset); + } + s.left = (l+a.l+iea)+"px"; + s.top = (t+a.t+iea)+"px"; + var sw = (w+a.w), sh = (h+a.h), sws = sw +"px", shs = sh + "px"; + if(s.width != sws || s.height != shs){ + s.width = sws; + s.height = shs; + if(!Ext.isIE){ + var cn = d.childNodes; + var sww = Math.max(0, (sw-12))+"px"; + cn[0].childNodes[1].style.width = sww; + cn[1].childNodes[1].style.width = sww; + cn[2].childNodes[1].style.width = sww; + cn[1].style.height = Math.max(0, (sh-12))+"px"; + } + } + }, + + + hide : function(){ + if(this.el){ + this.el.dom.style.display = "none"; + Ext.Shadow.Pool.push(this.el); + delete this.el; + } + }, + + + setZIndex : function(z){ + this.zIndex = z; + if(this.el){ + this.el.setStyle("z-index", z); + } + } +}; + +Ext.Shadow.Pool = function(){ + var p = []; + var markup = Ext.isIE ? + '
      ' : + '
      '; + return { + pull : function(){ + var sh = p.shift(); + if(!sh){ + sh = Ext.get(Ext.DomHelper.insertHtml("beforeBegin", document.body.firstChild, markup)); + sh.autoBoxAdjust = false; + } + return sh; + }, + + push : function(sh){ + p.push(sh); + } + }; +}(); +Ext.BoxComponent = function(config){ + Ext.BoxComponent.superclass.constructor.call(this, config); + this.addEvents({ + resize : true, + move : true + }); +}; + +Ext.extend(Ext.BoxComponent, Ext.Component, { + boxReady : false, + deferHeight: false, + + setSize : function(w, h){ + if(typeof w == 'object'){ + h = w.height; + w = w.width; + } + if(!this.boxReady){ + this.width = w; + this.height = h; + return; + } + + if(this.lastSize && this.lastSize.width == w && this.lastSize.height == h){ + return; + } + this.lastSize = {width: w, height: h}; + + var adj = this.adjustSize(w, h); + var aw = adj.width, ah = adj.height; + if(aw !== undefined || ah !== undefined){ var rz = this.getResizeEl(); + if(!this.deferHeight && aw !== undefined && ah !== undefined){ + rz.setSize(aw, ah); + }else if(!this.deferHeight && ah !== undefined){ + rz.setHeight(ah); + }else if(aw !== undefined){ + rz.setWidth(aw); + } + this.onResize(aw, ah, w, h); + this.fireEvent('resize', this, aw, ah, w, h); + } + return this; + }, + + getSize : function(){ + return this.el.getSize(); + }, + + getPosition : function(local){ + if(local === true){ + return [this.el.getLeft(true), this.el.getTop(true)]; + } + return this.xy || this.el.getXY(); + }, + + getBox : function(local){ + var s = this.el.getSize(); + if(local){ + s.x = this.el.getLeft(true); + s.y = this.el.getTop(true); + }else{ + var xy = this.xy || this.el.getXY(); + s.x = xy[0]; + s.y = xy[1]; + } + return s; + }, + + updateBox : function(box){ + this.setSize(box.width, box.height); + this.setPagePosition(box.x, box.y); + }, + + getResizeEl : function(){ + return this.resizeEl || this.el; + }, + + setPosition : function(x, y){ + this.x = x; + this.y = y; + if(!this.boxReady){ + return; + } + var adj = this.adjustPosition(x, y); + var ax = adj.x, ay = adj.y; + + if(ax !== undefined || ay !== undefined){ + if(ax !== undefined && ay !== undefined){ + this.el.setLeftTop(ax, ay); + }else if(ax !== undefined){ + this.el.setLeft(ax); + }else if(ay !== undefined){ + this.el.setTop(ay); + } + this.onPosition(ax, ay); + this.fireEvent('move', this, ax, ay); + } + return this; + }, + + setPagePosition : function(x, y){ + this.pageX = x; + this.pageY = y; + if(!this.boxReady){ + return; + } + if(x === undefined || y === undefined){ return; + } + var p = this.el.translatePoints(x, y); + this.setPosition(p.left, p.top); + return this; + }, + + onRender : function(ct, position){ + Ext.BoxComponent.superclass.onRender.call(this, ct, position); + if(this.resizeEl){ + this.resizeEl = Ext.get(this.resizeEl); + } + }, + + afterRender : function(){ + Ext.BoxComponent.superclass.afterRender.call(this); + this.boxReady = true; + this.setSize(this.width, this.height); + if(this.x || this.y){ + this.setPosition(this.x, this.y); + } + if(this.pageX || this.pageY){ + this.setPagePosition(this.pageX, this.pageY); + } + }, + + syncSize : function(){ + this.setSize(this.el.getWidth(), this.el.getHeight()); + }, + + onResize : function(adjWidth, adjHeight, rawWidth, rawHeight){ + + }, + + onPosition : function(x, y){ + + }, + + adjustSize : function(w, h){ + if(this.autoWidth){ + w = 'auto'; + } + if(this.autoHeight){ + h = 'auto'; + } + return {width : w, height: h}; + }, + + adjustPosition : function(x, y){ + return {x : x, y: y}; + } +}); + +Ext.View = function(container, tpl, config){ + this.el = Ext.get(container, true); + if(typeof tpl == "string"){ + tpl = new Ext.Template(tpl); + } + tpl.compile(); + + this.tpl = tpl; + + Ext.apply(this, config); + + + this.addEvents({ + + "beforeclick" : true, + + "click" : true, + + "dblclick" : true, + + "contextmenu" : true, + + "selectionchange" : true, + + + "beforeselect" : true + }); + + this.el.on({ + "click": this.onClick, + "dblclick": this.onDblClick, + "contextmenu": this.onContextMenu, + scope:this + }); + + this.selections = []; + this.nodes = []; + this.cmp = new Ext.CompositeElementLite([]); + if(this.store){ + this.setStore(this.store, true); + } + Ext.View.superclass.constructor.call(this); +}; + +Ext.extend(Ext.View, Ext.util.Observable, { + + selectedClass : "x-view-selected", + + emptyText : "", + + getEl : function(){ + return this.el; + }, + + + refresh : function(){ + var t = this.tpl; + this.clearSelections(); + this.el.update(""); + var html = []; + var records = this.store.getRange(); + if(records.length < 1){ + this.el.update(this.emptyText); + return; + } + for(var i = 0, len = records.length; i < len; i++){ + var data = this.prepareData(records[i].data, i, records[i]); + html[html.length] = t.apply(data); + } + this.el.update(html.join("")); + this.nodes = this.el.dom.childNodes; + this.updateIndexes(0); + }, + + + prepareData : function(data){ + return data; + }, + + onUpdate : function(ds, record){ + this.clearSelections(); + var index = this.store.indexOf(record); + var n = this.nodes[index]; + this.tpl.insertBefore(n, this.prepareData(record.data)); + n.parentNode.removeChild(n); + this.updateIndexes(index, index); + }, + + onAdd : function(ds, records, index){ + this.clearSelections(); + if(this.nodes.length == 0){ + this.refresh(); + return; + } + var n = this.nodes[index]; + for(var i = 0, len = records.length; i < len; i++){ + var d = this.prepareData(records[i].data); + if(n){ + this.tpl.insertBefore(n, d); + }else{ + this.tpl.append(this.el, d); + } + } + this.updateIndexes(index); + }, + + onRemove : function(ds, record, index){ + this.clearSelections(); + this.el.dom.removeChild(this.nodes[index]); + this.updateIndexes(index); + }, + + + refreshNode : function(index){ + this.onUpdate(this.store, this.store.getAt(index)); + }, + + updateIndexes : function(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; + } + }, + + + setStore : function(store, initial){ + if(!initial && this.store){ + this.store.un("datachanged", this.refresh); + this.store.un("add", this.onAdd); + this.store.un("remove", this.onRemove); + this.store.un("update", this.onUpdate); + this.store.un("clear", this.refresh); + } + if(store){ + store.on("datachanged", this.refresh, this); + store.on("add", this.onAdd, this); + store.on("remove", this.onRemove, this); + store.on("update", this.onUpdate, this); + store.on("clear", this.refresh, this); + } + this.store = store; + this.refresh(); + }, + + + 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); + if(this.onItemClick(item, index, e) !== false){ + 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.fireEvent("beforeclick", this, index, item, e) === false){ + return false; + } + 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; + } + e.preventDefault(); + } + return true; + }, + + + getSelectionCount : function(){ + return this.selections.length; + }, + + + getSelectedNodes : function(){ + return this.selections; + }, + + + getSelectedIndexes : function(){ + var indexes = [], s = this.selections; + for(var i = 0, len = s.length; i < len; i++){ + indexes.push(s[i].nodeIndex); + } + return indexes; + }, + + + clearSelections : function(suppressEvent){ + if(this.nodes && (this.multiSelect || this.singleSelect) && this.selections.length > 0){ + this.cmp.elements = this.selections; + this.cmp.removeClass(this.selectedClass); + this.selections = []; + if(!suppressEvent){ + this.fireEvent("selectionchange", this, this.selections); + } + } + }, + + + isSelected : function(node){ + var s = this.selections; + if(s.length < 1){ + return false; + } + node = this.getNode(node); + return s.indexOf(node) !== -1; + }, + + + select : function(nodeInfo, keepExisting, suppressEvent){ + if(nodeInfo instanceof Array){ + if(!keepExisting){ + this.clearSelections(true); + } + for(var i = 0, len = nodeInfo.length; i < len; i++){ + this.select(nodeInfo[i], true, true); + } + } else{ + var node = this.getNode(nodeInfo); + if(node && !this.isSelected(node)){ + if(!keepExisting){ + this.clearSelections(true); + } + if(this.fireEvent("beforeselect", this, node, this.selections) !== false){ + Ext.fly(node).addClass(this.selectedClass); + this.selections.push(node); + if(!suppressEvent){ + this.fireEvent("selectionchange", this, this.selections); + } + } + } + } + }, + + + getNode : function(nodeInfo){ + if(typeof nodeInfo == "string"){ + return document.getElementById(nodeInfo); + }else if(typeof nodeInfo == "number"){ + return this.nodes[nodeInfo]; + } + return nodeInfo; + }, + + + getNodes : function(start, end){ + var ns = this.nodes; + start = start || 0; + end = typeof end == "undefined" ? ns.length - 1 : end; + var nodes = []; + if(start <= end){ + for(var i = start; i <= end; i++){ + nodes.push(ns[i]); + } + } else{ + 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; + } +}); + + +Ext.JsonView = function(container, tpl, config){ + Ext.JsonView.superclass.constructor.call(this, container, tpl, config); + + var um = this.el.getUpdateManager(); + um.setRenderer(this); + um.on("update", this.onLoad, this); + um.on("failure", this.onLoadException, this); + + + + + this.addEvents({ + 'beforerender' : true, + 'load' : true, + 'loadexception' : true + }); +}; +Ext.extend(Ext.JsonView, Ext.View, { + + jsonRoot : "", + + + refresh : function(){ + this.clearSelections(); + this.el.update(""); + var html = []; + var o = this.jsonData; + if(o && o.length > 0){ + for(var i = 0, len = o.length; i < len; i++){ + var data = this.prepareData(o[i], i, o); + html[html.length] = this.tpl.apply(data); + } + }else{ + html.push(this.emptyText); + } + this.el.update(html.join("")); + this.nodes = this.el.dom.childNodes; + this.updateIndexes(0); + }, + + + load : function(){ + var um = this.el.getUpdateManager(); + um.update.apply(um, arguments); + }, + + render : function(el, response){ + this.clearSelections(); + this.el.update(""); + var o; + try{ + o = Ext.util.JSON.decode(response.responseText); + if(this.jsonRoot){ + o = eval("o." + this.jsonRoot); + } + } catch(e){ + } + + this.jsonData = o; + this.beforeRender(); + this.refresh(); + }, + + + getCount : function(){ + return this.jsonData ? this.jsonData.length : 0; + }, + + + getNodeData : function(node){ + if(node instanceof Array){ + var data = []; + for(var i = 0, len = node.length; i < len; i++){ + data.push(this.getNodeData(node[i])); + } + return data; + } + return this.jsonData[this.indexOf(node)] || null; + }, + + beforeRender : function(){ + this.snapshot = this.jsonData; + if(this.sortInfo){ + this.sort.apply(this, this.sortInfo); + } + this.fireEvent("beforerender", this, this.jsonData); + }, + + onLoad : function(el, o){ + this.fireEvent("load", this, this.jsonData, o); + }, + + onLoadException : function(el, o){ + this.fireEvent("loadexception", this, o); + }, + + + filter : function(property, value){ + if(this.jsonData){ + var data = []; + var ss = this.snapshot; + if(typeof value == "string"){ + var vlen = value.length; + if(vlen == 0){ + this.clearFilter(); + return; + } + value = value.toLowerCase(); + for(var i = 0, len = ss.length; i < len; i++){ + var o = ss[i]; + if(o[property].substr(0, vlen).toLowerCase() == value){ + data.push(o); + } + } + } else if(value.exec){ + for(var i = 0, len = ss.length; i < len; i++){ + var o = ss[i]; + if(value.test(o[property])){ + data.push(o); + } + } + } else{ + return; + } + this.jsonData = data; + this.refresh(); + } + }, + + + filterBy : function(fn, scope){ + if(this.jsonData){ + var data = []; + var ss = this.snapshot; + for(var i = 0, len = ss.length; i < len; i++){ + var o = ss[i]; + if(fn.call(scope || this, o)){ + data.push(o); + } + } + this.jsonData = data; + this.refresh(); + } + }, + + + clearFilter : function(){ + if(this.snapshot && this.jsonData != this.snapshot){ + this.jsonData = this.snapshot; + this.refresh(); + } + }, + + + + sort : function(property, dir, sortType){ + this.sortInfo = Array.prototype.slice.call(arguments, 0); + if(this.jsonData){ + var p = property; + var dsc = dir && dir.toLowerCase() == "desc"; + var f = function(o1, o2){ + var v1 = sortType ? sortType(o1[p]) : o1[p]; + var v2 = sortType ? sortType(o2[p]) : o2[p]; + ; + if(v1 < v2){ + return dsc ? +1 : -1; + } else if(v1 > v2){ + return dsc ? -1 : +1; + } else{ + return 0; + } + }; + this.jsonData.sort(f); + this.refresh(); + if(this.jsonData != this.snapshot){ + this.snapshot.sort(f); + } + } + } +}); + +Ext.ColorPalette = function(config){ + Ext.ColorPalette.superclass.constructor.call(this, config); + this.addEvents({ + + select: true + }); + + if(this.handler){ + this.on("select", this.handler, this.scope, true); + } +}; +Ext.extend(Ext.ColorPalette, Ext.Component, { + + itemCls : "x-color-palette", + + value : null, + + ctype: "Ext.ColorPalette", + + + colors : [ + "000000", "993300", "333300", "003300", "003366", "000080", "333399", "333333", + "800000", "FF6600", "808000", "008000", "008080", "0000FF", "666699", "808080", + "FF0000", "FF9900", "99CC00", "339966", "33CCCC", "3366FF", "800080", "969696", + "FF00FF", "FFCC00", "FFFF00", "00FF00", "00FFFF", "00CCFF", "993366", "C0C0C0", + "FF99CC", "FFCC99", "FFFF99", "CCFFCC", "CCFFFF", "99CCFF", "CC99FF", "FFFFFF" + ], + + onRender : function(container, position){ + var t = new Ext.MasterTemplate( + ' ' + ); + var c = this.colors; + for(var i = 0, len = c.length; i < len; i++){ + t.add([c[i]]); + } + var el = document.createElement("div"); + el.className = this.itemCls; + t.overwrite(el); + container.dom.insertBefore(el, position); + this.el = Ext.get(el); + this.el.on("click", this.handleClick, this, {delegate: "a"}); + }, + + afterRender : function(){ + Ext.ColorPalette.superclass.afterRender.call(this); + if(this.value){ + var s = this.value; + this.value = null; + this.select(s); + } + }, + + handleClick : function(e, t){ + e.preventDefault(); + if(!this.disabled){ + var c = t.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1]; + this.select(c.toUpperCase()); + } + }, + + + select : function(color){ + color = color.replace("#", ""); + if(color != this.value){ + var el = this.el; + if(this.value){ + el.child("a.color-"+this.value).removeClass("x-color-palette-sel"); + } + el.child("a.color-"+color).addClass("x-color-palette-sel"); + this.value = color; + this.fireEvent("select", this, color); + } + } +}); + +Ext.DatePicker = function(config){ + Ext.DatePicker.superclass.constructor.call(this, config); + + this.value = config && config.value ? + config.value.clearTime() : new Date().clearTime(); + + this.addEvents({ + + select: true + }); + + if(this.handler){ + this.on("select", this.handler, this.scope || this); + } + + if(!this.disabledDatesRE && 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.disabledDatesRE = new RegExp(re + ")"); + } +}; + +Ext.extend(Ext.DatePicker, Ext.Component, { + + todayText : "Today", + + todayTip : "{0} (Spacebar)", + + minDate : null, + + maxDate : null, + + minText : "This date is before the minimum date", + + maxText : "This date is after the maximum date", + + format : "m/d/y", + + disabledDays : null, + + disabledDaysText : "", + + disabledDatesRE : null, + + disabledDatesText : "", + + constrainToViewport : true, + + monthNames : Date.monthNames, + + dayNames : Date.dayNames, + + nextText: 'Next Month (Control+Right)', + + prevText: 'Previous Month (Control+Left)', + + monthYearText: 'Choose a month (Control+Up/Down to move years)', + + startDay : 0, + + + setValue : function(value){ + var old = this.value; + this.value = value.clearTime(true); + if(this.el){ + this.update(this.value); + } + }, + + + getValue : function(){ + return this.value; + }, + + + focus : function(){ + if(this.el){ + this.update(this.activeDate); + } + }, + + + onRender : function(container, position){ + var m = [ + '', + '', + '
        
      ']; + var dn = this.dayNames; + for(var i = 0; i < 7; i++){ + var d = this.startDay+i; + if(d > 6){ + d = d-7; + } + m.push(""); + } + m[m.length] = ""; + for(var i = 0; i < 42; i++) { + if(i % 7 == 0 && i != 0){ + m[m.length] = ""; + } + m[m.length] = ''; + } + m[m.length] = '
      ", dn[d].substr(0,1), "
      '; + + var el = document.createElement("div"); + el.className = "x-date-picker"; + el.innerHTML = m.join(""); + + container.dom.insertBefore(el, position); + + this.el = Ext.get(el); + new Ext.util.ClickRepeater(this.el.child("td.x-date-left a"), {handler: this.showPrevMonth, scope: this}); + new Ext.util.ClickRepeater(this.el.child("td.x-date-right a"), {handler: this.showNextMonth, scope: this}); + + this.el.on("mousewheel", this.handleMouseWheel, this); + + + var kn = new Ext.KeyNav(this.el, { + "left" : function(e){ + e.ctrlKey ? + this.showPrevMonth() : + this.update(this.activeDate.add("d", -1)); + }, + + "right" : function(e){ + e.ctrlKey ? + this.showNextMonth() : + this.update(this.activeDate.add("d", 1)); + }, + + "up" : function(e){ + e.ctrlKey ? + this.showNextYear() : + this.update(this.activeDate.add("d", -7)); + }, + + "down" : function(e){ + e.ctrlKey ? + this.showPrevYear() : + this.update(this.activeDate.add("d", 7)); + }, + + "pageUp" : function(e){ + this.showNextMonth(); + }, + + "pageDown" : function(e){ + this.showPrevMonth(); + }, + + "enter" : function(e){ + e.stopPropagation(); + return true; + }, + + scope : this + }); + + this.el.on("click", this.handleDateClick, this, {delegate: "a.x-date-date"}); + + this.el.addKeyListener(Ext.EventObject.SPACE, this.selectToday, this); + + this.el.unselectable(); + + this.cells = this.el.select("table.x-date-inner tbody td"); + this.textNodes = this.el.query("table.x-date-inner tbody span"); + + var mmenu = new Ext.menu.Menu({ + plain:true, + cls: "x-date-mmenu", + allowOtherMenus : true + }); + + var menuGroup = Ext.id()+"months"; + for(var i = 0; i < 12; i++){ + mmenu.add(new Ext.menu.CheckItem({ + id: "mm-"+i, + text: this.monthNames[i], + group:menuGroup, + month: i + })); + } + + mmenu.on({ + "beforeshow" : function(){ + mmenu.items.get("mm-"+(this.activeDate || this.value).getMonth()).setChecked(true); + }, + "itemclick" : function(item){ + var d = (this.activeDate || this.value).clone(); + d.setMonth(item.month); + this.update(d); + }, + "show" : function(m){ + this.visibleRegion = m.el.getRegion().adjust(2, 2, -2, -2); + }, + "mouseout" : function(m, e){ + if(!this.visibleRegion.contains(e.getPoint())){ + m.hide(); + } + }, + scope: this + }); + + this.mbtn = new Ext.Button(this.el.child("td.x-date-middle", true), { + menu: mmenu, + text: " ", + menuAlign: "c-c?", + tooltip: this.monthYearText + }); + + var today = (new Date()).dateFormat(this.format); + var todayBtn = new Ext.Button(this.el.child("td.x-date-bottom", true), { + text: String.format(this.todayText, today), + tooltip: String.format(this.todayTip, today), + handler: this.selectToday, + scope: this + }); + + if(Ext.isIE){ + this.el.repaint(); + } + this.update(this.value); + }, + + + showPrevMonth : function(e){ + this.update(this.activeDate.add("mo", -1)); + }, + + + showNextMonth : function(e){ + this.update(this.activeDate.add("mo", 1)); + }, + + + showPrevYear : function(){ + this.update(this.activeDate.add("y", -1)); + }, + + + showNextYear : function(){ + this.update(this.activeDate.add("y", 1)); + }, + + + handleMouseWheel : function(e){ + var delta = e.getWheelDelta(); + if(delta > 0){ + this.showPrevMonth(); + e.stopEvent(); + } else if(delta < 0){ + this.showNextMonth(); + e.stopEvent(); + } + }, + + + handleDateClick : function(e, t){ + e.stopEvent(); + if(t.dateValue && !Ext.fly(t.parentNode).hasClass("x-date-disabled")){ + this.setValue(new Date(t.dateValue)); + this.fireEvent("select", this, this.value); + } + }, + + + selectToday : function(){ + this.setValue(new Date().clearTime()); + this.fireEvent("select", this, this.value); + }, + + + update : function(date){ + var vd = this.activeDate; + this.activeDate = date; + + if(vd && this.el){ + var t = date.getTime(); + if(vd.getMonth() == date.getMonth() && vd.getFullYear() == date.getFullYear()){ + this.cells.removeClass("x-date-selected"); + this.cells.each(function(c){ + if(c.dom.firstChild.dateValue == t){ + c.addClass("x-date-selected"); + setTimeout(function(){ + try{c.dom.firstChild.focus();}catch(e){} + }, 50); + return false; + } + }); + return; + } + } + var days = date.getDaysInMonth(); + var firstOfMonth = date.getFirstDateOfMonth(); + var startingPos = firstOfMonth.getDay()-this.startDay; + + if(startingPos <= this.startDay){ + startingPos += 7; + } + + var pm = date.add("mo", -1); + var prevStart = pm.getDaysInMonth()-startingPos; + + var cells = this.cells.elements; + var textEls = this.textNodes; + days += startingPos; + + + var day = 86400000; + var d = (new Date(pm.getFullYear(), pm.getMonth(), prevStart)).clearTime(); + var today = new Date().clearTime().getTime(); + var sel = date.clearTime().getTime(); + var min = this.minDate ? this.minDate.clearTime() : Number.NEGATIVE_INFINITY; + var max = this.maxDate ? this.maxDate.clearTime() : Number.POSITIVE_INFINITY; + var ddMatch = this.disabledDatesRE; + var ddText = this.disabledDatesText; + var ddays = this.disabledDays ? this.disabledDays.join("") : false; + var ddaysText = this.disabledDaysText; + var format = this.format; + + var setCellClass = function(cal, cell){ + cell.title = ""; + var t = d.getTime(); + cell.firstChild.dateValue = t; + if(t == today){ + cell.className += " x-date-today"; + cell.title = cal.todayText; + } + if(t == sel){ + cell.className += " x-date-selected"; + setTimeout(function(){ + try{cell.firstChild.focus();}catch(e){} + }, 50); + } + + if(t < min) { + cell.className = " x-date-disabled"; + cell.title = cal.minText; + return; + } + if(t > max) { + cell.className = " x-date-disabled"; + cell.title = cal.maxText; + return; + } + if(ddays){ + if(ddays.indexOf(d.getDay()) != -1){ + cell.title = ddaysText; + cell.className = " x-date-disabled"; + } + } + if(ddMatch && format){ + var fvalue = d.dateFormat(format); + if(ddMatch.test(fvalue)){ + cell.title = ddText.replace("%0", fvalue); + cell.className = " x-date-disabled"; + } + } + }; + + var i = 0; + for(; i < startingPos; i++) { + textEls[i].innerHTML = (++prevStart); + d.setDate(d.getDate()+1); + cells[i].className = "x-date-prevday"; + setCellClass(this, cells[i]); + } + for(; i < days; i++){ + intDay = i - startingPos + 1; + textEls[i].innerHTML = (intDay); + d.setDate(d.getDate()+1); + cells[i].className = "x-date-active"; + setCellClass(this, cells[i]); + } + var extraDays = 0; + for(; i < 42; i++) { + textEls[i].innerHTML = (++extraDays); + d.setDate(d.getDate()+1); + cells[i].className = "x-date-nextday"; + setCellClass(this, cells[i]); + } + + this.mbtn.setText(this.monthNames[date.getMonth()] + " " + date.getFullYear()); + + if(!this.internalRender){ + var main = this.el.dom.firstChild; + var w = main.offsetWidth; + this.el.setWidth(w + this.el.getBorderWidth("lr")); + Ext.fly(main).setWidth(w); + this.internalRender = true; + + + + if(Ext.isOpera && !this.secondPass){ + main.rows[0].cells[1].style.width = (w - (main.rows[0].cells[0].offsetWidth+main.rows[0].cells[2].offsetWidth)) + "px"; + this.secondPass = true; + this.update.defer(10, this, [date]); + } + } + } +}); + +Ext.TabPanel = function(container, config){ + + this.el = Ext.get(container, true); + if(config){ + if(typeof config == "boolean"){ + this.tabPosition = config ? "bottom" : "top"; + }else{ + Ext.apply(this, config); + } + } + if(this.tabPosition == "bottom"){ + this.bodyEl = Ext.get(this.createBody(this.el.dom)); + this.el.addClass("x-tabs-bottom"); + } + this.stripWrap = Ext.get(this.createStrip(this.el.dom), true); + this.stripEl = Ext.get(this.createStripList(this.stripWrap.dom), true); + this.stripBody = Ext.get(this.stripWrap.dom.firstChild.firstChild, true); + if(Ext.isIE){ + Ext.fly(this.stripWrap.dom.firstChild).setStyle("overflow-x", "hidden"); + } + if(this.tabPosition != "bottom"){ + + this.bodyEl = Ext.get(this.createBody(this.el.dom)); + this.el.addClass("x-tabs-top"); + } + this.items = []; + + this.bodyEl.setStyle("position", "relative"); + + this.active = null; + this.activateDelegate = this.activate.createDelegate(this); + + this.addEvents({ + + "tabchange": true, + + "beforetabchange" : true + }); + + Ext.EventManager.onWindowResize(this.onResize, this); + this.cpad = this.el.getPadding("lr"); + this.hiddenCount = 0; + + Ext.TabPanel.superclass.constructor.call(this); +}; + +Ext.extend(Ext.TabPanel, Ext.util.Observable, { + + tabPosition : "top", + currentTabWidth : 0, + + minTabWidth : 40, + + maxTabWidth : 250, + + preferredTabWidth : 175, + + resizeTabs : false, + + monitorResize : true, + + + addTab : function(id, text, content, closable){ + var item = new 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(); + } + 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]; + tab.fireEvent("close", tab); + tab.purgeListeners(); + 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; + } + } + + 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){ + return null; + } + 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.fireEvent("tabchange", 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()||0)-(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)-2); + if(availWidth < this.minTabWidth){ + + } + }else{ + if(this.currentTabWidth < this.preferredTabWidth){ + this.setTabWidth(Math.min(availWidth, this.preferredTabWidth)-2); + } + } + }, + + + getCount : function(){ + return this.items.length; + }, + + + 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){ + 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(); + } + } +}); + + +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 = Ext.get(tabPanel.createItemBody(tabPanel.bodyEl.dom, id)); + this.bodyEl.setVisibilityMode(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 = Ext.get(els.el, true); + this.inner = Ext.get(els.inner, true); + this.textEl = Ext.get(this.el.dom.firstChild.firstChild.firstChild, true); + this.pnode = Ext.get(els.el.parentNode, true); + this.el.on("mousedown", this.onTabMouseDown, this); + this.el.on("click", this.onTabClick, this); + + if(closable){ + var c = Ext.get(els.close, true); + c.dom.title = this.closeText; + c.addClassOnOver("close-over"); + c.on("click", this.closeClick, this); + } + + this.addEvents({ + + "activate": true, + + "beforeclose": true, + + "close": true, + + "deactivate" : true + }); + this.hidden = false; + + Ext.TabPanelItem.superclass.constructor.call(this); +}; + +Ext.extend(Ext.TabPanelItem, Ext.util.Observable, { + purgeListeners : function(){ + Ext.util.Observable.prototype.purgeListeners.call(this); + this.el.removeAllListeners(); + }, + + show : function(){ + this.pnode.addClass("on"); + this.showAction(); + if(Ext.isOpera){ + this.tabPanel.stripWrap.repaint(); + } + this.fireEvent("activate", this.tabPanel, this); + }, + + + isActive : function(){ + return this.tabPanel.getActiveTab() == this; + }, + + + hide : function(){ + this.pnode.removeClass("on"); + this.hideAction(); + this.fireEvent("deactivate", this.tabPanel, this); + }, + + hideAction : function(){ + this.bodyEl.hide(); + this.bodyEl.setStyle("position", "absolute"); + this.bodyEl.setLeft("-20000px"); + this.bodyEl.setTop("-20000px"); + }, + + showAction : function(){ + this.bodyEl.setStyle("position", "relative"); + this.bodyEl.setTop(""); + this.bodyEl.setLeft(""); + this.bodyEl.show(); + }, + + + setTooltip : function(text){ + if(Ext.QuickTips && Ext.QuickTips.isEnabled()){ + this.textEl.dom.qtip = text; + this.textEl.dom.removeAttribute('title'); + }else{ + this.textEl.dom.title = text; + } + }, + + onTabClick : function(e){ + e.preventDefault(); + this.tabPanel.activate(this.id); + }, + + onTabMouseDown : 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" : ""); + }, + + + isHidden : function(){ + return this.hidden; + }, + + + getText : function(){ + return this.text; + }, + + autoSize : function(){ + + this.textEl.setWidth(1); + this.setWidth(this.textEl.dom.scrollWidth+this.pnode.getPadding("lr")+this.inner.getPadding("lr")); + + }, + + + setText : function(text){ + this.text = text; + this.textEl.update(text); + this.setTooltip(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.un('activate', this.refreshDelegate); + } + this.refreshDelegate = this._handleRefresh.createDelegate(this, [url, params, loadOnce]); + this.on("activate", 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)); + } + }, + + + refresh : function(){ + if(this.refreshDelegate){ + this.loaded = false; + this.refreshDelegate(); + } + }, + + + _setLoaded : function(){ + this.loaded = true; + }, + + + closeClick : function(e){ + var o = {}; + e.stopEvent(); + this.fireEvent("beforeclose", this, o); + if(o.cancel !== true){ + this.tabPanel.removeTab(this.id); + } + }, + + closeText : "Close this tab" +}); + + +Ext.TabPanel.prototype.createStrip = function(container){ + var strip = document.createElement("div"); + strip.className = "x-tabs-wrap"; + container.appendChild(strip); + return strip; +}; + +Ext.TabPanel.prototype.createStripList = function(strip){ + + strip.innerHTML = '
      '; + return strip.firstChild.firstChild.firstChild.firstChild; +}; + +Ext.TabPanel.prototype.createBody = function(container){ + var body = document.createElement("div"); + Ext.id(body, "tab-body"); + Ext.fly(body).addClass("x-tabs-body"); + container.appendChild(body); + return body; +}; + +Ext.TabPanel.prototype.createItemBody = function(bodyEl, id){ + var body = Ext.getDom(id); + if(!body){ + body = document.createElement("div"); + body.id = id; + } + Ext.fly(body).addClass("x-tabs-item-body"); + bodyEl.insertBefore(body, bodyEl.firstChild); + return body; +}; + +Ext.TabPanel.prototype.createStripElements = function(stripEl, text, closable){ + var td = document.createElement("td"); + stripEl.appendChild(td); + if(closable){ + td.className = "x-tabs-closable"; + if(!this.closeTpl){ + this.closeTpl = new 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 Ext.Template( + '' + + '{text}' + ); + } + var el = this.tabTpl.overwrite(td, {"text": text}); + var inner = el.getElementsByTagName("em")[0]; + return {"el": el, "inner": inner}; + } +}; + +Ext.Button = function(renderTo, config){ + Ext.apply(this, config); + this.addEvents({ + + "click" : true, + + "toggle" : true, + + 'mouseover' : true, + + 'mouseout': true + }); + if(this.menu){ + this.menu = Ext.menu.MenuMgr.get(this.menu); + } + if(renderTo){ + this.render(renderTo); + } + Ext.Button.superclass.constructor.call(this); +}; + +Ext.extend(Ext.Button, Ext.util.Observable, { + + hidden : false, + + disabled : false, + + pressed : false, + + + enableToggle: false, + + menu : undefined, + + menuAlign : "tl-bl?", + + + menuClassTarget: 'tr', + + clickEvent : 'click', + handleMouseEvents : true, + + + tooltipType : 'qtip', + + + render : function(renderTo){ + var btn; + if(this.hideParent){ + this.parentEl = Ext.get(renderTo); + } + if(!this.dhconfig){ + if(!this.template){ + if(!Ext.Button.buttonTemplate){ + + Ext.Button.buttonTemplate = new Ext.Template( + '', + '', + "
        
      "); + } + this.template = Ext.Button.buttonTemplate; + } + btn = this.template.append(renderTo, [this.text || ' '], true); + var btnEl = btn.child("button:first"); + btnEl.on('focus', this.onFocus, this); + btnEl.on('blur', this.onBlur, this); + if(this.cls){ + btn.addClass(this.cls); + } + if(this.icon){ + btnEl.setStyle('background-image', 'url(' +this.icon +')'); + } + if(this.tooltip){ + if(typeof this.tooltip == 'object'){ + Ext.QuickTips.tips(Ext.apply({ + target: btnEl.id + }, this.tooltip)); + } else { + btnEl.dom[this.tooltipType] = this.tooltip; + } + } + }else{ + btn = Ext.DomHelper.append(Ext.get(renderTo).dom, this.dhconfig, true); + } + this.el = btn; + if(this.id){ + this.el.dom.id = this.el.id = this.id; + } + if(this.menu){ + this.el.child(this.menuClassTarget).addClass("x-btn-with-menu"); + this.menu.on("show", this.onMenuShow, this); + this.menu.on("hide", this.onMenuHide, this); + } + btn.addClass("x-btn"); + if(Ext.isIE && !Ext.isIE7){ + this.autoWidth.defer(1, this); + }else{ + this.autoWidth(); + } + if(this.handleMouseEvents){ + btn.on("mouseover", this.onMouseOver, this); + btn.on("mouseout", this.onMouseOut, this); + btn.on("mousedown", this.onMouseDown, this); + } + btn.on(this.clickEvent, this.onClick, this); + + if(this.hidden){ + this.hide(); + } + if(this.disabled){ + this.disable(); + } + Ext.ButtonToggleMgr.register(this); + if(this.pressed){ + this.el.addClass("x-btn-pressed"); + } + if(this.repeat){ + var repeater = new Ext.util.ClickRepeater(btn, + typeof this.repeat == "object" ? this.repeat : {} + ); + repeater.on("click", this.onClick, this); + } + }, + + getEl : function(){ + return this.el; + }, + + + destroy : function(){ + Ext.ButtonToggleMgr.unregister(this); + this.el.removeAllListeners(); + this.purgeListeners(); + this.el.remove(); + }, + + + autoWidth : function(){ + if(this.el){ + this.el.setWidth("auto"); + if(Ext.isIE7 && Ext.isStrict){ + var ib = this.el.child('button'); + if(ib && ib.getWidth() > 20){ + ib.clip(); + ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr')); + } + } + if(this.minWidth){ + if(this.hidden){ + this.el.beginMeasure(); + } + if(this.el.getWidth() < this.minWidth){ + this.el.setWidth(this.minWidth); + } + if(this.hidden){ + this.el.endMeasure(); + } + } + } + }, + + + setHandler : function(handler, scope){ + this.handler = handler; + this.scope = scope; + }, + + + setText : function(text){ + this.text = text; + if(this.el){ + this.el.child("td.x-btn-center button.x-btn-text").update(text); + } + this.autoWidth(); + }, + + + getText : function(){ + return this.text; + }, + + + show: function(){ + this.hidden = false; + if(this.el){ + this[this.hideParent? 'parentEl' : 'el'].setStyle("display", ""); + } + }, + + + hide: function(){ + this.hidden = true; + if(this.el){ + this[this.hideParent? 'parentEl' : 'el'].setStyle("display", "none"); + } + }, + + + setVisible: function(visible){ + if(visible) { + this.show(); + }else{ + this.hide(); + } + }, + + + toggle : function(state){ + state = state === undefined ? !this.pressed : state; + if(state != this.pressed){ + if(state){ + this.el.addClass("x-btn-pressed"); + this.pressed = true; + this.fireEvent("toggle", this, true); + }else{ + this.el.removeClass("x-btn-pressed"); + this.pressed = false; + this.fireEvent("toggle", this, false); + } + if(this.toggleHandler){ + this.toggleHandler.call(this.scope || this, this, state); + } + } + }, + + + focus : function(){ + this.el.child('button:first').focus(); + }, + + + disable : function(){ + if(this.el){ + this.el.addClass("x-btn-disabled"); + } + this.disabled = true; + }, + + + enable : function(){ + if(this.el){ + this.el.removeClass("x-btn-disabled"); + } + this.disabled = false; + }, + + + setDisabled : function(v){ + this[v !== true ? "enable" : "disable"](); + }, + + + onClick : function(e){ + if(e){ + e.preventDefault(); + } + if(!this.disabled){ + if(this.enableToggle){ + this.toggle(); + } + if(this.menu && !this.menu.isVisible()){ + this.menu.show(this.el, this.menuAlign); + } + this.fireEvent("click", this, e); + if(this.handler){ + this.el.removeClass("x-btn-over"); + this.handler.call(this.scope || this, this, e); + } + } + }, + + onMouseOver : function(e){ + if(!this.disabled){ + this.el.addClass("x-btn-over"); + this.fireEvent('mouseover', this, e); + } + }, + + onMouseOut : function(e){ + if(!e.within(this.el, true)){ + this.el.removeClass("x-btn-over"); + this.fireEvent('mouseout', this, e); + } + }, + + onFocus : function(e){ + if(!this.disabled){ + this.el.addClass("x-btn-focus"); + } + }, + + onBlur : function(e){ + this.el.removeClass("x-btn-focus"); + }, + + onMouseDown : function(){ + if(!this.disabled){ + this.el.addClass("x-btn-click"); + Ext.get(document).on('mouseup', this.onMouseUp, this); + } + }, + + onMouseUp : function(){ + this.el.removeClass("x-btn-click"); + Ext.get(document).un('mouseup', this.onMouseUp, this); + }, + + onMenuShow : function(e){ + this.el.addClass("x-btn-menu-active"); + }, + + onMenuHide : function(e){ + this.el.removeClass("x-btn-menu-active"); + } +}); + + +Ext.ButtonToggleMgr = function(){ + var groups = {}; + + function toggleGroup(btn, state){ + if(state){ + var g = groups[btn.toggleGroup]; + for(var i = 0, l = g.length; i < l; i++){ + if(g[i] != btn){ + g[i].toggle(false); + } + } + } + } + + return { + register : function(btn){ + if(!btn.toggleGroup){ + return; + } + var g = groups[btn.toggleGroup]; + if(!g){ + g = groups[btn.toggleGroup] = []; + } + g.push(btn); + btn.on("toggle", toggleGroup); + }, + + unregister : function(btn){ + if(!btn.toggleGroup){ + return; + } + var g = groups[btn.toggleGroup]; + if(g){ + g.remove(btn); + btn.un("toggle", toggleGroup); + } + } + }; +}(); + +Ext.MenuButton = function(renderTo, config){ + Ext.MenuButton.superclass.constructor.call(this, renderTo, config); + + this.addEvents({"arrowclick":true}); +}; + +Ext.extend(Ext.MenuButton, Ext.Button, { + render : function(renderTo){ + + var tpl = new Ext.Template( + '
      ', + '', + '', + "
       
      ", + '', + '', + "
       
      " + ); + var btn = tpl.append(renderTo, [this.text], true); + if(this.cls){ + btn.addClass(this.cls); + } + if(this.icon){ + btn.child("button").setStyle('background-image', 'url(' +this.icon +')'); + } + this.el = btn; + this.autoWidth(); + if(this.handleMouseEvents){ + btn.on("mouseover", this.onMouseOver, this); + btn.on("mouseout", this.onMouseOut, this); + btn.on("mousedown", this.onMouseDown, this); + btn.on("mouseup", this.onMouseUp, this); + } + btn.on(this.clickEvent, this.onClick, this); + if(this.tooltip){ + var btnEl = btn.child("button:first"); + if(typeof this.tooltip == 'object'){ + Ext.QuickTips.tips(Ext.apply({ + target: btnEl.id + }, this.tooltip)); + } else { + btnEl.dom[this.tooltipType] = this.tooltip; + } + } + if(this.arrowTooltip){ + var btnEl = btn.child("button:nth(2)"); + btnEl.dom[this.tooltipType] = this.arrowTooltip; + } + if(this.hidden){ + this.hide(); + } + if(this.disabled){ + this.disable(); + } + if(this.menu){ + this.menu.on("show", this.onMenuShow, this); + this.menu.on("hide", this.onMenuHide, this); + } + }, + + + autoWidth : function(){ + if(this.el){ + var tbl = this.el.child("table:first"); + var tbl2 = this.el.child("table:last"); + this.el.setWidth("auto"); + tbl.setWidth("auto"); + if(Ext.isIE7 && Ext.isStrict){ + var ib = this.el.child('button:first'); + if(ib && ib.getWidth() > 20){ + ib.clip(); + ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr')); + } + } + if(this.minWidth){ + if(this.hidden){ + this.el.beginMeasure(); + } + if((tbl.getWidth()+tbl2.getWidth()) < this.minWidth){ + tbl.setWidth(this.minWidth-tbl2.getWidth()); + } + if(this.hidden){ + this.el.endMeasure(); + } + } + this.el.setWidth(tbl.getWidth()+tbl2.getWidth()); + } + }, + + setHandler : function(handler, scope){ + this.handler = handler; + this.scope = scope; + }, + + + setArrowHandler : function(handler, scope){ + this.arrowHandler = handler; + this.scope = scope; + }, + + + focus : function(){ + if(this.el){ + this.el.child("a:first").focus(); + } + }, + + + onClick : function(e){ + e.preventDefault(); + if(!this.disabled){ + if(e.getTarget(".x-btn-menu-arrow-wrap")){ + if(this.menu && !this.menu.isVisible()){ + this.menu.show(this.el, this.menuAlign); + } + this.fireEvent("arrowclick", this, e); + if(this.arrowHandler){ + this.arrowHandler.call(this.scope || this, this, e); + } + }else{ + this.fireEvent("click", this, e); + if(this.handler){ + this.handler.call(this.scope || this, this, e); + } + } + } + }, + + onMouseDown : function(e){ + if(!this.disabled){ + Ext.fly(e.getTarget("table")).addClass("x-btn-click"); + } + }, + + onMouseUp : function(e){ + Ext.fly(e.getTarget("table")).removeClass("x-btn-click"); + } +}); + + Ext.Toolbar = function(container, buttons, config){ + if(container instanceof Array){ + buttons = container; + config = buttons; + container = null; + } + Ext.apply(this, config); + this.buttons = buttons; + if(container){ + this.render(container); + } +}; + +Ext.Toolbar.prototype = { + + render : function(ct){ + this.el = Ext.get(ct); + if(this.cls){ + this.el.addClass(this.cls); + } + + this.el.update('
      '); + this.tr = this.el.child("tr", true); + var autoId = 0; + this.items = new Ext.util.MixedCollection(false, function(o){ + return o.id || ("item" + (++autoId)); + }); + if(this.buttons){ + this.add.apply(this, this.buttons); + delete this.buttons; + } + }, + + + add : function(){ + var a = arguments, l = a.length; + for(var i = 0; i < l; i++){ + var el = a[i]; + if(el.applyTo){ + this.addField(el); + }else if(el.render){ + this.addItem(el); + }else if(typeof el == "string"){ + if(el == "separator" || el == "-"){ + this.addSeparator(); + }else if(el == " "){ + this.addSpacer(); + }else{ + this.addText(el); + } + }else if(el.tagName){ + this.addElement(el); + }else if(typeof el == "object"){ + this.addButton(el); + } + } + }, + + + getEl : function(){ + return this.el; + }, + + + addSeparator : function(){ + return this.addItem(new Ext.Toolbar.Separator()); + }, + + + addSpacer : function(){ + return this.addItem(new Ext.Toolbar.Spacer()); + }, + + + addElement : function(el){ + return this.addItem(new Ext.Toolbar.Item(el)); + }, + + + addItem : function(item){ + var td = this.nextBlock(); + item.render(td); + this.items.add(item); + return item; + }, + + + 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 Ext.Toolbar.Button)){ + b = new Ext.Toolbar.Button(config); + } + var td = this.nextBlock(); + b.render(td); + this.items.add(b); + return b; + }, + + + addText : function(text){ + return this.addItem(new Ext.Toolbar.TextItem(text)); + }, + + + insertButton : function(index, item){ + if(item instanceof Array){ + var buttons = []; + for(var i = 0, len = item.length; i < len; i++) { + buttons.push(this.insertButton(index + i, item[i])); + } + return buttons; + } + if (!(item instanceof Ext.Toolbar.Button)){ + item = new Ext.Toolbar.Button(item); + } + var td = document.createElement("td"); + this.tr.insertBefore(td, this.tr.childNodes[index]); + item.render(td); + this.items.insert(index, item); + return item; + }, + + + addDom : function(config, returnEl){ + var td = this.nextBlock(); + Ext.DomHelper.overwrite(td, config); + var ti = new Ext.Toolbar.Item(td.firstChild); + ti.render(td); + this.items.add(ti); + return ti; + }, + + + addField : function(field){ + var td = this.nextBlock(); + field.render(td); + var ti = new Ext.Toolbar.Item(td.firstChild); + ti.render(td); + this.items.add(ti); + return ti; + }, + + + nextBlock : function(){ + var td = document.createElement("td"); + this.tr.appendChild(td); + return td; + } +}; + + +Ext.Toolbar.Item = function(el){ + this.el = Ext.getDom(el); + this.id = Ext.id(this.el); + this.hidden = false; +}; + +Ext.Toolbar.Item.prototype = { + + + getEl : function(){ + return this.el; + }, + + + render : function(td){ + this.td = td; + td.appendChild(this.el); + }, + + + destroy : function(){ + this.td.parentNode.removeChild(this.td); + }, + + + show: function(){ + this.hidden = false; + this.td.style.display = ""; + }, + + + hide: function(){ + this.hidden = true; + this.td.style.display = "none"; + }, + + + setVisible: function(visible){ + if(visible) { + this.show(); + }else{ + this.hide(); + } + }, + + + focus : function(){ + Ext.fly(this.el).focus(); + }, + + + disable : function(){ + Ext.fly(this.td).addClass("x-item-disabled"); + this.disabled = true; + this.el.disabled = true; + }, + + + enable : function(){ + Ext.fly(this.td).removeClass("x-item-disabled"); + this.disabled = false; + this.el.disabled = false; + } +}; + + + +Ext.Toolbar.Separator = function(){ + var s = document.createElement("span"); + s.className = "ytb-sep"; + Ext.Toolbar.Separator.superclass.constructor.call(this, s); +}; +Ext.extend(Ext.Toolbar.Separator, Ext.Toolbar.Item); + + +Ext.Toolbar.Spacer = function(){ + var s = document.createElement("div"); + s.className = "ytb-spacer"; + Ext.Toolbar.Separator.superclass.constructor.call(this, s); +}; +Ext.extend(Ext.Toolbar.Spacer, Ext.Toolbar.Item); + + +Ext.Toolbar.TextItem = function(text){ + var s = document.createElement("span"); + s.className = "ytb-text"; + s.innerHTML = text; + Ext.Toolbar.TextItem.superclass.constructor.call(this, s); +}; +Ext.extend(Ext.Toolbar.TextItem, Ext.Toolbar.Item); + + +Ext.Toolbar.Button = function(config){ + Ext.Toolbar.Button.superclass.constructor.call(this, null, config); +}; +Ext.extend(Ext.Toolbar.Button, Ext.Button, { + render : function(td){ + this.td = td; + Ext.Toolbar.Button.superclass.render.call(this, td); + }, + + + destroy : function(){ + Ext.Toolbar.Button.superclass.destroy.call(this); + this.td.parentNode.removeChild(this.td); + }, + + + show: function(){ + this.hidden = false; + this.td.style.display = ""; + }, + + + hide: function(){ + this.hidden = true; + this.td.style.display = "none"; + }, + + + disable : function(){ + Ext.fly(this.td).addClass("x-item-disabled"); + this.disabled = true; + }, + + + enable : function(){ + Ext.fly(this.td).removeClass("x-item-disabled"); + this.disabled = false; + } +}); + +Ext.ToolbarButton = Ext.Toolbar.Button; + + +Ext.Toolbar.MenuButton = function(config){ + Ext.Toolbar.MenuButton.superclass.constructor.call(this, null, config); +}; +Ext.extend(Ext.Toolbar.MenuButton, Ext.MenuButton, { + render : function(td){ + this.td = td; + Ext.Toolbar.MenuButton.superclass.render.call(this, td); + }, + + + destroy : function(){ + Ext.Toolbar.MenuButton.superclass.destroy.call(this); + this.td.parentNode.removeChild(this.td); + }, + + + show: function(){ + this.hidden = false; + this.td.style.display = ""; + }, + + + hide: function(){ + this.hidden = true; + this.td.style.display = "none"; + } +}); + + + +Ext.PagingToolbar = function(el, ds, config){ + Ext.PagingToolbar.superclass.constructor.call(this, el, null, config); + this.ds = ds; + this.cursor = 0; + this.renderButtons(this.el); + this.bind(ds); +}; + +Ext.extend(Ext.PagingToolbar, Ext.Toolbar, { + + pageSize: 20, + + displayMsg : 'Displaying {0} - {1} of {2}', + + emptyMsg : 'No data to display', + + beforePageText : "Page", + + afterPageText : "of {0}", + + firstText : "First Page", + + prevText : "Previous Page", + + nextText : "Next Page", + + lastText : "Last Page", + + refreshText : "Refresh", + + renderButtons : function(el){ + this.first = this.addButton({ + tooltip: this.firstText, + cls: "x-btn-icon x-grid-page-first", + disabled: true, + handler: this.onClick.createDelegate(this, ["first"]) + }); + this.prev = this.addButton({ + tooltip: this.prevText, + cls: "x-btn-icon x-grid-page-prev", + disabled: true, + handler: this.onClick.createDelegate(this, ["prev"]) + }); + this.addSeparator(); + this.add(this.beforePageText); + this.field = Ext.get(this.addDom({ + tag: "input", + type: "text", + size: "3", + value: "1", + cls: "x-grid-page-number" + }).el); + this.field.on("keydown", this.onPagingKeydown, this); + this.field.on("focus", function(){this.dom.select();}); + this.afterTextEl = this.addText(String.format(this.afterPageText, 1)); + this.field.setHeight(18); + this.addSeparator(); + this.next = this.addButton({ + tooltip: this.nextText, + cls: "x-btn-icon x-grid-page-next", + disabled: true, + handler: this.onClick.createDelegate(this, ["next"]) + }); + this.last = this.addButton({ + tooltip: this.lastText, + cls: "x-btn-icon x-grid-page-last", + disabled: true, + handler: this.onClick.createDelegate(this, ["last"]) + }); + this.addSeparator(); + this.loading = this.addButton({ + tooltip: this.refreshText, + cls: "x-btn-icon x-grid-loading", + disabled: true, + handler: this.onClick.createDelegate(this, ["refresh"]) + }); + + if(this.displayInfo){ + this.displayEl = this.el.createChild({cls:'x-paging-info'}); + } + }, + + updateInfo : function(){ + if(this.displayEl){ + var count = this.ds.getCount(); + var msg = count == 0 ? + this.emptyMsg : + String.format( + this.displayMsg, + this.cursor+1, this.cursor+count, this.ds.getTotalCount() + ); + this.displayEl.update(msg); + } + }, + + onLoad : function(ds, r, o){ + this.cursor = o.params ? o.params.start : 0; + var d = this.getPageData(), ap = d.activePage, ps = d.pages; + + this.afterTextEl.el.innerHTML = String.format(this.afterPageText, d.pages); + this.field.dom.value = ap; + this.first.setDisabled(ap == 1); + this.prev.setDisabled(ap == 1); + this.next.setDisabled(ap == ps); + this.last.setDisabled(ap == ps); + this.loading.enable(); + this.updateInfo(); + }, + + getPageData : function(){ + var total = this.ds.getTotalCount(); + return { + total : total, + activePage : Math.ceil((this.cursor+this.pageSize)/this.pageSize), + pages : total < this.pageSize ? 1 : Math.ceil(total/this.pageSize) + }; + }, + + onLoadError : function(){ + this.loading.enable(); + }, + + onPagingKeydown : function(e){ + var k = e.getKey(); + var d = this.getPageData(); + if(k == e.RETURN){ + var v = this.field.dom.value, pageNum; + if(!v || isNaN(pageNum = parseInt(v, 10))){ + this.field.dom.value = d.activePage; + return; + } + pageNum = Math.min(Math.max(1, pageNum), d.pages) - 1; + this.ds.load({params:{start: pageNum * this.pageSize, limit: this.pageSize}}); + e.stopEvent(); + } + else if(k == e.HOME || (k == e.UP && e.ctrlKey) || (k == e.PAGEUP && e.ctrlKey) || (k == e.RIGHT && e.ctrlKey) || k == e.END || (k == e.DOWN && e.ctrlKey) || (k == e.LEFT && e.ctrlKey) || (k == e.PAGEDOWN && e.ctrlKey)) + { + var pageNum = (k == e.HOME || (k == e.DOWN && e.ctrlKey) || (k == e.LEFT && e.ctrlKey) || (k == e.PAGEDOWN && e.ctrlKey)) ? 1 : d.pages; + this.field.dom.value = pageNum; + this.ds.load({params:{start: (pageNum - 1) * this.pageSize, limit: this.pageSize}}); + e.stopEvent(); + } + else if(k == e.UP || k == e.RIGHT || k == e.PAGEUP || k == e.DOWN || k == e.LEFT || k == e.PAGEDOWN) + { + var v = this.field.dom.value, pageNum; + var increment = (e.shiftKey) ? 10 : 1; + if(k == e.DOWN || k == e.LEFT || k == e.PAGEDOWN) + increment *= -1; + if(!v || isNaN(pageNum = parseInt(v, 10))) { + this.field.dom.value = d.activePage; + return; + } + else if(parseInt(v, 10) + increment >= 1 & parseInt(v, 10) + increment <= d.pages) + { + this.field.dom.value = parseInt(v, 10) + increment; + pageNum = Math.min(Math.max(1, pageNum + increment), d.pages) - 1; + this.ds.load({params:{start: pageNum * this.pageSize, limit: this.pageSize}}); + } + e.stopEvent(); + } + }, + + beforeLoad : function(){ + if(this.loading){ + this.loading.disable(); + } + }, + + onClick : function(which){ + var ds = this.ds; + switch(which){ + case "first": + ds.load({params:{start: 0, limit: this.pageSize}}); + break; + case "prev": + ds.load({params:{start: Math.max(0, this.cursor-this.pageSize), limit: this.pageSize}}); + break; + case "next": + ds.load({params:{start: this.cursor+this.pageSize, limit: this.pageSize}}); + break; + case "last": + var total = ds.getTotalCount(); + var extra = total % this.pageSize; + var lastStart = extra ? (total - extra) : total-this.pageSize; + ds.load({params:{start: lastStart, limit: this.pageSize}}); + break; + case "refresh": + ds.load({params:{start: this.cursor, limit: this.pageSize}}); + break; + } + }, + + + unbind : function(ds){ + ds.un("beforeload", this.beforeLoad, this); + ds.un("load", this.onLoad, this); + ds.un("loadexception", this.onLoadError, this); + }, + + + bind : function(ds){ + ds.on("beforeload", this.beforeLoad, this); + ds.on("load", this.onLoad, this); + ds.on("loadexception", this.onLoadError, this); + } +}); + Ext.Resizable = function(el, config){ this.el = Ext.get(el); if(config && config.wrap){ config.resizeChild = this.el; this.el = this.el.wrap(typeof config.wrap == "object" ? config.wrap : {cls:"xresizable-wrap"}); 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: "x-resizable-proxy", id: this.el.id + "-rzproxy"}); this.proxy.unselectable(); this.proxy.enableDisplayMode('block'); Ext.apply(this, config); if(this.pinned){ this.disableTrackOver = true; this.el.addClass("x-resizable-pinned"); } var position = this.el.getStyle("position"); if(position != "absolute" && position != "fixed"){ 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 = 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 Ext.Resizable.Handle(this, pos, this.disableTrackOver, this.transparent); } } this.corner = this.southeast; if(this.handles.indexOf("n") != -1 || this.handles.indexOf("w") != -1){ this.updateBox = true; } this.activeHandle = null; if(this.resizeChild){ if(typeof this.resizeChild == "boolean"){ this.resizeChild = Ext.get(this.el.dom.firstChild, true); }else{ this.resizeChild = Ext.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.position("relative"); 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.addEvents({ "beforeresize" : true, "resize" : true }); if(this.width !== null && this.height !== null){ this.resizeTo(this.width, this.height); }else{ this.updateChildSize(); } if(Ext.isIE){ this.el.dom.style.zoom = 1; } Ext.Resizable.superclass.constructor.call(this); }; Ext.extend(Ext.Resizable, Ext.util.Observable, { 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 : 'easeOutStrong', widthIncrement : 0, heightIncrement : 0, pinned : false, width : null, height : null, preserveRatio : false, transparent: false, minX: 0, minY: 0, draggable: false, resizeTo : function(width, height){ this.el.setSize(width, height); this.updateChildSize(); this.fireEvent("resize", this, width, height, null); }, startSizing : function(e, handle){ this.fireEvent("beforeresize", this, e); if(this.enabled){ if(!this.overlay){ this.overlay = this.el.createProxy({tag: "div", cls: "x-resizable-overlay", html: " "}); this.overlay.unselectable(); this.overlay.enableDisplayMode("block"); this.overlay.on("mousemove", this.onMouseMove, this); this.overlay.on("mouseup", this.onMouseUp, this); } this.overlay.setStyle("cursor", handle.el.getStyle("cursor")); 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.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); this.overlay.show(); this.proxy.setStyle('visibility', 'hidden'); this.proxy.show(); this.proxy.setBox(this.startBox); if(!this.dynamic){ this.proxy.setStyle('visibility', 'visible'); } } }, onMouseDown : function(handle, e){ if(this.enabled){ e.stopEvent(); this.activeHandle = handle; this.startSizing(e, handle); } }, 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(Ext.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(); if(this.updateBox){ 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{ 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("x-resizable-over"); } }, handleOut : function(){ if(!this.resizing){ this.el.removeClass("x-resizable-over"); } }, getEl : function(){ return this.el; }, getResizeChild : function(){ return this.resizeChild; }, destroy : function(removeEl){ this.proxy.remove(); this.overlay.removeAllListeners(); this.overlay.remove(); var ps = Ext.Resizable.positions; for(var k in ps){ if(typeof ps[k] != "function" && this[ps[k]]){ var h = this[ps[k]]; h.el.removeAllListeners(); h.el.remove(); } } if(removeEl){ this.el.update(""); this.el.remove(); } } }); Ext.Resizable.positions = { n: "north", s: "south", e: "east", w: "west", se: "southeast", sw: "southwest", nw: "northwest", ne: "northeast" }; Ext.Resizable.Handle = function(rz, pos, disableTrackOver, transparent){ if(!this.tpl){ var tpl = Ext.DomHelper.createTemplate( {tag: "div", cls: "x-resizable-handle x-resizable-handle-{0}"} ); tpl.compile(); 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.on("mousedown", this.onMouseDown, this); if(!disableTrackOver){ this.el.on("mouseover", this.onMouseOver, this); this.el.on("mouseout", this.onMouseOut, this); } }; 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); } }; + +Ext.SplitBar = function(dragElement, resizingElement, orientation, placement, existingProxy){ + + + this.el = Ext.get(dragElement, true); + this.el.dom.unselectable = "on"; + + this.resizingEl = Ext.get(resizingElement, true); + + + this.orientation = orientation || Ext.SplitBar.HORIZONTAL; + + + this.minSize = 0; + + + this.maxSize = 2000; + + + this.animate = false; + + + this.useShim = false; + + + this.shim = null; + + if(!existingProxy){ + + this.proxy = Ext.SplitBar.createProxy(this.orientation); + }else{ + this.proxy = Ext.get(existingProxy).dom; + } + + this.dd = new Ext.dd.DDProxy(this.el.dom.id, "XSplitBars", {dragElId : this.proxy.id}); + + + this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this); + + + this.dd.endDrag = this.onEndProxyDrag.createDelegate(this); + + + this.dragSpecs = {}; + + + this.adapter = new Ext.SplitBar.BasicLayoutAdapter(); + this.adapter.init(this); + + if(this.orientation == Ext.SplitBar.HORIZONTAL){ + + this.placement = placement || (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT : Ext.SplitBar.RIGHT); + this.el.addClass("x-splitbar-h"); + }else{ + + this.placement = placement || (this.el.getY() > this.resizingEl.getY() ? Ext.SplitBar.TOP : Ext.SplitBar.BOTTOM); + this.el.addClass("x-splitbar-v"); + } + + this.addEvents({ + + "resize" : true, + + "moved" : true, + + "beforeresize" : true, + + "beforeapply" : true + }); + + Ext.SplitBar.superclass.constructor.call(this); +}; + +Ext.extend(Ext.SplitBar, Ext.util.Observable, { + onStartProxyDrag : function(x, y){ + this.fireEvent("beforeresize", this); + if(!this.overlay){ + var o = Ext.DomHelper.insertFirst(document.body, {cls: "x-drag-overlay", html: " "}, true); + o.unselectable(); + o.enableDisplayMode("block"); + + Ext.SplitBar.prototype.overlay = o; + } + this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); + this.overlay.show(); + Ext.get(this.proxy).setDisplayed("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 == Ext.SplitBar.HORIZONTAL){ + this.dd.resetConstraints(); + this.dd.setXConstraint( + this.placement == Ext.SplitBar.LEFT ? c1 : c2, + this.placement == Ext.SplitBar.LEFT ? c2 : c1 + ); + this.dd.setYConstraint(0, 0); + }else{ + this.dd.resetConstraints(); + this.dd.setXConstraint(0, 0); + this.dd.setYConstraint( + this.placement == Ext.SplitBar.TOP ? c1 : c2, + this.placement == Ext.SplitBar.TOP ? c2 : c1 + ); + } + this.dragSpecs.startSize = size; + this.dragSpecs.startPoint = [x, y]; + Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd, x, y); + }, + + + onEndProxyDrag : function(e){ + Ext.get(this.proxy).setDisplayed(false); + var endPoint = Ext.lib.Event.getXY(e); + if(this.overlay){ + this.overlay.hide(); + } + var newSize; + if(this.orientation == Ext.SplitBar.HORIZONTAL){ + newSize = this.dragSpecs.startSize + + (this.placement == Ext.SplitBar.LEFT ? + endPoint[0] - this.dragSpecs.startPoint[0] : + this.dragSpecs.startPoint[0] - endPoint[0] + ); + }else{ + newSize = this.dragSpecs.startSize + + (this.placement == 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){ + if(this.fireEvent('beforeapply', this, newSize) !== false){ + this.adapter.setElementSize(this, newSize); + this.fireEvent("moved", this, newSize); + this.fireEvent("resize", 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; + }, + + + destroy : function(removeEl){ + if(this.shim){ + this.shim.remove(); + } + this.dd.unreg(); + this.proxy.parentNode.removeChild(this.proxy); + if(removeEl){ + this.el.remove(); + } + } +}); + + +Ext.SplitBar.createProxy = function(dir){ + var proxy = new Ext.Element(document.createElement("div")); + proxy.unselectable(); + var cls = 'x-splitbar-proxy'; + proxy.addClass(cls + ' ' + (dir == Ext.SplitBar.HORIZONTAL ? cls +'-h' : cls + '-v')); + document.body.appendChild(proxy.dom); + return proxy.dom; +}; + + +Ext.SplitBar.BasicLayoutAdapter = function(){ +}; + +Ext.SplitBar.BasicLayoutAdapter.prototype = { + + init : function(s){ + + }, + + getElementSize : function(s){ + if(s.orientation == Ext.SplitBar.HORIZONTAL){ + return s.resizingEl.getWidth(); + }else{ + return s.resizingEl.getHeight(); + } + }, + + + setElementSize : function(s, newSize, onComplete){ + if(s.orientation == Ext.SplitBar.HORIZONTAL){ + if(!s.animate){ + s.resizingEl.setWidth(newSize); + if(onComplete){ + onComplete(s, newSize); + } + }else{ + s.resizingEl.setWidth(newSize, true, .1, onComplete, 'easeOut'); + } + }else{ + + if(!s.animate){ + s.resizingEl.setHeight(newSize); + if(onComplete){ + onComplete(s, newSize); + } + }else{ + s.resizingEl.setHeight(newSize, true, .1, onComplete, 'easeOut'); + } + } + } +}; + + +Ext.SplitBar.AbsoluteLayoutAdapter = function(container){ + this.basic = new Ext.SplitBar.BasicLayoutAdapter(); + this.container = Ext.get(container); +}; + +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 = 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; + } + } +}; + + +Ext.SplitBar.VERTICAL = 1; + + +Ext.SplitBar.HORIZONTAL = 2; + + +Ext.SplitBar.LEFT = 1; + + +Ext.SplitBar.RIGHT = 2; + + +Ext.SplitBar.TOP = 3; + + +Ext.SplitBar.BOTTOM = 4; + + +Ext.Editor = function(field, config){ + Ext.Editor.superclass.constructor.call(this, config); + this.field = field; + this.addEvents({ + + "beforestartedit" : true, + + "startedit" : true, + + "beforecomplete" : true, + + "complete" : true, + + "specialkey" : true + }); +}; + +Ext.extend(Ext.Editor, Ext.Component, { + + + + + value : "", + + alignment: "c-c?", + + shadow : "frame", + + updateEl : false, + + onRender : function(ct, position){ + this.el = new Ext.Layer({ + shadow: this.shadow, + cls: "x-editor", + parentEl : ct, + shim : this.shim, + shadowOffset:3, + id: this.id + }); + this.el.setStyle("overflow", Ext.isGecko ? "auto" : "hidden"); + this.field.render(this.el); + if(Ext.isGecko){ + this.field.el.dom.setAttribute('autocomplete', 'off'); + } + this.field.show(); + this.field.on("blur", this.onBlur, this); + this.relayEvents(this.field, ["specialkey"]); + if(this.field.grow){ + this.field.on("autosize", this.el.sync, this.el, {delay:1}); + } + }, + + startEdit : function(el, value){ + if(this.editing){ + this.completeEdit(); + } + this.boundEl = Ext.get(el); + var v = value !== undefined ? value : this.boundEl.dom.innerHTML; + if(!this.rendered){ + this.render(this.parentEl || document.body); + } + if(this.fireEvent("beforestartedit", this, this.boundEl, v) === false){ + return; + } + this.startValue = v; + this.field.setValue(v); + if(this.autoSize){ + var sz = this.boundEl.getSize(); + switch(this.autoSize){ + case "width": + this.setSize(sz.width, ""); + break; + case "height": + this.setSize("", sz.height); + break; + default: + this.setSize(sz.width, sz.height); + } + } + this.el.alignTo(this.boundEl, this.alignment); + this.editing = true; + if(Ext.QuickTips){ + Ext.QuickTips.disable(); + } + this.show(); + }, + + + setSize : function(w, h){ + this.field.setSize(w, h); + if(this.el){ + this.el.sync(); + } + }, + + + realign : function(){ + this.el.alignTo(this.boundEl, this.alignment); + }, + + + completeEdit : function(remainVisible){ + if(!this.editing){ + return; + } + var v = this.getValue(); + if(this.revertInvalid !== false && !this.field.isValid()){ + v = this.startValue; + this.cancelEdit(true); + } + if(String(v) == String(this.startValue) && this.ignoreNoChange){ + this.editing = false; + this.hide(); + return; + } + if(this.fireEvent("beforecomplete", this, v, this.startValue) !== false){ + this.editing = false; + if(this.updateEl && this.boundEl){ + this.boundEl.update(v); + } + if(remainVisible !== true){ + this.hide(); + } + this.fireEvent("complete", this, v, this.startValue); + } + }, + + onShow : function(){ + this.el.show(); + if(this.hideEl !== false){ + this.boundEl.hide(); + } + this.field.show(); + this.field.focus(); + this.fireEvent("startedit", this.boundEl, this.startValue); + }, + + + cancelEdit : function(remainVisible){ + if(this.editing){ + this.setValue(this.startValue); + if(remainVisible !== true){ + this.hide(); + } + } + }, + + onBlur : function(){ + if(this.allowBlur !== true && this.editing){ + this.completeEdit(); + } + }, + + onHide : function(){ + if(this.editing){ + this.completeEdit(); + return; + } + this.field.blur(); + if(this.field.collapse){ + this.field.collapse(); + } + this.el.hide(); + if(this.hideEl !== false){ + this.boundEl.show(); + } + if(Ext.QuickTips){ + Ext.QuickTips.enable(); + } + }, + + + setValue : function(v){ + this.field.setValue(v); + }, + + + getValue : function(){ + return this.field.getValue(); + } +}); + +Ext.BasicDialog = function(el, config){ + this.el = Ext.get(el); + var dh = Ext.DomHelper; + if(!this.el && config && config.autoCreate){ + if(typeof config.autoCreate == "object"){ + if(!config.autoCreate.id){ + config.autoCreate.id = el; + } + this.el = dh.append(document.body, + config.autoCreate, true); + }else{ + this.el = dh.append(document.body, + {tag: "div", id: el, style:'visibility:hidden;'}, true); + } + } + el = this.el; + el.setDisplayed(true); + el.hide = this.hideAction; + this.id = el.id; + el.addClass("x-dlg"); + + Ext.apply(this, config); + + this.proxy = el.createProxy("x-dlg-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); + } + + this.header = el.child("/.x-dlg-hd"); + + this.body = el.child("/.x-dlg-bd"); + + this.footer = el.child("/.x-dlg-ft"); + + if(!this.header){ + this.header = el.createChild({tag: "div", cls:"x-dlg-hd", html: " "}, this.body ? this.body.dom : null); + } + if(!this.body){ + this.body = el.createChild({tag: "div", cls:"x-dlg-bd"}); + } + + this.header.unselectable(); + if(this.title){ + this.header.update(this.title); + } + + this.focusEl = el.createChild({tag: "a", href:"#", cls:"x-dlg-focus", tabIndex:"-1"}); + this.focusEl.swallowEvent("click", true); + + this.header.wrap({cls:"x-dlg-hd-right"}).wrap({cls:"x-dlg-hd-left"}, true); + + + this.bwrap = this.body.wrap({tag: "div", cls:"x-dlg-dlg-body"}); + if(this.footer){ + this.bwrap.dom.appendChild(this.footer.dom); + } + + this.bg = this.el.createChild({ + tag: "div", cls:"x-dlg-bg", + html: '
       
      ' + }); + this.centerBg = this.bg.child("div.x-dlg-bg-center"); + + + if(this.autoScroll !== false && !this.autoTabs){ + this.body.setStyle("overflow", "auto"); + } + + this.toolbox = this.el.createChild({cls: "x-dlg-toolbox"}); + + if(this.closable !== false){ + this.el.addClass("x-dlg-closable"); + this.close = this.toolbox.createChild({cls:"x-dlg-close"}); + this.close.on("click", this.closeClick, this); + this.close.addClassOnOver("x-dlg-close-over"); + } + if(this.collapsible !== false){ + this.collapseBtn = this.toolbox.createChild({cls:"x-dlg-collapse"}); + this.collapseBtn.on("click", this.collapseClick, this); + this.collapseBtn.addClassOnOver("x-dlg-collapse-over"); + this.header.on("dblclick", this.collapseClick, this); + } + if(this.resizable !== false){ + this.el.addClass("x-dlg-resizable"); + this.resizer = new Ext.Resizable(el, { + minWidth: this.minWidth || 80, + minHeight:this.minHeight || 80, + handles: this.resizeHandles || "all", + pinned: true + }); + this.resizer.on("beforeresize", this.beforeResize, this); + this.resizer.on("resize", this.onResize, this); + } + if(this.draggable !== false){ + el.addClass("x-dlg-draggable"); + if (!this.proxyDrag) { + var dd = new Ext.dd.DD(el.dom.id, "WindowDrag"); + } + else { + var dd = new Ext.dd.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); + dd.scroll = false; + this.dd = dd; + } + if(this.modal){ + this.mask = dh.append(document.body, {tag: "div", cls:"x-dlg-mask"}, true); + this.mask.enableDisplayMode("block"); + this.mask.hide(); + this.el.addClass("x-dlg-modal"); + } + if(this.shadow){ + this.shadow = new Ext.Shadow({ + mode : typeof this.shadow == "string" ? this.shadow : "sides", + offset : this.shadowOffset + }); + }else{ + this.shadowOffset = 0; + } + if(Ext.useShims && this.shim !== false){ + this.shim = this.el.createShim(); + this.shim.hide = this.hideAction; + this.shim.hide(); + }else{ + this.shim = false; + } + if(this.autoTabs){ + this.initTabs(); + } + this.addEvents({ + + "keydown" : true, + + "move" : true, + + "resize" : true, + + "beforehide" : true, + + "hide" : true, + + "beforeshow" : true, + + "show" : true + }); + el.on("keydown", this.onKeyDown, this); + el.on("mousedown", this.toFront, this); + Ext.EventManager.onWindowResize(this.adjustViewport, this, true); + this.el.hide(); + Ext.DialogManager.register(this); + Ext.BasicDialog.superclass.constructor.call(this); +}; + +Ext.extend(Ext.BasicDialog, Ext.util.Observable, { + shadowOffset: 5, + minHeight: 80, + minWidth: 200, + minButtonWidth: 75, + defaultButton: null, + buttonAlign: "right", + tabTag: 'div', + firstShow: true, + + + setTitle : function(text){ + this.header.update(text); + return this; + }, + + + closeClick : function(){ + this.hide(); + }, + + + collapseClick : function(){ + this[this.collapsed ? "expand" : "collapse"](); + }, + + + collapse : function(){ + if(!this.collapsed){ + this.collapsed = true; + this.el.addClass("x-dlg-collapsed"); + this.restoreHeight = this.el.getHeight(); + this.resizeTo(this.el.getWidth(), this.header.getHeight()); + } + }, + + + expand : function(){ + if(this.collapsed){ + this.collapsed = false; + this.el.removeClass("x-dlg-collapsed"); + this.resizeTo(this.el.getWidth(), this.restoreHeight); + } + }, + + + initTabs : function(){ + var tabs = this.getTabs(); + while(tabs.getTab(0)){ + tabs.removeTab(0); + } + this.el.select(this.tabTag+'.x-dlg-tab').each(function(el){ + var dom = el.dom; + tabs.addTab(Ext.id(dom), dom.title); + dom.title = ""; + }); + tabs.activate(0); + return tabs; + }, + + + beforeResize : function(){ + this.resizer.minHeight = Math.max(this.minHeight, this.getHeaderFooterHeight(true)+40); + }, + + + onResize : function(){ + this.refreshSize(); + this.syncBodyHeight(); + this.adjustAssets(); + this.focus(); + this.fireEvent("resize", this, this.size.width, this.size.height); + }, + + + onKeyDown : function(e){ + if(this.isVisible()){ + 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(); + } + this.fireEvent("resize", this, width, height); + return this; + }, + + + + setContentSize : function(w, h){ + h += this.getHeaderFooterHeight() + this.body.getMargins("tb"); + w += this.body.getMargins("lr") + this.bwrap.getMargins("lr") + this.centerBg.getPadding("lr"); + + h += this.body.getPadding("tb") + this.bwrap.getBorderWidth("tb") + this.body.getBorderWidth("tb") + this.el.getBorderWidth("tb"); + w += this.body.getPadding("lr") + this.bwrap.getBorderWidth("lr") + this.body.getBorderWidth("lr") + this.bwrap.getPadding("lr") + this.el.getBorderWidth("lr"); + + if(this.tabs){ + h += this.tabs.stripWrap.getHeight() + this.tabs.bodyEl.getMargins("tb") + this.tabs.bodyEl.getPadding("tb"); + w += this.tabs.bodyEl.getMargins("lr") + this.tabs.bodyEl.getPadding("lr"); + } + this.resizeTo(w, h); + return this; + }, + + + addKeyListener : function(key, fn, scope){ + var keyCode, shift, ctrl, alt; + if(typeof key == "object" && !(key instanceof Array)){ + 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.el.addClass("x-dlg-auto-tabs"); + this.body.addClass(this.tabPosition == "bottom" ? "x-tabs-bottom" : "x-tabs-top"); + this.tabs = new Ext.TabPanel(this.body.dom, this.tabPosition == "bottom"); + } + return this.tabs; + }, + + + addButton : function(config, handler, scope){ + var dh = Ext.DomHelper; + if(!this.footer){ + this.footer = dh.append(this.bwrap, {tag: "div", cls:"x-dlg-ft"}, true); + } + if(!this.btnContainer){ + var tb = this.footer.createChild({ + tag:"div", + cls:"x-dlg-btns x-dlg-btns-"+this.buttonAlign, + html:'
      ' + }, null, true); + this.btnContainer = tb.firstChild.firstChild.firstChild; + } + var bconfig = { + handler: handler, + scope: scope, + minWidth: this.minButtonWidth, + hideParent:true + }; + if(typeof config == "string"){ + bconfig.text = config; + }else{ + if(config.tag){ + bconfig.dhconfig = config; + }else{ + Ext.apply(bconfig, config); + } + } + var btn = new Ext.Button( + this.btnContainer.appendChild(document.createElement("td")), + bconfig + ); + this.syncBodyHeight(); + if(!this.buttons){ + + this.buttons = []; + } + this.buttons.push(btn); + return btn; + }, + + + 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"); + height += this.centerBg.getPadding("tb"); + return height; + }, + + + syncBodyHeight : function(){ + var bd = this.body, cb = this.centerBg, bw = this.bwrap; + var height = this.size.height - this.getHeaderFooterHeight(false); + bd.setHeight(height-bd.getMargins("tb")); + var hh = this.header.getHeight(); + var h = this.size.height-hh; + cb.setHeight(h); + bw.setLeftTop(cb.getPadding("l"), hh+cb.getPadding("t")); + bw.setHeight(h-cb.getPadding("tb")); + bw.setWidth(this.el.getWidth(true)-cb.getPadding("lr")); + bd.setWidth(bw.getWidth(true)); + if(this.tabs){ + this.tabs.syncHeight(); + if(Ext.isIE){ + this.tabs.el.repaint(); + } + } + }, + + + restoreState : function(){ + var box = Ext.state.Manager.get(this.stateId || (this.el.id + "-state")); + if(box && box.width){ + this.xy = [box.x, box.y]; + this.resizeTo(box.width, box.height); + } + return this; + }, + + + beforeShow : function(){ + this.expand(); + if(this.fixedcenter){ + this.xy = this.el.getCenterXY(true); + } + if(this.modal){ + Ext.get(document.body).addClass("x-body-masked"); + this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); + this.mask.show(); + } + this.constrainXY(); + }, + + + animShow : function(){ + var b = Ext.get(this.animateTarget, true).getBox(); + this.proxy.setSize(b.width, b.height); + this.proxy.setLocation(b.x, b.y); + this.proxy.show(); + this.proxy.setBounds(this.xy[0], this.xy[1], this.size.width, this.size.height, + true, .35, this.showEl.createDelegate(this)); + }, + + + show : function(animateTarget){ + if (this.fireEvent("beforeshow", this) === false){ + return; + } + if(this.syncHeightBeforeShow){ + this.syncBodyHeight(); + }else if(this.firstShow){ + this.firstShow = false; + this.syncBodyHeight(); + } + this.animateTarget = animateTarget || this.animateTarget; + if(!this.el.isVisible()){ + this.beforeShow(); + if(this.animateTarget){ + this.animShow(); + }else{ + this.showEl(); + } + } + return this; + }, + + + showEl : function(){ + this.proxy.hide(); + this.el.setXY(this.xy); + this.el.show(); + this.adjustAssets(true); + this.toFront(); + this.focus(); + + if(Ext.isIE){ + this.el.repaint(); + } + this.fireEvent("show", this); + }, + + + focus : function(){ + if(this.defaultButton){ + this.defaultButton.focus(); + }else{ + this.focusEl.focus(); + } + }, + + + constrainXY : function(){ + if(this.constraintoviewport !== false){ + if(!this.viewSize){ + if(this.container){ + var s = this.container.getSize(); + this.viewSize = [s.width, s.height]; + }else{ + this.viewSize = [Ext.lib.Dom.getViewWidth(),Ext.lib.Dom.getViewHeight()]; + } + } + var s = Ext.get(this.container||document).getScroll(); + + 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+s.left){ + x = vw - w; + moved = true; + } + if(y + h > vh+s.top){ + y = vh - h; + moved = true; + } + + if(x < s.left){ + x = s.left; + moved = true; + } + if(y < s.top){ + y = s.top; + 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(this.el); + } + if(this.shim){ + this.shim.show(); + } + } + if(this.shadow && this.shadow.isVisible()){ + this.shadow.show(this.el); + } + if(this.shim && this.shim.isVisible()){ + this.shim.setBounds(x, y, w, h); + } + }, + + + adjustViewport : function(w, h){ + if(!w || !h){ + w = Ext.lib.Dom.getViewWidth(); + h = Ext.lib.Dom.getViewHeight(); + } + + this.viewSize = [w, h]; + if(this.modal && this.mask.isVisible()){ + this.mask.setSize(w, h); + this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); + } + if(this.isVisible()){ + this.constrainXY(); + } + }, + + + destroy : function(removeEl){ + if(this.isVisible()){ + this.animateTarget = null; + this.hide(); + } + Ext.EventManager.removeResizeListener(this.adjustViewport, this); + if(this.tabs){ + this.tabs.destroy(removeEl); + } + Ext.destroy( + this.shim, + this.proxy, + this.resizer, + this.close, + this.mask + ); + if(this.dd){ + this.dd.unreg(); + } + if(this.buttons){ + for(var i = 0, len = this.buttons.length; i < len; i++){ + this.buttons[i].destroy(); + } + } + this.el.removeAllListeners(); + if(removeEl === true){ + this.el.update(""); + this.el.remove(); + } + 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){ + Ext.dd.DD.prototype.endDrag.apply(this.dd, arguments); + }else{ + Ext.dd.DDProxy.prototype.endDrag.apply(this.dd, arguments); + this.proxy.hide(); + } + this.refreshSize(); + this.adjustAssets(); + this.focus(); + this.fireEvent("move", this, this.xy[0], this.xy[1]); + }, + + + toFront : function(){ + Ext.DialogManager.bringToFront(this); + return this; + }, + + + toBack : function(){ + Ext.DialogManager.sendToBack(this); + return this; + }, + + + center : function(){ + var xy = this.el.getCenterXY(true); + this.moveTo(xy[0], xy[1]); + return this; + }, + + + moveTo : function(x, y){ + this.xy = [x,y]; + if(this.isVisible()){ + this.el.setXY(this.xy); + this.adjustAssets(); + } + return this; + }, + + + alignTo : function(element, position, offsets){ + this.xy = this.el.getAlignToXY(element, position, offsets); + if(this.isVisible()){ + this.el.setXY(this.xy); + this.adjustAssets(); + } + return this; + }, + + + anchorTo : function(el, alignment, offsets, monitorScroll){ + var action = function(){ + this.alignTo(el, alignment, offsets); + }; + Ext.EventManager.onWindowResize(action, this); + var tm = typeof monitorScroll; + if(tm != 'undefined'){ + Ext.EventManager.on(window, 'scroll', action, this, + {buffer: tm == 'number' ? monitorScroll : 50}); + } + action.call(this); + return this; + }, + + + isVisible : function(){ + return this.el.isVisible(); + }, + + + animHide : function(callback){ + var b = Ext.get(this.animateTarget).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])); + }, + + + hide : function(callback){ + if (this.fireEvent("beforehide", this) === false){ + return; + } + if(this.shadow){ + this.shadow.hide(); + } + if(this.shim) { + this.shim.hide(); + } + if(this.animateTarget){ + this.animHide(callback); + }else{ + this.el.hide(); + this.hideEl(callback); + } + return this; + }, + + + hideEl : function(callback){ + this.proxy.hide(); + if(this.modal){ + this.mask.hide(); + Ext.get(document.body).removeClass("x-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(); + Ext.state.Manager.set(this.stateId || this.el.id + "-state", this.el.getBox()); + }, + + + + setZIndex : function(index){ + if(this.modal){ + this.mask.setStyle("z-index", index); + } + if(this.shim){ + this.shim.setStyle("z-index", ++index); + } + if(this.shadow){ + this.shadow.setZIndex(++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; + } +}); + + +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 = Ext.DialogManager.zseed; + for(var i = 0, len = accessList.length; i < len; i++){ + var dlg = accessList[i]; + if(dlg){ + dlg.setZIndex(seed + (i*10)); + } + } + }; + + return { + + zseed : 9000, + + + 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++){ + if(accessList[i] == dlg){ + 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; + }, + + + hideAll : function(){ + for(var id in list){ + if(list[id] && typeof list[id] != "function" && list[id].isVisible()){ + list[id].hide(); + } + } + } + }; +}(); + + +Ext.LayoutDialog = function(el, config){ + config.autoTabs = false; + Ext.LayoutDialog.superclass.constructor.call(this, el, config); + this.body.setStyle({overflow:"hidden", position:"relative"}); + this.layout = new Ext.BorderLayout(this.body.dom, config); + this.layout.monitorWindowResize = false; + this.el.addClass("x-dlg-auto-layout"); + + this.center = Ext.BasicDialog.prototype.center; + this.on("show", this.layout.layout, this.layout, true); +}; +Ext.extend(Ext.LayoutDialog, Ext.BasicDialog, { + + endUpdate : function(){ + this.layout.endUpdate(); + }, + + + beginUpdate : function(){ + this.layout.beginUpdate(); + }, + + + getLayout : function(){ + return this.layout; + }, + + showEl : function(){ + Ext.LayoutDialog.superclass.showEl.apply(this, arguments); + if(Ext.isIE7){ + this.layout.layout(); + } + }, + + + + syncBodyHeight : function(){ + Ext.LayoutDialog.superclass.syncBodyHeight.call(this); + if(this.layout){this.layout.layout();} + } +}); + +Ext.MessageBox = function(){ + var dlg, opt, mask, waitTimer; + var bodyEl, msgEl, textboxEl, textareaEl, progressEl, pp; + var buttons, activeTextEl, bwidth; + + + var handleButton = function(button){ + dlg.hide(); + Ext.callback(opt.fn, opt.scope||window, [button, activeTextEl.dom.value], 1); + }; + + + var handleHide = function(){ + if(opt && opt.cls){ + dlg.el.removeClass(opt.cls); + } + if(waitTimer){ + Ext.TaskMgr.stop(waitTimer); + waitTimer = null; + } + }; + + + var updateButtons = function(b){ + var width = 0; + if(!b){ + buttons["ok"].hide(); + buttons["cancel"].hide(); + buttons["yes"].hide(); + buttons["no"].hide(); + dlg.footer.dom.style.display = 'none'; + return width; + } + dlg.footer.dom.style.display = ''; + for(var k in buttons){ + if(typeof buttons[k] != "function"){ + if(b[k]){ + buttons[k].show(); + buttons[k].setText(typeof b[k] == "string" ? b[k] : Ext.MessageBox.buttonText[k]); + width += buttons[k].el.getWidth()+15; + }else{ + buttons[k].hide(); + } + } + } + return width; + }; + + + var handleEsc = function(d, k, e){ + if(opt && opt.closable !== false){ + dlg.hide(); + } + if(e){ + e.stopEvent(); + } + }; + + return { + + getDialog : function(){ + if(!dlg){ + dlg = new Ext.BasicDialog("x-msg-box", { + autoCreate : true, + shadow: true, + draggable: true, + resizable:false, + constraintoviewport:false, + fixedcenter:true, + collapsible : false, + shim:true, + modal: true, + width:400, height:100, + buttonAlign:"center", + closeClick : function(){ + if(opt && opt.buttons && opt.buttons.no && !opt.buttons.cancel){ + handleButton("no"); + }else{ + handleButton("cancel"); + } + } + }); + dlg.on("hide", handleHide); + mask = dlg.mask; + dlg.addKeyListener(27, handleEsc); + buttons = {}; + var bt = this.buttonText; + buttons["ok"] = dlg.addButton(bt["ok"], handleButton.createCallback("ok")); + buttons["yes"] = dlg.addButton(bt["yes"], handleButton.createCallback("yes")); + buttons["no"] = dlg.addButton(bt["no"], handleButton.createCallback("no")); + buttons["cancel"] = dlg.addButton(bt["cancel"], handleButton.createCallback("cancel")); + bodyEl = dlg.body.createChild({ + tag:"div", + html:'
       
      ' + }); + msgEl = bodyEl.dom.firstChild; + textboxEl = Ext.get(bodyEl.dom.childNodes[2]); + textboxEl.enableDisplayMode(); + textboxEl.addKeyListener([10,13], function(){ + if(dlg.isVisible() && opt && opt.buttons){ + if(opt.buttons.ok){ + handleButton("ok"); + }else if(opt.buttons.yes){ + handleButton("yes"); + } + } + }); + textareaEl = Ext.get(bodyEl.dom.childNodes[3]); + textareaEl.enableDisplayMode(); + progressEl = Ext.get(bodyEl.dom.childNodes[4]); + progressEl.enableDisplayMode(); + var pf = progressEl.dom.firstChild; + pp = Ext.get(pf.firstChild); + pp.setHeight(pf.offsetHeight); + } + return dlg; + }, + + + updateText : function(text){ + if(!dlg.isVisible() && !opt.width){ + dlg.resizeTo(this.maxWidth, 100); + } + msgEl.innerHTML = text || ' '; + var w = Math.max(Math.min(opt.width || msgEl.offsetWidth, this.maxWidth), + Math.max(opt.minWidth || this.minWidth, bwidth)); + if(opt.prompt){ + activeTextEl.setWidth(w); + } + if(dlg.isVisible()){ + dlg.fixedcenter = false; + } + dlg.setContentSize(w, bodyEl.getHeight()); + if(dlg.isVisible()){ + dlg.fixedcenter = true; + } + return this; + }, + + + updateProgress : function(value, text){ + if(text){ + this.updateText(text); + } + pp.setWidth(Math.floor(value*progressEl.dom.firstChild.offsetWidth)); + return this; + }, + + + isVisible : function(){ + return dlg && dlg.isVisible(); + }, + + + hide : function(){ + if(this.isVisible()){ + dlg.hide(); + } + }, + + + show : function(options){ + if(this.isVisible()){ + this.hide(); + } + var d = this.getDialog(); + opt = options; + d.setTitle(opt.title || " "); + d.close.setDisplayed(opt.closable !== false); + activeTextEl = textboxEl; + opt.prompt = opt.prompt || (opt.multiline ? true : false); + if(opt.prompt){ + if(opt.multiline){ + textboxEl.hide(); + textareaEl.show(); + textareaEl.setHeight(typeof opt.multiline == "number" ? + opt.multiline : this.defaultTextHeight); + activeTextEl = textareaEl; + }else{ + textboxEl.show(); + textareaEl.hide(); + } + }else{ + textboxEl.hide(); + textareaEl.hide(); + } + progressEl.setDisplayed(opt.progress === true); + this.updateProgress(0); + activeTextEl.dom.value = opt.value || ""; + if(opt.prompt){ + dlg.setDefaultButton(activeTextEl); + }else{ + var bs = opt.buttons; + var db = null; + if(bs && bs.ok){ + db = buttons["ok"]; + }else if(bs && bs.yes){ + db = buttons["yes"]; + } + dlg.setDefaultButton(db); + } + bwidth = updateButtons(opt.buttons); + this.updateText(opt.msg); + if(opt.cls){ + d.el.addClass(opt.cls); + } + d.proxyDrag = opt.proxyDrag === true; + d.modal = opt.modal !== false; + d.mask = opt.modal !== false ? mask : false; + if(!d.isVisible()){ + + document.body.appendChild(dlg.el.dom); + d.animateTarget = null; + d.show(options.animEl); + } + return this; + }, + + + progress : function(title, msg){ + this.show({ + title : title, + msg : msg, + buttons: false, + progress:true, + closable:false, + minWidth: this.minProgressWidth + }); + return this; + }, + + + alert : function(title, msg, fn, scope){ + this.show({ + title : title, + msg : msg, + buttons: this.OK, + fn: fn, + scope : scope + }); + return this; + }, + + + wait : function(msg, title){ + this.show({ + title : title, + msg : msg, + buttons: false, + closable:false, + progress:true, + modal:true, + width:300, + wait:true + }); + waitTimer = Ext.TaskMgr.start({ + run: function(i){ + Ext.MessageBox.updateProgress(((((i+20)%20)+1)*5)*.01); + }, + interval: 1000 + }); + return this; + }, + + + confirm : function(title, msg, fn, scope){ + this.show({ + title : title, + msg : msg, + buttons: this.YESNO, + fn: fn, + scope : scope + }); + return this; + }, + + + prompt : function(title, msg, fn, scope, multiline){ + this.show({ + title : title, + msg : msg, + buttons: this.OKCANCEL, + fn: fn, + minWidth:250, + scope : scope, + prompt:true, + multiline: multiline + }); + return this; + }, + + + OK : {ok:true}, + + YESNO : {yes:true, no:true}, + + OKCANCEL : {ok:true, cancel:true}, + + YESNOCANCEL : {yes:true, no:true, cancel:true}, + + + defaultTextHeight : 75, + + maxWidth : 600, + + minWidth : 100, + + minProgressWidth : 250, + + buttonText : { + ok : "OK", + cancel : "Cancel", + yes : "Yes", + no : "No" + } + }; +}(); + + +Ext.Msg = Ext.MessageBox; + +Ext.QuickTips = function(){ + var el, tipBody, tipBodyText, tipTitle, tm, cfg, close, tagEls = {}, esc, removeCls = null, bdLeft, bdRight; + var ce, bd, xy, dd; + var visible = false, disabled = true, inited = false; + var showProc = 1, hideProc = 1, dismissProc = 1, locks = []; + + var onOver = function(e){ + if(disabled){ + return; + } + var t = e.getTarget(); + if(!t || t.nodeType !== 1 || t == document || t == document.body){ + return; + } + if(ce && t == ce.el){ + clearTimeout(hideProc); + return; + } + if(t && tagEls[t.id]){ + tagEls[t.id].el = t; + showProc = show.defer(tm.showDelay, tm, [tagEls[t.id]]); + return; + } + var ttp, et = Ext.fly(t); + var ns = cfg.namespace; + if(tm.interceptTitles && t.title){ + ttp = t.title; + t.qtip = ttp; + t.removeAttribute("title"); + e.preventDefault(); + }else{ + ttp = t.qtip || et.getAttributeNS(ns, cfg.attribute); + } + if(ttp){ + showProc = show.defer(tm.showDelay, tm, [{ + el: t, + text: ttp, + width: et.getAttributeNS(ns, cfg.width), + autoHide: et.getAttributeNS(ns, cfg.hide) != "user", + title: et.getAttributeNS(ns, cfg.title), + cls: et.getAttributeNS(ns, cfg.cls) + }]); + } + }; + + var onOut = function(e){ + clearTimeout(showProc); + var t = e.getTarget(); + if(t && ce && ce.el == t && (tm.autoHide && ce.autoHide !== false)){ + hideProc = setTimeout(hide, tm.hideDelay); + } + }; + + var onMove = function(e){ + if(disabled){ + return; + } + xy = e.getXY(); + xy[1] += 18; + if(tm.trackMouse && ce){ + el.setXY(xy); + } + }; + + var onDown = function(e){ + clearTimeout(showProc); + clearTimeout(hideProc); + if(!e.within(el)){ + if(tm.hideOnClick){ + hide(); + tm.disable(); + } + } + }; + + var onUp = function(e){ + tm.enable(); + }; + + var getPad = function(){ + return bdLeft.getPadding('l')+bdRight.getPadding('r'); + }; + + var show = function(o){ + if(disabled){ + return; + } + clearTimeout(dismissProc); + ce = o; + if(removeCls){ + el.removeClass(removeCls); + removeCls = null; + } + if(ce.cls){ + el.addClass(ce.cls); + removeCls = ce.cls; + } + if(ce.title){ + tipTitle.update(ce.title); + tipTitle.show(); + }else{ + tipTitle.update(''); + tipTitle.hide(); + } + el.dom.style.width = tm.maxWidth+'px'; + + tipBodyText.update(o.text); + var p = getPad(), w = ce.width; + if(!w){ + var td = tipBodyText.dom; + var aw = Math.max(td.offsetWidth, td.clientWidth, td.scrollWidth); + if(aw > tm.maxWidth){ + w = tm.maxWidth; + }else if(aw < tm.minWidth){ + w = tm.minWidth; + }else{ + w = aw; + } + } + + el.setWidth(parseInt(w, 10) + p); + if(!ce.autoHide){ + close.setDisplayed(true); + if(dd){ + dd.unlock(); + } + }else{ + close.setDisplayed(false); + if(dd){ + dd.lock(); + } + } + if(xy){ + el.avoidY = xy[1]-18; + el.setXY(xy); + } + if(tm.animate){ + el.setOpacity(.1); + el.setStyle("visibility", "visible"); + el.fadeIn({callback: afterShow}); + }else{ + afterShow(); + } + }; + + var afterShow = function(){ + if(ce){ + el.show(); + esc.enable(); + if(tm.autoDismiss && ce.autoHide !== false){ + dismissProc = setTimeout(hide, tm.autoDismissDelay); + } + } + }; + + var hide = function(noanim){ + clearTimeout(dismissProc); + clearTimeout(hideProc); + ce = null; + if(el.isVisible()){ + esc.disable(); + if(noanim !== true && tm.animate){ + el.fadeOut({callback: afterHide}); + }else{ + afterHide(); + } + } + }; + + var afterHide = function(){ + el.hide(); + if(removeCls){ + el.removeClass(removeCls); + removeCls = null; + } + }; + + return { + + minWidth : 40, + + maxWidth : 300, + + interceptTitles : false, + + trackMouse : false, + + hideOnClick : true, + + showDelay : 500, + + hideDelay : 200, + + autoHide : true, + + autoDismiss : true, + + autoDismissDelay : 5000, + + animate : false, + + + init : function(){ + tm = Ext.QuickTips; + cfg = tm.tagConfig; + if(!inited){ + el = new Ext.Layer({cls:"x-tip", shadow:"drop", shim: true, constrain:true, shadowOffset:3}); + el.fxDefaults = {stopFx: true}; + + el.update('

      '); + tipTitle = el.child('h3'); + tipTitle.enableDisplayMode("block"); + tipBody = el.child('div.x-tip-bd'); + tipBodyText = el.child('div.x-tip-bd-inner'); + bdLeft = el.child('div.x-tip-bd-left'); + bdRight = el.child('div.x-tip-bd-right'); + close = el.child('div.x-tip-close'); + close.enableDisplayMode("block"); + close.on("click", hide); + d = Ext.get(document); + d.on("mousedown", onDown); + d.on("mouseup", onUp); + d.on("mouseover", onOver); + d.on("mouseout", onOut); + d.on("mousemove", onMove); + esc = d.addKeyListener(27, hide); + esc.disable(); + if(Ext.dd.DD){ + dd = el.initDD("default", null, { + onDrag : function(){ + el.sync(); + } + }); + dd.setHandleElId(tipTitle.id); + dd.lock(); + } + inited = true; + } + this.enable(); + }, + + + register : function(config){ + var cs = config instanceof Array ? config : arguments; + for(var i = 0, len = cs.length; i < len; i++) { + var c = cs[i]; + var target = c.target; + if(target){ + if(target instanceof Array){ + for(var j = 0, jlen = target.length; j < jlen; j++){ + tagEls[target[j]] = c; + } + }else{ + tagEls[typeof target == 'string' ? target : Ext.id(target.id)] = c; + } + } + } + }, + + + unregister : function(el){ + delete tagEls[Ext.id(el)]; + }, + + + enable : function(){ + if(inited){ + locks.pop(); + if(locks.length < 1){ + disabled = false; + } + } + }, + + + disable : function(){ + disabled = true; + clearTimeout(showProc); + clearTimeout(hideProc); + clearTimeout(dismissProc); + if(ce){ + hide(true); + } + locks.push(1); + }, + + + isEnabled : function(){ + return !disabled; + }, + + + tagConfig : { + namespace : "ext", + attribute : "qtip", + width : "width", + target : "target", + title : "qtitle", + hide : "hide", + cls : "qclass" + } + }; +}(); + + +Ext.QuickTips.tips = Ext.QuickTips.register; + +Ext.tree.TreePanel = function(el, config){ + Ext.tree.TreePanel.superclass.constructor.call(this); + this.el = Ext.get(el); + this.el.addClass('x-tree'); + + this.id = this.el.id; + Ext.apply(this, config); + this.addEvents({ + + "beforeload" : true, + + "load" : true, + + "textchange" : true, + + "beforeexpand" : true, + + "beforecollapse" : true, + + "expand" : true, + + "disabledchange" : true, + + "collapse" : true, + + "beforeclick":true, + + "click":true, + + "dblclick":true, + + "contextmenu":true, + + "beforechildrenrendered":true, + + "startdrag" : true, + + "enddrag" : true, + + "dragdrop" : true, + + "beforenodedrop" : true, + + "nodedrop" : true, + + "nodedragover" : true + }); + if(this.singleExpand){ + this.on("beforeexpand", this.restrictExpand, this); + } +}; +Ext.extend(Ext.tree.TreePanel, Ext.data.Tree, { + rootVisible : true, + animate: Ext.enableFx, + lines : true, + enableDD : false, + hlDrop : Ext.enableFx, + + + restrictExpand : function(node){ + var p = node.parentNode; + if(p){ + if(p.expandedChild && p.expandedChild.parentNode == p){ + p.expandedChild.collapse(); + } + p.expandedChild = node; + } + }, + + + setRootNode : function(node){ + Ext.tree.TreePanel.superclass.setRootNode.call(this, node); + if(!this.rootVisible){ + node.ui = new Ext.tree.RootTreeNodeUI(node); + } + return node; + }, + + + getEl : function(){ + return this.el; + }, + + + getLoader : function(){ + return this.loader; + }, + + + expandAll : function(){ + this.root.expand(true); + }, + + + collapseAll : function(){ + this.root.collapse(true); + }, + + + getSelectionModel : function(){ + if(!this.selModel){ + this.selModel = new Ext.tree.DefaultSelectionModel(); + } + return this.selModel; + }, + + + expandPath : function(path, attr, callback){ + attr = attr || "id"; + var keys = path.split(this.pathSeparator); + var curNode = this.root; + if(curNode.attributes[attr] != keys[1]){ + if(callback){ + callback(false, null); + } + return; + } + var index = 1; + var f = function(){ + if(++index == keys.length){ + if(callback){ + callback(true, curNode); + } + return; + } + var c = curNode.findChild(attr, keys[index]); + if(!c){ + if(callback){ + callback(false, curNode); + } + return; + } + curNode = c; + c.expand(false, false, f); + }; + curNode.expand(false, false, f); + }, + + + selectPath : function(path, attr, callback){ + attr = attr || "id"; + var keys = path.split(this.pathSeparator); + var v = keys.pop(); + if(keys.length > 0){ + var f = function(success, node){ + if(success && node){ + var n = node.findChild(attr, v); + if(n){ + n.select(); + if(callback){ + callback(true, n); + } + } + }else{ + if(callback){ + callback(false, n); + } + } + }; + this.expandPath(keys.join(this.pathSeparator), attr, f); + }else{ + this.root.select(); + if(callback){ + callback(true, this.root); + } + } + }, + + + render : function(){ + this.container = this.el.createChild({tag:"ul", + cls:"x-tree-root-ct " + + (this.lines ? "x-tree-lines" : "x-tree-no-lines")}); + + if(this.containerScroll){ + Ext.dd.ScrollManager.register(this.el); + } + if((this.enableDD || this.enableDrop) && !this.dropZone){ + + this.dropZone = new Ext.tree.TreeDropZone(this, this.dropConfig || { + ddGroup: this.ddGroup || "TreeDD", appendOnly: this.ddAppendOnly === true + }); + } + if((this.enableDD || this.enableDrag) && !this.dragZone){ + + this.dragZone = new Ext.tree.TreeDragZone(this, this.dragConfig || { + ddGroup: this.ddGroup || "TreeDD", + scroll: this.ddScroll + }); + } + this.getSelectionModel().init(this); + this.root.render(); + if(!this.rootVisible){ + this.root.renderChildren(); + } + return this; + } +}); + +Ext.tree.DefaultSelectionModel = function(){ + this.selNode = null; + + this.addEvents({ + + "selectionchange" : true, + + + "beforeselect" : true + }); +}; + +Ext.extend(Ext.tree.DefaultSelectionModel, Ext.util.Observable, { + init : function(tree){ + this.tree = tree; + tree.el.on("keydown", this.onKeyDown, this); + tree.on("click", this.onNodeClick, this); + }, + + onNodeClick : function(node, e){ + this.select(node); + }, + + + select : function(node){ + var last = this.selNode; + if(last != node && this.fireEvent('beforeselect', this, node, last) !== false){ + if(last){ + last.ui.onSelectedChange(false); + } + this.selNode = node; + node.ui.onSelectedChange(true); + this.fireEvent("selectionchange", this, node, last); + } + return node; + }, + + + unselect : function(node){ + if(this.selNode == node){ + this.clearSelections(); + } + }, + + + clearSelections : function(){ + var n = this.selNode; + if(n){ + n.ui.onSelectedChange(false); + this.selNode = null; + this.fireEvent("selectionchange", this, null); + } + return n; + }, + + + getSelectedNode : function(){ + return this.selNode; + }, + + + isSelected : function(node){ + return this.selNode == node; + }, + + + selectPrevious : function(){ + var s = this.selNode || this.lastSelNode; + if(!s){ + return null; + } + var ps = s.previousSibling; + if(ps){ + if(!ps.isExpanded() || ps.childNodes.length < 1){ + return this.select(ps); + } else{ + var lc = ps.lastChild; + while(lc && lc.isExpanded() && lc.childNodes.length > 0){ + lc = lc.lastChild; + } + return this.select(lc); + } + } else if(s.parentNode && (this.tree.rootVisible || !s.parentNode.isRoot)){ + return this.select(s.parentNode); + } + return null; + }, + + + selectNext : function(){ + var s = this.selNode || this.lastSelNode; + if(!s){ + return null; + } + if(s.firstChild && s.isExpanded()){ + return this.select(s.firstChild); + }else if(s.nextSibling){ + return this.select(s.nextSibling); + }else if(s.parentNode){ + var newS = null; + s.parentNode.bubble(function(){ + if(this.nextSibling){ + newS = this.getOwnerTree().selModel.select(this.nextSibling); + return false; + } + }); + return newS; + } + return null; + }, + + onKeyDown : function(e){ + var s = this.selNode || this.lastSelNode; + + var sm = this; + if(!s){ + return; + } + var k = e.getKey(); + switch(k){ + case e.DOWN: + e.stopEvent(); + this.selectNext(); + break; + case e.UP: + e.stopEvent(); + this.selectPrevious(); + break; + case e.RIGHT: + e.preventDefault(); + if(s.hasChildNodes()){ + if(!s.isExpanded()){ + s.expand(); + }else if(s.firstChild){ + this.select(s.firstChild, e); + } + } + break; + case e.LEFT: + e.preventDefault(); + if(s.hasChildNodes() && s.isExpanded()){ + s.collapse(); + }else if(s.parentNode && (this.tree.rootVisible || s.parentNode != this.tree.getRootNode())){ + this.select(s.parentNode, e); + } + break; + }; + } +}); + + +Ext.tree.MultiSelectionModel = function(){ + this.selNodes = []; + this.selMap = {}; + this.addEvents({ + + "selectionchange" : true + }); +}; + +Ext.extend(Ext.tree.MultiSelectionModel, Ext.util.Observable, { + init : function(tree){ + this.tree = tree; + tree.el.on("keydown", this.onKeyDown, this); + tree.on("click", this.onNodeClick, this); + }, + + onNodeClick : function(node, e){ + this.select(node, e, e.ctrlKey); + }, + + + select : function(node, e, keepExisting){ + if(keepExisting !== true){ + this.clearSelections(true); + } + if(this.isSelected(node)){ + this.lastSelNode = node; + return node; + } + this.selNodes.push(node); + this.selMap[node.id] = node; + this.lastSelNode = node; + node.ui.onSelectedChange(true); + this.fireEvent("selectionchange", this, this.selNodes); + return node; + }, + + + unselect : function(node){ + if(this.selMap[node.id]){ + node.ui.onSelectedChange(false); + var sn = this.selNodes; + var index = -1; + if(sn.indexOf){ + index = sn.indexOf(node); + }else{ + for(var i = 0, len = sn.length; i < len; i++){ + if(sn[i] == node){ + index = i; + break; + } + } + } + if(index != -1){ + this.selNodes.splice(index, 1); + } + delete this.selMap[node.id]; + this.fireEvent("selectionchange", this, this.selNodes); + } + }, + + + clearSelections : function(suppressEvent){ + var sn = this.selNodes; + if(sn.length > 0){ + for(var i = 0, len = sn.length; i < len; i++){ + sn[i].ui.onSelectedChange(false); + } + this.selNodes = []; + this.selMap = {}; + if(suppressEvent !== true){ + this.fireEvent("selectionchange", this, this.selNodes); + } + } + }, + + + isSelected : function(node){ + return this.selMap[node.id] ? true : false; + }, + + + getSelectedNodes : function(){ + return this.selNodes; + }, + + onKeyDown : Ext.tree.DefaultSelectionModel.prototype.onKeyDown, + + selectNext : Ext.tree.DefaultSelectionModel.prototype.selectNext, + + selectPrevious : Ext.tree.DefaultSelectionModel.prototype.selectPrevious +}); + +Ext.tree.TreeNode = function(attributes){ + attributes = attributes || {}; + if(typeof attributes == "string"){ + attributes = {text: attributes}; + } + this.childrenRendered = false; + this.rendered = false; + Ext.tree.TreeNode.superclass.constructor.call(this, attributes); + this.expanded = attributes.expanded === true; + this.isTarget = attributes.isTarget !== false; + this.draggable = attributes.draggable !== false && attributes.allowDrag !== false; + this.allowChildren = attributes.allowChildren !== false && attributes.allowDrop !== false; + + + this.text = attributes.text; + + this.disabled = attributes.disabled === true; + + this.addEvents({ + + "textchange" : true, + + "beforeexpand" : true, + + "beforecollapse" : true, + + "expand" : true, + + "disabledchange" : true, + + "collapse" : true, + + "beforeclick":true, + + "click":true, + + "dblclick":true, + + "contextmenu":true, + + "beforechildrenrendered":true + }); + + var uiClass = this.attributes.uiProvider || Ext.tree.TreeNodeUI; + + + this.ui = new uiClass(this); +}; +Ext.extend(Ext.tree.TreeNode, Ext.data.Node, { + preventHScroll: true, + + + isExpanded : function(){ + return this.expanded; + }, + + + getUI : function(){ + return this.ui; + }, + + + setFirstChild : function(node){ + var of = this.firstChild; + Ext.tree.TreeNode.superclass.setFirstChild.call(this, node); + if(this.childrenRendered && of && node != of){ + of.renderIndent(true, true); + } + if(this.rendered){ + this.renderIndent(true, true); + } + }, + + + setLastChild : function(node){ + var ol = this.lastChild; + Ext.tree.TreeNode.superclass.setLastChild.call(this, node); + if(this.childrenRendered && ol && node != ol){ + ol.renderIndent(true, true); + } + if(this.rendered){ + this.renderIndent(true, true); + } + }, + + + + appendChild : function(){ + var node = Ext.tree.TreeNode.superclass.appendChild.apply(this, arguments); + if(node && this.childrenRendered){ + node.render(); + } + this.ui.updateExpandIcon(); + return node; + }, + + + removeChild : function(node){ + this.ownerTree.getSelectionModel().unselect(node); + Ext.tree.TreeNode.superclass.removeChild.apply(this, arguments); + + if(this.childrenRendered){ + node.ui.remove(); + } + if(this.childNodes.length < 1){ + this.collapse(false, false); + }else{ + this.ui.updateExpandIcon(); + } + return node; + }, + + + insertBefore : function(node, refNode){ + var newNode = Ext.tree.TreeNode.superclass.insertBefore.apply(this, arguments); + if(newNode && refNode && this.childrenRendered){ + node.render(); + } + this.ui.updateExpandIcon(); + return newNode; + }, + + + setText : function(text){ + var oldText = this.text; + this.text = text; + this.attributes.text = text; + if(this.rendered){ + this.ui.onTextChange(this, text, oldText); + } + this.fireEvent("textchange", this, text, oldText); + }, + + + select : function(){ + this.getOwnerTree().getSelectionModel().select(this); + }, + + + unselect : function(){ + this.getOwnerTree().getSelectionModel().unselect(this); + }, + + + isSelected : function(){ + return this.getOwnerTree().getSelectionModel().isSelected(this); + }, + + + expand : function(deep, anim, callback){ + if(!this.expanded){ + if(this.fireEvent("beforeexpand", this, deep, anim) === false){ + return; + } + if(!this.childrenRendered){ + this.renderChildren(); + } + this.expanded = true; + if(!this.isHiddenRoot() && (this.getOwnerTree().animate && anim !== false) || anim){ + this.ui.animExpand(function(){ + this.fireEvent("expand", this); + if(typeof callback == "function"){ + callback(this); + } + if(deep === true){ + this.expandChildNodes(true); + } + }.createDelegate(this)); + return; + }else{ + this.ui.expand(); + this.fireEvent("expand", this); + if(typeof callback == "function"){ + callback(this); + } + } + }else{ + if(typeof callback == "function"){ + callback(this); + } + } + if(deep === true){ + this.expandChildNodes(true); + } + }, + + isHiddenRoot : function(){ + return this.isRoot && !this.getOwnerTree().rootVisible; + }, + + + collapse : function(deep, anim){ + if(this.expanded && !this.isHiddenRoot()){ + if(this.fireEvent("beforecollapse", this, deep, anim) === false){ + return; + } + this.expanded = false; + if((this.getOwnerTree().animate && anim !== false) || anim){ + this.ui.animCollapse(function(){ + this.fireEvent("collapse", this); + if(deep === true){ + this.collapseChildNodes(true); + } + }.createDelegate(this)); + return; + }else{ + this.ui.collapse(); + this.fireEvent("collapse", this); + } + } + if(deep === true){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + cs[i].collapse(true); + } + } + }, + + + delayedExpand : function(delay){ + if(!this.expandProcId){ + this.expandProcId = this.expand.defer(delay, this); + } + }, + + + cancelExpand : function(){ + if(this.expandProcId){ + clearTimeout(this.expandProcId); + } + this.expandProcId = false; + }, + + + toggle : function(){ + if(this.expanded){ + this.collapse(); + }else{ + this.expand(); + } + }, + + + ensureVisible : function(callback){ + var tree = this.getOwnerTree(); + tree.expandPath(this.getPath(), false, function(){ + tree.getEl().scrollChildIntoView(this.ui.anchor); + Ext.callback(callback); + }.createDelegate(this)); + }, + + + expandChildNodes : function(deep){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + cs[i].expand(deep); + } + }, + + + collapseChildNodes : function(deep){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + cs[i].collapse(deep); + } + }, + + + disable : function(){ + this.disabled = true; + this.unselect(); + if(this.rendered && this.ui.onDisableChange){ + this.ui.onDisableChange(this, true); + } + this.fireEvent("disabledchange", this, true); + }, + + + enable : function(){ + this.disabled = false; + if(this.rendered && this.ui.onDisableChange){ + this.ui.onDisableChange(this, false); + } + this.fireEvent("disabledchange", this, false); + }, + + + renderChildren : function(suppressEvent){ + if(suppressEvent !== false){ + this.fireEvent("beforechildrenrendered", this); + } + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++){ + cs[i].render(true); + } + this.childrenRendered = true; + }, + + + sort : function(fn, scope){ + Ext.tree.TreeNode.superclass.sort.apply(this, arguments); + if(this.childrenRendered){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++){ + cs[i].render(true); + } + } + }, + + + render : function(bulkRender){ + this.ui.render(bulkRender); + if(!this.rendered){ + this.rendered = true; + if(this.expanded){ + this.expanded = false; + this.expand(false, false); + } + } + }, + + + renderIndent : function(deep, refresh){ + if(refresh){ + this.ui.childIndent = null; + } + this.ui.renderIndent(); + if(deep === true && this.childrenRendered){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++){ + cs[i].renderIndent(true, refresh); + } + } + } +}); + + Ext.tree.AsyncTreeNode = function(config){ + this.loaded = false; + this.loading = false; + Ext.tree.AsyncTreeNode.superclass.constructor.apply(this, arguments); + + this.addEvents({'beforeload':true, 'load': true}); + + +}; +Ext.extend(Ext.tree.AsyncTreeNode, Ext.tree.TreeNode, { + expand : function(deep, anim, callback){ + if(this.loading){ + var timer; + var f = function(){ + if(!this.loading){ + clearInterval(timer); + this.expand(deep, anim, callback); + } + }.createDelegate(this); + timer = setInterval(f, 200); + return; + } + if(!this.loaded){ + if(this.fireEvent("beforeload", this) === false){ + return; + } + this.loading = true; + this.ui.beforeLoad(this); + var loader = this.loader || this.attributes.loader || this.getOwnerTree().getLoader(); + if(loader){ + loader.load(this, this.loadComplete.createDelegate(this, [deep, anim, callback])); + return; + } + } + Ext.tree.AsyncTreeNode.superclass.expand.call(this, deep, anim, callback); + }, + + + isLoading : function(){ + return this.loading; + }, + + loadComplete : function(deep, anim, callback){ + this.loading = false; + this.loaded = true; + this.ui.afterLoad(this); + this.fireEvent("load", this); + this.expand(deep, anim, callback); + }, + + + isLoaded : function(){ + return this.loaded; + }, + + hasChildNodes : function(){ + if(!this.isLeaf() && !this.loaded){ + return true; + }else{ + return Ext.tree.AsyncTreeNode.superclass.hasChildNodes.call(this); + } + }, + + + reload : function(callback){ + this.collapse(false, false); + while(this.firstChild){ + this.removeChild(this.firstChild); + } + this.childrenRendered = false; + this.loaded = false; + if(this.isHiddenRoot()){ + this.expanded = false; + } + this.expand(false, false, callback); + } +}); + +Ext.tree.TreeNodeUI = function(node){ + this.node = node; + this.rendered = false; + this.animating = false; + this.emptyIcon = Ext.BLANK_IMAGE_URL; +}; + +Ext.tree.TreeNodeUI.prototype = { + removeChild : function(node){ + if(this.rendered){ + this.ctNode.removeChild(node.ui.getEl()); + } + }, + + beforeLoad : function(){ + this.addClass("x-tree-node-loading"); + }, + + afterLoad : function(){ + this.removeClass("x-tree-node-loading"); + }, + + onTextChange : function(node, text, oldText){ + if(this.rendered){ + this.textNode.innerHTML = text; + } + }, + + onDisableChange : function(node, state){ + this.disabled = state; + if(state){ + this.addClass("x-tree-node-disabled"); + }else{ + this.removeClass("x-tree-node-disabled"); + } + }, + + onSelectedChange : function(state){ + if(state){ + this.focus(); + this.addClass("x-tree-selected"); + }else{ + + this.removeClass("x-tree-selected"); + } + }, + + onMove : function(tree, node, oldParent, newParent, index, refNode){ + this.childIndent = null; + if(this.rendered){ + var targetNode = newParent.ui.getContainer(); + if(!targetNode){ + this.holder = document.createElement("div"); + this.holder.appendChild(this.wrap); + return; + } + var insertBefore = refNode ? refNode.ui.getEl() : null; + if(insertBefore){ + targetNode.insertBefore(this.wrap, insertBefore); + }else{ + targetNode.appendChild(this.wrap); + } + this.node.renderIndent(true); + } + }, + + addClass : function(cls){ + if(this.elNode){ + Ext.fly(this.elNode).addClass(cls); + } + }, + + removeClass : function(cls){ + if(this.elNode){ + Ext.fly(this.elNode).removeClass(cls); + } + }, + + remove : function(){ + if(this.rendered){ + this.holder = document.createElement("div"); + this.holder.appendChild(this.wrap); + } + }, + + fireEvent : function(){ + return this.node.fireEvent.apply(this.node, arguments); + }, + + initEvents : function(){ + this.node.on("move", this.onMove, this); + var E = Ext.EventManager; + var a = this.anchor; + + var el = Ext.fly(a); + + if(Ext.isOpera){ + el.setStyle("text-decoration", "none"); + } + + el.on("click", this.onClick, this); + el.on("dblclick", this.onDblClick, this); + el.on("contextmenu", this.onContextMenu, this); + + var icon = Ext.fly(this.iconNode); + icon.on("click", this.onClick, this); + icon.on("dblclick", this.onDblClick, this); + icon.on("contextmenu", this.onContextMenu, this); + E.on(this.ecNode, "click", this.ecClick, this, true); + + if(this.node.disabled){ + this.addClass("x-tree-node-disabled"); + } + if(this.node.hidden){ + this.addClass("x-tree-node-disabled"); + } + var ot = this.node.getOwnerTree(); + var dd = ot.enableDD || ot.enableDrag || ot.enableDrop; + if(dd && (!this.node.isRoot || ot.rootVisible)){ + Ext.dd.Registry.register(this.elNode, { + node: this.node, + handles: [this.iconNode, this.textNode], + isHandle: false + }); + } + }, + + hide : function(){ + if(this.rendered){ + this.wrap.style.display = "none"; + } + }, + + show : function(){ + if(this.rendered){ + this.wrap.style.display = ""; + } + }, + + onContextMenu : function(e){ + e.preventDefault(); + this.focus(); + this.fireEvent("contextmenu", this.node, e); + }, + + onClick : function(e){ + if(this.dropping){ + return; + } + if(this.fireEvent("beforeclick", this.node, e) !== false){ + if(!this.disabled && this.node.attributes.href){ + this.fireEvent("click", this.node, e); + return; + } + e.preventDefault(); + if(this.disabled){ + return; + } + + if(this.node.attributes.singleClickExpand && !this.animating && this.node.hasChildNodes()){ + this.node.toggle(); + } + + this.fireEvent("click", this.node, e); + }else{ + e.stopEvent(); + } + }, + + onDblClick : function(e){ + e.preventDefault(); + if(this.disabled){ + return; + } + if(!this.animating && this.node.hasChildNodes()){ + this.node.toggle(); + } + this.fireEvent("dblclick", this.node, e); + }, + + ecClick : function(e){ + if(!this.animating && this.node.hasChildNodes()){ + this.node.toggle(); + } + }, + + startDrop : function(){ + this.dropping = true; + }, + + + endDrop : function(){ + setTimeout(function(){ + this.dropping = false; + }.createDelegate(this), 50); + }, + + expand : function(){ + this.updateExpandIcon(); + this.ctNode.style.display = ""; + }, + + focus : function(){ + if(!this.node.preventHScroll){ + try{this.anchor.focus(); + }catch(e){} + }else if(!Ext.isIE){ + try{ + var noscroll = this.node.getOwnerTree().el.dom; + var l = noscroll.scrollLeft; + this.anchor.focus(); + noscroll.scrollLeft = l; + }catch(e){} + } + }, + + blur : function(){ + try{ + this.anchor.blur(); + }catch(e){} + }, + + animExpand : function(callback){ + var ct = Ext.get(this.ctNode); + ct.stopFx(); + if(!this.node.hasChildNodes()){ + this.updateExpandIcon(); + this.ctNode.style.display = ""; + Ext.callback(callback); + return; + } + this.animating = true; + this.updateExpandIcon(); + + ct.slideIn('t', { + callback : function(){ + this.animating = false; + Ext.callback(callback); + }, + scope: this, + duration: this.node.ownerTree.duration || .25 + }); + }, + + highlight : function(){ + var tree = this.node.getOwnerTree(); + Ext.fly(this.wrap).highlight( + tree.hlColor || "C3DAF9", + {endColor: tree.hlBaseColor} + ); + }, + + collapse : function(){ + this.updateExpandIcon(); + this.ctNode.style.display = "none"; + }, + + animCollapse : function(callback){ + var ct = Ext.get(this.ctNode); + ct.enableDisplayMode('block'); + ct.stopFx(); + + this.animating = true; + this.updateExpandIcon(); + + ct.slideOut('t', { + callback : function(){ + this.animating = false; + Ext.callback(callback); + }, + scope: this, + duration: this.node.ownerTree.duration || .25 + }); + }, + + getContainer : function(){ + return this.ctNode; + }, + + getEl : function(){ + return this.wrap; + }, + + appendDDGhost : function(ghostNode){ + ghostNode.appendChild(this.elNode.cloneNode(true)); + }, + + getDDRepairXY : function(){ + return Ext.lib.Dom.getXY(this.iconNode); + }, + + onRender : function(){ + this.render(); + }, + + render : function(bulkRender){ + var n = this.node; + var targetNode = n.parentNode ? + n.parentNode.ui.getContainer() : n.ownerTree.container.dom; + if(!this.rendered){ + this.rendered = true; + var a = n.attributes; + + + this.indentMarkup = ""; + if(n.parentNode){ + this.indentMarkup = n.parentNode.ui.getChildIndent(); + } + + var buf = ['
    1. ', + '',this.indentMarkup,"", + '', + '', + '',n.text,"
      ", + '', + "
    2. "]; + + if(bulkRender !== true && n.nextSibling && n.nextSibling.ui.getEl()){ + this.wrap = Ext.DomHelper.insertHtml("beforeBegin", + n.nextSibling.ui.getEl(), buf.join("")); + }else{ + this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf.join("")); + } + this.elNode = this.wrap.childNodes[0]; + this.ctNode = this.wrap.childNodes[1]; + var cs = this.elNode.childNodes; + this.indentNode = cs[0]; + this.ecNode = cs[1]; + this.iconNode = cs[2]; + this.anchor = cs[3]; + this.textNode = cs[3].firstChild; + if(a.qtip){ + if(this.textNode.setAttributeNS){ + this.textNode.setAttributeNS("ext", "qtip", a.qtip); + if(a.qtipTitle){ + this.textNode.setAttributeNS("ext", "qtitle", a.qtipTitle); + } + }else{ + this.textNode.setAttribute("ext:qtip", a.qtip); + if(a.qtipTitle){ + this.textNode.setAttribute("ext:qtitle", a.qtipTitle); + } + } + } + this.initEvents(); + if(!this.node.expanded){ + this.updateExpandIcon(); + } + }else{ + if(bulkRender === true) { + targetNode.appendChild(this.wrap); + } + } + }, + + getAnchor : function(){ + return this.anchor; + }, + + getTextEl : function(){ + return this.textNode; + }, + + getIconEl : function(){ + return this.iconNode; + }, + + updateExpandIcon : function(){ + if(this.rendered){ + var n = this.node, c1, c2; + + var cls = n.isLast() ? "x-tree-elbow-end" : "x-tree-elbow"; + var hasChild = n.hasChildNodes(); + if(hasChild){ + if(n.expanded){ + cls += "-minus"; + c1 = "x-tree-node-collapsed"; + c2 = "x-tree-node-expanded"; + }else{ + cls += "-plus"; + c1 = "x-tree-node-expanded"; + c2 = "x-tree-node-collapsed"; + } + if(this.wasLeaf){ + this.removeClass("x-tree-node-leaf"); + this.wasLeaf = false; + } + if(this.c1 != c1 || this.c2 != c2){ + Ext.fly(this.elNode).replaceClass(c1, c2); + this.c1 = c1; this.c2 = c2; + } + }else{ + if(!this.wasLeaf){ + Ext.fly(this.elNode).replaceClass("x-tree-node-expanded", "x-tree-node-leaf"); + this.wasLeaf = true; + } + } + var ecc = "x-tree-ec-icon "+cls; + if(this.ecc != ecc){ + this.ecNode.className = ecc; + this.ecc = ecc; + } + } + }, + + getChildIndent : function(){ + if(!this.childIndent){ + var buf = []; + var p = this.node; + while(p){ + if(!p.isRoot || (p.isRoot && p.ownerTree.rootVisible)){ + if(!p.isLast()) { + buf.unshift(''); + } else { + buf.unshift(''); + } + } + p = p.parentNode; + } + this.childIndent = buf.join(""); + } + return this.childIndent; + }, + + renderIndent : function(){ + if(this.rendered){ + var indent = ""; + var p = this.node.parentNode; + if(p){ + indent = p.ui.getChildIndent(); + } + if(this.indentMarkup != indent){ + this.indentNode.innerHTML = indent; + this.indentMarkup = indent; + } + this.updateExpandIcon(); + } + } +}; + +Ext.tree.RootTreeNodeUI = function(){ + Ext.tree.RootTreeNodeUI.superclass.constructor.apply(this, arguments); +}; +Ext.extend(Ext.tree.RootTreeNodeUI, Ext.tree.TreeNodeUI, { + render : function(){ + if(!this.rendered){ + var targetNode = this.node.ownerTree.container.dom; + this.node.expanded = true; + targetNode.innerHTML = '
      '; + this.wrap = this.ctNode = targetNode.firstChild; + } + }, + collapse : function(){ + }, + expand : function(){ + } +}); + +Ext.tree.TreeLoader = function(config){ + this.baseParams = {}; + this.requestMethod = "POST"; + Ext.apply(this, config); + + this.addEvents({ + "beforeload" : true, + "load" : true, + "loadexception" : true + }); +}; + +Ext.extend(Ext.tree.TreeLoader, Ext.util.Observable, { + uiProviders : {}, + clearOnLoad : true, + load : function(node, callback){ + if(this.clearOnLoad){ + while(node.firstChild){ + node.removeChild(node.firstChild); + } + } + if(node.attributes.children){ + var cs = node.attributes.children; + for(var i = 0, len = cs.length; i < len; i++){ + node.appendChild(this.createNode(cs[i])); + } + if(typeof callback == "function"){ + callback(); + } + }else if(this.dataUrl){ + this.requestData(node, callback); + } + }, + + getParams: function(node){ + var buf = [], bp = this.baseParams; + for(var key in bp){ + if(typeof bp[key] != "function"){ + buf.push(encodeURIComponent(key), "=", encodeURIComponent(bp[key]), "&"); + } + } + buf.push("node=", encodeURIComponent(node.id)); + return buf.join(""); + }, + + requestData : function(node, callback){ + if(this.fireEvent("beforeload", this, node, callback) !== false){ + var params = this.getParams(node); + var cb = { + success: this.handleResponse, + failure: this.handleFailure, + scope: this, + argument: {callback: callback, node: node} + }; + this.transId = Ext.lib.Ajax.request(this.requestMethod, this.dataUrl, cb, params); + }else{ + + + if(typeof callback == "function"){ + callback(); + } + } + }, + + isLoading : function(){ + return this.transId ? true : false; + }, + + abort : function(){ + if(this.isLoading()){ + Ext.lib.Ajax.abort(this.transId); + } + }, + + + createNode : function(attr){ + if(this.applyLoader !== false){ + attr.loader = this; + } + if(typeof attr.uiProvider == 'string'){ + attr.uiProvider = this.uiProviders[attr.uiProvider] || eval(attr.uiProvider); + } + return(attr.leaf ? + new Ext.tree.TreeNode(attr) : + new Ext.tree.AsyncTreeNode(attr)); + }, + + processResponse : function(response, node, callback){ + var json = response.responseText; + try { + var o = eval("("+json+")"); + for(var i = 0, len = o.length; i < len; i++){ + var n = this.createNode(o[i]); + if(n){ + node.appendChild(n); + } + } + if(typeof callback == "function"){ + callback(this, node); + } + }catch(e){ + this.handleFailure(response); + } + }, + + handleResponse : function(response){ + this.transId = false; + var a = response.argument; + this.processResponse(response, a.node, a.callback); + this.fireEvent("load", this, a.node, response); + }, + + handleFailure : function(response){ + this.transId = false; + var a = response.argument; + this.fireEvent("loadexception", this, a.node, response); + if(typeof a.callback == "function"){ + a.callback(this, a.node); + } + } +}); + +Ext.tree.TreeFilter = function(tree, config){ + this.tree = tree; + this.filtered = {}; + Ext.apply(this, config, { + clearBlank:false, + reverse:false, + autoClear:false, + remove:false + }); +}; + +Ext.tree.TreeFilter.prototype = { + + filter : function(value, attr, startNode){ + attr = attr || "text"; + var f; + if(typeof value == "string"){ + var vlen = value.length; + + if(vlen == 0 && this.clearBlank){ + this.clearFilter(); + return; + } + value = value.toLowerCase(); + f = function(n){ + return n.attributes[attr].substr(0, vlen).toLowerCase() == value; + }; + }else if(value.exec){ + f = function(n){ + return value.test(n.attributes[attr]); + }; + }else{ + throw 'Illegal filter type, must be string or regex'; + } + this.filterBy(f, null, startNode); + }, + + + filterBy : function(fn, scope, startNode){ + startNode = startNode || this.tree.root; + if(this.autoClear){ + this.clearFilter(); + } + var af = this.filtered, rv = this.reverse; + var f = function(n){ + if(n == startNode){ + return true; + } + if(af[n.id]){ + return false; + } + var m = fn.call(scope || n, n); + if(!m || rv){ + af[n.id] = n; + n.ui.hide(); + return false; + } + return true; + }; + startNode.cascade(f); + if(this.remove){ + for(var id in af){ + if(typeof id != "function"){ + var n = af[id]; + if(n && n.parentNode){ + n.parentNode.removeChild(n); + } + } + } + } + }, + + + clear : function(){ + var t = this.tree; + var af = this.filtered; + for(var id in af){ + if(typeof id != "function"){ + var n = af[id]; + if(n){ + n.ui.show(); + } + } + } + this.filtered = {}; + } +}; + + +Ext.tree.TreeSorter = function(tree, config){ + Ext.apply(this, config); + tree.on("beforechildrenrendered", this.doSort, this); + tree.on("append", this.updateSort, this); + tree.on("insert", this.updateSort, this); + + var dsc = this.dir && this.dir.toLowerCase() == "desc"; + var p = this.property || "text"; + var sortType = this.sortType; + var fs = this.folderSort; + var cs = this.caseSensitive === true; + var leafAttr = this.leafAttr || 'leaf'; + + this.sortFn = function(n1, n2){ + if(fs){ + if(n1.attributes[leafAttr] && !n2.attributes[leafAttr]){ + return 1; + } + if(!n1.attributes[leafAttr] && n2.attributes[leafAttr]){ + return -1; + } + } + var v1 = sortType ? sortType(n1) : (cs ? n1[p] : n1[p].toUpperCase()); + var v2 = sortType ? sortType(n2) : (cs ? n2[p] : n2[p].toUpperCase()); + if(v1 < v2){ + return dsc ? +1 : -1; + }else if(v1 > v2){ + return dsc ? -1 : +1; + }else{ + return 0; + } + }; +}; + +Ext.tree.TreeSorter.prototype = { + doSort : function(node){ + node.sort(this.sortFn); + }, + + compareNodes : function(n1, n2){ + + return (n1.text.toUpperCase() > n2.text.toUpperCase() ? 1 : -1); + }, + + updateSort : function(tree, node){ + if(node.childrenRendered){ + this.doSort.defer(1, this, [node]); + } + } +}; +if(Ext.dd.DropZone){ + +Ext.tree.TreeDropZone = function(tree, config){ + this.allowParentInsert = false; + this.allowContainerDrop = false; + this.appendOnly = false; + Ext.tree.TreeDropZone.superclass.constructor.call(this, tree.container, config); + this.tree = tree; + this.lastInsertClass = "x-tree-no-status"; + this.dragOverData = {}; +}; + +Ext.extend(Ext.tree.TreeDropZone, Ext.dd.DropZone, { + ddGroup : "TreeDD", + + expandDelay : 1000, + + expandNode : function(node){ + if(node.hasChildNodes() && !node.isExpanded()){ + node.expand(false, null, this.triggerCacheRefresh.createDelegate(this)); + } + }, + + queueExpand : function(node){ + this.expandProcId = this.expandNode.defer(this.expandDelay, this, [node]); + }, + + cancelExpand : function(){ + if(this.expandProcId){ + clearTimeout(this.expandProcId); + this.expandProcId = false; + } + }, + + isValidDropPoint : function(n, pt, dd, e, data){ + if(!n || !data){ return false; } + var targetNode = n.node; + var dropNode = data.node; + + if(!(targetNode && targetNode.isTarget && pt)){ + return false; + } + if(pt == "append" && targetNode.allowChildren === false){ + return false; + } + if((pt == "above" || pt == "below") && (targetNode.parentNode && targetNode.parentNode.allowChildren === false)){ + return false; + } + if(dropNode && (targetNode == dropNode || dropNode.contains(targetNode))){ + return false; + } + + var overEvent = this.dragOverData; + overEvent.tree = this.tree; + overEvent.target = targetNode; + overEvent.data = data; + overEvent.point = pt; + overEvent.source = dd; + overEvent.rawEvent = e; + overEvent.dropNode = dropNode; + overEvent.cancel = false; + var result = this.tree.fireEvent("nodedragover", overEvent); + return overEvent.cancel === false && result !== false; + }, + + getDropPoint : function(e, n, dd){ + var tn = n.node; + if(tn.isRoot){ + return tn.allowChildren !== false ? "append" : false; + } + var dragEl = n.ddel; + var t = Ext.lib.Dom.getY(dragEl), b = t + dragEl.offsetHeight; + var y = Ext.lib.Event.getPageY(e); + var noAppend = tn.allowChildren === false || tn.isLeaf(); + if(this.appendOnly || tn.parentNode.allowChildren === false){ + return noAppend ? false : "append"; + } + var noBelow = false; + if(!this.allowParentInsert){ + noBelow = tn.hasChildNodes() && tn.isExpanded(); + } + var q = (b - t) / (noAppend ? 2 : 3); + if(y >= t && y < (t + q)){ + return "above"; + }else if(!noBelow && (noAppend || y >= b-q && y <= b)){ + return "below"; + }else{ + return "append"; + } + }, + + onNodeEnter : function(n, dd, e, data){ + this.cancelExpand(); + }, + + onNodeOver : function(n, dd, e, data){ + var pt = this.getDropPoint(e, n, dd); + var node = n.node; + + + if(!this.expandProcId && pt == "append" && node.hasChildNodes() && !n.node.isExpanded()){ + this.queueExpand(node); + }else if(pt != "append"){ + this.cancelExpand(); + } + + + var returnCls = this.dropNotAllowed; + if(this.isValidDropPoint(n, pt, dd, e, data)){ + if(pt){ + var el = n.ddel; + var cls; + if(pt == "above"){ + returnCls = n.node.isFirst() ? "x-tree-drop-ok-above" : "x-tree-drop-ok-between"; + cls = "x-tree-drag-insert-above"; + }else if(pt == "below"){ + returnCls = n.node.isLast() ? "x-tree-drop-ok-below" : "x-tree-drop-ok-between"; + cls = "x-tree-drag-insert-below"; + }else{ + returnCls = "x-tree-drop-ok-append"; + cls = "x-tree-drag-append"; + } + if(this.lastInsertClass != cls){ + Ext.fly(el).replaceClass(this.lastInsertClass, cls); + this.lastInsertClass = cls; + } + } + } + return returnCls; + }, + + onNodeOut : function(n, dd, e, data){ + this.cancelExpand(); + this.removeDropIndicators(n); + }, + + onNodeDrop : function(n, dd, e, data){ + var point = this.getDropPoint(e, n, dd); + var targetNode = n.node; + targetNode.ui.startDrop(); + if(!this.isValidDropPoint(n, point, dd, e, data)){ + targetNode.ui.endDrop(); + return false; + } + + var dropNode = data.node || (dd.getTreeNode ? dd.getTreeNode(data, targetNode, point, e) : null); + var dropEvent = { + tree : this.tree, + target: targetNode, + data: data, + point: point, + source: dd, + rawEvent: e, + dropNode: dropNode, + cancel: !dropNode + }; + var retval = this.tree.fireEvent("beforenodedrop", dropEvent); + if(retval === false || dropEvent.cancel === true || !dropEvent.dropNode){ + targetNode.ui.endDrop(); + return false; + } + + targetNode = dropEvent.target; + if(point == "append" && !targetNode.isExpanded()){ + targetNode.expand(false, null, function(){ + this.completeDrop(dropEvent); + }.createDelegate(this)); + }else{ + this.completeDrop(dropEvent); + } + return true; + }, + + completeDrop : function(de){ + var ns = de.dropNode, p = de.point, t = de.target; + if(!(ns instanceof Array)){ + ns = [ns]; + } + var n; + for(var i = 0, len = ns.length; i < len; i++){ + n = ns[i]; + if(p == "above"){ + t.parentNode.insertBefore(n, t); + }else if(p == "below"){ + t.parentNode.insertBefore(n, t.nextSibling); + }else{ + t.appendChild(n); + } + } + n.ui.focus(); + if(this.tree.hlDrop){ + n.ui.highlight(); + } + t.ui.endDrop(); + this.tree.fireEvent("nodedrop", de); + }, + + afterNodeMoved : function(dd, data, e, targetNode, dropNode){ + if(this.tree.hlDrop){ + dropNode.ui.focus(); + dropNode.ui.highlight(); + } + this.tree.fireEvent("nodedrop", this.tree, targetNode, data, dd, e); + }, + + getTree : function(){ + return this.tree; + }, + + removeDropIndicators : function(n){ + if(n && n.ddel){ + var el = n.ddel; + Ext.fly(el).removeClass([ + "x-tree-drag-insert-above", + "x-tree-drag-insert-below", + "x-tree-drag-append"]); + this.lastInsertClass = "_noclass"; + } + }, + + beforeDragDrop : function(target, e, id){ + this.cancelExpand(); + return true; + }, + + afterRepair : function(data){ + if(data && Ext.enableFx){ + data.node.ui.highlight(); + } + this.hideProxy(); + } +}); + +} +if(Ext.dd.DragZone){ +Ext.tree.TreeDragZone = function(tree, config){ + Ext.tree.TreeDragZone.superclass.constructor.call(this, tree.getEl(), config); + this.tree = tree; +}; + +Ext.extend(Ext.tree.TreeDragZone, Ext.dd.DragZone, { + ddGroup : "TreeDD", + + onBeforeDrag : function(data, e){ + var n = data.node; + return n && n.draggable && !n.disabled; + }, + + onInitDrag : function(e){ + var data = this.dragData; + this.tree.getSelectionModel().select(data.node); + this.proxy.update(""); + data.node.ui.appendDDGhost(this.proxy.ghost.dom); + this.tree.fireEvent("startdrag", this.tree, data.node, e); + }, + + getRepairXY : function(e, data){ + return data.node.ui.getDDRepairXY(); + }, + + onEndDrag : function(data, e){ + this.tree.fireEvent("enddrag", this.tree, data.node, e); + }, + + onValidDrop : function(dd, e, id){ + this.tree.fireEvent("dragdrop", this.tree, this.dragData.node, dd, e); + this.hideProxy(); + }, + + beforeInvalidDrop : function(e, id){ + + var sm = this.tree.getSelectionModel(); + sm.clearSelections(); + sm.select(this.dragData.node); + } +}); +} +Ext.tree.TreeEditor = function(tree, config){ + config = config || {}; + var field = config.events ? config : new Ext.form.TextField(config); + Ext.tree.TreeEditor.superclass.constructor.call(this, field); + + this.tree = tree; + + tree.on('beforeclick', this.beforeNodeClick, this); + tree.el.on('mousedown', this.hide, this); + this.on('complete', this.updateNode, this); + this.on('beforestartedit', this.fitToTree, this); + this.on('startedit', this.bindScroll, this, {delay:10}); + this.on('specialkey', this.onSpecialKey, this); +}; + +Ext.extend(Ext.tree.TreeEditor, Ext.Editor, { + alignment: "l-l", + autoSize: false, + hideEl : false, + cls: "x-small-editor x-tree-editor", + shim:false, + shadow:"frame", + maxWidth: 250, + + fitToTree : function(ed, el){ + var td = this.tree.el.dom, nd = el.dom; + if(td.scrollLeft > nd.offsetLeft){ td.scrollLeft = nd.offsetLeft; + } + var w = Math.min( + this.maxWidth, + (td.clientWidth > 20 ? td.clientWidth : td.offsetWidth) - Math.max(0, nd.offsetLeft-td.scrollLeft) - 5); + this.setSize(w, ''); + }, + + triggerEdit : function(node){ + this.completeEdit(); + this.editNode = node; + this.startEdit(node.ui.textNode, node.text); + }, + + bindScroll : function(){ + this.tree.el.on('scroll', this.cancelEdit, this); + }, + + beforeNodeClick : function(node){ + if(this.tree.getSelectionModel().isSelected(node)){ + this.triggerEdit(node); + return false; + } + }, + + updateNode : function(ed, value){ + this.tree.el.un('scroll', this.cancelEdit, this); + this.editNode.setText(value); + }, + + onSpecialKey : function(field, e){ + var k = e.getKey(); + if(k == e.ESC){ + this.cancelEdit(); + e.stopEvent(); + }else if(k == e.ENTER && !e.hasModifier()){ + this.completeEdit(); + e.stopEvent(); + } + } +}); + +Ext.menu.Menu = function(config){ + Ext.apply(this, config); + this.id = this.id || Ext.id(); + this.addEvents({ + + beforeshow : true, + + beforehide : true, + + show : true, + + hide : true, + + click : true, + + mouseover : true, + + mouseout : true, + + itemclick: true + }); + Ext.menu.MenuMgr.register(this); + var mis = this.items; + this.items = new Ext.util.MixedCollection(); + if(mis){ + this.add.apply(this, mis); + } +}; + +Ext.extend(Ext.menu.Menu, Ext.util.Observable, { + + minWidth : 120, + + shadow : "sides", + + subMenuAlign : "tl-tr?", + + defaultAlign : "tl-bl?", + + allowOtherMenus : false, + + render : function(){ + if(this.el){ + return; + } + var el = this.el = new Ext.Layer({ + cls: "x-menu", + shadow:this.shadow, + constrain: false, + parentEl: this.parentEl || document.body, + zindex:15000 + }); + + this.keyNav = new Ext.menu.MenuNav(this); + + if(this.plain){ + el.addClass("x-menu-plain"); + } + if(this.cls){ + el.addClass(this.cls); + } + this.focusEl = el.createChild({ + tag: "a", cls: "x-menu-focus", href: "#", onclick: "return false;", tabIndex:"-1" + }); + var ul = el.createChild({tag: "ul", cls: "x-menu-list"}); + ul.on("click", this.onClick, this); + ul.on("mouseover", this.onMouseOver, this); + ul.on("mouseout", this.onMouseOut, this); + this.items.each(function(item){ + var li = document.createElement("li"); + li.className = "x-menu-list-item"; + ul.dom.appendChild(li); + item.render(li, this); + }, this); + this.ul = ul; + this.autoWidth(); + }, + + autoWidth : function(){ + var el = this.el, ul = this.ul; + if(!el){ + return; + } + var w = this.width; + if(w){ + el.setWidth(w); + }else if(Ext.isIE){ + el.setWidth(this.minWidth); + var t = el.dom.offsetWidth; el.setWidth(ul.getWidth()+el.getFrameWidth("lr")); + } + }, + + delayAutoWidth : function(){ + if(this.rendered){ + if(!this.awTask){ + this.awTask = new Ext.util.DelayedTask(this.autoWidth, this); + } + this.awTask.delay(20); + } + }, + + findTargetItem : function(e){ + var t = e.getTarget(".x-menu-list-item", this.ul, true); + if(t && t.menuItemId){ + return this.items.get(t.menuItemId); + } + }, + + onClick : function(e){ + var t; + if(t = this.findTargetItem(e)){ + t.onClick(e); + this.fireEvent("click", this, t, e); + } + }, + + setActiveItem : function(item, autoExpand){ + if(item != this.activeItem){ + if(this.activeItem){ + this.activeItem.deactivate(); + } + this.activeItem = item; + item.activate(autoExpand); + }else if(autoExpand){ + item.expandMenu(); + } + }, + + tryActivate : function(start, step){ + var items = this.items; + for(var i = start, len = items.length; i >= 0 && i < len; i+= step){ + var item = items.get(i); + if(!item.disabled && item.canActivate){ + this.setActiveItem(item, false); + return item; + } + } + return false; + }, + + onMouseOver : function(e){ + var t; + if(t = this.findTargetItem(e)){ + if(t.canActivate && !t.disabled){ + this.setActiveItem(t, true); + } + } + this.fireEvent("mouseover", this, e, t); + }, + + onMouseOut : function(e){ + var t; + if(t = this.findTargetItem(e)){ + if(t == this.activeItem && t.shouldDeactivate(e)){ + this.activeItem.deactivate(); + delete this.activeItem; + } + } + this.fireEvent("mouseout", this, e, t); + }, + + + isVisible : function(){ + return this.el && this.el.isVisible(); + }, + + + show : function(el, pos, parentMenu){ + this.parentMenu = parentMenu; + if(!this.el){ + this.render(); + } + this.fireEvent("beforeshow", this); + this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign), parentMenu, false); + }, + + + showAt : function(xy, parentMenu, _fireBefore){ + this.parentMenu = parentMenu; + if(!this.el){ + this.render(); + } + if(_fireBefore !== false){ + this.fireEvent("beforeshow", this); + } + this.el.setXY(xy); + this.el.show(); + this.focusEl.focus.defer(50, this.focusEl); + this.fireEvent("show", this); + }, + + + hide : function(deep){ + if(this.el && this.isVisible()){ + this.fireEvent("beforehide", this); + if(this.activeItem){ + this.activeItem.deactivate(); + this.activeItem = null; + } + this.el.hide(); + this.fireEvent("hide", this); + } + if(deep === true && this.parentMenu){ + this.parentMenu.hide(true); + } + }, + + + add : function(){ + var a = arguments, l = a.length, item; + for(var i = 0; i < l; i++){ + var el = a[i]; + if(el.render){ item = this.addItem(el); + }else if(typeof el == "string"){ if(el == "separator" || el == "-"){ + item = this.addSeparator(); + }else{ + item = this.addText(el); + } + }else if(el.tagName || el.el){ item = this.addElement(el); + }else if(typeof el == "object"){ item = this.addMenuItem(el); + } + } + return item; + }, + + + getEl : function(){ + if(!this.el){ + this.render(); + } + return this.el; + }, + + + addSeparator : function(){ + return this.addItem(new Ext.menu.Separator()); + }, + + + addElement : function(el){ + return this.addItem(new Ext.menu.BaseItem(el)); + }, + + + addItem : function(item){ + this.items.add(item); + if(this.ul){ + var li = document.createElement("li"); + li.className = "x-menu-list-item"; + this.ul.dom.appendChild(li); + item.render(li, this); + this.delayAutoWidth(); + } + return item; + }, + + + addMenuItem : function(config){ + if(!(config instanceof Ext.menu.Item)){ + config = new Ext.menu.Item(config); + } + return this.addItem(config); + }, + + + addText : function(text){ + return this.addItem(new Ext.menu.TextItem(text)); + }, + + + insert : function(index, item){ + this.items.insert(index, item); + if(this.ul){ + var li = document.createElement("li"); + li.className = "x-menu-list-item"; + this.ul.dom.insertBefore(li, this.ul.dom.childNodes[index]); + item.render(li, this); + this.delayAutoWidth(); + } + return item; + }, + + + remove : function(item){ + this.items.removeKey(item.id); + item.destroy(); + }, + + + removeAll : function(){ + var f; + while(f = this.items.first()){ + this.remove(f); + } + } +}); + +Ext.menu.MenuNav = function(menu){ + Ext.menu.MenuNav.superclass.constructor.call(this, menu.el); + this.scope = this.menu = menu; +}; + +Ext.extend(Ext.menu.MenuNav, Ext.KeyNav, { + doRelay : function(e, h){ + var k = e.getKey(); + if(!this.menu.activeItem && e.isNavKeyPress() && k != e.SPACE && k != e.RETURN){ + this.menu.tryActivate(0, 1); + return false; + } + return h.call(this.scope || this, e, this.menu); + }, + + up : function(e, m){ + if(!m.tryActivate(m.items.indexOf(m.activeItem)-1, -1)){ + m.tryActivate(m.items.length-1, -1); + } + }, + + down : function(e, m){ + if(!m.tryActivate(m.items.indexOf(m.activeItem)+1, 1)){ + m.tryActivate(0, 1); + } + }, + + right : function(e, m){ + if(m.activeItem){ + m.activeItem.expandMenu(true); + } + }, + + left : function(e, m){ + m.hide(); + if(m.parentMenu && m.parentMenu.activeItem){ + m.parentMenu.activeItem.activate(); + } + }, + + enter : function(e, m){ + if(m.activeItem){ + e.stopPropagation(); + m.activeItem.onClick(e); + m.fireEvent("click", this, m.activeItem); + return true; + } + } +}); + +Ext.menu.MenuMgr = function(){ + var menus, active, groups = {}, attached = false, lastShow = new Date(); + + function init(){ + menus = {}, active = new Ext.util.MixedCollection(); + Ext.get(document).addKeyListener(27, function(){ + if(active.length > 0){ + hideAll(); + } + }); + } + + function hideAll(){ + if(active.length > 0){ + var c = active.clone(); + c.each(function(m){ + m.hide(); + }); + } + } + + function onHide(m){ + active.remove(m); + if(active.length < 1){ + Ext.get(document).un("mousedown", onMouseDown); + attached = false; + } + } + + function onShow(m){ + var last = active.last(); + lastShow = new Date(); + active.add(m); + if(!attached){ + Ext.get(document).on("mousedown", onMouseDown); + attached = true; + } + if(m.parentMenu){ + m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3); + m.parentMenu.activeChild = m; + }else if(last && last.isVisible()){ + m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3); + } + } + + function onBeforeHide(m){ + if(m.activeChild){ + m.activeChild.hide(); + } + if(m.autoHideTimer){ + clearTimeout(m.autoHideTimer); + delete m.autoHideTimer; + } + } + + function onBeforeShow(m){ + var pm = m.parentMenu; + if(!pm && !m.allowOtherMenus){ + hideAll(); + }else if(pm && pm.activeChild){ + pm.activeChild.hide(); + } + } + + function onMouseDown(e){ + if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){ + hideAll(); + } + } + + function onBeforeCheck(mi, state){ + if(state){ + var g = groups[mi.group]; + for(var i = 0, l = g.length; i < l; i++){ + if(g[i] != mi){ + g[i].setChecked(false); + } + } + } + } + + return { + + + hideAll : function(){ + hideAll(); + }, + + register : function(menu){ + if(!menus){ + init(); + } + menus[menu.id] = menu; + menu.on("beforehide", onBeforeHide); + menu.on("hide", onHide); + menu.on("beforeshow", onBeforeShow); + menu.on("show", onShow); + var g = menu.group; + if(g && menu.events["checkchange"]){ + if(!groups[g]){ + groups[g] = []; + } + groups[g].push(menu); + menu.on("checkchange", onCheck); + } + }, + + + get : function(menu){ + if(typeof menu == "string"){ return menus[menu]; + }else if(menu.events){ return menu; + }else{ return new Ext.menu.Menu(menu); + } + }, + + unregister : function(menu){ + delete menus[menu.id]; + menu.un("beforehide", onBeforeHide); + menu.un("hide", onHide); + menu.un("beforeshow", onBeforeShow); + menu.un("show", onShow); + var g = menu.group; + if(g && menu.events["checkchange"]){ + groups[g].remove(menu); + menu.un("checkchange", onCheck); + } + }, + + registerCheckable : function(menuItem){ + var g = menuItem.group; + if(g){ + if(!groups[g]){ + groups[g] = []; + } + groups[g].push(menuItem); + menuItem.on("beforecheckchange", onBeforeCheck); + } + }, + + unregisterCheckable : function(menuItem){ + var g = menuItem.group; + if(g){ + groups[g].remove(menuItem); + menuItem.un("beforecheckchange", onBeforeCheck); + } + } + }; +}(); + + +Ext.menu.BaseItem = function(config){ + Ext.menu.BaseItem.superclass.constructor.call(this, config); + + this.addEvents({ + + click: true, + + activate : true, + + deactivate : true + }); + + if(this.handler){ + this.on("click", this.handler, this.scope, true); + } +}; + +Ext.extend(Ext.menu.BaseItem, Ext.Component, { + + + canActivate : false, + + activeClass : "x-menu-item-active", + + hideOnClick : true, + + hideDelay : 100, + + ctype: "Ext.menu.BaseItem", + + actionMode : "container", + + render : function(container, parentMenu){ + this.parentMenu = parentMenu; + Ext.menu.BaseItem.superclass.render.call(this, container); + this.container.menuItemId = this.id; + }, + + onRender : function(container, position){ + this.el = Ext.get(this.el); + container.dom.appendChild(this.el.dom); + }, + + onClick : function(e){ + if(!this.disabled && this.fireEvent("click", this, e) !== false + && this.parentMenu.fireEvent("itemclick", this, e) !== false){ + this.handleClick(e); + }else{ + e.stopEvent(); + } + }, + + activate : function(){ + if(this.disabled){ + return false; + } + var li = this.container; + li.addClass(this.activeClass); + this.region = li.getRegion().adjust(2, 2, -2, -2); + this.fireEvent("activate", this); + return true; + }, + + deactivate : function(){ + this.container.removeClass(this.activeClass); + this.fireEvent("deactivate", this); + }, + + shouldDeactivate : function(e){ + return !this.region || !this.region.contains(e.getPoint()); + }, + + handleClick : function(e){ + if(this.hideOnClick){ + this.parentMenu.hide.defer(this.hideDelay, this.parentMenu, [true]); + } + }, + + expandMenu : function(autoActivate){ + }, + + hideMenu : function(){ + } +}); + +Ext.menu.TextItem = function(text){ + this.text = text; + Ext.menu.TextItem.superclass.constructor.call(this); +}; + +Ext.extend(Ext.menu.TextItem, Ext.menu.BaseItem, { + + hideOnClick : false, + + itemCls : "x-menu-text", + + onRender : function(){ + var s = document.createElement("span"); + s.className = this.itemCls; + s.innerHTML = this.text; + this.el = s; + Ext.menu.TextItem.superclass.onRender.apply(this, arguments); + } +}); + +Ext.menu.Separator = function(config){ + Ext.menu.Separator.superclass.constructor.call(this, config); +}; + +Ext.extend(Ext.menu.Separator, Ext.menu.BaseItem, { + + itemCls : "x-menu-sep", + + hideOnClick : false, + + onRender : function(li){ + var s = document.createElement("span"); + s.className = this.itemCls; + s.innerHTML = " "; + this.el = s; + li.addClass("x-menu-sep-li"); + Ext.menu.Separator.superclass.onRender.apply(this, arguments); + } +}); + +Ext.menu.Item = function(config){ + Ext.menu.Item.superclass.constructor.call(this, config); + if(this.menu){ + this.menu = Ext.menu.MenuMgr.get(this.menu); + } +}; +Ext.extend(Ext.menu.Item, Ext.menu.BaseItem, { + + + itemCls : "x-menu-item", + + canActivate : true, + + ctype: "Ext.menu.Item", + + onRender : function(container, position){ + var el = document.createElement("a"); + el.hideFocus = true; + el.unselectable = "on"; + el.href = this.href || "#"; + if(this.hrefTarget){ + el.target = this.hrefTarget; + } + el.className = this.itemCls + (this.menu ? " x-menu-item-arrow" : "") + (this.cls ? " " + this.cls : ""); + el.innerHTML = String.format( + '{1}', + this.icon || Ext.BLANK_IMAGE_URL, this.text); + this.el = el; + Ext.menu.Item.superclass.onRender.call(this, container, position); + }, + + + setText : function(text){ + this.text = text; + if(this.rendered){ + this.el.update(String.format( + '{1}', + this.icon || Ext.BLANK_IMAGE_URL, this.text)); + this.parentMenu.autoWidth(); + } + }, + + handleClick : function(e){ + if(!this.href){ e.stopEvent(); + } + Ext.menu.Item.superclass.handleClick.apply(this, arguments); + }, + + activate : function(autoExpand){ + if(Ext.menu.Item.superclass.activate.apply(this, arguments)){ + this.focus(); + if(autoExpand){ + this.expandMenu(); + } + } + return true; + }, + + shouldDeactivate : function(e){ + if(Ext.menu.Item.superclass.shouldDeactivate.call(this, e)){ + if(this.menu && this.menu.isVisible()){ + return !this.menu.getEl().getRegion().contains(e.getPoint()); + } + return true; + } + return false; + }, + + deactivate : function(){ + Ext.menu.Item.superclass.deactivate.apply(this, arguments); + this.hideMenu(); + }, + + expandMenu : function(autoActivate){ + if(!this.disabled && this.menu){ + if(!this.menu.isVisible()){ + this.menu.show(this.container, this.parentMenu.subMenuAlign || "tl-tr?", this.parentMenu); + } + if(autoActivate){ + this.menu.tryActivate(0, 1); + } + } + }, + + hideMenu : function(){ + if(this.menu && this.menu.isVisible()){ + this.menu.hide(); + } + } +}); + +Ext.menu.CheckItem = function(config){ + Ext.menu.CheckItem.superclass.constructor.call(this, config); + this.addEvents({ + + "beforecheckchange" : true, + + "checkchange" : true + }); + if(this.checkHandler){ + this.on('checkchange', this.checkHandler, this.scope); + } +}; +Ext.extend(Ext.menu.CheckItem, Ext.menu.Item, { + + + itemCls : "x-menu-item x-menu-check-item", + + groupClass : "x-menu-group-item", + + + checked: false, + + ctype: "Ext.menu.CheckItem", + + onRender : function(c){ + Ext.menu.CheckItem.superclass.onRender.apply(this, arguments); + if(this.group){ + this.el.addClass(this.groupClass); + } + Ext.menu.MenuMgr.registerCheckable(this); + if(this.checked){ + this.checked = false; + this.setChecked(true, true); + } + }, + + destroy : function(){ + if(this.rendered){ + Ext.menu.MenuMgr.unregisterCheckable(this); + } + Ext.menu.CheckItem.superclass.destroy.apply(this, arguments); + }, + + + setChecked : function(state, suppressEvent){ + if(this.checked != state && this.fireEvent("beforecheckchange", this, state) !== false){ + if(this.container){ + this.container[state ? "addClass" : "removeClass"]("x-menu-item-checked"); + } + this.checked = state; + if(suppressEvent !== true){ + this.fireEvent("checkchange", this, state); + } + } + }, + + handleClick : function(e){ + if(!this.disabled && !(this.checked && this.group)){ this.setChecked(!this.checked); + } + Ext.menu.CheckItem.superclass.handleClick.apply(this, arguments); + } +}); + +Ext.menu.Adapter = function(component, config){ + Ext.menu.Adapter.superclass.constructor.call(this, config); + this.component = component; +}; +Ext.extend(Ext.menu.Adapter, Ext.menu.BaseItem, { + canActivate : true, + + onRender : function(container, position){ + this.component.render(container); + this.el = this.component.getEl(); + }, + + activate : function(){ + if(this.disabled){ + return false; + } + this.component.focus(); + this.fireEvent("activate", this); + return true; + }, + + deactivate : function(){ + this.fireEvent("deactivate", this); + }, + + disable : function(){ + this.component.disable(); + Ext.menu.Adapter.superclass.disable.call(this); + }, + + enable : function(){ + this.component.enable(); + Ext.menu.Adapter.superclass.enable.call(this); + } +}); + +Ext.menu.DateItem = function(config){ + Ext.menu.DateItem.superclass.constructor.call(this, new Ext.DatePicker(config), config); + + this.picker = this.component; + this.addEvents({select: true}); + + this.picker.on("render", function(picker){ + picker.getEl().swallowEvent("click"); + picker.container.addClass("x-menu-date-item"); + }); + + this.picker.on("select", this.onSelect, this); +}; + +Ext.extend(Ext.menu.DateItem, Ext.menu.Adapter, { + onSelect : function(picker, date){ + this.fireEvent("select", this, date, picker); + Ext.menu.DateItem.superclass.handleClick.call(this); + } +}); + +Ext.menu.ColorItem = function(config){ + Ext.menu.ColorItem.superclass.constructor.call(this, new Ext.ColorPalette(config), config); + + this.palette = this.component; + this.relayEvents(this.palette, ["select"]); + if(this.selectHandler){ + this.on('select', this.selectHandler, this.scope); + } +}; +Ext.extend(Ext.menu.ColorItem, Ext.menu.Adapter); + +Ext.menu.DateMenu = function(config){ + Ext.menu.DateMenu.superclass.constructor.call(this, config); + this.plain = true; + var di = new Ext.menu.DateItem(config); + this.add(di); + + this.picker = di.picker; + + this.relayEvents(di, ["select"]); +}; +Ext.extend(Ext.menu.DateMenu, Ext.menu.Menu); + +Ext.menu.ColorMenu = function(config){ + Ext.menu.ColorMenu.superclass.constructor.call(this, config); + this.plain = true; + var ci = new Ext.menu.ColorItem(config); + this.add(ci); + + this.palette = ci.palette; + + this.relayEvents(ci, ["select"]); +}; +Ext.extend(Ext.menu.ColorMenu, Ext.menu.Menu); + +Ext.form.Field = function(config){ + Ext.form.Field.superclass.constructor.call(this, config); + this.addEvents({ + + focus : true, + + blur : true, + + specialkey : true, + + change : true, + + invalid : true, + + valid : true + }); +}; + +Ext.extend(Ext.form.Field, Ext.Component, { + + invalidClass : "x-form-invalid", + + invalidText : "The value in this field is invalid", + + focusClass : "x-form-focus", + + validationEvent : "keyup", + + validateOnBlur : true, + + validationDelay : 250, + + defaultAutoCreate : {tag: "input", type: "text", size: "20", autocomplete: "off"}, + + fieldClass: "x-form-field", + + msgTarget: 'qtip', + + msgFx : 'normal', + + + inputType : undefined, + + isFormField : true, + + hasFocus : false, + + + value : undefined, + + + + getName: function(){ + return this.rendered && this.el.dom.name ? this.el.dom.name : (this.hiddenName || ''); + }, + + + applyTo : function(target){ + this.target = target; + this.el = Ext.get(target); + this.render(this.el.dom.parentNode); + return this; + }, + + onRender : function(ct, position){ + if(this.el){ + this.el = Ext.get(this.el); + if(!this.target){ + ct.dom.appendChild(this.el.dom); + } + }else { + var cfg = this.getAutoCreate(); + if(!cfg.name){ + cfg.name = this.name || this.id; + } + if(this.inputType){ + cfg.type = this.inputType; + } + if(this.tabIndex !== undefined){ + cfg.tabIndex = this.tabIndex; + } + this.el = ct.createChild(cfg, position); + } + var type = this.el.dom.type; + if(type){ + if(type == 'password'){ + type = 'text'; + } + this.el.addClass('x-form-'+type); + } + if(!this.customSize && (this.width || this.height)){ + this.setSize(this.width || "", this.height || ""); + } + if(this.readOnly){ + this.el.dom.readOnly = true; + } + + this.el.addClass([this.fieldClass, this.cls]); + this.initValue(); + }, + + initValue : function(){ + if(this.value !== undefined){ + this.setValue(this.value); + }else if(this.el.dom.value.length > 0){ + this.setValue(this.el.dom.value); + } + }, + + afterRender : function(){ + Ext.form.Field.superclass.afterRender.call(this); + this.initEvents(); + }, + + fireKey : function(e){ + if(e.isNavKeyPress()){ + this.fireEvent("specialkey", this, e); + } + }, + + + reset : function(){ + this.setValue(this.originalValue); + this.clearInvalid(); + }, + + initEvents : function(){ + this.el.on(Ext.isIE ? "keydown" : "keypress", this.fireKey, this); + this.el.on("focus", this.onFocus, this); + this.el.on("blur", this.onBlur, this); + + this.originalValue = this.getValue(); + }, + + onFocus : function(){ + if(!Ext.isOpera){ this.el.addClass(this.focusClass); + } + this.hasFocus = true; + this.startValue = this.getValue(); + this.fireEvent("focus", this); + }, + + onBlur : function(){ + this.el.removeClass(this.focusClass); + this.hasFocus = false; + if(this.validationEvent !== false && this.validateOnBlur && this.validationEvent != "blur"){ + this.validate(); + } + var v = this.getValue(); + if(v != this.startValue){ + this.fireEvent('change', this, v, this.startValue); + } + this.fireEvent("blur", this); + }, + + + setSize : function(w, h){ + if(!this.rendered || !this.el){ + this.width = w; + this.height = h; + return; + } + if(w){ + w = this.adjustWidth(this.el.dom.tagName, w); + this.el.setWidth(w); + } + if(h){ + this.el.setHeight(h); + } + var h = this.el.dom.offsetHeight; }, + + + isValid : function(preventMark){ + if(this.disabled){ + return true; + } + var restore = this.preventMark; + this.preventMark = preventMark === true; + var v = this.validateValue(this.getRawValue()); + this.preventMark = restore; + return v; + }, + + + validate : function(){ + if(this.disabled || this.validateValue(this.getRawValue())){ + this.clearInvalid(); + return true; + } + return false; + }, + + validateValue : function(value){ + return true; + }, + + + markInvalid : function(msg){ + if(!this.rendered || this.preventMark){ return; + } + this.el.addClass(this.invalidClass); + msg = msg || this.invalidText; + switch(this.msgTarget){ + case 'qtip': + this.el.dom.qtip = msg; + this.el.dom.qclass = 'x-form-invalid-tip'; + break; + case 'title': + this.el.dom.title = msg; + break; + case 'under': + if(!this.errorEl){ + var elp = this.el.findParent('.x-form-element', 5, true); + this.errorEl = elp.createChild({cls:'x-form-invalid-msg'}); + this.errorEl.setWidth(elp.getWidth(true)-20); + } + this.errorEl.update(msg); + Ext.form.Field.msgFx[this.msgFx].show(this.errorEl, this); + break; + case 'side': + if(!this.errorIcon){ + var elp = this.el.findParent('.x-form-element', 5, true); + this.errorIcon = elp.createChild({cls:'x-form-invalid-icon'}); + } + this.alignErrorIcon(); + this.errorIcon.dom.qtip = msg; + this.errorIcon.dom.qclass = 'x-form-invalid-tip'; + this.errorIcon.show(); + break; + default: + var t = Ext.getDom(this.msgTarget); + t.innerHTML = msg; + t.style.display = this.msgDisplay; + break; + } + this.fireEvent('invalid', this, msg); + }, + + alignErrorIcon : function(){ + this.errorIcon.alignTo(this.el, 'tl-tr', [2, 0]); + }, + + + clearInvalid : function(){ + if(!this.rendered || this.preventMark){ return; + } + this.el.removeClass(this.invalidClass); + switch(this.msgTarget){ + case 'qtip': + this.el.dom.qtip = ''; + break; + case 'title': + this.el.dom.title = ''; + break; + case 'under': + if(this.errorEl){ + Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl, this); + } + break; + case 'side': + if(this.errorIcon){ + this.errorIcon.dom.qtip = ''; + this.errorIcon.hide(); + } + break; + default: + var t = Ext.getDom(this.msgTarget); + t.innerHTML = ''; + t.style.display = 'none'; + break; + } + this.fireEvent('valid', this); + }, + + + getRawValue : function(){ + return this.el.getValue(); + }, + + + getValue : function(){ + var v = this.el.getValue(); + if(v == this.emptyText || v === undefined){ + v = ''; + } + return v; + }, + + + setRawValue : function(v){ + return this.el.dom.value = v; + }, + + + setValue : function(v){ + this.value = v; + if(this.rendered){ + this.el.dom.value = v; + this.validate(); + } + }, + + adjustWidth : function(tag, w){ + tag = tag.toLowerCase(); + if(typeof w == 'number' && Ext.isStrict && !Ext.isSafari){ + if(Ext.isIE && (tag == 'input' || tag == 'textarea')){ + if(tag == 'input'){ + return w + 2; + } + if(tag = 'textarea'){ + return w-2; + } + }else if(Ext.isGecko && tag == 'textarea'){ + return w-6; + }else if(Ext.isOpera){ + if(tag == 'input'){ + return w + 2; + } + if(tag = 'textarea'){ + return w-2; + } + } + } + return w; + } +}); + + +Ext.form.Field.msgFx = { + normal : { + show: function(msgEl, f){ + msgEl.setDisplayed('block'); + }, + + hide : function(msgEl, f){ + msgEl.setDisplayed(false).update(''); + } + }, + + slide : { + show: function(msgEl, f){ + msgEl.slideIn('t', {stopFx:true}); + }, + + hide : function(msgEl, f){ + msgEl.slideOut('t', {stopFx:true,useDisplay:true}); + } + }, + + slideRight : { + show: function(msgEl, f){ + msgEl.fixDisplay(); + msgEl.alignTo(f.el, 'tl-tr'); + msgEl.slideIn('l', {stopFx:true}); + }, + + hide : function(msgEl, f){ + msgEl.slideOut('l', {stopFx:true,useDisplay:true}); + } + } +}; + + +Ext.form.TextField = function(config){ + Ext.form.TextField.superclass.constructor.call(this, config); + this.addEvents({ + + autosize : true + }); +}; + +Ext.extend(Ext.form.TextField, Ext.form.Field, { + + grow : false, + + growMin : 30, + + growMax : 800, + + vtype : null, + + maskRe : null, + + disableKeyFilter : false, + + allowBlank : true, + + minLength : 0, + + maxLength : Number.MAX_VALUE, + + minLengthText : "The minimum length for this field is {0}", + + maxLengthText : "The maximum length for this field is {0}", + + selectOnFocus : false, + + blankText : "This field is required", + + validator : null, + + regex : null, + + regexText : "", + + emptyText : null, + + emptyClass : 'x-form-empty-field', + + initEvents : function(){ + Ext.form.TextField.superclass.initEvents.call(this); + if(this.validationEvent == 'keyup'){ + this.validationTask = new Ext.util.DelayedTask(this.validate, this); + this.el.on('keyup', this.filterValidation, this); + } + else if(this.validationEvent !== false){ + this.el.on(this.validationEvent, this.validate, this, {buffer: this.validationDelay}); + } + if(this.selectOnFocus || this.emptyText){ + this.on("focus", this.preFocus, this); + if(this.emptyText){ + this.on('blur', this.postBlur, this); + this.applyEmptyText(); + } + } + if(this.maskRe || (this.vtype && this.disableKeyFilter !== true && (this.maskRe = Ext.form.VTypes[this.vtype+'Mask']))){ + this.el.on("keypress", this.filterKeys, this); + } + if(this.grow){ + this.el.on("keyup", this.onKeyUp, this, {buffer:50}); + this.el.on("click", this.autoSize, this); + } + }, + + filterValidation : function(e){ + if(!e.isNavKeyPress()){ + this.validationTask.delay(this.validationDelay); + } + }, + + onKeyUp : function(e){ + if(!e.isNavKeyPress()){ + this.autoSize(); + } + }, + + + reset : function(){ + Ext.form.TextField.superclass.reset.call(this); + this.applyEmptyText(); + }, + + applyEmptyText : function(){ + if(this.rendered && this.emptyText && this.getRawValue().length < 1){ + this.setRawValue(this.emptyText); + this.el.addClass(this.emptyClass); + } + }, + + preFocus : function(){ + if(this.emptyText){ + if(this.getRawValue() == this.emptyText){ + this.setRawValue(''); + } + this.el.removeClass(this.emptyClass); + } + if(this.selectOnFocus){ + this.el.dom.select(); + } + }, + + postBlur : function(){ + this.applyEmptyText(); + }, + + filterKeys : function(e){ + var k = e.getKey(); + if(!Ext.isIE && (e.isNavKeyPress() || k == e.BACKSPACE || (k == e.DELETE && e.button == -1))){ + return; + } + var c = e.getCharCode(); + if(!this.maskRe.test(String.fromCharCode(c) || '')){ + e.stopEvent(); + } + }, + + setValue : function(v){ + if(this.emptyText && v !== undefined && v !== null && v !== ''){ + this.el.removeClass(this.emptyClass); + } + Ext.form.TextField.superclass.setValue.apply(this, arguments); + }, + + + validateValue : function(value){ + if(value.length < 1 || value === this.emptyText){ if(this.allowBlank){ + this.clearInvalid(); + return true; + }else{ + this.markInvalid(this.blankText); + return false; + } + } + if(value.length < this.minLength){ + this.markInvalid(String.format(this.minLengthText, this.minLength)); + return false; + } + if(value.length > this.maxLength){ + this.markInvalid(String.format(this.maxLengthText, this.maxLength)); + return false; + } + if(this.vtype){ + var vt = Ext.form.VTypes; + if(!vt[this.vtype](value)){ + this.markInvalid(this.vtypeText || vt[this.vtype +'Text']); + return false; + } + } + if(typeof this.validator == "function"){ + var msg = this.validator(value); + if(msg !== true){ + this.markInvalid(msg); + return false; + } + } + if(this.regex && !this.regex.test(value)){ + this.markInvalid(this.regexText); + return false; + } + return true; + }, + + + selectText : function(start, end){ + var v = this.getRawValue(); + if(v.length > 0){ + start = start === undefined ? 0 : start; + end = end === undefined ? v.length : end; + var d = this.el.dom; + if(d.setSelectionRange){ + d.setSelectionRange(start, end); + }else if(d.createTextRange){ + var range = d.createTextRange(); + range.moveStart("character", start); + range.moveEnd("character", v.length-end); + range.select(); + } + } + }, + + + autoSize : function(){ + if(!this.grow || !this.rendered){ + return; + } + if(!this.metrics){ + this.metrics = Ext.util.TextMetrics.createInstance(this.el); + } + var el = this.el; + var v = el.dom.value + " "; + var w = Math.min(this.growMax, Math.max(this.metrics.getWidth(v) + 10, this.growMin)); + this.el.setWidth(w); + this.fireEvent("autosize", this, w); + } +}); + +Ext.form.TriggerField = function(config){ + Ext.form.TriggerField.superclass.constructor.call(this, config); + this.mimicing = false; + this.on('disable', this.disableWrapper, this); + this.on('enable', this.enableWrapper, this); +}; + +Ext.extend(Ext.form.TriggerField, Ext.form.TextField, { + + + defaultAutoCreate : {tag: "input", type: "text", size: "16", autocomplete: "off"}, + + hideTrigger:false, + + + + + + + autoSize: Ext.emptyFn, + + monitorTab : true, + + customSize : true, + + setSize : function(w, h){ + if(!this.wrap){ + this.width = w; + this.height = h; + return; + } + if(w){ + var wrapWidth = w; + w = w - this.trigger.getWidth(); + Ext.form.TriggerField.superclass.setSize.call(this, w, h); + this.wrap.setWidth(wrapWidth); + if(this.onResize){ + this.onResize(wrapWidth, h); + } + }else{ + Ext.form.TriggerField.superclass.setSize.call(this, w, h); + this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth()); + } + }, + + alignErrorIcon : function(){ + this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]); + }, + + onRender : function(ct, position){ + Ext.form.TriggerField.superclass.onRender.call(this, ct, position); + this.wrap = this.el.wrap({cls: "x-form-field-wrap"}); + this.trigger = this.wrap.createChild({ + tag: "img", src: Ext.BLANK_IMAGE_URL, cls: "x-form-trigger "+this.triggerClass}); + this.trigger.on("click", this.onTriggerClick, this, {preventDefault:true}); + this.trigger.addClassOnOver('x-form-trigger-over'); + this.trigger.addClassOnClick('x-form-trigger-click'); + if(this.hideTrigger){ + this.trigger.setDisplayed(false); + } + this.setSize(this.width||'', this.height||''); + }, + + onDestroy : function(){ + if(this.trigger){ + this.trigger.removeAllListeners(); + this.trigger.remove(); + } + if(this.wrap){ + this.wrap.remove(); + } + Ext.form.TriggerField.superclass.onDestroy.call(this); + }, + + onFocus : function(){ + Ext.form.TriggerField.superclass.onFocus.call(this); + if(!this.mimicing){ + this.mimicing = true; + Ext.get(Ext.isIE ? document.body : document).on("mousedown", this.mimicBlur, this); + if(this.monitorTab){ + this.el.on("keydown", this.checkTab, this); + } + } + }, + + checkTab : function(e){ + if(e.getKey() == e.TAB){ + this.triggerBlur(); + } + }, + + onBlur : function(){ + }, + + mimicBlur : function(e, t){ + if(!this.wrap.contains(t) && this.validateBlur()){ + this.triggerBlur(); + } + }, + + triggerBlur : function(){ + this.mimicing = false; + Ext.get(Ext.isIE ? document.body : document).un("mousedown", this.mimicBlur); + if(this.monitorTab){ + this.el.un("keydown", this.checkTab, this); + } + Ext.form.TriggerField.superclass.onBlur.call(this); + }, + + validateBlur : function(e, t){ + return true; + }, + + disableWrapper : function(){ + if(this.wrap){ + this.wrap.addClass('x-item-disabled'); + } + }, + + enableWrapper : function(){ + if(this.wrap){ + this.wrap.removeClass('x-item-disabled'); + } + }, + + onShow : function(){ + if(this.wrap){ + this.wrap.dom.style.display = ''; + this.wrap.dom.style.visibility = 'visible'; + } + }, + + onHide : function(){ + this.wrap.dom.style.display = 'none'; + }, + + + onTriggerClick : Ext.emptyFn +}); + +Ext.form.TextArea = function(config){ + Ext.form.TextArea.superclass.constructor.call(this, config); + if(this.minHeight !== undefined){ + this.growMin = this.minHeight; + } + if(this.maxHeight !== undefined){ + this.growMax = this.maxHeight; + } +}; + +Ext.extend(Ext.form.TextArea, Ext.form.TextField, { + + growMin : 60, + + growMax: 1000, + + preventScrollbars: false, + + onRender : function(ct, position){ + if(!this.el){ + this.defaultAutoCreate = { + tag: "textarea", + style:"width:300px;height:60px;", + autocomplete: "off" + }; + } + Ext.form.TextArea.superclass.onRender.call(this, ct, position); + if(this.grow){ + this.textSizeEl = Ext.DomHelper.append(document.body, { + tag: "pre", cls: "x-form-grow-sizer" + }); + if(this.preventScrollbars){ + this.el.setStyle("overflow", "hidden"); + } + this.el.setHeight(this.growMin); + } + }, + + onKeyUp : function(e){ + if(!e.isNavKeyPress() || e.getKey() == e.ENTER){ + this.autoSize(); + } + }, + + + autoSize : function(){ + if(!this.grow || !this.textSizeEl){ + return; + } + var el = this.el; + var v = el.dom.value; + var ts = this.textSizeEl; + Ext.fly(ts).setWidth(this.el.getWidth()); + if(v.length < 1){ + v = "  "; + }else{ + v += " \n "; + } + if(Ext.isIE){ + v = v.replace(/\n/g, '
      '); + } + ts.innerHTML = v; + var h = Math.min(this.growMax, Math.max(ts.offsetHeight, this.growMin)); + if(h != this.lastHeight){ + this.lastHeight = h; + this.el.setHeight(h); + this.fireEvent("autosize", this, h); + } + }, + + setValue : function(v){ + Ext.form.TextArea.superclass.setValue.call(this, v); + this.autoSize(); + } +}); + +Ext.form.NumberField = function(config){ + Ext.form.NumberField.superclass.constructor.call(this, config); +}; + +Ext.extend(Ext.form.NumberField, Ext.form.TextField, { + + fieldClass: "x-form-field x-form-num-field", + + allowDecimals : true, + + decimalSeparator : ".", + + decimalPrecision : 2, + + allowNegative : true, + + minValue : Number.NEGATIVE_INFINITY, + + maxValue : Number.MAX_VALUE, + + minText : "The minimum value for this field is {0}", + + maxText : "The maximum value for this field is {0}", + + nanText : "{0} is not a valid number", + + initEvents : function(){ + Ext.form.NumberField.superclass.initEvents.call(this); + var allowed = "0123456789"; + if(this.allowDecimals){ + allowed += this.decimalSeparator; + } + if(this.allowNegative){ + allowed += "-"; + } + var keyPress = function(e){ + var k = e.getKey(); + if(!Ext.isIE && (e.isNavKeyPress() || k == e.BACKSPACE || (k == e.DELETE && e.button == -1))){ + return; + } + var c = e.getCharCode(); + if(allowed.indexOf(String.fromCharCode(c)) === -1){ + e.stopEvent(); + } + }; + this.el.on("keypress", keyPress, this); + }, + + validateValue : function(value){ + if(!Ext.form.NumberField.superclass.validateValue.call(this, value)){ + return false; + } + if(value.length < 1){ return true; + } + value = String(value).replace(this.decimalSeparator, "."); + if(isNaN(value)){ + this.markInvalid(String.format(this.nanText, value)); + return false; + } + var num = this.parseValue(value); + if(num < this.minValue){ + this.markInvalid(String.format(this.minText, this.minValue)); + return false; + } + if(num > this.maxValue){ + this.markInvalid(String.format(this.maxText, this.maxValue)); + return false; + } + return true; + }, + + parseValue : function(value){ + return parseFloat(String(value).replace(this.decimalSeparator, ".")); + }, + + 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); + }, + + decimalPrecisionFcn : function(v){ + return Math.floor(v); + } +}); + +Ext.form.DateField = function(config){ + Ext.form.DateField.superclass.constructor.call(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 = null; + 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 + ")"); + } +}; + +Ext.extend(Ext.form.DateField, Ext.form.TriggerField, { + + format : "m/d/y", + + disabledDays : null, + + disabledDaysText : "Disabled", + + disabledDates : null, + + disabledDatesText : "Disabled", + + minValue : null, + + maxValue : null, + + minText : "The date in this field must be after {0}", + + maxText : "The date in this field must be before {0}", + + invalidText : "{0} is not a valid date - it must be in the format {1}", + + triggerClass : 'x-form-date-trigger', + + + defaultAutoCreate : {tag: "input", type: "text", size: "10", autocomplete: "off"}, + + validateValue : function(value){ + value = this.formatDate(value); + if(!Ext.form.DateField.superclass.validateValue.call(this, value)){ + return false; + } + if(value.length < 1){ return true; + } + var svalue = value; + value = this.parseDate(value); + if(!value){ + this.markInvalid(String.format(this.invalidText, svalue, this.format)); + return false; + } + var time = value.getTime(); + if(this.minValue && time < this.minValue.getTime()){ + this.markInvalid(String.format(this.minText, this.formatDate(this.minValue))); + return false; + } + if(this.maxValue && time > this.maxValue.getTime()){ + this.markInvalid(String.format(this.maxText, this.formatDate(this.maxValue))); + return false; + } + if(this.disabledDays){ + var day = value.getDay(); + for(var i = 0; i < this.disabledDays.length; i++) { + if(day === this.disabledDays[i]){ + this.markInvalid(this.disabledDaysText); + return false; + } + } + } + var fvalue = this.formatDate(value); + if(this.ddMatch && this.ddMatch.test(fvalue)){ + this.markInvalid(String.format(this.disabledDatesText, fvalue)); + return false; + } + return true; + }, + + validateBlur : function(){ + return !this.menu || !this.menu.isVisible(); + }, + + + getValue : function(){ + return this.parseDate(Ext.form.DateField.superclass.getValue.call(this)) || ""; + }, + + + setValue : function(date){ + Ext.form.DateField.superclass.setValue.call(this, this.formatDate(this.parseDate(date))); + }, + + parseDate : function(value){ + return (!value || value instanceof Date) ? + value : Date.parseDate(value, this.format); + }, + + formatDate : function(date){ + return (!date || !(date instanceof Date)) ? + date : date.dateFormat(this.format); + }, + + menuListeners : { + select: function(m, d){ + this.setValue(d); + }, + show : function(){ this.onFocus(); + }, + hide : function(){ + this.focus(); + var ml = this.menuListeners; + this.menu.un("select", ml.select, this); + this.menu.un("show", ml.show, this); + this.menu.un("hide", ml.hide, this); + } + }, + + onTriggerClick : function(){ + if(this.disabled){ + return; + } + if(this.menu == null){ + this.menu = new Ext.menu.DateMenu(); + } + Ext.apply(this.menu.picker, { + minDate : this.minValue, + maxDate : this.maxValue, + disabledDatesRE : this.ddMatch, + disabledDatesText : this.disabledDatesText, + disabledDays : this.disabledDays, + disabledDaysText : this.disabledDaysText, + format : this.format, + minText : String.format(this.minText, this.formatDate(this.minValue)), + maxText : String.format(this.maxText, this.formatDate(this.maxValue)) + }); + this.menu.on(Ext.apply({}, this.menuListeners, { + scope:this + })); + this.menu.picker.setValue(this.getValue() || new Date()); + this.menu.show(this.el, "tl-bl?"); + } +}); + +Ext.form.ComboBox = function(config){ + Ext.form.ComboBox.superclass.constructor.call(this, config); + this.addEvents({ + + 'expand' : true, + + 'collapse' : true, + + 'beforeselect' : true, + + 'select' : true, + + 'beforequery': true + }); + if(this.transform){ + var s = Ext.getDom(this.transform); + if(!this.hiddenName){ + this.hiddenName = s.name; + } + if(!this.store){ + this.mode = 'local'; + var d = [], opts = s.options; + for(var i = 0, len = opts.length;i < len; i++){ + var o = opts[i]; + var value = (Ext.isIE ? o.getAttributeNode('value').specified : o.hasAttribute('value')) ? o.value : o.text; + if(o.selected) { + this.value = value; + } + d.push([value, o.text]); + } + this.store = new Ext.data.SimpleStore({ + 'id': 0, + fields: ['value', 'text'], + data : d + }); + this.valueField = 'value'; + this.displayField = 'text'; + } + s.name = Ext.id(); if(!this.lazyRender){ + this.target = true; + this.el = Ext.DomHelper.insertBefore(s, this.autoCreate || this.defaultAutoCreate); + s.parentNode.removeChild(s); this.render(this.el.parentNode); + }else{ + s.parentNode.removeChild(s); } + + } + this.selectedIndex = -1; + if(this.mode == 'local'){ + if(config.queryDelay === undefined){ + this.queryDelay = 10; + } + if(config.minChars === undefined){ + this.minChars = 0; + } + } +}; + +Ext.extend(Ext.form.ComboBox, Ext.form.TriggerField, { + + + + + defaultAutoCreate : {tag: "input", type: "text", size: "24", autocomplete: "off"}, + + listWidth: undefined, + + displayField: undefined, + + valueField: undefined, + + hiddenName: undefined, + + listClass: '', + + selectedClass: 'x-combo-selected', + + triggerClass : 'x-form-arrow-trigger', + + shadow:'sides', + + listAlign: 'tl-bl?', + + maxHeight: 300, + + triggerAction: 'query', + + minChars : 4, + + typeAhead: false, + + queryDelay: 500, + + pageSize: 0, + + selectOnFocus:false, + + queryParam: 'query', + + loadingText: 'Loading...', + + resizable: false, + + handleHeight : 8, + + editable: true, + + allQuery: '', + + mode: 'remote', + + minListWidth : 70, + + forceSelection:false, + + typeAheadDelay : 250, + + valueNotFoundText : undefined, + + onRender : function(ct, position){ + Ext.form.ComboBox.superclass.onRender.call(this, ct, position); + if(this.hiddenName){ + this.hiddenField = this.el.insertSibling({tag:'input', type:'hidden', name: this.hiddenName, id: this.hiddenName}, + 'before', true); + this.hiddenField.value = + this.hiddenValue !== undefined ? this.hiddenValue : + this.value !== undefined ? this.value : ''; + + this.el.dom.removeAttribute('name'); + } + if(Ext.isGecko){ + this.el.dom.setAttribute('autocomplete', 'off'); + } + + var cls = 'x-combo-list'; + + this.list = new Ext.Layer({ + shadow: this.shadow, cls: [cls, this.listClass].join(' '), constrain:false + }); + + this.list.setWidth(this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth)); + this.list.swallowEvent('mousewheel'); + this.assetHeight = 0; + + if(this.title){ + this.header = this.list.createChild({cls:cls+'-hd', html: this.title}); + this.assetHeight += this.header.getHeight(); + } + + this.innerList = this.list.createChild({cls:cls+'-inner'}); + this.innerList.on('mouseover', this.onViewOver, this); + this.innerList.on('mousemove', this.onViewMove, this); + + if(this.pageSize){ + this.footer = this.list.createChild({cls:cls+'-ft'}); + this.pageTb = new Ext.PagingToolbar(this.footer, this.store, + {pageSize: this.pageSize}); + this.assetHeight += this.footer.getHeight(); + } + + if(!this.tpl){ + this.tpl = '
      {' + this.displayField + '}
      '; + } + + this.view = new Ext.View(this.innerList, this.tpl, { + singleSelect:true, store: this.store, selectedClass: this.selectedClass + }); + + this.view.on('click', this.onViewClick, this); + + this.store.on('beforeload', this.onBeforeLoad, this); + this.store.on('load', this.onLoad, this); + this.store.on('loadexception', this.collapse, this); + + if(this.resizable){ + this.resizer = new Ext.Resizable(this.list, { + pinned:true, handles:'se' + }); + this.resizer.on('resize', function(r, w, h){ + this.maxHeight = h-this.handleHeight-this.list.getFrameWidth('tb')-this.assetHeight; + this.listWidth = w; + this.restrictHeight(); + }, this); + this[this.pageSize?'footer':'innerList'].setStyle('margin-bottom', this.handleHeight+'px'); + } + if(!this.editable){ + this.editable = true; + this.setEditable(false); + } + }, + + initEvents : function(){ + Ext.form.ComboBox.superclass.initEvents.call(this); + + this.keyNav = new Ext.KeyNav(this.el, { + "up" : function(e){ + this.inKeyMode = true; + this.selectPrev(); + }, + + "down" : function(e){ + if(!this.isExpanded()){ + this.onTriggerClick(); + }else{ + this.inKeyMode = true; + this.selectNext(); + } + }, + + "enter" : function(e){ + this.onViewClick(); + }, + + "esc" : function(e){ + this.collapse(); + }, + + "tab" : function(e){ + this.onViewClick(false); + return true; + }, + + scope : this, + + doRelay : function(foo, bar, hname){ + if(hname == 'down' || this.scope.isExpanded()){ + return Ext.KeyNav.prototype.doRelay.apply(this, arguments); + } + return true; + } + }); + this.queryDelay = Math.max(this.queryDelay || 10, + this.mode == 'local' ? 10 : 250); + this.dqTask = new Ext.util.DelayedTask(this.initQuery, this); + if(this.typeAhead){ + this.taTask = new Ext.util.DelayedTask(this.onTypeAhead, this); + } + if(this.editable !== false){ + this.el.on("keyup", this.onKeyUp, this); + } + if(this.forceSelection){ + this.on('blur', this.doForce, this); + } + }, + + onDestroy : function(){ + if(this.view){ + this.view.setStore(null); + this.view.el.removeAllListeners(); + this.view.el.remove(); + this.view.purgeListeners(); + } + if(this.list){ + this.list.destroy(); + } + if(this.store){ + this.store.un('beforeload', this.onBeforeLoad, this); + this.store.un('load', this.onLoad, this); + this.store.un('loadexception', this.collapse, this); + } + Ext.form.ComboBox.superclass.onDestroy.call(this); + }, + + fireKey : function(e){ + if(e.isNavKeyPress() && !this.list.isVisible()){ + this.fireEvent("specialkey", this, e); + } + }, + + onResize: function(w, h){ + if(this.list && this.listWidth === undefined){ + this.list.setWidth(Math.max(w, this.minListWidth)); + } + }, + + + setEditable : function(value){ + if(value == this.editable){ + return; + } + this.editable = value; + if(!value){ + this.el.dom.setAttribute('readOnly', true); + this.el.on('mousedown', this.onTriggerClick, this); + this.el.addClass('x-combo-noedit'); + }else{ + this.el.dom.setAttribute('readOnly', false); + this.el.un('mousedown', this.onTriggerClick, this); + this.el.removeClass('x-combo-noedit'); + } + }, + + onBeforeLoad : function(){ + if(!this.hasFocus){ + return; + } + this.innerList.update(this.loadingText ? + '
      '+this.loadingText+'
      ' : ''); + this.restrictHeight(); + this.selectedIndex = -1; + }, + + onLoad : function(){ + if(!this.hasFocus){ + return; + } + if(this.store.getCount() > 0){ + this.expand(); + this.restrictHeight(); + if(this.lastQuery == this.allQuery){ + if(this.editable){ + this.el.dom.select(); + } + if(!this.selectByValue(this.value, true)){ + this.select(0, true); + } + }else{ + this.selectNext(); + if(this.typeAhead && this.lastKey != Ext.EventObject.BACKSPACE && this.lastKey != Ext.EventObject.DELETE){ + this.taTask.delay(this.typeAheadDelay); + } + } + }else{ + this.onEmptyResults(); + } + }, + + onTypeAhead : function(){ + if(this.store.getCount() > 0){ + var r = this.store.getAt(0); + var newValue = r.data[this.displayField]; + var len = newValue.length; + var selStart = this.getRawValue().length; + if(selStart != len){ + this.setRawValue(newValue); + this.selectText(selStart, newValue.length); + } + } + }, + + onSelect : function(record, index){ + if(this.fireEvent('beforeselect', this, record, index) !== false){ + this.setValue(record.data[this.valueField || this.displayField]); + this.collapse(); + this.fireEvent('select', this, record, index); + } + }, + + + getValue : function(){ + if(this.valueField){ + return typeof this.value != 'undefined' ? this.value : ''; + }else{ + return Ext.form.ComboBox.superclass.getValue.call(this); + } + }, + + + clearValue : function(){ + if(this.hiddenField){ + this.hiddenField.value = ''; + } + this.setRawValue(''); + this.lastSelectionText = ''; + }, + + + setValue : function(v){ + var text = v; + if(this.valueField){ + var r = this.findRecord(this.valueField, v); + if(r){ + text = r.data[this.displayField]; + }else if(this.valueNotFoundText){ + text = this.valueNotFoundText; + } + } + this.lastSelectionText = text; + if(this.hiddenField){ + this.hiddenField.value = v; + } + Ext.form.ComboBox.superclass.setValue.call(this, text); + this.value = v; + }, + + findRecord : function(prop, value){ + var record; + if(this.store.getCount() > 0){ + this.store.each(function(r){ + if(r.data[prop] == value){ + record = r; + return false; + } + }); + } + return record; + }, + + onViewMove : function(e, t){ + this.inKeyMode = false; + }, + + onViewOver : function(e, t){ + if(this.inKeyMode){ return; + } + var item = this.view.findItemFromChild(t); + if(item){ + var index = this.view.indexOf(item); + this.select(index, false); + } + }, + + onViewClick : function(doFocus){ + var index = this.view.getSelectedIndexes()[0]; + var r = this.store.getAt(index); + if(r){ + this.onSelect(r, index); + } + if(doFocus !== false){ + this.el.focus(); + } + }, + + restrictHeight : function(){ + this.innerList.dom.style.height = ''; + var inner = this.innerList.dom; + var h = Math.max(inner.clientHeight, inner.offsetHeight, inner.scrollHeight); + this.innerList.setHeight(h < this.maxHeight ? 'auto' : this.maxHeight); + this.list.beginUpdate(); + this.list.setHeight(this.innerList.getHeight()+this.list.getFrameWidth('tb')+(this.resizable?this.handleHeight:0)+this.assetHeight); + this.list.alignTo(this.el, this.listAlign); + this.list.endUpdate(); + }, + + onEmptyResults : function(){ + this.collapse(); + }, + + + isExpanded : function(){ + return this.list.isVisible(); + }, + + + selectByValue : function(v, scrollIntoView){ + if(v !== undefined && v !== null){ + var r = this.findRecord(this.valueField || this.displayField, v); + if(r){ + this.select(this.store.indexOf(r), scrollIntoView); + return true; + } + } + return false; + }, + + + select : function(index, scrollIntoView){ + this.selectedIndex = index; + this.view.select(index); + if(scrollIntoView !== false){ + var el = this.view.getNode(index); + if(el){ + this.innerList.scrollChildIntoView(el); + } + } + }, + + + selectNext : function(){ + var ct = this.store.getCount(); + if(ct > 0){ + if(this.selectedIndex == -1){ + this.select(0); + }else if(this.selectedIndex < ct-1){ + this.select(this.selectedIndex+1); + } + } + }, + + + selectPrev : function(){ + var ct = this.store.getCount(); + if(ct > 0){ + if(this.selectedIndex == -1){ + this.select(0); + }else if(this.selectedIndex != 0){ + this.select(this.selectedIndex-1); + } + } + }, + + onKeyUp : function(e){ + if(this.editable !== false && !e.isSpecialKey()){ + this.lastKey = e.getKey(); + this.dqTask.delay(this.queryDelay); + } + }, + + validateBlur : function(){ + return !this.list || !this.list.isVisible(); + }, + + initQuery : function(){ + this.doQuery(this.getRawValue()); + }, + + doForce : function(){ + if(this.el.dom.value.length > 0){ + this.el.dom.value = + this.lastSelectionText === undefined ? '' : this.lastSelectionText; + this.applyEmptyText(); + } + }, + + + doQuery : function(q, forceAll){ + if(q === undefined || q === null){ + q = ''; + } + var qe = { + query: q, + forceAll: forceAll, + combo: this, + cancel:false + }; + if(this.fireEvent('beforequery', qe)===false || qe.cancel){ + return false; + } + q = qe.query; + forceAll = qe.forceAll; + if(forceAll === true || (q.length >= this.minChars)){ + if(this.lastQuery != q){ + this.lastQuery = q; + if(this.mode == 'local'){ + this.selectedIndex = -1; + if(forceAll){ + this.store.clearFilter(); + }else{ + this.store.filter(this.displayField, q); + } + this.onLoad(); + }else{ + this.store.baseParams[this.queryParam] = q; + this.store.load({ + params: this.getParams(q) + }); + this.expand(); + } + }else{ + this.selectedIndex = -1; + this.onLoad(); + } + } + }, + + getParams : function(q){ + var p = {}; + if(this.pageSize){ + p.start = 0; + p.limit = this.pageSize; + } + return p; + }, + + + collapse : function(){ + if(!this.isExpanded()){ + return; + } + this.list.hide(); + Ext.get(document).un('mousedown', this.collapseIf, this); + this.fireEvent('collapse', this); + }, + + collapseIf : function(e){ + if(!e.within(this.wrap) && !e.within(this.list)){ + this.collapse(); + } + }, + + + expand : function(){ + if(this.isExpanded() || !this.hasFocus){ + return; + } + this.list.alignTo(this.el, this.listAlign); + this.list.show(); + Ext.get(document).on('mousedown', this.collapseIf, this); + this.fireEvent('expand', this); + }, + + onTriggerClick : function(){ + if(this.disabled){ + return; + } + if(this.isExpanded()){ + this.collapse(); + this.el.focus(); + }else{ + this.hasFocus = true; + this.doQuery(this.triggerAction == 'all' ? + this.doQuery(this.allQuery, true) : this.doQuery(this.getRawValue())); + this.el.focus(); + } + } +}); + +Ext.form.Checkbox = function(config){ + Ext.form.Checkbox.superclass.constructor.call(this, config); + this.addEvents({ + + check : true + }); +}; + +Ext.extend(Ext.form.Checkbox, Ext.form.Field, { + + focusClass : "x-form-check-focus", + + fieldClass: "x-form-field", + + checked: false, + + defaultAutoCreate : { tag: "input", type: 'checkbox', autocomplete: "off"}, + + boxLabel : undefined, + + + setSize : function(w, h){ + if(!this.wrap){ + this.width = w; + this.height = h; + return; + } + this.wrap.setSize(w, h); + if(!this.boxLabel){ + this.el.alignTo(this.wrap, 'c-c'); + } + }, + + initEvents : function(){ + Ext.form.Checkbox.superclass.initEvents.call(this); + this.el.on("click", this.onClick, this); + this.el.on("change", this.onClick, this); + }, + + + onRender : function(ct, position){ + Ext.form.Checkbox.superclass.onRender.call(this, ct, position); + if(this.inputValue !== undefined){ + this.el.dom.value = this.inputValue; + } + this.wrap = this.el.wrap({cls: "x-form-check-wrap"}); + if(this.boxLabel){ + this.wrap.createChild({tag: 'label', htmlFor: this.el.id, cls: 'x-form-cb-label', html: this.boxLabel}); + } + if(this.checked){ + this.setValue(true); + } + }, + + initValue : Ext.emptyFn, + + + getValue : function(){ + if(this.rendered){ + return this.el.dom.checked; + } + return false; + }, + + onClick : function(){ + if(this.el.dom.checked != this.checked){ + this.setValue(this.el.dom.checked); + } + }, + + + setValue : function(v){ + this.checked = (v === true || v === 'true' || v == '1'); + if(this.el && this.el.dom){ + this.el.dom.checked = this.checked; + } + this.fireEvent("check", this, this.checked); + } +}); + +Ext.form.Radio = function(){ + Ext.form.Radio.superclass.constructor.apply(this, arguments); +}; +Ext.extend(Ext.form.Radio, Ext.form.Checkbox, { + inputType: 'radio' +}); + +Ext.form.BasicForm = function(el, config){ + Ext.apply(this, config); + + this.items = new Ext.util.MixedCollection(false, function(o){ + return o.id || (o.id = Ext.id()); + }); + this.addEvents({ + + beforeaction: true, + + actionfailed : true, + + actioncomplete : true + }); + if(el){ + this.initEl(el); + } + Ext.form.BasicForm.superclass.constructor.call(this); +}; + +Ext.extend(Ext.form.BasicForm, Ext.util.Observable, { + + + + + + + + timeout: 30, + + activeAction : null, + + + waitMsgTarget : undefined, + + initEl : function(el){ + this.el = Ext.get(el); + this.id = this.el.id || Ext.id(); + this.el.on('submit', this.onSubmit, this); + this.el.addClass('x-form'); + }, + + onSubmit : function(e){ + e.stopEvent(); + }, + + + isValid : function(){ + var valid = true; + this.items.each(function(f){ + if(!f.validate()){ + valid = false; + } + }); + return valid; + }, + + + doAction : function(action, options){ + if(typeof action == 'string'){ + action = new Ext.form.Action.ACTION_TYPES[action](this, options); + } + if(this.fireEvent('beforeaction', this, action) !== false){ + this.beforeAction(action); + action.run.defer(100, action); + } + }, + + + submit : function(options){ + this.doAction('submit', options); + }, + + + load : function(options){ + this.doAction('load', options); + }, + + + updateRecord : function(record){ + record.beginEdit(); + var fs = record.fields; + fs.each(function(f){ + var field = this.findField(f.name); + if(field){ + record.set(f.name, field.getValue()); + } + }, this); + record.endEdit(); + }, + + beforeAction : function(action){ + var o = action.options; + if(o.waitMsg){ + if(this.waitMsgTarget === true){ + this.el.mask(o.waitMsg, 'x-mask-loading'); + }else if(this.waitMsgTarget){ + this.waitMsgTarget = Ext.get(this.waitMsgTarget); + this.waitMsgTarget.mask(o.waitMsg, 'x-mask-loading'); + }else{ + Ext.MessageBox.wait(o.waitMsg, o.waitTitle || this.waitTitle || 'Please Wait...'); + } + } + }, + + afterAction : function(action, success){ + this.activeAction = null; + var o = action.options; + if(o.waitMsg){ + if(this.waitMsgTarget === true){ + this.el.unmask(); + }else if(this.waitMsgTarget){ + this.waitMsgTarget.unmask(); + }else{ + Ext.MessageBox.updateProgress(1); + Ext.MessageBox.hide(); + } + } + if(success){ + if(o.reset){ + this.reset(); + } + Ext.callback(o.success, o.scope, [this, action]); + this.fireEvent('actioncomplete', this, action); + }else{ + Ext.callback(o.failure, o.scope, [this, action]); + this.fireEvent('actionfailed', this, action); + } + }, + + + findField : function(id){ + var field = this.items.get(id); + if(!field){ + this.items.each(function(f){ + if(f.isFormField && (f.dataIndex == id || f.id == id || f.getName() == id)){ + field = f; + return false; + } + }); + } + return field || null; + }, + + + + markInvalid : function(errors){ + if(errors instanceof Array){ + for(var i = 0, len = errors.length; i < len; i++){ + var fieldError = errors[i]; + var f = this.findField(fieldError.id); + if(f){ + f.markInvalid(fieldError.msg); + } + } + }else{ + var field, id; + for(id in errors){ + if(typeof errors[id] != 'function' && (field = this.findField(id))){ + field.markInvalid(errors[id]); + } + } + } + }, + + + setValues : function(values){ + if(values instanceof Array){ for(var i = 0, len = values.length; i < len; i++){ + var v = values[i]; + var f = this.findField(v.id); + if(f){ + f.setValue(v.value); + } + } + }else{ var field, id; + for(id in values){ + if(typeof values[id] != 'function' && (field = this.findField(id))){ + field.setValue(values[id]); + } + } + } + }, + + + getValues : function(asString){ + var fs = Ext.lib.Ajax.serializeForm(this.el.dom); + if(asString === true){ + return fs; + } + return Ext.urlDecode(fs); + }, + + + clearInvalid : function(){ + this.items.each(function(f){ + f.clearInvalid(); + }); + }, + + + reset : function(){ + this.items.each(function(f){ + f.reset(); + }); + }, + + + add : function(){ + this.items.addAll(Array.prototype.slice.call(arguments, 0)); + }, + + + + remove : function(field){ + this.items.remove(field); + }, + + + render : function(){ + this.items.each(function(f){ + if(f.isFormField && !f.rendered && document.getElementById(f.id)){ f.applyTo(f.id); + } + }); + }, + + + applyToFields : function(o){ + this.items.each(function(f){ + Ext.apply(f, o); + }); + }, + + + applyIfToFields : function(o){ + this.items.each(function(f){ + Ext.applyIf(f, o); + }); + } +}); + +Ext.BasicForm = Ext.form.BasicForm; + +Ext.form.Form = function(config){ + Ext.form.Form.superclass.constructor.call(this, null, config); + this.url = this.url || this.action; + if(!this.root){ + this.root = new Ext.form.Layout(Ext.applyIf({ + id: Ext.id() + }, config)); + } + this.active = this.root; + + this.buttons = []; + this.addEvents({ + + clientvalidation: true + }); +}; + +Ext.extend(Ext.form.Form, Ext.form.BasicForm, { + + + + buttonAlign:'center', + + + minButtonWidth:75, + + + labelAlign:'left', + + + monitorValid : false, + + + monitorPoll : 200, + + + column : function(c){ + var col = new Ext.form.Column(c); + this.start(col); + if(arguments.length > 1){ this.add.apply(this, Array.prototype.slice.call(arguments, 1)); + this.end(); + } + return col; + }, + + + fieldset : function(c){ + var fs = new Ext.form.FieldSet(c); + this.start(fs); + if(arguments.length > 1){ this.add.apply(this, Array.prototype.slice.call(arguments, 1)); + this.end(); + } + return fs; + }, + + + container : function(c){ + var l = new Ext.form.Layout(c); + this.start(l); + if(arguments.length > 1){ this.add.apply(this, Array.prototype.slice.call(arguments, 1)); + this.end(); + } + return l; + }, + + + start : function(c){ + Ext.applyIf(c, {'labelAlign': this.active.labelAlign, 'labelWidth': this.active.labelWidth, 'itemCls': this.active.itemCls}); + this.active.stack.push(c); + c.ownerCt = this.active; + this.active = c; + return this; + }, + + + end : function(){ + if(this.active == this.root){ + return this; + } + this.active = this.active.ownerCt; + return this; + }, + + + add : function(){ + this.active.stack.push.apply(this.active.stack, arguments); + var r = []; + for(var i = 0, a = arguments, len = a.length; i < len; i++) { + if(a[i].isFormField){ + r.push(a[i]); + } + } + if(r.length > 0){ + Ext.form.Form.superclass.add.apply(this, r); + } + return this; + }, + + + render : function(ct){ + ct = Ext.get(ct); + var o = this.autoCreate || { + tag: 'form', + method : this.method || 'POST', + id : this.id || Ext.id() + }; + this.initEl(ct.createChild(o)); + + this.root.render(this.el); + + this.items.each(function(f){ + f.render('x-form-el-'+f.id); + }); + + if(this.buttons.length > 0){ + var tb = this.el.createChild({cls:'x-form-btns-ct', cn: { + cls:"x-form-btns x-form-btns-"+this.buttonAlign, + html:'
      ' + }}, null, true); + var tr = tb.getElementsByTagName('tr')[0]; + for(var i = 0, len = this.buttons.length; i < len; i++) { + var b = this.buttons[i]; + var td = document.createElement('td'); + td.className = 'x-form-btn-td'; + b.render(tr.appendChild(td)); + } + } + if(this.monitorValid){ this.startMonitoring(); + } + return this; + }, + + + addButton : function(config, handler, scope){ + var bc = { + handler: handler, + scope: scope, + minWidth: this.minButtonWidth, + hideParent:true + }; + if(typeof config == "string"){ + bc.text = config; + }else{ + Ext.apply(bc, config); + } + var btn = new Ext.Button(null, bc); + this.buttons.push(btn); + return btn; + }, + + + startMonitoring : function(){ + if(!this.bound){ + this.bound = true; + Ext.TaskMgr.start({ + run : this.bindHandler, + interval : this.monitorPoll || 200, + scope: this + }); + } + }, + + + stopMonitoring : function(){ + this.bound = false; + }, + + bindHandler : function(){ + if(!this.bound){ + return false; } + var valid = true; + this.items.each(function(f){ + if(!f.isValid(true)){ + valid = false; + return false; + } + }); + for(var i = 0, len = this.buttons.length; i < len; i++){ + var btn = this.buttons[i]; + if(btn.formBind === true && btn.disabled === valid){ + btn.setDisabled(!valid); + } + } + this.fireEvent('clientvalidation', this, valid); + } +}); + + +Ext.Form = Ext.form.Form; + + +Ext.form.Action = function(form, options){ + this.form = form; + this.options = options || {}; +}; + +Ext.form.Action.CLIENT_INVALID = 'client'; +Ext.form.Action.SERVER_INVALID = 'server'; +Ext.form.Action.CONNECT_FAILURE = 'connect'; +Ext.form.Action.LOAD_FAILURE = 'load'; + +Ext.form.Action.prototype = { + type : 'default', + failureType : undefined, + response : undefined, + result : undefined, + + run : function(options){ + + }, + + success : function(response){ + + }, + + handleResponse : function(response){ + + }, + + failure : function(response){ + this.response = response; + this.failureType = Ext.form.Action.CONNECT_FAILURE; + this.form.afterAction(this, false); + }, + + processResponse : function(response){ + this.response = response; + if(!response.responseText){ + return true; + } + this.result = this.handleResponse(response); + return this.result; + }, + + getUrl : function(appendParams){ + var url = this.options.url || this.form.url || this.form.el.dom.action; + if(appendParams){ + var p = this.getParams(); + if(p){ + url += (url.indexOf('?') != -1 ? '&' : '?') + p; + } + } + return url; + }, + + getMethod : function(){ + return (this.options.method || this.form.method || this.form.el.dom.method || 'POST').toUpperCase(); + }, + + getParams : function(){ + var bp = this.form.baseParams; + var p = this.options.params; + if(p){ + if(typeof p == "object"){ + p = Ext.urlEncode(Ext.applyIf(p, bp)); + }else if(typeof p == 'string' && bp){ + p += '&' + Ext.urlEncode(bp); + } + }else if(bp){ + p = Ext.urlEncode(bp); + } + return p; + }, + + createCallback : function(){ + return { + success: this.success, + failure: this.failure, + scope: this, + timeout: (this.form.timeout*1000), + upload: this.form.fileUpload ? this.success : undefined + }; + } +}; + +Ext.form.Action.Submit = function(form, options){ + Ext.form.Action.Submit.superclass.constructor.call(this, form, options); +}; + +Ext.extend(Ext.form.Action.Submit, Ext.form.Action, { + type : 'submit', + + run : function(){ + var o = this.options; + var isPost = this.getMethod() == 'POST'; + if(o.clientValidation === false || this.form.isValid()){ + Ext.lib.Ajax.formRequest( + this.form.el.dom, + this.getUrl(!isPost), + this.createCallback(), + isPost ? this.getParams() : null, this.form.fileUpload, Ext.SSL_SECURE_URL); + + }else if (o.clientValidation !== false){ this.failureType = Ext.form.Action.CLIENT_INVALID; + this.form.afterAction(this, false); + } + }, + + success : function(response){ + var result = this.processResponse(response); + if(result === true || result.success){ + this.form.afterAction(this, true); + return; + } + if(result.errors){ + this.form.markInvalid(result.errors); + this.failureType = Ext.form.Action.SERVER_INVALID; + } + this.form.afterAction(this, false); + }, + + handleResponse : function(response){ + if(this.form.errorReader){ + var rs = this.form.errorReader.read(response); + var errors = []; + if(rs.records){ + for(var i = 0, len = rs.records.length; i < len; i++) { + var r = rs.records[i]; + errors[i] = r.data; + } + } + if(errors.length < 1){ + errors = null; + } + return { + success : rs.success, + errors : errors + }; + } + return Ext.decode(response.responseText); + } +}); + + +Ext.form.Action.Load = function(form, options){ + Ext.form.Action.Load.superclass.constructor.call(this, form, options); + this.reader = this.form.reader; +}; + +Ext.extend(Ext.form.Action.Load, Ext.form.Action, { + type : 'load', + + run : function(){ + Ext.lib.Ajax.request( + this.getMethod(), + this.getUrl(false), + this.createCallback(), + this.getParams()); + }, + + success : function(response){ + var result = this.processResponse(response); + if(result === true || !result.success || !result.data){ + this.failureType = Ext.form.Action.LOAD_FAILURE; + this.form.afterAction(this, false); + return; + } + this.form.clearInvalid(); + this.form.setValues(result.data); + this.form.afterAction(this, true); + }, + + handleResponse : function(response){ + if(this.form.reader){ + var rs = this.form.reader.read(response); + var data = rs.records && rs.records[0] ? rs.records[0].data : null; + return { + success : rs.success, + data : data + }; + } + return Ext.decode(response.responseText); + } +}); + +Ext.form.Action.ACTION_TYPES = { + 'load' : Ext.form.Action.Load, + 'submit' : Ext.form.Action.Submit +}; + + +Ext.form.Layout = function(config){ + Ext.form.Layout.superclass.constructor.call(this, config); + this.stack = []; +}; + +Ext.extend(Ext.form.Layout, Ext.Component, { + + + + + + clear : true, + + labelSeparator : ':', + + hideLabels : false, + + defaultAutoCreate : {tag: 'div', cls: 'x-form-ct'}, + + onRender : function(ct, position){ + if(this.el){ this.el = Ext.get(this.el); + }else { var cfg = this.getAutoCreate(); + this.el = ct.createChild(cfg, position); + } + if(this.style){ + this.el.applyStyles(this.style); + } + if(this.labelAlign){ + this.el.addClass('x-form-label-'+this.labelAlign); + } + if(this.hideLabels){ + this.labelStyle = "display:none"; + this.elementStyle = "padding-left:0;"; + }else{ + if(typeof this.labelWidth == 'number'){ + this.labelStyle = "width:"+this.labelWidth+"px;"; + this.elementStyle = "padding-left:"+((this.labelWidth+(typeof this.labelPad == 'number' ? this.labelPad : 5))+'px')+";"; + } + if(this.labelAlign == 'top'){ + this.labelStyle = "width:auto;"; + this.elementStyle = "padding-left:0;"; + } + } + var stack = this.stack; + var slen = stack.length; + if(slen > 0){ + if(!this.fieldTpl){ + var t = new Ext.Template( + '
      ', + '', + '
      ', + '
      ', + '
      ' + ); + t.disableFormats = true; + t.compile(); + Ext.form.Layout.prototype.fieldTpl = t; + } + for(var i = 0; i < slen; i++) { + if(stack[i].isFormField){ + this.renderField(stack[i]); + }else{ + this.renderComponent(stack[i]); + } + } + } + if(this.clear){ + this.el.createChild({cls:'x-form-clear'}); + } + }, + + renderField : function(f){ + this.fieldTpl.append(this.el, [ + f.id, f.fieldLabel, + f.labelStyle||this.labelStyle||'', + this.elementStyle||'', + typeof f.labelSeparator == 'undefined' ? this.labelSeparator : f.labelSeparator, + f.itemCls||this.itemCls||'' + ]); + }, + + renderComponent : function(c){ + c.render(this.el); + } +}); + + +Ext.form.Column = function(config){ + Ext.form.Column.superclass.constructor.call(this, config); +}; + +Ext.extend(Ext.form.Column, Ext.form.Layout, { + + + + defaultAutoCreate : {tag: 'div', cls: 'x-form-ct x-form-column'}, + + onRender : function(ct, position){ + Ext.form.Column.superclass.onRender.call(this, ct, position); + if(this.width){ + this.el.setWidth(this.width); + } + } +}); + + +Ext.form.FieldSet = function(config){ + Ext.form.FieldSet.superclass.constructor.call(this, config); +}; + +Ext.extend(Ext.form.FieldSet, Ext.form.Layout, { + + + + defaultAutoCreate : {tag: 'fieldset', cn: {tag:'legend'}}, + + onRender : function(ct, position){ + Ext.form.FieldSet.superclass.onRender.call(this, ct, position); + if(this.legend){ + this.setLegend(this.legend); + } + }, + + setLegend : function(text){ + if(this.rendered){ + this.el.child('legend').update(text); + } + } +}); + +Ext.form.VTypes = function(){ + var alpha = /^[a-zA-Z_]+$/; + var alphanum = /^[a-zA-Z0-9_]+$/; + var email = /^([\w]+)(.[\w]+)*@([\w-]+\.){1,5}([A-Za-z]){2,4}$/; + var url = /(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i; + + return { + + 'email' : function(v){ + return email.test(v); + }, + + 'emailText' : 'This field should be an e-mail address in the format "user@domain.com"', + + 'emailMask' : /[a-z0-9_\.\-@]/i, + + + 'url' : function(v){ + return url.test(v); + }, + + 'urlText' : 'This field should be a URL in the format "http:/'+'/www.domain.com"', + + + 'alpha' : function(v){ + return alpha.test(v); + }, + + 'alphaText' : 'This field should only contain letters and _', + + 'alphaMask' : /[a-z_]/i, + + + 'alphanum' : function(v){ + return alphanum.test(v); + }, + + 'alphanumText' : 'This field should only contain letters, numbers and _', + + 'alphanumMask' : /[a-z0-9_]/i + }; +}(); + +Ext.LayoutManager = function(container, config){ + Ext.LayoutManager.superclass.constructor.call(this); + this.el = Ext.get(container); + + if(this.el.dom == document.body && Ext.isIE && !config.allowScroll){ + document.body.scroll = "no"; + }else if(this.el.dom != document.body && this.el.getStyle('position') == 'static'){ + this.el.position('relative'); + } + this.id = this.el.id; + this.el.addClass("x-layout-container"); + + this.monitorWindowResize = true; + this.regions = {}; + this.addEvents({ + + "layout" : true, + + "regionresized" : true, + + "regioncollapsed" : true, + + "regionexpanded" : true + }); + this.updating = false; + Ext.EventManager.onWindowResize(this.onWindowResize, this, true); +}; + +Ext.extend(Ext.LayoutManager, 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){ + size = this.el.getSize(); + }else{ + size = {width: Ext.lib.Dom.getViewWidth(), height: Ext.lib.Dom.getViewHeight()}; + } + 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.toLowerCase()]; + }, + + onWindowResize : function(){ + if(this.monitorWindowResize){ + this.layout(); + } + } +}); + +Ext.BorderLayout = function(container, config){ + config = config || {}; + Ext.BorderLayout.superclass.constructor.call(this, container, config); + this.factory = config.factory || Ext.BorderLayout.RegionFactory; + 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]); + } + } +}; + +Ext.extend(Ext.BorderLayout, Ext.LayoutManager, { + + addRegion : function(target, config){ + if(!this.regions[target]){ + var r = this.factory.create(target, this, config); + this.bindRegion(target, r); + } + return this.regions[target]; + }, + + + bindRegion : function(name, r){ + this.regions[name] = r; + r.on("visibilitychange", this.layout, this); + r.on("paneladded", this.layout, this); + r.on("panelremoved", this.layout, this); + r.on("invalidated", this.layout, this); + r.on("resized", this.onRegionResized, this); + r.on("collapsed", this.onRegionCollapsed, this); + r.on("expanded", this.onRegionExpanded, this); + }, + + + 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 rs = this.regions; + var n = rs["north"], s = rs["south"], west = rs["west"], e = rs["east"], c = rs["center"]; + + + + 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) + }; + + + + 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 = Ext.state.Manager; + } + var sm = new Ext.LayoutStateManager(); + sm.init(this, provider); + }, + + + batchAdd : function(regions){ + this.beginUpdate(); + for(var rname in regions){ + var lr = this.regions[rname]; + if(lr){ + this.addTypedPanels(lr, regions[rname]); + } + } + this.endUpdate(); + }, + + + addTypedPanels : function(lr, ps){ + if(typeof ps == 'string'){ + lr.add(new Ext.ContentPanel(ps)); + } + else if(ps instanceof Array){ + for(var i =0, len = ps.length; i < len; i++){ + this.addTypedPanels(lr, ps[i]); + } + } + else if(!ps.events){ + var el = ps.el; + delete ps.el; + lr.add(new Ext.ContentPanel(el || Ext.id(), ps)); + } + else { + lr.add(ps); + } + } +}); + +Ext.BorderLayout.create = function(config, targetEl){ + var layout = new Ext.BorderLayout(targetEl || document.body, config); + layout.beginUpdate(); + var regions = Ext.BorderLayout.RegionFactory.validRegions; + for(var j = 0, jlen = regions.length; j < jlen; j++){ + var lr = regions[j]; + if(layout.regions[lr] && config[lr].panels){ + var r = layout.regions[lr]; + var ps = config[lr].panels; + layout.addTypedPanels(r, ps); + } + } + layout.endUpdate(); + return layout; +}; + +Ext.BorderLayout.RegionFactory = { + validRegions : ["north","south","east","west","center"], + + create : function(target, mgr, config){ + target = target.toLowerCase(); + if(config.lightweight || config.basic){ + return new Ext.BasicLayoutRegion(mgr, config, target); + } + switch(target){ + case "north": + return new Ext.NorthLayoutRegion(mgr, config); + case "south": + return new Ext.SouthLayoutRegion(mgr, config); + case "east": + return new Ext.EastLayoutRegion(mgr, config); + case "west": + return new Ext.WestLayoutRegion(mgr, config); + case "center": + return new Ext.CenterLayoutRegion(mgr, config); + } + throw 'Layout region "'+target+'" not supported.'; + } +}; + +Ext.BasicLayoutRegion = function(mgr, config, pos, skipConfig){ + this.mgr = mgr; + this.position = pos; + this.events = { + + "beforeremove" : true, + + "invalidated" : true, + + "visibilitychange" : true, + + "paneladded" : true, + + "panelremoved" : true, + + "collapsed" : true, + + "expanded" : true, + + "slideshow" : true, + + "slidehide" : true, + + "panelactivated" : true, + + "resized" : true + }; + + this.panels = new Ext.util.MixedCollection(); + this.panels.getKey = this.getPanelId.createDelegate(this); + this.box = null; + this.activePanel = null; + if(skipConfig !== true){ + this.applyConfig(config); + } +}; + +Ext.extend(Ext.BasicLayoutRegion, Ext.util.Observable, { + getPanelId : function(p){ + return p.getId(); + }, + + applyConfig : function(config){ + this.margins = config.margins || this.margins || {top: 0, left: 0, right:0, bottom: 0}; + this.config = config; + }, + + + resizeTo : function(newSize){ + var el = this.el ? this.el : + (this.activePanel ? this.activePanel.getEl() : null); + if(el){ + switch(this.position){ + case "east": + case "west": + el.setWidth(newSize); + this.fireEvent("resized", this, newSize); + break; + case "north": + case "south": + el.setHeight(newSize); + this.fireEvent("resized", this, newSize); + break; + } + } + }, + + getBox : function(){ + return this.activePanel ? this.activePanel.getEl().getBox(false, true) : null; + }, + + getMargins : function(){ + return this.margins; + }, + + updateBox : function(box){ + this.box = box; + var el = this.activePanel.getEl(); + el.dom.style.left = box.x + "px"; + el.dom.style.top = box.y + "px"; + this.activePanel.setSize(box.width, box.height); + }, + + + getEl : function(){ + return this.activePanel; + }, + + + isVisible : function(){ + return this.activePanel ? true : false; + }, + + setActivePanel : function(panel){ + panel = this.getPanel(panel); + if(this.activePanel && this.activePanel != panel){ + this.activePanel.setActiveState(false); + this.activePanel.getEl().setLeftTop(-10000,-10000); + } + this.activePanel = panel; + panel.setActiveState(true); + if(this.box){ + panel.setSize(this.box.width, this.box.height); + } + this.fireEvent("panelactivated", this, panel); + this.fireEvent("invalidated"); + }, + + + showPanel : function(panel){ + if(panel = this.getPanel(panel)){ + this.setActivePanel(panel); + } + return panel; + }, + + + getActivePanel : function(){ + return this.activePanel; + }, + + + add : function(panel){ + if(arguments.length > 1){ + for(var i = 0, len = arguments.length; i < len; i++) { + this.add(arguments[i]); + } + return null; + } + if(this.hasPanel(panel)){ + this.showPanel(panel); + return panel; + } + var el = panel.getEl(); + if(el.dom.parentNode != this.mgr.el.dom){ + this.mgr.el.dom.appendChild(el.dom); + } + if(panel.setRegion){ + panel.setRegion(this); + } + this.panels.add(panel); + el.setStyle("position", "absolute"); + if(!panel.background){ + this.setActivePanel(panel); + if(this.config.initialSize && this.panels.getCount()==1){ + this.resizeTo(this.config.initialSize); + } + } + this.fireEvent("paneladded", this, panel); + return panel; + }, + + + hasPanel : function(panel){ + if(typeof panel == "object"){ + panel = panel.getId(); + } + return this.getPanel(panel) ? true : false; + }, + + + remove : function(panel, preservePanel){ + panel = this.getPanel(panel); + if(!panel){ + return null; + } + var e = {}; + this.fireEvent("beforeremove", this, panel, e); + if(e.cancel === true){ + return null; + } + var panelId = panel.getId(); + this.panels.removeKey(panelId); + return panel; + }, + + + getPanel : function(id){ + if(typeof id == "object"){ + return id; + } + return this.panels.get(id); + }, + + + getPosition: function(){ + return this.position; + } +}); + +Ext.LayoutRegion = function(mgr, config, pos){ + Ext.LayoutRegion.superclass.constructor.call(this, mgr, config, pos, true); + var dh = Ext.DomHelper; + + this.el = dh.append(mgr.el.dom, {tag: "div", cls: "x-layout-panel x-layout-panel-" + this.position}, true); + + + this.titleEl = dh.append(this.el.dom, {tag: "div", unselectable: "on", cls: "x-unselectable x-layout-panel-hd x-layout-title-"+this.position, children:[ + {tag: "span", cls: "x-unselectable x-layout-panel-hd-text", unselectable: "on", html: " "}, + {tag: "div", cls: "x-unselectable x-layout-panel-hd-tools", unselectable: "on"} + ]}, true); + this.titleEl.enableDisplayMode(); + + this.titleTextEl = this.titleEl.dom.firstChild; + this.tools = Ext.get(this.titleEl.dom.childNodes[1], true); + this.closeBtn = this.createTool(this.tools.dom, "x-layout-close"); + this.closeBtn.enableDisplayMode(); + this.closeBtn.on("click", this.closeClicked, this); + this.closeBtn.hide(); + + this.createBody(config); + this.visible = true; + this.collapsed = false; + + if(config.hideWhenEmpty){ + this.hide(); + this.on("paneladded", this.validateVisibility, this); + this.on("panelremoved", this.validateVisibility, this); + } + this.applyConfig(config); +}; + +Ext.extend(Ext.LayoutRegion, Ext.BasicLayoutRegion, { + + createBody : function(){ + + this.bodyEl = this.el.createChild({tag: "div", cls: "x-layout-panel-body"}); + }, + + applyConfig : function(c){ + if(c.collapsible && this.position != "center" && !this.collapsedEl){ + var dh = Ext.DomHelper; + if(c.titlebar !== false){ + this.collapseBtn = this.createTool(this.tools.dom, "x-layout-collapse-"+this.position); + this.collapseBtn.on("click", this.collapse, this); + this.collapseBtn.enableDisplayMode(); + + if(c.showPin === true || this.showPin){ + this.stickBtn = this.createTool(this.tools.dom, "x-layout-stick"); + this.stickBtn.enableDisplayMode(); + this.stickBtn.on("click", this.expand, this); + this.stickBtn.hide(); + } + } + + this.collapsedEl = dh.append(this.mgr.el.dom, {cls: "x-layout-collapsed x-layout-collapsed-"+this.position, children:[ + {cls: "x-layout-collapsed-tools", children:[{cls: "x-layout-ctools-inner"}]} + ]}, true); + if(c.floatable !== false){ + this.collapsedEl.addClassOnOver("x-layout-collapsed-over"); + this.collapsedEl.on("click", this.collapseClick, this); + } + + if(c.collapsedTitle && (this.position == "north" || this.position== "south")) { + this.collapsedTitleTextEl = dh.append(this.collapsedEl.dom, {tag: "div", cls: "x-unselectable x-layout-panel-hd-text", + id: "message", unselectable: "on", style:{"float":"left"}}); + this.collapsedTitleTextEl.innerHTML = c.collapsedTitle; + } + this.expandBtn = this.createTool(this.collapsedEl.dom.firstChild.firstChild, "x-layout-expand-"+this.position); + this.expandBtn.on("click", this.expand, this); + } + if(this.collapseBtn){ + this.collapseBtn.setVisible(c.collapsible == true); + } + this.cmargins = c.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 = c.margins || this.margins || {top: 0, left: 0, right:0, bottom: 0}; + this.bottomTabs = c.tabPosition != "top"; + this.autoScroll = c.autoScroll || false; + if(this.autoScroll){ + this.bodyEl.setStyle("overflow", "auto"); + }else{ + this.bodyEl.setStyle("overflow", "hidden"); + } + + if((!c.titlebar && !c.title) || c.titlebar === false){ + this.titleEl.hide(); + }else{ + this.titleEl.show(); + if(c.title){ + this.titleTextEl.innerHTML = c.title; + } + } + + this.duration = c.duration || .30; + this.slideDuration = c.slideDuration || .45; + this.config = c; + if(c.collapsed){ + this.collapse(true); + } + if(c.hidden){ + this.hide(); + } + }, + + isVisible : function(){ + return this.visible; + }, + + + setCollapsedTitle : function(title){ + title = title || " "; + if(this.collapsedTitleTextEl){ + this.collapsedTitleTextEl.innerHTML = title; + } + }, + + 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("x-layout-panel-dragover"); + }, + + unhighlight : function(){ + this.el.removeClass("x-layout-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.updateBody(box.width, box.height); + }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(); + } + }, + + updateBody : function(w, h){ + if(w !== null){ + this.el.setWidth(w); + w -= this.el.getBorderWidth("rl"); + if(this.config.adjustments){ + w += this.config.adjustments[0]; + } + } + if(h !== null){ + this.el.setHeight(h); + h = this.titleEl && this.titleEl.isDisplayed() ? h - (this.titleEl.getHeight()||0) : h; + h -= this.el.getBorderWidth("tb"); + if(this.config.adjustments){ + h += this.config.adjustments[1]; + } + this.bodyEl.setHeight(h); + if(this.tabs){ + h = this.tabs.syncHeight(h); + } + } + if(this.panelSize){ + w = w !== null ? w : this.panelSize.width; + h = h !== null ? h : this.panelSize.height; + } + if(this.activePanel){ + var el = this.activePanel.getEl(); + w = w !== null ? w : el.getWidth(); + h = h !== null ? h : el.getHeight(); + this.panelSize = {width: w, height: h}; + this.activePanel.setSize(w, h); + } + if(Ext.isIE && this.tabs){ + this.tabs.el.repaint(); + } + }, + + + 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); + }, + + 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.fireEvent("invalidated", this); + 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 || this.el.hasActiveFx()) return; + if(this.isSlid){ + this.afterSlideIn(); + skipAnim = true; + } + this.collapsed = false; + if(this.config.animate && skipAnim !== true){ + this.animateExpand(); + }else{ + this.el.show(); + 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 Ext.TabPanel(this.bodyEl.dom, { + tabPosition: this.bottomTabs ? 'bottom' : 'top', + disableTooltips: this.config.disableTabTips + }); + if(this.config.hideTabs){ + ts.stripWrap.setDisplayed(false); + } + 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"); + ts.bodyEl.addClass('x-layout-tabs-body'); + 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()); + if(panel.tabTip !== undefined){ + ti.setTooltip(panel.tabTip); + } + ti.on("activate", function(){ + this.setActivePanel(panel); + }, this); + if(this.config.closeOnTab){ + ti.on("beforeclose", function(t, e){ + e.cancel = true; + this.remove(panel); + }, this); + } + return ti; + }, + + updatePanelTitle : function(panel, title){ + if(this.activePanel == panel){ + this.updateTitle(title); + } + if(this.tabs){ + var ti = this.tabs.getTab(panel.getEl().id); + ti.setText(title); + if(panel.tabTip !== undefined){ + ti.setTooltip(panel.tabTip); + } + } + }, + + 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); + } + if(this.closeBtn){ + this.closeBtn.setVisible(!this.config.closeOnTab && !this.isSlid && panel.isClosable()); + } + this.updateTitle(panel.getTitle()); + if(this.tabs){ + this.fireEvent("invalidated", this); + } + this.fireEvent("panelactivated", this, panel); + }, + + + showPanel : function(panel){ + if(panel = this.getPanel(panel)){ + if(this.tabs){ + var tab = this.tabs.getTab(panel.getEl().id); + if(tab.isHidden()){ + this.tabs.unhideTab(tab.id); + } + tab.activate(); + }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; + } + if(this.hasPanel(panel)){ + this.showPanel(panel); + return panel; + } + panel.setRegion(this); + this.panels.add(panel); + if(this.panels.getCount() == 1 && !this.config.alwaysShowTabs){ + this.bodyEl.dom.appendChild(panel.getEl().dom); + if(panel.background !== true){ + this.setActivePanel(panel); + } + this.fireEvent("paneladded", this, panel); + return panel; + } + if(!this.tabs){ + this.initTabs(); + }else{ + this.initPanelAsTab(panel); + } + if(panel.background !== true){ + this.tabs.activate(panel.getEl().id); + } + this.fireEvent("paneladded", this, panel); + return panel; + }, + + + 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); + } + }, + + clearPanels : function(){ + while(this.panels.getCount() > 0){ + this.remove(this.panels.first()); + } + }, + + + remove : function(panel, preservePanel){ + panel = this.getPanel(panel); + if(!panel){ + return null; + } + var e = {}; + this.fireEvent("beforeremove", this, panel, e); + if(e.cancel === true){ + return null; + } + preservePanel = (typeof preservePanel != "undefined" ? preservePanel : (this.config.preservePanels === true || panel.preserve === 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("div"); + 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; + }, + + createTool : function(parentEl, className){ + var btn = Ext.DomHelper.append(parentEl, {tag: "div", cls: "x-layout-tools-button", + children: [{tag: "div", cls: "x-layout-tools-button-inner " + className, html: " "}]}, true); + btn.addClassOnOver("x-layout-tools-button-over"); + return btn; + } +}); + +Ext.SplitLayoutRegion = function(mgr, config, pos, cursor){ + this.cursor = cursor; + Ext.SplitLayoutRegion.superclass.constructor.call(this, mgr, config, pos); +}; + +Ext.extend(Ext.SplitLayoutRegion, Ext.LayoutRegion, { + splitTip : "Drag to resize.", + collapsibleSplitTip : "Drag to resize. Double click to hide.", + useSplitTips : false, + + applyConfig : function(config){ + Ext.SplitLayoutRegion.superclass.applyConfig.call(this, config); + if(config.split){ + if(!this.split){ + var splitEl = Ext.DomHelper.append(this.mgr.el.dom, + {tag: "div", id: this.el.id + "-split", cls: "x-layout-split x-layout-split-"+this.position, html: " "}); + + this.split = new Ext.SplitBar(splitEl, this.el, this.orientation); + this.split.on("moved", this.onSplitMove, this); + this.split.useShim = config.useShim === true; + this.split.getMaximumSize = this[this.position == 'north' || this.position == 'south' ? 'getVMaxSize' : 'getHMaxSize'].createDelegate(this); + if(this.useSplitTips){ + this.split.el.dom.title = config.collapsible ? this.collapsibleSplitTip : this.splitTip; + } + if(config.collapsible){ + this.split.el.on("dblclick", this.collapse, this); + } + } + if(typeof config.minSize != "undefined"){ + this.split.minSize = config.minSize; + } + if(typeof config.maxSize != "undefined"){ + this.split.maxSize = config.maxSize; + } + if(config.hideWhenEmpty || config.hidden){ + this.hideSplitter(); + } + } + }, + + getHMaxSize : 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()); + }, + + getVMaxSize : function(){ + var cmax = this.config.maxSize || 10000; + var center = this.mgr.getRegion("center"); + return Math.min(cmax, (this.el.getHeight()+center.getEl().getHeight())-center.getMinHeight()); + }, + + onSplitMove : function(split, newSize){ + this.fireEvent("resized", this, newSize); + }, + + + getSplitBar : function(){ + return this.split; + }, + + hide : function(){ + this.hideSplitter(); + Ext.SplitLayoutRegion.superclass.hide.call(this); + }, + + hideSplitter : function(){ + if(this.split){ + this.split.el.setLocation(-2000,-2000); + this.split.el.hide(); + } + }, + + show : function(){ + if(this.split){ + this.split.el.show(); + } + Ext.SplitLayoutRegion.superclass.show.call(this); + }, + + beforeSlide: function(){ + if(Ext.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(Ext.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(); + } + } + } + }, + + initAutoHide : function(){ + if(this.autoHide !== false){ + if(!this.autoHideHd){ + var st = new Ext.util.DelayedTask(this.slideIn, this); + this.autoHideHd = { + "mouseout": function(e){ + if(!e.within(this.el, true)){ + st.delay(500); + } + }, + "mouseover" : function(e){ + st.cancel(); + }, + scope : this + }; + } + this.el.on(this.autoHideHd); + } + }, + + clearAutoHide : function(){ + if(this.autoHide !== false){ + this.el.un("mouseout", this.autoHideHd.mouseout); + this.el.un("mouseover", this.autoHideHd.mouseover); + } + }, + + clearMonitor : function(){ + Ext.get(document).un("click", this.slideInIf, this); + }, + + + slideOut : function(){ + if(this.isSlid || this.el.hasActiveFx()){ + return; + } + this.isSlid = true; + if(this.collapseBtn){ + this.collapseBtn.hide(); + } + this.closeBtnState = this.closeBtn.getStyle('display'); + this.closeBtn.hide(); + if(this.stickBtn){ + this.stickBtn.show(); + } + this.el.show(); + this.el.alignTo(this.collapsedEl, this.getCollapseAnchor()); + this.beforeSlide(); + this.el.setStyle("z-index", 20000); + this.el.slideIn(this.getSlideAnchor(), { + callback: function(){ + this.afterSlide(); + this.initAutoHide(); + Ext.get(document).on("click", this.slideInIf, this); + this.fireEvent("slideshow", this); + }, + scope: this, + block: true + }); + }, + + afterSlideIn : function(){ + this.clearAutoHide(); + this.isSlid = false; + this.clearMonitor(); + this.el.setStyle("z-index", ""); + if(this.collapseBtn){ + this.collapseBtn.show(); + } + this.closeBtn.setStyle('display', this.closeBtnState); + if(this.stickBtn){ + this.stickBtn.hide(); + } + this.fireEvent("slidehide", this); + }, + + slideIn : function(cb){ + if(!this.isSlid || this.el.hasActiveFx()){ + Ext.callback(cb); + return; + } + this.isSlid = false; + this.beforeSlide(); + this.el.slideOut(this.getSlideAnchor(), { + callback: function(){ + this.el.setLeftTop(-10000, -10000); + this.afterSlide(); + this.afterSlideIn(); + Ext.callback(cb); + }, + scope: this, + block: true + }); + }, + + slideInIf : function(e){ + if(!e.within(this.el)){ + this.slideIn(); + } + }, + + animateCollapse : function(){ + this.beforeSlide(); + this.el.setStyle("z-index", 20000); + var anchor = this.getSlideAnchor(); + this.el.slideOut(anchor, { + callback : function(){ + this.el.setStyle("z-index", ""); + this.collapsedEl.slideIn(anchor, {duration:.3}); + this.afterSlide(); + this.el.setLocation(-10000,-10000); + this.el.hide(); + this.fireEvent("collapsed", this); + }, + scope: this, + block: true + }); + }, + + animateExpand : function(){ + this.beforeSlide(); + this.el.alignTo(this.collapsedEl, this.getCollapseAnchor(), this.getExpandAdj()); + this.el.setStyle("z-index", 20000); + this.collapsedEl.hide({ + duration:.1 + }); + this.el.slideIn(this.getSlideAnchor(), { + callback : function(){ + this.el.setStyle("z-index", ""); + this.afterSlide(); + if(this.split){ + this.split.el.show(); + } + this.fireEvent("invalidated", this); + this.fireEvent("expanded", this); + }, + scope: this, + block: true + }); + }, + + anchors : { + "west" : "left", + "east" : "right", + "north" : "top", + "south" : "bottom" + }, + + sanchors : { + "west" : "l", + "east" : "r", + "north" : "t", + "south" : "b" + }, + + canchors : { + "west" : "tl-tr", + "east" : "tr-tl", + "north" : "tl-bl", + "south" : "bl-tl" + }, + + getAnchor : function(){ + return this.anchors[this.position]; + }, + + getCollapseAnchor : function(){ + return this.canchors[this.position]; + }, + + getSlideAnchor : function(){ + return this.sanchors[this.position]; + }, + + getAlignAdj : function(){ + var cm = this.cmargins; + switch(this.position){ + case "west": + return [0, 0]; + break; + case "east": + return [0, 0]; + break; + case "north": + return [0, 0]; + break; + case "south": + return [0, 0]; + break; + } + }, + + getExpandAdj : function(){ + var c = this.collapsedEl, cm = this.cmargins; + switch(this.position){ + case "west": + return [-(cm.right+c.getWidth()+cm.left), 0]; + break; + case "east": + return [cm.right+c.getWidth()+cm.left, 0]; + break; + case "north": + return [0, -(cm.top+cm.bottom+c.getHeight())]; + break; + case "south": + return [0, cm.top+cm.bottom+c.getHeight()]; + break; + } + } +}); + +Ext.CenterLayoutRegion = function(mgr, config){ + Ext.CenterLayoutRegion.superclass.constructor.call(this, mgr, config, "center"); + this.visible = true; + this.minWidth = config.minWidth || 20; + this.minHeight = config.minHeight || 20; +}; + +Ext.extend(Ext.CenterLayoutRegion, Ext.LayoutRegion, { + hide : function(){ + + }, + + show : function(){ + + }, + + getMinWidth: function(){ + return this.minWidth; + }, + + getMinHeight: function(){ + return this.minHeight; + } +}); + + +Ext.NorthLayoutRegion = function(mgr, config){ + Ext.NorthLayoutRegion.superclass.constructor.call(this, mgr, config, "north", "n-resize"); + if(this.split){ + this.split.placement = Ext.SplitBar.TOP; + this.split.orientation = Ext.SplitBar.VERTICAL; + this.split.el.addClass("x-layout-split-v"); + } + var size = config.initialSize || config.height; + if(typeof size != "undefined"){ + this.el.setHeight(size); + } +}; +Ext.extend(Ext.NorthLayoutRegion, Ext.SplitLayoutRegion, { + orientation: Ext.SplitBar.VERTICAL, + 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.updateBody(box.width, null); + } + Ext.NorthLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +Ext.SouthLayoutRegion = function(mgr, config){ + Ext.SouthLayoutRegion.superclass.constructor.call(this, mgr, config, "south", "s-resize"); + if(this.split){ + this.split.placement = Ext.SplitBar.BOTTOM; + this.split.orientation = Ext.SplitBar.VERTICAL; + this.split.el.addClass("x-layout-split-v"); + } + var size = config.initialSize || config.height; + if(typeof size != "undefined"){ + this.el.setHeight(size); + } +}; +Ext.extend(Ext.SouthLayoutRegion, Ext.SplitLayoutRegion, { + orientation: Ext.SplitBar.VERTICAL, + 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.updateBody(box.width, null); + } + Ext.SouthLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +Ext.EastLayoutRegion = function(mgr, config){ + Ext.EastLayoutRegion.superclass.constructor.call(this, mgr, config, "east", "e-resize"); + if(this.split){ + this.split.placement = Ext.SplitBar.RIGHT; + this.split.orientation = Ext.SplitBar.HORIZONTAL; + this.split.el.addClass("x-layout-split-h"); + } + var size = config.initialSize || config.width; + if(typeof size != "undefined"){ + this.el.setWidth(size); + } +}; +Ext.extend(Ext.EastLayoutRegion, Ext.SplitLayoutRegion, { + orientation: Ext.SplitBar.HORIZONTAL, + 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.updateBody(null, box.height); + } + Ext.EastLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +Ext.WestLayoutRegion = function(mgr, config){ + Ext.WestLayoutRegion.superclass.constructor.call(this, mgr, config, "west", "w-resize"); + if(this.split){ + this.split.placement = Ext.SplitBar.LEFT; + this.split.orientation = Ext.SplitBar.HORIZONTAL; + this.split.el.addClass("x-layout-split-h"); + } + var size = config.initialSize || config.width; + if(typeof size != "undefined"){ + this.el.setWidth(size); + } +}; +Ext.extend(Ext.WestLayoutRegion, Ext.SplitLayoutRegion, { + orientation: Ext.SplitBar.HORIZONTAL, + 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.updateBody(null, box.height); + } + Ext.WestLayoutRegion.superclass.updateBox.call(this, box); + } +}); + + +Ext.LayoutStateManager = function(layout){ + + this.state = { + north: {}, + south: {}, + east: {}, + west: {} + }; +}; + +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); + layout.on("regioncollapsed", this.onRegionCollapsed, this); + layout.on("regionexpanded", this.onRegionExpanded, this); + }, + + 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(); + } +}; + +Ext.ContentPanel = function(el, config, content){ + Ext.ContentPanel.superclass.constructor.call(this); + if(el.autoCreate){ + config = el; + el = Ext.id(); + } + this.el = Ext.get(el); + if(!this.el && config && config.autoCreate){ + if(typeof config.autoCreate == "object"){ + if(!config.autoCreate.id){ + config.autoCreate.id = config.id||el; + } + this.el = Ext.DomHelper.append(document.body, + config.autoCreate, true); + }else{ + this.el = Ext.DomHelper.append(document.body, + {tag: "div", cls: "x-layout-inactive-content", id: config.id||el}, true); + } + } + this.closable = false; + this.loaded = false; + this.active = false; + if(typeof config == "string"){ + this.title = config; + }else{ + Ext.apply(this, config); + } + if(this.resizeEl){ + this.resizeEl = Ext.get(this.resizeEl, true); + }else{ + this.resizeEl = this.el; + } + this.addEvents({ + + "activate" : true, + + "deactivate" : true, + + + "resize" : true + }); + if(this.autoScroll){ + this.resizeEl.setStyle("overflow", "auto"); + } + content = content || this.content; + if(content){ + this.setContent(content); + } + if(config && config.url){ + this.setUrl(this.url, this.params, this.loadOnce); + } +}; + +Ext.extend(Ext.ContentPanel, Ext.util.Observable, { + tabTip:'', + setRegion : function(region){ + this.region = region; + if(region){ + this.el.replaceClass("x-layout-inactive-content", "x-layout-active-content"); + }else{ + this.el.replaceClass("x-layout-active-content", "x-layout-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); + }, + + ignoreResize : function(w, h){ + if(this.lastSize && this.lastSize.width == w && this.lastSize.height == h){ + return true; + }else{ + this.lastSize = {width: w, height: h}; + return false; + } + }, + + getUpdateManager : function(){ + return this.el.getUpdateManager(); + }, + + load : function(){ + var um = this.el.getUpdateManager(); + um.update.apply(um, arguments); + return this; + }, + + + + 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.resizeEl != this.el){ + width -= this.el.getFrameWidth('lr'); + height -= this.el.getFrameWidth('tb'); + } + if(this.toolbar){ + var te = this.toolbar.getEl(); + height -= te.getHeight(); + te.setWidth(width); + } + if(this.adjustments){ + width += this.adjustments[0]; + height += this.adjustments[1]; + } + return {"width": width, "height": height}; + }, + + setSize : function(width, height){ + if(this.fitToFrame && !this.ignoreResize(width, height)){ + if(this.fitContainer && this.resizeEl != this.el){ + this.el.setSize(width, height); + } + var size = this.adjustForComponents(width, height); + this.resizeEl.setSize(this.autoWidth ? "auto" : size.width, this.autoHeight ? "auto" : size.height); + this.fireEvent('resize', this, 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(); + }, + + + refresh : function(){ + if(this.refreshDelegate){ + this.loaded = false; + this.refreshDelegate(); + } + }, + + + destroy : function(){ + this.el.removeAllListeners(); + var tempEl = document.createElement("span"); + tempEl.appendChild(this.el.dom); + tempEl.innerHTML = ""; + this.el.remove(); + this.el = null; + } +}); + + +Ext.GridPanel = function(grid, config){ + this.wrapper = Ext.DomHelper.append(document.body, + {tag: "div", cls: "x-layout-grid-wrapper x-layout-inactive-content"}, true); + this.wrapper.dom.appendChild(grid.container.dom); + 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("x-layout-inactive-content", "x-layout-component-panel"); +}; + +Ext.extend(Ext.GridPanel, Ext.ContentPanel, { + getId : function(){ + return this.grid.id; + }, + + + getGrid : function(){ + return this.grid; + }, + + setSize : function(width, height){ + if(!this.ignoreResize(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().scroller.clip(); + }, + + afterSlide : function(){ + this.grid.getView().scroller.unclip(); + }, + + destroy : function(){ + this.grid.destroy(); + delete this.grid; + Ext.GridPanel.superclass.destroy.call(this); + } +}); + + + +Ext.NestedLayoutPanel = function(layout, config){ + Ext.NestedLayoutPanel.superclass.constructor.call(this, layout.getEl(), config); + layout.monitorWindowResize = false; + this.layout = layout; + this.layout.getEl().addClass("x-layout-nested-layout"); +}; + +Ext.extend(Ext.NestedLayoutPanel, Ext.ContentPanel, { + + setSize : function(width, height){ + if(!this.ignoreResize(width, height)){ + var size = this.adjustForComponents(width, height); + var el = this.layout.getEl(); + el.setSize(size.width, size.height); + var touch = el.dom.offsetWidth; + this.layout.layout(); + + if(Ext.isIE && !this.initialized){ + this.initialized = true; + this.layout.layout(); + } + } + }, + + + getLayout : function(){ + return this.layout; + } +}); + +Ext.ScrollPanel = function(el, config, content){ + config = config || {}; + config.fitToFrame = true; + Ext.ScrollPanel.superclass.constructor.call(this, el, config, content); + + this.el.dom.style.overflow = "hidden"; + var wrap = this.el.wrap({cls: "x-scroller x-layout-inactive-content"}); + this.el.removeClass("x-layout-inactive-content"); + this.el.on("mousewheel", this.onWheel, this); + + var up = wrap.createChild({cls: "x-scroller-up", html: " "}, this.el.dom); + var down = wrap.createChild({cls: "x-scroller-down", html: " "}); + up.unselectable(); down.unselectable(); + up.on("click", this.scrollUp, this); + down.on("click", this.scrollDown, this); + up.addClassOnOver("x-scroller-btn-over"); + down.addClassOnOver("x-scroller-btn-over"); + up.addClassOnClick("x-scroller-btn-click"); + down.addClassOnClick("x-scroller-btn-click"); + this.adjustments = [0, -(up.getHeight() + down.getHeight())]; + + this.resizeEl = this.el; + this.el = wrap; this.up = up; this.down = down; +}; + +Ext.extend(Ext.ScrollPanel, Ext.ContentPanel, { + increment : 100, + wheelIncrement : 5, + scrollUp : function(){ + this.resizeEl.scroll("up", this.increment, {callback: this.afterScroll, scope: this}); + }, + + scrollDown : function(){ + this.resizeEl.scroll("down", this.increment, {callback: this.afterScroll, scope: this}); + }, + + afterScroll : function(){ + var el = this.resizeEl; + var t = el.dom.scrollTop, h = el.dom.scrollHeight, ch = el.dom.clientHeight; + this.up[t == 0 ? "addClass" : "removeClass"]("x-scroller-btn-disabled"); + this.down[h - t <= ch ? "addClass" : "removeClass"]("x-scroller-btn-disabled"); + }, + + setSize : function(){ + Ext.ScrollPanel.superclass.setSize.apply(this, arguments); + this.afterScroll(); + }, + + onWheel : function(e){ + var d = e.getWheelDelta(); + this.resizeEl.dom.scrollTop -= (d*this.wheelIncrement); + this.afterScroll(); + e.stopEvent(); + }, + + setContent : function(content, loadScripts){ + this.resizeEl.update(content, loadScripts); + } + +}); + +Ext.ReaderLayout = function(config, renderTo){ + var c = config || {size:{}}; + Ext.ReaderLayout.superclass.constructor.call(this, renderTo || document.body, { + north: c.north !== false ? Ext.apply({ + split:false, + initialSize: 32, + titlebar: false + }, c.north) : false, + west: c.west !== false ? Ext.apply({ + split:true, + initialSize: 200, + minSize: 175, + maxSize: 400, + titlebar: true, + collapsible: true, + animate: true, + margins:{left:5,right:0,bottom:5,top:5}, + cmargins:{left:5,right:5,bottom:5,top:5} + }, c.west) : false, + east: c.east !== false ? Ext.apply({ + split:true, + initialSize: 200, + minSize: 175, + maxSize: 400, + titlebar: true, + collapsible: true, + animate: true, + margins:{left:0,right:5,bottom:5,top:5}, + cmargins:{left:5,right:5,bottom:5,top:5} + }, c.east) : false, + center: Ext.apply({ + tabPosition: 'top', + autoScroll:false, + closeOnTab: true, + titlebar:false, + margins:{left:c.west!==false ? 0 : 5,right:c.east!==false ? 0 : 5,bottom:5,top:2} + }, c.center) + }); + + this.el.addClass('x-reader'); + + this.beginUpdate(); + + var inner = new Ext.BorderLayout(Ext.get(document.body).createChild(), { + south: c.preview !== false ? Ext.apply({ + split:true, + initialSize: 200, + minSize: 100, + autoScroll:true, + collapsible:true, + titlebar: true, + cmargins:{top:5,left:0, right:0, bottom:0} + }, c.preview) : false, + center: Ext.apply({ + autoScroll:false, + titlebar:false, + minHeight:200 + }, c.listView) + }); + this.add('center', new Ext.NestedLayoutPanel(inner, + Ext.apply({title: c.mainTitle || '',tabTip:''},c.innerPanelCfg))); + + this.endUpdate(); + + this.regions.preview = inner.getRegion('south'); + this.regions.listView = inner.getRegion('center'); +}; + +Ext.extend(Ext.ReaderLayout, Ext.BorderLayout); + +Ext.grid.Grid = function(container, config){ + + this.container = Ext.get(container); + this.container.update(""); + this.container.setStyle("overflow", "hidden"); + this.container.addClass('x-grid-container'); + + this.id = this.container.id; + + Ext.apply(this, config); + + if(this.ds){ + this.dataSource = this.ds; + delete this.ds; + } + if(this.cm){ + this.colModel = this.cm; + delete this.cm; + } + if(this.sm){ + this.selModel = this.sm; + delete this.sm; + } + + if(this.width){ + this.container.setWidth(this.width); + } + + if(this.height){ + this.container.setHeight(this.height); + } + + this.addEvents({ + + + "click" : true, + + "dblclick" : true, + + "contextmenu" : true, + + "mousedown" : true, + + "mouseup" : true, + + "mouseover" : true, + + "mouseout" : true, + + "keypress" : true, + + "keydown" : true, + + + + + "cellclick" : true, + + "celldblclick" : true, + + "rowclick" : true, + + "rowdblclick" : true, + + "headerclick" : true, + + "headerdblclick" : true, + + "rowcontextmenu" : true, + + "cellcontextmenu" : true, + + "headercontextmenu" : true, + + "bodyscroll" : true, + + "columnresize" : true, + + "columnmove" : true, + + "startdrag" : true, + + "enddrag" : true, + + "dragdrop" : true, + + "dragover" : true, + + "dragenter" : true, + + "dragout" : true + }); + + Ext.grid.Grid.superclass.constructor.call(this); +}; +Ext.extend(Ext.grid.Grid, Ext.util.Observable, { + + minColumnWidth : 25, + + + autoSizeColumns : false, + + + autoSizeHeaders : true, + + + monitorWindowResize : true, + + + maxRowsToMeasure : 0, + + + trackMouseOver : true, + + + enableDragDrop : false, + + + enableColumnMove : true, + + + enableColumnHide : true, + + + enableRowHeightSync : false, + + + stripeRows : true, + + + autoHeight : false, + + + autoExpandColumn : false, + + + autoExpandMin : 50, + + + autoExpandMax : 1000, + + + view : null, + + + allowTextSelectionPattern : /INPUT|TEXTAREA|SELECT/i, + + + loadMask : false, + + + rendered : false, + + + + render : function(){ + var c = this.container; + + if((!c.dom.offsetHeight || c.dom.offsetHeight < 20) || c.getStyle("height") == "auto"){ + this.autoHeight = true; + } + var view = this.getView(); + view.init(this); + + c.on("click", this.onClick, this); + c.on("dblclick", this.onDblClick, this); + c.on("contextmenu", this.onContextMenu, this); + c.on("keydown", this.onKeyDown, this); + + this.relayEvents(c, ["mousedown","mouseup","mouseover","mouseout","keypress"]); + + this.getSelectionModel().init(this); + + view.render(); + + if(this.loadMask){ + this.loadMask = new Ext.LoadMask(this.container, + Ext.apply({store:this.dataSource}, this.loadMask)); + } + this.rendered = true; + return this; + }, + + reconfigure : function(dataSource, colModel){ + if(this.loadMask){ + this.loadMask.destroy(); + this.loadMask = new Ext.LoadMask(this.container, + Ext.apply({store:dataSource}, this.loadMask)); + } + this.view.bind(dataSource, colModel); + this.dataSource = dataSource; + this.colModel = colModel; + this.view.refresh(true); + }, + + onKeyDown : function(e){ + this.fireEvent("keydown", e); + }, + + + destroy : function(removeEl, keepListeners){ + if(this.loadMask){ + this.loadMask.destroy(); + } + var c = this.container; + c.removeAllListeners(); + this.view.destroy(); + this.colModel.purgeListeners(); + if(!keepListeners){ + this.purgeListeners(); + } + c.update(""); + if(removeEl === true){ + c.remove(); + } + }, + + + processEvent : function(name, e){ + this.fireEvent(name, e); + var t = e.getTarget(); + var v = this.view; + var header = v.findHeaderIndex(t); + if(header !== false){ + this.fireEvent("header" + name, this, header, e); + }else{ + var row = v.findRowIndex(t); + var cell = v.findCellIndex(t); + if(row !== false){ + this.fireEvent("row" + name, this, row, e); + if(cell !== false){ + this.fireEvent("cell" + name, this, row, cell, e); + } + } + } + }, + + + onClick : function(e){ + this.processEvent("click", e); + }, + + + onContextMenu : function(e, t){ + this.processEvent("contextmenu", e); + }, + + + onDblClick : function(e){ + this.processEvent("dblclick", e); + }, + + walkCells : function(row, col, step, fn, scope){ + var cm = this.colModel, clen = cm.getColumnCount(); + var ds = this.dataSource, rlen = ds.getCount(), first = true; + if(step < 0){ + if(col < 0){ + row--; + first = false; + } + while(row >= 0){ + if(!first){ + col = clen-1; + } + first = false; + while(col >= 0){ + if(fn.call(scope || this, row, col, cm) === true){ + return [row, col]; + } + col--; + } + row--; + } + } else { + if(col >= clen){ + row++; + first = false; + } + while(row < rlen){ + if(!first){ + col = 0; + } + first = false; + while(col < clen){ + if(fn.call(scope || this, row, col, cm) === true){ + return [row, col]; + } + col++; + } + row++; + } + } + return null; + }, + + getSelections : function(){ + return this.selModel.getSelections(); + }, + + + autoSize : function(){ + if(this.rendered){ + this.view.layout(); + if(this.view.adjustForScroll){ + this.view.adjustForScroll(); + } + } + }, + + + stopEditing : function(){}, + + + getSelectionModel : function(){ + if(!this.selModel){ + this.selModel = new Ext.grid.RowSelectionModel(); + } + return this.selModel; + }, + + + getDataSource : function(){ + return this.dataSource; + }, + + + getColumnModel : function(){ + return this.colModel; + }, + + + getView : function(){ + if(!this.view){ + this.view = new Ext.grid.GridView(); + } + return this.view; + }, + + getDragDropText : function(){ + var count = this.selModel.getCount(); + return String.format(this.ddText, count, count == 1 ? '' : 's'); + } +}); + +Ext.grid.Grid.prototype.ddText = "{0} selected row{1}"; +Ext.grid.AbstractGridView = function(){ + this.grid = null; + + this.events = { + "beforerowremoved" : true, + "beforerowsinserted" : true, + "beforerefresh" : true, + "rowremoved" : true, + "rowsinserted" : true, + "rowupdated" : true, + "refresh" : true + }; + Ext.grid.AbstractGridView.superclass.constructor.call(this); +}; + +Ext.extend(Ext.grid.AbstractGridView, Ext.util.Observable, { + rowClass : "x-grid-row", + cellClass : "x-grid-cell", + tdClass : "x-grid-td", + hdClass : "x-grid-hd", + splitClass : "x-grid-hd-split", + + init: function(grid){ + this.grid = grid; + var cid = this.grid.container.id; + this.colSelector = "#" + cid + " ." + this.cellClass + "-"; + this.tdSelector = "#" + cid + " ." + this.tdClass + "-"; + this.hdSelector = "#" + cid + " ." + this.hdClass + "-"; + this.splitSelector = "#" + cid + " ." + this.splitClass + "-"; + }, + + getColumnRenderers : function(){ + var renderers = []; + var cm = this.grid.colModel; + var colCount = cm.getColumnCount(); + for(var i = 0; i < colCount; i++){ + renderers[i] = cm.getRenderer(i); + } + return renderers; + }, + + getColumnIds : function(){ + var ids = []; + var cm = this.grid.colModel; + var colCount = cm.getColumnCount(); + for(var i = 0; i < colCount; i++){ + ids[i] = cm.getColumnId(i); + } + return ids; + }, + + 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]; + }, + + + setCSSStyle : function(colIndex, name, value){ + var selector = "#" + this.grid.id + " .x-grid-col-" + colIndex; + Ext.util.CSS.updateRule(selector, name, value); + }, + + generateRules : function(cm){ + var ruleBuf = []; + for(var i = 0, len = cm.getColumnCount(); i < len; i++){ + var cid = cm.getColumnId(i); + ruleBuf.push(this.colSelector, cid, " {\n", cm.config[i].css, "}\n", + this.tdSelector, cid, " {\n}\n", + this.hdSelector, cid, " {\n}\n", + this.splitSelector, cid, " {\n}\n"); + } + return Ext.util.CSS.createStyleSheet(ruleBuf.join("")); + } +}); + + +Ext.grid.GridView = function(config){ + Ext.grid.GridView.superclass.constructor.call(this); + this.el = null; + + Ext.apply(this, config); +}; + +Ext.extend(Ext.grid.GridView, Ext.grid.AbstractGridView, { + + + rowClass : "x-grid-row", + + cellClass : "x-grid-col", + + tdClass : "x-grid-td", + + hdClass : "x-grid-hd", + + splitClass : "x-grid-split", + + sortClasses : ["sort-asc", "sort-desc"], + + enableMoveAnim : false, + + hlColor: "C3DAF9", + + dh : Ext.DomHelper, + + fly : Ext.Element.fly, + + css : Ext.util.CSS, + + borderWidth: 1, + + splitOffset: 3, + + scrollIncrement : 22, + + cellRE: /(?:.*?)x-grid-(?:hd|cell|csplit)-(?:[\d]+)-([\d]+)(?:.*?)/, + + findRE: /\s?(?:x-grid-hd|x-grid-col|x-grid-csplit)\s/, + + bind : function(ds, cm){ + if(this.ds){ + this.ds.un("load", this.onLoad, this); + this.ds.un("datachanged", this.onDataChange); + this.ds.un("add", this.onAdd); + this.ds.un("remove", this.onRemove); + this.ds.un("update", this.onUpdate); + this.ds.un("clear", this.onClear); + } + if(ds){ + ds.on("load", this.onLoad, this); + ds.on("datachanged", this.onDataChange, this); + ds.on("add", this.onAdd, this); + ds.on("remove", this.onRemove, this); + ds.on("update", this.onUpdate, this); + ds.on("clear", this.onClear, this); + } + this.ds = ds; + + if(this.cm){ + this.cm.un("widthchange", this.onColWidthChange, this); + this.cm.un("headerchange", this.onHeaderChange, this); + this.cm.un("hiddenchange", this.onHiddenChange, this); + this.cm.un("columnmoved", this.onColumnMove, this); + this.cm.un("columnlockchange", this.onColumnLock, this); + } + if(cm){ + this.generateRules(cm); + cm.on("widthchange", this.onColWidthChange, this); + cm.on("headerchange", this.onHeaderChange, this); + cm.on("hiddenchange", this.onHiddenChange, this); + cm.on("columnmoved", this.onColumnMove, this); + cm.on("columnlockchange", this.onColumnLock, this); + } + this.cm = cm; + }, + + init: function(grid){ + Ext.grid.GridView.superclass.init.call(this, grid); + + this.bind(grid.dataSource, grid.colModel); + + grid.on("headerclick", this.handleHeaderClick, this); + + if(grid.trackMouseOver){ + grid.on("mouseover", this.onRowOver, this); + grid.on("mouseout", this.onRowOut, this); + } + grid.cancelTextSelection = function(){}; + this.gridId = grid.id; + + var tpls = this.templates || {}; + + if(!tpls.master){ + tpls.master = new Ext.Template( + '
      ', + '
      ', + '
      ', + '
      ', + '
      {lockedHeader}
      ', + '
      {lockedBody}
      ', + "
      ", + '
      ', + '
      {header}
      ', + '
      {body}
      ', + "
      ", + '
      ', + '', + '
       
      ', + "
      " + ); + tpls.master.disableformats = true; + } + + if(!tpls.header){ + tpls.header = new Ext.Template( + '', + '{cells}', + "
      {splits}" + ); + tpls.header.disableformats = true; + } + tpls.header.compile(); + + if(!tpls.hcell){ + tpls.hcell = new Ext.Template( + '
      ', + '
      {value}
      ', + "
      " + ); + tpls.hcell.disableFormats = true; + } + tpls.hcell.compile(); + + if(!tpls.hsplit){ + tpls.hsplit = new Ext.Template('
       
      '); + tpls.hsplit.disableFormats = true; + } + tpls.hsplit.compile(); + + if(!tpls.body){ + tpls.body = new Ext.Template( + '', + "{rows}", + "
      " + ); + tpls.body.disableFormats = true; + } + tpls.body.compile(); + + if(!tpls.row){ + tpls.row = new Ext.Template('{cells}'); + tpls.row.disableFormats = true; + } + tpls.row.compile(); + + if(!tpls.cell){ + tpls.cell = new Ext.Template( + '', + '
      {value}
      ', + "" + ); + tpls.cell.disableFormats = true; + } + tpls.cell.compile(); + + this.templates = tpls; + }, + + + onColWidthChange : function(){ + this.updateColumns.apply(this, arguments); + }, + onHeaderChange : function(){ + this.updateHeaders.apply(this, arguments); + }, + onHiddenChange : function(){ + this.handleHiddenChange.apply(this, arguments); + }, + onColumnMove : function(){ + this.handleColumnMove.apply(this, arguments); + }, + onColumnLock : function(){ + this.handleLockChange.apply(this, arguments); + }, + + onDataChange : function(){ + this.refresh(); + this.updateHeaderSortState(); + }, + + onClear : function(){ + this.refresh(); + }, + + onUpdate : function(ds, record){ + this.refreshRow(record); + }, + + refreshRow : function(record){ + var ds = this.ds, index; + if(typeof record == 'number'){ + index = record; + record = ds.getAt(index); + }else{ + index = ds.indexOf(record); + } + var rows = this.getRowComposite(index); + var cls = []; + this.insertRows(ds, index, index, true); + this.onRemove(ds, record, index+1, true); + this.syncRowHeights(index, index); + this.layout(); + this.fireEvent("rowupdated", this, index, record); + }, + + onAdd : function(ds, records, index){ + this.insertRows(ds, index, index + (records.length-1)); + }, + + onRemove : function(ds, record, index, isUpdate){ + if(isUpdate !== true){ + this.fireEvent("beforerowremoved", this, index, record); + } + var bt = this.getBodyTable(), lt = this.getLockedTable(); + if(bt.rows[index]){ + bt.firstChild.removeChild(bt.rows[index]); + } + if(lt.rows[index]){ + lt.firstChild.removeChild(lt.rows[index]); + } + if(isUpdate !== true){ + this.stripeRows(index); + this.syncRowHeights(index, index); + this.layout(); + this.fireEvent("rowremoved", this, index, record); + } + }, + + onLoad : function(){ + this.scrollToTop(); + }, + + + scrollToTop : function(){ + if(this.scroller){ + this.scroller.dom.scrollTop = 0; + this.syncScroll(); + } + }, + + + getHeaderPanel : function(doShow){ + if(doShow){ + this.headerPanel.show(); + } + return this.headerPanel; + }, + + + getFooterPanel : function(doShow){ + if(doShow){ + this.footerPanel.show(); + } + return this.footerPanel; + }, + + initElements : function(){ + var E = Ext.Element; + var el = this.grid.container.dom.firstChild; + var cs = el.childNodes; + + this.el = new E(el); + this.headerPanel = new E(el.firstChild); + this.headerPanel.enableDisplayMode("block"); + + this.scroller = new E(cs[1]); + this.scrollSizer = new E(this.scroller.dom.firstChild); + + this.lockedWrap = new E(cs[2]); + this.lockedHd = new E(this.lockedWrap.dom.firstChild); + this.lockedBody = new E(this.lockedWrap.dom.childNodes[1]); + + this.mainWrap = new E(cs[3]); + this.mainHd = new E(this.mainWrap.dom.firstChild); + this.mainBody = new E(this.mainWrap.dom.childNodes[1]); + + this.footerPanel = new E(cs[4]); + this.footerPanel.enableDisplayMode("block"); + + this.focusEl = new E(cs[5]); + this.focusEl.swallowEvent("click", true); + this.resizeProxy = new E(cs[6]); + + this.headerSelector = String.format( + '#{0} td.x-grid-hd, #{1} td.x-grid-hd', + this.lockedHd.id, this.mainHd.id + ); + + this.splitterSelector = String.format( + '#{0} div.x-grid-split, #{1} div.x-grid-split', + this.lockedHd.id, this.mainHd.id + ); + }, + + getHeaderCell : function(index){ + return Ext.DomQuery.select(this.headerSelector)[index]; + }, + + getHeaderCellMeasure : function(index){ + return this.getHeaderCell(index).firstChild; + }, + + getHeaderCellText : function(index){ + return this.getHeaderCell(index).firstChild.firstChild; + }, + + getLockedTable : function(){ + return this.lockedBody.dom.firstChild; + }, + + getBodyTable : function(){ + return this.mainBody.dom.firstChild; + }, + + getLockedRow : function(index){ + return this.getLockedTable().rows[index]; + }, + + getRow : function(index){ + return this.getBodyTable().rows[index]; + }, + + getRowComposite : function(index){ + if(!this.rowEl){ + this.rowEl = new Ext.CompositeElementLite(); + } + var els = [], lrow, mrow; + if(lrow = this.getLockedRow(index)){ + els.push(lrow); + } + if(mrow = this.getRow(index)){ + els.push(mrow); + } + this.rowEl.elements = els; + return this.rowEl; + }, + + getCell : function(rowIndex, colIndex){ + var locked = this.cm.getLockedCount(); + var source; + if(colIndex < locked){ + source = this.lockedBody.dom.firstChild; + }else{ + source = this.mainBody.dom.firstChild; + colIndex -= locked; + } + return source.rows[rowIndex].childNodes[colIndex]; + }, + + getCellText : function(rowIndex, colIndex){ + return this.getCell(rowIndex, colIndex).firstChild.firstChild; + }, + + getCellBox : function(cell){ + var b = this.fly(cell).getBox(); + if(Ext.isOpera){ + b.y = cell.offsetTop + this.mainBody.getY(); + } + return b; + }, + + getCellIndex : function(cell){ + var id = String(cell.className).match(this.cellRE); + if(id){ + return parseInt(id[1], 10); + } + return 0; + }, + + findHeaderIndex : function(n){ + var r = Ext.fly(n).findParent("td." + this.hdClass, 6); + return r ? this.getCellIndex(r) : false; + }, + + findHeaderCell : function(n){ + var r = Ext.fly(n).findParent("td." + this.hdClass, 6); + return r ? r : false; + }, + + findRowIndex : function(n){ + if(!n){ + return false; + } + var r = Ext.fly(n).findParent("tr." + this.rowClass, 6); + return r ? r.rowIndex : false; + }, + + findCellIndex : function(node){ + var stop = this.el.dom; + while(node && node != stop){ + if(this.findRE.test(node.className)){ + return this.getCellIndex(node); + } + node = node.parentNode; + } + return false; + }, + + getColumnId : function(index){ + return this.cm.getColumnId(index); + }, + + getSplitters : function(){ + if(this.splitterSelector){ + return Ext.DomQuery.select(this.splitterSelector); + }else{ + return null; + } + }, + + getSplitter : function(index){ + return this.getSplitters()[index]; + }, + + onRowOver : function(e, t){ + var row; + if((row = this.findRowIndex(t)) !== false){ + this.getRowComposite(row).addClass("x-grid-row-over"); + } + }, + + onRowOut : function(e, t){ + var row; + if((row = this.findRowIndex(t)) !== false && row !== this.findRowIndex(e.getRelatedTarget())){ + this.getRowComposite(row).removeClass("x-grid-row-over"); + } + }, + + renderHeaders : function(){ + var cm = this.cm; + var ct = this.templates.hcell, ht = this.templates.header, st = this.templates.hsplit; + var cb = [], lb = [], sb = [], lsb = [], p = {}; + for(var i = 0, len = cm.getColumnCount(); i < len; i++){ + p.cellId = "x-grid-hd-0-" + i; + p.splitId = "x-grid-csplit-0-" + i; + p.id = cm.getColumnId(i); + p.title = cm.getColumnTooltip(i) || ""; + p.value = cm.getColumnHeader(i) || ""; + p.style = (this.grid.enableColumnResize === false || !cm.isResizable(i) || cm.isFixed(i)) ? 'cursor:default' : ''; + if(!cm.isLocked(i)){ + cb[cb.length] = ct.apply(p); + sb[sb.length] = st.apply(p); + }else{ + lb[lb.length] = ct.apply(p); + lsb[lsb.length] = st.apply(p); + } + } + return [ht.apply({cells: lb.join(""), splits:lsb.join("")}), + ht.apply({cells: cb.join(""), splits:sb.join("")})]; + }, + + updateHeaders : function(){ + var html = this.renderHeaders(); + this.lockedHd.update(html[0]); + this.mainHd.update(html[1]); + }, + + + focusRow : function(row){ + var x = this.scroller.dom.scrollLeft; + this.focusCell(row, 0, false); + this.scroller.dom.scrollLeft = x; + }, + + + focusCell : function(row, col, hscroll){ + var el = this.ensureVisible(row, col, hscroll); + this.focusEl.alignTo(el, "tl-tl"); + if(Ext.isGecko){ + this.focusEl.focus(); + }else{ + this.focusEl.focus.defer(1, this.focusEl); + } + }, + + + ensureVisible : function(row, col, hscroll){ + if(typeof row != "number"){ + row = row.rowIndex; + } + if(row < 0 && row >= this.ds.getCount()){ + return; + } + col = (col !== undefined ? col : 0); + var cm = this.grid.colModel; + while(cm.isHidden(col)){ + col++; + } + + var el = this.getCell(row, col); + if(!el){ + return; + } + var c = this.scroller.dom; + + var ctop = parseInt(el.offsetTop, 10); + var cleft = parseInt(el.offsetLeft, 10); + var cbot = ctop + el.offsetHeight; + var cright = cleft + el.offsetWidth; + + var ch = c.clientHeight - this.mainHd.dom.offsetHeight; + var stop = parseInt(c.scrollTop, 10); + var sleft = parseInt(c.scrollLeft, 10); + var sbot = stop + ch; + var sright = sleft + c.clientWidth; + + if(ctop < stop){ + c.scrollTop = ctop; + }else if(cbot > sbot){ + c.scrollTop = cbot-ch; + } + + if(hscroll !== false){ + if(cleft < sleft){ + c.scrollLeft = cleft; + }else if(cright > sright){ + c.scrollLeft = cright-c.clientWidth; + } + } + return el; + }, + + updateColumns : function(){ + this.grid.stopEditing(); + var cm = this.grid.colModel, colIds = this.getColumnIds(); + + var pos = 0; + for(var i = 0, len = cm.getColumnCount(); i < len; i++){ + + var w = cm.getColumnWidth(i); + this.css.updateRule(this.colSelector+colIds[i], "width", (w - this.borderWidth) + "px"); + this.css.updateRule(this.hdSelector+colIds[i], "width", (w - this.borderWidth) + "px"); + } + this.updateSplitters(); + }, + + updateSplitters : function(){ + var cm = this.cm, s = this.getSplitters(); + if(s){ + var pos = 0, locked = true; + for(var i = 0, len = cm.getColumnCount(); i < len; i++){ + if(cm.isHidden(i)) continue; + var w = cm.getColumnWidth(i); + if(!cm.isLocked(i) && locked){ + pos = 0; + locked = false; + } + pos += w; + s[i].style.left = (pos-this.splitOffset) + "px"; + } + } + }, + + handleHiddenChange : function(colModel, colIndex, hidden){ + if(hidden){ + this.hideColumn(colIndex); + }else{ + this.unhideColumn(colIndex); + } + }, + + hideColumn : function(colIndex){ + var cid = this.getColumnId(colIndex); + this.css.updateRule(this.tdSelector+cid, "display", "none"); + this.css.updateRule(this.splitSelector+cid, "display", "none"); + if(Ext.isSafari){ + this.updateHeaders(); + } + this.updateSplitters(); + this.layout(); + }, + + unhideColumn : function(colIndex){ + var cid = this.getColumnId(colIndex); + this.css.updateRule(this.tdSelector+cid, "display", ""); + this.css.updateRule(this.splitSelector+cid, "display", ""); + + if(Ext.isSafari){ + this.updateHeaders(); + } + this.updateSplitters(); + this.layout(); + }, + + insertRows : function(dm, firstRow, lastRow, isUpdate){ + if(firstRow == 0 && lastRow == dm.getCount()-1){ + this.refresh(); + }else{ + if(!isUpdate){ + this.fireEvent("beforerowsinserted", this, firstRow, lastRow); + } + var s = this.getScrollState(); + var markup = this.renderRows(firstRow, lastRow); + this.bufferRows(markup[0], this.getLockedTable(), firstRow); + this.bufferRows(markup[1], this.getBodyTable(), firstRow); + this.restoreScroll(s); + if(!isUpdate){ + this.fireEvent("rowsinserted", this, firstRow, lastRow); + this.syncRowHeights(firstRow, lastRow); + this.stripeRows(firstRow); + this.layout(); + } + } + }, + + bufferRows : function(markup, target, index){ + var before = null, trows = target.rows, tbody = target.tBodies[0]; + if(index < trows.length){ + before = trows[index]; + } + var b = document.createElement("div"); + b.innerHTML = ""+markup+"
      "; + var rows = b.firstChild.rows; + for(var i = 0, len = rows.length; i < len; i++){ + if(before){ + tbody.insertBefore(rows[0], before); + }else{ + tbody.appendChild(rows[0]); + } + } + b.innerHTML = ""; + b = null; + }, + + deleteRows : function(dm, firstRow, lastRow){ + if(dm.getRowCount()<1){ + this.fireEvent("beforerefresh", this); + this.mainBody.update(""); + this.lockedBody.update(""); + this.fireEvent("refresh", this); + }else{ + this.fireEvent("beforerowsdeleted", this, firstRow, lastRow); + var bt = this.getBodyTable(); + var tbody = bt.firstChild; + var rows = bt.rows; + for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){ + tbody.removeChild(rows[firstRow]); + } + this.stripeRows(firstRow); + this.fireEvent("rowsdeleted", this, firstRow, lastRow); + } + }, + + updateRows : function(dataSource, firstRow, lastRow){ + var s = this.getScrollState(); + this.refresh(); + this.restoreScroll(s); + }, + + handleSort : function(dataSource, sortColumnIndex, sortDir, noRefresh){ + if(!noRefresh){ + this.refresh(); + } + this.updateHeaderSortState(); + }, + + getScrollState : function(){ + var sb = this.scroller.dom; + return {left: sb.scrollLeft, top: sb.scrollTop}; + }, + + stripeRows : function(startRow){ + if(!this.grid.stripeRows || this.ds.getCount() < 1){ + return; + } + startRow = startRow || 0; + var rows = this.getBodyTable().rows; + var lrows = this.getLockedTable().rows; + var cls = ' x-grid-row-alt '; + for(var i = startRow, len = rows.length; i < len; i++){ + var row = rows[i], lrow = lrows[i]; + var isAlt = ((i+1) % 2 == 0); + var hasAlt = (' '+row.className + ' ').indexOf(cls) != -1; + if(isAlt == hasAlt){ + continue; + } + if(isAlt){ + row.className += " x-grid-row-alt"; + }else{ + row.className = row.className.replace("x-grid-row-alt", ""); + } + if(lrow){ + lrow.className = row.className; + } + } + }, + + restoreScroll : function(state){ + var sb = this.scroller.dom; + sb.scrollLeft = state.left; + sb.scrollTop = state.top; + this.syncScroll(); + }, + + syncScroll : function(){ + var sb = this.scroller.dom; + var sh = this.mainHd.dom; + var bs = this.mainBody.dom; + var lv = this.lockedBody.dom; + sh.scrollLeft = bs.scrollLeft = sb.scrollLeft; + lv.scrollTop = bs.scrollTop = sb.scrollTop; + }, + + handleScroll : function(e){ + this.syncScroll(); + var sb = this.scroller.dom; + this.grid.fireEvent("bodyscroll", sb.scrollLeft, sb.scrollTop); + e.stopEvent(); + }, + + handleWheel : function(e){ + var d = e.getWheelDelta(); + this.scroller.dom.scrollTop -= d*22; + + this.lockedBody.dom.scrollTop = this.mainBody.dom.scrollTop = this.scroller.dom.scrollTop; + e.stopEvent(); + }, + + renderRows : function(startRow, endRow){ + + var g = this.grid, cm = g.colModel, ds = g.dataSource, stripe = g.stripeRows; + var colCount = cm.getColumnCount(); + + if(ds.getCount() < 1){ + return ["", ""]; + } + + + var cs = []; + for(var i = 0; i < colCount; i++){ + var name = cm.getDataIndex(i); + cs[i] = { + name : typeof name == 'undefined' ? ds.fields.get(i).name : name, + renderer : cm.getRenderer(i), + id : cm.getColumnId(i), + locked : cm.isLocked(i) + }; + } + + startRow = startRow || 0; + endRow = typeof endRow == "undefined"? ds.getCount()-1 : endRow; + + + var rs = ds.getRange(startRow, endRow); + + return this.doRender(cs, rs, ds, startRow, colCount, stripe); + }, + + + + + doRender : Ext.isGecko ? + function(cs, rs, ds, startRow, colCount, stripe){ + var ts = this.templates, ct = ts.cell, rt = ts.row; + + var buf = "", lbuf = "", cb, lcb, c, p = {}, rp = {}, r; + for(var j = 0, len = rs.length; j < len; j++){ + r = rs[j], cb = "", lcb = "", rowIndex = (j+startRow); + for(var i = 0; i < colCount; i++){ + c = cs[i]; + p.cellId = "x-grid-cell-" + rowIndex + "-" + i; + p.id = c.id; + p.css = p.attr = ""; + p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds); + if(p.value == undefined || p.value === "") p.value = " "; + if(r.dirty && typeof r.modified[c.name] !== 'undefined'){ + p.css += p.css ? ' x-grid-dirty-cell' : 'x-grid-dirty-cell'; + } + var markup = ct.apply(p); + if(!c.locked){ + cb+= markup; + }else{ + lcb+= markup; + } + } + var alt = []; + if(stripe && ((rowIndex+1) % 2 == 0)){ + alt[0] = "x-grid-row-alt"; + } + if(r.dirty){ + alt[1] = " x-grid-dirty-row"; + } + rp.cells = lcb; + if(this.getRowClass){ + alt[2] = this.getRowClass(r, rowIndex); + } + rp.alt = alt.join(" "); + lbuf+= rt.apply(rp); + rp.cells = cb; + buf+= rt.apply(rp); + } + return [lbuf, buf]; + } : + function(cs, rs, ds, startRow, colCount, stripe){ + var ts = this.templates, ct = ts.cell, rt = ts.row; + + var buf = [], lbuf = [], cb, lcb, c, p = {}, rp = {}, r; + for(var j = 0, len = rs.length; j < len; j++){ + r = rs[j], cb = [], lcb = [], rowIndex = (j+startRow); + for(var i = 0; i < colCount; i++){ + c = cs[i]; + p.cellId = "x-grid-cell-" + rowIndex + "-" + i; + p.id = c.id; + p.css = p.attr = ""; + p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds); + if(p.value == undefined || p.value === "") p.value = " "; + if(r.dirty && typeof r.modified[c.name] !== 'undefined'){ + p.css += p.css ? ' x-grid-dirty-cell' : 'x-grid-dirty-cell'; + } + var markup = ct.apply(p); + if(!c.locked){ + cb[cb.length] = markup; + }else{ + lcb[lcb.length] = markup; + } + } + var alt = []; + if(stripe && ((rowIndex+1) % 2 == 0)){ + alt[0] = "x-grid-row-alt"; + } + if(r.dirty){ + alt[1] = " x-grid-dirty-row"; + } + rp.cells = lcb; + if(this.getRowClass){ + alt[2] = this.getRowClass(r, rowIndex); + } + rp.alt = alt.join(" "); + rp.cells = lcb.join(""); + lbuf[lbuf.length] = rt.apply(rp); + rp.cells = cb.join(""); + buf[buf.length] = rt.apply(rp); + } + return [lbuf.join(""), buf.join("")]; + }, + + renderBody : function(){ + var markup = this.renderRows(); + var bt = this.templates.body; + return [bt.apply({rows: markup[0]}), bt.apply({rows: markup[1]})]; + }, + + + refresh : function(headersToo){ + this.fireEvent("beforerefresh", this); + this.grid.stopEditing(); + var result = this.renderBody(); + this.lockedBody.update(result[0]); + this.mainBody.update(result[1]); + if(headersToo === true){ + this.updateHeaders(); + this.updateColumns(); + this.updateSplitters(); + this.updateHeaderSortState(); + } + this.syncRowHeights(); + this.layout(); + this.fireEvent("refresh", this); + }, + + handleColumnMove : function(cm, oldIndex, newIndex){ + this.indexMap = null; + var s = this.getScrollState(); + this.refresh(true); + this.restoreScroll(s); + this.afterMove(newIndex); + }, + + afterMove : function(colIndex){ + if(this.enableMoveAnim && Ext.enableFx){ + this.fly(this.getHeaderCell(colIndex).firstChild).highlight(this.hlColor); + } + }, + + updateCell : function(dm, rowIndex, dataIndex){ + var colIndex = this.getColumnIndexByDataIndex(dataIndex); + if(typeof colIndex == "undefined"){ + return; + } + var cm = this.grid.colModel; + var cell = this.getCell(rowIndex, colIndex); + var cellText = this.getCellText(rowIndex, colIndex); + + var p = { + cellId : "x-grid-cell-" + rowIndex + "-" + colIndex, + id : cm.getColumnId(colIndex), + css: colIndex == cm.getColumnCount()-1 ? "x-grid-col-last" : "" + }; + var renderer = cm.getRenderer(colIndex); + var val = renderer(dm.getValueAt(rowIndex, dataIndex), p, rowIndex, colIndex, dm); + if(typeof val == "undefined" || val === "") val = " "; + cellText.innerHTML = val; + cell.className = this.cellClass + " " + p.cellId + " " + p.css; + this.syncRowHeights(rowIndex, rowIndex); + }, + + calcColumnWidth : function(colIndex, maxRowsToMeasure){ + var maxWidth = 0; + if(this.grid.autoSizeHeaders){ + var h = this.getHeaderCellMeasure(colIndex); + maxWidth = Math.max(maxWidth, h.scrollWidth); + } + var tb, index; + if(this.cm.isLocked(colIndex)){ + tb = this.getLockedTable(); + index = colIndex; + }else{ + tb = this.getBodyTable(); + index = colIndex - this.cm.getLockedCount(); + } + if(tb && tb.rows){ + var rows = tb.rows; + var stopIndex = Math.min(maxRowsToMeasure || rows.length, rows.length); + for(var i = 0; i < stopIndex; i++){ + var cell = rows[i].childNodes[index].firstChild; + maxWidth = Math.max(maxWidth, cell.scrollWidth); + } + } + return maxWidth + 5; + }, + + autoSizeColumn : function(colIndex, forceMinSize, suppressEvent){ + if(this.cm.isHidden(colIndex)){ + return; + } + if(forceMinSize){ + var cid = this.cm.getColumnId(colIndex); + this.css.updateRule(this.colSelector + cid, "width", this.grid.minColumnWidth + "px"); + if(this.grid.autoSizeHeaders){ + this.css.updateRule(this.hdSelector + cid, "width", this.grid.minColumnWidth + "px"); + } + } + var newWidth = this.calcColumnWidth(colIndex); + this.cm.setColumnWidth(colIndex, + Math.max(this.grid.minColumnWidth, newWidth), suppressEvent); + if(!suppressEvent){ + this.grid.fireEvent("columnresize", colIndex, newWidth); + } + }, + + + autoSizeColumns : function(){ + var cm = this.grid.colModel; + var colCount = cm.getColumnCount(); + for(var i = 0; i < colCount; i++){ + this.autoSizeColumn(i, true, true); + } + if(cm.getTotalWidth() < this.scroller.dom.clientWidth){ + this.fitColumns(); + }else{ + this.updateColumns(); + this.layout(); + } + }, + + + fitColumns : function(reserveScrollSpace){ + 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 avail = Math.min(this.scroller.dom.clientWidth, this.el.getWidth()); + if(reserveScrollSpace){ + avail -= 17; + } + var frac = (avail - cm.getTotalWidth())/width; + while (cols.length){ + w = cols.pop(); + i = cols.pop(); + cm.setColumnWidth(i, Math.floor(w + w*frac), true); + } + this.updateColumns(); + this.layout(); + }, + + onRowSelect : function(rowIndex){ + var row = this.getRowComposite(rowIndex); + row.addClass("x-grid-row-selected"); + }, + + onRowDeselect : function(rowIndex){ + var row = this.getRowComposite(rowIndex); + row.removeClass("x-grid-row-selected"); + }, + + onCellSelect : function(row, col){ + var cell = this.getCell(row, col); + if(cell){ + Ext.fly(cell).addClass("x-grid-cell-selected"); + } + }, + + onCellDeselect : function(row, col){ + var cell = this.getCell(row, col); + if(cell){ + Ext.fly(cell).removeClass("x-grid-cell-selected"); + } + }, + + updateHeaderSortState : function(){ + var state = this.ds.getSortState(); + if(!state){ + return; + } + this.sortState = state; + var sortColumn = this.cm.findColumnIndex(state.field); + if(sortColumn != -1){ + var sortDir = state.direction; + var sc = this.sortClasses; + var hds = this.el.select(this.headerSelector).removeClass(sc); + hds.item(sortColumn).addClass(sc[sortDir == "DESC" ? 1 : 0]); + } + }, + + handleHeaderClick : function(g, index){ + if(this.headersDisabled){ + return; + } + var dm = g.dataSource, cm = g.colModel; + if(!cm.isSortable(index)){ + return; + } + g.stopEditing(); + dm.sort(cm.getDataIndex(index)); + }, + + + destroy : function(){ + if(this.colMenu){ + this.colMenu.removeAll(); + Ext.menu.MenuMgr.unregister(this.colMenu); + this.colMenu.getEl().remove(); + delete this.colMenu; + } + if(this.hmenu){ + this.hmenu.removeAll(); + Ext.menu.MenuMgr.unregister(this.hmenu); + this.hmenu.getEl().remove(); + delete this.hmenu; + } + if(this.grid.enableColumnMove){ + var dds = Ext.dd.DDM.ids['gridHeader' + this.grid.container.id]; + if(dds){ + for(var dd in dds){ + if(!dds[dd].config.isTarget && dds[dd].dragElId){ + var elid = dds[dd].dragElId; + dds[dd].unreg(); + Ext.get(elid).remove(); + } else if(dds[dd].config.isTarget){ + dds[dd].proxyTop.remove(); + dds[dd].proxyBottom.remove(); + dds[dd].unreg(); + } + if(Ext.dd.DDM.locationCache[dd]){ + delete Ext.dd.DDM.locationCache[dd]; + } + } + delete Ext.dd.DDM.ids['gridHeader' + this.grid.container.id]; + } + } + + this.bind(null, null); + Ext.EventManager.removeResizeListener(this.onWindowResize, this); + }, + + handleLockChange : function(){ + this.refresh(true); + }, + + onDenyColumnLock : function(){ + + }, + + onDenyColumnHide : function(){ + + }, + + handleHdMenuClick : function(item){ + var index = this.hdCtxIndex; + var cm = this.cm, ds = this.ds; + switch(item.id){ + case "asc": + ds.sort(cm.getDataIndex(index), "ASC"); + break; + case "desc": + ds.sort(cm.getDataIndex(index), "DESC"); + break; + case "lock": + var lc = cm.getLockedCount(); + if(cm.getColumnCount(true) <= lc+1){ + this.onDenyColumnLock(); + return; + } + if(lc != index){ + cm.setLocked(index, true, true); + cm.moveColumn(index, lc); + this.grid.fireEvent("columnmove", index, lc); + }else{ + cm.setLocked(index, true); + } + break; + case "unlock": + var lc = cm.getLockedCount(); + if((lc-1) != index){ + cm.setLocked(index, false, true); + cm.moveColumn(index, lc-1); + this.grid.fireEvent("columnmove", index, lc-1); + }else{ + cm.setLocked(index, false); + } + break; + default: + index = cm.getIndexById(item.id.substr(4)); + if(index != -1){ + if(item.checked && cm.getColumnCount(true) <= 1){ + this.onDenyColumnHide(); + return false; + } + cm.setHidden(index, item.checked); + } + } + return true; + }, + + beforeColMenuShow : function(){ + var cm = this.cm, colCount = cm.getColumnCount(); + this.colMenu.removeAll(); + for(var i = 0; i < colCount; i++){ + this.colMenu.add(new Ext.menu.CheckItem({ + id: "col-"+cm.getColumnId(i), + text: cm.getColumnHeader(i), + checked: !cm.isHidden(i), + hideOnClick:false + })); + } + }, + + handleHdCtx : function(g, index, e){ + e.stopEvent(); + var hd = this.getHeaderCell(index); + this.hdCtxIndex = index; + var ms = this.hmenu.items, cm = this.cm; + ms.get("asc").setDisabled(!cm.isSortable(index)); + ms.get("desc").setDisabled(!cm.isSortable(index)); + if(this.grid.enableColLock !== false){ + ms.get("lock").setDisabled(cm.isLocked(index)); + ms.get("unlock").setDisabled(!cm.isLocked(index)); + } + this.hmenu.show(hd, "tl-bl"); + }, + + handleHdOver : function(e){ + var hd = this.findHeaderCell(e.getTarget()); + if(hd && !this.headersDisabled){ + if(this.grid.colModel.isSortable(this.getCellIndex(hd))){ + this.fly(hd).addClass("x-grid-hd-over"); + } + } + }, + + handleHdOut : function(e){ + var hd = this.findHeaderCell(e.getTarget()); + if(hd){ + this.fly(hd).removeClass("x-grid-hd-over"); + } + }, + + handleSplitDblClick : function(e, t){ + var i = this.getCellIndex(t); + if(this.grid.enableColumnResize !== false && this.cm.isResizable(i) && !this.cm.isFixed(i)){ + this.autoSizeColumn(i, true); + this.layout(); + } + }, + + render : function(){ + + var cm = this.cm; + var colCount = cm.getColumnCount(); + + if(this.grid.monitorWindowResize === true){ + Ext.EventManager.onWindowResize(this.onWindowResize, this, true); + } + var header = this.renderHeaders(); + var body = this.templates.body.apply({rows:""}); + var html = this.templates.master.apply({ + lockedBody: body, + body: body, + lockedHeader: header[0], + header: header[1] + }); + + this.updateColumns(); + + this.grid.container.dom.innerHTML = html; + + this.initElements(); + + this.scroller.on("scroll", this.handleScroll, this); + this.lockedBody.on("mousewheel", this.handleWheel, this); + this.mainBody.on("mousewheel", this.handleWheel, this); + + this.mainHd.on("mouseover", this.handleHdOver, this); + this.mainHd.on("mouseout", this.handleHdOut, this); + this.mainHd.on("dblclick", this.handleSplitDblClick, this, + {delegate: "."+this.splitClass}); + + this.lockedHd.on("mouseover", this.handleHdOver, this); + this.lockedHd.on("mouseout", this.handleHdOut, this); + this.lockedHd.on("dblclick", this.handleSplitDblClick, this, + {delegate: "."+this.splitClass}); + + if(this.grid.enableColumnResize !== false && Ext.grid.SplitDragZone){ + new Ext.grid.SplitDragZone(this.grid, this.lockedHd.dom, this.mainHd.dom); + } + + this.updateSplitters(); + + if(this.grid.enableColumnMove && Ext.grid.HeaderDragZone){ + new Ext.grid.HeaderDragZone(this.grid, this.lockedHd.dom, this.mainHd.dom); + new Ext.grid.HeaderDropZone(this.grid, this.lockedHd.dom, this.mainHd.dom); + } + + if(this.grid.enableCtxMenu !== false && Ext.menu.Menu){ + this.hmenu = new Ext.menu.Menu({id: this.grid.id + "-hctx"}); + this.hmenu.add( + {id:"asc", text: this.sortAscText, cls: "xg-hmenu-sort-asc"}, + {id:"desc", text: this.sortDescText, cls: "xg-hmenu-sort-desc"} + ); + if(this.grid.enableColLock !== false){ + this.hmenu.add('-', + {id:"lock", text: this.lockText, cls: "xg-hmenu-lock"}, + {id:"unlock", text: this.unlockText, cls: "xg-hmenu-unlock"} + ); + } + if(this.grid.enableColumnHide !== false){ + + this.colMenu = new Ext.menu.Menu({id:this.grid.id + "-hcols-menu"}); + this.colMenu.on("beforeshow", this.beforeColMenuShow, this); + this.colMenu.on("itemclick", this.handleHdMenuClick, this); + + this.hmenu.add('-', + {id:"columns", text: this.columnsText, menu: this.colMenu} + ); + } + this.hmenu.on("itemclick", this.handleHdMenuClick, this); + + this.grid.on("headercontextmenu", this.handleHdCtx, this); + } + + if((this.grid.enableDragDrop || this.grid.enableDrag) && Ext.grid.GridDragZone){ + this.dd = new Ext.grid.GridDragZone(this.grid, { + ddGroup : this.grid.ddGroup || 'GridDD' + }); + } + for(var i = 0; i < colCount; i++){ + if(cm.isHidden(i)){ + this.hideColumn(i); + } + if(cm.config[i].align){ + this.css.updateRule(this.colSelector + i, "textAlign", cm.config[i].align); + this.css.updateRule(this.hdSelector + i, "textAlign", cm.config[i].align); + } + } + + this.updateHeaderSortState(); + + this.beforeInitialResize(); + this.layout(true); + + + this.renderPhase2.defer(1, this); + }, + + renderPhase2 : function(){ + + this.refresh(); + if(this.grid.autoSizeColumns){ + this.autoSizeColumns(); + } + }, + + beforeInitialResize : function(){ + + }, + + onColumnSplitterMoved : function(i, w){ + this.userResized = true; + var cm = this.grid.colModel; + cm.setColumnWidth(i, w, true); + var cid = cm.getColumnId(i); + this.css.updateRule(this.colSelector + cid, "width", (w-this.borderWidth) + "px"); + this.css.updateRule(this.hdSelector + cid, "width", (w-this.borderWidth) + "px"); + this.updateSplitters(); + this.layout(); + this.grid.fireEvent("columnresize", i, w); + }, + + syncRowHeights : function(startIndex, endIndex){ + if(this.grid.enableRowHeightSync === true && this.cm.getLockedCount() > 0){ + startIndex = startIndex || 0; + var mrows = this.getBodyTable().rows; + var lrows = this.getLockedTable().rows; + var len = mrows.length-1; + endIndex = Math.min(endIndex || len, len); + for(var i = startIndex; i <= endIndex; i++){ + var m = mrows[i], l = lrows[i]; + var h = Math.max(m.offsetHeight, l.offsetHeight); + m.style.height = l.style.height = h + "px"; + } + } + }, + + layout : function(initialRender, is2ndPass){ + var g = this.grid; + var auto = g.autoHeight; + var scrollOffset = 16; + var c = g.container, cm = this.cm, + expandCol = g.autoExpandColumn, + gv = this; + + + if(!c.dom.offsetWidth){ + if(initialRender){ + this.lockedWrap.show(); + this.mainWrap.show(); + } + return; + } + + var hasLock = this.cm.isLocked(0); + + var tbh = this.headerPanel.getHeight(); + var bbh = this.footerPanel.getHeight(); + + if(auto){ + var ch = this.getBodyTable().offsetHeight + tbh + bbh + this.mainHd.getHeight(); + var newHeight = ch + c.getBorderWidth("tb"); + if(g.maxHeight){ + newHeight = Math.min(g.maxHeight, newHeight); + } + c.setHeight(newHeight); + } + + if(g.autoWidth){ + c.setWidth(cm.getTotalWidth()+c.getBorderWidth('lr')); + } + + var s = this.scroller; + + var csize = c.getSize(true); + + this.el.setSize(csize.width, csize.height); + + this.headerPanel.setWidth(csize.width); + this.footerPanel.setWidth(csize.width); + + var hdHeight = this.mainHd.getHeight(); + var vw = csize.width; + var vh = csize.height - (tbh + bbh); + + s.setSize(vw, vh); + + var bt = this.getBodyTable(); + var ltWidth = hasLock ? + Math.max(this.getLockedTable().offsetWidth, this.lockedHd.dom.firstChild.offsetWidth) : 0; + + var scrollHeight = bt.offsetHeight; + var scrollWidth = ltWidth + bt.offsetWidth; + var vscroll = false, hscroll = false; + + this.scrollSizer.setSize(scrollWidth, scrollHeight+hdHeight); + + var lw = this.lockedWrap, mw = this.mainWrap; + var lb = this.lockedBody, mb = this.mainBody; + + setTimeout(function(){ + var t = s.dom.offsetTop; + var w = s.dom.clientWidth, + h = s.dom.clientHeight; + + lw.setTop(t); + lw.setSize(ltWidth, h); + + mw.setLeftTop(ltWidth, t); + mw.setSize(w-ltWidth, h); + + lb.setHeight(h-hdHeight); + mb.setHeight(h-hdHeight); + + if(is2ndPass !== true && !gv.userResized && expandCol){ + + var ci = cm.getIndexById(expandCol); + var tw = cm.getTotalWidth(false); + var currentWidth = cm.getColumnWidth(ci); + var cw = Math.min(Math.max(((w-tw)+currentWidth-2)-(w <= s.dom.offsetWidth ? 0 : 18), g.autoExpandMin), g.autoExpandMax); + if(currentWidth != cw){ + cm.setColumnWidth(ci, cw, true); + gv.css.updateRule(gv.colSelector+expandCol, "width", (cw - gv.borderWidth) + "px"); + gv.css.updateRule(gv.hdSelector+expandCol, "width", (cw - gv.borderWidth) + "px"); + gv.updateSplitters(); + gv.layout(false, true); + } + } + + if(initialRender){ + lw.show(); + mw.show(); + } + + }, 10); + }, + + onWindowResize : function(){ + if(!this.grid.monitorWindowResize || this.grid.autoHeight){ + return; + } + this.layout(); + }, + + appendFooter : function(parentEl){ + return null; + }, + + sortAscText : "Sort Ascending", + sortDescText : "Sort Descending", + lockText : "Lock Column", + unlockText : "Unlock Column", + columnsText : "Columns" +}); + + +Ext.grid.HeaderDragZone = function(grid, hd, hd2){ + this.grid = grid; + this.view = grid.getView(); + this.ddGroup = "gridHeader" + this.grid.container.id; + Ext.grid.HeaderDragZone.superclass.constructor.call(this, hd); + if(hd2){ + this.setHandleElId(Ext.id(hd)); + this.setOuterHandleElId(Ext.id(hd2)); + } + this.scroll = false; +}; +Ext.extend(Ext.grid.HeaderDragZone, Ext.dd.DragZone, { + maxDragWidth: 120, + getDragData : function(e){ + var t = Ext.lib.Event.getTarget(e); + var h = this.view.findHeaderCell(t); + if(h){ + return {ddel: h.firstChild, header:h}; + } + return false; + }, + + onInitDrag : function(e){ + this.view.headersDisabled = true; + var clone = this.dragData.ddel.cloneNode(true); + clone.style.width = Math.min(this.dragData.header.offsetWidth,this.maxDragWidth) + "px"; + this.proxy.update(clone); + return true; + }, + + afterValidDrop : function(){ + var v = this.view; + setTimeout(function(){ + v.headersDisabled = false; + }, 50); + }, + + afterInvalidDrop : function(){ + var v = this.view; + setTimeout(function(){ + v.headersDisabled = false; + }, 50); + } +}); + + + +Ext.grid.HeaderDropZone = function(grid, hd, hd2){ + this.grid = grid; + this.view = grid.getView(); + + this.proxyTop = Ext.DomHelper.append(document.body, { + tag:"div", cls:"col-move-top", html:" " + }, true); + this.proxyBottom = Ext.DomHelper.append(document.body, { + tag:"div", cls:"col-move-bottom", html:" " + }, true); + this.proxyTop.hide = this.proxyBottom.hide = function(){ + this.setLeftTop(-100,-100); + this.setStyle("visibility", "hidden"); + }; + this.ddGroup = "gridHeader" + this.grid.container.id; + + + Ext.grid.HeaderDropZone.superclass.constructor.call(this, grid.container.dom); +}; +Ext.extend(Ext.grid.HeaderDropZone, Ext.dd.DropZone, { + proxyOffsets : [-4, -9], + fly: Ext.Element.fly, + + getTargetFromEvent : function(e){ + var t = Ext.lib.Event.getTarget(e); + var cindex = this.view.findCellIndex(t); + if(cindex !== false){ + return this.view.getHeaderCell(cindex); + } + }, + + nextVisible : function(h){ + var v = this.view, cm = this.grid.colModel; + h = h.nextSibling; + while(h){ + if(!cm.isHidden(v.getCellIndex(h))){ + return h; + } + h = h.nextSibling; + } + return null; + }, + + prevVisible : function(h){ + var v = this.view, cm = this.grid.colModel; + h = h.prevSibling; + while(h){ + if(!cm.isHidden(v.getCellIndex(h))){ + return h; + } + h = h.prevSibling; + } + return null; + }, + + positionIndicator : function(h, n, e){ + var x = Ext.lib.Event.getPageX(e); + var r = Ext.lib.Dom.getRegion(n.firstChild); + var px, pt, py = r.top + this.proxyOffsets[1]; + if((r.right - x) <= (r.right-r.left)/2){ + px = r.right+this.view.borderWidth; + pt = "after"; + }else{ + px = r.left; + pt = "before"; + } + var oldIndex = this.view.getCellIndex(h); + var newIndex = this.view.getCellIndex(n); + var locked = this.grid.colModel.isLocked(newIndex); + if(pt == "after"){ + newIndex++; + } + if(oldIndex < newIndex){ + newIndex--; + } + if(oldIndex == newIndex && (locked == this.grid.colModel.isLocked(oldIndex))){ + return false; + } + px += this.proxyOffsets[0]; + this.proxyTop.setLeftTop(px, py); + this.proxyTop.show(); + if(!this.bottomOffset){ + this.bottomOffset = this.view.mainHd.getHeight(); + } + this.proxyBottom.setLeftTop(px, py+this.proxyTop.dom.offsetHeight+this.bottomOffset); + this.proxyBottom.show(); + return pt; + }, + + onNodeEnter : function(n, dd, e, data){ + if(data.header != n){ + this.positionIndicator(data.header, n, e); + } + }, + + onNodeOver : function(n, dd, e, data){ + var result = false; + if(data.header != n){ + result = this.positionIndicator(data.header, n, e); + } + if(!result){ + this.proxyTop.hide(); + this.proxyBottom.hide(); + } + return result ? this.dropAllowed : this.dropNotAllowed; + }, + + onNodeOut : function(n, dd, e, data){ + this.proxyTop.hide(); + this.proxyBottom.hide(); + }, + + onNodeDrop : function(n, dd, e, data){ + var h = data.header; + if(h != n){ + var cm = this.grid.colModel; + var x = Ext.lib.Event.getPageX(e); + var r = Ext.lib.Dom.getRegion(n.firstChild); + var pt = (r.right - x) <= ((r.right-r.left)/2) ? "after" : "before"; + var oldIndex = this.view.getCellIndex(h); + var newIndex = this.view.getCellIndex(n); + var locked = cm.isLocked(newIndex); + if(pt == "after"){ + newIndex++; + } + if(oldIndex < newIndex){ + newIndex--; + } + if(oldIndex == newIndex && (locked == cm.isLocked(oldIndex))){ + return false; + } + cm.setLocked(oldIndex, locked, true); + cm.moveColumn(oldIndex, newIndex); + this.grid.fireEvent("columnmove", oldIndex, newIndex); + return true; + } + return false; + } +}); +Ext.grid.SplitDragZone = function(grid, hd, hd2){ + this.grid = grid; + this.view = grid.getView(); + this.proxy = this.view.resizeProxy; + Ext.grid.SplitDragZone.superclass.constructor.call(this, hd, + "gridSplitters" + this.grid.container.id, { + dragElId : Ext.id(this.proxy.dom), resizeFrame:false + }); + this.setHandleElId(Ext.id(hd)); + this.setOuterHandleElId(Ext.id(hd2)); + this.scroll = false; +}; +Ext.extend(Ext.grid.SplitDragZone, Ext.dd.DDProxy, { + fly: Ext.Element.fly, + + b4StartDrag : function(x, y){ + this.view.headersDisabled = true; + this.proxy.setHeight(this.view.mainWrap.getHeight()); + var w = this.cm.getColumnWidth(this.cellIndex); + var minw = Math.max(w-this.grid.minColumnWidth, 0); + this.resetConstraints(); + this.setXConstraint(minw, 1000); + this.setYConstraint(0, 0); + this.minX = x - minw; + this.maxX = x + 1000; + this.startPos = x; + Ext.dd.DDProxy.prototype.b4StartDrag.call(this, x, y); + }, + + + handleMouseDown : function(e){ + ev = Ext.EventObject.setEvent(e); + var t = this.fly(ev.getTarget()); + if(t.hasClass("x-grid-split")){ + this.cellIndex = this.view.getCellIndex(t.dom); + this.split = t.dom; + this.cm = this.grid.colModel; + if(this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)){ + Ext.grid.SplitDragZone.superclass.handleMouseDown.apply(this, arguments); + } + } + }, + + endDrag : function(e){ + this.view.headersDisabled = false; + var endX = Math.max(this.minX, Ext.lib.Event.getPageX(e)); + var diff = endX - this.startPos; + this.view.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex)+diff); + }, + + autoOffset : function(){ + this.setDelta(0,0); + } +}); +Ext.grid.GridDragZone = function(grid, config){ + this.view = grid.getView(); + Ext.grid.GridDragZone.superclass.constructor.call(this, this.view.lockedBody.dom, config); + this.setHandleElId(Ext.id(this.view.lockedBody.dom)); + this.setOuterHandleElId(Ext.id(this.view.mainBody.dom)); + this.scroll = false; + this.grid = grid; + this.ddel = document.createElement('div'); + this.ddel.className = 'x-grid-dd-wrap'; +}; + +Ext.extend(Ext.grid.GridDragZone, Ext.dd.DragZone, { + ddGroup : "GridDD", + + getDragData : function(e){ + var t = Ext.lib.Event.getTarget(e); + var rowIndex = this.view.findRowIndex(t); + if(rowIndex !== false){ + var sm = this.grid.selModel; + if(!sm.isSelected(rowIndex) || e.hasModifier()){ + sm.handleMouseDown(e, t); + } + return {grid: this.grid, ddel: this.ddel, rowIndex: rowIndex, selections:sm.getSelections()}; + } + return false; + }, + + onInitDrag : function(e){ + var data = this.dragData; + this.ddel.innerHTML = this.grid.getDragDropText(); + this.proxy.update(this.ddel); + }, + + afterRepair : function(){ + this.dragging = false; + }, + + getRepairXY : function(e, data){ + return false; + }, + + onEndDrag : function(data, e){ + }, + + onValidDrop : function(dd, e, id){ + this.hideProxy(); + }, + + beforeInvalidDrop : function(e, id){ + + } +}); + +Ext.grid.ColumnModel = function(config){ + Ext.grid.ColumnModel.superclass.constructor.call(this); + + this.config = config; + this.lookup = {}; + + + + + for(var i = 0, len = config.length; i < len; i++){ + if(typeof config[i].dataIndex == "undefined"){ + config[i].dataIndex = i; + } + if(typeof config[i].renderer == "string"){ + config[i].renderer = Ext.util.Format[config[i].renderer]; + } + if(typeof config[i].id == "undefined"){ + config[i].id = i; + } + this.lookup[config[i].id] = config[i]; + } + + + this.defaultWidth = 100; + + + this.defaultSortable = false; + + this.addEvents({ + + "widthchange": true, + + "headerchange": true, + + "hiddenchange": true, + + "columnmoved" : true, + + "columnlockchange" : true + }); + Ext.grid.ColumnModel.superclass.constructor.call(this); +}; +Ext.extend(Ext.grid.ColumnModel, Ext.util.Observable, { + + + + + + + + + + getColumnId : function(index){ + return this.config[index].id; + }, + + getColumnById : function(id){ + return this.lookup[id]; + }, + + getIndexById : function(id){ + for(var i = 0, len = this.config.length; i < len; i++){ + if(this.config[i].id == id){ + return i; + } + } + return -1; + }, + + moveColumn : function(oldIndex, newIndex){ + var c = this.config[oldIndex]; + this.config.splice(oldIndex, 1); + this.config.splice(newIndex, 0, c); + this.dataMap = null; + this.fireEvent("columnmoved", this, oldIndex, newIndex); + }, + + isLocked : function(colIndex){ + return this.config[colIndex].locked === true; + }, + + setLocked : function(colIndex, value, suppressEvent){ + if(this.isLocked(colIndex) == value){ + return; + } + this.config[colIndex].locked = value; + if(!suppressEvent){ + this.fireEvent("columnlockchange", this, colIndex, value); + } + }, + + getTotalLockedWidth : function(){ + var totalWidth = 0; + for(var i = 0; i < this.config.length; i++){ + if(this.isLocked(i) && !this.isHidden(i)){ + this.totalWidth += this.getColumnWidth(i); + } + } + return totalWidth; + }, + + getLockedCount : function(){ + for(var i = 0, len = this.config.length; i < len; i++){ + if(!this.isLocked(i)){ + return i; + } + } + }, + + + getColumnCount : function(visibleOnly){ + if(visibleOnly == true){ + var c = 0; + for(var i = 0, len = this.config.length; i < len; i++){ + if(!this.isHidden(i)){ + c++; + } + } + return c; + } + return this.config.length; + }, + + + isSortable : function(col){ + if(typeof this.config[col].sortable == "undefined"){ + return this.defaultSortable; + } + return this.config[col].sortable; + }, + + + getRenderer : function(col){ + if(!this.config[col].renderer){ + return Ext.grid.ColumnModel.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.fireEvent("widthchange", this, col, width); + } + }, + + + getTotalWidth : function(includeHidden){ + if(!this.totalWidth){ + this.totalWidth = 0; + for(var i = 0, len = this.config.length; i < len; 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.fireEvent("headerchange", this, col, header); + }, + + + getColumnTooltip : function(col){ + return this.config[col].tooltip; + }, + + setColumnTooltip : function(col, tooltip){ + this.config[col].tooltip = tooltip; + }, + + + getDataIndex : function(col){ + return this.config[col].dataIndex; + }, + + + setDataIndex : function(col, dataIndex){ + this.config[col].dataIndex = dataIndex; + }, + + findColumnIndex : function(dataIndex){ + var c = this.config; + for(var i = 0, len = c.length; i < len; i++){ + if(c[i].dataIndex == dataIndex){ + return i; + } + } + return -1; + }, + + + isCellEditable : function(colIndex, rowIndex){ + return (this.config[colIndex].editable || (typeof this.config[colIndex].editable == "undefined" && this.config[colIndex].editor)) ? true : false; + }, + + + 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.fireEvent("hiddenchange", this, colIndex, hidden); + }, + + + setEditor : function(col, editor){ + this.config[col].editor = editor; + } +}); + +Ext.grid.ColumnModel.defaultRenderer = function(value){ + if(typeof value == "string" && value.length < 1){ + return " "; + } + return value; +}; + + +Ext.grid.DefaultColumnModel = Ext.grid.ColumnModel; + + +Ext.grid.AbstractSelectionModel = function(){ + this.locked = false; + Ext.grid.AbstractSelectionModel.superclass.constructor.call(this); +}; + +Ext.extend(Ext.grid.AbstractSelectionModel, Ext.util.Observable, { + + init : function(grid){ + this.grid = grid; + this.initEvents(); + }, + + + lock : function(){ + this.locked = true; + }, + + + unlock : function(){ + this.locked = false; + }, + + + isLocked : function(){ + return this.locked; + } +}); + +Ext.grid.RowSelectionModel = function(config){ + Ext.apply(this, config); + this.selections = new Ext.util.MixedCollection(false, function(o){ + return o.id; + }); + + this.last = false; + this.lastActive = false; + + this.addEvents({ + + "selectionchange" : true, + + "beforerowselect" : true, + + "rowselect" : true, + + "rowdeselect" : true + }); + + this.locked = false; +}; + +Ext.extend(Ext.grid.RowSelectionModel, Ext.grid.AbstractSelectionModel, { + + singleSelect : false, + + + initEvents : function(){ + + if(!this.grid.enableDragDrop && !this.grid.enableDrag){ + this.grid.on("mousedown", this.handleMouseDown, this); + } + + this.rowNav = new Ext.KeyNav(this.grid.container, { + "up" : function(e){ + if(!e.shiftKey){ + this.selectPrevious(e.shiftKey); + }else if(this.last !== false && this.lastActive !== false){ + var last = this.last; + this.selectRange(this.last, this.lastActive-1); + this.grid.getView().focusRow(this.lastActive); + if(last !== false){ + this.last = last; + } + }else{ + this.selectFirstRow(); + } + }, + "down" : function(e){ + if(!e.shiftKey){ + this.selectNext(e.shiftKey); + }else if(this.last !== false && this.lastActive !== false){ + var last = this.last; + this.selectRange(this.last, this.lastActive+1); + this.grid.getView().focusRow(this.lastActive); + if(last !== false){ + this.last = last; + } + }else{ + this.selectFirstRow(); + } + }, + scope: this + }); + + var view = this.grid.view; + view.on("refresh", this.onRefresh, this); + view.on("rowupdated", this.onRowUpdated, this); + view.on("rowremoved", this.onRemove, this); + }, + + + onRefresh : function(){ + var ds = this.grid.dataSource, i, v = this.grid.view; + var s = this.selections; + s.each(function(r){ + if((i = ds.indexOfId(r.id)) != -1){ + v.onRowSelect(i); + }else{ + s.remove(r); + } + }); + }, + + + onRemove : function(v, index, r){ + this.selections.remove(r); + }, + + + onRowUpdated : function(v, index, r){ + if(this.isSelected(r)){ + v.onRowSelect(index); + } + }, + + + selectRecords : function(records, keepExisting){ + if(!keepExisting){ + this.clearSelections(); + } + var ds = this.grid.dataSource; + for(var i = 0, len = records.length; i < len; i++){ + this.selectRow(ds.indexOf(records[i]), true); + } + }, + + + getCount : function(){ + return this.selections.length; + }, + + + selectFirstRow : function(){ + this.selectRow(0); + }, + + + selectLastRow : function(keepExisting){ + this.selectRow(this.grid.dataSource.getCount() - 1, keepExisting); + }, + + + selectNext : function(keepExisting){ + if(this.last !== false && (this.last+1) < this.grid.dataSource.getCount()){ + this.selectRow(this.last+1, keepExisting); + this.grid.getView().focusRow(this.last); + } + }, + + + selectPrevious : function(keepExisting){ + if(this.last){ + this.selectRow(this.last-1, keepExisting); + this.grid.getView().focusRow(this.last); + } + }, + + + getSelections : function(){ + return [].concat(this.selections.items); + }, + + + getSelected : function(){ + return this.selections.itemAt(0); + }, + + + + clearSelections : function(fast){ + if(this.locked) return; + if(fast !== true){ + var ds = this.grid.dataSource; + var s = this.selections; + s.each(function(r){ + this.deselectRow(ds.indexOfId(r.id)); + }, this); + s.clear(); + }else{ + this.selections.clear(); + } + this.last = false; + }, + + + + selectAll : function(){ + if(this.locked) return; + this.selections.clear(); + for(var i = 0, len = this.grid.dataSource.getCount(); i < len; i++){ + this.selectRow(i, true); + } + }, + + + hasSelection : function(){ + return this.selections.length > 0; + }, + + + isSelected : function(index){ + var r = typeof index == "number" ? this.grid.dataSource.getAt(index) : index; + return (r && this.selections.key(r.id) ? true : false); + }, + + + isIdSelected : function(id){ + return (this.selections.key(id) ? true : false); + }, + + + handleMouseDown : function(e, t){ + var view = this.grid.getView(), rowIndex; + if(this.isLocked() || (rowIndex = view.findRowIndex(t)) === false){ + return; + }; + if(e.shiftKey && this.last !== false){ + var last = this.last; + this.selectRange(last, rowIndex, e.ctrlKey); + this.last = last; + view.focusRow(rowIndex); + }else{ + var isSelected = this.isSelected(rowIndex); + if(e.button != 0 && isSelected){ + view.focusRow(rowIndex); + }else if(e.ctrlKey && isSelected){ + this.deselectRow(rowIndex); + }else{ + this.selectRow(rowIndex, e.button == 0 && (e.ctrlKey || e.shiftKey)); + view.focusRow(rowIndex); + } + } + }, + + + selectRows : function(rows, keepExisting){ + if(!keepExisting){ + this.clearSelections(); + } + for(var i = 0, len = rows.length; i < len; i++){ + this.selectRow(rows[i], true); + } + }, + + + selectRange : function(startRow, endRow, keepExisting){ + if(this.locked) return; + if(!keepExisting){ + this.clearSelections(); + } + if(startRow <= endRow){ + for(var i = startRow; i <= endRow; i++){ + this.selectRow(i, true); + } + }else{ + for(var i = startRow; i >= endRow; i--){ + this.selectRow(i, true); + } + } + }, + + + deselectRange : function(startRow, endRow, preventViewNotify){ + if(this.locked) return; + for(var i = startRow; i <= endRow; i++){ + this.deselectRow(i, preventViewNotify); + } + }, + + + selectRow : function(index, keepExisting, preventViewNotify){ + if(this.locked || (index < 0 || index >= this.grid.dataSource.getCount())) return; + if(this.fireEvent("beforerowselect", this, index, keepExisting) !== false){ + if(!keepExisting || this.singleSelect){ + this.clearSelections(); + } + var r = this.grid.dataSource.getAt(index); + this.selections.add(r); + this.last = this.lastActive = index; + if(!preventViewNotify){ + this.grid.getView().onRowSelect(index); + } + this.fireEvent("rowselect", this, index, r); + this.fireEvent("selectionchange", this); + } + }, + + + deselectRow : function(index, preventViewNotify){ + if(this.locked) return; + if(this.last == index){ + this.last = false; + } + if(this.lastActive == index){ + this.lastActive = false; + } + var r = this.grid.dataSource.getAt(index); + this.selections.remove(r); + if(!preventViewNotify){ + this.grid.getView().onRowDeselect(index); + } + this.fireEvent("rowdeselect", this, index); + this.fireEvent("selectionchange", this); + }, + + + restoreLast : function(){ + if(this._last){ + this.last = this._last; + } + }, + + + acceptsNav : function(row, col, cm){ + return !cm.isHidden(col) && cm.isCellEditable(col, row); + }, + + + onEditorKey : function(field, e){ + var k = e.getKey(), newCell, g = this.grid, ed = g.activeEditor; + if(k == e.TAB){ + ed.completeEdit(); + if(e.shiftKey){ + newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this); + }else{ + newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this); + } + e.stopEvent(); + }else if(k == e.ENTER && !e.ctrlKey){ + ed.completeEdit(); + if(e.shiftKey){ + newCell = g.walkCells(ed.row-1, ed.col, -1, this.acceptsNav, this); + }else{ + newCell = g.walkCells(ed.row+1, ed.col, 1, this.acceptsNav, this); + } + e.stopEvent(); + }else if(k == e.ESC){ + ed.cancelEdit(); + } + if(newCell){ + g.startEditing(newCell[0], newCell[1]); + } + } +}); + +Ext.grid.CellSelectionModel = function(config){ + Ext.apply(this, config); + + this.selection = null; + + this.addEvents({ + + "beforecellselect" : true, + + "cellselect" : true, + + "selectionchange" : true + }); +}; + +Ext.extend(Ext.grid.CellSelectionModel, Ext.grid.AbstractSelectionModel, { + + + initEvents : function(){ + this.grid.on("mousedown", this.handleMouseDown, this); + this.grid.container.on(Ext.isIE ? "keydown" : "keypress", this.handleKeyDown, this); + var view = this.grid.view; + view.on("refresh", this.onViewChange, this); + view.on("rowupdated", this.onRowUpdated, this); + view.on("beforerowremoved", this.clearSelections, this); + view.on("beforerowsinserted", this.clearSelections, this); + if(this.grid.isEditor){ + this.grid.on("beforeedit", this.beforeEdit, this); + } + }, + + beforeEdit : function(e){ + this.select(e.row, e.column, false, true, e.record); + }, + + onRowUpdated : function(v, index, r){ + if(this.selection && this.selection.record == r){ + v.onCellSelect(index, this.selection.cell[1]); + } + }, + + onViewChange : function(){ + this.clearSelections(true); + }, + + getSelectedCell : function(){ + return this.selection ? this.selection.cell : null; + }, + + + clearSelections : function(preventNotify){ + var s = this.selection; + if(s){ + if(preventNotify !== true){ + this.grid.view.onCellDeselect(s.cell[0], s.cell[1]); + } + this.selection = null; + this.fireEvent("selectionchange", this, null); + } + }, + + + hasSelection : function(){ + return this.selection ? true : false; + }, + + + handleMouseDown : function(e, t){ + var v = this.grid.getView(); + if(this.isLocked()){ + return; + }; + var row = v.findRowIndex(t); + var cell = v.findCellIndex(t); + if(row !== false && cell !== false){ + this.select(row, cell); + } + }, + + + select : function(rowIndex, colIndex, preventViewNotify, preventFocus, r){ + if(this.fireEvent("beforecellselect", this, rowIndex, colIndex) !== false){ + this.clearSelections(); + r = r || this.grid.dataSource.getAt(rowIndex); + this.selection = { + record : r, + cell : [rowIndex, colIndex] + }; + if(!preventViewNotify){ + var v = this.grid.getView(); + v.onCellSelect(rowIndex, colIndex); + if(preventFocus !== true){ + v.focusCell(rowIndex, colIndex); + } + } + this.fireEvent("cellselect", this, rowIndex, colIndex); + this.fireEvent("selectionchange", this, this.selection); + } + }, + + isSelectable : function(rowIndex, colIndex, cm){ + return !cm.isHidden(colIndex); + }, + + + handleKeyDown : function(e){ + if(!e.isNavKeyPress()){ + return; + } + var g = this.grid, s = this.selection; + if(!s){ + e.stopEvent(); + var cell = g.walkCells(0, 0, 1, this.isSelectable, this); + if(cell){ + this.select(cell[0], cell[1]); + } + return; + } + var sm = this; + var walk = function(row, col, step){ + return g.walkCells(row, col, step, sm.isSelectable, sm); + }; + var k = e.getKey(), r = s.cell[0], c = s.cell[1]; + var newCell; + + switch(k){ + case e.TAB: + if(e.shiftKey){ + newCell = walk(r, c-1, -1); + }else{ + newCell = walk(r, c+1, 1); + } + break; + case e.DOWN: + newCell = walk(r+1, c, 1); + break; + case e.UP: + newCell = walk(r-1, c, -1); + break; + case e.RIGHT: + newCell = walk(r, c+1, 1); + break; + case e.LEFT: + newCell = walk(r, c-1, -1); + break; + case e.ENTER: + if(g.isEditor && !g.editing){ + g.startEditing(r, c); + e.stopEvent(); + return; + } + break; + }; + if(newCell){ + this.select(newCell[0], newCell[1]); + e.stopEvent(); + } + }, + + acceptsNav : function(row, col, cm){ + return !cm.isHidden(col) && cm.isCellEditable(col, row); + }, + + onEditorKey : function(field, e){ + var k = e.getKey(), newCell, g = this.grid, ed = g.activeEditor; + if(k == e.TAB){ + if(e.shiftKey){ + newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this); + }else{ + newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this); + } + e.stopEvent(); + }else if(k == e.ENTER && !e.ctrlKey){ + ed.completeEdit(); + e.stopEvent(); + }else if(k == e.ESC){ + ed.cancelEdit(); + } + if(newCell){ + g.startEditing(newCell[0], newCell[1]); + } + } +}); + +Ext.grid.EditorGrid = function(container, config){ + Ext.grid.EditorGrid.superclass.constructor.call(this, container, config); + this.container.addClass("xedit-grid"); + + if(!this.selModel){ + this.selModel = new Ext.grid.CellSelectionModel(); + } + + this.activeEditor = null; + + this.addEvents({ + + "beforeedit" : true, + + "afteredit" : true, + + "validateedit" : true + }); + this.on("bodyscroll", this.stopEditing, this); + this.on(this.clicksToEdit == 1 ? "cellclick" : "celldblclick", this.onCellDblClick, this); +}; + +Ext.extend(Ext.grid.EditorGrid, Ext.grid.Grid, { + isEditor : true, + clicksToEdit: 2, + trackMouseOver: false, + + onCellDblClick : function(g, row, col){ + this.startEditing(row, col); + }, + + onEditComplete : function(ed, value, startValue){ + this.editing = false; + this.activeEditor = null; + ed.un("specialkey", this.selModel.onEditorKey, this.selModel); + if(String(value) != String(startValue)){ + var r = ed.record; + var field = this.colModel.getDataIndex(ed.col); + var e = { + grid: this, + record: r, + field: field, + originalValue: startValue, + value: value, + row: ed.row, + column: ed.col, + cancel:false + }; + if(this.fireEvent("validateedit", e) !== false && !e.cancel){ + r.set(field, e.value); + delete e.cancel; + this.fireEvent("afteredit", e); + } + } + this.view.focusCell(ed.row, ed.col); + }, + + + startEditing : function(row, col){ + this.stopEditing(); + if(this.colModel.isCellEditable(col, row)){ + this.view.focusCell(row, col); + var r = this.dataSource.getAt(row); + var field = this.colModel.getDataIndex(col); + var e = { + grid: this, + record: r, + field: field, + value: r.data[field], + row: row, + column: col, + cancel:false + }; + if(this.fireEvent("beforeedit", e) !== false && !e.cancel){ + this.editing = true; + (function(){ + var ed = this.colModel.getCellEditor(col, row); + ed.row = row; + ed.col = col; + ed.record = r; + ed.on("complete", this.onEditComplete, this, {single: true}); + ed.on("specialkey", this.selModel.onEditorKey, this.selModel); + this.activeEditor = ed; + var v = r.data[field]; + ed.startEdit(this.view.getCell(row, col), v); + }).defer(50, this); + } + } + }, + + + stopEditing : function(){ + if(this.activeEditor){ + this.activeEditor.completeEdit(); + } + this.activeEditor = null; + } +}); +Ext.grid.GridEditor = function(field, config){ + Ext.grid.GridEditor.superclass.constructor.call(this, field, config); + field.monitorTab = false; +}; + +Ext.extend(Ext.grid.GridEditor, Ext.Editor, { + alignment: "tl-tl", + autoSize: "width", + hideEl : false, + cls: "x-small-editor x-grid-editor", + shim:false, + shadow:"frame" +}); +Ext.grid.PropertyRecord = Ext.data.Record.create([ + {name:'name',type:'string'}, 'value' +]); + +Ext.grid.PropertyStore = function(grid, source){ + this.grid = grid; + this.store = new Ext.data.Store({ + recordType : Ext.grid.PropertyRecord + }); + this.store.on('update', this.onUpdate, this); + if(source){ + this.setSource(source); + } + Ext.grid.PropertyStore.superclass.constructor.call(this); +}; +Ext.extend(Ext.grid.PropertyStore, Ext.util.Observable, { + setSource : function(o){ + this.source = o; + this.store.removeAll(); + var data = []; + for(var k in o){ + if(this.isEditableValue(o[k])){ + data.push(new Ext.grid.PropertyRecord({name: k, value: o[k]}, k)); + } + } + this.store.loadRecords({records: data}, {}, true); + }, + + onUpdate : function(ds, record, type){ + if(type == Ext.data.Record.EDIT){ + var v = record.data['value']; + var oldValue = record.modified['value']; + if(this.grid.fireEvent('beforepropertychange', this.source, record.id, v, oldValue) !== false){ + this.source[record.id] = v; + record.commit(); + this.grid.fireEvent('propertychange', this.source, record.id, v, oldValue); + }else{ + record.reject(); + } + } + }, + + getProperty : function(row){ + return this.store.getAt(row); + }, + + isEditableValue: function(val){ + if(val && val instanceof Date){ + return true; + }else if(typeof val == 'object' || typeof val == 'function'){ + return false; + } + return true; + }, + + setValue : function(prop, value){ + this.source[prop] = value; + this.store.getById(prop).set('value', value); + }, + + getSource : function(){ + return this.source; + } +}); + +Ext.grid.PropertyColumnModel = function(grid, store){ + this.grid = grid; + var g = Ext.grid; + g.PropertyColumnModel.superclass.constructor.call(this, [ + {header: this.nameText, sortable: true, dataIndex:'name', id: 'name'}, + {header: this.valueText, resizable:false, dataIndex: 'value', id: 'value'} + ]); + this.store = store; + this.bselect = Ext.DomHelper.append(document.body, { + tag: 'select', style:'display:none', cls: 'x-grid-editor', children: [ + {tag: 'option', value: 'true', html: 'true'}, + {tag: 'option', value: 'false', html: 'false'} + ] + }); + Ext.id(this.bselect); + var f = Ext.form; + this.editors = { + 'date' : new g.GridEditor(new f.DateField({selectOnFocus:true})), + 'string' : new g.GridEditor(new f.TextField({selectOnFocus:true})), + 'number' : new g.GridEditor(new f.NumberField({selectOnFocus:true, style:'text-align:left;'})), + 'boolean' : new g.GridEditor(new f.Field({el:this.beselect,selectOnFocus:true})) + }; + this.renderCellDelegate = this.renderCell.createDelegate(this); + this.renderPropDelegate = this.renderProp.createDelegate(this); +}; + +Ext.extend(Ext.grid.PropertyColumnModel, Ext.grid.ColumnModel, { + nameText : 'Name', + valueText : 'Value', + dateFormat : 'm/j/Y', + renderDate : function(dateVal){ + return dateVal.dateFormat(this.dateFormat); + }, + + renderBool : function(bVal){ + return bVal ? 'true' : 'false'; + }, + + isCellEditable : function(colIndex, rowIndex){ + return colIndex == 1; + }, + + getRenderer : function(col){ + return col == 1 ? + this.renderCellDelegate : this.renderPropDelegate; + }, + + renderProp : function(v){ + return this.getPropertyName(v); + }, + + renderCell : function(val){ + var rv = val; + if(val instanceof Date){ + rv = this.renderDate(val); + }else if(typeof val == 'boolean'){ + rv = this.renderBool(val); + } + return Ext.util.Format.htmlEncode(rv); + }, + + getPropertyName : function(name){ + var pn = this.grid.propertyNames; + return pn && pn[name] ? pn[name] : name; + }, + + getCellEditor : function(colIndex, rowIndex){ + var p = this.store.getProperty(rowIndex); + var n = p.data['name'], val = p.data['value']; + if(this.grid.customEditors[n]){ + return this.grid.customEditors[n]; + } + 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']; + } + } +}); + +Ext.grid.PropertyGrid = function(container, config){ + config = config || {}; + var store = new Ext.grid.PropertyStore(this); + this.store = store; + var cm = new Ext.grid.PropertyColumnModel(this, store); + store.store.sort('name', 'ASC'); + Ext.grid.PropertyGrid.superclass.constructor.call(this, container, Ext.apply({ + ds: store.store, + cm: cm, + enableColLock:false, + enableColumnMove:false, + stripeRows:false, + trackMouseOver: false, + clicksToEdit:1 + }, config)); + this.container.addClass('x-props-grid'); + this.lastEditRow = null; + this.on('columnresize', this.onColumnResize, this); + this.addEvents({ + beforepropertychange: true, + propertychange: true + }); + this.customEditors = this.customEditors || {}; +}; +Ext.extend(Ext.grid.PropertyGrid, Ext.grid.EditorGrid, { + render : function(){ + Ext.grid.PropertyGrid.superclass.render.call(this); + this.autoSize.defer(100, this); + }, + + autoSize : function(){ + Ext.grid.PropertyGrid.superclass.autoSize.call(this); + if(this.view){ + this.view.fitColumns(); + } + }, + + onColumnResize : function(){ + this.colModel.setColumnWidth(1, this.container.getWidth(true)-this.colModel.getColumnWidth(0)); + this.autoSize(); + }, + + setSource : function(source){ + this.store.setSource(source); + }, + + getSource : function(){ + return this.store.getSource(); + } +}); + +Ext.LoadMask = function(el, config){ + this.el = Ext.get(el); + Ext.apply(this, config); + if(this.store){ + this.store.on('beforeload', this.onBeforeLoad, this); + this.store.on('load', this.onLoad, this); + this.store.on('loadexception', this.onLoad, this); + this.removeMask = false; + }else{ + var um = this.el.getUpdateManager(); + um.showLoadIndicator = false; um.on('beforeupdate', this.onBeforeLoad, this); + um.on('update', this.onLoad, this); + um.on('failure', this.onLoad, this); + this.removeMask = true; + } +}; + +Ext.LoadMask.prototype = { + + + msg : 'Loading...', + + msgCls : 'x-mask-loading', + + + disabled: false, + + + disable : function(){ + this.disabled = true; + }, + + + enable : function(){ + this.disabled = false; + }, + + onLoad : function(){ + this.el.unmask(this.removeMask); + }, + + onBeforeLoad : function(){ + if(!this.disabled){ + this.el.mask(this.msg, this.msgCls); + } + }, + + destroy : function(){ + if(this.store){ + this.store.un('beforeload', this.onBeforeLoad, this); + this.store.un('load', this.onLoad, this); + this.store.un('loadexception', this.onLoad, this); + }else{ + var um = this.el.getUpdateManager(); + um.un('beforeupdate', this.onBeforeLoad, this); + um.un('update', this.onLoad, this); + um.un('failure', this.onLoad, this); + } + } +}; +Ext.debug = { + init : function(){ + var CP = Ext.ContentPanel; + var bd = Ext.get(document.body); + + var dlg = new Ext.LayoutDialog('x-debug-browser', { + autoCreate:true, + width:800, + height:450, + title: 'Ext Debug Console & Inspector', + proxyDrag:true, + shadow:true, + center:{alwaysShowTabs:true}, + constraintoviewport:false + }); + + dlg.el.swallowEvent('click'); + + var mainLayout = dlg.getLayout(); + mainLayout.beginUpdate(); + + var clayout = mainLayout.add('center', + new Ext.debug.InnerLayout('x-debug-console', 400, { + title: 'Debug Console' + } + )); + + var ilayout = mainLayout.add('center', + new Ext.debug.InnerLayout('x-debug-inspector', 250, { + title: 'DOM Inspector' + } + )); + + var scriptPanel = clayout.add('east', new CP({ + autoCreate:{ + tag: 'div', children: [ + {tag: 'div'}, + {tag:'textarea'} + ] + }, + fitContainer:true, + fitToFrame:true, + title:'Script Console', + autoScroll: Ext.isGecko, setSize : function(w, h){ + Ext.ContentPanel.prototype.setSize.call(this, w, h); + if(Ext.isGecko && Ext.isStrict){ + var s = this.adjustForComponents(w, h); + this.resizeEl.setSize(s.width-2, s.height-2); + } + } + })); + var sel = scriptPanel.el; + var script = sel.child('textarea'); + scriptPanel.resizeEl = script; + var sctb = scriptPanel.toolbar = new Ext.Toolbar(sel.child('div')); + sctb.add({ + text: 'Run', + handler: function(){ + var s = script.dom.value; + if(trap.checked){ + try{ + var rt = eval(s); + Ext.debug.dump(rt === undefined? '(no return)' : rt); + }catch(e){ + Ext.debug.log(e.message || e.descript); + } + }else{ + var rt = eval(s); + Ext.debug.dump(rt === undefined? '(no return)' : rt); + } + } + }, { + text: 'Clear', + handler: function(){ + script.dom.value = ''; + script.dom.focus(); + } + }); + + var trap = Ext.DomHelper.append(sctb.el, {tag:'input', type:'checkbox', checked: 'checked'}); + trap.checked = true; + sctb.add('-', trap, 'Trap Errors'); + + + var stylesGrid = new Ext.grid.PropertyGrid(bd.createChild(), { + nameText: 'Style', + enableCtxMenu: false, + enableColumnResize: false + }); + + var stylePanel = ilayout.add('east', new Ext.GridPanel(stylesGrid, + {title: '(No element selected)'})); + + stylesGrid.render(); + + stylesGrid.getView().mainHd.setDisplayed(false); + + clayout.tbar.add({ + text: 'Clear', + handler: function(){ + Ext.debug.console.jsonData = []; + Ext.debug.console.refresh(); + } + }); + + var treeEl = ilayout.main.getEl(); + var tb = ilayout.tbar; + + var inspectIgnore, inspecting; + + function inspectListener(e, t){ + if(!inspectIgnore.contains(e.getPoint())){ + findNode(t); + } + } + + function stopInspecting(e, t){ + if(!inspectIgnore.contains(e.getPoint())){ + inspect.toggle(false); + if(findNode(t) !== false){ + e.stopEvent(); + } + } + } + + function stopInspectingEsc(e, t){ + if(e.getKey() == e.ESC){ + inspect.toggle(false); + } + } + + var inspect = tb.addButton({ + text: 'Inspect', + enableToggle: true, + pressed:false, + toggleHandler: function(n, pressed){ + var d = Ext.get(document); + if(pressed){ + d.on('mouseover', inspectListener, window, {buffer:50}); + d.on('mousedown', stopInspecting); + d.on('keydown', stopInspectingEsc); + inspectIgnore = dlg.el.getRegion(); + inspecting = true; + }else{ + d.un('mouseover', inspectListener); + d.un('mousedown', stopInspecting); + d.on('keydown', stopInspectingEsc); + inspecting = false; + var n = tree.getSelectionModel().getSelectedNode(); + if(n && n.htmlNode){ + onNodeSelect(tree, n, false); + } + } + } + }); + + tb.addSeparator(); + + var frameEl = tb.addButton({ + text: 'Highlight Selection', + enableToggle: true, + pressed:false, + toggleHandler: function(n, pressed){ + var n = tree.getSelectionModel().getSelectedNode(); + if(n && n.htmlNode){ + n[pressed ? 'frame' : 'unframe'](); + } + } + }); + + tb.addSeparator(); + + var reload = tb.addButton({ + text: 'Refresh Children', + disabled:true, + handler: function(){ + var n = tree.getSelectionModel().getSelectedNode(); + if(n && n.reload){ + n.reload(); + } + } + }); + + tb.add( '-', { + text: 'Collapse All', + handler: function(){ + tree.root.collapse(true); + } + }); + + mainLayout.endUpdate(); + + mainLayout.getRegion('center').showPanel(0); + + stylesGrid.on('propertychange', function(s, name, value){ + var node = stylesGrid.treeNode; + if(styles){ + node.htmlNode.style[name] = value; + }else{ + node.htmlNode[name] = value; + } + node.refresh(true); + }); + + var stb = new Ext.Toolbar(stylesGrid.view.getHeaderPanel(true)); + + var swap = stb.addButton({ + text: 'DOM Attributes', + menu: { + items: [ + new Ext.menu.CheckItem({id:'dom', text:'DOM Attributes', checked: true, group:'xdb-styles'}), + new Ext.menu.CheckItem({id:'styles', text:'CSS Properties', group:'xdb-styles'}) + ] + } + }); + + swap.menu.on('click', function(){ + styles = swap.menu.items.get('styles').checked; + showAll[styles? 'show' : 'hide'](); + swap.setText(styles ? 'CSS Properties' : 'DOM Attributes'); + var n = tree.getSelectionModel().getSelectedNode(); + if(n){ + onNodeSelect(tree, n); + } + }); + + var addStyle = stb.addButton({ + text: 'Add', + disabled: true, + handler: function(){ + Ext.MessageBox.prompt('Add Property', 'Property Name:', function(btn, v){ + var store = stylesGrid.store.store; + if(btn == 'ok' && v && !store.getById(v)){ + var r = new Ext.grid.PropertyRecord({name:v, value: ''}, v); + store.add(r); + stylesGrid.startEditing(store.getCount()-1, 1); + } + }); + } + }); + + var showAll = stb.addButton({ + text: 'Computed Styles', + hidden: true, + pressed: false, + enableToggle: true, + toggleHandler: function(){ + var n = tree.getSelectionModel().getSelectedNode(); + if(n){ + onNodeSelect(tree, n); + } + } + }); + + var styles = false, hnode; + var nonSpace = /^\s*$/; + var html = Ext.util.Format.htmlEncode; + var ellipsis = Ext.util.Format.ellipsis; + var styleRe = /\s?([a-z\-]*)\:([^;]*)(?:[;\s\n\r]*)/gi; + + function findNode(n){ + if(!n || n.nodeType != 1 || n == document.body || n == document){ + return false; + } + var pn = [n], p = n; + while((p = p.parentNode) && p.nodeType == 1 && p.tagName.toUpperCase() != 'HTML'){ + pn.unshift(p); + } + var cn = hnode; + for(var i = 0, len = pn.length; i < len; i++){ + cn.expand(); + cn = cn.findChild('htmlNode', pn[i]); + if(!cn){ return false; + } + } + cn.select(); + var a = cn.ui.anchor; + treeEl.dom.scrollTop = Math.max(0 ,a.offsetTop-10); + cn.highlight(); + return true; + } + + function nodeTitle(n){ + var s = n.tagName; + if(n.id){ + s += '#'+n.id; + }else if(n.className){ + s += '.'+n.className; + } + return s; + } + + function onNodeSelect(t, n, last){ + if(last && last.unframe){ + last.unframe(); + } + var props = {}; + if(n && n.htmlNode){ + if(frameEl.pressed){ + n.frame(); + } + if(inspecting){ + return; + } + addStyle.enable(); + reload.setDisabled(n.leaf); + var dom = n.htmlNode; + stylePanel.setTitle(nodeTitle(dom)); + if(styles && !showAll.pressed){ + var s = dom.style ? dom.style.cssText : ''; + if(s){ + var m; + while ((m = styleRe.exec(s)) != null){ + props[m[1].toLowerCase()] = m[2]; + } + } + }else if(styles){ + var cl = Ext.debug.cssList; + var s = dom.style, fly = Ext.fly(dom); + if(s){ + for(var i = 0, len = cl.length; i' + ellipsis(html(String(c.nodeValue)), 35) + '', + cls: 'x-tree-noicon' + })); + } + } + cb(); + }; + + var tree = new Ext.tree.TreePanel(treeEl, { + enableDD:false , + loader: loader, + lines:false, + rootVisible:false, + animate:false, + hlColor:'ffff9c' + }); + tree.getSelectionModel().on('selectionchange', onNodeSelect, null, {buffer:250}); + + var root = tree.setRootNode(new Ext.tree.TreeNode('Ext')); + + hnode = root.appendChild(new Ext.debug.HtmlNode( + document.getElementsByTagName('html')[0] + )); + + tree.render(); + + Ext.debug.console = new Ext.JsonView(clayout.main.getEl(), + '
      > {msg}
      '); + Ext.debug.console.jsonData = []; + + Ext.debug.dialog = dlg; + }, + + show : function(){ + var d = Ext.debug; + if(!d.dialog){ + d.init(); + } + if(!d.dialog.isVisible()){ + d.dialog.show(); + } + }, + + hide : function(){ + if(Ext.debug.dialog){ + Ext.debug.dialog.hide(); + } + }, + + + log : function(arg1, arg2, etc){ + Ext.debug.show(); + var m = ""; + for(var i = 0, len = arguments.length; i < len; i++){ + m += (i == 0 ? "" : ", ") + arguments[i]; + } + var cn = Ext.debug.console; + cn.jsonData.unshift({msg: m}); + cn.refresh(); + }, + + + logf : function(format, arg1, arg2, etc){ + Ext.debug.log(String.format.apply(String, arguments)); + }, + + + dump : function(o){ + if(typeof o == 'string' || typeof o == 'number' || typeof o == 'undefined' || o instanceof Date){ + Ext.debug.log(o); + }else if(!o){ + Ext.debug.log("null"); + }else if(typeof o != "object"){ + Ext.debug.log('Unknown return type'); + }else if(o instanceof Array){ + Ext.debug.log('['+o.join(',')+']'); + }else{ + var b = ["{\n"]; + for(var key in o){ + var to = typeof o[key]; + if(to != "function" && to != "object"){ + b.push(String.format(" {0}: {1},\n", key, o[key])); + } + } + var s = b.join(""); + if(s.length > 3){ + s = s.substr(0, s.length-2); + } + Ext.debug.log(s + "\n}"); + } + }, + + _timers : {}, + + time : function(name){ + name = name || "def"; + Ext._timers[name] = new Date().getTime(); + }, + + + timeEnd : function(name, printResults){ + var t = new Date().getTime(); + name = name || "def"; + var v = String.format("{0} ms", t-Ext._timers[name]); + Ext._timers[name] = new Date().getTime(); + if(printResults !== false){ + Ext.debug.log('Timer ' + (name == "def" ? v : name + ": " + v)); + } + return v; + } +}; + +Ext.debug.HtmlNode = function(){ + var html = Ext.util.Format.htmlEncode; + var ellipsis = Ext.util.Format.ellipsis; + var nonSpace = /^\s*$/; + + var attrs = [ + {n: 'id', v: 'id'}, + {n: 'className', v: 'class'}, + {n: 'name', v: 'name'}, + {n: 'type', v: 'type'}, + {n: 'src', v: 'src'}, + {n: 'href', v: 'href'} + ]; + + function hasChild(n){ + for(var i = 0, c; c = n.childNodes[i]; i++){ + if(c.nodeType == 1){ + return true; + } + } + return false; + } + + function renderNode(n, leaf){ + var tag = n.tagName.toLowerCase(); + var s = '<' + tag; + for(var i = 0, len = attrs.length; i < len; i++){ + var a = attrs[i]; + var v = n[a.n]; + if(v && !nonSpace.test(v)){ + s += ' ' + a.v + '="' + html(v) +'"'; + } + } + var style = n.style ? n.style.cssText : ''; + if(style){ + s += ' style="' + html(style.toLowerCase()) +'"'; + } + if(leaf && n.childNodes.length > 0){ + s+='>' + ellipsis(html(String(n.innerHTML)), 35) + '</'+tag+'>'; + }else if(leaf){ + s += ' />'; + }else{ + s += '>'; + } + return s; + } + + var HtmlNode = function(n){ + var leaf = !hasChild(n); + this.htmlNode = n; + this.tagName = n.tagName.toLowerCase(); + var attr = { + text : renderNode(n, leaf), + leaf : leaf, + cls: 'x-tree-noicon' + }; + HtmlNode.superclass.constructor.call(this, attr); + this.attributes.htmlNode = n; if(!leaf){ + this.on('expand', this.onExpand, this); + this.on('collapse', this.onCollapse, this); + } + }; + + + Ext.extend(HtmlNode, Ext.tree.AsyncTreeNode, { + cls: 'x-tree-noicon', + preventHScroll: true, + refresh : function(highlight){ + var leaf = !hasChild(this.htmlNode); + this.setText(renderNode(this.htmlNode, leaf)); + if(highlight){ + Ext.fly(this.ui.textNode).highlight(); + } + }, + + onExpand : function(){ + if(!this.closeNode && this.parentNode){ + this.closeNode = this.parentNode.insertBefore(new Ext.tree.TreeNode({ + text:'</' + this.tagName + '>', + cls: 'x-tree-noicon' + }), this.nextSibling); + }else if(this.closeNode){ + this.closeNode.ui.show(); + } + }, + + onCollapse : function(){ + if(this.closeNode){ + this.closeNode.ui.hide(); + } + }, + + render : function(bulkRender){ + HtmlNode.superclass.render.call(this, bulkRender); + }, + + highlightNode : function(){ + }, + + highlight : function(){ + }, + + frame : function(){ + this.htmlNode.style.border = '1px solid #0000ff'; + }, + + unframe : function(){ + this.htmlNode.style.border = ''; + } + }); + + return HtmlNode; +}(); + +Ext.debug.InnerLayout = function(id, w, cfg){ + var el = Ext.DomHelper.append(document.body, {id:id}); + var layout = new Ext.BorderLayout(el, { + north: { + initialSize:28 + }, + center: { + titlebar: false + }, + east: { + split:true, + initialSize:w, + titlebar:true + } + }); + Ext.debug.InnerLayout.superclass.constructor.call(this, layout, cfg); + + layout.beginUpdate(); + + var tbPanel = layout.add('north', new Ext.ContentPanel({ + autoCreate:true, fitToFrame:true})); + + this.main = layout.add('center', new Ext.ContentPanel({ + autoCreate:true, fitToFrame:true, autoScroll:true})); + + this.tbar = new Ext.Toolbar(tbPanel.el); + + var mtbEl = tbPanel.resizeEl = tbPanel.el.child('div.x-toolbar'); + mtbEl.setStyle('border-bottom', '0 none'); + + layout.endUpdate(true); +}; + +Ext.extend(Ext.debug.InnerLayout, Ext.NestedLayoutPanel, { + add : function(){ + return this.layout.add.apply(this.layout, arguments); + } +}); + +Ext.debug.cssList = ['background-color','border','border-color','border-spacing', +'border-style','border-top','border-right','border-bottom','border-left','border-top-color', +'border-right-color','border-bottom-color','border-left-color','border-top-width','border-right-width', +'border-bottom-width','border-left-width','border-width','bottom','color','font-size','font-size-adjust', +'font-stretch','font-style','height','left','letter-spacing','line-height','margin','margin-top', +'margin-right','margin-bottom','margin-left','marker-offset','max-height','max-width','min-height', +'min-width','orphans','outline','outline-color','outline-style','outline-width','overflow','padding', +'padding-top','padding-right','padding-bottom','padding-left','quotes','right','size','text-indent', +'top','width','word-spacing','z-index','opacity','outline-offset']; + +if(typeof console == 'undefined'){ + console = Ext.debug; +} + + +Ext.EventManager.on(window, 'load', function(){ + Ext.get(document).on('keydown', function(e){ + if(e.ctrlKey && e.shiftKey && e.getKey() == e.HOME){ + Ext.debug.show(); + } + }); +}); + +Ext.print = Ext.log = Ext.debug.log; +Ext.printf = Ext.logf = Ext.debug.logf; +Ext.dump = Ext.debug.dump; +Ext.timer = Ext.debug.time; +Ext.timerEnd = Ext.debug.timeEnd; + diff --git a/www/extras/yui-ext/ext-all.js b/www/extras/yui-ext/ext-all.js new file mode 100644 index 000000000..f877f0296 --- /dev/null +++ b/www/extras/yui-ext/ext-all.js @@ -0,0 +1,256 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.DomHelper=function(){var _1=null;var _2=/^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i;var _3=function(o){if(typeof o=="string"){return o;}var b="";if(!o.tag){o.tag="div";}b+="<"+o.tag;for(var _6 in o){if(_6=="tag"||_6=="children"||_6=="cn"||_6=="html"||typeof o[_6]=="function"){continue;}if(_6=="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 _8 in s){if(typeof s[_8]!="function"){b+=_8+":"+s[_8]+";";}}b+="\"";}}}else{if(_6=="cls"){b+=" class=\""+o["cls"]+"\"";}else{if(_6=="htmlFor"){b+=" for=\""+o["htmlFor"]+"\"";}else{b+=" "+_6+"=\""+o[_6]+"\"";}}}}if(_2.test(o.tag)){b+="/>";}else{b+=">";var cn=o.children||o.cn;if(cn){if(cn instanceof Array){for(var i=0,_b=cn.length;i<_b;i++){b+=_3(cn[i],b);}}else{b+=_3(cn,b);}}if(o.html){b+=o.html;}b+="";}return b;};var _c=function(o,_e){var el=document.createElement(o.tag);var _10=el.setAttribute?true:false;for(var _11 in o){if(_11=="tag"||_11=="children"||_11=="cn"||_11=="html"||_11=="style"||typeof o[_11]=="function"){continue;}if(_11=="cls"){el.className=o["cls"];}else{if(_10){el.setAttribute(_11,o[_11]);}else{el[_11]=o[_11];}}}Ext.DomHelper.applyStyles(el,o.style);var cn=o.children||o.cn;if(cn){if(cn instanceof Array){for(var i=0,len=cn.length;i",tbe=""+te,trs=tbs+"",tre=""+tbe;var _22=function(tag,_24,el,_26){if(!_1){_1=document.createElement("div");}var _27;var _28=null;if(tag=="td"){if(_24=="afterbegin"||_24=="beforeend"){return;}if(_24=="beforebegin"){_28=el;el=el.parentNode;}else{_28=el.nextSibling;el=el.parentNode;}_27=_15(4,trs,_26,tre);}else{if(tag=="tr"){if(_24=="beforebegin"){_28=el;el=el.parentNode;_27=_15(3,tbs,_26,tbe);}else{if(_24=="afterend"){_28=el.nextSibling;el=el.parentNode;_27=_15(3,tbs,_26,tbe);}else{if(_24=="afterbegin"){_28=el.firstChild;}_27=_15(4,trs,_26,tre);}}}else{if(tag=="tbody"){if(_24=="beforebegin"){_28=el;el=el.parentNode;_27=_15(2,ts,_26,te);}else{if(_24=="afterend"){_28=el.nextSibling;el=el.parentNode;_27=_15(2,ts,_26,te);}else{if(_24=="afterbegin"){_28=el.firstChild;}_27=_15(3,tbs,_26,tbe);}}}else{if(_24=="beforebegin"||_24=="afterend"){return;}if(_24=="afterbegin"){_28=el.firstChild;}_27=_15(2,ts,_26,te);}}}el.insertBefore(_27,_28);return _27;};return {useDom:false,markup:function(o){return _3(o);},applyStyles:function(el,_2b){if(_2b){el=Ext.fly(el);if(typeof _2b=="string"){var re=/\s?([a-z\-]*)\:\s?([^;]*);?/gi;var _2d;while((_2d=re.exec(_2b))!=null){el.setStyle(_2d[1],_2d[2]);}}else{if(typeof _2b=="object"){for(var _2e in _2b){el.setStyle(_2e,_2b[_2e]);}}else{if(typeof _2b=="function"){Ext.DomHelper.applyStyles(el,_2b.call());}}}}},insertHtml:function(_2f,el,_31){_2f=_2f.toLowerCase();if(el.insertAdjacentHTML){var tag=el.tagName.toLowerCase();if(tag=="table"||tag=="tbody"||tag=="tr"||tag=="td"){var rs;if(rs=_22(tag,_2f,el,_31)){return rs;}}switch(_2f){case "beforebegin":el.insertAdjacentHTML(_2f,_31);return el.previousSibling;case "afterbegin":el.insertAdjacentHTML(_2f,_31);return el.firstChild;case "beforeend":el.insertAdjacentHTML(_2f,_31);return el.lastChild;case "afterend":el.insertAdjacentHTML(_2f,_31);return el.nextSibling;}throw "Illegal insertion point -> \""+_2f+"\"";}var _34=el.ownerDocument.createRange();var _35;switch(_2f){case "beforebegin":_34.setStartBefore(el);_35=_34.createContextualFragment(_31);el.parentNode.insertBefore(_35,el);return el.previousSibling;case "afterbegin":if(el.firstChild){_34.setStartBefore(el.firstChild);_35=_34.createContextualFragment(_31);el.insertBefore(_35,el.firstChild);return el.firstChild;}else{el.innerHTML=_31;return el.firstChild;}case "beforeend":if(el.lastChild){_34.setStartAfter(el.lastChild);_35=_34.createContextualFragment(_31);el.appendChild(_35);return el.lastChild;}else{el.innerHTML=_31;return el.lastChild;}case "afterend":_34.setStartAfter(el);_35=_34.createContextualFragment(_31);el.parentNode.insertBefore(_35,el.nextSibling);return el.nextSibling;}throw "Illegal insertion point -> \""+_2f+"\"";},insertBefore:function(el,o,_38){return this.doInsert(el,o,_38,"beforeBegin");},insertAfter:function(el,o,_3b){return this.doInsert(el,o,_3b,"afterEnd","nextSibling");},insertFirst:function(el,o,_3e){return this.doInsert(el,o,_3e,"afterBegin");},doInsert:function(el,o,_41,pos,_43){el=Ext.getDom(el);var _44;if(this.useDom){_44=_c(o,null);el.parentNode.insertBefore(_44,_43?el[_43]:el);}else{var _45=_3(o);_44=this.insertHtml(pos,el,_45);}return _41?Ext.get(_44,true):_44;},append:function(el,o,_48){el=Ext.getDom(el);var _49;if(this.useDom){_49=_c(o,null);el.appendChild(_49);}else{var _4a=_3(o);_49=this.insertHtml("beforeEnd",el,_4a);}return _48?Ext.get(_49,true):_49;},overwrite:function(el,o,_4d){el=Ext.getDom(el);el.innerHTML=_3(o);return _4d?Ext.get(el.firstChild,true):el.firstChild;},createTemplate:function(o){var _4f=_3(o);return new Ext.Template(_4f);}};}(); + +Ext.Template=function(_1){if(_1 instanceof Array){_1=_1.join("");}else{if(arguments.length>1){_1=Array.prototype.join.call(arguments,"");}}this.html=_1;};Ext.Template.prototype={applyTemplate:function(_2){if(this.compiled){return this.compiled(_2);}var _3=this.disableFormats!==true;var fm=Ext.util.Format,_5=this;var fn=function(m,_8,_9,_a){if(_9&&_3){if(_9.substr(0,5)=="this."){return _5.call(_9.substr(5),_2[_8]);}else{if(_a){var re=/^\s*['"](.*)["']\s*$/;_a=_a.split(",");for(var i=0,_d=_a.length;i<_d;i++){_a[i]=_a[i].replace(re,"$1");}_a=[_2[_8]].concat(_a);}else{_a=[_2[_8]];}return fm[_9].apply(fm,_a);}}else{return _2[_8]!==undefined?_2[_8]:"";}};return this.html.replace(this.re,fn);},set:function(_e,_f){this.html=_e;this.compiled=null;if(_f){this.compile();}return this;},disableFormats:false,re:/\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,compile:function(){var fm=Ext.util.Format;var _11=this.disableFormats!==true;var sep=Ext.isGecko?"+":",";var fn=function(m,_15,_16,_17){if(_16&&_11){_17=_17?","+_17:"";if(_16.substr(0,5)!="this."){_16="fm."+_16+"(";}else{_16="this.call(\""+_16.substr(5)+"\", ";_17="";}}else{_17="",_16="(values['"+_15+"'] == undefined ? '' : ";}return "'"+sep+_16+"values['"+_15+"']"+_17+")"+sep+"'";};var _18;if(Ext.isGecko){_18="this.compiled = function(values){ return '"+this.html.replace(/(\r\n|\n)/g,"\\n").replace("'","\\'").replace(this.re,fn)+"';};";}else{_18=["this.compiled = function(values){ return ['"];_18.push(this.html.replace(/(\r\n|\n)/g,"\\n").replace("'","\\'").replace(this.re,fn));_18.push("'].join('');};");_18=_18.join("");}eval(_18);return this;},call:function(_19,_1a){return this[_19](_1a);},insertFirst:function(el,_1c,_1d){return this.doInsert("afterBegin",el,_1c,_1d);},insertBefore:function(el,_1f,_20){return this.doInsert("beforeBegin",el,_1f,_20);},insertAfter:function(el,_22,_23){return this.doInsert("afterEnd",el,_22,_23);},append:function(el,_25,_26){return this.doInsert("beforeEnd",el,_25,_26);},doInsert:function(_27,el,_29,_2a){el=Ext.getDom(el);var _2b=Ext.DomHelper.insertHtml(_27,el,this.applyTemplate(_29));return _2a?Ext.get(_2b,true):_2b;},overwrite:function(el,_2d,_2e){el=Ext.getDom(el);el.innerHTML=this.applyTemplate(_2d);return _2e?Ext.get(el.firstChild,true):el.firstChild;}};Ext.Template.prototype.apply=Ext.Template.prototype.applyTemplate;Ext.DomHelper.Template=Ext.Template;Ext.Template.from=function(el){el=Ext.getDom(el);return new Ext.Template(el.value||el.innerHTML);};Ext.MasterTemplate=function(){Ext.MasterTemplate.superclass.constructor.apply(this,arguments);this.originalHtml=this.html;var st={};var m,re=this.subTemplateRe;re.lastIndex=0;var _33=0;while(m=re.exec(this.html)){var _34=m[1],_35=m[2];st[_33]={name:_34,index:_33,buffer:[],tpl:new Ext.Template(_35)};if(_34){st[_34]=st[_33];}st[_33].tpl.compile();st[_33].tpl.call=this.call.createDelegate(this);_33++;}this.subCount=_33;this.subs=st;};Ext.extend(Ext.MasterTemplate,Ext.Template,{subTemplateRe:/((?:.|\n)*?)<\/tpl>/gi,add:function(_36,_37){if(arguments.length==1){_37=arguments[0];_36=0;}var s=this.subs[_36];s.buffer[s.buffer.length]=s.tpl.apply(_37);return this;},fill:function(_39,_3a,_3b){var a=arguments;if(a.length==1||(a.length==2&&typeof a[1]=="boolean")){_3a=a[0];_39=0;_3b=a[1];}if(_3b){this.reset();}for(var i=0,len=_3a.length;i]\s?|\s|$)/;var _8=/^(#)?([\w-\*]+)/;function child(p,_a){var i=0;var n=p.firstChild;while(n){if(n.nodeType==1){if(++i==_a){return n;}}n=n.nextSibling;}return null;}function next(n){while((n=n.nextSibling)&&n.nodeType!=1){}return n;}function prev(n){while((n=n.previousSibling)&&n.nodeType!=1){}return n;}function clean(d){var n=d.firstChild,ni=-1;while(n){var nx=n.nextSibling;if(n.nodeType==3&&!_4.test(n.nodeValue)){d.removeChild(n);}else{n.nodeIndex=++ni;}n=nx;}return this;}function byClassName(c,a,v,re,cn){if(!v){return c;}var r=[];for(var i=0,ci;ci=c[i];i++){cn=ci.className;if(cn&&(" "+cn+" ").indexOf(v)!=-1){r[r.length]=ci;}}return r;}function attrValue(n,_1c){if(!n.tagName&&typeof n.length!="undefined"){n=n[0];}if(!n){return null;}if(_1c=="for"){return n.htmlFor;}if(_1c=="class"||_1c=="className"){return n.className;}return n.getAttribute(_1c)||n[_1c];}function getNodes(ns,_1e,_1f){var _20=[],cs;if(!ns){return _20;}_1e=_1e?_1e.replace(_5,""):"";_1f=_1f||"*";if(typeof ns.getElementsByTagName!="undefined"){ns=[ns];}if(_1e!="/"&&_1e!=">"){for(var i=0,ni;ni=ns[i];i++){cs=ni.getElementsByTagName(_1f);for(var j=0,ci;ci=cs[j];j++){_20[_20.length]=ci;}}}else{for(var i=0,ni;ni=ns[i];i++){var cn=ni.getElementsByTagName(_1f);for(var j=0,cj;cj=cn[j];j++){if(cj.parentNode==ni){_20[_20.length]=cj;}}}}return _20;}function concat(a,b){if(b.slice){return a.concat(b);}for(var i=0,l=b.length;i0);},filter:function(els,ss,_92){ss=ss.replace(_5,"");if(!_2[ss]){_2[ss]=Ext.DomQuery.compile(ss,"simple");}var _93=_2[ss](els);return _92?quickDiff(_93,els):_93;},matchers:[{re:/^\.([\w-]+)/,select:"n = byClassName(n, null, \" {1} \");"},{re:/^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,select:"n = byPseudo(n, \"{1}\", \"{2}\");"},{re:/^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,select:"n = byAttribute(n, \"{2}\", \"{4}\", \"{3}\", \"{1}\");"},{re:/^#([\w-]+)/,select:"n = byId(n, null, \"{1}\");"},{re:/^@([\w-]+)/,select:"return {firstChild:{nodeValue:attrValue(n, \"{1}\")}};"}],operators:{"=":function(a,v){return a==v;},"!=":function(a,v){return a!=v;},"^=":function(a,v){return a&&a.substr(0,v.length)==v;},"$=":function(a,v){return a&&a.substr(a.length-v.length)==v;},"*=":function(a,v){return a&&a.indexOf(v)!==-1;},"%=":function(a,v){return (a%v)==0;}},pseudos:{"first-child":function(c){var r=[],n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.previousSibling)&&n.nodeType!=1){}if(!n){r[r.length]=ci;}}return r;},"last-child":function(c){var r=[];for(var i=0,ci;ci=n=c[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(!n){r[r.length]=ci;}}return r;},"nth-child":function(c,a){var r=[];if(a!="odd"&&a!="even"){for(var i=0,ci;ci=c[i];i++){var m=child(ci.parentNode,a);if(m==ci){r[r.length]=m;}}return r;}var p;for(var i=0,l=c.length;i0){r[r.length]=ci;}}return r;},"next":function(c,ss){var is=Ext.DomQuery.is;var r=[];for(var i=0,ci;ci=c[i];i++){var n=next(ci);if(n&&is(n,ss)){r[r.length]=ci;}}return r;},"prev":function(c,ss){var is=Ext.DomQuery.is;var r=[];for(var i=0,ci;ci=c[i];i++){var n=prev(ci);if(n&&is(n,ss)){r[r.length]=ci;}}return r;}}};}();Ext.query=Ext.DomQuery.select; + +Ext.util.Observable=function(){if(this.listeners){this.on(this.listeners);delete this.listeners;}};Ext.util.Observable.prototype={fireEvent:function(){var ce=this.events[arguments[0].toLowerCase()];if(typeof ce=="object"){return ce.fire.apply(ce,Array.prototype.slice.call(arguments,1));}else{return true;}},filterOptRe:/^(?:scope|delay|buffer|single)$/,addListener:function(_2,fn,_4,o){if(typeof _2=="object"){o=_2;for(var e in o){if(this.filterOptRe.test(e)){continue;}if(typeof o[e]=="function"){this.addListener(e,o[e],o.scope,o);}else{this.addListener(e,o[e].fn,o[e].scope,o[e]);}}return;}o=(!o||typeof o=="boolean")?{}:o;_2=_2.toLowerCase();var ce=this.events[_2]||true;if(typeof ce=="boolean"){ce=new Ext.util.Event(this,_2);this.events[_2]=ce;}ce.addListener(fn,_4,o);},removeListener:function(_8,fn,_a){var ce=this.events[_8.toLowerCase()];if(typeof ce=="object"){ce.removeListener(fn,_a);}},purgeListeners:function(){for(var _c in this.events){if(typeof this.events[_c]=="object"){this.events[_c].clearListeners();}}},relayEvents:function(o,_e){var _f=function(_10){return function(){return this.fireEvent.apply(this,Ext.combine(_10,Array.prototype.slice.call(arguments,0)));};};for(var i=0,len=_e.length;i0;}};Ext.util.Observable.prototype.on=Ext.util.Observable.prototype.addListener;Ext.util.Observable.prototype.un=Ext.util.Observable.prototype.removeListener;Ext.util.Observable.capture=function(o,fn,_19){o.fireEvent=o.fireEvent.createInterceptor(fn,_19);};Ext.util.Observable.releaseCapture=function(o){o.fireEvent=Ext.util.Observable.prototype.fireEvent;};(function(){var _1b=function(h,o,_1e){var _1f=new Ext.util.DelayedTask();return function(){_1f.delay(o.buffer,h,_1e,Array.prototype.slice.call(arguments,0));};};var _20=function(h,e,fn,_24){return function(){e.removeListener(fn,_24);return h.apply(_24,arguments);};};var _25=function(h,o,_28){return function(){var _29=Array.prototype.slice.call(arguments,0);setTimeout(function(){h.apply(_28,_29);},o.delay||10);};};Ext.util.Event=function(obj,_2b){this.name=_2b;this.obj=obj;this.listeners=[];};Ext.util.Event.prototype={addListener:function(fn,_2d,_2e){var o=_2e||{};_2d=_2d||this.obj;if(!this.isListening(fn,_2d)){var l={fn:fn,scope:_2d,options:o};var h=fn;if(o.delay){h=_25(h,o,_2d);}if(o.single){h=_20(h,this,fn,_2d);}if(o.buffer){h=_1b(h,o,_2d);}l.fireFn=h;if(!this.firing){this.listeners.push(l);}else{this.listeners=this.listeners.slice(0);this.listeners.push(l);}}},findListener:function(fn,_33){_33=_33||this.obj;var ls=this.listeners;for(var i=0,len=ls.length;i0){this.firing=true;var _40=Array.prototype.slice.call(arguments,0);for(var i=0;i");var _c=document.getElementById("ie-deferred-loader");_c.onreadystatechange=function(){if(this.readyState=="complete"){_a();_c.onreadystatechange=null;_c.parentNode.removeChild(_c);}};}else{if(Ext.isSafari){_2=setInterval(function(){var rs=document.readyState;if(rs=="complete"){_a();}},10);}}}E.on(window,"load",_a);};var _e=function(h,o){var _11=new Ext.util.DelayedTask(h);return function(e){e=new Ext.EventObjectImpl(e);_11.delay(o.buffer,h,null,[e]);};};var _13=function(h,el,_16,fn){return function(e){Ext.EventManager.removeListener(el,_16,fn);h(e);};};var _19=function(h,o){return function(e){e=new Ext.EventObjectImpl(e);setTimeout(function(){h(e);},o.delay||10);};};var _1d=function(_1e,_1f,opt,fn,_22){var o=(!opt||typeof opt=="boolean")?{}:opt;fn=fn||o.fn;_22=_22||o.scope;var el=Ext.getDom(_1e);if(!el){throw "Error listening for \""+_1f+"\". Element \""+_1e+"\" doesn't exist.";}var h=function(e){e=Ext.EventObject.setEvent(e);var t;if(o.delegate){t=e.getTarget(o.delegate,el);if(!t){return;}}else{t=e.target;}if(o.stopEvent===true){e.stopEvent();}if(o.preventDefault===true){e.preventDefault();}if(o.stopPropagation===true){e.stopPropagation();}if(o.normalized===false){e=e.browserEvent;}fn.call(_22||el,e,t,o);};if(o.delay){h=_19(h,o);}if(o.single){h=_13(h,el,_1f,fn);}if(o.buffer){h=_e(h,o);}fn._handlers=fn._handlers||[];fn._handlers.push([Ext.id(el),_1f,h]);E.on(el,_1f,h);if(_1f=="mousewheel"&&el.addEventListener){el.addEventListener("DOMMouseScroll",h,false);E.on(window,"unload",function(){el.removeEventListener("DOMMouseScroll",h,false);});}if(_1f=="mousedown"&&el==document){Ext.EventManager.stoppedMouseDownEvent.addListener(h);}return h;};var _28=function(el,_2a,fn){var id=Ext.id(el),hds=fn._handlers,hd=fn;if(hds){for(var i=0,len=hds.length;i=33&&k<=40)||k==this.RETURN||k==this.TAB||k==this.ESC;},isSpecialKey:function(){var k=this.keyCode;return k==9||k==13||k==40||k==27||(k==16)||(k==17)||(k>=18&&k<=20)||(k>=33&&k<=35)||(k>=36&&k<=39)||(k>=44&&k<=45);},stopPropagation:function(){if(this.browserEvent){if(this.browserEvent.type=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.fire(this);}E.stopPropagation(this.browserEvent);}},getCharCode:function(){return this.charCode||this.keyCode;},getKey:function(){var k=this.keyCode||this.charCode;return Ext.isSafari?(_51[k]||k):k;},getPageX:function(){return this.xy[0];},getPageY:function(){return this.xy[1];},getTime:function(){if(this.browserEvent){return E.getTime(this.browserEvent);}return null;},getXY:function(){return this.xy;},getTarget:function(_58,_59,_5a){return _58?Ext.fly(this.target).findParent(_58,_59,_5a):this.target;},getRelatedTarget:function(){if(this.browserEvent){return E.getRelatedTarget(this.browserEvent);}return null;},getWheelDelta:function(){var e=this.browserEvent;var _5c=0;if(e.wheelDelta){_5c=e.wheelDelta/120;if(window.opera){_5c=-_5c;}}else{if(e.detail){_5c=-e.detail/3;}}return _5c;},hasModifier:function(){return ((this.ctrlKey||this.altKey)||this.shiftKey)?true:false;},within:function(el,_5e){var t=this[_5e?"getRelatedTarget":"getTarget"]();return t&&Ext.fly(el).contains(t);},getPoint:function(){return new Ext.lib.Point(this.xy[0],this.xy[1]);}};return new Ext.EventObjectImpl();}(); + +(function(){var D=Ext.lib.Dom;var E=Ext.lib.Event;var A=Ext.lib.Anim;var _4={};var _5=/(-[a-z])/gi;var _6=function(m,a){return a.charAt(1).toUpperCase();};var _9=document.defaultView;Ext.Element=function(_a,_b){var _c=typeof _a=="string"?document.getElementById(_a):_a;if(!_c){return null;}if(!_b&&Ext.Element.cache[_c.id]){return Ext.Element.cache[_c.id];}this.dom=_c;this.id=_c.id||Ext.id(_c);};var El=Ext.Element;El.prototype={originalDisplay:"",visibilityMode:1,defaultUnit:"px",setVisibilityMode:function(_e){this.visibilityMode=_e;return this;},enableDisplayMode:function(_f){this.setVisibilityMode(El.DISPLAY);if(typeof _f!="undefined"){this.originalDisplay=_f;}return this;},findParent:function(_10,_11,_12){var p=this.dom,b=document.body,_15=0,dq=Ext.DomQuery,_17;_11=_11||50;if(typeof _11!="number"){_17=Ext.getDom(_11);_11=10;}while(p&&p.nodeType==1&&_15<_11&&p!=b&&p!=_17){if(dq.is(p,_10)){return _12?Ext.get(p):p;}_15++;p=p.parentNode;}return null;},findParentNode:function(_18,_19,_1a){var p=Ext.fly(this.dom.parentNode,"_internal");return p?p.findParent(_18,_19,_1a):null;},up:function(_1c,_1d){return this.findParentNode(_1c,_1d,true);},is:function(_1e){return Ext.DomQuery.is(this.dom,_1e);},animate:function(_1f,_20,_21,_22,_23){this.anim(_1f,{duration:_20,callback:_21,easing:_22},_23);return this;},anim:function(_24,opt,_26,_27,_28,cb){_26=_26||"run";opt=opt||{};var _2a=Ext.lib.Anim[_26](this.dom,_24,(opt.duration||_27)||0.35,(opt.easing||_28)||"easeOut",function(){Ext.callback(cb,this);Ext.callback(opt.callback,opt.scope||this,[this,opt]);},this);opt.anim=_2a;return _2a;},preanim:function(a,i){return !a[i]?false:(typeof a[i]=="object"?a[i]:{duration:a[i+1],callback:a[i+2],easing:a[i+3]});},clean:function(_2d){if(this.isCleaned&&_2d!==true){return this;}var ns=/\S/;var d=this.dom,n=d.firstChild,ni=-1;while(n){var nx=n.nextSibling;if(n.nodeType==3&&!ns.test(n.nodeValue)){d.removeChild(n);}else{n.nodeIndex=++ni;}n=nx;}this.isCleaned=true;return this;},calcOffsetsTo:function(el){el=Ext.get(el),d=el.dom;var _34=false;if(el.getStyle("position")=="static"){el.position("relative");_34=true;}var x=0,y=0;var op=this.dom;while(op&&op!=d&&op.tagName!="HTML"){x+=op.offsetLeft;y+=op.offsetTop;op=op.offsetParent;}if(_34){el.position("static");}return [x,y];},scrollIntoView:function(_38,_39){var c=Ext.getDom(_38)||document.body;var el=this.dom;var o=this.calcOffsetsTo(c),l=o[0],t=o[1],b=t+el.offsetHeight,r=l+el.offsetWidth;var ch=c.clientHeight;var ct=parseInt(c.scrollTop,10);var cl=parseInt(c.scrollLeft,10);var cb=ct+ch;var cr=cl+c.clientWidth;if(tcb){c.scrollTop=b-ch;}}if(_39!==false){if(lcr){c.scrollLeft=r-c.clientWidth;}}}return this;},scrollChildIntoView:function(_46){Ext.fly(_46,"_scrollChildIntoView").scrollIntoView(this);},autoHeight:function(_47,_48,_49,_4a){var _4b=this.getHeight();this.clip();this.setHeight(1);setTimeout(function(){var _4c=parseInt(this.dom.scrollHeight,10);if(!_47){this.setHeight(_4c);this.unclip();if(typeof _49=="function"){_49();}}else{this.setHeight(_4b);this.setHeight(_4c,_47,_48,function(){this.unclip();if(typeof _49=="function"){_49();}}.createDelegate(this),_4a);}}.createDelegate(this),0);return this;},contains:function(el){if(!el){return false;}return D.isAncestor(this.dom,el.dom?el.dom:el);},isVisible:function(_4e){var vis=!(this.getStyle("visibility")=="hidden"||this.getStyle("display")=="none");if(_4e!==true||!vis){return vis;}var p=this.dom.parentNode;while(p&&p.tagName.toLowerCase()!="body"){if(!Ext.fly(p,"_isVisible").isVisible()){return false;}p=p.parentNode;}return true;},select:function(_51,_52){return El.select("#"+Ext.id(this.dom)+" "+_51,_52);},query:function(_53,_54){return Ext.DomQuery.select("#"+Ext.id(this.dom)+" "+_53);},child:function(_55,_56){var n=Ext.DomQuery.selectNode("#"+Ext.id(this.dom)+" "+_55);return _56?n:Ext.get(n);},down:function(_58,_59){var n=Ext.DomQuery.selectNode("#"+Ext.id(this.dom)+" > "+_58);return _59?n:Ext.get(n);},initDD:function(_5b,_5c,_5d){var dd=new Ext.dd.DD(Ext.id(this.dom),_5b,_5c);return Ext.apply(dd,_5d);},initDDProxy:function(_5f,_60,_61){var dd=new Ext.dd.DDProxy(Ext.id(this.dom),_5f,_60);return Ext.apply(dd,_61);},initDDTarget:function(_63,_64,_65){var dd=new Ext.dd.DDTarget(Ext.id(this.dom),_63,_64);return Ext.apply(dd,_65);},setVisible:function(_67,_68){if(!_68||!A){if(this.visibilityMode==El.DISPLAY){this.setDisplayed(_67);}else{this.fixDisplay();this.dom.style.visibility=_67?"visible":"hidden";}}else{var dom=this.dom;var _6a=this.visibilityMode;if(_67){this.setOpacity(0.01);this.setVisible(true);}this.anim({opacity:{to:(_67?1:0)}},this.preanim(arguments,1),null,0.35,"easeIn",function(){if(!_67){if(_6a==El.DISPLAY){dom.style.display="none";}else{dom.style.visibility="hidden";}Ext.get(dom).setOpacity(1);}});}return this;},isDisplayed:function(){return this.getStyle("display")!="none";},toggle:function(_6b){this.setVisible(!this.isVisible(),this.preanim(arguments,0));return this;},setDisplayed:function(_6c){if(typeof _6c=="boolean"){_6c=_6c?this.originalDisplay:"none";}this.setStyle("display",_6c);return this;},focus:function(){try{this.dom.focus();}catch(e){}return this;},blur:function(){try{this.dom.blur();}catch(e){}return this;},addClass:function(_6d){if(_6d instanceof Array){for(var i=0,len=_6d.length;idw){x=_fe?r.left-w:dw-w;}if(x<_100){x=_fe?r.right:_100;}if((y+h)>dh){y=_fd?r.top-h:dh-h;}if(y<_101){y=_fd?r.bottom:_101;}}return [x,y];},getConstrainToXY:function(){var os={top:0,left:0,bottom:0,right:0};return function(el,_104,_105){el=Ext.get(el);_105=_105?Ext.applyIf(_105,os):os;var vw,vh,vx=0,vy=0;if(el.dom==document.body||el.dom==document){vw=Ext.lib.Dom.getViewWidth();vh=Ext.lib.Dom.getViewHeight();}else{vw=el.dom.clientWidth;vh=el.dom.clientHeight;if(!_104){var vxy=el.getXY();vx=vxy[0];vy=vxy[1];}}var s=el.getScroll();vx+=_105.left+s.left;vy+=_105.top+s.top;vw-=_105.right;vh-=_105.bottom;var vr=vx+vw;var vb=vy+vh;var xy=!_104?this.getXY():[this.getLeft(true),this.getTop(true)];var x=xy[0],y=xy[1];var w=this.dom.offsetWidth,h=this.dom.offsetHeight;var _113=false;if((x+w)>vr){x=vr-w;_113=true;}if((y+h)>vb){y=vb-h;_113=true;}if(x";E.onAvailable(id,function(){var hd=document.getElementsByTagName("head")[0];var re=/(?:]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;var _134=/\ssrc=([\'\"])(.*?)\1/i;var _135=/\stype=([\'\"])(.*?)\1/i;var _136;while(_136=re.exec(html)){var _137=_136[1];var _138=_137?_137.match(_134):false;if(_138&&_138[2]){var s=document.createElement("script");s.src=_138[2];var _13a=_137.match(_135);if(_13a&&_13a[2]){s.type=_13a[2];}hd.appendChild(s);}else{if(_136[2]&&_136[2].length>0){eval(_136[2]);}}}var el=document.getElementById(id);if(el){el.parentNode.removeChild(el);}if(typeof _12f=="function"){_12f();}});dom.innerHTML=html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/ig,"");return this;},load:function(){var um=this.getUpdateManager();um.update.apply(um,arguments);return this;},getUpdateManager:function(){if(!this.updateManager){this.updateManager=new 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;");this.addClass("x-unselectable");return this;},getCenterXY:function(){return this.getAlignToXY(document,"c-c");},center:function(_13d){this.alignTo(_13d||document,"c-c");return this;},isBorderBox:function(){return _13e[this.dom.tagName.toLowerCase()]||Ext.isBorderBox;},getBox:function(_13f,_140){var xy;if(!_140){xy=this.getXY();}else{var left=parseInt(this.getStyle("left"),10)||0;var top=parseInt(this.getStyle("top"),10)||0;xy=[left,top];}var el=this.dom,w=el.offsetWidth,h=el.offsetHeight,bx;if(!_13f){bx={x:xy[0],y:xy[1],0:xy[0],1: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");bx={x:xy[0]+l,y:xy[1]+t,0:xy[0]+l,1:xy[1]+t,width:w-(l+r),height:h-(t+b)};}bx.right=bx.x+bx.width;bx.bottom=bx.y+bx.height;return bx;},getFrameWidth:function(_14c){return this.getPadding(_14c)+this.getBorderWidth(_14c);},setBox:function(box,_14e,_14f){var w=box.width,h=box.height;if((_14e&&!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,this.preanim(arguments,2));return this;},repaint:function(){var dom=this.dom;this.addClass("x-repaint");setTimeout(function(){Ext.get(dom).removeClass("x-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,El.margins);}},addStyles:function(_154,_155){var val=0;for(var i=0,len=_154.length;idom.clientHeight||dom.scrollWidth>dom.clientWidth;},scrollTo:function(side,_197,_198){var prop=side.toLowerCase()=="left"?"scrollLeft":"scrollTop";if(!_198||!A){this.dom[prop]=_197;}else{var to=prop=="scrollLeft"?[_197,this.dom.scrollTop]:[this.dom.scrollLeft,_197];this.anim({scroll:{"to":to}},this.preanim(arguments,2),"scroll");}return this;},scroll:function(_19b,_19c,_19d){if(!this.isScrollable()){return;}var el=this.dom;var l=el.scrollLeft,t=el.scrollTop;var w=el.scrollWidth,h=el.scrollHeight;var cw=el.clientWidth,ch=el.clientHeight;_19b=_19b.toLowerCase();var _1a5=false;var a=this.preanim(arguments,2);switch(_19b){case "l":case "left":if(w-l>cw){var v=Math.min(l+_19c,w-cw);this.scrollTo("left",v,a);_1a5=true;}break;case "r":case "right":if(l>0){var v=Math.max(l-_19c,0);this.scrollTo("left",v,a);_1a5=true;}break;case "t":case "top":case "up":if(t>0){var v=Math.max(t-_19c,0);this.scrollTo("top",v,a);_1a5=true;}break;case "b":case "bottom":case "down":if(h-t>ch){var v=Math.min(t+_19c,h-ch);this.scrollTo("top",v,a);_1a5=true;}break;}return _1a5;},translatePoints:function(x,y){if(typeof x=="object"||x instanceof Array){y=x[1];x=x[0];}var p=this.getStyle("position");var o=this.getXY();var l=parseInt(this.getStyle("left"),10);var t=parseInt(this.getStyle("top"),10);if(isNaN(l)){l=(p=="relative")?0:this.dom.offsetLeft;}if(isNaN(t)){t=(p=="relative")?0:this.dom.offsetTop;}return {left:(x-o[0]+l),top:(y-o[1]+t)};},getScroll:function(){var d=this.dom,doc=document;if(d==doc||d==doc.body){var l=window.pageXOffset||doc.documentElement.scrollLeft||doc.body.scrollLeft||0;var t=window.pageYOffset||doc.documentElement.scrollTop||doc.body.scrollTop||0;return {left:l,top:t};}else{return {left:d.scrollLeft,top:d.scrollTop};}},getColor:function(attr,_1b3,_1b4){var v=this.getStyle(attr);if(!v||v=="transparent"||v=="inherit"){return _1b3;}var _1b6=typeof _1b4=="undefined"?"#":_1b4;if(v.substr(0,4)=="rgb("){var rvs=v.slice(4,v.length-1).split(",");for(var i=0;i<3;i++){var h=parseInt(rvs[i]).toString(16);if(h<16){h="0"+h;}_1b6+=h;}}else{if(v.substr(0,1)=="#"){if(v.length==4){for(var i=1;i<4;i++){var c=v.charAt(i);_1b6+=c+c;}}else{if(v.length==7){_1b6+=v.substr(1);}}}}return (_1b6.length>5?_1b6.toLowerCase():_1b3);},boxWrap:function(cls){cls=cls||"x-box";var el=Ext.get(this.insertHtml("beforeBegin",String.format("
      "+El.boxMarkup+"
      ",cls)));el.child("."+cls+"-mc").dom.appendChild(this.dom);return el;},getAttributeNS:Ext.isIE?function(ns,name){var d=this.dom;var type=typeof d[ns+":"+name];if(type!="undefined"&&type!="unknown"){return d[ns+":"+name];}return d[name];}:function(ns,name){var d=this.dom;return d.getAttributeNS(ns,name)||d.getAttribute(ns+":"+name)||d.getAttribute(name)||d[name];}};var ep=El.prototype;ep.on=ep.addListener;ep.mon=ep.addListener;ep.un=ep.removeListener;ep.autoBoxAdjust=true;ep.autoDisplayMode=true;El.unitPattern=/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i;El.addUnits=function(v,_1c6){if(v===""||v=="auto"){return v;}if(v===undefined){return "";}if(typeof v=="number"||!El.unitPattern.test(v)){return v+(_1c6||"px");}return v;};El.boxMarkup="
      ";El.VISIBILITY=1;El.DISPLAY=2;El.borders={l:"border-left-width",r:"border-right-width",t:"border-top-width",b:"border-bottom-width"};El.paddings={l:"padding-left",r:"padding-right",t:"padding-top",b:"padding-bottom"};El.margins={l:"margin-left",r:"margin-right",t:"margin-top",b:"margin-bottom"};El.cache={};var _1c7;El.get=function(el){var ex,elm,id;if(!el){return null;}if(typeof el=="string"){if(!(elm=document.getElementById(el))){return null;}if(ex=El.cache[el]){ex.dom=elm;}else{ex=El.cache[el]=new El(elm);}return ex;}else{if(el.tagName){if(!(id=el.id)){id=Ext.id(el);}if(ex=El.cache[id]){ex.dom=el;}else{ex=El.cache[id]=new El(el);}return ex;}else{if(el instanceof El){if(el!=_1c7){el.dom=document.getElementById(el.id)||el.dom;El.cache[el.id]=el;}return el;}else{if(el.isComposite){return el;}else{if(el instanceof Array){return El.select(el);}else{if(el==document){if(!_1c7){var f=function(){};f.prototype=El.prototype;_1c7=new f();_1c7.dom=document;}return _1c7;}}}}}}return null;};El.uncache=function(el){for(var i=0,a=arguments,len=a.length;i0){_2f.defer((duration/2)*1000,this);}else{el.afterFx(o);}};_2f.call(this);});return this;},pause:function(_32){var el=this.getFxEl();var o={};el.queueFx(o,function(){setTimeout(function(){el.afterFx(o);},_32*1000);});return this;},fadeIn:function(o){var el=this.getFxEl();o=o||{};el.queueFx(o,function(){this.setOpacity(0);this.fixDisplay();this.dom.style.visibility="visible";var to=o.endOpacity||1;arguments.callee.anim=this.fxanim({opacity:{to:to}},o,null,0.5,"easeOut",function(){if(to==1){this.clearOpacity();}el.afterFx(o);});});return this;},fadeOut:function(o){var el=this.getFxEl();o=o||{};el.queueFx(o,function(){arguments.callee.anim=this.fxanim({opacity:{to:o.endOpacity||0}},o,null,0.5,"easeOut",function(){if(this.visibilityMode==Ext.Element.DISPLAY||o.useDisplay){this.dom.style.display="none";}else{this.dom.style.visibility="hidden";}this.clearOpacity();el.afterFx(o);});});return this;},scale:function(w,h,o){this.shift(Ext.apply({},o,{width:w,height:h}));return this;},shift:function(o){var el=this.getFxEl();o=o||{};el.queueFx(o,function(){var a={},w=o.width,h=o.height,x=o.x,y=o.y,op=o.opacity;if(w!==undefined){a.width={to:this.adjustWidth(w)};}if(h!==undefined){a.height={to:this.adjustHeight(h)};}if(x!==undefined||y!==undefined){a.points={to:[x!==undefined?x:this.getX(),y!==undefined?y:this.getY()]};}if(op!==undefined){a.opacity={to:op};}if(o.xy!==undefined){a.points={to:o.xy};}arguments.callee.anim=this.fxanim(a,o,"motion",0.35,"easeOut",function(){el.afterFx(o);});});return this;},ghost:function(_45,o){var el=this.getFxEl();o=o||{};el.queueFx(o,function(){_45=_45||"b";var r=this.getFxRestore();var w=this.getWidth(),h=this.getHeight();var st=this.dom.style;var _4c=function(){if(o.useDisplay){el.setDisplayed(false);}else{el.hide();}el.clearOpacity();el.setPositioning(r.pos);st.width=r.width;st.height=r.height;el.afterFx(o);};var a={opacity:{to:0},points:{}},pt=a.points;switch(_45.toLowerCase()){case "t":pt.by=[0,-h];break;case "l":pt.by=[-w,0];break;case "r":pt.by=[w,0];break;case "b":pt.by=[0,h];break;case "tl":pt.by=[-w,-h];break;case "bl":pt.by=[-w,h];break;case "br":pt.by=[w,h];break;case "tr":pt.by=[w,-h];break;}arguments.callee.anim=this.fxanim(a,o,"motion",0.5,"easeOut",_4c);});return this;},syncFx:function(){this.fxDefaults=Ext.apply(this.fxDefaults||{},{block:false,concurrent:true,stopFx:false});return this;},sequenceFx:function(){this.fxDefaults=Ext.apply(this.fxDefaults||{},{block:false,concurrent:false,stopFx:false});return this;},nextFx:function(){var ef=this.fxQueue[0];if(ef){ef.call(this);}},hasActiveFx:function(){return this.fxQueue&&this.fxQueue[0];},stopFx:function(){if(this.hasActiveFx()){var cur=this.fxQueue[0];if(cur&&cur.anim&&cur.anim.isAnimated()){this.fxQueue=[cur];cur.anim.stop(true);}}return this;},beforeFx:function(o){if(this.hasActiveFx()&&!o.concurrent){if(o.stopFx){this.stopFx();return true;}return false;}return true;},hasFxBlock:function(){var q=this.fxQueue;return q&&q[0]&&q[0].block;},queueFx:function(o,fn){if(!this.fxQueue){this.fxQueue=[];}if(!this.hasFxBlock()){Ext.applyIf(o,this.fxDefaults);if(!o.concurrent){var run=this.beforeFx(o);fn.block=o.block;this.fxQueue.push(fn);if(run){this.nextFx();}}else{fn.call(this);}}return this;},fxWrap:function(pos,o,vis){var _59;if(!o.wrap||!(_59=Ext.get(o.wrap))){var _5a;if(o.fixPosition){_5a=this.getXY();}var div=document.createElement("div");div.style.visibility=vis;_59=Ext.get(this.dom.parentNode.insertBefore(div,this.dom));_59.setPositioning(pos);if(_59.getStyle("position")=="static"){_59.position("relative");}this.clearPositioning("auto");_59.clip();_59.dom.appendChild(this.dom);if(_5a){_59.setXY(_5a);}}return _59;},fxUnwrap:function(_5c,pos,o){this.clearPositioning();this.setPositioning(pos);if(!o.wrap){_5c.dom.parentNode.insertBefore(this.dom,_5c.dom);_5c.remove();}},getFxRestore:function(){var st=this.dom.style;return {pos:this.getPositioning(),width:st.width,height:st.height};},afterFx:function(o){if(o.afterStyle){this.applyStyles(o.afterStyle);}if(o.afterCls){this.addClass(o.afterCls);}if(o.remove===true){this.remove();}Ext.callback(o.callback,o.scope,[this]);if(!o.concurrent){this.fxQueue.shift();this.nextFx();}},getFxEl:function(){return Ext.get(this.dom);},fxanim:function(_61,opt,_63,_64,_65,cb){_63=_63||"run";opt=opt||{};var _67=Ext.lib.Anim[_63](this.dom,_61,(opt.duration||_64)||0.35,(opt.easing||_65)||"easeOut",function(){Ext.callback(cb,this);},this);opt.anim=_67;return _67;}};Ext.Fx.resize=Ext.Fx.scale;Ext.apply(Ext.Element.prototype,Ext.Fx); + +Ext.CompositeElement=function(_1){this.elements=[];this.addElements(_1);};Ext.CompositeElement.prototype={isComposite:true,addElements:function(_2){if(!_2){return this;}if(typeof _2=="string"){_2=Ext.Element.selectorFunction(_2);}var _3=this.elements;var _4=_3.length-1;for(var i=0,_6=_2.length;i<_6;i++){_3[++_4]=Ext.get(_2[i],true);}return this;},invoke:function(fn,_8){var _9=this.elements;for(var i=0,_b=_9.length;i<_b;i++){Ext.Element.prototype[fn].apply(_9[i],_8);}return this;},add:function(_c){if(typeof _c=="string"){this.addElements(Ext.Element.selectorFunction(_c));}else{if(_c.length!==undefined){this.addElements(_c);}else{this.addElements([_c]);}}return this;},each:function(fn,_e){var _f=this.elements;for(var i=0,len=_f.length;i"+_9.text+"";}if(typeof _9.scripts!="undefined"){this.loadScripts=_9.scripts;}if(typeof _9.timeout!="undefined"){this.timeout=_9.timeout;}}this.showLoading();if(!_7){this.defaultUrl=_4;}if(typeof _4=="function"){_4=_4.call(this);}if(typeof _5=="function"){_5=_5();}if(_5&&typeof _5!="string"){var _a=[];for(var _b in _5){if(typeof _5[_b]!="function"){_a.push(encodeURIComponent(_b),"=",encodeURIComponent(_5[_b]),"&");}}delete _a[_a.length-1];_5=_a.join("");}var cb={success:this.successDelegate,failure:this.failureDelegate,timeout:(this.timeout*1000),argument:{"url":_4,"form":null,"callback":_6,"params":_5}};_8=_8||(_5?"POST":"GET");if(_8=="GET"){_4=this.prepareUrl(_4);}this.transaction=Ext.lib.Ajax.request(_8,_4,cb,_5);}},formUpdate:function(_d,_e,_f,_10){if(this.fireEvent("beforeupdate",this.el,_d,_e)!==false){formEl=Ext.getDom(_d);if(typeof _e=="function"){_e=_e.call(this);}if(typeof params=="function"){params=params();}_e=_e||formEl.action;var cb={success:this.successDelegate,failure:this.failureDelegate,timeout:(this.timeout*1000),argument:{"url":_e,"form":formEl,"callback":_10,"reset":_f}};var _12=false;var _13=formEl.getAttribute("enctype");if(_13&&_13.toLowerCase()=="multipart/form-data"){_12=true;cb.upload=this.successDelegate;}this.transaction=Ext.lib.Ajax.formRequest(formEl,_e,cb,null,_12,this.sslBlankUrl);this.showLoading.defer(1,this);}},refresh:function(_14){if(this.defaultUrl==null){return;}this.update(this.defaultUrl,null,_14,true);},startAutoRefresh:function(_15,url,_17,_18,_19){if(_19){this.update(url||this.defaultUrl,_17,_18,true);}if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId);}this.autoRefreshProcId=setInterval(this.update.createDelegate(this,[url||this.defaultUrl,_17,_18,true]),_15*1000);},stopAutoRefresh:function(){if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId);delete this.autoRefreshProcId;}},isAutoRefreshing:function(){return this.autoRefreshProcId?true:false;},showLoading:function(){if(this.showLoadIndicator){this.el.update(this.indicatorText);}},prepareUrl:function(url){if(this.disableCaching){var _1b="_dc="+(new Date().getTime());if(url.indexOf("?")!==-1){url+="&"+_1b;}else{url+="?"+_1b;}}return url;},processSuccess:function(_1c){this.transaction=null;if(_1c.argument.form&&_1c.argument.reset){try{_1c.argument.form.reset();}catch(e){}}if(this.loadScripts){this.renderer.render(this.el,_1c,this,this.updateComplete.createDelegate(this,[_1c]));}else{this.renderer.render(this.el,_1c,this);this.updateComplete(_1c);}},updateComplete:function(_1d){this.fireEvent("update",this.el,_1d);if(typeof _1d.argument.callback=="function"){_1d.argument.callback(this.el,true,_1d);}},processFailure:function(_1e){this.transaction=null;this.fireEvent("failure",this.el,_1e);if(typeof _1e.argument.callback=="function"){_1e.argument.callback(this.el,false,_1e);}},setRenderer:function(_1f){this.renderer=_1f;},getRenderer:function(){return this.renderer;},setDefaultUrl:function(_20){this.defaultUrl=_20;},abort:function(){if(this.transaction){Ext.lib.Ajax.abort(this.transaction);}},isUpdating:function(){if(this.transaction){return Ext.lib.Ajax.isCallInProgress(this.transaction);}return false;}});Ext.UpdateManager.defaults={timeout:30,loadScripts:false,sslBlankUrl:(Ext.SSL_SECURE_URL||"javascript:false"),disableCaching:false,showLoadIndicator:true,indicatorText:"
      Loading...
      "};Ext.UpdateManager.updateElement=function(el,url,_23,_24){var um=Ext.get(el,true).getUpdateManager();Ext.apply(um,_24);um.update(url,_23,_24?_24.callback:null);};Ext.UpdateManager.update=Ext.UpdateManager.updateElement;Ext.UpdateManager.BasicRenderer=function(){};Ext.UpdateManager.BasicRenderer.prototype={render:function(el,_27,_28,_29){el.update(_27.responseText,_28.loadScripts,_29);}}; + +Date.parseFunctions={count:0};Date.parseRegexes=[];Date.formatFunctions={count:0};Date.prototype.dateFormat=function(_1){if(Date.formatFunctions[_1]==null){Date.createNewFormat(_1);}var _2=Date.formatFunctions[_1];return this[_2]();};Date.prototype.format=Date.prototype.dateFormat;Date.createNewFormat=function(_3){var _4="format"+Date.formatFunctions.count++;Date.formatFunctions[_3]=_4;var _5="Date.prototype."+_4+" = function(){return ";var _6=false;var ch="";for(var i=0;i<_3.length;++i){ch=_3.charAt(i);if(!_6&&ch=="\\"){_6=true;}else{if(_6){_6=false;_5+="'"+String.escape(ch)+"' + ";}else{_5+=Date.getFormatCode(ch);}}}eval(_5.substring(0,_5.length-3)+";}");};Date.getFormatCode=function(_9){switch(_9){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(_9)+"' + ";}};Date.parseDate=function(_a,_b){if(Date.parseFunctions[_b]==null){Date.createParser(_b);}var _c=Date.parseFunctions[_b];return Date[_c](_a);};Date.createParser=function(_d){var _e="parse"+Date.parseFunctions.count++;var _f=Date.parseRegexes.length;var _10=1;Date.parseFunctions[_d]=_e;var _11="Date."+_e+" = 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["+_f+"]);\n"+"if (results && results.length > 0) {";var _12="";var _13=false;var ch="";for(var i=0;i<_d.length;++i){ch=_d.charAt(i);if(!_13&&ch=="\\"){_13=true;}else{if(_13){_13=false;_12+=String.escape(ch);}else{var obj=Date.formatCodeToRegex(ch,_10);_10+=obj.g;_12+=obj.s;if(obj.g&&obj.c){_11+=obj.c;}}}}_11+="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[_f]=new RegExp("^"+_12+"$");eval(_11);};Date.formatCodeToRegex=function(_17,_18){switch(_17){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["+_18+"], 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["+_18+"].substring(0, 3)], 10);\n",s:"("+Date.monthNames.join("|")+")"};case "M":return {g:1,c:"m = parseInt(Date.monthNumbers[results["+_18+"]], 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["+_18+"], 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["+_18+"], 10);\n",s:"(\\d{4})"};case "y":return {g:1,c:"var ty = parseInt(results["+_18+"], 10);\n"+"y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"};case "a":return {g:1,c:"if (results["+_18+"] == '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["+_18+"] == '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["+_18+"], 10);\n",s:"(\\d{1,2})"};case "i":return {g:1,c:"i = parseInt(results["+_18+"], 10);\n",s:"(\\d{2})"};case "s":return {g:1,c:"s = parseInt(results["+_18+"], 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(_17)};}};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;i28){day=Math.min(day,this.getFirstDateOfMonth().add("mo",_27).getLastDateOfMonth().getDate());}d.setDate(day);d.setMonth(this.getMonth()+_27);break;case Date.YEAR:d.setFullYear(this.getFullYear()+_27);break;}return d;}; + +Ext.util.DelayedTask=function(fn,_2,_3){var id=null,d,t;var _7=function(){var _8=new Date().getTime();if(_8-t>=d){clearInterval(id);id=null;fn.apply(_2,_3||[]);}};this.delay=function(_9,_a,_b,_c){if(id&&_9!=d){this.cancel();}d=_9;t=new Date().getTime();fn=_a||fn;_2=_b||_2;_3=_c||_3;if(!id){id=setInterval(_7,d);}};this.cancel=function(){if(id){clearInterval(id);id=null;}};}; + +Ext.util.TaskRunner=function(_1){_1=_1||10;var _2=[],_3=[];var id=0;var _5=false;var _6=function(){_5=false;clearInterval(id);id=0;};var _7=function(){if(!_5){_5=true;id=setInterval(_8,_1);}};var _9=function(_a){_3.push(_a);if(_a.onStop){_a.onStop();}};var _8=function(){if(_3.length>0){for(var i=0,_c=_3.length;i<_c;i++){_2.remove(_3[i]);}_3=[];if(_2.length<1){_6();return;}}var _d=new Date().getTime();for(var i=0,_c=_2.length;i<_c;++i){var t=_2[i];var _f=_d-t.taskRunTime;if(t.interval<=_f){var rt=t.run.apply(t.scope||t,t.args||[++t.taskRunCount]);t.taskRunTime=_d;if(rt===false||t.taskRunCount===t.repeat){_9(t);return;}}if(t.duration&&t.duration<=(_d-t.taskStartTime)){_9(t);}}};this.start=function(_11){_2.push(_11);_11.taskStartTime=new Date().getTime();_11.taskRunTime=0;_11.taskRunCount=0;_7();return _11;};this.stop=function(_12){_9(_12);return _12;};this.stopAll=function(){_6();for(var i=0,len=_2.length;i1||_b instanceof Array){var _c=arguments.length>1?arguments:_b;for(var i=0,_e=_c.length;i<_e;i++){this.add(_c[i]);}}else{for(var _f in _b){if(this.allowFunctions||typeof _b[_f]!="function"){this.add(_b[_f],_f);}}}},each:function(fn,_11){var _12=[].concat(this.items);for(var i=0,len=_12.length;i=this.length){return this.add(key,o);}this.length++;this.items.splice(_1d,0,o);if(typeof key!="undefined"&&key!=null){this.map[key]=o;}this.keys.splice(_1d,0,key);this.fireEvent("add",_1d,o,key);return o;},remove:function(o){return this.removeAt(this.indexOf(o));},removeAt:function(_21){if(_21=0){this.length--;var o=this.items[_21];this.items.splice(_21,1);var key=this.keys[_21];if(typeof key!="undefined"){delete this.map[key];}this.keys.splice(_21,1);this.fireEvent("remove",o,key);}},removeKey:function(key){return this.removeAt(this.indexOfKey(key));},getCount:function(){return this.length;},indexOf:function(o){if(!this.items.indexOf){for(var i=0,len=this.items.length;i=end;i--){r[r.length]=_47[i];}}return r;},filter:function(_4a,_4b){if(!_4b.exec){_4b=String(_4b);if(_4b.length==0){return this.clone();}_4b=new RegExp("^"+Ext.escapeRe(_4b),"i");}return this.filterBy(function(o){return o&&_4b.test(o[_4a]);});},filterBy:function(fn,_4e){var r=new Ext.util.MixedCollection();r.getKey=this.getKey;var k=this.keys,it=this.items;for(var i=0,len=it.length;i_3){return _2.substr(0,_3-3)+"...";}return _2;},undef:function(_4){return typeof _4!="undefined"?_4:"";},htmlEncode:function(_5){return !_5?_5:String(_5).replace(/&/g,"&").replace(/>/g,">").replace(/2){var _f=Array.prototype.slice.call(arguments,2);_f.unshift(_d);return eval(fn).apply(window,_f);}else{return eval(fn).call(window,_d);}},usMoney:function(v){v=(Math.round((v-0)*100))/100;v=(v==Math.floor(v))?v+".00":((v*10==Math.floor(v*10))?v+"0":v);return "$"+v;},date:function(v,_12){if(!v){return "";}if(!(v instanceof Date)){v=new Date(Date.parse(v));}return v.dateFormat(_12||"m/d/Y");},dateRenderer:function(_13){return function(v){return Ext.util.Format.date(v,_13);};},stripTagsRE:/<\/?[^>]+>/gi,stripTags:function(v){return !v?v:String(v).replace(this.stripTagsRE,"");}};}(); + +Ext.util.CSS=function(){var _1=null;var _2=document;var _3=/(-[a-z])/gi;var _4=function(m,a){return a.charAt(1).toUpperCase();};return {createStyleSheet:function(_7){var ss;if(Ext.isIE){ss=_2.createStyleSheet();ss.cssText=_7;}else{var _9=_2.getElementsByTagName("head")[0];var _a=_2.createElement("style");_a.setAttribute("type","text/css");try{_a.appendChild(_2.createTextNode(_7));}catch(e){_a.cssText=_7;}_9.appendChild(_a);ss=_a.styleSheet?_a.styleSheet:(_a.sheet||_2.styleSheets[_2.styleSheets.length-1]);}this.cacheStyleSheet(ss);return ss;},removeStyleSheet:function(id){var _c=_2.getElementById(id);if(_c){_c.parentNode.removeChild(_c);}},swapStyleSheet:function(id,_e){this.removeStyleSheet(id);var ss=_2.createElement("link");ss.setAttribute("rel","stylesheet");ss.setAttribute("type","text/css");ss.setAttribute("id",id);ss.setAttribute("href",_e);_2.getElementsByTagName("head")[0].appendChild(ss);},refreshCache:function(){return this.getRules(true);},cacheStyleSheet:function(ss){if(!_1){_1={};}try{var _11=ss.cssRules||ss.rules;for(var j=_11.length-1;j>=0;--j){_1[_11[j].selectorText]=_11[j];}}catch(e){}},getRules:function(_13){if(_1==null||_13){_1={};var ds=_2.styleSheets;for(var i=0,len=ds.length;i=37&&k<=40){e.stopEvent();}},relay:function(e){var k=e.getKey();var h=this.keyToHandler[k];if(h&&this[h]){if(this.doRelay(e,this[h],h)!==true){e[this.defaultEventAction]();}}},doRelay:function(e,h,_b){return h.call(this.scope||this,e);},enter:false,left:false,right:false,up:false,down:false,tab:false,esc:false,pageUp:false,pageDown:false,del:false,home:false,end:false,keyToHandler:{37:"left",39:"right",38:"up",40:"down",33:"pageUp",34:"pageDown",46:"del",36:"home",35:"end",13:"enter",27:"esc",9:"tab"},enable:function(){if(this.disabled){if(Ext.isIE){this.el.on("keydown",this.relay,this);}else{this.el.on("keydown",this.prepareEvent,this);this.el.on("keypress",this.relay,this);}this.disabled=false;}},disable:function(){if(!this.disabled){if(Ext.isIE){this.el.un("keydown",this.relay);}else{this.el.un("keydown",this.prepareEvent);this.el.un("keypress",this.relay);}this.disabled=true;}}}; + +Ext.KeyMap=function(el,_2,_3){this.el=Ext.get(el);this.eventName=_3||"keydown";this.bindings=[];if(_2 instanceof Array){for(var i=0,_5=_2.length;i<_5;i++){this.addBinding(_2[i]);}}else{this.addBinding(_2);}this.keyDownDelegate=Ext.EventManager.wrap(this.handleKeyDown,this,true);this.enable();};Ext.KeyMap.prototype={stopEvent:false,addBinding:function(_6){var _7=_6.key,_8=_6.shift,_9=_6.ctrl,_a=_6.alt,fn=_6.fn,_c=_6.scope;if(typeof _7=="string"){var ks=[];var _e=_7.toUpperCase();for(var j=0,len=_e.length;j=this.minX;i=i-_53){if(!_54[i]){this.xTicks[this.xTicks.length]=i;_54[i]=true;}}for(i=this.initPageX;i<=this.maxX;i=i+_53){if(!_54[i]){this.xTicks[this.xTicks.length]=i;_54[i]=true;}}this.xTicks.sort(this.DDM.numericSort);},setYTicks:function(_56,_57){this.yTicks=[];this.yTickSize=_57;var _58={};for(var i=this.initPageY;i>=this.minY;i=i-_57){if(!_58[i]){this.yTicks[this.yTicks.length]=i;_58[i]=true;}}for(i=this.initPageY;i<=this.maxY;i=i+_57){if(!_58[i]){this.yTicks[this.yTicks.length]=i;_58[i]=true;}}this.yTicks.sort(this.DDM.numericSort);},setXConstraint:function(_5a,_5b,_5c){this.leftConstraint=_5a;this.rightConstraint=_5b;this.minX=this.initPageX-_5a;this.maxX=this.initPageX+_5b;if(_5c){this.setXTicks(this.initPageX,_5c);}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,_5e,_5f){this.topConstraint=iUp;this.bottomConstraint=_5e;this.minY=this.initPageY-iUp;this.maxY=this.initPageY+_5e;if(_5f){this.setYTicks(this.initPageY,_5f);}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,_63){if(!_63){return val;}else{if(_63[0]>=val){return _63[0];}else{for(var i=0,len=_63.length;i=val){var _67=val-_63[i];var _68=_63[_66]-val;return (_68>_67)?_63[i]:_63[_66];}}return _63[_63.length-1];}}},toString:function(){return ("DragDrop "+this.id);}};})();if(!Ext.dd.DragDropMgr){Ext.dd.DragDropMgr=function(){var _69=Ext.EventManager;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(_6a,_6b){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[_6a].apply(oDD,_6b);}}},_onLoad:function(){this.init();_69.on(document,"mouseup",this.handleMouseUp,this,true);_69.on(document,"mousemove",this.handleMouseMove,this,true);_69.on(window,"unload",this._onUnload,this,true);_69.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:350,dragThreshMet:false,clickTimeout:null,startX:0,startY:0,regDragDrop:function(oDD,_71){if(!this.initialized){this.init();}if(!this.ids[_71]){this.ids[_71]={};}this.ids[_71][oDD.id]=oDD;},removeDDFromGroup:function(oDD,_73){if(!this.ids[_73]){this.ids[_73]={};}var obj=this.ids[_73];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(_77,_78){if(!this.handleIds[_77]){this.handleIds[_77]={};}this.handleIds[_77][_78]=_78;},isDragDrop:function(id){return (this.getDDById(id))?true:false;},getRelated:function(_7a,_7b){var _7c=[];for(var i in _7a.groups){for(j in this.ids[i]){var dd=this.ids[i][j];if(!this.isTypeOfDD(dd)){continue;}if(!_7b||dd.isTarget){_7c[_7c.length]=dd;}}}return _7c;},isLegalTarget:function(oDD,_80){var _81=this.getRelated(oDD,true);for(var i=0,len=_81.length;ithis.clickPixelThresh||_94>this.clickPixelThresh){this.startDrag(this.startX,this.startY);}}if(this.dragThreshMet){this.dragCurrent.b4Drag(e);this.dragCurrent.onDrag(e);if(!this.dragCurrent.moveOnly){this.fireEvents(e,false);}}this.stopEvent(e);return true;},fireEvents:function(e,_96){var dc=this.dragCurrent;if(!dc||dc.isLocked()){return;}var x=Ext.lib.Event.getPageX(e);var y=Ext.lib.Event.getPageY(e);var pt=new Ext.lib.Point(x,y);var _9b=[];var _9c=[];var _9d=[];var _9e=[];var _9f=[];for(var i in this.dragOvers){var ddo=this.dragOvers[i];if(!this.isTypeOfDD(ddo)){continue;}if(!this.isOverTarget(pt,ddo,this.mode)){_9c.push(ddo);}_9b[i]=true;delete this.dragOvers[i];}for(var _a2 in dc.groups){if("string"!=typeof _a2){continue;}for(i in this.ids[_a2]){var oDD=this.ids[_a2][i];if(!this.isTypeOfDD(oDD)){continue;}if(oDD.isTarget&&!oDD.isLocked()&&oDD!=dc){if(this.isOverTarget(pt,oDD,this.mode)){if(_96){_9e.push(oDD);}else{if(!_9b[oDD.id]){_9f.push(oDD);}else{_9d.push(oDD);}this.dragOvers[oDD.id]=oDD;}}}}}if(this.mode){if(_9c.length){dc.b4DragOut(e,_9c);dc.onDragOut(e,_9c);}if(_9f.length){dc.onDragEnter(e,_9f);}if(_9d.length){dc.b4DragOver(e,_9d);dc.onDragOver(e,_9d);}if(_9e.length){dc.b4DragDrop(e,_9e);dc.onDragDrop(e,_9e);}}else{var len=0;for(i=0,len=_9c.length;i2000){}else{setTimeout(DDM._addListeners,10);if(document&&document.body){DDM._timeoutCount+=1;}}}},handleWasClicked:function(_df,id){if(this.isHandle(id,_df.id)){return true;}else{var p=_df.parentNode;while(p){if(this.isHandle(id,p.id)){return true;}else{p=p.parentNode;}}}return false;}};}();Ext.dd.DDM=Ext.dd.DragDropMgr;Ext.dd.DDM._addListeners();}Ext.dd.DD=function(id,_e3,_e4){if(id){this.init(id,_e3,_e4);}};Ext.extend(Ext.dd.DD,Ext.dd.DragDrop,{scroll:true,autoOffset:function(_e5,_e6){var x=_e5-this.startPageX;var y=_e6-this.startPageY;this.setDelta(x,y);},setDelta:function(_e9,_ea){this.deltaX=_e9;this.deltaY=_ea;},setDragElPos:function(_eb,_ec){var el=this.getDragEl();this.alignElWithMouse(el,_eb,_ec);},alignElWithMouse:function(el,_ef,_f0){var _f1=this.getTargetCoord(_ef,_f0);var fly=el.dom?el:Ext.fly(el);if(!this.deltaSetXY){var _f3=[_f1.x,_f1.y];fly.setXY(_f3);var _f4=fly.getLeft(true);var _f5=fly.getTop(true);this.deltaSetXY=[_f4-_f1.x,_f5-_f1.y];}else{fly.setLeftTop(_f1.x+this.deltaSetXY[0],_f1.y+this.deltaSetXY[1]);}this.cachePosition(_f1.x,_f1.y);this.autoScroll(_f1.x,_f1.y,el.offsetHeight,el.offsetWidth);return _f1;},cachePosition:function(_f6,_f7){if(_f6){this.lastPageX=_f6;this.lastPageY=_f7;}else{var _f8=Ext.lib.Dom.getXY(this.getEl());this.lastPageX=_f8[0];this.lastPageY=_f8[1];}},autoScroll:function(x,y,h,w){if(this.scroll){var _fd=Ext.lib.Dom.getViewWidth();var _fe=Ext.lib.Dom.getViewHeight();var st=this.DDM.getScrollTop();var sl=this.DDM.getScrollLeft();var bot=h+y;var _102=w+x;var _103=(_fd+st-y-this.deltaY);var _104=(_fe+sl-x-this.deltaX);var _105=40;var _106=(document.all)?80:30;if(bot>_fd&&_103<_105){window.scrollTo(sl,st+_106);}if(y0&&y-st<_105){window.scrollTo(sl,st-_106);}if(_102>_fe&&_104<_105){window.scrollTo(sl+_106,st);}if(x0&&x-sl<_105){window.scrollTo(sl-_106,st);}}},getTargetCoord:function(_107,_108){var x=_107-this.deltaX;var y=_108-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(){Ext.dd.DD.superclass.applyConfig.call(this);this.scroll=(this.config.scroll!==false);},b4MouseDown:function(e){this.autoOffset(Ext.lib.Event.getPageX(e),Ext.lib.Event.getPageY(e));},b4Drag:function(e){this.setDragElPos(Ext.lib.Event.getPageX(e),Ext.lib.Event.getPageY(e));},toString:function(){return ("DD "+this.id);}});Ext.dd.DDProxy=function(id,_10e,_10f){if(id){this.init(id,_10e,_10f);this.initFrame();}};Ext.dd.DDProxy.dragElId="ygddfdiv";Ext.extend(Ext.dd.DDProxy,Ext.dd.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(){Ext.dd.DDProxy.superclass.applyConfig.call(this);this.resizeFrame=(this.config.resizeFrame!==false);this.centerFrame=(this.config.centerFrame);this.setDragElId(this.config.dragElId||Ext.dd.DDProxy.dragElId);},showFrame:function(_114,_115){var el=this.getEl();var _117=this.getDragEl();var s=_117.style;this._resizeProxy();if(this.centerFrame){this.setDelta(Math.round(parseInt(s.width,10)/2),Math.round(parseInt(s.height,10)/2));}this.setDragElPos(_114,_115);Ext.fly(_117).show();},_resizeProxy:function(){if(this.resizeFrame){var el=this.getEl();Ext.fly(this.getDragEl()).setSize(el.offsetWidth,el.offsetHeight);}},b4MouseDown:function(e){var x=Ext.lib.Event.getPageX(e);var y=Ext.lib.Event.getPageY(e);this.autoOffset(x,y);this.setDragElPos(x,y);},b4StartDrag:function(x,y){this.showFrame(x,y);},b4EndDrag:function(e){Ext.fly(this.getDragEl()).hide();},endDrag:function(e){var lel=this.getEl();var del=this.getDragEl();del.style.visibility="";this.beforeMove();lel.style.visibility="hidden";Ext.dd.DDM.moveToEl(lel,del);del.style.visibility="hidden";lel.style.visibility="";this.afterDrag();},beforeMove:function(){},afterDrag:function(){},toString:function(){return ("DDProxy "+this.id);}});Ext.dd.DDTarget=function(id,_124,_125){if(id){this.initTarget(id,_124,_125);}};Ext.extend(Ext.dd.DDTarget,Ext.dd.DragDrop,{toString:function(){return ("DDTarget "+this.id);}}); + +Ext.dd.ScrollManager=function(){var _1=Ext.dd.DragDropMgr;var _2={};var _3=null;var _4={};var _5=function(e){_3=null;_7();};var _8=function(){if(_1.dragCurrent){_1.refreshCache(_1.dragCurrent.groups);}};var _9=function(){if(_1.dragCurrent){var _a=Ext.dd.ScrollManager;if(!_a.animate){if(_4.el.scroll(_4.dir,_a.increment)){_8();}}else{_4.el.scroll(_4.dir,_a.increment,true,_a.animDuration,_8);}}};var _7=function(){if(_4.id){clearInterval(_4.id);}_4.id=0;_4.el=null;_4.dir="";};var _b=function(el,_d){_7();_4.el=el;_4.dir=_d;_4.id=setInterval(_9,Ext.dd.ScrollManager.frequency);};var _e=function(e,_10){if(_10||!_1.dragCurrent){return;}var dds=Ext.dd.ScrollManager;if(!_3||_3!=_1.dragCurrent){_3=_1.dragCurrent;dds.refreshCache();}var xy=Ext.lib.Event.getXY(e);var pt=new Ext.lib.Point(xy[0],xy[1]);for(var id in _2){var el=_2[id],r=el._region;if(r.contains(pt)&&el.isScrollable()){if(r.bottom-pt.y<=dds.thresh){if(_4.el!=el){_b(el,"down");}return;}else{if(r.right-pt.x<=dds.thresh){if(_4.el!=el){_b(el,"left");}return;}else{if(pt.y-r.top<=dds.thresh){if(_4.el!=el){_b(el,"up");}return;}else{if(pt.x-r.left<=dds.thresh){if(_4.el!=el){_b(el,"right");}return;}}}}}}_7();};_1.fireEvents=_1.fireEvents.createSequence(_e,_1);_1.stopDrag=_1.stopDrag.createSequence(_5,_1);return {register:function(el){if(el instanceof Array){for(var i=0,len=el.length;i]+>/gi,asText:function(s){return String(s).replace(this.stripTagsRE,"");},asUCText:function(s){return String(s).toUpperCase().replace(this.stripTagsRE,"");},asUCString:function(s){return String(s).toUpperCase();},asDate:function(s){if(!s){return 0;}if(s instanceof Date){return s.getTime();}return Date.parse(String(s));},asFloat:function(s){var _7=parseFloat(String(s).replace(/,/g,""));if(isNaN(_7)){_7=0;}return _7;},asInt:function(s){var _9=parseInt(String(s).replace(/,/g,""));if(isNaN(_9)){_9=0;}return _9;}}; + +Ext.data.Record=function(_1,id){this.id=(id||id===0)?id:++Ext.data.Record.AUTO_ID;this.data=_1;};Ext.data.Record.create=function(o){var f=function(){f.superclass.constructor.apply(this,arguments);};Ext.extend(f,Ext.data.Record);var p=f.prototype;p.fields=new Ext.util.MixedCollection(false,function(_6){return _6.name;});for(var i=0,_8=o.length;i<_8;i++){p.fields.add(new Ext.data.Field(o[i]));}f.getField=function(_9){return p.fields.get(_9);};return f;};Ext.data.Record.AUTO_ID=1000;Ext.data.Record.EDIT="edit";Ext.data.Record.REJECT="reject";Ext.data.Record.COMMIT="commit";Ext.data.Record.prototype={dirty:false,editing:false,error:null,modified:null,join:function(_a){this.store=_a;},set:function(_b,_c){if(this.data[_b]==_c){return;}this.dirty=true;if(!this.modified){this.modified={};}if(typeof this.modified[_b]=="undefined"){this.modified[_b]=this.data[_b];}this.data[_b]=_c;if(!this.editing){this.store.afterEdit(this);}},get:function(_d){return this.data[_d];},beginEdit:function(){this.editing=true;this.modified={};},cancelEdit:function(){this.editing=false;delete this.modified;},endEdit:function(){this.editing=false;if(this.dirty&&this.store){this.store.afterEdit(this);}},reject:function(){var m=this.modified;for(var n in m){if(typeof m[n]!="function"){this.data[n]=m[n];}}this.dirty=false;delete this.modified;this.editing=false;if(this.store){this.store.afterReject(this);}},commit:function(){this.dirty=false;delete this.modified;this.editing=false;if(this.store){this.store.afterCommit(this);}},hasError:function(){return this.error!=null;},clearError:function(){this.error=null;}}; + +Ext.data.Store=function(_1){this.data=new Ext.util.MixedCollection(false);this.data.getKey=function(o){return o.id;};this.baseParams={};this.paramNames={"start":"start","limit":"limit","sort":"sort","dir":"dir"};Ext.apply(this,_1);if(this.reader&&!this.recordType){this.recordType=this.reader.recordType;}this.fields=this.recordType.prototype.fields;this.modified=[];this.addEvents({datachanged:true,add:true,remove:true,update:true,clear:true,beforeload:true,load:true,loadexception:true});if(this.proxy){this.relayEvents(this.proxy,["loadexception"]);}this.sortToggle={};Ext.data.Store.superclass.constructor.call(this);};Ext.extend(Ext.data.Store,Ext.util.Observable,{remoteSort:false,lastOptions:null,add:function(_3){_3=[].concat(_3);for(var i=0,_5=_3.length;i<_5;i++){_3[i].join(this);}var _6=this.data.length;this.data.addAll(_3);this.fireEvent("add",this,_3,_6);},remove:function(_7){var _8=this.data.indexOf(_7);this.data.removeAt(_8);this.fireEvent("remove",this,_7,_8);},removeAll:function(){this.data.clear();this.fireEvent("clear",this);},insert:function(_9,_a){_a=[].concat(_a);for(var i=0,_c=_a.length;i<_c;i++){this.data.insert(_9,_a[i]);_a[i].join(this);}this.fireEvent("add",this,_a,_9);},indexOf:function(_d){return this.data.indexOf(_d);},indexOfId:function(id){return this.data.indexOfKey(id);},getById:function(id){return this.data.key(id);},getAt:function(_10){return this.data.itemAt(_10);},getRange:function(_11,end){return this.data.getRange(_11,end);},storeOptions:function(o){o=Ext.apply({},o);delete o.callback;delete o.scope;this.lastOptions=o;},load:function(_14){_14=_14||{};if(this.fireEvent("beforeload",this,_14)!==false){this.storeOptions(_14);var p=Ext.apply(_14.params||{},this.baseParams);if(this.sortInfo&&this.remoteSort){var pn=this.paramNames;p[pn["sort"]]=this.sortInfo.field;p[pn["dir"]]=this.sortInfo.direction;}this.proxy.load(p,this.reader,this.loadRecords,this,_14);}},reload:function(_17){this.load(Ext.applyIf(_17||{},this.lastOptions));},loadRecords:function(o,_19,_1a){if(!o||_1a===false){if(_1a!==false){this.fireEvent("load",this,[],_19);}if(_19.callback){_19.callback.call(_19.scope||this,[],_19,false);}return;}var r=o.records,t=o.totalRecords||r.length;for(var i=0,len=r.length;iv2?1:(v10;},appendChild:function(_e){var _f=false;if(_e instanceof Array){_f=_e;}else{if(arguments.length>1){_f=arguments;}}if(_f){for(var i=0,len=_f.length;i0){var _4a=_47?function(){fn.apply(_47,arguments);}:fn;cs.sort(_4a);for(var i=0;ivw+s.left){x=vw-w-this.shadowOffset;_1f=true;}if((y+h)>vh+s.top){y=vh-h-this.shadowOffset;_1f=true;}if(x=ay){y=ay-h-5;}}xy=[x,y];this.storeXY(xy);_7.setXY.call(this,xy);this.sync();}}},isVisible:function(){return this.visible;},showAction:function(){this.visible=true;if(this.useDisplay===true){this.setDisplayed("");}else{if(this.lastXY){_7.setXY.call(this,this.lastXY);}else{if(this.lastLT){_7.setLeftTop.call(this,this.lastLT[0],this.lastLT[1]);}}}},hideAction:function(){this.visible=false;if(this.useDisplay===true){this.setDisplayed(false);}else{this.setLeftTop(-10000,-10000);}},setVisible:function(v,a,d,c,e){if(v){this.showAction();}if(a&&v){var cb=function(){this.sync(true);if(c){c();}}.createDelegate(this);_7.setVisible.call(this,true,true,d,cb,e);}else{if(!v){this.hideUnders(true);}var cb=c;if(a){cb=function(){this.hideAction();if(c){c();}}.createDelegate(this);}_7.setVisible.call(this,v,a,d,cb,e);if(v){this.sync(true);}else{if(!a){this.hideAction();}}}},storeXY:function(xy){delete this.lastLT;this.lastXY=xy;},storeLeftTop:function(_28,top){delete this.lastXY;this.lastLT=[_28,top];},beforeFx:function(){this.beforeAction();return Ext.Layer.superclass.beforeFx.apply(this,arguments);},afterFx:function(){Ext.Layer.superclass.afterFx.apply(this,arguments);this.sync(this.isVisible());},beforeAction:function(){if(!this.updating&&this.shadow){this.shadow.hide();}},setLeft:function(_2a){this.storeLeftTop(_2a,this.getTop(true));_7.setLeft.apply(this,arguments);this.sync();},setTop:function(top){this.storeLeftTop(this.getLeft(true),top);_7.setTop.apply(this,arguments);this.sync();},setLeftTop:function(_2c,top){this.storeLeftTop(_2c,top);_7.setLeftTop.apply(this,arguments);this.sync();},setXY:function(xy,a,d,c,e){this.fixDisplay();this.beforeAction();this.storeXY(xy);var cb=this.createCB(c);_7.setXY.call(this,xy,a,d,cb,e);if(!a){cb();}},createCB:function(c){var el=this;return function(){el.constrainXY();el.sync(true);if(c){c();}};},setX:function(x,a,d,c,e){this.setXY([x,this.getY()],a,d,c,e);},setY:function(y,a,d,c,e){this.setXY([this.getX(),y],a,d,c,e);},setSize:function(w,h,a,d,c,e){this.beforeAction();var cb=this.createCB(c);_7.setSize.call(this,w,h,a,d,cb,e);if(!a){cb();}},setWidth:function(w,a,d,c,e){this.beforeAction();var cb=this.createCB(c);_7.setWidth.call(this,w,a,d,cb,e);if(!a){cb();}},setHeight:function(h,a,d,c,e){this.beforeAction();var cb=this.createCB(c);_7.setHeight.call(this,h,a,d,cb,e);if(!a){cb();}},setBounds:function(x,y,w,h,a,d,c,e){this.beforeAction();var cb=this.createCB(c);if(!a){this.storeXY([x,y]);_7.setXY.call(this,[x,y]);_7.setSize.call(this,w,h,a,d,cb,e);cb();}else{_7.setBounds.call(this,x,y,w,h,a,d,cb,e);}return this;},setZIndex:function(_5c){this.zindex=_5c;this.setStyle("z-index",_5c+2);if(this.shadow){this.shadow.setZIndex(_5c+1);}if(this.shim){this.shim.setStyle("z-index",_5c);}}});})(); + +Ext.Shadow=function(_1){Ext.apply(this,_1);if(typeof this.mode!="string"){this.mode=this.defaultMode;}var o=this.offset,a={h:0};switch(this.mode.toLowerCase()){case "drop":a.w=0;a.l=a.t=o;break;case "sides":a.w=(o*2);a.l=-o;a.t=o;break;case "frame":a.w=a.h=(o*2);a.l=a.t=-o;break;}this.adjusts=a;};Ext.Shadow.prototype={offset:4,defaultMode:"drop",show:function(_4){_4=Ext.get(_4);if(!this.el){this.el=Ext.Shadow.Pool.pull();if(this.el.dom.nextSibling!=_4.dom){this.el.insertBefore(_4);}}this.el.setStyle("z-index",this.zIndex||parseInt(_4.getStyle("z-index"),10)-1);if(Ext.isIE){this.el.dom.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius="+this.offset+")";}this.realign(_4.getLeft(true),_4.getTop(true),_4.getWidth(),_4.getHeight());this.el.dom.style.display="block";},isVisible:function(){return this.el?true:false;},realign:function(l,t,w,h){if(!this.el){return;}var a=this.adjusts,d=this.el.dom,s=d.style;var _c=0;if(Ext.isIE){_c=-(this.offset);}s.left=(l+a.l+_c)+"px";s.top=(t+a.t+_c)+"px";var sw=(w+a.w),sh=(h+a.h),_f=sw+"px",shs=sh+"px";if(s.width!=_f||s.height!=shs){s.width=_f;s.height=shs;if(!Ext.isIE){var cn=d.childNodes;var sww=Math.max(0,(sw-12))+"px";cn[0].childNodes[1].style.width=sww;cn[1].childNodes[1].style.width=sww;cn[2].childNodes[1].style.width=sww;cn[1].style.height=Math.max(0,(sh-12))+"px";}}},hide:function(){if(this.el){this.el.dom.style.display="none";Ext.Shadow.Pool.push(this.el);delete this.el;}},setZIndex:function(z){this.zIndex=z;if(this.el){this.el.setStyle("z-index",z);}}};Ext.Shadow.Pool=function(){var p=[];var _15=Ext.isIE?"
      ":"
      ";return {pull:function(){var sh=p.shift();if(!sh){sh=Ext.get(Ext.DomHelper.insertHtml("beforeBegin",document.body.firstChild,_15));sh.autoBoxAdjust=false;}return sh;},push:function(sh){p.push(sh);}};}(); + +Ext.BoxComponent=function(_1){Ext.BoxComponent.superclass.constructor.call(this,_1);this.addEvents({resize:true,move:true});};Ext.extend(Ext.BoxComponent,Ext.Component,{boxReady:false,deferHeight:false,setSize:function(w,h){if(typeof w=="object"){h=w.height;w=w.width;}if(!this.boxReady){this.width=w;this.height=h;return;}if(this.lastSize&&this.lastSize.width==w&&this.lastSize.height==h){return;}this.lastSize={width:w,height:h};var _4=this.adjustSize(w,h);var aw=_4.width,ah=_4.height;if(aw!==undefined||ah!==undefined){var rz=this.getResizeEl();if(!this.deferHeight&&aw!==undefined&&ah!==undefined){rz.setSize(aw,ah);}else{if(!this.deferHeight&&ah!==undefined){rz.setHeight(ah);}else{if(aw!==undefined){rz.setWidth(aw);}}}this.onResize(aw,ah,w,h);this.fireEvent("resize",this,aw,ah,w,h);}return this;},getSize:function(){return this.el.getSize();},getPosition:function(_8){if(_8===true){return [this.el.getLeft(true),this.el.getTop(true)];}return this.xy||this.el.getXY();},getBox:function(_9){var s=this.el.getSize();if(_9){s.x=this.el.getLeft(true);s.y=this.el.getTop(true);}else{var xy=this.xy||this.el.getXY();s.x=xy[0];s.y=xy[1];}return s;},updateBox:function(_c){this.setSize(_c.width,_c.height);this.setPagePosition(_c.x,_c.y);},getResizeEl:function(){return this.resizeEl||this.el;},setPosition:function(x,y){this.x=x;this.y=y;if(!this.boxReady){return;}var _f=this.adjustPosition(x,y);var ax=_f.x,ay=_f.y;if(ax!==undefined||ay!==undefined){if(ax!==undefined&&ay!==undefined){this.el.setLeftTop(ax,ay);}else{if(ax!==undefined){this.el.setLeft(ax);}else{if(ay!==undefined){this.el.setTop(ay);}}}this.onPosition(ax,ay);this.fireEvent("move",this,ax,ay);}return this;},setPagePosition:function(x,y){this.pageX=x;this.pageY=y;if(!this.boxReady){return;}if(x===undefined||y===undefined){return;}var p=this.el.translatePoints(x,y);this.setPosition(p.left,p.top);return this;},onRender:function(ct,_16){Ext.BoxComponent.superclass.onRender.call(this,ct,_16);if(this.resizeEl){this.resizeEl=Ext.get(this.resizeEl);}},afterRender:function(){Ext.BoxComponent.superclass.afterRender.call(this);this.boxReady=true;this.setSize(this.width,this.height);if(this.x||this.y){this.setPosition(this.x,this.y);}if(this.pageX||this.pageY){this.setPagePosition(this.pageX,this.pageY);}},syncSize:function(){this.setSize(this.el.getWidth(),this.el.getHeight());},onResize:function(_17,_18,_19,_1a){},onPosition:function(x,y){},adjustSize:function(w,h){if(this.autoWidth){w="auto";}if(this.autoHeight){h="auto";}return {width:w,height:h};},adjustPosition:function(x,y){return {x:x,y:y};}}); + +Ext.View=function(_1,_2,_3){this.el=Ext.get(_1,true);if(typeof _2=="string"){_2=new Ext.Template(_2);}_2.compile();this.tpl=_2;Ext.apply(this,_3);this.addEvents({"beforeclick":true,"click":true,"dblclick":true,"contextmenu":true,"selectionchange":true,"beforeselect":true});this.el.on({"click":this.onClick,"dblclick":this.onDblClick,"contextmenu":this.onContextMenu,scope:this});this.selections=[];this.nodes=[];this.cmp=new Ext.CompositeElementLite([]);if(this.store){this.setStore(this.store,true);}Ext.View.superclass.constructor.call(this);};Ext.extend(Ext.View,Ext.util.Observable,{selectedClass:"x-view-selected",emptyText:"",getEl:function(){return this.el;},refresh:function(){var t=this.tpl;this.clearSelections();this.el.update("");var _5=[];var _6=this.store.getRange();if(_6.length<1){this.el.update(this.emptyText);return;}for(var i=0,_8=_6.length;i<_8;i++){var _9=this.prepareData(_6[i].data,i,_6[i]);_5[_5.length]=t.apply(_9);}this.el.update(_5.join(""));this.nodes=this.el.dom.childNodes;this.updateIndexes(0);},prepareData:function(_a){return _a;},onUpdate:function(ds,_c){this.clearSelections();var _d=this.store.indexOf(_c);var n=this.nodes[_d];this.tpl.insertBefore(n,this.prepareData(_c.data));n.parentNode.removeChild(n);this.updateIndexes(_d,_d);},onAdd:function(ds,_10,_11){this.clearSelections();if(this.nodes.length==0){this.refresh();return;}var n=this.nodes[_11];for(var i=0,len=_10.length;i0){this.cmp.elements=this.selections;this.cmp.removeClass(this.selectedClass);this.selections=[];if(!_31){this.fireEvent("selectionchange",this,this.selections);}}},isSelected:function(_32){var s=this.selections;if(s.length<1){return false;}_32=this.getNode(_32);return s.indexOf(_32)!==-1;},select:function(_34,_35,_36){if(_34 instanceof Array){if(!_35){this.clearSelections(true);}for(var i=0,len=_34.length;i=end;i--){_3e.push(ns[i]);}}return _3e;},indexOf:function(_40){_40=this.getNode(_40);if(typeof _40.nodeIndex=="number"){return _40.nodeIndex;}var ns=this.nodes;for(var i=0,len=ns.length;i0){for(var i=0,_8=o.length;i<_8;i++){var _9=this.prepareData(o[i],i,o);_5[_5.length]=this.tpl.apply(_9);}}else{_5.push(this.emptyText);}this.el.update(_5.join(""));this.nodes=this.el.dom.childNodes;this.updateIndexes(0);},load:function(){var um=this.el.getUpdateManager();um.update.apply(um,arguments);},render:function(el,_c){this.clearSelections();this.el.update("");var o;try{o=Ext.util.JSON.decode(_c.responseText);if(this.jsonRoot){o=eval("o."+this.jsonRoot);}}catch(e){}this.jsonData=o;this.beforeRender();this.refresh();},getCount:function(){return this.jsonData?this.jsonData.length:0;},getNodeData:function(_e){if(_e instanceof Array){var _f=[];for(var i=0,len=_e.length;iv2){return dsc?-1:+1;}else{return 0;}}};this.jsonData.sort(f);this.refresh();if(this.jsonData!=this.snapshot){this.snapshot.sort(f);}}}}); + +Ext.ColorPalette=function(_1){Ext.ColorPalette.superclass.constructor.call(this,_1);this.addEvents({select:true});if(this.handler){this.on("select",this.handler,this.scope,true);}};Ext.extend(Ext.ColorPalette,Ext.Component,{itemCls:"x-color-palette",value:null,ctype:"Ext.ColorPalette",colors:["000000","993300","333300","003300","003366","000080","333399","333333","800000","FF6600","808000","008000","008080","0000FF","666699","808080","FF0000","FF9900","99CC00","339966","33CCCC","3366FF","800080","969696","FF00FF","FFCC00","FFFF00","00FF00","00FFFF","00CCFF","993366","C0C0C0","FF99CC","FFCC99","FFFF99","CCFFCC","CCFFFF","99CCFF","CC99FF","FFFFFF"],onRender:function(_2,_3){var t=new Ext.MasterTemplate(" ");var c=this.colors;for(var i=0,_7=c.length;i<_7;i++){t.add([c[i]]);}var el=document.createElement("div");el.className=this.itemCls;t.overwrite(el);_2.dom.insertBefore(el,_3);this.el=Ext.get(el);this.el.on("click",this.handleClick,this,{delegate:"a"});},afterRender:function(){Ext.ColorPalette.superclass.afterRender.call(this);if(this.value){var s=this.value;this.value=null;this.select(s);}},handleClick:function(e,t){e.preventDefault();if(!this.disabled){var c=t.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];this.select(c.toUpperCase());}},select:function(_d){_d=_d.replace("#","");if(_d!=this.value){var el=this.el;if(this.value){el.child("a.color-"+this.value).removeClass("x-color-palette-sel");}el.child("a.color-"+_d).addClass("x-color-palette-sel");this.value=_d;this.fireEvent("select",this,_d);}}}); + +Ext.DatePicker=function(_1){Ext.DatePicker.superclass.constructor.call(this,_1);this.value=_1&&_1.value?_1.value.clearTime():new Date().clearTime();this.addEvents({select:true});if(this.handler){this.on("select",this.handler,this.scope||this);}if(!this.disabledDatesRE&&this.disabledDates){var dd=this.disabledDates;var re="(?:";for(var i=0;i","  ",""];var dn=this.dayNames;for(var i=0;i<7;i++){var d=this.startDay+i;if(d>6){d=d-7;}m.push("");}m[m.length]="";for(var i=0;i<42;i++){if(i%7==0&&i!=0){m[m.length]="";}m[m.length]="";}m[m.length]="
      ",dn[d].substr(0,1),"
      ";var el=document.createElement("div");el.className="x-date-picker";el.innerHTML=m.join("");_7.dom.insertBefore(el,_8);this.el=Ext.get(el);new Ext.util.ClickRepeater(this.el.child("td.x-date-left a"),{handler:this.showPrevMonth,scope:this});new Ext.util.ClickRepeater(this.el.child("td.x-date-right a"),{handler:this.showNextMonth,scope:this});this.el.on("mousewheel",this.handleMouseWheel,this);var kn=new Ext.KeyNav(this.el,{"left":function(e){e.ctrlKey?this.showPrevMonth():this.update(this.activeDate.add("d",-1));},"right":function(e){e.ctrlKey?this.showNextMonth():this.update(this.activeDate.add("d",1));},"up":function(e){e.ctrlKey?this.showNextYear():this.update(this.activeDate.add("d",-7));},"down":function(e){e.ctrlKey?this.showPrevYear():this.update(this.activeDate.add("d",7));},"pageUp":function(e){this.showNextMonth();},"pageDown":function(e){this.showPrevMonth();},"enter":function(e){e.stopPropagation();return true;},scope:this});this.el.on("click",this.handleDateClick,this,{delegate:"a.x-date-date"});this.el.addKeyListener(Ext.EventObject.SPACE,this.selectToday,this);this.el.unselectable();this.cells=this.el.select("table.x-date-inner tbody td");this.textNodes=this.el.query("table.x-date-inner tbody span");var _16=new Ext.menu.Menu({plain:true,cls:"x-date-mmenu",allowOtherMenus:true});var _17=Ext.id()+"months";for(var i=0;i<12;i++){_16.add(new Ext.menu.CheckItem({id:"mm-"+i,text:this.monthNames[i],group:_17,month:i}));}_16.on({"beforeshow":function(){_16.items.get("mm-"+(this.activeDate||this.value).getMonth()).setChecked(true);},"itemclick":function(_18){var d=(this.activeDate||this.value).clone();d.setMonth(_18.month);this.update(d);},"show":function(m){this.visibleRegion=m.el.getRegion().adjust(2,2,-2,-2);},"mouseout":function(m,e){if(!this.visibleRegion.contains(e.getPoint())){m.hide();}},scope:this});this.mbtn=new Ext.Button(this.el.child("td.x-date-middle",true),{menu:_16,text:" ",menuAlign:"c-c?",tooltip:this.monthYearText});var _1d=(new Date()).dateFormat(this.format);var _1e=new Ext.Button(this.el.child("td.x-date-bottom",true),{text:String.format(this.todayText,_1d),tooltip:String.format(this.todayTip,_1d),handler:this.selectToday,scope:this});if(Ext.isIE){this.el.repaint();}this.update(this.value);},showPrevMonth:function(e){this.update(this.activeDate.add("mo",-1));},showNextMonth:function(e){this.update(this.activeDate.add("mo",1));},showPrevYear:function(){this.update(this.activeDate.add("y",-1));},showNextYear:function(){this.update(this.activeDate.add("y",1));},handleMouseWheel:function(e){var _22=e.getWheelDelta();if(_22>0){this.showPrevMonth();e.stopEvent();}else{if(_22<0){this.showNextMonth();e.stopEvent();}}},handleDateClick:function(e,t){e.stopEvent();if(t.dateValue&&!Ext.fly(t.parentNode).hasClass("x-date-disabled")){this.setValue(new Date(t.dateValue));this.fireEvent("select",this,this.value);}},selectToday:function(){this.setValue(new Date().clearTime());this.fireEvent("select",this,this.value);},update:function(_25){var vd=this.activeDate;this.activeDate=_25;if(vd&&this.el){var t=_25.getTime();if(vd.getMonth()==_25.getMonth()&&vd.getFullYear()==_25.getFullYear()){this.cells.removeClass("x-date-selected");this.cells.each(function(c){if(c.dom.firstChild.dateValue==t){c.addClass("x-date-selected");setTimeout(function(){try{c.dom.firstChild.focus();}catch(e){}},50);return false;}});return;}}var _29=_25.getDaysInMonth();var _2a=_25.getFirstDateOfMonth();var _2b=_2a.getDay()-this.startDay;if(_2b<=this.startDay){_2b+=7;}var pm=_25.add("mo",-1);var _2d=pm.getDaysInMonth()-_2b;var _2e=this.cells.elements;var _2f=this.textNodes;_29+=_2b;var day=86400000;var d=(new Date(pm.getFullYear(),pm.getMonth(),_2d)).clearTime();var _32=new Date().clearTime().getTime();var sel=_25.clearTime().getTime();var min=this.minDate?this.minDate.clearTime():Number.NEGATIVE_INFINITY;var max=this.maxDate?this.maxDate.clearTime():Number.POSITIVE_INFINITY;var _36=this.disabledDatesRE;var _37=this.disabledDatesText;var _38=this.disabledDays?this.disabledDays.join(""):false;var _39=this.disabledDaysText;var _3a=this.format;var _3b=function(cal,_3d){_3d.title="";var t=d.getTime();_3d.firstChild.dateValue=t;if(t==_32){_3d.className+=" x-date-today";_3d.title=cal.todayText;}if(t==sel){_3d.className+=" x-date-selected";setTimeout(function(){try{_3d.firstChild.focus();}catch(e){}},50);}if(tmax){_3d.className=" x-date-disabled";_3d.title=cal.maxText;return;}if(_38){if(_38.indexOf(d.getDay())!=-1){_3d.title=_39;_3d.className=" x-date-disabled";}}if(_36&&_3a){var _3f=d.dateFormat(_3a);if(_36.test(_3f)){_3d.title=_37.replace("%0",_3f);_3d.className=" x-date-disabled";}}};var i=0;for(;i<_2b;i++){_2f[i].innerHTML=(++_2d);d.setDate(d.getDate()+1);_2e[i].className="x-date-prevday";_3b(this,_2e[i]);}for(;i<_29;i++){intDay=i-_2b+1;_2f[i].innerHTML=(intDay);d.setDate(d.getDate()+1);_2e[i].className="x-date-active";_3b(this,_2e[i]);}var _41=0;for(;i<42;i++){_2f[i].innerHTML=(++_41);d.setDate(d.getDate()+1);_2e[i].className="x-date-nextday";_3b(this,_2e[i]);}this.mbtn.setText(this.monthNames[_25.getMonth()]+" "+_25.getFullYear());if(!this.internalRender){var _42=this.el.dom.firstChild;var w=_42.offsetWidth;this.el.setWidth(w+this.el.getBorderWidth("lr"));Ext.fly(_42).setWidth(w);this.internalRender=true;if(Ext.isOpera&&!this.secondPass){_42.rows[0].cells[1].style.width=(w-(_42.rows[0].cells[0].offsetWidth+_42.rows[0].cells[2].offsetWidth))+"px";this.secondPass=true;this.update.defer(10,this,[_25]);}}}}); + +Ext.TabPanel=function(_1,_2){this.el=Ext.get(_1,true);if(_2){if(typeof _2=="boolean"){this.tabPosition=_2?"bottom":"top";}else{Ext.apply(this,_2);}}if(this.tabPosition=="bottom"){this.bodyEl=Ext.get(this.createBody(this.el.dom));this.el.addClass("x-tabs-bottom");}this.stripWrap=Ext.get(this.createStrip(this.el.dom),true);this.stripEl=Ext.get(this.createStripList(this.stripWrap.dom),true);this.stripBody=Ext.get(this.stripWrap.dom.firstChild.firstChild,true);if(Ext.isIE){Ext.fly(this.stripWrap.dom.firstChild).setStyle("overflow-x","hidden");}if(this.tabPosition!="bottom"){this.bodyEl=Ext.get(this.createBody(this.el.dom));this.el.addClass("x-tabs-top");}this.items=[];this.bodyEl.setStyle("position","relative");this.active=null;this.activateDelegate=this.activate.createDelegate(this);this.addEvents({"tabchange":true,"beforetabchange":true});Ext.EventManager.onWindowResize(this.onResize,this);this.cpad=this.el.getPadding("lr");this.hiddenCount=0;Ext.TabPanel.superclass.constructor.call(this);};Ext.extend(Ext.TabPanel,Ext.util.Observable,{tabPosition:"top",currentTabWidth:0,minTabWidth:40,maxTabWidth:250,preferredTabWidth:175,resizeTabs:false,monitorResize:true,addTab:function(id,_4,_5,_6){var _7=new Ext.TabPanelItem(this,id,_4,_6);this.addTabItem(_7);if(_5){_7.setContent(_5);}return _7;},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(_d){this.items[_d.id]=_d;this.items.push(_d);if(this.resizeTabs){_d.setWidth(this.currentTabWidth||this.preferredTabWidth);this.autoSizeTabs();}else{_d.autoSize();}},removeTab:function(id){var _f=this.items;var tab=_f[id];if(!tab){return;}var _11=_f.indexOf(tab);if(this.active==tab&&_f.length>1){var _12=this.getNextAvailable(_11);if(_12){_12.activate();}}this.stripEl.dom.removeChild(tab.pnode.dom);if(tab.bodyEl.dom.parentNode==this.bodyEl.dom){this.bodyEl.dom.removeChild(tab.bodyEl.dom);}_f.splice(_11,1);delete this.items[tab.id];tab.fireEvent("close",tab);tab.purgeListeners();this.autoSizeTabs();},getNextAvailable:function(_13){var _14=this.items;var _15=_13;while(_15<_14.length){var _16=_14[++_15];if(_16&&!_16.isHidden()){return _16;}}_15=_13;while(_15>=0){var _16=_14[--_15];if(_16&&!_16.isHidden()){return _16;}}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){return null;}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.fireEvent("tabchange",this,this.active);}return tab;},getActiveTab:function(){return this.active;},syncHeight:function(_1e){var _1f=(_1e||this.el.getHeight())-this.el.getBorderWidth("tb")-this.el.getPadding("tb");var bm=this.bodyEl.getMargins();var _21=_1f-(this.stripWrap.getHeight()||0)-(bm.top+bm.bottom);this.bodyEl.setHeight(_21);return _21;},onResize:function(){if(this.monitorResize){this.autoSizeTabs();}},beginUpdate:function(){this.updating=true;},endUpdate:function(){this.updating=false;this.autoSizeTabs();},autoSizeTabs:function(){var _22=this.items.length;var _23=_22-this.hiddenCount;if(!this.resizeTabs||_22<1||_23<1||this.updating){return;}var w=Math.max(this.el.getWidth()-this.cpad,10);var _25=Math.floor(w/_23);var b=this.stripBody;if(b.getWidth()>w){var _27=this.items;this.setTabWidth(Math.max(_25,this.minTabWidth)-2);if(_25
      ";return _48.firstChild.firstChild.firstChild.firstChild;};Ext.TabPanel.prototype.createBody=function(_49){var _4a=document.createElement("div");Ext.id(_4a,"tab-body");Ext.fly(_4a).addClass("x-tabs-body");_49.appendChild(_4a);return _4a;};Ext.TabPanel.prototype.createItemBody=function(_4b,id){var _4d=Ext.getDom(id);if(!_4d){_4d=document.createElement("div");_4d.id=id;}Ext.fly(_4d).addClass("x-tabs-item-body");_4b.insertBefore(_4d,_4b.firstChild);return _4d;};Ext.TabPanel.prototype.createStripElements=function(_4e,_4f,_50){var td=document.createElement("td");_4e.appendChild(td);if(_50){td.className="x-tabs-closable";if(!this.closeTpl){this.closeTpl=new Ext.Template(""+"{text}"+"
       
      ");}var el=this.closeTpl.overwrite(td,{"text":_4f});var _53=el.getElementsByTagName("div")[0];var _54=el.getElementsByTagName("em")[0];return {"el":el,"close":_53,"inner":_54};}else{if(!this.tabTpl){this.tabTpl=new Ext.Template(""+"{text}");}var el=this.tabTpl.overwrite(td,{"text":_4f});var _54=el.getElementsByTagName("em")[0];return {"el":el,"inner":_54};}}; + +Ext.Button=function(_1,_2){Ext.apply(this,_2);this.addEvents({"click":true,"toggle":true,"mouseover":true,"mouseout":true});if(this.menu){this.menu=Ext.menu.MenuMgr.get(this.menu);}if(_1){this.render(_1);}Ext.Button.superclass.constructor.call(this);};Ext.extend(Ext.Button,Ext.util.Observable,{hidden:false,disabled:false,pressed:false,enableToggle:false,menu:undefined,menuAlign:"tl-bl?",menuClassTarget:"tr",clickEvent:"click",handleMouseEvents:true,tooltipType:"qtip",render:function(_3){var _4;if(this.hideParent){this.parentEl=Ext.get(_3);}if(!this.dhconfig){if(!this.template){if(!Ext.Button.buttonTemplate){Ext.Button.buttonTemplate=new Ext.Template("","","
        
      ");}this.template=Ext.Button.buttonTemplate;}_4=this.template.append(_3,[this.text||" "],true);var _5=_4.child("button:first");_5.on("focus",this.onFocus,this);_5.on("blur",this.onBlur,this);if(this.cls){_4.addClass(this.cls);}if(this.icon){_5.setStyle("background-image","url("+this.icon+")");}if(this.tooltip){if(typeof this.tooltip=="object"){Ext.QuickTips.tips(Ext.apply({target:_5.id},this.tooltip));}else{_5.dom[this.tooltipType]=this.tooltip;}}}else{_4=Ext.DomHelper.append(Ext.get(_3).dom,this.dhconfig,true);}this.el=_4;if(this.id){this.el.dom.id=this.el.id=this.id;}if(this.menu){this.el.child(this.menuClassTarget).addClass("x-btn-with-menu");this.menu.on("show",this.onMenuShow,this);this.menu.on("hide",this.onMenuHide,this);}_4.addClass("x-btn");if(Ext.isIE&&!Ext.isIE7){this.autoWidth.defer(1,this);}else{this.autoWidth();}if(this.handleMouseEvents){_4.on("mouseover",this.onMouseOver,this);_4.on("mouseout",this.onMouseOut,this);_4.on("mousedown",this.onMouseDown,this);}_4.on(this.clickEvent,this.onClick,this);if(this.hidden){this.hide();}if(this.disabled){this.disable();}Ext.ButtonToggleMgr.register(this);if(this.pressed){this.el.addClass("x-btn-pressed");}if(this.repeat){var _6=new Ext.util.ClickRepeater(_4,typeof this.repeat=="object"?this.repeat:{});_6.on("click",this.onClick,this);}},getEl:function(){return this.el;},destroy:function(){Ext.ButtonToggleMgr.unregister(this);this.el.removeAllListeners();this.purgeListeners();this.el.remove();},autoWidth:function(){if(this.el){this.el.setWidth("auto");if(Ext.isIE7&&Ext.isStrict){var ib=this.el.child("button");if(ib&&ib.getWidth()>20){ib.clip();ib.setWidth(Ext.util.TextMetrics.measure(ib,this.text).width+ib.getFrameWidth("lr"));}}if(this.minWidth){if(this.hidden){this.el.beginMeasure();}if(this.el.getWidth()","","","
       
      ","","","
       
      ");var _5=_4.append(_3,[this.text],true);if(this.cls){_5.addClass(this.cls);}if(this.icon){_5.child("button").setStyle("background-image","url("+this.icon+")");}this.el=_5;this.autoWidth();if(this.handleMouseEvents){_5.on("mouseover",this.onMouseOver,this);_5.on("mouseout",this.onMouseOut,this);_5.on("mousedown",this.onMouseDown,this);_5.on("mouseup",this.onMouseUp,this);}_5.on(this.clickEvent,this.onClick,this);if(this.tooltip){var _6=_5.child("button:first");if(typeof this.tooltip=="object"){Ext.QuickTips.tips(Ext.apply({target:_6.id},this.tooltip));}else{_6.dom[this.tooltipType]=this.tooltip;}}if(this.arrowTooltip){var _6=_5.child("button:nth(2)");_6.dom[this.tooltipType]=this.arrowTooltip;}if(this.hidden){this.hide();}if(this.disabled){this.disable();}if(this.menu){this.menu.on("show",this.onMenuShow,this);this.menu.on("hide",this.onMenuHide,this);}},autoWidth:function(){if(this.el){var _7=this.el.child("table:first");var _8=this.el.child("table:last");this.el.setWidth("auto");_7.setWidth("auto");if(Ext.isIE7&&Ext.isStrict){var ib=this.el.child("button:first");if(ib&&ib.getWidth()>20){ib.clip();ib.setWidth(Ext.util.TextMetrics.measure(ib,this.text).width+ib.getFrameWidth("lr"));}}if(this.minWidth){if(this.hidden){this.el.beginMeasure();}if((_7.getWidth()+_8.getWidth())
      ");this.tr=this.el.child("tr",true);var _5=0;this.items=new Ext.util.MixedCollection(false,function(o){return o.id||("item"+(++_5));});if(this.buttons){this.add.apply(this,this.buttons);delete this.buttons;}},add:function(){var a=arguments,l=a.length;for(var i=0;i=1&parseInt(v,10)+_13<=d.pages){this.field.dom.value=parseInt(v,10)+_13;_12=Math.min(Math.max(1,_12+_13),d.pages)-1;this.ds.load({params:{start:_12*this.pageSize,limit:this.pageSize}});}}e.stopEvent();}}}},beforeLoad:function(){if(this.loading){this.loading.disable();}},onClick:function(_14){var ds=this.ds;switch(_14){case "first":ds.load({params:{start:0,limit:this.pageSize}});break;case "prev":ds.load({params:{start:Math.max(0,this.cursor-this.pageSize),limit:this.pageSize}});break;case "next":ds.load({params:{start:this.cursor+this.pageSize,limit:this.pageSize}});break;case "last":var _16=ds.getTotalCount();var _17=_16%this.pageSize;var _18=_17?(_16-_17):_16-this.pageSize;ds.load({params:{start:_18,limit:this.pageSize}});break;case "refresh":ds.load({params:{start:this.cursor,limit:this.pageSize}});break;}},unbind:function(ds){ds.un("beforeload",this.beforeLoad,this);ds.un("load",this.onLoad,this);ds.un("loadexception",this.onLoadError,this);},bind:function(ds){ds.on("beforeload",this.beforeLoad,this);ds.on("load",this.onLoad,this);ds.on("loadexception",this.onLoadError,this);}}); + +Ext.Resizable=function(el,_2){this.el=Ext.get(el);if(_2&&_2.wrap){_2.resizeChild=this.el;this.el=this.el.wrap(typeof _2.wrap=="object"?_2.wrap:{cls:"xresizable-wrap"});this.el.id=this.el.dom.id=_2.resizeChild.id+"-rzwrap";this.el.setStyle("overflow","hidden");this.el.setPositioning(_2.resizeChild.getPositioning());_2.resizeChild.clearPositioning();if(!_2.width||!_2.height){var _3=_2.resizeChild.getSize();this.el.setSize(_3.width,_3.height);}if(_2.pinned&&!_2.adjustments){_2.adjustments="auto";}}this.proxy=this.el.createProxy({tag:"div",cls:"x-resizable-proxy",id:this.el.id+"-rzproxy"});this.proxy.unselectable();this.proxy.enableDisplayMode("block");Ext.apply(this,_2);if(this.pinned){this.disableTrackOver=true;this.el.addClass("x-resizable-pinned");}var _4=this.el.getStyle("position");if(_4!="absolute"&&_4!="fixed"){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=Ext.Resizable.positions;for(var i=0,_8=hs.length;i<_8;i++){if(hs[i]&&ps[hs[i]]){var _9=ps[hs[i]];this[_9]=new Ext.Resizable.Handle(this,_9,this.disableTrackOver,this.transparent);}}this.corner=this.southeast;if(this.handles.indexOf("n")!=-1||this.handles.indexOf("w")!=-1){this.updateBox=true;}this.activeHandle=null;if(this.resizeChild){if(typeof this.resizeChild=="boolean"){this.resizeChild=Ext.get(this.el.dom.firstChild,true);}else{this.resizeChild=Ext.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.position("relative");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.addEvents({"beforeresize":true,"resize":true});if(this.width!==null&&this.height!==null){this.resizeTo(this.width,this.height);}else{this.updateChildSize();}if(Ext.isIE){this.el.dom.style.zoom=1;}Ext.Resizable.superclass.constructor.call(this);};Ext.extend(Ext.Resizable,Ext.util.Observable,{resizeChild:false,adjustments:[0,0],minWidth:5,minHeight:5,maxWidth:10000,maxHeight:10000,enabled:true,animate:false,duration:0.35,dynamic:false,handles:false,multiDirectional:false,disableTrackOver:false,easing:"easeOutStrong",widthIncrement:0,heightIncrement:0,pinned:false,width:null,height:null,preserveRatio:false,transparent:false,minX:0,minY:0,draggable:false,resizeTo:function(_e,_f){this.el.setSize(_e,_f);this.updateChildSize();this.fireEvent("resize",this,_e,_f,null);},startSizing:function(e,_11){this.fireEvent("beforeresize",this,e);if(this.enabled){if(!this.overlay){this.overlay=this.el.createProxy({tag:"div",cls:"x-resizable-overlay",html:" "});this.overlay.unselectable();this.overlay.enableDisplayMode("block");this.overlay.on("mousemove",this.onMouseMove,this);this.overlay.on("mouseup",this.onMouseUp,this);}this.overlay.setStyle("cursor",_11.el.getStyle("cursor"));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.overlay.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true));this.overlay.show();this.proxy.setStyle("visibility","hidden");this.proxy.show();this.proxy.setBox(this.startBox);if(!this.dynamic){this.proxy.setStyle("visibility","visible");}}},onMouseDown:function(_12,e){if(this.enabled){e.stopEvent();this.activeHandle=_12;this.startSizing(e,_12);}},onMouseUp:function(e){var _15=this.resizeElement();this.resizing=false;this.handleOut();this.overlay.hide();this.fireEvent("resize",this,_15.width,_15.height,e);},updateChildSize:function(){if(this.resizeChild){var el=this.el;var _17=this.resizeChild;var adj=this.adjustments;if(el.dom.offsetWidth){var b=el.getSize(true);_17.setSize(b.width+adj[0],b.height+adj[1]);}if(Ext.isIE){setTimeout(function(){if(el.dom.offsetWidth){var b=el.getSize(true);_17.setSize(b.width+adj[0],b.height+adj[1]);}},10);}}},snap:function(_1b,inc,min){if(!inc||!_1b){return _1b;}var _1e=_1b;var m=_1b%inc;if(m>0){if(m>(inc/2)){_1e=_1b+(inc-m);}else{_1e=_1b-m;}}return Math.max(min,_1e);},resizeElement:function(){var box=this.proxy.getBox();if(this.updateBox){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,_22,m,mx){if(v-_22mx){_22=mx-v;}}return _22;},onMouseMove:function(e){if(this.enabled){try{var _26=this.curSize||this.startBox;var x=this.startBox.x,y=this.startBox.y;var ox=x,oy=y;var w=_26.width,h=_26.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 _35=e.getXY();var _36=-(this.startPoint[0]-Math.max(this.minX,_35[0]));var _37=-(this.startPoint[1]-Math.max(this.minY,_35[1]));var pos=this.activeHandle.position;switch(pos){case "east":w+=_36;w=Math.min(Math.max(mw,w),mxw);break;case "south":h+=_37;h=Math.min(Math.max(mh,h),mxh);break;case "southeast":w+=_36;h+=_37;w=Math.min(Math.max(mw,w),mxw);h=Math.min(Math.max(mh,h),mxh);break;case "north":_37=this.constrain(h,_37,mh,mxh);y+=_37;h-=_37;break;case "west":_36=this.constrain(w,_36,mw,mxw);x+=_36;w-=_36;break;case "northeast":w+=_36;w=Math.min(Math.max(mw,w),mxw);_37=this.constrain(h,_37,mh,mxh);y+=_37;h-=_37;break;case "northwest":_36=this.constrain(w,_36,mw,mxw);_37=this.constrain(h,_37,mh,mxh);y+=_37;h-=_37;x+=_36;w-=_36;break;case "southwest":_36=this.constrain(w,_36,mw,mxw);h+=_37;h=Math.min(Math.max(mh,h),mxh);x+=_36;w-=_36;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("x-resizable-over");}},handleOut:function(){if(!this.resizing){this.el.removeClass("x-resizable-over");}},getEl:function(){return this.el;},getResizeChild:function(){return this.resizeChild;},destroy:function(_3d){this.proxy.remove();this.overlay.removeAllListeners();this.overlay.remove();var ps=Ext.Resizable.positions;for(var k in ps){if(typeof ps[k]!="function"&&this[ps[k]]){var h=this[ps[k]];h.el.removeAllListeners();h.el.remove();}}if(_3d){this.el.update("");this.el.remove();}}});Ext.Resizable.positions={n:"north",s:"south",e:"east",w:"west",se:"southeast",sw:"southwest",nw:"northwest",ne:"northeast"};Ext.Resizable.Handle=function(rz,pos,_43,_44){if(!this.tpl){var tpl=Ext.DomHelper.createTemplate({tag:"div",cls:"x-resizable-handle x-resizable-handle-{0}"});tpl.compile();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(_44){this.el.setOpacity(0);}this.el.on("mousedown",this.onMouseDown,this);if(!_43){this.el.on("mouseover",this.onMouseOver,this);this.el.on("mouseout",this.onMouseOut,this);}};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);}}; + +Ext.SplitBar=function(_1,_2,_3,_4,_5){this.el=Ext.get(_1,true);this.el.dom.unselectable="on";this.resizingEl=Ext.get(_2,true);this.orientation=_3||Ext.SplitBar.HORIZONTAL;this.minSize=0;this.maxSize=2000;this.animate=false;this.useShim=false;this.shim=null;if(!_5){this.proxy=Ext.SplitBar.createProxy(this.orientation);}else{this.proxy=Ext.get(_5).dom;}this.dd=new Ext.dd.DDProxy(this.el.dom.id,"XSplitBars",{dragElId:this.proxy.id});this.dd.b4StartDrag=this.onStartProxyDrag.createDelegate(this);this.dd.endDrag=this.onEndProxyDrag.createDelegate(this);this.dragSpecs={};this.adapter=new Ext.SplitBar.BasicLayoutAdapter();this.adapter.init(this);if(this.orientation==Ext.SplitBar.HORIZONTAL){this.placement=_4||(this.el.getX()>this.resizingEl.getX()?Ext.SplitBar.LEFT:Ext.SplitBar.RIGHT);this.el.addClass("x-splitbar-h");}else{this.placement=_4||(this.el.getY()>this.resizingEl.getY()?Ext.SplitBar.TOP:Ext.SplitBar.BOTTOM);this.el.addClass("x-splitbar-v");}this.addEvents({"resize":true,"moved":true,"beforeresize":true,"beforeapply":true});Ext.SplitBar.superclass.constructor.call(this);};Ext.extend(Ext.SplitBar,Ext.util.Observable,{onStartProxyDrag:function(x,y){this.fireEvent("beforeresize",this);if(!this.overlay){var o=Ext.DomHelper.insertFirst(document.body,{cls:"x-drag-overlay",html:" "},true);o.unselectable();o.enableDisplayMode("block");Ext.SplitBar.prototype.overlay=o;}this.overlay.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true));this.overlay.show();Ext.get(this.proxy).setDisplayed("block");var _9=this.adapter.getElementSize(this);this.activeMinSize=this.getMinimumSize();this.activeMaxSize=this.getMaximumSize();var c1=_9-this.activeMinSize;var c2=Math.max(this.activeMaxSize-_9,0);if(this.orientation==Ext.SplitBar.HORIZONTAL){this.dd.resetConstraints();this.dd.setXConstraint(this.placement==Ext.SplitBar.LEFT?c1:c2,this.placement==Ext.SplitBar.LEFT?c2:c1);this.dd.setYConstraint(0,0);}else{this.dd.resetConstraints();this.dd.setXConstraint(0,0);this.dd.setYConstraint(this.placement==Ext.SplitBar.TOP?c1:c2,this.placement==Ext.SplitBar.TOP?c2:c1);}this.dragSpecs.startSize=_9;this.dragSpecs.startPoint=[x,y];Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd,x,y);},onEndProxyDrag:function(e){Ext.get(this.proxy).setDisplayed(false);var _d=Ext.lib.Event.getXY(e);if(this.overlay){this.overlay.hide();}var _e;if(this.orientation==Ext.SplitBar.HORIZONTAL){_e=this.dragSpecs.startSize+(this.placement==Ext.SplitBar.LEFT?_d[0]-this.dragSpecs.startPoint[0]:this.dragSpecs.startPoint[0]-_d[0]);}else{_e=this.dragSpecs.startSize+(this.placement==Ext.SplitBar.TOP?_d[1]-this.dragSpecs.startPoint[1]:this.dragSpecs.startPoint[1]-_d[1]);}_e=Math.min(Math.max(_e,this.activeMinSize),this.activeMaxSize);if(_e!=this.dragSpecs.startSize){if(this.fireEvent("beforeapply",this,_e)!==false){this.adapter.setElementSize(this,_e);this.fireEvent("moved",this,_e);this.fireEvent("resize",this,_e);}}},getAdapter:function(){return this.adapter;},setAdapter:function(_f){this.adapter=_f;this.adapter.init(this);},getMinimumSize:function(){return this.minSize;},setMinimumSize:function(_10){this.minSize=_10;},getMaximumSize:function(){return this.maxSize;},setMaximumSize:function(_11){this.maxSize=_11;},setCurrentSize:function(_12){var _13=this.animate;this.animate=false;this.adapter.setElementSize(this,_12);this.animate=_13;},destroy:function(_14){if(this.shim){this.shim.remove();}this.dd.unreg();this.proxy.parentNode.removeChild(this.proxy);if(_14){this.el.remove();}}});Ext.SplitBar.createProxy=function(dir){var _16=new Ext.Element(document.createElement("div"));_16.unselectable();var cls="x-splitbar-proxy";_16.addClass(cls+" "+(dir==Ext.SplitBar.HORIZONTAL?cls+"-h":cls+"-v"));document.body.appendChild(_16.dom);return _16.dom;};Ext.SplitBar.BasicLayoutAdapter=function(){};Ext.SplitBar.BasicLayoutAdapter.prototype={init:function(s){},getElementSize:function(s){if(s.orientation==Ext.SplitBar.HORIZONTAL){return s.resizingEl.getWidth();}else{return s.resizingEl.getHeight();}},setElementSize:function(s,_1b,_1c){if(s.orientation==Ext.SplitBar.HORIZONTAL){if(!s.animate){s.resizingEl.setWidth(_1b);if(_1c){_1c(s,_1b);}}else{s.resizingEl.setWidth(_1b,true,0.1,_1c,"easeOut");}}else{if(!s.animate){s.resizingEl.setHeight(_1b);if(_1c){_1c(s,_1b);}}else{s.resizingEl.setHeight(_1b,true,0.1,_1c,"easeOut");}}}};Ext.SplitBar.AbsoluteLayoutAdapter=function(_1d){this.basic=new Ext.SplitBar.BasicLayoutAdapter();this.container=Ext.get(_1d);};Ext.SplitBar.AbsoluteLayoutAdapter.prototype={init:function(s){this.basic.init(s);},getElementSize:function(s){return this.basic.getElementSize(s);},setElementSize:function(s,_21,_22){this.basic.setElementSize(s,_21,this.moveSplitter.createDelegate(this,[s]));},moveSplitter:function(s){var yes=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;}}};Ext.SplitBar.VERTICAL=1;Ext.SplitBar.HORIZONTAL=2;Ext.SplitBar.LEFT=1;Ext.SplitBar.RIGHT=2;Ext.SplitBar.TOP=3;Ext.SplitBar.BOTTOM=4; + +Ext.Editor=function(_1,_2){Ext.Editor.superclass.constructor.call(this,_2);this.field=_1;this.addEvents({"beforestartedit":true,"startedit":true,"beforecomplete":true,"complete":true,"specialkey":true});};Ext.extend(Ext.Editor,Ext.Component,{value:"",alignment:"c-c?",shadow:"frame",updateEl:false,onRender:function(ct,_4){this.el=new Ext.Layer({shadow:this.shadow,cls:"x-editor",parentEl:ct,shim:this.shim,shadowOffset:3,id:this.id});this.el.setStyle("overflow",Ext.isGecko?"auto":"hidden");this.field.render(this.el);if(Ext.isGecko){this.field.el.dom.setAttribute("autocomplete","off");}this.field.show();this.field.on("blur",this.onBlur,this);this.relayEvents(this.field,["specialkey"]);if(this.field.grow){this.field.on("autosize",this.el.sync,this.el,{delay:1});}},startEdit:function(el,_6){if(this.editing){this.completeEdit();}this.boundEl=Ext.get(el);var v=_6!==undefined?_6:this.boundEl.dom.innerHTML;if(!this.rendered){this.render(this.parentEl||document.body);}if(this.fireEvent("beforestartedit",this,this.boundEl,v)===false){return;}this.startValue=v;this.field.setValue(v);if(this.autoSize){var sz=this.boundEl.getSize();switch(this.autoSize){case "width":this.setSize(sz.width,"");break;case "height":this.setSize("",sz.height);break;default:this.setSize(sz.width,sz.height);}}this.el.alignTo(this.boundEl,this.alignment);this.editing=true;if(Ext.QuickTips){Ext.QuickTips.disable();}this.show();},setSize:function(w,h){this.field.setSize(w,h);if(this.el){this.el.sync();}},realign:function(){this.el.alignTo(this.boundEl,this.alignment);},completeEdit:function(_b){if(!this.editing){return;}var v=this.getValue();if(this.revertInvalid!==false&&!this.field.isValid()){v=this.startValue;this.cancelEdit(true);}if(String(v)==String(this.startValue)&&this.ignoreNoChange){this.editing=false;this.hide();return;}if(this.fireEvent("beforecomplete",this,v,this.startValue)!==false){this.editing=false;if(this.updateEl&&this.boundEl){this.boundEl.update(v);}if(_b!==true){this.hide();}this.fireEvent("complete",this,v,this.startValue);}},onShow:function(){this.el.show();if(this.hideEl!==false){this.boundEl.hide();}this.field.show();this.field.focus();this.fireEvent("startedit",this.boundEl,this.startValue);},cancelEdit:function(_d){if(this.editing){this.setValue(this.startValue);if(_d!==true){this.hide();}}},onBlur:function(){if(this.allowBlur!==true&&this.editing){this.completeEdit();}},onHide:function(){if(this.editing){this.completeEdit();return;}this.field.blur();if(this.field.collapse){this.field.collapse();}this.el.hide();if(this.hideEl!==false){this.boundEl.show();}if(Ext.QuickTips){Ext.QuickTips.enable();}},setValue:function(v){this.field.setValue(v);},getValue:function(){return this.field.getValue();}}); + +Ext.BasicDialog=function(el,_2){this.el=Ext.get(el);var dh=Ext.DomHelper;if(!this.el&&_2&&_2.autoCreate){if(typeof _2.autoCreate=="object"){if(!_2.autoCreate.id){_2.autoCreate.id=el;}this.el=dh.append(document.body,_2.autoCreate,true);}else{this.el=dh.append(document.body,{tag:"div",id:el,style:"visibility:hidden;"},true);}}el=this.el;el.setDisplayed(true);el.hide=this.hideAction;this.id=el.id;el.addClass("x-dlg");Ext.apply(this,_2);this.proxy=el.createProxy("x-dlg-proxy");this.proxy.hide=this.hideAction;this.proxy.setOpacity(0.5);this.proxy.hide();if(_2.width){el.setWidth(_2.width);}if(_2.height){el.setHeight(_2.height);}this.size=el.getSize();if(typeof _2.x!="undefined"&&typeof _2.y!="undefined"){this.xy=[_2.x,_2.y];}else{this.xy=el.getCenterXY(true);}this.header=el.child("/.x-dlg-hd");this.body=el.child("/.x-dlg-bd");this.footer=el.child("/.x-dlg-ft");if(!this.header){this.header=el.createChild({tag:"div",cls:"x-dlg-hd",html:" "},this.body?this.body.dom:null);}if(!this.body){this.body=el.createChild({tag:"div",cls:"x-dlg-bd"});}this.header.unselectable();if(this.title){this.header.update(this.title);}this.focusEl=el.createChild({tag:"a",href:"#",cls:"x-dlg-focus",tabIndex:"-1"});this.focusEl.swallowEvent("click",true);this.header.wrap({cls:"x-dlg-hd-right"}).wrap({cls:"x-dlg-hd-left"},true);this.bwrap=this.body.wrap({tag:"div",cls:"x-dlg-dlg-body"});if(this.footer){this.bwrap.dom.appendChild(this.footer.dom);}this.bg=this.el.createChild({tag:"div",cls:"x-dlg-bg",html:"
       
      "});this.centerBg=this.bg.child("div.x-dlg-bg-center");if(this.autoScroll!==false&&!this.autoTabs){this.body.setStyle("overflow","auto");}this.toolbox=this.el.createChild({cls:"x-dlg-toolbox"});if(this.closable!==false){this.el.addClass("x-dlg-closable");this.close=this.toolbox.createChild({cls:"x-dlg-close"});this.close.on("click",this.closeClick,this);this.close.addClassOnOver("x-dlg-close-over");}if(this.collapsible!==false){this.collapseBtn=this.toolbox.createChild({cls:"x-dlg-collapse"});this.collapseBtn.on("click",this.collapseClick,this);this.collapseBtn.addClassOnOver("x-dlg-collapse-over");this.header.on("dblclick",this.collapseClick,this);}if(this.resizable!==false){this.el.addClass("x-dlg-resizable");this.resizer=new Ext.Resizable(el,{minWidth:this.minWidth||80,minHeight:this.minHeight||80,handles:this.resizeHandles||"all",pinned:true});this.resizer.on("beforeresize",this.beforeResize,this);this.resizer.on("resize",this.onResize,this);}if(this.draggable!==false){el.addClass("x-dlg-draggable");if(!this.proxyDrag){var dd=new Ext.dd.DD(el.dom.id,"WindowDrag");}else{var dd=new Ext.dd.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);dd.scroll=false;this.dd=dd;}if(this.modal){this.mask=dh.append(document.body,{tag:"div",cls:"x-dlg-mask"},true);this.mask.enableDisplayMode("block");this.mask.hide();this.el.addClass("x-dlg-modal");}if(this.shadow){this.shadow=new Ext.Shadow({mode:typeof this.shadow=="string"?this.shadow:"sides",offset:this.shadowOffset});}else{this.shadowOffset=0;}if(Ext.useShims&&this.shim!==false){this.shim=this.el.createShim();this.shim.hide=this.hideAction;this.shim.hide();}else{this.shim=false;}if(this.autoTabs){this.initTabs();}this.addEvents({"keydown":true,"move":true,"resize":true,"beforehide":true,"hide":true,"beforeshow":true,"show":true});el.on("keydown",this.onKeyDown,this);el.on("mousedown",this.toFront,this);Ext.EventManager.onWindowResize(this.adjustViewport,this,true);this.el.hide();Ext.DialogManager.register(this);Ext.BasicDialog.superclass.constructor.call(this);};Ext.extend(Ext.BasicDialog,Ext.util.Observable,{shadowOffset:5,minHeight:80,minWidth:200,minButtonWidth:75,defaultButton:null,buttonAlign:"right",tabTag:"div",firstShow:true,setTitle:function(_5){this.header.update(_5);return this;},closeClick:function(){this.hide();},collapseClick:function(){this[this.collapsed?"expand":"collapse"]();},collapse:function(){if(!this.collapsed){this.collapsed=true;this.el.addClass("x-dlg-collapsed");this.restoreHeight=this.el.getHeight();this.resizeTo(this.el.getWidth(),this.header.getHeight());}},expand:function(){if(this.collapsed){this.collapsed=false;this.el.removeClass("x-dlg-collapsed");this.resizeTo(this.el.getWidth(),this.restoreHeight);}},initTabs:function(){var _6=this.getTabs();while(_6.getTab(0)){_6.removeTab(0);}this.el.select(this.tabTag+".x-dlg-tab").each(function(el){var _8=el.dom;_6.addTab(Ext.id(_8),_8.title);_8.title="";});_6.activate(0);return _6;},beforeResize:function(){this.resizer.minHeight=Math.max(this.minHeight,this.getHeaderFooterHeight(true)+40);},onResize:function(){this.refreshSize();this.syncBodyHeight();this.adjustAssets();this.focus();this.fireEvent("resize",this,this.size.width,this.size.height);},onKeyDown:function(e){if(this.isVisible()){this.fireEvent("keydown",this,e);}},resizeTo:function(_a,_b){this.el.setSize(_a,_b);this.size={width:_a,height:_b};this.syncBodyHeight();if(this.fixedcenter){this.center();}if(this.isVisible()){this.constrainXY();this.adjustAssets();}this.fireEvent("resize",this,_a,_b);return this;},setContentSize:function(w,h){h+=this.getHeaderFooterHeight()+this.body.getMargins("tb");w+=this.body.getMargins("lr")+this.bwrap.getMargins("lr")+this.centerBg.getPadding("lr");h+=this.body.getPadding("tb")+this.bwrap.getBorderWidth("tb")+this.body.getBorderWidth("tb")+this.el.getBorderWidth("tb");w+=this.body.getPadding("lr")+this.bwrap.getBorderWidth("lr")+this.body.getBorderWidth("lr")+this.bwrap.getPadding("lr")+this.el.getBorderWidth("lr");if(this.tabs){h+=this.tabs.stripWrap.getHeight()+this.tabs.bodyEl.getMargins("tb")+this.tabs.bodyEl.getPadding("tb");w+=this.tabs.bodyEl.getMargins("lr")+this.tabs.bodyEl.getPadding("lr");}this.resizeTo(w,h);return this;},addKeyListener:function(_e,fn,_10){var _11,_12,_13,alt;if(typeof _e=="object"&&!(_e instanceof Array)){_11=_e["key"];_12=_e["shift"];_13=_e["ctrl"];alt=_e["alt"];}else{_11=_e;}var _15=function(dlg,e){if((!_12||e.shiftKey)&&(!_13||e.ctrlKey)&&(!alt||e.altKey)){var k=e.getKey();if(_11 instanceof Array){for(var i=0,len=_11.length;i
      "},null,true);this.btnContainer=tb.firstChild.firstChild.firstChild;}var _20={handler:_1c,scope:_1d,minWidth:this.minButtonWidth,hideParent:true};if(typeof _1b=="string"){_20.text=_1b;}else{if(_1b.tag){_20.dhconfig=_1b;}else{Ext.apply(_20,_1b);}}var btn=new Ext.Button(this.btnContainer.appendChild(document.createElement("td")),_20);this.syncBodyHeight();if(!this.buttons){this.buttons=[];}this.buttons.push(btn);return btn;},setDefaultButton:function(btn){this.defaultButton=btn;return this;},getHeaderFooterHeight:function(_23){var _24=0;if(this.header){_24+=this.header.getHeight();}if(this.footer){var fm=this.footer.getMargins();_24+=(this.footer.getHeight()+fm.top+fm.bottom);}_24+=this.bwrap.getPadding("tb")+this.bwrap.getBorderWidth("tb");_24+=this.centerBg.getPadding("tb");return _24;},syncBodyHeight:function(){var bd=this.body,cb=this.centerBg,bw=this.bwrap;var _29=this.size.height-this.getHeaderFooterHeight(false);bd.setHeight(_29-bd.getMargins("tb"));var hh=this.header.getHeight();var h=this.size.height-hh;cb.setHeight(h);bw.setLeftTop(cb.getPadding("l"),hh+cb.getPadding("t"));bw.setHeight(h-cb.getPadding("tb"));bw.setWidth(this.el.getWidth(true)-cb.getPadding("lr"));bd.setWidth(bw.getWidth(true));if(this.tabs){this.tabs.syncHeight();if(Ext.isIE){this.tabs.el.repaint();}}},restoreState:function(){var box=Ext.state.Manager.get(this.stateId||(this.el.id+"-state"));if(box&&box.width){this.xy=[box.x,box.y];this.resizeTo(box.width,box.height);}return this;},beforeShow:function(){this.expand();if(this.fixedcenter){this.xy=this.el.getCenterXY(true);}if(this.modal){Ext.get(document.body).addClass("x-body-masked");this.mask.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true));this.mask.show();}this.constrainXY();},animShow:function(){var b=Ext.get(this.animateTarget,true).getBox();this.proxy.setSize(b.width,b.height);this.proxy.setLocation(b.x,b.y);this.proxy.show();this.proxy.setBounds(this.xy[0],this.xy[1],this.size.width,this.size.height,true,0.35,this.showEl.createDelegate(this));},show:function(_2e){if(this.fireEvent("beforeshow",this)===false){return;}if(this.syncHeightBeforeShow){this.syncBodyHeight();}else{if(this.firstShow){this.firstShow=false;this.syncBodyHeight();}}this.animateTarget=_2e||this.animateTarget;if(!this.el.isVisible()){this.beforeShow();if(this.animateTarget){this.animShow();}else{this.showEl();}}return this;},showEl:function(){this.proxy.hide();this.el.setXY(this.xy);this.el.show();this.adjustAssets(true);this.toFront();this.focus();if(Ext.isIE){this.el.repaint();}this.fireEvent("show",this);},focus:function(){if(this.defaultButton){this.defaultButton.focus();}else{this.focusEl.focus();}},constrainXY:function(){if(this.constraintoviewport!==false){if(!this.viewSize){if(this.container){var s=this.container.getSize();this.viewSize=[s.width,s.height];}else{this.viewSize=[Ext.lib.Dom.getViewWidth(),Ext.lib.Dom.getViewHeight()];}}var s=Ext.get(this.container||document).getScroll();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 _36=false;if(x+w>vw+s.left){x=vw-w;_36=true;}if(y+h>vh+s.top){y=vh-h;_36=true;}if(x
       
      "});_6=_5.dom.firstChild;_7=Ext.get(_5.dom.childNodes[2]);_7.enableDisplayMode();_7.addKeyListener([10,13],function(){if(_1.isVisible()&&_2&&_2.buttons){if(_2.buttons.ok){_e("ok");}else{if(_2.buttons.yes){_e("yes");}}}});_8=Ext.get(_5.dom.childNodes[3]);_8.enableDisplayMode();_9=Ext.get(_5.dom.childNodes[4]);_9.enableDisplayMode();var pf=_9.dom.firstChild;pp=Ext.get(pf.firstChild);pp.setHeight(pf.offsetHeight);}return _1;},updateText:function(_1b){if(!_1.isVisible()&&!_2.width){_1.resizeTo(this.maxWidth,100);}_6.innerHTML=_1b||" ";var w=Math.max(Math.min(_2.width||_6.offsetWidth,this.maxWidth),Math.max(_2.minWidth||this.minWidth,_d));if(_2.prompt){_c.setWidth(w);}if(_1.isVisible()){_1.fixedcenter=false;}_1.setContentSize(w,_5.getHeight());if(_1.isVisible()){_1.fixedcenter=true;}return this;},updateProgress:function(_1d,_1e){if(_1e){this.updateText(_1e);}pp.setWidth(Math.floor(_1d*_9.dom.firstChild.offsetWidth));return this;},isVisible:function(){return _1&&_1.isVisible();},hide:function(){if(this.isVisible()){_1.hide();}},show:function(_1f){if(this.isVisible()){this.hide();}var d=this.getDialog();_2=_1f;d.setTitle(_2.title||" ");d.close.setDisplayed(_2.closable!==false);_c=_7;_2.prompt=_2.prompt||(_2.multiline?true:false);if(_2.prompt){if(_2.multiline){_7.hide();_8.show();_8.setHeight(typeof _2.multiline=="number"?_2.multiline:this.defaultTextHeight);_c=_8;}else{_7.show();_8.hide();}}else{_7.hide();_8.hide();}_9.setDisplayed(_2.progress===true);this.updateProgress(0);_c.dom.value=_2.value||"";if(_2.prompt){_1.setDefaultButton(_c);}else{var bs=_2.buttons;var db=null;if(bs&&bs.ok){db=_b["ok"];}else{if(bs&&bs.yes){db=_b["yes"];}}_1.setDefaultButton(db);}_d=_11(_2.buttons);this.updateText(_2.msg);if(_2.cls){d.el.addClass(_2.cls);}d.proxyDrag=_2.proxyDrag===true;d.modal=_2.modal!==false;d.mask=_2.modal!==false?_3:false;if(!d.isVisible()){document.body.appendChild(_1.el.dom);d.animateTarget=null;d.show(_1f.animEl);}return this;},progress:function(_23,msg){this.show({title:_23,msg:msg,buttons:false,progress:true,closable:false,minWidth:this.minProgressWidth});return this;},alert:function(_25,msg,fn,_28){this.show({title:_25,msg:msg,buttons:this.OK,fn:fn,scope:_28});return this;},wait:function(msg,_2a){this.show({title:_2a,msg:msg,buttons:false,closable:false,progress:true,modal:true,width:300,wait:true});_4=Ext.TaskMgr.start({run:function(i){Ext.MessageBox.updateProgress(((((i+20)%20)+1)*5)*0.01);},interval:1000});return this;},confirm:function(_2c,msg,fn,_2f){this.show({title:_2c,msg:msg,buttons:this.YESNO,fn:fn,scope:_2f});return this;},prompt:function(_30,msg,fn,_33,_34){this.show({title:_30,msg:msg,buttons:this.OKCANCEL,fn:fn,minWidth:250,scope:_33,prompt:true,multiline:_34});return this;},OK:{ok:true},YESNO:{yes:true,no:true},OKCANCEL:{ok:true,cancel:true},YESNOCANCEL:{yes:true,no:true,cancel:true},defaultTextHeight:75,maxWidth:600,minWidth:100,minProgressWidth:250,buttonText:{ok:"OK",cancel:"Cancel",yes:"Yes",no:"No"}};}();Ext.Msg=Ext.MessageBox; + +Ext.QuickTips=function(){var el,_2,_3,_4,tm,_6,_7,_8={},_9,_a=null,_b,_c;var ce,bd,xy,dd;var _11=false,_12=true,_13=false;var _14=1,_15=1,_16=1,_17=[];var _18=function(e){if(_12){return;}var t=e.getTarget();if(!t||t.nodeType!==1||t==document||t==document.body){return;}if(ce&&t==ce.el){clearTimeout(_15);return;}if(t&&_8[t.id]){_8[t.id].el=t;_14=_1b.defer(tm.showDelay,tm,[_8[t.id]]);return;}var ttp,et=Ext.fly(t);var ns=_6.namespace;if(tm.interceptTitles&&t.title){ttp=t.title;t.qtip=ttp;t.removeAttribute("title");e.preventDefault();}else{ttp=t.qtip||et.getAttributeNS(ns,_6.attribute);}if(ttp){_14=_1b.defer(tm.showDelay,tm,[{el:t,text:ttp,width:et.getAttributeNS(ns,_6.width),autoHide:et.getAttributeNS(ns,_6.hide)!="user",title:et.getAttributeNS(ns,_6.title),cls:et.getAttributeNS(ns,_6.cls)}]);}};var _1f=function(e){clearTimeout(_14);var t=e.getTarget();if(t&&ce&&ce.el==t&&(tm.autoHide&&ce.autoHide!==false)){_15=setTimeout(_22,tm.hideDelay);}};var _23=function(e){if(_12){return;}xy=e.getXY();xy[1]+=18;if(tm.trackMouse&&ce){el.setXY(xy);}};var _25=function(e){clearTimeout(_14);clearTimeout(_15);if(!e.within(el)){if(tm.hideOnClick){_22();tm.disable();}}};var _27=function(e){tm.enable();};var _29=function(){return _b.getPadding("l")+_c.getPadding("r");};var _1b=function(o){if(_12){return;}clearTimeout(_16);ce=o;if(_a){el.removeClass(_a);_a=null;}if(ce.cls){el.addClass(ce.cls);_a=ce.cls;}if(ce.title){_4.update(ce.title);_4.show();}else{_4.update("");_4.hide();}el.dom.style.width=tm.maxWidth+"px";_3.update(o.text);var p=_29(),w=ce.width;if(!w){var td=_3.dom;var aw=Math.max(td.offsetWidth,td.clientWidth,td.scrollWidth);if(aw>tm.maxWidth){w=tm.maxWidth;}else{if(aw

      ");_4=el.child("h3");_4.enableDisplayMode("block");_2=el.child("div.x-tip-bd");_3=el.child("div.x-tip-bd-inner");_b=el.child("div.x-tip-bd-left");_c=el.child("div.x-tip-bd-right");_7=el.child("div.x-tip-close");_7.enableDisplayMode("block");_7.on("click",_22);d=Ext.get(document);d.on("mousedown",_25);d.on("mouseup",_27);d.on("mouseover",_18);d.on("mouseout",_1f);d.on("mousemove",_23);_9=d.addKeyListener(27,_22);_9.disable();if(Ext.dd.DD){dd=el.initDD("default",null,{onDrag:function(){el.sync();}});dd.setHandleElId(_4.id);dd.lock();}_13=true;}this.enable();},register:function(_32){var cs=_32 instanceof Array?_32:arguments;for(var i=0,len=cs.length;i0){var f=function(_14,_15){if(_14&&_15){var n=_15.findChild(_f,v);if(n){n.select();if(_10){_10(true,n);}}}else{if(_10){_10(false,n);}}};this.expandPath(_11.join(this.pathSeparator),_f,f);}else{this.root.select();if(_10){_10(true,this.root);}}},render:function(){this.container=this.el.createChild({tag:"ul",cls:"x-tree-root-ct "+(this.lines?"x-tree-lines":"x-tree-no-lines")});if(this.containerScroll){Ext.dd.ScrollManager.register(this.el);}if((this.enableDD||this.enableDrop)&&!this.dropZone){this.dropZone=new Ext.tree.TreeDropZone(this,this.dropConfig||{ddGroup:this.ddGroup||"TreeDD",appendOnly:this.ddAppendOnly===true});}if((this.enableDD||this.enableDrag)&&!this.dragZone){this.dragZone=new Ext.tree.TreeDragZone(this,this.dragConfig||{ddGroup:this.ddGroup||"TreeDD",scroll:this.ddScroll});}this.getSelectionModel().init(this);this.root.render();if(!this.rootVisible){this.root.renderChildren();}return this;}}); + +Ext.tree.DefaultSelectionModel=function(){this.selNode=null;this.addEvents({"selectionchange":true,"beforeselect":true});};Ext.extend(Ext.tree.DefaultSelectionModel,Ext.util.Observable,{init:function(_1){this.tree=_1;_1.el.on("keydown",this.onKeyDown,this);_1.on("click",this.onNodeClick,this);},onNodeClick:function(_2,e){this.select(_2);},select:function(_4){var _5=this.selNode;if(_5!=_4&&this.fireEvent("beforeselect",this,_4,_5)!==false){if(_5){_5.ui.onSelectedChange(false);}this.selNode=_4;_4.ui.onSelectedChange(true);this.fireEvent("selectionchange",this,_4,_5);}return _4;},unselect:function(_6){if(this.selNode==_6){this.clearSelections();}},clearSelections:function(){var n=this.selNode;if(n){n.ui.onSelectedChange(false);this.selNode=null;this.fireEvent("selectionchange",this,null);}return n;},getSelectedNode:function(){return this.selNode;},isSelected:function(_8){return this.selNode==_8;},selectPrevious:function(){var s=this.selNode||this.lastSelNode;if(!s){return null;}var ps=s.previousSibling;if(ps){if(!ps.isExpanded()||ps.childNodes.length<1){return this.select(ps);}else{var lc=ps.lastChild;while(lc&&lc.isExpanded()&&lc.childNodes.length>0){lc=lc.lastChild;}return this.select(lc);}}else{if(s.parentNode&&(this.tree.rootVisible||!s.parentNode.isRoot)){return this.select(s.parentNode);}}return null;},selectNext:function(){var s=this.selNode||this.lastSelNode;if(!s){return null;}if(s.firstChild&&s.isExpanded()){return this.select(s.firstChild);}else{if(s.nextSibling){return this.select(s.nextSibling);}else{if(s.parentNode){var _d=null;s.parentNode.bubble(function(){if(this.nextSibling){_d=this.getOwnerTree().selModel.select(this.nextSibling);return false;}});return _d;}}}return null;},onKeyDown:function(e){var s=this.selNode||this.lastSelNode;var sm=this;if(!s){return;}var k=e.getKey();switch(k){case e.DOWN:e.stopEvent();this.selectNext();break;case e.UP:e.stopEvent();this.selectPrevious();break;case e.RIGHT:e.preventDefault();if(s.hasChildNodes()){if(!s.isExpanded()){s.expand();}else{if(s.firstChild){this.select(s.firstChild,e);}}}break;case e.LEFT:e.preventDefault();if(s.hasChildNodes()&&s.isExpanded()){s.collapse();}else{if(s.parentNode&&(this.tree.rootVisible||s.parentNode!=this.tree.getRootNode())){this.select(s.parentNode,e);}}break;}}});Ext.tree.MultiSelectionModel=function(){this.selNodes=[];this.selMap={};this.addEvents({"selectionchange":true});};Ext.extend(Ext.tree.MultiSelectionModel,Ext.util.Observable,{init:function(_12){this.tree=_12;_12.el.on("keydown",this.onKeyDown,this);_12.on("click",this.onNodeClick,this);},onNodeClick:function(_13,e){this.select(_13,e,e.ctrlKey);},select:function(_15,e,_17){if(_17!==true){this.clearSelections(true);}if(this.isSelected(_15)){this.lastSelNode=_15;return _15;}this.selNodes.push(_15);this.selMap[_15.id]=_15;this.lastSelNode=_15;_15.ui.onSelectedChange(true);this.fireEvent("selectionchange",this,this.selNodes);return _15;},unselect:function(_18){if(this.selMap[_18.id]){_18.ui.onSelectedChange(false);var sn=this.selNodes;var _1a=-1;if(sn.indexOf){_1a=sn.indexOf(_18);}else{for(var i=0,len=sn.length;i0){for(var i=0,len=sn.length;i
      ","",this.indentMarkup,"","","","",n.text,"
      ","
        ",""];if(_25!==true&&n.nextSibling&&n.nextSibling.ui.getEl()){this.wrap=Ext.DomHelper.insertHtml("beforeBegin",n.nextSibling.ui.getEl(),buf.join(""));}else{this.wrap=Ext.DomHelper.insertHtml("beforeEnd",_27,buf.join(""));}this.elNode=this.wrap.childNodes[0];this.ctNode=this.wrap.childNodes[1];var cs=this.elNode.childNodes;this.indentNode=cs[0];this.ecNode=cs[1];this.iconNode=cs[2];this.anchor=cs[3];this.textNode=cs[3].firstChild;if(a.qtip){if(this.textNode.setAttributeNS){this.textNode.setAttributeNS("ext","qtip",a.qtip);if(a.qtipTitle){this.textNode.setAttributeNS("ext","qtitle",a.qtipTitle);}}else{this.textNode.setAttribute("ext:qtip",a.qtip);if(a.qtipTitle){this.textNode.setAttribute("ext:qtitle",a.qtipTitle);}}}this.initEvents();if(!this.node.expanded){this.updateExpandIcon();}}else{if(_25===true){_27.appendChild(this.wrap);}}},getAnchor:function(){return this.anchor;},getTextEl:function(){return this.textNode;},getIconEl:function(){return this.iconNode;},updateExpandIcon:function(){if(this.rendered){var n=this.node,c1,c2;var cls=n.isLast()?"x-tree-elbow-end":"x-tree-elbow";var _2f=n.hasChildNodes();if(_2f){if(n.expanded){cls+="-minus";c1="x-tree-node-collapsed";c2="x-tree-node-expanded";}else{cls+="-plus";c1="x-tree-node-expanded";c2="x-tree-node-collapsed";}if(this.wasLeaf){this.removeClass("x-tree-node-leaf");this.wasLeaf=false;}if(this.c1!=c1||this.c2!=c2){Ext.fly(this.elNode).replaceClass(c1,c2);this.c1=c1;this.c2=c2;}}else{if(!this.wasLeaf){Ext.fly(this.elNode).replaceClass("x-tree-node-expanded","x-tree-node-leaf");this.wasLeaf=true;}}var ecc="x-tree-ec-icon "+cls;if(this.ecc!=ecc){this.ecNode.className=ecc;this.ecc=ecc;}}},getChildIndent:function(){if(!this.childIndent){var buf=[];var p=this.node;while(p){if(!p.isRoot||(p.isRoot&&p.ownerTree.rootVisible)){if(!p.isLast()){buf.unshift("");}else{buf.unshift("");}}p=p.parentNode;}this.childIndent=buf.join("");}return this.childIndent;},renderIndent:function(){if(this.rendered){var _33="";var p=this.node.parentNode;if(p){_33=p.ui.getChildIndent();}if(this.indentMarkup!=_33){this.indentNode.innerHTML=_33;this.indentMarkup=_33;}this.updateExpandIcon();}}};Ext.tree.RootTreeNodeUI=function(){Ext.tree.RootTreeNodeUI.superclass.constructor.apply(this,arguments);};Ext.extend(Ext.tree.RootTreeNodeUI,Ext.tree.TreeNodeUI,{render:function(){if(!this.rendered){var _35=this.node.ownerTree.container.dom;this.node.expanded=true;_35.innerHTML="
        ";this.wrap=this.ctNode=_35.firstChild;}},collapse:function(){},expand:function(){}}); + +Ext.tree.TreeLoader=function(_1){this.baseParams={};this.requestMethod="POST";Ext.apply(this,_1);this.addEvents({"beforeload":true,"load":true,"loadexception":true});};Ext.extend(Ext.tree.TreeLoader,Ext.util.Observable,{uiProviders:{},clearOnLoad:true,load:function(_2,_3){if(this.clearOnLoad){while(_2.firstChild){_2.removeChild(_2.firstChild);}}if(_2.attributes.children){var cs=_2.attributes.children;for(var i=0,_6=cs.length;i<_6;i++){_2.appendChild(this.createNode(cs[i]));}if(typeof _3=="function"){_3();}}else{if(this.dataUrl){this.requestData(_2,_3);}}},getParams:function(_7){var _8=[],bp=this.baseParams;for(var _a in bp){if(typeof bp[_a]!="function"){_8.push(encodeURIComponent(_a),"=",encodeURIComponent(bp[_a]),"&");}}_8.push("node=",encodeURIComponent(_7.id));return _8.join("");},requestData:function(_b,_c){if(this.fireEvent("beforeload",this,_b,_c)!==false){var _d=this.getParams(_b);var cb={success:this.handleResponse,failure:this.handleFailure,scope:this,argument:{callback:_c,node:_b}};this.transId=Ext.lib.Ajax.request(this.requestMethod,this.dataUrl,cb,_d);}else{if(typeof _c=="function"){_c();}}},isLoading:function(){return this.transId?true:false;},abort:function(){if(this.isLoading()){Ext.lib.Ajax.abort(this.transId);}},createNode:function(_f){if(this.applyLoader!==false){_f.loader=this;}if(typeof _f.uiProvider=="string"){_f.uiProvider=this.uiProviders[_f.uiProvider]||eval(_f.uiProvider);}return (_f.leaf?new Ext.tree.TreeNode(_f):new Ext.tree.AsyncTreeNode(_f));},processResponse:function(_10,_11,_12){var _13=_10.responseText;try{var o=eval("("+_13+")");for(var i=0,len=o.length;iv2){return _3?-1:+1;}else{return 0;}}};};Ext.tree.TreeSorter.prototype={doSort:function(_d){_d.sort(this.sortFn);},compareNodes:function(n1,n2){return (n1.text.toUpperCase()>n2.text.toUpperCase()?1:-1);},updateSort:function(_10,_11){if(_11.childrenRendered){this.doSort.defer(1,this,[_11]);}}}; + +if(Ext.dd.DropZone){Ext.tree.TreeDropZone=function(_1,_2){this.allowParentInsert=false;this.allowContainerDrop=false;this.appendOnly=false;Ext.tree.TreeDropZone.superclass.constructor.call(this,_1.container,_2);this.tree=_1;this.lastInsertClass="x-tree-no-status";this.dragOverData={};};Ext.extend(Ext.tree.TreeDropZone,Ext.dd.DropZone,{ddGroup:"TreeDD",expandDelay:1000,expandNode:function(_3){if(_3.hasChildNodes()&&!_3.isExpanded()){_3.expand(false,null,this.triggerCacheRefresh.createDelegate(this));}},queueExpand:function(_4){this.expandProcId=this.expandNode.defer(this.expandDelay,this,[_4]);},cancelExpand:function(){if(this.expandProcId){clearTimeout(this.expandProcId);this.expandProcId=false;}},isValidDropPoint:function(n,pt,dd,e,_9){if(!n||!_9){return false;}var _a=n.node;var _b=_9.node;if(!(_a&&_a.isTarget&&pt)){return false;}if(pt=="append"&&_a.allowChildren===false){return false;}if((pt=="above"||pt=="below")&&(_a.parentNode&&_a.parentNode.allowChildren===false)){return false;}if(_b&&(_a==_b||_b.contains(_a))){return false;}var _c=this.dragOverData;_c.tree=this.tree;_c.target=_a;_c.data=_9;_c.point=pt;_c.source=dd;_c.rawEvent=e;_c.dropNode=_b;_c.cancel=false;var _d=this.tree.fireEvent("nodedragover",_c);return _c.cancel===false&&_d!==false;},getDropPoint:function(e,n,dd){var tn=n.node;if(tn.isRoot){return tn.allowChildren!==false?"append":false;}var _12=n.ddel;var t=Ext.lib.Dom.getY(_12),b=t+_12.offsetHeight;var y=Ext.lib.Event.getPageY(e);var _16=tn.allowChildren===false||tn.isLeaf();if(this.appendOnly||tn.parentNode.allowChildren===false){return _16?false:"append";}var _17=false;if(!this.allowParentInsert){_17=tn.hasChildNodes()&&tn.isExpanded();}var q=(b-t)/(_16?2:3);if(y>=t&&y<(t+q)){return "above";}else{if(!_17&&(_16||y>=b-q&&y<=b)){return "below";}else{return "append";}}},onNodeEnter:function(n,dd,e,_1c){this.cancelExpand();},onNodeOver:function(n,dd,e,_20){var pt=this.getDropPoint(e,n,dd);var _22=n.node;if(!this.expandProcId&&pt=="append"&&_22.hasChildNodes()&&!n.node.isExpanded()){this.queueExpand(_22);}else{if(pt!="append"){this.cancelExpand();}}var _23=this.dropNotAllowed;if(this.isValidDropPoint(n,pt,dd,e,_20)){if(pt){var el=n.ddel;var cls;if(pt=="above"){_23=n.node.isFirst()?"x-tree-drop-ok-above":"x-tree-drop-ok-between";cls="x-tree-drag-insert-above";}else{if(pt=="below"){_23=n.node.isLast()?"x-tree-drop-ok-below":"x-tree-drop-ok-between";cls="x-tree-drag-insert-below";}else{_23="x-tree-drop-ok-append";cls="x-tree-drag-append";}}if(this.lastInsertClass!=cls){Ext.fly(el).replaceClass(this.lastInsertClass,cls);this.lastInsertClass=cls;}}}return _23;},onNodeOut:function(n,dd,e,_29){this.cancelExpand();this.removeDropIndicators(n);},onNodeDrop:function(n,dd,e,_2d){var _2e=this.getDropPoint(e,n,dd);var _2f=n.node;_2f.ui.startDrop();if(!this.isValidDropPoint(n,_2e,dd,e,_2d)){_2f.ui.endDrop();return false;}var _30=_2d.node||(dd.getTreeNode?dd.getTreeNode(_2d,_2f,_2e,e):null);var _31={tree:this.tree,target:_2f,data:_2d,point:_2e,source:dd,rawEvent:e,dropNode:_30,cancel:!_30};var _32=this.tree.fireEvent("beforenodedrop",_31);if(_32===false||_31.cancel===true||!_31.dropNode){_2f.ui.endDrop();return false;}_2f=_31.target;if(_2e=="append"&&!_2f.isExpanded()){_2f.expand(false,null,function(){this.completeDrop(_31);}.createDelegate(this));}else{this.completeDrop(_31);}return true;},completeDrop:function(de){var ns=de.dropNode,p=de.point,t=de.target;if(!(ns instanceof Array)){ns=[ns];}var n;for(var i=0,len=ns.length;ind.offsetLeft){td.scrollLeft=nd.offsetLeft;}var w=Math.min(this.maxWidth,(td.clientWidth>20?td.clientWidth:td.offsetWidth)-Math.max(0,nd.offsetLeft-td.scrollLeft)-5);this.setSize(w,"");},triggerEdit:function(_9){this.completeEdit();this.editNode=_9;this.startEdit(_9.ui.textNode,_9.text);},bindScroll:function(){this.tree.el.on("scroll",this.cancelEdit,this);},beforeNodeClick:function(_a){if(this.tree.getSelectionModel().isSelected(_a)){this.triggerEdit(_a);return false;}},updateNode:function(ed,_c){this.tree.el.un("scroll",this.cancelEdit,this);this.editNode.setText(_c);},onSpecialKey:function(_d,e){var k=e.getKey();if(k==e.ESC){this.cancelEdit();e.stopEvent();}else{if(k==e.ENTER&&!e.hasModifier()){this.completeEdit();e.stopEvent();}}}}); + +Ext.menu.Menu=function(_1){Ext.apply(this,_1);this.id=this.id||Ext.id();this.addEvents({beforeshow:true,beforehide:true,show:true,hide:true,click:true,mouseover:true,mouseout:true,itemclick:true});Ext.menu.MenuMgr.register(this);var _2=this.items;this.items=new Ext.util.MixedCollection();if(_2){this.add.apply(this,_2);}};Ext.extend(Ext.menu.Menu,Ext.util.Observable,{minWidth:120,shadow:"sides",subMenuAlign:"tl-tr?",defaultAlign:"tl-bl?",allowOtherMenus:false,render:function(){if(this.el){return;}var el=this.el=new Ext.Layer({cls:"x-menu",shadow:this.shadow,constrain:false,parentEl:this.parentEl||document.body,zindex:15000});this.keyNav=new Ext.menu.MenuNav(this);if(this.plain){el.addClass("x-menu-plain");}if(this.cls){el.addClass(this.cls);}this.focusEl=el.createChild({tag:"a",cls:"x-menu-focus",href:"#",onclick:"return false;",tabIndex:"-1"});var ul=el.createChild({tag:"ul",cls:"x-menu-list"});ul.on("click",this.onClick,this);ul.on("mouseover",this.onMouseOver,this);ul.on("mouseout",this.onMouseOut,this);this.items.each(function(_5){var li=document.createElement("li");li.className="x-menu-list-item";ul.dom.appendChild(li);_5.render(li,this);},this);this.ul=ul;this.autoWidth();},autoWidth:function(){var el=this.el,ul=this.ul;if(!el){return;}var w=this.width;if(w){el.setWidth(w);}else{if(Ext.isIE){el.setWidth(this.minWidth);var t=el.dom.offsetWidth;el.setWidth(ul.getWidth()+el.getFrameWidth("lr"));}}},delayAutoWidth:function(){if(this.rendered){if(!this.awTask){this.awTask=new Ext.util.DelayedTask(this.autoWidth,this);}this.awTask.delay(20);}},findTargetItem:function(e){var t=e.getTarget(".x-menu-list-item",this.ul,true);if(t&&t.menuItemId){return this.items.get(t.menuItemId);}},onClick:function(e){var t;if(t=this.findTargetItem(e)){t.onClick(e);this.fireEvent("click",this,t,e);}},setActiveItem:function(_f,_10){if(_f!=this.activeItem){if(this.activeItem){this.activeItem.deactivate();}this.activeItem=_f;_f.activate(_10);}else{if(_10){_f.expandMenu();}}},tryActivate:function(_11,_12){var _13=this.items;for(var i=_11,len=_13.length;i>=0&&i0){hideAll();}});}function hideAll(){if(_2.length>0){var c=_2.clone();c.each(function(m){m.hide();});}}function onHide(m){_2.remove(m);if(_2.length<1){Ext.get(document).un("mousedown",onMouseDown);_4=false;}}function onShow(m){var _a=_2.last();_5=new Date();_2.add(m);if(!_4){Ext.get(document).on("mousedown",onMouseDown);_4=true;}if(m.parentMenu){m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"),10)+3);m.parentMenu.activeChild=m;}else{if(_a&&_a.isVisible()){m.getEl().setZIndex(parseInt(_a.getEl().getStyle("z-index"),10)+3);}}}function onBeforeHide(m){if(m.activeChild){m.activeChild.hide();}if(m.autoHideTimer){clearTimeout(m.autoHideTimer);delete m.autoHideTimer;}}function onBeforeShow(m){var pm=m.parentMenu;if(!pm&&!m.allowOtherMenus){hideAll();}else{if(pm&&pm.activeChild){pm.activeChild.hide();}}}function onMouseDown(e){if(_5.getElapsed()>50&&_2.length>0&&!e.getTarget(".x-menu")){hideAll();}}function onBeforeCheck(mi,_10){if(_10){var g=_3[mi.group];for(var i=0,l=g.length;i{1}",this.icon||Ext.BLANK_IMAGE_URL,this.text);this.el=el;Ext.menu.Item.superclass.onRender.call(this,_2,_3);},setText:function(_5){this.text=_5;if(this.rendered){this.el.update(String.format("{1}",this.icon||Ext.BLANK_IMAGE_URL,this.text));this.parentMenu.autoWidth();}},handleClick:function(e){if(!this.href){e.stopEvent();}Ext.menu.Item.superclass.handleClick.apply(this,arguments);},activate:function(_7){if(Ext.menu.Item.superclass.activate.apply(this,arguments)){this.focus();if(_7){this.expandMenu();}}return true;},shouldDeactivate:function(e){if(Ext.menu.Item.superclass.shouldDeactivate.call(this,e)){if(this.menu&&this.menu.isVisible()){return !this.menu.getEl().getRegion().contains(e.getPoint());}return true;}return false;},deactivate:function(){Ext.menu.Item.superclass.deactivate.apply(this,arguments);this.hideMenu();},expandMenu:function(_9){if(!this.disabled&&this.menu){if(!this.menu.isVisible()){this.menu.show(this.container,this.parentMenu.subMenuAlign||"tl-tr?",this.parentMenu);}if(_9){this.menu.tryActivate(0,1);}}},hideMenu:function(){if(this.menu&&this.menu.isVisible()){this.menu.hide();}}}); + +Ext.menu.CheckItem=function(_1){Ext.menu.CheckItem.superclass.constructor.call(this,_1);this.addEvents({"beforecheckchange":true,"checkchange":true});if(this.checkHandler){this.on("checkchange",this.checkHandler,this.scope);}};Ext.extend(Ext.menu.CheckItem,Ext.menu.Item,{itemCls:"x-menu-item x-menu-check-item",groupClass:"x-menu-group-item",checked:false,ctype:"Ext.menu.CheckItem",onRender:function(c){Ext.menu.CheckItem.superclass.onRender.apply(this,arguments);if(this.group){this.el.addClass(this.groupClass);}Ext.menu.MenuMgr.registerCheckable(this);if(this.checked){this.checked=false;this.setChecked(true,true);}},destroy:function(){if(this.rendered){Ext.menu.MenuMgr.unregisterCheckable(this);}Ext.menu.CheckItem.superclass.destroy.apply(this,arguments);},setChecked:function(_3,_4){if(this.checked!=_3&&this.fireEvent("beforecheckchange",this,_3)!==false){if(this.container){this.container[_3?"addClass":"removeClass"]("x-menu-item-checked");}this.checked=_3;if(_4!==true){this.fireEvent("checkchange",this,_3);}}},handleClick:function(e){if(!this.disabled&&!(this.checked&&this.group)){this.setChecked(!this.checked);}Ext.menu.CheckItem.superclass.handleClick.apply(this,arguments);}}); + +Ext.menu.Adapter=function(_1,_2){Ext.menu.Adapter.superclass.constructor.call(this,_2);this.component=_1;};Ext.extend(Ext.menu.Adapter,Ext.menu.BaseItem,{canActivate:true,onRender:function(_3,_4){this.component.render(_3);this.el=this.component.getEl();},activate:function(){if(this.disabled){return false;}this.component.focus();this.fireEvent("activate",this);return true;},deactivate:function(){this.fireEvent("deactivate",this);},disable:function(){this.component.disable();Ext.menu.Adapter.superclass.disable.call(this);},enable:function(){this.component.enable();Ext.menu.Adapter.superclass.enable.call(this);}}); + +Ext.menu.DateItem=function(_1){Ext.menu.DateItem.superclass.constructor.call(this,new Ext.DatePicker(_1),_1);this.picker=this.component;this.addEvents({select:true});this.picker.on("render",function(_2){_2.getEl().swallowEvent("click");_2.container.addClass("x-menu-date-item");});this.picker.on("select",this.onSelect,this);};Ext.extend(Ext.menu.DateItem,Ext.menu.Adapter,{onSelect:function(_3,_4){this.fireEvent("select",this,_4,_3);Ext.menu.DateItem.superclass.handleClick.call(this);}}); + +Ext.menu.ColorItem=function(_1){Ext.menu.ColorItem.superclass.constructor.call(this,new Ext.ColorPalette(_1),_1);this.palette=this.component;this.relayEvents(this.palette,["select"]);if(this.selectHandler){this.on("select",this.selectHandler,this.scope);}};Ext.extend(Ext.menu.ColorItem,Ext.menu.Adapter); + +Ext.menu.DateMenu=function(_1){Ext.menu.DateMenu.superclass.constructor.call(this,_1);this.plain=true;var di=new Ext.menu.DateItem(_1);this.add(di);this.picker=di.picker;this.relayEvents(di,["select"]);};Ext.extend(Ext.menu.DateMenu,Ext.menu.Menu); + +Ext.menu.ColorMenu=function(_1){Ext.menu.ColorMenu.superclass.constructor.call(this,_1);this.plain=true;var ci=new Ext.menu.ColorItem(_1);this.add(ci);this.palette=ci.palette;this.relayEvents(ci,["select"]);};Ext.extend(Ext.menu.ColorMenu,Ext.menu.Menu); + +Ext.form.Field=function(_1){Ext.form.Field.superclass.constructor.call(this,_1);this.addEvents({focus:true,blur:true,specialkey:true,change:true,invalid:true,valid:true});};Ext.extend(Ext.form.Field,Ext.Component,{invalidClass:"x-form-invalid",invalidText:"The value in this field is invalid",focusClass:"x-form-focus",validationEvent:"keyup",validateOnBlur:true,validationDelay:250,defaultAutoCreate:{tag:"input",type:"text",size:"20",autocomplete:"off"},fieldClass:"x-form-field",msgTarget:"qtip",msgFx:"normal",inputType:undefined,isFormField:true,hasFocus:false,value:undefined,getName:function(){return this.rendered&&this.el.dom.name?this.el.dom.name:(this.hiddenName||"");},applyTo:function(_2){this.target=_2;this.el=Ext.get(_2);this.render(this.el.dom.parentNode);return this;},onRender:function(ct,_4){if(this.el){this.el=Ext.get(this.el);if(!this.target){ct.dom.appendChild(this.el.dom);}}else{var _5=this.getAutoCreate();if(!_5.name){_5.name=this.name||this.id;}if(this.inputType){_5.type=this.inputType;}if(this.tabIndex!==undefined){_5.tabIndex=this.tabIndex;}this.el=ct.createChild(_5,_4);}var _6=this.el.dom.type;if(_6){if(_6=="password"){_6="text";}this.el.addClass("x-form-"+_6);}if(!this.customSize&&(this.width||this.height)){this.setSize(this.width||"",this.height||"");}if(this.readOnly){this.el.dom.readOnly=true;}this.el.addClass([this.fieldClass,this.cls]);this.initValue();},initValue:function(){if(this.value!==undefined){this.setValue(this.value);}else{if(this.el.dom.value.length>0){this.setValue(this.el.dom.value);}}},afterRender:function(){Ext.form.Field.superclass.afterRender.call(this);this.initEvents();},fireKey:function(e){if(e.isNavKeyPress()){this.fireEvent("specialkey",this,e);}},reset:function(){this.setValue(this.originalValue);this.clearInvalid();},initEvents:function(){this.el.on(Ext.isIE?"keydown":"keypress",this.fireKey,this);this.el.on("focus",this.onFocus,this);this.el.on("blur",this.onBlur,this);this.originalValue=this.getValue();},onFocus:function(){if(!Ext.isOpera){this.el.addClass(this.focusClass);}this.hasFocus=true;this.startValue=this.getValue();this.fireEvent("focus",this);},onBlur:function(){this.el.removeClass(this.focusClass);this.hasFocus=false;if(this.validationEvent!==false&&this.validateOnBlur&&this.validationEvent!="blur"){this.validate();}var v=this.getValue();if(v!=this.startValue){this.fireEvent("change",this,v,this.startValue);}this.fireEvent("blur",this);},setSize:function(w,h){if(!this.rendered||!this.el){this.width=w;this.height=h;return;}if(w){w=this.adjustWidth(this.el.dom.tagName,w);this.el.setWidth(w);}if(h){this.el.setHeight(h);}var h=this.el.dom.offsetHeight;},isValid:function(_b){if(this.disabled){return true;}var _c=this.preventMark;this.preventMark=_b===true;var v=this.validateValue(this.getRawValue());this.preventMark=_c;return v;},validate:function(){if(this.disabled||this.validateValue(this.getRawValue())){this.clearInvalid();return true;}return false;},validateValue:function(_e){return true;},markInvalid:function(_f){if(!this.rendered||this.preventMark){return;}this.el.addClass(this.invalidClass);_f=_f||this.invalidText;switch(this.msgTarget){case "qtip":this.el.dom.qtip=_f;this.el.dom.qclass="x-form-invalid-tip";break;case "title":this.el.dom.title=_f;break;case "under":if(!this.errorEl){var elp=this.el.findParent(".x-form-element",5,true);this.errorEl=elp.createChild({cls:"x-form-invalid-msg"});this.errorEl.setWidth(elp.getWidth(true)-20);}this.errorEl.update(_f);Ext.form.Field.msgFx[this.msgFx].show(this.errorEl,this);break;case "side":if(!this.errorIcon){var elp=this.el.findParent(".x-form-element",5,true);this.errorIcon=elp.createChild({cls:"x-form-invalid-icon"});}this.alignErrorIcon();this.errorIcon.dom.qtip=_f;this.errorIcon.dom.qclass="x-form-invalid-tip";this.errorIcon.show();break;default:var t=Ext.getDom(this.msgTarget);t.innerHTML=_f;t.style.display=this.msgDisplay;break;}this.fireEvent("invalid",this,_f);},alignErrorIcon:function(){this.errorIcon.alignTo(this.el,"tl-tr",[2,0]);},clearInvalid:function(){if(!this.rendered||this.preventMark){return;}this.el.removeClass(this.invalidClass);switch(this.msgTarget){case "qtip":this.el.dom.qtip="";break;case "title":this.el.dom.title="";break;case "under":if(this.errorEl){Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl,this);}break;case "side":if(this.errorIcon){this.errorIcon.dom.qtip="";this.errorIcon.hide();}break;default:var t=Ext.getDom(this.msgTarget);t.innerHTML="";t.style.display="none";break;}this.fireEvent("valid",this);},getRawValue:function(){return this.el.getValue();},getValue:function(){var v=this.el.getValue();if(v==this.emptyText||v===undefined){v="";}return v;},setRawValue:function(v){return this.el.dom.value=v;},setValue:function(v){this.value=v;if(this.rendered){this.el.dom.value=v;this.validate();}},adjustWidth:function(tag,w){tag=tag.toLowerCase();if(typeof w=="number"&&Ext.isStrict&&!Ext.isSafari){if(Ext.isIE&&(tag=="input"||tag=="textarea")){if(tag=="input"){return w+2;}if(tag="textarea"){return w-2;}}else{if(Ext.isGecko&&tag=="textarea"){return w-6;}else{if(Ext.isOpera){if(tag=="input"){return w+2;}if(tag="textarea"){return w-2;}}}}}return w;}});Ext.form.Field.msgFx={normal:{show:function(_18,f){_18.setDisplayed("block");},hide:function(_1a,f){_1a.setDisplayed(false).update("");}},slide:{show:function(_1c,f){_1c.slideIn("t",{stopFx:true});},hide:function(_1e,f){_1e.slideOut("t",{stopFx:true,useDisplay:true});}},slideRight:{show:function(_20,f){_20.fixDisplay();_20.alignTo(f.el,"tl-tr");_20.slideIn("l",{stopFx:true});},hide:function(_22,f){_22.slideOut("l",{stopFx:true,useDisplay:true});}}}; + +Ext.form.TextField=function(_1){Ext.form.TextField.superclass.constructor.call(this,_1);this.addEvents({autosize:true});};Ext.extend(Ext.form.TextField,Ext.form.Field,{grow:false,growMin:30,growMax:800,vtype:null,maskRe:null,disableKeyFilter:false,allowBlank:true,minLength:0,maxLength:Number.MAX_VALUE,minLengthText:"The minimum length for this field is {0}",maxLengthText:"The maximum length for this field is {0}",selectOnFocus:false,blankText:"This field is required",validator:null,regex:null,regexText:"",emptyText:null,emptyClass:"x-form-empty-field",initEvents:function(){Ext.form.TextField.superclass.initEvents.call(this);if(this.validationEvent=="keyup"){this.validationTask=new Ext.util.DelayedTask(this.validate,this);this.el.on("keyup",this.filterValidation,this);}else{if(this.validationEvent!==false){this.el.on(this.validationEvent,this.validate,this,{buffer:this.validationDelay});}}if(this.selectOnFocus||this.emptyText){this.on("focus",this.preFocus,this);if(this.emptyText){this.on("blur",this.postBlur,this);this.applyEmptyText();}}if(this.maskRe||(this.vtype&&this.disableKeyFilter!==true&&(this.maskRe=Ext.form.VTypes[this.vtype+"Mask"]))){this.el.on("keypress",this.filterKeys,this);}if(this.grow){this.el.on("keyup",this.onKeyUp,this,{buffer:50});this.el.on("click",this.autoSize,this);}},filterValidation:function(e){if(!e.isNavKeyPress()){this.validationTask.delay(this.validationDelay);}},onKeyUp:function(e){if(!e.isNavKeyPress()){this.autoSize();}},reset:function(){Ext.form.TextField.superclass.reset.call(this);this.applyEmptyText();},applyEmptyText:function(){if(this.rendered&&this.emptyText&&this.getRawValue().length<1){this.setRawValue(this.emptyText);this.el.addClass(this.emptyClass);}},preFocus:function(){if(this.emptyText){if(this.getRawValue()==this.emptyText){this.setRawValue("");}this.el.removeClass(this.emptyClass);}if(this.selectOnFocus){this.el.dom.select();}},postBlur:function(){this.applyEmptyText();},filterKeys:function(e){var k=e.getKey();if(!Ext.isIE&&(e.isNavKeyPress()||k==e.BACKSPACE||(k==e.DELETE&&e.button==-1))){return;}var c=e.getCharCode();if(!this.maskRe.test(String.fromCharCode(c)||"")){e.stopEvent();}},setValue:function(v){if(this.emptyText&&v!==undefined&&v!==null&&v!==""){this.el.removeClass(this.emptyClass);}Ext.form.TextField.superclass.setValue.apply(this,arguments);},validateValue:function(_8){if(_8.length<1||_8===this.emptyText){if(this.allowBlank){this.clearInvalid();return true;}else{this.markInvalid(this.blankText);return false;}}if(_8.lengththis.maxLength){this.markInvalid(String.format(this.maxLengthText,this.maxLength));return false;}if(this.vtype){var vt=Ext.form.VTypes;if(!vt[this.vtype](_8)){this.markInvalid(this.vtypeText||vt[this.vtype+"Text"]);return false;}}if(typeof this.validator=="function"){var _a=this.validator(_8);if(_a!==true){this.markInvalid(_a);return false;}}if(this.regex&&!this.regex.test(_8)){this.markInvalid(this.regexText);return false;}return true;},selectText:function(_b,_c){var v=this.getRawValue();if(v.length>0){_b=_b===undefined?0:_b;_c=_c===undefined?v.length:_c;var d=this.el.dom;if(d.setSelectionRange){d.setSelectionRange(_b,_c);}else{if(d.createTextRange){var _f=d.createTextRange();_f.moveStart("character",_b);_f.moveEnd("character",v.length-_c);_f.select();}}}},autoSize:function(){if(!this.grow||!this.rendered){return;}if(!this.metrics){this.metrics=Ext.util.TextMetrics.createInstance(this.el);}var el=this.el;var v=el.dom.value+" ";var w=Math.min(this.growMax,Math.max(this.metrics.getWidth(v)+10,this.growMin));this.el.setWidth(w);this.fireEvent("autosize",this,w);}}); + +Ext.form.TriggerField=function(_1){Ext.form.TriggerField.superclass.constructor.call(this,_1);this.mimicing=false;this.on("disable",this.disableWrapper,this);this.on("enable",this.enableWrapper,this);};Ext.extend(Ext.form.TriggerField,Ext.form.TextField,{defaultAutoCreate:{tag:"input",type:"text",size:"16",autocomplete:"off"},hideTrigger:false,autoSize:Ext.emptyFn,monitorTab:true,customSize:true,setSize:function(w,h){if(!this.wrap){this.width=w;this.height=h;return;}if(w){var _4=w;w=w-this.trigger.getWidth();Ext.form.TriggerField.superclass.setSize.call(this,w,h);this.wrap.setWidth(_4);if(this.onResize){this.onResize(_4,h);}}else{Ext.form.TriggerField.superclass.setSize.call(this,w,h);this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth());}},alignErrorIcon:function(){this.errorIcon.alignTo(this.wrap,"tl-tr",[2,0]);},onRender:function(ct,_6){Ext.form.TriggerField.superclass.onRender.call(this,ct,_6);this.wrap=this.el.wrap({cls:"x-form-field-wrap"});this.trigger=this.wrap.createChild({tag:"img",src:Ext.BLANK_IMAGE_URL,cls:"x-form-trigger "+this.triggerClass});this.trigger.on("click",this.onTriggerClick,this,{preventDefault:true});this.trigger.addClassOnOver("x-form-trigger-over");this.trigger.addClassOnClick("x-form-trigger-click");if(this.hideTrigger){this.trigger.setDisplayed(false);}this.setSize(this.width||"",this.height||"");},onDestroy:function(){if(this.trigger){this.trigger.removeAllListeners();this.trigger.remove();}if(this.wrap){this.wrap.remove();}Ext.form.TriggerField.superclass.onDestroy.call(this);},onFocus:function(){Ext.form.TriggerField.superclass.onFocus.call(this);if(!this.mimicing){this.mimicing=true;Ext.get(Ext.isIE?document.body:document).on("mousedown",this.mimicBlur,this);if(this.monitorTab){this.el.on("keydown",this.checkTab,this);}}},checkTab:function(e){if(e.getKey()==e.TAB){this.triggerBlur();}},onBlur:function(){},mimicBlur:function(e,t){if(!this.wrap.contains(t)&&this.validateBlur()){this.triggerBlur();}},triggerBlur:function(){this.mimicing=false;Ext.get(Ext.isIE?document.body:document).un("mousedown",this.mimicBlur);if(this.monitorTab){this.el.un("keydown",this.checkTab,this);}Ext.form.TriggerField.superclass.onBlur.call(this);},validateBlur:function(e,t){return true;},disableWrapper:function(){if(this.wrap){this.wrap.addClass("x-item-disabled");}},enableWrapper:function(){if(this.wrap){this.wrap.removeClass("x-item-disabled");}},onShow:function(){if(this.wrap){this.wrap.dom.style.display="";this.wrap.dom.style.visibility="visible";}},onHide:function(){this.wrap.dom.style.display="none";},onTriggerClick:Ext.emptyFn}); + +Ext.form.TextArea=function(_1){Ext.form.TextArea.superclass.constructor.call(this,_1);if(this.minHeight!==undefined){this.growMin=this.minHeight;}if(this.maxHeight!==undefined){this.growMax=this.maxHeight;}};Ext.extend(Ext.form.TextArea,Ext.form.TextField,{growMin:60,growMax:1000,preventScrollbars:false,onRender:function(ct,_3){if(!this.el){this.defaultAutoCreate={tag:"textarea",style:"width:300px;height:60px;",autocomplete:"off"};}Ext.form.TextArea.superclass.onRender.call(this,ct,_3);if(this.grow){this.textSizeEl=Ext.DomHelper.append(document.body,{tag:"pre",cls:"x-form-grow-sizer"});if(this.preventScrollbars){this.el.setStyle("overflow","hidden");}this.el.setHeight(this.growMin);}},onKeyUp:function(e){if(!e.isNavKeyPress()||e.getKey()==e.ENTER){this.autoSize();}},autoSize:function(){if(!this.grow||!this.textSizeEl){return;}var el=this.el;var v=el.dom.value;var ts=this.textSizeEl;Ext.fly(ts).setWidth(this.el.getWidth());if(v.length<1){v="  ";}else{v+=" \n ";}if(Ext.isIE){v=v.replace(/\n/g,"
        ");}ts.innerHTML=v;var h=Math.min(this.growMax,Math.max(ts.offsetHeight,this.growMin));if(h!=this.lastHeight){this.lastHeight=h;this.el.setHeight(h);this.fireEvent("autosize",this,h);}},setValue:function(v){Ext.form.TextArea.superclass.setValue.call(this,v);this.autoSize();}}); + +Ext.form.NumberField=function(_1){Ext.form.NumberField.superclass.constructor.call(this,_1);};Ext.extend(Ext.form.NumberField,Ext.form.TextField,{fieldClass:"x-form-field x-form-num-field",allowDecimals:true,decimalSeparator:".",decimalPrecision:2,allowNegative:true,minValue:Number.NEGATIVE_INFINITY,maxValue:Number.MAX_VALUE,minText:"The minimum value for this field is {0}",maxText:"The maximum value for this field is {0}",nanText:"{0} is not a valid number",initEvents:function(){Ext.form.NumberField.superclass.initEvents.call(this);var _2="0123456789";if(this.allowDecimals){_2+=this.decimalSeparator;}if(this.allowNegative){_2+="-";}var _3=function(e){var k=e.getKey();if(!Ext.isIE&&(e.isNavKeyPress()||k==e.BACKSPACE||(k==e.DELETE&&e.button==-1))){return;}var c=e.getCharCode();if(_2.indexOf(String.fromCharCode(c))===-1){e.stopEvent();}};this.el.on("keypress",_3,this);},validateValue:function(_7){if(!Ext.form.NumberField.superclass.validateValue.call(this,_7)){return false;}if(_7.length<1){return true;}_7=String(_7).replace(this.decimalSeparator,".");if(isNaN(_7)){this.markInvalid(String.format(this.nanText,_7));return false;}var _8=this.parseValue(_7);if(_8this.maxValue){this.markInvalid(String.format(this.maxText,this.maxValue));return false;}return true;},parseValue:function(_9){return parseFloat(String(_9).replace(this.decimalSeparator,"."));},fixPrecision:function(_a){if(!this.allowDecimals||this.decimalPrecision==-1||isNaN(_a)||_a==0||!_a){return _a;}var _b=Math.pow(10,this.decimalPrecision+1);var _c=this.decimalPrecisionFcn(_a*_b);_c=this.decimalPrecisionFcn(_c/10);return _c/(_b/10);},decimalPrecisionFcn:function(v){return Math.floor(v);}}); + +Ext.form.DateField=function(_1){Ext.form.DateField.superclass.constructor.call(this,_1);if(typeof this.minValue=="string"){this.minValue=this.parseDate(this.minValue);}if(typeof this.maxValue=="string"){this.maxValue=this.parseDate(this.maxValue);}this.ddMatch=null;if(this.disabledDates){var dd=this.disabledDates;var re="(?:";for(var i=0;ithis.maxValue.getTime()){this.markInvalid(String.format(this.maxText,this.formatDate(this.maxValue)));return false;}if(this.disabledDays){var _8=_5.getDay();for(var i=0;i{"+this.displayField+"}";}this.view=new Ext.View(this.innerList,this.tpl,{singleSelect:true,store:this.store,selectedClass:this.selectedClass});this.view.on("click",this.onViewClick,this);this.store.on("beforeload",this.onBeforeLoad,this);this.store.on("load",this.onLoad,this);this.store.on("loadexception",this.collapse,this);if(this.resizable){this.resizer=new Ext.Resizable(this.list,{pinned:true,handles:"se"});this.resizer.on("resize",function(r,w,h){this.maxHeight=h-this.handleHeight-this.list.getFrameWidth("tb")-this.assetHeight;this.listWidth=w;this.restrictHeight();},this);this[this.pageSize?"footer":"innerList"].setStyle("margin-bottom",this.handleHeight+"px");}if(!this.editable){this.editable=true;this.setEditable(false);}},initEvents:function(){Ext.form.ComboBox.superclass.initEvents.call(this);this.keyNav=new Ext.KeyNav(this.el,{"up":function(e){this.inKeyMode=true;this.selectPrev();},"down":function(e){if(!this.isExpanded()){this.onTriggerClick();}else{this.inKeyMode=true;this.selectNext();}},"enter":function(e){this.onViewClick();},"esc":function(e){this.collapse();},"tab":function(e){this.onViewClick(false);return true;},scope:this,doRelay:function(foo,bar,_16){if(_16=="down"||this.scope.isExpanded()){return Ext.KeyNav.prototype.doRelay.apply(this,arguments);}return true;}});this.queryDelay=Math.max(this.queryDelay||10,this.mode=="local"?10:250);this.dqTask=new Ext.util.DelayedTask(this.initQuery,this);if(this.typeAhead){this.taTask=new Ext.util.DelayedTask(this.onTypeAhead,this);}if(this.editable!==false){this.el.on("keyup",this.onKeyUp,this);}if(this.forceSelection){this.on("blur",this.doForce,this);}},onDestroy:function(){if(this.view){this.view.setStore(null);this.view.el.removeAllListeners();this.view.el.remove();this.view.purgeListeners();}if(this.list){this.list.destroy();}if(this.store){this.store.un("beforeload",this.onBeforeLoad,this);this.store.un("load",this.onLoad,this);this.store.un("loadexception",this.collapse,this);}Ext.form.ComboBox.superclass.onDestroy.call(this);},fireKey:function(e){if(e.isNavKeyPress()&&!this.list.isVisible()){this.fireEvent("specialkey",this,e);}},onResize:function(w,h){if(this.list&&this.listWidth===undefined){this.list.setWidth(Math.max(w,this.minListWidth));}},setEditable:function(_1a){if(_1a==this.editable){return;}this.editable=_1a;if(!_1a){this.el.dom.setAttribute("readOnly",true);this.el.on("mousedown",this.onTriggerClick,this);this.el.addClass("x-combo-noedit");}else{this.el.dom.setAttribute("readOnly",false);this.el.un("mousedown",this.onTriggerClick,this);this.el.removeClass("x-combo-noedit");}},onBeforeLoad:function(){if(!this.hasFocus){return;}this.innerList.update(this.loadingText?"
        "+this.loadingText+"
        ":"");this.restrictHeight();this.selectedIndex=-1;},onLoad:function(){if(!this.hasFocus){return;}if(this.store.getCount()>0){this.expand();this.restrictHeight();if(this.lastQuery==this.allQuery){if(this.editable){this.el.dom.select();}if(!this.selectByValue(this.value,true)){this.select(0,true);}}else{this.selectNext();if(this.typeAhead&&this.lastKey!=Ext.EventObject.BACKSPACE&&this.lastKey!=Ext.EventObject.DELETE){this.taTask.delay(this.typeAheadDelay);}}}else{this.onEmptyResults();}},onTypeAhead:function(){if(this.store.getCount()>0){var r=this.store.getAt(0);var _1c=r.data[this.displayField];var len=_1c.length;var _1e=this.getRawValue().length;if(_1e!=len){this.setRawValue(_1c);this.selectText(_1e,_1c.length);}}},onSelect:function(_1f,_20){if(this.fireEvent("beforeselect",this,_1f,_20)!==false){this.setValue(_1f.data[this.valueField||this.displayField]);this.collapse();this.fireEvent("select",this,_1f,_20);}},getValue:function(){if(this.valueField){return typeof this.value!="undefined"?this.value:"";}else{return Ext.form.ComboBox.superclass.getValue.call(this);}},clearValue:function(){if(this.hiddenField){this.hiddenField.value="";}this.setRawValue("");this.lastSelectionText="";},setValue:function(v){var _22=v;if(this.valueField){var r=this.findRecord(this.valueField,v);if(r){_22=r.data[this.displayField];}else{if(this.valueNotFoundText){_22=this.valueNotFoundText;}}}this.lastSelectionText=_22;if(this.hiddenField){this.hiddenField.value=v;}Ext.form.ComboBox.superclass.setValue.call(this,_22);this.value=v;},findRecord:function(_24,_25){var _26;if(this.store.getCount()>0){this.store.each(function(r){if(r.data[_24]==_25){_26=r;return false;}});}return _26;},onViewMove:function(e,t){this.inKeyMode=false;},onViewOver:function(e,t){if(this.inKeyMode){return;}var _2c=this.view.findItemFromChild(t);if(_2c){var _2d=this.view.indexOf(_2c);this.select(_2d,false);}},onViewClick:function(_2e){var _2f=this.view.getSelectedIndexes()[0];var r=this.store.getAt(_2f);if(r){this.onSelect(r,_2f);}if(_2e!==false){this.el.focus();}},restrictHeight:function(){this.innerList.dom.style.height="";var _31=this.innerList.dom;var h=Math.max(_31.clientHeight,_31.offsetHeight,_31.scrollHeight);this.innerList.setHeight(h0){if(this.selectedIndex==-1){this.select(0);}else{if(this.selectedIndex0){if(this.selectedIndex==-1){this.select(0);}else{if(this.selectedIndex!=0){this.select(this.selectedIndex-1);}}}},onKeyUp:function(e){if(this.editable!==false&&!e.isSpecialKey()){this.lastKey=e.getKey();this.dqTask.delay(this.queryDelay);}},validateBlur:function(){return !this.list||!this.list.isVisible();},initQuery:function(){this.doQuery(this.getRawValue());},doForce:function(){if(this.el.dom.value.length>0){this.el.dom.value=this.lastSelectionText===undefined?"":this.lastSelectionText;this.applyEmptyText();}},doQuery:function(q,_3d){if(q===undefined||q===null){q="";}var qe={query:q,forceAll:_3d,combo:this,cancel:false};if(this.fireEvent("beforequery",qe)===false||qe.cancel){return false;}q=qe.query;_3d=qe.forceAll;if(_3d===true||(q.length>=this.minChars)){if(this.lastQuery!=q){this.lastQuery=q;if(this.mode=="local"){this.selectedIndex=-1;if(_3d){this.store.clearFilter();}else{this.store.filter(this.displayField,q);}this.onLoad();}else{this.store.baseParams[this.queryParam]=q;this.store.load({params:this.getParams(q)});this.expand();}}else{this.selectedIndex=-1;this.onLoad();}}},getParams:function(q){var p={};if(this.pageSize){p.start=0;p.limit=this.pageSize;}return p;},collapse:function(){if(!this.isExpanded()){return;}this.list.hide();Ext.get(document).un("mousedown",this.collapseIf,this);this.fireEvent("collapse",this);},collapseIf:function(e){if(!e.within(this.wrap)&&!e.within(this.list)){this.collapse();}},expand:function(){if(this.isExpanded()||!this.hasFocus){return;}this.list.alignTo(this.el,this.listAlign);this.list.show();Ext.get(document).on("mousedown",this.collapseIf,this);this.fireEvent("expand",this);},onTriggerClick:function(){if(this.disabled){return;}if(this.isExpanded()){this.collapse();this.el.focus();}else{this.hasFocus=true;this.doQuery(this.triggerAction=="all"?this.doQuery(this.allQuery,true):this.doQuery(this.getRawValue()));this.el.focus();}}}); + +Ext.form.Checkbox=function(_1){Ext.form.Checkbox.superclass.constructor.call(this,_1);this.addEvents({check:true});};Ext.extend(Ext.form.Checkbox,Ext.form.Field,{focusClass:"x-form-check-focus",fieldClass:"x-form-field",checked:false,defaultAutoCreate:{tag:"input",type:"checkbox",autocomplete:"off"},boxLabel:undefined,setSize:function(w,h){if(!this.wrap){this.width=w;this.height=h;return;}this.wrap.setSize(w,h);if(!this.boxLabel){this.el.alignTo(this.wrap,"c-c");}},initEvents:function(){Ext.form.Checkbox.superclass.initEvents.call(this);this.el.on("click",this.onClick,this);this.el.on("change",this.onClick,this);},onRender:function(ct,_5){Ext.form.Checkbox.superclass.onRender.call(this,ct,_5);if(this.inputValue!==undefined){this.el.dom.value=this.inputValue;}this.wrap=this.el.wrap({cls:"x-form-check-wrap"});if(this.boxLabel){this.wrap.createChild({tag:"label",htmlFor:this.el.id,cls:"x-form-cb-label",html:this.boxLabel});}if(this.checked){this.setValue(true);}},initValue:Ext.emptyFn,getValue:function(){if(this.rendered){return this.el.dom.checked;}return false;},onClick:function(){if(this.el.dom.checked!=this.checked){this.setValue(this.el.dom.checked);}},setValue:function(v){this.checked=(v===true||v==="true"||v=="1");if(this.el&&this.el.dom){this.el.dom.checked=this.checked;}this.fireEvent("check",this,this.checked);}}); + +Ext.form.Radio=function(){Ext.form.Radio.superclass.constructor.apply(this,arguments);};Ext.extend(Ext.form.Radio,Ext.form.Checkbox,{inputType:"radio"}); + +Ext.form.BasicForm=function(el,_2){Ext.apply(this,_2);this.items=new Ext.util.MixedCollection(false,function(o){return o.id||(o.id=Ext.id());});this.addEvents({beforeaction:true,actionfailed:true,actioncomplete:true});if(el){this.initEl(el);}Ext.form.BasicForm.superclass.constructor.call(this);};Ext.extend(Ext.form.BasicForm,Ext.util.Observable,{timeout:30,activeAction:null,waitMsgTarget:undefined,initEl:function(el){this.el=Ext.get(el);this.id=this.el.id||Ext.id();this.el.on("submit",this.onSubmit,this);this.el.addClass("x-form");},onSubmit:function(e){e.stopEvent();},isValid:function(){var _6=true;this.items.each(function(f){if(!f.validate()){_6=false;}});return _6;},doAction:function(_8,_9){if(typeof _8=="string"){_8=new Ext.form.Action.ACTION_TYPES[_8](this,_9);}if(this.fireEvent("beforeaction",this,_8)!==false){this.beforeAction(_8);_8.run.defer(100,_8);}},submit:function(_a){this.doAction("submit",_a);},load:function(_b){this.doAction("load",_b);},updateRecord:function(_c){_c.beginEdit();var fs=_c.fields;fs.each(function(f){var _f=this.findField(f.name);if(_f){_c.set(f.name,_f.getValue());}},this);_c.endEdit();},beforeAction:function(_10){var o=_10.options;if(o.waitMsg){if(this.waitMsgTarget===true){this.el.mask(o.waitMsg,"x-mask-loading");}else{if(this.waitMsgTarget){this.waitMsgTarget=Ext.get(this.waitMsgTarget);this.waitMsgTarget.mask(o.waitMsg,"x-mask-loading");}else{Ext.MessageBox.wait(o.waitMsg,o.waitTitle||this.waitTitle||"Please Wait...");}}}},afterAction:function(_12,_13){this.activeAction=null;var o=_12.options;if(o.waitMsg){if(this.waitMsgTarget===true){this.el.unmask();}else{if(this.waitMsgTarget){this.waitMsgTarget.unmask();}else{Ext.MessageBox.updateProgress(1);Ext.MessageBox.hide();}}}if(_13){if(o.reset){this.reset();}Ext.callback(o.success,o.scope,[this,_12]);this.fireEvent("actioncomplete",this,_12);}else{Ext.callback(o.failure,o.scope,[this,_12]);this.fireEvent("actionfailed",this,_12);}},findField:function(id){var _16=this.items.get(id);if(!_16){this.items.each(function(f){if(f.isFormField&&(f.dataIndex==id||f.id==id||f.getName()==id)){_16=f;return false;}});}return _16||null;},markInvalid:function(_18){if(_18 instanceof Array){for(var i=0,len=_18.length;i1){this.add.apply(this,Array.prototype.slice.call(arguments,1));this.end();}return _3;},fieldset:function(c){var fs=new Ext.form.FieldSet(c);this.start(fs);if(arguments.length>1){this.add.apply(this,Array.prototype.slice.call(arguments,1));this.end();}return fs;},container:function(c){var l=new Ext.form.Layout(c);this.start(l);if(arguments.length>1){this.add.apply(this,Array.prototype.slice.call(arguments,1));this.end();}return l;},start:function(c){Ext.applyIf(c,{"labelAlign":this.active.labelAlign,"labelWidth":this.active.labelWidth,"itemCls":this.active.itemCls});this.active.stack.push(c);c.ownerCt=this.active;this.active=c;return this;},end:function(){if(this.active==this.root){return this;}this.active=this.active.ownerCt;return this;},add:function(){this.active.stack.push.apply(this.active.stack,arguments);var r=[];for(var i=0,a=arguments,_c=a.length;i<_c;i++){if(a[i].isFormField){r.push(a[i]);}}if(r.length>0){Ext.form.Form.superclass.add.apply(this,r);}return this;},render:function(ct){ct=Ext.get(ct);var o=this.autoCreate||{tag:"form",method:this.method||"POST",id:this.id||Ext.id()};this.initEl(ct.createChild(o));this.root.render(this.el);this.items.each(function(f){f.render("x-form-el-"+f.id);});if(this.buttons.length>0){var tb=this.el.createChild({cls:"x-form-btns-ct",cn:{cls:"x-form-btns x-form-btns-"+this.buttonAlign,html:"
        "}},null,true);var tr=tb.getElementsByTagName("tr")[0];for(var i=0,len=this.buttons.length;i0){if(!this.fieldTpl){var t=new Ext.Template("
        ","","
        ","
        ","
        ");t.disableFormats=true;t.compile();Ext.form.Layout.prototype.fieldTpl=t;}for(var i=0;i<_6;i++){if(_5[i].isFormField){this.renderField(_5[i]);}else{this.renderComponent(_5[i]);}}}if(this.clear){this.el.createChild({cls:"x-form-clear"});}},renderField:function(f){this.fieldTpl.append(this.el,[f.id,f.fieldLabel,f.labelStyle||this.labelStyle||"",this.elementStyle||"",typeof f.labelSeparator=="undefined"?this.labelSeparator:f.labelSeparator,f.itemCls||this.itemCls||""]);},renderComponent:function(c){c.render(this.el);}});Ext.form.Column=function(_b){Ext.form.Column.superclass.constructor.call(this,_b);};Ext.extend(Ext.form.Column,Ext.form.Layout,{defaultAutoCreate:{tag:"div",cls:"x-form-ct x-form-column"},onRender:function(ct,_d){Ext.form.Column.superclass.onRender.call(this,ct,_d);if(this.width){this.el.setWidth(this.width);}}});Ext.form.FieldSet=function(_e){Ext.form.FieldSet.superclass.constructor.call(this,_e);};Ext.extend(Ext.form.FieldSet,Ext.form.Layout,{defaultAutoCreate:{tag:"fieldset",cn:{tag:"legend"}},onRender:function(ct,_10){Ext.form.FieldSet.superclass.onRender.call(this,ct,_10);if(this.legend){this.setLegend(this.legend);}},setLegend:function(_11){if(this.rendered){this.el.child("legend").update(_11);}}}); + +Ext.form.VTypes=function(){var _1=/^[a-zA-Z_]+$/;var _2=/^[a-zA-Z0-9_]+$/;var _3=/^([\w]+)(.[\w]+)*@([\w-]+\.){1,5}([A-Za-z]){2,4}$/;var _4=/(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;return {"email":function(v){return _3.test(v);},"emailText":"This field should be an e-mail address in the format \"user@domain.com\"","emailMask":/[a-z0-9_\.\-@]/i,"url":function(v){return _4.test(v);},"urlText":"This field should be a URL in the format \"http:/"+"/www.domain.com\"","alpha":function(v){return _1.test(v);},"alphaText":"This field should only contain letters and _","alphaMask":/[a-z_]/i,"alphanum":function(v){return _2.test(v);},"alphanumText":"This field should only contain letters, numbers and _","alphanumMask":/[a-z0-9_]/i};}(); + +Ext.LayoutManager=function(_1,_2){Ext.LayoutManager.superclass.constructor.call(this);this.el=Ext.get(_1);if(this.el.dom==document.body&&Ext.isIE&&!_2.allowScroll){document.body.scroll="no";}else{if(this.el.dom!=document.body&&this.el.getStyle("position")=="static"){this.el.position("relative");}}this.id=this.el.id;this.el.addClass("x-layout-container");this.monitorWindowResize=true;this.regions={};this.addEvents({"layout":true,"regionresized":true,"regioncollapsed":true,"regionexpanded":true});this.updating=false;Ext.EventManager.onWindowResize(this.onWindowResize,this,true);};Ext.extend(Ext.LayoutManager,Ext.util.Observable,{isUpdating:function(){return this.updating;},beginUpdate:function(){this.updating=true;},endUpdate:function(_3){this.updating=false;if(!_3){this.layout();}},layout:function(){},onRegionResized:function(_4,_5){this.fireEvent("regionresized",_4,_5);this.layout();},onRegionCollapsed:function(_6){this.fireEvent("regioncollapsed",_6);},onRegionExpanded:function(_7){this.fireEvent("regionexpanded",_7);},getViewSize:function(){var _8;if(this.el.dom!=document.body){_8=this.el.getSize();}else{_8={width:Ext.lib.Dom.getViewWidth(),height:Ext.lib.Dom.getViewHeight()};}_8.width-=this.el.getBorderWidth("lr")-this.el.getPadding("lr");_8.height-=this.el.getBorderWidth("tb")-this.el.getPadding("tb");return _8;},getEl:function(){return this.el;},getRegion:function(_9){return this.regions[_9.toLowerCase()];},onWindowResize:function(){if(this.monitorWindowResize){this.layout();}}}); + +Ext.BorderLayout=function(_1,_2){_2=_2||{};Ext.BorderLayout.superclass.constructor.call(this,_1,_2);this.factory=_2.factory||Ext.BorderLayout.RegionFactory;for(var i=0,_4=this.factory.validRegions.length;i<_4;i++){var _5=this.factory.validRegions[i];if(_2[_5]){this.addRegion(_5,_2[_5]);}}};Ext.extend(Ext.BorderLayout,Ext.LayoutManager,{addRegion:function(_6,_7){if(!this.regions[_6]){var r=this.factory.create(_6,this,_7);this.bindRegion(_6,r);}return this.regions[_6];},bindRegion:function(_9,r){this.regions[_9]=r;r.on("visibilitychange",this.layout,this);r.on("paneladded",this.layout,this);r.on("panelremoved",this.layout,this);r.on("invalidated",this.layout,this);r.on("resized",this.onRegionResized,this);r.on("collapsed",this.onRegionCollapsed,this);r.on("expanded",this.onRegionExpanded,this);},layout:function(){if(this.updating){return;}var _b=this.getViewSize();var w=_b.width,h=_b.height;var _e=w,_f=h,_10=0,_11=0;var rs=this.regions;var n=rs["north"],s=rs["south"],_15=rs["west"],e=rs["east"],c=rs["center"];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;_10=b.height+b.y+m.bottom;_f-=_10;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 _1a=(b.height+m.top+m.bottom);b.y=h-_1a+m.top;_f-=_1a;s.updateBox(this.safeBox(b));}if(_15&&_15.isVisible()){var b=_15.getBox();var m=_15.getMargins();b.height=_f-(m.top+m.bottom);b.x=m.left;b.y=_10+m.top;var _1b=(b.width+m.left+m.right);_11+=_1b;_e-=_1b;_15.updateBox(this.safeBox(b));}if(e&&e.isVisible()){var b=e.getBox();var m=e.getMargins();b.height=_f-(m.top+m.bottom);var _1b=(b.width+m.left+m.right);b.x=w-_1b+m.left;b.y=_10+m.top;_e-=_1b;e.updateBox(this.safeBox(b));}if(c){var m=c.getMargins();var _1c={x:_11+m.left,y:_10+m.top,width:_e-(m.left+m.right),height:_f-(m.top+m.bottom)};c.updateBox(this.safeBox(_1c));}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(_1e,_1f){_1e=_1e.toLowerCase();return this.regions[_1e].add(_1f);},remove:function(_20,_21){_20=_20.toLowerCase();return this.regions[_20].remove(_21);},findPanel:function(_22){var rs=this.regions;for(var _24 in rs){if(typeof rs[_24]!="function"){var p=rs[_24].getPanel(_22);if(p){return p;}}}return null;},showPanel:function(_26){var rs=this.regions;for(var _28 in rs){var r=rs[_28];if(typeof r!="function"){if(r.hasPanel(_26)){return r.showPanel(_26);}}}return null;},restoreState:function(_2a){if(!_2a){_2a=Ext.state.Manager;}var sm=new Ext.LayoutStateManager();sm.init(this,_2a);},batchAdd:function(_2c){this.beginUpdate();for(var _2d in _2c){var lr=this.regions[_2d];if(lr){this.addTypedPanels(lr,_2c[_2d]);}}this.endUpdate();},addTypedPanels:function(lr,ps){if(typeof ps=="string"){lr.add(new Ext.ContentPanel(ps));}else{if(ps instanceof Array){for(var i=0,len=ps.length;i1){for(var i=0,_f=arguments.length;i<_f;i++){this.add(arguments[i]);}return null;}if(this.hasPanel(_d)){this.showPanel(_d);return _d;}var el=_d.getEl();if(el.dom.parentNode!=this.mgr.el.dom){this.mgr.el.dom.appendChild(el.dom);}if(_d.setRegion){_d.setRegion(this);}this.panels.add(_d);el.setStyle("position","absolute");if(!_d.background){this.setActivePanel(_d);if(this.config.initialSize&&this.panels.getCount()==1){this.resizeTo(this.config.initialSize);}}this.fireEvent("paneladded",this,_d);return _d;},hasPanel:function(_11){if(typeof _11=="object"){_11=_11.getId();}return this.getPanel(_11)?true:false;},remove:function(_12,_13){_12=this.getPanel(_12);if(!_12){return null;}var e={};this.fireEvent("beforeremove",this,_12,e);if(e.cancel===true){return null;}var _15=_12.getId();this.panels.removeKey(_15);return _12;},getPanel:function(id){if(typeof id=="object"){return id;}return this.panels.get(id);},getPosition:function(){return this.position;}}); + +Ext.LayoutRegion=function(_1,_2,_3){Ext.LayoutRegion.superclass.constructor.call(this,_1,_2,_3,true);var dh=Ext.DomHelper;this.el=dh.append(_1.el.dom,{tag:"div",cls:"x-layout-panel x-layout-panel-"+this.position},true);this.titleEl=dh.append(this.el.dom,{tag:"div",unselectable:"on",cls:"x-unselectable x-layout-panel-hd x-layout-title-"+this.position,children:[{tag:"span",cls:"x-unselectable x-layout-panel-hd-text",unselectable:"on",html:" "},{tag:"div",cls:"x-unselectable x-layout-panel-hd-tools",unselectable:"on"}]},true);this.titleEl.enableDisplayMode();this.titleTextEl=this.titleEl.dom.firstChild;this.tools=Ext.get(this.titleEl.dom.childNodes[1],true);this.closeBtn=this.createTool(this.tools.dom,"x-layout-close");this.closeBtn.enableDisplayMode();this.closeBtn.on("click",this.closeClicked,this);this.closeBtn.hide();this.createBody(_2);this.visible=true;this.collapsed=false;if(_2.hideWhenEmpty){this.hide();this.on("paneladded",this.validateVisibility,this);this.on("panelremoved",this.validateVisibility,this);}this.applyConfig(_2);};Ext.extend(Ext.LayoutRegion,Ext.BasicLayoutRegion,{createBody:function(){this.bodyEl=this.el.createChild({tag:"div",cls:"x-layout-panel-body"});},applyConfig:function(c){if(c.collapsible&&this.position!="center"&&!this.collapsedEl){var dh=Ext.DomHelper;if(c.titlebar!==false){this.collapseBtn=this.createTool(this.tools.dom,"x-layout-collapse-"+this.position);this.collapseBtn.on("click",this.collapse,this);this.collapseBtn.enableDisplayMode();if(c.showPin===true||this.showPin){this.stickBtn=this.createTool(this.tools.dom,"x-layout-stick");this.stickBtn.enableDisplayMode();this.stickBtn.on("click",this.expand,this);this.stickBtn.hide();}}this.collapsedEl=dh.append(this.mgr.el.dom,{cls:"x-layout-collapsed x-layout-collapsed-"+this.position,children:[{cls:"x-layout-collapsed-tools",children:[{cls:"x-layout-ctools-inner"}]}]},true);if(c.floatable!==false){this.collapsedEl.addClassOnOver("x-layout-collapsed-over");this.collapsedEl.on("click",this.collapseClick,this);}if(c.collapsedTitle&&(this.position=="north"||this.position=="south")){this.collapsedTitleTextEl=dh.append(this.collapsedEl.dom,{tag:"div",cls:"x-unselectable x-layout-panel-hd-text",id:"message",unselectable:"on",style:{"float":"left"}});this.collapsedTitleTextEl.innerHTML=c.collapsedTitle;}this.expandBtn=this.createTool(this.collapsedEl.dom.firstChild.firstChild,"x-layout-expand-"+this.position);this.expandBtn.on("click",this.expand,this);}if(this.collapseBtn){this.collapseBtn.setVisible(c.collapsible==true);}this.cmargins=c.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=c.margins||this.margins||{top:0,left:0,right:0,bottom:0};this.bottomTabs=c.tabPosition!="top";this.autoScroll=c.autoScroll||false;if(this.autoScroll){this.bodyEl.setStyle("overflow","auto");}else{this.bodyEl.setStyle("overflow","hidden");}if((!c.titlebar&&!c.title)||c.titlebar===false){this.titleEl.hide();}else{this.titleEl.show();if(c.title){this.titleTextEl.innerHTML=c.title;}}this.duration=c.duration||0.3;this.slideDuration=c.slideDuration||0.45;this.config=c;if(c.collapsed){this.collapse(true);}if(c.hidden){this.hide();}},isVisible:function(){return this.visible;},setCollapsedTitle:function(_7){_7=_7||" ";if(this.collapsedTitleTextEl){this.collapsedTitleTextEl.innerHTML=_7;}},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("x-layout-panel-dragover");},unhighlight:function(){this.el.removeClass("x-layout-panel-dragover");},updateBox:function(_9){this.box=_9;if(!this.collapsed){this.el.dom.style.left=_9.x+"px";this.el.dom.style.top=_9.y+"px";this.updateBody(_9.width,_9.height);}else{this.collapsedEl.dom.style.left=_9.x+"px";this.collapsedEl.dom.style.top=_9.y+"px";this.collapsedEl.setSize(_9.width,_9.height);}if(this.tabs){this.tabs.autoSizeTabs();}},updateBody:function(w,h){if(w!==null){this.el.setWidth(w);w-=this.el.getBorderWidth("rl");if(this.config.adjustments){w+=this.config.adjustments[0];}}if(h!==null){this.el.setHeight(h);h=this.titleEl&&this.titleEl.isDisplayed()?h-(this.titleEl.getHeight()||0):h;h-=this.el.getBorderWidth("tb");if(this.config.adjustments){h+=this.config.adjustments[1];}this.bodyEl.setHeight(h);if(this.tabs){h=this.tabs.syncHeight(h);}}if(this.panelSize){w=w!==null?w:this.panelSize.width;h=h!==null?h:this.panelSize.height;}if(this.activePanel){var el=this.activePanel.getEl();w=w!==null?w:el.getWidth();h=h!==null?h:el.getHeight();this.panelSize={width:w,height:h};this.activePanel.setSize(w,h);}if(Ext.isIE&&this.tabs){this.tabs.el.repaint();}},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);},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(_e){if(this.collapsed){return;}this.collapsed=true;if(this.split){this.split.el.hide();}if(this.config.animate&&_e!==true){this.fireEvent("invalidated",this);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,_10){if(e){e.stopPropagation();}if(!this.collapsed||this.el.hasActiveFx()){return;}if(this.isSlid){this.afterSlideIn();_10=true;}this.collapsed=false;if(this.config.animate&&_10!==true){this.animateExpand();}else{this.el.show();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 Ext.TabPanel(this.bodyEl.dom,{tabPosition:this.bottomTabs?"bottom":"top",disableTooltips:this.config.disableTabTips});if(this.config.hideTabs){ts.stripWrap.setDisplayed(false);}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");ts.bodyEl.addClass("x-layout-tabs-body");this.panels.each(this.initPanelAsTab,this);},initPanelAsTab:function(_12){var ti=this.tabs.addTab(_12.getEl().id,_12.getTitle(),null,this.config.closeOnTab&&_12.isClosable());if(_12.tabTip!==undefined){ti.setTooltip(_12.tabTip);}ti.on("activate",function(){this.setActivePanel(_12);},this);if(this.config.closeOnTab){ti.on("beforeclose",function(t,e){e.cancel=true;this.remove(_12);},this);}return ti;},updatePanelTitle:function(_16,_17){if(this.activePanel==_16){this.updateTitle(_17);}if(this.tabs){var ti=this.tabs.getTab(_16.getEl().id);ti.setText(_17);if(_16.tabTip!==undefined){ti.setTooltip(_16.tabTip);}}},updateTitle:function(_19){if(this.titleTextEl&&!this.config.title){this.titleTextEl.innerHTML=(typeof _19!="undefined"&&_19.length>0?_19:" ");}},setActivePanel:function(_1a){_1a=this.getPanel(_1a);if(this.activePanel&&this.activePanel!=_1a){this.activePanel.setActiveState(false);}this.activePanel=_1a;_1a.setActiveState(true);if(this.panelSize){_1a.setSize(this.panelSize.width,this.panelSize.height);}if(this.closeBtn){this.closeBtn.setVisible(!this.config.closeOnTab&&!this.isSlid&&_1a.isClosable());}this.updateTitle(_1a.getTitle());if(this.tabs){this.fireEvent("invalidated",this);}this.fireEvent("panelactivated",this,_1a);},showPanel:function(_1b){if(_1b=this.getPanel(_1b)){if(this.tabs){var tab=this.tabs.getTab(_1b.getEl().id);if(tab.isHidden()){this.tabs.unhideTab(tab.id);}tab.activate();}else{this.setActivePanel(_1b);}}return _1b;},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(_1d){if(arguments.length>1){for(var i=0,len=arguments.length;i0){this.remove(this.panels.first());}},remove:function(_22,_23){_22=this.getPanel(_22);if(!_22){return null;}var e={};this.fireEvent("beforeremove",this,_22,e);if(e.cancel===true){return null;}_23=(typeof _23!="undefined"?_23:(this.config.preservePanels===true||_22.preserve===true));var _25=_22.getId();this.panels.removeKey(_25);if(_23){document.body.appendChild(_22.getEl().dom);}if(this.tabs){this.tabs.removeTab(_22.getEl().id);}else{if(!_23){this.bodyEl.dom.removeChild(_22.getEl().dom);}}if(this.panels.getCount()==1&&this.tabs&&!this.config.alwaysShowTabs){var p=this.panels.first();var _27=document.createElement("div");_27.appendChild(p.getEl().dom);this.bodyEl.update("");this.bodyEl.dom.appendChild(p.getEl().dom);_27=null;this.updateTitle(p.getTitle());this.tabs=null;this.bodyEl.setStyle("overflow",this.config.autoScroll?"auto":"hidden");this.setActivePanel(p);}_22.setRegion(null);if(this.activePanel==_22){this.activePanel=null;}if(this.config.autoDestroy!==false&&_23!==true){try{_22.destroy();}catch(e){}}this.fireEvent("panelremoved",this,_22);return _22;},getTabs:function(){return this.tabs;},createTool:function(_28,_29){var btn=Ext.DomHelper.append(_28,{tag:"div",cls:"x-layout-tools-button",children:[{tag:"div",cls:"x-layout-tools-button-inner "+_29,html:" "}]},true);btn.addClassOnOver("x-layout-tools-button-over");return btn;}}); + +Ext.SplitLayoutRegion=function(_1,_2,_3,_4){this.cursor=_4;Ext.SplitLayoutRegion.superclass.constructor.call(this,_1,_2,_3);};Ext.extend(Ext.SplitLayoutRegion,Ext.LayoutRegion,{splitTip:"Drag to resize.",collapsibleSplitTip:"Drag to resize. Double click to hide.",useSplitTips:false,applyConfig:function(_5){Ext.SplitLayoutRegion.superclass.applyConfig.call(this,_5);if(_5.split){if(!this.split){var _6=Ext.DomHelper.append(this.mgr.el.dom,{tag:"div",id:this.el.id+"-split",cls:"x-layout-split x-layout-split-"+this.position,html:" "});this.split=new Ext.SplitBar(_6,this.el,this.orientation);this.split.on("moved",this.onSplitMove,this);this.split.useShim=_5.useShim===true;this.split.getMaximumSize=this[this.position=="north"||this.position=="south"?"getVMaxSize":"getHMaxSize"].createDelegate(this);if(this.useSplitTips){this.split.el.dom.title=_5.collapsible?this.collapsibleSplitTip:this.splitTip;}if(_5.collapsible){this.split.el.on("dblclick",this.collapse,this);}}if(typeof _5.minSize!="undefined"){this.split.minSize=_5.minSize;}if(typeof _5.maxSize!="undefined"){this.split.maxSize=_5.maxSize;}if(_5.hideWhenEmpty||_5.hidden){this.hideSplitter();}}},getHMaxSize:function(){var _7=this.config.maxSize||10000;var _8=this.mgr.getRegion("center");return Math.min(_7,(this.el.getWidth()+_8.getEl().getWidth())-_8.getMinWidth());},getVMaxSize:function(){var _9=this.config.maxSize||10000;var _a=this.mgr.getRegion("center");return Math.min(_9,(this.el.getHeight()+_a.getEl().getHeight())-_a.getMinHeight());},onSplitMove:function(_b,_c){this.fireEvent("resized",this,_c);},getSplitBar:function(){return this.split;},hide:function(){this.hideSplitter();Ext.SplitLayoutRegion.superclass.hide.call(this);},hideSplitter:function(){if(this.split){this.split.el.setLocation(-2000,-2000);this.split.el.hide();}},show:function(){if(this.split){this.split.el.show();}Ext.SplitLayoutRegion.superclass.show.call(this);},beforeSlide:function(){if(Ext.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(Ext.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();}}}},initAutoHide:function(){if(this.autoHide!==false){if(!this.autoHideHd){var st=new Ext.util.DelayedTask(this.slideIn,this);this.autoHideHd={"mouseout":function(e){if(!e.within(this.el,true)){st.delay(500);}},"mouseover":function(e){st.cancel();},scope:this};}this.el.on(this.autoHideHd);}},clearAutoHide:function(){if(this.autoHide!==false){this.el.un("mouseout",this.autoHideHd.mouseout);this.el.un("mouseover",this.autoHideHd.mouseover);}},clearMonitor:function(){Ext.get(document).un("click",this.slideInIf,this);},slideOut:function(){if(this.isSlid||this.el.hasActiveFx()){return;}this.isSlid=true;if(this.collapseBtn){this.collapseBtn.hide();}this.closeBtnState=this.closeBtn.getStyle("display");this.closeBtn.hide();if(this.stickBtn){this.stickBtn.show();}this.el.show();this.el.alignTo(this.collapsedEl,this.getCollapseAnchor());this.beforeSlide();this.el.setStyle("z-index",20000);this.el.slideIn(this.getSlideAnchor(),{callback:function(){this.afterSlide();this.initAutoHide();Ext.get(document).on("click",this.slideInIf,this);this.fireEvent("slideshow",this);},scope:this,block:true});},afterSlideIn:function(){this.clearAutoHide();this.isSlid=false;this.clearMonitor();this.el.setStyle("z-index","");if(this.collapseBtn){this.collapseBtn.show();}this.closeBtn.setStyle("display",this.closeBtnState);if(this.stickBtn){this.stickBtn.hide();}this.fireEvent("slidehide",this);},slideIn:function(cb){if(!this.isSlid||this.el.hasActiveFx()){Ext.callback(cb);return;}this.isSlid=false;this.beforeSlide();this.el.slideOut(this.getSlideAnchor(),{callback:function(){this.el.setLeftTop(-10000,-10000);this.afterSlide();this.afterSlideIn();Ext.callback(cb);},scope:this,block:true});},slideInIf:function(e){if(!e.within(this.el)){this.slideIn();}},animateCollapse:function(){this.beforeSlide();this.el.setStyle("z-index",20000);var _12=this.getSlideAnchor();this.el.slideOut(_12,{callback:function(){this.el.setStyle("z-index","");this.collapsedEl.slideIn(_12,{duration:0.3});this.afterSlide();this.el.setLocation(-10000,-10000);this.el.hide();this.fireEvent("collapsed",this);},scope:this,block:true});},animateExpand:function(){this.beforeSlide();this.el.alignTo(this.collapsedEl,this.getCollapseAnchor(),this.getExpandAdj());this.el.setStyle("z-index",20000);this.collapsedEl.hide({duration:0.1});this.el.slideIn(this.getSlideAnchor(),{callback:function(){this.el.setStyle("z-index","");this.afterSlide();if(this.split){this.split.el.show();}this.fireEvent("invalidated",this);this.fireEvent("expanded",this);},scope:this,block:true});},anchors:{"west":"left","east":"right","north":"top","south":"bottom"},sanchors:{"west":"l","east":"r","north":"t","south":"b"},canchors:{"west":"tl-tr","east":"tr-tl","north":"tl-bl","south":"bl-tl"},getAnchor:function(){return this.anchors[this.position];},getCollapseAnchor:function(){return this.canchors[this.position];},getSlideAnchor:function(){return this.sanchors[this.position];},getAlignAdj:function(){var cm=this.cmargins;switch(this.position){case "west":return [0,0];break;case "east":return [0,0];break;case "north":return [0,0];break;case "south":return [0,0];break;}},getExpandAdj:function(){var c=this.collapsedEl,cm=this.cmargins;switch(this.position){case "west":return [-(cm.right+c.getWidth()+cm.left),0];break;case "east":return [cm.right+c.getWidth()+cm.left,0];break;case "north":return [0,-(cm.top+cm.bottom+c.getHeight())];break;case "south":return [0,cm.top+cm.bottom+c.getHeight()];break;}}}); + +Ext.CenterLayoutRegion=function(_1,_2){Ext.CenterLayoutRegion.superclass.constructor.call(this,_1,_2,"center");this.visible=true;this.minWidth=_2.minWidth||20;this.minHeight=_2.minHeight||20;};Ext.extend(Ext.CenterLayoutRegion,Ext.LayoutRegion,{hide:function(){},show:function(){},getMinWidth:function(){return this.minWidth;},getMinHeight:function(){return this.minHeight;}});Ext.NorthLayoutRegion=function(_3,_4){Ext.NorthLayoutRegion.superclass.constructor.call(this,_3,_4,"north","n-resize");if(this.split){this.split.placement=Ext.SplitBar.TOP;this.split.orientation=Ext.SplitBar.VERTICAL;this.split.el.addClass("x-layout-split-v");}var _5=_4.initialSize||_4.height;if(typeof _5!="undefined"){this.el.setHeight(_5);}};Ext.extend(Ext.NorthLayoutRegion,Ext.SplitLayoutRegion,{orientation:Ext.SplitBar.VERTICAL,getBox:function(){if(this.collapsed){return this.collapsedEl.getBox();}var _6=this.el.getBox();if(this.split){_6.height+=this.split.el.getHeight();}return _6;},updateBox:function(_7){if(this.split&&!this.collapsed){_7.height-=this.split.el.getHeight();this.split.el.setLeft(_7.x);this.split.el.setTop(_7.y+_7.height);this.split.el.setWidth(_7.width);}if(this.collapsed){this.updateBody(_7.width,null);}Ext.NorthLayoutRegion.superclass.updateBox.call(this,_7);}});Ext.SouthLayoutRegion=function(_8,_9){Ext.SouthLayoutRegion.superclass.constructor.call(this,_8,_9,"south","s-resize");if(this.split){this.split.placement=Ext.SplitBar.BOTTOM;this.split.orientation=Ext.SplitBar.VERTICAL;this.split.el.addClass("x-layout-split-v");}var _a=_9.initialSize||_9.height;if(typeof _a!="undefined"){this.el.setHeight(_a);}};Ext.extend(Ext.SouthLayoutRegion,Ext.SplitLayoutRegion,{orientation:Ext.SplitBar.VERTICAL,getBox:function(){if(this.collapsed){return this.collapsedEl.getBox();}var _b=this.el.getBox();if(this.split){var sh=this.split.el.getHeight();_b.height+=sh;_b.y-=sh;}return _b;},updateBox:function(_d){if(this.split&&!this.collapsed){var sh=this.split.el.getHeight();_d.height-=sh;_d.y+=sh;this.split.el.setLeft(_d.x);this.split.el.setTop(_d.y-sh);this.split.el.setWidth(_d.width);}if(this.collapsed){this.updateBody(_d.width,null);}Ext.SouthLayoutRegion.superclass.updateBox.call(this,_d);}});Ext.EastLayoutRegion=function(_f,_10){Ext.EastLayoutRegion.superclass.constructor.call(this,_f,_10,"east","e-resize");if(this.split){this.split.placement=Ext.SplitBar.RIGHT;this.split.orientation=Ext.SplitBar.HORIZONTAL;this.split.el.addClass("x-layout-split-h");}var _11=_10.initialSize||_10.width;if(typeof _11!="undefined"){this.el.setWidth(_11);}};Ext.extend(Ext.EastLayoutRegion,Ext.SplitLayoutRegion,{orientation:Ext.SplitBar.HORIZONTAL,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.updateBody(null,box.height);}Ext.EastLayoutRegion.superclass.updateBox.call(this,box);}});Ext.WestLayoutRegion=function(mgr,_17){Ext.WestLayoutRegion.superclass.constructor.call(this,mgr,_17,"west","w-resize");if(this.split){this.split.placement=Ext.SplitBar.LEFT;this.split.orientation=Ext.SplitBar.HORIZONTAL;this.split.el.addClass("x-layout-split-h");}var _18=_17.initialSize||_17.width;if(typeof _18!="undefined"){this.el.setWidth(_18);}};Ext.extend(Ext.WestLayoutRegion,Ext.SplitLayoutRegion,{orientation:Ext.SplitBar.HORIZONTAL,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.updateBody(null,box.height);}Ext.WestLayoutRegion.superclass.updateBox.call(this,box);}}); + +Ext.LayoutStateManager=function(_1){this.state={north:{},south:{},east:{},west:{}};};Ext.LayoutStateManager.prototype={init:function(_2,_3){this.provider=_3;var _4=_3.get(_2.id+"-layout-state");if(_4){var _5=_2.isUpdating();if(!_5){_2.beginUpdate();}for(var _6 in _4){if(typeof _4[_6]!="function"){var _7=_4[_6];var r=_2.getRegion(_6);if(r&&_7){if(_7.size){r.resizeTo(_7.size);}if(_7.collapsed==true){r.collapse(true);}else{r.expand(null,true);}}}}if(!_5){_2.endUpdate();}this.state=_4;}this.layout=_2;_2.on("regionresized",this.onRegionResized,this);_2.on("regioncollapsed",this.onRegionCollapsed,this);_2.on("regionexpanded",this.onRegionExpanded,this);},storeState:function(){this.provider.set(this.layout.id+"-layout-state",this.state);},onRegionResized:function(_9,_a){this.state[_9.getPosition()].size=_a;this.storeState();},onRegionCollapsed:function(_b){this.state[_b.getPosition()].collapsed=true;this.storeState();},onRegionExpanded:function(_c){this.state[_c.getPosition()].collapsed=false;this.storeState();}}; + +Ext.ContentPanel=function(el,_2,_3){Ext.ContentPanel.superclass.constructor.call(this);if(el.autoCreate){_2=el;el=Ext.id();}this.el=Ext.get(el);if(!this.el&&_2&&_2.autoCreate){if(typeof _2.autoCreate=="object"){if(!_2.autoCreate.id){_2.autoCreate.id=_2.id||el;}this.el=Ext.DomHelper.append(document.body,_2.autoCreate,true);}else{this.el=Ext.DomHelper.append(document.body,{tag:"div",cls:"x-layout-inactive-content",id:_2.id||el},true);}}this.closable=false;this.loaded=false;this.active=false;if(typeof _2=="string"){this.title=_2;}else{Ext.apply(this,_2);}if(this.resizeEl){this.resizeEl=Ext.get(this.resizeEl,true);}else{this.resizeEl=this.el;}this.addEvents({"activate":true,"deactivate":true,"resize":true});if(this.autoScroll){this.resizeEl.setStyle("overflow","auto");}_3=_3||this.content;if(_3){this.setContent(_3);}if(_2&&_2.url){this.setUrl(this.url,this.params,this.loadOnce);}};Ext.extend(Ext.ContentPanel,Ext.util.Observable,{tabTip:"",setRegion:function(_4){this.region=_4;if(_4){this.el.replaceClass("x-layout-inactive-content","x-layout-active-content");}else{this.el.replaceClass("x-layout-active-content","x-layout-inactive-content");}},getToolbar:function(){return this.toolbar;},setActiveState:function(_5){this.active=_5;if(!_5){this.fireEvent("deactivate",this);}else{this.fireEvent("activate",this);}},setContent:function(_6,_7){this.el.update(_6,_7);},ignoreResize:function(w,h){if(this.lastSize&&this.lastSize.width==w&&this.lastSize.height==h){return true;}else{this.lastSize={width:w,height:h};return false;}},getUpdateManager:function(){return this.el.getUpdateManager();},load:function(){var um=this.el.getUpdateManager();um.update.apply(um,arguments);return this;},setUrl:function(_b,_c,_d){if(this.refreshDelegate){this.removeListener("activate",this.refreshDelegate);}this.refreshDelegate=this._handleRefresh.createDelegate(this,[_b,_c,_d]);this.on("activate",this._handleRefresh.createDelegate(this,[_b,_c,_d]));return this.el.getUpdateManager();},_handleRefresh:function(_e,_f,_10){if(!_10||!this.loaded){var _11=this.el.getUpdateManager();_11.update(_e,_f,this._setLoaded.createDelegate(this));}},_setLoaded:function(){this.loaded=true;},getId:function(){return this.el.id;},getEl:function(){return this.el;},adjustForComponents:function(_12,_13){if(this.resizeEl!=this.el){_12-=this.el.getFrameWidth("lr");_13-=this.el.getFrameWidth("tb");}if(this.toolbar){var te=this.toolbar.getEl();_13-=te.getHeight();te.setWidth(_12);}if(this.adjustments){_12+=this.adjustments[0];_13+=this.adjustments[1];}return {"width":_12,"height":_13};},setSize:function(_15,_16){if(this.fitToFrame&&!this.ignoreResize(_15,_16)){if(this.fitContainer&&this.resizeEl!=this.el){this.el.setSize(_15,_16);}var _17=this.adjustForComponents(_15,_16);this.resizeEl.setSize(this.autoWidth?"auto":_17.width,this.autoHeight?"auto":_17.height);this.fireEvent("resize",this,_17.width,_17.height);}},getTitle:function(){return this.title;},setTitle:function(_18){this.title=_18;if(this.region){this.region.updatePanelTitle(this,_18);}},isClosable:function(){return this.closable;},beforeSlide:function(){this.el.clip();this.resizeEl.clip();},afterSlide:function(){this.el.unclip();this.resizeEl.unclip();},refresh:function(){if(this.refreshDelegate){this.loaded=false;this.refreshDelegate();}},destroy:function(){this.el.removeAllListeners();var _19=document.createElement("span");_19.appendChild(this.el.dom);_19.innerHTML="";this.el.remove();this.el=null;}});Ext.GridPanel=function(_1a,_1b){this.wrapper=Ext.DomHelper.append(document.body,{tag:"div",cls:"x-layout-grid-wrapper x-layout-inactive-content"},true);this.wrapper.dom.appendChild(_1a.container.dom);Ext.GridPanel.superclass.constructor.call(this,this.wrapper,_1b);if(this.toolbar){this.toolbar.el.insertBefore(this.wrapper.dom.firstChild);}_1a.monitorWindowResize=false;_1a.autoHeight=false;_1a.autoWidth=false;this.grid=_1a;this.grid.container.replaceClass("x-layout-inactive-content","x-layout-component-panel");};Ext.extend(Ext.GridPanel,Ext.ContentPanel,{getId:function(){return this.grid.id;},getGrid:function(){return this.grid;},setSize:function(_1c,_1d){if(!this.ignoreResize(_1c,_1d)){var _1e=this.grid;var _1f=this.adjustForComponents(_1c,_1d);_1e.container.setSize(_1f.width,_1f.height);_1e.autoSize();}},beforeSlide:function(){this.grid.getView().scroller.clip();},afterSlide:function(){this.grid.getView().scroller.unclip();},destroy:function(){this.grid.destroy();delete this.grid;Ext.GridPanel.superclass.destroy.call(this);}});Ext.NestedLayoutPanel=function(_20,_21){Ext.NestedLayoutPanel.superclass.constructor.call(this,_20.getEl(),_21);_20.monitorWindowResize=false;this.layout=_20;this.layout.getEl().addClass("x-layout-nested-layout");};Ext.extend(Ext.NestedLayoutPanel,Ext.ContentPanel,{setSize:function(_22,_23){if(!this.ignoreResize(_22,_23)){var _24=this.adjustForComponents(_22,_23);var el=this.layout.getEl();el.setSize(_24.width,_24.height);var _26=el.dom.offsetWidth;this.layout.layout();if(Ext.isIE&&!this.initialized){this.initialized=true;this.layout.layout();}}},getLayout:function(){return this.layout;}});Ext.ScrollPanel=function(el,_28,_29){_28=_28||{};_28.fitToFrame=true;Ext.ScrollPanel.superclass.constructor.call(this,el,_28,_29);this.el.dom.style.overflow="hidden";var _2a=this.el.wrap({cls:"x-scroller x-layout-inactive-content"});this.el.removeClass("x-layout-inactive-content");this.el.on("mousewheel",this.onWheel,this);var up=_2a.createChild({cls:"x-scroller-up",html:" "},this.el.dom);var _2c=_2a.createChild({cls:"x-scroller-down",html:" "});up.unselectable();_2c.unselectable();up.on("click",this.scrollUp,this);_2c.on("click",this.scrollDown,this);up.addClassOnOver("x-scroller-btn-over");_2c.addClassOnOver("x-scroller-btn-over");up.addClassOnClick("x-scroller-btn-click");_2c.addClassOnClick("x-scroller-btn-click");this.adjustments=[0,-(up.getHeight()+_2c.getHeight())];this.resizeEl=this.el;this.el=_2a;this.up=up;this.down=_2c;};Ext.extend(Ext.ScrollPanel,Ext.ContentPanel,{increment:100,wheelIncrement:5,scrollUp:function(){this.resizeEl.scroll("up",this.increment,{callback:this.afterScroll,scope:this});},scrollDown:function(){this.resizeEl.scroll("down",this.increment,{callback:this.afterScroll,scope:this});},afterScroll:function(){var el=this.resizeEl;var t=el.dom.scrollTop,h=el.dom.scrollHeight,ch=el.dom.clientHeight;this.up[t==0?"addClass":"removeClass"]("x-scroller-btn-disabled");this.down[h-t<=ch?"addClass":"removeClass"]("x-scroller-btn-disabled");},setSize:function(){Ext.ScrollPanel.superclass.setSize.apply(this,arguments);this.afterScroll();},onWheel:function(e){var d=e.getWheelDelta();this.resizeEl.dom.scrollTop-=(d*this.wheelIncrement);this.afterScroll();e.stopEvent();},setContent:function(_33,_34){this.resizeEl.update(_33,_34);}}); + +Ext.ReaderLayout=function(_1,_2){var c=_1||{size:{}};Ext.ReaderLayout.superclass.constructor.call(this,_2||document.body,{north:c.north!==false?Ext.apply({split:false,initialSize:32,titlebar:false},c.north):false,west:c.west!==false?Ext.apply({split:true,initialSize:200,minSize:175,maxSize:400,titlebar:true,collapsible:true,animate:true,margins:{left:5,right:0,bottom:5,top:5},cmargins:{left:5,right:5,bottom:5,top:5}},c.west):false,east:c.east!==false?Ext.apply({split:true,initialSize:200,minSize:175,maxSize:400,titlebar:true,collapsible:true,animate:true,margins:{left:0,right:5,bottom:5,top:5},cmargins:{left:5,right:5,bottom:5,top:5}},c.east):false,center:Ext.apply({tabPosition:"top",autoScroll:false,closeOnTab:true,titlebar:false,margins:{left:c.west!==false?0:5,right:c.east!==false?0:5,bottom:5,top:2}},c.center)});this.el.addClass("x-reader");this.beginUpdate();var _4=new Ext.BorderLayout(Ext.get(document.body).createChild(),{south:c.preview!==false?Ext.apply({split:true,initialSize:200,minSize:100,autoScroll:true,collapsible:true,titlebar:true,cmargins:{top:5,left:0,right:0,bottom:0}},c.preview):false,center:Ext.apply({autoScroll:false,titlebar:false,minHeight:200},c.listView)});this.add("center",new Ext.NestedLayoutPanel(_4,Ext.apply({title:c.mainTitle||"",tabTip:""},c.innerPanelCfg)));this.endUpdate();this.regions.preview=_4.getRegion("south");this.regions.listView=_4.getRegion("center");};Ext.extend(Ext.ReaderLayout,Ext.BorderLayout); + +Ext.grid.Grid=function(_1,_2){this.container=Ext.get(_1);this.container.update("");this.container.setStyle("overflow","hidden");this.container.addClass("x-grid-container");this.id=this.container.id;Ext.apply(this,_2);if(this.ds){this.dataSource=this.ds;delete this.ds;}if(this.cm){this.colModel=this.cm;delete this.cm;}if(this.sm){this.selModel=this.sm;delete this.sm;}if(this.width){this.container.setWidth(this.width);}if(this.height){this.container.setHeight(this.height);}this.addEvents({"click":true,"dblclick":true,"contextmenu":true,"mousedown":true,"mouseup":true,"mouseover":true,"mouseout":true,"keypress":true,"keydown":true,"cellclick":true,"celldblclick":true,"rowclick":true,"rowdblclick":true,"headerclick":true,"headerdblclick":true,"rowcontextmenu":true,"cellcontextmenu":true,"headercontextmenu":true,"bodyscroll":true,"columnresize":true,"columnmove":true,"startdrag":true,"enddrag":true,"dragdrop":true,"dragover":true,"dragenter":true,"dragout":true});Ext.grid.Grid.superclass.constructor.call(this);};Ext.extend(Ext.grid.Grid,Ext.util.Observable,{minColumnWidth:25,autoSizeColumns:false,autoSizeHeaders:true,monitorWindowResize:true,maxRowsToMeasure:0,trackMouseOver:true,enableDragDrop:false,enableColumnMove:true,enableColumnHide:true,enableRowHeightSync:false,stripeRows:true,autoHeight:false,autoExpandColumn:false,autoExpandMin:50,autoExpandMax:1000,view:null,allowTextSelectionPattern:/INPUT|TEXTAREA|SELECT/i,loadMask:false,rendered:false,render:function(){var c=this.container;if((!c.dom.offsetHeight||c.dom.offsetHeight<20)||c.getStyle("height")=="auto"){this.autoHeight=true;}var _4=this.getView();_4.init(this);c.on("click",this.onClick,this);c.on("dblclick",this.onDblClick,this);c.on("contextmenu",this.onContextMenu,this);c.on("keydown",this.onKeyDown,this);this.relayEvents(c,["mousedown","mouseup","mouseover","mouseout","keypress"]);this.getSelectionModel().init(this);_4.render();if(this.loadMask){this.loadMask=new Ext.LoadMask(this.container,Ext.apply({store:this.dataSource},this.loadMask));}this.rendered=true;return this;},reconfigure:function(_5,_6){if(this.loadMask){this.loadMask.destroy();this.loadMask=new Ext.LoadMask(this.container,Ext.apply({store:_5},this.loadMask));}this.view.bind(_5,_6);this.dataSource=_5;this.colModel=_6;this.view.refresh(true);},onKeyDown:function(e){this.fireEvent("keydown",e);},destroy:function(_8,_9){if(this.loadMask){this.loadMask.destroy();}var c=this.container;c.removeAllListeners();this.view.destroy();this.colModel.purgeListeners();if(!_9){this.purgeListeners();}c.update("");if(_8===true){c.remove();}},processEvent:function(_b,e){this.fireEvent(_b,e);var t=e.getTarget();var v=this.view;var _f=v.findHeaderIndex(t);if(_f!==false){this.fireEvent("header"+_b,this,_f,e);}else{var row=v.findRowIndex(t);var _11=v.findCellIndex(t);if(row!==false){this.fireEvent("row"+_b,this,row,e);if(_11!==false){this.fireEvent("cell"+_b,this,row,_11,e);}}}},onClick:function(e){this.processEvent("click",e);},onContextMenu:function(e,t){this.processEvent("contextmenu",e);},onDblClick:function(e){this.processEvent("dblclick",e);},walkCells:function(row,col,_18,fn,_1a){var cm=this.colModel,_1c=cm.getColumnCount();var ds=this.dataSource,_1e=ds.getCount(),_1f=true;if(_18<0){if(col<0){row--;_1f=false;}while(row>=0){if(!_1f){col=_1c-1;}_1f=false;while(col>=0){if(fn.call(_1a||this,row,col,cm)===true){return [row,col];}col--;}row--;}}else{if(col>=_1c){row++;_1f=false;}while(row<_1e){if(!_1f){col=0;}_1f=false;while(col<_1c){if(fn.call(_1a||this,row,col,cm)===true){return [row,col];}col++;}row++;}}return null;},getSelections:function(){return this.selModel.getSelections();},autoSize:function(){if(this.rendered){this.view.layout();if(this.view.adjustForScroll){this.view.adjustForScroll();}}},stopEditing:function(){},getSelectionModel:function(){if(!this.selModel){this.selModel=new Ext.grid.RowSelectionModel();}return this.selModel;},getDataSource:function(){return this.dataSource;},getColumnModel:function(){return this.colModel;},getView:function(){if(!this.view){this.view=new Ext.grid.GridView();}return this.view;},getDragDropText:function(){var _20=this.selModel.getCount();return String.format(this.ddText,_20,_20==1?"":"s");}});Ext.grid.Grid.prototype.ddText="{0} selected row{1}"; + +Ext.grid.AbstractGridView=function(){this.grid=null;this.events={"beforerowremoved":true,"beforerowsinserted":true,"beforerefresh":true,"rowremoved":true,"rowsinserted":true,"rowupdated":true,"refresh":true};Ext.grid.AbstractGridView.superclass.constructor.call(this);};Ext.extend(Ext.grid.AbstractGridView,Ext.util.Observable,{rowClass:"x-grid-row",cellClass:"x-grid-cell",tdClass:"x-grid-td",hdClass:"x-grid-hd",splitClass:"x-grid-hd-split",init:function(_1){this.grid=_1;var _2=this.grid.container.id;this.colSelector="#"+_2+" ."+this.cellClass+"-";this.tdSelector="#"+_2+" ."+this.tdClass+"-";this.hdSelector="#"+_2+" ."+this.hdClass+"-";this.splitSelector="#"+_2+" ."+this.splitClass+"-";},getColumnRenderers:function(){var _3=[];var cm=this.grid.colModel;var _5=cm.getColumnCount();for(var i=0;i<_5;i++){_3[i]=cm.getRenderer(i);}return _3;},getColumnIds:function(){var _7=[];var cm=this.grid.colModel;var _9=cm.getColumnCount();for(var i=0;i<_9;i++){_7[i]=cm.getColumnId(i);}return _7;},getDataIndexes:function(){if(!this.indexMap){this.indexMap=this.buildIndexMap();}return this.indexMap.colToData;},getColumnIndexByDataIndex:function(_b){if(!this.indexMap){this.indexMap=this.buildIndexMap();}return this.indexMap.dataToCol[_b];},setCSSStyle:function(_c,_d,_e){var _f="#"+this.grid.id+" .x-grid-col-"+_c;Ext.util.CSS.updateRule(_f,_d,_e);},generateRules:function(cm){var _11=[];for(var i=0,len=cm.getColumnCount();i","
        ","
        ","
        ","
        {lockedHeader}
        ","
        {lockedBody}
        ","
        ","
        ","
        {header}
        ","
        {body}
        ","
        ","
        ","","
         
        ","");_5.master.disableformats=true;}if(!_5.header){_5.header=new Ext.Template("","{cells}","
        {splits}");_5.header.disableformats=true;}_5.header.compile();if(!_5.hcell){_5.hcell=new Ext.Template("
        ","
        {value}
        ","
        ");_5.hcell.disableFormats=true;}_5.hcell.compile();if(!_5.hsplit){_5.hsplit=new Ext.Template("
         
        ");_5.hsplit.disableFormats=true;}_5.hsplit.compile();if(!_5.body){_5.body=new Ext.Template("","{rows}","
        ");_5.body.disableFormats=true;}_5.body.compile();if(!_5.row){_5.row=new Ext.Template("{cells}");_5.row.disableFormats=true;}_5.row.compile();if(!_5.cell){_5.cell=new Ext.Template("","
        {value}
        ","");_5.cell.disableFormats=true;}_5.cell.compile();this.templates=_5;},onColWidthChange:function(){this.updateColumns.apply(this,arguments);},onHeaderChange:function(){this.updateHeaders.apply(this,arguments);},onHiddenChange:function(){this.handleHiddenChange.apply(this,arguments);},onColumnMove:function(){this.handleColumnMove.apply(this,arguments);},onColumnLock:function(){this.handleLockChange.apply(this,arguments);},onDataChange:function(){this.refresh();this.updateHeaderSortState();},onClear:function(){this.refresh();},onUpdate:function(ds,_7){this.refreshRow(_7);},refreshRow:function(_8){var ds=this.ds,_a;if(typeof _8=="number"){_a=_8;_8=ds.getAt(_a);}else{_a=ds.indexOf(_8);}var _b=this.getRowComposite(_a);var _c=[];this.insertRows(ds,_a,_a,true);this.onRemove(ds,_8,_a+1,true);this.syncRowHeights(_a,_a);this.layout();this.fireEvent("rowupdated",this,_a,_8);},onAdd:function(ds,_e,_f){this.insertRows(ds,_f,_f+(_e.length-1));},onRemove:function(ds,_11,_12,_13){if(_13!==true){this.fireEvent("beforerowremoved",this,_12,_11);}var bt=this.getBodyTable(),lt=this.getLockedTable();if(bt.rows[_12]){bt.firstChild.removeChild(bt.rows[_12]);}if(lt.rows[_12]){lt.firstChild.removeChild(lt.rows[_12]);}if(_13!==true){this.stripeRows(_12);this.syncRowHeights(_12,_12);this.layout();this.fireEvent("rowremoved",this,_12,_11);}},onLoad:function(){this.scrollToTop();},scrollToTop:function(){if(this.scroller){this.scroller.dom.scrollTop=0;this.syncScroll();}},getHeaderPanel:function(_16){if(_16){this.headerPanel.show();}return this.headerPanel;},getFooterPanel:function(_17){if(_17){this.footerPanel.show();}return this.footerPanel;},initElements:function(){var E=Ext.Element;var el=this.grid.container.dom.firstChild;var cs=el.childNodes;this.el=new E(el);this.headerPanel=new E(el.firstChild);this.headerPanel.enableDisplayMode("block");this.scroller=new E(cs[1]);this.scrollSizer=new E(this.scroller.dom.firstChild);this.lockedWrap=new E(cs[2]);this.lockedHd=new E(this.lockedWrap.dom.firstChild);this.lockedBody=new E(this.lockedWrap.dom.childNodes[1]);this.mainWrap=new E(cs[3]);this.mainHd=new E(this.mainWrap.dom.firstChild);this.mainBody=new E(this.mainWrap.dom.childNodes[1]);this.footerPanel=new E(cs[4]);this.footerPanel.enableDisplayMode("block");this.focusEl=new E(cs[5]);this.focusEl.swallowEvent("click",true);this.resizeProxy=new E(cs[6]);this.headerSelector=String.format("#{0} td.x-grid-hd, #{1} td.x-grid-hd",this.lockedHd.id,this.mainHd.id);this.splitterSelector=String.format("#{0} div.x-grid-split, #{1} div.x-grid-split",this.lockedHd.id,this.mainHd.id);},getHeaderCell:function(_1b){return Ext.DomQuery.select(this.headerSelector)[_1b];},getHeaderCellMeasure:function(_1c){return this.getHeaderCell(_1c).firstChild;},getHeaderCellText:function(_1d){return this.getHeaderCell(_1d).firstChild.firstChild;},getLockedTable:function(){return this.lockedBody.dom.firstChild;},getBodyTable:function(){return this.mainBody.dom.firstChild;},getLockedRow:function(_1e){return this.getLockedTable().rows[_1e];},getRow:function(_1f){return this.getBodyTable().rows[_1f];},getRowComposite:function(_20){if(!this.rowEl){this.rowEl=new Ext.CompositeElementLite();}var els=[],_22,_23;if(_22=this.getLockedRow(_20)){els.push(_22);}if(_23=this.getRow(_20)){els.push(_23);}this.rowEl.elements=els;return this.rowEl;},getCell:function(_24,_25){var _26=this.cm.getLockedCount();var _27;if(_25<_26){_27=this.lockedBody.dom.firstChild;}else{_27=this.mainBody.dom.firstChild;_25-=_26;}return _27.rows[_24].childNodes[_25];},getCellText:function(_28,_29){return this.getCell(_28,_29).firstChild.firstChild;},getCellBox:function(_2a){var b=this.fly(_2a).getBox();if(Ext.isOpera){b.y=_2a.offsetTop+this.mainBody.getY();}return b;},getCellIndex:function(_2c){var id=String(_2c.className).match(this.cellRE);if(id){return parseInt(id[1],10);}return 0;},findHeaderIndex:function(n){var r=Ext.fly(n).findParent("td."+this.hdClass,6);return r?this.getCellIndex(r):false;},findHeaderCell:function(n){var r=Ext.fly(n).findParent("td."+this.hdClass,6);return r?r:false;},findRowIndex:function(n){if(!n){return false;}var r=Ext.fly(n).findParent("tr."+this.rowClass,6);return r?r.rowIndex:false;},findCellIndex:function(_34){var _35=this.el.dom;while(_34&&_34!=_35){if(this.findRE.test(_34.className)){return this.getCellIndex(_34);}_34=_34.parentNode;}return false;},getColumnId:function(_36){return this.cm.getColumnId(_36);},getSplitters:function(){if(this.splitterSelector){return Ext.DomQuery.select(this.splitterSelector);}else{return null;}},getSplitter:function(_37){return this.getSplitters()[_37];},onRowOver:function(e,t){var row;if((row=this.findRowIndex(t))!==false){this.getRowComposite(row).addClass("x-grid-row-over");}},onRowOut:function(e,t){var row;if((row=this.findRowIndex(t))!==false&&row!==this.findRowIndex(e.getRelatedTarget())){this.getRowComposite(row).removeClass("x-grid-row-over");}},renderHeaders:function(){var cm=this.cm;var ct=this.templates.hcell,ht=this.templates.header,st=this.templates.hsplit;var cb=[],lb=[],sb=[],lsb=[],p={};for(var i=0,len=cm.getColumnCount();i=this.ds.getCount()){return;}col=(col!==undefined?col:0);var cm=this.grid.colModel;while(cm.isHidden(col)){col++;}var el=this.getCell(row,col);if(!el){return;}var c=this.scroller.dom;var _56=parseInt(el.offsetTop,10);var _57=parseInt(el.offsetLeft,10);var _58=_56+el.offsetHeight;var _59=_57+el.offsetWidth;var ch=c.clientHeight-this.mainHd.dom.offsetHeight;var _5b=parseInt(c.scrollTop,10);var _5c=parseInt(c.scrollLeft,10);var _5d=_5b+ch;var _5e=_5c+c.clientWidth;if(_56<_5b){c.scrollTop=_56;}else{if(_58>_5d){c.scrollTop=_58-ch;}}if(_52!==false){if(_57<_5c){c.scrollLeft=_57;}else{if(_59>_5e){c.scrollLeft=_59-c.clientWidth;}}}return el;},updateColumns:function(){this.grid.stopEditing();var cm=this.grid.colModel,_60=this.getColumnIds();var pos=0;for(var i=0,len=cm.getColumnCount();i"+_79+"";var _80=b.firstChild.rows;for(var i=0,len=_80.length;i0){_141=_141||0;var _143=this.getBodyTable().rows;var _144=this.getLockedTable().rows;var len=_143.length-1;_142=Math.min(_142||len,len);for(var i=_141;i<=_142;i++){var m=_143[i],l=_144[i];var h=Math.max(m.offsetHeight,l.offsetHeight);m.style.height=l.style.height=h+"px";}}},layout:function(_14a,_14b){var g=this.grid;var auto=g.autoHeight;var _14e=16;var c=g.container,cm=this.cm,_151=g.autoExpandColumn,gv=this;if(!c.dom.offsetWidth){if(_14a){this.lockedWrap.show();this.mainWrap.show();}return;}var _153=this.cm.isLocked(0);var tbh=this.headerPanel.getHeight();var bbh=this.footerPanel.getHeight();if(auto){var ch=this.getBodyTable().offsetHeight+tbh+bbh+this.mainHd.getHeight();var _157=ch+c.getBorderWidth("tb");if(g.maxHeight){_157=Math.min(g.maxHeight,_157);}c.setHeight(_157);}if(g.autoWidth){c.setWidth(cm.getTotalWidth()+c.getBorderWidth("lr"));}var s=this.scroller;var _159=c.getSize(true);this.el.setSize(_159.width,_159.height);this.headerPanel.setWidth(_159.width);this.footerPanel.setWidth(_159.width);var _15a=this.mainHd.getHeight();var vw=_159.width;var vh=_159.height-(tbh+bbh);s.setSize(vw,vh);var bt=this.getBodyTable();var _15e=_153?Math.max(this.getLockedTable().offsetWidth,this.lockedHd.dom.firstChild.offsetWidth):0;var _15f=bt.offsetHeight;var _160=_15e+bt.offsetWidth;var _161=false,_162=false;this.scrollSizer.setSize(_160,_15f+_15a);var lw=this.lockedWrap,mw=this.mainWrap;var lb=this.lockedBody,mb=this.mainBody;setTimeout(function(){var t=s.dom.offsetTop;var w=s.dom.clientWidth,h=s.dom.clientHeight;lw.setTop(t);lw.setSize(_15e,h);mw.setLeftTop(_15e,t);mw.setSize(w-_15e,h);lb.setHeight(h-_15a);mb.setHeight(h-_15a);if(_14b!==true&&!gv.userResized&&_151){var ci=cm.getIndexById(_151);var tw=cm.getTotalWidth(false);var _16c=cm.getColumnWidth(ci);var cw=Math.min(Math.max(((w-tw)+_16c-2)-(w<=s.dom.offsetWidth?0:18),g.autoExpandMin),g.autoExpandMax);if(_16c!=cw){cm.setColumnWidth(ci,cw,true);gv.css.updateRule(gv.colSelector+_151,"width",(cw-gv.borderWidth)+"px");gv.css.updateRule(gv.hdSelector+_151,"width",(cw-gv.borderWidth)+"px");gv.updateSplitters();gv.layout(false,true);}}if(_14a){lw.show();mw.show();}},10);},onWindowResize:function(){if(!this.grid.monitorWindowResize||this.grid.autoHeight){return;}this.layout();},appendFooter:function(_16e){return null;},sortAscText:"Sort Ascending",sortDescText:"Sort Descending",lockText:"Lock Column",unlockText:"Unlock Column",columnsText:"Columns"}); + +Ext.grid.HeaderDragZone=function(_1,hd,_3){this.grid=_1;this.view=_1.getView();this.ddGroup="gridHeader"+this.grid.container.id;Ext.grid.HeaderDragZone.superclass.constructor.call(this,hd);if(_3){this.setHandleElId(Ext.id(hd));this.setOuterHandleElId(Ext.id(_3));}this.scroll=false;};Ext.extend(Ext.grid.HeaderDragZone,Ext.dd.DragZone,{maxDragWidth:120,getDragData:function(e){var t=Ext.lib.Event.getTarget(e);var h=this.view.findHeaderCell(t);if(h){return {ddel:h.firstChild,header:h};}return false;},onInitDrag:function(e){this.view.headersDisabled=true;var _8=this.dragData.ddel.cloneNode(true);_8.style.width=Math.min(this.dragData.header.offsetWidth,this.maxDragWidth)+"px";this.proxy.update(_8);return true;},afterValidDrop:function(){var v=this.view;setTimeout(function(){v.headersDisabled=false;},50);},afterInvalidDrop:function(){var v=this.view;setTimeout(function(){v.headersDisabled=false;},50);}});Ext.grid.HeaderDropZone=function(_b,hd,_d){this.grid=_b;this.view=_b.getView();this.proxyTop=Ext.DomHelper.append(document.body,{tag:"div",cls:"col-move-top",html:" "},true);this.proxyBottom=Ext.DomHelper.append(document.body,{tag:"div",cls:"col-move-bottom",html:" "},true);this.proxyTop.hide=this.proxyBottom.hide=function(){this.setLeftTop(-100,-100);this.setStyle("visibility","hidden");};this.ddGroup="gridHeader"+this.grid.container.id;Ext.grid.HeaderDropZone.superclass.constructor.call(this,_b.container.dom);};Ext.extend(Ext.grid.HeaderDropZone,Ext.dd.DropZone,{proxyOffsets:[-4,-9],fly:Ext.Element.fly,getTargetFromEvent:function(e){var t=Ext.lib.Event.getTarget(e);var _10=this.view.findCellIndex(t);if(_10!==false){return this.view.getHeaderCell(_10);}},nextVisible:function(h){var v=this.view,cm=this.grid.colModel;h=h.nextSibling;while(h){if(!cm.isHidden(v.getCellIndex(h))){return h;}h=h.nextSibling;}return null;},prevVisible:function(h){var v=this.view,cm=this.grid.colModel;h=h.prevSibling;while(h){if(!cm.isHidden(v.getCellIndex(h))){return h;}h=h.prevSibling;}return null;},positionIndicator:function(h,n,e){var x=Ext.lib.Event.getPageX(e);var r=Ext.lib.Dom.getRegion(n.firstChild);var px,pt,py=r.top+this.proxyOffsets[1];if((r.right-x)<=(r.right-r.left)/2){px=r.right+this.view.borderWidth;pt="after";}else{px=r.left;pt="before";}var _1f=this.view.getCellIndex(h);var _20=this.view.getCellIndex(n);var _21=this.grid.colModel.isLocked(_20);if(pt=="after"){_20++;}if(_1f<_20){_20--;}if(_1f==_20&&(_21==this.grid.colModel.isLocked(_1f))){return false;}px+=this.proxyOffsets[0];this.proxyTop.setLeftTop(px,py);this.proxyTop.show();if(!this.bottomOffset){this.bottomOffset=this.view.mainHd.getHeight();}this.proxyBottom.setLeftTop(px,py+this.proxyTop.dom.offsetHeight+this.bottomOffset);this.proxyBottom.show();return pt;},onNodeEnter:function(n,dd,e,_25){if(_25.header!=n){this.positionIndicator(_25.header,n,e);}},onNodeOver:function(n,dd,e,_29){var _2a=false;if(_29.header!=n){_2a=this.positionIndicator(_29.header,n,e);}if(!_2a){this.proxyTop.hide();this.proxyBottom.hide();}return _2a?this.dropAllowed:this.dropNotAllowed;},onNodeOut:function(n,dd,e,_2e){this.proxyTop.hide();this.proxyBottom.hide();},onNodeDrop:function(n,dd,e,_32){var h=_32.header;if(h!=n){var cm=this.grid.colModel;var x=Ext.lib.Event.getPageX(e);var r=Ext.lib.Dom.getRegion(n.firstChild);var pt=(r.right-x)<=((r.right-r.left)/2)?"after":"before";var _38=this.view.getCellIndex(h);var _39=this.view.getCellIndex(n);var _3a=cm.isLocked(_39);if(pt=="after"){_39++;}if(_38<_39){_39--;}if(_38==_39&&(_3a==cm.isLocked(_38))){return false;}cm.setLocked(_38,_3a,true);cm.moveColumn(_38,_39);this.grid.fireEvent("columnmove",_38,_39);return true;}return false;}}); + +Ext.grid.SplitDragZone=function(_1,hd,_3){this.grid=_1;this.view=_1.getView();this.proxy=this.view.resizeProxy;Ext.grid.SplitDragZone.superclass.constructor.call(this,hd,"gridSplitters"+this.grid.container.id,{dragElId:Ext.id(this.proxy.dom),resizeFrame:false});this.setHandleElId(Ext.id(hd));this.setOuterHandleElId(Ext.id(_3));this.scroll=false;};Ext.extend(Ext.grid.SplitDragZone,Ext.dd.DDProxy,{fly:Ext.Element.fly,b4StartDrag:function(x,y){this.view.headersDisabled=true;this.proxy.setHeight(this.view.mainWrap.getHeight());var w=this.cm.getColumnWidth(this.cellIndex);var _7=Math.max(w-this.grid.minColumnWidth,0);this.resetConstraints();this.setXConstraint(_7,1000);this.setYConstraint(0,0);this.minX=x-_7;this.maxX=x+1000;this.startPos=x;Ext.dd.DDProxy.prototype.b4StartDrag.call(this,x,y);},handleMouseDown:function(e){ev=Ext.EventObject.setEvent(e);var t=this.fly(ev.getTarget());if(t.hasClass("x-grid-split")){this.cellIndex=this.view.getCellIndex(t.dom);this.split=t.dom;this.cm=this.grid.colModel;if(this.cm.isResizable(this.cellIndex)&&!this.cm.isFixed(this.cellIndex)){Ext.grid.SplitDragZone.superclass.handleMouseDown.apply(this,arguments);}}},endDrag:function(e){this.view.headersDisabled=false;var _b=Math.max(this.minX,Ext.lib.Event.getPageX(e));var _c=_b-this.startPos;this.view.onColumnSplitterMoved(this.cellIndex,this.cm.getColumnWidth(this.cellIndex)+_c);},autoOffset:function(){this.setDelta(0,0);}}); + +Ext.grid.GridDragZone=function(_1,_2){this.view=_1.getView();Ext.grid.GridDragZone.superclass.constructor.call(this,this.view.lockedBody.dom,_2);this.setHandleElId(Ext.id(this.view.lockedBody.dom));this.setOuterHandleElId(Ext.id(this.view.mainBody.dom));this.scroll=false;this.grid=_1;this.ddel=document.createElement("div");this.ddel.className="x-grid-dd-wrap";};Ext.extend(Ext.grid.GridDragZone,Ext.dd.DragZone,{ddGroup:"GridDD",getDragData:function(e){var t=Ext.lib.Event.getTarget(e);var _5=this.view.findRowIndex(t);if(_5!==false){var sm=this.grid.selModel;if(!sm.isSelected(_5)||e.hasModifier()){sm.handleMouseDown(e,t);}return {grid:this.grid,ddel:this.ddel,rowIndex:_5,selections:sm.getSelections()};}return false;},onInitDrag:function(e){var _8=this.dragData;this.ddel.innerHTML=this.grid.getDragDropText();this.proxy.update(this.ddel);},afterRepair:function(){this.dragging=false;},getRepairXY:function(e,_a){return false;},onEndDrag:function(_b,e){},onValidDrop:function(dd,e,id){this.hideProxy();},beforeInvalidDrop:function(e,id){}}); + +Ext.grid.ColumnModel=function(_1){Ext.grid.ColumnModel.superclass.constructor.call(this);this.config=_1;this.lookup={};for(var i=0,_3=_1.length;i<_3;i++){if(typeof _1[i].dataIndex=="undefined"){_1[i].dataIndex=i;}if(typeof _1[i].renderer=="string"){_1[i].renderer=Ext.util.Format[_1[i].renderer];}if(typeof _1[i].id=="undefined"){_1[i].id=i;}this.lookup[_1[i].id]=_1[i];}this.defaultWidth=100;this.defaultSortable=false;this.addEvents({"widthchange":true,"headerchange":true,"hiddenchange":true,"columnmoved":true,"columnlockchange":true});Ext.grid.ColumnModel.superclass.constructor.call(this);};Ext.extend(Ext.grid.ColumnModel,Ext.util.Observable,{getColumnId:function(_4){return this.config[_4].id;},getColumnById:function(id){return this.lookup[id];},getIndexById:function(id){for(var i=0,_8=this.config.length;i<_8;i++){if(this.config[i].id==id){return i;}}return -1;},moveColumn:function(_9,_a){var c=this.config[_9];this.config.splice(_9,1);this.config.splice(_a,0,c);this.dataMap=null;this.fireEvent("columnmoved",this,_9,_a);},isLocked:function(_c){return this.config[_c].locked===true;},setLocked:function(_d,_e,_f){if(this.isLocked(_d)==_e){return;}this.config[_d].locked=_e;if(!_f){this.fireEvent("columnlockchange",this,_d,_e);}},getTotalLockedWidth:function(){var _10=0;for(var i=0;i0;},isSelected:function(_21){var r=typeof _21=="number"?this.grid.dataSource.getAt(_21):_21;return (r&&this.selections.key(r.id)?true:false);},isIdSelected:function(id){return (this.selections.key(id)?true:false);},handleMouseDown:function(e,t){var _26=this.grid.getView(),_27;if(this.isLocked()||(_27=_26.findRowIndex(t))===false){return;}if(e.shiftKey&&this.last!==false){var _28=this.last;this.selectRange(_28,_27,e.ctrlKey);this.last=_28;_26.focusRow(_27);}else{var _29=this.isSelected(_27);if(e.button!=0&&_29){_26.focusRow(_27);}else{if(e.ctrlKey&&_29){this.deselectRow(_27);}else{this.selectRow(_27,e.button==0&&(e.ctrlKey||e.shiftKey));_26.focusRow(_27);}}}},selectRows:function(_2a,_2b){if(!_2b){this.clearSelections();}for(var i=0,len=_2a.length;i=_2f;i--){this.selectRow(i,true);}}},deselectRange:function(_32,_33,_34){if(this.locked){return;}for(var i=_32;i<=_33;i++){this.deselectRow(i,_34);}},selectRow:function(_36,_37,_38){if(this.locked||(_36<0||_36>=this.grid.dataSource.getCount())){return;}if(this.fireEvent("beforerowselect",this,_36,_37)!==false){if(!_37||this.singleSelect){this.clearSelections();}var r=this.grid.dataSource.getAt(_36);this.selections.add(r);this.last=this.lastActive=_36;if(!_38){this.grid.getView().onRowSelect(_36);}this.fireEvent("rowselect",this,_36,r);this.fireEvent("selectionchange",this);}},deselectRow:function(_3a,_3b){if(this.locked){return;}if(this.last==_3a){this.last=false;}if(this.lastActive==_3a){this.lastActive=false;}var r=this.grid.dataSource.getAt(_3a);this.selections.remove(r);if(!_3b){this.grid.getView().onRowDeselect(_3a);}this.fireEvent("rowdeselect",this,_3a);this.fireEvent("selectionchange",this);},restoreLast:function(){if(this._last){this.last=this._last;}},acceptsNav:function(row,col,cm){return !cm.isHidden(col)&&cm.isCellEditable(col,row);},onEditorKey:function(_40,e){var k=e.getKey(),_43,g=this.grid,ed=g.activeEditor;if(k==e.TAB){ed.completeEdit();if(e.shiftKey){_43=g.walkCells(ed.row,ed.col-1,-1,this.acceptsNav,this);}else{_43=g.walkCells(ed.row,ed.col+1,1,this.acceptsNav,this);}e.stopEvent();}else{if(k==e.ENTER&&!e.ctrlKey){ed.completeEdit();if(e.shiftKey){_43=g.walkCells(ed.row-1,ed.col,-1,this.acceptsNav,this);}else{_43=g.walkCells(ed.row+1,ed.col,1,this.acceptsNav,this);}e.stopEvent();}else{if(k==e.ESC){ed.cancelEdit();}}}if(_43){g.startEditing(_43[0],_43[1]);}}}); + +Ext.grid.CellSelectionModel=function(_1){Ext.apply(this,_1);this.selection=null;this.addEvents({"beforecellselect":true,"cellselect":true,"selectionchange":true});};Ext.extend(Ext.grid.CellSelectionModel,Ext.grid.AbstractSelectionModel,{initEvents:function(){this.grid.on("mousedown",this.handleMouseDown,this);this.grid.container.on(Ext.isIE?"keydown":"keypress",this.handleKeyDown,this);var _2=this.grid.view;_2.on("refresh",this.onViewChange,this);_2.on("rowupdated",this.onRowUpdated,this);_2.on("beforerowremoved",this.clearSelections,this);_2.on("beforerowsinserted",this.clearSelections,this);if(this.grid.isEditor){this.grid.on("beforeedit",this.beforeEdit,this);}},beforeEdit:function(e){this.select(e.row,e.column,false,true,e.record);},onRowUpdated:function(v,_5,r){if(this.selection&&this.selection.record==r){v.onCellSelect(_5,this.selection.cell[1]);}},onViewChange:function(){this.clearSelections(true);},getSelectedCell:function(){return this.selection?this.selection.cell:null;},clearSelections:function(_7){var s=this.selection;if(s){if(_7!==true){this.grid.view.onCellDeselect(s.cell[0],s.cell[1]);}this.selection=null;this.fireEvent("selectionchange",this,null);}},hasSelection:function(){return this.selection?true:false;},handleMouseDown:function(e,t){var v=this.grid.getView();if(this.isLocked()){return;}var _c=v.findRowIndex(t);var _d=v.findCellIndex(t);if(_c!==false&&_d!==false){this.select(_c,_d);}},select:function(_e,_f,_10,_11,r){if(this.fireEvent("beforecellselect",this,_e,_f)!==false){this.clearSelections();r=r||this.grid.dataSource.getAt(_e);this.selection={record:r,cell:[_e,_f]};if(!_10){var v=this.grid.getView();v.onCellSelect(_e,_f);if(_11!==true){v.focusCell(_e,_f);}}this.fireEvent("cellselect",this,_e,_f);this.fireEvent("selectionchange",this,this.selection);}},isSelectable:function(_14,_15,cm){return !cm.isHidden(_15);},handleKeyDown:function(e){if(!e.isNavKeyPress()){return;}var g=this.grid,s=this.selection;if(!s){e.stopEvent();var _1a=g.walkCells(0,0,1,this.isSelectable,this);if(_1a){this.select(_1a[0],_1a[1]);}return;}var sm=this;var _1c=function(row,col,_1f){return g.walkCells(row,col,_1f,sm.isSelectable,sm);};var k=e.getKey(),r=s.cell[0],c=s.cell[1];var _23;switch(k){case e.TAB:if(e.shiftKey){_23=_1c(r,c-1,-1);}else{_23=_1c(r,c+1,1);}break;case e.DOWN:_23=_1c(r+1,c,1);break;case e.UP:_23=_1c(r-1,c,-1);break;case e.RIGHT:_23=_1c(r,c+1,1);break;case e.LEFT:_23=_1c(r,c-1,-1);break;case e.ENTER:if(g.isEditor&&!g.editing){g.startEditing(r,c);e.stopEvent();return;}break;}if(_23){this.select(_23[0],_23[1]);e.stopEvent();}},acceptsNav:function(row,col,cm){return !cm.isHidden(col)&&cm.isCellEditable(col,row);},onEditorKey:function(_27,e){var k=e.getKey(),_2a,g=this.grid,ed=g.activeEditor;if(k==e.TAB){if(e.shiftKey){_2a=g.walkCells(ed.row,ed.col-1,-1,this.acceptsNav,this);}else{_2a=g.walkCells(ed.row,ed.col+1,1,this.acceptsNav,this);}e.stopEvent();}else{if(k==e.ENTER&&!e.ctrlKey){ed.completeEdit();e.stopEvent();}else{if(k==e.ESC){ed.cancelEdit();}}}if(_2a){g.startEditing(_2a[0],_2a[1]);}}}); + +Ext.grid.EditorGrid=function(_1,_2){Ext.grid.EditorGrid.superclass.constructor.call(this,_1,_2);this.container.addClass("xedit-grid");if(!this.selModel){this.selModel=new Ext.grid.CellSelectionModel();}this.activeEditor=null;this.addEvents({"beforeedit":true,"afteredit":true,"validateedit":true});this.on("bodyscroll",this.stopEditing,this);this.on(this.clicksToEdit==1?"cellclick":"celldblclick",this.onCellDblClick,this);};Ext.extend(Ext.grid.EditorGrid,Ext.grid.Grid,{isEditor:true,clicksToEdit:2,trackMouseOver:false,onCellDblClick:function(g,_4,_5){this.startEditing(_4,_5);},onEditComplete:function(ed,_7,_8){this.editing=false;this.activeEditor=null;ed.un("specialkey",this.selModel.onEditorKey,this.selModel);if(String(_7)!=String(_8)){var r=ed.record;var _a=this.colModel.getDataIndex(ed.col);var e={grid:this,record:r,field:_a,originalValue:_8,value:_7,row:ed.row,column:ed.col,cancel:false};if(this.fireEvent("validateedit",e)!==false&&!e.cancel){r.set(_a,e.value);delete e.cancel;this.fireEvent("afteredit",e);}}this.view.focusCell(ed.row,ed.col);},startEditing:function(_c,_d){this.stopEditing();if(this.colModel.isCellEditable(_d,_c)){this.view.focusCell(_c,_d);var r=this.dataSource.getAt(_c);var _f=this.colModel.getDataIndex(_d);var e={grid:this,record:r,field:_f,value:r.data[_f],row:_c,column:_d,cancel:false};if(this.fireEvent("beforeedit",e)!==false&&!e.cancel){this.editing=true;(function(){var ed=this.colModel.getCellEditor(_d,_c);ed.row=_c;ed.col=_d;ed.record=r;ed.on("complete",this.onEditComplete,this,{single:true});ed.on("specialkey",this.selModel.onEditorKey,this.selModel);this.activeEditor=ed;var v=r.data[_f];ed.startEdit(this.view.getCell(_c,_d),v);}).defer(50,this);}}},stopEditing:function(){if(this.activeEditor){this.activeEditor.completeEdit();}this.activeEditor=null;}}); + +Ext.grid.GridEditor=function(_1,_2){Ext.grid.GridEditor.superclass.constructor.call(this,_1,_2);_1.monitorTab=false;};Ext.extend(Ext.grid.GridEditor,Ext.Editor,{alignment:"tl-tl",autoSize:"width",hideEl:false,cls:"x-small-editor x-grid-editor",shim:false,shadow:"frame"}); + +Ext.grid.PropertyRecord=Ext.data.Record.create([{name:"name",type:"string"},"value"]);Ext.grid.PropertyStore=function(_1,_2){this.grid=_1;this.store=new Ext.data.Store({recordType:Ext.grid.PropertyRecord});this.store.on("update",this.onUpdate,this);if(_2){this.setSource(_2);}Ext.grid.PropertyStore.superclass.constructor.call(this);};Ext.extend(Ext.grid.PropertyStore,Ext.util.Observable,{setSource:function(o){this.source=o;this.store.removeAll();var _4=[];for(var k in o){if(this.isEditableValue(o[k])){_4.push(new Ext.grid.PropertyRecord({name:k,value:o[k]},k));}}this.store.loadRecords({records:_4},{},true);},onUpdate:function(ds,_7,_8){if(_8==Ext.data.Record.EDIT){var v=_7.data["value"];var _a=_7.modified["value"];if(this.grid.fireEvent("beforepropertychange",this.source,_7.id,v,_a)!==false){this.source[_7.id]=v;_7.commit();this.grid.fireEvent("propertychange",this.source,_7.id,v,_a);}else{_7.reject();}}},getProperty:function(_b){return this.store.getAt(_b);},isEditableValue:function(_c){if(_c&&_c instanceof Date){return true;}else{if(typeof _c=="object"||typeof _c=="function"){return false;}}return true;},setValue:function(_d,_e){this.source[_d]=_e;this.store.getById(_d).set("value",_e);},getSource:function(){return this.source;}});Ext.grid.PropertyColumnModel=function(_f,_10){this.grid=_f;var g=Ext.grid;g.PropertyColumnModel.superclass.constructor.call(this,[{header:this.nameText,sortable:true,dataIndex:"name",id:"name"},{header:this.valueText,resizable:false,dataIndex:"value",id:"value"}]);this.store=_10;this.bselect=Ext.DomHelper.append(document.body,{tag:"select",style:"display:none",cls:"x-grid-editor",children:[{tag:"option",value:"true",html:"true"},{tag:"option",value:"false",html:"false"}]});Ext.id(this.bselect);var f=Ext.form;this.editors={"date":new g.GridEditor(new f.DateField({selectOnFocus:true})),"string":new g.GridEditor(new f.TextField({selectOnFocus:true})),"number":new g.GridEditor(new f.NumberField({selectOnFocus:true,style:"text-align:left;"})),"boolean":new g.GridEditor(new f.Field({el:this.beselect,selectOnFocus:true}))};this.renderCellDelegate=this.renderCell.createDelegate(this);this.renderPropDelegate=this.renderProp.createDelegate(this);};Ext.extend(Ext.grid.PropertyColumnModel,Ext.grid.ColumnModel,{nameText:"Name",valueText:"Value",dateFormat:"m/j/Y",renderDate:function(_13){return _13.dateFormat(this.dateFormat);},renderBool:function(_14){return _14?"true":"false";},isCellEditable:function(_15,_16){return _15==1;},getRenderer:function(col){return col==1?this.renderCellDelegate:this.renderPropDelegate;},renderProp:function(v){return this.getPropertyName(v);},renderCell:function(val){var rv=val;if(val instanceof Date){rv=this.renderDate(val);}else{if(typeof val=="boolean"){rv=this.renderBool(val);}}return Ext.util.Format.htmlEncode(rv);},getPropertyName:function(_1b){var pn=this.grid.propertyNames;return pn&&pn[_1b]?pn[_1b]:_1b;},getCellEditor:function(_1d,_1e){var p=this.store.getProperty(_1e);var n=p.data["name"],val=p.data["value"];if(this.grid.customEditors[n]){return this.grid.customEditors[n];}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"];}}}}});Ext.grid.PropertyGrid=function(_22,_23){_23=_23||{};var _24=new Ext.grid.PropertyStore(this);this.store=_24;var cm=new Ext.grid.PropertyColumnModel(this,_24);_24.store.sort("name","ASC");Ext.grid.PropertyGrid.superclass.constructor.call(this,_22,Ext.apply({ds:_24.store,cm:cm,enableColLock:false,enableColumnMove:false,stripeRows:false,trackMouseOver:false,clicksToEdit:1},_23));this.container.addClass("x-props-grid");this.lastEditRow=null;this.on("columnresize",this.onColumnResize,this);this.addEvents({beforepropertychange:true,propertychange:true});this.customEditors=this.customEditors||{};};Ext.extend(Ext.grid.PropertyGrid,Ext.grid.EditorGrid,{render:function(){Ext.grid.PropertyGrid.superclass.render.call(this);this.autoSize.defer(100,this);},autoSize:function(){Ext.grid.PropertyGrid.superclass.autoSize.call(this);if(this.view){this.view.fitColumns();}},onColumnResize:function(){this.colModel.setColumnWidth(1,this.container.getWidth(true)-this.colModel.getColumnWidth(0));this.autoSize();},setSource:function(_26){this.store.setSource(_26);},getSource:function(){return this.store.getSource();}}); + +Ext.LoadMask=function(el,_2){this.el=Ext.get(el);Ext.apply(this,_2);if(this.store){this.store.on("beforeload",this.onBeforeLoad,this);this.store.on("load",this.onLoad,this);this.store.on("loadexception",this.onLoad,this);this.removeMask=false;}else{var um=this.el.getUpdateManager();um.showLoadIndicator=false;um.on("beforeupdate",this.onBeforeLoad,this);um.on("update",this.onLoad,this);um.on("failure",this.onLoad,this);this.removeMask=true;}};Ext.LoadMask.prototype={msg:"Loading...",msgCls:"x-mask-loading",disabled:false,disable:function(){this.disabled=true;},enable:function(){this.disabled=false;},onLoad:function(){this.el.unmask(this.removeMask);},onBeforeLoad:function(){if(!this.disabled){this.el.mask(this.msg,this.msgCls);}},destroy:function(){if(this.store){this.store.un("beforeload",this.onBeforeLoad,this);this.store.un("load",this.onLoad,this);this.store.un("loadexception",this.onLoad,this);}else{var um=this.el.getUpdateManager();um.un("beforeupdate",this.onBeforeLoad,this);um.un("update",this.onLoad,this);um.un("failure",this.onLoad,this);}}}; + +Ext.debug={init:function(){var CP=Ext.ContentPanel;var bd=Ext.get(document.body);var _3=new Ext.LayoutDialog("x-debug-browser",{autoCreate:true,width:800,height:450,title:"Ext Debug Console & Inspector",proxyDrag:true,shadow:true,center:{alwaysShowTabs:true},constraintoviewport:false});_3.el.swallowEvent("click");var _4=_3.getLayout();_4.beginUpdate();var _5=_4.add("center",new Ext.debug.InnerLayout("x-debug-console",400,{title:"Debug Console"}));var _6=_4.add("center",new Ext.debug.InnerLayout("x-debug-inspector",250,{title:"DOM Inspector"}));var _7=_5.add("east",new CP({autoCreate:{tag:"div",children:[{tag:"div"},{tag:"textarea"}]},fitContainer:true,fitToFrame:true,title:"Script Console",autoScroll:Ext.isGecko,setSize:function(w,h){Ext.ContentPanel.prototype.setSize.call(this,w,h);if(Ext.isGecko&&Ext.isStrict){var s=this.adjustForComponents(w,h);this.resizeEl.setSize(s.width-2,s.height-2);}}}));var _b=_7.el;var _c=_b.child("textarea");_7.resizeEl=_c;var _d=_7.toolbar=new Ext.Toolbar(_b.child("div"));_d.add({text:"Run",handler:function(){var s=_c.dom.value;if(_f.checked){try{var rt=eval(s);Ext.debug.dump(rt===undefined?"(no return)":rt);}catch(e){Ext.debug.log(e.message||e.descript);}}else{var rt=eval(s);Ext.debug.dump(rt===undefined?"(no return)":rt);}}},{text:"Clear",handler:function(){_c.dom.value="";_c.dom.focus();}});var _f=Ext.DomHelper.append(_d.el,{tag:"input",type:"checkbox",checked:"checked"});_f.checked=true;_d.add("-",_f,"Trap Errors");var _11=new Ext.grid.PropertyGrid(bd.createChild(),{nameText:"Style",enableCtxMenu:false,enableColumnResize:false});var _12=_6.add("east",new Ext.GridPanel(_11,{title:"(No element selected)"}));_11.render();_11.getView().mainHd.setDisplayed(false);_5.tbar.add({text:"Clear",handler:function(){Ext.debug.console.jsonData=[];Ext.debug.console.refresh();}});var _13=_6.main.getEl();var tb=_6.tbar;var _15,_16;function inspectListener(e,t){if(!_15.contains(e.getPoint())){findNode(t);}}function stopInspecting(e,t){if(!_15.contains(e.getPoint())){_1b.toggle(false);if(findNode(t)!==false){e.stopEvent();}}}function stopInspectingEsc(e,t){if(e.getKey()==e.ESC){_1b.toggle(false);}}var _1b=tb.addButton({text:"Inspect",enableToggle:true,pressed:false,toggleHandler:function(n,_1f){var d=Ext.get(document);if(_1f){d.on("mouseover",inspectListener,window,{buffer:50});d.on("mousedown",stopInspecting);d.on("keydown",stopInspectingEsc);_15=_3.el.getRegion();_16=true;}else{d.un("mouseover",inspectListener);d.un("mousedown",stopInspecting);d.on("keydown",stopInspectingEsc);_16=false;var n=_21.getSelectionModel().getSelectedNode();if(n&&n.htmlNode){onNodeSelect(_21,n,false);}}}});tb.addSeparator();var _22=tb.addButton({text:"Highlight Selection",enableToggle:true,pressed:false,toggleHandler:function(n,_24){var n=_21.getSelectionModel().getSelectedNode();if(n&&n.htmlNode){n[_24?"frame":"unframe"]();}}});tb.addSeparator();var _25=tb.addButton({text:"Refresh Children",disabled:true,handler:function(){var n=_21.getSelectionModel().getSelectedNode();if(n&&n.reload){n.reload();}}});tb.add("-",{text:"Collapse All",handler:function(){_21.root.collapse(true);}});_4.endUpdate();_4.getRegion("center").showPanel(0);_11.on("propertychange",function(s,_28,_29){var _2a=_11.treeNode;if(_2b){_2a.htmlNode.style[_28]=_29;}else{_2a.htmlNode[_28]=_29;}_2a.refresh(true);});var stb=new Ext.Toolbar(_11.view.getHeaderPanel(true));var _2d=stb.addButton({text:"DOM Attributes",menu:{items:[new Ext.menu.CheckItem({id:"dom",text:"DOM Attributes",checked:true,group:"xdb-styles"}),new Ext.menu.CheckItem({id:"styles",text:"CSS Properties",group:"xdb-styles"})]}});_2d.menu.on("click",function(){_2b=_2d.menu.items.get("styles").checked;_2e[_2b?"show":"hide"]();_2d.setText(_2b?"CSS Properties":"DOM Attributes");var n=_21.getSelectionModel().getSelectedNode();if(n){onNodeSelect(_21,n);}});var _30=stb.addButton({text:"Add",disabled:true,handler:function(){Ext.MessageBox.prompt("Add Property","Property Name:",function(btn,v){var _33=_11.store.store;if(btn=="ok"&&v&&!_33.getById(v)){var r=new Ext.grid.PropertyRecord({name:v,value:""},v);_33.add(r);_11.startEditing(_33.getCount()-1,1);}});}});var _2e=stb.addButton({text:"Computed Styles",hidden:true,pressed:false,enableToggle:true,toggleHandler:function(){var n=_21.getSelectionModel().getSelectedNode();if(n){onNodeSelect(_21,n);}}});var _2b=false,_36;var _37=/^\s*$/;var _38=Ext.util.Format.htmlEncode;var _39=Ext.util.Format.ellipsis;var _3a=/\s?([a-z\-]*)\:([^;]*)(?:[;\s\n\r]*)/gi;function findNode(n){if(!n||n.nodeType!=1||n==document.body||n==document){return false;}var pn=[n],p=n;while((p=p.parentNode)&&p.nodeType==1&&p.tagName.toUpperCase()!="HTML"){pn.unshift(p);}var cn=_36;for(var i=0,len=pn.length;i"+_39(_38(String(c.nodeValue)),35)+"",cls:"x-tree-noicon"}));}}}cb();};var _21=new Ext.tree.TreePanel(_13,{enableDD:false,loader:_57,lines:false,rootVisible:false,animate:false,hlColor:"ffff9c"});_21.getSelectionModel().on("selectionchange",onNodeSelect,null,{buffer:250});var _5e=_21.setRootNode(new Ext.tree.TreeNode("Ext"));_36=_5e.appendChild(new Ext.debug.HtmlNode(document.getElementsByTagName("html")[0]));_21.render();Ext.debug.console=new Ext.JsonView(_5.main.getEl(),"
        > {msg}
        ");Ext.debug.console.jsonData=[];Ext.debug.dialog=_3;},show:function(){var d=Ext.debug;if(!d.dialog){d.init();}if(!d.dialog.isVisible()){d.dialog.show();}},hide:function(){if(Ext.debug.dialog){Ext.debug.dialog.hide();}},log:function(_60,_61,etc){Ext.debug.show();var m="";for(var i=0,len=arguments.length;i3){s=s.substr(0,s.length-2);}Ext.debug.log(s+"\n}");}}}}},_timers:{},time:function(_70){_70=_70||"def";Ext._timers[_70]=new Date().getTime();},timeEnd:function(_71,_72){var t=new Date().getTime();_71=_71||"def";var v=String.format("{0} ms",t-Ext._timers[_71]);Ext._timers[_71]=new Date().getTime();if(_72!==false){Ext.debug.log("Timer "+(_71=="def"?v:_71+": "+v));}return v;}};Ext.debug.HtmlNode=function(){var _75=Ext.util.Format.htmlEncode;var _76=Ext.util.Format.ellipsis;var _77=/^\s*$/;var _78=[{n:"id",v:"id"},{n:"className",v:"class"},{n:"name",v:"name"},{n:"type",v:"type"},{n:"src",v:"src"},{n:"href",v:"href"}];function hasChild(n){for(var i=0,c;c=n.childNodes[i];i++){if(c.nodeType==1){return true;}}return false;}function renderNode(n,_7d){var tag=n.tagName.toLowerCase();var s="<"+tag;for(var i=0,len=_78.length;i"+_75(v)+""";}}var _84=n.style?n.style.cssText:"";if(_84){s+=" style=""+_75(_84.toLowerCase())+""";}if(_7d&&n.childNodes.length>0){s+=">"+_76(_75(String(n.innerHTML)),35)+"</"+tag+">";}else{if(_7d){s+=" />";}else{s+=">";}}return s;}var _85=function(n){var _87=!hasChild(n);this.htmlNode=n;this.tagName=n.tagName.toLowerCase();var _88={text:renderNode(n,_87),leaf:_87,cls:"x-tree-noicon"};_85.superclass.constructor.call(this,_88);this.attributes.htmlNode=n;if(!_87){this.on("expand",this.onExpand,this);this.on("collapse",this.onCollapse,this);}};Ext.extend(_85,Ext.tree.AsyncTreeNode,{cls:"x-tree-noicon",preventHScroll:true,refresh:function(_89){var _8a=!hasChild(this.htmlNode);this.setText(renderNode(this.htmlNode,_8a));if(_89){Ext.fly(this.ui.textNode).highlight();}},onExpand:function(){if(!this.closeNode&&this.parentNode){this.closeNode=this.parentNode.insertBefore(new Ext.tree.TreeNode({text:"</"+this.tagName+">",cls:"x-tree-noicon"}),this.nextSibling);}else{if(this.closeNode){this.closeNode.ui.show();}}},onCollapse:function(){if(this.closeNode){this.closeNode.ui.hide();}},render:function(_8b){_85.superclass.render.call(this,_8b);},highlightNode:function(){},highlight:function(){},frame:function(){this.htmlNode.style.border="1px solid #0000ff";},unframe:function(){this.htmlNode.style.border="";}});return _85;}();Ext.debug.InnerLayout=function(id,w,cfg){var el=Ext.DomHelper.append(document.body,{id:id});var _90=new Ext.BorderLayout(el,{north:{initialSize:28},center:{titlebar:false},east:{split:true,initialSize:w,titlebar:true}});Ext.debug.InnerLayout.superclass.constructor.call(this,_90,cfg);_90.beginUpdate();var _91=_90.add("north",new Ext.ContentPanel({autoCreate:true,fitToFrame:true}));this.main=_90.add("center",new Ext.ContentPanel({autoCreate:true,fitToFrame:true,autoScroll:true}));this.tbar=new Ext.Toolbar(_91.el);var _92=_91.resizeEl=_91.el.child("div.x-toolbar");_92.setStyle("border-bottom","0 none");_90.endUpdate(true);};Ext.extend(Ext.debug.InnerLayout,Ext.NestedLayoutPanel,{add:function(){return this.layout.add.apply(this.layout,arguments);}});Ext.debug.cssList=["background-color","border","border-color","border-spacing","border-style","border-top","border-right","border-bottom","border-left","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-width","border-right-width","border-bottom-width","border-left-width","border-width","bottom","color","font-size","font-size-adjust","font-stretch","font-style","height","left","letter-spacing","line-height","margin","margin-top","margin-right","margin-bottom","margin-left","marker-offset","max-height","max-width","min-height","min-width","orphans","outline","outline-color","outline-style","outline-width","overflow","padding","padding-top","padding-right","padding-bottom","padding-left","quotes","right","size","text-indent","top","width","word-spacing","z-index","opacity","outline-offset"];if(typeof console=="undefined"){console=Ext.debug;}Ext.EventManager.on(window,"load",function(){Ext.get(document).on("keydown",function(e){if(e.ctrlKey&&e.shiftKey&&e.getKey()==e.HOME){Ext.debug.show();}});});Ext.print=Ext.log=Ext.debug.log;Ext.printf=Ext.logf=Ext.debug.logf;Ext.dump=Ext.debug.dump;Ext.timer=Ext.debug.time;Ext.timerEnd=Ext.debug.timeEnd; + diff --git a/www/extras/yui-ext/ext-back-compat.js b/www/extras/yui-ext/ext-back-compat.js new file mode 100644 index 000000000..ae056d937 --- /dev/null +++ b/www/extras/yui-ext/ext-back-compat.js @@ -0,0 +1,14 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +YAHOO.ext=Ext;YAHOO.extendX=Ext.extend;YAHOO.namespaceX=Ext.namespace;Ext.Strict=Ext.isStrict;Ext.util.Config={};Ext.util.Config.apply=Ext.apply;Ext.util.Browser=Ext;YAHOO.override=Ext.override;YAHOO.util.CustomEvent.prototype.fireDirect=function(){var _1=this.subscribers.length;for(var i=0;i<_1;++i){var s=this.subscribers[i];if(s){var _4=(s.override)?s.obj:this.scope;if(s.fn.apply(_4,arguments)===false){return false;}}}return true;};Ext.apply(Ext.util.Observable.prototype,{delayedListener:function(_5,fn,_7,_8){return this.addListener(_5,fn,{scope:_7,delay:_8||10});},bufferedListener:function(_9,fn,_b,_c){return this.addListener(_9,fn,{scope:_b,buffer:_c||250});}});Ext.apply(Ext.Element.prototype,{getChildrenByTagName:function(_d){var _e=this.dom.getElementsByTagName(_d);var _f=_e.length;var ce=new Array(_f);for(var i=0;i<_f;++i){ce[i]=El.get(_e[i],true);}return ce;},getChildrenByClassName:function(_12,_13){var _14=D.getElementsByClassName(_12,_13,this.dom);var len=_14.length;var ce=new Array(len);for(var i=0;i0){_53.defer((_4f/2)*1000,this);}else{if(typeof _51=="function"){_51();}}};_53.call(this);};this.addAsyncCall(_50,0,null,this);return this;}});})();Ext.Actor.Action=function(_56,_57,_58){this.actor=_56;this.method=_57;this.args=_58;};Ext.Actor.Action.prototype={play:function(_59){this.method.apply(this.actor||window,this.args);_59();}};Ext.Actor.AsyncAction=function(_5a,_5b,_5c,_5d){Ext.Actor.AsyncAction.superclass.constructor.call(this,_5a,_5b,_5c);this.onIndex=_5d;this.originalCallback=this.args[_5d];};Ext.extend(Ext.Actor.AsyncAction,Ext.Actor.Action,{play:function(_5e){var _5f=this.originalCallback?this.originalCallback.createSequence(_5e):_5e;this.args[this.onIndex]=_5f;this.method.apply(this.actor,this.args);}});Ext.Actor.PauseAction=function(_60){this.seconds=_60;};Ext.Actor.PauseAction.prototype={play:function(_61){setTimeout(_61,this.seconds*1000);}}; + +Ext.Animator=function(){this.actors=[];this.playlist=new 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;i"; + } + return b; + }; + + + + var createDom = function(o, parentNode){ + var el = document.createElement(o.tag); + var useSet = el.setAttribute ? true : false; + for(var attr in o){ + if(attr == "tag" || attr == "children" || attr == "cn" || 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]; + } + } + Ext.DomHelper.applyStyles(el, o.style); + var cn = o.children || o.cn; + if(cn){ + if(cn instanceof Array){ + for(var i = 0, len = cn.length; i < len; i++) { + createDom(cn[i], el); + } + }else{ + createDom(cn, el); + } + } + if(o.html){ + el.innerHTML = o.html; + } + if(parentNode){ + parentNode.appendChild(el); + } + return el; + }; + + var ieTable = function(depth, s, h, e){ + tempTableEl.innerHTML = [s, h, e].join(''); + var i = -1, el = tempTableEl; + while(++i < depth){ + el = el.firstChild; + } + return el; + }; + + + var ts = '', + te = '
        ', + tbs = ts+'', + tbe = ''+te, + trs = tbs + '', + tre = ''+tbe; + + + var insertIntoTable = function(tag, where, el, html){ + if(!tempTableEl){ + tempTableEl = document.createElement('div'); + } + var node; + var before = null; + if(tag == 'td'){ + if(where == 'afterbegin' || where == 'beforeend'){ + return; + } + if(where == 'beforebegin'){ + before = el; + el = el.parentNode; + } else{ + before = el.nextSibling; + el = el.parentNode; + } + node = ieTable(4, trs, html, tre); + } + else if(tag == 'tr'){ + if(where == 'beforebegin'){ + before = el; + el = el.parentNode; + node = ieTable(3, tbs, html, tbe); + } else if(where == 'afterend'){ + before = el.nextSibling; + el = el.parentNode; + node = ieTable(3, tbs, html, tbe); + } else{ + if(where == 'afterbegin'){ + before = el.firstChild; + } + node = ieTable(4, trs, html, tre); + } + } else if(tag == 'tbody'){ + if(where == 'beforebegin'){ + before = el; + el = el.parentNode; + node = ieTable(2, ts, html, te); + } else if(where == 'afterend'){ + before = el.nextSibling; + el = el.parentNode; + node = ieTable(2, ts, html, te); + } else{ + if(where == 'afterbegin'){ + before = el.firstChild; + } + node = ieTable(3, tbs, html, tbe); + } + } else{ + if(where == 'beforebegin' || where == 'afterend'){ + return; + } + if(where == 'afterbegin'){ + before = el.firstChild; + } + node = ieTable(2, ts, html, te); + } + el.insertBefore(node, before); + return node; + }; + + return { + + useDom : false, + + + markup : function(o){ + return createHtml(o); + }, + + + applyStyles : function(el, styles){ + if(styles){ + el = Ext.fly(el); + if(typeof styles == "string"){ + var re = /\s?([a-z\-]*)\:\s?([^;]*);?/gi; + var matches; + while ((matches = re.exec(styles)) != null){ + el.setStyle(matches[1], matches[2]); + } + }else if (typeof styles == "object"){ + for (var style in styles){ + el.setStyle(style, styles[style]); + } + }else if (typeof styles == "function"){ + Ext.DomHelper.applyStyles(el, styles.call()); + } + } + }, + + + insertHtml : function(where, el, html){ + where = where.toLowerCase(); + if(el.insertAdjacentHTML){ + var tag = el.tagName.toLowerCase(); + if(tag == "table" || tag == "tbody" || tag == "tr" || tag == 'td'){ + var rs; + if(rs = insertIntoTable(tag, where, el, html)){ + return rs; + } + } + 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); + frag = range.createContextualFragment(html); + el.insertBefore(frag, el.firstChild); + return el.firstChild; + }else{ + el.innerHTML = html; + return el.firstChild; + } + case "beforeend": + if(el.lastChild){ + range.setStartAfter(el.lastChild); + frag = range.createContextualFragment(html); + el.appendChild(frag); + return el.lastChild; + }else{ + el.innerHTML = html; + 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 + '"'; + }, + + + insertBefore : function(el, o, returnElement){ + return this.doInsert(el, o, returnElement, "beforeBegin"); + }, + + + insertAfter : function(el, o, returnElement){ + return this.doInsert(el, o, returnElement, "afterEnd", "nextSibling"); + }, + + + insertFirst : function(el, o, returnElement){ + return this.doInsert(el, o, returnElement, "afterBegin"); + }, + + + doInsert : function(el, o, returnElement, pos, sibling){ + el = Ext.getDom(el); + var newNode; + if(this.useDom){ + newNode = createDom(o, null); + el.parentNode.insertBefore(newNode, sibling ? el[sibling] : el); + }else{ + var html = createHtml(o); + newNode = this.insertHtml(pos, el, html); + } + return returnElement ? Ext.get(newNode, true) : newNode; + }, + + + append : function(el, o, returnElement){ + el = Ext.getDom(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 ? Ext.get(newNode, true) : newNode; + }, + + + overwrite : function(el, o, returnElement){ + el = Ext.getDom(el); + el.innerHTML = createHtml(o); + return returnElement ? Ext.get(el.firstChild, true) : el.firstChild; + }, + + + createTemplate : function(o){ + var html = createHtml(o); + return new Ext.Template(html); + } + }; +}(); + + +Ext.Template = function(html){ + if(html instanceof Array){ + html = html.join(""); + }else if(arguments.length > 1){ + html = Array.prototype.join.call(arguments, ""); + } + + this.html = html; + +}; +Ext.Template.prototype = { + + applyTemplate : function(values){ + if(this.compiled){ + return this.compiled(values); + } + var useF = this.disableFormats !== true; + var fm = Ext.util.Format, tpl = this; + var fn = function(m, name, format, args){ + if(format && useF){ + if(format.substr(0, 5) == "this."){ + return tpl.call(format.substr(5), values[name]); + }else{ + if(args){ + + + + var re = /^\s*['"](.*)["']\s*$/; + args = args.split(','); + for(var i = 0, len = args.length; i < len; i++){ + args[i] = args[i].replace(re, "$1"); + } + args = [values[name]].concat(args); + }else{ + args = [values[name]]; + } + return fm[format].apply(fm, args); + } + }else{ + return values[name] !== undefined ? values[name] : ""; + } + }; + return this.html.replace(this.re, fn); + }, + + + set : function(html, compile){ + this.html = html; + this.compiled = null; + if(compile){ + this.compile(); + } + return this; + }, + + + disableFormats : false, + + + re : /\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g, + + + compile : function(){ + var fm = Ext.util.Format; + var useF = this.disableFormats !== true; + var sep = Ext.isGecko ? "+" : ","; + var fn = function(m, name, format, args){ + if(format && useF){ + args = args ? ',' + args : ""; + if(format.substr(0, 5) != "this."){ + format = "fm." + format + '('; + }else{ + format = 'this.call("'+ format.substr(5) + '", '; + args = ""; + } + }else{ + args= '', format = "(values['" + name + "'] == undefined ? '' : "; + } + return "'"+ sep + format + "values['" + name + "']" + args + ")"+sep+"'"; + }; + var body; + + if(Ext.isGecko){ + body = "this.compiled = function(values){ return '" + + this.html.replace(/(\r\n|\n)/g, '\\n').replace("'", "\\'").replace(this.re, fn) + + "';};"; + }else{ + body = ["this.compiled = function(values){ return ['"]; + body.push(this.html.replace(/(\r\n|\n)/g, '\\n').replace("'", "\\'").replace(this.re, fn)); + body.push("'].join('');};"); + body = body.join(''); + } + eval(body); + return this; + }, + + + call : function(fnName, value){ + return this[fnName](value); + }, + + + insertFirst: function(el, values, returnElement){ + return this.doInsert('afterBegin', el, values, returnElement); + }, + + + insertBefore: function(el, values, returnElement){ + return this.doInsert('beforeBegin', el, values, returnElement); + }, + + + insertAfter : function(el, values, returnElement){ + return this.doInsert('afterEnd', el, values, returnElement); + }, + + + append : function(el, values, returnElement){ + return this.doInsert('beforeEnd', el, values, returnElement); + }, + + doInsert : function(where, el, values, returnEl){ + el = Ext.getDom(el); + var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values)); + return returnEl ? Ext.get(newNode, true) : newNode; + }, + + + overwrite : function(el, values, returnElement){ + el = Ext.getDom(el); + el.innerHTML = this.applyTemplate(values); + return returnElement ? Ext.get(el.firstChild, true) : el.firstChild; + } +}; + +Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate; + + +Ext.DomHelper.Template = Ext.Template; + + +Ext.Template.from = function(el){ + el = Ext.getDom(el); + return new Ext.Template(el.value || el.innerHTML); +}; + + +Ext.MasterTemplate = function(){ + Ext.MasterTemplate.superclass.constructor.apply(this, arguments); + this.originalHtml = this.html; + var st = {}; + var m, re = this.subTemplateRe; + re.lastIndex = 0; + var subIndex = 0; + while(m = re.exec(this.html)){ + var name = m[1], content = m[2]; + st[subIndex] = { + name: name, + index: subIndex, + buffer: [], + tpl : new Ext.Template(content) + }; + if(name){ + st[name] = st[subIndex]; + } + st[subIndex].tpl.compile(); + st[subIndex].tpl.call = this.call.createDelegate(this); + subIndex++; + } + this.subCount = subIndex; + this.subs = st; +}; +Ext.extend(Ext.MasterTemplate, Ext.Template, { + + subTemplateRe : /((?:.|\n)*?)<\/tpl>/gi, + + + add : function(name, values){ + if(arguments.length == 1){ + values = arguments[0]; + name = 0; + } + var s = this.subs[name]; + s.buffer[s.buffer.length] = s.tpl.apply(values); + return this; + }, + + + fill : function(name, values, reset){ + var a = arguments; + if(a.length == 1 || (a.length == 2 && typeof a[1] == "boolean")){ + values = a[0]; + name = 0; + reset = a[1]; + } + if(reset){ + this.reset(); + } + for(var i = 0, len = values.length; i < len; i++){ + this.add(name, values[i]); + } + return this; + }, + + + reset : function(){ + var s = this.subs; + for(var i = 0; i < this.subCount; i++){ + s[i].buffer = []; + } + return this; + }, + + applyTemplate : function(values){ + var s = this.subs; + var replaceIndex = -1; + this.html = this.originalHtml.replace(this.subTemplateRe, function(m, name){ + return s[++replaceIndex].buffer.join(""); + }); + return Ext.MasterTemplate.superclass.applyTemplate.call(this, values); + }, + + apply : function(){ + return this.applyTemplate.apply(this, arguments); + }, + + compile : function(){return this;} +}); + + +Ext.MasterTemplate.prototype.addAll = Ext.MasterTemplate.prototype.fill; + +Ext.MasterTemplate.from = function(el){ + el = Ext.getDom(el); + return new Ext.MasterTemplate(el.value || el.innerHTML); +}; + + +Ext.DomQuery = function(){ + var cache = {}, simpleCache = {}, valueCache = {}; + var nonSpace = /\S/; + var trimRe = /^\s+|\s+$/g; + var tplRe = /\{(\d+)\}/g; + var modeRe = /^(\s?[\/>]\s?|\s|$)/; + var tagTokenRe = /^(#)?([\w-\*]+)/; + + function child(p, index){ + var i = 0; + var n = p.firstChild; + while(n){ + if(n.nodeType == 1){ + if(++i == index){ + return n; + } + } + n = n.nextSibling; + } + return null; + }; + + function next(n){ + while((n = n.nextSibling) && n.nodeType != 1); + return n; + }; + + function prev(n){ + while((n = n.previousSibling) && n.nodeType != 1); + return n; + }; + + function clean(d){ + var n = d.firstChild, ni = -1; + while(n){ + var nx = n.nextSibling; + if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){ + d.removeChild(n); + }else{ + n.nodeIndex = ++ni; + } + n = nx; + } + return this; + }; + + function byClassName(c, a, v, re, cn){ + if(!v){ + return c; + } + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + cn = ci.className; + if(cn && (' '+cn+' ').indexOf(v) != -1){ + r[r.length] = ci; + } + } + return r; + }; + + function attrValue(n, attr){ + if(!n.tagName && typeof n.length != "undefined"){ + n = n[0]; + } + if(!n){ + return null; + } + if(attr == "for"){ + return n.htmlFor; + } + if(attr == "class" || attr == "className"){ + return n.className; + } + return n.getAttribute(attr) || n[attr]; + + }; + + function getNodes(ns, mode, tagName){ + var result = [], cs; + if(!ns){ + return result; + } + mode = mode ? mode.replace(trimRe, "") : ""; + tagName = tagName || "*"; + if(typeof ns.getElementsByTagName != "undefined"){ + ns = [ns]; + } + if(mode != "/" && mode != ">"){ + for(var i = 0, ni; ni = ns[i]; i++){ + cs = ni.getElementsByTagName(tagName); + for(var j = 0, ci; ci = cs[j]; j++){ + result[result.length] = ci; + } + } + }else{ + for(var i = 0, ni; ni = ns[i]; i++){ + var cn = ni.getElementsByTagName(tagName); + for(var j = 0, cj; cj = cn[j]; j++){ + if(cj.parentNode == ni){ + result[result.length] = cj; + } + } + } + } + return result; + }; + + function concat(a, b){ + if(b.slice){ + return a.concat(b); + } + for(var i = 0, l = b.length; i < l; i++){ + a[a.length] = b[i]; + } + return a; + } + + function byTag(cs, tagName){ + if(cs.tagName || cs == document){ + cs = [cs]; + } + if(!tagName){ + return cs; + } + var r = []; tagName = tagName.toLowerCase(); + for(var i = 0, ci; ci = cs[i]; i++){ + if(ci.nodeType == 1 && ci.tagName.toLowerCase()==tagName){ + r[r.length] = ci; + } + } + return r; + }; + + function byId(cs, attr, id){ + if(cs.tagName || cs == document){ + cs = [cs]; + } + if(!id){ + return cs; + } + var r = []; + for(var i = 0,ci; ci = cs[i]; i++){ + if(ci && ci.id == id){ + r[r.length] = ci; + return r; + } + } + return r; + }; + + function byAttribute(cs, attr, value, op, custom){ + var r = [], st = custom=="{"; + var f = Ext.DomQuery.operators[op]; + for(var i = 0; ci = cs[i]; i++){ + var a; + if(st){ + a = Ext.DomQuery.getStyle(ci, attr); + } + else if(attr == "class" || attr == "className"){ + a = ci.className; + }else if(attr == "for"){ + a = ci.htmlFor; + }else if(attr == "href"){ + a = ci.getAttribute("href", 2); + }else{ + a = ci.getAttribute(attr); + } + if((f && f(a, value)) || (!f && a)){ + r[r.length] = ci; + } + } + return r; + }; + + function byPseudo(cs, name, value){ + return Ext.DomQuery.pseudos[name](cs, value); + }; + + + + + var isIE = window.ActiveXObject ? true : false; + + var key = 30803; + + function nodupIEXml(cs){ + var d = ++key; + cs[0].setAttribute("_nodup", d); + var r = [cs[0]]; + for(var i = 1, len = cs.length; i < len; i++){ + var c = cs[i]; + if(!c.getAttribute("_nodup") != d){ + c.setAttribute("_nodup", d); + r[r.length] = c; + } + } + for(var i = 0, len = cs.length; i < len; i++){ + cs[i].removeAttribute("_nodup"); + } + return r; + } + + function nodup(cs){ + if(!cs){ + return []; + } + var len = cs.length, c, i, r = cs, cj; + if(!len || typeof cs.nodeType != "undefined" || len == 1){ + return cs; + } + if(isIE && typeof cs[0].selectSingleNode != "undefined"){ + return nodupIEXml(cs); + } + var d = ++key; + cs[0]._nodup = d; + for(i = 1; c = cs[i]; i++){ + if(c._nodup != d){ + c._nodup = d; + }else{ + r = []; + for(var j = 0; j < i; j++){ + r[r.length] = cs[j]; + } + for(j = i+1; cj = cs[j]; j++){ + if(cj._nodup != d){ + cj._nodup = d; + r[r.length] = cj; + } + } + return r; + } + } + return r; + } + + function quickDiffIEXml(c1, c2){ + var d = ++key; + for(var i = 0, len = c1.length; i < len; i++){ + c1[i].setAttribute("_qdiff", d); + } + var r = []; + for(var i = 0, len = c2.length; i < len; i++){ + if(c2[i].getAttribute("_qdiff") != d){ + r[r.length] = c2[i]; + } + } + for(var i = 0, len = c1.length; i < len; i++){ + c1[i].removeAttribute("_qdiff"); + } + return r; + } + + function quickDiff(c1, c2){ + var len1 = c1.length; + if(!len1){ + return c2; + } + if(isIE && c1[0].selectSingleNode){ + return quickDiffIEXml(c1, c2); + } + var d = ++key; + for(var i = 0; i < len1; i++){ + c1[i]._qdiff = d; + } + var r = []; + for(var i = 0, len = c2.length; i < len; i++){ + if(c2[i]._qdiff != d){ + r[r.length] = c2[i]; + } + } + return r; + } + + function quickId(ns, mode, root, id){ + if(ns == root){ + var d = root.ownerDocument || root; + return d.getElementById(id); + } + ns = getNodes(ns, mode, "*"); + return byId(ns, null, id); + } + + return { + getStyle : function(el, name){ + return Ext.fly(el).getStyle(name); + }, + + compile : function(path, type){ + + while(path.substr(0, 1)=="/"){ + path = path.substr(1); + } + type = type || "select"; + + var fn = ["var f = function(root){\n var mode; var n = root || document;\n"]; + var q = path, mode, lq; + var tk = Ext.DomQuery.matchers; + var tklen = tk.length; + var mm; + while(q && lq != q){ + lq = q; + var tm = q.match(tagTokenRe); + if(type == "select"){ + if(tm){ + if(tm[1] == "#"){ + fn[fn.length] = 'n = quickId(n, mode, root, "'+tm[2]+'");'; + }else{ + fn[fn.length] = 'n = getNodes(n, mode, "'+tm[2]+'");'; + } + q = q.replace(tm[0], ""); + }else if(q.substr(0, 1) != '@'){ + fn[fn.length] = 'n = getNodes(n, mode, "*");'; + } + }else{ + if(tm){ + if(tm[1] == "#"){ + fn[fn.length] = 'n = byId(n, null, "'+tm[2]+'");'; + }else{ + fn[fn.length] = 'n = byTag(n, "'+tm[2]+'");'; + } + q = q.replace(tm[0], ""); + } + } + while(!(mm = q.match(modeRe))){ + var matched = false; + for(var j = 0; j < tklen; j++){ + var t = tk[j]; + var m = q.match(t.re); + if(m){ + fn[fn.length] = t.select.replace(tplRe, function(x, i){ + return m[i]; + }); + q = q.replace(m[0], ""); + matched = true; + break; + } + } + + if(!matched){ + throw 'Error parsing selector, parsing failed at "' + q + '"'; + } + } + if(mm[1]){ + fn[fn.length] = 'mode="'+mm[1]+'";'; + q = q.replace(mm[1], ""); + } + } + fn[fn.length] = "return nodup(n);\n}"; + eval(fn.join("")); + return f; + }, + + + select : function(path, root, type){ + if(!root || root == document){ + root = document; + } + if(typeof root == "string"){ + root = document.getElementById(root); + } + var paths = path.split(","); + var results = []; + for(var i = 0, len = paths.length; i < len; i++){ + var p = paths[i].replace(trimRe, ""); + if(!cache[p]){ + cache[p] = Ext.DomQuery.compile(p); + if(!cache[p]){ + throw p + " is not a valid selector"; + } + } + var result = cache[p](root); + if(result && result != document){ + results = results.concat(result); + } + } + return results; + }, + + + selectNode : function(path, root){ + return Ext.DomQuery.select(path, root)[0]; + }, + + + selectValue : function(path, root, defaultValue){ + path = path.replace(trimRe, ""); + if(!valueCache[path]){ + valueCache[path] = Ext.DomQuery.compile(path, "select"); + } + var n = valueCache[path](root); + n = n[0] ? n[0] : n; + var v = (n && n.firstChild ? n.firstChild.nodeValue : null); + return (v === null ? defaultValue : v); + }, + + + selectNumber : function(path, root, defaultValue){ + var v = Ext.DomQuery.selectValue(path, root, defaultValue || 0); + return parseFloat(v); + }, + + + is : function(el, ss){ + if(typeof el == "string"){ + el = document.getElementById(el); + } + var isArray = (el instanceof Array); + var result = Ext.DomQuery.filter(isArray ? el : [el], ss); + return isArray ? (result.length == el.length) : (result.length > 0); + }, + + + filter : function(els, ss, nonMatches){ + ss = ss.replace(trimRe, ""); + if(!simpleCache[ss]){ + simpleCache[ss] = Ext.DomQuery.compile(ss, "simple"); + } + var result = simpleCache[ss](els); + return nonMatches ? quickDiff(result, els) : result; + }, + + + matchers : [{ + re: /^\.([\w-]+)/, + select: 'n = byClassName(n, null, " {1} ");' + }, { + re: /^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/, + select: 'n = byPseudo(n, "{1}", "{2}");' + },{ + re: /^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/, + select: 'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");' + }, { + re: /^#([\w-]+)/, + select: 'n = byId(n, null, "{1}");' + },{ + re: /^@([\w-]+)/, + select: 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};' + } + ], + + + operators : { + "=" : function(a, v){ + return a == v; + }, + "!=" : function(a, v){ + return a != v; + }, + "^=" : function(a, v){ + return a && a.substr(0, v.length) == v; + }, + "$=" : function(a, v){ + return a && a.substr(a.length-v.length) == v; + }, + "*=" : function(a, v){ + return a && a.indexOf(v) !== -1; + }, + "%=" : function(a, v){ + return (a % v) == 0; + } + }, + + + pseudos : { + "first-child" : function(c){ + var r = [], n; + for(var i = 0, ci; ci = n = c[i]; i++){ + while((n = n.previousSibling) && n.nodeType != 1); + if(!n){ + r[r.length] = ci; + } + } + return r; + }, + + "last-child" : function(c){ + var r = []; + for(var i = 0, ci; ci = n = c[i]; i++){ + while((n = n.nextSibling) && n.nodeType != 1); + if(!n){ + r[r.length] = ci; + } + } + return r; + }, + + "nth-child" : function(c, a){ + var r = []; + if(a != "odd" && a != "even"){ + for(var i = 0, ci; ci = c[i]; i++){ + var m = child(ci.parentNode, a); + if(m == ci){ + r[r.length] = m; + } + } + return r; + } + var p; + + for(var i = 0, l = c.length; i < l; i++){ + var cp = c[i].parentNode; + if(cp != p){ + clean(cp); + p = cp; + } + } + + for(var i = 0, ci; ci = c[i]; i++){ + var m = false; + if(a == "odd"){ + m = ((ci.nodeIndex+1) % 2 == 1); + }else if(a == "even"){ + m = ((ci.nodeIndex+1) % 2 == 0); + } + if(m){ + r[r.length] = ci; + } + } + return r; + }, + + "only-child" : function(c){ + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + if(!prev(ci) && !next(ci)){ + r[r.length] = ci; + } + } + return r; + }, + + "empty" : function(c){ + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + var cns = ci.childNodes, j = 0, cn, empty = true; + while(cn = cns[j]){ + ++j; + if(cn.nodeType == 1 || cn.nodeType == 3){ + empty = false; + break; + } + } + if(empty){ + r[r.length] = ci; + } + } + return r; + }, + + "contains" : function(c, v){ + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + if(ci.innerHTML.indexOf(v) !== -1){ + r[r.length] = ci; + } + } + return r; + }, + + "nodeValue" : function(c, v){ + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + if(ci.firstChild && ci.firstChild.nodeValue == v){ + r[r.length] = ci; + } + } + return r; + }, + + "checked" : function(c){ + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + if(ci.checked == true){ + r[r.length] = ci; + } + } + return r; + }, + + "not" : function(c, ss){ + return Ext.DomQuery.filter(c, ss, true); + }, + + "odd" : function(c){ + return this["nth-child"](c, "odd"); + }, + + "even" : function(c){ + return this["nth-child"](c, "even"); + }, + + "nth" : function(c, a){ + return c[a-1] || []; + }, + + "first" : function(c){ + return c[0] || []; + }, + + "last" : function(c){ + return c[c.length-1] || []; + }, + + "has" : function(c, ss){ + var s = Ext.DomQuery.select; + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + if(s(ss, ci).length > 0){ + r[r.length] = ci; + } + } + return r; + }, + + "next" : function(c, ss){ + var is = Ext.DomQuery.is; + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + var n = next(ci); + if(n && is(n, ss)){ + r[r.length] = ci; + } + } + return r; + }, + + "prev" : function(c, ss){ + var is = Ext.DomQuery.is; + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + var n = prev(ci); + if(n && is(n, ss)){ + r[r.length] = ci; + } + } + return r; + } + } + }; +}(); + + +Ext.query = Ext.DomQuery.select; + + + +Ext.util.Observable = function(){ + if(this.listeners){ + this.on(this.listeners); + delete this.listeners; + } +}; +Ext.util.Observable.prototype = { + + fireEvent : function(){ + var ce = this.events[arguments[0].toLowerCase()]; + if(typeof ce == "object"){ + return ce.fire.apply(ce, Array.prototype.slice.call(arguments, 1)); + }else{ + return true; + } + }, + + filterOptRe : /^(?:scope|delay|buffer|single)$/, + + + addListener : function(eventName, fn, scope, o){ + if(typeof eventName == "object"){ + o = eventName; + for(var e in o){ + if(this.filterOptRe.test(e)){ + continue; + } + if(typeof o[e] == "function"){ + this.addListener(e, o[e], o.scope, o); + }else{ + this.addListener(e, o[e].fn, o[e].scope, o[e]); + } + } + return; + } + o = (!o || typeof o == "boolean") ? {} : o; + eventName = eventName.toLowerCase(); + var ce = this.events[eventName] || true; + if(typeof ce == "boolean"){ + ce = new Ext.util.Event(this, eventName); + this.events[eventName] = ce; + } + ce.addListener(fn, scope, o); + }, + + + removeListener : function(eventName, fn, scope){ + var ce = this.events[eventName.toLowerCase()]; + if(typeof ce == "object"){ + ce.removeListener(fn, scope); + } + }, + + + purgeListeners : function(){ + for(var evt in this.events){ + if(typeof this.events[evt] == "object"){ + this.events[evt].clearListeners(); + } + } + }, + + relayEvents : function(o, events){ + var createHandler = function(ename){ + return function(){ + return this.fireEvent.apply(this, Ext.combine(ename, Array.prototype.slice.call(arguments, 0))); + }; + }; + for(var i = 0, len = events.length; i < len; i++){ + var ename = events[i]; + if(!this.events[ename]){ this.events[ename] = true; }; + o.on(ename, createHandler(ename), this); + } + }, + + + addEvents : function(o){ + if(!this.events){ + this.events = {}; + } + Ext.applyIf(this.events, o); + }, + + + hasListener : function(eventName){ + var e = this.events[eventName]; + return typeof e == "object" && e.listeners.length > 0; + } +}; + +Ext.util.Observable.prototype.on = Ext.util.Observable.prototype.addListener; + +Ext.util.Observable.prototype.un = Ext.util.Observable.prototype.removeListener; + + +Ext.util.Observable.capture = function(o, fn, scope){ + o.fireEvent = o.fireEvent.createInterceptor(fn, scope); +}; + + +Ext.util.Observable.releaseCapture = function(o){ + o.fireEvent = Ext.util.Observable.prototype.fireEvent; +}; + +(function(){ + + var createBuffered = function(h, o, scope){ + var task = new Ext.util.DelayedTask(); + return function(){ + task.delay(o.buffer, h, scope, Array.prototype.slice.call(arguments, 0)); + }; + }; + + var createSingle = function(h, e, fn, scope){ + return function(){ + e.removeListener(fn, scope); + return h.apply(scope, arguments); + }; + }; + + var createDelayed = function(h, o, scope){ + return function(){ + var args = Array.prototype.slice.call(arguments, 0); + setTimeout(function(){ + h.apply(scope, args); + }, o.delay || 10); + }; + }; + + Ext.util.Event = function(obj, name){ + this.name = name; + this.obj = obj; + this.listeners = []; + }; + + Ext.util.Event.prototype = { + addListener : function(fn, scope, options){ + var o = options || {}; + scope = scope || this.obj; + if(!this.isListening(fn, scope)){ + var l = {fn: fn, scope: scope, options: o}; + var h = fn; + if(o.delay){ + h = createDelayed(h, o, scope); + } + if(o.single){ + h = createSingle(h, this, fn, scope); + } + if(o.buffer){ + h = createBuffered(h, o, scope); + } + l.fireFn = h; + if(!this.firing){ this.listeners.push(l); + }else{ + this.listeners = this.listeners.slice(0); + this.listeners.push(l); + } + } + }, + + findListener : function(fn, scope){ + scope = scope || this.obj; + var ls = this.listeners; + for(var i = 0, len = ls.length; i < len; i++){ + var l = ls[i]; + if(l.fn == fn && l.scope == scope){ + return i; + } + } + return -1; + }, + + isListening : function(fn, scope){ + return this.findListener(fn, scope) != -1; + }, + + removeListener : function(fn, scope){ + var index; + if((index = this.findListener(fn, scope)) != -1){ + if(!this.firing){ + this.listeners.splice(index, 1); + }else{ + this.listeners = this.listeners.slice(0); + this.listeners.splice(index, 1); + } + return true; + } + return false; + }, + + clearListeners : function(){ + this.listeners = []; + }, + + fire : function(){ + var ls = this.listeners, scope, len = ls.length; + if(len > 0){ + this.firing = true; + var args = Array.prototype.slice.call(arguments, 0); + for(var i = 0; i < len; i++){ + var l = ls[i]; + if(l.fireFn.apply(l.scope, arguments) === false){ + this.firing = false; + return false; + } + } + this.firing = false; + } + return true; + } + }; +})(); + +Ext.EventManager = function(){ + var docReadyEvent, docReadyProcId, docReadyState = false; + var resizeEvent, resizeTask, textEvent, textSize; + var E = Ext.lib.Event; + var D = Ext.lib.Dom; + + + var fireDocReady = function(){ + if(!docReadyState){ + docReadyState = true; + Ext.isReady = true; + if(docReadyProcId){ + clearInterval(docReadyProcId); + } + if(Ext.isGecko || Ext.isOpera) { + document.removeEventListener("DOMContentLoaded", fireDocReady, false); + } + if(docReadyEvent){ + docReadyEvent.fire(); + docReadyEvent.clearListeners(); + } + } + }; + + var initDocReady = function(){ + docReadyEvent = new Ext.util.Event(); + if(Ext.isGecko || Ext.isOpera) { + document.addEventListener("DOMContentLoaded", fireDocReady, false); + }else if(Ext.isIE){ + + document.write(""); + var defer = document.getElementById("ie-deferred-loader"); + defer.onreadystatechange = function(){ + if(this.readyState == "complete"){ + fireDocReady(); + defer.onreadystatechange = null; + defer.parentNode.removeChild(defer); + } + }; + }else if(Ext.isSafari){ + docReadyProcId = setInterval(function(){ + var rs = document.readyState; + if(rs == "complete") { + fireDocReady(); + } + }, 10); + } + + E.on(window, "load", fireDocReady); + }; + + var createBuffered = function(h, o){ + var task = new Ext.util.DelayedTask(h); + return function(e){ + + e = new Ext.EventObjectImpl(e); + task.delay(o.buffer, h, null, [e]); + }; + }; + + var createSingle = function(h, el, ename, fn){ + return function(e){ + Ext.EventManager.removeListener(el, ename, fn); + h(e); + }; + }; + + var createDelayed = function(h, o){ + return function(e){ + + e = new Ext.EventObjectImpl(e); + setTimeout(function(){ + h(e); + }, o.delay || 10); + }; + }; + + var listen = function(element, ename, opt, fn, scope){ + var o = (!opt || typeof opt == "boolean") ? {} : opt; + fn = fn || o.fn; scope = scope || o.scope; + var el = Ext.getDom(element); + if(!el){ + throw "Error listening for \"" + ename + '\". Element "' + element + '" doesn\'t exist.'; + } + var h = function(e){ + e = Ext.EventObject.setEvent(e); + var t; + if(o.delegate){ + t = e.getTarget(o.delegate, el); + if(!t){ + return; + } + }else{ + t = e.target; + } + if(o.stopEvent === true){ + e.stopEvent(); + } + if(o.preventDefault === true){ + e.preventDefault(); + } + if(o.stopPropagation === true){ + e.stopPropagation(); + } + + if(o.normalized === false){ + e = e.browserEvent; + } + + fn.call(scope || el, e, t, o); + }; + if(o.delay){ + h = createDelayed(h, o); + } + if(o.single){ + h = createSingle(h, el, ename, fn); + } + if(o.buffer){ + h = createBuffered(h, o); + } + fn._handlers = fn._handlers || []; + fn._handlers.push([Ext.id(el), ename, h]); + + E.on(el, ename, h); + if(ename == "mousewheel" && el.addEventListener){ + el.addEventListener("DOMMouseScroll", h, false); + E.on(window, 'unload', function(){ + el.removeEventListener("DOMMouseScroll", h, false); + }); + } + if(ename == "mousedown" && el == document){ + Ext.EventManager.stoppedMouseDownEvent.addListener(h); + } + return h; + }; + + var stopListening = function(el, ename, fn){ + var id = Ext.id(el), hds = fn._handlers, hd = fn; + if(hds){ + for(var i = 0, len = hds.length; i < len; i++){ + var h = hds[i]; + if(h[0] == id && h[1] == ename){ + hd = h[2]; + hds.splice(i, 1); + break; + } + } + } + E.un(el, ename, hd); + el = Ext.getDom(el); + if(ename == "mousewheel" && el.addEventListener){ + el.removeEventListener("DOMMouseScroll", hd, false); + } + if(ename == "mousedown" && el == document){ + Ext.EventManager.stoppedMouseDownEvent.removeListener(hd); + } + }; + + var propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized)$/; + var pub = { + + + wrap : function(fn, scope, override){ + return function(e){ + Ext.EventObject.setEvent(e); + fn.call(override ? scope || window : window, Ext.EventObject, scope); + }; + }, + + + addListener : function(element, eventName, fn, scope, options){ + if(typeof eventName == "object"){ + var o = eventName; + for(var e in o){ + if(propRe.test(e)){ + continue; + } + if(typeof o[e] == "function"){ + + listen(element, e, o, o[e], o.scope); + }else{ + + listen(element, e, o[e]); + } + } + return; + } + return listen(element, eventName, options, fn, scope); + }, + + + removeListener : function(element, eventName, fn){ + return stopListening(element, eventName, fn); + }, + + + onDocumentReady : function(fn, scope, options){ + if(docReadyState){ + fn.call(scope || window, scope); + return; + } + if(!docReadyEvent){ + initDocReady(); + } + docReadyEvent.addListener(fn, scope, options); + }, + + + onWindowResize : function(fn, scope, options){ + if(!resizeEvent){ + resizeEvent = new Ext.util.Event(); + resizeTask = new Ext.util.DelayedTask(function(){ + resizeEvent.fire(D.getViewWidth(), D.getViewHeight()); + }); + E.on(window, "resize", function(){ + if(Ext.isIE){ + resizeTask.delay(50); + }else{ + resizeEvent.fire(D.getViewWidth(), D.getViewHeight()); + } + }); + } + resizeEvent.addListener(fn, scope, options); + }, + + + onTextResize : function(fn, scope, options){ + if(!textEvent){ + textEvent = new Ext.util.Event(); + var textEl = new Ext.Element(document.createElement('div')); + textEl.dom.className = 'x-text-resize'; + textEl.dom.innerHTML = 'X'; + textEl.appendTo(document.body); + textSize = textEl.dom.offsetHeight; + setInterval(function(){ + if(textEl.dom.offsetHeight != textSize){ + textEvent.fire(textSize, textSize = textEl.dom.offsetHeight); + } + }, this.textResizeInterval); + } + textEvent.addListener(fn, scope, options); + }, + + + removeResizeListener : function(fn, scope){ + if(resizeEvent){ + resizeEvent.removeListener(fn, scope); + } + }, + + fireResize : function(){ + if(resizeEvent){ + resizeEvent.fire(D.getViewWidth(), D.getViewHeight()); + } + }, + + ieDeferSrc : false, + textResizeInterval : 50 + }; + + pub.on = pub.addListener; + pub.un = pub.removeListener; + + pub.stoppedMouseDownEvent = new Ext.util.Event(); + return pub; +}(); + +Ext.onReady = Ext.EventManager.onDocumentReady; + +Ext.onReady(function(){ + var bd = Ext.get(document.body); + if(!bd){ return; } + var cls = Ext.isIE ? "ext-ie" + : Ext.isGecko ? "ext-gecko" + : Ext.isOpera ? "ext-opera" + : Ext.isSafari ? "ext-safari" : ""; + if(Ext.isBorderBox){ + cls += ' ext-border-box'; + } + if(Ext.isStrict){ + cls += ' ext-strict'; + } + bd.addClass(cls); +}); + +Ext.EventObject = function(){ + + var E = Ext.lib.Event; + + + var safariKeys = { + 63234 : 37, + 63235 : 39, + 63232 : 38, + 63233 : 40, + 63276 : 33, + 63277 : 34, + 63272 : 46, + 63273 : 36, + 63275 : 35 + }; + + + var btnMap = Ext.isIE ? {1:0,4:1,2:2} : + (Ext.isSafari ? {1:0,2:1,3:2} : {0:0,1:1,2:2}); + + Ext.EventObjectImpl = function(e){ + if(e){ + this.setEvent(e.browserEvent || e); + } + }; + Ext.EventObjectImpl.prototype = { + + browserEvent : null, + + button : -1, + + shiftKey : false, + + ctrlKey : false, + + altKey : false, + + + BACKSPACE : 8, + + TAB : 9, + + RETURN : 13, + + ENTER : 13, + + SHIFT : 16, + + CONTROL : 17, + + ESC : 27, + + SPACE : 32, + + PAGEUP : 33, + + PAGEDOWN : 34, + + END : 35, + + HOME : 36, + + LEFT : 37, + + UP : 38, + + RIGHT : 39, + + DOWN : 40, + + DELETE : 46, + + F5 : 116, + + + setEvent : function(e){ + if(e == this || (e && e.browserEvent)){ + return e; + } + this.browserEvent = e; + if(e){ + + this.button = e.button ? btnMap[e.button] : (e.which ? e.which-1 : -1); + this.shiftKey = e.shiftKey; + + this.ctrlKey = e.ctrlKey || e.metaKey; + this.altKey = e.altKey; + + this.keyCode = e.keyCode; + this.charCode = e.charCode; + + this.target = E.getTarget(e); + + this.xy = E.getXY(e); + }else{ + this.button = -1; + this.shiftKey = false; + this.ctrlKey = false; + this.altKey = false; + this.keyCode = 0; + this.charCode =0; + this.target = null; + this.xy = [0, 0]; + } + return this; + }, + + + stopEvent : function(){ + if(this.browserEvent){ + if(this.browserEvent.type == 'mousedown'){ + Ext.EventManager.stoppedMouseDownEvent.fire(this); + } + E.stopEvent(this.browserEvent); + } + }, + + + preventDefault : function(){ + if(this.browserEvent){ + E.preventDefault(this.browserEvent); + } + }, + + + isNavKeyPress : function(){ + var k = this.keyCode; + k = Ext.isSafari ? (safariKeys[k] || k) : k; + return (k >= 33 && k <= 40) || k == this.RETURN || k == this.TAB || k == this.ESC; + }, + + isSpecialKey : function(){ + var k = this.keyCode; + return k == 9 || k == 13 || k == 40 || k == 27 || + (k == 16) || (k == 17) || + (k >= 18 && k <= 20) || + (k >= 33 && k <= 35) || + (k >= 36 && k <= 39) || + (k >= 44 && k <= 45); + }, + + stopPropagation : function(){ + if(this.browserEvent){ + if(this.browserEvent.type == 'mousedown'){ + Ext.EventManager.stoppedMouseDownEvent.fire(this); + } + E.stopPropagation(this.browserEvent); + } + }, + + + getCharCode : function(){ + return this.charCode || this.keyCode; + }, + + + getKey : function(){ + var k = this.keyCode || this.charCode; + return Ext.isSafari ? (safariKeys[k] || k) : k; + }, + + + getPageX : function(){ + return this.xy[0]; + }, + + + getPageY : function(){ + return this.xy[1]; + }, + + + getTime : function(){ + if(this.browserEvent){ + return E.getTime(this.browserEvent); + } + return null; + }, + + + getXY : function(){ + return this.xy; + }, + + + getTarget : function(selector, maxDepth, returnEl){ + return selector ? Ext.fly(this.target).findParent(selector, maxDepth, returnEl) : this.target; + }, + + getRelatedTarget : function(){ + if(this.browserEvent){ + return E.getRelatedTarget(this.browserEvent); + } + return null; + }, + + + 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; + }, + + + hasModifier : function(){ + return ((this.ctrlKey || this.altKey) || this.shiftKey) ? true : false; + }, + + + within : function(el, related){ + var t = this[related ? "getRelatedTarget" : "getTarget"](); + return t && Ext.fly(el).contains(t); + }, + + getPoint : function(){ + return new Ext.lib.Point(this.xy[0], this.xy[1]); + } + }; + + return new Ext.EventObjectImpl(); +}(); + + + +(function(){ +var D = Ext.lib.Dom; +var E = Ext.lib.Event; +var A = Ext.lib.Anim; + + +var propCache = {}; +var camelRe = /(-[a-z])/gi; +var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); }; +var view = document.defaultView; + +Ext.Element = function(element, forceNew){ + var dom = typeof element == "string" ? + document.getElementById(element) : element; + if(!dom){ + return null; + } + if(!forceNew && Ext.Element.cache[dom.id]){ + return Ext.Element.cache[dom.id]; + } + + this.dom = dom; + + + this.id = dom.id || Ext.id(dom); +}; + +var El = Ext.Element; + +El.prototype = { + + originalDisplay : "", + + visibilityMode : 1, + + defaultUnit : "px", + + setVisibilityMode : function(visMode){ + this.visibilityMode = visMode; + return this; + }, + + enableDisplayMode : function(display){ + this.setVisibilityMode(El.DISPLAY); + if(typeof display != "undefined") this.originalDisplay = display; + return this; + }, + + + findParent : function(simpleSelector, maxDepth, returnEl){ + var p = this.dom, b = document.body, depth = 0, dq = Ext.DomQuery, stopEl; + maxDepth = maxDepth || 50; + if(typeof maxDepth != "number"){ + stopEl = Ext.getDom(maxDepth); + maxDepth = 10; + } + while(p && p.nodeType == 1 && depth < maxDepth && p != b && p != stopEl){ + if(dq.is(p, simpleSelector)){ + return returnEl ? Ext.get(p) : p; + } + depth++; + p = p.parentNode; + } + return null; + }, + + + + findParentNode : function(simpleSelector, maxDepth, returnEl){ + var p = Ext.fly(this.dom.parentNode, '_internal'); + return p ? p.findParent(simpleSelector, maxDepth, returnEl) : null; + }, + + + up : function(simpleSelector, maxDepth){ + return this.findParentNode(simpleSelector, maxDepth, true); + }, + + + + + is : function(simpleSelector){ + return Ext.DomQuery.is(this.dom, simpleSelector); + }, + + + animate : function(args, duration, onComplete, easing, animType){ + this.anim(args, {duration: duration, callback: onComplete, easing: easing}, animType); + return this; + }, + + + anim : function(args, opt, animType, defaultDur, defaultEase, cb){ + animType = animType || 'run'; + opt = opt || {}; + var anim = Ext.lib.Anim[animType]( + this.dom, args, + (opt.duration || defaultDur) || .35, + (opt.easing || defaultEase) || 'easeOut', + function(){ + Ext.callback(cb, this); + Ext.callback(opt.callback, opt.scope || this, [this, opt]); + }, + this + ); + opt.anim = anim; + return anim; + }, + + + preanim : function(a, i){ + return !a[i] ? false : (typeof a[i] == "object" ? a[i]: {duration: a[i+1], callback: a[i+2], easing: a[i+3]}); + }, + + + clean : function(forceReclean){ + if(this.isCleaned && forceReclean !== true){ + return this; + } + var ns = /\S/; + var d = this.dom, n = d.firstChild, ni = -1; + while(n){ + var nx = n.nextSibling; + if(n.nodeType == 3 && !ns.test(n.nodeValue)){ + d.removeChild(n); + }else{ + n.nodeIndex = ++ni; + } + n = nx; + } + this.isCleaned = true; + return this; + }, + + calcOffsetsTo : function(el){ + el = Ext.get(el), d = el.dom; + var restorePos = false; + if(el.getStyle('position') == 'static'){ + el.position('relative'); + restorePos = true; + } + var x = 0, y =0; + var op = this.dom; + while(op && op != d && op.tagName != 'HTML'){ + x+= op.offsetLeft; + y+= op.offsetTop; + op = op.offsetParent; + } + if(restorePos){ + el.position('static'); + } + return [x, y]; + }, + + + scrollIntoView : function(container, hscroll){ + var c = Ext.getDom(container) || document.body; + var el = this.dom; + + var o = this.calcOffsetsTo(c), + l = o[0], + t = o[1], + b = t+el.offsetHeight, + r = l+el.offsetWidth; + + var ch = c.clientHeight; + var ct = parseInt(c.scrollTop, 10); + var cl = parseInt(c.scrollLeft, 10); + var cb = ct + ch; + var cr = cl + c.clientWidth; + + if(t < ct){ + c.scrollTop = t; + }else if(b > cb){ + c.scrollTop = b-ch; + } + + if(hscroll !== false){ + if(l < cl){ + c.scrollLeft = l; + }else if(r > cr){ + c.scrollLeft = r-c.clientWidth; + } + } + return this; + }, + + scrollChildIntoView : function(child){ + Ext.fly(child, '_scrollChildIntoView').scrollIntoView(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; + }, + + + contains : function(el){ + if(!el){return false;} + return D.isAncestor(this.dom, el.dom ? el.dom : el); + }, + + + isVisible : function(deep) { + var vis = !(this.getStyle("visibility") == "hidden" || this.getStyle("display") == "none"); + if(deep !== true || !vis){ + return vis; + } + var p = this.dom.parentNode; + while(p && p.tagName.toLowerCase() != "body"){ + if(!Ext.fly(p, '_isVisible').isVisible()){ + return false; + } + p = p.parentNode; + } + return true; + }, + + + select : function(selector, unique){ + return El.select("#" + Ext.id(this.dom) + " " + selector, unique); + }, + + + query : function(selector, unique){ + return Ext.DomQuery.select("#" + Ext.id(this.dom) + " " + selector); + }, + + + child : function(selector, returnDom){ + var n = Ext.DomQuery.selectNode("#" + Ext.id(this.dom) + " " + selector); + return returnDom ? n : Ext.get(n); + }, + + + down : function(selector, returnDom){ + var n = Ext.DomQuery.selectNode("#" + Ext.id(this.dom) + " > " + selector); + return returnDom ? n : Ext.get(n); + }, + + + initDD : function(group, config, overrides){ + var dd = new Ext.dd.DD(Ext.id(this.dom), group, config); + return Ext.apply(dd, overrides); + }, + + + initDDProxy : function(group, config, overrides){ + var dd = new Ext.dd.DDProxy(Ext.id(this.dom), group, config); + return Ext.apply(dd, overrides); + }, + + + initDDTarget : function(group, config, overrides){ + var dd = new Ext.dd.DDTarget(Ext.id(this.dom), group, config); + return Ext.apply(dd, overrides); + }, + + + setVisible : function(visible, animate){ + if(!animate || !A){ + if(this.visibilityMode == El.DISPLAY){ + this.setDisplayed(visible); + }else{ + this.fixDisplay(); + this.dom.style.visibility = visible ? "visible" : "hidden"; + } + }else{ + + var dom = this.dom; + var visMode = this.visibilityMode; + if(visible){ + this.setOpacity(.01); + this.setVisible(true); + } + this.anim({opacity: { to: (visible?1:0) }}, + this.preanim(arguments, 1), + null, .35, 'easeIn', function(){ + if(!visible){ + if(visMode == El.DISPLAY){ + dom.style.display = "none"; + }else{ + dom.style.visibility = "hidden"; + } + Ext.get(dom).setOpacity(1); + } + }); + } + return this; + }, + + + isDisplayed : function() { + return this.getStyle("display") != "none"; + }, + + + toggle : function(animate){ + this.setVisible(!this.isVisible(), this.preanim(arguments, 0)); + return this; + }, + + + setDisplayed : function(value) { + if(typeof value == "boolean"){ + value = value ? this.originalDisplay : "none"; + } + this.setStyle("display", value); + return this; + }, + + + focus : function() { + try{ + this.dom.focus(); + }catch(e){} + return this; + }, + + + blur : function() { + try{ + this.dom.blur(); + }catch(e){} + return this; + }, + + + addClass : function(className){ + if(className instanceof Array){ + for(var i = 0, len = className.length; i < len; i++) { + this.addClass(className[i]); + } + }else{ + if(className && !this.hasClass(className)){ + this.dom.className = this.dom.className + " " + 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){ + Ext.get(s).removeClass(className); + } + } + this.addClass(className); + return this; + }, + + + removeClass : function(className){ + if(!className || !this.dom.className){ + return this; + } + if(className instanceof Array){ + for(var i = 0, len = className.length; i < len; i++) { + this.removeClass(className[i]); + } + }else{ + if(this.hasClass(className)){ + var re = this.classReCache[className]; + if (!re) { + re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)', "g"); + this.classReCache[className] = re; + } + this.dom.className = + this.dom.className.replace(re, " "); + } + } + return this; + }, + + classReCache: {}, + + + toggleClass : function(className){ + if(this.hasClass(className)){ + this.removeClass(className); + }else{ + this.addClass(className); + } + return this; + }, + + + hasClass : function(className){ + return className && (' '+this.dom.className+' ').indexOf(' '+className+' ') != -1; + }, + + + replaceClass : function(oldClassName, newClassName){ + this.removeClass(oldClassName); + this.addClass(newClassName); + return this; + }, + + + getStyles : function(){ + var a = arguments, len = a.length, r = {}; + for(var i = 0; i < len; i++){ + r[a[i]] = this.getStyle(a[i]); + } + return r; + }, + + + getStyle : function(){ + return view && view.getComputedStyle ? + function(prop){ + var el = this.dom, v, cs, camel; + if(prop == 'float'){ + prop = "cssFloat"; + } + if(v = el.style[prop]){ + return v; + } + if(cs = view.getComputedStyle(el, "")){ + if(!(camel = propCache[prop])){ + camel = propCache[prop] = prop.replace(camelRe, camelFn); + } + return cs[camel]; + } + return null; + } : + function(prop){ + var el = this.dom, v, cs, camel; + if(prop == 'opacity'){ + if(typeof el.filter == 'string'){ + var fv = parseFloat(el.filter.match(/alpha\(opacity=(.*)\)/i)[1]); + if(!isNaN(fv)){ + return fv ? fv / 100 : 0; + } + } + return 1; + }else if(prop == 'float'){ + prop = "styleFloat"; + } + if(!(camel = propCache[prop])){ + camel = propCache[prop] = prop.replace(camelRe, camelFn); + } + if(v = el.style[camel]){ + return v; + } + if(cs = el.currentStyle){ + return cs[camel]; + } + return null; + }; + }(), + + + setStyle : function(prop, value){ + if(typeof prop == "string"){ + var camel; + if(!(camel = propCache[prop])){ + camel = propCache[prop] = prop.replace(camelRe, camelFn); + } + if(camel == 'opacity') { + this.setOpacity(value); + }else{ + this.dom.style[camel] = value; + } + }else{ + for(var style in prop){ + if(typeof prop[style] != "function"){ + this.setStyle(style, prop[style]); + } + } + } + return this; + }, + + + applyStyles : function(style){ + Ext.DomHelper.applyStyles(this.dom, style); + return this; + }, + + + getX : function(){ + return D.getX(this.dom); + }, + + + getY : function(){ + return D.getY(this.dom); + }, + + + getXY : function(){ + return D.getXY(this.dom); + }, + + + setX : function(x, animate){ + if(!animate || !A){ + D.setX(this.dom, x); + }else{ + this.setXY([x, this.getY()], this.preanim(arguments, 1)); + } + return this; + }, + + + setY : function(y, animate){ + if(!animate || !A){ + D.setY(this.dom, y); + }else{ + this.setXY([this.getX(), y], this.preanim(arguments, 1)); + } + return this; + }, + + + setLeft : function(left){ + this.setStyle("left", this.addUnits(left)); + return this; + }, + + + setTop : function(top){ + this.setStyle("top", this.addUnits(top)); + return this; + }, + + + setRight : function(right){ + this.setStyle("right", this.addUnits(right)); + return this; + }, + + + setBottom : function(bottom){ + this.setStyle("bottom", this.addUnits(bottom)); + return this; + }, + + + setXY : function(pos, animate){ + if(!animate || !A){ + D.setXY(this.dom, pos); + }else{ + this.anim({points: {to: pos}}, this.preanim(arguments, 1), 'motion'); + } + return this; + }, + + + setLocation : function(x, y, animate){ + this.setXY([x, y], this.preanim(arguments, 2)); + return this; + }, + + + moveTo : function(x, y, animate){ + this.setXY([x, y], this.preanim(arguments, 2)); + return this; + }, + + + getRegion : function(){ + return D.getRegion(this.dom); + }, + + + getHeight : function(contentHeight){ + var h = this.dom.offsetHeight || 0; + return contentHeight !== true ? h : h-this.getBorderWidth("tb")-this.getPadding("tb"); + }, + + + getWidth : function(contentWidth){ + var w = this.dom.offsetWidth || 0; + return contentWidth !== true ? w : w-this.getBorderWidth("lr")-this.getPadding("lr"); + }, + + + getComputedHeight : function(){ + var h = Math.max(this.dom.offsetHeight, this.dom.clientHeight); + if(!h){ + h = parseInt(this.getStyle('height'), 10) || 0; + if(!this.isBorderBox()){ + h += this.getFrameWidth('tb'); + } + } + return h; + }, + + + getComputedWidth : function(){ + var w = Math.max(this.dom.offsetWidth, this.dom.clientWidth); + if(!w){ + w = parseInt(this.getStyle('width'), 10) || 0; + if(!this.isBorderBox()){ + w += this.getFrameWidth('lr'); + } + } + return w; + }, + + + getSize : function(contentSize){ + return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)}; + }, + + getViewSize : function(){ + var d = this.dom, doc = document, aw = 0, ah = 0; + if(d == doc || d == doc.body){ + return {width : D.getViewWidth(), height: D.getViewHeight()}; + }else{ + return { + width : d.clientWidth, + height: d.clientHeight + }; + } + }, + + + getValue : function(asNumber){ + return asNumber ? parseInt(this.dom.value, 10) : this.dom.value; + }, + + + 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){ + width = this.adjustWidth(width); + if(!animate || !A){ + this.dom.style.width = this.addUnits(width); + }else{ + this.anim({width: {to: width}}, this.preanim(arguments, 1)); + } + return this; + }, + + + setHeight : function(height, animate){ + height = this.adjustHeight(height); + if(!animate || !A){ + this.dom.style.height = this.addUnits(height); + }else{ + this.anim({height: {to: height}}, this.preanim(arguments, 1)); + } + return this; + }, + + + setSize : function(width, height, animate){ + if(typeof width == "object"){ + height = width.height; width = width.width; + } + width = this.adjustWidth(width); height = this.adjustHeight(height); + if(!animate || !A){ + this.dom.style.width = this.addUnits(width); + this.dom.style.height = this.addUnits(height); + }else{ + this.anim({width: {to: width}, height: {to: height}}, this.preanim(arguments, 2)); + } + return this; + }, + + + setBounds : function(x, y, width, height, animate){ + if(!animate || !A){ + this.setSize(width, 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}}, + this.preanim(arguments, 4), 'motion'); + } + return this; + }, + + + setRegion : function(region, animate){ + this.setBounds(region.left, region.top, region.right-region.left, region.bottom-region.top, this.preanim(arguments, 1)); + return this; + }, + + + addListener : function(eventName, fn, scope, options){ + Ext.EventManager.on(this.dom, eventName, fn, scope || this, options); + }, + + + removeListener : function(eventName, fn){ + Ext.EventManager.removeListener(this.dom, eventName, fn); + return this; + }, + + + removeAllListeners : function(){ + E.purgeElement(this.dom); + return this; + }, + + relayEvent : function(eventName, observable){ + this.on(eventName, function(e){ + observable.fireEvent(eventName, e); + }); + }, + + + setOpacity : function(opacity, animate){ + if(!animate || !A){ + var s = this.dom.style; + if(Ext.isIE){ + s.zoom = 1; + s.filter = (s.filter || '').replace(/alpha\([^\)]*\)/gi,"") + + (opacity == 1 ? "" : "alpha(opacity=" + opacity * 100 + ")"); + }else{ + s.opacity = opacity; + } + }else{ + this.anim({opacity: {to: opacity}}, this.preanim(arguments, 1), null, .35, 'easeIn'); + } + 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; + } + }, + + + position : function(pos, zIndex, x, y){ + if(!pos){ + if(this.getStyle('position') == 'static'){ + this.setStyle('position', 'relative'); + } + }else{ + this.setStyle("position", pos); + } + if(zIndex){ + this.setStyle("z-index", zIndex); + } + if(x !== undefined && y !== undefined){ + this.setXY([x, y]); + }else if(x !== undefined){ + this.setX(x); + }else if(y !== undefined){ + this.setY(y); + } + }, + + + clearPositioning : function(value){ + value = value ||''; + this.setStyle({ + "left": value, + "right": value, + "top": value, + "bottom": value, + "z-index": "", + "position" : "static" + }); + return this; + }, + + + getPositioning : function(){ + var l = this.getStyle("left"); + var t = this.getStyle("top"); + return { + "position" : this.getStyle("position"), + "left" : l, + "right" : l ? "" : this.getStyle("right"), + "top" : t, + "bottom" : t ? "" : this.getStyle("bottom"), + "z-index" : this.getStyle("z-index") + }; + }, + + + getBorderWidth : function(side){ + return this.addStyles(side, El.borders); + }, + + + getPadding : function(side){ + return this.addStyles(side, El.paddings); + }, + + + setPositioning : function(pc){ + this.applyStyles(pc); + if(pc.right == "auto"){ + this.dom.style.right = ""; + } + if(pc.bottom == "auto"){ + this.dom.style.bottom = ""; + } + return this; + }, + + fixDisplay : function(){ + if(this.getStyle("display") == "none"){ + this.setStyle("visibility", "hidden"); + this.setStyle("display", this.originalDisplay); + if(this.getStyle("display") == "none"){ + this.setStyle("display", "block"); + } + } + }, + + + 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){ + var xy = this.getXY(); + direction = direction.toLowerCase(); + switch(direction){ + case "l": + case "left": + this.moveTo(xy[0]-distance, xy[1], this.preanim(arguments, 2)); + break; + case "r": + case "right": + this.moveTo(xy[0]+distance, xy[1], this.preanim(arguments, 2)); + break; + case "t": + case "top": + case "up": + this.moveTo(xy[0], xy[1]-distance, this.preanim(arguments, 2)); + break; + case "b": + case "bottom": + case "down": + this.moveTo(xy[0], xy[1]+distance, this.preanim(arguments, 2)); + 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; + }, + + + + getAnchorXY : function(anchor, local, s){ + + + + var w, h, vp = false; + if(!s){ + var d = this.dom; + if(d == document.body || d == document){ + vp = true; + w = D.getViewWidth(); h = D.getViewHeight(); + }else{ + w = this.getWidth(); h = this.getHeight(); + } + }else{ + w = s.width; h = s.height; + } + var x = 0, y = 0, r = Math.round; + switch((anchor || "tl").toLowerCase()){ + case "c": + x = r(w*.5); + y = r(h*.5); + break; + case "t": + x = r(w*.5); + y = 0; + break; + case "l": + x = 0; + y = r(h*.5); + break; + case "r": + x = w; + y = r(h*.5); + break; + case "b": + x = r(w*.5); + y = h; + break; + case "tl": + x = 0; + y = 0; + break; + case "bl": + x = 0; + y = h; + break; + case "br": + x = w; + y = h; + break; + case "tr": + x = w; + y = 0; + break; + } + if(local === true){ + return [x, y]; + } + if(vp){ + var sc = this.getScroll(); + return [x + sc.left, y + sc.top]; + } + + var o = this.getXY(); + return [x+o[0], y+o[1]]; + }, + + + getAlignToXY : function(el, p, o){ + el = Ext.get(el), d = this.dom; + if(!el.dom){ + throw "Element.alignTo with an element that doesn't exist"; + } + var c = false; + var p1 = "", p2 = ""; + o = o || [0,0]; + + if(!p){ + p = "tl-bl"; + }else if(p == "?"){ + p = "tl-bl?"; + }else if(p.indexOf("-") == -1){ + p = "tl-" + p; + } + p = p.toLowerCase(); + var m = p.match(/^([a-z]+)-([a-z]+)(\?)?$/); + if(!m){ + throw "Element.alignTo with an invalid alignment " + p; + } + p1 = m[1], p2 = m[2], c = m[3] ? true : false; + + + + var a1 = this.getAnchorXY(p1, true); + var a2 = el.getAnchorXY(p2, false); + var x = a2[0] - a1[0] + o[0]; + var y = a2[1] - a1[1] + o[1]; + if(c){ + + var w = this.getWidth(), h = this.getHeight(), r = el.getRegion(); + + var dw = D.getViewWidth()-5, dh = D.getViewHeight()-5; + + + + + var p1y = p1.charAt(0), p1x = p1.charAt(p1.length-1); + var p2y = p2.charAt(0), p2x = p2.charAt(p2.length-1); + var swapY = ((p1y=="t" && p2y=="b") || (p1y=="b" && p2y=="t")); + var swapX = ((p1x=="r" && p2x=="l") || (p1x=="l" && p2x=="r")); + + var doc = document; + var scrollX = (doc.documentElement.scrollLeft || doc.body.scrollLeft || 0)+5; + var scrollY = (doc.documentElement.scrollTop || doc.body.scrollTop || 0)+5; + + if((x+w) > dw){ + x = swapX ? r.left-w : dw-w; + } + if(x < scrollX){ + x = swapX ? r.right : scrollX; + } + if((y+h) > dh){ + y = swapY ? r.top-h : dh-h; + } + if (y < scrollY){ + y = swapY ? r.bottom : scrollY; + } + } + return [x,y]; + }, + + getConstrainToXY : function(){ + var os = {top:0, left:0, bottom:0, right: 0}; + + return function(el, local, offsets){ + el = Ext.get(el); + offsets = offsets ? Ext.applyIf(offsets, os) : os; + + var vw, vh, vx = 0, vy = 0; + if(el.dom == document.body || el.dom == document){ + vw = Ext.lib.Dom.getViewWidth(); + vh = Ext.lib.Dom.getViewHeight(); + }else{ + vw = el.dom.clientWidth; + vh = el.dom.clientHeight; + if(!local){ + var vxy = el.getXY(); + vx = vxy[0]; + vy = vxy[1]; + } + } + + var s = el.getScroll(); + + vx += offsets.left + s.left; + vy += offsets.top + s.top; + + vw -= offsets.right; + vh -= offsets.bottom; + + var vr = vx+vw; + var vb = vy+vh; + + var xy = !local ? this.getXY() : [this.getLeft(true), this.getTop(true)]; + var x = xy[0], y = xy[1]; + var w = this.dom.offsetWidth, h = this.dom.offsetHeight; + + + var moved = false; + + + if((x + w) > vr){ + x = vr - w; + moved = true; + } + if((y + h) > vb){ + y = vb - h; + moved = true; + } + + if(x < vx){ + x = vx; + moved = true; + } + if(y < vy){ + y = vy; + moved = true; + } + return moved ? [x, y] : false; + }; + }(), + + + alignTo : function(element, position, offsets, animate){ + var xy = this.getAlignToXY(element, position, offsets); + this.setXY(xy, this.preanim(arguments, 3)); + return this; + }, + + + anchorTo : function(el, alignment, offsets, animate, monitorScroll, callback){ + var action = function(){ + this.alignTo(el, alignment, offsets, animate); + Ext.callback(callback, this); + }; + Ext.EventManager.onWindowResize(action, this); + var tm = typeof monitorScroll; + if(tm != 'undefined'){ + Ext.EventManager.on(window, 'scroll', action, this, + {buffer: tm == 'number' ? monitorScroll : 50}); + } + action.call(this); + 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){ + this.setVisible(false, this.preanim(arguments, 0)); + return this; + }, + + + show : function(animate){ + this.setVisible(true, this.preanim(arguments, 0)); + return this; + }, + + + addUnits : function(size){ + return Ext.Element.addUnits(size, this.defaultUnit); + }, + + + beginMeasure : function(){ + var el = this.dom; + if(el.offsetWidth || el.offsetHeight){ + return this; + } + var changed = []; + var p = this.dom, b = document.body; + while((!el.offsetWidth && !el.offsetHeight) && p && p.tagName && p != b){ + var pe = Ext.get(p); + if(pe.getStyle('display') == 'none'){ + changed.push({el: p, visibility: pe.getStyle("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 = Ext.id(); + var dom = this.dom; + + html += ''; + + E.onAvailable(id, function(){ + var hd = document.getElementsByTagName("head")[0]; + var re = /(?:]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig; + var srcRe = /\ssrc=([\'\"])(.*?)\1/i; + var typeRe = /\stype=([\'\"])(.*?)\1/i; + + var match; + while(match = re.exec(html)){ + var attrs = match[1]; + var srcMatch = attrs ? attrs.match(srcRe) : false; + if(srcMatch && srcMatch[2]){ + var s = document.createElement("script"); + s.src = srcMatch[2]; + var typeMatch = attrs.match(typeRe); + if(typeMatch && typeMatch[2]){ + s.type = typeMatch[2]; + } + hd.appendChild(s); + }else if(match[2] && match[2].length > 0){ + eval(match[2]); + } + } + var el = document.getElementById(id); + if(el){el.parentNode.removeChild(el);} + if(typeof callback == "function"){ + callback(); + } + }); + dom.innerHTML = html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/ig, ""); + return this; + }, + + + load : function(){ + var um = this.getUpdateManager(); + um.update.apply(um, arguments); + return this; + }, + + + getUpdateManager : function(){ + if(!this.updateManager){ + this.updateManager = new 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;"); + this.addClass("x-unselectable"); + return this; + }, + + + getCenterXY : function(){ + return this.getAlignToXY(document, 'c-c'); + }, + + + center : function(centerIn){ + this.alignTo(centerIn || document, 'c-c'); + return this; + }, + + + isBorderBox : function(){ + return noBoxAdjust[this.dom.tagName.toLowerCase()] || Ext.isBorderBox; + }, + + + getBox : function(contentBox, local){ + var xy; + if(!local){ + xy = this.getXY(); + }else{ + var left = parseInt(this.getStyle("left"), 10) || 0; + var top = parseInt(this.getStyle("top"), 10) || 0; + xy = [left, top]; + } + var el = this.dom, w = el.offsetWidth, h = el.offsetHeight, bx; + if(!contentBox){ + bx = {x: xy[0], y: xy[1], 0: xy[0], 1: 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"); + bx = {x: xy[0]+l, y: xy[1]+t, 0: xy[0]+l, 1: xy[1]+t, width: w-(l+r), height: h-(t+b)}; + } + bx.right = bx.x + bx.width; + bx.bottom = bx.y + bx.height; + return bx; + }, + + + getFrameWidth : function(sides){ + return this.getPadding(sides) + this.getBorderWidth(sides); + }, + + + setBox : function(box, adjust, animate){ + 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, this.preanim(arguments, 2)); + return this; + }, + + + repaint : function(){ + var dom = this.dom; + this.addClass("x-repaint"); + setTimeout(function(){ + Ext.get(dom).removeClass("x-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, El.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 = Ext.getDom(renderTo); + }else{ + renderTo = document.body; + } + config = typeof config == "object" ? + config : {tag : "div", cls: config}; + var proxy = Ext.DomHelper.append(renderTo, config, true); + if(matchBox){ + proxy.setBox(this.getBox()); + } + return proxy; + }, + + + mask : function(msg, msgCls){ + if(this.getStyle("position") == "static"){ + this.setStyle("position", "relative"); + } + if(!this._mask){ + this._mask = Ext.DomHelper.append(this.dom, {tag:"div", cls:"ext-el-mask"}, true); + } + this.addClass("x-masked"); + this._mask.setDisplayed(true); + if(typeof msg == 'string'){ + if(!this._maskMsg){ + this._maskMsg = Ext.DomHelper.append(this.dom, {tag:"div", cls:"ext-el-mask-msg", cn:{tag:'div'}}, true); + } + var mm = this._maskMsg; + mm.dom.className = msgCls ? "ext-el-mask-msg " + msgCls : "ext-el-mask-msg"; + mm.dom.firstChild.innerHTML = msg; + mm.setDisplayed(true); + mm.center(this); + } + return this._mask; + }, + + + unmask : function(removeEl){ + if(this._mask){ + if(removeEl === true){ + this._mask.remove(); + delete this._mask; + if(this._maskMsg){ + this._maskMsg.remove(); + delete this._maskMsg; + } + }else{ + this._mask.setDisplayed(false); + if(this._maskMsg){ + this._maskMsg.setDisplayed(false); + } + } + } + this.removeClass("x-masked"); + }, + + + isMasked : function(){ + return this._mask && this._mask.isVisible(); + }, + + + createShim : function(){ + var el = document.createElement('iframe'); + el.frameBorder = 'no'; + el.className = 'ext-shim'; + if(Ext.isIE && Ext.isSecure){ + el.src = Ext.SSL_SECURE_URL; + } + var shim = Ext.get(this.dom.parentNode.insertBefore(el, this.dom)); + shim.autoBoxAdjust = false; + return shim; + }, + + + remove : function(){ + if(this.dom.parentNode){ + this.dom.parentNode.removeChild(this.dom); + } + delete El.cache[this.dom.id]; + }, + + + addClassOnOver : function(className, preventFlicker){ + this.on("mouseover", function(){ + Ext.fly(this, '_internal').addClass(className); + }, this.dom); + var removeFn = function(e){ + if(preventFlicker !== true || !e.within(this, true)){ + Ext.fly(this, '_internal').removeClass(className); + } + }; + this.on("mouseout", removeFn, this.dom); + return this; + }, + + + addClassOnFocus : function(className){ + this.on("focus", function(){ + Ext.fly(this, '_internal').addClass(className); + }, this.dom); + this.on("blur", function(){ + Ext.fly(this, '_internal').removeClass(className); + }, this.dom); + return this; + }, + + addClassOnClick : function(className){ + var dom = this.dom; + this.on("mousedown", function(){ + Ext.fly(dom, '_internal').addClass(className); + var d = Ext.get(document); + var fn = function(){ + Ext.fly(dom, '_internal').removeClass(className); + d.removeListener("mouseup", fn); + }; + d.on("mouseup", fn); + }); + return this; + }, + + + swallowEvent : function(eventName, preventDefault){ + var fn = function(e){ + e.stopPropagation(); + if(preventDefault){ + e.preventDefault(); + } + }; + if(eventName instanceof Array){ + for(var i = 0, len = eventName.length; i < len; i++){ + this.on(eventName[i], fn); + } + return this; + } + this.on(eventName, fn); + return this; + }, + + + fitToParent : function(monitorResize, targetParent){ + var p = Ext.get(targetParent || this.dom.parentNode); + this.setSize(p.getComputedWidth()-p.getFrameWidth('lr'), p.getComputedHeight()-p.getFrameWidth('tb')); + if(monitorResize === true){ + Ext.EventManager.onWindowResize(this.fitToParent.createDelegate(this, [])); + } + 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 = Ext.get(el); + el.appendTo(this); + return this; + }, + + + createChild: function(config, insertBefore, returnDom){ + config = config || {tag:'div'}; + if(insertBefore){ + return Ext.DomHelper.insertBefore(insertBefore, config, returnDom !== true); + } + return Ext.DomHelper[!this.dom.firstChild ? 'overwrite' : 'append'](this.dom, config, returnDom !== true); + }, + + + appendTo: function(el){ + el = Ext.getDom(el); + el.appendChild(this.dom); + return this; + }, + + + insertBefore: function(el){ + el = Ext.getDom(el); + el.parentNode.insertBefore(this.dom, el); + return this; + }, + + + insertAfter: function(el){ + el = Ext.getDom(el); + el.parentNode.insertBefore(this.dom, el.nextSibling); + return this; + }, + + + insertFirst: function(el, returnDom){ + el = el || {}; + if(typeof el == 'object' && !el.nodeType){ + return this.createChild(el, this.dom.firstChild, returnDom); + }else{ + el = Ext.getDom(el); + this.dom.insertBefore(el, this.dom.firstChild); + return !returnDom ? Ext.get(el) : el; + } + }, + + + insertSibling: function(el, where, returnDom){ + where = where ? where.toLowerCase() : 'before'; + el = el || {}; + var rt, refNode = where == 'before' ? this.dom : this.dom.nextSibling; + + if(typeof el == 'object' && !el.nodeType){ + if(where == 'after' && !this.dom.nextSibling){ + rt = Ext.DomHelper.append(this.dom.parentNode, el, !returnDom); + }else{ + rt = Ext.DomHelper[where == 'after' ? 'insertAfter' : 'insertBefore'](this.dom, el, !returnDom); + } + + }else{ + rt = this.dom.parentNode.insertBefore(Ext.getDom(el), + where == 'before' ? this.dom : this.dom.nextSibling); + if(!returnDom){ + rt = Ext.get(rt); + } + } + return rt; + }, + + + wrap: function(config, returnDom){ + if(!config){ + config = {tag: "div"}; + } + var newEl = Ext.DomHelper.insertBefore(this.dom, config, !returnDom); + newEl.dom ? newEl.dom.appendChild(this.dom) : newEl.appendChild(this.dom); + return newEl; + }, + + + replace: function(el){ + el = Ext.get(el); + this.insertBefore(el); + el.remove(); + return this; + }, + + + insertHtml : function(where, html){ + return Ext.DomHelper.insertHtml(where, this.dom, html); + }, + + + set : function(o, useSet){ + var el = this.dom; + useSet = typeof useSet == 'undefined' ? (el.setAttribute ? true : false) : useSet; + 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]; + } + } + Ext.DomHelper.applyStyles(el, o.style); + return this; + }, + + + addKeyListener : function(key, fn, scope){ + var config; + if(typeof key != "object" || key instanceof Array){ + config = { + key: key, + fn: fn, + scope: scope + }; + }else{ + config = { + key : key.key, + shift : key.shift, + ctrl : key.ctrl, + alt : key.alt, + fn: fn, + scope: scope + }; + } + return new Ext.KeyMap(this, config); + }, + + + addKeyMap : function(config){ + return new Ext.KeyMap(this, config); + }, + + + isScrollable : function(){ + var dom = this.dom; + return dom.scrollHeight > dom.clientHeight || dom.scrollWidth > dom.clientWidth; + }, + + + + scrollTo : function(side, value, animate){ + var prop = side.toLowerCase() == "left" ? "scrollLeft" : "scrollTop"; + if(!animate || !A){ + this.dom[prop] = value; + }else{ + var to = prop == "scrollLeft" ? [value, this.dom.scrollTop] : [this.dom.scrollLeft, value]; + this.anim({scroll: {"to": to}}, this.preanim(arguments, 2), 'scroll'); + } + return this; + }, + + + scroll : function(direction, distance, animate){ + if(!this.isScrollable()){ + return; + } + var el = this.dom; + var l = el.scrollLeft, t = el.scrollTop; + var w = el.scrollWidth, h = el.scrollHeight; + var cw = el.clientWidth, ch = el.clientHeight; + direction = direction.toLowerCase(); + var scrolled = false; + var a = this.preanim(arguments, 2); + switch(direction){ + case "l": + case "left": + if(w - l > cw){ + var v = Math.min(l + distance, w-cw); + this.scrollTo("left", v, a); + scrolled = true; + } + break; + case "r": + case "right": + if(l > 0){ + var v = Math.max(l - distance, 0); + this.scrollTo("left", v, a); + scrolled = true; + } + break; + case "t": + case "top": + case "up": + if(t > 0){ + var v = Math.max(t - distance, 0); + this.scrollTo("top", v, a); + scrolled = true; + } + break; + case "b": + case "bottom": + case "down": + if(h - t > ch){ + var v = Math.min(t + distance, h-ch); + this.scrollTo("top", v, a); + scrolled = true; + } + break; + } + return scrolled; + }, + + + translatePoints : function(x, y){ + if(typeof x == 'object' || x instanceof Array){ + y = x[1]; x = x[0]; + } + var p = this.getStyle('position'); + var o = this.getXY(); + + var l = parseInt(this.getStyle('left'), 10); + var t = parseInt(this.getStyle('top'), 10); + + if(isNaN(l)){ + l = (p == "relative") ? 0 : this.dom.offsetLeft; + } + if(isNaN(t)){ + t = (p == "relative") ? 0 : this.dom.offsetTop; + } + + return {left: (x - o[0] + l), top: (y - o[1] + t)}; + }, + + getScroll : function(){ + var d = this.dom, doc = document; + if(d == doc || d == doc.body){ + var l = window.pageXOffset || doc.documentElement.scrollLeft || doc.body.scrollLeft || 0; + var t = window.pageYOffset || doc.documentElement.scrollTop || doc.body.scrollTop || 0; + return {left: l, top: t}; + }else{ + return {left: d.scrollLeft, top: d.scrollTop}; + } + }, + + + getColor : function(attr, defaultValue, prefix){ + var v = this.getStyle(attr); + if(!v || v == "transparent" || v == "inherit") { + return defaultValue; + } + var color = typeof prefix == "undefined" ? "#" : prefix; + if(v.substr(0, 4) == "rgb("){ + var rvs = v.slice(4, v.length -1).split(","); + for(var i = 0; i < 3; i++){ + var h = parseInt(rvs[i]).toString(16); + if(h < 16){ + h = "0" + h; + } + color += h; + } + } else { + if(v.substr(0, 1) == "#"){ + if(v.length == 4) { + for(var i = 1; i < 4; i++){ + var c = v.charAt(i); + color += c + c; + } + }else if(v.length == 7){ + color += v.substr(1); + } + } + } + return(color.length > 5 ? color.toLowerCase() : defaultValue); + }, + + boxWrap : function(cls){ + cls = cls || 'x-box'; + var el = Ext.get(this.insertHtml('beforeBegin', String.format('
        '+El.boxMarkup+'
        ', cls))); + el.child('.'+cls+'-mc').dom.appendChild(this.dom); + return el; + }, + + getAttributeNS : Ext.isIE ? function(ns, name){ + var d = this.dom; + var type = typeof d[ns+":"+name]; + if(type != 'undefined' && type != 'unknown'){ + return d[ns+":"+name]; + } + return d[name]; + } : function(ns, name){ + var d = this.dom; + return d.getAttributeNS(ns, name) || d.getAttribute(ns+":"+name) || d.getAttribute(name) || d[name]; + } +}; + +var ep = El.prototype; + + +ep.on = ep.addListener; + +ep.mon = ep.addListener; + + +ep.un = ep.removeListener; + + +ep.autoBoxAdjust = true; + +ep.autoDisplayMode = true; + +El.unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i; + +El.addUnits = function(v, defaultUnit){ + if(v === "" || v == "auto"){ + return v; + } + if(v === undefined){ + return ''; + } + if(typeof v == "number" || !El.unitPattern.test(v)){ + return v + (defaultUnit || 'px'); + } + return v; +}; + + +El.boxMarkup = '
        '; + +El.VISIBILITY = 1; + +El.DISPLAY = 2; + +El.borders = {l: "border-left-width", r: "border-right-width", t: "border-top-width", b: "border-bottom-width"}; +El.paddings = {l: "padding-left", r: "padding-right", t: "padding-top", b: "padding-bottom"}; +El.margins = {l: "margin-left", r: "margin-right", t: "margin-top", b: "margin-bottom"}; + + + + +El.cache = {}; + +var docEl; + + +El.get = function(el){ + var ex, elm, id; + if(!el){ return null; } + if(typeof el == "string"){ + if(!(elm = document.getElementById(el))){ + return null; + } + if(ex = El.cache[el]){ + ex.dom = elm; + }else{ + ex = El.cache[el] = new El(elm); + } + return ex; + }else if(el.tagName){ + if(!(id = el.id)){ + id = Ext.id(el); + } + if(ex = El.cache[id]){ + ex.dom = el; + }else{ + ex = El.cache[id] = new El(el); + } + return ex; + }else if(el instanceof El){ + if(el != docEl){ + el.dom = document.getElementById(el.id) || el.dom; + + El.cache[el.id] = el; + } + return el; + }else if(el.isComposite){ + return el; + }else if(el instanceof Array){ + return El.select(el); + }else if(el == document){ + + if(!docEl){ + var f = function(){}; + f.prototype = El.prototype; + docEl = new f(); + docEl.dom = document; + } + return docEl; + } + return null; +}; + +El.uncache = function(el){ + for(var i = 0, a = arguments, len = a.length; i < len; i++) { + if(a[i]){ + delete El.cache[a[i].id || a[i]]; + } + } +}; + + +El.Flyweight = function(dom){ + this.dom = dom; +}; +El.Flyweight.prototype = El.prototype; + +El._flyweights = {}; + +El.fly = function(el, named){ + named = named || '_global'; + el = Ext.getDom(el); + if(!el){ + return null; + } + if(!El._flyweights[named]){ + El._flyweights[named] = new El.Flyweight(); + } + El._flyweights[named].dom = el; + return El._flyweights[named]; +}; + + +Ext.get = El.get; + +Ext.fly = El.fly; + + +var noBoxAdjust = Ext.isStrict ? { + select:1 +} : { + input:1, select:1, textarea:1 +}; +if(Ext.isIE || Ext.isGecko){ + noBoxAdjust['button'] = 1; +} + + +Ext.EventManager.on(window, 'unload', function(){ + delete El.cache; + delete El._flyweights; +}); +})(); + + + +Ext.enableFx = true; + + +Ext.Fx = { + + slideIn : function(anchor, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + + anchor = anchor || "t"; + + this.fixDisplay(); + + var r = this.getFxRestore(); + var b = this.getBox(); + this.setSize(b); + + var wrap = this.fxWrap(r.pos, o, "hidden"); + + var st = this.dom.style; + st.visibility = "visible"; + st.position = "absolute"; + + var after = function(){ + el.fxUnwrap(wrap, r.pos, o); + st.width = r.width; + st.height = r.height; + el.afterFx(o); + }; + var a, pt = {to: [b.x, b.y]}, bw = {to: b.width}, bh = {to: b.height}; + + switch(anchor.toLowerCase()){ + case "t": + wrap.setSize(b.width, 0); + st.left = st.bottom = "0"; + a = {height: bh}; + break; + case "l": + wrap.setSize(0, b.height); + st.right = st.top = "0"; + a = {width: bw}; + break; + case "r": + wrap.setSize(0, b.height); + wrap.setX(b.right); + st.left = st.top = "0"; + a = {width: bw, points: pt}; + break; + case "b": + wrap.setSize(b.width, 0); + wrap.setY(b.bottom); + st.left = st.top = "0"; + a = {height: bh, points: pt}; + break; + case "tl": + wrap.setSize(0, 0); + st.right = st.bottom = "0"; + a = {width: bw, height: bh}; + break; + case "bl": + wrap.setSize(0, 0); + wrap.setY(b.y+b.height); + st.right = st.top = "0"; + a = {width: bw, height: bh, points: pt}; + break; + case "br": + wrap.setSize(0, 0); + wrap.setXY([b.right, b.bottom]); + st.left = st.top = "0"; + a = {width: bw, height: bh, points: pt}; + break; + case "tr": + wrap.setSize(0, 0); + wrap.setX(b.x+b.width); + st.left = st.bottom = "0"; + a = {width: bw, height: bh, points: pt}; + break; + } + this.dom.style.visibility = "visible"; + wrap.show(); + + arguments.callee.anim = wrap.fxanim(a, + o, + 'motion', + .5, + 'easeOut', after); + }); + return this; + }, + + + slideOut : function(anchor, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + + anchor = anchor || "t"; + + var r = this.getFxRestore(); + + var b = this.getBox(); + this.setSize(b); + + var wrap = this.fxWrap(r.pos, o, "visible"); + + var st = this.dom.style; + st.visibility = "visible"; + st.position = "absolute"; + + wrap.setSize(b); + + var after = function(){ + if(o.useDisplay){ + el.setDisplayed(false); + }else{ + el.hide(); + } + + el.fxUnwrap(wrap, r.pos, o); + + st.width = r.width; + st.height = r.height; + + el.afterFx(o); + }; + + var a, zero = {to: 0}; + switch(anchor.toLowerCase()){ + case "t": + st.left = st.bottom = "0"; + a = {height: zero}; + break; + case "l": + st.right = st.top = "0"; + a = {width: zero}; + break; + case "r": + st.left = st.top = "0"; + a = {width: zero, points: {to:[b.right, b.y]}}; + break; + case "b": + st.left = st.top = "0"; + a = {height: zero, points: {to:[b.x, b.bottom]}}; + break; + case "tl": + st.right = st.bottom = "0"; + a = {width: zero, height: zero}; + break; + case "bl": + st.right = st.top = "0"; + a = {width: zero, height: zero, points: {to:[b.x, b.bottom]}}; + break; + case "br": + st.left = st.top = "0"; + a = {width: zero, height: zero, points: {to:[b.x+b.width, b.bottom]}}; + break; + case "tr": + st.left = st.bottom = "0"; + a = {width: zero, height: zero, points: {to:[b.right, b.y]}}; + break; + } + + arguments.callee.anim = wrap.fxanim(a, + o, + 'motion', + .5, + "easeOut", after); + }); + return this; + }, + + + puff : function(o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + this.clearOpacity(); + this.show(); + + var r = this.getFxRestore(); + var st = this.dom.style; + + var after = function(){ + if(o.useDisplay){ + el.setDisplayed(false); + }else{ + el.hide(); + } + + el.clearOpacity(); + + el.setPositioning(r.pos); + st.width = r.width; + st.height = r.height; + st.fontSize = ''; + el.afterFx(o); + }; + + var width = this.getWidth(); + var height = this.getHeight(); + + arguments.callee.anim = this.fxanim({ + width : {to: this.adjustWidth(width * 2)}, + height : {to: this.adjustHeight(height * 2)}, + points : {by: [-(width * .5), -(height * .5)]}, + opacity : {to: 0}, + fontSize: {to:200, unit: "%"} + }, + o, + 'motion', + .5, + "easeOut", after); + }); + return this; + }, + + + switchOff : function(o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + this.clearOpacity(); + this.clip(); + + var r = this.getFxRestore(); + var st = this.dom.style; + + var after = function(){ + if(o.useDisplay){ + el.setDisplayed(false); + }else{ + el.hide(); + } + + el.clearOpacity(); + el.setPositioning(r.pos); + st.width = r.width; + st.height = r.height; + + el.afterFx(o); + }; + + this.fxanim({opacity:{to:0.3}}, null, null, .1, null, function(){ + this.clearOpacity(); + (function(){ + this.fxanim({ + height:{to:1}, + points:{by:[0, this.getHeight() * .5]} + }, o, 'motion', 0.3, 'easeIn', after); + }).defer(100, this); + }); + }); + return this; + }, + + + highlight : function(color, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + color = color || "ffff9c"; + attr = o.attr || "backgroundColor"; + + this.clearOpacity(); + this.show(); + + var origColor = this.getColor(attr); + var restoreColor = this.dom.style[attr]; + endColor = (o.endColor || origColor) || "ffffff"; + + var after = function(){ + el.dom.style[attr] = restoreColor; + el.afterFx(o); + }; + + var a = {}; + a[attr] = {from: color, to: endColor}; + arguments.callee.anim = this.fxanim(a, + o, + 'color', + 1, + 'easeIn', after); + }); + return this; + }, + + + frame : function(color, count, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + color = color || "#C3DAF9"; + if(color.length == 6){ + color = "#" + color; + } + count = count || 1; + duration = o.duration || 1; + this.show(); + + var b = this.getBox(); + var animFn = function(){ + var proxy = this.createProxy({ + tag:"div", + style:{ + visbility:"hidden", + position:"absolute", + "z-index":"35000", border:"0px solid " + color + } + }); + var scale = Ext.isBorderBox ? 2 : 1; + proxy.animate({ + top:{from:b.y, to:b.y - 20}, + left:{from:b.x, to:b.x - 20}, + borderWidth:{from:0, to:10}, + opacity:{from:1, to:0}, + height:{from:b.height, to:(b.height + (20*scale))}, + width:{from:b.width, to:(b.width + (20*scale))} + }, duration, function(){ + proxy.remove(); + }); + if(--count > 0){ + animFn.defer((duration/2)*1000, this); + }else{ + el.afterFx(o); + } + }; + animFn.call(this); + }); + return this; + }, + + + pause : function(seconds){ + var el = this.getFxEl(); + var o = {}; + + el.queueFx(o, function(){ + setTimeout(function(){ + el.afterFx(o); + }, seconds * 1000); + }); + return this; + }, + + + fadeIn : function(o){ + var el = this.getFxEl(); + o = o || {}; + el.queueFx(o, function(){ + this.setOpacity(0); + this.fixDisplay(); + this.dom.style.visibility = 'visible'; + var to = o.endOpacity || 1; + arguments.callee.anim = this.fxanim({opacity:{to:to}}, + o, null, .5, "easeOut", function(){ + if(to == 1){ + this.clearOpacity(); + } + el.afterFx(o); + }); + }); + return this; + }, + + + fadeOut : function(o){ + var el = this.getFxEl(); + o = o || {}; + el.queueFx(o, function(){ + arguments.callee.anim = this.fxanim({opacity:{to:o.endOpacity || 0}}, + o, null, .5, "easeOut", function(){ + if(this.visibilityMode == Ext.Element.DISPLAY || o.useDisplay){ + this.dom.style.display = "none"; + }else{ + this.dom.style.visibility = "hidden"; + } + this.clearOpacity(); + el.afterFx(o); + }); + }); + return this; + }, + + + scale : function(w, h, o){ + this.shift(Ext.apply({}, o, { + width: w, + height: h + })); + return this; + }, + + + shift : function(o){ + var el = this.getFxEl(); + o = o || {}; + el.queueFx(o, function(){ + var a = {}, w = o.width, h = o.height, x = o.x, y = o.y, op = o.opacity; + if(w !== undefined){ + a.width = {to: this.adjustWidth(w)}; + } + if(h !== undefined){ + a.height = {to: this.adjustHeight(h)}; + } + if(x !== undefined || y !== undefined){ + a.points = {to: [ + x !== undefined ? x : this.getX(), + y !== undefined ? y : this.getY() + ]}; + } + if(op !== undefined){ + a.opacity = {to: op}; + } + if(o.xy !== undefined){ + a.points = {to: o.xy}; + } + arguments.callee.anim = this.fxanim(a, + o, 'motion', .35, "easeOut", function(){ + el.afterFx(o); + }); + }); + return this; + }, + + + ghost : function(anchor, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + anchor = anchor || "b"; + + var r = this.getFxRestore(); + var w = this.getWidth(), + h = this.getHeight(); + + var st = this.dom.style; + + var after = function(){ + if(o.useDisplay){ + el.setDisplayed(false); + }else{ + el.hide(); + } + + el.clearOpacity(); + el.setPositioning(r.pos); + st.width = r.width; + st.height = r.height; + + el.afterFx(o); + }; + + var a = {opacity: {to: 0}, points: {}}, pt = a.points; + switch(anchor.toLowerCase()){ + case "t": + pt.by = [0, -h]; + break; + case "l": + pt.by = [-w, 0]; + break; + case "r": + pt.by = [w, 0]; + break; + case "b": + pt.by = [0, h]; + break; + case "tl": + pt.by = [-w, -h]; + break; + case "bl": + pt.by = [-w, h]; + break; + case "br": + pt.by = [w, h]; + break; + case "tr": + pt.by = [w, -h]; + break; + } + + arguments.callee.anim = this.fxanim(a, + o, + 'motion', + .5, + "easeOut", after); + }); + return this; + }, + + + syncFx : function(){ + this.fxDefaults = Ext.apply(this.fxDefaults || {}, { + block : false, + concurrent : true, + stopFx : false + }); + return this; + }, + + + sequenceFx : function(){ + this.fxDefaults = Ext.apply(this.fxDefaults || {}, { + block : false, + concurrent : false, + stopFx : false + }); + return this; + }, + + + nextFx : function(){ + var ef = this.fxQueue[0]; + if(ef){ + ef.call(this); + } + }, + + + hasActiveFx : function(){ + return this.fxQueue && this.fxQueue[0]; + }, + + + stopFx : function(){ + if(this.hasActiveFx()){ + var cur = this.fxQueue[0]; + if(cur && cur.anim && cur.anim.isAnimated()){ + this.fxQueue = [cur]; cur.anim.stop(true); + } + } + return this; + }, + + + beforeFx : function(o){ + if(this.hasActiveFx() && !o.concurrent){ + if(o.stopFx){ + this.stopFx(); + return true; + } + return false; + } + return true; + }, + + + hasFxBlock : function(){ + var q = this.fxQueue; + return q && q[0] && q[0].block; + }, + + + queueFx : function(o, fn){ + if(!this.fxQueue){ + this.fxQueue = []; + } + if(!this.hasFxBlock()){ + Ext.applyIf(o, this.fxDefaults); + if(!o.concurrent){ + var run = this.beforeFx(o); + fn.block = o.block; + this.fxQueue.push(fn); + if(run){ + this.nextFx(); + } + }else{ + fn.call(this); + } + } + return this; + }, + + + fxWrap : function(pos, o, vis){ + var wrap; + if(!o.wrap || !(wrap = Ext.get(o.wrap))){ + var wrapXY; + if(o.fixPosition){ + wrapXY = this.getXY(); + } + var div = document.createElement("div"); + div.style.visibility = vis; + wrap = Ext.get(this.dom.parentNode.insertBefore(div, this.dom)); + wrap.setPositioning(pos); + if(wrap.getStyle("position") == "static"){ + wrap.position("relative"); + } + this.clearPositioning('auto'); + wrap.clip(); + wrap.dom.appendChild(this.dom); + if(wrapXY){ + wrap.setXY(wrapXY); + } + } + return wrap; + }, + + + fxUnwrap : function(wrap, pos, o){ + this.clearPositioning(); + this.setPositioning(pos); + if(!o.wrap){ + wrap.dom.parentNode.insertBefore(this.dom, wrap.dom); + wrap.remove(); + } + }, + + + getFxRestore : function(){ + var st = this.dom.style; + return {pos: this.getPositioning(), width: st.width, height : st.height}; + }, + + + afterFx : function(o){ + if(o.afterStyle){ + this.applyStyles(o.afterStyle); + } + if(o.afterCls){ + this.addClass(o.afterCls); + } + if(o.remove === true){ + this.remove(); + } + Ext.callback(o.callback, o.scope, [this]); + if(!o.concurrent){ + this.fxQueue.shift(); + this.nextFx(); + } + }, + + + getFxEl : function(){ return Ext.get(this.dom); + }, + + + fxanim : function(args, opt, animType, defaultDur, defaultEase, cb){ + animType = animType || 'run'; + opt = opt || {}; + var anim = Ext.lib.Anim[animType]( + this.dom, args, + (opt.duration || defaultDur) || .35, + (opt.easing || defaultEase) || 'easeOut', + function(){ + Ext.callback(cb, this); + }, + this + ); + opt.anim = anim; + return anim; + } +}; + +Ext.Fx.resize = Ext.Fx.scale; + +Ext.apply(Ext.Element.prototype, Ext.Fx); + + +Ext.CompositeElement = function(els){ + this.elements = []; + this.addElements(els); +}; +Ext.CompositeElement.prototype = { + isComposite: true, + addElements : function(els){ + if(!els) return this; + if(typeof els == "string"){ + els = Ext.Element.selectorFunction(els); + } + var yels = this.elements; + var index = yels.length-1; + for(var i = 0, len = els.length; i < len; i++) { + yels[++index] = Ext.get(els[i], true); + } + return this; + }, + invoke : function(fn, args){ + var els = this.elements; + for(var i = 0, len = els.length; i < len; i++) { + Ext.Element.prototype[fn].apply(els[i], args); + } + return this; + }, + + add : function(els){ + if(typeof els == "string"){ + this.addElements(Ext.Element.selectorFunction(els)); + }else if(els.length !== undefined){ + 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++){ + if(fn.call(scope || els[i], els[i], this, i) === false) { + break; + } + } + return this; + }, + + + item : function(index){ + return this.elements[index]; + } +}; +(function(){ +Ext.CompositeElement.createCall = function(proto, fnName){ + if(!proto[fnName]){ + proto[fnName] = function(){ + return this.invoke(fnName, arguments); + }; + } +}; +for(var fnName in Ext.Element.prototype){ + if(typeof Ext.Element.prototype[fnName] == "function"){ + Ext.CompositeElement.createCall(Ext.CompositeElement.prototype, fnName); + } +}; +})(); + + +Ext.CompositeElementLite = function(els){ + Ext.CompositeElementLite.superclass.constructor.call(this, els); + var flyEl = function(){}; + flyEl.prototype = Ext.Element.prototype; + this.el = new Ext.Element.Flyweight(); +}; +Ext.extend(Ext.CompositeElementLite, Ext.CompositeElement, { + addElements : function(els){ + if(els){ + if(els instanceof Array){ + this.elements = this.elements.concat(els); + }else{ + var yels = this.elements; + var index = yels.length-1; + for(var i = 0, len = els.length; i < len; i++) { + yels[++index] = els[i]; + } + } + } + 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]; + Ext.Element.prototype[fn].apply(el, args); + } + return this; + }, + + item : function(index){ + this.el.dom = this.elements[index]; + return this.el; + }, + + + addListener : function(eventName, handler, scope, opt){ + var els = this.elements; + for(var i = 0, len = els.length; i < len; i++) { + Ext.EventManager.on(els[i], eventName, handler, scope || els[i], opt); + } + return this; + }, + + + each : function(fn, scope){ + var els = this.elements; + var el = this.el; + for(var i = 0, len = els.length; i < len; i++){ + el.dom = els[i]; + if(fn.call(scope || el, el, this, i) === false){ + break; + } + } + return this; + } +}); +Ext.CompositeElementLite.prototype.on = Ext.CompositeElementLite.prototype.addListener; +if(Ext.DomQuery){ + Ext.Element.selectorFunction = Ext.DomQuery.select; +} + +Ext.Element.select = function(selector, unique){ + var els; + if(typeof selector == "string"){ + els = Ext.Element.selectorFunction(selector); + }else if(selector.length !== undefined){ + els = selector; + }else{ + throw "Invalid selector"; + } + if(unique === true){ + return new Ext.CompositeElement(els); + }else{ + return new Ext.CompositeElementLite(els); + } +}; + +Ext.select = Ext.Element.select; + +Ext.UpdateManager = function(el, forceNew){ + el = Ext.get(el); + if(!forceNew && el.updateManager){ + return el.updateManager; + } + + this.el = el; + + this.defaultUrl = null; + + this.addEvents({ + + "beforeupdate": true, + + "update": true, + + "failure": true + }); + var d = Ext.UpdateManager.defaults; + + this.sslBlankUrl = d.sslBlankUrl; + + this.disableCaching = d.disableCaching; + + this.indicatorText = d.indicatorText; + + this.showLoadIndicator = d.showLoadIndicator; + + this.timeout = d.timeout; + + + this.loadScripts = d.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 Ext.UpdateManager.BasicRenderer(); + + Ext.UpdateManager.superclass.constructor.call(this); +}; + +Ext.extend(Ext.UpdateManager, Ext.util.Observable, { + + getEl : function(){ + return this.el; + }, + + update : function(url, params, callback, discardUrl){ + if(this.fireEvent("beforeupdate", this.el, url, params) !== false){ + var method = this.method; + 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.method != "undefined"){method = cfg.method;}; + 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.call(this); + } + if(typeof params == "function"){ + params = params(); + } + 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.successDelegate, + failure: this.failureDelegate, + timeout: (this.timeout*1000), + argument: {"url": url, "form": null, "callback": callback, "params": params} + }; + method = method || (params ? "POST" : "GET"); + if(method == "GET"){ + url = this.prepareUrl(url); + } + this.transaction = Ext.lib.Ajax.request(method, url, cb, params); + } + }, + + + formUpdate : function(form, url, reset, callback){ + if(this.fireEvent("beforeupdate", this.el, form, url) !== false){ + formEl = Ext.getDom(form); + if(typeof url == "function"){ + url = url.call(this); + } + if(typeof params == "function"){ + params = params(); + } + url = url || formEl.action; + var cb = { + success: this.successDelegate, + failure: this.failureDelegate, + timeout: (this.timeout*1000), + argument: {"url": url, "form": formEl, "callback": callback, "reset": reset} + }; + var isUpload = false; + var enctype = formEl.getAttribute("enctype"); + if(enctype && enctype.toLowerCase() == "multipart/form-data"){ + isUpload = true; + cb.upload = this.successDelegate; + } + this.transaction = Ext.lib.Ajax.formRequest(formEl, url, cb, null, isUpload, this.sslBlankUrl); + this.showLoading.defer(1, this); + } + }, + + + 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); + delete this.autoRefreshProcId; + } + }, + + isAutoRefreshing : function(){ + return this.autoRefreshProcId ? true : false; + }, + + 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, response); + } + }, + + + processFailure : function(response){ + this.transaction = null; + this.fireEvent("failure", this.el, response); + if(typeof response.argument.callback == "function"){ + response.argument.callback(this.el, false, response); + } + }, + + + setRenderer : function(renderer){ + this.renderer = renderer; + }, + + getRenderer : function(){ + return this.renderer; + }, + + + setDefaultUrl : function(defaultUrl){ + this.defaultUrl = defaultUrl; + }, + + + abort : function(){ + if(this.transaction){ + Ext.lib.Ajax.abort(this.transaction); + } + }, + + + isUpdating : function(){ + if(this.transaction){ + return Ext.lib.Ajax.isCallInProgress(this.transaction); + } + return false; + } +}); + + + Ext.UpdateManager.defaults = { + + timeout : 30, + + + loadScripts : false, + + + sslBlankUrl : (Ext.SSL_SECURE_URL || "javascript:false"), + + disableCaching : false, + + showLoadIndicator : true, + + indicatorText : '
        Loading...
        ' + }; + + +Ext.UpdateManager.updateElement = function(el, url, params, options){ + var um = Ext.get(el, true).getUpdateManager(); + Ext.apply(um, options); + um.update(url, params, options ? options.callback : null); +}; + +Ext.UpdateManager.update = Ext.UpdateManager.updateElement; + +Ext.UpdateManager.BasicRenderer = function(){}; + +Ext.UpdateManager.BasicRenderer.prototype = { + + render : function(el, response, updateManager, callback){ + el.update(response.responseText, updateManager.loadScripts, callback); + } +}; + + +Ext.util.DelayedTask = function(fn, scope, args){ + var id = null, d, t; + + var call = function(){ + var now = new Date().getTime(); + if(now - t >= d){ + clearInterval(id); + id = null; + fn.apply(scope, args || []); + } + }; + + this.delay = function(delay, newFn, newScope, newArgs){ + if(id && delay != d){ + this.cancel(); + } + d = delay; + t = new Date().getTime(); + fn = newFn || fn; + scope = newScope || scope; + args = newArgs || args; + if(!id){ + id = setInterval(call, d); + } + }; + + + this.cancel = function(){ + if(id){ + clearInterval(id); + id = null; + } + }; +}; diff --git a/www/extras/yui-ext/ext-core.js b/www/extras/yui-ext/ext-core.js new file mode 100644 index 000000000..5d0436a76 --- /dev/null +++ b/www/extras/yui-ext/ext-core.js @@ -0,0 +1,28 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.DomHelper=function(){var _1=null;var _2=/^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i;var _3=function(o){if(typeof o=="string"){return o;}var b="";if(!o.tag){o.tag="div";}b+="<"+o.tag;for(var _6 in o){if(_6=="tag"||_6=="children"||_6=="cn"||_6=="html"||typeof o[_6]=="function"){continue;}if(_6=="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 _8 in s){if(typeof s[_8]!="function"){b+=_8+":"+s[_8]+";";}}b+="\"";}}}else{if(_6=="cls"){b+=" class=\""+o["cls"]+"\"";}else{if(_6=="htmlFor"){b+=" for=\""+o["htmlFor"]+"\"";}else{b+=" "+_6+"=\""+o[_6]+"\"";}}}}if(_2.test(o.tag)){b+="/>";}else{b+=">";var cn=o.children||o.cn;if(cn){if(cn instanceof Array){for(var i=0,_b=cn.length;i<_b;i++){b+=_3(cn[i],b);}}else{b+=_3(cn,b);}}if(o.html){b+=o.html;}b+="";}return b;};var _c=function(o,_e){var el=document.createElement(o.tag);var _10=el.setAttribute?true:false;for(var _11 in o){if(_11=="tag"||_11=="children"||_11=="cn"||_11=="html"||_11=="style"||typeof o[_11]=="function"){continue;}if(_11=="cls"){el.className=o["cls"];}else{if(_10){el.setAttribute(_11,o[_11]);}else{el[_11]=o[_11];}}}Ext.DomHelper.applyStyles(el,o.style);var cn=o.children||o.cn;if(cn){if(cn instanceof Array){for(var i=0,len=cn.length;i",tbe=""+te,trs=tbs+"",tre=""+tbe;var _22=function(tag,_24,el,_26){if(!_1){_1=document.createElement("div");}var _27;var _28=null;if(tag=="td"){if(_24=="afterbegin"||_24=="beforeend"){return;}if(_24=="beforebegin"){_28=el;el=el.parentNode;}else{_28=el.nextSibling;el=el.parentNode;}_27=_15(4,trs,_26,tre);}else{if(tag=="tr"){if(_24=="beforebegin"){_28=el;el=el.parentNode;_27=_15(3,tbs,_26,tbe);}else{if(_24=="afterend"){_28=el.nextSibling;el=el.parentNode;_27=_15(3,tbs,_26,tbe);}else{if(_24=="afterbegin"){_28=el.firstChild;}_27=_15(4,trs,_26,tre);}}}else{if(tag=="tbody"){if(_24=="beforebegin"){_28=el;el=el.parentNode;_27=_15(2,ts,_26,te);}else{if(_24=="afterend"){_28=el.nextSibling;el=el.parentNode;_27=_15(2,ts,_26,te);}else{if(_24=="afterbegin"){_28=el.firstChild;}_27=_15(3,tbs,_26,tbe);}}}else{if(_24=="beforebegin"||_24=="afterend"){return;}if(_24=="afterbegin"){_28=el.firstChild;}_27=_15(2,ts,_26,te);}}}el.insertBefore(_27,_28);return _27;};return {useDom:false,markup:function(o){return _3(o);},applyStyles:function(el,_2b){if(_2b){el=Ext.fly(el);if(typeof _2b=="string"){var re=/\s?([a-z\-]*)\:\s?([^;]*);?/gi;var _2d;while((_2d=re.exec(_2b))!=null){el.setStyle(_2d[1],_2d[2]);}}else{if(typeof _2b=="object"){for(var _2e in _2b){el.setStyle(_2e,_2b[_2e]);}}else{if(typeof _2b=="function"){Ext.DomHelper.applyStyles(el,_2b.call());}}}}},insertHtml:function(_2f,el,_31){_2f=_2f.toLowerCase();if(el.insertAdjacentHTML){var tag=el.tagName.toLowerCase();if(tag=="table"||tag=="tbody"||tag=="tr"||tag=="td"){var rs;if(rs=_22(tag,_2f,el,_31)){return rs;}}switch(_2f){case "beforebegin":el.insertAdjacentHTML(_2f,_31);return el.previousSibling;case "afterbegin":el.insertAdjacentHTML(_2f,_31);return el.firstChild;case "beforeend":el.insertAdjacentHTML(_2f,_31);return el.lastChild;case "afterend":el.insertAdjacentHTML(_2f,_31);return el.nextSibling;}throw "Illegal insertion point -> \""+_2f+"\"";}var _34=el.ownerDocument.createRange();var _35;switch(_2f){case "beforebegin":_34.setStartBefore(el);_35=_34.createContextualFragment(_31);el.parentNode.insertBefore(_35,el);return el.previousSibling;case "afterbegin":if(el.firstChild){_34.setStartBefore(el.firstChild);_35=_34.createContextualFragment(_31);el.insertBefore(_35,el.firstChild);return el.firstChild;}else{el.innerHTML=_31;return el.firstChild;}case "beforeend":if(el.lastChild){_34.setStartAfter(el.lastChild);_35=_34.createContextualFragment(_31);el.appendChild(_35);return el.lastChild;}else{el.innerHTML=_31;return el.lastChild;}case "afterend":_34.setStartAfter(el);_35=_34.createContextualFragment(_31);el.parentNode.insertBefore(_35,el.nextSibling);return el.nextSibling;}throw "Illegal insertion point -> \""+_2f+"\"";},insertBefore:function(el,o,_38){return this.doInsert(el,o,_38,"beforeBegin");},insertAfter:function(el,o,_3b){return this.doInsert(el,o,_3b,"afterEnd","nextSibling");},insertFirst:function(el,o,_3e){return this.doInsert(el,o,_3e,"afterBegin");},doInsert:function(el,o,_41,pos,_43){el=Ext.getDom(el);var _44;if(this.useDom){_44=_c(o,null);el.parentNode.insertBefore(_44,_43?el[_43]:el);}else{var _45=_3(o);_44=this.insertHtml(pos,el,_45);}return _41?Ext.get(_44,true):_44;},append:function(el,o,_48){el=Ext.getDom(el);var _49;if(this.useDom){_49=_c(o,null);el.appendChild(_49);}else{var _4a=_3(o);_49=this.insertHtml("beforeEnd",el,_4a);}return _48?Ext.get(_49,true):_49;},overwrite:function(el,o,_4d){el=Ext.getDom(el);el.innerHTML=_3(o);return _4d?Ext.get(el.firstChild,true):el.firstChild;},createTemplate:function(o){var _4f=_3(o);return new Ext.Template(_4f);}};}(); + +Ext.Template=function(_1){if(_1 instanceof Array){_1=_1.join("");}else{if(arguments.length>1){_1=Array.prototype.join.call(arguments,"");}}this.html=_1;};Ext.Template.prototype={applyTemplate:function(_2){if(this.compiled){return this.compiled(_2);}var _3=this.disableFormats!==true;var fm=Ext.util.Format,_5=this;var fn=function(m,_8,_9,_a){if(_9&&_3){if(_9.substr(0,5)=="this."){return _5.call(_9.substr(5),_2[_8]);}else{if(_a){var re=/^\s*['"](.*)["']\s*$/;_a=_a.split(",");for(var i=0,_d=_a.length;i<_d;i++){_a[i]=_a[i].replace(re,"$1");}_a=[_2[_8]].concat(_a);}else{_a=[_2[_8]];}return fm[_9].apply(fm,_a);}}else{return _2[_8]!==undefined?_2[_8]:"";}};return this.html.replace(this.re,fn);},set:function(_e,_f){this.html=_e;this.compiled=null;if(_f){this.compile();}return this;},disableFormats:false,re:/\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,compile:function(){var fm=Ext.util.Format;var _11=this.disableFormats!==true;var sep=Ext.isGecko?"+":",";var fn=function(m,_15,_16,_17){if(_16&&_11){_17=_17?","+_17:"";if(_16.substr(0,5)!="this."){_16="fm."+_16+"(";}else{_16="this.call(\""+_16.substr(5)+"\", ";_17="";}}else{_17="",_16="(values['"+_15+"'] == undefined ? '' : ";}return "'"+sep+_16+"values['"+_15+"']"+_17+")"+sep+"'";};var _18;if(Ext.isGecko){_18="this.compiled = function(values){ return '"+this.html.replace(/(\r\n|\n)/g,"\\n").replace("'","\\'").replace(this.re,fn)+"';};";}else{_18=["this.compiled = function(values){ return ['"];_18.push(this.html.replace(/(\r\n|\n)/g,"\\n").replace("'","\\'").replace(this.re,fn));_18.push("'].join('');};");_18=_18.join("");}eval(_18);return this;},call:function(_19,_1a){return this[_19](_1a);},insertFirst:function(el,_1c,_1d){return this.doInsert("afterBegin",el,_1c,_1d);},insertBefore:function(el,_1f,_20){return this.doInsert("beforeBegin",el,_1f,_20);},insertAfter:function(el,_22,_23){return this.doInsert("afterEnd",el,_22,_23);},append:function(el,_25,_26){return this.doInsert("beforeEnd",el,_25,_26);},doInsert:function(_27,el,_29,_2a){el=Ext.getDom(el);var _2b=Ext.DomHelper.insertHtml(_27,el,this.applyTemplate(_29));return _2a?Ext.get(_2b,true):_2b;},overwrite:function(el,_2d,_2e){el=Ext.getDom(el);el.innerHTML=this.applyTemplate(_2d);return _2e?Ext.get(el.firstChild,true):el.firstChild;}};Ext.Template.prototype.apply=Ext.Template.prototype.applyTemplate;Ext.DomHelper.Template=Ext.Template;Ext.Template.from=function(el){el=Ext.getDom(el);return new Ext.Template(el.value||el.innerHTML);};Ext.MasterTemplate=function(){Ext.MasterTemplate.superclass.constructor.apply(this,arguments);this.originalHtml=this.html;var st={};var m,re=this.subTemplateRe;re.lastIndex=0;var _33=0;while(m=re.exec(this.html)){var _34=m[1],_35=m[2];st[_33]={name:_34,index:_33,buffer:[],tpl:new Ext.Template(_35)};if(_34){st[_34]=st[_33];}st[_33].tpl.compile();st[_33].tpl.call=this.call.createDelegate(this);_33++;}this.subCount=_33;this.subs=st;};Ext.extend(Ext.MasterTemplate,Ext.Template,{subTemplateRe:/((?:.|\n)*?)<\/tpl>/gi,add:function(_36,_37){if(arguments.length==1){_37=arguments[0];_36=0;}var s=this.subs[_36];s.buffer[s.buffer.length]=s.tpl.apply(_37);return this;},fill:function(_39,_3a,_3b){var a=arguments;if(a.length==1||(a.length==2&&typeof a[1]=="boolean")){_3a=a[0];_39=0;_3b=a[1];}if(_3b){this.reset();}for(var i=0,len=_3a.length;i]\s?|\s|$)/;var _8=/^(#)?([\w-\*]+)/;function child(p,_a){var i=0;var n=p.firstChild;while(n){if(n.nodeType==1){if(++i==_a){return n;}}n=n.nextSibling;}return null;}function next(n){while((n=n.nextSibling)&&n.nodeType!=1){}return n;}function prev(n){while((n=n.previousSibling)&&n.nodeType!=1){}return n;}function clean(d){var n=d.firstChild,ni=-1;while(n){var nx=n.nextSibling;if(n.nodeType==3&&!_4.test(n.nodeValue)){d.removeChild(n);}else{n.nodeIndex=++ni;}n=nx;}return this;}function byClassName(c,a,v,re,cn){if(!v){return c;}var r=[];for(var i=0,ci;ci=c[i];i++){cn=ci.className;if(cn&&(" "+cn+" ").indexOf(v)!=-1){r[r.length]=ci;}}return r;}function attrValue(n,_1c){if(!n.tagName&&typeof n.length!="undefined"){n=n[0];}if(!n){return null;}if(_1c=="for"){return n.htmlFor;}if(_1c=="class"||_1c=="className"){return n.className;}return n.getAttribute(_1c)||n[_1c];}function getNodes(ns,_1e,_1f){var _20=[],cs;if(!ns){return _20;}_1e=_1e?_1e.replace(_5,""):"";_1f=_1f||"*";if(typeof ns.getElementsByTagName!="undefined"){ns=[ns];}if(_1e!="/"&&_1e!=">"){for(var i=0,ni;ni=ns[i];i++){cs=ni.getElementsByTagName(_1f);for(var j=0,ci;ci=cs[j];j++){_20[_20.length]=ci;}}}else{for(var i=0,ni;ni=ns[i];i++){var cn=ni.getElementsByTagName(_1f);for(var j=0,cj;cj=cn[j];j++){if(cj.parentNode==ni){_20[_20.length]=cj;}}}}return _20;}function concat(a,b){if(b.slice){return a.concat(b);}for(var i=0,l=b.length;i0);},filter:function(els,ss,_92){ss=ss.replace(_5,"");if(!_2[ss]){_2[ss]=Ext.DomQuery.compile(ss,"simple");}var _93=_2[ss](els);return _92?quickDiff(_93,els):_93;},matchers:[{re:/^\.([\w-]+)/,select:"n = byClassName(n, null, \" {1} \");"},{re:/^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,select:"n = byPseudo(n, \"{1}\", \"{2}\");"},{re:/^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,select:"n = byAttribute(n, \"{2}\", \"{4}\", \"{3}\", \"{1}\");"},{re:/^#([\w-]+)/,select:"n = byId(n, null, \"{1}\");"},{re:/^@([\w-]+)/,select:"return {firstChild:{nodeValue:attrValue(n, \"{1}\")}};"}],operators:{"=":function(a,v){return a==v;},"!=":function(a,v){return a!=v;},"^=":function(a,v){return a&&a.substr(0,v.length)==v;},"$=":function(a,v){return a&&a.substr(a.length-v.length)==v;},"*=":function(a,v){return a&&a.indexOf(v)!==-1;},"%=":function(a,v){return (a%v)==0;}},pseudos:{"first-child":function(c){var r=[],n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.previousSibling)&&n.nodeType!=1){}if(!n){r[r.length]=ci;}}return r;},"last-child":function(c){var r=[];for(var i=0,ci;ci=n=c[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(!n){r[r.length]=ci;}}return r;},"nth-child":function(c,a){var r=[];if(a!="odd"&&a!="even"){for(var i=0,ci;ci=c[i];i++){var m=child(ci.parentNode,a);if(m==ci){r[r.length]=m;}}return r;}var p;for(var i=0,l=c.length;i0){r[r.length]=ci;}}return r;},"next":function(c,ss){var is=Ext.DomQuery.is;var r=[];for(var i=0,ci;ci=c[i];i++){var n=next(ci);if(n&&is(n,ss)){r[r.length]=ci;}}return r;},"prev":function(c,ss){var is=Ext.DomQuery.is;var r=[];for(var i=0,ci;ci=c[i];i++){var n=prev(ci);if(n&&is(n,ss)){r[r.length]=ci;}}return r;}}};}();Ext.query=Ext.DomQuery.select; + +Ext.util.Observable=function(){if(this.listeners){this.on(this.listeners);delete this.listeners;}};Ext.util.Observable.prototype={fireEvent:function(){var ce=this.events[arguments[0].toLowerCase()];if(typeof ce=="object"){return ce.fire.apply(ce,Array.prototype.slice.call(arguments,1));}else{return true;}},filterOptRe:/^(?:scope|delay|buffer|single)$/,addListener:function(_2,fn,_4,o){if(typeof _2=="object"){o=_2;for(var e in o){if(this.filterOptRe.test(e)){continue;}if(typeof o[e]=="function"){this.addListener(e,o[e],o.scope,o);}else{this.addListener(e,o[e].fn,o[e].scope,o[e]);}}return;}o=(!o||typeof o=="boolean")?{}:o;_2=_2.toLowerCase();var ce=this.events[_2]||true;if(typeof ce=="boolean"){ce=new Ext.util.Event(this,_2);this.events[_2]=ce;}ce.addListener(fn,_4,o);},removeListener:function(_8,fn,_a){var ce=this.events[_8.toLowerCase()];if(typeof ce=="object"){ce.removeListener(fn,_a);}},purgeListeners:function(){for(var _c in this.events){if(typeof this.events[_c]=="object"){this.events[_c].clearListeners();}}},relayEvents:function(o,_e){var _f=function(_10){return function(){return this.fireEvent.apply(this,Ext.combine(_10,Array.prototype.slice.call(arguments,0)));};};for(var i=0,len=_e.length;i0;}};Ext.util.Observable.prototype.on=Ext.util.Observable.prototype.addListener;Ext.util.Observable.prototype.un=Ext.util.Observable.prototype.removeListener;Ext.util.Observable.capture=function(o,fn,_19){o.fireEvent=o.fireEvent.createInterceptor(fn,_19);};Ext.util.Observable.releaseCapture=function(o){o.fireEvent=Ext.util.Observable.prototype.fireEvent;};(function(){var _1b=function(h,o,_1e){var _1f=new Ext.util.DelayedTask();return function(){_1f.delay(o.buffer,h,_1e,Array.prototype.slice.call(arguments,0));};};var _20=function(h,e,fn,_24){return function(){e.removeListener(fn,_24);return h.apply(_24,arguments);};};var _25=function(h,o,_28){return function(){var _29=Array.prototype.slice.call(arguments,0);setTimeout(function(){h.apply(_28,_29);},o.delay||10);};};Ext.util.Event=function(obj,_2b){this.name=_2b;this.obj=obj;this.listeners=[];};Ext.util.Event.prototype={addListener:function(fn,_2d,_2e){var o=_2e||{};_2d=_2d||this.obj;if(!this.isListening(fn,_2d)){var l={fn:fn,scope:_2d,options:o};var h=fn;if(o.delay){h=_25(h,o,_2d);}if(o.single){h=_20(h,this,fn,_2d);}if(o.buffer){h=_1b(h,o,_2d);}l.fireFn=h;if(!this.firing){this.listeners.push(l);}else{this.listeners=this.listeners.slice(0);this.listeners.push(l);}}},findListener:function(fn,_33){_33=_33||this.obj;var ls=this.listeners;for(var i=0,len=ls.length;i0){this.firing=true;var _40=Array.prototype.slice.call(arguments,0);for(var i=0;i");var _c=document.getElementById("ie-deferred-loader");_c.onreadystatechange=function(){if(this.readyState=="complete"){_a();_c.onreadystatechange=null;_c.parentNode.removeChild(_c);}};}else{if(Ext.isSafari){_2=setInterval(function(){var rs=document.readyState;if(rs=="complete"){_a();}},10);}}}E.on(window,"load",_a);};var _e=function(h,o){var _11=new Ext.util.DelayedTask(h);return function(e){e=new Ext.EventObjectImpl(e);_11.delay(o.buffer,h,null,[e]);};};var _13=function(h,el,_16,fn){return function(e){Ext.EventManager.removeListener(el,_16,fn);h(e);};};var _19=function(h,o){return function(e){e=new Ext.EventObjectImpl(e);setTimeout(function(){h(e);},o.delay||10);};};var _1d=function(_1e,_1f,opt,fn,_22){var o=(!opt||typeof opt=="boolean")?{}:opt;fn=fn||o.fn;_22=_22||o.scope;var el=Ext.getDom(_1e);if(!el){throw "Error listening for \""+_1f+"\". Element \""+_1e+"\" doesn't exist.";}var h=function(e){e=Ext.EventObject.setEvent(e);var t;if(o.delegate){t=e.getTarget(o.delegate,el);if(!t){return;}}else{t=e.target;}if(o.stopEvent===true){e.stopEvent();}if(o.preventDefault===true){e.preventDefault();}if(o.stopPropagation===true){e.stopPropagation();}if(o.normalized===false){e=e.browserEvent;}fn.call(_22||el,e,t,o);};if(o.delay){h=_19(h,o);}if(o.single){h=_13(h,el,_1f,fn);}if(o.buffer){h=_e(h,o);}fn._handlers=fn._handlers||[];fn._handlers.push([Ext.id(el),_1f,h]);E.on(el,_1f,h);if(_1f=="mousewheel"&&el.addEventListener){el.addEventListener("DOMMouseScroll",h,false);E.on(window,"unload",function(){el.removeEventListener("DOMMouseScroll",h,false);});}if(_1f=="mousedown"&&el==document){Ext.EventManager.stoppedMouseDownEvent.addListener(h);}return h;};var _28=function(el,_2a,fn){var id=Ext.id(el),hds=fn._handlers,hd=fn;if(hds){for(var i=0,len=hds.length;i=33&&k<=40)||k==this.RETURN||k==this.TAB||k==this.ESC;},isSpecialKey:function(){var k=this.keyCode;return k==9||k==13||k==40||k==27||(k==16)||(k==17)||(k>=18&&k<=20)||(k>=33&&k<=35)||(k>=36&&k<=39)||(k>=44&&k<=45);},stopPropagation:function(){if(this.browserEvent){if(this.browserEvent.type=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.fire(this);}E.stopPropagation(this.browserEvent);}},getCharCode:function(){return this.charCode||this.keyCode;},getKey:function(){var k=this.keyCode||this.charCode;return Ext.isSafari?(_51[k]||k):k;},getPageX:function(){return this.xy[0];},getPageY:function(){return this.xy[1];},getTime:function(){if(this.browserEvent){return E.getTime(this.browserEvent);}return null;},getXY:function(){return this.xy;},getTarget:function(_58,_59,_5a){return _58?Ext.fly(this.target).findParent(_58,_59,_5a):this.target;},getRelatedTarget:function(){if(this.browserEvent){return E.getRelatedTarget(this.browserEvent);}return null;},getWheelDelta:function(){var e=this.browserEvent;var _5c=0;if(e.wheelDelta){_5c=e.wheelDelta/120;if(window.opera){_5c=-_5c;}}else{if(e.detail){_5c=-e.detail/3;}}return _5c;},hasModifier:function(){return ((this.ctrlKey||this.altKey)||this.shiftKey)?true:false;},within:function(el,_5e){var t=this[_5e?"getRelatedTarget":"getTarget"]();return t&&Ext.fly(el).contains(t);},getPoint:function(){return new Ext.lib.Point(this.xy[0],this.xy[1]);}};return new Ext.EventObjectImpl();}(); + +(function(){var D=Ext.lib.Dom;var E=Ext.lib.Event;var A=Ext.lib.Anim;var _4={};var _5=/(-[a-z])/gi;var _6=function(m,a){return a.charAt(1).toUpperCase();};var _9=document.defaultView;Ext.Element=function(_a,_b){var _c=typeof _a=="string"?document.getElementById(_a):_a;if(!_c){return null;}if(!_b&&Ext.Element.cache[_c.id]){return Ext.Element.cache[_c.id];}this.dom=_c;this.id=_c.id||Ext.id(_c);};var El=Ext.Element;El.prototype={originalDisplay:"",visibilityMode:1,defaultUnit:"px",setVisibilityMode:function(_e){this.visibilityMode=_e;return this;},enableDisplayMode:function(_f){this.setVisibilityMode(El.DISPLAY);if(typeof _f!="undefined"){this.originalDisplay=_f;}return this;},findParent:function(_10,_11,_12){var p=this.dom,b=document.body,_15=0,dq=Ext.DomQuery,_17;_11=_11||50;if(typeof _11!="number"){_17=Ext.getDom(_11);_11=10;}while(p&&p.nodeType==1&&_15<_11&&p!=b&&p!=_17){if(dq.is(p,_10)){return _12?Ext.get(p):p;}_15++;p=p.parentNode;}return null;},findParentNode:function(_18,_19,_1a){var p=Ext.fly(this.dom.parentNode,"_internal");return p?p.findParent(_18,_19,_1a):null;},up:function(_1c,_1d){return this.findParentNode(_1c,_1d,true);},is:function(_1e){return Ext.DomQuery.is(this.dom,_1e);},animate:function(_1f,_20,_21,_22,_23){this.anim(_1f,{duration:_20,callback:_21,easing:_22},_23);return this;},anim:function(_24,opt,_26,_27,_28,cb){_26=_26||"run";opt=opt||{};var _2a=Ext.lib.Anim[_26](this.dom,_24,(opt.duration||_27)||0.35,(opt.easing||_28)||"easeOut",function(){Ext.callback(cb,this);Ext.callback(opt.callback,opt.scope||this,[this,opt]);},this);opt.anim=_2a;return _2a;},preanim:function(a,i){return !a[i]?false:(typeof a[i]=="object"?a[i]:{duration:a[i+1],callback:a[i+2],easing:a[i+3]});},clean:function(_2d){if(this.isCleaned&&_2d!==true){return this;}var ns=/\S/;var d=this.dom,n=d.firstChild,ni=-1;while(n){var nx=n.nextSibling;if(n.nodeType==3&&!ns.test(n.nodeValue)){d.removeChild(n);}else{n.nodeIndex=++ni;}n=nx;}this.isCleaned=true;return this;},calcOffsetsTo:function(el){el=Ext.get(el),d=el.dom;var _34=false;if(el.getStyle("position")=="static"){el.position("relative");_34=true;}var x=0,y=0;var op=this.dom;while(op&&op!=d&&op.tagName!="HTML"){x+=op.offsetLeft;y+=op.offsetTop;op=op.offsetParent;}if(_34){el.position("static");}return [x,y];},scrollIntoView:function(_38,_39){var c=Ext.getDom(_38)||document.body;var el=this.dom;var o=this.calcOffsetsTo(c),l=o[0],t=o[1],b=t+el.offsetHeight,r=l+el.offsetWidth;var ch=c.clientHeight;var ct=parseInt(c.scrollTop,10);var cl=parseInt(c.scrollLeft,10);var cb=ct+ch;var cr=cl+c.clientWidth;if(tcb){c.scrollTop=b-ch;}}if(_39!==false){if(lcr){c.scrollLeft=r-c.clientWidth;}}}return this;},scrollChildIntoView:function(_46){Ext.fly(_46,"_scrollChildIntoView").scrollIntoView(this);},autoHeight:function(_47,_48,_49,_4a){var _4b=this.getHeight();this.clip();this.setHeight(1);setTimeout(function(){var _4c=parseInt(this.dom.scrollHeight,10);if(!_47){this.setHeight(_4c);this.unclip();if(typeof _49=="function"){_49();}}else{this.setHeight(_4b);this.setHeight(_4c,_47,_48,function(){this.unclip();if(typeof _49=="function"){_49();}}.createDelegate(this),_4a);}}.createDelegate(this),0);return this;},contains:function(el){if(!el){return false;}return D.isAncestor(this.dom,el.dom?el.dom:el);},isVisible:function(_4e){var vis=!(this.getStyle("visibility")=="hidden"||this.getStyle("display")=="none");if(_4e!==true||!vis){return vis;}var p=this.dom.parentNode;while(p&&p.tagName.toLowerCase()!="body"){if(!Ext.fly(p,"_isVisible").isVisible()){return false;}p=p.parentNode;}return true;},select:function(_51,_52){return El.select("#"+Ext.id(this.dom)+" "+_51,_52);},query:function(_53,_54){return Ext.DomQuery.select("#"+Ext.id(this.dom)+" "+_53);},child:function(_55,_56){var n=Ext.DomQuery.selectNode("#"+Ext.id(this.dom)+" "+_55);return _56?n:Ext.get(n);},down:function(_58,_59){var n=Ext.DomQuery.selectNode("#"+Ext.id(this.dom)+" > "+_58);return _59?n:Ext.get(n);},initDD:function(_5b,_5c,_5d){var dd=new Ext.dd.DD(Ext.id(this.dom),_5b,_5c);return Ext.apply(dd,_5d);},initDDProxy:function(_5f,_60,_61){var dd=new Ext.dd.DDProxy(Ext.id(this.dom),_5f,_60);return Ext.apply(dd,_61);},initDDTarget:function(_63,_64,_65){var dd=new Ext.dd.DDTarget(Ext.id(this.dom),_63,_64);return Ext.apply(dd,_65);},setVisible:function(_67,_68){if(!_68||!A){if(this.visibilityMode==El.DISPLAY){this.setDisplayed(_67);}else{this.fixDisplay();this.dom.style.visibility=_67?"visible":"hidden";}}else{var dom=this.dom;var _6a=this.visibilityMode;if(_67){this.setOpacity(0.01);this.setVisible(true);}this.anim({opacity:{to:(_67?1:0)}},this.preanim(arguments,1),null,0.35,"easeIn",function(){if(!_67){if(_6a==El.DISPLAY){dom.style.display="none";}else{dom.style.visibility="hidden";}Ext.get(dom).setOpacity(1);}});}return this;},isDisplayed:function(){return this.getStyle("display")!="none";},toggle:function(_6b){this.setVisible(!this.isVisible(),this.preanim(arguments,0));return this;},setDisplayed:function(_6c){if(typeof _6c=="boolean"){_6c=_6c?this.originalDisplay:"none";}this.setStyle("display",_6c);return this;},focus:function(){try{this.dom.focus();}catch(e){}return this;},blur:function(){try{this.dom.blur();}catch(e){}return this;},addClass:function(_6d){if(_6d instanceof Array){for(var i=0,len=_6d.length;idw){x=_fe?r.left-w:dw-w;}if(x<_100){x=_fe?r.right:_100;}if((y+h)>dh){y=_fd?r.top-h:dh-h;}if(y<_101){y=_fd?r.bottom:_101;}}return [x,y];},getConstrainToXY:function(){var os={top:0,left:0,bottom:0,right:0};return function(el,_104,_105){el=Ext.get(el);_105=_105?Ext.applyIf(_105,os):os;var vw,vh,vx=0,vy=0;if(el.dom==document.body||el.dom==document){vw=Ext.lib.Dom.getViewWidth();vh=Ext.lib.Dom.getViewHeight();}else{vw=el.dom.clientWidth;vh=el.dom.clientHeight;if(!_104){var vxy=el.getXY();vx=vxy[0];vy=vxy[1];}}var s=el.getScroll();vx+=_105.left+s.left;vy+=_105.top+s.top;vw-=_105.right;vh-=_105.bottom;var vr=vx+vw;var vb=vy+vh;var xy=!_104?this.getXY():[this.getLeft(true),this.getTop(true)];var x=xy[0],y=xy[1];var w=this.dom.offsetWidth,h=this.dom.offsetHeight;var _113=false;if((x+w)>vr){x=vr-w;_113=true;}if((y+h)>vb){y=vb-h;_113=true;}if(x";E.onAvailable(id,function(){var hd=document.getElementsByTagName("head")[0];var re=/(?:]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;var _134=/\ssrc=([\'\"])(.*?)\1/i;var _135=/\stype=([\'\"])(.*?)\1/i;var _136;while(_136=re.exec(html)){var _137=_136[1];var _138=_137?_137.match(_134):false;if(_138&&_138[2]){var s=document.createElement("script");s.src=_138[2];var _13a=_137.match(_135);if(_13a&&_13a[2]){s.type=_13a[2];}hd.appendChild(s);}else{if(_136[2]&&_136[2].length>0){eval(_136[2]);}}}var el=document.getElementById(id);if(el){el.parentNode.removeChild(el);}if(typeof _12f=="function"){_12f();}});dom.innerHTML=html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/ig,"");return this;},load:function(){var um=this.getUpdateManager();um.update.apply(um,arguments);return this;},getUpdateManager:function(){if(!this.updateManager){this.updateManager=new 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;");this.addClass("x-unselectable");return this;},getCenterXY:function(){return this.getAlignToXY(document,"c-c");},center:function(_13d){this.alignTo(_13d||document,"c-c");return this;},isBorderBox:function(){return _13e[this.dom.tagName.toLowerCase()]||Ext.isBorderBox;},getBox:function(_13f,_140){var xy;if(!_140){xy=this.getXY();}else{var left=parseInt(this.getStyle("left"),10)||0;var top=parseInt(this.getStyle("top"),10)||0;xy=[left,top];}var el=this.dom,w=el.offsetWidth,h=el.offsetHeight,bx;if(!_13f){bx={x:xy[0],y:xy[1],0:xy[0],1: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");bx={x:xy[0]+l,y:xy[1]+t,0:xy[0]+l,1:xy[1]+t,width:w-(l+r),height:h-(t+b)};}bx.right=bx.x+bx.width;bx.bottom=bx.y+bx.height;return bx;},getFrameWidth:function(_14c){return this.getPadding(_14c)+this.getBorderWidth(_14c);},setBox:function(box,_14e,_14f){var w=box.width,h=box.height;if((_14e&&!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,this.preanim(arguments,2));return this;},repaint:function(){var dom=this.dom;this.addClass("x-repaint");setTimeout(function(){Ext.get(dom).removeClass("x-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,El.margins);}},addStyles:function(_154,_155){var val=0;for(var i=0,len=_154.length;idom.clientHeight||dom.scrollWidth>dom.clientWidth;},scrollTo:function(side,_197,_198){var prop=side.toLowerCase()=="left"?"scrollLeft":"scrollTop";if(!_198||!A){this.dom[prop]=_197;}else{var to=prop=="scrollLeft"?[_197,this.dom.scrollTop]:[this.dom.scrollLeft,_197];this.anim({scroll:{"to":to}},this.preanim(arguments,2),"scroll");}return this;},scroll:function(_19b,_19c,_19d){if(!this.isScrollable()){return;}var el=this.dom;var l=el.scrollLeft,t=el.scrollTop;var w=el.scrollWidth,h=el.scrollHeight;var cw=el.clientWidth,ch=el.clientHeight;_19b=_19b.toLowerCase();var _1a5=false;var a=this.preanim(arguments,2);switch(_19b){case "l":case "left":if(w-l>cw){var v=Math.min(l+_19c,w-cw);this.scrollTo("left",v,a);_1a5=true;}break;case "r":case "right":if(l>0){var v=Math.max(l-_19c,0);this.scrollTo("left",v,a);_1a5=true;}break;case "t":case "top":case "up":if(t>0){var v=Math.max(t-_19c,0);this.scrollTo("top",v,a);_1a5=true;}break;case "b":case "bottom":case "down":if(h-t>ch){var v=Math.min(t+_19c,h-ch);this.scrollTo("top",v,a);_1a5=true;}break;}return _1a5;},translatePoints:function(x,y){if(typeof x=="object"||x instanceof Array){y=x[1];x=x[0];}var p=this.getStyle("position");var o=this.getXY();var l=parseInt(this.getStyle("left"),10);var t=parseInt(this.getStyle("top"),10);if(isNaN(l)){l=(p=="relative")?0:this.dom.offsetLeft;}if(isNaN(t)){t=(p=="relative")?0:this.dom.offsetTop;}return {left:(x-o[0]+l),top:(y-o[1]+t)};},getScroll:function(){var d=this.dom,doc=document;if(d==doc||d==doc.body){var l=window.pageXOffset||doc.documentElement.scrollLeft||doc.body.scrollLeft||0;var t=window.pageYOffset||doc.documentElement.scrollTop||doc.body.scrollTop||0;return {left:l,top:t};}else{return {left:d.scrollLeft,top:d.scrollTop};}},getColor:function(attr,_1b3,_1b4){var v=this.getStyle(attr);if(!v||v=="transparent"||v=="inherit"){return _1b3;}var _1b6=typeof _1b4=="undefined"?"#":_1b4;if(v.substr(0,4)=="rgb("){var rvs=v.slice(4,v.length-1).split(",");for(var i=0;i<3;i++){var h=parseInt(rvs[i]).toString(16);if(h<16){h="0"+h;}_1b6+=h;}}else{if(v.substr(0,1)=="#"){if(v.length==4){for(var i=1;i<4;i++){var c=v.charAt(i);_1b6+=c+c;}}else{if(v.length==7){_1b6+=v.substr(1);}}}}return (_1b6.length>5?_1b6.toLowerCase():_1b3);},boxWrap:function(cls){cls=cls||"x-box";var el=Ext.get(this.insertHtml("beforeBegin",String.format("
        "+El.boxMarkup+"
        ",cls)));el.child("."+cls+"-mc").dom.appendChild(this.dom);return el;},getAttributeNS:Ext.isIE?function(ns,name){var d=this.dom;var type=typeof d[ns+":"+name];if(type!="undefined"&&type!="unknown"){return d[ns+":"+name];}return d[name];}:function(ns,name){var d=this.dom;return d.getAttributeNS(ns,name)||d.getAttribute(ns+":"+name)||d.getAttribute(name)||d[name];}};var ep=El.prototype;ep.on=ep.addListener;ep.mon=ep.addListener;ep.un=ep.removeListener;ep.autoBoxAdjust=true;ep.autoDisplayMode=true;El.unitPattern=/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i;El.addUnits=function(v,_1c6){if(v===""||v=="auto"){return v;}if(v===undefined){return "";}if(typeof v=="number"||!El.unitPattern.test(v)){return v+(_1c6||"px");}return v;};El.boxMarkup="
        ";El.VISIBILITY=1;El.DISPLAY=2;El.borders={l:"border-left-width",r:"border-right-width",t:"border-top-width",b:"border-bottom-width"};El.paddings={l:"padding-left",r:"padding-right",t:"padding-top",b:"padding-bottom"};El.margins={l:"margin-left",r:"margin-right",t:"margin-top",b:"margin-bottom"};El.cache={};var _1c7;El.get=function(el){var ex,elm,id;if(!el){return null;}if(typeof el=="string"){if(!(elm=document.getElementById(el))){return null;}if(ex=El.cache[el]){ex.dom=elm;}else{ex=El.cache[el]=new El(elm);}return ex;}else{if(el.tagName){if(!(id=el.id)){id=Ext.id(el);}if(ex=El.cache[id]){ex.dom=el;}else{ex=El.cache[id]=new El(el);}return ex;}else{if(el instanceof El){if(el!=_1c7){el.dom=document.getElementById(el.id)||el.dom;El.cache[el.id]=el;}return el;}else{if(el.isComposite){return el;}else{if(el instanceof Array){return El.select(el);}else{if(el==document){if(!_1c7){var f=function(){};f.prototype=El.prototype;_1c7=new f();_1c7.dom=document;}return _1c7;}}}}}}return null;};El.uncache=function(el){for(var i=0,a=arguments,len=a.length;i0){_2f.defer((duration/2)*1000,this);}else{el.afterFx(o);}};_2f.call(this);});return this;},pause:function(_32){var el=this.getFxEl();var o={};el.queueFx(o,function(){setTimeout(function(){el.afterFx(o);},_32*1000);});return this;},fadeIn:function(o){var el=this.getFxEl();o=o||{};el.queueFx(o,function(){this.setOpacity(0);this.fixDisplay();this.dom.style.visibility="visible";var to=o.endOpacity||1;arguments.callee.anim=this.fxanim({opacity:{to:to}},o,null,0.5,"easeOut",function(){if(to==1){this.clearOpacity();}el.afterFx(o);});});return this;},fadeOut:function(o){var el=this.getFxEl();o=o||{};el.queueFx(o,function(){arguments.callee.anim=this.fxanim({opacity:{to:o.endOpacity||0}},o,null,0.5,"easeOut",function(){if(this.visibilityMode==Ext.Element.DISPLAY||o.useDisplay){this.dom.style.display="none";}else{this.dom.style.visibility="hidden";}this.clearOpacity();el.afterFx(o);});});return this;},scale:function(w,h,o){this.shift(Ext.apply({},o,{width:w,height:h}));return this;},shift:function(o){var el=this.getFxEl();o=o||{};el.queueFx(o,function(){var a={},w=o.width,h=o.height,x=o.x,y=o.y,op=o.opacity;if(w!==undefined){a.width={to:this.adjustWidth(w)};}if(h!==undefined){a.height={to:this.adjustHeight(h)};}if(x!==undefined||y!==undefined){a.points={to:[x!==undefined?x:this.getX(),y!==undefined?y:this.getY()]};}if(op!==undefined){a.opacity={to:op};}if(o.xy!==undefined){a.points={to:o.xy};}arguments.callee.anim=this.fxanim(a,o,"motion",0.35,"easeOut",function(){el.afterFx(o);});});return this;},ghost:function(_45,o){var el=this.getFxEl();o=o||{};el.queueFx(o,function(){_45=_45||"b";var r=this.getFxRestore();var w=this.getWidth(),h=this.getHeight();var st=this.dom.style;var _4c=function(){if(o.useDisplay){el.setDisplayed(false);}else{el.hide();}el.clearOpacity();el.setPositioning(r.pos);st.width=r.width;st.height=r.height;el.afterFx(o);};var a={opacity:{to:0},points:{}},pt=a.points;switch(_45.toLowerCase()){case "t":pt.by=[0,-h];break;case "l":pt.by=[-w,0];break;case "r":pt.by=[w,0];break;case "b":pt.by=[0,h];break;case "tl":pt.by=[-w,-h];break;case "bl":pt.by=[-w,h];break;case "br":pt.by=[w,h];break;case "tr":pt.by=[w,-h];break;}arguments.callee.anim=this.fxanim(a,o,"motion",0.5,"easeOut",_4c);});return this;},syncFx:function(){this.fxDefaults=Ext.apply(this.fxDefaults||{},{block:false,concurrent:true,stopFx:false});return this;},sequenceFx:function(){this.fxDefaults=Ext.apply(this.fxDefaults||{},{block:false,concurrent:false,stopFx:false});return this;},nextFx:function(){var ef=this.fxQueue[0];if(ef){ef.call(this);}},hasActiveFx:function(){return this.fxQueue&&this.fxQueue[0];},stopFx:function(){if(this.hasActiveFx()){var cur=this.fxQueue[0];if(cur&&cur.anim&&cur.anim.isAnimated()){this.fxQueue=[cur];cur.anim.stop(true);}}return this;},beforeFx:function(o){if(this.hasActiveFx()&&!o.concurrent){if(o.stopFx){this.stopFx();return true;}return false;}return true;},hasFxBlock:function(){var q=this.fxQueue;return q&&q[0]&&q[0].block;},queueFx:function(o,fn){if(!this.fxQueue){this.fxQueue=[];}if(!this.hasFxBlock()){Ext.applyIf(o,this.fxDefaults);if(!o.concurrent){var run=this.beforeFx(o);fn.block=o.block;this.fxQueue.push(fn);if(run){this.nextFx();}}else{fn.call(this);}}return this;},fxWrap:function(pos,o,vis){var _59;if(!o.wrap||!(_59=Ext.get(o.wrap))){var _5a;if(o.fixPosition){_5a=this.getXY();}var div=document.createElement("div");div.style.visibility=vis;_59=Ext.get(this.dom.parentNode.insertBefore(div,this.dom));_59.setPositioning(pos);if(_59.getStyle("position")=="static"){_59.position("relative");}this.clearPositioning("auto");_59.clip();_59.dom.appendChild(this.dom);if(_5a){_59.setXY(_5a);}}return _59;},fxUnwrap:function(_5c,pos,o){this.clearPositioning();this.setPositioning(pos);if(!o.wrap){_5c.dom.parentNode.insertBefore(this.dom,_5c.dom);_5c.remove();}},getFxRestore:function(){var st=this.dom.style;return {pos:this.getPositioning(),width:st.width,height:st.height};},afterFx:function(o){if(o.afterStyle){this.applyStyles(o.afterStyle);}if(o.afterCls){this.addClass(o.afterCls);}if(o.remove===true){this.remove();}Ext.callback(o.callback,o.scope,[this]);if(!o.concurrent){this.fxQueue.shift();this.nextFx();}},getFxEl:function(){return Ext.get(this.dom);},fxanim:function(_61,opt,_63,_64,_65,cb){_63=_63||"run";opt=opt||{};var _67=Ext.lib.Anim[_63](this.dom,_61,(opt.duration||_64)||0.35,(opt.easing||_65)||"easeOut",function(){Ext.callback(cb,this);},this);opt.anim=_67;return _67;}};Ext.Fx.resize=Ext.Fx.scale;Ext.apply(Ext.Element.prototype,Ext.Fx); + +Ext.CompositeElement=function(_1){this.elements=[];this.addElements(_1);};Ext.CompositeElement.prototype={isComposite:true,addElements:function(_2){if(!_2){return this;}if(typeof _2=="string"){_2=Ext.Element.selectorFunction(_2);}var _3=this.elements;var _4=_3.length-1;for(var i=0,_6=_2.length;i<_6;i++){_3[++_4]=Ext.get(_2[i],true);}return this;},invoke:function(fn,_8){var _9=this.elements;for(var i=0,_b=_9.length;i<_b;i++){Ext.Element.prototype[fn].apply(_9[i],_8);}return this;},add:function(_c){if(typeof _c=="string"){this.addElements(Ext.Element.selectorFunction(_c));}else{if(_c.length!==undefined){this.addElements(_c);}else{this.addElements([_c]);}}return this;},each:function(fn,_e){var _f=this.elements;for(var i=0,len=_f.length;i"+_9.text+"";}if(typeof _9.scripts!="undefined"){this.loadScripts=_9.scripts;}if(typeof _9.timeout!="undefined"){this.timeout=_9.timeout;}}this.showLoading();if(!_7){this.defaultUrl=_4;}if(typeof _4=="function"){_4=_4.call(this);}if(typeof _5=="function"){_5=_5();}if(_5&&typeof _5!="string"){var _a=[];for(var _b in _5){if(typeof _5[_b]!="function"){_a.push(encodeURIComponent(_b),"=",encodeURIComponent(_5[_b]),"&");}}delete _a[_a.length-1];_5=_a.join("");}var cb={success:this.successDelegate,failure:this.failureDelegate,timeout:(this.timeout*1000),argument:{"url":_4,"form":null,"callback":_6,"params":_5}};_8=_8||(_5?"POST":"GET");if(_8=="GET"){_4=this.prepareUrl(_4);}this.transaction=Ext.lib.Ajax.request(_8,_4,cb,_5);}},formUpdate:function(_d,_e,_f,_10){if(this.fireEvent("beforeupdate",this.el,_d,_e)!==false){formEl=Ext.getDom(_d);if(typeof _e=="function"){_e=_e.call(this);}if(typeof params=="function"){params=params();}_e=_e||formEl.action;var cb={success:this.successDelegate,failure:this.failureDelegate,timeout:(this.timeout*1000),argument:{"url":_e,"form":formEl,"callback":_10,"reset":_f}};var _12=false;var _13=formEl.getAttribute("enctype");if(_13&&_13.toLowerCase()=="multipart/form-data"){_12=true;cb.upload=this.successDelegate;}this.transaction=Ext.lib.Ajax.formRequest(formEl,_e,cb,null,_12,this.sslBlankUrl);this.showLoading.defer(1,this);}},refresh:function(_14){if(this.defaultUrl==null){return;}this.update(this.defaultUrl,null,_14,true);},startAutoRefresh:function(_15,url,_17,_18,_19){if(_19){this.update(url||this.defaultUrl,_17,_18,true);}if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId);}this.autoRefreshProcId=setInterval(this.update.createDelegate(this,[url||this.defaultUrl,_17,_18,true]),_15*1000);},stopAutoRefresh:function(){if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId);delete this.autoRefreshProcId;}},isAutoRefreshing:function(){return this.autoRefreshProcId?true:false;},showLoading:function(){if(this.showLoadIndicator){this.el.update(this.indicatorText);}},prepareUrl:function(url){if(this.disableCaching){var _1b="_dc="+(new Date().getTime());if(url.indexOf("?")!==-1){url+="&"+_1b;}else{url+="?"+_1b;}}return url;},processSuccess:function(_1c){this.transaction=null;if(_1c.argument.form&&_1c.argument.reset){try{_1c.argument.form.reset();}catch(e){}}if(this.loadScripts){this.renderer.render(this.el,_1c,this,this.updateComplete.createDelegate(this,[_1c]));}else{this.renderer.render(this.el,_1c,this);this.updateComplete(_1c);}},updateComplete:function(_1d){this.fireEvent("update",this.el,_1d);if(typeof _1d.argument.callback=="function"){_1d.argument.callback(this.el,true,_1d);}},processFailure:function(_1e){this.transaction=null;this.fireEvent("failure",this.el,_1e);if(typeof _1e.argument.callback=="function"){_1e.argument.callback(this.el,false,_1e);}},setRenderer:function(_1f){this.renderer=_1f;},getRenderer:function(){return this.renderer;},setDefaultUrl:function(_20){this.defaultUrl=_20;},abort:function(){if(this.transaction){Ext.lib.Ajax.abort(this.transaction);}},isUpdating:function(){if(this.transaction){return Ext.lib.Ajax.isCallInProgress(this.transaction);}return false;}});Ext.UpdateManager.defaults={timeout:30,loadScripts:false,sslBlankUrl:(Ext.SSL_SECURE_URL||"javascript:false"),disableCaching:false,showLoadIndicator:true,indicatorText:"
        Loading...
        "};Ext.UpdateManager.updateElement=function(el,url,_23,_24){var um=Ext.get(el,true).getUpdateManager();Ext.apply(um,_24);um.update(url,_23,_24?_24.callback:null);};Ext.UpdateManager.update=Ext.UpdateManager.updateElement;Ext.UpdateManager.BasicRenderer=function(){};Ext.UpdateManager.BasicRenderer.prototype={render:function(el,_27,_28,_29){el.update(_27.responseText,_28.loadScripts,_29);}}; + +Ext.util.DelayedTask=function(fn,_2,_3){var id=null,d,t;var _7=function(){var _8=new Date().getTime();if(_8-t>=d){clearInterval(id);id=null;fn.apply(_2,_3||[]);}};this.delay=function(_9,_a,_b,_c){if(id&&_9!=d){this.cancel();}d=_9;t=new Date().getTime();fn=_a||fn;_2=_b||_2;_3=_c||_3;if(!id){id=setInterval(_7,d);}};this.cancel=function(){if(id){clearInterval(id);id=null;}};}; + diff --git a/www/extras/yui-ext/package/button/button-debug.js b/www/extras/yui-ext/package/button/button-debug.js new file mode 100644 index 000000000..1f5e4c2e9 --- /dev/null +++ b/www/extras/yui-ext/package/button/button-debug.js @@ -0,0 +1,365 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + + +Ext.Button = function(renderTo, config){ + Ext.apply(this, config); + this.addEvents({ + + "click" : true, + + "toggle" : true, + + 'mouseover' : true, + + 'mouseout': true + }); + if(this.menu){ + this.menu = Ext.menu.MenuMgr.get(this.menu); + } + if(renderTo){ + this.render(renderTo); + } + Ext.Button.superclass.constructor.call(this); +}; + +Ext.extend(Ext.Button, Ext.util.Observable, { + + hidden : false, + + disabled : false, + + pressed : false, + + + enableToggle: false, + + menu : undefined, + + menuAlign : "tl-bl?", + + + menuClassTarget: 'tr', + + clickEvent : 'click', + handleMouseEvents : true, + + + tooltipType : 'qtip', + + + render : function(renderTo){ + var btn; + if(this.hideParent){ + this.parentEl = Ext.get(renderTo); + } + if(!this.dhconfig){ + if(!this.template){ + if(!Ext.Button.buttonTemplate){ + + Ext.Button.buttonTemplate = new Ext.Template( + '', + '', + "
          
        "); + } + this.template = Ext.Button.buttonTemplate; + } + btn = this.template.append(renderTo, [this.text || ' '], true); + var btnEl = btn.child("button:first"); + btnEl.on('focus', this.onFocus, this); + btnEl.on('blur', this.onBlur, this); + if(this.cls){ + btn.addClass(this.cls); + } + if(this.icon){ + btnEl.setStyle('background-image', 'url(' +this.icon +')'); + } + if(this.tooltip){ + if(typeof this.tooltip == 'object'){ + Ext.QuickTips.tips(Ext.apply({ + target: btnEl.id + }, this.tooltip)); + } else { + btnEl.dom[this.tooltipType] = this.tooltip; + } + } + }else{ + btn = Ext.DomHelper.append(Ext.get(renderTo).dom, this.dhconfig, true); + } + this.el = btn; + if(this.id){ + this.el.dom.id = this.el.id = this.id; + } + if(this.menu){ + this.el.child(this.menuClassTarget).addClass("x-btn-with-menu"); + this.menu.on("show", this.onMenuShow, this); + this.menu.on("hide", this.onMenuHide, this); + } + btn.addClass("x-btn"); + if(Ext.isIE && !Ext.isIE7){ + this.autoWidth.defer(1, this); + }else{ + this.autoWidth(); + } + if(this.handleMouseEvents){ + btn.on("mouseover", this.onMouseOver, this); + btn.on("mouseout", this.onMouseOut, this); + btn.on("mousedown", this.onMouseDown, this); + } + btn.on(this.clickEvent, this.onClick, this); + + if(this.hidden){ + this.hide(); + } + if(this.disabled){ + this.disable(); + } + Ext.ButtonToggleMgr.register(this); + if(this.pressed){ + this.el.addClass("x-btn-pressed"); + } + if(this.repeat){ + var repeater = new Ext.util.ClickRepeater(btn, + typeof this.repeat == "object" ? this.repeat : {} + ); + repeater.on("click", this.onClick, this); + } + }, + + getEl : function(){ + return this.el; + }, + + + destroy : function(){ + Ext.ButtonToggleMgr.unregister(this); + this.el.removeAllListeners(); + this.purgeListeners(); + this.el.remove(); + }, + + + autoWidth : function(){ + if(this.el){ + this.el.setWidth("auto"); + if(Ext.isIE7 && Ext.isStrict){ + var ib = this.el.child('button'); + if(ib && ib.getWidth() > 20){ + ib.clip(); + ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr')); + } + } + if(this.minWidth){ + if(this.hidden){ + this.el.beginMeasure(); + } + if(this.el.getWidth() < this.minWidth){ + this.el.setWidth(this.minWidth); + } + if(this.hidden){ + this.el.endMeasure(); + } + } + } + }, + + + setHandler : function(handler, scope){ + this.handler = handler; + this.scope = scope; + }, + + + setText : function(text){ + this.text = text; + if(this.el){ + this.el.child("td.x-btn-center button.x-btn-text").update(text); + } + this.autoWidth(); + }, + + + getText : function(){ + return this.text; + }, + + + show: function(){ + this.hidden = false; + if(this.el){ + this[this.hideParent? 'parentEl' : 'el'].setStyle("display", ""); + } + }, + + + hide: function(){ + this.hidden = true; + if(this.el){ + this[this.hideParent? 'parentEl' : 'el'].setStyle("display", "none"); + } + }, + + + setVisible: function(visible){ + if(visible) { + this.show(); + }else{ + this.hide(); + } + }, + + + toggle : function(state){ + state = state === undefined ? !this.pressed : state; + if(state != this.pressed){ + if(state){ + this.el.addClass("x-btn-pressed"); + this.pressed = true; + this.fireEvent("toggle", this, true); + }else{ + this.el.removeClass("x-btn-pressed"); + this.pressed = false; + this.fireEvent("toggle", this, false); + } + if(this.toggleHandler){ + this.toggleHandler.call(this.scope || this, this, state); + } + } + }, + + + focus : function(){ + this.el.child('button:first').focus(); + }, + + + disable : function(){ + if(this.el){ + this.el.addClass("x-btn-disabled"); + } + this.disabled = true; + }, + + + enable : function(){ + if(this.el){ + this.el.removeClass("x-btn-disabled"); + } + this.disabled = false; + }, + + + setDisabled : function(v){ + this[v !== true ? "enable" : "disable"](); + }, + + + onClick : function(e){ + if(e){ + e.preventDefault(); + } + if(!this.disabled){ + if(this.enableToggle){ + this.toggle(); + } + if(this.menu && !this.menu.isVisible()){ + this.menu.show(this.el, this.menuAlign); + } + this.fireEvent("click", this, e); + if(this.handler){ + this.el.removeClass("x-btn-over"); + this.handler.call(this.scope || this, this, e); + } + } + }, + + onMouseOver : function(e){ + if(!this.disabled){ + this.el.addClass("x-btn-over"); + this.fireEvent('mouseover', this, e); + } + }, + + onMouseOut : function(e){ + if(!e.within(this.el, true)){ + this.el.removeClass("x-btn-over"); + this.fireEvent('mouseout', this, e); + } + }, + + onFocus : function(e){ + if(!this.disabled){ + this.el.addClass("x-btn-focus"); + } + }, + + onBlur : function(e){ + this.el.removeClass("x-btn-focus"); + }, + + onMouseDown : function(){ + if(!this.disabled){ + this.el.addClass("x-btn-click"); + Ext.get(document).on('mouseup', this.onMouseUp, this); + } + }, + + onMouseUp : function(){ + this.el.removeClass("x-btn-click"); + Ext.get(document).un('mouseup', this.onMouseUp, this); + }, + + onMenuShow : function(e){ + this.el.addClass("x-btn-menu-active"); + }, + + onMenuHide : function(e){ + this.el.removeClass("x-btn-menu-active"); + } +}); + + +Ext.ButtonToggleMgr = function(){ + var groups = {}; + + function toggleGroup(btn, state){ + if(state){ + var g = groups[btn.toggleGroup]; + for(var i = 0, l = g.length; i < l; i++){ + if(g[i] != btn){ + g[i].toggle(false); + } + } + } + } + + return { + register : function(btn){ + if(!btn.toggleGroup){ + return; + } + var g = groups[btn.toggleGroup]; + if(!g){ + g = groups[btn.toggleGroup] = []; + } + g.push(btn); + btn.on("toggle", toggleGroup); + }, + + unregister : function(btn){ + if(!btn.toggleGroup){ + return; + } + var g = groups[btn.toggleGroup]; + if(g){ + g.remove(btn); + btn.un("toggle", toggleGroup); + } + } + }; +}(); diff --git a/www/extras/yui-ext/package/button/button.js b/www/extras/yui-ext/package/button/button.js new file mode 100644 index 000000000..1d5cd714d --- /dev/null +++ b/www/extras/yui-ext/package/button/button.js @@ -0,0 +1,10 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.Button=function(_1,_2){Ext.apply(this,_2);this.addEvents({"click":true,"toggle":true,"mouseover":true,"mouseout":true});if(this.menu){this.menu=Ext.menu.MenuMgr.get(this.menu);}if(_1){this.render(_1);}Ext.Button.superclass.constructor.call(this);};Ext.extend(Ext.Button,Ext.util.Observable,{hidden:false,disabled:false,pressed:false,enableToggle:false,menu:undefined,menuAlign:"tl-bl?",menuClassTarget:"tr",clickEvent:"click",handleMouseEvents:true,tooltipType:"qtip",render:function(_3){var _4;if(this.hideParent){this.parentEl=Ext.get(_3);}if(!this.dhconfig){if(!this.template){if(!Ext.Button.buttonTemplate){Ext.Button.buttonTemplate=new Ext.Template("","","
          
        ");}this.template=Ext.Button.buttonTemplate;}_4=this.template.append(_3,[this.text||" "],true);var _5=_4.child("button:first");_5.on("focus",this.onFocus,this);_5.on("blur",this.onBlur,this);if(this.cls){_4.addClass(this.cls);}if(this.icon){_5.setStyle("background-image","url("+this.icon+")");}if(this.tooltip){if(typeof this.tooltip=="object"){Ext.QuickTips.tips(Ext.apply({target:_5.id},this.tooltip));}else{_5.dom[this.tooltipType]=this.tooltip;}}}else{_4=Ext.DomHelper.append(Ext.get(_3).dom,this.dhconfig,true);}this.el=_4;if(this.id){this.el.dom.id=this.el.id=this.id;}if(this.menu){this.el.child(this.menuClassTarget).addClass("x-btn-with-menu");this.menu.on("show",this.onMenuShow,this);this.menu.on("hide",this.onMenuHide,this);}_4.addClass("x-btn");if(Ext.isIE&&!Ext.isIE7){this.autoWidth.defer(1,this);}else{this.autoWidth();}if(this.handleMouseEvents){_4.on("mouseover",this.onMouseOver,this);_4.on("mouseout",this.onMouseOut,this);_4.on("mousedown",this.onMouseDown,this);}_4.on(this.clickEvent,this.onClick,this);if(this.hidden){this.hide();}if(this.disabled){this.disable();}Ext.ButtonToggleMgr.register(this);if(this.pressed){this.el.addClass("x-btn-pressed");}if(this.repeat){var _6=new Ext.util.ClickRepeater(_4,typeof this.repeat=="object"?this.repeat:{});_6.on("click",this.onClick,this);}},getEl:function(){return this.el;},destroy:function(){Ext.ButtonToggleMgr.unregister(this);this.el.removeAllListeners();this.purgeListeners();this.el.remove();},autoWidth:function(){if(this.el){this.el.setWidth("auto");if(Ext.isIE7&&Ext.isStrict){var ib=this.el.child("button");if(ib&&ib.getWidth()>20){ib.clip();ib.setWidth(Ext.util.TextMetrics.measure(ib,this.text).width+ib.getFrameWidth("lr"));}}if(this.minWidth){if(this.hidden){this.el.beginMeasure();}if(this.el.getWidth() ");var c=this.colors;for(var i=0,_7=c.length;i<_7;i++){t.add([c[i]]);}var el=document.createElement("div");el.className=this.itemCls;t.overwrite(el);_2.dom.insertBefore(el,_3);this.el=Ext.get(el);this.el.on("click",this.handleClick,this,{delegate:"a"});},afterRender:function(){Ext.ColorPalette.superclass.afterRender.call(this);if(this.value){var s=this.value;this.value=null;this.select(s);}},handleClick:function(e,t){e.preventDefault();if(!this.disabled){var c=t.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];this.select(c.toUpperCase());}},select:function(_d){_d=_d.replace("#","");if(_d!=this.value){var el=this.el;if(this.value){el.child("a.color-"+this.value).removeClass("x-color-palette-sel");}el.child("a.color-"+_d).addClass("x-color-palette-sel");this.value=_d;this.fireEvent("select",this,_d);}}}); + diff --git a/www/extras/yui-ext/package/data/data.js b/www/extras/yui-ext/package/data/data.js new file mode 100644 index 000000000..ac668dc1f --- /dev/null +++ b/www/extras/yui-ext/package/data/data.js @@ -0,0 +1,36 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.data.SortTypes={none:function(s){return s;},stripTagsRE:/<\/?[^>]+>/gi,asText:function(s){return String(s).replace(this.stripTagsRE,"");},asUCText:function(s){return String(s).toUpperCase().replace(this.stripTagsRE,"");},asUCString:function(s){return String(s).toUpperCase();},asDate:function(s){if(!s){return 0;}if(s instanceof Date){return s.getTime();}return Date.parse(String(s));},asFloat:function(s){var _7=parseFloat(String(s).replace(/,/g,""));if(isNaN(_7)){_7=0;}return _7;},asInt:function(s){var _9=parseInt(String(s).replace(/,/g,""));if(isNaN(_9)){_9=0;}return _9;}}; + +Ext.data.Record=function(_1,id){this.id=(id||id===0)?id:++Ext.data.Record.AUTO_ID;this.data=_1;};Ext.data.Record.create=function(o){var f=function(){f.superclass.constructor.apply(this,arguments);};Ext.extend(f,Ext.data.Record);var p=f.prototype;p.fields=new Ext.util.MixedCollection(false,function(_6){return _6.name;});for(var i=0,_8=o.length;i<_8;i++){p.fields.add(new Ext.data.Field(o[i]));}f.getField=function(_9){return p.fields.get(_9);};return f;};Ext.data.Record.AUTO_ID=1000;Ext.data.Record.EDIT="edit";Ext.data.Record.REJECT="reject";Ext.data.Record.COMMIT="commit";Ext.data.Record.prototype={dirty:false,editing:false,error:null,modified:null,join:function(_a){this.store=_a;},set:function(_b,_c){if(this.data[_b]==_c){return;}this.dirty=true;if(!this.modified){this.modified={};}if(typeof this.modified[_b]=="undefined"){this.modified[_b]=this.data[_b];}this.data[_b]=_c;if(!this.editing){this.store.afterEdit(this);}},get:function(_d){return this.data[_d];},beginEdit:function(){this.editing=true;this.modified={};},cancelEdit:function(){this.editing=false;delete this.modified;},endEdit:function(){this.editing=false;if(this.dirty&&this.store){this.store.afterEdit(this);}},reject:function(){var m=this.modified;for(var n in m){if(typeof m[n]!="function"){this.data[n]=m[n];}}this.dirty=false;delete this.modified;this.editing=false;if(this.store){this.store.afterReject(this);}},commit:function(){this.dirty=false;delete this.modified;this.editing=false;if(this.store){this.store.afterCommit(this);}},hasError:function(){return this.error!=null;},clearError:function(){this.error=null;}}; + +Ext.data.Store=function(_1){this.data=new Ext.util.MixedCollection(false);this.data.getKey=function(o){return o.id;};this.baseParams={};this.paramNames={"start":"start","limit":"limit","sort":"sort","dir":"dir"};Ext.apply(this,_1);if(this.reader&&!this.recordType){this.recordType=this.reader.recordType;}this.fields=this.recordType.prototype.fields;this.modified=[];this.addEvents({datachanged:true,add:true,remove:true,update:true,clear:true,beforeload:true,load:true,loadexception:true});if(this.proxy){this.relayEvents(this.proxy,["loadexception"]);}this.sortToggle={};Ext.data.Store.superclass.constructor.call(this);};Ext.extend(Ext.data.Store,Ext.util.Observable,{remoteSort:false,lastOptions:null,add:function(_3){_3=[].concat(_3);for(var i=0,_5=_3.length;i<_5;i++){_3[i].join(this);}var _6=this.data.length;this.data.addAll(_3);this.fireEvent("add",this,_3,_6);},remove:function(_7){var _8=this.data.indexOf(_7);this.data.removeAt(_8);this.fireEvent("remove",this,_7,_8);},removeAll:function(){this.data.clear();this.fireEvent("clear",this);},insert:function(_9,_a){_a=[].concat(_a);for(var i=0,_c=_a.length;i<_c;i++){this.data.insert(_9,_a[i]);_a[i].join(this);}this.fireEvent("add",this,_a,_9);},indexOf:function(_d){return this.data.indexOf(_d);},indexOfId:function(id){return this.data.indexOfKey(id);},getById:function(id){return this.data.key(id);},getAt:function(_10){return this.data.itemAt(_10);},getRange:function(_11,end){return this.data.getRange(_11,end);},storeOptions:function(o){o=Ext.apply({},o);delete o.callback;delete o.scope;this.lastOptions=o;},load:function(_14){_14=_14||{};if(this.fireEvent("beforeload",this,_14)!==false){this.storeOptions(_14);var p=Ext.apply(_14.params||{},this.baseParams);if(this.sortInfo&&this.remoteSort){var pn=this.paramNames;p[pn["sort"]]=this.sortInfo.field;p[pn["dir"]]=this.sortInfo.direction;}this.proxy.load(p,this.reader,this.loadRecords,this,_14);}},reload:function(_17){this.load(Ext.applyIf(_17||{},this.lastOptions));},loadRecords:function(o,_19,_1a){if(!o||_1a===false){if(_1a!==false){this.fireEvent("load",this,[],_19);}if(_19.callback){_19.callback.call(_19.scope||this,[],_19,false);}return;}var r=o.records,t=o.totalRecords||r.length;for(var i=0,len=r.length;iv2?1:(v1 0) {";var _12="";var _13=false;var ch="";for(var i=0;i<_d.length;++i){ch=_d.charAt(i);if(!_13&&ch=="\\"){_13=true;}else{if(_13){_13=false;_12+=String.escape(ch);}else{var obj=Date.formatCodeToRegex(ch,_10);_10+=obj.g;_12+=obj.s;if(obj.g&&obj.c){_11+=obj.c;}}}}_11+="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[_f]=new RegExp("^"+_12+"$");eval(_11);};Date.formatCodeToRegex=function(_17,_18){switch(_17){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["+_18+"], 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["+_18+"].substring(0, 3)], 10);\n",s:"("+Date.monthNames.join("|")+")"};case "M":return {g:1,c:"m = parseInt(Date.monthNumbers[results["+_18+"]], 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["+_18+"], 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["+_18+"], 10);\n",s:"(\\d{4})"};case "y":return {g:1,c:"var ty = parseInt(results["+_18+"], 10);\n"+"y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"};case "a":return {g:1,c:"if (results["+_18+"] == '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["+_18+"] == '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["+_18+"], 10);\n",s:"(\\d{1,2})"};case "i":return {g:1,c:"i = parseInt(results["+_18+"], 10);\n",s:"(\\d{2})"};case "s":return {g:1,c:"s = parseInt(results["+_18+"], 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(_17)};}};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;i28){day=Math.min(day,this.getFirstDateOfMonth().add("mo",_27).getLastDateOfMonth().getDate());}d.setDate(day);d.setMonth(this.getMonth()+_27);break;case Date.YEAR:d.setFullYear(this.getFullYear()+_27);break;}return d;}; + diff --git a/www/extras/yui-ext/package/datepicker/datepicker.js b/www/extras/yui-ext/package/datepicker/datepicker.js new file mode 100644 index 000000000..ca09d0dd6 --- /dev/null +++ b/www/extras/yui-ext/package/datepicker/datepicker.js @@ -0,0 +1,10 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.DatePicker=function(_1){Ext.DatePicker.superclass.constructor.call(this,_1);this.value=_1&&_1.value?_1.value.clearTime():new Date().clearTime();this.addEvents({select:true});if(this.handler){this.on("select",this.handler,this.scope||this);}if(!this.disabledDatesRE&&this.disabledDates){var dd=this.disabledDates;var re="(?:";for(var i=0;i","  ",""];var dn=this.dayNames;for(var i=0;i<7;i++){var d=this.startDay+i;if(d>6){d=d-7;}m.push("");}m[m.length]="";for(var i=0;i<42;i++){if(i%7==0&&i!=0){m[m.length]="";}m[m.length]="";}m[m.length]="
        ",dn[d].substr(0,1),"
        ";var el=document.createElement("div");el.className="x-date-picker";el.innerHTML=m.join("");_7.dom.insertBefore(el,_8);this.el=Ext.get(el);new Ext.util.ClickRepeater(this.el.child("td.x-date-left a"),{handler:this.showPrevMonth,scope:this});new Ext.util.ClickRepeater(this.el.child("td.x-date-right a"),{handler:this.showNextMonth,scope:this});this.el.on("mousewheel",this.handleMouseWheel,this);var kn=new Ext.KeyNav(this.el,{"left":function(e){e.ctrlKey?this.showPrevMonth():this.update(this.activeDate.add("d",-1));},"right":function(e){e.ctrlKey?this.showNextMonth():this.update(this.activeDate.add("d",1));},"up":function(e){e.ctrlKey?this.showNextYear():this.update(this.activeDate.add("d",-7));},"down":function(e){e.ctrlKey?this.showPrevYear():this.update(this.activeDate.add("d",7));},"pageUp":function(e){this.showNextMonth();},"pageDown":function(e){this.showPrevMonth();},"enter":function(e){e.stopPropagation();return true;},scope:this});this.el.on("click",this.handleDateClick,this,{delegate:"a.x-date-date"});this.el.addKeyListener(Ext.EventObject.SPACE,this.selectToday,this);this.el.unselectable();this.cells=this.el.select("table.x-date-inner tbody td");this.textNodes=this.el.query("table.x-date-inner tbody span");var _16=new Ext.menu.Menu({plain:true,cls:"x-date-mmenu",allowOtherMenus:true});var _17=Ext.id()+"months";for(var i=0;i<12;i++){_16.add(new Ext.menu.CheckItem({id:"mm-"+i,text:this.monthNames[i],group:_17,month:i}));}_16.on({"beforeshow":function(){_16.items.get("mm-"+(this.activeDate||this.value).getMonth()).setChecked(true);},"itemclick":function(_18){var d=(this.activeDate||this.value).clone();d.setMonth(_18.month);this.update(d);},"show":function(m){this.visibleRegion=m.el.getRegion().adjust(2,2,-2,-2);},"mouseout":function(m,e){if(!this.visibleRegion.contains(e.getPoint())){m.hide();}},scope:this});this.mbtn=new Ext.Button(this.el.child("td.x-date-middle",true),{menu:_16,text:" ",menuAlign:"c-c?",tooltip:this.monthYearText});var _1d=(new Date()).dateFormat(this.format);var _1e=new Ext.Button(this.el.child("td.x-date-bottom",true),{text:String.format(this.todayText,_1d),tooltip:String.format(this.todayTip,_1d),handler:this.selectToday,scope:this});if(Ext.isIE){this.el.repaint();}this.update(this.value);},showPrevMonth:function(e){this.update(this.activeDate.add("mo",-1));},showNextMonth:function(e){this.update(this.activeDate.add("mo",1));},showPrevYear:function(){this.update(this.activeDate.add("y",-1));},showNextYear:function(){this.update(this.activeDate.add("y",1));},handleMouseWheel:function(e){var _22=e.getWheelDelta();if(_22>0){this.showPrevMonth();e.stopEvent();}else{if(_22<0){this.showNextMonth();e.stopEvent();}}},handleDateClick:function(e,t){e.stopEvent();if(t.dateValue&&!Ext.fly(t.parentNode).hasClass("x-date-disabled")){this.setValue(new Date(t.dateValue));this.fireEvent("select",this,this.value);}},selectToday:function(){this.setValue(new Date().clearTime());this.fireEvent("select",this,this.value);},update:function(_25){var vd=this.activeDate;this.activeDate=_25;if(vd&&this.el){var t=_25.getTime();if(vd.getMonth()==_25.getMonth()&&vd.getFullYear()==_25.getFullYear()){this.cells.removeClass("x-date-selected");this.cells.each(function(c){if(c.dom.firstChild.dateValue==t){c.addClass("x-date-selected");setTimeout(function(){try{c.dom.firstChild.focus();}catch(e){}},50);return false;}});return;}}var _29=_25.getDaysInMonth();var _2a=_25.getFirstDateOfMonth();var _2b=_2a.getDay()-this.startDay;if(_2b<=this.startDay){_2b+=7;}var pm=_25.add("mo",-1);var _2d=pm.getDaysInMonth()-_2b;var _2e=this.cells.elements;var _2f=this.textNodes;_29+=_2b;var day=86400000;var d=(new Date(pm.getFullYear(),pm.getMonth(),_2d)).clearTime();var _32=new Date().clearTime().getTime();var sel=_25.clearTime().getTime();var min=this.minDate?this.minDate.clearTime():Number.NEGATIVE_INFINITY;var max=this.maxDate?this.maxDate.clearTime():Number.POSITIVE_INFINITY;var _36=this.disabledDatesRE;var _37=this.disabledDatesText;var _38=this.disabledDays?this.disabledDays.join(""):false;var _39=this.disabledDaysText;var _3a=this.format;var _3b=function(cal,_3d){_3d.title="";var t=d.getTime();_3d.firstChild.dateValue=t;if(t==_32){_3d.className+=" x-date-today";_3d.title=cal.todayText;}if(t==sel){_3d.className+=" x-date-selected";setTimeout(function(){try{_3d.firstChild.focus();}catch(e){}},50);}if(tmax){_3d.className=" x-date-disabled";_3d.title=cal.maxText;return;}if(_38){if(_38.indexOf(d.getDay())!=-1){_3d.title=_39;_3d.className=" x-date-disabled";}}if(_36&&_3a){var _3f=d.dateFormat(_3a);if(_36.test(_3f)){_3d.title=_37.replace("%0",_3f);_3d.className=" x-date-disabled";}}};var i=0;for(;i<_2b;i++){_2f[i].innerHTML=(++_2d);d.setDate(d.getDate()+1);_2e[i].className="x-date-prevday";_3b(this,_2e[i]);}for(;i<_29;i++){intDay=i-_2b+1;_2f[i].innerHTML=(intDay);d.setDate(d.getDate()+1);_2e[i].className="x-date-active";_3b(this,_2e[i]);}var _41=0;for(;i<42;i++){_2f[i].innerHTML=(++_41);d.setDate(d.getDate()+1);_2e[i].className="x-date-nextday";_3b(this,_2e[i]);}this.mbtn.setText(this.monthNames[_25.getMonth()]+" "+_25.getFullYear());if(!this.internalRender){var _42=this.el.dom.firstChild;var w=_42.offsetWidth;this.el.setWidth(w+this.el.getBorderWidth("lr"));Ext.fly(_42).setWidth(w);this.internalRender=true;if(Ext.isOpera&&!this.secondPass){_42.rows[0].cells[1].style.width=(w-(_42.rows[0].cells[0].offsetWidth+_42.rows[0].cells[2].offsetWidth))+"px";this.secondPass=true;this.update.defer(10,this,[_25]);}}}}); + diff --git a/www/extras/yui-ext/package/dialog/dialogs-debug.js b/www/extras/yui-ext/package/dialog/dialogs-debug.js new file mode 100644 index 000000000..a2e1181a7 --- /dev/null +++ b/www/extras/yui-ext/package/dialog/dialogs-debug.js @@ -0,0 +1,1241 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + + +Ext.BasicDialog = function(el, config){ + this.el = Ext.get(el); + var dh = Ext.DomHelper; + if(!this.el && config && config.autoCreate){ + if(typeof config.autoCreate == "object"){ + if(!config.autoCreate.id){ + config.autoCreate.id = el; + } + this.el = dh.append(document.body, + config.autoCreate, true); + }else{ + this.el = dh.append(document.body, + {tag: "div", id: el, style:'visibility:hidden;'}, true); + } + } + el = this.el; + el.setDisplayed(true); + el.hide = this.hideAction; + this.id = el.id; + el.addClass("x-dlg"); + + Ext.apply(this, config); + + this.proxy = el.createProxy("x-dlg-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); + } + + this.header = el.child("/.x-dlg-hd"); + + this.body = el.child("/.x-dlg-bd"); + + this.footer = el.child("/.x-dlg-ft"); + + if(!this.header){ + this.header = el.createChild({tag: "div", cls:"x-dlg-hd", html: " "}, this.body ? this.body.dom : null); + } + if(!this.body){ + this.body = el.createChild({tag: "div", cls:"x-dlg-bd"}); + } + + this.header.unselectable(); + if(this.title){ + this.header.update(this.title); + } + + this.focusEl = el.createChild({tag: "a", href:"#", cls:"x-dlg-focus", tabIndex:"-1"}); + this.focusEl.swallowEvent("click", true); + + this.header.wrap({cls:"x-dlg-hd-right"}).wrap({cls:"x-dlg-hd-left"}, true); + + + this.bwrap = this.body.wrap({tag: "div", cls:"x-dlg-dlg-body"}); + if(this.footer){ + this.bwrap.dom.appendChild(this.footer.dom); + } + + this.bg = this.el.createChild({ + tag: "div", cls:"x-dlg-bg", + html: '
         
        ' + }); + this.centerBg = this.bg.child("div.x-dlg-bg-center"); + + + if(this.autoScroll !== false && !this.autoTabs){ + this.body.setStyle("overflow", "auto"); + } + + this.toolbox = this.el.createChild({cls: "x-dlg-toolbox"}); + + if(this.closable !== false){ + this.el.addClass("x-dlg-closable"); + this.close = this.toolbox.createChild({cls:"x-dlg-close"}); + this.close.on("click", this.closeClick, this); + this.close.addClassOnOver("x-dlg-close-over"); + } + if(this.collapsible !== false){ + this.collapseBtn = this.toolbox.createChild({cls:"x-dlg-collapse"}); + this.collapseBtn.on("click", this.collapseClick, this); + this.collapseBtn.addClassOnOver("x-dlg-collapse-over"); + this.header.on("dblclick", this.collapseClick, this); + } + if(this.resizable !== false){ + this.el.addClass("x-dlg-resizable"); + this.resizer = new Ext.Resizable(el, { + minWidth: this.minWidth || 80, + minHeight:this.minHeight || 80, + handles: this.resizeHandles || "all", + pinned: true + }); + this.resizer.on("beforeresize", this.beforeResize, this); + this.resizer.on("resize", this.onResize, this); + } + if(this.draggable !== false){ + el.addClass("x-dlg-draggable"); + if (!this.proxyDrag) { + var dd = new Ext.dd.DD(el.dom.id, "WindowDrag"); + } + else { + var dd = new Ext.dd.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); + dd.scroll = false; + this.dd = dd; + } + if(this.modal){ + this.mask = dh.append(document.body, {tag: "div", cls:"x-dlg-mask"}, true); + this.mask.enableDisplayMode("block"); + this.mask.hide(); + this.el.addClass("x-dlg-modal"); + } + if(this.shadow){ + this.shadow = new Ext.Shadow({ + mode : typeof this.shadow == "string" ? this.shadow : "sides", + offset : this.shadowOffset + }); + }else{ + this.shadowOffset = 0; + } + if(Ext.useShims && this.shim !== false){ + this.shim = this.el.createShim(); + this.shim.hide = this.hideAction; + this.shim.hide(); + }else{ + this.shim = false; + } + if(this.autoTabs){ + this.initTabs(); + } + this.addEvents({ + + "keydown" : true, + + "move" : true, + + "resize" : true, + + "beforehide" : true, + + "hide" : true, + + "beforeshow" : true, + + "show" : true + }); + el.on("keydown", this.onKeyDown, this); + el.on("mousedown", this.toFront, this); + Ext.EventManager.onWindowResize(this.adjustViewport, this, true); + this.el.hide(); + Ext.DialogManager.register(this); + Ext.BasicDialog.superclass.constructor.call(this); +}; + +Ext.extend(Ext.BasicDialog, Ext.util.Observable, { + shadowOffset: 5, + minHeight: 80, + minWidth: 200, + minButtonWidth: 75, + defaultButton: null, + buttonAlign: "right", + tabTag: 'div', + firstShow: true, + + + setTitle : function(text){ + this.header.update(text); + return this; + }, + + + closeClick : function(){ + this.hide(); + }, + + + collapseClick : function(){ + this[this.collapsed ? "expand" : "collapse"](); + }, + + + collapse : function(){ + if(!this.collapsed){ + this.collapsed = true; + this.el.addClass("x-dlg-collapsed"); + this.restoreHeight = this.el.getHeight(); + this.resizeTo(this.el.getWidth(), this.header.getHeight()); + } + }, + + + expand : function(){ + if(this.collapsed){ + this.collapsed = false; + this.el.removeClass("x-dlg-collapsed"); + this.resizeTo(this.el.getWidth(), this.restoreHeight); + } + }, + + + initTabs : function(){ + var tabs = this.getTabs(); + while(tabs.getTab(0)){ + tabs.removeTab(0); + } + this.el.select(this.tabTag+'.x-dlg-tab').each(function(el){ + var dom = el.dom; + tabs.addTab(Ext.id(dom), dom.title); + dom.title = ""; + }); + tabs.activate(0); + return tabs; + }, + + + beforeResize : function(){ + this.resizer.minHeight = Math.max(this.minHeight, this.getHeaderFooterHeight(true)+40); + }, + + + onResize : function(){ + this.refreshSize(); + this.syncBodyHeight(); + this.adjustAssets(); + this.focus(); + this.fireEvent("resize", this, this.size.width, this.size.height); + }, + + + onKeyDown : function(e){ + if(this.isVisible()){ + 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(); + } + this.fireEvent("resize", this, width, height); + return this; + }, + + + + setContentSize : function(w, h){ + h += this.getHeaderFooterHeight() + this.body.getMargins("tb"); + w += this.body.getMargins("lr") + this.bwrap.getMargins("lr") + this.centerBg.getPadding("lr"); + + h += this.body.getPadding("tb") + this.bwrap.getBorderWidth("tb") + this.body.getBorderWidth("tb") + this.el.getBorderWidth("tb"); + w += this.body.getPadding("lr") + this.bwrap.getBorderWidth("lr") + this.body.getBorderWidth("lr") + this.bwrap.getPadding("lr") + this.el.getBorderWidth("lr"); + + if(this.tabs){ + h += this.tabs.stripWrap.getHeight() + this.tabs.bodyEl.getMargins("tb") + this.tabs.bodyEl.getPadding("tb"); + w += this.tabs.bodyEl.getMargins("lr") + this.tabs.bodyEl.getPadding("lr"); + } + this.resizeTo(w, h); + return this; + }, + + + addKeyListener : function(key, fn, scope){ + var keyCode, shift, ctrl, alt; + if(typeof key == "object" && !(key instanceof Array)){ + 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.el.addClass("x-dlg-auto-tabs"); + this.body.addClass(this.tabPosition == "bottom" ? "x-tabs-bottom" : "x-tabs-top"); + this.tabs = new Ext.TabPanel(this.body.dom, this.tabPosition == "bottom"); + } + return this.tabs; + }, + + + addButton : function(config, handler, scope){ + var dh = Ext.DomHelper; + if(!this.footer){ + this.footer = dh.append(this.bwrap, {tag: "div", cls:"x-dlg-ft"}, true); + } + if(!this.btnContainer){ + var tb = this.footer.createChild({ + tag:"div", + cls:"x-dlg-btns x-dlg-btns-"+this.buttonAlign, + html:'
        ' + }, null, true); + this.btnContainer = tb.firstChild.firstChild.firstChild; + } + var bconfig = { + handler: handler, + scope: scope, + minWidth: this.minButtonWidth, + hideParent:true + }; + if(typeof config == "string"){ + bconfig.text = config; + }else{ + if(config.tag){ + bconfig.dhconfig = config; + }else{ + Ext.apply(bconfig, config); + } + } + var btn = new Ext.Button( + this.btnContainer.appendChild(document.createElement("td")), + bconfig + ); + this.syncBodyHeight(); + if(!this.buttons){ + + this.buttons = []; + } + this.buttons.push(btn); + return btn; + }, + + + 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"); + height += this.centerBg.getPadding("tb"); + return height; + }, + + + syncBodyHeight : function(){ + var bd = this.body, cb = this.centerBg, bw = this.bwrap; + var height = this.size.height - this.getHeaderFooterHeight(false); + bd.setHeight(height-bd.getMargins("tb")); + var hh = this.header.getHeight(); + var h = this.size.height-hh; + cb.setHeight(h); + bw.setLeftTop(cb.getPadding("l"), hh+cb.getPadding("t")); + bw.setHeight(h-cb.getPadding("tb")); + bw.setWidth(this.el.getWidth(true)-cb.getPadding("lr")); + bd.setWidth(bw.getWidth(true)); + if(this.tabs){ + this.tabs.syncHeight(); + if(Ext.isIE){ + this.tabs.el.repaint(); + } + } + }, + + + restoreState : function(){ + var box = Ext.state.Manager.get(this.stateId || (this.el.id + "-state")); + if(box && box.width){ + this.xy = [box.x, box.y]; + this.resizeTo(box.width, box.height); + } + return this; + }, + + + beforeShow : function(){ + this.expand(); + if(this.fixedcenter){ + this.xy = this.el.getCenterXY(true); + } + if(this.modal){ + Ext.get(document.body).addClass("x-body-masked"); + this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); + this.mask.show(); + } + this.constrainXY(); + }, + + + animShow : function(){ + var b = Ext.get(this.animateTarget, true).getBox(); + this.proxy.setSize(b.width, b.height); + this.proxy.setLocation(b.x, b.y); + this.proxy.show(); + this.proxy.setBounds(this.xy[0], this.xy[1], this.size.width, this.size.height, + true, .35, this.showEl.createDelegate(this)); + }, + + + show : function(animateTarget){ + if (this.fireEvent("beforeshow", this) === false){ + return; + } + if(this.syncHeightBeforeShow){ + this.syncBodyHeight(); + }else if(this.firstShow){ + this.firstShow = false; + this.syncBodyHeight(); + } + this.animateTarget = animateTarget || this.animateTarget; + if(!this.el.isVisible()){ + this.beforeShow(); + if(this.animateTarget){ + this.animShow(); + }else{ + this.showEl(); + } + } + return this; + }, + + + showEl : function(){ + this.proxy.hide(); + this.el.setXY(this.xy); + this.el.show(); + this.adjustAssets(true); + this.toFront(); + this.focus(); + + if(Ext.isIE){ + this.el.repaint(); + } + this.fireEvent("show", this); + }, + + + focus : function(){ + if(this.defaultButton){ + this.defaultButton.focus(); + }else{ + this.focusEl.focus(); + } + }, + + + constrainXY : function(){ + if(this.constraintoviewport !== false){ + if(!this.viewSize){ + if(this.container){ + var s = this.container.getSize(); + this.viewSize = [s.width, s.height]; + }else{ + this.viewSize = [Ext.lib.Dom.getViewWidth(),Ext.lib.Dom.getViewHeight()]; + } + } + var s = Ext.get(this.container||document).getScroll(); + + 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+s.left){ + x = vw - w; + moved = true; + } + if(y + h > vh+s.top){ + y = vh - h; + moved = true; + } + + if(x < s.left){ + x = s.left; + moved = true; + } + if(y < s.top){ + y = s.top; + 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(this.el); + } + if(this.shim){ + this.shim.show(); + } + } + if(this.shadow && this.shadow.isVisible()){ + this.shadow.show(this.el); + } + if(this.shim && this.shim.isVisible()){ + this.shim.setBounds(x, y, w, h); + } + }, + + + adjustViewport : function(w, h){ + if(!w || !h){ + w = Ext.lib.Dom.getViewWidth(); + h = Ext.lib.Dom.getViewHeight(); + } + + this.viewSize = [w, h]; + if(this.modal && this.mask.isVisible()){ + this.mask.setSize(w, h); + this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); + } + if(this.isVisible()){ + this.constrainXY(); + } + }, + + + destroy : function(removeEl){ + if(this.isVisible()){ + this.animateTarget = null; + this.hide(); + } + Ext.EventManager.removeResizeListener(this.adjustViewport, this); + if(this.tabs){ + this.tabs.destroy(removeEl); + } + Ext.destroy( + this.shim, + this.proxy, + this.resizer, + this.close, + this.mask + ); + if(this.dd){ + this.dd.unreg(); + } + if(this.buttons){ + for(var i = 0, len = this.buttons.length; i < len; i++){ + this.buttons[i].destroy(); + } + } + this.el.removeAllListeners(); + if(removeEl === true){ + this.el.update(""); + this.el.remove(); + } + 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){ + Ext.dd.DD.prototype.endDrag.apply(this.dd, arguments); + }else{ + Ext.dd.DDProxy.prototype.endDrag.apply(this.dd, arguments); + this.proxy.hide(); + } + this.refreshSize(); + this.adjustAssets(); + this.focus(); + this.fireEvent("move", this, this.xy[0], this.xy[1]); + }, + + + toFront : function(){ + Ext.DialogManager.bringToFront(this); + return this; + }, + + + toBack : function(){ + Ext.DialogManager.sendToBack(this); + return this; + }, + + + center : function(){ + var xy = this.el.getCenterXY(true); + this.moveTo(xy[0], xy[1]); + return this; + }, + + + moveTo : function(x, y){ + this.xy = [x,y]; + if(this.isVisible()){ + this.el.setXY(this.xy); + this.adjustAssets(); + } + return this; + }, + + + alignTo : function(element, position, offsets){ + this.xy = this.el.getAlignToXY(element, position, offsets); + if(this.isVisible()){ + this.el.setXY(this.xy); + this.adjustAssets(); + } + return this; + }, + + + anchorTo : function(el, alignment, offsets, monitorScroll){ + var action = function(){ + this.alignTo(el, alignment, offsets); + }; + Ext.EventManager.onWindowResize(action, this); + var tm = typeof monitorScroll; + if(tm != 'undefined'){ + Ext.EventManager.on(window, 'scroll', action, this, + {buffer: tm == 'number' ? monitorScroll : 50}); + } + action.call(this); + return this; + }, + + + isVisible : function(){ + return this.el.isVisible(); + }, + + + animHide : function(callback){ + var b = Ext.get(this.animateTarget).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])); + }, + + + hide : function(callback){ + if (this.fireEvent("beforehide", this) === false){ + return; + } + if(this.shadow){ + this.shadow.hide(); + } + if(this.shim) { + this.shim.hide(); + } + if(this.animateTarget){ + this.animHide(callback); + }else{ + this.el.hide(); + this.hideEl(callback); + } + return this; + }, + + + hideEl : function(callback){ + this.proxy.hide(); + if(this.modal){ + this.mask.hide(); + Ext.get(document.body).removeClass("x-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(); + Ext.state.Manager.set(this.stateId || this.el.id + "-state", this.el.getBox()); + }, + + + + setZIndex : function(index){ + if(this.modal){ + this.mask.setStyle("z-index", index); + } + if(this.shim){ + this.shim.setStyle("z-index", ++index); + } + if(this.shadow){ + this.shadow.setZIndex(++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; + } +}); + + +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 = Ext.DialogManager.zseed; + for(var i = 0, len = accessList.length; i < len; i++){ + var dlg = accessList[i]; + if(dlg){ + dlg.setZIndex(seed + (i*10)); + } + } + }; + + return { + + zseed : 9000, + + + 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++){ + if(accessList[i] == dlg){ + 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; + }, + + + hideAll : function(){ + for(var id in list){ + if(list[id] && typeof list[id] != "function" && list[id].isVisible()){ + list[id].hide(); + } + } + } + }; +}(); + + +Ext.LayoutDialog = function(el, config){ + config.autoTabs = false; + Ext.LayoutDialog.superclass.constructor.call(this, el, config); + this.body.setStyle({overflow:"hidden", position:"relative"}); + this.layout = new Ext.BorderLayout(this.body.dom, config); + this.layout.monitorWindowResize = false; + this.el.addClass("x-dlg-auto-layout"); + + this.center = Ext.BasicDialog.prototype.center; + this.on("show", this.layout.layout, this.layout, true); +}; +Ext.extend(Ext.LayoutDialog, Ext.BasicDialog, { + + endUpdate : function(){ + this.layout.endUpdate(); + }, + + + beginUpdate : function(){ + this.layout.beginUpdate(); + }, + + + getLayout : function(){ + return this.layout; + }, + + showEl : function(){ + Ext.LayoutDialog.superclass.showEl.apply(this, arguments); + if(Ext.isIE7){ + this.layout.layout(); + } + }, + + + + syncBodyHeight : function(){ + Ext.LayoutDialog.superclass.syncBodyHeight.call(this); + if(this.layout){this.layout.layout();} + } +}); + +Ext.MessageBox = function(){ + var dlg, opt, mask, waitTimer; + var bodyEl, msgEl, textboxEl, textareaEl, progressEl, pp; + var buttons, activeTextEl, bwidth; + + + var handleButton = function(button){ + dlg.hide(); + Ext.callback(opt.fn, opt.scope||window, [button, activeTextEl.dom.value], 1); + }; + + + var handleHide = function(){ + if(opt && opt.cls){ + dlg.el.removeClass(opt.cls); + } + if(waitTimer){ + Ext.TaskMgr.stop(waitTimer); + waitTimer = null; + } + }; + + + var updateButtons = function(b){ + var width = 0; + if(!b){ + buttons["ok"].hide(); + buttons["cancel"].hide(); + buttons["yes"].hide(); + buttons["no"].hide(); + dlg.footer.dom.style.display = 'none'; + return width; + } + dlg.footer.dom.style.display = ''; + for(var k in buttons){ + if(typeof buttons[k] != "function"){ + if(b[k]){ + buttons[k].show(); + buttons[k].setText(typeof b[k] == "string" ? b[k] : Ext.MessageBox.buttonText[k]); + width += buttons[k].el.getWidth()+15; + }else{ + buttons[k].hide(); + } + } + } + return width; + }; + + + var handleEsc = function(d, k, e){ + if(opt && opt.closable !== false){ + dlg.hide(); + } + if(e){ + e.stopEvent(); + } + }; + + return { + + getDialog : function(){ + if(!dlg){ + dlg = new Ext.BasicDialog("x-msg-box", { + autoCreate : true, + shadow: true, + draggable: true, + resizable:false, + constraintoviewport:false, + fixedcenter:true, + collapsible : false, + shim:true, + modal: true, + width:400, height:100, + buttonAlign:"center", + closeClick : function(){ + if(opt && opt.buttons && opt.buttons.no && !opt.buttons.cancel){ + handleButton("no"); + }else{ + handleButton("cancel"); + } + } + }); + dlg.on("hide", handleHide); + mask = dlg.mask; + dlg.addKeyListener(27, handleEsc); + buttons = {}; + var bt = this.buttonText; + buttons["ok"] = dlg.addButton(bt["ok"], handleButton.createCallback("ok")); + buttons["yes"] = dlg.addButton(bt["yes"], handleButton.createCallback("yes")); + buttons["no"] = dlg.addButton(bt["no"], handleButton.createCallback("no")); + buttons["cancel"] = dlg.addButton(bt["cancel"], handleButton.createCallback("cancel")); + bodyEl = dlg.body.createChild({ + tag:"div", + html:'
         
        ' + }); + msgEl = bodyEl.dom.firstChild; + textboxEl = Ext.get(bodyEl.dom.childNodes[2]); + textboxEl.enableDisplayMode(); + textboxEl.addKeyListener([10,13], function(){ + if(dlg.isVisible() && opt && opt.buttons){ + if(opt.buttons.ok){ + handleButton("ok"); + }else if(opt.buttons.yes){ + handleButton("yes"); + } + } + }); + textareaEl = Ext.get(bodyEl.dom.childNodes[3]); + textareaEl.enableDisplayMode(); + progressEl = Ext.get(bodyEl.dom.childNodes[4]); + progressEl.enableDisplayMode(); + var pf = progressEl.dom.firstChild; + pp = Ext.get(pf.firstChild); + pp.setHeight(pf.offsetHeight); + } + return dlg; + }, + + + updateText : function(text){ + if(!dlg.isVisible() && !opt.width){ + dlg.resizeTo(this.maxWidth, 100); + } + msgEl.innerHTML = text || ' '; + var w = Math.max(Math.min(opt.width || msgEl.offsetWidth, this.maxWidth), + Math.max(opt.minWidth || this.minWidth, bwidth)); + if(opt.prompt){ + activeTextEl.setWidth(w); + } + if(dlg.isVisible()){ + dlg.fixedcenter = false; + } + dlg.setContentSize(w, bodyEl.getHeight()); + if(dlg.isVisible()){ + dlg.fixedcenter = true; + } + return this; + }, + + + updateProgress : function(value, text){ + if(text){ + this.updateText(text); + } + pp.setWidth(Math.floor(value*progressEl.dom.firstChild.offsetWidth)); + return this; + }, + + + isVisible : function(){ + return dlg && dlg.isVisible(); + }, + + + hide : function(){ + if(this.isVisible()){ + dlg.hide(); + } + }, + + + show : function(options){ + if(this.isVisible()){ + this.hide(); + } + var d = this.getDialog(); + opt = options; + d.setTitle(opt.title || " "); + d.close.setDisplayed(opt.closable !== false); + activeTextEl = textboxEl; + opt.prompt = opt.prompt || (opt.multiline ? true : false); + if(opt.prompt){ + if(opt.multiline){ + textboxEl.hide(); + textareaEl.show(); + textareaEl.setHeight(typeof opt.multiline == "number" ? + opt.multiline : this.defaultTextHeight); + activeTextEl = textareaEl; + }else{ + textboxEl.show(); + textareaEl.hide(); + } + }else{ + textboxEl.hide(); + textareaEl.hide(); + } + progressEl.setDisplayed(opt.progress === true); + this.updateProgress(0); + activeTextEl.dom.value = opt.value || ""; + if(opt.prompt){ + dlg.setDefaultButton(activeTextEl); + }else{ + var bs = opt.buttons; + var db = null; + if(bs && bs.ok){ + db = buttons["ok"]; + }else if(bs && bs.yes){ + db = buttons["yes"]; + } + dlg.setDefaultButton(db); + } + bwidth = updateButtons(opt.buttons); + this.updateText(opt.msg); + if(opt.cls){ + d.el.addClass(opt.cls); + } + d.proxyDrag = opt.proxyDrag === true; + d.modal = opt.modal !== false; + d.mask = opt.modal !== false ? mask : false; + if(!d.isVisible()){ + + document.body.appendChild(dlg.el.dom); + d.animateTarget = null; + d.show(options.animEl); + } + return this; + }, + + + progress : function(title, msg){ + this.show({ + title : title, + msg : msg, + buttons: false, + progress:true, + closable:false, + minWidth: this.minProgressWidth + }); + return this; + }, + + + alert : function(title, msg, fn, scope){ + this.show({ + title : title, + msg : msg, + buttons: this.OK, + fn: fn, + scope : scope + }); + return this; + }, + + + wait : function(msg, title){ + this.show({ + title : title, + msg : msg, + buttons: false, + closable:false, + progress:true, + modal:true, + width:300, + wait:true + }); + waitTimer = Ext.TaskMgr.start({ + run: function(i){ + Ext.MessageBox.updateProgress(((((i+20)%20)+1)*5)*.01); + }, + interval: 1000 + }); + return this; + }, + + + confirm : function(title, msg, fn, scope){ + this.show({ + title : title, + msg : msg, + buttons: this.YESNO, + fn: fn, + scope : scope + }); + return this; + }, + + + prompt : function(title, msg, fn, scope, multiline){ + this.show({ + title : title, + msg : msg, + buttons: this.OKCANCEL, + fn: fn, + minWidth:250, + scope : scope, + prompt:true, + multiline: multiline + }); + return this; + }, + + + OK : {ok:true}, + + YESNO : {yes:true, no:true}, + + OKCANCEL : {ok:true, cancel:true}, + + YESNOCANCEL : {yes:true, no:true, cancel:true}, + + + defaultTextHeight : 75, + + maxWidth : 600, + + minWidth : 100, + + minProgressWidth : 250, + + buttonText : { + ok : "OK", + cancel : "Cancel", + yes : "Yes", + no : "No" + } + }; +}(); + + +Ext.Msg = Ext.MessageBox; diff --git a/www/extras/yui-ext/package/dialog/dialogs.js b/www/extras/yui-ext/package/dialog/dialogs.js new file mode 100644 index 000000000..d75e016f9 --- /dev/null +++ b/www/extras/yui-ext/package/dialog/dialogs.js @@ -0,0 +1,12 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.BasicDialog=function(el,_2){this.el=Ext.get(el);var dh=Ext.DomHelper;if(!this.el&&_2&&_2.autoCreate){if(typeof _2.autoCreate=="object"){if(!_2.autoCreate.id){_2.autoCreate.id=el;}this.el=dh.append(document.body,_2.autoCreate,true);}else{this.el=dh.append(document.body,{tag:"div",id:el,style:"visibility:hidden;"},true);}}el=this.el;el.setDisplayed(true);el.hide=this.hideAction;this.id=el.id;el.addClass("x-dlg");Ext.apply(this,_2);this.proxy=el.createProxy("x-dlg-proxy");this.proxy.hide=this.hideAction;this.proxy.setOpacity(0.5);this.proxy.hide();if(_2.width){el.setWidth(_2.width);}if(_2.height){el.setHeight(_2.height);}this.size=el.getSize();if(typeof _2.x!="undefined"&&typeof _2.y!="undefined"){this.xy=[_2.x,_2.y];}else{this.xy=el.getCenterXY(true);}this.header=el.child("/.x-dlg-hd");this.body=el.child("/.x-dlg-bd");this.footer=el.child("/.x-dlg-ft");if(!this.header){this.header=el.createChild({tag:"div",cls:"x-dlg-hd",html:" "},this.body?this.body.dom:null);}if(!this.body){this.body=el.createChild({tag:"div",cls:"x-dlg-bd"});}this.header.unselectable();if(this.title){this.header.update(this.title);}this.focusEl=el.createChild({tag:"a",href:"#",cls:"x-dlg-focus",tabIndex:"-1"});this.focusEl.swallowEvent("click",true);this.header.wrap({cls:"x-dlg-hd-right"}).wrap({cls:"x-dlg-hd-left"},true);this.bwrap=this.body.wrap({tag:"div",cls:"x-dlg-dlg-body"});if(this.footer){this.bwrap.dom.appendChild(this.footer.dom);}this.bg=this.el.createChild({tag:"div",cls:"x-dlg-bg",html:"
         
        "});this.centerBg=this.bg.child("div.x-dlg-bg-center");if(this.autoScroll!==false&&!this.autoTabs){this.body.setStyle("overflow","auto");}this.toolbox=this.el.createChild({cls:"x-dlg-toolbox"});if(this.closable!==false){this.el.addClass("x-dlg-closable");this.close=this.toolbox.createChild({cls:"x-dlg-close"});this.close.on("click",this.closeClick,this);this.close.addClassOnOver("x-dlg-close-over");}if(this.collapsible!==false){this.collapseBtn=this.toolbox.createChild({cls:"x-dlg-collapse"});this.collapseBtn.on("click",this.collapseClick,this);this.collapseBtn.addClassOnOver("x-dlg-collapse-over");this.header.on("dblclick",this.collapseClick,this);}if(this.resizable!==false){this.el.addClass("x-dlg-resizable");this.resizer=new Ext.Resizable(el,{minWidth:this.minWidth||80,minHeight:this.minHeight||80,handles:this.resizeHandles||"all",pinned:true});this.resizer.on("beforeresize",this.beforeResize,this);this.resizer.on("resize",this.onResize,this);}if(this.draggable!==false){el.addClass("x-dlg-draggable");if(!this.proxyDrag){var dd=new Ext.dd.DD(el.dom.id,"WindowDrag");}else{var dd=new Ext.dd.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);dd.scroll=false;this.dd=dd;}if(this.modal){this.mask=dh.append(document.body,{tag:"div",cls:"x-dlg-mask"},true);this.mask.enableDisplayMode("block");this.mask.hide();this.el.addClass("x-dlg-modal");}if(this.shadow){this.shadow=new Ext.Shadow({mode:typeof this.shadow=="string"?this.shadow:"sides",offset:this.shadowOffset});}else{this.shadowOffset=0;}if(Ext.useShims&&this.shim!==false){this.shim=this.el.createShim();this.shim.hide=this.hideAction;this.shim.hide();}else{this.shim=false;}if(this.autoTabs){this.initTabs();}this.addEvents({"keydown":true,"move":true,"resize":true,"beforehide":true,"hide":true,"beforeshow":true,"show":true});el.on("keydown",this.onKeyDown,this);el.on("mousedown",this.toFront,this);Ext.EventManager.onWindowResize(this.adjustViewport,this,true);this.el.hide();Ext.DialogManager.register(this);Ext.BasicDialog.superclass.constructor.call(this);};Ext.extend(Ext.BasicDialog,Ext.util.Observable,{shadowOffset:5,minHeight:80,minWidth:200,minButtonWidth:75,defaultButton:null,buttonAlign:"right",tabTag:"div",firstShow:true,setTitle:function(_5){this.header.update(_5);return this;},closeClick:function(){this.hide();},collapseClick:function(){this[this.collapsed?"expand":"collapse"]();},collapse:function(){if(!this.collapsed){this.collapsed=true;this.el.addClass("x-dlg-collapsed");this.restoreHeight=this.el.getHeight();this.resizeTo(this.el.getWidth(),this.header.getHeight());}},expand:function(){if(this.collapsed){this.collapsed=false;this.el.removeClass("x-dlg-collapsed");this.resizeTo(this.el.getWidth(),this.restoreHeight);}},initTabs:function(){var _6=this.getTabs();while(_6.getTab(0)){_6.removeTab(0);}this.el.select(this.tabTag+".x-dlg-tab").each(function(el){var _8=el.dom;_6.addTab(Ext.id(_8),_8.title);_8.title="";});_6.activate(0);return _6;},beforeResize:function(){this.resizer.minHeight=Math.max(this.minHeight,this.getHeaderFooterHeight(true)+40);},onResize:function(){this.refreshSize();this.syncBodyHeight();this.adjustAssets();this.focus();this.fireEvent("resize",this,this.size.width,this.size.height);},onKeyDown:function(e){if(this.isVisible()){this.fireEvent("keydown",this,e);}},resizeTo:function(_a,_b){this.el.setSize(_a,_b);this.size={width:_a,height:_b};this.syncBodyHeight();if(this.fixedcenter){this.center();}if(this.isVisible()){this.constrainXY();this.adjustAssets();}this.fireEvent("resize",this,_a,_b);return this;},setContentSize:function(w,h){h+=this.getHeaderFooterHeight()+this.body.getMargins("tb");w+=this.body.getMargins("lr")+this.bwrap.getMargins("lr")+this.centerBg.getPadding("lr");h+=this.body.getPadding("tb")+this.bwrap.getBorderWidth("tb")+this.body.getBorderWidth("tb")+this.el.getBorderWidth("tb");w+=this.body.getPadding("lr")+this.bwrap.getBorderWidth("lr")+this.body.getBorderWidth("lr")+this.bwrap.getPadding("lr")+this.el.getBorderWidth("lr");if(this.tabs){h+=this.tabs.stripWrap.getHeight()+this.tabs.bodyEl.getMargins("tb")+this.tabs.bodyEl.getPadding("tb");w+=this.tabs.bodyEl.getMargins("lr")+this.tabs.bodyEl.getPadding("lr");}this.resizeTo(w,h);return this;},addKeyListener:function(_e,fn,_10){var _11,_12,_13,alt;if(typeof _e=="object"&&!(_e instanceof Array)){_11=_e["key"];_12=_e["shift"];_13=_e["ctrl"];alt=_e["alt"];}else{_11=_e;}var _15=function(dlg,e){if((!_12||e.shiftKey)&&(!_13||e.ctrlKey)&&(!alt||e.altKey)){var k=e.getKey();if(_11 instanceof Array){for(var i=0,len=_11.length;i
        "},null,true);this.btnContainer=tb.firstChild.firstChild.firstChild;}var _20={handler:_1c,scope:_1d,minWidth:this.minButtonWidth,hideParent:true};if(typeof _1b=="string"){_20.text=_1b;}else{if(_1b.tag){_20.dhconfig=_1b;}else{Ext.apply(_20,_1b);}}var btn=new Ext.Button(this.btnContainer.appendChild(document.createElement("td")),_20);this.syncBodyHeight();if(!this.buttons){this.buttons=[];}this.buttons.push(btn);return btn;},setDefaultButton:function(btn){this.defaultButton=btn;return this;},getHeaderFooterHeight:function(_23){var _24=0;if(this.header){_24+=this.header.getHeight();}if(this.footer){var fm=this.footer.getMargins();_24+=(this.footer.getHeight()+fm.top+fm.bottom);}_24+=this.bwrap.getPadding("tb")+this.bwrap.getBorderWidth("tb");_24+=this.centerBg.getPadding("tb");return _24;},syncBodyHeight:function(){var bd=this.body,cb=this.centerBg,bw=this.bwrap;var _29=this.size.height-this.getHeaderFooterHeight(false);bd.setHeight(_29-bd.getMargins("tb"));var hh=this.header.getHeight();var h=this.size.height-hh;cb.setHeight(h);bw.setLeftTop(cb.getPadding("l"),hh+cb.getPadding("t"));bw.setHeight(h-cb.getPadding("tb"));bw.setWidth(this.el.getWidth(true)-cb.getPadding("lr"));bd.setWidth(bw.getWidth(true));if(this.tabs){this.tabs.syncHeight();if(Ext.isIE){this.tabs.el.repaint();}}},restoreState:function(){var box=Ext.state.Manager.get(this.stateId||(this.el.id+"-state"));if(box&&box.width){this.xy=[box.x,box.y];this.resizeTo(box.width,box.height);}return this;},beforeShow:function(){this.expand();if(this.fixedcenter){this.xy=this.el.getCenterXY(true);}if(this.modal){Ext.get(document.body).addClass("x-body-masked");this.mask.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true));this.mask.show();}this.constrainXY();},animShow:function(){var b=Ext.get(this.animateTarget,true).getBox();this.proxy.setSize(b.width,b.height);this.proxy.setLocation(b.x,b.y);this.proxy.show();this.proxy.setBounds(this.xy[0],this.xy[1],this.size.width,this.size.height,true,0.35,this.showEl.createDelegate(this));},show:function(_2e){if(this.fireEvent("beforeshow",this)===false){return;}if(this.syncHeightBeforeShow){this.syncBodyHeight();}else{if(this.firstShow){this.firstShow=false;this.syncBodyHeight();}}this.animateTarget=_2e||this.animateTarget;if(!this.el.isVisible()){this.beforeShow();if(this.animateTarget){this.animShow();}else{this.showEl();}}return this;},showEl:function(){this.proxy.hide();this.el.setXY(this.xy);this.el.show();this.adjustAssets(true);this.toFront();this.focus();if(Ext.isIE){this.el.repaint();}this.fireEvent("show",this);},focus:function(){if(this.defaultButton){this.defaultButton.focus();}else{this.focusEl.focus();}},constrainXY:function(){if(this.constraintoviewport!==false){if(!this.viewSize){if(this.container){var s=this.container.getSize();this.viewSize=[s.width,s.height];}else{this.viewSize=[Ext.lib.Dom.getViewWidth(),Ext.lib.Dom.getViewHeight()];}}var s=Ext.get(this.container||document).getScroll();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 _36=false;if(x+w>vw+s.left){x=vw-w;_36=true;}if(y+h>vh+s.top){y=vh-h;_36=true;}if(x
         
        "});_6=_5.dom.firstChild;_7=Ext.get(_5.dom.childNodes[2]);_7.enableDisplayMode();_7.addKeyListener([10,13],function(){if(_1.isVisible()&&_2&&_2.buttons){if(_2.buttons.ok){_e("ok");}else{if(_2.buttons.yes){_e("yes");}}}});_8=Ext.get(_5.dom.childNodes[3]);_8.enableDisplayMode();_9=Ext.get(_5.dom.childNodes[4]);_9.enableDisplayMode();var pf=_9.dom.firstChild;pp=Ext.get(pf.firstChild);pp.setHeight(pf.offsetHeight);}return _1;},updateText:function(_1b){if(!_1.isVisible()&&!_2.width){_1.resizeTo(this.maxWidth,100);}_6.innerHTML=_1b||" ";var w=Math.max(Math.min(_2.width||_6.offsetWidth,this.maxWidth),Math.max(_2.minWidth||this.minWidth,_d));if(_2.prompt){_c.setWidth(w);}if(_1.isVisible()){_1.fixedcenter=false;}_1.setContentSize(w,_5.getHeight());if(_1.isVisible()){_1.fixedcenter=true;}return this;},updateProgress:function(_1d,_1e){if(_1e){this.updateText(_1e);}pp.setWidth(Math.floor(_1d*_9.dom.firstChild.offsetWidth));return this;},isVisible:function(){return _1&&_1.isVisible();},hide:function(){if(this.isVisible()){_1.hide();}},show:function(_1f){if(this.isVisible()){this.hide();}var d=this.getDialog();_2=_1f;d.setTitle(_2.title||" ");d.close.setDisplayed(_2.closable!==false);_c=_7;_2.prompt=_2.prompt||(_2.multiline?true:false);if(_2.prompt){if(_2.multiline){_7.hide();_8.show();_8.setHeight(typeof _2.multiline=="number"?_2.multiline:this.defaultTextHeight);_c=_8;}else{_7.show();_8.hide();}}else{_7.hide();_8.hide();}_9.setDisplayed(_2.progress===true);this.updateProgress(0);_c.dom.value=_2.value||"";if(_2.prompt){_1.setDefaultButton(_c);}else{var bs=_2.buttons;var db=null;if(bs&&bs.ok){db=_b["ok"];}else{if(bs&&bs.yes){db=_b["yes"];}}_1.setDefaultButton(db);}_d=_11(_2.buttons);this.updateText(_2.msg);if(_2.cls){d.el.addClass(_2.cls);}d.proxyDrag=_2.proxyDrag===true;d.modal=_2.modal!==false;d.mask=_2.modal!==false?_3:false;if(!d.isVisible()){document.body.appendChild(_1.el.dom);d.animateTarget=null;d.show(_1f.animEl);}return this;},progress:function(_23,msg){this.show({title:_23,msg:msg,buttons:false,progress:true,closable:false,minWidth:this.minProgressWidth});return this;},alert:function(_25,msg,fn,_28){this.show({title:_25,msg:msg,buttons:this.OK,fn:fn,scope:_28});return this;},wait:function(msg,_2a){this.show({title:_2a,msg:msg,buttons:false,closable:false,progress:true,modal:true,width:300,wait:true});_4=Ext.TaskMgr.start({run:function(i){Ext.MessageBox.updateProgress(((((i+20)%20)+1)*5)*0.01);},interval:1000});return this;},confirm:function(_2c,msg,fn,_2f){this.show({title:_2c,msg:msg,buttons:this.YESNO,fn:fn,scope:_2f});return this;},prompt:function(_30,msg,fn,_33,_34){this.show({title:_30,msg:msg,buttons:this.OKCANCEL,fn:fn,minWidth:250,scope:_33,prompt:true,multiline:_34});return this;},OK:{ok:true},YESNO:{yes:true,no:true},OKCANCEL:{ok:true,cancel:true},YESNOCANCEL:{yes:true,no:true,cancel:true},defaultTextHeight:75,maxWidth:600,minWidth:100,minProgressWidth:250,buttonText:{ok:"OK",cancel:"Cancel",yes:"Yes",no:"No"}};}();Ext.Msg=Ext.MessageBox; + diff --git a/www/extras/yui-ext/package/dragdrop/dragdrop.js b/www/extras/yui-ext/package/dragdrop/dragdrop.js new file mode 100644 index 000000000..4c3b9f96b --- /dev/null +++ b/www/extras/yui-ext/package/dragdrop/dragdrop.js @@ -0,0 +1,24 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +(function(){var _1=Ext.EventManager;var _2=Ext.lib.Dom;Ext.dd.DragDrop=function(id,_4,_5){if(id){this.init(id,_4,_5);}};Ext.dd.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(){},defaultPadding:{left:0,right:0,top:0,bottom:0},constrainTo:function(_1d,pad,_1f){if(typeof pad=="number"){pad={left:pad,right:pad,top:pad,bottom:pad};}pad=pad||this.defaultPadding;var b=Ext.get(this.getEl()).getBox();var ce=Ext.get(_1d);var s=ce.getScroll();var c,cd=ce.dom;if(cd==document.body){c={x:s.left,y:s.top,width:Ext.lib.Dom.getViewWidth(),height:Ext.lib.Dom.getViewHeight()};}else{xy=ce.getXY();c={x:xy[0]+s.left,y:xy[1]+s.top,width:cd.clientWidth,height:cd.clientHeight};}var _25=b.y-c.y;var _26=b.x-c.x;this.resetConstraints();this.setXConstraint(_26-(pad.left||0),c.width-_26-b.width-(pad.right||0));this.setYConstraint(_25-(pad.top||0),c.height-_25-b.height-(pad.bottom||0));},getEl:function(){if(!this._domRef){this._domRef=Ext.getDom(this.id);}return this._domRef;},getDragEl:function(){return Ext.getDom(this.dragElId);},init:function(id,_28,_29){this.initTarget(id,_28,_29);_1.on(this.id,"mousedown",this.handleMouseDown,this);},initTarget:function(id,_2b,_2c){this.config=_2c||{};this.DDM=Ext.dd.DDM;this.groups={};if(typeof id!=="string"){id=Ext.id(id);}this.id=id;this.addToGroup((_2b)?_2b:"default");this.handleElId=id;this.setDragElId(id);this.invalidHandleTypes={A:"A"};this.invalidHandleIds={};this.invalidHandleClasses=[];this.applyConfig();this.handleOnAvailable();},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(_2d,_2e,_2f,_30){if(!_2e&&0!==_2e){this.padding=[_2d,_2d,_2d,_2d];}else{if(!_2f&&0!==_2f){this.padding=[_2d,_2e,_2d,_2e];}else{this.padding=[_2d,_2e,_2f,_30];}}},setInitPosition:function(_31,_32){var el=this.getEl();if(!this.DDM.verifyEl(el)){return;}var dx=_31||0;var dy=_32||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(_39){this.groups[_39]=true;this.DDM.regDragDrop(this,_39);},removeFromGroup:function(_3a){if(this.groups[_3a]){delete this.groups[_3a];}this.DDM.removeDDFromGroup(this,_3a);},setDragElId:function(id){this.dragElId=id;},setHandleElId:function(id){if(typeof id!=="string"){id=Ext.id(id);}this.handleElId=id;this.DDM.regHandle(this.id,id);},setOuterHandleElId:function(id){if(typeof id!=="string"){id=Ext.id(id);}_1.on(id,"mousedown",this.handleMouseDown,this);this.setHandleElId(id);this.hasOuterHandles=true;},unreg:function(){_1.un(this.id,"mousedown",this.handleMouseDown);this._domRef=null;this.DDM._remove(this);},isLocked:function(){return (this.DDM.isLocked()||this.locked);},handleMouseDown:function(e,oDD){if(this.primaryButtonOnly&&e.button!=0){return;}if(this.isLocked()){return;}this.DDM.refreshCache(this.groups);var pt=new Ext.lib.Point(Ext.lib.Event.getPageX(e),Ext.lib.Event.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 _42=Ext.lib.Event.getTarget(e);return (this.isValidHandleChild(_42)&&(this.id==this.handleElId||this.DDM.handleWasClicked(_42,this.id)));},addInvalidHandleType:function(_43){var _44=_43.toUpperCase();this.invalidHandleTypes[_44]=_44;},addInvalidHandleId:function(id){if(typeof id!=="string"){id=Ext.id(id);}this.invalidHandleIds[id]=id;},addInvalidHandleClass:function(_46){this.invalidHandleClasses.push(_46);},removeInvalidHandleType:function(_47){var _48=_47.toUpperCase();delete this.invalidHandleTypes[_48];},removeInvalidHandleId:function(id){if(typeof id!=="string"){id=Ext.id(id);}delete this.invalidHandleIds[id];},removeInvalidHandleClass:function(_4a){for(var i=0,len=this.invalidHandleClasses.length;i=this.minX;i=i-_53){if(!_54[i]){this.xTicks[this.xTicks.length]=i;_54[i]=true;}}for(i=this.initPageX;i<=this.maxX;i=i+_53){if(!_54[i]){this.xTicks[this.xTicks.length]=i;_54[i]=true;}}this.xTicks.sort(this.DDM.numericSort);},setYTicks:function(_56,_57){this.yTicks=[];this.yTickSize=_57;var _58={};for(var i=this.initPageY;i>=this.minY;i=i-_57){if(!_58[i]){this.yTicks[this.yTicks.length]=i;_58[i]=true;}}for(i=this.initPageY;i<=this.maxY;i=i+_57){if(!_58[i]){this.yTicks[this.yTicks.length]=i;_58[i]=true;}}this.yTicks.sort(this.DDM.numericSort);},setXConstraint:function(_5a,_5b,_5c){this.leftConstraint=_5a;this.rightConstraint=_5b;this.minX=this.initPageX-_5a;this.maxX=this.initPageX+_5b;if(_5c){this.setXTicks(this.initPageX,_5c);}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,_5e,_5f){this.topConstraint=iUp;this.bottomConstraint=_5e;this.minY=this.initPageY-iUp;this.maxY=this.initPageY+_5e;if(_5f){this.setYTicks(this.initPageY,_5f);}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,_63){if(!_63){return val;}else{if(_63[0]>=val){return _63[0];}else{for(var i=0,len=_63.length;i=val){var _67=val-_63[i];var _68=_63[_66]-val;return (_68>_67)?_63[i]:_63[_66];}}return _63[_63.length-1];}}},toString:function(){return ("DragDrop "+this.id);}};})();if(!Ext.dd.DragDropMgr){Ext.dd.DragDropMgr=function(){var _69=Ext.EventManager;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(_6a,_6b){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[_6a].apply(oDD,_6b);}}},_onLoad:function(){this.init();_69.on(document,"mouseup",this.handleMouseUp,this,true);_69.on(document,"mousemove",this.handleMouseMove,this,true);_69.on(window,"unload",this._onUnload,this,true);_69.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:350,dragThreshMet:false,clickTimeout:null,startX:0,startY:0,regDragDrop:function(oDD,_71){if(!this.initialized){this.init();}if(!this.ids[_71]){this.ids[_71]={};}this.ids[_71][oDD.id]=oDD;},removeDDFromGroup:function(oDD,_73){if(!this.ids[_73]){this.ids[_73]={};}var obj=this.ids[_73];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(_77,_78){if(!this.handleIds[_77]){this.handleIds[_77]={};}this.handleIds[_77][_78]=_78;},isDragDrop:function(id){return (this.getDDById(id))?true:false;},getRelated:function(_7a,_7b){var _7c=[];for(var i in _7a.groups){for(j in this.ids[i]){var dd=this.ids[i][j];if(!this.isTypeOfDD(dd)){continue;}if(!_7b||dd.isTarget){_7c[_7c.length]=dd;}}}return _7c;},isLegalTarget:function(oDD,_80){var _81=this.getRelated(oDD,true);for(var i=0,len=_81.length;ithis.clickPixelThresh||_94>this.clickPixelThresh){this.startDrag(this.startX,this.startY);}}if(this.dragThreshMet){this.dragCurrent.b4Drag(e);this.dragCurrent.onDrag(e);if(!this.dragCurrent.moveOnly){this.fireEvents(e,false);}}this.stopEvent(e);return true;},fireEvents:function(e,_96){var dc=this.dragCurrent;if(!dc||dc.isLocked()){return;}var x=Ext.lib.Event.getPageX(e);var y=Ext.lib.Event.getPageY(e);var pt=new Ext.lib.Point(x,y);var _9b=[];var _9c=[];var _9d=[];var _9e=[];var _9f=[];for(var i in this.dragOvers){var ddo=this.dragOvers[i];if(!this.isTypeOfDD(ddo)){continue;}if(!this.isOverTarget(pt,ddo,this.mode)){_9c.push(ddo);}_9b[i]=true;delete this.dragOvers[i];}for(var _a2 in dc.groups){if("string"!=typeof _a2){continue;}for(i in this.ids[_a2]){var oDD=this.ids[_a2][i];if(!this.isTypeOfDD(oDD)){continue;}if(oDD.isTarget&&!oDD.isLocked()&&oDD!=dc){if(this.isOverTarget(pt,oDD,this.mode)){if(_96){_9e.push(oDD);}else{if(!_9b[oDD.id]){_9f.push(oDD);}else{_9d.push(oDD);}this.dragOvers[oDD.id]=oDD;}}}}}if(this.mode){if(_9c.length){dc.b4DragOut(e,_9c);dc.onDragOut(e,_9c);}if(_9f.length){dc.onDragEnter(e,_9f);}if(_9d.length){dc.b4DragOver(e,_9d);dc.onDragOver(e,_9d);}if(_9e.length){dc.b4DragDrop(e,_9e);dc.onDragDrop(e,_9e);}}else{var len=0;for(i=0,len=_9c.length;i2000){}else{setTimeout(DDM._addListeners,10);if(document&&document.body){DDM._timeoutCount+=1;}}}},handleWasClicked:function(_df,id){if(this.isHandle(id,_df.id)){return true;}else{var p=_df.parentNode;while(p){if(this.isHandle(id,p.id)){return true;}else{p=p.parentNode;}}}return false;}};}();Ext.dd.DDM=Ext.dd.DragDropMgr;Ext.dd.DDM._addListeners();}Ext.dd.DD=function(id,_e3,_e4){if(id){this.init(id,_e3,_e4);}};Ext.extend(Ext.dd.DD,Ext.dd.DragDrop,{scroll:true,autoOffset:function(_e5,_e6){var x=_e5-this.startPageX;var y=_e6-this.startPageY;this.setDelta(x,y);},setDelta:function(_e9,_ea){this.deltaX=_e9;this.deltaY=_ea;},setDragElPos:function(_eb,_ec){var el=this.getDragEl();this.alignElWithMouse(el,_eb,_ec);},alignElWithMouse:function(el,_ef,_f0){var _f1=this.getTargetCoord(_ef,_f0);var fly=el.dom?el:Ext.fly(el);if(!this.deltaSetXY){var _f3=[_f1.x,_f1.y];fly.setXY(_f3);var _f4=fly.getLeft(true);var _f5=fly.getTop(true);this.deltaSetXY=[_f4-_f1.x,_f5-_f1.y];}else{fly.setLeftTop(_f1.x+this.deltaSetXY[0],_f1.y+this.deltaSetXY[1]);}this.cachePosition(_f1.x,_f1.y);this.autoScroll(_f1.x,_f1.y,el.offsetHeight,el.offsetWidth);return _f1;},cachePosition:function(_f6,_f7){if(_f6){this.lastPageX=_f6;this.lastPageY=_f7;}else{var _f8=Ext.lib.Dom.getXY(this.getEl());this.lastPageX=_f8[0];this.lastPageY=_f8[1];}},autoScroll:function(x,y,h,w){if(this.scroll){var _fd=Ext.lib.Dom.getViewWidth();var _fe=Ext.lib.Dom.getViewHeight();var st=this.DDM.getScrollTop();var sl=this.DDM.getScrollLeft();var bot=h+y;var _102=w+x;var _103=(_fd+st-y-this.deltaY);var _104=(_fe+sl-x-this.deltaX);var _105=40;var _106=(document.all)?80:30;if(bot>_fd&&_103<_105){window.scrollTo(sl,st+_106);}if(y0&&y-st<_105){window.scrollTo(sl,st-_106);}if(_102>_fe&&_104<_105){window.scrollTo(sl+_106,st);}if(x0&&x-sl<_105){window.scrollTo(sl-_106,st);}}},getTargetCoord:function(_107,_108){var x=_107-this.deltaX;var y=_108-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(){Ext.dd.DD.superclass.applyConfig.call(this);this.scroll=(this.config.scroll!==false);},b4MouseDown:function(e){this.autoOffset(Ext.lib.Event.getPageX(e),Ext.lib.Event.getPageY(e));},b4Drag:function(e){this.setDragElPos(Ext.lib.Event.getPageX(e),Ext.lib.Event.getPageY(e));},toString:function(){return ("DD "+this.id);}});Ext.dd.DDProxy=function(id,_10e,_10f){if(id){this.init(id,_10e,_10f);this.initFrame();}};Ext.dd.DDProxy.dragElId="ygddfdiv";Ext.extend(Ext.dd.DDProxy,Ext.dd.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(){Ext.dd.DDProxy.superclass.applyConfig.call(this);this.resizeFrame=(this.config.resizeFrame!==false);this.centerFrame=(this.config.centerFrame);this.setDragElId(this.config.dragElId||Ext.dd.DDProxy.dragElId);},showFrame:function(_114,_115){var el=this.getEl();var _117=this.getDragEl();var s=_117.style;this._resizeProxy();if(this.centerFrame){this.setDelta(Math.round(parseInt(s.width,10)/2),Math.round(parseInt(s.height,10)/2));}this.setDragElPos(_114,_115);Ext.fly(_117).show();},_resizeProxy:function(){if(this.resizeFrame){var el=this.getEl();Ext.fly(this.getDragEl()).setSize(el.offsetWidth,el.offsetHeight);}},b4MouseDown:function(e){var x=Ext.lib.Event.getPageX(e);var y=Ext.lib.Event.getPageY(e);this.autoOffset(x,y);this.setDragElPos(x,y);},b4StartDrag:function(x,y){this.showFrame(x,y);},b4EndDrag:function(e){Ext.fly(this.getDragEl()).hide();},endDrag:function(e){var lel=this.getEl();var del=this.getDragEl();del.style.visibility="";this.beforeMove();lel.style.visibility="hidden";Ext.dd.DDM.moveToEl(lel,del);del.style.visibility="hidden";lel.style.visibility="";this.afterDrag();},beforeMove:function(){},afterDrag:function(){},toString:function(){return ("DDProxy "+this.id);}});Ext.dd.DDTarget=function(id,_124,_125){if(id){this.initTarget(id,_124,_125);}};Ext.extend(Ext.dd.DDTarget,Ext.dd.DragDrop,{toString:function(){return ("DDTarget "+this.id);}}); + +Ext.dd.ScrollManager=function(){var _1=Ext.dd.DragDropMgr;var _2={};var _3=null;var _4={};var _5=function(e){_3=null;_7();};var _8=function(){if(_1.dragCurrent){_1.refreshCache(_1.dragCurrent.groups);}};var _9=function(){if(_1.dragCurrent){var _a=Ext.dd.ScrollManager;if(!_a.animate){if(_4.el.scroll(_4.dir,_a.increment)){_8();}}else{_4.el.scroll(_4.dir,_a.increment,true,_a.animDuration,_8);}}};var _7=function(){if(_4.id){clearInterval(_4.id);}_4.id=0;_4.el=null;_4.dir="";};var _b=function(el,_d){_7();_4.el=el;_4.dir=_d;_4.id=setInterval(_9,Ext.dd.ScrollManager.frequency);};var _e=function(e,_10){if(_10||!_1.dragCurrent){return;}var dds=Ext.dd.ScrollManager;if(!_3||_3!=_1.dragCurrent){_3=_1.dragCurrent;dds.refreshCache();}var xy=Ext.lib.Event.getXY(e);var pt=new Ext.lib.Point(xy[0],xy[1]);for(var id in _2){var el=_2[id],r=el._region;if(r.contains(pt)&&el.isScrollable()){if(r.bottom-pt.y<=dds.thresh){if(_4.el!=el){_b(el,"down");}return;}else{if(r.right-pt.x<=dds.thresh){if(_4.el!=el){_b(el,"left");}return;}else{if(pt.y-r.top<=dds.thresh){if(_4.el!=el){_b(el,"up");}return;}else{if(pt.x-r.left<=dds.thresh){if(_4.el!=el){_b(el,"right");}return;}}}}}}_7();};_1.fireEvents=_1.fireEvents.createSequence(_e,_1);_1.stopDrag=_1.stopDrag.createSequence(_5,_1);return {register:function(el){if(el instanceof Array){for(var i=0,len=el.length;i 0){ + this.setValue(this.el.dom.value); + } + }, + + afterRender : function(){ + Ext.form.Field.superclass.afterRender.call(this); + this.initEvents(); + }, + + fireKey : function(e){ + if(e.isNavKeyPress()){ + this.fireEvent("specialkey", this, e); + } + }, + + + reset : function(){ + this.setValue(this.originalValue); + this.clearInvalid(); + }, + + initEvents : function(){ + this.el.on(Ext.isIE ? "keydown" : "keypress", this.fireKey, this); + this.el.on("focus", this.onFocus, this); + this.el.on("blur", this.onBlur, this); + + this.originalValue = this.getValue(); + }, + + onFocus : function(){ + if(!Ext.isOpera){ this.el.addClass(this.focusClass); + } + this.hasFocus = true; + this.startValue = this.getValue(); + this.fireEvent("focus", this); + }, + + onBlur : function(){ + this.el.removeClass(this.focusClass); + this.hasFocus = false; + if(this.validationEvent !== false && this.validateOnBlur && this.validationEvent != "blur"){ + this.validate(); + } + var v = this.getValue(); + if(v != this.startValue){ + this.fireEvent('change', this, v, this.startValue); + } + this.fireEvent("blur", this); + }, + + + setSize : function(w, h){ + if(!this.rendered || !this.el){ + this.width = w; + this.height = h; + return; + } + if(w){ + w = this.adjustWidth(this.el.dom.tagName, w); + this.el.setWidth(w); + } + if(h){ + this.el.setHeight(h); + } + var h = this.el.dom.offsetHeight; }, + + + isValid : function(preventMark){ + if(this.disabled){ + return true; + } + var restore = this.preventMark; + this.preventMark = preventMark === true; + var v = this.validateValue(this.getRawValue()); + this.preventMark = restore; + return v; + }, + + + validate : function(){ + if(this.disabled || this.validateValue(this.getRawValue())){ + this.clearInvalid(); + return true; + } + return false; + }, + + validateValue : function(value){ + return true; + }, + + + markInvalid : function(msg){ + if(!this.rendered || this.preventMark){ return; + } + this.el.addClass(this.invalidClass); + msg = msg || this.invalidText; + switch(this.msgTarget){ + case 'qtip': + this.el.dom.qtip = msg; + this.el.dom.qclass = 'x-form-invalid-tip'; + break; + case 'title': + this.el.dom.title = msg; + break; + case 'under': + if(!this.errorEl){ + var elp = this.el.findParent('.x-form-element', 5, true); + this.errorEl = elp.createChild({cls:'x-form-invalid-msg'}); + this.errorEl.setWidth(elp.getWidth(true)-20); + } + this.errorEl.update(msg); + Ext.form.Field.msgFx[this.msgFx].show(this.errorEl, this); + break; + case 'side': + if(!this.errorIcon){ + var elp = this.el.findParent('.x-form-element', 5, true); + this.errorIcon = elp.createChild({cls:'x-form-invalid-icon'}); + } + this.alignErrorIcon(); + this.errorIcon.dom.qtip = msg; + this.errorIcon.dom.qclass = 'x-form-invalid-tip'; + this.errorIcon.show(); + break; + default: + var t = Ext.getDom(this.msgTarget); + t.innerHTML = msg; + t.style.display = this.msgDisplay; + break; + } + this.fireEvent('invalid', this, msg); + }, + + alignErrorIcon : function(){ + this.errorIcon.alignTo(this.el, 'tl-tr', [2, 0]); + }, + + + clearInvalid : function(){ + if(!this.rendered || this.preventMark){ return; + } + this.el.removeClass(this.invalidClass); + switch(this.msgTarget){ + case 'qtip': + this.el.dom.qtip = ''; + break; + case 'title': + this.el.dom.title = ''; + break; + case 'under': + if(this.errorEl){ + Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl, this); + } + break; + case 'side': + if(this.errorIcon){ + this.errorIcon.dom.qtip = ''; + this.errorIcon.hide(); + } + break; + default: + var t = Ext.getDom(this.msgTarget); + t.innerHTML = ''; + t.style.display = 'none'; + break; + } + this.fireEvent('valid', this); + }, + + + getRawValue : function(){ + return this.el.getValue(); + }, + + + getValue : function(){ + var v = this.el.getValue(); + if(v == this.emptyText || v === undefined){ + v = ''; + } + return v; + }, + + + setRawValue : function(v){ + return this.el.dom.value = v; + }, + + + setValue : function(v){ + this.value = v; + if(this.rendered){ + this.el.dom.value = v; + this.validate(); + } + }, + + adjustWidth : function(tag, w){ + tag = tag.toLowerCase(); + if(typeof w == 'number' && Ext.isStrict && !Ext.isSafari){ + if(Ext.isIE && (tag == 'input' || tag == 'textarea')){ + if(tag == 'input'){ + return w + 2; + } + if(tag = 'textarea'){ + return w-2; + } + }else if(Ext.isGecko && tag == 'textarea'){ + return w-6; + }else if(Ext.isOpera){ + if(tag == 'input'){ + return w + 2; + } + if(tag = 'textarea'){ + return w-2; + } + } + } + return w; + } +}); + + +Ext.form.Field.msgFx = { + normal : { + show: function(msgEl, f){ + msgEl.setDisplayed('block'); + }, + + hide : function(msgEl, f){ + msgEl.setDisplayed(false).update(''); + } + }, + + slide : { + show: function(msgEl, f){ + msgEl.slideIn('t', {stopFx:true}); + }, + + hide : function(msgEl, f){ + msgEl.slideOut('t', {stopFx:true,useDisplay:true}); + } + }, + + slideRight : { + show: function(msgEl, f){ + msgEl.fixDisplay(); + msgEl.alignTo(f.el, 'tl-tr'); + msgEl.slideIn('l', {stopFx:true}); + }, + + hide : function(msgEl, f){ + msgEl.slideOut('l', {stopFx:true,useDisplay:true}); + } + } +}; + + +Ext.form.TextField = function(config){ + Ext.form.TextField.superclass.constructor.call(this, config); + this.addEvents({ + + autosize : true + }); +}; + +Ext.extend(Ext.form.TextField, Ext.form.Field, { + + grow : false, + + growMin : 30, + + growMax : 800, + + vtype : null, + + maskRe : null, + + disableKeyFilter : false, + + allowBlank : true, + + minLength : 0, + + maxLength : Number.MAX_VALUE, + + minLengthText : "The minimum length for this field is {0}", + + maxLengthText : "The maximum length for this field is {0}", + + selectOnFocus : false, + + blankText : "This field is required", + + validator : null, + + regex : null, + + regexText : "", + + emptyText : null, + + emptyClass : 'x-form-empty-field', + + initEvents : function(){ + Ext.form.TextField.superclass.initEvents.call(this); + if(this.validationEvent == 'keyup'){ + this.validationTask = new Ext.util.DelayedTask(this.validate, this); + this.el.on('keyup', this.filterValidation, this); + } + else if(this.validationEvent !== false){ + this.el.on(this.validationEvent, this.validate, this, {buffer: this.validationDelay}); + } + if(this.selectOnFocus || this.emptyText){ + this.on("focus", this.preFocus, this); + if(this.emptyText){ + this.on('blur', this.postBlur, this); + this.applyEmptyText(); + } + } + if(this.maskRe || (this.vtype && this.disableKeyFilter !== true && (this.maskRe = Ext.form.VTypes[this.vtype+'Mask']))){ + this.el.on("keypress", this.filterKeys, this); + } + if(this.grow){ + this.el.on("keyup", this.onKeyUp, this, {buffer:50}); + this.el.on("click", this.autoSize, this); + } + }, + + filterValidation : function(e){ + if(!e.isNavKeyPress()){ + this.validationTask.delay(this.validationDelay); + } + }, + + onKeyUp : function(e){ + if(!e.isNavKeyPress()){ + this.autoSize(); + } + }, + + + reset : function(){ + Ext.form.TextField.superclass.reset.call(this); + this.applyEmptyText(); + }, + + applyEmptyText : function(){ + if(this.rendered && this.emptyText && this.getRawValue().length < 1){ + this.setRawValue(this.emptyText); + this.el.addClass(this.emptyClass); + } + }, + + preFocus : function(){ + if(this.emptyText){ + if(this.getRawValue() == this.emptyText){ + this.setRawValue(''); + } + this.el.removeClass(this.emptyClass); + } + if(this.selectOnFocus){ + this.el.dom.select(); + } + }, + + postBlur : function(){ + this.applyEmptyText(); + }, + + filterKeys : function(e){ + var k = e.getKey(); + if(!Ext.isIE && (e.isNavKeyPress() || k == e.BACKSPACE || (k == e.DELETE && e.button == -1))){ + return; + } + var c = e.getCharCode(); + if(!this.maskRe.test(String.fromCharCode(c) || '')){ + e.stopEvent(); + } + }, + + setValue : function(v){ + if(this.emptyText && v !== undefined && v !== null && v !== ''){ + this.el.removeClass(this.emptyClass); + } + Ext.form.TextField.superclass.setValue.apply(this, arguments); + }, + + + validateValue : function(value){ + if(value.length < 1 || value === this.emptyText){ if(this.allowBlank){ + this.clearInvalid(); + return true; + }else{ + this.markInvalid(this.blankText); + return false; + } + } + if(value.length < this.minLength){ + this.markInvalid(String.format(this.minLengthText, this.minLength)); + return false; + } + if(value.length > this.maxLength){ + this.markInvalid(String.format(this.maxLengthText, this.maxLength)); + return false; + } + if(this.vtype){ + var vt = Ext.form.VTypes; + if(!vt[this.vtype](value)){ + this.markInvalid(this.vtypeText || vt[this.vtype +'Text']); + return false; + } + } + if(typeof this.validator == "function"){ + var msg = this.validator(value); + if(msg !== true){ + this.markInvalid(msg); + return false; + } + } + if(this.regex && !this.regex.test(value)){ + this.markInvalid(this.regexText); + return false; + } + return true; + }, + + + selectText : function(start, end){ + var v = this.getRawValue(); + if(v.length > 0){ + start = start === undefined ? 0 : start; + end = end === undefined ? v.length : end; + var d = this.el.dom; + if(d.setSelectionRange){ + d.setSelectionRange(start, end); + }else if(d.createTextRange){ + var range = d.createTextRange(); + range.moveStart("character", start); + range.moveEnd("character", v.length-end); + range.select(); + } + } + }, + + + autoSize : function(){ + if(!this.grow || !this.rendered){ + return; + } + if(!this.metrics){ + this.metrics = Ext.util.TextMetrics.createInstance(this.el); + } + var el = this.el; + var v = el.dom.value + " "; + var w = Math.min(this.growMax, Math.max(this.metrics.getWidth(v) + 10, this.growMin)); + this.el.setWidth(w); + this.fireEvent("autosize", this, w); + } +}); + +Ext.form.TriggerField = function(config){ + Ext.form.TriggerField.superclass.constructor.call(this, config); + this.mimicing = false; + this.on('disable', this.disableWrapper, this); + this.on('enable', this.enableWrapper, this); +}; + +Ext.extend(Ext.form.TriggerField, Ext.form.TextField, { + + + defaultAutoCreate : {tag: "input", type: "text", size: "16", autocomplete: "off"}, + + hideTrigger:false, + + + + + + + autoSize: Ext.emptyFn, + + monitorTab : true, + + customSize : true, + + setSize : function(w, h){ + if(!this.wrap){ + this.width = w; + this.height = h; + return; + } + if(w){ + var wrapWidth = w; + w = w - this.trigger.getWidth(); + Ext.form.TriggerField.superclass.setSize.call(this, w, h); + this.wrap.setWidth(wrapWidth); + if(this.onResize){ + this.onResize(wrapWidth, h); + } + }else{ + Ext.form.TriggerField.superclass.setSize.call(this, w, h); + this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth()); + } + }, + + alignErrorIcon : function(){ + this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]); + }, + + onRender : function(ct, position){ + Ext.form.TriggerField.superclass.onRender.call(this, ct, position); + this.wrap = this.el.wrap({cls: "x-form-field-wrap"}); + this.trigger = this.wrap.createChild({ + tag: "img", src: Ext.BLANK_IMAGE_URL, cls: "x-form-trigger "+this.triggerClass}); + this.trigger.on("click", this.onTriggerClick, this, {preventDefault:true}); + this.trigger.addClassOnOver('x-form-trigger-over'); + this.trigger.addClassOnClick('x-form-trigger-click'); + if(this.hideTrigger){ + this.trigger.setDisplayed(false); + } + this.setSize(this.width||'', this.height||''); + }, + + onDestroy : function(){ + if(this.trigger){ + this.trigger.removeAllListeners(); + this.trigger.remove(); + } + if(this.wrap){ + this.wrap.remove(); + } + Ext.form.TriggerField.superclass.onDestroy.call(this); + }, + + onFocus : function(){ + Ext.form.TriggerField.superclass.onFocus.call(this); + if(!this.mimicing){ + this.mimicing = true; + Ext.get(Ext.isIE ? document.body : document).on("mousedown", this.mimicBlur, this); + if(this.monitorTab){ + this.el.on("keydown", this.checkTab, this); + } + } + }, + + checkTab : function(e){ + if(e.getKey() == e.TAB){ + this.triggerBlur(); + } + }, + + onBlur : function(){ + }, + + mimicBlur : function(e, t){ + if(!this.wrap.contains(t) && this.validateBlur()){ + this.triggerBlur(); + } + }, + + triggerBlur : function(){ + this.mimicing = false; + Ext.get(Ext.isIE ? document.body : document).un("mousedown", this.mimicBlur); + if(this.monitorTab){ + this.el.un("keydown", this.checkTab, this); + } + Ext.form.TriggerField.superclass.onBlur.call(this); + }, + + validateBlur : function(e, t){ + return true; + }, + + disableWrapper : function(){ + if(this.wrap){ + this.wrap.addClass('x-item-disabled'); + } + }, + + enableWrapper : function(){ + if(this.wrap){ + this.wrap.removeClass('x-item-disabled'); + } + }, + + onShow : function(){ + if(this.wrap){ + this.wrap.dom.style.display = ''; + this.wrap.dom.style.visibility = 'visible'; + } + }, + + onHide : function(){ + this.wrap.dom.style.display = 'none'; + }, + + + onTriggerClick : Ext.emptyFn +}); + +Ext.form.TextArea = function(config){ + Ext.form.TextArea.superclass.constructor.call(this, config); + if(this.minHeight !== undefined){ + this.growMin = this.minHeight; + } + if(this.maxHeight !== undefined){ + this.growMax = this.maxHeight; + } +}; + +Ext.extend(Ext.form.TextArea, Ext.form.TextField, { + + growMin : 60, + + growMax: 1000, + + preventScrollbars: false, + + onRender : function(ct, position){ + if(!this.el){ + this.defaultAutoCreate = { + tag: "textarea", + style:"width:300px;height:60px;", + autocomplete: "off" + }; + } + Ext.form.TextArea.superclass.onRender.call(this, ct, position); + if(this.grow){ + this.textSizeEl = Ext.DomHelper.append(document.body, { + tag: "pre", cls: "x-form-grow-sizer" + }); + if(this.preventScrollbars){ + this.el.setStyle("overflow", "hidden"); + } + this.el.setHeight(this.growMin); + } + }, + + onKeyUp : function(e){ + if(!e.isNavKeyPress() || e.getKey() == e.ENTER){ + this.autoSize(); + } + }, + + + autoSize : function(){ + if(!this.grow || !this.textSizeEl){ + return; + } + var el = this.el; + var v = el.dom.value; + var ts = this.textSizeEl; + Ext.fly(ts).setWidth(this.el.getWidth()); + if(v.length < 1){ + v = "  "; + }else{ + v += " \n "; + } + if(Ext.isIE){ + v = v.replace(/\n/g, '
        '); + } + ts.innerHTML = v; + var h = Math.min(this.growMax, Math.max(ts.offsetHeight, this.growMin)); + if(h != this.lastHeight){ + this.lastHeight = h; + this.el.setHeight(h); + this.fireEvent("autosize", this, h); + } + }, + + setValue : function(v){ + Ext.form.TextArea.superclass.setValue.call(this, v); + this.autoSize(); + } +}); + +Ext.form.NumberField = function(config){ + Ext.form.NumberField.superclass.constructor.call(this, config); +}; + +Ext.extend(Ext.form.NumberField, Ext.form.TextField, { + + fieldClass: "x-form-field x-form-num-field", + + allowDecimals : true, + + decimalSeparator : ".", + + decimalPrecision : 2, + + allowNegative : true, + + minValue : Number.NEGATIVE_INFINITY, + + maxValue : Number.MAX_VALUE, + + minText : "The minimum value for this field is {0}", + + maxText : "The maximum value for this field is {0}", + + nanText : "{0} is not a valid number", + + initEvents : function(){ + Ext.form.NumberField.superclass.initEvents.call(this); + var allowed = "0123456789"; + if(this.allowDecimals){ + allowed += this.decimalSeparator; + } + if(this.allowNegative){ + allowed += "-"; + } + var keyPress = function(e){ + var k = e.getKey(); + if(!Ext.isIE && (e.isNavKeyPress() || k == e.BACKSPACE || (k == e.DELETE && e.button == -1))){ + return; + } + var c = e.getCharCode(); + if(allowed.indexOf(String.fromCharCode(c)) === -1){ + e.stopEvent(); + } + }; + this.el.on("keypress", keyPress, this); + }, + + validateValue : function(value){ + if(!Ext.form.NumberField.superclass.validateValue.call(this, value)){ + return false; + } + if(value.length < 1){ return true; + } + value = String(value).replace(this.decimalSeparator, "."); + if(isNaN(value)){ + this.markInvalid(String.format(this.nanText, value)); + return false; + } + var num = this.parseValue(value); + if(num < this.minValue){ + this.markInvalid(String.format(this.minText, this.minValue)); + return false; + } + if(num > this.maxValue){ + this.markInvalid(String.format(this.maxText, this.maxValue)); + return false; + } + return true; + }, + + parseValue : function(value){ + return parseFloat(String(value).replace(this.decimalSeparator, ".")); + }, + + 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); + }, + + decimalPrecisionFcn : function(v){ + return Math.floor(v); + } +}); + +Ext.form.DateField = function(config){ + Ext.form.DateField.superclass.constructor.call(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 = null; + 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 + ")"); + } +}; + +Ext.extend(Ext.form.DateField, Ext.form.TriggerField, { + + format : "m/d/y", + + disabledDays : null, + + disabledDaysText : "Disabled", + + disabledDates : null, + + disabledDatesText : "Disabled", + + minValue : null, + + maxValue : null, + + minText : "The date in this field must be after {0}", + + maxText : "The date in this field must be before {0}", + + invalidText : "{0} is not a valid date - it must be in the format {1}", + + triggerClass : 'x-form-date-trigger', + + + defaultAutoCreate : {tag: "input", type: "text", size: "10", autocomplete: "off"}, + + validateValue : function(value){ + value = this.formatDate(value); + if(!Ext.form.DateField.superclass.validateValue.call(this, value)){ + return false; + } + if(value.length < 1){ return true; + } + var svalue = value; + value = this.parseDate(value); + if(!value){ + this.markInvalid(String.format(this.invalidText, svalue, this.format)); + return false; + } + var time = value.getTime(); + if(this.minValue && time < this.minValue.getTime()){ + this.markInvalid(String.format(this.minText, this.formatDate(this.minValue))); + return false; + } + if(this.maxValue && time > this.maxValue.getTime()){ + this.markInvalid(String.format(this.maxText, this.formatDate(this.maxValue))); + return false; + } + if(this.disabledDays){ + var day = value.getDay(); + for(var i = 0; i < this.disabledDays.length; i++) { + if(day === this.disabledDays[i]){ + this.markInvalid(this.disabledDaysText); + return false; + } + } + } + var fvalue = this.formatDate(value); + if(this.ddMatch && this.ddMatch.test(fvalue)){ + this.markInvalid(String.format(this.disabledDatesText, fvalue)); + return false; + } + return true; + }, + + validateBlur : function(){ + return !this.menu || !this.menu.isVisible(); + }, + + + getValue : function(){ + return this.parseDate(Ext.form.DateField.superclass.getValue.call(this)) || ""; + }, + + + setValue : function(date){ + Ext.form.DateField.superclass.setValue.call(this, this.formatDate(this.parseDate(date))); + }, + + parseDate : function(value){ + return (!value || value instanceof Date) ? + value : Date.parseDate(value, this.format); + }, + + formatDate : function(date){ + return (!date || !(date instanceof Date)) ? + date : date.dateFormat(this.format); + }, + + menuListeners : { + select: function(m, d){ + this.setValue(d); + }, + show : function(){ this.onFocus(); + }, + hide : function(){ + this.focus(); + var ml = this.menuListeners; + this.menu.un("select", ml.select, this); + this.menu.un("show", ml.show, this); + this.menu.un("hide", ml.hide, this); + } + }, + + onTriggerClick : function(){ + if(this.disabled){ + return; + } + if(this.menu == null){ + this.menu = new Ext.menu.DateMenu(); + } + Ext.apply(this.menu.picker, { + minDate : this.minValue, + maxDate : this.maxValue, + disabledDatesRE : this.ddMatch, + disabledDatesText : this.disabledDatesText, + disabledDays : this.disabledDays, + disabledDaysText : this.disabledDaysText, + format : this.format, + minText : String.format(this.minText, this.formatDate(this.minValue)), + maxText : String.format(this.maxText, this.formatDate(this.maxValue)) + }); + this.menu.on(Ext.apply({}, this.menuListeners, { + scope:this + })); + this.menu.picker.setValue(this.getValue() || new Date()); + this.menu.show(this.el, "tl-bl?"); + } +}); + +Ext.form.Checkbox = function(config){ + Ext.form.Checkbox.superclass.constructor.call(this, config); + this.addEvents({ + + check : true + }); +}; + +Ext.extend(Ext.form.Checkbox, Ext.form.Field, { + + focusClass : "x-form-check-focus", + + fieldClass: "x-form-field", + + checked: false, + + defaultAutoCreate : { tag: "input", type: 'checkbox', autocomplete: "off"}, + + boxLabel : undefined, + + + setSize : function(w, h){ + if(!this.wrap){ + this.width = w; + this.height = h; + return; + } + this.wrap.setSize(w, h); + if(!this.boxLabel){ + this.el.alignTo(this.wrap, 'c-c'); + } + }, + + initEvents : function(){ + Ext.form.Checkbox.superclass.initEvents.call(this); + this.el.on("click", this.onClick, this); + this.el.on("change", this.onClick, this); + }, + + + onRender : function(ct, position){ + Ext.form.Checkbox.superclass.onRender.call(this, ct, position); + if(this.inputValue !== undefined){ + this.el.dom.value = this.inputValue; + } + this.wrap = this.el.wrap({cls: "x-form-check-wrap"}); + if(this.boxLabel){ + this.wrap.createChild({tag: 'label', htmlFor: this.el.id, cls: 'x-form-cb-label', html: this.boxLabel}); + } + if(this.checked){ + this.setValue(true); + } + }, + + initValue : Ext.emptyFn, + + + getValue : function(){ + if(this.rendered){ + return this.el.dom.checked; + } + return false; + }, + + onClick : function(){ + if(this.el.dom.checked != this.checked){ + this.setValue(this.el.dom.checked); + } + }, + + + setValue : function(v){ + this.checked = (v === true || v === 'true' || v == '1'); + if(this.el && this.el.dom){ + this.el.dom.checked = this.checked; + } + this.fireEvent("check", this, this.checked); + } +}); + +Ext.form.Radio = function(){ + Ext.form.Radio.superclass.constructor.apply(this, arguments); +}; +Ext.extend(Ext.form.Radio, Ext.form.Checkbox, { + inputType: 'radio' +}); + +Ext.form.ComboBox = function(config){ + Ext.form.ComboBox.superclass.constructor.call(this, config); + this.addEvents({ + + 'expand' : true, + + 'collapse' : true, + + 'beforeselect' : true, + + 'select' : true, + + 'beforequery': true + }); + if(this.transform){ + var s = Ext.getDom(this.transform); + if(!this.hiddenName){ + this.hiddenName = s.name; + } + if(!this.store){ + this.mode = 'local'; + var d = [], opts = s.options; + for(var i = 0, len = opts.length;i < len; i++){ + var o = opts[i]; + var value = (Ext.isIE ? o.getAttributeNode('value').specified : o.hasAttribute('value')) ? o.value : o.text; + if(o.selected) { + this.value = value; + } + d.push([value, o.text]); + } + this.store = new Ext.data.SimpleStore({ + 'id': 0, + fields: ['value', 'text'], + data : d + }); + this.valueField = 'value'; + this.displayField = 'text'; + } + s.name = Ext.id(); if(!this.lazyRender){ + this.target = true; + this.el = Ext.DomHelper.insertBefore(s, this.autoCreate || this.defaultAutoCreate); + s.parentNode.removeChild(s); this.render(this.el.parentNode); + }else{ + s.parentNode.removeChild(s); } + + } + this.selectedIndex = -1; + if(this.mode == 'local'){ + if(config.queryDelay === undefined){ + this.queryDelay = 10; + } + if(config.minChars === undefined){ + this.minChars = 0; + } + } +}; + +Ext.extend(Ext.form.ComboBox, Ext.form.TriggerField, { + + + + + defaultAutoCreate : {tag: "input", type: "text", size: "24", autocomplete: "off"}, + + listWidth: undefined, + + displayField: undefined, + + valueField: undefined, + + hiddenName: undefined, + + listClass: '', + + selectedClass: 'x-combo-selected', + + triggerClass : 'x-form-arrow-trigger', + + shadow:'sides', + + listAlign: 'tl-bl?', + + maxHeight: 300, + + triggerAction: 'query', + + minChars : 4, + + typeAhead: false, + + queryDelay: 500, + + pageSize: 0, + + selectOnFocus:false, + + queryParam: 'query', + + loadingText: 'Loading...', + + resizable: false, + + handleHeight : 8, + + editable: true, + + allQuery: '', + + mode: 'remote', + + minListWidth : 70, + + forceSelection:false, + + typeAheadDelay : 250, + + valueNotFoundText : undefined, + + onRender : function(ct, position){ + Ext.form.ComboBox.superclass.onRender.call(this, ct, position); + if(this.hiddenName){ + this.hiddenField = this.el.insertSibling({tag:'input', type:'hidden', name: this.hiddenName, id: this.hiddenName}, + 'before', true); + this.hiddenField.value = + this.hiddenValue !== undefined ? this.hiddenValue : + this.value !== undefined ? this.value : ''; + + this.el.dom.removeAttribute('name'); + } + if(Ext.isGecko){ + this.el.dom.setAttribute('autocomplete', 'off'); + } + + var cls = 'x-combo-list'; + + this.list = new Ext.Layer({ + shadow: this.shadow, cls: [cls, this.listClass].join(' '), constrain:false + }); + + this.list.setWidth(this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth)); + this.list.swallowEvent('mousewheel'); + this.assetHeight = 0; + + if(this.title){ + this.header = this.list.createChild({cls:cls+'-hd', html: this.title}); + this.assetHeight += this.header.getHeight(); + } + + this.innerList = this.list.createChild({cls:cls+'-inner'}); + this.innerList.on('mouseover', this.onViewOver, this); + this.innerList.on('mousemove', this.onViewMove, this); + + if(this.pageSize){ + this.footer = this.list.createChild({cls:cls+'-ft'}); + this.pageTb = new Ext.PagingToolbar(this.footer, this.store, + {pageSize: this.pageSize}); + this.assetHeight += this.footer.getHeight(); + } + + if(!this.tpl){ + this.tpl = '
        {' + this.displayField + '}
        '; + } + + this.view = new Ext.View(this.innerList, this.tpl, { + singleSelect:true, store: this.store, selectedClass: this.selectedClass + }); + + this.view.on('click', this.onViewClick, this); + + this.store.on('beforeload', this.onBeforeLoad, this); + this.store.on('load', this.onLoad, this); + this.store.on('loadexception', this.collapse, this); + + if(this.resizable){ + this.resizer = new Ext.Resizable(this.list, { + pinned:true, handles:'se' + }); + this.resizer.on('resize', function(r, w, h){ + this.maxHeight = h-this.handleHeight-this.list.getFrameWidth('tb')-this.assetHeight; + this.listWidth = w; + this.restrictHeight(); + }, this); + this[this.pageSize?'footer':'innerList'].setStyle('margin-bottom', this.handleHeight+'px'); + } + if(!this.editable){ + this.editable = true; + this.setEditable(false); + } + }, + + initEvents : function(){ + Ext.form.ComboBox.superclass.initEvents.call(this); + + this.keyNav = new Ext.KeyNav(this.el, { + "up" : function(e){ + this.inKeyMode = true; + this.selectPrev(); + }, + + "down" : function(e){ + if(!this.isExpanded()){ + this.onTriggerClick(); + }else{ + this.inKeyMode = true; + this.selectNext(); + } + }, + + "enter" : function(e){ + this.onViewClick(); + }, + + "esc" : function(e){ + this.collapse(); + }, + + "tab" : function(e){ + this.onViewClick(false); + return true; + }, + + scope : this, + + doRelay : function(foo, bar, hname){ + if(hname == 'down' || this.scope.isExpanded()){ + return Ext.KeyNav.prototype.doRelay.apply(this, arguments); + } + return true; + } + }); + this.queryDelay = Math.max(this.queryDelay || 10, + this.mode == 'local' ? 10 : 250); + this.dqTask = new Ext.util.DelayedTask(this.initQuery, this); + if(this.typeAhead){ + this.taTask = new Ext.util.DelayedTask(this.onTypeAhead, this); + } + if(this.editable !== false){ + this.el.on("keyup", this.onKeyUp, this); + } + if(this.forceSelection){ + this.on('blur', this.doForce, this); + } + }, + + onDestroy : function(){ + if(this.view){ + this.view.setStore(null); + this.view.el.removeAllListeners(); + this.view.el.remove(); + this.view.purgeListeners(); + } + if(this.list){ + this.list.destroy(); + } + if(this.store){ + this.store.un('beforeload', this.onBeforeLoad, this); + this.store.un('load', this.onLoad, this); + this.store.un('loadexception', this.collapse, this); + } + Ext.form.ComboBox.superclass.onDestroy.call(this); + }, + + fireKey : function(e){ + if(e.isNavKeyPress() && !this.list.isVisible()){ + this.fireEvent("specialkey", this, e); + } + }, + + onResize: function(w, h){ + if(this.list && this.listWidth === undefined){ + this.list.setWidth(Math.max(w, this.minListWidth)); + } + }, + + + setEditable : function(value){ + if(value == this.editable){ + return; + } + this.editable = value; + if(!value){ + this.el.dom.setAttribute('readOnly', true); + this.el.on('mousedown', this.onTriggerClick, this); + this.el.addClass('x-combo-noedit'); + }else{ + this.el.dom.setAttribute('readOnly', false); + this.el.un('mousedown', this.onTriggerClick, this); + this.el.removeClass('x-combo-noedit'); + } + }, + + onBeforeLoad : function(){ + if(!this.hasFocus){ + return; + } + this.innerList.update(this.loadingText ? + '
        '+this.loadingText+'
        ' : ''); + this.restrictHeight(); + this.selectedIndex = -1; + }, + + onLoad : function(){ + if(!this.hasFocus){ + return; + } + if(this.store.getCount() > 0){ + this.expand(); + this.restrictHeight(); + if(this.lastQuery == this.allQuery){ + if(this.editable){ + this.el.dom.select(); + } + if(!this.selectByValue(this.value, true)){ + this.select(0, true); + } + }else{ + this.selectNext(); + if(this.typeAhead && this.lastKey != Ext.EventObject.BACKSPACE && this.lastKey != Ext.EventObject.DELETE){ + this.taTask.delay(this.typeAheadDelay); + } + } + }else{ + this.onEmptyResults(); + } + }, + + onTypeAhead : function(){ + if(this.store.getCount() > 0){ + var r = this.store.getAt(0); + var newValue = r.data[this.displayField]; + var len = newValue.length; + var selStart = this.getRawValue().length; + if(selStart != len){ + this.setRawValue(newValue); + this.selectText(selStart, newValue.length); + } + } + }, + + onSelect : function(record, index){ + if(this.fireEvent('beforeselect', this, record, index) !== false){ + this.setValue(record.data[this.valueField || this.displayField]); + this.collapse(); + this.fireEvent('select', this, record, index); + } + }, + + + getValue : function(){ + if(this.valueField){ + return typeof this.value != 'undefined' ? this.value : ''; + }else{ + return Ext.form.ComboBox.superclass.getValue.call(this); + } + }, + + + clearValue : function(){ + if(this.hiddenField){ + this.hiddenField.value = ''; + } + this.setRawValue(''); + this.lastSelectionText = ''; + }, + + + setValue : function(v){ + var text = v; + if(this.valueField){ + var r = this.findRecord(this.valueField, v); + if(r){ + text = r.data[this.displayField]; + }else if(this.valueNotFoundText){ + text = this.valueNotFoundText; + } + } + this.lastSelectionText = text; + if(this.hiddenField){ + this.hiddenField.value = v; + } + Ext.form.ComboBox.superclass.setValue.call(this, text); + this.value = v; + }, + + findRecord : function(prop, value){ + var record; + if(this.store.getCount() > 0){ + this.store.each(function(r){ + if(r.data[prop] == value){ + record = r; + return false; + } + }); + } + return record; + }, + + onViewMove : function(e, t){ + this.inKeyMode = false; + }, + + onViewOver : function(e, t){ + if(this.inKeyMode){ return; + } + var item = this.view.findItemFromChild(t); + if(item){ + var index = this.view.indexOf(item); + this.select(index, false); + } + }, + + onViewClick : function(doFocus){ + var index = this.view.getSelectedIndexes()[0]; + var r = this.store.getAt(index); + if(r){ + this.onSelect(r, index); + } + if(doFocus !== false){ + this.el.focus(); + } + }, + + restrictHeight : function(){ + this.innerList.dom.style.height = ''; + var inner = this.innerList.dom; + var h = Math.max(inner.clientHeight, inner.offsetHeight, inner.scrollHeight); + this.innerList.setHeight(h < this.maxHeight ? 'auto' : this.maxHeight); + this.list.beginUpdate(); + this.list.setHeight(this.innerList.getHeight()+this.list.getFrameWidth('tb')+(this.resizable?this.handleHeight:0)+this.assetHeight); + this.list.alignTo(this.el, this.listAlign); + this.list.endUpdate(); + }, + + onEmptyResults : function(){ + this.collapse(); + }, + + + isExpanded : function(){ + return this.list.isVisible(); + }, + + + selectByValue : function(v, scrollIntoView){ + if(v !== undefined && v !== null){ + var r = this.findRecord(this.valueField || this.displayField, v); + if(r){ + this.select(this.store.indexOf(r), scrollIntoView); + return true; + } + } + return false; + }, + + + select : function(index, scrollIntoView){ + this.selectedIndex = index; + this.view.select(index); + if(scrollIntoView !== false){ + var el = this.view.getNode(index); + if(el){ + this.innerList.scrollChildIntoView(el); + } + } + }, + + + selectNext : function(){ + var ct = this.store.getCount(); + if(ct > 0){ + if(this.selectedIndex == -1){ + this.select(0); + }else if(this.selectedIndex < ct-1){ + this.select(this.selectedIndex+1); + } + } + }, + + + selectPrev : function(){ + var ct = this.store.getCount(); + if(ct > 0){ + if(this.selectedIndex == -1){ + this.select(0); + }else if(this.selectedIndex != 0){ + this.select(this.selectedIndex-1); + } + } + }, + + onKeyUp : function(e){ + if(this.editable !== false && !e.isSpecialKey()){ + this.lastKey = e.getKey(); + this.dqTask.delay(this.queryDelay); + } + }, + + validateBlur : function(){ + return !this.list || !this.list.isVisible(); + }, + + initQuery : function(){ + this.doQuery(this.getRawValue()); + }, + + doForce : function(){ + if(this.el.dom.value.length > 0){ + this.el.dom.value = + this.lastSelectionText === undefined ? '' : this.lastSelectionText; + this.applyEmptyText(); + } + }, + + + doQuery : function(q, forceAll){ + if(q === undefined || q === null){ + q = ''; + } + var qe = { + query: q, + forceAll: forceAll, + combo: this, + cancel:false + }; + if(this.fireEvent('beforequery', qe)===false || qe.cancel){ + return false; + } + q = qe.query; + forceAll = qe.forceAll; + if(forceAll === true || (q.length >= this.minChars)){ + if(this.lastQuery != q){ + this.lastQuery = q; + if(this.mode == 'local'){ + this.selectedIndex = -1; + if(forceAll){ + this.store.clearFilter(); + }else{ + this.store.filter(this.displayField, q); + } + this.onLoad(); + }else{ + this.store.baseParams[this.queryParam] = q; + this.store.load({ + params: this.getParams(q) + }); + this.expand(); + } + }else{ + this.selectedIndex = -1; + this.onLoad(); + } + } + }, + + getParams : function(q){ + var p = {}; + if(this.pageSize){ + p.start = 0; + p.limit = this.pageSize; + } + return p; + }, + + + collapse : function(){ + if(!this.isExpanded()){ + return; + } + this.list.hide(); + Ext.get(document).un('mousedown', this.collapseIf, this); + this.fireEvent('collapse', this); + }, + + collapseIf : function(e){ + if(!e.within(this.wrap) && !e.within(this.list)){ + this.collapse(); + } + }, + + + expand : function(){ + if(this.isExpanded() || !this.hasFocus){ + return; + } + this.list.alignTo(this.el, this.listAlign); + this.list.show(); + Ext.get(document).on('mousedown', this.collapseIf, this); + this.fireEvent('expand', this); + }, + + onTriggerClick : function(){ + if(this.disabled){ + return; + } + if(this.isExpanded()){ + this.collapse(); + this.el.focus(); + }else{ + this.hasFocus = true; + this.doQuery(this.triggerAction == 'all' ? + this.doQuery(this.allQuery, true) : this.doQuery(this.getRawValue())); + this.el.focus(); + } + } +}); + +Ext.Editor = function(field, config){ + Ext.Editor.superclass.constructor.call(this, config); + this.field = field; + this.addEvents({ + + "beforestartedit" : true, + + "startedit" : true, + + "beforecomplete" : true, + + "complete" : true, + + "specialkey" : true + }); +}; + +Ext.extend(Ext.Editor, Ext.Component, { + + + + + value : "", + + alignment: "c-c?", + + shadow : "frame", + + updateEl : false, + + onRender : function(ct, position){ + this.el = new Ext.Layer({ + shadow: this.shadow, + cls: "x-editor", + parentEl : ct, + shim : this.shim, + shadowOffset:3, + id: this.id + }); + this.el.setStyle("overflow", Ext.isGecko ? "auto" : "hidden"); + this.field.render(this.el); + if(Ext.isGecko){ + this.field.el.dom.setAttribute('autocomplete', 'off'); + } + this.field.show(); + this.field.on("blur", this.onBlur, this); + this.relayEvents(this.field, ["specialkey"]); + if(this.field.grow){ + this.field.on("autosize", this.el.sync, this.el, {delay:1}); + } + }, + + startEdit : function(el, value){ + if(this.editing){ + this.completeEdit(); + } + this.boundEl = Ext.get(el); + var v = value !== undefined ? value : this.boundEl.dom.innerHTML; + if(!this.rendered){ + this.render(this.parentEl || document.body); + } + if(this.fireEvent("beforestartedit", this, this.boundEl, v) === false){ + return; + } + this.startValue = v; + this.field.setValue(v); + if(this.autoSize){ + var sz = this.boundEl.getSize(); + switch(this.autoSize){ + case "width": + this.setSize(sz.width, ""); + break; + case "height": + this.setSize("", sz.height); + break; + default: + this.setSize(sz.width, sz.height); + } + } + this.el.alignTo(this.boundEl, this.alignment); + this.editing = true; + if(Ext.QuickTips){ + Ext.QuickTips.disable(); + } + this.show(); + }, + + + setSize : function(w, h){ + this.field.setSize(w, h); + if(this.el){ + this.el.sync(); + } + }, + + + realign : function(){ + this.el.alignTo(this.boundEl, this.alignment); + }, + + + completeEdit : function(remainVisible){ + if(!this.editing){ + return; + } + var v = this.getValue(); + if(this.revertInvalid !== false && !this.field.isValid()){ + v = this.startValue; + this.cancelEdit(true); + } + if(String(v) == String(this.startValue) && this.ignoreNoChange){ + this.editing = false; + this.hide(); + return; + } + if(this.fireEvent("beforecomplete", this, v, this.startValue) !== false){ + this.editing = false; + if(this.updateEl && this.boundEl){ + this.boundEl.update(v); + } + if(remainVisible !== true){ + this.hide(); + } + this.fireEvent("complete", this, v, this.startValue); + } + }, + + onShow : function(){ + this.el.show(); + if(this.hideEl !== false){ + this.boundEl.hide(); + } + this.field.show(); + this.field.focus(); + this.fireEvent("startedit", this.boundEl, this.startValue); + }, + + + cancelEdit : function(remainVisible){ + if(this.editing){ + this.setValue(this.startValue); + if(remainVisible !== true){ + this.hide(); + } + } + }, + + onBlur : function(){ + if(this.allowBlur !== true && this.editing){ + this.completeEdit(); + } + }, + + onHide : function(){ + if(this.editing){ + this.completeEdit(); + return; + } + this.field.blur(); + if(this.field.collapse){ + this.field.collapse(); + } + this.el.hide(); + if(this.hideEl !== false){ + this.boundEl.show(); + } + if(Ext.QuickTips){ + Ext.QuickTips.enable(); + } + }, + + + setValue : function(v){ + this.field.setValue(v); + }, + + + getValue : function(){ + return this.field.getValue(); + } +}); + +Ext.form.BasicForm = function(el, config){ + Ext.apply(this, config); + + this.items = new Ext.util.MixedCollection(false, function(o){ + return o.id || (o.id = Ext.id()); + }); + this.addEvents({ + + beforeaction: true, + + actionfailed : true, + + actioncomplete : true + }); + if(el){ + this.initEl(el); + } + Ext.form.BasicForm.superclass.constructor.call(this); +}; + +Ext.extend(Ext.form.BasicForm, Ext.util.Observable, { + + + + + + + + timeout: 30, + + activeAction : null, + + + waitMsgTarget : undefined, + + initEl : function(el){ + this.el = Ext.get(el); + this.id = this.el.id || Ext.id(); + this.el.on('submit', this.onSubmit, this); + this.el.addClass('x-form'); + }, + + onSubmit : function(e){ + e.stopEvent(); + }, + + + isValid : function(){ + var valid = true; + this.items.each(function(f){ + if(!f.validate()){ + valid = false; + } + }); + return valid; + }, + + + doAction : function(action, options){ + if(typeof action == 'string'){ + action = new Ext.form.Action.ACTION_TYPES[action](this, options); + } + if(this.fireEvent('beforeaction', this, action) !== false){ + this.beforeAction(action); + action.run.defer(100, action); + } + }, + + + submit : function(options){ + this.doAction('submit', options); + }, + + + load : function(options){ + this.doAction('load', options); + }, + + + updateRecord : function(record){ + record.beginEdit(); + var fs = record.fields; + fs.each(function(f){ + var field = this.findField(f.name); + if(field){ + record.set(f.name, field.getValue()); + } + }, this); + record.endEdit(); + }, + + beforeAction : function(action){ + var o = action.options; + if(o.waitMsg){ + if(this.waitMsgTarget === true){ + this.el.mask(o.waitMsg, 'x-mask-loading'); + }else if(this.waitMsgTarget){ + this.waitMsgTarget = Ext.get(this.waitMsgTarget); + this.waitMsgTarget.mask(o.waitMsg, 'x-mask-loading'); + }else{ + Ext.MessageBox.wait(o.waitMsg, o.waitTitle || this.waitTitle || 'Please Wait...'); + } + } + }, + + afterAction : function(action, success){ + this.activeAction = null; + var o = action.options; + if(o.waitMsg){ + if(this.waitMsgTarget === true){ + this.el.unmask(); + }else if(this.waitMsgTarget){ + this.waitMsgTarget.unmask(); + }else{ + Ext.MessageBox.updateProgress(1); + Ext.MessageBox.hide(); + } + } + if(success){ + if(o.reset){ + this.reset(); + } + Ext.callback(o.success, o.scope, [this, action]); + this.fireEvent('actioncomplete', this, action); + }else{ + Ext.callback(o.failure, o.scope, [this, action]); + this.fireEvent('actionfailed', this, action); + } + }, + + + findField : function(id){ + var field = this.items.get(id); + if(!field){ + this.items.each(function(f){ + if(f.isFormField && (f.dataIndex == id || f.id == id || f.getName() == id)){ + field = f; + return false; + } + }); + } + return field || null; + }, + + + + markInvalid : function(errors){ + if(errors instanceof Array){ + for(var i = 0, len = errors.length; i < len; i++){ + var fieldError = errors[i]; + var f = this.findField(fieldError.id); + if(f){ + f.markInvalid(fieldError.msg); + } + } + }else{ + var field, id; + for(id in errors){ + if(typeof errors[id] != 'function' && (field = this.findField(id))){ + field.markInvalid(errors[id]); + } + } + } + }, + + + setValues : function(values){ + if(values instanceof Array){ for(var i = 0, len = values.length; i < len; i++){ + var v = values[i]; + var f = this.findField(v.id); + if(f){ + f.setValue(v.value); + } + } + }else{ var field, id; + for(id in values){ + if(typeof values[id] != 'function' && (field = this.findField(id))){ + field.setValue(values[id]); + } + } + } + }, + + + getValues : function(asString){ + var fs = Ext.lib.Ajax.serializeForm(this.el.dom); + if(asString === true){ + return fs; + } + return Ext.urlDecode(fs); + }, + + + clearInvalid : function(){ + this.items.each(function(f){ + f.clearInvalid(); + }); + }, + + + reset : function(){ + this.items.each(function(f){ + f.reset(); + }); + }, + + + add : function(){ + this.items.addAll(Array.prototype.slice.call(arguments, 0)); + }, + + + + remove : function(field){ + this.items.remove(field); + }, + + + render : function(){ + this.items.each(function(f){ + if(f.isFormField && !f.rendered && document.getElementById(f.id)){ f.applyTo(f.id); + } + }); + }, + + + applyToFields : function(o){ + this.items.each(function(f){ + Ext.apply(f, o); + }); + }, + + + applyIfToFields : function(o){ + this.items.each(function(f){ + Ext.applyIf(f, o); + }); + } +}); + +Ext.BasicForm = Ext.form.BasicForm; + +Ext.form.Form = function(config){ + Ext.form.Form.superclass.constructor.call(this, null, config); + this.url = this.url || this.action; + if(!this.root){ + this.root = new Ext.form.Layout(Ext.applyIf({ + id: Ext.id() + }, config)); + } + this.active = this.root; + + this.buttons = []; + this.addEvents({ + + clientvalidation: true + }); +}; + +Ext.extend(Ext.form.Form, Ext.form.BasicForm, { + + + + buttonAlign:'center', + + + minButtonWidth:75, + + + labelAlign:'left', + + + monitorValid : false, + + + monitorPoll : 200, + + + column : function(c){ + var col = new Ext.form.Column(c); + this.start(col); + if(arguments.length > 1){ this.add.apply(this, Array.prototype.slice.call(arguments, 1)); + this.end(); + } + return col; + }, + + + fieldset : function(c){ + var fs = new Ext.form.FieldSet(c); + this.start(fs); + if(arguments.length > 1){ this.add.apply(this, Array.prototype.slice.call(arguments, 1)); + this.end(); + } + return fs; + }, + + + container : function(c){ + var l = new Ext.form.Layout(c); + this.start(l); + if(arguments.length > 1){ this.add.apply(this, Array.prototype.slice.call(arguments, 1)); + this.end(); + } + return l; + }, + + + start : function(c){ + Ext.applyIf(c, {'labelAlign': this.active.labelAlign, 'labelWidth': this.active.labelWidth, 'itemCls': this.active.itemCls}); + this.active.stack.push(c); + c.ownerCt = this.active; + this.active = c; + return this; + }, + + + end : function(){ + if(this.active == this.root){ + return this; + } + this.active = this.active.ownerCt; + return this; + }, + + + add : function(){ + this.active.stack.push.apply(this.active.stack, arguments); + var r = []; + for(var i = 0, a = arguments, len = a.length; i < len; i++) { + if(a[i].isFormField){ + r.push(a[i]); + } + } + if(r.length > 0){ + Ext.form.Form.superclass.add.apply(this, r); + } + return this; + }, + + + render : function(ct){ + ct = Ext.get(ct); + var o = this.autoCreate || { + tag: 'form', + method : this.method || 'POST', + id : this.id || Ext.id() + }; + this.initEl(ct.createChild(o)); + + this.root.render(this.el); + + this.items.each(function(f){ + f.render('x-form-el-'+f.id); + }); + + if(this.buttons.length > 0){ + var tb = this.el.createChild({cls:'x-form-btns-ct', cn: { + cls:"x-form-btns x-form-btns-"+this.buttonAlign, + html:'
        ' + }}, null, true); + var tr = tb.getElementsByTagName('tr')[0]; + for(var i = 0, len = this.buttons.length; i < len; i++) { + var b = this.buttons[i]; + var td = document.createElement('td'); + td.className = 'x-form-btn-td'; + b.render(tr.appendChild(td)); + } + } + if(this.monitorValid){ this.startMonitoring(); + } + return this; + }, + + + addButton : function(config, handler, scope){ + var bc = { + handler: handler, + scope: scope, + minWidth: this.minButtonWidth, + hideParent:true + }; + if(typeof config == "string"){ + bc.text = config; + }else{ + Ext.apply(bc, config); + } + var btn = new Ext.Button(null, bc); + this.buttons.push(btn); + return btn; + }, + + + startMonitoring : function(){ + if(!this.bound){ + this.bound = true; + Ext.TaskMgr.start({ + run : this.bindHandler, + interval : this.monitorPoll || 200, + scope: this + }); + } + }, + + + stopMonitoring : function(){ + this.bound = false; + }, + + bindHandler : function(){ + if(!this.bound){ + return false; } + var valid = true; + this.items.each(function(f){ + if(!f.isValid(true)){ + valid = false; + return false; + } + }); + for(var i = 0, len = this.buttons.length; i < len; i++){ + var btn = this.buttons[i]; + if(btn.formBind === true && btn.disabled === valid){ + btn.setDisabled(!valid); + } + } + this.fireEvent('clientvalidation', this, valid); + } +}); + + +Ext.Form = Ext.form.Form; + + +Ext.form.Action = function(form, options){ + this.form = form; + this.options = options || {}; +}; + +Ext.form.Action.CLIENT_INVALID = 'client'; +Ext.form.Action.SERVER_INVALID = 'server'; +Ext.form.Action.CONNECT_FAILURE = 'connect'; +Ext.form.Action.LOAD_FAILURE = 'load'; + +Ext.form.Action.prototype = { + type : 'default', + failureType : undefined, + response : undefined, + result : undefined, + + run : function(options){ + + }, + + success : function(response){ + + }, + + handleResponse : function(response){ + + }, + + failure : function(response){ + this.response = response; + this.failureType = Ext.form.Action.CONNECT_FAILURE; + this.form.afterAction(this, false); + }, + + processResponse : function(response){ + this.response = response; + if(!response.responseText){ + return true; + } + this.result = this.handleResponse(response); + return this.result; + }, + + getUrl : function(appendParams){ + var url = this.options.url || this.form.url || this.form.el.dom.action; + if(appendParams){ + var p = this.getParams(); + if(p){ + url += (url.indexOf('?') != -1 ? '&' : '?') + p; + } + } + return url; + }, + + getMethod : function(){ + return (this.options.method || this.form.method || this.form.el.dom.method || 'POST').toUpperCase(); + }, + + getParams : function(){ + var bp = this.form.baseParams; + var p = this.options.params; + if(p){ + if(typeof p == "object"){ + p = Ext.urlEncode(Ext.applyIf(p, bp)); + }else if(typeof p == 'string' && bp){ + p += '&' + Ext.urlEncode(bp); + } + }else if(bp){ + p = Ext.urlEncode(bp); + } + return p; + }, + + createCallback : function(){ + return { + success: this.success, + failure: this.failure, + scope: this, + timeout: (this.form.timeout*1000), + upload: this.form.fileUpload ? this.success : undefined + }; + } +}; + +Ext.form.Action.Submit = function(form, options){ + Ext.form.Action.Submit.superclass.constructor.call(this, form, options); +}; + +Ext.extend(Ext.form.Action.Submit, Ext.form.Action, { + type : 'submit', + + run : function(){ + var o = this.options; + var isPost = this.getMethod() == 'POST'; + if(o.clientValidation === false || this.form.isValid()){ + Ext.lib.Ajax.formRequest( + this.form.el.dom, + this.getUrl(!isPost), + this.createCallback(), + isPost ? this.getParams() : null, this.form.fileUpload, Ext.SSL_SECURE_URL); + + }else if (o.clientValidation !== false){ this.failureType = Ext.form.Action.CLIENT_INVALID; + this.form.afterAction(this, false); + } + }, + + success : function(response){ + var result = this.processResponse(response); + if(result === true || result.success){ + this.form.afterAction(this, true); + return; + } + if(result.errors){ + this.form.markInvalid(result.errors); + this.failureType = Ext.form.Action.SERVER_INVALID; + } + this.form.afterAction(this, false); + }, + + handleResponse : function(response){ + if(this.form.errorReader){ + var rs = this.form.errorReader.read(response); + var errors = []; + if(rs.records){ + for(var i = 0, len = rs.records.length; i < len; i++) { + var r = rs.records[i]; + errors[i] = r.data; + } + } + if(errors.length < 1){ + errors = null; + } + return { + success : rs.success, + errors : errors + }; + } + return Ext.decode(response.responseText); + } +}); + + +Ext.form.Action.Load = function(form, options){ + Ext.form.Action.Load.superclass.constructor.call(this, form, options); + this.reader = this.form.reader; +}; + +Ext.extend(Ext.form.Action.Load, Ext.form.Action, { + type : 'load', + + run : function(){ + Ext.lib.Ajax.request( + this.getMethod(), + this.getUrl(false), + this.createCallback(), + this.getParams()); + }, + + success : function(response){ + var result = this.processResponse(response); + if(result === true || !result.success || !result.data){ + this.failureType = Ext.form.Action.LOAD_FAILURE; + this.form.afterAction(this, false); + return; + } + this.form.clearInvalid(); + this.form.setValues(result.data); + this.form.afterAction(this, true); + }, + + handleResponse : function(response){ + if(this.form.reader){ + var rs = this.form.reader.read(response); + var data = rs.records && rs.records[0] ? rs.records[0].data : null; + return { + success : rs.success, + data : data + }; + } + return Ext.decode(response.responseText); + } +}); + +Ext.form.Action.ACTION_TYPES = { + 'load' : Ext.form.Action.Load, + 'submit' : Ext.form.Action.Submit +}; + + +Ext.form.Layout = function(config){ + Ext.form.Layout.superclass.constructor.call(this, config); + this.stack = []; +}; + +Ext.extend(Ext.form.Layout, Ext.Component, { + + + + + + clear : true, + + labelSeparator : ':', + + hideLabels : false, + + defaultAutoCreate : {tag: 'div', cls: 'x-form-ct'}, + + onRender : function(ct, position){ + if(this.el){ this.el = Ext.get(this.el); + }else { var cfg = this.getAutoCreate(); + this.el = ct.createChild(cfg, position); + } + if(this.style){ + this.el.applyStyles(this.style); + } + if(this.labelAlign){ + this.el.addClass('x-form-label-'+this.labelAlign); + } + if(this.hideLabels){ + this.labelStyle = "display:none"; + this.elementStyle = "padding-left:0;"; + }else{ + if(typeof this.labelWidth == 'number'){ + this.labelStyle = "width:"+this.labelWidth+"px;"; + this.elementStyle = "padding-left:"+((this.labelWidth+(typeof this.labelPad == 'number' ? this.labelPad : 5))+'px')+";"; + } + if(this.labelAlign == 'top'){ + this.labelStyle = "width:auto;"; + this.elementStyle = "padding-left:0;"; + } + } + var stack = this.stack; + var slen = stack.length; + if(slen > 0){ + if(!this.fieldTpl){ + var t = new Ext.Template( + '
        ', + '', + '
        ', + '
        ', + '
        ' + ); + t.disableFormats = true; + t.compile(); + Ext.form.Layout.prototype.fieldTpl = t; + } + for(var i = 0; i < slen; i++) { + if(stack[i].isFormField){ + this.renderField(stack[i]); + }else{ + this.renderComponent(stack[i]); + } + } + } + if(this.clear){ + this.el.createChild({cls:'x-form-clear'}); + } + }, + + renderField : function(f){ + this.fieldTpl.append(this.el, [ + f.id, f.fieldLabel, + f.labelStyle||this.labelStyle||'', + this.elementStyle||'', + typeof f.labelSeparator == 'undefined' ? this.labelSeparator : f.labelSeparator, + f.itemCls||this.itemCls||'' + ]); + }, + + renderComponent : function(c){ + c.render(this.el); + } +}); + + +Ext.form.Column = function(config){ + Ext.form.Column.superclass.constructor.call(this, config); +}; + +Ext.extend(Ext.form.Column, Ext.form.Layout, { + + + + defaultAutoCreate : {tag: 'div', cls: 'x-form-ct x-form-column'}, + + onRender : function(ct, position){ + Ext.form.Column.superclass.onRender.call(this, ct, position); + if(this.width){ + this.el.setWidth(this.width); + } + } +}); + + +Ext.form.FieldSet = function(config){ + Ext.form.FieldSet.superclass.constructor.call(this, config); +}; + +Ext.extend(Ext.form.FieldSet, Ext.form.Layout, { + + + + defaultAutoCreate : {tag: 'fieldset', cn: {tag:'legend'}}, + + onRender : function(ct, position){ + Ext.form.FieldSet.superclass.onRender.call(this, ct, position); + if(this.legend){ + this.setLegend(this.legend); + } + }, + + setLegend : function(text){ + if(this.rendered){ + this.el.child('legend').update(text); + } + } +}); + +Ext.form.VTypes = function(){ + var alpha = /^[a-zA-Z_]+$/; + var alphanum = /^[a-zA-Z0-9_]+$/; + var email = /^([\w]+)(.[\w]+)*@([\w-]+\.){1,5}([A-Za-z]){2,4}$/; + var url = /(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i; + + return { + + 'email' : function(v){ + return email.test(v); + }, + + 'emailText' : 'This field should be an e-mail address in the format "user@domain.com"', + + 'emailMask' : /[a-z0-9_\.\-@]/i, + + + 'url' : function(v){ + return url.test(v); + }, + + 'urlText' : 'This field should be a URL in the format "http:/'+'/www.domain.com"', + + + 'alpha' : function(v){ + return alpha.test(v); + }, + + 'alphaText' : 'This field should only contain letters and _', + + 'alphaMask' : /[a-z_]/i, + + + 'alphanum' : function(v){ + return alphanum.test(v); + }, + + 'alphanumText' : 'This field should only contain letters, numbers and _', + + 'alphanumMask' : /[a-z0-9_]/i + }; +}(); diff --git a/www/extras/yui-ext/package/form/form.js b/www/extras/yui-ext/package/form/form.js new file mode 100644 index 000000000..f65cdeec2 --- /dev/null +++ b/www/extras/yui-ext/package/form/form.js @@ -0,0 +1,38 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.form.Field=function(_1){Ext.form.Field.superclass.constructor.call(this,_1);this.addEvents({focus:true,blur:true,specialkey:true,change:true,invalid:true,valid:true});};Ext.extend(Ext.form.Field,Ext.Component,{invalidClass:"x-form-invalid",invalidText:"The value in this field is invalid",focusClass:"x-form-focus",validationEvent:"keyup",validateOnBlur:true,validationDelay:250,defaultAutoCreate:{tag:"input",type:"text",size:"20",autocomplete:"off"},fieldClass:"x-form-field",msgTarget:"qtip",msgFx:"normal",inputType:undefined,isFormField:true,hasFocus:false,value:undefined,getName:function(){return this.rendered&&this.el.dom.name?this.el.dom.name:(this.hiddenName||"");},applyTo:function(_2){this.target=_2;this.el=Ext.get(_2);this.render(this.el.dom.parentNode);return this;},onRender:function(ct,_4){if(this.el){this.el=Ext.get(this.el);if(!this.target){ct.dom.appendChild(this.el.dom);}}else{var _5=this.getAutoCreate();if(!_5.name){_5.name=this.name||this.id;}if(this.inputType){_5.type=this.inputType;}if(this.tabIndex!==undefined){_5.tabIndex=this.tabIndex;}this.el=ct.createChild(_5,_4);}var _6=this.el.dom.type;if(_6){if(_6=="password"){_6="text";}this.el.addClass("x-form-"+_6);}if(!this.customSize&&(this.width||this.height)){this.setSize(this.width||"",this.height||"");}if(this.readOnly){this.el.dom.readOnly=true;}this.el.addClass([this.fieldClass,this.cls]);this.initValue();},initValue:function(){if(this.value!==undefined){this.setValue(this.value);}else{if(this.el.dom.value.length>0){this.setValue(this.el.dom.value);}}},afterRender:function(){Ext.form.Field.superclass.afterRender.call(this);this.initEvents();},fireKey:function(e){if(e.isNavKeyPress()){this.fireEvent("specialkey",this,e);}},reset:function(){this.setValue(this.originalValue);this.clearInvalid();},initEvents:function(){this.el.on(Ext.isIE?"keydown":"keypress",this.fireKey,this);this.el.on("focus",this.onFocus,this);this.el.on("blur",this.onBlur,this);this.originalValue=this.getValue();},onFocus:function(){if(!Ext.isOpera){this.el.addClass(this.focusClass);}this.hasFocus=true;this.startValue=this.getValue();this.fireEvent("focus",this);},onBlur:function(){this.el.removeClass(this.focusClass);this.hasFocus=false;if(this.validationEvent!==false&&this.validateOnBlur&&this.validationEvent!="blur"){this.validate();}var v=this.getValue();if(v!=this.startValue){this.fireEvent("change",this,v,this.startValue);}this.fireEvent("blur",this);},setSize:function(w,h){if(!this.rendered||!this.el){this.width=w;this.height=h;return;}if(w){w=this.adjustWidth(this.el.dom.tagName,w);this.el.setWidth(w);}if(h){this.el.setHeight(h);}var h=this.el.dom.offsetHeight;},isValid:function(_b){if(this.disabled){return true;}var _c=this.preventMark;this.preventMark=_b===true;var v=this.validateValue(this.getRawValue());this.preventMark=_c;return v;},validate:function(){if(this.disabled||this.validateValue(this.getRawValue())){this.clearInvalid();return true;}return false;},validateValue:function(_e){return true;},markInvalid:function(_f){if(!this.rendered||this.preventMark){return;}this.el.addClass(this.invalidClass);_f=_f||this.invalidText;switch(this.msgTarget){case "qtip":this.el.dom.qtip=_f;this.el.dom.qclass="x-form-invalid-tip";break;case "title":this.el.dom.title=_f;break;case "under":if(!this.errorEl){var elp=this.el.findParent(".x-form-element",5,true);this.errorEl=elp.createChild({cls:"x-form-invalid-msg"});this.errorEl.setWidth(elp.getWidth(true)-20);}this.errorEl.update(_f);Ext.form.Field.msgFx[this.msgFx].show(this.errorEl,this);break;case "side":if(!this.errorIcon){var elp=this.el.findParent(".x-form-element",5,true);this.errorIcon=elp.createChild({cls:"x-form-invalid-icon"});}this.alignErrorIcon();this.errorIcon.dom.qtip=_f;this.errorIcon.dom.qclass="x-form-invalid-tip";this.errorIcon.show();break;default:var t=Ext.getDom(this.msgTarget);t.innerHTML=_f;t.style.display=this.msgDisplay;break;}this.fireEvent("invalid",this,_f);},alignErrorIcon:function(){this.errorIcon.alignTo(this.el,"tl-tr",[2,0]);},clearInvalid:function(){if(!this.rendered||this.preventMark){return;}this.el.removeClass(this.invalidClass);switch(this.msgTarget){case "qtip":this.el.dom.qtip="";break;case "title":this.el.dom.title="";break;case "under":if(this.errorEl){Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl,this);}break;case "side":if(this.errorIcon){this.errorIcon.dom.qtip="";this.errorIcon.hide();}break;default:var t=Ext.getDom(this.msgTarget);t.innerHTML="";t.style.display="none";break;}this.fireEvent("valid",this);},getRawValue:function(){return this.el.getValue();},getValue:function(){var v=this.el.getValue();if(v==this.emptyText||v===undefined){v="";}return v;},setRawValue:function(v){return this.el.dom.value=v;},setValue:function(v){this.value=v;if(this.rendered){this.el.dom.value=v;this.validate();}},adjustWidth:function(tag,w){tag=tag.toLowerCase();if(typeof w=="number"&&Ext.isStrict&&!Ext.isSafari){if(Ext.isIE&&(tag=="input"||tag=="textarea")){if(tag=="input"){return w+2;}if(tag="textarea"){return w-2;}}else{if(Ext.isGecko&&tag=="textarea"){return w-6;}else{if(Ext.isOpera){if(tag=="input"){return w+2;}if(tag="textarea"){return w-2;}}}}}return w;}});Ext.form.Field.msgFx={normal:{show:function(_18,f){_18.setDisplayed("block");},hide:function(_1a,f){_1a.setDisplayed(false).update("");}},slide:{show:function(_1c,f){_1c.slideIn("t",{stopFx:true});},hide:function(_1e,f){_1e.slideOut("t",{stopFx:true,useDisplay:true});}},slideRight:{show:function(_20,f){_20.fixDisplay();_20.alignTo(f.el,"tl-tr");_20.slideIn("l",{stopFx:true});},hide:function(_22,f){_22.slideOut("l",{stopFx:true,useDisplay:true});}}}; + +Ext.form.TextField=function(_1){Ext.form.TextField.superclass.constructor.call(this,_1);this.addEvents({autosize:true});};Ext.extend(Ext.form.TextField,Ext.form.Field,{grow:false,growMin:30,growMax:800,vtype:null,maskRe:null,disableKeyFilter:false,allowBlank:true,minLength:0,maxLength:Number.MAX_VALUE,minLengthText:"The minimum length for this field is {0}",maxLengthText:"The maximum length for this field is {0}",selectOnFocus:false,blankText:"This field is required",validator:null,regex:null,regexText:"",emptyText:null,emptyClass:"x-form-empty-field",initEvents:function(){Ext.form.TextField.superclass.initEvents.call(this);if(this.validationEvent=="keyup"){this.validationTask=new Ext.util.DelayedTask(this.validate,this);this.el.on("keyup",this.filterValidation,this);}else{if(this.validationEvent!==false){this.el.on(this.validationEvent,this.validate,this,{buffer:this.validationDelay});}}if(this.selectOnFocus||this.emptyText){this.on("focus",this.preFocus,this);if(this.emptyText){this.on("blur",this.postBlur,this);this.applyEmptyText();}}if(this.maskRe||(this.vtype&&this.disableKeyFilter!==true&&(this.maskRe=Ext.form.VTypes[this.vtype+"Mask"]))){this.el.on("keypress",this.filterKeys,this);}if(this.grow){this.el.on("keyup",this.onKeyUp,this,{buffer:50});this.el.on("click",this.autoSize,this);}},filterValidation:function(e){if(!e.isNavKeyPress()){this.validationTask.delay(this.validationDelay);}},onKeyUp:function(e){if(!e.isNavKeyPress()){this.autoSize();}},reset:function(){Ext.form.TextField.superclass.reset.call(this);this.applyEmptyText();},applyEmptyText:function(){if(this.rendered&&this.emptyText&&this.getRawValue().length<1){this.setRawValue(this.emptyText);this.el.addClass(this.emptyClass);}},preFocus:function(){if(this.emptyText){if(this.getRawValue()==this.emptyText){this.setRawValue("");}this.el.removeClass(this.emptyClass);}if(this.selectOnFocus){this.el.dom.select();}},postBlur:function(){this.applyEmptyText();},filterKeys:function(e){var k=e.getKey();if(!Ext.isIE&&(e.isNavKeyPress()||k==e.BACKSPACE||(k==e.DELETE&&e.button==-1))){return;}var c=e.getCharCode();if(!this.maskRe.test(String.fromCharCode(c)||"")){e.stopEvent();}},setValue:function(v){if(this.emptyText&&v!==undefined&&v!==null&&v!==""){this.el.removeClass(this.emptyClass);}Ext.form.TextField.superclass.setValue.apply(this,arguments);},validateValue:function(_8){if(_8.length<1||_8===this.emptyText){if(this.allowBlank){this.clearInvalid();return true;}else{this.markInvalid(this.blankText);return false;}}if(_8.lengththis.maxLength){this.markInvalid(String.format(this.maxLengthText,this.maxLength));return false;}if(this.vtype){var vt=Ext.form.VTypes;if(!vt[this.vtype](_8)){this.markInvalid(this.vtypeText||vt[this.vtype+"Text"]);return false;}}if(typeof this.validator=="function"){var _a=this.validator(_8);if(_a!==true){this.markInvalid(_a);return false;}}if(this.regex&&!this.regex.test(_8)){this.markInvalid(this.regexText);return false;}return true;},selectText:function(_b,_c){var v=this.getRawValue();if(v.length>0){_b=_b===undefined?0:_b;_c=_c===undefined?v.length:_c;var d=this.el.dom;if(d.setSelectionRange){d.setSelectionRange(_b,_c);}else{if(d.createTextRange){var _f=d.createTextRange();_f.moveStart("character",_b);_f.moveEnd("character",v.length-_c);_f.select();}}}},autoSize:function(){if(!this.grow||!this.rendered){return;}if(!this.metrics){this.metrics=Ext.util.TextMetrics.createInstance(this.el);}var el=this.el;var v=el.dom.value+" ";var w=Math.min(this.growMax,Math.max(this.metrics.getWidth(v)+10,this.growMin));this.el.setWidth(w);this.fireEvent("autosize",this,w);}}); + +Ext.form.TriggerField=function(_1){Ext.form.TriggerField.superclass.constructor.call(this,_1);this.mimicing=false;this.on("disable",this.disableWrapper,this);this.on("enable",this.enableWrapper,this);};Ext.extend(Ext.form.TriggerField,Ext.form.TextField,{defaultAutoCreate:{tag:"input",type:"text",size:"16",autocomplete:"off"},hideTrigger:false,autoSize:Ext.emptyFn,monitorTab:true,customSize:true,setSize:function(w,h){if(!this.wrap){this.width=w;this.height=h;return;}if(w){var _4=w;w=w-this.trigger.getWidth();Ext.form.TriggerField.superclass.setSize.call(this,w,h);this.wrap.setWidth(_4);if(this.onResize){this.onResize(_4,h);}}else{Ext.form.TriggerField.superclass.setSize.call(this,w,h);this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth());}},alignErrorIcon:function(){this.errorIcon.alignTo(this.wrap,"tl-tr",[2,0]);},onRender:function(ct,_6){Ext.form.TriggerField.superclass.onRender.call(this,ct,_6);this.wrap=this.el.wrap({cls:"x-form-field-wrap"});this.trigger=this.wrap.createChild({tag:"img",src:Ext.BLANK_IMAGE_URL,cls:"x-form-trigger "+this.triggerClass});this.trigger.on("click",this.onTriggerClick,this,{preventDefault:true});this.trigger.addClassOnOver("x-form-trigger-over");this.trigger.addClassOnClick("x-form-trigger-click");if(this.hideTrigger){this.trigger.setDisplayed(false);}this.setSize(this.width||"",this.height||"");},onDestroy:function(){if(this.trigger){this.trigger.removeAllListeners();this.trigger.remove();}if(this.wrap){this.wrap.remove();}Ext.form.TriggerField.superclass.onDestroy.call(this);},onFocus:function(){Ext.form.TriggerField.superclass.onFocus.call(this);if(!this.mimicing){this.mimicing=true;Ext.get(Ext.isIE?document.body:document).on("mousedown",this.mimicBlur,this);if(this.monitorTab){this.el.on("keydown",this.checkTab,this);}}},checkTab:function(e){if(e.getKey()==e.TAB){this.triggerBlur();}},onBlur:function(){},mimicBlur:function(e,t){if(!this.wrap.contains(t)&&this.validateBlur()){this.triggerBlur();}},triggerBlur:function(){this.mimicing=false;Ext.get(Ext.isIE?document.body:document).un("mousedown",this.mimicBlur);if(this.monitorTab){this.el.un("keydown",this.checkTab,this);}Ext.form.TriggerField.superclass.onBlur.call(this);},validateBlur:function(e,t){return true;},disableWrapper:function(){if(this.wrap){this.wrap.addClass("x-item-disabled");}},enableWrapper:function(){if(this.wrap){this.wrap.removeClass("x-item-disabled");}},onShow:function(){if(this.wrap){this.wrap.dom.style.display="";this.wrap.dom.style.visibility="visible";}},onHide:function(){this.wrap.dom.style.display="none";},onTriggerClick:Ext.emptyFn}); + +Ext.form.TextArea=function(_1){Ext.form.TextArea.superclass.constructor.call(this,_1);if(this.minHeight!==undefined){this.growMin=this.minHeight;}if(this.maxHeight!==undefined){this.growMax=this.maxHeight;}};Ext.extend(Ext.form.TextArea,Ext.form.TextField,{growMin:60,growMax:1000,preventScrollbars:false,onRender:function(ct,_3){if(!this.el){this.defaultAutoCreate={tag:"textarea",style:"width:300px;height:60px;",autocomplete:"off"};}Ext.form.TextArea.superclass.onRender.call(this,ct,_3);if(this.grow){this.textSizeEl=Ext.DomHelper.append(document.body,{tag:"pre",cls:"x-form-grow-sizer"});if(this.preventScrollbars){this.el.setStyle("overflow","hidden");}this.el.setHeight(this.growMin);}},onKeyUp:function(e){if(!e.isNavKeyPress()||e.getKey()==e.ENTER){this.autoSize();}},autoSize:function(){if(!this.grow||!this.textSizeEl){return;}var el=this.el;var v=el.dom.value;var ts=this.textSizeEl;Ext.fly(ts).setWidth(this.el.getWidth());if(v.length<1){v="  ";}else{v+=" \n ";}if(Ext.isIE){v=v.replace(/\n/g,"
        ");}ts.innerHTML=v;var h=Math.min(this.growMax,Math.max(ts.offsetHeight,this.growMin));if(h!=this.lastHeight){this.lastHeight=h;this.el.setHeight(h);this.fireEvent("autosize",this,h);}},setValue:function(v){Ext.form.TextArea.superclass.setValue.call(this,v);this.autoSize();}}); + +Ext.form.NumberField=function(_1){Ext.form.NumberField.superclass.constructor.call(this,_1);};Ext.extend(Ext.form.NumberField,Ext.form.TextField,{fieldClass:"x-form-field x-form-num-field",allowDecimals:true,decimalSeparator:".",decimalPrecision:2,allowNegative:true,minValue:Number.NEGATIVE_INFINITY,maxValue:Number.MAX_VALUE,minText:"The minimum value for this field is {0}",maxText:"The maximum value for this field is {0}",nanText:"{0} is not a valid number",initEvents:function(){Ext.form.NumberField.superclass.initEvents.call(this);var _2="0123456789";if(this.allowDecimals){_2+=this.decimalSeparator;}if(this.allowNegative){_2+="-";}var _3=function(e){var k=e.getKey();if(!Ext.isIE&&(e.isNavKeyPress()||k==e.BACKSPACE||(k==e.DELETE&&e.button==-1))){return;}var c=e.getCharCode();if(_2.indexOf(String.fromCharCode(c))===-1){e.stopEvent();}};this.el.on("keypress",_3,this);},validateValue:function(_7){if(!Ext.form.NumberField.superclass.validateValue.call(this,_7)){return false;}if(_7.length<1){return true;}_7=String(_7).replace(this.decimalSeparator,".");if(isNaN(_7)){this.markInvalid(String.format(this.nanText,_7));return false;}var _8=this.parseValue(_7);if(_8this.maxValue){this.markInvalid(String.format(this.maxText,this.maxValue));return false;}return true;},parseValue:function(_9){return parseFloat(String(_9).replace(this.decimalSeparator,"."));},fixPrecision:function(_a){if(!this.allowDecimals||this.decimalPrecision==-1||isNaN(_a)||_a==0||!_a){return _a;}var _b=Math.pow(10,this.decimalPrecision+1);var _c=this.decimalPrecisionFcn(_a*_b);_c=this.decimalPrecisionFcn(_c/10);return _c/(_b/10);},decimalPrecisionFcn:function(v){return Math.floor(v);}}); + +Ext.form.DateField=function(_1){Ext.form.DateField.superclass.constructor.call(this,_1);if(typeof this.minValue=="string"){this.minValue=this.parseDate(this.minValue);}if(typeof this.maxValue=="string"){this.maxValue=this.parseDate(this.maxValue);}this.ddMatch=null;if(this.disabledDates){var dd=this.disabledDates;var re="(?:";for(var i=0;ithis.maxValue.getTime()){this.markInvalid(String.format(this.maxText,this.formatDate(this.maxValue)));return false;}if(this.disabledDays){var _8=_5.getDay();for(var i=0;i{"+this.displayField+"}";}this.view=new Ext.View(this.innerList,this.tpl,{singleSelect:true,store:this.store,selectedClass:this.selectedClass});this.view.on("click",this.onViewClick,this);this.store.on("beforeload",this.onBeforeLoad,this);this.store.on("load",this.onLoad,this);this.store.on("loadexception",this.collapse,this);if(this.resizable){this.resizer=new Ext.Resizable(this.list,{pinned:true,handles:"se"});this.resizer.on("resize",function(r,w,h){this.maxHeight=h-this.handleHeight-this.list.getFrameWidth("tb")-this.assetHeight;this.listWidth=w;this.restrictHeight();},this);this[this.pageSize?"footer":"innerList"].setStyle("margin-bottom",this.handleHeight+"px");}if(!this.editable){this.editable=true;this.setEditable(false);}},initEvents:function(){Ext.form.ComboBox.superclass.initEvents.call(this);this.keyNav=new Ext.KeyNav(this.el,{"up":function(e){this.inKeyMode=true;this.selectPrev();},"down":function(e){if(!this.isExpanded()){this.onTriggerClick();}else{this.inKeyMode=true;this.selectNext();}},"enter":function(e){this.onViewClick();},"esc":function(e){this.collapse();},"tab":function(e){this.onViewClick(false);return true;},scope:this,doRelay:function(foo,bar,_16){if(_16=="down"||this.scope.isExpanded()){return Ext.KeyNav.prototype.doRelay.apply(this,arguments);}return true;}});this.queryDelay=Math.max(this.queryDelay||10,this.mode=="local"?10:250);this.dqTask=new Ext.util.DelayedTask(this.initQuery,this);if(this.typeAhead){this.taTask=new Ext.util.DelayedTask(this.onTypeAhead,this);}if(this.editable!==false){this.el.on("keyup",this.onKeyUp,this);}if(this.forceSelection){this.on("blur",this.doForce,this);}},onDestroy:function(){if(this.view){this.view.setStore(null);this.view.el.removeAllListeners();this.view.el.remove();this.view.purgeListeners();}if(this.list){this.list.destroy();}if(this.store){this.store.un("beforeload",this.onBeforeLoad,this);this.store.un("load",this.onLoad,this);this.store.un("loadexception",this.collapse,this);}Ext.form.ComboBox.superclass.onDestroy.call(this);},fireKey:function(e){if(e.isNavKeyPress()&&!this.list.isVisible()){this.fireEvent("specialkey",this,e);}},onResize:function(w,h){if(this.list&&this.listWidth===undefined){this.list.setWidth(Math.max(w,this.minListWidth));}},setEditable:function(_1a){if(_1a==this.editable){return;}this.editable=_1a;if(!_1a){this.el.dom.setAttribute("readOnly",true);this.el.on("mousedown",this.onTriggerClick,this);this.el.addClass("x-combo-noedit");}else{this.el.dom.setAttribute("readOnly",false);this.el.un("mousedown",this.onTriggerClick,this);this.el.removeClass("x-combo-noedit");}},onBeforeLoad:function(){if(!this.hasFocus){return;}this.innerList.update(this.loadingText?"
        "+this.loadingText+"
        ":"");this.restrictHeight();this.selectedIndex=-1;},onLoad:function(){if(!this.hasFocus){return;}if(this.store.getCount()>0){this.expand();this.restrictHeight();if(this.lastQuery==this.allQuery){if(this.editable){this.el.dom.select();}if(!this.selectByValue(this.value,true)){this.select(0,true);}}else{this.selectNext();if(this.typeAhead&&this.lastKey!=Ext.EventObject.BACKSPACE&&this.lastKey!=Ext.EventObject.DELETE){this.taTask.delay(this.typeAheadDelay);}}}else{this.onEmptyResults();}},onTypeAhead:function(){if(this.store.getCount()>0){var r=this.store.getAt(0);var _1c=r.data[this.displayField];var len=_1c.length;var _1e=this.getRawValue().length;if(_1e!=len){this.setRawValue(_1c);this.selectText(_1e,_1c.length);}}},onSelect:function(_1f,_20){if(this.fireEvent("beforeselect",this,_1f,_20)!==false){this.setValue(_1f.data[this.valueField||this.displayField]);this.collapse();this.fireEvent("select",this,_1f,_20);}},getValue:function(){if(this.valueField){return typeof this.value!="undefined"?this.value:"";}else{return Ext.form.ComboBox.superclass.getValue.call(this);}},clearValue:function(){if(this.hiddenField){this.hiddenField.value="";}this.setRawValue("");this.lastSelectionText="";},setValue:function(v){var _22=v;if(this.valueField){var r=this.findRecord(this.valueField,v);if(r){_22=r.data[this.displayField];}else{if(this.valueNotFoundText){_22=this.valueNotFoundText;}}}this.lastSelectionText=_22;if(this.hiddenField){this.hiddenField.value=v;}Ext.form.ComboBox.superclass.setValue.call(this,_22);this.value=v;},findRecord:function(_24,_25){var _26;if(this.store.getCount()>0){this.store.each(function(r){if(r.data[_24]==_25){_26=r;return false;}});}return _26;},onViewMove:function(e,t){this.inKeyMode=false;},onViewOver:function(e,t){if(this.inKeyMode){return;}var _2c=this.view.findItemFromChild(t);if(_2c){var _2d=this.view.indexOf(_2c);this.select(_2d,false);}},onViewClick:function(_2e){var _2f=this.view.getSelectedIndexes()[0];var r=this.store.getAt(_2f);if(r){this.onSelect(r,_2f);}if(_2e!==false){this.el.focus();}},restrictHeight:function(){this.innerList.dom.style.height="";var _31=this.innerList.dom;var h=Math.max(_31.clientHeight,_31.offsetHeight,_31.scrollHeight);this.innerList.setHeight(h0){if(this.selectedIndex==-1){this.select(0);}else{if(this.selectedIndex0){if(this.selectedIndex==-1){this.select(0);}else{if(this.selectedIndex!=0){this.select(this.selectedIndex-1);}}}},onKeyUp:function(e){if(this.editable!==false&&!e.isSpecialKey()){this.lastKey=e.getKey();this.dqTask.delay(this.queryDelay);}},validateBlur:function(){return !this.list||!this.list.isVisible();},initQuery:function(){this.doQuery(this.getRawValue());},doForce:function(){if(this.el.dom.value.length>0){this.el.dom.value=this.lastSelectionText===undefined?"":this.lastSelectionText;this.applyEmptyText();}},doQuery:function(q,_3d){if(q===undefined||q===null){q="";}var qe={query:q,forceAll:_3d,combo:this,cancel:false};if(this.fireEvent("beforequery",qe)===false||qe.cancel){return false;}q=qe.query;_3d=qe.forceAll;if(_3d===true||(q.length>=this.minChars)){if(this.lastQuery!=q){this.lastQuery=q;if(this.mode=="local"){this.selectedIndex=-1;if(_3d){this.store.clearFilter();}else{this.store.filter(this.displayField,q);}this.onLoad();}else{this.store.baseParams[this.queryParam]=q;this.store.load({params:this.getParams(q)});this.expand();}}else{this.selectedIndex=-1;this.onLoad();}}},getParams:function(q){var p={};if(this.pageSize){p.start=0;p.limit=this.pageSize;}return p;},collapse:function(){if(!this.isExpanded()){return;}this.list.hide();Ext.get(document).un("mousedown",this.collapseIf,this);this.fireEvent("collapse",this);},collapseIf:function(e){if(!e.within(this.wrap)&&!e.within(this.list)){this.collapse();}},expand:function(){if(this.isExpanded()||!this.hasFocus){return;}this.list.alignTo(this.el,this.listAlign);this.list.show();Ext.get(document).on("mousedown",this.collapseIf,this);this.fireEvent("expand",this);},onTriggerClick:function(){if(this.disabled){return;}if(this.isExpanded()){this.collapse();this.el.focus();}else{this.hasFocus=true;this.doQuery(this.triggerAction=="all"?this.doQuery(this.allQuery,true):this.doQuery(this.getRawValue()));this.el.focus();}}}); + +Ext.Editor=function(_1,_2){Ext.Editor.superclass.constructor.call(this,_2);this.field=_1;this.addEvents({"beforestartedit":true,"startedit":true,"beforecomplete":true,"complete":true,"specialkey":true});};Ext.extend(Ext.Editor,Ext.Component,{value:"",alignment:"c-c?",shadow:"frame",updateEl:false,onRender:function(ct,_4){this.el=new Ext.Layer({shadow:this.shadow,cls:"x-editor",parentEl:ct,shim:this.shim,shadowOffset:3,id:this.id});this.el.setStyle("overflow",Ext.isGecko?"auto":"hidden");this.field.render(this.el);if(Ext.isGecko){this.field.el.dom.setAttribute("autocomplete","off");}this.field.show();this.field.on("blur",this.onBlur,this);this.relayEvents(this.field,["specialkey"]);if(this.field.grow){this.field.on("autosize",this.el.sync,this.el,{delay:1});}},startEdit:function(el,_6){if(this.editing){this.completeEdit();}this.boundEl=Ext.get(el);var v=_6!==undefined?_6:this.boundEl.dom.innerHTML;if(!this.rendered){this.render(this.parentEl||document.body);}if(this.fireEvent("beforestartedit",this,this.boundEl,v)===false){return;}this.startValue=v;this.field.setValue(v);if(this.autoSize){var sz=this.boundEl.getSize();switch(this.autoSize){case "width":this.setSize(sz.width,"");break;case "height":this.setSize("",sz.height);break;default:this.setSize(sz.width,sz.height);}}this.el.alignTo(this.boundEl,this.alignment);this.editing=true;if(Ext.QuickTips){Ext.QuickTips.disable();}this.show();},setSize:function(w,h){this.field.setSize(w,h);if(this.el){this.el.sync();}},realign:function(){this.el.alignTo(this.boundEl,this.alignment);},completeEdit:function(_b){if(!this.editing){return;}var v=this.getValue();if(this.revertInvalid!==false&&!this.field.isValid()){v=this.startValue;this.cancelEdit(true);}if(String(v)==String(this.startValue)&&this.ignoreNoChange){this.editing=false;this.hide();return;}if(this.fireEvent("beforecomplete",this,v,this.startValue)!==false){this.editing=false;if(this.updateEl&&this.boundEl){this.boundEl.update(v);}if(_b!==true){this.hide();}this.fireEvent("complete",this,v,this.startValue);}},onShow:function(){this.el.show();if(this.hideEl!==false){this.boundEl.hide();}this.field.show();this.field.focus();this.fireEvent("startedit",this.boundEl,this.startValue);},cancelEdit:function(_d){if(this.editing){this.setValue(this.startValue);if(_d!==true){this.hide();}}},onBlur:function(){if(this.allowBlur!==true&&this.editing){this.completeEdit();}},onHide:function(){if(this.editing){this.completeEdit();return;}this.field.blur();if(this.field.collapse){this.field.collapse();}this.el.hide();if(this.hideEl!==false){this.boundEl.show();}if(Ext.QuickTips){Ext.QuickTips.enable();}},setValue:function(v){this.field.setValue(v);},getValue:function(){return this.field.getValue();}}); + +Ext.form.BasicForm=function(el,_2){Ext.apply(this,_2);this.items=new Ext.util.MixedCollection(false,function(o){return o.id||(o.id=Ext.id());});this.addEvents({beforeaction:true,actionfailed:true,actioncomplete:true});if(el){this.initEl(el);}Ext.form.BasicForm.superclass.constructor.call(this);};Ext.extend(Ext.form.BasicForm,Ext.util.Observable,{timeout:30,activeAction:null,waitMsgTarget:undefined,initEl:function(el){this.el=Ext.get(el);this.id=this.el.id||Ext.id();this.el.on("submit",this.onSubmit,this);this.el.addClass("x-form");},onSubmit:function(e){e.stopEvent();},isValid:function(){var _6=true;this.items.each(function(f){if(!f.validate()){_6=false;}});return _6;},doAction:function(_8,_9){if(typeof _8=="string"){_8=new Ext.form.Action.ACTION_TYPES[_8](this,_9);}if(this.fireEvent("beforeaction",this,_8)!==false){this.beforeAction(_8);_8.run.defer(100,_8);}},submit:function(_a){this.doAction("submit",_a);},load:function(_b){this.doAction("load",_b);},updateRecord:function(_c){_c.beginEdit();var fs=_c.fields;fs.each(function(f){var _f=this.findField(f.name);if(_f){_c.set(f.name,_f.getValue());}},this);_c.endEdit();},beforeAction:function(_10){var o=_10.options;if(o.waitMsg){if(this.waitMsgTarget===true){this.el.mask(o.waitMsg,"x-mask-loading");}else{if(this.waitMsgTarget){this.waitMsgTarget=Ext.get(this.waitMsgTarget);this.waitMsgTarget.mask(o.waitMsg,"x-mask-loading");}else{Ext.MessageBox.wait(o.waitMsg,o.waitTitle||this.waitTitle||"Please Wait...");}}}},afterAction:function(_12,_13){this.activeAction=null;var o=_12.options;if(o.waitMsg){if(this.waitMsgTarget===true){this.el.unmask();}else{if(this.waitMsgTarget){this.waitMsgTarget.unmask();}else{Ext.MessageBox.updateProgress(1);Ext.MessageBox.hide();}}}if(_13){if(o.reset){this.reset();}Ext.callback(o.success,o.scope,[this,_12]);this.fireEvent("actioncomplete",this,_12);}else{Ext.callback(o.failure,o.scope,[this,_12]);this.fireEvent("actionfailed",this,_12);}},findField:function(id){var _16=this.items.get(id);if(!_16){this.items.each(function(f){if(f.isFormField&&(f.dataIndex==id||f.id==id||f.getName()==id)){_16=f;return false;}});}return _16||null;},markInvalid:function(_18){if(_18 instanceof Array){for(var i=0,len=_18.length;i1){this.add.apply(this,Array.prototype.slice.call(arguments,1));this.end();}return _3;},fieldset:function(c){var fs=new Ext.form.FieldSet(c);this.start(fs);if(arguments.length>1){this.add.apply(this,Array.prototype.slice.call(arguments,1));this.end();}return fs;},container:function(c){var l=new Ext.form.Layout(c);this.start(l);if(arguments.length>1){this.add.apply(this,Array.prototype.slice.call(arguments,1));this.end();}return l;},start:function(c){Ext.applyIf(c,{"labelAlign":this.active.labelAlign,"labelWidth":this.active.labelWidth,"itemCls":this.active.itemCls});this.active.stack.push(c);c.ownerCt=this.active;this.active=c;return this;},end:function(){if(this.active==this.root){return this;}this.active=this.active.ownerCt;return this;},add:function(){this.active.stack.push.apply(this.active.stack,arguments);var r=[];for(var i=0,a=arguments,_c=a.length;i<_c;i++){if(a[i].isFormField){r.push(a[i]);}}if(r.length>0){Ext.form.Form.superclass.add.apply(this,r);}return this;},render:function(ct){ct=Ext.get(ct);var o=this.autoCreate||{tag:"form",method:this.method||"POST",id:this.id||Ext.id()};this.initEl(ct.createChild(o));this.root.render(this.el);this.items.each(function(f){f.render("x-form-el-"+f.id);});if(this.buttons.length>0){var tb=this.el.createChild({cls:"x-form-btns-ct",cn:{cls:"x-form-btns x-form-btns-"+this.buttonAlign,html:"
        "}},null,true);var tr=tb.getElementsByTagName("tr")[0];for(var i=0,len=this.buttons.length;i0){if(!this.fieldTpl){var t=new Ext.Template("
        ","","
        ","
        ","
        ");t.disableFormats=true;t.compile();Ext.form.Layout.prototype.fieldTpl=t;}for(var i=0;i<_6;i++){if(_5[i].isFormField){this.renderField(_5[i]);}else{this.renderComponent(_5[i]);}}}if(this.clear){this.el.createChild({cls:"x-form-clear"});}},renderField:function(f){this.fieldTpl.append(this.el,[f.id,f.fieldLabel,f.labelStyle||this.labelStyle||"",this.elementStyle||"",typeof f.labelSeparator=="undefined"?this.labelSeparator:f.labelSeparator,f.itemCls||this.itemCls||""]);},renderComponent:function(c){c.render(this.el);}});Ext.form.Column=function(_b){Ext.form.Column.superclass.constructor.call(this,_b);};Ext.extend(Ext.form.Column,Ext.form.Layout,{defaultAutoCreate:{tag:"div",cls:"x-form-ct x-form-column"},onRender:function(ct,_d){Ext.form.Column.superclass.onRender.call(this,ct,_d);if(this.width){this.el.setWidth(this.width);}}});Ext.form.FieldSet=function(_e){Ext.form.FieldSet.superclass.constructor.call(this,_e);};Ext.extend(Ext.form.FieldSet,Ext.form.Layout,{defaultAutoCreate:{tag:"fieldset",cn:{tag:"legend"}},onRender:function(ct,_10){Ext.form.FieldSet.superclass.onRender.call(this,ct,_10);if(this.legend){this.setLegend(this.legend);}},setLegend:function(_11){if(this.rendered){this.el.child("legend").update(_11);}}}); + +Ext.form.VTypes=function(){var _1=/^[a-zA-Z_]+$/;var _2=/^[a-zA-Z0-9_]+$/;var _3=/^([\w]+)(.[\w]+)*@([\w-]+\.){1,5}([A-Za-z]){2,4}$/;var _4=/(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;return {"email":function(v){return _3.test(v);},"emailText":"This field should be an e-mail address in the format \"user@domain.com\"","emailMask":/[a-z0-9_\.\-@]/i,"url":function(v){return _4.test(v);},"urlText":"This field should be a URL in the format \"http:/"+"/www.domain.com\"","alpha":function(v){return _1.test(v);},"alphaText":"This field should only contain letters and _","alphaMask":/[a-z_]/i,"alphanum":function(v){return _2.test(v);},"alphanumText":"This field should only contain letters, numbers and _","alphanumMask":/[a-z0-9_]/i};}(); + diff --git a/www/extras/yui-ext/package/grid/edit-grid-debug.js b/www/extras/yui-ext/package/grid/edit-grid-debug.js new file mode 100644 index 000000000..a7a7bb829 --- /dev/null +++ b/www/extras/yui-ext/package/grid/edit-grid-debug.js @@ -0,0 +1,319 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + + +Ext.grid.EditorGrid = function(container, config){ + Ext.grid.EditorGrid.superclass.constructor.call(this, container, config); + this.container.addClass("xedit-grid"); + + if(!this.selModel){ + this.selModel = new Ext.grid.CellSelectionModel(); + } + + this.activeEditor = null; + + this.addEvents({ + + "beforeedit" : true, + + "afteredit" : true, + + "validateedit" : true + }); + this.on("bodyscroll", this.stopEditing, this); + this.on(this.clicksToEdit == 1 ? "cellclick" : "celldblclick", this.onCellDblClick, this); +}; + +Ext.extend(Ext.grid.EditorGrid, Ext.grid.Grid, { + isEditor : true, + clicksToEdit: 2, + trackMouseOver: false, + + onCellDblClick : function(g, row, col){ + this.startEditing(row, col); + }, + + onEditComplete : function(ed, value, startValue){ + this.editing = false; + this.activeEditor = null; + ed.un("specialkey", this.selModel.onEditorKey, this.selModel); + if(String(value) != String(startValue)){ + var r = ed.record; + var field = this.colModel.getDataIndex(ed.col); + var e = { + grid: this, + record: r, + field: field, + originalValue: startValue, + value: value, + row: ed.row, + column: ed.col, + cancel:false + }; + if(this.fireEvent("validateedit", e) !== false && !e.cancel){ + r.set(field, e.value); + delete e.cancel; + this.fireEvent("afteredit", e); + } + } + this.view.focusCell(ed.row, ed.col); + }, + + + startEditing : function(row, col){ + this.stopEditing(); + if(this.colModel.isCellEditable(col, row)){ + this.view.focusCell(row, col); + var r = this.dataSource.getAt(row); + var field = this.colModel.getDataIndex(col); + var e = { + grid: this, + record: r, + field: field, + value: r.data[field], + row: row, + column: col, + cancel:false + }; + if(this.fireEvent("beforeedit", e) !== false && !e.cancel){ + this.editing = true; + (function(){ + var ed = this.colModel.getCellEditor(col, row); + ed.row = row; + ed.col = col; + ed.record = r; + ed.on("complete", this.onEditComplete, this, {single: true}); + ed.on("specialkey", this.selModel.onEditorKey, this.selModel); + this.activeEditor = ed; + var v = r.data[field]; + ed.startEdit(this.view.getCell(row, col), v); + }).defer(50, this); + } + } + }, + + + stopEditing : function(){ + if(this.activeEditor){ + this.activeEditor.completeEdit(); + } + this.activeEditor = null; + } +}); +Ext.grid.GridEditor = function(field, config){ + Ext.grid.GridEditor.superclass.constructor.call(this, field, config); + field.monitorTab = false; +}; + +Ext.extend(Ext.grid.GridEditor, Ext.Editor, { + alignment: "tl-tl", + autoSize: "width", + hideEl : false, + cls: "x-small-editor x-grid-editor", + shim:false, + shadow:"frame" +}); +Ext.grid.PropertyRecord = Ext.data.Record.create([ + {name:'name',type:'string'}, 'value' +]); + +Ext.grid.PropertyStore = function(grid, source){ + this.grid = grid; + this.store = new Ext.data.Store({ + recordType : Ext.grid.PropertyRecord + }); + this.store.on('update', this.onUpdate, this); + if(source){ + this.setSource(source); + } + Ext.grid.PropertyStore.superclass.constructor.call(this); +}; +Ext.extend(Ext.grid.PropertyStore, Ext.util.Observable, { + setSource : function(o){ + this.source = o; + this.store.removeAll(); + var data = []; + for(var k in o){ + if(this.isEditableValue(o[k])){ + data.push(new Ext.grid.PropertyRecord({name: k, value: o[k]}, k)); + } + } + this.store.loadRecords({records: data}, {}, true); + }, + + onUpdate : function(ds, record, type){ + if(type == Ext.data.Record.EDIT){ + var v = record.data['value']; + var oldValue = record.modified['value']; + if(this.grid.fireEvent('beforepropertychange', this.source, record.id, v, oldValue) !== false){ + this.source[record.id] = v; + record.commit(); + this.grid.fireEvent('propertychange', this.source, record.id, v, oldValue); + }else{ + record.reject(); + } + } + }, + + getProperty : function(row){ + return this.store.getAt(row); + }, + + isEditableValue: function(val){ + if(val && val instanceof Date){ + return true; + }else if(typeof val == 'object' || typeof val == 'function'){ + return false; + } + return true; + }, + + setValue : function(prop, value){ + this.source[prop] = value; + this.store.getById(prop).set('value', value); + }, + + getSource : function(){ + return this.source; + } +}); + +Ext.grid.PropertyColumnModel = function(grid, store){ + this.grid = grid; + var g = Ext.grid; + g.PropertyColumnModel.superclass.constructor.call(this, [ + {header: this.nameText, sortable: true, dataIndex:'name', id: 'name'}, + {header: this.valueText, resizable:false, dataIndex: 'value', id: 'value'} + ]); + this.store = store; + this.bselect = Ext.DomHelper.append(document.body, { + tag: 'select', style:'display:none', cls: 'x-grid-editor', children: [ + {tag: 'option', value: 'true', html: 'true'}, + {tag: 'option', value: 'false', html: 'false'} + ] + }); + Ext.id(this.bselect); + var f = Ext.form; + this.editors = { + 'date' : new g.GridEditor(new f.DateField({selectOnFocus:true})), + 'string' : new g.GridEditor(new f.TextField({selectOnFocus:true})), + 'number' : new g.GridEditor(new f.NumberField({selectOnFocus:true, style:'text-align:left;'})), + 'boolean' : new g.GridEditor(new f.Field({el:this.beselect,selectOnFocus:true})) + }; + this.renderCellDelegate = this.renderCell.createDelegate(this); + this.renderPropDelegate = this.renderProp.createDelegate(this); +}; + +Ext.extend(Ext.grid.PropertyColumnModel, Ext.grid.ColumnModel, { + nameText : 'Name', + valueText : 'Value', + dateFormat : 'm/j/Y', + renderDate : function(dateVal){ + return dateVal.dateFormat(this.dateFormat); + }, + + renderBool : function(bVal){ + return bVal ? 'true' : 'false'; + }, + + isCellEditable : function(colIndex, rowIndex){ + return colIndex == 1; + }, + + getRenderer : function(col){ + return col == 1 ? + this.renderCellDelegate : this.renderPropDelegate; + }, + + renderProp : function(v){ + return this.getPropertyName(v); + }, + + renderCell : function(val){ + var rv = val; + if(val instanceof Date){ + rv = this.renderDate(val); + }else if(typeof val == 'boolean'){ + rv = this.renderBool(val); + } + return Ext.util.Format.htmlEncode(rv); + }, + + getPropertyName : function(name){ + var pn = this.grid.propertyNames; + return pn && pn[name] ? pn[name] : name; + }, + + getCellEditor : function(colIndex, rowIndex){ + var p = this.store.getProperty(rowIndex); + var n = p.data['name'], val = p.data['value']; + if(this.grid.customEditors[n]){ + return this.grid.customEditors[n]; + } + 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']; + } + } +}); + +Ext.grid.PropertyGrid = function(container, config){ + config = config || {}; + var store = new Ext.grid.PropertyStore(this); + this.store = store; + var cm = new Ext.grid.PropertyColumnModel(this, store); + store.store.sort('name', 'ASC'); + Ext.grid.PropertyGrid.superclass.constructor.call(this, container, Ext.apply({ + ds: store.store, + cm: cm, + enableColLock:false, + enableColumnMove:false, + stripeRows:false, + trackMouseOver: false, + clicksToEdit:1 + }, config)); + this.container.addClass('x-props-grid'); + this.lastEditRow = null; + this.on('columnresize', this.onColumnResize, this); + this.addEvents({ + beforepropertychange: true, + propertychange: true + }); + this.customEditors = this.customEditors || {}; +}; +Ext.extend(Ext.grid.PropertyGrid, Ext.grid.EditorGrid, { + render : function(){ + Ext.grid.PropertyGrid.superclass.render.call(this); + this.autoSize.defer(100, this); + }, + + autoSize : function(){ + Ext.grid.PropertyGrid.superclass.autoSize.call(this); + if(this.view){ + this.view.fitColumns(); + } + }, + + onColumnResize : function(){ + this.colModel.setColumnWidth(1, this.container.getWidth(true)-this.colModel.getColumnWidth(0)); + this.autoSize(); + }, + + setSource : function(source){ + this.store.setSource(source); + }, + + getSource : function(){ + return this.store.getSource(); + } +}); diff --git a/www/extras/yui-ext/package/grid/edit-grid.js b/www/extras/yui-ext/package/grid/edit-grid.js new file mode 100644 index 000000000..455b9b885 --- /dev/null +++ b/www/extras/yui-ext/package/grid/edit-grid.js @@ -0,0 +1,14 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.grid.EditorGrid=function(_1,_2){Ext.grid.EditorGrid.superclass.constructor.call(this,_1,_2);this.container.addClass("xedit-grid");if(!this.selModel){this.selModel=new Ext.grid.CellSelectionModel();}this.activeEditor=null;this.addEvents({"beforeedit":true,"afteredit":true,"validateedit":true});this.on("bodyscroll",this.stopEditing,this);this.on(this.clicksToEdit==1?"cellclick":"celldblclick",this.onCellDblClick,this);};Ext.extend(Ext.grid.EditorGrid,Ext.grid.Grid,{isEditor:true,clicksToEdit:2,trackMouseOver:false,onCellDblClick:function(g,_4,_5){this.startEditing(_4,_5);},onEditComplete:function(ed,_7,_8){this.editing=false;this.activeEditor=null;ed.un("specialkey",this.selModel.onEditorKey,this.selModel);if(String(_7)!=String(_8)){var r=ed.record;var _a=this.colModel.getDataIndex(ed.col);var e={grid:this,record:r,field:_a,originalValue:_8,value:_7,row:ed.row,column:ed.col,cancel:false};if(this.fireEvent("validateedit",e)!==false&&!e.cancel){r.set(_a,e.value);delete e.cancel;this.fireEvent("afteredit",e);}}this.view.focusCell(ed.row,ed.col);},startEditing:function(_c,_d){this.stopEditing();if(this.colModel.isCellEditable(_d,_c)){this.view.focusCell(_c,_d);var r=this.dataSource.getAt(_c);var _f=this.colModel.getDataIndex(_d);var e={grid:this,record:r,field:_f,value:r.data[_f],row:_c,column:_d,cancel:false};if(this.fireEvent("beforeedit",e)!==false&&!e.cancel){this.editing=true;(function(){var ed=this.colModel.getCellEditor(_d,_c);ed.row=_c;ed.col=_d;ed.record=r;ed.on("complete",this.onEditComplete,this,{single:true});ed.on("specialkey",this.selModel.onEditorKey,this.selModel);this.activeEditor=ed;var v=r.data[_f];ed.startEdit(this.view.getCell(_c,_d),v);}).defer(50,this);}}},stopEditing:function(){if(this.activeEditor){this.activeEditor.completeEdit();}this.activeEditor=null;}}); + +Ext.grid.GridEditor=function(_1,_2){Ext.grid.GridEditor.superclass.constructor.call(this,_1,_2);_1.monitorTab=false;};Ext.extend(Ext.grid.GridEditor,Ext.Editor,{alignment:"tl-tl",autoSize:"width",hideEl:false,cls:"x-small-editor x-grid-editor",shim:false,shadow:"frame"}); + +Ext.grid.PropertyRecord=Ext.data.Record.create([{name:"name",type:"string"},"value"]);Ext.grid.PropertyStore=function(_1,_2){this.grid=_1;this.store=new Ext.data.Store({recordType:Ext.grid.PropertyRecord});this.store.on("update",this.onUpdate,this);if(_2){this.setSource(_2);}Ext.grid.PropertyStore.superclass.constructor.call(this);};Ext.extend(Ext.grid.PropertyStore,Ext.util.Observable,{setSource:function(o){this.source=o;this.store.removeAll();var _4=[];for(var k in o){if(this.isEditableValue(o[k])){_4.push(new Ext.grid.PropertyRecord({name:k,value:o[k]},k));}}this.store.loadRecords({records:_4},{},true);},onUpdate:function(ds,_7,_8){if(_8==Ext.data.Record.EDIT){var v=_7.data["value"];var _a=_7.modified["value"];if(this.grid.fireEvent("beforepropertychange",this.source,_7.id,v,_a)!==false){this.source[_7.id]=v;_7.commit();this.grid.fireEvent("propertychange",this.source,_7.id,v,_a);}else{_7.reject();}}},getProperty:function(_b){return this.store.getAt(_b);},isEditableValue:function(_c){if(_c&&_c instanceof Date){return true;}else{if(typeof _c=="object"||typeof _c=="function"){return false;}}return true;},setValue:function(_d,_e){this.source[_d]=_e;this.store.getById(_d).set("value",_e);},getSource:function(){return this.source;}});Ext.grid.PropertyColumnModel=function(_f,_10){this.grid=_f;var g=Ext.grid;g.PropertyColumnModel.superclass.constructor.call(this,[{header:this.nameText,sortable:true,dataIndex:"name",id:"name"},{header:this.valueText,resizable:false,dataIndex:"value",id:"value"}]);this.store=_10;this.bselect=Ext.DomHelper.append(document.body,{tag:"select",style:"display:none",cls:"x-grid-editor",children:[{tag:"option",value:"true",html:"true"},{tag:"option",value:"false",html:"false"}]});Ext.id(this.bselect);var f=Ext.form;this.editors={"date":new g.GridEditor(new f.DateField({selectOnFocus:true})),"string":new g.GridEditor(new f.TextField({selectOnFocus:true})),"number":new g.GridEditor(new f.NumberField({selectOnFocus:true,style:"text-align:left;"})),"boolean":new g.GridEditor(new f.Field({el:this.beselect,selectOnFocus:true}))};this.renderCellDelegate=this.renderCell.createDelegate(this);this.renderPropDelegate=this.renderProp.createDelegate(this);};Ext.extend(Ext.grid.PropertyColumnModel,Ext.grid.ColumnModel,{nameText:"Name",valueText:"Value",dateFormat:"m/j/Y",renderDate:function(_13){return _13.dateFormat(this.dateFormat);},renderBool:function(_14){return _14?"true":"false";},isCellEditable:function(_15,_16){return _15==1;},getRenderer:function(col){return col==1?this.renderCellDelegate:this.renderPropDelegate;},renderProp:function(v){return this.getPropertyName(v);},renderCell:function(val){var rv=val;if(val instanceof Date){rv=this.renderDate(val);}else{if(typeof val=="boolean"){rv=this.renderBool(val);}}return Ext.util.Format.htmlEncode(rv);},getPropertyName:function(_1b){var pn=this.grid.propertyNames;return pn&&pn[_1b]?pn[_1b]:_1b;},getCellEditor:function(_1d,_1e){var p=this.store.getProperty(_1e);var n=p.data["name"],val=p.data["value"];if(this.grid.customEditors[n]){return this.grid.customEditors[n];}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"];}}}}});Ext.grid.PropertyGrid=function(_22,_23){_23=_23||{};var _24=new Ext.grid.PropertyStore(this);this.store=_24;var cm=new Ext.grid.PropertyColumnModel(this,_24);_24.store.sort("name","ASC");Ext.grid.PropertyGrid.superclass.constructor.call(this,_22,Ext.apply({ds:_24.store,cm:cm,enableColLock:false,enableColumnMove:false,stripeRows:false,trackMouseOver:false,clicksToEdit:1},_23));this.container.addClass("x-props-grid");this.lastEditRow=null;this.on("columnresize",this.onColumnResize,this);this.addEvents({beforepropertychange:true,propertychange:true});this.customEditors=this.customEditors||{};};Ext.extend(Ext.grid.PropertyGrid,Ext.grid.EditorGrid,{render:function(){Ext.grid.PropertyGrid.superclass.render.call(this);this.autoSize.defer(100,this);},autoSize:function(){Ext.grid.PropertyGrid.superclass.autoSize.call(this);if(this.view){this.view.fitColumns();}},onColumnResize:function(){this.colModel.setColumnWidth(1,this.container.getWidth(true)-this.colModel.getColumnWidth(0));this.autoSize();},setSource:function(_26){this.store.setSource(_26);},getSource:function(){return this.store.getSource();}}); + diff --git a/www/extras/yui-ext/package/grid/grid.js b/www/extras/yui-ext/package/grid/grid.js new file mode 100644 index 000000000..5a921fafb --- /dev/null +++ b/www/extras/yui-ext/package/grid/grid.js @@ -0,0 +1,28 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.grid.Grid=function(_1,_2){this.container=Ext.get(_1);this.container.update("");this.container.setStyle("overflow","hidden");this.container.addClass("x-grid-container");this.id=this.container.id;Ext.apply(this,_2);if(this.ds){this.dataSource=this.ds;delete this.ds;}if(this.cm){this.colModel=this.cm;delete this.cm;}if(this.sm){this.selModel=this.sm;delete this.sm;}if(this.width){this.container.setWidth(this.width);}if(this.height){this.container.setHeight(this.height);}this.addEvents({"click":true,"dblclick":true,"contextmenu":true,"mousedown":true,"mouseup":true,"mouseover":true,"mouseout":true,"keypress":true,"keydown":true,"cellclick":true,"celldblclick":true,"rowclick":true,"rowdblclick":true,"headerclick":true,"headerdblclick":true,"rowcontextmenu":true,"cellcontextmenu":true,"headercontextmenu":true,"bodyscroll":true,"columnresize":true,"columnmove":true,"startdrag":true,"enddrag":true,"dragdrop":true,"dragover":true,"dragenter":true,"dragout":true});Ext.grid.Grid.superclass.constructor.call(this);};Ext.extend(Ext.grid.Grid,Ext.util.Observable,{minColumnWidth:25,autoSizeColumns:false,autoSizeHeaders:true,monitorWindowResize:true,maxRowsToMeasure:0,trackMouseOver:true,enableDragDrop:false,enableColumnMove:true,enableColumnHide:true,enableRowHeightSync:false,stripeRows:true,autoHeight:false,autoExpandColumn:false,autoExpandMin:50,autoExpandMax:1000,view:null,allowTextSelectionPattern:/INPUT|TEXTAREA|SELECT/i,loadMask:false,rendered:false,render:function(){var c=this.container;if((!c.dom.offsetHeight||c.dom.offsetHeight<20)||c.getStyle("height")=="auto"){this.autoHeight=true;}var _4=this.getView();_4.init(this);c.on("click",this.onClick,this);c.on("dblclick",this.onDblClick,this);c.on("contextmenu",this.onContextMenu,this);c.on("keydown",this.onKeyDown,this);this.relayEvents(c,["mousedown","mouseup","mouseover","mouseout","keypress"]);this.getSelectionModel().init(this);_4.render();if(this.loadMask){this.loadMask=new Ext.LoadMask(this.container,Ext.apply({store:this.dataSource},this.loadMask));}this.rendered=true;return this;},reconfigure:function(_5,_6){if(this.loadMask){this.loadMask.destroy();this.loadMask=new Ext.LoadMask(this.container,Ext.apply({store:_5},this.loadMask));}this.view.bind(_5,_6);this.dataSource=_5;this.colModel=_6;this.view.refresh(true);},onKeyDown:function(e){this.fireEvent("keydown",e);},destroy:function(_8,_9){if(this.loadMask){this.loadMask.destroy();}var c=this.container;c.removeAllListeners();this.view.destroy();this.colModel.purgeListeners();if(!_9){this.purgeListeners();}c.update("");if(_8===true){c.remove();}},processEvent:function(_b,e){this.fireEvent(_b,e);var t=e.getTarget();var v=this.view;var _f=v.findHeaderIndex(t);if(_f!==false){this.fireEvent("header"+_b,this,_f,e);}else{var row=v.findRowIndex(t);var _11=v.findCellIndex(t);if(row!==false){this.fireEvent("row"+_b,this,row,e);if(_11!==false){this.fireEvent("cell"+_b,this,row,_11,e);}}}},onClick:function(e){this.processEvent("click",e);},onContextMenu:function(e,t){this.processEvent("contextmenu",e);},onDblClick:function(e){this.processEvent("dblclick",e);},walkCells:function(row,col,_18,fn,_1a){var cm=this.colModel,_1c=cm.getColumnCount();var ds=this.dataSource,_1e=ds.getCount(),_1f=true;if(_18<0){if(col<0){row--;_1f=false;}while(row>=0){if(!_1f){col=_1c-1;}_1f=false;while(col>=0){if(fn.call(_1a||this,row,col,cm)===true){return [row,col];}col--;}row--;}}else{if(col>=_1c){row++;_1f=false;}while(row<_1e){if(!_1f){col=0;}_1f=false;while(col<_1c){if(fn.call(_1a||this,row,col,cm)===true){return [row,col];}col++;}row++;}}return null;},getSelections:function(){return this.selModel.getSelections();},autoSize:function(){if(this.rendered){this.view.layout();if(this.view.adjustForScroll){this.view.adjustForScroll();}}},stopEditing:function(){},getSelectionModel:function(){if(!this.selModel){this.selModel=new Ext.grid.RowSelectionModel();}return this.selModel;},getDataSource:function(){return this.dataSource;},getColumnModel:function(){return this.colModel;},getView:function(){if(!this.view){this.view=new Ext.grid.GridView();}return this.view;},getDragDropText:function(){var _20=this.selModel.getCount();return String.format(this.ddText,_20,_20==1?"":"s");}});Ext.grid.Grid.prototype.ddText="{0} selected row{1}"; + +Ext.grid.AbstractGridView=function(){this.grid=null;this.events={"beforerowremoved":true,"beforerowsinserted":true,"beforerefresh":true,"rowremoved":true,"rowsinserted":true,"rowupdated":true,"refresh":true};Ext.grid.AbstractGridView.superclass.constructor.call(this);};Ext.extend(Ext.grid.AbstractGridView,Ext.util.Observable,{rowClass:"x-grid-row",cellClass:"x-grid-cell",tdClass:"x-grid-td",hdClass:"x-grid-hd",splitClass:"x-grid-hd-split",init:function(_1){this.grid=_1;var _2=this.grid.container.id;this.colSelector="#"+_2+" ."+this.cellClass+"-";this.tdSelector="#"+_2+" ."+this.tdClass+"-";this.hdSelector="#"+_2+" ."+this.hdClass+"-";this.splitSelector="#"+_2+" ."+this.splitClass+"-";},getColumnRenderers:function(){var _3=[];var cm=this.grid.colModel;var _5=cm.getColumnCount();for(var i=0;i<_5;i++){_3[i]=cm.getRenderer(i);}return _3;},getColumnIds:function(){var _7=[];var cm=this.grid.colModel;var _9=cm.getColumnCount();for(var i=0;i<_9;i++){_7[i]=cm.getColumnId(i);}return _7;},getDataIndexes:function(){if(!this.indexMap){this.indexMap=this.buildIndexMap();}return this.indexMap.colToData;},getColumnIndexByDataIndex:function(_b){if(!this.indexMap){this.indexMap=this.buildIndexMap();}return this.indexMap.dataToCol[_b];},setCSSStyle:function(_c,_d,_e){var _f="#"+this.grid.id+" .x-grid-col-"+_c;Ext.util.CSS.updateRule(_f,_d,_e);},generateRules:function(cm){var _11=[];for(var i=0,len=cm.getColumnCount();i","
        ","
        ","
        ","
        {lockedHeader}
        ","
        {lockedBody}
        ","
        ","
        ","
        {header}
        ","
        {body}
        ","
        ","
        ","","
         
        ","");_5.master.disableformats=true;}if(!_5.header){_5.header=new Ext.Template("","{cells}","
        {splits}");_5.header.disableformats=true;}_5.header.compile();if(!_5.hcell){_5.hcell=new Ext.Template("
        ","
        {value}
        ","
        ");_5.hcell.disableFormats=true;}_5.hcell.compile();if(!_5.hsplit){_5.hsplit=new Ext.Template("
         
        ");_5.hsplit.disableFormats=true;}_5.hsplit.compile();if(!_5.body){_5.body=new Ext.Template("","{rows}","
        ");_5.body.disableFormats=true;}_5.body.compile();if(!_5.row){_5.row=new Ext.Template("{cells}");_5.row.disableFormats=true;}_5.row.compile();if(!_5.cell){_5.cell=new Ext.Template("","
        {value}
        ","");_5.cell.disableFormats=true;}_5.cell.compile();this.templates=_5;},onColWidthChange:function(){this.updateColumns.apply(this,arguments);},onHeaderChange:function(){this.updateHeaders.apply(this,arguments);},onHiddenChange:function(){this.handleHiddenChange.apply(this,arguments);},onColumnMove:function(){this.handleColumnMove.apply(this,arguments);},onColumnLock:function(){this.handleLockChange.apply(this,arguments);},onDataChange:function(){this.refresh();this.updateHeaderSortState();},onClear:function(){this.refresh();},onUpdate:function(ds,_7){this.refreshRow(_7);},refreshRow:function(_8){var ds=this.ds,_a;if(typeof _8=="number"){_a=_8;_8=ds.getAt(_a);}else{_a=ds.indexOf(_8);}var _b=this.getRowComposite(_a);var _c=[];this.insertRows(ds,_a,_a,true);this.onRemove(ds,_8,_a+1,true);this.syncRowHeights(_a,_a);this.layout();this.fireEvent("rowupdated",this,_a,_8);},onAdd:function(ds,_e,_f){this.insertRows(ds,_f,_f+(_e.length-1));},onRemove:function(ds,_11,_12,_13){if(_13!==true){this.fireEvent("beforerowremoved",this,_12,_11);}var bt=this.getBodyTable(),lt=this.getLockedTable();if(bt.rows[_12]){bt.firstChild.removeChild(bt.rows[_12]);}if(lt.rows[_12]){lt.firstChild.removeChild(lt.rows[_12]);}if(_13!==true){this.stripeRows(_12);this.syncRowHeights(_12,_12);this.layout();this.fireEvent("rowremoved",this,_12,_11);}},onLoad:function(){this.scrollToTop();},scrollToTop:function(){if(this.scroller){this.scroller.dom.scrollTop=0;this.syncScroll();}},getHeaderPanel:function(_16){if(_16){this.headerPanel.show();}return this.headerPanel;},getFooterPanel:function(_17){if(_17){this.footerPanel.show();}return this.footerPanel;},initElements:function(){var E=Ext.Element;var el=this.grid.container.dom.firstChild;var cs=el.childNodes;this.el=new E(el);this.headerPanel=new E(el.firstChild);this.headerPanel.enableDisplayMode("block");this.scroller=new E(cs[1]);this.scrollSizer=new E(this.scroller.dom.firstChild);this.lockedWrap=new E(cs[2]);this.lockedHd=new E(this.lockedWrap.dom.firstChild);this.lockedBody=new E(this.lockedWrap.dom.childNodes[1]);this.mainWrap=new E(cs[3]);this.mainHd=new E(this.mainWrap.dom.firstChild);this.mainBody=new E(this.mainWrap.dom.childNodes[1]);this.footerPanel=new E(cs[4]);this.footerPanel.enableDisplayMode("block");this.focusEl=new E(cs[5]);this.focusEl.swallowEvent("click",true);this.resizeProxy=new E(cs[6]);this.headerSelector=String.format("#{0} td.x-grid-hd, #{1} td.x-grid-hd",this.lockedHd.id,this.mainHd.id);this.splitterSelector=String.format("#{0} div.x-grid-split, #{1} div.x-grid-split",this.lockedHd.id,this.mainHd.id);},getHeaderCell:function(_1b){return Ext.DomQuery.select(this.headerSelector)[_1b];},getHeaderCellMeasure:function(_1c){return this.getHeaderCell(_1c).firstChild;},getHeaderCellText:function(_1d){return this.getHeaderCell(_1d).firstChild.firstChild;},getLockedTable:function(){return this.lockedBody.dom.firstChild;},getBodyTable:function(){return this.mainBody.dom.firstChild;},getLockedRow:function(_1e){return this.getLockedTable().rows[_1e];},getRow:function(_1f){return this.getBodyTable().rows[_1f];},getRowComposite:function(_20){if(!this.rowEl){this.rowEl=new Ext.CompositeElementLite();}var els=[],_22,_23;if(_22=this.getLockedRow(_20)){els.push(_22);}if(_23=this.getRow(_20)){els.push(_23);}this.rowEl.elements=els;return this.rowEl;},getCell:function(_24,_25){var _26=this.cm.getLockedCount();var _27;if(_25<_26){_27=this.lockedBody.dom.firstChild;}else{_27=this.mainBody.dom.firstChild;_25-=_26;}return _27.rows[_24].childNodes[_25];},getCellText:function(_28,_29){return this.getCell(_28,_29).firstChild.firstChild;},getCellBox:function(_2a){var b=this.fly(_2a).getBox();if(Ext.isOpera){b.y=_2a.offsetTop+this.mainBody.getY();}return b;},getCellIndex:function(_2c){var id=String(_2c.className).match(this.cellRE);if(id){return parseInt(id[1],10);}return 0;},findHeaderIndex:function(n){var r=Ext.fly(n).findParent("td."+this.hdClass,6);return r?this.getCellIndex(r):false;},findHeaderCell:function(n){var r=Ext.fly(n).findParent("td."+this.hdClass,6);return r?r:false;},findRowIndex:function(n){if(!n){return false;}var r=Ext.fly(n).findParent("tr."+this.rowClass,6);return r?r.rowIndex:false;},findCellIndex:function(_34){var _35=this.el.dom;while(_34&&_34!=_35){if(this.findRE.test(_34.className)){return this.getCellIndex(_34);}_34=_34.parentNode;}return false;},getColumnId:function(_36){return this.cm.getColumnId(_36);},getSplitters:function(){if(this.splitterSelector){return Ext.DomQuery.select(this.splitterSelector);}else{return null;}},getSplitter:function(_37){return this.getSplitters()[_37];},onRowOver:function(e,t){var row;if((row=this.findRowIndex(t))!==false){this.getRowComposite(row).addClass("x-grid-row-over");}},onRowOut:function(e,t){var row;if((row=this.findRowIndex(t))!==false&&row!==this.findRowIndex(e.getRelatedTarget())){this.getRowComposite(row).removeClass("x-grid-row-over");}},renderHeaders:function(){var cm=this.cm;var ct=this.templates.hcell,ht=this.templates.header,st=this.templates.hsplit;var cb=[],lb=[],sb=[],lsb=[],p={};for(var i=0,len=cm.getColumnCount();i=this.ds.getCount()){return;}col=(col!==undefined?col:0);var cm=this.grid.colModel;while(cm.isHidden(col)){col++;}var el=this.getCell(row,col);if(!el){return;}var c=this.scroller.dom;var _56=parseInt(el.offsetTop,10);var _57=parseInt(el.offsetLeft,10);var _58=_56+el.offsetHeight;var _59=_57+el.offsetWidth;var ch=c.clientHeight-this.mainHd.dom.offsetHeight;var _5b=parseInt(c.scrollTop,10);var _5c=parseInt(c.scrollLeft,10);var _5d=_5b+ch;var _5e=_5c+c.clientWidth;if(_56<_5b){c.scrollTop=_56;}else{if(_58>_5d){c.scrollTop=_58-ch;}}if(_52!==false){if(_57<_5c){c.scrollLeft=_57;}else{if(_59>_5e){c.scrollLeft=_59-c.clientWidth;}}}return el;},updateColumns:function(){this.grid.stopEditing();var cm=this.grid.colModel,_60=this.getColumnIds();var pos=0;for(var i=0,len=cm.getColumnCount();i"+_79+"";var _80=b.firstChild.rows;for(var i=0,len=_80.length;i0){_141=_141||0;var _143=this.getBodyTable().rows;var _144=this.getLockedTable().rows;var len=_143.length-1;_142=Math.min(_142||len,len);for(var i=_141;i<=_142;i++){var m=_143[i],l=_144[i];var h=Math.max(m.offsetHeight,l.offsetHeight);m.style.height=l.style.height=h+"px";}}},layout:function(_14a,_14b){var g=this.grid;var auto=g.autoHeight;var _14e=16;var c=g.container,cm=this.cm,_151=g.autoExpandColumn,gv=this;if(!c.dom.offsetWidth){if(_14a){this.lockedWrap.show();this.mainWrap.show();}return;}var _153=this.cm.isLocked(0);var tbh=this.headerPanel.getHeight();var bbh=this.footerPanel.getHeight();if(auto){var ch=this.getBodyTable().offsetHeight+tbh+bbh+this.mainHd.getHeight();var _157=ch+c.getBorderWidth("tb");if(g.maxHeight){_157=Math.min(g.maxHeight,_157);}c.setHeight(_157);}if(g.autoWidth){c.setWidth(cm.getTotalWidth()+c.getBorderWidth("lr"));}var s=this.scroller;var _159=c.getSize(true);this.el.setSize(_159.width,_159.height);this.headerPanel.setWidth(_159.width);this.footerPanel.setWidth(_159.width);var _15a=this.mainHd.getHeight();var vw=_159.width;var vh=_159.height-(tbh+bbh);s.setSize(vw,vh);var bt=this.getBodyTable();var _15e=_153?Math.max(this.getLockedTable().offsetWidth,this.lockedHd.dom.firstChild.offsetWidth):0;var _15f=bt.offsetHeight;var _160=_15e+bt.offsetWidth;var _161=false,_162=false;this.scrollSizer.setSize(_160,_15f+_15a);var lw=this.lockedWrap,mw=this.mainWrap;var lb=this.lockedBody,mb=this.mainBody;setTimeout(function(){var t=s.dom.offsetTop;var w=s.dom.clientWidth,h=s.dom.clientHeight;lw.setTop(t);lw.setSize(_15e,h);mw.setLeftTop(_15e,t);mw.setSize(w-_15e,h);lb.setHeight(h-_15a);mb.setHeight(h-_15a);if(_14b!==true&&!gv.userResized&&_151){var ci=cm.getIndexById(_151);var tw=cm.getTotalWidth(false);var _16c=cm.getColumnWidth(ci);var cw=Math.min(Math.max(((w-tw)+_16c-2)-(w<=s.dom.offsetWidth?0:18),g.autoExpandMin),g.autoExpandMax);if(_16c!=cw){cm.setColumnWidth(ci,cw,true);gv.css.updateRule(gv.colSelector+_151,"width",(cw-gv.borderWidth)+"px");gv.css.updateRule(gv.hdSelector+_151,"width",(cw-gv.borderWidth)+"px");gv.updateSplitters();gv.layout(false,true);}}if(_14a){lw.show();mw.show();}},10);},onWindowResize:function(){if(!this.grid.monitorWindowResize||this.grid.autoHeight){return;}this.layout();},appendFooter:function(_16e){return null;},sortAscText:"Sort Ascending",sortDescText:"Sort Descending",lockText:"Lock Column",unlockText:"Unlock Column",columnsText:"Columns"}); + +Ext.grid.ColumnModel=function(_1){Ext.grid.ColumnModel.superclass.constructor.call(this);this.config=_1;this.lookup={};for(var i=0,_3=_1.length;i<_3;i++){if(typeof _1[i].dataIndex=="undefined"){_1[i].dataIndex=i;}if(typeof _1[i].renderer=="string"){_1[i].renderer=Ext.util.Format[_1[i].renderer];}if(typeof _1[i].id=="undefined"){_1[i].id=i;}this.lookup[_1[i].id]=_1[i];}this.defaultWidth=100;this.defaultSortable=false;this.addEvents({"widthchange":true,"headerchange":true,"hiddenchange":true,"columnmoved":true,"columnlockchange":true});Ext.grid.ColumnModel.superclass.constructor.call(this);};Ext.extend(Ext.grid.ColumnModel,Ext.util.Observable,{getColumnId:function(_4){return this.config[_4].id;},getColumnById:function(id){return this.lookup[id];},getIndexById:function(id){for(var i=0,_8=this.config.length;i<_8;i++){if(this.config[i].id==id){return i;}}return -1;},moveColumn:function(_9,_a){var c=this.config[_9];this.config.splice(_9,1);this.config.splice(_a,0,c);this.dataMap=null;this.fireEvent("columnmoved",this,_9,_a);},isLocked:function(_c){return this.config[_c].locked===true;},setLocked:function(_d,_e,_f){if(this.isLocked(_d)==_e){return;}this.config[_d].locked=_e;if(!_f){this.fireEvent("columnlockchange",this,_d,_e);}},getTotalLockedWidth:function(){var _10=0;for(var i=0;i0;},isSelected:function(_21){var r=typeof _21=="number"?this.grid.dataSource.getAt(_21):_21;return (r&&this.selections.key(r.id)?true:false);},isIdSelected:function(id){return (this.selections.key(id)?true:false);},handleMouseDown:function(e,t){var _26=this.grid.getView(),_27;if(this.isLocked()||(_27=_26.findRowIndex(t))===false){return;}if(e.shiftKey&&this.last!==false){var _28=this.last;this.selectRange(_28,_27,e.ctrlKey);this.last=_28;_26.focusRow(_27);}else{var _29=this.isSelected(_27);if(e.button!=0&&_29){_26.focusRow(_27);}else{if(e.ctrlKey&&_29){this.deselectRow(_27);}else{this.selectRow(_27,e.button==0&&(e.ctrlKey||e.shiftKey));_26.focusRow(_27);}}}},selectRows:function(_2a,_2b){if(!_2b){this.clearSelections();}for(var i=0,len=_2a.length;i=_2f;i--){this.selectRow(i,true);}}},deselectRange:function(_32,_33,_34){if(this.locked){return;}for(var i=_32;i<=_33;i++){this.deselectRow(i,_34);}},selectRow:function(_36,_37,_38){if(this.locked||(_36<0||_36>=this.grid.dataSource.getCount())){return;}if(this.fireEvent("beforerowselect",this,_36,_37)!==false){if(!_37||this.singleSelect){this.clearSelections();}var r=this.grid.dataSource.getAt(_36);this.selections.add(r);this.last=this.lastActive=_36;if(!_38){this.grid.getView().onRowSelect(_36);}this.fireEvent("rowselect",this,_36,r);this.fireEvent("selectionchange",this);}},deselectRow:function(_3a,_3b){if(this.locked){return;}if(this.last==_3a){this.last=false;}if(this.lastActive==_3a){this.lastActive=false;}var r=this.grid.dataSource.getAt(_3a);this.selections.remove(r);if(!_3b){this.grid.getView().onRowDeselect(_3a);}this.fireEvent("rowdeselect",this,_3a);this.fireEvent("selectionchange",this);},restoreLast:function(){if(this._last){this.last=this._last;}},acceptsNav:function(row,col,cm){return !cm.isHidden(col)&&cm.isCellEditable(col,row);},onEditorKey:function(_40,e){var k=e.getKey(),_43,g=this.grid,ed=g.activeEditor;if(k==e.TAB){ed.completeEdit();if(e.shiftKey){_43=g.walkCells(ed.row,ed.col-1,-1,this.acceptsNav,this);}else{_43=g.walkCells(ed.row,ed.col+1,1,this.acceptsNav,this);}e.stopEvent();}else{if(k==e.ENTER&&!e.ctrlKey){ed.completeEdit();if(e.shiftKey){_43=g.walkCells(ed.row-1,ed.col,-1,this.acceptsNav,this);}else{_43=g.walkCells(ed.row+1,ed.col,1,this.acceptsNav,this);}e.stopEvent();}else{if(k==e.ESC){ed.cancelEdit();}}}if(_43){g.startEditing(_43[0],_43[1]);}}}); + +Ext.grid.CellSelectionModel=function(_1){Ext.apply(this,_1);this.selection=null;this.addEvents({"beforecellselect":true,"cellselect":true,"selectionchange":true});};Ext.extend(Ext.grid.CellSelectionModel,Ext.grid.AbstractSelectionModel,{initEvents:function(){this.grid.on("mousedown",this.handleMouseDown,this);this.grid.container.on(Ext.isIE?"keydown":"keypress",this.handleKeyDown,this);var _2=this.grid.view;_2.on("refresh",this.onViewChange,this);_2.on("rowupdated",this.onRowUpdated,this);_2.on("beforerowremoved",this.clearSelections,this);_2.on("beforerowsinserted",this.clearSelections,this);if(this.grid.isEditor){this.grid.on("beforeedit",this.beforeEdit,this);}},beforeEdit:function(e){this.select(e.row,e.column,false,true,e.record);},onRowUpdated:function(v,_5,r){if(this.selection&&this.selection.record==r){v.onCellSelect(_5,this.selection.cell[1]);}},onViewChange:function(){this.clearSelections(true);},getSelectedCell:function(){return this.selection?this.selection.cell:null;},clearSelections:function(_7){var s=this.selection;if(s){if(_7!==true){this.grid.view.onCellDeselect(s.cell[0],s.cell[1]);}this.selection=null;this.fireEvent("selectionchange",this,null);}},hasSelection:function(){return this.selection?true:false;},handleMouseDown:function(e,t){var v=this.grid.getView();if(this.isLocked()){return;}var _c=v.findRowIndex(t);var _d=v.findCellIndex(t);if(_c!==false&&_d!==false){this.select(_c,_d);}},select:function(_e,_f,_10,_11,r){if(this.fireEvent("beforecellselect",this,_e,_f)!==false){this.clearSelections();r=r||this.grid.dataSource.getAt(_e);this.selection={record:r,cell:[_e,_f]};if(!_10){var v=this.grid.getView();v.onCellSelect(_e,_f);if(_11!==true){v.focusCell(_e,_f);}}this.fireEvent("cellselect",this,_e,_f);this.fireEvent("selectionchange",this,this.selection);}},isSelectable:function(_14,_15,cm){return !cm.isHidden(_15);},handleKeyDown:function(e){if(!e.isNavKeyPress()){return;}var g=this.grid,s=this.selection;if(!s){e.stopEvent();var _1a=g.walkCells(0,0,1,this.isSelectable,this);if(_1a){this.select(_1a[0],_1a[1]);}return;}var sm=this;var _1c=function(row,col,_1f){return g.walkCells(row,col,_1f,sm.isSelectable,sm);};var k=e.getKey(),r=s.cell[0],c=s.cell[1];var _23;switch(k){case e.TAB:if(e.shiftKey){_23=_1c(r,c-1,-1);}else{_23=_1c(r,c+1,1);}break;case e.DOWN:_23=_1c(r+1,c,1);break;case e.UP:_23=_1c(r-1,c,-1);break;case e.RIGHT:_23=_1c(r,c+1,1);break;case e.LEFT:_23=_1c(r,c-1,-1);break;case e.ENTER:if(g.isEditor&&!g.editing){g.startEditing(r,c);e.stopEvent();return;}break;}if(_23){this.select(_23[0],_23[1]);e.stopEvent();}},acceptsNav:function(row,col,cm){return !cm.isHidden(col)&&cm.isCellEditable(col,row);},onEditorKey:function(_27,e){var k=e.getKey(),_2a,g=this.grid,ed=g.activeEditor;if(k==e.TAB){if(e.shiftKey){_2a=g.walkCells(ed.row,ed.col-1,-1,this.acceptsNav,this);}else{_2a=g.walkCells(ed.row,ed.col+1,1,this.acceptsNav,this);}e.stopEvent();}else{if(k==e.ENTER&&!e.ctrlKey){ed.completeEdit();e.stopEvent();}else{if(k==e.ESC){ed.cancelEdit();}}}if(_2a){g.startEditing(_2a[0],_2a[1]);}}}); + +Ext.grid.HeaderDragZone=function(_1,hd,_3){this.grid=_1;this.view=_1.getView();this.ddGroup="gridHeader"+this.grid.container.id;Ext.grid.HeaderDragZone.superclass.constructor.call(this,hd);if(_3){this.setHandleElId(Ext.id(hd));this.setOuterHandleElId(Ext.id(_3));}this.scroll=false;};Ext.extend(Ext.grid.HeaderDragZone,Ext.dd.DragZone,{maxDragWidth:120,getDragData:function(e){var t=Ext.lib.Event.getTarget(e);var h=this.view.findHeaderCell(t);if(h){return {ddel:h.firstChild,header:h};}return false;},onInitDrag:function(e){this.view.headersDisabled=true;var _8=this.dragData.ddel.cloneNode(true);_8.style.width=Math.min(this.dragData.header.offsetWidth,this.maxDragWidth)+"px";this.proxy.update(_8);return true;},afterValidDrop:function(){var v=this.view;setTimeout(function(){v.headersDisabled=false;},50);},afterInvalidDrop:function(){var v=this.view;setTimeout(function(){v.headersDisabled=false;},50);}});Ext.grid.HeaderDropZone=function(_b,hd,_d){this.grid=_b;this.view=_b.getView();this.proxyTop=Ext.DomHelper.append(document.body,{tag:"div",cls:"col-move-top",html:" "},true);this.proxyBottom=Ext.DomHelper.append(document.body,{tag:"div",cls:"col-move-bottom",html:" "},true);this.proxyTop.hide=this.proxyBottom.hide=function(){this.setLeftTop(-100,-100);this.setStyle("visibility","hidden");};this.ddGroup="gridHeader"+this.grid.container.id;Ext.grid.HeaderDropZone.superclass.constructor.call(this,_b.container.dom);};Ext.extend(Ext.grid.HeaderDropZone,Ext.dd.DropZone,{proxyOffsets:[-4,-9],fly:Ext.Element.fly,getTargetFromEvent:function(e){var t=Ext.lib.Event.getTarget(e);var _10=this.view.findCellIndex(t);if(_10!==false){return this.view.getHeaderCell(_10);}},nextVisible:function(h){var v=this.view,cm=this.grid.colModel;h=h.nextSibling;while(h){if(!cm.isHidden(v.getCellIndex(h))){return h;}h=h.nextSibling;}return null;},prevVisible:function(h){var v=this.view,cm=this.grid.colModel;h=h.prevSibling;while(h){if(!cm.isHidden(v.getCellIndex(h))){return h;}h=h.prevSibling;}return null;},positionIndicator:function(h,n,e){var x=Ext.lib.Event.getPageX(e);var r=Ext.lib.Dom.getRegion(n.firstChild);var px,pt,py=r.top+this.proxyOffsets[1];if((r.right-x)<=(r.right-r.left)/2){px=r.right+this.view.borderWidth;pt="after";}else{px=r.left;pt="before";}var _1f=this.view.getCellIndex(h);var _20=this.view.getCellIndex(n);var _21=this.grid.colModel.isLocked(_20);if(pt=="after"){_20++;}if(_1f<_20){_20--;}if(_1f==_20&&(_21==this.grid.colModel.isLocked(_1f))){return false;}px+=this.proxyOffsets[0];this.proxyTop.setLeftTop(px,py);this.proxyTop.show();if(!this.bottomOffset){this.bottomOffset=this.view.mainHd.getHeight();}this.proxyBottom.setLeftTop(px,py+this.proxyTop.dom.offsetHeight+this.bottomOffset);this.proxyBottom.show();return pt;},onNodeEnter:function(n,dd,e,_25){if(_25.header!=n){this.positionIndicator(_25.header,n,e);}},onNodeOver:function(n,dd,e,_29){var _2a=false;if(_29.header!=n){_2a=this.positionIndicator(_29.header,n,e);}if(!_2a){this.proxyTop.hide();this.proxyBottom.hide();}return _2a?this.dropAllowed:this.dropNotAllowed;},onNodeOut:function(n,dd,e,_2e){this.proxyTop.hide();this.proxyBottom.hide();},onNodeDrop:function(n,dd,e,_32){var h=_32.header;if(h!=n){var cm=this.grid.colModel;var x=Ext.lib.Event.getPageX(e);var r=Ext.lib.Dom.getRegion(n.firstChild);var pt=(r.right-x)<=((r.right-r.left)/2)?"after":"before";var _38=this.view.getCellIndex(h);var _39=this.view.getCellIndex(n);var _3a=cm.isLocked(_39);if(pt=="after"){_39++;}if(_38<_39){_39--;}if(_38==_39&&(_3a==cm.isLocked(_38))){return false;}cm.setLocked(_38,_3a,true);cm.moveColumn(_38,_39);this.grid.fireEvent("columnmove",_38,_39);return true;}return false;}}); + +Ext.grid.SplitDragZone=function(_1,hd,_3){this.grid=_1;this.view=_1.getView();this.proxy=this.view.resizeProxy;Ext.grid.SplitDragZone.superclass.constructor.call(this,hd,"gridSplitters"+this.grid.container.id,{dragElId:Ext.id(this.proxy.dom),resizeFrame:false});this.setHandleElId(Ext.id(hd));this.setOuterHandleElId(Ext.id(_3));this.scroll=false;};Ext.extend(Ext.grid.SplitDragZone,Ext.dd.DDProxy,{fly:Ext.Element.fly,b4StartDrag:function(x,y){this.view.headersDisabled=true;this.proxy.setHeight(this.view.mainWrap.getHeight());var w=this.cm.getColumnWidth(this.cellIndex);var _7=Math.max(w-this.grid.minColumnWidth,0);this.resetConstraints();this.setXConstraint(_7,1000);this.setYConstraint(0,0);this.minX=x-_7;this.maxX=x+1000;this.startPos=x;Ext.dd.DDProxy.prototype.b4StartDrag.call(this,x,y);},handleMouseDown:function(e){ev=Ext.EventObject.setEvent(e);var t=this.fly(ev.getTarget());if(t.hasClass("x-grid-split")){this.cellIndex=this.view.getCellIndex(t.dom);this.split=t.dom;this.cm=this.grid.colModel;if(this.cm.isResizable(this.cellIndex)&&!this.cm.isFixed(this.cellIndex)){Ext.grid.SplitDragZone.superclass.handleMouseDown.apply(this,arguments);}}},endDrag:function(e){this.view.headersDisabled=false;var _b=Math.max(this.minX,Ext.lib.Event.getPageX(e));var _c=_b-this.startPos;this.view.onColumnSplitterMoved(this.cellIndex,this.cm.getColumnWidth(this.cellIndex)+_c);},autoOffset:function(){this.setDelta(0,0);}}); + +Ext.grid.GridDragZone=function(_1,_2){this.view=_1.getView();Ext.grid.GridDragZone.superclass.constructor.call(this,this.view.lockedBody.dom,_2);this.setHandleElId(Ext.id(this.view.lockedBody.dom));this.setOuterHandleElId(Ext.id(this.view.mainBody.dom));this.scroll=false;this.grid=_1;this.ddel=document.createElement("div");this.ddel.className="x-grid-dd-wrap";};Ext.extend(Ext.grid.GridDragZone,Ext.dd.DragZone,{ddGroup:"GridDD",getDragData:function(e){var t=Ext.lib.Event.getTarget(e);var _5=this.view.findRowIndex(t);if(_5!==false){var sm=this.grid.selModel;if(!sm.isSelected(_5)||e.hasModifier()){sm.handleMouseDown(e,t);}return {grid:this.grid,ddel:this.ddel,rowIndex:_5,selections:sm.getSelections()};}return false;},onInitDrag:function(e){var _8=this.dragData;this.ddel.innerHTML=this.grid.getDragDropText();this.proxy.update(this.ddel);},afterRepair:function(){this.dragging=false;},getRepairXY:function(e,_a){return false;},onEndDrag:function(_b,e){},onValidDrop:function(dd,e,id){this.hideProxy();},beforeInvalidDrop:function(e,id){}}); + diff --git a/www/extras/yui-ext/package/layout/layout-debug.js b/www/extras/yui-ext/package/layout/layout-debug.js new file mode 100644 index 000000000..249aa8b4e --- /dev/null +++ b/www/extras/yui-ext/package/layout/layout-debug.js @@ -0,0 +1,2032 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + + +Ext.LayoutManager = function(container, config){ + Ext.LayoutManager.superclass.constructor.call(this); + this.el = Ext.get(container); + + if(this.el.dom == document.body && Ext.isIE && !config.allowScroll){ + document.body.scroll = "no"; + }else if(this.el.dom != document.body && this.el.getStyle('position') == 'static'){ + this.el.position('relative'); + } + this.id = this.el.id; + this.el.addClass("x-layout-container"); + + this.monitorWindowResize = true; + this.regions = {}; + this.addEvents({ + + "layout" : true, + + "regionresized" : true, + + "regioncollapsed" : true, + + "regionexpanded" : true + }); + this.updating = false; + Ext.EventManager.onWindowResize(this.onWindowResize, this, true); +}; + +Ext.extend(Ext.LayoutManager, 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){ + size = this.el.getSize(); + }else{ + size = {width: Ext.lib.Dom.getViewWidth(), height: Ext.lib.Dom.getViewHeight()}; + } + 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.toLowerCase()]; + }, + + onWindowResize : function(){ + if(this.monitorWindowResize){ + this.layout(); + } + } +}); + +Ext.BorderLayout = function(container, config){ + config = config || {}; + Ext.BorderLayout.superclass.constructor.call(this, container, config); + this.factory = config.factory || Ext.BorderLayout.RegionFactory; + 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]); + } + } +}; + +Ext.extend(Ext.BorderLayout, Ext.LayoutManager, { + + addRegion : function(target, config){ + if(!this.regions[target]){ + var r = this.factory.create(target, this, config); + this.bindRegion(target, r); + } + return this.regions[target]; + }, + + + bindRegion : function(name, r){ + this.regions[name] = r; + r.on("visibilitychange", this.layout, this); + r.on("paneladded", this.layout, this); + r.on("panelremoved", this.layout, this); + r.on("invalidated", this.layout, this); + r.on("resized", this.onRegionResized, this); + r.on("collapsed", this.onRegionCollapsed, this); + r.on("expanded", this.onRegionExpanded, this); + }, + + + 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 rs = this.regions; + var n = rs["north"], s = rs["south"], west = rs["west"], e = rs["east"], c = rs["center"]; + + + + 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) + }; + + + + 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 = Ext.state.Manager; + } + var sm = new Ext.LayoutStateManager(); + sm.init(this, provider); + }, + + + batchAdd : function(regions){ + this.beginUpdate(); + for(var rname in regions){ + var lr = this.regions[rname]; + if(lr){ + this.addTypedPanels(lr, regions[rname]); + } + } + this.endUpdate(); + }, + + + addTypedPanels : function(lr, ps){ + if(typeof ps == 'string'){ + lr.add(new Ext.ContentPanel(ps)); + } + else if(ps instanceof Array){ + for(var i =0, len = ps.length; i < len; i++){ + this.addTypedPanels(lr, ps[i]); + } + } + else if(!ps.events){ + var el = ps.el; + delete ps.el; + lr.add(new Ext.ContentPanel(el || Ext.id(), ps)); + } + else { + lr.add(ps); + } + } +}); + +Ext.BorderLayout.create = function(config, targetEl){ + var layout = new Ext.BorderLayout(targetEl || document.body, config); + layout.beginUpdate(); + var regions = Ext.BorderLayout.RegionFactory.validRegions; + for(var j = 0, jlen = regions.length; j < jlen; j++){ + var lr = regions[j]; + if(layout.regions[lr] && config[lr].panels){ + var r = layout.regions[lr]; + var ps = config[lr].panels; + layout.addTypedPanels(r, ps); + } + } + layout.endUpdate(); + return layout; +}; + +Ext.BorderLayout.RegionFactory = { + validRegions : ["north","south","east","west","center"], + + create : function(target, mgr, config){ + target = target.toLowerCase(); + if(config.lightweight || config.basic){ + return new Ext.BasicLayoutRegion(mgr, config, target); + } + switch(target){ + case "north": + return new Ext.NorthLayoutRegion(mgr, config); + case "south": + return new Ext.SouthLayoutRegion(mgr, config); + case "east": + return new Ext.EastLayoutRegion(mgr, config); + case "west": + return new Ext.WestLayoutRegion(mgr, config); + case "center": + return new Ext.CenterLayoutRegion(mgr, config); + } + throw 'Layout region "'+target+'" not supported.'; + } +}; + +Ext.BasicLayoutRegion = function(mgr, config, pos, skipConfig){ + this.mgr = mgr; + this.position = pos; + this.events = { + + "beforeremove" : true, + + "invalidated" : true, + + "visibilitychange" : true, + + "paneladded" : true, + + "panelremoved" : true, + + "collapsed" : true, + + "expanded" : true, + + "slideshow" : true, + + "slidehide" : true, + + "panelactivated" : true, + + "resized" : true + }; + + this.panels = new Ext.util.MixedCollection(); + this.panels.getKey = this.getPanelId.createDelegate(this); + this.box = null; + this.activePanel = null; + if(skipConfig !== true){ + this.applyConfig(config); + } +}; + +Ext.extend(Ext.BasicLayoutRegion, Ext.util.Observable, { + getPanelId : function(p){ + return p.getId(); + }, + + applyConfig : function(config){ + this.margins = config.margins || this.margins || {top: 0, left: 0, right:0, bottom: 0}; + this.config = config; + }, + + + resizeTo : function(newSize){ + var el = this.el ? this.el : + (this.activePanel ? this.activePanel.getEl() : null); + if(el){ + switch(this.position){ + case "east": + case "west": + el.setWidth(newSize); + this.fireEvent("resized", this, newSize); + break; + case "north": + case "south": + el.setHeight(newSize); + this.fireEvent("resized", this, newSize); + break; + } + } + }, + + getBox : function(){ + return this.activePanel ? this.activePanel.getEl().getBox(false, true) : null; + }, + + getMargins : function(){ + return this.margins; + }, + + updateBox : function(box){ + this.box = box; + var el = this.activePanel.getEl(); + el.dom.style.left = box.x + "px"; + el.dom.style.top = box.y + "px"; + this.activePanel.setSize(box.width, box.height); + }, + + + getEl : function(){ + return this.activePanel; + }, + + + isVisible : function(){ + return this.activePanel ? true : false; + }, + + setActivePanel : function(panel){ + panel = this.getPanel(panel); + if(this.activePanel && this.activePanel != panel){ + this.activePanel.setActiveState(false); + this.activePanel.getEl().setLeftTop(-10000,-10000); + } + this.activePanel = panel; + panel.setActiveState(true); + if(this.box){ + panel.setSize(this.box.width, this.box.height); + } + this.fireEvent("panelactivated", this, panel); + this.fireEvent("invalidated"); + }, + + + showPanel : function(panel){ + if(panel = this.getPanel(panel)){ + this.setActivePanel(panel); + } + return panel; + }, + + + getActivePanel : function(){ + return this.activePanel; + }, + + + add : function(panel){ + if(arguments.length > 1){ + for(var i = 0, len = arguments.length; i < len; i++) { + this.add(arguments[i]); + } + return null; + } + if(this.hasPanel(panel)){ + this.showPanel(panel); + return panel; + } + var el = panel.getEl(); + if(el.dom.parentNode != this.mgr.el.dom){ + this.mgr.el.dom.appendChild(el.dom); + } + if(panel.setRegion){ + panel.setRegion(this); + } + this.panels.add(panel); + el.setStyle("position", "absolute"); + if(!panel.background){ + this.setActivePanel(panel); + if(this.config.initialSize && this.panels.getCount()==1){ + this.resizeTo(this.config.initialSize); + } + } + this.fireEvent("paneladded", this, panel); + return panel; + }, + + + hasPanel : function(panel){ + if(typeof panel == "object"){ + panel = panel.getId(); + } + return this.getPanel(panel) ? true : false; + }, + + + remove : function(panel, preservePanel){ + panel = this.getPanel(panel); + if(!panel){ + return null; + } + var e = {}; + this.fireEvent("beforeremove", this, panel, e); + if(e.cancel === true){ + return null; + } + var panelId = panel.getId(); + this.panels.removeKey(panelId); + return panel; + }, + + + getPanel : function(id){ + if(typeof id == "object"){ + return id; + } + return this.panels.get(id); + }, + + + getPosition: function(){ + return this.position; + } +}); + +Ext.LayoutRegion = function(mgr, config, pos){ + Ext.LayoutRegion.superclass.constructor.call(this, mgr, config, pos, true); + var dh = Ext.DomHelper; + + this.el = dh.append(mgr.el.dom, {tag: "div", cls: "x-layout-panel x-layout-panel-" + this.position}, true); + + + this.titleEl = dh.append(this.el.dom, {tag: "div", unselectable: "on", cls: "x-unselectable x-layout-panel-hd x-layout-title-"+this.position, children:[ + {tag: "span", cls: "x-unselectable x-layout-panel-hd-text", unselectable: "on", html: " "}, + {tag: "div", cls: "x-unselectable x-layout-panel-hd-tools", unselectable: "on"} + ]}, true); + this.titleEl.enableDisplayMode(); + + this.titleTextEl = this.titleEl.dom.firstChild; + this.tools = Ext.get(this.titleEl.dom.childNodes[1], true); + this.closeBtn = this.createTool(this.tools.dom, "x-layout-close"); + this.closeBtn.enableDisplayMode(); + this.closeBtn.on("click", this.closeClicked, this); + this.closeBtn.hide(); + + this.createBody(config); + this.visible = true; + this.collapsed = false; + + if(config.hideWhenEmpty){ + this.hide(); + this.on("paneladded", this.validateVisibility, this); + this.on("panelremoved", this.validateVisibility, this); + } + this.applyConfig(config); +}; + +Ext.extend(Ext.LayoutRegion, Ext.BasicLayoutRegion, { + + createBody : function(){ + + this.bodyEl = this.el.createChild({tag: "div", cls: "x-layout-panel-body"}); + }, + + applyConfig : function(c){ + if(c.collapsible && this.position != "center" && !this.collapsedEl){ + var dh = Ext.DomHelper; + if(c.titlebar !== false){ + this.collapseBtn = this.createTool(this.tools.dom, "x-layout-collapse-"+this.position); + this.collapseBtn.on("click", this.collapse, this); + this.collapseBtn.enableDisplayMode(); + + if(c.showPin === true || this.showPin){ + this.stickBtn = this.createTool(this.tools.dom, "x-layout-stick"); + this.stickBtn.enableDisplayMode(); + this.stickBtn.on("click", this.expand, this); + this.stickBtn.hide(); + } + } + + this.collapsedEl = dh.append(this.mgr.el.dom, {cls: "x-layout-collapsed x-layout-collapsed-"+this.position, children:[ + {cls: "x-layout-collapsed-tools", children:[{cls: "x-layout-ctools-inner"}]} + ]}, true); + if(c.floatable !== false){ + this.collapsedEl.addClassOnOver("x-layout-collapsed-over"); + this.collapsedEl.on("click", this.collapseClick, this); + } + + if(c.collapsedTitle && (this.position == "north" || this.position== "south")) { + this.collapsedTitleTextEl = dh.append(this.collapsedEl.dom, {tag: "div", cls: "x-unselectable x-layout-panel-hd-text", + id: "message", unselectable: "on", style:{"float":"left"}}); + this.collapsedTitleTextEl.innerHTML = c.collapsedTitle; + } + this.expandBtn = this.createTool(this.collapsedEl.dom.firstChild.firstChild, "x-layout-expand-"+this.position); + this.expandBtn.on("click", this.expand, this); + } + if(this.collapseBtn){ + this.collapseBtn.setVisible(c.collapsible == true); + } + this.cmargins = c.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 = c.margins || this.margins || {top: 0, left: 0, right:0, bottom: 0}; + this.bottomTabs = c.tabPosition != "top"; + this.autoScroll = c.autoScroll || false; + if(this.autoScroll){ + this.bodyEl.setStyle("overflow", "auto"); + }else{ + this.bodyEl.setStyle("overflow", "hidden"); + } + + if((!c.titlebar && !c.title) || c.titlebar === false){ + this.titleEl.hide(); + }else{ + this.titleEl.show(); + if(c.title){ + this.titleTextEl.innerHTML = c.title; + } + } + + this.duration = c.duration || .30; + this.slideDuration = c.slideDuration || .45; + this.config = c; + if(c.collapsed){ + this.collapse(true); + } + if(c.hidden){ + this.hide(); + } + }, + + isVisible : function(){ + return this.visible; + }, + + + setCollapsedTitle : function(title){ + title = title || " "; + if(this.collapsedTitleTextEl){ + this.collapsedTitleTextEl.innerHTML = title; + } + }, + + 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("x-layout-panel-dragover"); + }, + + unhighlight : function(){ + this.el.removeClass("x-layout-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.updateBody(box.width, box.height); + }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(); + } + }, + + updateBody : function(w, h){ + if(w !== null){ + this.el.setWidth(w); + w -= this.el.getBorderWidth("rl"); + if(this.config.adjustments){ + w += this.config.adjustments[0]; + } + } + if(h !== null){ + this.el.setHeight(h); + h = this.titleEl && this.titleEl.isDisplayed() ? h - (this.titleEl.getHeight()||0) : h; + h -= this.el.getBorderWidth("tb"); + if(this.config.adjustments){ + h += this.config.adjustments[1]; + } + this.bodyEl.setHeight(h); + if(this.tabs){ + h = this.tabs.syncHeight(h); + } + } + if(this.panelSize){ + w = w !== null ? w : this.panelSize.width; + h = h !== null ? h : this.panelSize.height; + } + if(this.activePanel){ + var el = this.activePanel.getEl(); + w = w !== null ? w : el.getWidth(); + h = h !== null ? h : el.getHeight(); + this.panelSize = {width: w, height: h}; + this.activePanel.setSize(w, h); + } + if(Ext.isIE && this.tabs){ + this.tabs.el.repaint(); + } + }, + + + 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); + }, + + 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.fireEvent("invalidated", this); + 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 || this.el.hasActiveFx()) return; + if(this.isSlid){ + this.afterSlideIn(); + skipAnim = true; + } + this.collapsed = false; + if(this.config.animate && skipAnim !== true){ + this.animateExpand(); + }else{ + this.el.show(); + 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 Ext.TabPanel(this.bodyEl.dom, { + tabPosition: this.bottomTabs ? 'bottom' : 'top', + disableTooltips: this.config.disableTabTips + }); + if(this.config.hideTabs){ + ts.stripWrap.setDisplayed(false); + } + 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"); + ts.bodyEl.addClass('x-layout-tabs-body'); + 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()); + if(panel.tabTip !== undefined){ + ti.setTooltip(panel.tabTip); + } + ti.on("activate", function(){ + this.setActivePanel(panel); + }, this); + if(this.config.closeOnTab){ + ti.on("beforeclose", function(t, e){ + e.cancel = true; + this.remove(panel); + }, this); + } + return ti; + }, + + updatePanelTitle : function(panel, title){ + if(this.activePanel == panel){ + this.updateTitle(title); + } + if(this.tabs){ + var ti = this.tabs.getTab(panel.getEl().id); + ti.setText(title); + if(panel.tabTip !== undefined){ + ti.setTooltip(panel.tabTip); + } + } + }, + + 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); + } + if(this.closeBtn){ + this.closeBtn.setVisible(!this.config.closeOnTab && !this.isSlid && panel.isClosable()); + } + this.updateTitle(panel.getTitle()); + if(this.tabs){ + this.fireEvent("invalidated", this); + } + this.fireEvent("panelactivated", this, panel); + }, + + + showPanel : function(panel){ + if(panel = this.getPanel(panel)){ + if(this.tabs){ + var tab = this.tabs.getTab(panel.getEl().id); + if(tab.isHidden()){ + this.tabs.unhideTab(tab.id); + } + tab.activate(); + }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; + } + if(this.hasPanel(panel)){ + this.showPanel(panel); + return panel; + } + panel.setRegion(this); + this.panels.add(panel); + if(this.panels.getCount() == 1 && !this.config.alwaysShowTabs){ + this.bodyEl.dom.appendChild(panel.getEl().dom); + if(panel.background !== true){ + this.setActivePanel(panel); + } + this.fireEvent("paneladded", this, panel); + return panel; + } + if(!this.tabs){ + this.initTabs(); + }else{ + this.initPanelAsTab(panel); + } + if(panel.background !== true){ + this.tabs.activate(panel.getEl().id); + } + this.fireEvent("paneladded", this, panel); + return panel; + }, + + + 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); + } + }, + + clearPanels : function(){ + while(this.panels.getCount() > 0){ + this.remove(this.panels.first()); + } + }, + + + remove : function(panel, preservePanel){ + panel = this.getPanel(panel); + if(!panel){ + return null; + } + var e = {}; + this.fireEvent("beforeremove", this, panel, e); + if(e.cancel === true){ + return null; + } + preservePanel = (typeof preservePanel != "undefined" ? preservePanel : (this.config.preservePanels === true || panel.preserve === 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("div"); + 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; + }, + + createTool : function(parentEl, className){ + var btn = Ext.DomHelper.append(parentEl, {tag: "div", cls: "x-layout-tools-button", + children: [{tag: "div", cls: "x-layout-tools-button-inner " + className, html: " "}]}, true); + btn.addClassOnOver("x-layout-tools-button-over"); + return btn; + } +}); + +Ext.SplitLayoutRegion = function(mgr, config, pos, cursor){ + this.cursor = cursor; + Ext.SplitLayoutRegion.superclass.constructor.call(this, mgr, config, pos); +}; + +Ext.extend(Ext.SplitLayoutRegion, Ext.LayoutRegion, { + splitTip : "Drag to resize.", + collapsibleSplitTip : "Drag to resize. Double click to hide.", + useSplitTips : false, + + applyConfig : function(config){ + Ext.SplitLayoutRegion.superclass.applyConfig.call(this, config); + if(config.split){ + if(!this.split){ + var splitEl = Ext.DomHelper.append(this.mgr.el.dom, + {tag: "div", id: this.el.id + "-split", cls: "x-layout-split x-layout-split-"+this.position, html: " "}); + + this.split = new Ext.SplitBar(splitEl, this.el, this.orientation); + this.split.on("moved", this.onSplitMove, this); + this.split.useShim = config.useShim === true; + this.split.getMaximumSize = this[this.position == 'north' || this.position == 'south' ? 'getVMaxSize' : 'getHMaxSize'].createDelegate(this); + if(this.useSplitTips){ + this.split.el.dom.title = config.collapsible ? this.collapsibleSplitTip : this.splitTip; + } + if(config.collapsible){ + this.split.el.on("dblclick", this.collapse, this); + } + } + if(typeof config.minSize != "undefined"){ + this.split.minSize = config.minSize; + } + if(typeof config.maxSize != "undefined"){ + this.split.maxSize = config.maxSize; + } + if(config.hideWhenEmpty || config.hidden){ + this.hideSplitter(); + } + } + }, + + getHMaxSize : 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()); + }, + + getVMaxSize : function(){ + var cmax = this.config.maxSize || 10000; + var center = this.mgr.getRegion("center"); + return Math.min(cmax, (this.el.getHeight()+center.getEl().getHeight())-center.getMinHeight()); + }, + + onSplitMove : function(split, newSize){ + this.fireEvent("resized", this, newSize); + }, + + + getSplitBar : function(){ + return this.split; + }, + + hide : function(){ + this.hideSplitter(); + Ext.SplitLayoutRegion.superclass.hide.call(this); + }, + + hideSplitter : function(){ + if(this.split){ + this.split.el.setLocation(-2000,-2000); + this.split.el.hide(); + } + }, + + show : function(){ + if(this.split){ + this.split.el.show(); + } + Ext.SplitLayoutRegion.superclass.show.call(this); + }, + + beforeSlide: function(){ + if(Ext.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(Ext.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(); + } + } + } + }, + + initAutoHide : function(){ + if(this.autoHide !== false){ + if(!this.autoHideHd){ + var st = new Ext.util.DelayedTask(this.slideIn, this); + this.autoHideHd = { + "mouseout": function(e){ + if(!e.within(this.el, true)){ + st.delay(500); + } + }, + "mouseover" : function(e){ + st.cancel(); + }, + scope : this + }; + } + this.el.on(this.autoHideHd); + } + }, + + clearAutoHide : function(){ + if(this.autoHide !== false){ + this.el.un("mouseout", this.autoHideHd.mouseout); + this.el.un("mouseover", this.autoHideHd.mouseover); + } + }, + + clearMonitor : function(){ + Ext.get(document).un("click", this.slideInIf, this); + }, + + + slideOut : function(){ + if(this.isSlid || this.el.hasActiveFx()){ + return; + } + this.isSlid = true; + if(this.collapseBtn){ + this.collapseBtn.hide(); + } + this.closeBtnState = this.closeBtn.getStyle('display'); + this.closeBtn.hide(); + if(this.stickBtn){ + this.stickBtn.show(); + } + this.el.show(); + this.el.alignTo(this.collapsedEl, this.getCollapseAnchor()); + this.beforeSlide(); + this.el.setStyle("z-index", 20000); + this.el.slideIn(this.getSlideAnchor(), { + callback: function(){ + this.afterSlide(); + this.initAutoHide(); + Ext.get(document).on("click", this.slideInIf, this); + this.fireEvent("slideshow", this); + }, + scope: this, + block: true + }); + }, + + afterSlideIn : function(){ + this.clearAutoHide(); + this.isSlid = false; + this.clearMonitor(); + this.el.setStyle("z-index", ""); + if(this.collapseBtn){ + this.collapseBtn.show(); + } + this.closeBtn.setStyle('display', this.closeBtnState); + if(this.stickBtn){ + this.stickBtn.hide(); + } + this.fireEvent("slidehide", this); + }, + + slideIn : function(cb){ + if(!this.isSlid || this.el.hasActiveFx()){ + Ext.callback(cb); + return; + } + this.isSlid = false; + this.beforeSlide(); + this.el.slideOut(this.getSlideAnchor(), { + callback: function(){ + this.el.setLeftTop(-10000, -10000); + this.afterSlide(); + this.afterSlideIn(); + Ext.callback(cb); + }, + scope: this, + block: true + }); + }, + + slideInIf : function(e){ + if(!e.within(this.el)){ + this.slideIn(); + } + }, + + animateCollapse : function(){ + this.beforeSlide(); + this.el.setStyle("z-index", 20000); + var anchor = this.getSlideAnchor(); + this.el.slideOut(anchor, { + callback : function(){ + this.el.setStyle("z-index", ""); + this.collapsedEl.slideIn(anchor, {duration:.3}); + this.afterSlide(); + this.el.setLocation(-10000,-10000); + this.el.hide(); + this.fireEvent("collapsed", this); + }, + scope: this, + block: true + }); + }, + + animateExpand : function(){ + this.beforeSlide(); + this.el.alignTo(this.collapsedEl, this.getCollapseAnchor(), this.getExpandAdj()); + this.el.setStyle("z-index", 20000); + this.collapsedEl.hide({ + duration:.1 + }); + this.el.slideIn(this.getSlideAnchor(), { + callback : function(){ + this.el.setStyle("z-index", ""); + this.afterSlide(); + if(this.split){ + this.split.el.show(); + } + this.fireEvent("invalidated", this); + this.fireEvent("expanded", this); + }, + scope: this, + block: true + }); + }, + + anchors : { + "west" : "left", + "east" : "right", + "north" : "top", + "south" : "bottom" + }, + + sanchors : { + "west" : "l", + "east" : "r", + "north" : "t", + "south" : "b" + }, + + canchors : { + "west" : "tl-tr", + "east" : "tr-tl", + "north" : "tl-bl", + "south" : "bl-tl" + }, + + getAnchor : function(){ + return this.anchors[this.position]; + }, + + getCollapseAnchor : function(){ + return this.canchors[this.position]; + }, + + getSlideAnchor : function(){ + return this.sanchors[this.position]; + }, + + getAlignAdj : function(){ + var cm = this.cmargins; + switch(this.position){ + case "west": + return [0, 0]; + break; + case "east": + return [0, 0]; + break; + case "north": + return [0, 0]; + break; + case "south": + return [0, 0]; + break; + } + }, + + getExpandAdj : function(){ + var c = this.collapsedEl, cm = this.cmargins; + switch(this.position){ + case "west": + return [-(cm.right+c.getWidth()+cm.left), 0]; + break; + case "east": + return [cm.right+c.getWidth()+cm.left, 0]; + break; + case "north": + return [0, -(cm.top+cm.bottom+c.getHeight())]; + break; + case "south": + return [0, cm.top+cm.bottom+c.getHeight()]; + break; + } + } +}); + +Ext.CenterLayoutRegion = function(mgr, config){ + Ext.CenterLayoutRegion.superclass.constructor.call(this, mgr, config, "center"); + this.visible = true; + this.minWidth = config.minWidth || 20; + this.minHeight = config.minHeight || 20; +}; + +Ext.extend(Ext.CenterLayoutRegion, Ext.LayoutRegion, { + hide : function(){ + + }, + + show : function(){ + + }, + + getMinWidth: function(){ + return this.minWidth; + }, + + getMinHeight: function(){ + return this.minHeight; + } +}); + + +Ext.NorthLayoutRegion = function(mgr, config){ + Ext.NorthLayoutRegion.superclass.constructor.call(this, mgr, config, "north", "n-resize"); + if(this.split){ + this.split.placement = Ext.SplitBar.TOP; + this.split.orientation = Ext.SplitBar.VERTICAL; + this.split.el.addClass("x-layout-split-v"); + } + var size = config.initialSize || config.height; + if(typeof size != "undefined"){ + this.el.setHeight(size); + } +}; +Ext.extend(Ext.NorthLayoutRegion, Ext.SplitLayoutRegion, { + orientation: Ext.SplitBar.VERTICAL, + 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.updateBody(box.width, null); + } + Ext.NorthLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +Ext.SouthLayoutRegion = function(mgr, config){ + Ext.SouthLayoutRegion.superclass.constructor.call(this, mgr, config, "south", "s-resize"); + if(this.split){ + this.split.placement = Ext.SplitBar.BOTTOM; + this.split.orientation = Ext.SplitBar.VERTICAL; + this.split.el.addClass("x-layout-split-v"); + } + var size = config.initialSize || config.height; + if(typeof size != "undefined"){ + this.el.setHeight(size); + } +}; +Ext.extend(Ext.SouthLayoutRegion, Ext.SplitLayoutRegion, { + orientation: Ext.SplitBar.VERTICAL, + 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.updateBody(box.width, null); + } + Ext.SouthLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +Ext.EastLayoutRegion = function(mgr, config){ + Ext.EastLayoutRegion.superclass.constructor.call(this, mgr, config, "east", "e-resize"); + if(this.split){ + this.split.placement = Ext.SplitBar.RIGHT; + this.split.orientation = Ext.SplitBar.HORIZONTAL; + this.split.el.addClass("x-layout-split-h"); + } + var size = config.initialSize || config.width; + if(typeof size != "undefined"){ + this.el.setWidth(size); + } +}; +Ext.extend(Ext.EastLayoutRegion, Ext.SplitLayoutRegion, { + orientation: Ext.SplitBar.HORIZONTAL, + 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.updateBody(null, box.height); + } + Ext.EastLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +Ext.WestLayoutRegion = function(mgr, config){ + Ext.WestLayoutRegion.superclass.constructor.call(this, mgr, config, "west", "w-resize"); + if(this.split){ + this.split.placement = Ext.SplitBar.LEFT; + this.split.orientation = Ext.SplitBar.HORIZONTAL; + this.split.el.addClass("x-layout-split-h"); + } + var size = config.initialSize || config.width; + if(typeof size != "undefined"){ + this.el.setWidth(size); + } +}; +Ext.extend(Ext.WestLayoutRegion, Ext.SplitLayoutRegion, { + orientation: Ext.SplitBar.HORIZONTAL, + 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.updateBody(null, box.height); + } + Ext.WestLayoutRegion.superclass.updateBox.call(this, box); + } +}); + + +Ext.LayoutStateManager = function(layout){ + + this.state = { + north: {}, + south: {}, + east: {}, + west: {} + }; +}; + +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); + layout.on("regioncollapsed", this.onRegionCollapsed, this); + layout.on("regionexpanded", this.onRegionExpanded, this); + }, + + 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(); + } +}; + +Ext.ContentPanel = function(el, config, content){ + Ext.ContentPanel.superclass.constructor.call(this); + if(el.autoCreate){ + config = el; + el = Ext.id(); + } + this.el = Ext.get(el); + if(!this.el && config && config.autoCreate){ + if(typeof config.autoCreate == "object"){ + if(!config.autoCreate.id){ + config.autoCreate.id = config.id||el; + } + this.el = Ext.DomHelper.append(document.body, + config.autoCreate, true); + }else{ + this.el = Ext.DomHelper.append(document.body, + {tag: "div", cls: "x-layout-inactive-content", id: config.id||el}, true); + } + } + this.closable = false; + this.loaded = false; + this.active = false; + if(typeof config == "string"){ + this.title = config; + }else{ + Ext.apply(this, config); + } + if(this.resizeEl){ + this.resizeEl = Ext.get(this.resizeEl, true); + }else{ + this.resizeEl = this.el; + } + this.addEvents({ + + "activate" : true, + + "deactivate" : true, + + + "resize" : true + }); + if(this.autoScroll){ + this.resizeEl.setStyle("overflow", "auto"); + } + content = content || this.content; + if(content){ + this.setContent(content); + } + if(config && config.url){ + this.setUrl(this.url, this.params, this.loadOnce); + } +}; + +Ext.extend(Ext.ContentPanel, Ext.util.Observable, { + tabTip:'', + setRegion : function(region){ + this.region = region; + if(region){ + this.el.replaceClass("x-layout-inactive-content", "x-layout-active-content"); + }else{ + this.el.replaceClass("x-layout-active-content", "x-layout-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); + }, + + ignoreResize : function(w, h){ + if(this.lastSize && this.lastSize.width == w && this.lastSize.height == h){ + return true; + }else{ + this.lastSize = {width: w, height: h}; + return false; + } + }, + + getUpdateManager : function(){ + return this.el.getUpdateManager(); + }, + + load : function(){ + var um = this.el.getUpdateManager(); + um.update.apply(um, arguments); + return this; + }, + + + + 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.resizeEl != this.el){ + width -= this.el.getFrameWidth('lr'); + height -= this.el.getFrameWidth('tb'); + } + if(this.toolbar){ + var te = this.toolbar.getEl(); + height -= te.getHeight(); + te.setWidth(width); + } + if(this.adjustments){ + width += this.adjustments[0]; + height += this.adjustments[1]; + } + return {"width": width, "height": height}; + }, + + setSize : function(width, height){ + if(this.fitToFrame && !this.ignoreResize(width, height)){ + if(this.fitContainer && this.resizeEl != this.el){ + this.el.setSize(width, height); + } + var size = this.adjustForComponents(width, height); + this.resizeEl.setSize(this.autoWidth ? "auto" : size.width, this.autoHeight ? "auto" : size.height); + this.fireEvent('resize', this, 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(); + }, + + + refresh : function(){ + if(this.refreshDelegate){ + this.loaded = false; + this.refreshDelegate(); + } + }, + + + destroy : function(){ + this.el.removeAllListeners(); + var tempEl = document.createElement("span"); + tempEl.appendChild(this.el.dom); + tempEl.innerHTML = ""; + this.el.remove(); + this.el = null; + } +}); + + +Ext.GridPanel = function(grid, config){ + this.wrapper = Ext.DomHelper.append(document.body, + {tag: "div", cls: "x-layout-grid-wrapper x-layout-inactive-content"}, true); + this.wrapper.dom.appendChild(grid.container.dom); + 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("x-layout-inactive-content", "x-layout-component-panel"); +}; + +Ext.extend(Ext.GridPanel, Ext.ContentPanel, { + getId : function(){ + return this.grid.id; + }, + + + getGrid : function(){ + return this.grid; + }, + + setSize : function(width, height){ + if(!this.ignoreResize(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().scroller.clip(); + }, + + afterSlide : function(){ + this.grid.getView().scroller.unclip(); + }, + + destroy : function(){ + this.grid.destroy(); + delete this.grid; + Ext.GridPanel.superclass.destroy.call(this); + } +}); + + + +Ext.NestedLayoutPanel = function(layout, config){ + Ext.NestedLayoutPanel.superclass.constructor.call(this, layout.getEl(), config); + layout.monitorWindowResize = false; + this.layout = layout; + this.layout.getEl().addClass("x-layout-nested-layout"); +}; + +Ext.extend(Ext.NestedLayoutPanel, Ext.ContentPanel, { + + setSize : function(width, height){ + if(!this.ignoreResize(width, height)){ + var size = this.adjustForComponents(width, height); + var el = this.layout.getEl(); + el.setSize(size.width, size.height); + var touch = el.dom.offsetWidth; + this.layout.layout(); + + if(Ext.isIE && !this.initialized){ + this.initialized = true; + this.layout.layout(); + } + } + }, + + + getLayout : function(){ + return this.layout; + } +}); + +Ext.ScrollPanel = function(el, config, content){ + config = config || {}; + config.fitToFrame = true; + Ext.ScrollPanel.superclass.constructor.call(this, el, config, content); + + this.el.dom.style.overflow = "hidden"; + var wrap = this.el.wrap({cls: "x-scroller x-layout-inactive-content"}); + this.el.removeClass("x-layout-inactive-content"); + this.el.on("mousewheel", this.onWheel, this); + + var up = wrap.createChild({cls: "x-scroller-up", html: " "}, this.el.dom); + var down = wrap.createChild({cls: "x-scroller-down", html: " "}); + up.unselectable(); down.unselectable(); + up.on("click", this.scrollUp, this); + down.on("click", this.scrollDown, this); + up.addClassOnOver("x-scroller-btn-over"); + down.addClassOnOver("x-scroller-btn-over"); + up.addClassOnClick("x-scroller-btn-click"); + down.addClassOnClick("x-scroller-btn-click"); + this.adjustments = [0, -(up.getHeight() + down.getHeight())]; + + this.resizeEl = this.el; + this.el = wrap; this.up = up; this.down = down; +}; + +Ext.extend(Ext.ScrollPanel, Ext.ContentPanel, { + increment : 100, + wheelIncrement : 5, + scrollUp : function(){ + this.resizeEl.scroll("up", this.increment, {callback: this.afterScroll, scope: this}); + }, + + scrollDown : function(){ + this.resizeEl.scroll("down", this.increment, {callback: this.afterScroll, scope: this}); + }, + + afterScroll : function(){ + var el = this.resizeEl; + var t = el.dom.scrollTop, h = el.dom.scrollHeight, ch = el.dom.clientHeight; + this.up[t == 0 ? "addClass" : "removeClass"]("x-scroller-btn-disabled"); + this.down[h - t <= ch ? "addClass" : "removeClass"]("x-scroller-btn-disabled"); + }, + + setSize : function(){ + Ext.ScrollPanel.superclass.setSize.apply(this, arguments); + this.afterScroll(); + }, + + onWheel : function(e){ + var d = e.getWheelDelta(); + this.resizeEl.dom.scrollTop -= (d*this.wheelIncrement); + this.afterScroll(); + e.stopEvent(); + }, + + setContent : function(content, loadScripts){ + this.resizeEl.update(content, loadScripts); + } + +}); + +Ext.ReaderLayout = function(config, renderTo){ + var c = config || {size:{}}; + Ext.ReaderLayout.superclass.constructor.call(this, renderTo || document.body, { + north: c.north !== false ? Ext.apply({ + split:false, + initialSize: 32, + titlebar: false + }, c.north) : false, + west: c.west !== false ? Ext.apply({ + split:true, + initialSize: 200, + minSize: 175, + maxSize: 400, + titlebar: true, + collapsible: true, + animate: true, + margins:{left:5,right:0,bottom:5,top:5}, + cmargins:{left:5,right:5,bottom:5,top:5} + }, c.west) : false, + east: c.east !== false ? Ext.apply({ + split:true, + initialSize: 200, + minSize: 175, + maxSize: 400, + titlebar: true, + collapsible: true, + animate: true, + margins:{left:0,right:5,bottom:5,top:5}, + cmargins:{left:5,right:5,bottom:5,top:5} + }, c.east) : false, + center: Ext.apply({ + tabPosition: 'top', + autoScroll:false, + closeOnTab: true, + titlebar:false, + margins:{left:c.west!==false ? 0 : 5,right:c.east!==false ? 0 : 5,bottom:5,top:2} + }, c.center) + }); + + this.el.addClass('x-reader'); + + this.beginUpdate(); + + var inner = new Ext.BorderLayout(Ext.get(document.body).createChild(), { + south: c.preview !== false ? Ext.apply({ + split:true, + initialSize: 200, + minSize: 100, + autoScroll:true, + collapsible:true, + titlebar: true, + cmargins:{top:5,left:0, right:0, bottom:0} + }, c.preview) : false, + center: Ext.apply({ + autoScroll:false, + titlebar:false, + minHeight:200 + }, c.listView) + }); + this.add('center', new Ext.NestedLayoutPanel(inner, + Ext.apply({title: c.mainTitle || '',tabTip:''},c.innerPanelCfg))); + + this.endUpdate(); + + this.regions.preview = inner.getRegion('south'); + this.regions.listView = inner.getRegion('center'); +}; + +Ext.extend(Ext.ReaderLayout, Ext.BorderLayout); diff --git a/www/extras/yui-ext/package/layout/layout.js b/www/extras/yui-ext/package/layout/layout.js new file mode 100644 index 000000000..cff9f0ddb --- /dev/null +++ b/www/extras/yui-ext/package/layout/layout.js @@ -0,0 +1,26 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.LayoutManager=function(_1,_2){Ext.LayoutManager.superclass.constructor.call(this);this.el=Ext.get(_1);if(this.el.dom==document.body&&Ext.isIE&&!_2.allowScroll){document.body.scroll="no";}else{if(this.el.dom!=document.body&&this.el.getStyle("position")=="static"){this.el.position("relative");}}this.id=this.el.id;this.el.addClass("x-layout-container");this.monitorWindowResize=true;this.regions={};this.addEvents({"layout":true,"regionresized":true,"regioncollapsed":true,"regionexpanded":true});this.updating=false;Ext.EventManager.onWindowResize(this.onWindowResize,this,true);};Ext.extend(Ext.LayoutManager,Ext.util.Observable,{isUpdating:function(){return this.updating;},beginUpdate:function(){this.updating=true;},endUpdate:function(_3){this.updating=false;if(!_3){this.layout();}},layout:function(){},onRegionResized:function(_4,_5){this.fireEvent("regionresized",_4,_5);this.layout();},onRegionCollapsed:function(_6){this.fireEvent("regioncollapsed",_6);},onRegionExpanded:function(_7){this.fireEvent("regionexpanded",_7);},getViewSize:function(){var _8;if(this.el.dom!=document.body){_8=this.el.getSize();}else{_8={width:Ext.lib.Dom.getViewWidth(),height:Ext.lib.Dom.getViewHeight()};}_8.width-=this.el.getBorderWidth("lr")-this.el.getPadding("lr");_8.height-=this.el.getBorderWidth("tb")-this.el.getPadding("tb");return _8;},getEl:function(){return this.el;},getRegion:function(_9){return this.regions[_9.toLowerCase()];},onWindowResize:function(){if(this.monitorWindowResize){this.layout();}}}); + +Ext.BorderLayout=function(_1,_2){_2=_2||{};Ext.BorderLayout.superclass.constructor.call(this,_1,_2);this.factory=_2.factory||Ext.BorderLayout.RegionFactory;for(var i=0,_4=this.factory.validRegions.length;i<_4;i++){var _5=this.factory.validRegions[i];if(_2[_5]){this.addRegion(_5,_2[_5]);}}};Ext.extend(Ext.BorderLayout,Ext.LayoutManager,{addRegion:function(_6,_7){if(!this.regions[_6]){var r=this.factory.create(_6,this,_7);this.bindRegion(_6,r);}return this.regions[_6];},bindRegion:function(_9,r){this.regions[_9]=r;r.on("visibilitychange",this.layout,this);r.on("paneladded",this.layout,this);r.on("panelremoved",this.layout,this);r.on("invalidated",this.layout,this);r.on("resized",this.onRegionResized,this);r.on("collapsed",this.onRegionCollapsed,this);r.on("expanded",this.onRegionExpanded,this);},layout:function(){if(this.updating){return;}var _b=this.getViewSize();var w=_b.width,h=_b.height;var _e=w,_f=h,_10=0,_11=0;var rs=this.regions;var n=rs["north"],s=rs["south"],_15=rs["west"],e=rs["east"],c=rs["center"];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;_10=b.height+b.y+m.bottom;_f-=_10;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 _1a=(b.height+m.top+m.bottom);b.y=h-_1a+m.top;_f-=_1a;s.updateBox(this.safeBox(b));}if(_15&&_15.isVisible()){var b=_15.getBox();var m=_15.getMargins();b.height=_f-(m.top+m.bottom);b.x=m.left;b.y=_10+m.top;var _1b=(b.width+m.left+m.right);_11+=_1b;_e-=_1b;_15.updateBox(this.safeBox(b));}if(e&&e.isVisible()){var b=e.getBox();var m=e.getMargins();b.height=_f-(m.top+m.bottom);var _1b=(b.width+m.left+m.right);b.x=w-_1b+m.left;b.y=_10+m.top;_e-=_1b;e.updateBox(this.safeBox(b));}if(c){var m=c.getMargins();var _1c={x:_11+m.left,y:_10+m.top,width:_e-(m.left+m.right),height:_f-(m.top+m.bottom)};c.updateBox(this.safeBox(_1c));}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(_1e,_1f){_1e=_1e.toLowerCase();return this.regions[_1e].add(_1f);},remove:function(_20,_21){_20=_20.toLowerCase();return this.regions[_20].remove(_21);},findPanel:function(_22){var rs=this.regions;for(var _24 in rs){if(typeof rs[_24]!="function"){var p=rs[_24].getPanel(_22);if(p){return p;}}}return null;},showPanel:function(_26){var rs=this.regions;for(var _28 in rs){var r=rs[_28];if(typeof r!="function"){if(r.hasPanel(_26)){return r.showPanel(_26);}}}return null;},restoreState:function(_2a){if(!_2a){_2a=Ext.state.Manager;}var sm=new Ext.LayoutStateManager();sm.init(this,_2a);},batchAdd:function(_2c){this.beginUpdate();for(var _2d in _2c){var lr=this.regions[_2d];if(lr){this.addTypedPanels(lr,_2c[_2d]);}}this.endUpdate();},addTypedPanels:function(lr,ps){if(typeof ps=="string"){lr.add(new Ext.ContentPanel(ps));}else{if(ps instanceof Array){for(var i=0,len=ps.length;i1){for(var i=0,_f=arguments.length;i<_f;i++){this.add(arguments[i]);}return null;}if(this.hasPanel(_d)){this.showPanel(_d);return _d;}var el=_d.getEl();if(el.dom.parentNode!=this.mgr.el.dom){this.mgr.el.dom.appendChild(el.dom);}if(_d.setRegion){_d.setRegion(this);}this.panels.add(_d);el.setStyle("position","absolute");if(!_d.background){this.setActivePanel(_d);if(this.config.initialSize&&this.panels.getCount()==1){this.resizeTo(this.config.initialSize);}}this.fireEvent("paneladded",this,_d);return _d;},hasPanel:function(_11){if(typeof _11=="object"){_11=_11.getId();}return this.getPanel(_11)?true:false;},remove:function(_12,_13){_12=this.getPanel(_12);if(!_12){return null;}var e={};this.fireEvent("beforeremove",this,_12,e);if(e.cancel===true){return null;}var _15=_12.getId();this.panels.removeKey(_15);return _12;},getPanel:function(id){if(typeof id=="object"){return id;}return this.panels.get(id);},getPosition:function(){return this.position;}}); + +Ext.LayoutRegion=function(_1,_2,_3){Ext.LayoutRegion.superclass.constructor.call(this,_1,_2,_3,true);var dh=Ext.DomHelper;this.el=dh.append(_1.el.dom,{tag:"div",cls:"x-layout-panel x-layout-panel-"+this.position},true);this.titleEl=dh.append(this.el.dom,{tag:"div",unselectable:"on",cls:"x-unselectable x-layout-panel-hd x-layout-title-"+this.position,children:[{tag:"span",cls:"x-unselectable x-layout-panel-hd-text",unselectable:"on",html:" "},{tag:"div",cls:"x-unselectable x-layout-panel-hd-tools",unselectable:"on"}]},true);this.titleEl.enableDisplayMode();this.titleTextEl=this.titleEl.dom.firstChild;this.tools=Ext.get(this.titleEl.dom.childNodes[1],true);this.closeBtn=this.createTool(this.tools.dom,"x-layout-close");this.closeBtn.enableDisplayMode();this.closeBtn.on("click",this.closeClicked,this);this.closeBtn.hide();this.createBody(_2);this.visible=true;this.collapsed=false;if(_2.hideWhenEmpty){this.hide();this.on("paneladded",this.validateVisibility,this);this.on("panelremoved",this.validateVisibility,this);}this.applyConfig(_2);};Ext.extend(Ext.LayoutRegion,Ext.BasicLayoutRegion,{createBody:function(){this.bodyEl=this.el.createChild({tag:"div",cls:"x-layout-panel-body"});},applyConfig:function(c){if(c.collapsible&&this.position!="center"&&!this.collapsedEl){var dh=Ext.DomHelper;if(c.titlebar!==false){this.collapseBtn=this.createTool(this.tools.dom,"x-layout-collapse-"+this.position);this.collapseBtn.on("click",this.collapse,this);this.collapseBtn.enableDisplayMode();if(c.showPin===true||this.showPin){this.stickBtn=this.createTool(this.tools.dom,"x-layout-stick");this.stickBtn.enableDisplayMode();this.stickBtn.on("click",this.expand,this);this.stickBtn.hide();}}this.collapsedEl=dh.append(this.mgr.el.dom,{cls:"x-layout-collapsed x-layout-collapsed-"+this.position,children:[{cls:"x-layout-collapsed-tools",children:[{cls:"x-layout-ctools-inner"}]}]},true);if(c.floatable!==false){this.collapsedEl.addClassOnOver("x-layout-collapsed-over");this.collapsedEl.on("click",this.collapseClick,this);}if(c.collapsedTitle&&(this.position=="north"||this.position=="south")){this.collapsedTitleTextEl=dh.append(this.collapsedEl.dom,{tag:"div",cls:"x-unselectable x-layout-panel-hd-text",id:"message",unselectable:"on",style:{"float":"left"}});this.collapsedTitleTextEl.innerHTML=c.collapsedTitle;}this.expandBtn=this.createTool(this.collapsedEl.dom.firstChild.firstChild,"x-layout-expand-"+this.position);this.expandBtn.on("click",this.expand,this);}if(this.collapseBtn){this.collapseBtn.setVisible(c.collapsible==true);}this.cmargins=c.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=c.margins||this.margins||{top:0,left:0,right:0,bottom:0};this.bottomTabs=c.tabPosition!="top";this.autoScroll=c.autoScroll||false;if(this.autoScroll){this.bodyEl.setStyle("overflow","auto");}else{this.bodyEl.setStyle("overflow","hidden");}if((!c.titlebar&&!c.title)||c.titlebar===false){this.titleEl.hide();}else{this.titleEl.show();if(c.title){this.titleTextEl.innerHTML=c.title;}}this.duration=c.duration||0.3;this.slideDuration=c.slideDuration||0.45;this.config=c;if(c.collapsed){this.collapse(true);}if(c.hidden){this.hide();}},isVisible:function(){return this.visible;},setCollapsedTitle:function(_7){_7=_7||" ";if(this.collapsedTitleTextEl){this.collapsedTitleTextEl.innerHTML=_7;}},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("x-layout-panel-dragover");},unhighlight:function(){this.el.removeClass("x-layout-panel-dragover");},updateBox:function(_9){this.box=_9;if(!this.collapsed){this.el.dom.style.left=_9.x+"px";this.el.dom.style.top=_9.y+"px";this.updateBody(_9.width,_9.height);}else{this.collapsedEl.dom.style.left=_9.x+"px";this.collapsedEl.dom.style.top=_9.y+"px";this.collapsedEl.setSize(_9.width,_9.height);}if(this.tabs){this.tabs.autoSizeTabs();}},updateBody:function(w,h){if(w!==null){this.el.setWidth(w);w-=this.el.getBorderWidth("rl");if(this.config.adjustments){w+=this.config.adjustments[0];}}if(h!==null){this.el.setHeight(h);h=this.titleEl&&this.titleEl.isDisplayed()?h-(this.titleEl.getHeight()||0):h;h-=this.el.getBorderWidth("tb");if(this.config.adjustments){h+=this.config.adjustments[1];}this.bodyEl.setHeight(h);if(this.tabs){h=this.tabs.syncHeight(h);}}if(this.panelSize){w=w!==null?w:this.panelSize.width;h=h!==null?h:this.panelSize.height;}if(this.activePanel){var el=this.activePanel.getEl();w=w!==null?w:el.getWidth();h=h!==null?h:el.getHeight();this.panelSize={width:w,height:h};this.activePanel.setSize(w,h);}if(Ext.isIE&&this.tabs){this.tabs.el.repaint();}},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);},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(_e){if(this.collapsed){return;}this.collapsed=true;if(this.split){this.split.el.hide();}if(this.config.animate&&_e!==true){this.fireEvent("invalidated",this);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,_10){if(e){e.stopPropagation();}if(!this.collapsed||this.el.hasActiveFx()){return;}if(this.isSlid){this.afterSlideIn();_10=true;}this.collapsed=false;if(this.config.animate&&_10!==true){this.animateExpand();}else{this.el.show();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 Ext.TabPanel(this.bodyEl.dom,{tabPosition:this.bottomTabs?"bottom":"top",disableTooltips:this.config.disableTabTips});if(this.config.hideTabs){ts.stripWrap.setDisplayed(false);}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");ts.bodyEl.addClass("x-layout-tabs-body");this.panels.each(this.initPanelAsTab,this);},initPanelAsTab:function(_12){var ti=this.tabs.addTab(_12.getEl().id,_12.getTitle(),null,this.config.closeOnTab&&_12.isClosable());if(_12.tabTip!==undefined){ti.setTooltip(_12.tabTip);}ti.on("activate",function(){this.setActivePanel(_12);},this);if(this.config.closeOnTab){ti.on("beforeclose",function(t,e){e.cancel=true;this.remove(_12);},this);}return ti;},updatePanelTitle:function(_16,_17){if(this.activePanel==_16){this.updateTitle(_17);}if(this.tabs){var ti=this.tabs.getTab(_16.getEl().id);ti.setText(_17);if(_16.tabTip!==undefined){ti.setTooltip(_16.tabTip);}}},updateTitle:function(_19){if(this.titleTextEl&&!this.config.title){this.titleTextEl.innerHTML=(typeof _19!="undefined"&&_19.length>0?_19:" ");}},setActivePanel:function(_1a){_1a=this.getPanel(_1a);if(this.activePanel&&this.activePanel!=_1a){this.activePanel.setActiveState(false);}this.activePanel=_1a;_1a.setActiveState(true);if(this.panelSize){_1a.setSize(this.panelSize.width,this.panelSize.height);}if(this.closeBtn){this.closeBtn.setVisible(!this.config.closeOnTab&&!this.isSlid&&_1a.isClosable());}this.updateTitle(_1a.getTitle());if(this.tabs){this.fireEvent("invalidated",this);}this.fireEvent("panelactivated",this,_1a);},showPanel:function(_1b){if(_1b=this.getPanel(_1b)){if(this.tabs){var tab=this.tabs.getTab(_1b.getEl().id);if(tab.isHidden()){this.tabs.unhideTab(tab.id);}tab.activate();}else{this.setActivePanel(_1b);}}return _1b;},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(_1d){if(arguments.length>1){for(var i=0,len=arguments.length;i0){this.remove(this.panels.first());}},remove:function(_22,_23){_22=this.getPanel(_22);if(!_22){return null;}var e={};this.fireEvent("beforeremove",this,_22,e);if(e.cancel===true){return null;}_23=(typeof _23!="undefined"?_23:(this.config.preservePanels===true||_22.preserve===true));var _25=_22.getId();this.panels.removeKey(_25);if(_23){document.body.appendChild(_22.getEl().dom);}if(this.tabs){this.tabs.removeTab(_22.getEl().id);}else{if(!_23){this.bodyEl.dom.removeChild(_22.getEl().dom);}}if(this.panels.getCount()==1&&this.tabs&&!this.config.alwaysShowTabs){var p=this.panels.first();var _27=document.createElement("div");_27.appendChild(p.getEl().dom);this.bodyEl.update("");this.bodyEl.dom.appendChild(p.getEl().dom);_27=null;this.updateTitle(p.getTitle());this.tabs=null;this.bodyEl.setStyle("overflow",this.config.autoScroll?"auto":"hidden");this.setActivePanel(p);}_22.setRegion(null);if(this.activePanel==_22){this.activePanel=null;}if(this.config.autoDestroy!==false&&_23!==true){try{_22.destroy();}catch(e){}}this.fireEvent("panelremoved",this,_22);return _22;},getTabs:function(){return this.tabs;},createTool:function(_28,_29){var btn=Ext.DomHelper.append(_28,{tag:"div",cls:"x-layout-tools-button",children:[{tag:"div",cls:"x-layout-tools-button-inner "+_29,html:" "}]},true);btn.addClassOnOver("x-layout-tools-button-over");return btn;}}); + +Ext.SplitLayoutRegion=function(_1,_2,_3,_4){this.cursor=_4;Ext.SplitLayoutRegion.superclass.constructor.call(this,_1,_2,_3);};Ext.extend(Ext.SplitLayoutRegion,Ext.LayoutRegion,{splitTip:"Drag to resize.",collapsibleSplitTip:"Drag to resize. Double click to hide.",useSplitTips:false,applyConfig:function(_5){Ext.SplitLayoutRegion.superclass.applyConfig.call(this,_5);if(_5.split){if(!this.split){var _6=Ext.DomHelper.append(this.mgr.el.dom,{tag:"div",id:this.el.id+"-split",cls:"x-layout-split x-layout-split-"+this.position,html:" "});this.split=new Ext.SplitBar(_6,this.el,this.orientation);this.split.on("moved",this.onSplitMove,this);this.split.useShim=_5.useShim===true;this.split.getMaximumSize=this[this.position=="north"||this.position=="south"?"getVMaxSize":"getHMaxSize"].createDelegate(this);if(this.useSplitTips){this.split.el.dom.title=_5.collapsible?this.collapsibleSplitTip:this.splitTip;}if(_5.collapsible){this.split.el.on("dblclick",this.collapse,this);}}if(typeof _5.minSize!="undefined"){this.split.minSize=_5.minSize;}if(typeof _5.maxSize!="undefined"){this.split.maxSize=_5.maxSize;}if(_5.hideWhenEmpty||_5.hidden){this.hideSplitter();}}},getHMaxSize:function(){var _7=this.config.maxSize||10000;var _8=this.mgr.getRegion("center");return Math.min(_7,(this.el.getWidth()+_8.getEl().getWidth())-_8.getMinWidth());},getVMaxSize:function(){var _9=this.config.maxSize||10000;var _a=this.mgr.getRegion("center");return Math.min(_9,(this.el.getHeight()+_a.getEl().getHeight())-_a.getMinHeight());},onSplitMove:function(_b,_c){this.fireEvent("resized",this,_c);},getSplitBar:function(){return this.split;},hide:function(){this.hideSplitter();Ext.SplitLayoutRegion.superclass.hide.call(this);},hideSplitter:function(){if(this.split){this.split.el.setLocation(-2000,-2000);this.split.el.hide();}},show:function(){if(this.split){this.split.el.show();}Ext.SplitLayoutRegion.superclass.show.call(this);},beforeSlide:function(){if(Ext.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(Ext.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();}}}},initAutoHide:function(){if(this.autoHide!==false){if(!this.autoHideHd){var st=new Ext.util.DelayedTask(this.slideIn,this);this.autoHideHd={"mouseout":function(e){if(!e.within(this.el,true)){st.delay(500);}},"mouseover":function(e){st.cancel();},scope:this};}this.el.on(this.autoHideHd);}},clearAutoHide:function(){if(this.autoHide!==false){this.el.un("mouseout",this.autoHideHd.mouseout);this.el.un("mouseover",this.autoHideHd.mouseover);}},clearMonitor:function(){Ext.get(document).un("click",this.slideInIf,this);},slideOut:function(){if(this.isSlid||this.el.hasActiveFx()){return;}this.isSlid=true;if(this.collapseBtn){this.collapseBtn.hide();}this.closeBtnState=this.closeBtn.getStyle("display");this.closeBtn.hide();if(this.stickBtn){this.stickBtn.show();}this.el.show();this.el.alignTo(this.collapsedEl,this.getCollapseAnchor());this.beforeSlide();this.el.setStyle("z-index",20000);this.el.slideIn(this.getSlideAnchor(),{callback:function(){this.afterSlide();this.initAutoHide();Ext.get(document).on("click",this.slideInIf,this);this.fireEvent("slideshow",this);},scope:this,block:true});},afterSlideIn:function(){this.clearAutoHide();this.isSlid=false;this.clearMonitor();this.el.setStyle("z-index","");if(this.collapseBtn){this.collapseBtn.show();}this.closeBtn.setStyle("display",this.closeBtnState);if(this.stickBtn){this.stickBtn.hide();}this.fireEvent("slidehide",this);},slideIn:function(cb){if(!this.isSlid||this.el.hasActiveFx()){Ext.callback(cb);return;}this.isSlid=false;this.beforeSlide();this.el.slideOut(this.getSlideAnchor(),{callback:function(){this.el.setLeftTop(-10000,-10000);this.afterSlide();this.afterSlideIn();Ext.callback(cb);},scope:this,block:true});},slideInIf:function(e){if(!e.within(this.el)){this.slideIn();}},animateCollapse:function(){this.beforeSlide();this.el.setStyle("z-index",20000);var _12=this.getSlideAnchor();this.el.slideOut(_12,{callback:function(){this.el.setStyle("z-index","");this.collapsedEl.slideIn(_12,{duration:0.3});this.afterSlide();this.el.setLocation(-10000,-10000);this.el.hide();this.fireEvent("collapsed",this);},scope:this,block:true});},animateExpand:function(){this.beforeSlide();this.el.alignTo(this.collapsedEl,this.getCollapseAnchor(),this.getExpandAdj());this.el.setStyle("z-index",20000);this.collapsedEl.hide({duration:0.1});this.el.slideIn(this.getSlideAnchor(),{callback:function(){this.el.setStyle("z-index","");this.afterSlide();if(this.split){this.split.el.show();}this.fireEvent("invalidated",this);this.fireEvent("expanded",this);},scope:this,block:true});},anchors:{"west":"left","east":"right","north":"top","south":"bottom"},sanchors:{"west":"l","east":"r","north":"t","south":"b"},canchors:{"west":"tl-tr","east":"tr-tl","north":"tl-bl","south":"bl-tl"},getAnchor:function(){return this.anchors[this.position];},getCollapseAnchor:function(){return this.canchors[this.position];},getSlideAnchor:function(){return this.sanchors[this.position];},getAlignAdj:function(){var cm=this.cmargins;switch(this.position){case "west":return [0,0];break;case "east":return [0,0];break;case "north":return [0,0];break;case "south":return [0,0];break;}},getExpandAdj:function(){var c=this.collapsedEl,cm=this.cmargins;switch(this.position){case "west":return [-(cm.right+c.getWidth()+cm.left),0];break;case "east":return [cm.right+c.getWidth()+cm.left,0];break;case "north":return [0,-(cm.top+cm.bottom+c.getHeight())];break;case "south":return [0,cm.top+cm.bottom+c.getHeight()];break;}}}); + +Ext.CenterLayoutRegion=function(_1,_2){Ext.CenterLayoutRegion.superclass.constructor.call(this,_1,_2,"center");this.visible=true;this.minWidth=_2.minWidth||20;this.minHeight=_2.minHeight||20;};Ext.extend(Ext.CenterLayoutRegion,Ext.LayoutRegion,{hide:function(){},show:function(){},getMinWidth:function(){return this.minWidth;},getMinHeight:function(){return this.minHeight;}});Ext.NorthLayoutRegion=function(_3,_4){Ext.NorthLayoutRegion.superclass.constructor.call(this,_3,_4,"north","n-resize");if(this.split){this.split.placement=Ext.SplitBar.TOP;this.split.orientation=Ext.SplitBar.VERTICAL;this.split.el.addClass("x-layout-split-v");}var _5=_4.initialSize||_4.height;if(typeof _5!="undefined"){this.el.setHeight(_5);}};Ext.extend(Ext.NorthLayoutRegion,Ext.SplitLayoutRegion,{orientation:Ext.SplitBar.VERTICAL,getBox:function(){if(this.collapsed){return this.collapsedEl.getBox();}var _6=this.el.getBox();if(this.split){_6.height+=this.split.el.getHeight();}return _6;},updateBox:function(_7){if(this.split&&!this.collapsed){_7.height-=this.split.el.getHeight();this.split.el.setLeft(_7.x);this.split.el.setTop(_7.y+_7.height);this.split.el.setWidth(_7.width);}if(this.collapsed){this.updateBody(_7.width,null);}Ext.NorthLayoutRegion.superclass.updateBox.call(this,_7);}});Ext.SouthLayoutRegion=function(_8,_9){Ext.SouthLayoutRegion.superclass.constructor.call(this,_8,_9,"south","s-resize");if(this.split){this.split.placement=Ext.SplitBar.BOTTOM;this.split.orientation=Ext.SplitBar.VERTICAL;this.split.el.addClass("x-layout-split-v");}var _a=_9.initialSize||_9.height;if(typeof _a!="undefined"){this.el.setHeight(_a);}};Ext.extend(Ext.SouthLayoutRegion,Ext.SplitLayoutRegion,{orientation:Ext.SplitBar.VERTICAL,getBox:function(){if(this.collapsed){return this.collapsedEl.getBox();}var _b=this.el.getBox();if(this.split){var sh=this.split.el.getHeight();_b.height+=sh;_b.y-=sh;}return _b;},updateBox:function(_d){if(this.split&&!this.collapsed){var sh=this.split.el.getHeight();_d.height-=sh;_d.y+=sh;this.split.el.setLeft(_d.x);this.split.el.setTop(_d.y-sh);this.split.el.setWidth(_d.width);}if(this.collapsed){this.updateBody(_d.width,null);}Ext.SouthLayoutRegion.superclass.updateBox.call(this,_d);}});Ext.EastLayoutRegion=function(_f,_10){Ext.EastLayoutRegion.superclass.constructor.call(this,_f,_10,"east","e-resize");if(this.split){this.split.placement=Ext.SplitBar.RIGHT;this.split.orientation=Ext.SplitBar.HORIZONTAL;this.split.el.addClass("x-layout-split-h");}var _11=_10.initialSize||_10.width;if(typeof _11!="undefined"){this.el.setWidth(_11);}};Ext.extend(Ext.EastLayoutRegion,Ext.SplitLayoutRegion,{orientation:Ext.SplitBar.HORIZONTAL,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.updateBody(null,box.height);}Ext.EastLayoutRegion.superclass.updateBox.call(this,box);}});Ext.WestLayoutRegion=function(mgr,_17){Ext.WestLayoutRegion.superclass.constructor.call(this,mgr,_17,"west","w-resize");if(this.split){this.split.placement=Ext.SplitBar.LEFT;this.split.orientation=Ext.SplitBar.HORIZONTAL;this.split.el.addClass("x-layout-split-h");}var _18=_17.initialSize||_17.width;if(typeof _18!="undefined"){this.el.setWidth(_18);}};Ext.extend(Ext.WestLayoutRegion,Ext.SplitLayoutRegion,{orientation:Ext.SplitBar.HORIZONTAL,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.updateBody(null,box.height);}Ext.WestLayoutRegion.superclass.updateBox.call(this,box);}}); + +Ext.LayoutStateManager=function(_1){this.state={north:{},south:{},east:{},west:{}};};Ext.LayoutStateManager.prototype={init:function(_2,_3){this.provider=_3;var _4=_3.get(_2.id+"-layout-state");if(_4){var _5=_2.isUpdating();if(!_5){_2.beginUpdate();}for(var _6 in _4){if(typeof _4[_6]!="function"){var _7=_4[_6];var r=_2.getRegion(_6);if(r&&_7){if(_7.size){r.resizeTo(_7.size);}if(_7.collapsed==true){r.collapse(true);}else{r.expand(null,true);}}}}if(!_5){_2.endUpdate();}this.state=_4;}this.layout=_2;_2.on("regionresized",this.onRegionResized,this);_2.on("regioncollapsed",this.onRegionCollapsed,this);_2.on("regionexpanded",this.onRegionExpanded,this);},storeState:function(){this.provider.set(this.layout.id+"-layout-state",this.state);},onRegionResized:function(_9,_a){this.state[_9.getPosition()].size=_a;this.storeState();},onRegionCollapsed:function(_b){this.state[_b.getPosition()].collapsed=true;this.storeState();},onRegionExpanded:function(_c){this.state[_c.getPosition()].collapsed=false;this.storeState();}}; + +Ext.ContentPanel=function(el,_2,_3){Ext.ContentPanel.superclass.constructor.call(this);if(el.autoCreate){_2=el;el=Ext.id();}this.el=Ext.get(el);if(!this.el&&_2&&_2.autoCreate){if(typeof _2.autoCreate=="object"){if(!_2.autoCreate.id){_2.autoCreate.id=_2.id||el;}this.el=Ext.DomHelper.append(document.body,_2.autoCreate,true);}else{this.el=Ext.DomHelper.append(document.body,{tag:"div",cls:"x-layout-inactive-content",id:_2.id||el},true);}}this.closable=false;this.loaded=false;this.active=false;if(typeof _2=="string"){this.title=_2;}else{Ext.apply(this,_2);}if(this.resizeEl){this.resizeEl=Ext.get(this.resizeEl,true);}else{this.resizeEl=this.el;}this.addEvents({"activate":true,"deactivate":true,"resize":true});if(this.autoScroll){this.resizeEl.setStyle("overflow","auto");}_3=_3||this.content;if(_3){this.setContent(_3);}if(_2&&_2.url){this.setUrl(this.url,this.params,this.loadOnce);}};Ext.extend(Ext.ContentPanel,Ext.util.Observable,{tabTip:"",setRegion:function(_4){this.region=_4;if(_4){this.el.replaceClass("x-layout-inactive-content","x-layout-active-content");}else{this.el.replaceClass("x-layout-active-content","x-layout-inactive-content");}},getToolbar:function(){return this.toolbar;},setActiveState:function(_5){this.active=_5;if(!_5){this.fireEvent("deactivate",this);}else{this.fireEvent("activate",this);}},setContent:function(_6,_7){this.el.update(_6,_7);},ignoreResize:function(w,h){if(this.lastSize&&this.lastSize.width==w&&this.lastSize.height==h){return true;}else{this.lastSize={width:w,height:h};return false;}},getUpdateManager:function(){return this.el.getUpdateManager();},load:function(){var um=this.el.getUpdateManager();um.update.apply(um,arguments);return this;},setUrl:function(_b,_c,_d){if(this.refreshDelegate){this.removeListener("activate",this.refreshDelegate);}this.refreshDelegate=this._handleRefresh.createDelegate(this,[_b,_c,_d]);this.on("activate",this._handleRefresh.createDelegate(this,[_b,_c,_d]));return this.el.getUpdateManager();},_handleRefresh:function(_e,_f,_10){if(!_10||!this.loaded){var _11=this.el.getUpdateManager();_11.update(_e,_f,this._setLoaded.createDelegate(this));}},_setLoaded:function(){this.loaded=true;},getId:function(){return this.el.id;},getEl:function(){return this.el;},adjustForComponents:function(_12,_13){if(this.resizeEl!=this.el){_12-=this.el.getFrameWidth("lr");_13-=this.el.getFrameWidth("tb");}if(this.toolbar){var te=this.toolbar.getEl();_13-=te.getHeight();te.setWidth(_12);}if(this.adjustments){_12+=this.adjustments[0];_13+=this.adjustments[1];}return {"width":_12,"height":_13};},setSize:function(_15,_16){if(this.fitToFrame&&!this.ignoreResize(_15,_16)){if(this.fitContainer&&this.resizeEl!=this.el){this.el.setSize(_15,_16);}var _17=this.adjustForComponents(_15,_16);this.resizeEl.setSize(this.autoWidth?"auto":_17.width,this.autoHeight?"auto":_17.height);this.fireEvent("resize",this,_17.width,_17.height);}},getTitle:function(){return this.title;},setTitle:function(_18){this.title=_18;if(this.region){this.region.updatePanelTitle(this,_18);}},isClosable:function(){return this.closable;},beforeSlide:function(){this.el.clip();this.resizeEl.clip();},afterSlide:function(){this.el.unclip();this.resizeEl.unclip();},refresh:function(){if(this.refreshDelegate){this.loaded=false;this.refreshDelegate();}},destroy:function(){this.el.removeAllListeners();var _19=document.createElement("span");_19.appendChild(this.el.dom);_19.innerHTML="";this.el.remove();this.el=null;}});Ext.GridPanel=function(_1a,_1b){this.wrapper=Ext.DomHelper.append(document.body,{tag:"div",cls:"x-layout-grid-wrapper x-layout-inactive-content"},true);this.wrapper.dom.appendChild(_1a.container.dom);Ext.GridPanel.superclass.constructor.call(this,this.wrapper,_1b);if(this.toolbar){this.toolbar.el.insertBefore(this.wrapper.dom.firstChild);}_1a.monitorWindowResize=false;_1a.autoHeight=false;_1a.autoWidth=false;this.grid=_1a;this.grid.container.replaceClass("x-layout-inactive-content","x-layout-component-panel");};Ext.extend(Ext.GridPanel,Ext.ContentPanel,{getId:function(){return this.grid.id;},getGrid:function(){return this.grid;},setSize:function(_1c,_1d){if(!this.ignoreResize(_1c,_1d)){var _1e=this.grid;var _1f=this.adjustForComponents(_1c,_1d);_1e.container.setSize(_1f.width,_1f.height);_1e.autoSize();}},beforeSlide:function(){this.grid.getView().scroller.clip();},afterSlide:function(){this.grid.getView().scroller.unclip();},destroy:function(){this.grid.destroy();delete this.grid;Ext.GridPanel.superclass.destroy.call(this);}});Ext.NestedLayoutPanel=function(_20,_21){Ext.NestedLayoutPanel.superclass.constructor.call(this,_20.getEl(),_21);_20.monitorWindowResize=false;this.layout=_20;this.layout.getEl().addClass("x-layout-nested-layout");};Ext.extend(Ext.NestedLayoutPanel,Ext.ContentPanel,{setSize:function(_22,_23){if(!this.ignoreResize(_22,_23)){var _24=this.adjustForComponents(_22,_23);var el=this.layout.getEl();el.setSize(_24.width,_24.height);var _26=el.dom.offsetWidth;this.layout.layout();if(Ext.isIE&&!this.initialized){this.initialized=true;this.layout.layout();}}},getLayout:function(){return this.layout;}});Ext.ScrollPanel=function(el,_28,_29){_28=_28||{};_28.fitToFrame=true;Ext.ScrollPanel.superclass.constructor.call(this,el,_28,_29);this.el.dom.style.overflow="hidden";var _2a=this.el.wrap({cls:"x-scroller x-layout-inactive-content"});this.el.removeClass("x-layout-inactive-content");this.el.on("mousewheel",this.onWheel,this);var up=_2a.createChild({cls:"x-scroller-up",html:" "},this.el.dom);var _2c=_2a.createChild({cls:"x-scroller-down",html:" "});up.unselectable();_2c.unselectable();up.on("click",this.scrollUp,this);_2c.on("click",this.scrollDown,this);up.addClassOnOver("x-scroller-btn-over");_2c.addClassOnOver("x-scroller-btn-over");up.addClassOnClick("x-scroller-btn-click");_2c.addClassOnClick("x-scroller-btn-click");this.adjustments=[0,-(up.getHeight()+_2c.getHeight())];this.resizeEl=this.el;this.el=_2a;this.up=up;this.down=_2c;};Ext.extend(Ext.ScrollPanel,Ext.ContentPanel,{increment:100,wheelIncrement:5,scrollUp:function(){this.resizeEl.scroll("up",this.increment,{callback:this.afterScroll,scope:this});},scrollDown:function(){this.resizeEl.scroll("down",this.increment,{callback:this.afterScroll,scope:this});},afterScroll:function(){var el=this.resizeEl;var t=el.dom.scrollTop,h=el.dom.scrollHeight,ch=el.dom.clientHeight;this.up[t==0?"addClass":"removeClass"]("x-scroller-btn-disabled");this.down[h-t<=ch?"addClass":"removeClass"]("x-scroller-btn-disabled");},setSize:function(){Ext.ScrollPanel.superclass.setSize.apply(this,arguments);this.afterScroll();},onWheel:function(e){var d=e.getWheelDelta();this.resizeEl.dom.scrollTop-=(d*this.wheelIncrement);this.afterScroll();e.stopEvent();},setContent:function(_33,_34){this.resizeEl.update(_33,_34);}}); + +Ext.ReaderLayout=function(_1,_2){var c=_1||{size:{}};Ext.ReaderLayout.superclass.constructor.call(this,_2||document.body,{north:c.north!==false?Ext.apply({split:false,initialSize:32,titlebar:false},c.north):false,west:c.west!==false?Ext.apply({split:true,initialSize:200,minSize:175,maxSize:400,titlebar:true,collapsible:true,animate:true,margins:{left:5,right:0,bottom:5,top:5},cmargins:{left:5,right:5,bottom:5,top:5}},c.west):false,east:c.east!==false?Ext.apply({split:true,initialSize:200,minSize:175,maxSize:400,titlebar:true,collapsible:true,animate:true,margins:{left:0,right:5,bottom:5,top:5},cmargins:{left:5,right:5,bottom:5,top:5}},c.east):false,center:Ext.apply({tabPosition:"top",autoScroll:false,closeOnTab:true,titlebar:false,margins:{left:c.west!==false?0:5,right:c.east!==false?0:5,bottom:5,top:2}},c.center)});this.el.addClass("x-reader");this.beginUpdate();var _4=new Ext.BorderLayout(Ext.get(document.body).createChild(),{south:c.preview!==false?Ext.apply({split:true,initialSize:200,minSize:100,autoScroll:true,collapsible:true,titlebar:true,cmargins:{top:5,left:0,right:0,bottom:0}},c.preview):false,center:Ext.apply({autoScroll:false,titlebar:false,minHeight:200},c.listView)});this.add("center",new Ext.NestedLayoutPanel(_4,Ext.apply({title:c.mainTitle||"",tabTip:""},c.innerPanelCfg)));this.endUpdate();this.regions.preview=_4.getRegion("south");this.regions.listView=_4.getRegion("center");};Ext.extend(Ext.ReaderLayout,Ext.BorderLayout); + diff --git a/www/extras/yui-ext/package/menu/menus.js b/www/extras/yui-ext/package/menu/menus.js new file mode 100644 index 000000000..bf4ed2ae4 --- /dev/null +++ b/www/extras/yui-ext/package/menu/menus.js @@ -0,0 +1,32 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.menu.Menu=function(_1){Ext.apply(this,_1);this.id=this.id||Ext.id();this.addEvents({beforeshow:true,beforehide:true,show:true,hide:true,click:true,mouseover:true,mouseout:true,itemclick:true});Ext.menu.MenuMgr.register(this);var _2=this.items;this.items=new Ext.util.MixedCollection();if(_2){this.add.apply(this,_2);}};Ext.extend(Ext.menu.Menu,Ext.util.Observable,{minWidth:120,shadow:"sides",subMenuAlign:"tl-tr?",defaultAlign:"tl-bl?",allowOtherMenus:false,render:function(){if(this.el){return;}var el=this.el=new Ext.Layer({cls:"x-menu",shadow:this.shadow,constrain:false,parentEl:this.parentEl||document.body,zindex:15000});this.keyNav=new Ext.menu.MenuNav(this);if(this.plain){el.addClass("x-menu-plain");}if(this.cls){el.addClass(this.cls);}this.focusEl=el.createChild({tag:"a",cls:"x-menu-focus",href:"#",onclick:"return false;",tabIndex:"-1"});var ul=el.createChild({tag:"ul",cls:"x-menu-list"});ul.on("click",this.onClick,this);ul.on("mouseover",this.onMouseOver,this);ul.on("mouseout",this.onMouseOut,this);this.items.each(function(_5){var li=document.createElement("li");li.className="x-menu-list-item";ul.dom.appendChild(li);_5.render(li,this);},this);this.ul=ul;this.autoWidth();},autoWidth:function(){var el=this.el,ul=this.ul;if(!el){return;}var w=this.width;if(w){el.setWidth(w);}else{if(Ext.isIE){el.setWidth(this.minWidth);var t=el.dom.offsetWidth;el.setWidth(ul.getWidth()+el.getFrameWidth("lr"));}}},delayAutoWidth:function(){if(this.rendered){if(!this.awTask){this.awTask=new Ext.util.DelayedTask(this.autoWidth,this);}this.awTask.delay(20);}},findTargetItem:function(e){var t=e.getTarget(".x-menu-list-item",this.ul,true);if(t&&t.menuItemId){return this.items.get(t.menuItemId);}},onClick:function(e){var t;if(t=this.findTargetItem(e)){t.onClick(e);this.fireEvent("click",this,t,e);}},setActiveItem:function(_f,_10){if(_f!=this.activeItem){if(this.activeItem){this.activeItem.deactivate();}this.activeItem=_f;_f.activate(_10);}else{if(_10){_f.expandMenu();}}},tryActivate:function(_11,_12){var _13=this.items;for(var i=_11,len=_13.length;i>=0&&i0){hideAll();}});}function hideAll(){if(_2.length>0){var c=_2.clone();c.each(function(m){m.hide();});}}function onHide(m){_2.remove(m);if(_2.length<1){Ext.get(document).un("mousedown",onMouseDown);_4=false;}}function onShow(m){var _a=_2.last();_5=new Date();_2.add(m);if(!_4){Ext.get(document).on("mousedown",onMouseDown);_4=true;}if(m.parentMenu){m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"),10)+3);m.parentMenu.activeChild=m;}else{if(_a&&_a.isVisible()){m.getEl().setZIndex(parseInt(_a.getEl().getStyle("z-index"),10)+3);}}}function onBeforeHide(m){if(m.activeChild){m.activeChild.hide();}if(m.autoHideTimer){clearTimeout(m.autoHideTimer);delete m.autoHideTimer;}}function onBeforeShow(m){var pm=m.parentMenu;if(!pm&&!m.allowOtherMenus){hideAll();}else{if(pm&&pm.activeChild){pm.activeChild.hide();}}}function onMouseDown(e){if(_5.getElapsed()>50&&_2.length>0&&!e.getTarget(".x-menu")){hideAll();}}function onBeforeCheck(mi,_10){if(_10){var g=_3[mi.group];for(var i=0,l=g.length;i{1}",this.icon||Ext.BLANK_IMAGE_URL,this.text);this.el=el;Ext.menu.Item.superclass.onRender.call(this,_2,_3);},setText:function(_5){this.text=_5;if(this.rendered){this.el.update(String.format("{1}",this.icon||Ext.BLANK_IMAGE_URL,this.text));this.parentMenu.autoWidth();}},handleClick:function(e){if(!this.href){e.stopEvent();}Ext.menu.Item.superclass.handleClick.apply(this,arguments);},activate:function(_7){if(Ext.menu.Item.superclass.activate.apply(this,arguments)){this.focus();if(_7){this.expandMenu();}}return true;},shouldDeactivate:function(e){if(Ext.menu.Item.superclass.shouldDeactivate.call(this,e)){if(this.menu&&this.menu.isVisible()){return !this.menu.getEl().getRegion().contains(e.getPoint());}return true;}return false;},deactivate:function(){Ext.menu.Item.superclass.deactivate.apply(this,arguments);this.hideMenu();},expandMenu:function(_9){if(!this.disabled&&this.menu){if(!this.menu.isVisible()){this.menu.show(this.container,this.parentMenu.subMenuAlign||"tl-tr?",this.parentMenu);}if(_9){this.menu.tryActivate(0,1);}}},hideMenu:function(){if(this.menu&&this.menu.isVisible()){this.menu.hide();}}}); + +Ext.menu.CheckItem=function(_1){Ext.menu.CheckItem.superclass.constructor.call(this,_1);this.addEvents({"beforecheckchange":true,"checkchange":true});if(this.checkHandler){this.on("checkchange",this.checkHandler,this.scope);}};Ext.extend(Ext.menu.CheckItem,Ext.menu.Item,{itemCls:"x-menu-item x-menu-check-item",groupClass:"x-menu-group-item",checked:false,ctype:"Ext.menu.CheckItem",onRender:function(c){Ext.menu.CheckItem.superclass.onRender.apply(this,arguments);if(this.group){this.el.addClass(this.groupClass);}Ext.menu.MenuMgr.registerCheckable(this);if(this.checked){this.checked=false;this.setChecked(true,true);}},destroy:function(){if(this.rendered){Ext.menu.MenuMgr.unregisterCheckable(this);}Ext.menu.CheckItem.superclass.destroy.apply(this,arguments);},setChecked:function(_3,_4){if(this.checked!=_3&&this.fireEvent("beforecheckchange",this,_3)!==false){if(this.container){this.container[_3?"addClass":"removeClass"]("x-menu-item-checked");}this.checked=_3;if(_4!==true){this.fireEvent("checkchange",this,_3);}}},handleClick:function(e){if(!this.disabled&&!(this.checked&&this.group)){this.setChecked(!this.checked);}Ext.menu.CheckItem.superclass.handleClick.apply(this,arguments);}}); + +Ext.menu.Adapter=function(_1,_2){Ext.menu.Adapter.superclass.constructor.call(this,_2);this.component=_1;};Ext.extend(Ext.menu.Adapter,Ext.menu.BaseItem,{canActivate:true,onRender:function(_3,_4){this.component.render(_3);this.el=this.component.getEl();},activate:function(){if(this.disabled){return false;}this.component.focus();this.fireEvent("activate",this);return true;},deactivate:function(){this.fireEvent("deactivate",this);},disable:function(){this.component.disable();Ext.menu.Adapter.superclass.disable.call(this);},enable:function(){this.component.enable();Ext.menu.Adapter.superclass.enable.call(this);}}); + +Ext.menu.DateItem=function(_1){Ext.menu.DateItem.superclass.constructor.call(this,new Ext.DatePicker(_1),_1);this.picker=this.component;this.addEvents({select:true});this.picker.on("render",function(_2){_2.getEl().swallowEvent("click");_2.container.addClass("x-menu-date-item");});this.picker.on("select",this.onSelect,this);};Ext.extend(Ext.menu.DateItem,Ext.menu.Adapter,{onSelect:function(_3,_4){this.fireEvent("select",this,_4,_3);Ext.menu.DateItem.superclass.handleClick.call(this);}}); + +Ext.menu.ColorItem=function(_1){Ext.menu.ColorItem.superclass.constructor.call(this,new Ext.ColorPalette(_1),_1);this.palette=this.component;this.relayEvents(this.palette,["select"]);if(this.selectHandler){this.on("select",this.selectHandler,this.scope);}};Ext.extend(Ext.menu.ColorItem,Ext.menu.Adapter); + +Ext.menu.DateMenu=function(_1){Ext.menu.DateMenu.superclass.constructor.call(this,_1);this.plain=true;var di=new Ext.menu.DateItem(_1);this.add(di);this.picker=di.picker;this.relayEvents(di,["select"]);};Ext.extend(Ext.menu.DateMenu,Ext.menu.Menu); + +Ext.menu.ColorMenu=function(_1){Ext.menu.ColorMenu.superclass.constructor.call(this,_1);this.plain=true;var ci=new Ext.menu.ColorItem(_1);this.add(ci);this.palette=ci.palette;this.relayEvents(ci,["select"]);};Ext.extend(Ext.menu.ColorMenu,Ext.menu.Menu); + diff --git a/www/extras/yui-ext/package/qtips/qtips.js b/www/extras/yui-ext/package/qtips/qtips.js new file mode 100644 index 000000000..dde35ef6c --- /dev/null +++ b/www/extras/yui-ext/package/qtips/qtips.js @@ -0,0 +1,10 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.QuickTips=function(){var el,_2,_3,_4,tm,_6,_7,_8={},_9,_a=null,_b,_c;var ce,bd,xy,dd;var _11=false,_12=true,_13=false;var _14=1,_15=1,_16=1,_17=[];var _18=function(e){if(_12){return;}var t=e.getTarget();if(!t||t.nodeType!==1||t==document||t==document.body){return;}if(ce&&t==ce.el){clearTimeout(_15);return;}if(t&&_8[t.id]){_8[t.id].el=t;_14=_1b.defer(tm.showDelay,tm,[_8[t.id]]);return;}var ttp,et=Ext.fly(t);var ns=_6.namespace;if(tm.interceptTitles&&t.title){ttp=t.title;t.qtip=ttp;t.removeAttribute("title");e.preventDefault();}else{ttp=t.qtip||et.getAttributeNS(ns,_6.attribute);}if(ttp){_14=_1b.defer(tm.showDelay,tm,[{el:t,text:ttp,width:et.getAttributeNS(ns,_6.width),autoHide:et.getAttributeNS(ns,_6.hide)!="user",title:et.getAttributeNS(ns,_6.title),cls:et.getAttributeNS(ns,_6.cls)}]);}};var _1f=function(e){clearTimeout(_14);var t=e.getTarget();if(t&&ce&&ce.el==t&&(tm.autoHide&&ce.autoHide!==false)){_15=setTimeout(_22,tm.hideDelay);}};var _23=function(e){if(_12){return;}xy=e.getXY();xy[1]+=18;if(tm.trackMouse&&ce){el.setXY(xy);}};var _25=function(e){clearTimeout(_14);clearTimeout(_15);if(!e.within(el)){if(tm.hideOnClick){_22();tm.disable();}}};var _27=function(e){tm.enable();};var _29=function(){return _b.getPadding("l")+_c.getPadding("r");};var _1b=function(o){if(_12){return;}clearTimeout(_16);ce=o;if(_a){el.removeClass(_a);_a=null;}if(ce.cls){el.addClass(ce.cls);_a=ce.cls;}if(ce.title){_4.update(ce.title);_4.show();}else{_4.update("");_4.hide();}el.dom.style.width=tm.maxWidth+"px";_3.update(o.text);var p=_29(),w=ce.width;if(!w){var td=_3.dom;var aw=Math.max(td.offsetWidth,td.clientWidth,td.scrollWidth);if(aw>tm.maxWidth){w=tm.maxWidth;}else{if(aw

        ");_4=el.child("h3");_4.enableDisplayMode("block");_2=el.child("div.x-tip-bd");_3=el.child("div.x-tip-bd-inner");_b=el.child("div.x-tip-bd-left");_c=el.child("div.x-tip-bd-right");_7=el.child("div.x-tip-close");_7.enableDisplayMode("block");_7.on("click",_22);d=Ext.get(document);d.on("mousedown",_25);d.on("mouseup",_27);d.on("mouseover",_18);d.on("mouseout",_1f);d.on("mousemove",_23);_9=d.addKeyListener(27,_22);_9.disable();if(Ext.dd.DD){dd=el.initDD("default",null,{onDrag:function(){el.sync();}});dd.setHandleElId(_4.id);dd.lock();}_13=true;}this.enable();},register:function(_32){var cs=_32 instanceof Array?_32:arguments;for(var i=0,len=cs.length;i0){if(m>(inc/2)){_1e=_1b+(inc-m);}else{_1e=_1b-m;}}return Math.max(min,_1e);},resizeElement:function(){var box=this.proxy.getBox();if(this.updateBox){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,_22,m,mx){if(v-_22mx){_22=mx-v;}}return _22;},onMouseMove:function(e){if(this.enabled){try{var _26=this.curSize||this.startBox;var x=this.startBox.x,y=this.startBox.y;var ox=x,oy=y;var w=_26.width,h=_26.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 _35=e.getXY();var _36=-(this.startPoint[0]-Math.max(this.minX,_35[0]));var _37=-(this.startPoint[1]-Math.max(this.minY,_35[1]));var pos=this.activeHandle.position;switch(pos){case "east":w+=_36;w=Math.min(Math.max(mw,w),mxw);break;case "south":h+=_37;h=Math.min(Math.max(mh,h),mxh);break;case "southeast":w+=_36;h+=_37;w=Math.min(Math.max(mw,w),mxw);h=Math.min(Math.max(mh,h),mxh);break;case "north":_37=this.constrain(h,_37,mh,mxh);y+=_37;h-=_37;break;case "west":_36=this.constrain(w,_36,mw,mxw);x+=_36;w-=_36;break;case "northeast":w+=_36;w=Math.min(Math.max(mw,w),mxw);_37=this.constrain(h,_37,mh,mxh);y+=_37;h-=_37;break;case "northwest":_36=this.constrain(w,_36,mw,mxw);_37=this.constrain(h,_37,mh,mxh);y+=_37;h-=_37;x+=_36;w-=_36;break;case "southwest":_36=this.constrain(w,_36,mw,mxw);h+=_37;h=Math.min(Math.max(mh,h),mxh);x+=_36;w-=_36;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("x-resizable-over");}},handleOut:function(){if(!this.resizing){this.el.removeClass("x-resizable-over");}},getEl:function(){return this.el;},getResizeChild:function(){return this.resizeChild;},destroy:function(_3d){this.proxy.remove();this.overlay.removeAllListeners();this.overlay.remove();var ps=Ext.Resizable.positions;for(var k in ps){if(typeof ps[k]!="function"&&this[ps[k]]){var h=this[ps[k]];h.el.removeAllListeners();h.el.remove();}}if(_3d){this.el.update("");this.el.remove();}}});Ext.Resizable.positions={n:"north",s:"south",e:"east",w:"west",se:"southeast",sw:"southwest",nw:"northwest",ne:"northeast"};Ext.Resizable.Handle=function(rz,pos,_43,_44){if(!this.tpl){var tpl=Ext.DomHelper.createTemplate({tag:"div",cls:"x-resizable-handle x-resizable-handle-{0}"});tpl.compile();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(_44){this.el.setOpacity(0);}this.el.on("mousedown",this.onMouseDown,this);if(!_43){this.el.on("mouseover",this.onMouseOver,this);this.el.on("mouseout",this.onMouseOut,this);}};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/package/splitbar.js b/www/extras/yui-ext/package/splitbar.js new file mode 100644 index 000000000..e2ebaa8ce --- /dev/null +++ b/www/extras/yui-ext/package/splitbar.js @@ -0,0 +1,10 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.SplitBar=function(_1,_2,_3,_4,_5){this.el=Ext.get(_1,true);this.el.dom.unselectable="on";this.resizingEl=Ext.get(_2,true);this.orientation=_3||Ext.SplitBar.HORIZONTAL;this.minSize=0;this.maxSize=2000;this.animate=false;this.useShim=false;this.shim=null;if(!_5){this.proxy=Ext.SplitBar.createProxy(this.orientation);}else{this.proxy=Ext.get(_5).dom;}this.dd=new Ext.dd.DDProxy(this.el.dom.id,"XSplitBars",{dragElId:this.proxy.id});this.dd.b4StartDrag=this.onStartProxyDrag.createDelegate(this);this.dd.endDrag=this.onEndProxyDrag.createDelegate(this);this.dragSpecs={};this.adapter=new Ext.SplitBar.BasicLayoutAdapter();this.adapter.init(this);if(this.orientation==Ext.SplitBar.HORIZONTAL){this.placement=_4||(this.el.getX()>this.resizingEl.getX()?Ext.SplitBar.LEFT:Ext.SplitBar.RIGHT);this.el.addClass("x-splitbar-h");}else{this.placement=_4||(this.el.getY()>this.resizingEl.getY()?Ext.SplitBar.TOP:Ext.SplitBar.BOTTOM);this.el.addClass("x-splitbar-v");}this.addEvents({"resize":true,"moved":true,"beforeresize":true,"beforeapply":true});Ext.SplitBar.superclass.constructor.call(this);};Ext.extend(Ext.SplitBar,Ext.util.Observable,{onStartProxyDrag:function(x,y){this.fireEvent("beforeresize",this);if(!this.overlay){var o=Ext.DomHelper.insertFirst(document.body,{cls:"x-drag-overlay",html:" "},true);o.unselectable();o.enableDisplayMode("block");Ext.SplitBar.prototype.overlay=o;}this.overlay.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true));this.overlay.show();Ext.get(this.proxy).setDisplayed("block");var _9=this.adapter.getElementSize(this);this.activeMinSize=this.getMinimumSize();this.activeMaxSize=this.getMaximumSize();var c1=_9-this.activeMinSize;var c2=Math.max(this.activeMaxSize-_9,0);if(this.orientation==Ext.SplitBar.HORIZONTAL){this.dd.resetConstraints();this.dd.setXConstraint(this.placement==Ext.SplitBar.LEFT?c1:c2,this.placement==Ext.SplitBar.LEFT?c2:c1);this.dd.setYConstraint(0,0);}else{this.dd.resetConstraints();this.dd.setXConstraint(0,0);this.dd.setYConstraint(this.placement==Ext.SplitBar.TOP?c1:c2,this.placement==Ext.SplitBar.TOP?c2:c1);}this.dragSpecs.startSize=_9;this.dragSpecs.startPoint=[x,y];Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd,x,y);},onEndProxyDrag:function(e){Ext.get(this.proxy).setDisplayed(false);var _d=Ext.lib.Event.getXY(e);if(this.overlay){this.overlay.hide();}var _e;if(this.orientation==Ext.SplitBar.HORIZONTAL){_e=this.dragSpecs.startSize+(this.placement==Ext.SplitBar.LEFT?_d[0]-this.dragSpecs.startPoint[0]:this.dragSpecs.startPoint[0]-_d[0]);}else{_e=this.dragSpecs.startSize+(this.placement==Ext.SplitBar.TOP?_d[1]-this.dragSpecs.startPoint[1]:this.dragSpecs.startPoint[1]-_d[1]);}_e=Math.min(Math.max(_e,this.activeMinSize),this.activeMaxSize);if(_e!=this.dragSpecs.startSize){if(this.fireEvent("beforeapply",this,_e)!==false){this.adapter.setElementSize(this,_e);this.fireEvent("moved",this,_e);this.fireEvent("resize",this,_e);}}},getAdapter:function(){return this.adapter;},setAdapter:function(_f){this.adapter=_f;this.adapter.init(this);},getMinimumSize:function(){return this.minSize;},setMinimumSize:function(_10){this.minSize=_10;},getMaximumSize:function(){return this.maxSize;},setMaximumSize:function(_11){this.maxSize=_11;},setCurrentSize:function(_12){var _13=this.animate;this.animate=false;this.adapter.setElementSize(this,_12);this.animate=_13;},destroy:function(_14){if(this.shim){this.shim.remove();}this.dd.unreg();this.proxy.parentNode.removeChild(this.proxy);if(_14){this.el.remove();}}});Ext.SplitBar.createProxy=function(dir){var _16=new Ext.Element(document.createElement("div"));_16.unselectable();var cls="x-splitbar-proxy";_16.addClass(cls+" "+(dir==Ext.SplitBar.HORIZONTAL?cls+"-h":cls+"-v"));document.body.appendChild(_16.dom);return _16.dom;};Ext.SplitBar.BasicLayoutAdapter=function(){};Ext.SplitBar.BasicLayoutAdapter.prototype={init:function(s){},getElementSize:function(s){if(s.orientation==Ext.SplitBar.HORIZONTAL){return s.resizingEl.getWidth();}else{return s.resizingEl.getHeight();}},setElementSize:function(s,_1b,_1c){if(s.orientation==Ext.SplitBar.HORIZONTAL){if(!s.animate){s.resizingEl.setWidth(_1b);if(_1c){_1c(s,_1b);}}else{s.resizingEl.setWidth(_1b,true,0.1,_1c,"easeOut");}}else{if(!s.animate){s.resizingEl.setHeight(_1b);if(_1c){_1c(s,_1b);}}else{s.resizingEl.setHeight(_1b,true,0.1,_1c,"easeOut");}}}};Ext.SplitBar.AbsoluteLayoutAdapter=function(_1d){this.basic=new Ext.SplitBar.BasicLayoutAdapter();this.container=Ext.get(_1d);};Ext.SplitBar.AbsoluteLayoutAdapter.prototype={init:function(s){this.basic.init(s);},getElementSize:function(s){return this.basic.getElementSize(s);},setElementSize:function(s,_21,_22){this.basic.setElementSize(s,_21,this.moveSplitter.createDelegate(this,[s]));},moveSplitter:function(s){var yes=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;}}};Ext.SplitBar.VERTICAL=1;Ext.SplitBar.HORIZONTAL=2;Ext.SplitBar.LEFT=1;Ext.SplitBar.RIGHT=2;Ext.SplitBar.TOP=3;Ext.SplitBar.BOTTOM=4; + diff --git a/www/extras/yui-ext/package/tabs/tabs.js b/www/extras/yui-ext/package/tabs/tabs.js new file mode 100644 index 000000000..cc50392b1 --- /dev/null +++ b/www/extras/yui-ext/package/tabs/tabs.js @@ -0,0 +1,10 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.TabPanel=function(_1,_2){this.el=Ext.get(_1,true);if(_2){if(typeof _2=="boolean"){this.tabPosition=_2?"bottom":"top";}else{Ext.apply(this,_2);}}if(this.tabPosition=="bottom"){this.bodyEl=Ext.get(this.createBody(this.el.dom));this.el.addClass("x-tabs-bottom");}this.stripWrap=Ext.get(this.createStrip(this.el.dom),true);this.stripEl=Ext.get(this.createStripList(this.stripWrap.dom),true);this.stripBody=Ext.get(this.stripWrap.dom.firstChild.firstChild,true);if(Ext.isIE){Ext.fly(this.stripWrap.dom.firstChild).setStyle("overflow-x","hidden");}if(this.tabPosition!="bottom"){this.bodyEl=Ext.get(this.createBody(this.el.dom));this.el.addClass("x-tabs-top");}this.items=[];this.bodyEl.setStyle("position","relative");this.active=null;this.activateDelegate=this.activate.createDelegate(this);this.addEvents({"tabchange":true,"beforetabchange":true});Ext.EventManager.onWindowResize(this.onResize,this);this.cpad=this.el.getPadding("lr");this.hiddenCount=0;Ext.TabPanel.superclass.constructor.call(this);};Ext.extend(Ext.TabPanel,Ext.util.Observable,{tabPosition:"top",currentTabWidth:0,minTabWidth:40,maxTabWidth:250,preferredTabWidth:175,resizeTabs:false,monitorResize:true,addTab:function(id,_4,_5,_6){var _7=new Ext.TabPanelItem(this,id,_4,_6);this.addTabItem(_7);if(_5){_7.setContent(_5);}return _7;},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(_d){this.items[_d.id]=_d;this.items.push(_d);if(this.resizeTabs){_d.setWidth(this.currentTabWidth||this.preferredTabWidth);this.autoSizeTabs();}else{_d.autoSize();}},removeTab:function(id){var _f=this.items;var tab=_f[id];if(!tab){return;}var _11=_f.indexOf(tab);if(this.active==tab&&_f.length>1){var _12=this.getNextAvailable(_11);if(_12){_12.activate();}}this.stripEl.dom.removeChild(tab.pnode.dom);if(tab.bodyEl.dom.parentNode==this.bodyEl.dom){this.bodyEl.dom.removeChild(tab.bodyEl.dom);}_f.splice(_11,1);delete this.items[tab.id];tab.fireEvent("close",tab);tab.purgeListeners();this.autoSizeTabs();},getNextAvailable:function(_13){var _14=this.items;var _15=_13;while(_15<_14.length){var _16=_14[++_15];if(_16&&!_16.isHidden()){return _16;}}_15=_13;while(_15>=0){var _16=_14[--_15];if(_16&&!_16.isHidden()){return _16;}}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){return null;}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.fireEvent("tabchange",this,this.active);}return tab;},getActiveTab:function(){return this.active;},syncHeight:function(_1e){var _1f=(_1e||this.el.getHeight())-this.el.getBorderWidth("tb")-this.el.getPadding("tb");var bm=this.bodyEl.getMargins();var _21=_1f-(this.stripWrap.getHeight()||0)-(bm.top+bm.bottom);this.bodyEl.setHeight(_21);return _21;},onResize:function(){if(this.monitorResize){this.autoSizeTabs();}},beginUpdate:function(){this.updating=true;},endUpdate:function(){this.updating=false;this.autoSizeTabs();},autoSizeTabs:function(){var _22=this.items.length;var _23=_22-this.hiddenCount;if(!this.resizeTabs||_22<1||_23<1||this.updating){return;}var w=Math.max(this.el.getWidth()-this.cpad,10);var _25=Math.floor(w/_23);var b=this.stripBody;if(b.getWidth()>w){var _27=this.items;this.setTabWidth(Math.max(_25,this.minTabWidth)-2);if(_25
        ";return _48.firstChild.firstChild.firstChild.firstChild;};Ext.TabPanel.prototype.createBody=function(_49){var _4a=document.createElement("div");Ext.id(_4a,"tab-body");Ext.fly(_4a).addClass("x-tabs-body");_49.appendChild(_4a);return _4a;};Ext.TabPanel.prototype.createItemBody=function(_4b,id){var _4d=Ext.getDom(id);if(!_4d){_4d=document.createElement("div");_4d.id=id;}Ext.fly(_4d).addClass("x-tabs-item-body");_4b.insertBefore(_4d,_4b.firstChild);return _4d;};Ext.TabPanel.prototype.createStripElements=function(_4e,_4f,_50){var td=document.createElement("td");_4e.appendChild(td);if(_50){td.className="x-tabs-closable";if(!this.closeTpl){this.closeTpl=new Ext.Template(""+"{text}"+"
         
        ");}var el=this.closeTpl.overwrite(td,{"text":_4f});var _53=el.getElementsByTagName("div")[0];var _54=el.getElementsByTagName("em")[0];return {"el":el,"close":_53,"inner":_54};}else{if(!this.tabTpl){this.tabTpl=new Ext.Template(""+"{text}");}var el=this.tabTpl.overwrite(td,{"text":_4f});var _54=el.getElementsByTagName("em")[0];return {"el":el,"inner":_54};}}; + diff --git a/www/extras/yui-ext/package/toolbar/toolbar.js b/www/extras/yui-ext/package/toolbar/toolbar.js new file mode 100644 index 000000000..9ed664f30 --- /dev/null +++ b/www/extras/yui-ext/package/toolbar/toolbar.js @@ -0,0 +1,12 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.Toolbar=function(_1,_2,_3){if(_1 instanceof Array){_2=_1;_3=_2;_1=null;}Ext.apply(this,_3);this.buttons=_2;if(_1){this.render(_1);}};Ext.Toolbar.prototype={render:function(ct){this.el=Ext.get(ct);if(this.cls){this.el.addClass(this.cls);}this.el.update("
        ");this.tr=this.el.child("tr",true);var _5=0;this.items=new Ext.util.MixedCollection(false,function(o){return o.id||("item"+(++_5));});if(this.buttons){this.add.apply(this,this.buttons);delete this.buttons;}},add:function(){var a=arguments,l=a.length;for(var i=0;i=1&parseInt(v,10)+_13<=d.pages){this.field.dom.value=parseInt(v,10)+_13;_12=Math.min(Math.max(1,_12+_13),d.pages)-1;this.ds.load({params:{start:_12*this.pageSize,limit:this.pageSize}});}}e.stopEvent();}}}},beforeLoad:function(){if(this.loading){this.loading.disable();}},onClick:function(_14){var ds=this.ds;switch(_14){case "first":ds.load({params:{start:0,limit:this.pageSize}});break;case "prev":ds.load({params:{start:Math.max(0,this.cursor-this.pageSize),limit:this.pageSize}});break;case "next":ds.load({params:{start:this.cursor+this.pageSize,limit:this.pageSize}});break;case "last":var _16=ds.getTotalCount();var _17=_16%this.pageSize;var _18=_17?(_16-_17):_16-this.pageSize;ds.load({params:{start:_18,limit:this.pageSize}});break;case "refresh":ds.load({params:{start:this.cursor,limit:this.pageSize}});break;}},unbind:function(ds){ds.un("beforeload",this.beforeLoad,this);ds.un("load",this.onLoad,this);ds.un("loadexception",this.onLoadError,this);},bind:function(ds){ds.on("beforeload",this.beforeLoad,this);ds.on("load",this.onLoad,this);ds.on("loadexception",this.onLoadError,this);}}); + diff --git a/www/extras/yui-ext/package/tree/tree.js b/www/extras/yui-ext/package/tree/tree.js new file mode 100644 index 000000000..895e6ac39 --- /dev/null +++ b/www/extras/yui-ext/package/tree/tree.js @@ -0,0 +1,32 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.data.Tree=function(_1){this.nodeHash={};this.root=null;if(_1){this.setRootNode(_1);}this.addEvents({"append":true,"remove":true,"move":true,"insert":true,"beforeappend":true,"beforeremove":true,"beforemove":true,"beforeinsert":true});Ext.data.Tree.superclass.constructor.call(this);};Ext.extend(Ext.data.Tree,Ext.util.Observable,{pathSeparator:"/",getRootNode:function(){return this.root;},setRootNode:function(_2){this.root=_2;_2.ownerTree=this;_2.isRoot=true;this.registerNode(_2);return _2;},getNodeById:function(id){return this.nodeHash[id];},registerNode:function(_4){this.nodeHash[_4.id]=_4;},unregisterNode:function(_5){delete this.nodeHash[_5.id];},toString:function(){return "[Tree"+(this.id?" "+this.id:"")+"]";}});Ext.data.Node=function(_6){this.attributes=_6||{};this.leaf=this.attributes.leaf;this.id=this.attributes.id;if(!this.id){this.id=Ext.id(null,"ynode-");this.attributes.id=this.id;}this.childNodes=[];if(!this.childNodes.indexOf){this.childNodes.indexOf=function(o){for(var i=0,_9=this.length;i<_9;i++){if(this[i]==o){return i;}}return -1;};}this.parentNode=null;this.firstChild=null;this.lastChild=null;this.previousSibling=null;this.nextSibling=null;this.addEvents({"append":true,"remove":true,"move":true,"insert":true,"beforeappend":true,"beforeremove":true,"beforemove":true,"beforeinsert":true});this.listeners=this.attributes.listeners;Ext.data.Node.superclass.constructor.call(this);};Ext.extend(Ext.data.Node,Ext.util.Observable,{fireEvent:function(_a){if(Ext.data.Node.superclass.fireEvent.apply(this,arguments)===false){return false;}var ot=this.getOwnerTree();if(ot){if(ot.fireEvent.apply(this.ownerTree,arguments)===false){return false;}}return true;},isLeaf:function(){return this.leaf===true;},setFirstChild:function(_c){this.firstChild=_c;},setLastChild:function(_d){this.lastChild=_d;},isLast:function(){return (!this.parentNode?true:this.parentNode.lastChild==this);},isFirst:function(){return (!this.parentNode?true:this.parentNode.firstChild==this);},hasChildNodes:function(){return !this.isLeaf()&&this.childNodes.length>0;},appendChild:function(_e){var _f=false;if(_e instanceof Array){_f=_e;}else{if(arguments.length>1){_f=arguments;}}if(_f){for(var i=0,len=_f.length;i0){var _4a=_47?function(){fn.apply(_47,arguments);}:fn;cs.sort(_4a);for(var i=0;i0){var f=function(_14,_15){if(_14&&_15){var n=_15.findChild(_f,v);if(n){n.select();if(_10){_10(true,n);}}}else{if(_10){_10(false,n);}}};this.expandPath(_11.join(this.pathSeparator),_f,f);}else{this.root.select();if(_10){_10(true,this.root);}}},render:function(){this.container=this.el.createChild({tag:"ul",cls:"x-tree-root-ct "+(this.lines?"x-tree-lines":"x-tree-no-lines")});if(this.containerScroll){Ext.dd.ScrollManager.register(this.el);}if((this.enableDD||this.enableDrop)&&!this.dropZone){this.dropZone=new Ext.tree.TreeDropZone(this,this.dropConfig||{ddGroup:this.ddGroup||"TreeDD",appendOnly:this.ddAppendOnly===true});}if((this.enableDD||this.enableDrag)&&!this.dragZone){this.dragZone=new Ext.tree.TreeDragZone(this,this.dragConfig||{ddGroup:this.ddGroup||"TreeDD",scroll:this.ddScroll});}this.getSelectionModel().init(this);this.root.render();if(!this.rootVisible){this.root.renderChildren();}return this;}}); + +Ext.tree.DefaultSelectionModel=function(){this.selNode=null;this.addEvents({"selectionchange":true,"beforeselect":true});};Ext.extend(Ext.tree.DefaultSelectionModel,Ext.util.Observable,{init:function(_1){this.tree=_1;_1.el.on("keydown",this.onKeyDown,this);_1.on("click",this.onNodeClick,this);},onNodeClick:function(_2,e){this.select(_2);},select:function(_4){var _5=this.selNode;if(_5!=_4&&this.fireEvent("beforeselect",this,_4,_5)!==false){if(_5){_5.ui.onSelectedChange(false);}this.selNode=_4;_4.ui.onSelectedChange(true);this.fireEvent("selectionchange",this,_4,_5);}return _4;},unselect:function(_6){if(this.selNode==_6){this.clearSelections();}},clearSelections:function(){var n=this.selNode;if(n){n.ui.onSelectedChange(false);this.selNode=null;this.fireEvent("selectionchange",this,null);}return n;},getSelectedNode:function(){return this.selNode;},isSelected:function(_8){return this.selNode==_8;},selectPrevious:function(){var s=this.selNode||this.lastSelNode;if(!s){return null;}var ps=s.previousSibling;if(ps){if(!ps.isExpanded()||ps.childNodes.length<1){return this.select(ps);}else{var lc=ps.lastChild;while(lc&&lc.isExpanded()&&lc.childNodes.length>0){lc=lc.lastChild;}return this.select(lc);}}else{if(s.parentNode&&(this.tree.rootVisible||!s.parentNode.isRoot)){return this.select(s.parentNode);}}return null;},selectNext:function(){var s=this.selNode||this.lastSelNode;if(!s){return null;}if(s.firstChild&&s.isExpanded()){return this.select(s.firstChild);}else{if(s.nextSibling){return this.select(s.nextSibling);}else{if(s.parentNode){var _d=null;s.parentNode.bubble(function(){if(this.nextSibling){_d=this.getOwnerTree().selModel.select(this.nextSibling);return false;}});return _d;}}}return null;},onKeyDown:function(e){var s=this.selNode||this.lastSelNode;var sm=this;if(!s){return;}var k=e.getKey();switch(k){case e.DOWN:e.stopEvent();this.selectNext();break;case e.UP:e.stopEvent();this.selectPrevious();break;case e.RIGHT:e.preventDefault();if(s.hasChildNodes()){if(!s.isExpanded()){s.expand();}else{if(s.firstChild){this.select(s.firstChild,e);}}}break;case e.LEFT:e.preventDefault();if(s.hasChildNodes()&&s.isExpanded()){s.collapse();}else{if(s.parentNode&&(this.tree.rootVisible||s.parentNode!=this.tree.getRootNode())){this.select(s.parentNode,e);}}break;}}});Ext.tree.MultiSelectionModel=function(){this.selNodes=[];this.selMap={};this.addEvents({"selectionchange":true});};Ext.extend(Ext.tree.MultiSelectionModel,Ext.util.Observable,{init:function(_12){this.tree=_12;_12.el.on("keydown",this.onKeyDown,this);_12.on("click",this.onNodeClick,this);},onNodeClick:function(_13,e){this.select(_13,e,e.ctrlKey);},select:function(_15,e,_17){if(_17!==true){this.clearSelections(true);}if(this.isSelected(_15)){this.lastSelNode=_15;return _15;}this.selNodes.push(_15);this.selMap[_15.id]=_15;this.lastSelNode=_15;_15.ui.onSelectedChange(true);this.fireEvent("selectionchange",this,this.selNodes);return _15;},unselect:function(_18){if(this.selMap[_18.id]){_18.ui.onSelectedChange(false);var sn=this.selNodes;var _1a=-1;if(sn.indexOf){_1a=sn.indexOf(_18);}else{for(var i=0,len=sn.length;i0){for(var i=0,len=sn.length;i
        ","",this.indentMarkup,"","","","",n.text,"
        ","
          ",""];if(_25!==true&&n.nextSibling&&n.nextSibling.ui.getEl()){this.wrap=Ext.DomHelper.insertHtml("beforeBegin",n.nextSibling.ui.getEl(),buf.join(""));}else{this.wrap=Ext.DomHelper.insertHtml("beforeEnd",_27,buf.join(""));}this.elNode=this.wrap.childNodes[0];this.ctNode=this.wrap.childNodes[1];var cs=this.elNode.childNodes;this.indentNode=cs[0];this.ecNode=cs[1];this.iconNode=cs[2];this.anchor=cs[3];this.textNode=cs[3].firstChild;if(a.qtip){if(this.textNode.setAttributeNS){this.textNode.setAttributeNS("ext","qtip",a.qtip);if(a.qtipTitle){this.textNode.setAttributeNS("ext","qtitle",a.qtipTitle);}}else{this.textNode.setAttribute("ext:qtip",a.qtip);if(a.qtipTitle){this.textNode.setAttribute("ext:qtitle",a.qtipTitle);}}}this.initEvents();if(!this.node.expanded){this.updateExpandIcon();}}else{if(_25===true){_27.appendChild(this.wrap);}}},getAnchor:function(){return this.anchor;},getTextEl:function(){return this.textNode;},getIconEl:function(){return this.iconNode;},updateExpandIcon:function(){if(this.rendered){var n=this.node,c1,c2;var cls=n.isLast()?"x-tree-elbow-end":"x-tree-elbow";var _2f=n.hasChildNodes();if(_2f){if(n.expanded){cls+="-minus";c1="x-tree-node-collapsed";c2="x-tree-node-expanded";}else{cls+="-plus";c1="x-tree-node-expanded";c2="x-tree-node-collapsed";}if(this.wasLeaf){this.removeClass("x-tree-node-leaf");this.wasLeaf=false;}if(this.c1!=c1||this.c2!=c2){Ext.fly(this.elNode).replaceClass(c1,c2);this.c1=c1;this.c2=c2;}}else{if(!this.wasLeaf){Ext.fly(this.elNode).replaceClass("x-tree-node-expanded","x-tree-node-leaf");this.wasLeaf=true;}}var ecc="x-tree-ec-icon "+cls;if(this.ecc!=ecc){this.ecNode.className=ecc;this.ecc=ecc;}}},getChildIndent:function(){if(!this.childIndent){var buf=[];var p=this.node;while(p){if(!p.isRoot||(p.isRoot&&p.ownerTree.rootVisible)){if(!p.isLast()){buf.unshift("");}else{buf.unshift("");}}p=p.parentNode;}this.childIndent=buf.join("");}return this.childIndent;},renderIndent:function(){if(this.rendered){var _33="";var p=this.node.parentNode;if(p){_33=p.ui.getChildIndent();}if(this.indentMarkup!=_33){this.indentNode.innerHTML=_33;this.indentMarkup=_33;}this.updateExpandIcon();}}};Ext.tree.RootTreeNodeUI=function(){Ext.tree.RootTreeNodeUI.superclass.constructor.apply(this,arguments);};Ext.extend(Ext.tree.RootTreeNodeUI,Ext.tree.TreeNodeUI,{render:function(){if(!this.rendered){var _35=this.node.ownerTree.container.dom;this.node.expanded=true;_35.innerHTML="
          ";this.wrap=this.ctNode=_35.firstChild;}},collapse:function(){},expand:function(){}}); + +Ext.tree.TreeLoader=function(_1){this.baseParams={};this.requestMethod="POST";Ext.apply(this,_1);this.addEvents({"beforeload":true,"load":true,"loadexception":true});};Ext.extend(Ext.tree.TreeLoader,Ext.util.Observable,{uiProviders:{},clearOnLoad:true,load:function(_2,_3){if(this.clearOnLoad){while(_2.firstChild){_2.removeChild(_2.firstChild);}}if(_2.attributes.children){var cs=_2.attributes.children;for(var i=0,_6=cs.length;i<_6;i++){_2.appendChild(this.createNode(cs[i]));}if(typeof _3=="function"){_3();}}else{if(this.dataUrl){this.requestData(_2,_3);}}},getParams:function(_7){var _8=[],bp=this.baseParams;for(var _a in bp){if(typeof bp[_a]!="function"){_8.push(encodeURIComponent(_a),"=",encodeURIComponent(bp[_a]),"&");}}_8.push("node=",encodeURIComponent(_7.id));return _8.join("");},requestData:function(_b,_c){if(this.fireEvent("beforeload",this,_b,_c)!==false){var _d=this.getParams(_b);var cb={success:this.handleResponse,failure:this.handleFailure,scope:this,argument:{callback:_c,node:_b}};this.transId=Ext.lib.Ajax.request(this.requestMethod,this.dataUrl,cb,_d);}else{if(typeof _c=="function"){_c();}}},isLoading:function(){return this.transId?true:false;},abort:function(){if(this.isLoading()){Ext.lib.Ajax.abort(this.transId);}},createNode:function(_f){if(this.applyLoader!==false){_f.loader=this;}if(typeof _f.uiProvider=="string"){_f.uiProvider=this.uiProviders[_f.uiProvider]||eval(_f.uiProvider);}return (_f.leaf?new Ext.tree.TreeNode(_f):new Ext.tree.AsyncTreeNode(_f));},processResponse:function(_10,_11,_12){var _13=_10.responseText;try{var o=eval("("+_13+")");for(var i=0,len=o.length;iv2){return _3?-1:+1;}else{return 0;}}};};Ext.tree.TreeSorter.prototype={doSort:function(_d){_d.sort(this.sortFn);},compareNodes:function(n1,n2){return (n1.text.toUpperCase()>n2.text.toUpperCase()?1:-1);},updateSort:function(_10,_11){if(_11.childrenRendered){this.doSort.defer(1,this,[_11]);}}}; + +if(Ext.dd.DropZone){Ext.tree.TreeDropZone=function(_1,_2){this.allowParentInsert=false;this.allowContainerDrop=false;this.appendOnly=false;Ext.tree.TreeDropZone.superclass.constructor.call(this,_1.container,_2);this.tree=_1;this.lastInsertClass="x-tree-no-status";this.dragOverData={};};Ext.extend(Ext.tree.TreeDropZone,Ext.dd.DropZone,{ddGroup:"TreeDD",expandDelay:1000,expandNode:function(_3){if(_3.hasChildNodes()&&!_3.isExpanded()){_3.expand(false,null,this.triggerCacheRefresh.createDelegate(this));}},queueExpand:function(_4){this.expandProcId=this.expandNode.defer(this.expandDelay,this,[_4]);},cancelExpand:function(){if(this.expandProcId){clearTimeout(this.expandProcId);this.expandProcId=false;}},isValidDropPoint:function(n,pt,dd,e,_9){if(!n||!_9){return false;}var _a=n.node;var _b=_9.node;if(!(_a&&_a.isTarget&&pt)){return false;}if(pt=="append"&&_a.allowChildren===false){return false;}if((pt=="above"||pt=="below")&&(_a.parentNode&&_a.parentNode.allowChildren===false)){return false;}if(_b&&(_a==_b||_b.contains(_a))){return false;}var _c=this.dragOverData;_c.tree=this.tree;_c.target=_a;_c.data=_9;_c.point=pt;_c.source=dd;_c.rawEvent=e;_c.dropNode=_b;_c.cancel=false;var _d=this.tree.fireEvent("nodedragover",_c);return _c.cancel===false&&_d!==false;},getDropPoint:function(e,n,dd){var tn=n.node;if(tn.isRoot){return tn.allowChildren!==false?"append":false;}var _12=n.ddel;var t=Ext.lib.Dom.getY(_12),b=t+_12.offsetHeight;var y=Ext.lib.Event.getPageY(e);var _16=tn.allowChildren===false||tn.isLeaf();if(this.appendOnly||tn.parentNode.allowChildren===false){return _16?false:"append";}var _17=false;if(!this.allowParentInsert){_17=tn.hasChildNodes()&&tn.isExpanded();}var q=(b-t)/(_16?2:3);if(y>=t&&y<(t+q)){return "above";}else{if(!_17&&(_16||y>=b-q&&y<=b)){return "below";}else{return "append";}}},onNodeEnter:function(n,dd,e,_1c){this.cancelExpand();},onNodeOver:function(n,dd,e,_20){var pt=this.getDropPoint(e,n,dd);var _22=n.node;if(!this.expandProcId&&pt=="append"&&_22.hasChildNodes()&&!n.node.isExpanded()){this.queueExpand(_22);}else{if(pt!="append"){this.cancelExpand();}}var _23=this.dropNotAllowed;if(this.isValidDropPoint(n,pt,dd,e,_20)){if(pt){var el=n.ddel;var cls;if(pt=="above"){_23=n.node.isFirst()?"x-tree-drop-ok-above":"x-tree-drop-ok-between";cls="x-tree-drag-insert-above";}else{if(pt=="below"){_23=n.node.isLast()?"x-tree-drop-ok-below":"x-tree-drop-ok-between";cls="x-tree-drag-insert-below";}else{_23="x-tree-drop-ok-append";cls="x-tree-drag-append";}}if(this.lastInsertClass!=cls){Ext.fly(el).replaceClass(this.lastInsertClass,cls);this.lastInsertClass=cls;}}}return _23;},onNodeOut:function(n,dd,e,_29){this.cancelExpand();this.removeDropIndicators(n);},onNodeDrop:function(n,dd,e,_2d){var _2e=this.getDropPoint(e,n,dd);var _2f=n.node;_2f.ui.startDrop();if(!this.isValidDropPoint(n,_2e,dd,e,_2d)){_2f.ui.endDrop();return false;}var _30=_2d.node||(dd.getTreeNode?dd.getTreeNode(_2d,_2f,_2e,e):null);var _31={tree:this.tree,target:_2f,data:_2d,point:_2e,source:dd,rawEvent:e,dropNode:_30,cancel:!_30};var _32=this.tree.fireEvent("beforenodedrop",_31);if(_32===false||_31.cancel===true||!_31.dropNode){_2f.ui.endDrop();return false;}_2f=_31.target;if(_2e=="append"&&!_2f.isExpanded()){_2f.expand(false,null,function(){this.completeDrop(_31);}.createDelegate(this));}else{this.completeDrop(_31);}return true;},completeDrop:function(de){var ns=de.dropNode,p=de.point,t=de.target;if(!(ns instanceof Array)){ns=[ns];}var n;for(var i=0,len=ns.length;ind.offsetLeft){td.scrollLeft=nd.offsetLeft;}var w=Math.min(this.maxWidth,(td.clientWidth>20?td.clientWidth:td.offsetWidth)-Math.max(0,nd.offsetLeft-td.scrollLeft)-5);this.setSize(w,"");},triggerEdit:function(_9){this.completeEdit();this.editNode=_9;this.startEdit(_9.ui.textNode,_9.text);},bindScroll:function(){this.tree.el.on("scroll",this.cancelEdit,this);},beforeNodeClick:function(_a){if(this.tree.getSelectionModel().isSelected(_a)){this.triggerEdit(_a);return false;}},updateNode:function(ed,_c){this.tree.el.un("scroll",this.cancelEdit,this);this.editNode.setText(_c);},onSpecialKey:function(_d,e){var k=e.getKey();if(k==e.ESC){this.cancelEdit();e.stopEvent();}else{if(k==e.ENTER&&!e.hasModifier()){this.completeEdit();e.stopEvent();}}}}); + diff --git a/www/extras/yui-ext/package/util.js b/www/extras/yui-ext/package/util.js new file mode 100644 index 000000000..db9358533 --- /dev/null +++ b/www/extras/yui-ext/package/util.js @@ -0,0 +1,26 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.util.DelayedTask=function(fn,_2,_3){var id=null,d,t;var _7=function(){var _8=new Date().getTime();if(_8-t>=d){clearInterval(id);id=null;fn.apply(_2,_3||[]);}};this.delay=function(_9,_a,_b,_c){if(id&&_9!=d){this.cancel();}d=_9;t=new Date().getTime();fn=_a||fn;_2=_b||_2;_3=_c||_3;if(!id){id=setInterval(_7,d);}};this.cancel=function(){if(id){clearInterval(id);id=null;}};}; + +Ext.util.MixedCollection=function(_1,_2){this.items=[];this.map={};this.keys=[];this.length=0;this.addEvents({"clear":true,"add":true,"replace":true,"remove":true,"sort":true});this.allowFunctions=_1===true;if(_2){this.getKey=_2;}Ext.util.MixedCollection.superclass.constructor.call(this);};Ext.extend(Ext.util.MixedCollection,Ext.util.Observable,{allowFunctions:false,add:function(_3,o){if(arguments.length==1){o=arguments[0];_3=this.getKey(o);}if(typeof _3=="undefined"||_3===null){this.length++;this.items.push(o);this.keys.push(null);}else{var _5=this.map[_3];if(_5){return this.replace(_3,o);}this.length++;this.items.push(o);this.map[_3]=o;this.keys.push(_3);}this.fireEvent("add",this.length-1,o,_3);return o;},getKey:function(o){return o.id;},replace:function(_7,o){if(arguments.length==1){o=arguments[0];_7=this.getKey(o);}var _9=this.item(_7);if(typeof _7=="undefined"||_7===null||typeof _9=="undefined"){return this.add(_7,o);}var _a=this.indexOfKey(_7);this.items[_a]=o;this.map[_7]=o;this.fireEvent("replace",_7,_9,o);return o;},addAll:function(_b){if(arguments.length>1||_b instanceof Array){var _c=arguments.length>1?arguments:_b;for(var i=0,_e=_c.length;i<_e;i++){this.add(_c[i]);}}else{for(var _f in _b){if(this.allowFunctions||typeof _b[_f]!="function"){this.add(_b[_f],_f);}}}},each:function(fn,_11){var _12=[].concat(this.items);for(var i=0,len=_12.length;i=this.length){return this.add(key,o);}this.length++;this.items.splice(_1d,0,o);if(typeof key!="undefined"&&key!=null){this.map[key]=o;}this.keys.splice(_1d,0,key);this.fireEvent("add",_1d,o,key);return o;},remove:function(o){return this.removeAt(this.indexOf(o));},removeAt:function(_21){if(_21=0){this.length--;var o=this.items[_21];this.items.splice(_21,1);var key=this.keys[_21];if(typeof key!="undefined"){delete this.map[key];}this.keys.splice(_21,1);this.fireEvent("remove",o,key);}},removeKey:function(key){return this.removeAt(this.indexOfKey(key));},getCount:function(){return this.length;},indexOf:function(o){if(!this.items.indexOf){for(var i=0,len=this.items.length;i=end;i--){r[r.length]=_47[i];}}return r;},filter:function(_4a,_4b){if(!_4b.exec){_4b=String(_4b);if(_4b.length==0){return this.clone();}_4b=new RegExp("^"+Ext.escapeRe(_4b),"i");}return this.filterBy(function(o){return o&&_4b.test(o[_4a]);});},filterBy:function(fn,_4e){var r=new Ext.util.MixedCollection();r.getKey=this.getKey;var k=this.keys,it=this.items;for(var i=0,len=it.length;i_3){return _2.substr(0,_3-3)+"...";}return _2;},undef:function(_4){return typeof _4!="undefined"?_4:"";},htmlEncode:function(_5){return !_5?_5:String(_5).replace(/&/g,"&").replace(/>/g,">").replace(/2){var _f=Array.prototype.slice.call(arguments,2);_f.unshift(_d);return eval(fn).apply(window,_f);}else{return eval(fn).call(window,_d);}},usMoney:function(v){v=(Math.round((v-0)*100))/100;v=(v==Math.floor(v))?v+".00":((v*10==Math.floor(v*10))?v+"0":v);return "$"+v;},date:function(v,_12){if(!v){return "";}if(!(v instanceof Date)){v=new Date(Date.parse(v));}return v.dateFormat(_12||"m/d/Y");},dateRenderer:function(_13){return function(v){return Ext.util.Format.date(v,_13);};},stripTagsRE:/<\/?[^>]+>/gi,stripTags:function(v){return !v?v:String(v).replace(this.stripTagsRE,"");}};}(); + +Ext.util.CSS=function(){var _1=null;var _2=document;var _3=/(-[a-z])/gi;var _4=function(m,a){return a.charAt(1).toUpperCase();};return {createStyleSheet:function(_7){var ss;if(Ext.isIE){ss=_2.createStyleSheet();ss.cssText=_7;}else{var _9=_2.getElementsByTagName("head")[0];var _a=_2.createElement("style");_a.setAttribute("type","text/css");try{_a.appendChild(_2.createTextNode(_7));}catch(e){_a.cssText=_7;}_9.appendChild(_a);ss=_a.styleSheet?_a.styleSheet:(_a.sheet||_2.styleSheets[_2.styleSheets.length-1]);}this.cacheStyleSheet(ss);return ss;},removeStyleSheet:function(id){var _c=_2.getElementById(id);if(_c){_c.parentNode.removeChild(_c);}},swapStyleSheet:function(id,_e){this.removeStyleSheet(id);var ss=_2.createElement("link");ss.setAttribute("rel","stylesheet");ss.setAttribute("type","text/css");ss.setAttribute("id",id);ss.setAttribute("href",_e);_2.getElementsByTagName("head")[0].appendChild(ss);},refreshCache:function(){return this.getRules(true);},cacheStyleSheet:function(ss){if(!_1){_1={};}try{var _11=ss.cssRules||ss.rules;for(var j=_11.length-1;j>=0;--j){_1[_11[j].selectorText]=_11[j];}}catch(e){}},getRules:function(_13){if(_1==null||_13){_1={};var ds=_2.styleSheets;for(var i=0,len=ds.length;i=37&&k<=40){e.stopEvent();}},relay:function(e){var k=e.getKey();var h=this.keyToHandler[k];if(h&&this[h]){if(this.doRelay(e,this[h],h)!==true){e[this.defaultEventAction]();}}},doRelay:function(e,h,_b){return h.call(this.scope||this,e);},enter:false,left:false,right:false,up:false,down:false,tab:false,esc:false,pageUp:false,pageDown:false,del:false,home:false,end:false,keyToHandler:{37:"left",39:"right",38:"up",40:"down",33:"pageUp",34:"pageDown",46:"del",36:"home",35:"end",13:"enter",27:"esc",9:"tab"},enable:function(){if(this.disabled){if(Ext.isIE){this.el.on("keydown",this.relay,this);}else{this.el.on("keydown",this.prepareEvent,this);this.el.on("keypress",this.relay,this);}this.disabled=false;}},disable:function(){if(!this.disabled){if(Ext.isIE){this.el.un("keydown",this.relay);}else{this.el.un("keydown",this.prepareEvent);this.el.un("keypress",this.relay);}this.disabled=true;}}}; + +Ext.KeyMap=function(el,_2,_3){this.el=Ext.get(el);this.eventName=_3||"keydown";this.bindings=[];if(_2 instanceof Array){for(var i=0,_5=_2.length;i<_5;i++){this.addBinding(_2[i]);}}else{this.addBinding(_2);}this.keyDownDelegate=Ext.EventManager.wrap(this.handleKeyDown,this,true);this.enable();};Ext.KeyMap.prototype={stopEvent:false,addBinding:function(_6){var _7=_6.key,_8=_6.shift,_9=_6.ctrl,_a=_6.alt,fn=_6.fn,_c=_6.scope;if(typeof _7=="string"){var ks=[];var _e=_7.toUpperCase();for(var j=0,len=_e.length;jvw+s.left){x=vw-w-this.shadowOffset;_1f=true;}if((y+h)>vh+s.top){y=vh-h-this.shadowOffset;_1f=true;}if(x=ay){y=ay-h-5;}}xy=[x,y];this.storeXY(xy);_7.setXY.call(this,xy);this.sync();}}},isVisible:function(){return this.visible;},showAction:function(){this.visible=true;if(this.useDisplay===true){this.setDisplayed("");}else{if(this.lastXY){_7.setXY.call(this,this.lastXY);}else{if(this.lastLT){_7.setLeftTop.call(this,this.lastLT[0],this.lastLT[1]);}}}},hideAction:function(){this.visible=false;if(this.useDisplay===true){this.setDisplayed(false);}else{this.setLeftTop(-10000,-10000);}},setVisible:function(v,a,d,c,e){if(v){this.showAction();}if(a&&v){var cb=function(){this.sync(true);if(c){c();}}.createDelegate(this);_7.setVisible.call(this,true,true,d,cb,e);}else{if(!v){this.hideUnders(true);}var cb=c;if(a){cb=function(){this.hideAction();if(c){c();}}.createDelegate(this);}_7.setVisible.call(this,v,a,d,cb,e);if(v){this.sync(true);}else{if(!a){this.hideAction();}}}},storeXY:function(xy){delete this.lastLT;this.lastXY=xy;},storeLeftTop:function(_28,top){delete this.lastXY;this.lastLT=[_28,top];},beforeFx:function(){this.beforeAction();return Ext.Layer.superclass.beforeFx.apply(this,arguments);},afterFx:function(){Ext.Layer.superclass.afterFx.apply(this,arguments);this.sync(this.isVisible());},beforeAction:function(){if(!this.updating&&this.shadow){this.shadow.hide();}},setLeft:function(_2a){this.storeLeftTop(_2a,this.getTop(true));_7.setLeft.apply(this,arguments);this.sync();},setTop:function(top){this.storeLeftTop(this.getLeft(true),top);_7.setTop.apply(this,arguments);this.sync();},setLeftTop:function(_2c,top){this.storeLeftTop(_2c,top);_7.setLeftTop.apply(this,arguments);this.sync();},setXY:function(xy,a,d,c,e){this.fixDisplay();this.beforeAction();this.storeXY(xy);var cb=this.createCB(c);_7.setXY.call(this,xy,a,d,cb,e);if(!a){cb();}},createCB:function(c){var el=this;return function(){el.constrainXY();el.sync(true);if(c){c();}};},setX:function(x,a,d,c,e){this.setXY([x,this.getY()],a,d,c,e);},setY:function(y,a,d,c,e){this.setXY([this.getX(),y],a,d,c,e);},setSize:function(w,h,a,d,c,e){this.beforeAction();var cb=this.createCB(c);_7.setSize.call(this,w,h,a,d,cb,e);if(!a){cb();}},setWidth:function(w,a,d,c,e){this.beforeAction();var cb=this.createCB(c);_7.setWidth.call(this,w,a,d,cb,e);if(!a){cb();}},setHeight:function(h,a,d,c,e){this.beforeAction();var cb=this.createCB(c);_7.setHeight.call(this,h,a,d,cb,e);if(!a){cb();}},setBounds:function(x,y,w,h,a,d,c,e){this.beforeAction();var cb=this.createCB(c);if(!a){this.storeXY([x,y]);_7.setXY.call(this,[x,y]);_7.setSize.call(this,w,h,a,d,cb,e);cb();}else{_7.setBounds.call(this,x,y,w,h,a,d,cb,e);}return this;},setZIndex:function(_5c){this.zindex=_5c;this.setStyle("z-index",_5c+2);if(this.shadow){this.shadow.setZIndex(_5c+1);}if(this.shim){this.shim.setStyle("z-index",_5c);}}});})(); + +Ext.Shadow=function(_1){Ext.apply(this,_1);if(typeof this.mode!="string"){this.mode=this.defaultMode;}var o=this.offset,a={h:0};switch(this.mode.toLowerCase()){case "drop":a.w=0;a.l=a.t=o;break;case "sides":a.w=(o*2);a.l=-o;a.t=o;break;case "frame":a.w=a.h=(o*2);a.l=a.t=-o;break;}this.adjusts=a;};Ext.Shadow.prototype={offset:4,defaultMode:"drop",show:function(_4){_4=Ext.get(_4);if(!this.el){this.el=Ext.Shadow.Pool.pull();if(this.el.dom.nextSibling!=_4.dom){this.el.insertBefore(_4);}}this.el.setStyle("z-index",this.zIndex||parseInt(_4.getStyle("z-index"),10)-1);if(Ext.isIE){this.el.dom.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius="+this.offset+")";}this.realign(_4.getLeft(true),_4.getTop(true),_4.getWidth(),_4.getHeight());this.el.dom.style.display="block";},isVisible:function(){return this.el?true:false;},realign:function(l,t,w,h){if(!this.el){return;}var a=this.adjusts,d=this.el.dom,s=d.style;var _c=0;if(Ext.isIE){_c=-(this.offset);}s.left=(l+a.l+_c)+"px";s.top=(t+a.t+_c)+"px";var sw=(w+a.w),sh=(h+a.h),_f=sw+"px",shs=sh+"px";if(s.width!=_f||s.height!=shs){s.width=_f;s.height=shs;if(!Ext.isIE){var cn=d.childNodes;var sww=Math.max(0,(sw-12))+"px";cn[0].childNodes[1].style.width=sww;cn[1].childNodes[1].style.width=sww;cn[2].childNodes[1].style.width=sww;cn[1].style.height=Math.max(0,(sh-12))+"px";}}},hide:function(){if(this.el){this.el.dom.style.display="none";Ext.Shadow.Pool.push(this.el);delete this.el;}},setZIndex:function(z){this.zIndex=z;if(this.el){this.el.setStyle("z-index",z);}}};Ext.Shadow.Pool=function(){var p=[];var _15=Ext.isIE?"
          ":"
          ";return {pull:function(){var sh=p.shift();if(!sh){sh=Ext.get(Ext.DomHelper.insertHtml("beforeBegin",document.body.firstChild,_15));sh.autoBoxAdjust=false;}return sh;},push:function(sh){p.push(sh);}};}(); + 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..e476a5a72 --- /dev/null +++ b/www/extras/yui-ext/resources/css/README.txt @@ -0,0 +1,3 @@ +2006-11-21 jvs: +ext-all.css contains all of the other css files combined and stripped of comments (except themes). + 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..446773bd9 --- /dev/null +++ b/www/extras/yui-ext/resources/css/basic-dialog.css @@ -0,0 +1,286 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.x-dlg-proxy { + background-image: url(../images/default/gradient-bg.gif); + background-color:#c3daf9; + border:1px solid #6593cf; + z-index:10001; + overflow:hidden; + position:absolute; + left:0;top:0; +} +.x-dlg-shadow{ + background:#aaaaaa; + position:absolute; + left:0;top:0; +} +.x-dlg-focus{ + -moz-outline:0 none; + outline:0 none; + width:0; + height:0; + overflow:hidden; + position:absolute; + top:0; + left:0; +} +.x-dlg-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.x-body-masked select { + visibility:hidden; +} +body.x-body-masked .x-dlg select { + visibility:visible; +} +.x-dlg{ + z-index:10001; + overflow:hidden; + position:absolute; + left:300;top:0; +} +.x-dlg .x-dlg-hd { + background: url(../images/default/basic-dialog/hd-sprite.gif) repeat-x 0 -82px; + background-color:navy; + color:#FFF; + font:bold 12px "sans serif", tahoma, verdana, helvetica; + overflow:hidden; + padding:5px; + white-space: nowrap; +} +.x-dlg .x-dlg-hd-left { + background: url(../images/default/basic-dialog/hd-sprite.gif) no-repeat 0 -41px; + padding-left:3px; + margin:0; +} +.x-dlg .x-dlg-hd-right { + background: url(../images/default/basic-dialog/hd-sprite.gif) no-repeat right 0; + padding-right:3px; +} +.x-dlg .x-dlg-dlg-body{ + background:url(../images/default/layout/gradient-bg.gif); + border:1px solid #6593cf; + border-top:0 none; + padding:10px; + position:absolute; + top:24px;left:0; + z-index:1; + overflow:hidden; +} +.x-dlg-collapsed .x-resizable-handle{ + display:none; +} +.x-dlg .x-dlg-bd{ + overflow:hidden; +} +.x-dlg .x-dlg-ft{ + overflow:hidden; + padding:5px; + padding-bottom:0; +} + +.x-dlg .x-tabs-body{ + background:white; + overflow:auto; +} +.x-dlg .x-tabs-top .x-tabs-body{ + border:1px solid #6593cf; + border-top:0 none; +} +.x-dlg .x-tabs-bottom .x-tabs-body{ + border:1px solid #6593cf; + border-bottom:0 none; +} +.x-dlg .x-layout-container .x-tabs-body{ + border:0 none; +} +.x-dlg .inner-tab{ + margin:5px; +} +.x-dlg .x-dlg-ft .x-btn{ + margin-right:5px; + float:right; + clear:none; +} +.x-dlg .x-dlg-ft .x-dlg-btns td { + border:0; + padding:0; +} +.x-dlg .x-dlg-ft .x-dlg-btns-right table{ + float:right; + clear:none; +} +.x-dlg .x-dlg-ft .x-dlg-btns-left table{ + float:left; + clear:none; +} +.x-dlg .x-dlg-ft .x-dlg-btns-center{ + text-align:center; /*ie*/ +} +.x-dlg .x-dlg-ft .x-dlg-btns-center table{ + margin:0 auto; /*everyone else*/ +} + + +.x-dlg .x-dlg-ft .x-dlg-btns .x-btn-focus .x-btn-left{ + background-position:0 -147px; +} +.x-dlg .x-dlg-ft .x-dlg-btns .x-btn-focus .x-btn-right{ + background-position:0 -168px; +} +.x-dlg .x-dlg-ft .x-dlg-btns .x-btn-focus .x-btn-center{ + background-position:0 -189px; +} + +.x-dlg .x-dlg-ft .x-dlg-btns .x-btn-click .x-btn-center{ + background-position:0 -126px; +} +.x-dlg .x-dlg-ft .x-dlg-btns .x-btn-click .x-btn-right{ + background-position:0 -84px; +} +.x-dlg .x-dlg-ft .x-dlg-btns .x-btn-click .x-btn-left{ + background-position:0 -63px; +} + +.x-dlg-draggable .x-dlg-hd{ + cursor:move; +} +.x-dlg-closable .x-dlg-hd{ + padding-right:22px; +} +.x-dlg-toolbox { + position:absolute; + top:4px; + right:4px; + z-index:6; + width:40px; + cursor:default; + height:15px; + background:transparent; +} +.x-dlg .x-dlg-close, .x-dlg .x-dlg-collapse { + float:right; + height:15px; + width:15px; + margin:0; + margin-left:2px; + padding:0; + line-height:1px; + font-size:1px; + background-repeat:no-repeat; + cursor:pointer; + visibility:inherit; +} +.x-dlg .x-dlg-close { + background-image:url(../images/default/basic-dialog/close.gif); +} +.x-dlg .x-dlg-collapse { + background-image:url(../images/default/basic-dialog/collapse.gif); +} +.x-dlg-collapsed .x-dlg-collapse { + background-image:url(../images/default/basic-dialog/expand.gif); +} +.x-dlg .x-dlg-close-over, .x-dlg .x-dlg-collapse-over { + +} +.x-dlg div.x-resizable-handle-east{ + background-image:url(../images/default/basic-dialog/e-handle.gif); + border:0; + background-position:right; + margin-right:0; +} +.x-dlg div.x-resizable-handle-south{ + background-image:url(../images/default/sizer/s-handle-dark.gif); + border:0; + height:6px; +} +.x-dlg div.x-resizable-handle-west{ + background-image:url(../images/default/basic-dialog/e-handle.gif); + border:0; + background-position:1px; +} +.x-dlg div.x-resizable-handle-north{ + background-image:url(../images/default/s.gif); + border:0; +} +.x-dlg div.x-resizable-handle-northeast, .ytheme-gray .x-dlg div.x-resizable-handle-northeast{ + background-image:url(../images/default/s.gif); + border:0; +} +.x-dlg div.x-resizable-handle-northwest, .ytheme-gray .x-dlg div.x-resizable-handle-northwest{ + background-image:url(../images/default/s.gif); + border:0; +} +.x-dlg div.x-resizable-handle-southeast{ + background-image:url(../images/default/basic-dialog/se-handle.gif); + background-position: bottom right; + width:8px; + height:8px; + border:0; +} +.x-dlg div.x-resizable-handle-southwest{ + background-image:url(../images/default/sizer/sw-handle-dark.gif); + background-position: top right; + margin-left:1px; + margin-bottom:1px; + border:0; +} + +#x-msg-box .x-dlg-ft .x-btn{ + float:none; + clear:none; + margin:0 3px; +} + +#x-msg-box .x-dlg-bd { + padding:5px; + overflow:hidden !important; + font:normal 13px verdana,tahoma,sans-serif; +} +#x-msg-box .ext-mb-input { + margin-top:4px; + width:95%; +} +#x-msg-box .ext-mb-textarea { + margin-top:4px; + font:normal 13px verdana,tahoma,sans-serif; +} +#x-msg-box .ext-mb-progress-wrap { + margin-top:4px; + border:1px solid #6593cf; +} +#x-msg-box .ext-mb-progress { + height:18px; + background: #e0e8f3 url(../images/default/qtip/bg.gif) repeat-x; +} +#x-msg-box .ext-mb-progress-bar { + height:18px; + overflow:hidden; + width:0; + background:#8BB8F3; + border-top:1px solid #B2D0F7; + border-bottom:1px solid #65A1EF; + border-right:1px solid #65A1EF; +} + +#x-msg-box .x-msg-box-wait { + background: transparent url(../images/default/grid/loading.gif) no-repeat left; + display:block; + width:300px; + padding-left:18px; + line-height:18px; +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/box.css b/www/extras/yui-ext/resources/css/box.css new file mode 100644 index 000000000..baa65fb12 --- /dev/null +++ b/www/extras/yui-ext/resources/css/box.css @@ -0,0 +1,111 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* + Creates rounded, raised boxes like on the Ext website - the markup isn't pretty: +
          +
          +
          +

          YOUR TITLE HERE (optional)

          +
          YOUR CONTENT HERE
          +
          +
          +
          + */ + +.x-box-tl { + background: transparent url(../images/default/box/corners.gif) no-repeat 0 0; + zoom:1; +} + +.x-box-tc { + height: 8px; + background: transparent url(../images/default/box/tb.gif) repeat-x 0 0; + overflow: hidden; +} + +.x-box-tr { + background: transparent url(../images/default/box/corners.gif) no-repeat right -8px; +} + +.x-box-ml { + background: transparent url(../images/default/box/l.gif) repeat-y 0; + padding-left: 4px; + overflow: hidden; + zoom:1; +} + +.x-box-mc { + background: #eee url(../images/default/box/tb.gif) repeat-x 0 -16px; + padding: 4px 10px; + font-family: "Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif; + color: #393939; + font-size: 12px; +} + +.x-box-mc h3 { + font-size: 14px; + font-weight: bold; + margin: 0 0 4 0; + zoom:1; +} + +.x-box-mr { + background: transparent url(../images/default/box/r.gif) repeat-y right; + padding-right: 4px; + overflow: hidden; +} + +.x-box-bl { + background: transparent url(../images/default/box/corners.gif) no-repeat 0 -16px; + zoom:1; +} + +.x-box-bc { + background: transparent url(../images/default/box/tb.gif) repeat-x 0 -8px; + height: 8px; + overflow: hidden; +} + +.x-box-br { + background: transparent url(../images/default/box/corners.gif) no-repeat right -24px; +} + +.x-box-tl, .x-box-bl { + padding-left: 8px; + overflow: hidden; +} + +.x-box-tr, .x-box-br { + padding-right: 8px; + overflow: hidden; +} + +.x-box-blue .x-box-bl, .x-box-blue .x-box-br, .x-box-blue .x-box-tl, .x-box-blue .x-box-tr { + background-image: url(../images/default/box/corners-blue.gif); +} + +.x-box-blue .x-box-bc, .x-box-blue .x-box-mc, .x-box-blue .x-box-tc { + background-image: url(../images/default/box/tb-blue.gif); +} + +.x-box-blue .x-box-mc { + background-color: #c3daf9; +} + +.x-box-blue .x-box-mc h3 { + color: #17385b; +} + +.x-box-blue .x-box-ml { + background-image: url(../images/default/box/l-blue.gif); +} + +.x-box-blue .x-box-mr { + background-image: url(../images/default/box/r-blue.gif); +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/button.css b/www/extras/yui-ext/resources/css/button.css new file mode 100644 index 000000000..0c1740737 --- /dev/null +++ b/www/extras/yui-ext/resources/css/button.css @@ -0,0 +1,148 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.x-btn{ + font:normal 11px tahoma, verdana, helvetica; + cursor:pointer; + white-space: nowrap; +} +.x-btn button{ + border:0 none; + background:transparent; + font:normal 11px tahoma,verdana,helvetica; + padding-left:3px; + padding-right:3px; + cursor:pointer; + margin:0; + overflow:visible; + width:auto; + -moz-outline:0 none; + outline:0 none; +} +* html .ext-ie .x-btn button { + width:1px; +} +.ext-gecko .x-btn button { + padding-left:0; + padding-right:0; +} +.ext-ie .x-btn button { + padding-top:2px; +} +/* + Predefined css class for buttons with only icon. Add this class (x-btn-icon) and a class with a background-image + to your button for a button with just an icon. + e.g. + .my-class .x-btn-text { background-image: url(foo.gif); } + */ + +.x-btn-icon .x-btn-center .x-btn-text{ + background-position: center; + background-repeat: no-repeat; + height: 16px; + width: 16px; + cursor:pointer; + white-space: nowrap; + padding:0; +} +.x-btn-icon .x-btn-center{ + padding:1px; +} +.x-btn em { + font-style:normal; + font-weight:normal; +} +/* + Button class for icon and text. Add this class (x-btn-text-icon) and a class with a background-image + to your button for both text and icon. +*/ + +.x-btn-text-icon .x-btn-center .x-btn-text{ + background-position: 0 2px; + background-repeat: no-repeat; + padding-left:18px; + padding-top:3px; + padding-bottom:3px; + padding-right:0; +} + +.x-btn-left, .x-btn-right{ + font-size:1px; + line-height:1px; +} +.x-btn-left{ + width:3px; + height:21px; + background:url(../images/default/basic-dialog/btn-sprite.gif) no-repeat 0 0; +} +.x-btn-right{ + width:3px; + height:21px; + background:url(../images/default/basic-dialog/btn-sprite.gif) no-repeat 0 -21px; +} +.x-btn-left i, .x-btn-right i{ + display:block; + width:3px; + overflow:hidden; + font-size:1px; + line-height:1px; +} +.x-btn-center{ + background:url(../images/default/basic-dialog/btn-sprite.gif) repeat-x 0 -42px; + vertical-align: middle; + text-align:center; + padding:0 5px; + cursor:pointer; + white-space:nowrap; +} +.x-btn-over .x-btn-left{ + background-position:0 -63px; +} +.x-btn-over .x-btn-right{ + background-position:0 -84px; +} +.x-btn-over .x-btn-center{ + background-position:0 -105px; +} +.x-btn-click .x-btn-center, .x-btn-menu-active .x-btn-center{ + background-position:0 -126px; +} +.x-btn-disabled *{ + color:gray !important; + cursor:default !important; +} +.x-btn-menu-text-wrap .x-btn-center { + padding:0 3px; +} +.ext-gecko .x-btn-menu-text-wrap .x-btn-center { + padding:0 1px; +} +.x-btn-menu-arrow-wrap .x-btn-center { + padding:0; +} +.x-btn-menu-arrow-wrap .x-btn-center button { + width:12px !important; + height:21px; + padding:0 !important; + display:block; + background:transparent url(../images/default/basic-dialog/btn-arrow.gif) no-repeat left 3px; +} +.x-btn-with-menu .x-btn-center { + padding-right:2px !important; +} +.x-btn-with-menu .x-btn-center em { + display:block; + background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat right 0; + padding-right:10px; +} + +.x-btn-text-icon .x-btn-with-menu .x-btn-center em { + display:block; + background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat right 3px; + padding-right:10px; +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/combo.css b/www/extras/yui-ext/resources/css/combo.css new file mode 100644 index 000000000..47ff92116 --- /dev/null +++ b/www/extras/yui-ext/resources/css/combo.css @@ -0,0 +1,46 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.x-combo-list { + border:1px solid #98c0f4; + background:#ddecfe; + zoom:1; + overflow:hidden; +} +.x-combo-list-inner { + overflow:auto; + background:white; + position:relative; /* for calculating scroll offsets */ +} +.x-combo-list-hd { + font:bold 11px tahoma, arial, helvetica, sans-serif; + color:#15428b; + background-image: url(../images/default/layout/panel-title-light-bg.gif); + border-bottom:1px solid #98c0f4; + padding:3px; +} +.x-resizable-pinned .x-combo-list-inner { + border-bottom:1px solid #98c0f4; +} +.x-combo-list-item { + font:normal 12px tahoma, arial, helvetica, sans-serif; + padding:2px; + border:1px solid #fff; + zoom:1; + white-space: nowrap; + overflow:hidden; + text-overflow: ellipsis; +} +.x-combo-list .x-combo-selected{ + background-color: #c3daf9 !important; + cursor:pointer; + border:1px solid #336699; +} +.x-combo-noedit{ + cursor:pointer; +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/core.css b/www/extras/yui-ext/resources/css/core.css new file mode 100644 index 000000000..e97a61de9 --- /dev/null +++ b/www/extras/yui-ext/resources/css/core.css @@ -0,0 +1,290 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.ext-el-mask { + z-index: 20000; + position: absolute; + top: 0; + left: 0; + -moz-opacity: 0.5; + opacity: .50; + filter: alpha(opacity=50); + background-color: #CCC; + width: 100%; + height: 100%; + zoom: 1; +} +.ext-el-mask-msg { + z-index: 20001; + position: absolute; + top: 0; + left: 0; + border:1px solid #6593cf; + background: #c3daf9 url(../images/default/box/tb-blue.gif) repeat-x 0 -16px; + padding:2px; +} +.ext-el-mask-msg div { + padding:5px 10px 5px 10px; + background: #eee; + border:1px solid #a3bad9; + color:#333; + font:normal 12px tahoma, arial, helvetica, sans-serif; + cursor:wait; +} + +.ext-shim { + position:absolute; + visibility:hidden; + left:0; + top:0; + overflow:hidden; +} +.ext-ie .ext-shim { + filter: alpha(opacity=0); +} + +.x-mask-loading div { + padding:5px 10px 5px 25px; + background: #eee url( '../images/default/grid/loading.gif' ) no-repeat 5px 5px; + line-height: 16px; +} + +/* class for hiding elements without using display:none */ +.x-hidden { + position:absolute; + left:-2000px; + top:-2000px; + visibility:hidden; +} + +.x-masked { + overflow: hidden !important; +} + +.x-masked select, .x-masked object, .x-masked embed { + visibility: hidden; +} + +.x-layer { + visibility: hidden; +} + +.x-unselectable, .x-unselectable * { + -moz-user-select: none; + -khtml-user-select: none; +} + +.x-repaint { + zoom: 1; + background-color: transparent; + -moz-outline: none; +} + +.x-item-disabled { + color: gray; + cursor: default; + opacity: .6; + -moz-opacity: .6; + filter: alpha(opacity=60); +} + +.x-item-disabled * { + color: gray; + cursor: default !important; +} + +.x-splitbar-proxy { + position: absolute; + visibility: hidden; + z-index: 20001; + background: #aaa; + zoom: 1; + line-height: 1px; + font-size: 1px; + overflow: hidden; +} + +.x-splitbar-h, .x-splitbar-proxy-h { + cursor: e-resize; + cursor: col-resize; +} + +.x-splitbar-v, .x-splitbar-proxy-v { + cursor: s-resize; + cursor: row-resize; +} + +.x-color-palette { + width: 150px; + height: 92px; +} + +.x-color-palette a { + border: 1px solid #fff; + float: left; + padding: 2px; + text-decoration: none; + -moz-outline: 0 none; + outline: 0 none; +} + +.x-color-palette a:hover, .x-color-palette a.x-color-palette-sel { + border: 1px solid #8BB8F3; + background: #deecfd; +} + +.x-color-palette em { + display: block; + border: 1px solid #ACA899; +} + +.x-color-palette em span { + cursor: pointer; + display: block; + height: 10px; + line-height: 10px; + width: 10px; +} + +.x-ie-shadow { + display: none; + position: absolute; + overflow: hidden; + left:0; + top:0; + background:#999; + zoom:1; +} + +.x-shadow { + display: none; + position: absolute; + overflow: hidden; + left:0; + top:0; +} + +.x-shadow * { + overflow: hidden; +} + +.x-shadow * { + padding: 0; + border: 0; + margin: 0; + clear: none; + zoom: 1; +} + +/* top bottom */ +.x-shadow .xstc, .x-shadow .xsbc { + height: 6px; + float: left; +} + +/* corners */ +.x-shadow .xstl, .x-shadow .xstr, .x-shadow .xsbl, .x-shadow .xsbr { + width: 6px; + height: 6px; + float: left; +} + +/* sides */ +.x-shadow .xsc { + width: 100%; +} + +.x-shadow .xsml, .x-shadow .xsmr { + width: 6px; + float: left; + height: 100%; +} + +.x-shadow .xsmc { + float: left; + height: 100%; + background: transparent url( ../images/default/shadow-c.png ); +} + +.x-shadow .xst, .x-shadow .xsb { + height: 6px; + overflow: hidden; + width: 100%; +} + +.x-shadow .xsml { + background: transparent url( ../images/default/shadow-lr.png ) repeat-y 0 0; +} + +.x-shadow .xsmr { + background: transparent url( ../images/default/shadow-lr.png ) repeat-y -6px 0; +} + +.x-shadow .xstl { + background: transparent url( ../images/default/shadow.png ) no-repeat 0 0; +} + +.x-shadow .xstc { + background: transparent url( ../images/default/shadow.png ) repeat-x 0 -30px; +} + +.x-shadow .xstr { + background: transparent url( ../images/default/shadow.png ) repeat-x 0 -18px; +} + +.x-shadow .xsbl { + background: transparent url( ../images/default/shadow.png ) no-repeat 0 -12px; +} + +.x-shadow .xsbc { + background: transparent url( ../images/default/shadow.png ) repeat-x 0 -36px; +} + +.x-shadow .xsbr { + background: transparent url( ../images/default/shadow.png ) repeat-x 0 -6px; +} + +.loading-indicator { + font-size: 11px; + background-image: url( '../images/default/grid/loading.gif' ); + background-repeat: no-repeat; + background-position: left; + padding-left: 20px; + line-height: 16px; + margin: 3px; +} + +.x-text-resize { + position: absolute; + left: -1000px; + top: -1000px; + visibility: hidden; + zoom: 1; +} + +.x-drag-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); +} + +.x-clear { + clear:both; + height:0; + overflow:hidden; + line-height:0; + font-size:0; +} diff --git a/www/extras/yui-ext/resources/css/date-picker.css b/www/extras/yui-ext/resources/css/date-picker.css new file mode 100644 index 000000000..061776824 --- /dev/null +++ b/www/extras/yui-ext/resources/css/date-picker.css @@ -0,0 +1,155 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.x-date-picker { + border: 1px solid #1b376c; + border-top:0 none; + background:#fff; +} +.x-date-picker a { + -moz-outline:0 none; + outline:0 none; +} +.x-date-inner, .x-date-inner td, .x-date-inner th{ + border-collapse:separate; +} +.x-date-middle,.x-date-left,.x-date-right { + background: url(../images/default/basic-dialog/hd-sprite.gif) repeat-x 0 -83px; + color:#FFF; + font:bold 11px "sans serif", tahoma, verdana, helvetica; + overflow:hidden; +} + +.x-date-middle .x-btn-left,.x-date-middle .x-btn-center,.x-date-middle .x-btn-right{ + background:transparent !important; + vertical-align:middle; +} +.x-date-middle .x-btn .x-btn-text { + color:#fff; +} +.x-date-middle .x-btn-with-menu .x-btn-center em { + background:transparent url(../images/default/toolbar/btn-arrow-light.gif) no-repeat right 0; +} +.x-date-right, .x-date-left { + width:18px; +} +.x-date-right{ + text-align:right; +} +.x-date-middle { + padding-top:2px;padding-bottom:2px; +} +.x-date-right a, .x-date-left a{ + display:block; + width:16px; + height:16px; + background-position: center; + background-repeat: no-repeat; + cursor:pointer; + -moz-opacity: 0.6; + opacity:.6; + filter: alpha(opacity=60); +} +.x-date-right a:hover, .x-date-left a:hover{ + -moz-opacity: 1; + opacity:1; + filter: alpha(opacity=100); +} +.x-date-right a { + background-image: url(../images/default/shared/right-btn.gif); + margin-right:2px; +} +.x-date-left a{ + background-image: url(../images/default/shared/left-btn.gif); + margin-left:2px; +} +table.x-date-inner { + width:100%; + table-layout:fixed; +} +.x-date-inner th { + width:25px; +} +.x-date-inner th { + background: #c3daf9; + text-align:right !important; + border-bottom: 1px solid #a3bad9; + font:normal 10px arial, helvetica,tahoma,sans-serif; + color:#233d6d; + cursor:default; + padding:0; + border-collapse:separate; +} +.x-date-inner th span { + display:block; + padding:2px; + padding-right:7px; +} +.x-date-inner td { + border: 1px solid #fff; + text-align:right; + padding:0; +} +.x-date-inner a { + padding:2px 5px; + display:block; + font:normal 11px arial, helvetica,tahoma,sans-serif; + text-decoration:none; + color:black; + text-align:right; + zoom:1; +} +.x-date-inner .x-date-active{ + cursor:pointer; + color:black; +} +.x-date-inner .x-date-selected a{ + background: #ddecfe; + border: 1px solid #a3bad9; + padding:1px 4px; +} +.x-date-inner .x-date-today a{ + border: 1px solid darkred; + padding:1px 4px; +} +.x-date-inner .x-date-selected span{ + font-weight:bold; +} +.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a { + color:#aaaaaa; +} +.x-date-bottom { + padding:4px; + border-top: 1px solid #a3bad9; + background: #c3daf9; +} + +.x-date-inner a:hover, .x-date-inner .x-date-disabled a:hover{ + text-decoration:none; + color:black; + background: #ddecfe; +} + +.x-date-inner .x-date-disabled a { + cursor:default; + background:#eeeeee; + color:#bbbbbb; +} +.x-date-mmenu{ + background:#eeeeee !important; +} +.x-date-mmenu .x-menu-item { + font-size:10px; + padding:1px 24px 1px 4px; + white-space: nowrap; + color:#000; +} +.x-date-mmenu .x-menu-item .x-menu-item-icon { + width:10px;height:10px;margin-right:5px; + background-position:center -4px !important; +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/dd.css b/www/extras/yui-ext/resources/css/dd.css new file mode 100644 index 000000000..a93209c7a --- /dev/null +++ b/www/extras/yui-ext/resources/css/dd.css @@ -0,0 +1,61 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.x-dd-drag-proxy{ + position:absolute; + left:0;top:0; + visibility:hidden; + z-index:15000; +} +.x-dd-drag-ghost{ + color: black; + font: normal 11px arial, helvetica, sans-serif; + -moz-opacity: 0.85; + opacity:.85; + filter: alpha(opacity=85); + border-top:1px solid #dddddd; + border-left:1px solid #dddddd; + border-right:1px solid #bbbbbb; + border-bottom:1px solid #bbbbbb; + padding:3px; + padding-left:20px; + background-color:white; + white-space:nowrap; +} +.x-dd-drag-repair .x-dd-drag-ghost{ + -moz-opacity: 0.4; + opacity:.4; + filter: alpha(opacity=40); + border:0 none; + padding:0; + background-color:transparent; +} +.x-dd-drag-repair .x-dd-drop-icon{ + visibility:hidden; +} +.x-dd-drop-icon{ + position:absolute; + top:3px; + left:3px; + display:block; + width:16px; + height:16px; + background-color:transparent; + background-position: center; + background-repeat: no-repeat; + z-index:1; +} +.x-dd-drop-nodrop .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-no.gif); +} +.x-dd-drop-ok .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-yes.gif); +} +.x-dd-drop-ok-add .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-add.gif); +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/debug.css b/www/extras/yui-ext/resources/css/debug.css new file mode 100644 index 000000000..6500b7245 --- /dev/null +++ b/www/extras/yui-ext/resources/css/debug.css @@ -0,0 +1,55 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +#x-debug-browser .x-tree .x-tree-node a span { + color:#222297; + font-size:12px; + padding-top:2px; + font-family:"courier","courier new"; + line-height:18px; +} +#x-debug-browser .x-tree a i { + color:#FF4545; + font-style:normal; +} +#x-debug-browser .x-tree a em { + color:#999; +} +#x-debug-browser .x-tree .x-tree-node .x-tree-selected a span{ + background:#c3daf9; +} +#x-debug-browser pre, .x-debug-browser pre xmp { + font:normal 11px tahoma, arial, helvetica, sans-serif !important; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; +} +#x-debug-browser pre { + display:block; + padding:5px !important; + border-bottom:1px solid #eeeeee !important; +} +#x-debug-browser pre xmp { + padding:0 !important; + margin:0 !important; +} +#x-debug-console .x-layout-panel-center, #x-debug-inspector .x-layout-panel-center { + border-right:1px solid #98c0f4; +} +#x-debug-console textarea { + border: 0 none; + font-size:12px; + font-family:"courier","courier new"; + padding-top:4px; + padding-left:4px; +} +.x-debug-frame { + background:#eeeeee; + border:1px dashed #aaaaaa; +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/ext-all.css b/www/extras/yui-ext/resources/css/ext-all.css new file mode 100644 index 000000000..ba6105dd5 --- /dev/null +++ b/www/extras/yui-ext/resources/css/ext-all.css @@ -0,0 +1,3167 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +html,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;}img,body,html{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:'';} +.ext-el-mask { + z-index: 20000; + position: absolute; + top: 0; + left: 0; + -moz-opacity: 0.5; + opacity: .50; + filter: alpha(opacity=50); + background-color: #CCC; + width: 100%; + height: 100%; + zoom: 1; +} +.ext-el-mask-msg { + z-index: 20001; + position: absolute; + top: 0; + left: 0; + border:1px solid #6593cf; + background: #c3daf9 url(../images/default/box/tb-blue.gif) repeat-x 0 -16px; + padding:2px; +} +.ext-el-mask-msg div { + padding:5px 10px 5px 10px; + background: #eee; + border:1px solid #a3bad9; + color:#333; + font:normal 12px tahoma, arial, helvetica, sans-serif; + cursor:wait; +} + +.ext-shim { + position:absolute; + visibility:hidden; + left:0; + top:0; + overflow:hidden; +} +.ext-ie .ext-shim { + filter: alpha(opacity=0); +} + +.x-mask-loading div { + padding:5px 10px 5px 25px; + background: #eee url( '../images/default/grid/loading.gif' ) no-repeat 5px 5px; + line-height: 16px; +} + + +.x-hidden { + position:absolute; + left:-2000px; + top:-2000px; + visibility:hidden; +} + +.x-masked { + overflow: hidden !important; +} + +.x-masked select, .x-masked object, .x-masked embed { + visibility: hidden; +} + +.x-layer { + visibility: hidden; +} + +.x-unselectable, .x-unselectable * { + -moz-user-select: none; + -khtml-user-select: none; +} + +.x-repaint { + zoom: 1; + background-color: transparent; + -moz-outline: none; +} + +.x-item-disabled { + color: gray; + cursor: default; + opacity: .6; + -moz-opacity: .6; + filter: alpha(opacity=60); +} + +.x-item-disabled * { + color: gray; + cursor: default !important; +} + +.x-splitbar-proxy { + position: absolute; + visibility: hidden; + z-index: 20001; + background: #aaa; + zoom: 1; + line-height: 1px; + font-size: 1px; + overflow: hidden; +} + +.x-splitbar-h, .x-splitbar-proxy-h { + cursor: e-resize; + cursor: col-resize; +} + +.x-splitbar-v, .x-splitbar-proxy-v { + cursor: s-resize; + cursor: row-resize; +} + +.x-color-palette { + width: 150px; + height: 92px; +} + +.x-color-palette a { + border: 1px solid #fff; + float: left; + padding: 2px; + text-decoration: none; + -moz-outline: 0 none; + outline: 0 none; +} + +.x-color-palette a:hover, .x-color-palette a.x-color-palette-sel { + border: 1px solid #8BB8F3; + background: #deecfd; +} + +.x-color-palette em { + display: block; + border: 1px solid #ACA899; +} + +.x-color-palette em span { + cursor: pointer; + display: block; + height: 10px; + line-height: 10px; + width: 10px; +} + +.x-ie-shadow { + display: none; + position: absolute; + overflow: hidden; + left:0; + top:0; + background:#999; + zoom:1; +} + +.x-shadow { + display: none; + position: absolute; + overflow: hidden; + left:0; + top:0; +} + +.x-shadow * { + overflow: hidden; +} + +.x-shadow * { + padding: 0; + border: 0; + margin: 0; + clear: none; + zoom: 1; +} + + +.x-shadow .xstc, .x-shadow .xsbc { + height: 6px; + float: left; +} + + +.x-shadow .xstl, .x-shadow .xstr, .x-shadow .xsbl, .x-shadow .xsbr { + width: 6px; + height: 6px; + float: left; +} + + +.x-shadow .xsc { + width: 100%; +} + +.x-shadow .xsml, .x-shadow .xsmr { + width: 6px; + float: left; + height: 100%; +} + +.x-shadow .xsmc { + float: left; + height: 100%; + background: transparent url( ../images/default/shadow-c.png ); +} + +.x-shadow .xst, .x-shadow .xsb { + height: 6px; + overflow: hidden; + width: 100%; +} + +.x-shadow .xsml { + background: transparent url( ../images/default/shadow-lr.png ) repeat-y 0 0; +} + +.x-shadow .xsmr { + background: transparent url( ../images/default/shadow-lr.png ) repeat-y -6px 0; +} + +.x-shadow .xstl { + background: transparent url( ../images/default/shadow.png ) no-repeat 0 0; +} + +.x-shadow .xstc { + background: transparent url( ../images/default/shadow.png ) repeat-x 0 -30px; +} + +.x-shadow .xstr { + background: transparent url( ../images/default/shadow.png ) repeat-x 0 -18px; +} + +.x-shadow .xsbl { + background: transparent url( ../images/default/shadow.png ) no-repeat 0 -12px; +} + +.x-shadow .xsbc { + background: transparent url( ../images/default/shadow.png ) repeat-x 0 -36px; +} + +.x-shadow .xsbr { + background: transparent url( ../images/default/shadow.png ) repeat-x 0 -6px; +} + +.loading-indicator { + font-size: 11px; + background-image: url( '../images/default/grid/loading.gif' ); + background-repeat: no-repeat; + background-position: left; + padding-left: 20px; + line-height: 16px; + margin: 3px; +} + +.x-text-resize { + position: absolute; + left: -1000px; + top: -1000px; + visibility: hidden; + zoom: 1; +} + +.x-drag-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); +} + +.x-clear { + clear:both; + height:0; + overflow:hidden; + line-height:0; + font-size:0; +} + +.x-tabs-wrap { + border-bottom:1px solid #6593cf; + padding-top:2px; +} +.x-tabs-strip-wrap{ + width:100%; +} +.x-tabs-wrap table{ + position:relative; + top:0; left:0; +} +.x-tabs-strip td{ + padding:0; + padding-left:2px; +} +.x-tabs-strip a, .x-tabs-strip span, .x-tabs-strip em { + display:block; +} +.x-tabs-strip a { + text-decoration:none !important; + -moz-outline: none; + outline: none; + cursor:pointer; +} +.x-tabs-strip .x-tabs-text { + font:bold 11px tahoma,arial,helvetica; + color:#666; + overflow:hidden; + white-space: nowrap; + cursor:pointer; + text-overflow: ellipsis; +} +.x-tabs-strip .on .x-tabs-text { + cursor:default; + color:#083772; +} +.x-tabs-strip .disabled .x-tabs-text { + cursor:default; + color:#aaaaaa; +} +.x-tabs-strip .x-tabs-inner { + padding:4px 10px; +} + +.x-tabs-strip .on .x-tabs-right { + background: url(../images/default/tabs/tab-sprite.gif) no-repeat right 0; +} +.x-tabs-strip .on .x-tabs-left { + background: url(../images/default/tabs/tab-sprite.gif) no-repeat 0 -100px; +} +.x-tabs-strip .x-tabs-right { + background: url(../images/default/tabs/tab-sprite.gif) no-repeat right -50px; +} +.x-tabs-strip .x-tabs-left { + background: url(../images/default/tabs/tab-sprite.gif) no-repeat 0 -150px; +} + +.x-tabs-strip a { + position:relative; + top:1px; left:0; +} +.x-tabs-strip .on a { + position:relative; +} +.x-tabs-strip .on .x-tabs-inner { + padding-bottom:5px; +} + +.x-tabs-strip .x-tabs-closable .x-tabs-inner{ + padding-right:22px; + position:relative; +} +.x-tabs-strip .x-tabs-closable .close-icon{ + line-height: 1px; + font-size:1px; + background-image:url(../images/default/layout/tab-close.gif); + display:block; + position:absolute; + right:5px;top:4px; + width:11px;height:11px; + cursor:pointer; +} +.x-tabs-strip .on .close-icon{ + background-image:url(../images/default/layout/tab-close-on.gif); +} +.x-tabs-strip .x-tabs-closable .close-over{ + background-image:url(../images/default/layout/tab-close-on.gif); +} +.x-tabs-body { + border:1px solid #6593cf; + border-top:0 none; +} +.x-tabs-bottom .x-tabs-wrap { + border-top:1px solid #6593cf; + border-bottom:0 none; + padding-top:0; + padding-bottom:2px; +} +.x-tabs-bottom .x-tabs-strip .x-tabs-right { + background: url(../images/default/tabs/tab-btm-inactive-right-bg.gif) no-repeat bottom left; +} +.x-tabs-bottom .x-tabs-strip .x-tabs-left { + background: url(../images/default/tabs/tab-btm-inactive-left-bg.gif) no-repeat bottom right; +} +.x-tabs-bottom .x-tabs-strip .on .x-tabs-right { + background: url(../images/default/tabs/tab-btm-right-bg.gif) no-repeat bottom left; +} +.x-tabs-bottom .x-tabs-strip .on .x-tabs-left { + background: url(../images/default/tabs/tab-btm-left-bg.gif) no-repeat bottom right; +} +.x-tabs-bottom .x-tabs-strip a { + position:relative; + top:0; left:0; +} +.x-tabs-bottom .x-tabs-strip .on a { + margin-top:-1px; +} +.x-tabs-bottom .x-tabs-strip .on .x-tabs-inner { + padding-top:5px; +} + +.x-tabs-bottom .x-tabs-body { + border:1px solid #6593cf; + border-bottom:0 none; +} + + + +.x-form-field{ + margin: 0 0 0 0; + font:normal 12px tahoma, arial, helvetica, sans-serif; +} + + +.x-form-text, textarea.x-form-field{ + padding: 1px 3px; + background:#fff url(../images/default/form/text-bg.gif) repeat-x 0 0; + border: 1px solid #B5B8C8; +} +.x-form-text { + height:22px; + line-height:18px; + vertical-align:middle; +} +.ext-ie .x-form-text { + margin-top:-1px; + margin-bottom:-1px; + height:22px; + line-height:18px; +} +.ext-strict .x-form-text { + height:18px; +} +.ext-safari .x-form-text { + height:20px; +} +.ext-gecko .x-form-text { + padding-top:2px; + padding-bottom:0; +} + + +.x-form-select-one { + height:20px; + line-height:18px; + vertical-align:middle; + background-color:#fff; + border: 1px solid #B5B8C8; +} + + + + + + + + + + + + + + + + +.x-form-field-wrap { + position:relative; + zoom:1; + white-space: nowrap; +} + +.x-editor .x-form-check-wrap { + background:#fff; +} +.x-form-field-wrap .x-form-trigger{ + width:17px; + height:21px; + border:0; + background:transparent url(../images/default/form/trigger.gif) no-repeat 0 0; + cursor:pointer; + border-bottom: 1px solid #B5B8C8; + position:absolute; + top:0; +} +.ext-safari .x-form-field-wrap .x-form-trigger{ + height:19px; +} +.x-form-field-wrap .x-form-trigger-over{ + background-position:-17px 0; +} +.x-form-field-wrap .x-form-trigger-click{ + background-position:-34px 0; +} +.x-item-disabled .x-form-trigger-over{ + background-position:0 0 !important; +} +.x-item-disabled .x-form-trigger-click{ + background-position:0 0 !important; +} +.x-form-field-wrap .x-form-date-trigger{ + background:transparent url(../images/default/form/date-trigger.gif) no-repeat 0 0; + cursor:pointer; +} +.ext-safari .x-form-field-wrap .x-form-date-trigger{ + right:0; +} + + +.x-form-focus{ + border: 1px solid #7eadd9; +} + + +.x-form-invalid, textarea.x-form-invalid{ + background:#fff url(../images/default/grid/invalid_line.gif) repeat-x bottom; + border: 1px solid #dd7870; +} +.ext-safari .x-form-invalid{ + background-color:#ffeeee; + border: 1px solid #ff7870; +} + + + +.x-editor { + visibility:hidden; + padding:0; + margin:0; +} +.x-form-check-wrap { + line-height:18px; +} +.ext-ie .x-form-check-wrap input { + width:15px; + height:15px; +} +.x-editor .x-form-check-wrap { + padding:3px; +} +.x-editor .x-form-checkbox { + height:13px; + border: 0 none; +} + +.x-form-grow-sizer { + font:normal 12px tahoma, arial, helvetica, sans-serif; + left: -10000px; + padding: 8px 3px; + position: absolute; + visibility:hidden; + top: -10000px; + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; + zoom:1; +} + + + +.x-form-item { + font:normal 12px tahoma, arial, helvetica, sans-serif; + display:block; + margin-bottom:4px; +} + +.x-form-item label { + display:block; + float:left; + width:100px; + padding:3px; + padding-left:0; + clear:left; +} + +.x-form-element { + padding-left:105px; + position:relative; +} + +.x-form-invalid-msg { + color:#ee0000; + padding:2px; + padding-left:18px; + font:normal 11px tahoma, arial, helvetica, sans-serif; + background: transparent url(../images/default/shared/warning.gif) no-repeat 0 2px; + line-height:16px; + width:200px; +} + +.x-form-label-right label { + text-align:right; +} + +.x-form-label-top .x-form-item label { + width:auto; + float:none; + clear:none; + display:inline; + margin-bottom:4px; +} +.x-form-label-top .x-form-element { + padding-left:0; + padding-top:4px; +} +.x-form-label-top .x-form-item { + padding-bottom:4px; +} +.x-form fieldset { + border:1px solid #B5B8C8; + padding:10px 10px 5px 10px; + margin-bottom:10px; +} +.x-form fieldset legend { + font:bold 11px tahoma, arial, helvetica, sans-serif; + color:#15428b; +} +.ext-ie .x-form fieldset legend { + margin-bottom:10px; +} +.ext-ie .x-form fieldset { + padding-top: 0; +} +.x-form-empty-field { + color:gray; +} + +.x-small-editor .x-form-field { + font:normal 11px arial, tahoma, helvetica, sans-serif; +} +.x-small-editor .x-form-text { + height:20px; + line-height:16px; + vertical-align:middle; +} +.ext-ie .x-small-editor .x-form-text { + margin-top:-1px !important; + margin-bottom:-1px !important; + height:20px !important; + line-height:16px !important; +} +.ext-strict .x-small-editor .x-form-text { + height:16px !important; +} +.ext-safari .x-small-editor .x-form-field { + + font:normal 12px arial, tahoma, helvetica, sans-serif; +} +.ext-ie .x-small-editor .x-form-text { + height:20px; + line-height:16px; +} +.ext-border-box .x-small-editor .x-form-text { + height:20px; +} + +.x-small-editor .x-form-select-one { + height:20px; + line-height:16px; + vertical-align:middle; +} +.x-small-editor .x-form-num-field { + text-align:right; +} +.x-small-editor .x-form-field-wrap .x-form-trigger{ + height:19px; +} + + +.x-form-clear { + clear:both; + height:0; + overflow:hidden; + line-height:0; + font-size:0; +} +.x-form-clear-left { + clear:left; + height:0; + overflow:hidden; + line-height:0; + font-size:0; +} + +.x-form-cb-label { + width:'auto' !important; + float:none !important; + clear:none !important; + display:inline !important; + margin-left:4px; +} + +.x-form-column { + float:left; + padding:0; + margin:0; + width:48%; + overflow:hidden; + zoom:1; +} + + +.x-form .x-form-btns-ct .x-btn{ + float:right; + clear:none; +} +.x-form .x-form-btns-ct .x-form-btns td { + border:0; + padding:0; +} +.x-form .x-form-btns-ct .x-form-btns-right table{ + float:right; + clear:none; +} +.x-form .x-form-btns-ct .x-form-btns-left table{ + float:left; + clear:none; +} +.x-form .x-form-btns-ct .x-form-btns-center{ + text-align:center; +} +.x-form .x-form-btns-ct .x-form-btns-center table{ + margin:0 auto; +} +.x-form .x-form-btns-ct table td.x-form-btn-td{ + padding:3px; +} + +.x-form .x-form-btns-ct .x-btn-focus .x-btn-left{ + background-position:0 -147px; +} +.x-form .x-form-btns-ct .x-btn-focus .x-btn-right{ + background-position:0 -168px; +} +.x-form .x-form-btns-ct .x-btn-focus .x-btn-center{ + background-position:0 -189px; +} + +.x-form .x-form-btns-ct .x-btn-click .x-btn-center{ + background-position:0 -126px; +} +.x-form .x-form-btns-ct .x-btn-click .x-btn-right{ + background-position:0 -84px; +} +.x-form .x-form-btns-ct .x-btn-click .x-btn-left{ + background-position:0 -63px; +} +.x-form-invalid-icon { + width:16px; + height:18px; + visibility:hidden; + position:absolute; + left:0; + top:0; + display:block; + background:transparent url(../images/default/form/exclamation.gif) no-repeat 0 2px; +} +.x-btn{ + font:normal 11px tahoma, verdana, helvetica; + cursor:pointer; + white-space: nowrap; +} +.x-btn button{ + border:0 none; + background:transparent; + font:normal 11px tahoma,verdana,helvetica; + padding-left:3px; + padding-right:3px; + cursor:pointer; + margin:0; + overflow:visible; + width:auto; + -moz-outline:0 none; + outline:0 none; +} +* html .ext-ie .x-btn button { + width:1px; +} +.ext-gecko .x-btn button { + padding-left:0; + padding-right:0; +} +.ext-ie .x-btn button { + padding-top:2px; +} + + +.x-btn-icon .x-btn-center .x-btn-text{ + background-position: center; + background-repeat: no-repeat; + height: 16px; + width: 16px; + cursor:pointer; + white-space: nowrap; + padding:0; +} +.x-btn-icon .x-btn-center{ + padding:1px; +} +.x-btn em { + font-style:normal; + font-weight:normal; +} + + +.x-btn-text-icon .x-btn-center .x-btn-text{ + background-position: 0 2px; + background-repeat: no-repeat; + padding-left:18px; + padding-top:3px; + padding-bottom:3px; + padding-right:0; +} + +.x-btn-left, .x-btn-right{ + font-size:1px; + line-height:1px; +} +.x-btn-left{ + width:3px; + height:21px; + background:url(../images/default/basic-dialog/btn-sprite.gif) no-repeat 0 0; +} +.x-btn-right{ + width:3px; + height:21px; + background:url(../images/default/basic-dialog/btn-sprite.gif) no-repeat 0 -21px; +} +.x-btn-left i, .x-btn-right i{ + display:block; + width:3px; + overflow:hidden; + font-size:1px; + line-height:1px; +} +.x-btn-center{ + background:url(../images/default/basic-dialog/btn-sprite.gif) repeat-x 0 -42px; + vertical-align: middle; + text-align:center; + padding:0 5px; + cursor:pointer; + white-space:nowrap; +} +.x-btn-over .x-btn-left{ + background-position:0 -63px; +} +.x-btn-over .x-btn-right{ + background-position:0 -84px; +} +.x-btn-over .x-btn-center{ + background-position:0 -105px; +} +.x-btn-click .x-btn-center, .x-btn-menu-active .x-btn-center{ + background-position:0 -126px; +} +.x-btn-disabled *{ + color:gray !important; + cursor:default !important; +} +.x-btn-menu-text-wrap .x-btn-center { + padding:0 3px; +} +.ext-gecko .x-btn-menu-text-wrap .x-btn-center { + padding:0 1px; +} +.x-btn-menu-arrow-wrap .x-btn-center { + padding:0; +} +.x-btn-menu-arrow-wrap .x-btn-center button { + width:12px !important; + height:21px; + padding:0 !important; + display:block; + background:transparent url(../images/default/basic-dialog/btn-arrow.gif) no-repeat left 3px; +} +.x-btn-with-menu .x-btn-center { + padding-right:2px !important; +} +.x-btn-with-menu .x-btn-center em { + display:block; + background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat right 0; + padding-right:10px; +} + +.x-btn-text-icon .x-btn-with-menu .x-btn-center em { + display:block; + background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat right 3px; + padding-right:10px; +} +.x-toolbar{ + border: 1px solid; + border-color:#eaf0f7 #eaf0f7 #a9bfd3 #eaf0f7; + display: block; + padding:2px; + background:#d0def0 url(../images/default/layout/panel-title-light-bg.gif) repeat-x; +} +.x-toolbar td { + vertical-align:middle; +} +.mso .x-toolbar, .x-grid-mso .x-toolbar{ + border: 0 none; + background: url(../images/default/grid/mso-hd.gif); +} +.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{ + white-space: nowrap; + font:normal 11px tahoma, arial, helvetica, sans-serif; +} +.x-toolbar .x-item-disabled { + color:gray; + cursor:default; + opacity:.6; + -moz-opacity:.6; + filter:alpha(opacity=60); +} +.x-toolbar .x-item-disabled * { + color:gray; + cursor:default; +} +.x-toolbar .x-btn-left{ + background:none; +} +.x-toolbar .x-btn-right{ + background:none; +} +.x-toolbar .x-btn-center{ + background:none; + padding:0 0; +} +.x-toolbar .x-btn-menu-text-wrap .x-btn-center button{ + padding-right:2px; +} +.ext-gecko .x-toolbar .x-btn-menu-text-wrap .x-btn-center button{ + padding-right:0; +} +.x-toolbar .x-btn-menu-arrow-wrap .x-btn-center button{ + padding:0 2px; +} +.x-toolbar .x-btn-menu-arrow-wrap .x-btn-center button { + width:12px; + background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat 0 3px; +} +.x-toolbar .x-btn-text-icon .x-btn-menu-arrow-wrap .x-btn-center button { + width:12px; + background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat 0 3px; +} +.x-toolbar .x-btn-over .x-btn-menu-arrow-wrap .x-btn-center button { + background-position: 0 -47px; +} +.x-toolbar .x-btn-over .x-btn-left{ + background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 0; +} +.x-toolbar .x-btn-over .x-btn-right{ + background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -21px; +} +.x-toolbar .x-btn-over .x-btn-center{ + background:url(../images/default/toolbar/tb-btn-sprite.gif) repeat-x 0 -42px; +} + +.x-toolbar .x-btn-click .x-btn-left, .x-toolbar .x-btn-pressed .x-btn-left, .x-toolbar .x-btn-menu-active .x-btn-left{ + background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -63px; +} +.x-toolbar .x-btn-click .x-btn-right, .x-toolbar .x-btn-pressed .x-btn-right, .x-toolbar .x-btn-menu-active .x-btn-right{ + background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -84px; +} +.x-toolbar .x-btn-click .x-btn-center, .x-toolbar .x-btn-pressed .x-btn-center, .x-toolbar .x-btn-menu-active .x-btn-center{ + background:url(../images/default/toolbar/tb-btn-sprite.gif) repeat-x 0 -105px; +} + +.x-toolbar .ytb-text{ + padding:2px; +} +.x-toolbar .ytb-sep { + background-image: url(../images/default/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: 0 2px 0; + border:0; +} +.x-toolbar .ytb-spacer { + width:2px; +} +.mso .x-toolbar .ytb-sep, .x-grid-mso .x-toolbar .ytb-sep{ + background-image: url(../images/default/grid/grid-blue-split.gif); +} + + +.ext-ie .x-toolbar .x-form-field-wrap { + padding-bottom:1px; +} +.ext-ie .x-toolbar .x-form-field-wrap .x-form-trigger { + top:1px; +} + + + +.x-grid-page-number{ + width:24px; + height:14px; +} +.x-grid-page-first .x-btn-text{ + background-image: url(../images/default/grid/page-first.gif); +} +.x-grid-loading .x-btn-text{ + background-image: url(../images/default/grid/done.gif); +} +.x-grid-page-last .x-btn-text{ + background-image: url(../images/default/grid/page-last.gif); +} +.x-grid-page-next .x-btn-text{ + background-image: url(../images/default/grid/page-next.gif); +} +.x-grid-page-prev .x-btn-text{ + background-image: url(../images/default/grid/page-prev.gif); +} +.x-item-disabled .x-grid-loading .x-btn-text{ + background-image: url(../images/default/grid/loading.gif); +} +.x-item-disabled .x-grid-page-first .x-btn-text{ + background-image: url(../images/default/grid/page-first-disabled.gif); +} +.x-item-disabled .x-grid-page-last .x-btn-text{ + background-image: url(../images/default/grid/page-last-disabled.gif); +} +.x-item-disabled .x-grid-page-next .x-btn-text{ + background-image: url(../images/default/grid/page-next-disabled.gif); +} +.x-item-disabled .x-grid-page-prev .x-btn-text{ + background-image: url(../images/default/grid/page-prev-disabled.gif); +} +.x-paging-info { + position:absolute; + top:8px; + right: 8px; + color:#15428b; +} + +.x-resizable-handle { + position:absolute; + z-index:100; + + font-size:1px; + line-height:6px; + overflow:hidden; + background:white; + filter:alpha(opacity=0); + opacity:0; + zoom:1; +} +.x-resizable-handle-east{ + width:6px; + cursor:e-resize; + right:0; + top:0; + height:100%; +} +.ext-ie .x-resizable-handle-east { + margin-right:-1px; +} +.x-resizable-handle-south{ + width:100%; + cursor:s-resize; + left:0; + bottom:0; + height:6px; +} +.ext-ie .x-resizable-handle-south { + margin-bottom:-1px; +} +.x-resizable-handle-west{ + width:6px; + cursor:w-resize; + left:0; + top:0; + height:100%; +} +.x-resizable-handle-north{ + width:100%; + cursor:n-resize; + left:0; + top:0; + height:6px; +} +.x-resizable-handle-southeast{ + width:6px; + cursor:se-resize; + right:0; + bottom:0; + height:6px; + z-index:101; +} +.x-resizable-handle-northwest{ + width:6px; + cursor:nw-resize; + left:0; + top:0; + height:6px; + z-index:101; +} +.x-resizable-handle-northeast{ + width:6px; + cursor:ne-resize; + right:0; + top:0; + height:6px; + z-index:101; +} +.x-resizable-handle-southwest{ + width:6px; + cursor:sw-resize; + left:0; + bottom:0; + height:6px; + z-index:101; +} +.x-resizable-over .x-resizable-handle, .x-resizable-pinned .x-resizable-handle{ + filter:alpha(opacity=100); + opacity:1; +} +.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east{ + background:url(../images/default/sizer/e-handle.gif); + background-position: left; +} +.x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west{ + background:url(../images/default/sizer/e-handle.gif); + background-position: left; +} +.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south{ + background:url(../images/default/sizer/s-handle.gif); + background-position: top; +} +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north{ + background:url(../images/default/sizer/s-handle.gif); + background-position: top; +} +.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ + background:url(../images/default/sizer/se-handle.gif); + background-position: top left; +} +.x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{ + background:url(../images/default/sizer/nw-handle.gif); + background-position:bottom right; +} +.x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{ + background:url(../images/default/sizer/ne-handle.gif); + background-position: bottom left; +} +.x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{ + background:url(../images/default/sizer/sw-handle.gif); + background-position: top right; +} +.x-resizable-proxy{ + border: 1px dashed #6593cf; + position:absolute; + overflow:hidden; + display:none; + left:0;top:0; + z-index:50000; +} +.x-resizable-overlay{ + width:100%; + height:100%; + display:none; + position:absolute; + left:0; + top:0; + background:white; + z-index:200000; + -moz-opacity: 0; + opacity:0; + filter: alpha(opacity=0); +} + + +.x-grid { + position:relative; + overflow:hidden; + background-color:#fff; +} +.x-grid-scroller { + overflow:auto; +} +.x-grid-viewport, .x-grid-locked{ + position:absolute; + left:0; top: 0; + z-index:2; + overflow:hidden; + visibility:hidden; +} +.x-grid-cell-inner, .x-grid-hd-inner{ + overflow:hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} +.x-grid-hd-row td, .x-grid-row td{ + font:normal 11px arial, tahoma, helvetica, sans-serif; + line-height:13px; + white-space: nowrap; + vertical-align: top; + -moz-outline: none; + -moz-user-focus: normal; +} +.x-grid-hd-row td { + line-height:14px; +} +.x-grid-col { + border-right: 1px solid #ebebeb; + border-bottom: 1px solid #ebebeb; +} + + +.x-grid-locked .x-grid-body td { + background-color: #FBFDFF; + border-right: 1px solid #deecfd; + border-bottom: 1px solid #deecfd !important; +} +.x-grid-locked .x-grid-body td .x-grid-cell-inner { + border-top:0 none; +} +.x-grid-locked .x-grid-row-alt td{ + background-color: #F5FAFE; +} + +.x-grid-locked .x-grid-header table{ + border-right:1px solid transparent; +} +.x-grid-locked .x-grid-body table{ + border-right:1px solid #c3daf9; +} + +.x-grid-locked .x-grid-body td .x-grid-cell-inner { + +} +.x-grid-row { + cursor: default; +} +.x-grid-row-alt{ + background-color:#f1f1f1; +} +.x-grid-row-over td{ + background-color:#d9e8fb; +} +.x-grid-resize-proxy { + width:3px; + background-color:#cccccc; + cursor: e-resize; + cursor: col-resize; + position:absolute; + top:0; + height:100px; + overflow:hidden; + visibility:hidden; + border:0 none; + z-index:7; +} +.x-grid-focus { + position:absolute; + top:0; + -moz-outline:0 none; + outline:0 none; + -moz-user-select: normal; + -khtml-user-select: normal; +} + + +.x-grid-header{ + background: #ebeadb url(../images/default/grid/grid-hrow.gif) repeat-x; + overflow:hidden; + position:relative; + cursor:default; + width:100%; +} +.x-grid-hd-row{ + height:22px; +} +.x-grid-hd { + padding-right:1px; +} +.x-grid-hd-over .x-grid-hd-inner { + border-bottom: 1px solid #c3daf9; +} +.x-grid-hd-over .x-grid-hd-text { + background: #fafafa url(../images/default/grid/grid-hrow.gif) repeat-x 0 1px; + padding-bottom:1px; + border-bottom: 1px solid #b3cae9; +} +.x-grid-sort-icon{ + background-repeat: no-repeat; + display: none; + height: 4px; + width: 13px; + margin-left:3px; + vertical-align: middle; +} +.x-grid-header .sort-asc .x-grid-sort-icon { + background-image: url(../images/default/grid/sort_asc.gif); + display: inline; +} +.x-grid-header .sort-desc .x-grid-sort-icon { + background-image: url(../images/default/grid/sort_desc.gif); + display: inline; +} + + +.x-grid-body { + overflow:hidden; + position:relative; + width:100%; + zoom:1; +} + +.x-grid-cell-text,.x-grid-hd-text { + display: block; + padding: 3px 5px 3px 5px; + -moz-user-select: none; + -khtml-user-select: none; + color:black; +} +.x-grid-hd-text { + padding-top:4px; +} +.x-grid-split { + background-image: url(../images/default/grid/grid-split.gif); + background-position: center; + background-repeat: no-repeat; + cursor: e-resize; + cursor: col-resize; + display: block; + font-size: 1px; + height: 16px; + overflow: hidden; + position: absolute; + top: 2px; + width: 6px; + z-index: 3; +} + +.x-grid-hd-text { + color:#15428b; +} + +.x-dd-drag-proxy .x-grid-hd-inner{ + background: #ebeadb url(../images/default/grid/grid-hrow.gif) repeat-x; + height:22px; + width:120px; +} + +.col-move-top, .col-move-bottom{ + width:9px; + height:9px; + position:absolute; + top:0; + line-height:1px; + font-size:1px; + overflow:hidden; + visibility:hidden; + z-index:20000; +} +.col-move-top{ + background:transparent url(../images/default/grid/col-move-top.gif) no-repeat left top; +} +.col-move-bottom{ + background:transparent url(../images/default/grid/col-move-bottom.gif) no-repeat left top; +} + + +.x-grid-row-selected td, .x-grid-locked .x-grid-row-selected td{ + background-color: #316ac5 !important; + color: white; +} +.x-grid-row-selected span, .x-grid-row-selected b, .x-grid-row-selected div, .x-grid-row-selected strong, .x-grid-row-selected i{ + color: white !important; +} +.x-grid-row-selected .x-grid-cell-text{ + color: white; +} +.x-grid-cell-selected{ + background-color: #316ac5 !important; + color: white; +} +.x-grid-cell-selected span{ + color: white !important; +} +.x-grid-cell-selected .x-grid-cell-text{ + color: white; +} + +.x-grid-locked td.x-grid-row-marker, .x-grid-locked .x-grid-row-selected td.x-grid-row-marker{ + background: #ebeadb url(../images/default/grid/grid-hrow.gif) repeat-x 0 bottom !important; + vertical-align:middle !important; + color:black; + padding:0; + border-top:1px solid white; + border-bottom:none !important; + border-right:1px solid #6fa0df !important; + text-align:center; +} +.x-grid-locked td.x-grid-row-marker div, .x-grid-locked .x-grid-row-selected td.x-grid-row-marker div{ + padding:0 4px; + color:#15428b !important; + text-align:center; +} + + +.x-grid-dirty-cell { + background: transparent url(../images/default/grid/dirty.gif) no-repeat 0 0; +} + + +.x-grid-topbar, .x-grid-bottombar{ + font:normal 11px arial, tahoma, helvetica, sans-serif; + overflow:hidden; + display:none; + zoom:1; + position:relative; +} +.x-grid-topbar .x-toolbar{ + border-right:0 none; +} +.x-grid-bottombar .x-toolbar{ + border-right:0 none; + border-bottom:0 none; + border-top:1px solid #a9bfd3; +} + +.x-props-grid .x-grid-cell-selected .x-grid-cell-text{ + background-color: #316ac5 !important; +} +.x-props-grid .x-grid-col-value .x-grid-cell-text{ + background-color: white; +} +.x-props-grid .x-grid-col-name{ + background-color: #c3daf9; +} +.x-props-grid .x-grid-col-name .x-grid-cell-text{ + background-color: white; + margin-left:10px; +} +.x-props-grid .x-grid-split-value { + visibility:hidden; +} + + +.xg-hmenu-sort-asc .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-asc.gif); +} +.xg-hmenu-sort-desc .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-desc.gif); +} +.xg-hmenu-lock .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-lock.gif); +} +.xg-hmenu-unlock .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-unlock.gif); +} + + +.x-dd-drag-ghost .x-grid-dd-wrap { + padding:1px 3px 3px 1px; +} +.x-layout-container{ + width:100%; + height:100%; + overflow:hidden; + background-color:#c3daf9; +} +.x-layout-container .x-layout-tabs-body{ + border:0 none; +} +.x-layout-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; +} +.ext-border-box .x-layout-collapsed{ + width:22px; + height:22px; +} +.x-layout-collapsed-over{ + cursor:pointer; + background-color:#d9e8fb; +} +.x-layout-collapsed-west .x-layout-collapsed-tools, .x-layout-collapsed-east .x-layout-collapsed-tools{ + position:absolute; + top:0; + left:0; + width:20px; + height:20px; +} +.x-layout-collapsed-north .x-layout-collapsed-tools, .x-layout-collapsed-south .x-layout-collapsed-tools{ + position:absolute; + top:0; + right:0; + width:20px; + height:20px; +} +.x-layout-collapsed .x-layout-tools-button{ + margin:0; +} +.x-layout-collapsed .x-layout-tools-button-inner{ + width:16px; + height:16px; +} +.x-layout-inactive-content{ + position:absolute; + left:-10000px; + top:-10000px; + visibility:hidden; +} +.x-layout-active-content{ + visibility:visible; +} +.x-layout-panel{ + position:absolute;border:1px solid #98c0f4;overflow:hidden;background-color:white; +} +.x-layout-panel-east, .x-layout-panel-west { + z-index:10; +} +.x-layout-panel-north, .x-layout-panel-south { + z-index:11; +} +.x-layout-collapsed-north, .x-layout-collapsed-south, .x-layout-collapsed-east, .x-layout-collapsed-west { + z-index:12; +} +.x-layout-panel-body{ + overflow:hidden; +} +.x-layout-grid-wrapper{ + +} +.x-layout-split{ + position:absolute; + height:5px; + width:5px; + line-height:1px; + font-size:1px; + z-index:3; + background-color:#c3daf9; +} +.x-layout-panel-hd{ + background-image: url(../images/default/layout/panel-title-light-bg.gif); + color: black; + border-bottom:1px solid #98c0f4; + position:relative; +} +.x-layout-panel-hd-text{ + font:normal 11px tahoma, verdana, helvetica; + padding: 4px; + padding-left: 4px; + display:block; + white-space:nowrap; +} +.x-layout-panel-hd-tools{ + position:absolute; + right:0; + top:0; + text-align:right; + padding-top:2px; + padding-right:2px; + width:60px; +} +.x-layout-tools-button{ + z-index:6; + padding:2px; + cursor:pointer; + float:right; +} +.x-layout-tools-button-over{ + padding:1px; + border:1px solid #98c0f4; + background-color:white; +} +.x-layout-tools-button-inner{ + height:12px; + width:12px; + line-height:1px; + font-size:1px; + background-repeat:no-repeat; + background-position:center; +} +.x-layout-close{ + background-image:url(../images/default/layout/panel-close.gif); +} +.x-layout-stick{ + background-image:url(../images/default/layout/stick.gif); +} +.x-layout-collapse-west,.x-layout-expand-east{ + background-image:url(../images/default/layout/collapse.gif); +} +.x-layout-expand-west,.x-layout-collapse-east{ + background-image:url(../images/default/layout/expand.gif); +} +.x-layout-collapse-north,.x-layout-expand-south{ + background-image:url(../images/default/layout/ns-collapse.gif); +} +.x-layout-expand-north,.x-layout-collapse-south{ + background-image:url(../images/default/layout/ns-expand.gif); +} +.x-layout-split-h{ + background-image:url(../images/default/sizer/e-handle.gif); + background-position: left; +} +.x-layout-split-v{ + background-image:url(../images/default/sizer/s-handle.gif); + background-position: top; +} +.x-layout-panel .x-tabs-wrap{ + background:url(../images/default/layout/gradient-bg.gif); +} +.x-layout-panel .x-tabs-body { + background-color:white; + overflow:auto;height:100%; +} +.x-layout-component-panel, .x-layout-nested-layout { + position:relative; + padding:0; + overflow:hidden; + width:200px; + height:200px; +} +.x-layout-nested-layout .x-layout-panel { + border:0 none; +} +.x-layout-nested-layout .x-layout-panel-north { + border-bottom:1px solid #98c0f4; +} +.x-layout-nested-layout .x-layout-panel-south { + border-top:1px solid #98c0f4; +} +.x-layout-nested-layout .x-layout-panel-east { + border-left:1px solid #98c0f4; +} +.x-layout-nested-layout .x-layout-panel-west { + border-right:1px solid #98c0f4; +} + +.x-layout-panel-dragover { + border: 2px solid #6593cf; +} +.x-layout-panel-proxy { + background-image: url(../images/default/layout/gradient-bg.gif); + background-color:#c3daf9; + border:1px dashed #6593cf; + z-index:10001; + overflow:hidden; + position:absolute; + left:0;top:0; +} +.x-layout-slider { + z-index:15; + overflow:hidden; + position:absolute; +} + +.x-scroller-up, .x-scroller-down { + background-color:#c3daf9; + border: 1px solid #6593cf; + border-top-color: #fff; + border-left-color: #fff; + border-right:0 none; + cursor:pointer; + overflow:hidden; + line-height:16px; +} +.x-scroller-down { + border-bottom: 0 none; + border-top: 1px solid #6593cf; +} +.x-scroller-btn-over { + background-color: #d9e8f8; +} +.x-scroller-btn-click { + background-color: #AECEF7; +} +.x-scroller-btn-disabled { + cursor:default; + background-color: #c3daf9; + -moz-opacity: 0.3; + opacity:.30; + filter: alpha(opacity=30); +} + + + +.x-reader .x-layout-panel-north { + border:0 none; +} +.x-reader .x-layout-panel-center{ + border:0 none; +} +.x-reader .x-layout-nested-layout .x-layout-panel-center{ + border:1px solid #99bbe8; + border-top:0 none; +} +.x-reader .x-layout-nested-layout .x-layout-panel-south{ + border:1px solid #99bbe8; +} +.x-dlg-proxy { + background-image: url(../images/default/gradient-bg.gif); + background-color:#c3daf9; + border:1px solid #6593cf; + z-index:10001; + overflow:hidden; + position:absolute; + left:0;top:0; +} +.x-dlg-shadow{ + background:#aaaaaa; + position:absolute; + left:0;top:0; +} +.x-dlg-focus{ + -moz-outline:0 none; + outline:0 none; + width:0; + height:0; + overflow:hidden; + position:absolute; + top:0; + left:0; +} +.x-dlg-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.x-body-masked select { + visibility:hidden; +} +body.x-body-masked .x-dlg select { + visibility:visible; +} +.x-dlg{ + z-index:10001; + overflow:hidden; + position:absolute; + left:300;top:0; +} +.x-dlg .x-dlg-hd { + background: url(../images/default/basic-dialog/hd-sprite.gif) repeat-x 0 -82px; + background-color:navy; + color:#FFF; + font:bold 12px "sans serif", tahoma, verdana, helvetica; + overflow:hidden; + padding:5px; + white-space: nowrap; +} +.x-dlg .x-dlg-hd-left { + background: url(../images/default/basic-dialog/hd-sprite.gif) no-repeat 0 -41px; + padding-left:3px; + margin:0; +} +.x-dlg .x-dlg-hd-right { + background: url(../images/default/basic-dialog/hd-sprite.gif) no-repeat right 0; + padding-right:3px; +} +.x-dlg .x-dlg-dlg-body{ + background:url(../images/default/layout/gradient-bg.gif); + border:1px solid #6593cf; + border-top:0 none; + padding:10px; + position:absolute; + top:24px;left:0; + z-index:1; + overflow:hidden; +} +.x-dlg-collapsed .x-resizable-handle{ + display:none; +} +.x-dlg .x-dlg-bd{ + overflow:hidden; +} +.x-dlg .x-dlg-ft{ + overflow:hidden; + padding:5px; + padding-bottom:0; +} + +.x-dlg .x-tabs-body{ + background:white; + overflow:auto; +} +.x-dlg .x-tabs-top .x-tabs-body{ + border:1px solid #6593cf; + border-top:0 none; +} +.x-dlg .x-tabs-bottom .x-tabs-body{ + border:1px solid #6593cf; + border-bottom:0 none; +} +.x-dlg .x-layout-container .x-tabs-body{ + border:0 none; +} +.x-dlg .inner-tab{ + margin:5px; +} +.x-dlg .x-dlg-ft .x-btn{ + margin-right:5px; + float:right; + clear:none; +} +.x-dlg .x-dlg-ft .x-dlg-btns td { + border:0; + padding:0; +} +.x-dlg .x-dlg-ft .x-dlg-btns-right table{ + float:right; + clear:none; +} +.x-dlg .x-dlg-ft .x-dlg-btns-left table{ + float:left; + clear:none; +} +.x-dlg .x-dlg-ft .x-dlg-btns-center{ + text-align:center; +} +.x-dlg .x-dlg-ft .x-dlg-btns-center table{ + margin:0 auto; +} + + +.x-dlg .x-dlg-ft .x-dlg-btns .x-btn-focus .x-btn-left{ + background-position:0 -147px; +} +.x-dlg .x-dlg-ft .x-dlg-btns .x-btn-focus .x-btn-right{ + background-position:0 -168px; +} +.x-dlg .x-dlg-ft .x-dlg-btns .x-btn-focus .x-btn-center{ + background-position:0 -189px; +} + +.x-dlg .x-dlg-ft .x-dlg-btns .x-btn-click .x-btn-center{ + background-position:0 -126px; +} +.x-dlg .x-dlg-ft .x-dlg-btns .x-btn-click .x-btn-right{ + background-position:0 -84px; +} +.x-dlg .x-dlg-ft .x-dlg-btns .x-btn-click .x-btn-left{ + background-position:0 -63px; +} + +.x-dlg-draggable .x-dlg-hd{ + cursor:move; +} +.x-dlg-closable .x-dlg-hd{ + padding-right:22px; +} +.x-dlg-toolbox { + position:absolute; + top:4px; + right:4px; + z-index:6; + width:40px; + cursor:default; + height:15px; + background:transparent; +} +.x-dlg .x-dlg-close, .x-dlg .x-dlg-collapse { + float:right; + height:15px; + width:15px; + margin:0; + margin-left:2px; + padding:0; + line-height:1px; + font-size:1px; + background-repeat:no-repeat; + cursor:pointer; + visibility:inherit; +} +.x-dlg .x-dlg-close { + background-image:url(../images/default/basic-dialog/close.gif); +} +.x-dlg .x-dlg-collapse { + background-image:url(../images/default/basic-dialog/collapse.gif); +} +.x-dlg-collapsed .x-dlg-collapse { + background-image:url(../images/default/basic-dialog/expand.gif); +} +.x-dlg .x-dlg-close-over, .x-dlg .x-dlg-collapse-over { + +} +.x-dlg div.x-resizable-handle-east{ + background-image:url(../images/default/basic-dialog/e-handle.gif); + border:0; + background-position:right; + margin-right:0; +} +.x-dlg div.x-resizable-handle-south{ + background-image:url(../images/default/sizer/s-handle-dark.gif); + border:0; + height:6px; +} +.x-dlg div.x-resizable-handle-west{ + background-image:url(../images/default/basic-dialog/e-handle.gif); + border:0; + background-position:1px; +} +.x-dlg div.x-resizable-handle-north{ + background-image:url(../images/default/s.gif); + border:0; +} +.x-dlg div.x-resizable-handle-northeast, .ytheme-gray .x-dlg div.x-resizable-handle-northeast{ + background-image:url(../images/default/s.gif); + border:0; +} +.x-dlg div.x-resizable-handle-northwest, .ytheme-gray .x-dlg div.x-resizable-handle-northwest{ + background-image:url(../images/default/s.gif); + border:0; +} +.x-dlg div.x-resizable-handle-southeast{ + background-image:url(../images/default/basic-dialog/se-handle.gif); + background-position: bottom right; + width:8px; + height:8px; + border:0; +} +.x-dlg div.x-resizable-handle-southwest{ + background-image:url(../images/default/sizer/sw-handle-dark.gif); + background-position: top right; + margin-left:1px; + margin-bottom:1px; + border:0; +} + +#x-msg-box .x-dlg-ft .x-btn{ + float:none; + clear:none; + margin:0 3px; +} + +#x-msg-box .x-dlg-bd { + padding:5px; + overflow:hidden !important; + font:normal 13px verdana,tahoma,sans-serif; +} +#x-msg-box .ext-mb-input { + margin-top:4px; + width:95%; +} +#x-msg-box .ext-mb-textarea { + margin-top:4px; + font:normal 13px verdana,tahoma,sans-serif; +} +#x-msg-box .ext-mb-progress-wrap { + margin-top:4px; + border:1px solid #6593cf; +} +#x-msg-box .ext-mb-progress { + height:18px; + background: #e0e8f3 url(../images/default/qtip/bg.gif) repeat-x; +} +#x-msg-box .ext-mb-progress-bar { + height:18px; + overflow:hidden; + width:0; + background:#8BB8F3; + border-top:1px solid #B2D0F7; + border-bottom:1px solid #65A1EF; + border-right:1px solid #65A1EF; +} + +#x-msg-box .x-msg-box-wait { + background: transparent url(../images/default/grid/loading.gif) no-repeat left; + display:block; + width:300px; + padding-left:18px; + line-height:18px; +} +.x-dd-drag-proxy{ + position:absolute; + left:0;top:0; + visibility:hidden; + z-index:15000; +} +.x-dd-drag-ghost{ + color: black; + font: normal 11px arial, helvetica, sans-serif; + -moz-opacity: 0.85; + opacity:.85; + filter: alpha(opacity=85); + border-top:1px solid #dddddd; + border-left:1px solid #dddddd; + border-right:1px solid #bbbbbb; + border-bottom:1px solid #bbbbbb; + padding:3px; + padding-left:20px; + background-color:white; + white-space:nowrap; +} +.x-dd-drag-repair .x-dd-drag-ghost{ + -moz-opacity: 0.4; + opacity:.4; + filter: alpha(opacity=40); + border:0 none; + padding:0; + background-color:transparent; +} +.x-dd-drag-repair .x-dd-drop-icon{ + visibility:hidden; +} +.x-dd-drop-icon{ + position:absolute; + top:3px; + left:3px; + display:block; + width:16px; + height:16px; + background-color:transparent; + background-position: center; + background-repeat: no-repeat; + z-index:1; +} +.x-dd-drop-nodrop .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-no.gif); +} +.x-dd-drop-ok .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-yes.gif); +} +.x-dd-drop-ok-add .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-add.gif); +} +.x-tree-icon, .x-tree-ec-icon, .x-tree-elbow-line, .x-tree-elbow, .x-tree-elbow-end, .x-tree-elbow-plus, .x-tree-elbow-minus, .x-tree-elbow-end-plus, .x-tree-elbow-end-minus{ + border: 0 none; + height: 18px; + margin: 0; + padding: 0; + vertical-align: middle; + width: 16px; + background-repeat: no-repeat; +} +.x-tree-node-collapsed .x-tree-node-icon, .x-tree-node-expanded .x-tree-node-icon, .x-tree-node-leaf .x-tree-node-icon{ + border: 0 none; + height: 18px; + margin: 0; + padding: 0; + vertical-align: middle; + width: 16px; + background-position:center; + background-repeat: no-repeat; +} + + +.x-tree-node-collapsed .x-tree-node-icon{ + background-image:url(../images/default/tree/folder.gif); +} +.x-tree-node-expanded .x-tree-node-icon{ + background-image:url(../images/default/tree/folder-open.gif); +} +.x-tree-node-leaf .x-tree-node-icon{ + background-image:url(../images/default/tree/leaf.gif); +} + +.x-tree-noicon .x-tree-node-icon{ + width:0; height:0; +} + +.x-tree-node-loading .x-tree-node-icon{ + background-image:url(../images/default/tree/loading.gif) !important; +} +.x-tree-node-loading a span{ + font-style: italic; + color:#444444; +} + + +.x-tree-lines .x-tree-elbow{ + background-image:url(../images/default/tree/elbow.gif); +} +.x-tree-lines .x-tree-elbow-plus{ + background-image:url(../images/default/tree/elbow-plus.gif); +} +.x-tree-lines .x-tree-elbow-minus{ + background-image:url(../images/default/tree/elbow-minus.gif); +} +.x-tree-lines .x-tree-elbow-end{ + background-image:url(../images/default/tree/elbow-end.gif); +} +.x-tree-lines .x-tree-elbow-end-plus{ + background-image:url(../images/default/tree/elbow-end-plus.gif); +} +.x-tree-lines .x-tree-elbow-end-minus{ + background-image:url(../images/default/tree/elbow-end-minus.gif); +} +.x-tree-lines .x-tree-elbow-line{ + background-image:url(../images/default/tree/elbow-line.gif); +} + + +.x-tree-no-lines .x-tree-elbow{ + background:transparent; +} +.x-tree-no-lines .x-tree-elbow-plus{ + background-image:url(../images/default/tree/elbow-plus-nl.gif); +} +.x-tree-no-lines .x-tree-elbow-minus{ + background-image:url(../images/default/tree/elbow-minus-nl.gif); +} +.x-tree-no-lines .x-tree-elbow-end{ + background:transparent; +} +.x-tree-no-lines .x-tree-elbow-end-plus{ + background-image:url(../images/default/tree/elbow-end-plus-nl.gif); +} +.x-tree-no-lines .x-tree-elbow-end-minus{ + background-image:url(../images/default/tree/elbow-end-minus-nl.gif); +} +.x-tree-no-lines .x-tree-elbow-line{ + background:transparent; +} + +.x-tree-elbow-plus, .x-tree-elbow-minus, .x-tree-elbow-end-plus, .x-tree-elbow-end-minus{ + cursor:pointer; +} +.ext-ie ul.x-tree-node-ct{ + font-size:0; + line-height:0; +} +.x-tree-node{ + color: black; + font: normal 11px arial, tahoma, helvetica, sans-serif; + white-space: nowrap; +} +.x-tree-node a, .x-dd-drag-ghost a{ + text-decoration:none; + color:black; + -khtml-user-select:none; + -moz-user-select:none; + -kthml-user-focus:normal; + -moz-user-focus:normal; + -moz-outline: 0 none; + outline:0 none; +} +.x-tree-node a span, .x-dd-drag-ghost a span{ + text-decoration:none; + color:black; + padding:1px 3px 1px 2px; +} +.x-tree-node .x-tree-node-disabled a span{ + color:gray !important; +} +.x-tree-node .x-tree-node-disabled .x-tree-node-icon{ + -moz-opacity: 0.5; + opacity:.5; + filter: alpha(opacity=50); +} +.x-tree-node .x-tree-node-inline-icon{ + background:transparent; +} +.x-tree-node a:hover, .x-dd-drag-ghost a:hover{ + text-decoration:none; +} +.x-tree-node div.x-tree-drag-insert-below{ + border-bottom:1px dotted #3366cc; +} +.x-tree-node div.x-tree-drag-insert-above{ + border-top:1px dotted #3366cc; +} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below{ + border-bottom:0 none; +} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above{ + border-top:0 none; +} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a{ + border-bottom:2px solid #3366cc; +} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a{ + border-top:2px solid #3366cc; +} +.x-tree-node .x-tree-drag-append a span{ + background:#dddddd; + border:1px dotted gray; +} +.x-tree-node .x-tree-selected a span{ + background:#3366cc; + color:white; +} +.x-dd-drag-ghost .x-tree-node-indent, .x-dd-drag-ghost .x-tree-ec-icon{ + display:none !important; +} +.x-tree-drop-ok-append .x-dd-drop-icon{ + background-image: url(../images/default/tree/drop-add.gif); +} +.x-tree-drop-ok-above .x-dd-drop-icon{ + background-image: url(../images/default/tree/drop-over.gif); +} +.x-tree-drop-ok-below .x-dd-drop-icon{ + background-image: url(../images/default/tree/drop-under.gif); +} +.x-tree-drop-ok-between .x-dd-drop-icon{ + background-image: url(../images/default/tree/drop-between.gif); +} + +.x-tip{ + position: absolute; + top: 0; + left:0; + visibility: hidden; + z-index: 20000; + border:0 none; +} +.x-tip .x-tip-close{ + background-image: url(../images/default/qtip/close.gif); + height: 15px; + float:right; + width: 15px; + margin:0 0 2px 2px; + cursor:pointer; + display:none; +} +.x-tip .x-tip-top { + background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -12px; + height:6px; + overflow:hidden; +} +.x-tip .x-tip-top-left { + background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 0; + padding-left:6px; + zoom:1; +} +.x-tip .x-tip-top-right { + background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right 0; + padding-right:6px; + zoom:1; +} +.x-tip .x-tip-ft { + background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -18px; + height:6px; + overflow:hidden; +} +.x-tip .x-tip-ft-left { + background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -6px; + padding-left:6px; + zoom:1; +} +.x-tip .x-tip-ft-right { + background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right -6px; + padding-right:6px; + zoom:1; +} +.x-tip .x-tip-bd { + border:0 none; + font: normal 11px tahoma,arial,helvetica,sans-serif; +} +.x-tip .x-tip-bd-left { + background: #fff url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -24px; + padding-left:6px; + zoom:1; +} +.x-tip .x-tip-bd-right { + background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right -24px; + padding-right:6px; + zoom:1; +} + +.x-tip h3 { + font: bold 12px tahoma,arial,helvetica,sans-serif; + margin:0; + padding:2px 2px; + color:#222; +} +.x-tip .x-tip-bd-inner { + margin:0 !important; + line-height:14px; + color:#222; + padding:0; + float:left; +} + + +.x-form-invalid-tip { +} + +.x-form-invalid-tip .x-tip-top { + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-top-left { + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-top-right { + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-ft { + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-ft-left { + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-ft-right { + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-bd-left { + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-bd-right { + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-bd .x-tip-bd-inner { + padding-left:24px; + background:transparent url(../images/default/form/exclamation.gif) no-repeat 2px 2px; +} +.x-form-invalid-tip .x-tip-bd-inner { + padding:2px; +} +.x-date-picker { + border: 1px solid #1b376c; + border-top:0 none; + background:#fff; +} +.x-date-picker a { + -moz-outline:0 none; + outline:0 none; +} +.x-date-inner, .x-date-inner td, .x-date-inner th{ + border-collapse:separate; +} +.x-date-middle,.x-date-left,.x-date-right { + background: url(../images/default/basic-dialog/hd-sprite.gif) repeat-x 0 -83px; + color:#FFF; + font:bold 11px "sans serif", tahoma, verdana, helvetica; + overflow:hidden; +} + +.x-date-middle .x-btn-left,.x-date-middle .x-btn-center,.x-date-middle .x-btn-right{ + background:transparent !important; + vertical-align:middle; +} +.x-date-middle .x-btn .x-btn-text { + color:#fff; +} +.x-date-middle .x-btn-with-menu .x-btn-center em { + background:transparent url(../images/default/toolbar/btn-arrow-light.gif) no-repeat right 0; +} +.x-date-right, .x-date-left { + width:18px; +} +.x-date-right{ + text-align:right; +} +.x-date-middle { + padding-top:2px;padding-bottom:2px; +} +.x-date-right a, .x-date-left a{ + display:block; + width:16px; + height:16px; + background-position: center; + background-repeat: no-repeat; + cursor:pointer; + -moz-opacity: 0.6; + opacity:.6; + filter: alpha(opacity=60); +} +.x-date-right a:hover, .x-date-left a:hover{ + -moz-opacity: 1; + opacity:1; + filter: alpha(opacity=100); +} +.x-date-right a { + background-image: url(../images/default/shared/right-btn.gif); + margin-right:2px; +} +.x-date-left a{ + background-image: url(../images/default/shared/left-btn.gif); + margin-left:2px; +} +table.x-date-inner { + width:100%; + table-layout:fixed; +} +.x-date-inner th { + width:25px; +} +.x-date-inner th { + background: #c3daf9; + text-align:right !important; + border-bottom: 1px solid #a3bad9; + font:normal 10px arial, helvetica,tahoma,sans-serif; + color:#233d6d; + cursor:default; + padding:0; + border-collapse:separate; +} +.x-date-inner th span { + display:block; + padding:2px; + padding-right:7px; +} +.x-date-inner td { + border: 1px solid #fff; + text-align:right; + padding:0; +} +.x-date-inner a { + padding:2px 5px; + display:block; + font:normal 11px arial, helvetica,tahoma,sans-serif; + text-decoration:none; + color:black; + text-align:right; + zoom:1; +} +.x-date-inner .x-date-active{ + cursor:pointer; + color:black; +} +.x-date-inner .x-date-selected a{ + background: #ddecfe; + border: 1px solid #a3bad9; + padding:1px 4px; +} +.x-date-inner .x-date-today a{ + border: 1px solid darkred; + padding:1px 4px; +} +.x-date-inner .x-date-selected span{ + font-weight:bold; +} +.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a { + color:#aaaaaa; +} +.x-date-bottom { + padding:4px; + border-top: 1px solid #a3bad9; + background: #c3daf9; +} + +.x-date-inner a:hover, .x-date-inner .x-date-disabled a:hover{ + text-decoration:none; + color:black; + background: #ddecfe; +} + +.x-date-inner .x-date-disabled a { + cursor:default; + background:#eeeeee; + color:#bbbbbb; +} +.x-date-mmenu{ + background:#eeeeee !important; +} +.x-date-mmenu .x-menu-item { + font-size:10px; + padding:1px 24px 1px 4px; + white-space: nowrap; + color:#000; +} +.x-date-mmenu .x-menu-item .x-menu-item-icon { + width:10px;height:10px;margin-right:5px; + background-position:center -4px !important; +} +.x-menu { + border:1px solid; + border-color: #a3bad9 #8BB8F3 #8BB8F3 #a3bad9; + z-index: 15000; + background: #fff url(../images/default/menu/menu.gif) repeat-y; +} +.ext-ie .x-menu { + zoom:1; + overflow:hidden; +} +.x-menu-list{ + border:1px solid #fff; +} +.x-menu li{ + line-height:100%; +} +.x-menu li.x-menu-sep-li{ + font-size:1px; + line-height:1px; +} +.x-menu-list-item{ + font:normal 11px "Segoe UI",tahoma,"Lucida Sans Unicode",arial, sans-serif; + white-space: nowrap; + -moz-user-select: none; + -khtml-user-select: none; + display:block; + padding:1px; +} +.x-menu-item-arrow{ + background:transparent url(../images/default/menu/menu-parent.gif) no-repeat right; +} +.x-menu-sep { + display:block; + font-size:1px; + background:#c3daf9; + margin: 3px 3px 3px 32px; + height:1px; +} +.x-menu-focus { + position:absolute; + left:0; + top:-5px; + width:0; + height:0; + line-height:1px; +} +.x-menu-item { + display:block; + line-height:14px; + padding:3px 21px 3px 3px; + white-space: nowrap; + text-decoration:none; + color:#233d6d; + -moz-outline: 0 none; + outline: 0 none; + cursor:pointer; +} +.x-menu-item-active { + color:#233d6d; + background:#c3daf9; + border:1px solid #8BB8F3; + padding:0; +} +.x-menu-item-icon { + border: 0 none; + height: 16px; + padding: 0; + vertical-align: middle; + width: 16px; + margin: 0 11px 0 0; + background-position:center; +} + +.x-menu-check-item .x-menu-item-icon{ + background: transparent url(../images/default/menu/unchecked.gif) no-repeat center; +} + +.x-menu-item-checked .x-menu-item-icon{ + background-image:url(../images/default/menu/checked.gif); +} +.x-menu-group-item .x-menu-item-icon{ + background: transparent; +} + +.x-menu-item-checked .x-menu-group-item .x-menu-item-icon{ + background: transparent url(../images/default/menu/group-checked.gif) no-repeat center; +} + +.x-menu-plain { + background:#fff; +} +.x-menu-date-item{ + padding:0; +} + +.x-menu .x-color-palette, .x-menu .x-date-picker{ + margin-left:32px; + margin-right:4px; +} +.x-menu .x-date-picker{ + border:1px solid #a3bad9; + margin-top:2px; + margin-bottom:2px; +} +.x-menu-plain .x-color-palette, .x-menu-plain .x-date-picker{ + margin:0; + border:0 none; +} + + + +.x-box-tl { + background: transparent url(../images/default/box/corners.gif) no-repeat 0 0; + zoom:1; +} + +.x-box-tc { + height: 8px; + background: transparent url(../images/default/box/tb.gif) repeat-x 0 0; + overflow: hidden; +} + +.x-box-tr { + background: transparent url(../images/default/box/corners.gif) no-repeat right -8px; +} + +.x-box-ml { + background: transparent url(../images/default/box/l.gif) repeat-y 0; + padding-left: 4px; + overflow: hidden; + zoom:1; +} + +.x-box-mc { + background: #eee url(../images/default/box/tb.gif) repeat-x 0 -16px; + padding: 4px 10px; + font-family: "Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif; + color: #393939; + font-size: 12px; +} + +.x-box-mc h3 { + font-size: 14px; + font-weight: bold; + margin: 0 0 4 0; + zoom:1; +} + +.x-box-mr { + background: transparent url(../images/default/box/r.gif) repeat-y right; + padding-right: 4px; + overflow: hidden; +} + +.x-box-bl { + background: transparent url(../images/default/box/corners.gif) no-repeat 0 -16px; + zoom:1; +} + +.x-box-bc { + background: transparent url(../images/default/box/tb.gif) repeat-x 0 -8px; + height: 8px; + overflow: hidden; +} + +.x-box-br { + background: transparent url(../images/default/box/corners.gif) no-repeat right -24px; +} + +.x-box-tl, .x-box-bl { + padding-left: 8px; + overflow: hidden; +} + +.x-box-tr, .x-box-br { + padding-right: 8px; + overflow: hidden; +} + +.x-box-blue .x-box-bl, .x-box-blue .x-box-br, .x-box-blue .x-box-tl, .x-box-blue .x-box-tr { + background-image: url(../images/default/box/corners-blue.gif); +} + +.x-box-blue .x-box-bc, .x-box-blue .x-box-mc, .x-box-blue .x-box-tc { + background-image: url(../images/default/box/tb-blue.gif); +} + +.x-box-blue .x-box-mc { + background-color: #c3daf9; +} + +.x-box-blue .x-box-mc h3 { + color: #17385b; +} + +.x-box-blue .x-box-ml { + background-image: url(../images/default/box/l-blue.gif); +} + +.x-box-blue .x-box-mr { + background-image: url(../images/default/box/r-blue.gif); +} +#x-debug-browser .x-tree .x-tree-node a span { + color:#222297; + font-size:12px; + padding-top:2px; + font-family:"courier","courier new"; + line-height:18px; +} +#x-debug-browser .x-tree a i { + color:#FF4545; + font-style:normal; +} +#x-debug-browser .x-tree a em { + color:#999; +} +#x-debug-browser .x-tree .x-tree-node .x-tree-selected a span{ + background:#c3daf9; +} +#x-debug-browser pre, .x-debug-browser pre xmp { + font:normal 11px tahoma, arial, helvetica, sans-serif !important; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; +} +#x-debug-browser pre { + display:block; + padding:5px !important; + border-bottom:1px solid #eeeeee !important; +} +#x-debug-browser pre xmp { + padding:0 !important; + margin:0 !important; +} +#x-debug-console .x-layout-panel-center, #x-debug-inspector .x-layout-panel-center { + border-right:1px solid #98c0f4; +} +#x-debug-console textarea { + border: 0 none; + font-size:12px; + font-family:"courier","courier new"; + padding-top:4px; + padding-left:4px; +} +.x-debug-frame { + background:#eeeeee; + border:1px dashed #aaaaaa; +} +.x-combo-list { + border:1px solid #98c0f4; + background:#ddecfe; + zoom:1; + overflow:hidden; +} +.x-combo-list-inner { + overflow:auto; + background:white; + position:relative; +} +.x-combo-list-hd { + font:bold 11px tahoma, arial, helvetica, sans-serif; + color:#15428b; + background-image: url(../images/default/layout/panel-title-light-bg.gif); + border-bottom:1px solid #98c0f4; + padding:3px; +} +.x-resizable-pinned .x-combo-list-inner { + border-bottom:1px solid #98c0f4; +} +.x-combo-list-item { + font:normal 12px tahoma, arial, helvetica, sans-serif; + padding:2px; + border:1px solid #fff; + zoom:1; + white-space: nowrap; + overflow:hidden; + text-overflow: ellipsis; +} +.x-combo-list .x-combo-selected{ + background-color: #c3daf9 !important; + cursor:pointer; + border:1px solid #336699; +} +.x-combo-noedit{ + cursor:pointer; +} +.x-panel-header { + overflow:hidden; + zoom:1; + color:#15428b; + font:bold 11px tahoma,arial,verdana,sans-serif; + padding:5px 3px 4px 5px; + border:1px solid #99bbe8; + background: transparent url(../images/default/panel/white-top-bottom.gif) repeat-x 0 -1px; +} + +.x-panel-body { + border:1px solid #99bbe8; + border-top:0 none; + overflow:hidden; + background:white; +} +.x-panel-body-noheader { + border-top:1px solid #99bbe8; +} + +.x-panel-header { + overflow:hidden; + zoom:1; +} +.x-panel-tl .x-panel-header { + color:#15428b; + font:bold 11px tahoma,arial,verdana,sans-serif; + padding:5px 0 4px 0; + border:0 none; + background:transparent; +} +.x-panel-icon { + padding-left:18px !important; + background-repeat:no-repeat; + background-position:0 3px; + zoom:1; +} +.x-panel-tc { + background: transparent url(../images/default/panel/white-top-bottom.gif) repeat-x 0 0; + overflow:hidden; +} +.x-panel-tl { + background: transparent url(../images/default/panel/white-corners-sprite.gif) no-repeat 0 0; + padding-left:6px; + zoom:1; + border-bottom:1px solid #99bbe8; +} +.x-panel-tr { + background: transparent url(../images/default/panel/white-corners-sprite.gif) no-repeat right 0; + padding-right:6px; +} +.x-panel-bc { + background: transparent url(../images/default/panel/white-top-bottom.gif) repeat-x 0 bottom; + zoom:1; +} +.x-panel-bc .x-panel-footer { + padding-bottom:6px; + zoom:1; +} +.x-panel-bl { + background: transparent url(../images/default/panel/white-corners-sprite.gif) no-repeat 0 bottom; + padding-left:6px; + zoom:1; +} +.x-panel-br { + background: transparent url(../images/default/panel/white-corners-sprite.gif) no-repeat right bottom; + padding-right:6px; + zoom:1; +} +.x-panel-mc { + border:0 none; + padding:0; + margin:0; + font: normal 11px tahoma,arial,helvetica,sans-serif; + background:white; +} +.x-panel-mc .x-panel-body { + background:transparent; + border:0 none; +} +.x-panel-ml { + background: #fff url(../images/default/panel/white-left-right.gif) repeat-y 0 0; + padding-left:6px; + zoom:1; +} +.x-panel-mr { + background: transparent url(../images/default/panel/white-left-right.gif) repeat-y right 0; + padding-right:6px; + zoom:1; +} +.x-panel-blue .x-panel-tl, .x-panel-blue .x-panel-tr, .x-panel-blue .x-panel-bl, .x-panel-blue .x-panel-br { + background-image:url(../images/default/panel/corners-sprite.gif); +} +.x-panel-blue .x-panel-tc, .x-panel-blue .x-panel-bc { + background-image:url(../images/default/panel/top-bottom.gif); +} +.x-panel-blue .x-panel-ml, .x-panel-blue .x-panel-mr { + background-image:url(../images/default/panel/left-right.gif); +} +.x-panel-blue .x-panel-mc{ + padding-top:6px; + background:#dfe8f6; +} +.x-panel-bwrap { + overflow:hidden; +} +.x-panel-body { + overflow:hidden; +} + +.x-panel-collapsed .x-resizable-handle{ + display:none; +} + +.x-tool { + overflow:hidden; + width:15px; + height:15px; + float:right; + cursor:pointer; + background:transparent url(../images/default/panel/tool-sprites.gif) no-repeat; + margin-left:2px; +} + +.x-tool-toggle { + background-position:0 -60px; +} +.x-tool-toggle-over { + background-position:-15px -60px; +} +.x-panel-collapsed .x-tool-toggle { + background-position:0 -75px; +} +.x-panel-collapsed .x-tool-toggle-over { + background-position:-15px -75px; +} + +.x-tool-close { + background-position:0 -0; +} +.x-tool-close-over { + background-position:-15px 0; +} + +.x-tool-minimize { + background-position:0 -15px; +} +.x-tool-minimize-over { + background-position:-15px -15px; +} + +.x-tool-maximize { + background-position:0 -30px; +} +.x-tool-maximize-over { + background-position:-15px -30px; +} + +.x-tool-restore { + background-position:0 -45px; +} +.x-tool-restore-over { + background-position:-15px -45px; +} + +.x-tool-gear { + background-position:0 -90px; +} +.x-tool-gear-over { + background-position:-15px -90px; +} + +.x-panel-ghost { + background:#cbddf3; + z-index:12000; + overflow:hidden; + position:absolute; + left:0;top:0; + opacity:.65; + -moz-opacity:.65; + filter:alpha(opacity=65); +} + +.x-panel-ghost ul { + margin:0; + padding:0; + overflow:hidden; + font-size:0; + line-height:0; + border:1px solid #84a0c4; + border-top:0 none; + display:block; +} + +.x-panel-ghost * { + cursor:move !important; +} + + + + +.x-panel-btns-ct { + padding:5px; +} + +.x-panel-btns-ct .x-btn{ + float:right; + clear:none; +} +.x-panel-btns-ct .x-panel-btns td { + border:0; + padding:0; +} +.x-panel-btns-ct .x-panel-btns-right table{ + float:right; + clear:none; +} +.x-panel-btns-ct .x-panel-btns-left table{ + float:left; + clear:none; +} +.x-panel-btns-ct .x-panel-btns-center{ + text-align:center; +} +.x-panel-btns-ct .x-panel-btns-center table{ + margin:0 auto; +} +.x-panel-btns-ct table td.x-panel-btn-td{ + padding:3px; +} + +.x-panel-btns-ct .x-btn-focus .x-btn-left{ + background-position:0 -147px; +} +.x-panel-btns-ct .x-btn-focus .x-btn-right{ + background-position:0 -168px; +} +.x-panel-btns-ct .x-btn-focus .x-btn-center{ + background-position:0 -189px; +} + +.x-panel-btns-ct .x-btn-click .x-btn-center{ + background-position:0 -126px; +} +.x-panel-btns-ct .x-btn-click .x-btn-right{ + background-position:0 -84px; +} +.x-panel-btns-ct .x-btn-click .x-btn-left{ + background-position:0 -63px; +} + +.x-window .x-resizable-handle { + opacity:0; + -moz-opacity:0; + filter:alpha(opacity=0); +} + +.x-window-proxy { + background:#C7DFFC; + border:1px solid #99bbe8; + z-index:12000; + overflow:hidden; + position:absolute; + left:0;top:0; + display:none; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); +} + +.x-window-header { + overflow:hidden; + zoom:1; +} +.x-window-bwrap { + z-index:1; + position:relative; + zoom:1; +} +.x-window-tl .x-window-header { + color:#15428b; + font:bold 11px tahoma,arial,verdana,sans-serif; + padding:5px 0 4px 0; +} +.x-window-header-text { + cursor:pointer; +} +.x-window-tc { + background: transparent url(../images/default/window/top-bottom.png) repeat-x 0 0; + overflow:hidden; + zoom:1; +} +.x-window-tl { + background: transparent url(../images/default/window/left-corners.png) no-repeat 0 0; + padding-left:6px; + zoom:1; + z-index:1; + position:relative; +} +.x-window-tr { + background: transparent url(../images/default/window/right-corners.png) no-repeat right 0; + padding-right:6px; +} +.x-window-bc { + background: transparent url(../images/default/window/top-bottom.png) repeat-x 0 bottom; + zoom:1; +} +.x-window-bc .x-window-footer { + padding-bottom:6px; + zoom:1; + font-size:0; + line-height:0; +} +.x-window-bl { + background: transparent url(../images/default/window/left-corners.png) no-repeat 0 bottom; + padding-left:6px; + zoom:1; +} +.x-window-br { + background: transparent url(../images/default/window/right-corners.png) no-repeat right bottom; + padding-right:6px; + zoom:1; +} +.x-window-mc { + border:0 none; + padding:0; + margin:0; + font: normal 11px tahoma,arial,helvetica,sans-serif; + background:#dfe8f6; +} +.x-window-ml { + background: transparent url(../images/default/window/left-right.png) repeat-y 0 0; + padding-left:6px; + zoom:1; +} +.x-window-mr { + background: transparent url(../images/default/window/left-right.png) repeat-y right 0; + padding-right:6px; + zoom:1; +} +.x-window-mc { + border:1px solid #99bbe8; +} +.x-window-body { + overflow:hidden; +} +.x-window-bwrap { + overflow:hidden; +} +.x-window-maximized .x-window-bl, .x-window-maximized .x-window-br, + .x-window-maximized .x-window-ml, .x-window-maximized .x-window-mr, + .x-window-maximized .x-window-tl, .x-window-maximized .x-window-tr { + padding:0; +} +.x-window-maximized .x-window-footer { + padding-bottom:0; +} +.x-window-maximized .x-window-tc { + padding-left:3px; + padding-right:3px; +} +.x-window-maximized .x-window-mc { + border-left:0 none; + border-right:0 none; +} +.x-window-tbar .x-toolbar, .x-window-bbar .x-toolbar { + border-left:0 none; + border-right: 0 none; +} +.x-window-bbar .x-toolbar { + border-top:1px solid #99bbe8; + border-bottom:0 none; +} +.x-window-draggable, .x-window-draggable .x-window-header-text { + cursor:move; +} +.x-window-maximized .x-window-draggable, .x-window-maximized .x-window-draggable .x-window-header-text { + cursor:default; +} +.x-window-body { + background:transparent; +} +.x-panel-ghost .x-window-tl { + border-bottom:1px solid #99bbe8; +} +.x-panel-collapsed .x-window-tl { + border-bottom:1px solid #84a0c4; +} +.x-window-maximized-ct { + overflow:hidden; +} +.x-window-maximized .x-resizable-handle { + display:none; +} +.x-window-sizing-ghost ul { + border:0 none !important; +} diff --git a/www/extras/yui-ext/resources/css/form.css b/www/extras/yui-ext/resources/css/form.css new file mode 100644 index 000000000..c10f8dcdd --- /dev/null +++ b/www/extras/yui-ext/resources/css/form.css @@ -0,0 +1,359 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* all fields */ +.x-form-field{ + margin: 0 0 0 0; + font:normal 12px tahoma, arial, helvetica, sans-serif; +} + +/* ---- text fields ---- */ +.x-form-text, textarea.x-form-field{ + padding: 1px 3px; + background:#fff url(../images/default/form/text-bg.gif) repeat-x 0 0; + border: 1px solid #B5B8C8; +} +.x-form-text { + height:22px; + line-height:18px; + vertical-align:middle; +} +.ext-ie .x-form-text { + margin-top:-1px; /* ie bogus margin bug */ + margin-bottom:-1px; + height:22px; /* ie quirks */ + line-height:18px; +} +.ext-strict .x-form-text { + height:18px; +} +.ext-safari .x-form-text { + height:20px; /* safari always same size */ +} +.ext-gecko .x-form-text { + padding-top:2px; /* FF won't center the text vertically */ + padding-bottom:0; +} +/* select boxes */ + +.x-form-select-one { + height:20px; + line-height:18px; + vertical-align:middle; + background-color:#fff; /* opera */ + border: 1px solid #B5B8C8; +} + +/* multi select boxes */ + +/* --- TODO --- */ + +/* checkboxes */ + +/* --- TODO --- */ + +/* radios */ + +/* --- TODO --- */ + + +/* wrapped fields and triggers */ + +.x-form-field-wrap { + position:relative; + zoom:1; + white-space: nowrap; +} + +.x-editor .x-form-check-wrap { + background:#fff; +} +.x-form-field-wrap .x-form-trigger{ + width:17px; + height:21px; + border:0; + background:transparent url(../images/default/form/trigger.gif) no-repeat 0 0; + cursor:pointer; + border-bottom: 1px solid #B5B8C8; + position:absolute; + top:0; +} +.ext-safari .x-form-field-wrap .x-form-trigger{ + height:19px; /* safari doesn't allow height adjustments to the fields, so adjust trigger */ +} +.x-form-field-wrap .x-form-trigger-over{ + background-position:-17px 0; +} +.x-form-field-wrap .x-form-trigger-click{ + background-position:-34px 0; +} +.x-item-disabled .x-form-trigger-over{ + background-position:0 0 !important; +} +.x-item-disabled .x-form-trigger-click{ + background-position:0 0 !important; +} +.x-form-field-wrap .x-form-date-trigger{ + background:transparent url(../images/default/form/date-trigger.gif) no-repeat 0 0; + cursor:pointer; +} +.ext-safari .x-form-field-wrap .x-form-date-trigger{ + right:0; +} + +/* field focus style */ +.x-form-focus{ + border: 1px solid #7eadd9; +} + +/* invalid fields */ +.x-form-invalid, textarea.x-form-invalid{ + background:#fff url(../images/default/grid/invalid_line.gif) repeat-x bottom; + border: 1px solid #dd7870; +} +.ext-safari .x-form-invalid{ + background-color:#ffeeee; + border: 1px solid #ff7870; +} + +/* editors */ + +.x-editor { + visibility:hidden; + padding:0; + margin:0; +} +.x-form-check-wrap { + line-height:18px; +} +.ext-ie .x-form-check-wrap input { + width:15px; + height:15px; +} +.x-editor .x-form-check-wrap { + padding:3px; +} +.x-editor .x-form-checkbox { + height:13px; + border: 0 none; +} +/* If you override the default field font above, you would need to change this font as well */ +.x-form-grow-sizer { + font:normal 12px tahoma, arial, helvetica, sans-serif; + left: -10000px; + padding: 8px 3px; + position: absolute; + visibility:hidden; + top: -10000px; + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; + zoom:1; +} + +/* This CSS is not final and is subject to change - jvs 03/07/07 */ + +.x-form-item { + font:normal 12px tahoma, arial, helvetica, sans-serif; + display:block; + margin-bottom:4px; +} + +.x-form-item label { + display:block; + float:left; + width:100px; + padding:3px; + padding-left:0; + clear:left; +} + +.x-form-element { + padding-left:105px; + position:relative; +} + +.x-form-invalid-msg { + color:#ee0000; + padding:2px; + padding-left:18px; + font:normal 11px tahoma, arial, helvetica, sans-serif; + background: transparent url(../images/default/shared/warning.gif) no-repeat 0 2px; + line-height:16px; + width:200px; +} + +.x-form-label-right label { + text-align:right; +} + +.x-form-label-top .x-form-item label { + width:auto; + float:none; + clear:none; + display:inline; + margin-bottom:4px; +} +.x-form-label-top .x-form-element { + padding-left:0; + padding-top:4px; +} +.x-form-label-top .x-form-item { + padding-bottom:4px; +} +.x-form fieldset { + border:1px solid #B5B8C8; + padding:10px 10px 5px 10px; + margin-bottom:10px; +} +.x-form fieldset legend { + font:bold 11px tahoma, arial, helvetica, sans-serif; + color:#15428b; +} +.ext-ie .x-form fieldset legend { + margin-bottom:10px; +} +.ext-ie .x-form fieldset { + padding-top: 0; +} +.x-form-empty-field { + color:gray; +} +/* Editor small font for grid, toolbar and tree */ +.x-small-editor .x-form-field { + font:normal 11px arial, tahoma, helvetica, sans-serif; +} +.x-small-editor .x-form-text { + height:20px; + line-height:16px; + vertical-align:middle; +} +.ext-ie .x-small-editor .x-form-text { + margin-top:-1px !important; /* ie bogus margin bug */ + margin-bottom:-1px !important; + height:20px !important; /* ie quirks */ + line-height:16px !important; +} +.ext-strict .x-small-editor .x-form-text { + height:16px !important; +} +.ext-safari .x-small-editor .x-form-field { + /* safari text field will not size so needs bigger font */ + font:normal 12px arial, tahoma, helvetica, sans-serif; +} +.ext-ie .x-small-editor .x-form-text { + height:20px; + line-height:16px; +} +.ext-border-box .x-small-editor .x-form-text { + height:20px; +} + +.x-small-editor .x-form-select-one { + height:20px; + line-height:16px; + vertical-align:middle; +} +.x-small-editor .x-form-num-field { + text-align:right; +} +.x-small-editor .x-form-field-wrap .x-form-trigger{ + height:19px; +} + + +.x-form-clear { + clear:both; + height:0; + overflow:hidden; + line-height:0; + font-size:0; +} +.x-form-clear-left { + clear:left; + height:0; + overflow:hidden; + line-height:0; + font-size:0; +} + +.x-form-cb-label { + width:'auto' !important; + float:none !important; + clear:none !important; + display:inline !important; + margin-left:4px; +} + +.x-form-column { + float:left; + padding:0; + margin:0; + width:48%; + overflow:hidden; + zoom:1; +} + +/* buttons */ +.x-form .x-form-btns-ct .x-btn{ + float:right; + clear:none; +} +.x-form .x-form-btns-ct .x-form-btns td { + border:0; + padding:0; +} +.x-form .x-form-btns-ct .x-form-btns-right table{ + float:right; + clear:none; +} +.x-form .x-form-btns-ct .x-form-btns-left table{ + float:left; + clear:none; +} +.x-form .x-form-btns-ct .x-form-btns-center{ + text-align:center; /*ie*/ +} +.x-form .x-form-btns-ct .x-form-btns-center table{ + margin:0 auto; /*everyone else*/ +} +.x-form .x-form-btns-ct table td.x-form-btn-td{ + padding:3px; +} + +.x-form .x-form-btns-ct .x-btn-focus .x-btn-left{ + background-position:0 -147px; +} +.x-form .x-form-btns-ct .x-btn-focus .x-btn-right{ + background-position:0 -168px; +} +.x-form .x-form-btns-ct .x-btn-focus .x-btn-center{ + background-position:0 -189px; +} + +.x-form .x-form-btns-ct .x-btn-click .x-btn-center{ + background-position:0 -126px; +} +.x-form .x-form-btns-ct .x-btn-click .x-btn-right{ + background-position:0 -84px; +} +.x-form .x-form-btns-ct .x-btn-click .x-btn-left{ + background-position:0 -63px; +} +.x-form-invalid-icon { + width:16px; + height:18px; + visibility:hidden; + position:absolute; + left:0; + top:0; + display:block; + background:transparent url(../images/default/form/exclamation.gif) no-repeat 0 2px; +} \ 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..2f730a24e --- /dev/null +++ b/www/extras/yui-ext/resources/css/grid.css @@ -0,0 +1,295 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* Grid2 styles */ +.x-grid { + position:relative; + overflow:hidden; + background-color:#fff; +} +.x-grid-scroller { + overflow:auto; +} +.x-grid-viewport, .x-grid-locked{ + position:absolute; + left:0; top: 0; + z-index:2; + overflow:hidden; + visibility:hidden; +} +.x-grid-cell-inner, .x-grid-hd-inner{ + overflow:hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} +.x-grid-hd-row td, .x-grid-row td{ + font:normal 11px arial, tahoma, helvetica, sans-serif; + line-height:13px; + white-space: nowrap; + vertical-align: top; + -moz-outline: none; + -moz-user-focus: normal; +} +.x-grid-hd-row td { + line-height:14px; +} +.x-grid-col { + border-right: 1px solid #ebebeb; + border-bottom: 1px solid #ebebeb; +} +/* Locked styles */ + +.x-grid-locked .x-grid-body td { + background-color: #FBFDFF; + border-right: 1px solid #deecfd; + border-bottom: 1px solid #deecfd !important; +} +.x-grid-locked .x-grid-body td .x-grid-cell-inner { + border-top:0 none; +} +.x-grid-locked .x-grid-row-alt td{ + background-color: #F5FAFE; +} + +.x-grid-locked .x-grid-header table{ + border-right:1px solid transparent; +} +.x-grid-locked .x-grid-body table{ + border-right:1px solid #c3daf9; +} + +.x-grid-locked .x-grid-body td .x-grid-cell-inner { + +} +.x-grid-row { + cursor: default; +} +.x-grid-row-alt{ + background-color:#f1f1f1; +} +.x-grid-row-over td{ + background-color:#d9e8fb; +} +.x-grid-resize-proxy { + width:3px; + background-color:#cccccc; + cursor: e-resize; + cursor: col-resize; + position:absolute; + top:0; + height:100px; + overflow:hidden; + visibility:hidden; + border:0 none; + z-index:7; +} +.x-grid-focus { + position:absolute; + top:0; + -moz-outline:0 none; + outline:0 none; + -moz-user-select: normal; + -khtml-user-select: normal; +} + +/* header styles */ +.x-grid-header{ + background: #ebeadb url(../images/default/grid/grid-hrow.gif) repeat-x; + overflow:hidden; + position:relative; + cursor:default; + width:100%; +} +.x-grid-hd-row{ + height:22px; +} +.x-grid-hd { + padding-right:1px; +} +.x-grid-hd-over .x-grid-hd-inner { + border-bottom: 1px solid #c3daf9; +} +.x-grid-hd-over .x-grid-hd-text { + background: #fafafa url(../images/default/grid/grid-hrow.gif) repeat-x 0 1px; + padding-bottom:1px; + border-bottom: 1px solid #b3cae9; +} +.x-grid-sort-icon{ + background-repeat: no-repeat; + display: none; + height: 4px; + width: 13px; + margin-left:3px; + vertical-align: middle; +} +.x-grid-header .sort-asc .x-grid-sort-icon { + background-image: url(../images/default/grid/sort_asc.gif); + display: inline; +} +.x-grid-header .sort-desc .x-grid-sort-icon { + background-image: url(../images/default/grid/sort_desc.gif); + display: inline; +} + +/* Body Styles */ +.x-grid-body { + overflow:hidden; + position:relative; + width:100%; + zoom:1; +} + +.x-grid-cell-text,.x-grid-hd-text { + display: block; + padding: 3px 5px 3px 5px; + -moz-user-select: none; + -khtml-user-select: none; + color:black; +} +.x-grid-hd-text { + padding-top:4px; +} +.x-grid-split { + background-image: url(../images/default/grid/grid-split.gif); + background-position: center; + background-repeat: no-repeat; + cursor: e-resize; + cursor: col-resize; + display: block; + font-size: 1px; + height: 16px; + overflow: hidden; + position: absolute; + top: 2px; + width: 6px; + z-index: 3; +} + +.x-grid-hd-text { + color:#15428b; +} +/* Column Reorder DD */ +.x-dd-drag-proxy .x-grid-hd-inner{ + background: #ebeadb url(../images/default/grid/grid-hrow.gif) repeat-x; + height:22px; + width:120px; +} + +.col-move-top, .col-move-bottom{ + width:9px; + height:9px; + position:absolute; + top:0; + line-height:1px; + font-size:1px; + overflow:hidden; + visibility:hidden; + z-index:20000; +} +.col-move-top{ + background:transparent url(../images/default/grid/col-move-top.gif) no-repeat left top; +} +.col-move-bottom{ + background:transparent url(../images/default/grid/col-move-bottom.gif) no-repeat left top; +} + +/* Selection Styles */ +.x-grid-row-selected td, .x-grid-locked .x-grid-row-selected td{ + background-color: #316ac5 !important; + color: white; +} +.x-grid-row-selected span, .x-grid-row-selected b, .x-grid-row-selected div, .x-grid-row-selected strong, .x-grid-row-selected i{ + color: white !important; +} +.x-grid-row-selected .x-grid-cell-text{ + color: white; +} +.x-grid-cell-selected{ + background-color: #316ac5 !important; + color: white; +} +.x-grid-cell-selected span{ + color: white !important; +} +.x-grid-cell-selected .x-grid-cell-text{ + color: white; +} + +.x-grid-locked td.x-grid-row-marker, .x-grid-locked .x-grid-row-selected td.x-grid-row-marker{ + background: #ebeadb url(../images/default/grid/grid-hrow.gif) repeat-x 0 bottom !important; + vertical-align:middle !important; + color:black; + padding:0; + border-top:1px solid white; + border-bottom:none !important; + border-right:1px solid #6fa0df !important; + text-align:center; +} +.x-grid-locked td.x-grid-row-marker div, .x-grid-locked .x-grid-row-selected td.x-grid-row-marker div{ + padding:0 4px; + color:#15428b !important; + text-align:center; +} + +/* dirty cells */ +.x-grid-dirty-cell { + background: transparent url(../images/default/grid/dirty.gif) no-repeat 0 0; +} + +/* Grid Toolbars */ +.x-grid-topbar, .x-grid-bottombar{ + font:normal 11px arial, tahoma, helvetica, sans-serif; + overflow:hidden; + display:none; + zoom:1; + position:relative; +} +.x-grid-topbar .x-toolbar{ + border-right:0 none; +} +.x-grid-bottombar .x-toolbar{ + border-right:0 none; + border-bottom:0 none; + border-top:1px solid #a9bfd3; +} +/* Props Grid Styles */ +.x-props-grid .x-grid-cell-selected .x-grid-cell-text{ + background-color: #316ac5 !important; +} +.x-props-grid .x-grid-col-value .x-grid-cell-text{ + background-color: white; +} +.x-props-grid .x-grid-col-name{ + background-color: #c3daf9; +} +.x-props-grid .x-grid-col-name .x-grid-cell-text{ + background-color: white; + margin-left:10px; +} +.x-props-grid .x-grid-split-value { + visibility:hidden; +} + +/* header menu */ +.xg-hmenu-sort-asc .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-asc.gif); +} +.xg-hmenu-sort-desc .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-desc.gif); +} +.xg-hmenu-lock .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-lock.gif); +} +.xg-hmenu-unlock .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-unlock.gif); +} + +/* dd */ +.x-dd-drag-ghost .x-grid-dd-wrap { + padding:1px 3px 3px 1px; +} \ 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..188e8fa17 --- /dev/null +++ b/www/extras/yui-ext/resources/css/layout.css @@ -0,0 +1,252 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.x-layout-container{ + width:100%; + height:100%; + overflow:hidden; + background-color:#c3daf9; +} +.x-layout-container .x-layout-tabs-body{ + border:0 none; +} +.x-layout-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; +} +.ext-border-box .x-layout-collapsed{ + width:22px; + height:22px; +} +.x-layout-collapsed-over{ + cursor:pointer; + background-color:#d9e8fb; +} +.x-layout-collapsed-west .x-layout-collapsed-tools, .x-layout-collapsed-east .x-layout-collapsed-tools{ + position:absolute; + top:0; + left:0; + width:20px; + height:20px; +} +.x-layout-collapsed-north .x-layout-collapsed-tools, .x-layout-collapsed-south .x-layout-collapsed-tools{ + position:absolute; + top:0; + right:0; + width:20px; + height:20px; +} +.x-layout-collapsed .x-layout-tools-button{ + margin:0; +} +.x-layout-collapsed .x-layout-tools-button-inner{ + width:16px; + height:16px; +} +.x-layout-inactive-content{ + position:absolute; + left:-10000px; + top:-10000px; + visibility:hidden; +} +.x-layout-active-content{ + visibility:visible; +} +.x-layout-panel{ + position:absolute;border:1px solid #98c0f4;overflow:hidden;background-color:white; +} +.x-layout-panel-east, .x-layout-panel-west { + z-index:10; +} +.x-layout-panel-north, .x-layout-panel-south { + z-index:11; +} +.x-layout-collapsed-north, .x-layout-collapsed-south, .x-layout-collapsed-east, .x-layout-collapsed-west { + z-index:12; +} +.x-layout-panel-body{ + overflow:hidden; +} +.x-layout-grid-wrapper{ + +} +.x-layout-split{ + position:absolute; + height:5px; + width:5px; + line-height:1px; + font-size:1px; + z-index:3; + background-color:#c3daf9; +} +.x-layout-panel-hd{ + background-image: url(../images/default/layout/panel-title-light-bg.gif); + color: black; + border-bottom:1px solid #98c0f4; + position:relative; +} +.x-layout-panel-hd-text{ + font:normal 11px tahoma, verdana, helvetica; + padding: 4px; + padding-left: 4px; + display:block; + white-space:nowrap; +} +.x-layout-panel-hd-tools{ + position:absolute; + right:0; + top:0; + text-align:right; + padding-top:2px; + padding-right:2px; + width:60px; +} +.x-layout-tools-button{ + z-index:6; + padding:2px; + cursor:pointer; + float:right; +} +.x-layout-tools-button-over{ + padding:1px; + border:1px solid #98c0f4; + background-color:white; +} +.x-layout-tools-button-inner{ + height:12px; + width:12px; + line-height:1px; + font-size:1px; + background-repeat:no-repeat; + background-position:center; +} +.x-layout-close{ + background-image:url(../images/default/layout/panel-close.gif); +} +.x-layout-stick{ + background-image:url(../images/default/layout/stick.gif); +} +.x-layout-collapse-west,.x-layout-expand-east{ + background-image:url(../images/default/layout/collapse.gif); +} +.x-layout-expand-west,.x-layout-collapse-east{ + background-image:url(../images/default/layout/expand.gif); +} +.x-layout-collapse-north,.x-layout-expand-south{ + background-image:url(../images/default/layout/ns-collapse.gif); +} +.x-layout-expand-north,.x-layout-collapse-south{ + background-image:url(../images/default/layout/ns-expand.gif); +} +.x-layout-split-h{ + background-image:url(../images/default/sizer/e-handle.gif); + background-position: left; +} +.x-layout-split-v{ + background-image:url(../images/default/sizer/s-handle.gif); + background-position: top; +} +.x-layout-panel .x-tabs-wrap{ + background:url(../images/default/layout/gradient-bg.gif); +} +.x-layout-panel .x-tabs-body { + background-color:white; + overflow:auto;height:100%; +} +.x-layout-component-panel, .x-layout-nested-layout { + position:relative; + padding:0; + overflow:hidden; + width:200px; + height:200px; +} +.x-layout-nested-layout .x-layout-panel { + border:0 none; +} +.x-layout-nested-layout .x-layout-panel-north { + border-bottom:1px solid #98c0f4; +} +.x-layout-nested-layout .x-layout-panel-south { + border-top:1px solid #98c0f4; +} +.x-layout-nested-layout .x-layout-panel-east { + border-left:1px solid #98c0f4; +} +.x-layout-nested-layout .x-layout-panel-west { + border-right:1px solid #98c0f4; +} + +.x-layout-panel-dragover { + border: 2px solid #6593cf; +} +.x-layout-panel-proxy { + background-image: url(../images/default/layout/gradient-bg.gif); + background-color:#c3daf9; + border:1px dashed #6593cf; + z-index:10001; + overflow:hidden; + position:absolute; + left:0;top:0; +} +.x-layout-slider { + z-index:15; + overflow:hidden; + position:absolute; +} + +.x-scroller-up, .x-scroller-down { + background-color:#c3daf9; + border: 1px solid #6593cf; + border-top-color: #fff; + border-left-color: #fff; + border-right:0 none; + cursor:pointer; + overflow:hidden; + line-height:16px; +} +.x-scroller-down { + border-bottom: 0 none; + border-top: 1px solid #6593cf; +} +.x-scroller-btn-over { + background-color: #d9e8f8; +} +.x-scroller-btn-click { + background-color: #AECEF7; +} +.x-scroller-btn-disabled { + cursor:default; + background-color: #c3daf9; + -moz-opacity: 0.3; + opacity:.30; + filter: alpha(opacity=30); +} + +/* Reader Layout */ + +.x-reader .x-layout-panel-north { + border:0 none; +} +.x-reader .x-layout-panel-center{ + border:0 none; +} +.x-reader .x-layout-nested-layout .x-layout-panel-center{ + border:1px solid #99bbe8; + border-top:0 none; +} +.x-reader .x-layout-nested-layout .x-layout-panel-south{ + border:1px solid #99bbe8; +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/menu.css b/www/extras/yui-ext/resources/css/menu.css new file mode 100644 index 000000000..71adf7382 --- /dev/null +++ b/www/extras/yui-ext/resources/css/menu.css @@ -0,0 +1,116 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.x-menu { + border:1px solid; + border-color: #a3bad9 #8BB8F3 #8BB8F3 #a3bad9; + z-index: 15000; + background: #fff url(../images/default/menu/menu.gif) repeat-y; +} +.ext-ie .x-menu { + zoom:1; + overflow:hidden; +} +.x-menu-list{ + border:1px solid #fff; +} +.x-menu li{ + line-height:100%; +} +.x-menu li.x-menu-sep-li{ + font-size:1px; + line-height:1px; +} +.x-menu-list-item{ + font:normal 11px "Segoe UI",tahoma,"Lucida Sans Unicode",arial, sans-serif; + white-space: nowrap; + -moz-user-select: none; + -khtml-user-select: none; + display:block; + padding:1px; +} +.x-menu-item-arrow{ + background:transparent url(../images/default/menu/menu-parent.gif) no-repeat right; +} +.x-menu-sep { + display:block; + font-size:1px; + background:#c3daf9; + margin: 3px 3px 3px 32px; + height:1px; +} +.x-menu-focus { + position:absolute; + left:0; + top:-5px; + width:0; + height:0; + line-height:1px; +} +.x-menu-item { + display:block; + line-height:14px; + padding:3px 21px 3px 3px; + white-space: nowrap; + text-decoration:none; + color:#233d6d; + -moz-outline: 0 none; + outline: 0 none; + cursor:pointer; +} +.x-menu-item-active { + color:#233d6d; + background:#c3daf9; + border:1px solid #8BB8F3; + padding:0; +} +.x-menu-item-icon { + border: 0 none; + height: 16px; + padding: 0; + vertical-align: middle; + width: 16px; + margin: 0 11px 0 0; + background-position:center; +} + +.x-menu-check-item .x-menu-item-icon{ + background: transparent url(../images/default/menu/unchecked.gif) no-repeat center; +} + +.x-menu-item-checked .x-menu-item-icon{ + background-image:url(../images/default/menu/checked.gif); +} +.x-menu-group-item .x-menu-item-icon{ + background: transparent; +} + +.x-menu-item-checked .x-menu-group-item .x-menu-item-icon{ + background: transparent url(../images/default/menu/group-checked.gif) no-repeat center; +} + +.x-menu-plain { + background:#fff; +} +.x-menu-date-item{ + padding:0; +} + +.x-menu .x-color-palette, .x-menu .x-date-picker{ + margin-left:32px; + margin-right:4px; +} +.x-menu .x-date-picker{ + border:1px solid #a3bad9; + margin-top:2px; + margin-bottom:2px; +} +.x-menu-plain .x-color-palette, .x-menu-plain .x-date-picker{ + margin:0; + border:0 none; +} diff --git a/www/extras/yui-ext/resources/css/panel.css b/www/extras/yui-ext/resources/css/panel.css new file mode 100644 index 000000000..778ce82d4 --- /dev/null +++ b/www/extras/yui-ext/resources/css/panel.css @@ -0,0 +1,258 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.x-panel-header { + overflow:hidden; + zoom:1; + color:#15428b; + font:bold 11px tahoma,arial,verdana,sans-serif; + padding:5px 3px 4px 5px; + border:1px solid #99bbe8; + background: transparent url(../images/default/panel/white-top-bottom.gif) repeat-x 0 -1px; +} + +.x-panel-body { + border:1px solid #99bbe8; + border-top:0 none; + overflow:hidden; + background:white; +} +.x-panel-body-noheader { + border-top:1px solid #99bbe8; +} + +.x-panel-header { + overflow:hidden; + zoom:1; +} +.x-panel-tl .x-panel-header { + color:#15428b; + font:bold 11px tahoma,arial,verdana,sans-serif; + padding:5px 0 4px 0; + border:0 none; + background:transparent; +} +.x-panel-icon { + padding-left:18px !important; + background-repeat:no-repeat; + background-position:0 3px; + zoom:1; +} +.x-panel-tc { + background: transparent url(../images/default/panel/white-top-bottom.gif) repeat-x 0 0; + overflow:hidden; +} +.x-panel-tl { + background: transparent url(../images/default/panel/white-corners-sprite.gif) no-repeat 0 0; + padding-left:6px; + zoom:1; + border-bottom:1px solid #99bbe8; +} +.x-panel-tr { + background: transparent url(../images/default/panel/white-corners-sprite.gif) no-repeat right 0; + padding-right:6px; +} +.x-panel-bc { + background: transparent url(../images/default/panel/white-top-bottom.gif) repeat-x 0 bottom; + zoom:1; +} +.x-panel-bc .x-panel-footer { + padding-bottom:6px; + zoom:1; +} +.x-panel-bl { + background: transparent url(../images/default/panel/white-corners-sprite.gif) no-repeat 0 bottom; + padding-left:6px; + zoom:1; +} +.x-panel-br { + background: transparent url(../images/default/panel/white-corners-sprite.gif) no-repeat right bottom; + padding-right:6px; + zoom:1; +} +.x-panel-mc { + border:0 none; + padding:0; + margin:0; + font: normal 11px tahoma,arial,helvetica,sans-serif; + background:white; +} +.x-panel-mc .x-panel-body { + background:transparent; + border:0 none; +} +.x-panel-ml { + background: #fff url(../images/default/panel/white-left-right.gif) repeat-y 0 0; + padding-left:6px; + zoom:1; +} +.x-panel-mr { + background: transparent url(../images/default/panel/white-left-right.gif) repeat-y right 0; + padding-right:6px; + zoom:1; +} +.x-panel-blue .x-panel-tl, .x-panel-blue .x-panel-tr, .x-panel-blue .x-panel-bl, .x-panel-blue .x-panel-br { + background-image:url(../images/default/panel/corners-sprite.gif); +} +.x-panel-blue .x-panel-tc, .x-panel-blue .x-panel-bc { + background-image:url(../images/default/panel/top-bottom.gif); +} +.x-panel-blue .x-panel-ml, .x-panel-blue .x-panel-mr { + background-image:url(../images/default/panel/left-right.gif); +} +.x-panel-blue .x-panel-mc{ + padding-top:6px; + background:#dfe8f6; +} +.x-panel-bwrap { + overflow:hidden; +} +.x-panel-body { + overflow:hidden; +} + +.x-panel-collapsed .x-resizable-handle{ + display:none; +} + +.x-tool { + overflow:hidden; + width:15px; + height:15px; + float:right; + cursor:pointer; + background:transparent url(../images/default/panel/tool-sprites.gif) no-repeat; + margin-left:2px; +} + +.x-tool-toggle { + background-position:0 -60px; +} +.x-tool-toggle-over { + background-position:-15px -60px; +} +.x-panel-collapsed .x-tool-toggle { + background-position:0 -75px; +} +.x-panel-collapsed .x-tool-toggle-over { + background-position:-15px -75px; +} + +.x-tool-close { + background-position:0 -0; +} +.x-tool-close-over { + background-position:-15px 0; +} + +.x-tool-minimize { + background-position:0 -15px; +} +.x-tool-minimize-over { + background-position:-15px -15px; +} + +.x-tool-maximize { + background-position:0 -30px; +} +.x-tool-maximize-over { + background-position:-15px -30px; +} + +.x-tool-restore { + background-position:0 -45px; +} +.x-tool-restore-over { + background-position:-15px -45px; +} + +.x-tool-gear { + background-position:0 -90px; +} +.x-tool-gear-over { + background-position:-15px -90px; +} + +.x-panel-ghost { + background:#cbddf3; + z-index:12000; + overflow:hidden; + position:absolute; + left:0;top:0; + opacity:.65; + -moz-opacity:.65; + filter:alpha(opacity=65); +} + +.x-panel-ghost ul { + margin:0; + padding:0; + overflow:hidden; + font-size:0; + line-height:0; + border:1px solid #84a0c4; + border-top:0 none; + display:block; +} + +.x-panel-ghost * { + cursor:move !important; +} + + +/* Buttons */ + +.x-panel-btns-ct { + padding:5px; +} + +.x-panel-btns-ct .x-btn{ + float:right; + clear:none; +} +.x-panel-btns-ct .x-panel-btns td { + border:0; + padding:0; +} +.x-panel-btns-ct .x-panel-btns-right table{ + float:right; + clear:none; +} +.x-panel-btns-ct .x-panel-btns-left table{ + float:left; + clear:none; +} +.x-panel-btns-ct .x-panel-btns-center{ + text-align:center; /*ie*/ +} +.x-panel-btns-ct .x-panel-btns-center table{ + margin:0 auto; /*everyone else*/ +} +.x-panel-btns-ct table td.x-panel-btn-td{ + padding:3px; +} + +.x-panel-btns-ct .x-btn-focus .x-btn-left{ + background-position:0 -147px; +} +.x-panel-btns-ct .x-btn-focus .x-btn-right{ + background-position:0 -168px; +} +.x-panel-btns-ct .x-btn-focus .x-btn-center{ + background-position:0 -189px; +} + +.x-panel-btns-ct .x-btn-click .x-btn-center{ + background-position:0 -126px; +} +.x-panel-btns-ct .x-btn-click .x-btn-right{ + background-position:0 -84px; +} +.x-panel-btns-ct .x-btn-click .x-btn-left{ + background-position:0 -63px; +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/qtips.css b/www/extras/yui-ext/resources/css/qtips.css new file mode 100644 index 000000000..93b975d0b --- /dev/null +++ b/www/extras/yui-ext/resources/css/qtips.css @@ -0,0 +1,119 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.x-tip{ + position: absolute; + top: 0; + left:0; + visibility: hidden; + z-index: 20000; + border:0 none; +} +.x-tip .x-tip-close{ + background-image: url(../images/default/qtip/close.gif); + height: 15px; + float:right; + width: 15px; + margin:0 0 2px 2px; + cursor:pointer; + display:none; +} +.x-tip .x-tip-top { + background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -12px; + height:6px; + overflow:hidden; +} +.x-tip .x-tip-top-left { + background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 0; + padding-left:6px; + zoom:1; +} +.x-tip .x-tip-top-right { + background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right 0; + padding-right:6px; + zoom:1; +} +.x-tip .x-tip-ft { + background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -18px; + height:6px; + overflow:hidden; +} +.x-tip .x-tip-ft-left { + background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -6px; + padding-left:6px; + zoom:1; +} +.x-tip .x-tip-ft-right { + background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right -6px; + padding-right:6px; + zoom:1; +} +.x-tip .x-tip-bd { + border:0 none; + font: normal 11px tahoma,arial,helvetica,sans-serif; +} +.x-tip .x-tip-bd-left { + background: #fff url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -24px; + padding-left:6px; + zoom:1; +} +.x-tip .x-tip-bd-right { + background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right -24px; + padding-right:6px; + zoom:1; +} + +.x-tip h3 { + font: bold 12px tahoma,arial,helvetica,sans-serif; + margin:0; + padding:2px 2px; + color:#222; +} +.x-tip .x-tip-bd-inner { + margin:0 !important; + line-height:14px; + color:#222; + padding:0; + float:left; +} + + +.x-form-invalid-tip { +} + +.x-form-invalid-tip .x-tip-top { + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-top-left { + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-top-right { + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-ft { + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-ft-left { + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-ft-right { + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-bd-left { + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-bd-right { + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-bd .x-tip-bd-inner { + padding-left:24px; + background:transparent url(../images/default/form/exclamation.gif) no-repeat 2px 2px; +} +.x-form-invalid-tip .x-tip-bd-inner { + padding:2px; +} \ 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..c0c3e7995 --- /dev/null +++ b/www/extras/yui-ext/resources/css/reset-min.css @@ -0,0 +1,9 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +html,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;}img,body,html{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..0a560b115 --- /dev/null +++ b/www/extras/yui-ext/resources/css/resizable.css @@ -0,0 +1,143 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.x-resizable-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; +} +.x-resizable-handle-east{ + width:6px; + cursor:e-resize; + right:0; + top:0; + height:100%; +} +.ext-ie .x-resizable-handle-east { + margin-right:-1px; /*IE rounding error*/ +} +.x-resizable-handle-south{ + width:100%; + cursor:s-resize; + left:0; + bottom:0; + height:6px; +} +.ext-ie .x-resizable-handle-south { + margin-bottom:-1px; /*IE rounding error*/ +} +.x-resizable-handle-west{ + width:6px; + cursor:w-resize; + left:0; + top:0; + height:100%; +} +.x-resizable-handle-north{ + width:100%; + cursor:n-resize; + left:0; + top:0; + height:6px; +} +.x-resizable-handle-southeast{ + width:6px; + cursor:se-resize; + right:0; + bottom:0; + height:6px; + z-index:101; +} +.x-resizable-handle-northwest{ + width:6px; + cursor:nw-resize; + left:0; + top:0; + height:6px; + z-index:101; +} +.x-resizable-handle-northeast{ + width:6px; + cursor:ne-resize; + right:0; + top:0; + height:6px; + z-index:101; +} +.x-resizable-handle-southwest{ + width:6px; + cursor:sw-resize; + left:0; + bottom:0; + height:6px; + z-index:101; +} +.x-resizable-over .x-resizable-handle, .x-resizable-pinned .x-resizable-handle{ + filter:alpha(opacity=100); + opacity:1; +} +.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east{ + background:url(../images/default/sizer/e-handle.gif); + background-position: left; +} +.x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west{ + background:url(../images/default/sizer/e-handle.gif); + background-position: left; +} +.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south{ + background:url(../images/default/sizer/s-handle.gif); + background-position: top; +} +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north{ + background:url(../images/default/sizer/s-handle.gif); + background-position: top; +} +.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ + background:url(../images/default/sizer/se-handle.gif); + background-position: top left; +} +.x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{ + background:url(../images/default/sizer/nw-handle.gif); + background-position:bottom right; +} +.x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{ + background:url(../images/default/sizer/ne-handle.gif); + background-position: bottom left; +} +.x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{ + background:url(../images/default/sizer/sw-handle.gif); + background-position: top right; +} +.x-resizable-proxy{ + border: 1px dashed #6593cf; + position:absolute; + overflow:hidden; + display:none; + left:0;top:0; + z-index:50000; +} +.x-resizable-overlay{ + width:100%; + height:100%; + display:none; + position:absolute; + left:0; + top:0; + background:white; + z-index:200000; + -moz-opacity: 0; + opacity:0; + filter: alpha(opacity=0); +} 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..480b03520 --- /dev/null +++ b/www/extras/yui-ext/resources/css/tabs.css @@ -0,0 +1,134 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.x-tabs-wrap { + border-bottom:1px solid #6593cf; + padding-top:2px; +} +.x-tabs-strip-wrap{ + width:100%; +} +.x-tabs-wrap table{ + position:relative; + top:0; left:0; +} +.x-tabs-strip td{ + padding:0; + padding-left:2px; +} +.x-tabs-strip a, .x-tabs-strip span, .x-tabs-strip em { + display:block; +} +.x-tabs-strip a { + text-decoration:none !important; + -moz-outline: none; + outline: none; + cursor:pointer; +} +.x-tabs-strip .x-tabs-text { + font:bold 11px tahoma,arial,helvetica; + color:#666; + overflow:hidden; + white-space: nowrap; + cursor:pointer; + text-overflow: ellipsis; +} +.x-tabs-strip .on .x-tabs-text { + cursor:default; + color:#083772; +} +.x-tabs-strip .disabled .x-tabs-text { + cursor:default; + color:#aaaaaa; +} +.x-tabs-strip .x-tabs-inner { + padding:4px 10px; +} + +.x-tabs-strip .on .x-tabs-right { + background: url(../images/default/tabs/tab-sprite.gif) no-repeat right 0; +} +.x-tabs-strip .on .x-tabs-left { + background: url(../images/default/tabs/tab-sprite.gif) no-repeat 0 -100px; +} +.x-tabs-strip .x-tabs-right { + background: url(../images/default/tabs/tab-sprite.gif) no-repeat right -50px; +} +.x-tabs-strip .x-tabs-left { + background: url(../images/default/tabs/tab-sprite.gif) no-repeat 0 -150px; +} + +.x-tabs-strip a { + position:relative; + top:1px; left:0; +} +.x-tabs-strip .on a { + position:relative; +} +.x-tabs-strip .on .x-tabs-inner { + padding-bottom:5px; +} +/** closable tabs */ +.x-tabs-strip .x-tabs-closable .x-tabs-inner{ + padding-right:22px; + position:relative; +} +.x-tabs-strip .x-tabs-closable .close-icon{ + line-height: 1px; + font-size:1px; + background-image:url(../images/default/layout/tab-close.gif); + display:block; + position:absolute; + right:5px;top:4px; + width:11px;height:11px; + cursor:pointer; +} +.x-tabs-strip .on .close-icon{ + background-image:url(../images/default/layout/tab-close-on.gif); +} +.x-tabs-strip .x-tabs-closable .close-over{ + background-image:url(../images/default/layout/tab-close-on.gif); +} +.x-tabs-body { + border:1px solid #6593cf; + border-top:0 none; +} +.x-tabs-bottom .x-tabs-wrap { + border-top:1px solid #6593cf; + border-bottom:0 none; + padding-top:0; + padding-bottom:2px; +} +.x-tabs-bottom .x-tabs-strip .x-tabs-right { + background: url(../images/default/tabs/tab-btm-inactive-right-bg.gif) no-repeat bottom left; +} +.x-tabs-bottom .x-tabs-strip .x-tabs-left { + background: url(../images/default/tabs/tab-btm-inactive-left-bg.gif) no-repeat bottom right; +} +.x-tabs-bottom .x-tabs-strip .on .x-tabs-right { + background: url(../images/default/tabs/tab-btm-right-bg.gif) no-repeat bottom left; +} +.x-tabs-bottom .x-tabs-strip .on .x-tabs-left { + background: url(../images/default/tabs/tab-btm-left-bg.gif) no-repeat bottom right; +} +.x-tabs-bottom .x-tabs-strip a { + position:relative; + top:0; left:0; +} +.x-tabs-bottom .x-tabs-strip .on a { + margin-top:-1px; +} +.x-tabs-bottom .x-tabs-strip .on .x-tabs-inner { + padding-top:5px; +} + +.x-tabs-bottom .x-tabs-body { + border:1px solid #6593cf; + border-bottom:0 none; +} + 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..88ff9d122 --- /dev/null +++ b/www/extras/yui-ext/resources/css/toolbar.css @@ -0,0 +1,160 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.x-toolbar{ + border: 1px solid; + border-color:#eaf0f7 #eaf0f7 #a9bfd3 #eaf0f7; + display: block; + padding:2px; + background:#d0def0 url(../images/default/layout/panel-title-light-bg.gif) repeat-x; +} +.x-toolbar td { + vertical-align:middle; +} +.mso .x-toolbar, .x-grid-mso .x-toolbar{ + border: 0 none; + background: url(../images/default/grid/mso-hd.gif); +} +.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{ + white-space: nowrap; + font:normal 11px tahoma, arial, helvetica, sans-serif; +} +.x-toolbar .x-item-disabled { + color:gray; + cursor:default; + opacity:.6; + -moz-opacity:.6; + filter:alpha(opacity=60); +} +.x-toolbar .x-item-disabled * { + color:gray; + cursor:default; +} +.x-toolbar .x-btn-left{ + background:none; +} +.x-toolbar .x-btn-right{ + background:none; +} +.x-toolbar .x-btn-center{ + background:none; + padding:0 0; +} +.x-toolbar .x-btn-menu-text-wrap .x-btn-center button{ + padding-right:2px; +} +.ext-gecko .x-toolbar .x-btn-menu-text-wrap .x-btn-center button{ + padding-right:0; +} +.x-toolbar .x-btn-menu-arrow-wrap .x-btn-center button{ + padding:0 2px; +} +.x-toolbar .x-btn-menu-arrow-wrap .x-btn-center button { + width:12px; + background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat 0 3px; +} +.x-toolbar .x-btn-text-icon .x-btn-menu-arrow-wrap .x-btn-center button { + width:12px; + background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat 0 3px; +} +.x-toolbar .x-btn-over .x-btn-menu-arrow-wrap .x-btn-center button { + background-position: 0 -47px; +} +.x-toolbar .x-btn-over .x-btn-left{ + background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 0; +} +.x-toolbar .x-btn-over .x-btn-right{ + background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -21px; +} +.x-toolbar .x-btn-over .x-btn-center{ + background:url(../images/default/toolbar/tb-btn-sprite.gif) repeat-x 0 -42px; +} + +.x-toolbar .x-btn-click .x-btn-left, .x-toolbar .x-btn-pressed .x-btn-left, .x-toolbar .x-btn-menu-active .x-btn-left{ + background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -63px; +} +.x-toolbar .x-btn-click .x-btn-right, .x-toolbar .x-btn-pressed .x-btn-right, .x-toolbar .x-btn-menu-active .x-btn-right{ + background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -84px; +} +.x-toolbar .x-btn-click .x-btn-center, .x-toolbar .x-btn-pressed .x-btn-center, .x-toolbar .x-btn-menu-active .x-btn-center{ + background:url(../images/default/toolbar/tb-btn-sprite.gif) repeat-x 0 -105px; +} + +.x-toolbar .ytb-text{ + padding:2px; +} +.x-toolbar .ytb-sep { + background-image: url(../images/default/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: 0 2px 0; + border:0; +} +.x-toolbar .ytb-spacer { + width:2px; +} +.mso .x-toolbar .ytb-sep, .x-grid-mso .x-toolbar .ytb-sep{ + background-image: url(../images/default/grid/grid-blue-split.gif); +} + +/* IE refuses to respect the negative margins in the toolbar */ +.ext-ie .x-toolbar .x-form-field-wrap { + padding-bottom:1px; +} +.ext-ie .x-toolbar .x-form-field-wrap .x-form-trigger { + top:1px; +} + +/* Paging Toolbar */ + +.x-grid-page-number{ + width:24px; + height:14px; +} +.x-grid-page-first .x-btn-text{ + background-image: url(../images/default/grid/page-first.gif); +} +.x-grid-loading .x-btn-text{ + background-image: url(../images/default/grid/done.gif); +} +.x-grid-page-last .x-btn-text{ + background-image: url(../images/default/grid/page-last.gif); +} +.x-grid-page-next .x-btn-text{ + background-image: url(../images/default/grid/page-next.gif); +} +.x-grid-page-prev .x-btn-text{ + background-image: url(../images/default/grid/page-prev.gif); +} +.x-item-disabled .x-grid-loading .x-btn-text{ + background-image: url(../images/default/grid/loading.gif); +} +.x-item-disabled .x-grid-page-first .x-btn-text{ + background-image: url(../images/default/grid/page-first-disabled.gif); +} +.x-item-disabled .x-grid-page-last .x-btn-text{ + background-image: url(../images/default/grid/page-last-disabled.gif); +} +.x-item-disabled .x-grid-page-next .x-btn-text{ + background-image: url(../images/default/grid/page-next-disabled.gif); +} +.x-item-disabled .x-grid-page-prev .x-btn-text{ + background-image: url(../images/default/grid/page-prev-disabled.gif); +} +.x-paging-info { + position:absolute; + top:8px; + right: 8px; + color:#15428b; +} diff --git a/www/extras/yui-ext/resources/css/tree.css b/www/extras/yui-ext/resources/css/tree.css new file mode 100644 index 000000000..8f33f07db --- /dev/null +++ b/www/extras/yui-ext/resources/css/tree.css @@ -0,0 +1,179 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.x-tree-icon, .x-tree-ec-icon, .x-tree-elbow-line, .x-tree-elbow, .x-tree-elbow-end, .x-tree-elbow-plus, .x-tree-elbow-minus, .x-tree-elbow-end-plus, .x-tree-elbow-end-minus{ + border: 0 none; + height: 18px; + margin: 0; + padding: 0; + vertical-align: middle; + width: 16px; + background-repeat: no-repeat; +} +.x-tree-node-collapsed .x-tree-node-icon, .x-tree-node-expanded .x-tree-node-icon, .x-tree-node-leaf .x-tree-node-icon{ + border: 0 none; + height: 18px; + margin: 0; + padding: 0; + vertical-align: middle; + width: 16px; + background-position:center; + background-repeat: no-repeat; +} + +/* some default icons for leaf/folder */ +.x-tree-node-collapsed .x-tree-node-icon{ + background-image:url(../images/default/tree/folder.gif); +} +.x-tree-node-expanded .x-tree-node-icon{ + background-image:url(../images/default/tree/folder-open.gif); +} +.x-tree-node-leaf .x-tree-node-icon{ + background-image:url(../images/default/tree/leaf.gif); +} + +.x-tree-noicon .x-tree-node-icon{ + width:0; height:0; +} +/* loading icon */ +.x-tree-node-loading .x-tree-node-icon{ + background-image:url(../images/default/tree/loading.gif) !important; +} +.x-tree-node-loading a span{ + font-style: italic; + color:#444444; +} + +/* Line styles */ +.x-tree-lines .x-tree-elbow{ + background-image:url(../images/default/tree/elbow.gif); +} +.x-tree-lines .x-tree-elbow-plus{ + background-image:url(../images/default/tree/elbow-plus.gif); +} +.x-tree-lines .x-tree-elbow-minus{ + background-image:url(../images/default/tree/elbow-minus.gif); +} +.x-tree-lines .x-tree-elbow-end{ + background-image:url(../images/default/tree/elbow-end.gif); +} +.x-tree-lines .x-tree-elbow-end-plus{ + background-image:url(../images/default/tree/elbow-end-plus.gif); +} +.x-tree-lines .x-tree-elbow-end-minus{ + background-image:url(../images/default/tree/elbow-end-minus.gif); +} +.x-tree-lines .x-tree-elbow-line{ + background-image:url(../images/default/tree/elbow-line.gif); +} + +/* No line styles */ +.x-tree-no-lines .x-tree-elbow{ + background:transparent; +} +.x-tree-no-lines .x-tree-elbow-plus{ + background-image:url(../images/default/tree/elbow-plus-nl.gif); +} +.x-tree-no-lines .x-tree-elbow-minus{ + background-image:url(../images/default/tree/elbow-minus-nl.gif); +} +.x-tree-no-lines .x-tree-elbow-end{ + background:transparent; +} +.x-tree-no-lines .x-tree-elbow-end-plus{ + background-image:url(../images/default/tree/elbow-end-plus-nl.gif); +} +.x-tree-no-lines .x-tree-elbow-end-minus{ + background-image:url(../images/default/tree/elbow-end-minus-nl.gif); +} +.x-tree-no-lines .x-tree-elbow-line{ + background:transparent; +} + +.x-tree-elbow-plus, .x-tree-elbow-minus, .x-tree-elbow-end-plus, .x-tree-elbow-end-minus{ + cursor:pointer; +} +.ext-ie ul.x-tree-node-ct{ + font-size:0; + line-height:0; +} +.x-tree-node{ + color: black; + font: normal 11px arial, tahoma, helvetica, sans-serif; + white-space: nowrap; +} +.x-tree-node a, .x-dd-drag-ghost a{ + text-decoration:none; + color:black; + -khtml-user-select:none; + -moz-user-select:none; + -kthml-user-focus:normal; + -moz-user-focus:normal; + -moz-outline: 0 none; + outline:0 none; +} +.x-tree-node a span, .x-dd-drag-ghost a span{ + text-decoration:none; + color:black; + padding:1px 3px 1px 2px; +} +.x-tree-node .x-tree-node-disabled a span{ + color:gray !important; +} +.x-tree-node .x-tree-node-disabled .x-tree-node-icon{ + -moz-opacity: 0.5; + opacity:.5; + filter: alpha(opacity=50); +} +.x-tree-node .x-tree-node-inline-icon{ + background:transparent; +} +.x-tree-node a:hover, .x-dd-drag-ghost a:hover{ + text-decoration:none; +} +.x-tree-node div.x-tree-drag-insert-below{ + border-bottom:1px dotted #3366cc; +} +.x-tree-node div.x-tree-drag-insert-above{ + border-top:1px dotted #3366cc; +} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below{ + border-bottom:0 none; +} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above{ + border-top:0 none; +} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a{ + border-bottom:2px solid #3366cc; +} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a{ + border-top:2px solid #3366cc; +} +.x-tree-node .x-tree-drag-append a span{ + background:#dddddd; + border:1px dotted gray; +} +.x-tree-node .x-tree-selected a span{ + background:#3366cc; + color:white; +} +.x-dd-drag-ghost .x-tree-node-indent, .x-dd-drag-ghost .x-tree-ec-icon{ + display:none !important; +} +.x-tree-drop-ok-append .x-dd-drop-icon{ + background-image: url(../images/default/tree/drop-add.gif); +} +.x-tree-drop-ok-above .x-dd-drop-icon{ + background-image: url(../images/default/tree/drop-over.gif); +} +.x-tree-drop-ok-below .x-dd-drop-icon{ + background-image: url(../images/default/tree/drop-under.gif); +} +.x-tree-drop-ok-between .x-dd-drop-icon{ + background-image: url(../images/default/tree/drop-between.gif); +} diff --git a/www/extras/yui-ext/resources/css/window.css b/www/extras/yui-ext/resources/css/window.css new file mode 100644 index 000000000..4f5bec43b --- /dev/null +++ b/www/extras/yui-ext/resources/css/window.css @@ -0,0 +1,155 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + + +.x-window .x-resizable-handle { + opacity:0; + -moz-opacity:0; + filter:alpha(opacity=0); +} + +.x-window-proxy { + background:#C7DFFC; + border:1px solid #99bbe8; + z-index:12000; + overflow:hidden; + position:absolute; + left:0;top:0; + display:none; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); +} + +.x-window-header { + overflow:hidden; + zoom:1; +} +.x-window-bwrap { + z-index:1; + position:relative; + zoom:1; +} +.x-window-tl .x-window-header { + color:#15428b; + font:bold 11px tahoma,arial,verdana,sans-serif; + padding:5px 0 4px 0; +} +.x-window-header-text { + cursor:pointer; +} +.x-window-tc { + background: transparent url(../images/default/window/top-bottom.png) repeat-x 0 0; + overflow:hidden; + zoom:1; +} +.x-window-tl { + background: transparent url(../images/default/window/left-corners.png) no-repeat 0 0; + padding-left:6px; + zoom:1; + z-index:1; + position:relative; +} +.x-window-tr { + background: transparent url(../images/default/window/right-corners.png) no-repeat right 0; + padding-right:6px; +} +.x-window-bc { + background: transparent url(../images/default/window/top-bottom.png) repeat-x 0 bottom; + zoom:1; +} +.x-window-bc .x-window-footer { + padding-bottom:6px; + zoom:1; + font-size:0; + line-height:0; +} +.x-window-bl { + background: transparent url(../images/default/window/left-corners.png) no-repeat 0 bottom; + padding-left:6px; + zoom:1; +} +.x-window-br { + background: transparent url(../images/default/window/right-corners.png) no-repeat right bottom; + padding-right:6px; + zoom:1; +} +.x-window-mc { + border:0 none; + padding:0; + margin:0; + font: normal 11px tahoma,arial,helvetica,sans-serif; + background:#dfe8f6; +} +.x-window-ml { + background: transparent url(../images/default/window/left-right.png) repeat-y 0 0; + padding-left:6px; + zoom:1; +} +.x-window-mr { + background: transparent url(../images/default/window/left-right.png) repeat-y right 0; + padding-right:6px; + zoom:1; +} +.x-window-mc { + border:1px solid #99bbe8; +} +.x-window-body { + overflow:hidden; +} +.x-window-bwrap { + overflow:hidden; +} +.x-window-maximized .x-window-bl, .x-window-maximized .x-window-br, + .x-window-maximized .x-window-ml, .x-window-maximized .x-window-mr, + .x-window-maximized .x-window-tl, .x-window-maximized .x-window-tr { + padding:0; +} +.x-window-maximized .x-window-footer { + padding-bottom:0; +} +.x-window-maximized .x-window-tc { + padding-left:3px; + padding-right:3px; +} +.x-window-maximized .x-window-mc { + border-left:0 none; + border-right:0 none; +} +.x-window-tbar .x-toolbar, .x-window-bbar .x-toolbar { + border-left:0 none; + border-right: 0 none; +} +.x-window-bbar .x-toolbar { + border-top:1px solid #99bbe8; + border-bottom:0 none; +} +.x-window-draggable, .x-window-draggable .x-window-header-text { + cursor:move; +} +.x-window-maximized .x-window-draggable, .x-window-maximized .x-window-draggable .x-window-header-text { + cursor:default; +} +.x-window-body { + background:transparent; +} +.x-panel-ghost .x-window-tl { + border-bottom:1px solid #99bbe8; +} +.x-panel-collapsed .x-window-tl { + border-bottom:1px solid #84a0c4; +} +.x-window-maximized-ct { + overflow:hidden; +} +.x-window-maximized .x-resizable-handle { + display:none; +} +.x-window-sizing-ghost ul { + border:0 none !important; +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/ytheme-aero.css b/www/extras/yui-ext/resources/css/ytheme-aero.css new file mode 100644 index 000000000..ad3fa9c87 --- /dev/null +++ b/www/extras/yui-ext/resources/css/ytheme-aero.css @@ -0,0 +1,581 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* menus */ +.x-menu { + border:1px solid; + border-color: #96b9e6 #8BB8F3 #8BB8F3 #96b9e6; + z-index: 15000; + zoom:1; + background:#c3daf9; + padding:2px; + +} +.x-menu-list{ + background: #fafafa; + border:1px solid #fff; + border-color:#a3bad9; +} +.x-menu-item-icon { + margin-right:8px; +} +.x-menu-sep { + margin-left:3px; +} +.x-menu-item-active { + color:#233d6d; + background:#c3daf9; + border:1px solid #fff; + padding:0; +} + +.x-date-mmenu .x-menu-list{ + padding:0; +} +.x-date-mmenu .x-menu-list{ + border:0 none; +} + +.x-menu .x-color-palette, .x-menu .x-date-picker{ + margin-left:26px; +} +.x-menu-plain .x-color-palette, .x-menu-plain .x-date-picker{ + margin:0; + border:0 none; +} +/** +* Tabs +*/ +.x-tabs-wrap, .x-layout-panel .x-tabs-top .x-tabs-wrap { + background:#deecfd; + border:1px solid #8db2e3; + padding-bottom:2px; + padding-top:0; +} +.x-tabs-strip-wrap{ + padding-top:1px; + background:#cedff5 url(../images/aero/tabs/tab-strip-bg.gif) repeat-x bottom; + border-bottom:1px solid #8db2e3; +} +.x-tabs-strip .x-tabs-text { + color:#15428b; + font:bold 11px tahoma,arial,verdana,sans-serif; +} +.x-tabs-strip .on .x-tabs-text { + cursor:default; + color:#15428b; +} +.x-tabs-top .x-tabs-strip .on .x-tabs-right { + background: url(../images/aero/tabs/tab-sprite.gif) no-repeat right 0; +} +.x-tabs-top .x-tabs-strip .on .x-tabs-left,.x-tabs-top .x-tabs-strip .on a:hover .x-tabs-left{ + background: url(../images/aero/tabs/tab-sprite.gif) no-repeat 0 -100px; +} +.x-tabs-top .x-tabs-strip .x-tabs-right { + background:transparent url(../images/aero/tabs/tab-sprite.gif) no-repeat right -50px; +} +.x-tabs-top .x-tabs-strip .x-tabs-left { + background:transparent url(../images/aero/tabs/tab-sprite.gif) no-repeat 0 -150px; +} +.x-tabs-top .x-tabs-body { + border:1px solid #8db2e3; + border-top:0 none; +} +.x-tabs-bottom .x-tabs-wrap, .x-layout-panel .x-tabs-bottom .x-tabs-wrap { + background:#deecfd; + border:1px solid #8db2e3; + padding-top:2px; + padding-bottom:0; +} +.x-tabs-bottom .x-tabs-strip-wrap{ + padding-top:0; + padding-bottom:1px; + background:#cedff5 url(../images/aero/tabs/tab-strip-btm-bg.gif) repeat-x top; + border-top:1px solid #8db2e3; + border-bottom:0 none; +} +.x-tabs-bottom .x-tabs-strip .x-tabs-right { + background:transparent url(../images/aero/tabs/tab-btm-inactive-right-bg.gif) no-repeat bottom right; +} +.x-tabs-bottom .x-tabs-strip .x-tabs-left { + background:transparent url(../images/aero/tabs/tab-btm-inactive-left-bg.gif) no-repeat bottom left; +} +.x-tabs-bottom .x-tabs-strip .on .x-tabs-right,.x-tabs-bottom .x-tabs-strip .on a:hover { + background: url(../images/aero/tabs/tab-btm-right-bg.gif) no-repeat bottom left; +} +.x-tabs-bottom .x-tabs-strip .on .x-tabs-left,.x-tabs-bottom .x-tabs-strip .on a:hover .x-tabs-left { + background: url(../images/aero/tabs/tab-btm-left-bg.gif) no-repeat bottom right; +} +.x-tabs-bottom .x-tabs-body { + border:1px solid #8db2e3; + border-bottom:0 none; +} +/* +* Basic-Dialog +*/ +.x-dlg-proxy { + background:#C7DFFC; + border:1px solid #A5CCF9; +} +.x-dlg-shadow{ + background:#cccccc; + opacity:.3; + -moz-opacity:.3; + filter: alpha(opacity=30); +} +.x-dlg { + background:transparent; +} +.x-dlg .x-dlg-hd { + background: url(../images/aero/basic-dialog/hd-sprite.gif) repeat-x 0 -82px; + background-color:#aabaca; + color:#15428b; + zoom:1; + padding-top:7px; +} +.x-dlg .x-dlg-hd-left { + opacity:.85; + -moz-opacity:.85; + filter:alpha(opacity=80); + background: url(../images/aero/basic-dialog/hd-sprite.gif) no-repeat 0 -41px; + zoom:1; +} +.x-dlg-modal .x-dlg-hd-left { + opacity:.75; + -moz-opacity:.75; + filter:alpha(opacity=70); +} + +.x-dlg .x-dlg-hd-right { + background: url(../images/aero/basic-dialog/hd-sprite.gif) no-repeat right 0; + zoom:1; +} +.x-dlg .x-dlg-dlg-body{ + padding:0 0 0; + position:absolute; + top:24px;left:0; + z-index:1; + border:0 none; + background:transparent; +} +.x-dlg .x-dlg-bd{ + background:#fff; + border:1px solid #96b9e6; +} +.x-dlg .x-dlg-ft{ + border:0 none; + background:transparent; + padding-bottom:8px; +} +.x-dlg .x-dlg-bg{ + filter:alpha(opacity=80); + opacity:.85; + -moz-opacity:.85; + zoom:1; +} +.x-dlg-modal .x-dlg-bg { + opacity:.75; + -moz-opacity:.75; + filter:alpha(opacity=70); +} +.x-dlg .x-dlg-bg-center { + padding: 2px 7px 7px 7px; + background:transparent url(../images/aero/basic-dialog/bg-center.gif) repeat-x bottom; + zoom:1; +} +.x-dlg .x-dlg-bg-left{ + padding-left:7px; + background:transparent url(../images/aero/basic-dialog/bg-left.gif) no-repeat bottom left; + zoom:1; +} +.x-dlg .x-dlg-bg-right{ + padding-right:7px; + background:transparent url(../images/aero/basic-dialog/bg-right.gif) no-repeat bottom right; + zoom:1; +} +.x-dlg-auto-tabs .x-dlg-dlg-body, .x-dlg-auto-layout .x-dlg-dlg-body{ + background:transparent; + border:0 none; +} +.x-dlg-auto-tabs .x-dlg-bd, .x-dlg-auto-layout .x-dlg-bd{ + background:#fff; + border:1px solid #e9f3f5; +} +.x-dlg-auto-tabs .x-tabs-top .x-tabs-body,.x-dlg-auto-tabs .x-tabs-bottom .x-tabs-body{ + border-color:#8db2e3; +} +.x-dlg-auto-tabs .x-tabs-top .x-tabs-wrap,.x-dlg-auto-tabs .x-tabs-bottom .x-tabs-wrap{ + border-color:#8db2e3; +} +.x-dlg .x-dlg-toolbox { + width:50px; + height:20px; + right:5px; + top:5px; +} +.x-dlg .x-dlg-close, .x-dlg .x-dlg-collapse { + width:21px; + height:20px; + margin:0; +} +.x-dlg .x-dlg-close { + background-image:url(../images/aero/basic-dialog/aero-close.gif); +} +.x-dlg .x-dlg-collapse { + background-image:url(../images/aero/basic-dialog/collapse.gif); +} +.x-dlg-collapsed { + border-bottom:1px solid #96b9e6; +} +.x-dlg .x-dlg-close-over { + background-image:url(../images/aero/basic-dialog/aero-close-over.gif); +} +.x-dlg .x-dlg-collapse-over { + background-image:url(../images/aero/basic-dialog/collapse-over.gif); +} +.x-dlg-collapsed .x-dlg-collapse { + background-image:url(../images/aero/basic-dialog/expand.gif); +} +.x-dlg-collapsed .x-dlg-collapse-over { + background-image:url(../images/aero/basic-dialog/expand-over.gif); +} +.x-dlg div.x-resizable-handle-east{ + background-image:url(../images/aero/s.gif); + border:0 none; +} +.x-dlg div.x-resizable-handle-south{ + background-image:url(../images/aero/s.gif); + border:0 none; +} +.x-dlg div.x-resizable-handle-west{ + background-image:url(../images/aero/s.gif); + border:0 none; +} +.x-dlg div.x-resizable-handle-southeast{ + background-image:url(../images/aero/basic-dialog/se-handle.gif); + background-position: bottom right; + width:9px; + height:9px; + border:0; + right:2px; + bottom:2px; +} +.x-dlg div.x-resizable-handle-southwest{ + background-image:url(../images/aero/s.gif); + background-position: top right; + margin-left:1px; + margin-bottom:1px; + border:0; +} +.x-dlg div.x-resizable-handle-north{ + background-image:url(../images/aero/s.gif); + border:0 none; +} + +#x-msg-box .x-dlg-bd{ + background:#CFE0F5; + border:0 none; +} +body.x-masked #x-msg-box .x-dlg-bd, body.x-body-masked #x-msg-box .x-dlg-bd{ + background:#c4d2e3; + border:0 none; +} +/* BorderLayout */ + +.x-layout-container{ + background:#deecfd; +} +.x-layout-collapsed{ + background-color:#deecfd; + border:1px solid #99bbe8; +} +.x-layout-collapsed-over{ + background-color:#F5F9FE; +} +.x-layout-panel{ + border:1px solid #99bbe8; +} +.x-layout-nested-layout .x-layout-panel { + border:0 none; +} +.x-layout-split{ + background-color:#deecfd; +} +.x-layout-panel-hd{ + background: #ebeadb url(../images/aero/grid/grid-hrow.gif) repeat-x; + border-bottom:1px solid #99bbe8; +} +.x-layout-panel-hd-text { + color:#15428b; + font:bold 11px tahoma,arial,verdana,sans-serif; +} + +.x-layout-split-h{ + background:#deecfd; +} +.x-layout-split-v{ + background:#deecfd; +} +.x-layout-panel .x-tabs-top .x-tabs-wrap{ + border:0 none; + border-bottom:1px solid #8db2e3; +} +.x-layout-panel .x-tabs-bottom .x-tabs-wrap{ + border:0 none; + border-top:1px solid #8db2e3; +} + +.x-layout-nested-layout .x-layout-panel-north { + border-bottom:1px solid #99bbe8; +} +.x-layout-nested-layout .x-layout-panel-south { + border-top:1px solid #99bbe8; +} +.x-layout-nested-layout .x-layout-panel-east { + border-left:1px solid #99bbe8; +} +.x-layout-nested-layout .x-layout-panel-west { + border-right:1px solid #99bbe8; +} +.x-layout-panel-dragover { + border: 2px solid #99bbe8; +} +.x-layout-panel-proxy { + background-image: url(../images/aero/layout/gradient-bg.gif); + background-color:#f3f2e7; + border:1px dashed #99bbe8; +} + +.x-layout-container .x-layout-tabs-body{ + border:0 none; +} +/** Resizable */ + +.x-resizable-proxy{ + border: 1px dashed #3b5a82; +} + +/* grid */ +.x-grid-hd-text { + color:#15428b; + font-weight:bold; +} +.x-grid-locked .x-grid-body td { + background: #FBFDFF; + border-right: 1px solid #deecfd; + border-bottom: 1px solid #deecfd !important; +} +.x-grid-locked .x-grid-body td .x-grid-cell-inner { + border-top:0 none; +} +.x-grid-locked .x-grid-row-alt td{ + background: #F5FAFE; +} +.x-grid-locked .x-grid-row-selected td{ + color: #fff !important; + background-color: #316ac5 !important; +} +.x-grid-hd{ + border-bottom:0; + background:none; +} +.x-grid-hd-row{ + height:auto; +} +.x-grid-hd-over { + border-bottom:0 none; +} +.x-grid-hd-over .x-grid-hd-body{ + background:none; + border-bottom:0 none; +} +.x-grid-hd-over .x-grid-hd-body{ + background-color: transparent; + border-bottom:0; +} +.x-grid-split { + background-image: url(../images/aero/grid/grid-blue-split.gif); +} +.x-grid-header{ + background: url(../images/aero/grid/grid-hrow.gif); + border:0 none; + border-bottom:1px solid #6f99cf; +} +.x-grid-row-alt{ + background-color: #f5f5f5; +} +.x-grid-row-over td, .x-grid-locked .x-grid-row-over td{ + background-color:#d9e8fb; +} +.x-grid-col { + border-right: 1px solid #eee; + border-bottom: 1px solid #eee; +} +.x-grid-header .x-grid-hd-inner { + padding-bottom: 1px; +} +.x-grid-header .x-grid-hd-text { + padding-bottom: 3px; +} +.x-grid-hd-over .x-grid-hd-inner { + border-bottom: 1px solid #316ac5; + padding-bottom: 0; +} +.x-grid-hd-over .x-grid-hd-text { + background: #d5e4f5; + border-bottom: 1px solid #fff; + padding-bottom: 2px; +} +.x-grid-header .sort-asc .x-grid-hd-inner, .x-grid-header .sort-desc .x-grid-hd-inner { + border-bottom: 1px solid #316ac5; + padding-bottom: 0; +} +.x-grid-header .sort-asc .x-grid-hd-text, .x-grid-header .sort-desc .x-grid-hd-text { + border-bottom: 0 none; + padding-bottom: 3px; +} +.x-grid-header .sort-asc .x-grid-sort-icon { + background-image: url(../images/aero/grid/sort_asc.gif); +} +.x-grid-header .sort-desc .x-grid-sort-icon { + background-image: url(../images/aero/grid/sort_desc.gif); +} +.x-dd-drag-proxy .x-grid-hd-inner{ + background: #ebeadb url(../images/aero/grid/grid-hrow.gif) repeat-x; + height:22px; + width:120px; +} + + +.x-grid-locked td.x-grid-row-marker, .x-grid-locked .x-grid-row-selected td.x-grid-row-marker{ + background: #ebeadb url(../images/aero/grid/grid-hrow.gif) repeat-x 0 0 !important; + vertical-align:middle !important; + color:black; + padding:0; + border-top:1px solid white; + border-bottom:1px solid #6f99cf !important; + border-right:1px solid #6f99cf !important; + text-align:center; +} +.x-grid-locked td.x-grid-row-marker div, .x-grid-locked .x-grid-row-selected td.x-grid-row-marker div{ + padding:0 4px; + color:#15428b !important; + text-align:center; +} + +/** Toolbar */ +.x-toolbar{ + padding:2px 2px 2px 2px; + background:#d0def0 url(../images/default/toolbar/tb-bg.gif) repeat-x; +} + +.x-toolbar .ytb-sep{ + background-image: url(../images/aero/grid/grid-blue-split.gif); +} + +.x-toolbar .x-btn-over .x-btn-left{ + background:url(../images/aero/toolbar/tb-btn-sprite.gif) no-repeat 0 0; +} +.x-toolbar .x-btn-over .x-btn-right{ + background:url(../images/aero/toolbar/tb-btn-sprite.gif) no-repeat 0 -21px; +} +.x-toolbar .x-btn-over .x-btn-center{ + background:url(../images/aero/toolbar/tb-btn-sprite.gif) repeat-x 0 -42px; +} + +.x-toolbar .x-btn-click .x-btn-left, .x-toolbar .x-btn-pressed .x-btn-left, .x-toolbar .x-btn-menu-active .x-btn-left{ + background:url(../images/aero/toolbar/tb-btn-sprite.gif) no-repeat 0 -63px; +} +.x-toolbar .x-btn-click .x-btn-right, .x-toolbar .x-btn-pressed .x-btn-right, .x-toolbar .x-btn-menu-active .x-btn-right{ + background:url(../images/aero/toolbar/tb-btn-sprite.gif) no-repeat 0 -84px; +} +.x-toolbar .x-btn-click .x-btn-center, .x-toolbar .x-btn-pressed .x-btn-center, .x-toolbar .x-btn-menu-active .x-btn-center{ + background:url(../images/aero/toolbar/tb-btn-sprite.gif) repeat-x 0 -105px; +} + + + + +/*************** TABS 2 *****************/ + + +/** +* Tabs +*/ +.x-tab-panel-header, .x-tab-panel-footer { + background:#deecfd; + border:1px solid #8db2e3; +} +.x-tab-panel-header { + background:#deecfd; + border:1px solid #8db2e3; + padding-bottom:2px; +} +.x-tab-panel-footer { + background:#deecfd; + border:1px solid #8db2e3; + padding-top:2px; +} + +.x-tab-strip-top{ + padding-top:1px; + background:#cedff5 url(../images/aero/tabs/tab-strip-bg.gif) repeat-x bottom; + border-bottom:1px solid #8db2e3; +} +.x-tab-strip-bottom{ + padding-bottom:1px; + background:#cedff5 url(../images/aero/tabs/tab-strip-btm-bg.gif) repeat-x top; + border-top:1px solid #8db2e3; + border-bottom:0 none; +} + +.x-tab-strip .x-tab-strip-text { + color:#15428b; + font:bold 11px tahoma,arial,verdana,sans-serif; +} +.x-tab-strip .x-tab-strip-active .x-tab-text { + cursor:default; + color:#15428b; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-right { + background: url(../images/aero/tabs/tab-sprite.gif) no-repeat right 0; +} +.x-tab-strip-top .x-tab-strip-active .x-tab-left { + background: url(../images/aero/tabs/tab-sprite.gif) no-repeat 0 -100px; +} +.x-tab-strip-top .x-tab-right { + background: url(../images/aero/tabs/tab-sprite.gif) no-repeat right -50px; +} +.x-tab-strip-top .x-tab-left { + background: url(../images/aero/tabs/tab-sprite.gif) no-repeat 0 -150px; +} + + +.x-tab-strip-bottom .x-tab-right { + background: url(../images/aero/tabs/tab-btm-inactive-right-bg.gif) no-repeat bottom left; +} +.x-tab-strip-bottom .x-tab-left { + background: url(../images/aero/tabs/tab-btm-inactive-left-bg.gif) no-repeat bottom right; +} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + background: url(../images/aero/tabs/tab-btm-right-bg.gif) no-repeat bottom left; +} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left { + background: url(../images/aero/tabs/tab-btm-left-bg.gif) no-repeat bottom right; +} + +.x-tab-panel-body-top { + border:1px solid #8db2e3; + border-top:0 none; +} + +.x-tab-panel-body-bottom { + border:1px solid #8db2e3; + border-bottom:0 none; +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/ytheme-gray.css b/www/extras/yui-ext/resources/css/ytheme-gray.css new file mode 100644 index 000000000..4268693c2 --- /dev/null +++ b/www/extras/yui-ext/resources/css/ytheme-gray.css @@ -0,0 +1,438 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + + +.ext-el-mask-msg { + border:1px solid #aaa; + background: #ddd url(../images/default/box/tb.gif) repeat-x 0 -16px; +} +.ext-el-mask-msg div { + border:1px solid #ccc; +} + +/* + Menu + */ +.x-menu { + border-color: #999 #999 #999 #999; + background-image:url(../images/gray/menu/menu.gif); +} +.x-menu-item-arrow{ + background-image:url(../images/gray/menu/menu-parent.gif); +} +.x-menu-item { + color:#222; +} +.x-menu-item-active { + background:#ddd; + border:1px solid #aaa; +} +.x-menu-sep { + background:#aaa; +} + +/* grid */ +.x-grid-header{ + background: #ebeadb url(../images/gray/grid/grid-hrow.gif) repeat-x; + overflow:hidden; + position:relative; + cursor:default; + width:100%; +} +.x-grid-hd-row{ + height:22px; +} +.x-grid-hd { + padding-right:1px; +} +.x-grid-hd-over .x-grid-hd-inner { + border-bottom: 1px solid #fcc247; +} +.x-grid-hd-over .x-grid-hd-text { + background: #faf9f4; + padding-bottom:1px; + border-bottom: 1px solid #f9a900; +} + +.x-grid-hd-text { + color:#000000; +} + +.x-grid-col { + border-right: 1px solid #f1efe2; + border-bottom: 1px solid #f1efe2; +} +.x-grid-row-alt{ + background:#fcfaf6; +} +.x-grid-row-over td{ + background:#f1f1f1; +} + + +.x-grid-locked .x-grid-body td { + background: #f0efe4; + border-right: 1px solid #D6D2C2; + border-bottom: 1px solid #D6D2C2 !important; +} + +.x-grid-locked .x-grid-header table{ + border-right:1px solid transparent; +} +.x-grid-locked .x-grid-body table{ + border-right:1px solid #c6c2b2; +} + +.x-grid-bottombar .x-toolbar{ + border-right:0 none; + border-bottom:0 none; + border-top:1px solid #f1efe2; +} + +.x-props-grid .x-grid-col-name{ + background-color: #f1efe2; +} + + + +.x-grid-locked td.x-grid-row-marker, .x-grid-locked .x-grid-row-selected td.x-grid-row-marker{ + background: #ebeadb url(../images/gray/grid/grid-hrow.gif) repeat-x 0 bottom !important; + vertical-align:middle !important; + color:black; + padding:0; + border-top:1px solid white; + border-bottom:none !important; + border-right:1px solid #d6d2c2 !important; + text-align:center; +} +.x-grid-locked td.x-grid-row-marker div, .x-grid-locked .x-grid-row-selected td.x-grid-row-marker div{ + padding:0 4px; + color:black !important; + text-align:center; +} + +/** +* Basic-Dialog +*/ +.x-dlg-proxy { + background-image: url(../images/gray/layout/gradient-bg.gif); + background-color:#EAE8D5; + border:1px solid #b3b6b0; +} +.x-dlg-shadow{ + background:#aaaaaa; +} +.x-dlg-proxy .tabset{ + background:url(../images/gray/layout/gradient-bg.gif); +} +.x-dlg .x-dlg-hd { + background: url(../images/gray/basic-dialog/hd-sprite.gif) repeat-x 0 -82px; + background-color:#333333; +} +.x-dlg .x-dlg-hd-left { + background: url(../images/gray/basic-dialog/hd-sprite.gif) no-repeat 0 -41px; +} +.x-dlg .x-dlg-hd-right { + background: url(../images/gray/basic-dialog/hd-sprite.gif) no-repeat right 0; +} +.x-dlg .x-dlg-dlg-body{ + background:#efefec; + border:1px solid #b3b6b0; + border-top:0 none; +} +.x-dlg .x-tabs-top .x-tabs-body{ + border:1px solid #b3b6b0; + border-top:0 none; +} +.x-dlg .x-tabs-bottom .x-tabs-body{ + border:1px solid #b3b6b0; + border-bottom:0 none; +} +.x-dlg .x-layout-container .x-tabs-body{ + border:0 none; +} +.x-dlg .x-dlg-close { + background-image:url(../images/gray/basic-dialog/close.gif); +} +.x-dlg .x-dlg-collapse { + background-image:url(../images/gray/basic-dialog/collapse.gif); +} +.x-dlg-collapsed .x-dlg-collapse { + background-image:url(../images/gray/basic-dialog/expand.gif); +} +.x-dlg div.x-resizable-handle-east{ + background-image:url(../images/gray/basic-dialog/e-handle.gif); + border:0 none; +} +.x-dlg div.x-resizable-handle-south{ + background-image:url(../images/gray/basic-dialog/s-handle.gif); + border:0 none; +} +.x-dlg div.x-resizable-handle-west{ + background-image:url(../images/gray/basic-dialog/e-handle.gif); + border:0 none; +} +.x-dlg div.x-resizable-handle-southeast{ + background-image:url(../images/gray/basic-dialog/se-handle.gif); + background-position: bottom right; + width:8px; + height:8px; + border:0; +} +.x-dlg div.x-resizable-handle-southwest{ + background-image:url(../images/gray/sizer/sw-handle-dark.gif); + background-position: top right; + margin-left:1px; + margin-bottom:1px; + border:0; +} +.x-dlg div.x-resizable-handle-north{ + background-image:url(../images/gray/s.gif); + border:0 none; +} + +/** +* Tabs +*/ +.x-tabs-wrap { + border-bottom:1px solid #aca899; +} +.x-tabs-strip .on .x-tabs-text { + cursor:default; + color:#333333; +} +.x-tabs-top .x-tabs-strip .on .x-tabs-right { + background: url(../images/gray/tabs/tab-sprite.gif) no-repeat right 0; +} +.x-tabs-top .x-tabs-strip .on .x-tabs-left { + background: url(../images/gray/tabs/tab-sprite.gif) no-repeat 0px -100px; +} +.x-tabs-top .x-tabs-strip .x-tabs-right { + background: url(../images/gray/tabs/tab-sprite.gif) no-repeat right -50px; +} +.x-tabs-top .x-tabs-strip .x-tabs-left { + background: url(../images/gray/tabs/tab-sprite.gif) no-repeat 0px -150px; +} +.x-tabs-strip .x-tabs-closable .close-icon{ + background-image:url(../images/gray/layout/tab-close.gif); +} +.x-tabs-strip .on .close-icon{ + background-image:url(../images/gray/layout/tab-close-on.gif); +} +.x-tabs-strip .x-tabs-closable .close-over{ + background-image:url(../images/gray/layout/tab-close-on.gif); +} +.x-tabs-body { + border:1px solid #aca899; + border-top:0 none; +} +.x-tabs-bottom .x-tabs-wrap { + border-bottom:0 none; + padding-top:0; + border-top:1px solid #aca899; +} +.x-tabs-bottom .x-tabs-strip .x-tabs-right { + background: url(../images/gray/tabs/tab-btm-inactive-right-bg.gif) no-repeat bottom left; +} +.x-tabs-bottom .x-tabs-strip .x-tabs-left { + background: url(../images/gray/tabs/tab-btm-inactive-left-bg.gif) no-repeat bottom right; +} +.x-tabs-bottom .x-tabs-strip .on .x-tabs-right { + background: url(../images/gray/tabs/tab-btm-right-bg.gif) no-repeat bottom left; +} +.x-tabs-bottom .x-tabs-strip .on .x-tabs-left { + background: url(../images/gray/tabs/tab-btm-left-bg.gif) no-repeat bottom right; +} + +.x-tabs-bottom .x-tabs-body { + border:1px solid #aca899; + border-bottom:0 none; +} + +.x-layout-container .x-layout-tabs-body{ + border:0 none; +} +/* QuickTips */ + +.x-tip .x-tip-top { + background-image: url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-top-left { + background-image: url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-top-right { + background-image: url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft { + background-image: url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft-left { + background-image: url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft-right { + background-image: url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-bd-left { + background-image: url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-bd-right { + background-image: url(../images/gray/qtip/tip-sprite.gif); +} + +/* BorderLayout */ + +.x-layout-container{ + background-color:#f3f2e7; +} +.x-layout-collapsed{ + background-color:#f3f2e7; + border:1px solid #aca899; +} +.x-layout-collapsed-over{ + background-color:#fbfbef; +} +.x-layout-panel{ + border:1px solid #aca899; +} +.x-layout-nested-layout .x-layout-panel { + border:0 none; +} +.x-layout-split{ + background-color:#f3f2e7; +} +.x-layout-panel-hd{ + background-image: url(../images/gray/layout/panel-title-light-bg.gif); + border-bottom:1px solid #aca899; +} +.x-layout-tools-button-over{ + border:1px solid #aca899; +} +.x-layout-close{ + background-image:url(../images/gray/layout/panel-close.gif); +} +.x-layout-stick{ + background-image:url(../images/gray/layout/stick.gif); +} +.x-layout-collapse-west,.x-layout-expand-east{ + background-image:url(../images/gray/layout/collapse.gif); +} +.x-layout-expand-west,.x-layout-collapse-east{ + background-image:url(../images/gray/layout/expand.gif); +} +.x-layout-collapse-north,.x-layout-expand-south{ + background-image:url(../images/gray/layout/ns-collapse.gif); +} +.x-layout-expand-north,.x-layout-collapse-south{ + background-image:url(../images/gray/layout/ns-expand.gif); +} +.x-layout-split-h{ + background-image:url(../images/gray/sizer/e-handle-dark.gif); +} +.x-layout-split-v{ + background-image:url(../images/gray/sizer/s-handle-dark.gif); +} +.x-layout-panel .x-tabs-wrap{ + background:url(../images/gray/layout/gradient-bg.gif); +} +.x-layout-nested-layout .x-layout-panel-north { + border-bottom:1px solid #aca899; +} +.x-layout-nested-layout .x-layout-panel-south { + border-top:1px solid #aca899; +} +.x-layout-nested-layout .x-layout-panel-east { + border-left:1px solid #aca899; +} +.x-layout-nested-layout .x-layout-panel-west { + border-right:1px solid #aca899; +} +.x-layout-panel-dragover { + border: 2px solid #aca899; +} +.x-layout-panel-proxy { + background-image: url(../images/gray/layout/gradient-bg.gif); + background-color:#f3f2e7; + border:1px dashed #aca899; +} +/** Resizable */ + +.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east{ + background:url(../images/gray/sizer/e-handle.gif); + background-position: left; +} +.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-west{ + background:url(../images/gray/sizer/e-handle.gif); + background-position: left; +} +.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south{ + background:url(../images/gray/sizer/s-handle.gif); + background-position: top; +} +.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-north{ + background:url(../images/gray/sizer/s-handle.gif); + background-position: top; +} +.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ + background:url(../images/gray/sizer/se-handle.gif); + background-position: top left; +} +.x-resizable-over .x-resizable-handle-northwest,.x-resizable-pinned .x-resizable-handle-northwest{ + background:url(../images/gray/sizer/nw-handle.gif); + background-position:bottom right; +} +.x-resizable-over .x-resizable-handle-northeast,.x-resizable-pinned .x-resizable-handle-northeast{ + background:url(../images/gray/sizer/ne-handle.gif); + background-position: bottom left; +} +.x-resizable-over .x-resizable-handle-southwest,.x-resizable-pinned .x-resizable-handle-southwest{ + background:url(../images/gray/sizer/sw-handle.gif); + background-position: top right; +} +.x-resizable-proxy{ + border: 1px dashed #615e55; +} + +/** Toolbar */ +.x-toolbar{ + border:0 none; + background: #efefe3 url(../images/gray/toolbar/gray-bg.gif) repeat-x; + padding:3px; +} +.x-toolbar .x-btn-over .x-btn-left, .x-toolbar .x-btn-pressed .x-btn-left, .x-toolbar .x-btn-menu-active .x-btn-left{ + background:url(../images/gray/toolbar/tb-btn-sprite.gif) no-repeat 0 0; +} +.x-toolbar .x-btn-over .x-btn-right, .x-toolbar .x-btn-pressed .x-btn-right, .x-toolbar .x-btn-menu-active .x-btn-right{ + background:url(../images/gray/toolbar/tb-btn-sprite.gif) no-repeat 0 -21px; +} +.x-toolbar .x-btn-over .x-btn-center, .x-toolbar .x-btn-pressed .x-btn-center, .x-toolbar .x-btn-menu-active .x-btn-center{ + background:url(../images/gray/toolbar/tb-btn-sprite.gif) repeat-x 0 -42px; +} +.x-toolbar .x-btn-over .x-btn-menu-arrow-wrap .x-btn-center button { + background-position: 0 -47px; +} +.x-paging-info { + color:#222222; +} + +/* combo box */ +.x-combo-list { + border:1px solid #999; + background:#dddddd; +} +.x-combo-list-hd { + color:#222; + background-image: url(../images/gray/layout/panel-title-light-bg.gif); + border-bottom:1px solid #aca899; +} +.x-resizable-pinned .x-combo-list-inner { + border-bottom:1px solid #aaa; +} +.x-combo-list .x-combo-selected{ + background:#ddd !important; + border:1px solid #aaa; +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/ytheme-vista.css b/www/extras/yui-ext/resources/css/ytheme-vista.css new file mode 100644 index 000000000..c9b5e590e --- /dev/null +++ b/www/extras/yui-ext/resources/css/ytheme-vista.css @@ -0,0 +1,511 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +.ext-el-mask-msg { + border:1px solid #aaa; + background: #ddd url(../images/default/box/tb.gif) repeat-x 0 -16px; +} +.ext-el-mask-msg div { + border:1px solid #ccc; +} +/* + Menu + */ +.x-menu { + border-color: #999 #999 #999 #999; + background-image:url(../images/gray/menu/menu.gif); +} +.x-menu-item-arrow{ + background-image:url(../images/gray/menu/menu-parent.gif); +} +.x-menu-item { + color:#222; +} +.x-menu-item-active { + background:#ddd; + border:1px solid #aaa; +} +.x-menu-sep { + background:#aaa; +} +/** +* Tabs +*/ +.x-tabs-wrap { + background:#4f4f4f; + border-bottom:1px solid #b3b6b0; +} +.x-tabs-strip .x-tabs-text { + color:white; + font-weight:normal; +} +.x-tabs-strip .on .x-tabs-text { + cursor:default; + color:#333333; +} +.x-tabs-top .x-tabs-strip a.x-tabs-right { + background:transparent url(../images/vista/tabs/tab-sprite.gif) no-repeat right -50px; +} +.x-tabs-top .x-tabs-strip a .x-tabs-left{ + background:transparent url(../images/vista/tabs/tab-sprite.gif) no-repeat 0px -150px; +} +.x-tabs-top .x-tabs-strip .on .x-tabs-right { + background: url(../images/vista/tabs/tab-sprite.gif) no-repeat right 0; +} +.x-tabs-top .x-tabs-strip .on .x-tabs-left{ + background: url(../images/vista/tabs/tab-sprite.gif) no-repeat 0px -100px; +} +.x-tabs-strip .x-tabs-closable .close-icon{ + background-image:url(../images/vista/layout/tab-close.gif); +} +.x-tabs-strip .on .close-icon{ + background-image:url(../images/vista/layout/tab-close-on.gif); +} +.x-tabs-strip .x-tabs-closable .close-over{ + background-image:url(../images/vista/layout/tab-close-on.gif); +} +.x-tabs-body { + border:1px solid #b3b6b0; + border-top:0 none; +} + +.x-tabs-bottom .x-tabs-strip { + background:#4f4f4f; +} +.x-tabs-bottom .x-tabs-strip a.x-tabs-right { + background:transparent url(../images/vista/tabs/tab-btm-inactive-right-bg.gif) no-repeat bottom right; +} +.x-tabs-bottom .x-tabs-strip a .x-tabs-left{ + background:transparent url(../images/vista/tabs/tab-btm-inactive-left-bg.gif) no-repeat bottom left; +} +.x-tabs-bottom .x-tabs-wrap { + border-bottom:0 none; + padding-top:0; + border-top:1px solid #b3b6b0; +} +.x-tabs-bottom .x-tabs-strip .on .x-tabs-right { + background: url(../images/vista/tabs/tab-btm-right-bg.gif) no-repeat bottom left; +} +.x-tabs-bottom .x-tabs-strip .on .x-tabs-left { + background: url(../images/vista/tabs/tab-btm-left-bg.gif) no-repeat bottom right; +} + +.x-tabs-bottom .x-tabs-body { + border:1px solid #b3b6b0; + border-bottom:0 none; +} +/** +* Basic-Dialog +*/ +.x-dlg-proxy { + background:#d3d6d0; + border:2px solid #b3b6b0; +} +.x-dlg-shadow{ + background:#cccccc; + opacity:.3; + -moz-opacity:.3; + filter: alpha(opacity=30); +} +.x-dlg .x-dlg-hd { + background: url(../images/vista/basic-dialog/hd-sprite.gif) repeat-x 0 -82px; + background-color:#333333; + zoom:1; +} +.x-dlg .x-dlg-hd-left { + opacity:.95;-moz-opacity:.95;filter:alpha(opacity=90); + background: url(../images/vista/basic-dialog/hd-sprite.gif) no-repeat 0 -41px; + zoom:1; +} +.x-dlg .x-dlg-hd-right { + background: url(../images/vista/basic-dialog/hd-sprite.gif) no-repeat right 0; + zoom:1; +} +.x-dlg .x-dlg-dlg-body{ + background:#fff; + border:0 none; + border-top:0 none; + padding:0 0px 0px; + position:absolute; + top:24px;left:0; + z-index:1; +} +.x-dlg-auto-tabs .x-dlg-dlg-body{ + background:transparent; +} +.x-dlg-auto-tabs .x-tabs-top .x-tabs-wrap{ + background:transparent; +} +.x-dlg .x-dlg-ft{ + border-top:1px solid #b3b6b0; + background:#F0F0F0; + padding-bottom:8px; +} +.x-dlg .x-dlg-bg{ + opacity:.90;-moz-opacity:.90;filter:alpha(opacity=85); + zoom:1; +} +.x-dlg .x-dlg-bg-left,.x-dlg .x-dlg-bg-center,.x-dlg .x-dlg-bg-right{ +} +.x-dlg .x-dlg-bg-center { + padding: 0px 4px 4px 4px; + background:transparent url(../images/vista/basic-dialog/bg-center.gif) repeat-x bottom; + zoom:1; +} +.x-dlg .x-dlg-bg-left{ + padding-left:4px; + background:transparent url(../images/vista/basic-dialog/bg-left.gif) no-repeat bottom left; + zoom:1; +} +.x-dlg .x-dlg-bg-right{ + padding-right:4px; + background:transparent url(../images/vista/basic-dialog/bg-right.gif) no-repeat bottom right; + zoom:1; +} +.x-dlg .x-tabs-top .x-tabs-body{ + border:0 none; +} +.x-dlg .x-tabs-bottom .x-tabs-body{ + border:1px solid #b3b6b0; + border-bottom:0 none; +} +.x-dlg .x-layout-container .x-tabs-body{ + border:0 none; +} +.x-dlg .x-dlg-close { + background-image:url(../images/vista/basic-dialog/close.gif); +} +.x-dlg .x-dlg-collapse { + background-image:url(../images/vista/basic-dialog/collapse.gif); +} +.x-dlg-collapsed .x-dlg-collapse { + background-image:url(../images/vista/basic-dialog/expand.gif); +} +.x-dlg div.x-resizable-handle-east{ + background-image:url(../images/vista/s.gif); + border:0 none; +} +.x-dlg div.x-resizable-handle-south{ + background-image:url(../images/vista/s.gif); + border:0 none; +} +.x-dlg div.x-resizable-handle-west{ + background-image:url(../images/vista/s.gif); + border:0 none; +} +.x-dlg div.x-resizable-handle-southeast{ + background-image:url(../images/vista/s.gif); + background-position: bottom right; + width:8px; + height:8px; + border:0; +} +.x-dlg div.x-resizable-handle-southwest{ + background-image:url(../images/vista/s.gif); + background-position: top right; + margin-left:1px; + margin-bottom:1px; + border:0; +} +.x-dlg div.x-resizable-handle-north{ + background-image:url(../images/vista/s.gif); + border:0 none; +} + +/* QuickTips */ + +.x-tip .x-tip-top { + background-image: url(../images/vista/qtip/tip-sprite.gif); +} +.x-tip .x-tip-top-left { + background-image: url(../images/vista/qtip/tip-sprite.gif); +} +.x-tip .x-tip-top-right { + background-image: url(../images/vista/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft { + background-image: url(../images/vista/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft-left { + background-image: url(../images/vista/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft-right { + background-image: url(../images/vista/qtip/tip-sprite.gif); +} +.x-tip .x-tip-bd-left { + background-image: url(../images/vista/qtip/tip-sprite.gif); +} +.x-tip .x-tip-bd-right { + background-image: url(../images/vista/qtip/tip-sprite.gif); +} + +.x-tip .x-tip-bd-inner { + padding:2px; +} + +/* BorderLayout */ +.x-layout-container{ + background:#4f4f4f; +} +.x-layout-collapsed{ + background-color:#9f9f9f; + border:1px solid #4c535c; +} +.x-layout-collapsed-over{ + background-color:#bfbfbf; +} +.x-layout-panel{ + border:1px solid #4c535c; +} +.x-layout-nested-layout .x-layout-panel { + border:0 none; +} +.x-layout-split{ + background-color:#f3f2e7; +} +.x-layout-panel-hd{ + background-image: url(../images/vista/layout/panel-title-bg.gif); + border-bottom:1px solid #b5bac1; + color:white; +} +.x-layout-panel-hd-text{ + color:white; +} +.x-layout-tools-button-over{ + border:1px solid #4c535c; + background:#9f9f9f url(../images/vista/layout/panel-title-bg.gif) repeat-x; +} +.x-layout-close{ + background-image:url(../images/vista/layout/tab-close.gif); +} + +.x-layout-stick{ + background-image:url(../images/vista/layout/stick.gif); +} +.x-layout-collapse-west,.x-layout-expand-east{ + background-image:url(../images/vista/layout/collapse.gif); +} +.x-layout-expand-west,.x-layout-collapse-east{ + background-image:url(../images/vista/layout/expand.gif); +} +.x-layout-collapse-north,.x-layout-expand-south{ + background-image:url(../images/vista/layout/ns-collapse.gif); +} +.x-layout-expand-north,.x-layout-collapse-south{ + background-image:url(../images/vista/layout/ns-expand.gif); +} +.x-layout-split-h{ + background:#9f9f9f; +} +.x-layout-split-v{ + background:#9f9f9f; +} +.x-layout-panel .x-tabs-wrap{ + background:#4f4f4f; +} +.x-layout-nested-layout .x-layout-panel-north { + border-bottom:1px solid #4c535c; +} +.x-layout-nested-layout .x-layout-panel-south { + border-top:1px solid #4c535c; +} +.x-layout-nested-layout .x-layout-panel-east { + border-left:1px solid #4c535c; +} +.x-layout-nested-layout .x-layout-panel-west { + border-right:1px solid #4c535c; +} +.x-layout-panel-dragover { + border: 2px solid #4c535c; +} +.x-layout-panel-proxy { + background-image: url(../images/vista/layout/gradient-bg.gif); + background-color:#f3f2e7; + border:1px dashed #4c535c; +} + +.x-layout-container .x-layout-tabs-body{ + border:0 none; +} +/** Resizable */ + +.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east{ + background:url(../images/vista/sizer/e-handle.gif); + background-position: left; +} +.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-west{ + background:url(../images/vista/sizer/e-handle.gif); + background-position: left; +} +.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south{ + background:url(../images/vista/sizer/s-handle.gif); + background-position: top; +} +.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-north{ + background:url(../images/vista/sizer/s-handle.gif); + background-position: top; +} +.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ + background:url(../images/vista/sizer/se-handle.gif); + background-position: top left; +} +.x-resizable-over .x-resizable-handle-northwest,.x-resizable-pinned .x-resizable-handle-northwest{ + background:url(../images/vista/sizer/nw-handle.gif); + background-position:bottom right; +} +.x-resizable-over .x-resizable-handle-northeast,.x-resizable-pinned .x-resizable-handle-northeast{ + background:url(../images/vista/sizer/ne-handle.gif); + background-position: bottom left; +} +.x-resizable-over .x-resizable-handle-southwest,.x-resizable-pinned .x-resizable-handle-southwest{ + background:url(../images/vista/sizer/sw-handle.gif); + background-position: top right; +} +.x-resizable-proxy{ + border: 1px dashed #615e55; +} + +/** Toolbar */ +.x-toolbar{ + border:0 none; + background: #efefe3 url(../images/vista/toolbar/gray-bg.gif) repeat-x; + padding:3px; +} +.x-toolbar .ytb-button-over{ + border:1px solid transparent; + border-bottom:1px solid #bbbbbb; + border-top:1px solid #eeeeee; + background:#9f9f9f url(../images/vista/grid/grid-vista-hd.gif) repeat-x; +} + +.x-paging-info { + color:#000; +} +/* grid */ +.x-grid-topbar .x-toolbar{ + border:0; + border-bottom:1px solid #555; +} +.x-grid-bottombar .x-toolbar{ + border:0; + border-top:1px solid #555; +} +.x-grid-locked .x-grid-body td { + background: #fafafa; + border-right: 1px solid #e1e1e1; + border-bottom: 1px solid #e1e1e1 !important; +} +.x-grid-locked .x-grid-body td .x-grid-cell-inner { + border-top:0 none; +} +.x-grid-locked .x-grid-row-alt td{ + background: #f1f1f1; +} +.x-grid-locked .x-grid-row-selected td{ + color: #fff !important; + background-color: #316ac5 !important; +} +.x-grid-hd{ + border-bottom:0; + background:none; +} +.x-grid-hd-row{ + height:auto; +} +.x-grid-split { + background-image: url(../images/vista/grid/grid-split.gif); +} +.x-grid-header{ + background: url(../images/vista/grid/grid-vista-hd.gif); + border:0 none; + border-bottom:1px solid #555; +} +.x-grid-row-alt{ + background-color: #f5f5f5; +} +.x-grid-row-over td{ + background-color:#eeeeee; +} +.x-grid-col { + border-right: 1px solid #eee; + border-bottom: 1px solid #eee; +} +.x-grid-header .x-grid-hd-inner { + padding-bottom: 1px; +} +.x-grid-header .x-grid-hd-text { + padding-bottom: 3px; + color:#333333; +} +.x-grid-hd-over .x-grid-hd-inner { + border-bottom: 1px solid #555; + padding-bottom: 0; +} +.x-grid-hd-over .x-grid-hd-text { + background-color: #fafafa; + border-bottom: 1px solid #555; + padding-bottom: 2px; +} +.x-grid-header .sort-asc .x-grid-hd-inner, .x-grid-header .sort-desc .x-grid-hd-inner { + border-bottom: 1px solid #555; + padding-bottom: 0; +} +.x-grid-header .sort-asc .x-grid-hd-text, .x-grid-header .sort-desc .x-grid-hd-text { + border-bottom: 1px solid #3b5a82; + padding-bottom: 2px; +} +.x-dd-drag-proxy .x-grid-hd-inner{ + background: url(../images/vista/grid/grid-vista-hd.gif) repeat-x; + height:22px; + width:120px; +} +.x-props-grid .x-grid-col-name{ + background-color: #eee; +} +/* toolbar */ +.x-toolbar .ytb-sep{ + background-image: url(../images/vista/grid/grid-split.gif); +} + +.x-toolbar .x-btn-over .x-btn-left{ + background:url(../images/vista/toolbar/tb-btn-sprite.gif) no-repeat 0 0px; +} +.x-toolbar .x-btn-over .x-btn-right{ + background:url(../images/vista/toolbar/tb-btn-sprite.gif) no-repeat 0 -21px; +} +.x-toolbar .x-btn-over .x-btn-center{ + background:url(../images/vista/toolbar/tb-btn-sprite.gif) repeat-x 0 -42px; +} + +.x-toolbar .x-btn-click .x-btn-left, .x-toolbar .x-btn-pressed .x-btn-left, .x-toolbar .x-btn-menu-active .x-btn-left{ + background:url(../images/vista/toolbar/tb-btn-sprite.gif) no-repeat 0 -63px; +} +.x-toolbar .x-btn-click .x-btn-right, .x-toolbar .x-btn-pressed .x-btn-right, .x-toolbar .x-btn-menu-active .x-btn-right{ + background:url(../images/vista/toolbar/tb-btn-sprite.gif) no-repeat 0 -84px; +} +.x-toolbar .x-btn-click .x-btn-center, .x-toolbar .x-btn-pressed .x-btn-center, .x-toolbar .x-btn-menu-active .x-btn-center{ + background:url(../images/vista/toolbar/tb-btn-sprite.gif) repeat-x 0 -105px; +} + +/* combo box */ +.x-combo-list { + border:1px solid #999; + background:#dddddd; +} +.x-combo-list-hd { + background-image: url(../images/vista/layout/panel-title-bg.gif); + border-bottom:1px solid #b5bac1; + color:white; +} +.x-resizable-pinned .x-combo-list-inner { + border-bottom:1px solid #aaa; +} +.x-combo-list .x-combo-selected{ + background:#ddd !important; + border:1px solid #aaa; +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/images/aero/basic-dialog/aero-close-over.gif b/www/extras/yui-ext/resources/images/aero/basic-dialog/aero-close-over.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ed8d815fdecf34c73fd1fba5a83f992f41607fe GIT binary patch literal 1109 zcmeH`+fNi{7{+G<1k`{C9%$;3;(2W>#im%br0R;NNDT2nVuBZ#mBb6HNo}HW*GgC; z^;BwJg%FWsL{hRc5az2*4D+b93LbE@e<9ogw{JwMy>H~B0^b~4RwuGyU+ zyEw8d(d-e(E}ryCRA-EGvo24Zc7LF|7}~?!@tFGDa8M*m0Tw-GcD(f^CU+o(P~js~OfE`~-K6lBmyOdn+- z7>5vx##j`J!+TB-bNYJ`!V*Mz6yXi)(Fx;m0mdbW3BZVYOoW(Z6krTXm`MUF>a1h{ zaS7NY#AVE?z$Jl`aYBZKjCmP&84C&s3KkF+6%Z9Hs#sD$QVp=I>PZ!nDo$#U)Ud39 zY#8BW3M;CnXu67YMFT~{3IYXT6@iMdhIGv+DXi*POM#ZcC9HQ&s;JZ`*ZG{i>?QV@ES{sWN-+!9hos>)NIz zg|konvH1Lg^$i83Rag1YoQ?B0Tq-%UbKzFY*E8ylRXDQeuBp#iRV%hy1JutsCq^Rq zQ*A99=B>@JRW40mTN~{!Eh-~y<;26EmQ`l$AhW+{tIb|rP1rgv_%Aa-yZuVhzK7m3 z-#To=>yIn<54$q9XJ-B)uyZP@Z>rs=0}Xrn>L$%J*Y+2@dAxV|m*4H`wOT9G_NKH} zOs%U3AF)oG+%f-RVTPUg@esVRtUS;#y?FYf?i(vC+nP!ajdYd{p?i+>-RDXU7T0XK zY~J7g+dz)LXV#P%%}Q}@AzeQ0D@&t!uaka~S6H!<{*dsWCpVrg+U%^nnfDiNH0Svy Sn~JJO>{*Mf)r84J{O}RVW)egI literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/basic-dialog/aero-close.gif b/www/extras/yui-ext/resources/images/aero/basic-dialog/aero-close.gif new file mode 100644 index 0000000000000000000000000000000000000000..c61d29f20d534f8d86ea34158af7f3a0dcc7e08d GIT binary patch literal 882 zcmeH`OKTHh6o$W2(da_KqPS3~MG(Y=%Zi(V;AJJ~O6a04x)AyU6bcrLq<8}tiVDq4 zlh{geQB(vGw3A8Nrg&-U1=7}3o1}53Gn2{8H`i~zbDaDJx4t|)ysLL{;G8{wruXEP zF49GkgbWT2_F>=kdsD*?Ufg*2>gLn8w}jcT%>13HkHQB{nAKB~nUY#U&J=R3lxzz* zOUOIotR_lEMs8-MKiQm~mG$YoBFa`qHq){#$~2R=GI=|lr|AMs&(Un&%oeO{fle;a z=L`1qVhnvbUwyM!eO;`-`&57b)sU7O(l?{&8kidkAWOB<|I zjY>7XT!V6h{ZzbFg_RY)qQI)k*SFZ33coeBp|h&aerbHefNB$J2CEya)`U%yH%z`s zq2YjPF~y3_)wXfVhAjs)8+6Jw3Yrra&|^EOyI@dmI5E(4z;L1Ip%H-Tg6Uz)gO-Pu z2bPDn54MjsL+S(dkp}4a-~=(~1>6n54bTn24bcn1i_OrD&<{dCyiYfMXaz7$J**#pW2r074A5L;mL|gbdvP!zMB}BARYTU`iFW4$jJRYJI96(h$F@1_KTB4*TiSzk9O?ud3^Qg a$oP}Q-j(v@OWj{mM@DxYx_zRXocar<rib^&FtIUXAq9qpDd&bo7Ae}+*o8UiCM1QdU=Ff%YPGw6W)4ayS? z9RC>@IXE09EI81_#;#Dz?A1kpGPCGHh%>C4!ox$q9^XzM%9f{nmabcltr<|$Ql$Dp3c`tUF`)fw6MU`kk0EQzm){t$gAq#>>#)z~o}t MFxlTuQh>o40K47T;{X5v literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/basic-dialog/bg-right.gif b/www/extras/yui-ext/resources/images/aero/basic-dialog/bg-right.gif new file mode 100644 index 0000000000000000000000000000000000000000..c605caeebe57cdd1ae0dd8a1e9b82bb7b7460ed5 GIT binary patch literal 1202 zcmZ?wbhEHbWM`Pm($2upvf#+6d*45N|Mma>e}+*o8UiCM1QdU=Ff%YPGw6W)4ayS? z9RC@ZIYcxV4mdQi@r&6=BrH7C!Yu37(lKG-kuHASpqw2amE3z3jJxJYOnTzcqZYg< z=I6&0@2UEcRda4`O!J&+7JF%r@#D-^Kn}Z!5fUqEOsl?$3^*M;GRrr`yF;mA*PX zKl;2~to64S_qR9qfA`zB`{(PY7w11;x6k(X_s7?dm)pzl`|NUT0BdN#YU4(MK)j5fjekZ2PC;cAJDxQR~GAbOH?90b+ NU`jBbfrA5sH30of+E4%h literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/basic-dialog/close.gif b/www/extras/yui-ext/resources/images/aero/basic-dialog/close.gif new file mode 100644 index 0000000000000000000000000000000000000000..4278db9835cf57d9c0e759204d9b7d2add221dc0 GIT binary patch literal 350 zcmZ?wbhEHbC>mi#>VpU^3c%G z*x1;Lii(nwlE}!&va+)3>gr#=ekCO(J$drP-Q7JuKR-S`-rnB6y}iAusj0rczPPy9 z$jInF5HK)UTU#^G5-9#;VPs&CXV3vz0`e0BTlE3|bPpXN`vvW3Cv&po6fUT3Tp6|Y zipKGSFRS+6$yi{pP(v+)H8qICg}=M8HEH5y_HJj9fS23?f*ee>q72m%9TL1kyqywl z3Os=d;&K9V;*%#SFa=JXIX`f&f>@x)%y}Y#OBLAM*0Tk&taoEclH9R#mt>yDDa%(<}?OG@6;F+gzJxXJ_YS=jFHa{5t*(-S*|fhws(*;(_O2d1+x$ z%^G42ArgeiWZH}O*5B#AbnoTmw!Ui*-`+6WZ&`<%x<}0)D6>7<>0mk?akG;#JL8=s zXLhn?mte6|76)x5V>ZVhn=@)7qdl&$g=DQH(?xO?lDE28tBdP$@m+4dYlyeG7@M25 zx%p=w`R5tX+!PyYUq;NX|w`){J+e;EzFoMnM_{ zVldCBAx53&AtXSAMPXL68d)@6;9x-jii0SxQan(CRv@Zbz|jQIyh;li5EFn-KupB6 z3`_zT5ywS{i)Js2?dJ^h?)^jB(Wqb zlA_8;l@yQ^EFq8(mJ!GZD@awelEku#l_V%hjFNyft2n6v7&P!=i2wPA3+Ux#I)cy< z+ZHz#e}YK$6HDJ^l=WI1S9Qkm2d>_yxFYE&F-d*?UVJ_bDa9Z`jW==TiClf zt1^pQPIe5RzLj$0$M25vKEt7+n|ti7b$y#MA7^F%sXW&G++!_`^S=nu&lqz}`T2#9j$ipTcz&jR_0#GVXey?oV1fgUfb*7=k_O;ULBdey;5J&n7*TS|47Tmile#uCCm3U kW}Zz-C;H1;HdM52t(-hmSJ}E&mzJ7!_}u_Q=yb%czXu5PUH||9 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/basic-dialog/collapse.gif b/www/extras/yui-ext/resources/images/aero/basic-dialog/collapse.gif new file mode 100644 index 0000000000000000000000000000000000000000..d7a3b369b04c018e9165f5a7cf2e0489f8733d43 GIT binary patch literal 851 zcmeH`O=}ZT6o#kPMQ|mg3l}aFcg2P76gS0%t^NbSjY$52AP9<56pM=@ZbULM8LX5p zS`|SA&15ERQdFAy0kJjJd^FBv=4LW;=i|eXzUi0LNE9-ut zY!y^e(uRuqN2%C~W-seTL32x*Q`EeIMoYR|(!HWii&a`&r;6?;y4_d5lIk~e{kvIjTAz2xR?FFHjT$YdvF9|}ywOP-U9sJT zW}p8w!X1M*4e`T(9aHQL_^t`RE#9_y$L7B*(I(ItLYMF!;oTwZJEHH1eF}XaOqUyO zYGICz0}lp1SRU9^SQIQjEnuhi(GGx6LHraL`al90hDaDV0XQL!LKubUhTw+iMc_r~ zaikH@2q{B90-vQ|$V9*(U>L*@#2Cg9rsfzV7_m5t1>+)$A&N2L5OHK27{{24I4ub> zfpG$Hf;<79T40g_2q`#@^gsV_f#dApgd|N!C&wG(pO7-Aq{+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/aero/basic-dialog/expand-over.gif b/www/extras/yui-ext/resources/images/aero/basic-dialog/expand-over.gif new file mode 100644 index 0000000000000000000000000000000000000000..96a6be88ce9935ec5d732c4e38c9d567bd06317e GIT binary patch literal 1044 zcmeH`*-KPm7{-q#Sb|XqW>ltvky}DhsD)`vZYhKpky2EUAVn8Jghn7rqG?u|l?pkN zGc;vEq9U|Vv$~b#m_{zCIqEp$%$YN1nX`Oz-ml}|&}|Ptemqyt#S3q4eok8Yr3fN| z;0dCvtSk#>RW|8wH@~TR+*i}_u2yZR*A6x6zp6jG)do+ek?J)1)Fw)8@^zXSwTV_+ zIE}%rF_K!dS7%()nLIkPr`zJxm}#w<>M}DLGpn`GS_{)C8#^n)}`IE<5|b;>pP(={^f{x(OB&r{>`KHEHHTcB)9 z$Yu}NmgR|Mn0BDwPJY&jrk(PP6J}lV!aACB!5=qT@*ukhExP3;66{`BCeaFsmc6h_ z$qq_hWx>ILi$+dbvFzF~UT0vP12+R6R(7-C=9B^+#T@qdfn;TpQvfdqq#wLICPkq9 zK=IhegOA5F4>XS%0T=-@2(tpP0%k?b3BZX8m=|Tg2!0X!CGbm_mw;D{us?tWQ4%Cs zM6w`(AYlQ4fUt-_L|8(yq?7;_Wh@0i3Sblfq*%rQ1;C(yH$wc+KU^SI3<)BLAR>8V zW8)`?%|2q&$Eds>jj=kYbh6FT^W0o_xU{w6M(9IpV^r!)<()WFY+B`shTRGD{kUz> z*)8YVhc4HL*8W;-&+pq;lwOxJIM6a&<>ac}5x)_9VHauRJ$-%@oo|Bv&v?V-41Vo#EkYGgGgh zzP+$LY#^q&xBvQ?gyP}TZJM(U&%U%BnyoI(QPm{ncGO1~-Rggo8ku;^7pux^j?1~X vzob`n_gcJ4b1~0mZ`ymjF*3hJ^{P0&U^pSAp*Jq8#xbrvRTUi*Lmd4JF>3pk literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/basic-dialog/expand.gif b/www/extras/yui-ext/resources/images/aero/basic-dialog/expand.gif new file mode 100644 index 0000000000000000000000000000000000000000..ebeef99b66afe6acafb462095d090cc06726a044 GIT binary patch literal 875 zcmeH`OKTHh6o#iL7+f}+7V1Jl5b4fMiy~dsv_HU=8&T;Y^-1_qH@UGs)fpcMQc53=^oQrcV z$0d`=8JxNCAb<1GtJ{y)7oWbn%NOovH<$CD_>U@I&{Bet5(a$H;ERKlXz@jpm+W*w zO$&Nf?B|3(xuTX6wN*(@i)L0dGNP3hNmeqml9iE2rbIFuBqtfUl9?-!7iIFYY^`oZ zkk^~7w_B|@mCpO^&WA6$u-g^B>ZNbW#&@MsQ$N@BorbZ~7*rcZb>FBqX|)wr+ibTD zwJ!ZByL&RN$?S&=dkWj{(YgY^Roc{OOQXM3*3_ZZhqg{TI&Jsiz+hd29T4c+pqNxP zBQs@a>{-yWLA5|5OeLV&Q2{NojhX{GVY(dweH(NK`Y!4|7!DXN4qOW@0Gt5b0NltFoe(`g@B-#j<^|vd=uz+}`V@SM0cAl{ zLi8C1Ap{}P5NKqEVFVyV;4s|({KEx~`-ew3ZiJg0ZVZ2dizT>2v5CZ5T3Cw3PhTpp zt%&!y6Z6ln9$8sf9y@dK+^IrycInvkt;w;`c4G15Tx#OUXlMS;_?4sA#|sa)pG{pm MU$3m^g$3^HU&wH)E&4&%fP$@$LSLZx3I7d-Uqtlh@xqeE-ET3PwXxYGouC}?6~5LRMnW%$Av!0sT;kjhZP7{KZv%;3uKg&~01 zftx{@FTAo(hK!kcJqI-x^a7fe)E2ACT)p1 k3k;eLvkOT_#4IpuJkG4-J4q>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#FOV literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/basic-dialog/w-handle.gif b/www/extras/yui-ext/resources/images/aero/basic-dialog/w-handle.gif new file mode 100644 index 0000000000000000000000000000000000000000..d59eafc2076a5a40099bd26d7457a73ba9bc9ac5 GIT binary patch literal 817 zcmZ?wbhEHbWMN=oXlG#1*VlJ&aPal@O-oB-7zLvtFv3DW@h1z=$Nw30K>h~h2?h>6 U21X7E0S5)gW>$7K4h{xu0Q^P?w*UYD literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/gradient-bg.gif b/www/extras/yui-ext/resources/images/aero/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/aero/grid/grid-blue-split.gif b/www/extras/yui-ext/resources/images/aero/grid/grid-blue-split.gif new file mode 100644 index 0000000000000000000000000000000000000000..5286f58f6f798184c3eeacba1352cfd39b9ae03e GIT binary patch literal 817 zcmZ?wbhEHbWMbfDXlG!Ub?iS7FpPrH5Ezjmp!kyo==$`@NUn@4xcl;MEU@u6;Oi#l_<(QpFT5;g3%Bd$|0cmlLhGf{|q`H nPk{0S1BVoYrq2Wc#zV~Pyb=r?3JDC2Ol*7#9t#p29T=p zJcax;g_4ZSVuiHK)SMIrMuz{RU^E1Veh3Hyb1Enc>n7!trXpqG6OwnmIgc}P0i~IM zm=}mSfEWY}nIU3~KsG1<`hg1m-}wK4LBPw+(~W_ViIE{12pRq#U=ZX0>SSVO6l7o$ zWMmd({C}IFg@KKQm5r5!jg6I!ot=$?OOTt3laou7Uw}tYQcOxpLQFzjT3$m@T2@s~ zTtZ1-SyfX@M^{H$(a^*|+eAZKN1KtIot=x5ON5(SL|aBeMn;=d@c#(oA_fLVRz@%Y z`w2)eGBE=k#?HaX#Vx?V#K_Fd#KO$V%EAJasRhb0un4jWDH=Mm2?r*!D;0_uHBMZ} zq3pErplHy=4=Tnkx|Jh zscGpMnOVgprDf$6l~v6xt!?ccon4bAPnkMx`iz;g7A;<~blLJ1D_3pWyk+aQ?K^hv zI&}ER(PPI?oIG{u@|COCuHU$M>*1rvPo6$|{^I4UkDoq&`TFhqkDtF78JHp70g@0O zA^8Uw{ESR2EX*wIApbBjm4iGh$ik{<$R^|%$evgztYp;4A>uS~;l_iU%Emz-M3agx za*3&!JXHM%@)Fob#CfQREFZx=1ozMXTMRtRjKE~WEXZKb@T=bQKf{F3>3<9T|FVQ_ z{m;;?AC~U@qwou_`aj38_^(IpzX-b4KRSK2RsZ4f3;%C|k}Eh>XB6d^gQ}#4`mMe- zevtGG3Lj-4hNWj`wDjDFH$5veFpj3@(e#WzhZ0QB?QfY@PnkXE{n#5nF1Xe{)o-kl*A9MEw{S`Q3ANMzcBubr(pdUI-(lrP`{4gK1!1YVEVH;IQ8yz6 z+)Y4gV}QzJQKT~27OhM!$D5!;KPCE45Jg ztq9})oBY6JS)5-~qMMwbqnnftZcY5QxbCNgD2m09Qf@d}%B{zna>Yhl$D=8i;*_g@ z=KH#H!PB1l8{gah)OhFAzYFER$A1#N{zmfr+ra-fd7vpcKCw6%T<~7jX19YTUr#}!AeC@mUpC_Dnajbt+-uKtJ`G4!9XPOt*&U=+np7-g_y273ZkM`TI_r4iA z)%xDq^*er?`m%RwWbocMw|@6SI)k7BJU%5AlKvamH(#~Ik^UXg(*K^(^glYd0UNEM z&EUot@r~Q&xm`)^FgbBB(*N$nK94ln6Ss`0w!X<41;3Fd70QG6WQVvM_@@t^*=Kd4hpMoq>@<#$&^R ngUt*~JRuPV49@Mm@`0w!X<41;3Fd70QG6WQVvM_=?t^*=Kd4hpMoq>@<#$&^R ngH4QVY9mEVcn)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/aero/layout/ns-collapse.gif b/www/extras/yui-ext/resources/images/aero/layout/ns-collapse.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2ad235dad390e71a096e2e943ade1f22c1de113 GIT binary patch literal 842 zcmZ?wbhEHb`0w!X<41;3Fd70QG6WQVvM_@@t^*=Kd4hpMoq>@<#$&?* n$7V)8E}jD)5)QYqC^Aiu2z=<$#VoJZv*Y8Uqy4PRObpfl%OVxB literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/layout/ns-expand.gif b/www/extras/yui-ext/resources/images/aero/layout/ns-expand.gif new file mode 100644 index 0000000000000000000000000000000000000000..0817ec66fd410022c495adacc4855a4cc548ce0f GIT binary patch literal 843 zcmZ?wbhEHb`0w!X<41;3Fd70QG6WQVvM_=?t^*=Kd4hpMgMpDl#$&^R ogN=+#3Lzc_iVW>+!bUb08y~uKaLb3q?AZA5V7~%88w-Oq0L1MSzyJUM literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/layout/panel-close.gif b/www/extras/yui-ext/resources/images/aero/layout/panel-close.gif new file mode 100644 index 0000000000000000000000000000000000000000..4e96481a1fdb16a6f332ae06e138f15ac24fcc03 GIT binary patch literal 829 zcmZ?wbhEHbWM^P!XlGzZj0<)6@9^Z&RfbV88UiCP1QdU=Ff%YPGU$N34$2b@98wI7 f92^b-4GxWrJbWP?8xjt;u!}3DSX@YSV6X-NNAwV) literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/layout/panel-title-bg.gif b/www/extras/yui-ext/resources/images/aero/layout/panel-title-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..89eb514b5d8e138056dee082981c6c74e8b5088e GIT binary patch literal 830 zcmZ?wbhEHbWMmLyXlG#HH%t~Z%Mr0I6?3eUbZeLPo+uYEOEzesT<~J~(4`7tixt9_ zD}=99j9jf0wN^QLjdIL-<=BlX@tai>wla)@(GVEoA)xq^1?YqS3_2ixfbs+bhctt_ fM+d_}M`ku|Aq5Ktg@y)37A}c^4+%^S4Gh)*fw>?P literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/layout/panel-title-light-bg.gif b/www/extras/yui-ext/resources/images/aero/layout/panel-title-light-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f4c44ce09ad347d796b7050e06d75fa043d3783b GIT binary patch literal 833 zcmZ?wbhEHbWMoigXlGzJd++mw2VX8f`f}~b*PGA2-Ffl-{;Thg-u!s>?#IgyKi_=% z_5RE6Pv8E0`}ybR@4tWk{`>#`Kf@>(4T0ej0*XIbfL{5}pab#{C{HkO$T287R6JO~ e*v!f$q~O4y(9poh!X;thuyN7RZV_fC25SI8**uc~ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/layout/tab-close-on.gif b/www/extras/yui-ext/resources/images/aero/layout/tab-close-on.gif new file mode 100644 index 0000000000000000000000000000000000000000..556e905b11cddb4abcacaf2160ff811ec47a894d GIT binary patch literal 880 zcmV-$1CRViNk%w1VG95Y0EYko000010RaL60s{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^8LV00930EC2ui01E&M000P00DlP_NKl}>g9s4{d`IWkyNACTy%X5( zSCwBCFIN1ePMyV%9R;2n`Eleqf#u45yqHp;xQ{O{zWfEQ5lwL5BIf+nt*1|)1%v(y G2mm|n+a1fq{uZ2jn48o?zh6WMJix@z}87 pU?UF~kIsPx1?N_NZabd}gGC2BxnzU3XiQk-(8liE#lyj14FHlE< literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/qtip/bg.gif b/www/extras/yui-ext/resources/images/aero/qtip/bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..5c0e8c92a810d244a29f21f467b90f5d61fdf0ec GIT binary patch literal 1024 zcmV+b1poU-Nk%w1VF>_E0EYko000010RaL60s{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^8LV00930EC2ui00{t2000Qx0RIUbI8dFzg9q0sT*$EDLUs@%Mr=p1 zVnuftGiuzJ@twzyAK{4{NwTC#lkrljR4K2e%a<@+&YMZIrcIjka_ZDsucyzSKz-U9 zO0=j^qW6+2UCLA`zNb*3=8GCNpVg~Z^=aM8wd>Y>V8e+p>=mnFs)!ReUCi{TW1~SM1Kmmare&KkGs9fT`K0I1 u@IZ?8$gwm=i>NC~T4q>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/aero/sizer/e-handle.gif b/www/extras/yui-ext/resources/images/aero/sizer/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/aero/sizer/ne-handle-dark.gif b/www/extras/yui-ext/resources/images/aero/sizer/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/aero/sizer/ne-handle.gif b/www/extras/yui-ext/resources/images/aero/sizer/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/aero/sizer/nw-handle-dark.gif b/www/extras/yui-ext/resources/images/aero/sizer/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/aero/sizer/nw-handle.gif b/www/extras/yui-ext/resources/images/aero/sizer/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/aero/sizer/s-handle-dark.gif b/www/extras/yui-ext/resources/images/aero/sizer/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/aero/sizer/se-handle-dark.gif b/www/extras/yui-ext/resources/images/aero/sizer/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/aero/sizer/sw-handle-dark.gif b/www/extras/yui-ext/resources/images/aero/sizer/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/aero/sizer/sw-handle.gif b/www/extras/yui-ext/resources/images/aero/sizer/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>4&D5AAwkkh5Wu<4INq2MrDdrA7vRHntp%f(1;CJRD{PCm0kI G7_0$|G=z8n literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/tabs/tab-btm-inactive-right-bg.gif b/www/extras/yui-ext/resources/images/aero/tabs/tab-btm-inactive-right-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..94deb880211bfed28b5e879e19d74b69059a82c3 GIT binary patch literal 1618 zcmeH`{WF^f0LP!wM%MMV+;rH^#*S+6P~9Bu)pc$)ucdZ1wVU1S^oZ9PhP(B4hSHU( zR>eyxtv2#Xyo)3xULq22rA^dpL|&h~zer?6*8Ug!q2K%b0iXNaeIug6FI@ZuJoY6} z1pv)dSqlw%M29*iRD?+(X*dMjjjgH36$Dvef^ z(W)`ofOmUW;QvwJ3(N60A~pbgtMm2~0Ne(ghr33SJDBBgN1tRi`N?Dz!XvshviIq9 zwezu*4R&wm%suxjcU|T29<%kx>-gl^{O7aifK*Ovl%ts2a-jg)pcuRs+e6DwZpsR< zFFGUdJH>Jaa4StQ?a^(~4XH2jN&T6zCBGB+JqgsZ&tiDk)jrgUFoZBf`mrHZf|I_~91URDoX`<4R`Ymzfw;x!w9)H{hDf!=X&|h7eCQ=OFEj+$r zf5LCHFm4%hof}3P9gN|VoBL{G4^m-(bG~A0o;s}AW|Y707DpS=?Xv5Ae_o(b43bZQ zq^3Cf=$>M=KWlq|PBm);lhro2YhyHvLAF>7gg&7kn63FmF*^m{W%6exw&p^x$fcTvQ)_Im!+|BxHyi zlG1QubaIhg+?Z17Eor)m&X6>tFu1gqGk})yD39eWZ7t+wNZU#zIO*eCCb_h|6y_uA zsQ6$FV}HjBFMC=O1j#zf5&>g})LuW!bECvtZi9--X zAhT>f3gQ4SQ$ZRk<1o5uCP>l4fcYxPQ%+gRUbYuO**6!YQ1&lfUYFRtOw3XZuBH)G zLmNd3)v%z_S3M#^XQ?SNOm%MU$pM9$s%80VXhvR^hQ2Q$XvPjr3e7m+0Om2=fjR~g zewL`6I2EkaP9h>e-PGwD*}7?$bfS*s`YZSi0ILA?Y|qAQ{VcMJsONygNjVgN#?Cv=5s3ZcBzB^zM$g6T1F1w m*}X5U30Cj#)17mXogEasPgIOa0 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/tabs/tab-btm-right-bg.gif b/www/extras/yui-ext/resources/images/aero/tabs/tab-btm-right-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..622812a9166259b0f85879a0243845db96d6b52d GIT binary patch literal 1604 zcmeH`c~8>^06>4%YLRJ1A}Lz}T7rSn!=SLjHZ)xz*m7LqZ*&9MSyBO58=_J>+V zQ3P3F=r#ldgwmFKww$F&LcqkssO-q)`ey&0|D{1{7opWx*sFC~qT@ZnX=fwKS| z0P2R7V`4K;Vx8Tv312#vrS|7imssIm)x2I)?``V#rAD93{Ey7!Q1|%n z?ln8SR;SnI^7{RL;4N0NjXy&9?Rt+i!1;eh*5QC%Bd!KJA^8mnKJdmGh10 z{FNWa_)u|YM%$&SaVPjY5!};`v}=hD4Z<26%fgg-9C!b$!I|Yq`WGaM3(;q4@~A)hf;NNI-(k>s5#Y4 zR@^~$GZc3*9G#*zhKCdbaqDDdU4n+8tWR|5l=tz6qg4&b@FLaEsgZZO@Q^sYsxgxg zt!^Tciqya46!xl{bE$gugM#Yl!iSJU1)5*U-MyOMC>*`!_p-TYZAKZ;S9RY1_Dao)kG@RKY5skYB<FJ9?mWi`X1x;L8HQGF?2n?PX({;1V<3p0LiLEt8J*63diF!?N(aW^@A- zfMKkBXb8nR6A;C=&K`|7S_MHVnB8Z=*%yZJ$FH$>=RzxtyFvsVW1BzqfMQ!f_ONY> z7_RZVCCH};`}4RBihVgj%eJp1x{Y=b9)@*@lS4`!e-RF5;tySjH#t@_Q?O16F}u{c zmh*L=b3M1h%km9gP?9B>nM i+9Rt9`Nku!iR$+#?!}uu%7&EFd#a}F^Obnu<9`7OM+Rm9 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/tabs/tab-sprite.gif b/www/extras/yui-ext/resources/images/aero/tabs/tab-sprite.gif new file mode 100644 index 0000000000000000000000000000000000000000..79211e493a55325ddf85207c7db8a283b101d005 GIT binary patch literal 3102 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 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/toolbar/bg.gif b/www/extras/yui-ext/resources/images/aero/toolbar/bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..03cf427a2610c7c0d71f4d680389b49b1559d49d GIT binary patch literal 904 zcmZ?wbhEHbWMZ&jXlGzJapUcYn{Q9vczg2Z+fz5+p1$?&^zC*?oP&%WG#_Jv^-jE2A<3jxKSEI=3iXV3w;3zR1qI8qth zdju4fTsQ<2>}ozdSm?~oCu5d#VS%DE8;^vV&jba=CU*{QF&+tl1xrp&Vq#&4IJxP` ziRsK70vZmRmoYN4^C{doY20{zK9`7r#Hj_2Kmj?8S^-5SRxZ&+VH*-2HeKarWMr@g E0HmIRM*si- literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/aero/toolbar/tb-btn-sprite.gif b/www/extras/yui-ext/resources/images/aero/toolbar/tb-btn-sprite.gif new file mode 100644 index 0000000000000000000000000000000000000000..19bbef3c687f19a70b72c454bc2542e92b04c893 GIT binary patch literal 1127 zcmZ?wbhEHbWM-&iXlGz>`0r3Od0)xY0~Iq4Rm?bCJ?B`>oTK&gPd3dz*}CLR%aU_l zD=ze`x;$asm5J-FP1|y7=C<4Oc0KGp@OARxuQQK*oqzJ{(lcLIpZm7u8ukxPurZ-YfblWU`p4o5&%%PX!%{-|5oZ<}b{tn!>Yw4W=u^Uq zQpF50j}MM*?7gx+W?f1zJDKabS=0$Rg*yZqflo?c5Ixr^dQ@Bde4NjsFf-c#W=%hte#Xx8144{oy_EOnT}e!Oo~L)&NLV<%|FT literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/basic-dialog/btn-arrow.gif b/www/extras/yui-ext/resources/images/default/basic-dialog/btn-arrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..f90d5df4455c332d19dcc8b621a19e53c672612a GIT binary patch literal 870 zcmZ?wbhEHbernn7GpqKUUw`Q0mSb0ToV>R8?9Kh>?)?A%A85cR7!84;8v=?yS(q6Z7#Vax zUI66@1`cNi&HxUF4GIUDn0duaCIlolF!PEkbz~SY9&O@c^J6$L@o@_)r+F36fdvm4 e7??TCIy4q6Xzpf_KfuF~nAS2=D2rYb$6u{3dg@Hl5C_+UxWP}hhwlxkH5Tk`Q2xfD|VSo>dMX@~M2ACyIHs>wM zO9USSdAPC43^Egm+jwulZxr9`_Ar;Fya@wYOwXL6&5~OTZ zy{43^R;4O(MZF`TR>{K&Wvr4LTIxR_P9cqnHuUpe=ReHTk zwLz~kxN2B88MH>D#%R=K$MDy@B_b!~cyOGFeU#(PpP}iCLVDNSM zYPgVH+QA8Af`FbQ^u;+ISXgUK*J&cKTpik)^$+L?cg#N$TG9}lz6(N60ff-7QXe?X z1Fj$*+wJRf43q9_nTm>HjBWGYWhLx`!_~siir(=m3?(l>KH>%y{&1!R@`-3KMaXvm zZv_Ewz#X_u1omd5K=;urYIAZ^%7%+e1VxPSTW1FuVO8(b>VxlV;tm{q@Jx^%(D3Cz zy z6v3)V<#%7KJy#OLug_}k=0D6EiOKruin2TF=j*gX*$~ZHm_LVER-RU;X9jjctiHi)3 zeJnf$GLj7pP5o;2lUOSKV^zd-BO3vC604f{{R1d4Yk$je(Ux!efJiBO@aVPsE804;fk*WxQe}6c#pgOBlzkIk9o^@qPv8E*Z~F j4JRkFIw?h*6k_z8$d=5vM#EU`>?~GhhKiNO3Jlf&dGRKI literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/basic-dialog/e-handle.gif b/www/extras/yui-ext/resources/images/default/basic-dialog/e-handle.gif new file mode 100644 index 0000000000000000000000000000000000000000..dde28262ece20a9925515ab777d795d642d9f377 GIT binary patch literal 995 zcmZ?wbhEHbWM#O(-p&95p^ZEL|NjqWjuN9GFtS2G@h1y2$j3S$0+c5hI1Vr{a>#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/default/basic-dialog/expand.gif b/www/extras/yui-ext/resources/images/default/basic-dialog/expand.gif new file mode 100644 index 0000000000000000000000000000000000000000..4b423f06bec115ef5163dd352a6b249e83d63704 GIT binary patch literal 884 zcmZ?wbhEHbSKV^zd-BO3vC604f{{R1#EA_L8Cn=+ykaC27B+NC7{{%N5Ntf& zFK=1ovS7gyPgV|>vXGrYsb16cU5`!SoSfP)Q`WIb#BxK!`T6$D3@b7=yl`0L#>=(! Kq>zIHgEath6)|!E literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/basic-dialog/hd-sprite.gif b/www/extras/yui-ext/resources/images/default/basic-dialog/hd-sprite.gif new file mode 100644 index 0000000000000000000000000000000000000000..42da1ea1aa4322c3995eebfbbea9a6e8c3eb77ea GIT binary patch literal 1099 zcmZ?wbhEHbWM-&lXlGy$)C?EYiV)I@6w;0o)`=F@i4oC_714_m)r%L^PY^Rm6f;Z` zH%t~cN|7*5l`u||G)b2<&5$z9lrqbbGS8Ma&ylvsm9fl|vCNmXDv-4JSK2bm`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/default/basic-dialog/progress.gif b/www/extras/yui-ext/resources/images/default/basic-dialog/progress.gif new file mode 100644 index 0000000000000000000000000000000000000000..0c3a53714cfb1a69bca5d304f3c11e776879fe63 GIT binary patch literal 19442 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

          7~8!cSq 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 XWgudCAVF$jcua3$WG-oLW^VvHsf`Br literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/basic-dialog/progress2.gif b/www/extras/yui-ext/resources/images/default/basic-dialog/progress2.gif new file mode 100644 index 0000000000000000000000000000000000000000..0b3fcd264e88613aeba6f5a04960031b4dbf6f37 GIT binary patch literal 14113 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
          I_}1TPPv4ZhJ)nzAf^Q!h(R>umIuIMOQ<;IfJM zuNzcIrp>vVA9)E7CaC+9ZUp6}|3b$HG$o=!`hThlDmf_}U$X_~rb}6E9Wn9Q-?~eTtC~Gl)b*$R<`b5`6&@qvixub+phC9h;D)Pq2 zZMSPPO~TLH)yv0MH2`Ah198Kq;bdW9V>QtAfI)G^6m_KCgSWHC9HMrxE-8Y#Z}5oo5TI0%)3H*?Be@MY@*UDIpR?h2(T~~mzMrNUTu}45DU=wegOc94_Q}rOHucv$yw~R$)=(*Q?&^<;5Lq;$8te}Cq6nvvN04rryxp z_>o!WAXb_x9YZogwGnThHkJba$RcEO z_`!Tmu?Bdm=Ry^kh{bbs7W@cG+aPWaIe?M*xyQFG+ps_e3%)f}VlFhg_=psa5+ahH&Wu^>Wap99<9b|sGd?Q%rk)avO zi*2rUl966MI>{I%a62RrT@Z_8Jl|8XF?T?;{bA|6sJ05wP*G1bhe`KUnQKs#{`!4G z>F@{_dBo7dIU+jt-UQ`qN~7{-N!#c|pzC`t_LXq;0qLl;p)NPS zOO8+Fr44wcoIotyV|w`3CF@E5_g;T%iruUCEdwtP&K}Un@S3e5F(v<-N>bD!Ka(MxO7SHbKn>36k<*>YqGAz%!Pt4|>ARNPY<9D&|A!&{mZ5%~dE z#O5QzLV$UGlt|#|>#|uMVq2h0ePYo_ca;!}hWNYOTCxB)3C2qW@fZWNj4-mDuP@ik zR&K@WFv}wU;%a)m6o1$KqgI@jsvkReC&I`K2@k&(FRp^JYK4y`pbh2czL=;{ z-J&XMLB?V8cvQS$#Z@*L{%|X-(0j&!NOcfN34{A6#dFV+4iNj(6wNAK+kiD8 zWKfR4t_5V$jx|aFtJ$Q$hziQ#lVXLQGn@F{?4cdp`tLyP)C?r^VT@;bf?m!HZe8`k z4a151;k2|X?n(;DT=@Uc8dP%PbVypO^i7Qfav4f$bbr>e0{TKEhdXvtbVcryIiaZn zzl)d@OOyie7g#1i2&B?^I%%2O$wtY?Xy~db7lf<&Im9TN+iGMg`q<_;FdGNgNPCw0SzuQN zMVW=x(sV`0Mteh0b7`2-pYy>I`@=c6gC zxMkVpgSGFIKTel&?+>n?NFX}I&H1SQPj}O-u~5^l$REe|2mV~pZWPceFvOpOT-=io zKR!3Qj1C!n7VEXvbUZyaH-pJ&LN|^ZUQf$JJmsQRjv5gMP=pg*-;#DV!`Sf#7Upi=7(jT;(i{Zf_QThpqGyPK)zln%_pgl$~~^ z4BP3OBYOq^)YG#tNtNr=b+=i5gd&mrZl$yynI5r-#2;f^!p^d+$^v1MaSiGy&{g5V z*y=veU?*KxeM?})Ev<+^TX^~gqV7jMh$Vh-Skl0s2+)ayV99009}7qAB(dRoyovh- zeuBi0P!LkbFA-{5>L1&Z9J-U+$-U9G*OuGYVd&4=k7sVZ&y93Qj;ac8S`Ro55WyR; zM)F&DI7!u%S8^~>)UL5fpb`<*FBi{LvQ0LaIn_g0cZp%v5eWP!XNXUvIUVNPe*>ve z(L*FG``rc^LU?T(Emm&kSr|eL8+2gd?-7s=N96g_y()YLjlJ zGkI-S^i;lV3jFJ&Qxc-g<(xYjPnD!`#AM(-qplsptyVeoE(bB3@FmY0~?if z%Pbtz{_$oAk%dfZxHw3)IM^n+5H<=ip>LnC&LKbTXG-YX+TfHS;hpCdT>fsZe-hU= z+^a}RCNl3q{Ra#^w~-@ekv zp!63el1vTT9Poh6vyLU&jRM`xSwCj$WauQ5W;ThB9VZ~PFdie7KQ<#2WJ>xbly!4r?b$W+h<3_opCx_bww<5}Bl3Dw!jXnnjI?j3}W0 zX4xeq#Afb5rKua9HUqM|@5_TiL$z7PjTZCPklV$JXma z6eSR^RUcWFijCl@|B7lJE)+>+L$}6qPQm7@^nvO{zkF~_4hk4)*YiE4=d*pqICI9H z+rrY`lfYww0uZUNz^ws-7)mIK6RgQf=TQPeSaI%-Y?PywxTB?~xQK6+^Wb=U3NkZV zKC1Qd)CKn?p;z4L=eO23hIrfP-A;w>kz^4d3UzCpz)YMh`IMy4GzzzCVl?A&LLUro=qQgrQWSUbyD+{SZ@~MaXm3 z;EH8-wsFZtKIVukUo`HMOsI~ll7SPxsk9_38wZOCPmlmzs1pn#&A^l?p{QpLjgmCi zm$g#i)-U#aXH(ASmyZ*!8d5LkU8~!T_RT>P&{s-Tg+1dZVcYI|9 z`=6-5nx30mq+4BEpW2^m|+byFhLV2UV_a^xoHURHVW&Kk3z?{MZ;u+9iM09T>oqLCPkoq{vn3umdv@ zb3j{hI;u4gkriXdNxk73B{;*Emw}npLKMOk{aef(XH$4uoVBq%OSQ|Tboz&h16lP3 z4TcFWM}ZGaYe-_1cunyFq)Sa&>&D_YMBk$*xXuJ@R~Kyex)j`r#@Bs0HOq{SY2=** zRSxHLwkU)eYQ;qQlGSD*ICFbOU~-;;W7G5d>2M|LfpE(VQs=T z4(Wiv5l7O94J#O=koSYD#2v1CpMD(j605rZ{e9|rxbgP)a2^|?UkRvkv?z2?*ym8; zi%iyb|I5_jT2+H#;bNctv$kWkUf`?as<8v!hsW*LQ1ocQod^?Lk|Mu&#nb{&vG~ZE zoiXmwb~x0wQ^uS`#BKmd#4OVmQM}`D5f(Nyg!VN~u4E{~(W*kMT-Y;;lrt~YC7ukAvJ}5GBK5WO1nTMJ`O1s8+(w6irLq+e= zv@E{nO)1oksKb-DKy7z=hp^Ap)P{BSX4!^audYgbVZE!?BGk!SH!=C;C_UjC^}Zsy zyC^HwA|jw%#b$ogwx+l|_8>dX;1APl=0P;kp{m8Itdn|)dlX9wT;@sm8-_?e!Nq0L zb9YCGEpwI;hMoB*~b-1=gn-ek4cm7Jqs0;+mW<(0mzQ14*T6r|L2vu8lo9saAC5A@j85t0z?2^j ziK|i0ggKK*%dxp+-Gn-AV1Xnu=`g2i$eK|H-T z=nuT7zY&-%?Zd^JuB#a3C>x5U$4lK?#kK^6{1A90`}$wBiZiTW=ftYFwLtW&yAbBGPM{Sj*RC>Mplzqogk& zD8g=)Pw^6m3c%4DtSUx{J*GL(6ir_Tw`u5(5v>jz_I#1-L}pSW(1R% zi*{cuyj3fiDEb%bTFy<_6uEsPP^~&;?_bTIZ`|I|{q8`%*(j&|a>B@&l^uhqRejJD z{H8xYw?h|k5>ahT^IyGtzS?Afg1|J?@exE6a=o9};0I-6jjk;xeS z2$_GY`F)f5=GT&v-gd}<(UElEnq^M$Yk+K-@1VaoZtc2(c;+hUJ5F5?5jqY_E+sgt zP2VzjuMdFe%~q#>joN@>1_#Q`8e);IsBsL<`(cfv71B#Pd6?3|aD!z}9J* zjOT39#a`@ca(Ne)Y~eEdLhxj&ov{s1f3&kz3pob4>MUgrVWw19^|6dhU1VF^6udRT z!R%Sz^}4vCaN#pw0r7aol;Nwq<4l*0r(+dQtFBsNRNMhQ;4Hwu8i`Jb%38aj??bIR zHWiY2iwXnsB_etN(*f_aa(&}#Zaw|nSUPbk&Q;)#ALmnz)9R_tVe49(h^7mnqL;o) zFNPe_KWuZZT@BM&B3jq=hKQUEXQHN=f?$}NmB(Y%M|T)sFlt=3BC$neZil#7^Su$4uh@7- z|7;HHddUj*MWwB-|gxA!C_krcNB${PG=<7KQ6Gasj` zF7oncW4!k&oBzYcH$iTXc`)Vw*m%k-_5HU%q8ma&SFUnPsKFwsGx2@U>+*zcy72Qu zUE#RYIhAv|XpdFG<=>jB*Fv(lAL|{ft;}zdg^2wJ>nOec090_kJlAdMro-SD72#kf zBdIXoij<;Nx?h*_lMRbU>$b`{wFMWMklfk@pI+;?n>wwZ*_a{g`y7z0y+D4;QW%1C zIZ;z0sCNBNSpmh-_ov76%)z8{(TP9LjnStVgD>m5sdlvDS6Y`AGXTvgFCtQqc!Xcj zqH^C0eKS&Ji`jFY#Uo_~{bz`C=*z{jN;}Gsu3k;>u6MlK=?V31S&QEwbJ^!DdxhLyKTlG}Ixmz9t;ms`RhJPYA|r>vG~8DOzbsB6;b@U0DoCh^o<0^lB5zf9l)V)aw=7!ZS6h6jQAf z!dnCqzWsS~=RyF|JMS(ez=CanCMC^U|MxhKicstyfgR+uvMve#@xI!Wr|J?= z-DoYAY0jW<*4=^2YEC@$I#-G}PTpVi?0DJJ2|q>kxLdb>Bq%nl{rRBQpfj2019c3L zq>+V-va)mXaPbK^FnXFv$I!`Zn+D2+Yh~zp8ySXW2KkDLzZ0+*5w0u^($XwZE>jQo zi)?N9U?10`0xJ)xgW#ajgC`~#F)=ab=I8z^cBdvMP+9*)($HDgCg`S^2xfNYv9Jg> zz8`L%U$EX_AEIuZ-7Z}pJ{~E0$OyWVrMPTR9?G1knSFK!PjKrnwLnGR-E^I?j=?D8 zX(sRZb^W=m$CA!*UZIAh@S~_4A~rT5NQa#oB4bGJ?>6mY)dE3JmS1g)6A>j4=i|e( z{cv=&rSt_p82+$I4O_v8EK4VOVgm^ba^#dzpMeVf(v#Y%SFcSW(U0)sY^AZi!J)`0 z>n!^?uEpSo{GN${141zg-6fq=SG96Bhb3NiJiePwA4iaUl}j$uF_prvf2mxVrk%E^ zqP^+(E?0||c#Habc>eABdrz}Z^z4r)W}E*0M6Ti=8?Xl8_e3a8j~-`V6J%5<`srk% z5kY9s)#5(DDL-Aa%C!2`U_RAKw~84A;Wy%sjkX3(>_gt5AAAR^Hm?BA`1o+f{edYz%T6nRW)n|Gsj3^Y1BE(9M^*L?D^>eBD*YtZnHa_6 z*5OJNj&|ur$tVXUv;z60X?hPQ)#>a4j*A(I=dq@_nMrxX+4fH3RXIcg!;WRvBR7ua zFLerf1zP>!m?S|28UubMvv0wHqY=zOk@5+GLdO|{Rly02$%u2 zAgUf&O3gpAzd^NAl1u-4JMolVsc+Xtyj7qg!|&p+j@R~-0jOR1RPU7cKvbG|9UY#8 zoVE~YZ6C@#SP!+y3C*}qK3lH3ErgtVgi|Hn2s(NBFKxz2%e)p$ib~-*E7&6B1(bdZ zp`HQzCvMNkiH5-Av`!Q}y@(jMc|IU|g%q{l4o*=yFj8v%oV2Oz<(cNYC-0tOTQ%kL zbvR=4TU8|v(3?|sckGxCqBeUfgunhiTGZ0m*7ddbj`4k0st#qg)z?z1IF@gZ8+)3j9y)~|5f&UH!$g-$0{MgVR68$XJe$=t9DBaDOsp*#FcBCL-^>aG z9N(~~bfsUDOHA1K&94drFF$^NPp8+f@LBwlllhWvki=Anz>X_-(yW1%S+h+`(Kp8P zWo%s3tc;utZ%V`<-2wcwDGeLl_(&0Ax)rv@PPEx%jkGxaZ# z2glz!92f!}7I2nO5~&``a8O$xk?>}qRp`{@enI_rBmSp;%;U&6TgjN8o(99gkvLK7 zj#l7MfE<6-%{#V`Li7%h%uiR9nC<8MTc4k0x5F`#hr!wCUHmYNHU)NRALRgKO~r0< zFCRG196$1$$Q9tHW<&xi?a@-Zf}f|yieu#)vxlDde9EL~(8{nGz2Y-!FfusTCfeM; zSDRfsbF;0I(OqCn39nHPmIy)pFP4G-_az5$Y}sO+7eoDFWe+yFJ0vOmJV{6MkMB#l z(s_y~GY`Jll47X{Whp;8i$u^_yRRaew{=sxZ~P4F=;2GzEenYd$nfcQ`m}rM>GtyJ z^Ffe^sGmEok%^A4t29mEzX+Qu54VS)XQ0^2x*2#g1Aq42a0@^4j(7Vkwy%905M2R?X#95_ZOa z4YhtshKdD&NgFo}rnfs2ABbLA+8D6uhRuH~SJ!sCsz!$6a-6b};0}f(LL$(7YZk|& z!ioC9giZs1-a_I?g5H7slZCQF2WTm77OP&BL4?HcxUbW4tJU}w-^=p(a`jEJTNO9$ ziP3wMt-(_kS$pkXND0x=1b^LTtE?{zmh?TR@rOk>t5mKvjy^-*~xC{PO=H{dxXmQdH{q zjU_t-!AYi6FiCR{7yx?>O9+gT3kd)}4OodR^OuC8A`kC@h#q37jc+{_*FA-wAHV6n zq^%JLF-8l*O=*706GA99J3URZIR3S|lz6+C@ZXE7jL$5v_0KNI8kH_6b(Qpp6Yg{B~EC(oPh~7V5?i1x>sH=S>0b zBIL_<=Ds!NhLlE66>_4ay~CM2MvpmTZ`7-t3hVrchrqh#s(Obpf-jixs3$Oq$AdlbsK*Te zz?Y6@ozWB#Hwi0H(#PH%7Qh&4g-=)!^%L00tnrP6%Qx=FQyTVHp#VUD18Vgl z{{`@03TaKL=>GxKsOMP# literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/basic-dialog/s-handle.gif b/www/extras/yui-ext/resources/images/default/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/default/basic-dialog/se-handle.gif b/www/extras/yui-ext/resources/images/default/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/default/box/corners-blue.gif b/www/extras/yui-ext/resources/images/default/box/corners-blue.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa419b50abe5030db04492578d5dfd39c02fb6ab GIT binary patch literal 1010 zcmZ?wbhEHbXlGzpbnMH9^WV;$J9qKo#mkp3U%h(u+O=ypZrr$e^X8p9ckbT3 zd+*-8gExOZc<|ui!-tO^J$n53@slS{o<4p0?Af#D&!4}1`SR7PSFc~ce)Hzd+qZAu zy?gim{reZ6{(SiG;p4}TpFVy1{Q2{jFJHcX{rc_Ox9{J-|M>Ca=g*(NfB*jT=g;52 zfB*ga_y7NYhEYJJ5ODbKKqZq#iZO~mS(q6ZW-;i1JPgVc3>@bfOgUvd3KTeaMcKM` zTmT9+Dym5^6eP5&35jyCL~LwoUdG4CQ1IlzMJEOhS7<|o6TkONJB|cJt&_qGY8j_CFdSfKOOVXz5IAt4 zV}p{G0>c6amIz;I6#<3?kJdQw@UbxnC^#-)=MmtuQ0WM8YMvo$(vtdt@jw$#qNfCh wKq7O5AQyweiU(yaTnsEKITutM85$V*3^XlGzJaNxkCA+uU@@+{rdHrH*em)ef#d+yZ7(kfB5j>g)|NZ;-|Nno6kqR9CJB(DX)7#&QKUtU= zfEhstWHBgDFmRk=;OCU_C{XAUlw(`PkjU7?)Tn7;VYmK z&r@KbvglBQu=1upg@udrDMSY z2FDg@ogF$0Oia(gUJntM;F*w7{y{XRIF%d;*fMw Ru}w*2KC@pnhK+^68UTSX)nNbt literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/box/l-blue.gif b/www/extras/yui-ext/resources/images/default/box/l-blue.gif new file mode 100644 index 0000000000000000000000000000000000000000..5ed7f0043b6b0f956076e02583ca7d18a150e8f6 GIT binary patch literal 810 zcmZ?wbhEHbWMN=rXlGzpbnMHWJ9pl^dGqhzKZa2-8UiCM1QdU=0Db(QK?me-P@Z7m PU}s=uVK7ioV6X-NGaC=| literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/box/l.gif b/www/extras/yui-ext/resources/images/default/box/l.gif new file mode 100644 index 0000000000000000000000000000000000000000..0160f97fe75409f17ab6c3c91f7cbdc58afa8f8f GIT binary patch literal 810 zcmZ?wbhEHbWMN=rXlGzJc<|tzJ9pl^dGqhzKZa2-8UiCM1QdU=0Db(QK?me-P@Z7m PU}s=uVK7ioV6X-N<)RPU literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/box/r-blue.gif b/www/extras/yui-ext/resources/images/default/box/r-blue.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ea5cae3b7b571ec41ac2b5d38c8a675a1f66efc GIT binary patch literal 810 zcmZ?wbhEHbWMN=rXlGzpbnMHWJ9pl^dGr7Oe}+*o8UiCM1QdU=0Db(QK?me-P@Z7m PU}s=w;80LdV6X-NJSY$C literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/box/r.gif b/www/extras/yui-ext/resources/images/default/box/r.gif new file mode 100644 index 0000000000000000000000000000000000000000..34237f6292a7da6ac5d1b95d13ce76a7194dd596 GIT binary patch literal 810 zcmZ?wbhEHbWMN=rXlGzJc<|tzJ9pl^dGr7Oe}+*o8UiCM1QdU=0Db(QK?me-P@Z7m PU}s=w;80LdV6X-N?ynEj literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/box/tb-blue.gif b/www/extras/yui-ext/resources/images/default/box/tb-blue.gif new file mode 100644 index 0000000000000000000000000000000000000000..562fecca87176274af7bf13c419daaf93f169249 GIT binary patch literal 851 zcmZ?wbhEHbWMt4{XlGzpbnMHL<6oAa{JQeg*VSjft~>i}!})KUE_~a1@%#46-*;X4 zvFF;4eb;~7zJ2@P&7Vha|2%Q`=a~n;&OiEf>B+Ba&wkx{`TPEx-%p-AdGqGY@@87@w|Nk?Lg3%Bd$|0cmlLhGf{|q`H xPk{0S1BVKOBoBu|W0NBntB_a%g98I2m#~UU!-oTo%xv5uDh>q)92y%KtN|VsNKya* literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/dd/drop-add.gif b/www/extras/yui-ext/resources/images/default/dd/drop-add.gif new file mode 100644 index 0000000000000000000000000000000000000000..b22cd1448efa13c47ad6d3b75bdea8b4031c31e9 GIT binary patch literal 1001 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 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/form/error-tip-corners.gif b/www/extras/yui-ext/resources/images/default/form/error-tip-corners.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ea4c3838768c0ec3b5dab8e789333593295c15c GIT binary patch literal 4183 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 BA5{PV literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/form/exclamation.gif b/www/extras/yui-ext/resources/images/default/form/exclamation.gif new file mode 100644 index 0000000000000000000000000000000000000000..fabf616f7791abc0b4055c3c5c3de74888c6a4e1 GIT binary patch literal 995 zcmZ?wbhEHb6krfwXlGzJ`) z_lwCs7ZU@nqy*h4h`d)2dAA_;ZcYB(+Wd#HL672tA18)9O$vRM8umOr{Bc_Jlk}M9 zIk7J?BVOf1zRrt!nIHeKB<5*Rhp~jL$U* zpX(A|Hf6nS%zV?B^R7AXaZBm5j*3_9wXZvCU-eeM>8^h>ss2+#>X(M3uZ>Axo07k@ zqwHTr&Of@>%Z|O#QL2^~=7jS@?Cs;_sUmeBZp}!L*mh~ z2M3f4cPwz+oO+bI-Eq;Di%cvYVrCXDA}UNvdHLm-qBle&D<3&vZs7Cof}+4tPT?%2 z7D0^^ZZTOc)>#^kk31){GledBdGOFO2O)Wzh7U~+4?2u2^QIkOKH=QXBeP3D;6+lG z$Rha_9VZ(eI`OJm$voJF;SOWl@drM;g literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/form/text-bg.gif b/www/extras/yui-ext/resources/images/default/form/text-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..4179607cc1e9486dd6fcc8467c79b5b41dbf4f76 GIT binary patch literal 819 zcmZ?wbhEHbWMmLxXlG!!_xRa|&!0bk{rdI$_wPS{{`~#>&!4}4|NZ;_|3AYh7!85p p9s-I#S%6;r&!7YHC@4=ba0oCkvIrP7I50A^3uwfgFi>Ey1^^@>A+7)b literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/form/trigger.gif b/www/extras/yui-ext/resources/images/default/form/trigger.gif new file mode 100644 index 0000000000000000000000000000000000000000..3623bf8b9fcbbd290be741b13287a9096372f9fa GIT binary patch literal 1297 zcmZ?wbhEHbG-i-sXlGzB4Cr?F@33{piU0rqZ#nsB+vz9U&pg?A_Sx?9&v##VzW36L zeV1Ndzj^<_l~)I@ygqpK^`UF84_|wG^v0W`H{Kn)@&5R&cc<>WKXLoR>ARm!-u-sw z?uYaDKc2n+<>JH77ao4S^yurQ$6v2J{&Mx{w`)(oUVHlOIuJeke)IYF+b_P~dhz4- z%O7`M{kZ?;=Y!Wjp1%9}^!?8#?|;4g`0L%5-=Dw#`TpzgpTGZr4r3Svqai?>5K#Qd z!py+H$e;r<9+W2-IQ}!Ra>#gWSkS=0Cd}uu!XU9hNC_z0$;}LtExa!YY*@7X{CtP_OEOlM)p{0tOxBvK zsL*joX?KsPFLionLIW~@* zj0YO^|I5rhkpFUzx%>8&3#!W>-rK$Soj|~Xn#zaIPVe`zzw1^toA=S_^EuA@YA&*W zdcAyo{QuMc*g4o2_zH+*D6p8xWIRYbtD5fId}1$)Vy(a}m4mGkX)6?Cs!LZ~kCnak zV4<(*l#EB68f8xpbm?q+@yJ{6*o{TLVplRA_gWZ<9_+LE_TsU(9ox;tzEUEYPbPZ2 zb2&K4$L!@3Z$G!2OMIn6GM`S3SmbhLnp3Xj6kpjE&1W-G7PTClnXzo;Gw-ZzGne@) z9?^V0r(_Y!rMdEZTb|D|>wWNiegj*U`h2<6361kw%2HPNs++uev3LUCtQ8A8{AM*q W<)xmQwxlIU%VAMhoR)(FgEath(t%(A literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/gradient-bg.gif b/www/extras/yui-ext/resources/images/default/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/default/grid/Thumbs.db b/www/extras/yui-ext/resources/images/default/grid/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..46df4e9df82a2b7d64eec82946944d3530c3abfe GIT binary patch literal 33792 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 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/grid/arrow-left-white.gif b/www/extras/yui-ext/resources/images/default/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/default/grid/arrow-right-white.gif b/www/extras/yui-ext/resources/images/default/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/default/grid/col-move-bottom.gif b/www/extras/yui-ext/resources/images/default/grid/col-move-bottom.gif new file mode 100644 index 0000000000000000000000000000000000000000..cc1e473ecc1a48f6d33d935f226588c495da4e05 GIT binary patch literal 868 zcmZ?wbhEHb( zLO{cVgpLOZ6Fwx&_)sw8LBWC#1q=Q+toSft!~X>b{xgh%(GVD#A)xq^g_(hYn?VQU zd{CZX;BaIR=ZFzVT;Rwl#vu{Yu%W4$ky$xng~3BdrVc>?i4_ctPK=BUEM^-R4mL70 a^J-WG2rw*VW@C5a%Q0YR@NEQ2S_1&+BRBT| literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/grid/col-move-top.gif b/www/extras/yui-ext/resources/images/default/grid/col-move-top.gif new file mode 100644 index 0000000000000000000000000000000000000000..58ff32cc8fa2aa1be310b03bb2af77c1b77abe93 GIT binary patch literal 869 zcmZ?wbhEHbG68wVGIhem=U(^LUb4h;c?We$u2%uEc{03e(}^8f$< literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/grid/dirty.gif b/www/extras/yui-ext/resources/images/default/grid/dirty.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f217a47959965037bdaacf23dbcbe800a59273f GIT binary patch literal 832 zcmZ?wbhEHb>lyj2t2o f3la`CGVn;rtSCr4)W)vpHOFJ)qNAORj11NQ63h`c literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/grid/done.gif b/www/extras/yui-ext/resources/images/default/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/default/grid/grid-blue-hd.gif b/www/extras/yui-ext/resources/images/default/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/default/grid/grid-blue-split.gif b/www/extras/yui-ext/resources/images/default/grid/grid-blue-split.gif new file mode 100644 index 0000000000000000000000000000000000000000..5286f58f6f798184c3eeacba1352cfd39b9ae03e GIT binary patch literal 817 zcmZ?wbhEHbWMbfDXlG!Ub?iS7FpPrH5Ezjmp!kyo=M_wPS^_`om@~ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/grid/grid-loading.gif b/www/extras/yui-ext/resources/images/default/grid/grid-loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..d112c54013e1e4c2f606e848352f08958134c46f GIT binary patch literal 701 zcmZ?wbhEHb6krfw_{6~Q|NsBg$>(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/default/grid/grid-vista-hd.gif b/www/extras/yui-ext/resources/images/default/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=_??HKjfkTCXkweD9 mfT4kbgI~?WW5NQ*7JhN9o*xBDE*)ahRw)@D7aeL~um%9t9ucMh literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/grid/hmenu-asc.gif b/www/extras/yui-ext/resources/images/default/grid/hmenu-asc.gif new file mode 100644 index 0000000000000000000000000000000000000000..8917e0eee0cdf7758e83c4cffa7a7239f72b8427 GIT binary patch literal 931 zcmeH`u}i~197Zo~Emb-ML>(No#i13!1{`|2)F4_jl^X=3LnUJzge<}>RZc~zP~kV; zB68w#pu>SnK&adpIt5*dn`7OIQ?33Dj(x+oeanNlwY^!!2PQI6AN?^vMGITlu?Sc$ zU>9uS*}igoaC}8PN`jCCnovooc75v7&|^Bl#h|GI2x(JLP!wWjlNOK|~-m_dM?T+-E!pI0dd^5l}(d@Glq_swQ5Q<6ypk{;!;VaqFyLusAH|W zI_^hNH}3WaBSr@P!$9skWgujrrQZ^Mn?RWcN@fn{AM5KVovc^P{B4D$=SroI5_&zI zNSF`DRwb35%9fAbth<-%@nxq_$~TO}IN9OvPh(dz1*g;6JvytHv(;6&xjkRcOr!mB r{VRFNa;Pe5osHT>5@ibIb~{3g+0C%lYO~3O6<&R=-|w9m23q?84YkzM literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/grid/hmenu-desc.gif b/www/extras/yui-ext/resources/images/default/grid/hmenu-desc.gif new file mode 100644 index 0000000000000000000000000000000000000000..f26b7c2fc5836850958f7f2b1fafd3988a988d7a GIT binary patch literal 930 zcmeH`u}cC`9LIl>nH9kiSwcv;h)RPe4nCSX#PT4JtLbR)IJcwe#y6z#3aSf)9!+l$ z;%yxW@kSwnZWM)ZydeVHiWX}!?QdxG!)N_2ANcN;ig{#6Ai)s+7(q%#GE!y5mQ{jO zj5MrhrlNCIcT|&WCe|#b*{*J3-4-SmmeaOT%60^HIHrQgae`8gf*j^igs3uBp{hnT zopO)5V>`?=nQ1YLFxzIBGSTNY=9rB4oG{nnt~U^b3F->w3Rehk(B^L2>$m$u&+|JS zzvF-O{o!cJw7~xri2now00G#VJYn()2%o@AE8lw!UPJ@SiC{BRyCfUg+)-YByjskr zv+Ug{Ji~hAw(%`jAsUlHdvfpXd_GaEWO`qB`!@?~^gbD{hpr>BT&DZEGYhLy?xoZ; n!ca~nNw;=d4=v4s)H*Z{&Ndrqrwj#{39jU-m51Y}8o>51Tocwt literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/grid/hmenu-lock.gif b/www/extras/yui-ext/resources/images/default/grid/hmenu-lock.gif new file mode 100644 index 0000000000000000000000000000000000000000..1596126108fd99fc56226b412c6749c55ad5402b GIT binary patch literal 955 zcmZ?wbhEHb6krfwXlG#X4~ou+bjZoeOV2FG$|=q-C@C(jDlf0eD{N@b6W`Inv#*zP ze=o<1{(yu1+=nJ`ADhB`dOG8|nG9#s|^2dGCVn`{Pc*@>k~$=Pg%ddVgCO)!~fR||KBnE z|HJVAKg0iLR{x*dJ-;0I|GC%y_pblnMF0Qq{Qtk(|NlOXjV)~*Jzd>>6DCZaK7IO( z88c?ioVjUP%kt&RSFKvLYv;-0XzkU1m_xG3of4~3u@#FvBAOHXT`19w_f1o=? z!B7qX#h)z93=CNeIv`Jg@&p6N42G*5G9DWiIGRQ-bEs^3`rv@RCy$K9p(kC=rd|^` zST-*?>B_{iQlwx7E2E<(Ghbe(62oy`Y27&t0f`^nn;9J1SUxr?H8M5pwCs2h(8SWt zC8Qv+=HXHgep#c0o(mriDDdjJR6ObU=;Xr2&gPqN_0-kZOwH=MQtsX=WoB-cUnB8y dW3n5EfMAf!nn#R>TRBB^*6i?z@O5CY1_0nG4B-F( literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/grid/hmenu-lock.png b/www/extras/yui-ext/resources/images/default/grid/hmenu-lock.png new file mode 100644 index 0000000000000000000000000000000000000000..8b81e7ff284100752e155dff383c18bd00107eee GIT binary patch literal 648 zcmV;30(bq1P)WdKHUATcr^L}hv)GB7YRATlyKF)%tYH6SZ6F)%P+<{wS~000McNliru z(*hb477vONgHQkf010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E00H1h zL_t(|+NDy@YZE~f{$`WrhuKPySQAA=4|-5UL@Ysj^nd8hiS;2Kdj#HUllo z8f~>&*KFH9Nwz?Ckui3oR;%3`NI(gPUDtho|G}f2_3e8bT8ASerBbE5)1bTYdcFQ| zZM?C8k+I47`6u~>51*b--wCz*ER>uRr zeV-UkHLH%}72i$a+1i|RAKlWyIlu9^60fuoN4rrzunmYfG3Rj9y^HEzZv5(CEO81y zUYkzkSk-KQ`3%0SF=Q~vI7Aru=z0O7P{Z@#ja`PhX$8v2D-^Gzc;YIGcnR19E(0MI z;kZD@0aiO(XrN-PsAlqHZzKK#l1tJ_)zheV5(%VKYS5UK?$7C;0+>qp-G76P-YrWc z5ZrIlD9FnLDKc3)8S0<dA!cTgY+CR4-a*;u;!NrNF3LWTlP5a1_; iES|Z7@j-3=)A|j?vD&^)Yn&Va00007>1uYXA>3Qh}beSb(Ur!W`$ZoRvwlh8h#GSA{v3P9MZmob1&N}#H|)3 ziyhJ(U{)KHf*@)Iy5?}L)|RKuO{O%cx#h;IvM2X1`q0Jo18y$3o31q0)ZQR~04YGX zfXCOw7l;j1uOz`;`%xPF|1H(H=TQ-Al80O7c-*kEIp@ZM``Ch}Whn7a@ zEo{qiRYg+i%R z4h#&aR4TPvt$O^~PNy46p*I)|Mx)VWGFdDZtJOL&G4XSL3{j3aZnxWK zXJ;3eLR8p^IE^@iXhU=a0)b#Kw7t0&jYea!SUet2Boc@bilUOqB;u|J|M|xX6jAAP z03n=6?Mi(Dm?nrZ^SKu7#oi7Bm%1nSA1H5qaf|0_D`c0ZeXQSbMRJ}Wp^ujFWEojX z(Y1{1lBcW8em3h3o6B)FgQ$TZv?6jQ8yMxx;o>^&qx~ghy5ef_6fHB&ac3`cuq8MD zSbdMbr>J*|b@#!#g0h@qxe*x=qGVcHY literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/grid/hmenu-unlock.png b/www/extras/yui-ext/resources/images/default/grid/hmenu-unlock.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd5df34b70b94b708e862053ef4a634246acc8d GIT binary patch literal 697 zcmV;q0!ICbP)WdKHUATcr^L}hv)GB7YRATlyKF)%tYH6SZ6F)%P+<{wS~000McNliru z(*g|-5GqRX(wr!towOa3bz1}%hRS$Ze*UVXl27U>F*+kf-M;&k-s!`fDVCrZezlf>dy^3`BTW$z=L>EIW zO>?T0B!*En2q>u<@}12dniz6|2?Qm9qx{jpBiX~P{FQ(#@rTzxF``)#1i>x@j&6Pg z`g9}R!YZ+#Bpq}r3e{~P5}$S=h*)1OVUmx@SN9wqKg;4@^1P3fXJWAV73+q9*IOoT f&)vjR{Ezq!d`RXXnklE900000NkvXXu0mjfw|6I- literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/grid/invalid_line.gif b/www/extras/yui-ext/resources/images/default/grid/invalid_line.gif new file mode 100644 index 0000000000000000000000000000000000000000..fb7e0f34d6231868ed2f80b6067be837e70cac44 GIT binary patch literal 815 zcmZ?wbhEHbWMN=tXlGzx_z#4mU^E0qXb33&WMKq(T?a&f@&p4150I4La9D7liGhiU G!5RR1hX@}4 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/grid/loading.gif b/www/extras/yui-ext/resources/images/default/grid/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..e846e1d6c58796558015ffee1fdec546bc207ee8 GIT binary patch literal 771 zcmZ?wbhEHb6krfw*v!MQYQ=(yeQk4RPu{+D?cCXuwr^cCp}%d_ius2R?!0jBXnAQ) zOH<|l|Nj|aK=D7fpKD04vtxj(k)8oFBT!uNCkrbB0}q1^NDatX1{VJbCr|b)oWWMT zS%hVC ~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/default/grid/mso-hd.gif b/www/extras/yui-ext/resources/images/default/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/default/grid/nowait.gif b/www/extras/yui-ext/resources/images/default/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/default/grid/page-first-disabled.gif b/www/extras/yui-ext/resources/images/default/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/default/grid/page-first.gif b/www/extras/yui-ext/resources/images/default/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/default/grid/page-last.gif b/www/extras/yui-ext/resources/images/default/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/default/grid/page-next.gif b/www/extras/yui-ext/resources/images/default/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/default/grid/page-prev-disabled.gif b/www/extras/yui-ext/resources/images/default/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/default/grid/page-prev.gif b/www/extras/yui-ext/resources/images/default/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/default/grid/pick-button.gif b/www/extras/yui-ext/resources/images/default/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/default/grid/refresh.gif b/www/extras/yui-ext/resources/images/default/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/default/grid/wait.gif b/www/extras/yui-ext/resources/images/default/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/default/layout/expand.gif b/www/extras/yui-ext/resources/images/default/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/default/layout/gradient-bg.gif b/www/extras/yui-ext/resources/images/default/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/default/layout/ns-collapse.gif b/www/extras/yui-ext/resources/images/default/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/default/layout/ns-expand.gif b/www/extras/yui-ext/resources/images/default/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/default/layout/panel-close.gif b/www/extras/yui-ext/resources/images/default/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/default/layout/panel-title-bg.gif b/www/extras/yui-ext/resources/images/default/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/default/layout/panel-title-light-bg.gif b/www/extras/yui-ext/resources/images/default/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 WvZm{QhJfNv7G{tF#eZVXMX8A; zsVNHOnI#ztAsML(?w-B@3=BFTX;5xq;Lv4YLV0FMhC)b2s)D9)qBYY9s=7v2nHV6X-NX@DCv literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/layout/tab-close-on.gif b/www/extras/yui-ext/resources/images/default/layout/tab-close-on.gif new file mode 100644 index 0000000000000000000000000000000000000000..eacea39b623348f656de9a8f0df4ac4b74ceccbd GIT binary patch literal 880 zcmZ?wbhEHb)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/default/layout/tab-close.gif b/www/extras/yui-ext/resources/images/default/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/default/menu/checked.gif b/www/extras/yui-ext/resources/images/default/menu/checked.gif new file mode 100644 index 0000000000000000000000000000000000000000..091268bfe3763bb304ecf33436e43ce11e2414f7 GIT binary patch literal 982 zcmZ?wbhEHb6krfwXlG!Mj4TpPjg|>);OysQYm?%f!p=2?gMTs?-xN-sdEA1Nc?70# z3r^z{oh~XpNm5`rpUMhB^)=u~p)>6D7IX;UtAF1pFe;6`t{5A@85p@{PFwuufKo){QLLs|Ns9CqhMHsfZ|UUW(Ed31|5)Z zKzV|JV>3f7hm6OD1qYj1Sv6u#1TZi#@w0GcI9)tBMJr-kL1R&qM=y(=n%TyVz+@2- zXNwvQflZvk${|KY6DK)!wDYp5h}~>l>@KDk7INc^LBawCY5TN{2ZgP!69gngSPWJj zX5p0-kYW%_Ogt#W=r(_cL}1gAUOrJi4Nc~-N7J-*)fy%^Fgi{$O1stel^gq4^*6d_<-Z#AvfW6LF2YF$tQ%Qv#xc2NN`}V1^@w|=z9PF literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/menu/group-checked.gif b/www/extras/yui-ext/resources/images/default/menu/group-checked.gif new file mode 100644 index 0000000000000000000000000000000000000000..d30b3e5a8f138bfbbfea3d1d6d5631a81268fe26 GIT binary patch literal 891 zcmZ?wbhEHb6krfwXlGzxGAUp-FJv++Vzw-1u&!ctt7CJoDF4C-YI>17M;4q>erj}J#1 znRLYtaeQ=iW)bC#?NNBB=*-HhDWD|4xae>zCoh|V$$>=XHZB1n7Kal~O{`q}VgeQu b3s{-ixj1G-bT~0I2=PqTialkbz+epkbq-F$ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/menu/menu-parent.gif b/www/extras/yui-ext/resources/images/default/menu/menu-parent.gif new file mode 100644 index 0000000000000000000000000000000000000000..1e375622ff951a3a3f1ccc668061e81b9c93b411 GIT binary patch literal 854 zcmZ?wbhEHbOQz{a2h@&qVP zFmM<%@JmQ|Y*@g^%E=?8;=tJG)Wo9VlknjJLnFJO0!M|%0mo(rQBEC(fQyeBCb4lX KFcA=7um%9T95sFb literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/menu/menu.gif b/www/extras/yui-ext/resources/images/default/menu/menu.gif new file mode 100644 index 0000000000000000000000000000000000000000..e3d7dfaacf852cf25d3bd37159c96def1e706564 GIT binary patch literal 842 zcmZ?wbhEHb{Kde?(9Xbc_}0&RZ~i`i{`~#>_us#N|Ns9#!zdUHfe{k|ia%L^e*Mp& z1M)E_PcU$(Gca?=cx+g3u#tg=fuXv$NR;ZnHa1A D_d6!Z literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/menu/unchecked.gif b/www/extras/yui-ext/resources/images/default/menu/unchecked.gif new file mode 100644 index 0000000000000000000000000000000000000000..70ba3c49e20295efab625c5b8d726ef2a9458886 GIT binary patch literal 917 zcmZ?wbhEHb6krfwXlG!M32boq?{MeN^?UbjK6r5Z(W84$pFVo=;^~_=FWR z&!0bj{rctm_isOc{`md-*WbT?{{8#+|Nno6Q7{?;Lq7x*f3h$$FfcOcfV=|A6ATvJG_ z_wB{IZ!h0}dj&)vzP|>dkKf;X{QmaSk9R=y`N#XuKRjL%gg;OJ?2_%ZN9oX+&1IxF3}_H>l603F*t71i4@GZyiE4sw%lkTl{?!^ z6Bo7I-L2~P;_hzq*8BVGLsu~TDQ|svxII!MZqJR@$6^zdt>?XQDtdZif@HSanM&4& z=Nke$o_R~@-`i0Xygcmmtu?PVY}k3~nAhx8xhrg)|NZ;-|Nno6Q7{?;gDC_Qf3h$$FfcOc zfE)$N6ATu z!(r;m%j_$9KP-wo!oMF4bR^Z#pCLVEt6JIYJY>r`(GBHu8TKMAH hV%craN*NY1aV$`Fvrs8ibZTIkpzPfzqoBZG4FEi-n5_T+ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/qtip/tip-sprite.gif b/www/extras/yui-ext/resources/images/default/qtip/tip-sprite.gif new file mode 100644 index 0000000000000000000000000000000000000000..36a5e1df22af8fb7932b597f35313020183ba60b GIT binary patch literal 4032 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 DrDMj5 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/s.gif b/www/extras/yui-ext/resources/images/default/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/default/shadow-c.png b/www/extras/yui-ext/resources/images/default/shadow-c.png new file mode 100644 index 0000000000000000000000000000000000000000..ffc42bd2982e38733528795e2f87278b66bb8341 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}blof6lG66d1S#FEVXJcW?V+*F2; zj8X+7GX=+jA_XG@19JrfV=Du5D}dPgB49r-vITomw5WRvR`MB;$k*8o|0J>k`MjPkjv*Ddk`odVHUPP{43?J# RBNhW$44$rjF6*2UngC@NE5rZ* literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/shadow-lr.png b/www/extras/yui-ext/resources/images/default/shadow-lr.png new file mode 100644 index 0000000000000000000000000000000000000000..bb88b6f2be887650f28b16726e470c09459b9c86 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CG!3HG1zpHNqQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiZnf4978H@C8Z=JJZMPDQ+U>TNx_ce55uGN4u2%Q{wE|U g2=cJ=GBC0+@aVFNEX<$33#f^~)78&qol`;+0F-4Xf&c&j literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/shadow.png b/www/extras/yui-ext/resources/images/default/shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..75c0eba3e101e3f32cef8bde7bae7383d849e935 GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Q+l0V0jwbN>KRk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XZhE>nhE&`-GTD~D$v~hjI>0gT@Uw(Rj}ARr(#+ZY|Nr|R ztz576{))TQsGN9FjsN;R=N;cX_7>}LNxZmoT3OARN%FUXp-|AVh0k3k3m;=qQcOOgc@EIAyfV(r;i((zEeg z`}y44S?ng!NoE&wcK=*_2F$s1%jHel(|yj_4>tF9g$FFYCZ&0@DQ;=K_|9xe0dH@S zX*Z%4Z8@@VyGFIRewDnzd#yOua)FIqa}4Vg?=kT(Xhpeh(=cjy2J|F@r>mdKI;Vst E09T24*8l(j literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/shared/calendar.gif b/www/extras/yui-ext/resources/images/default/shared/calendar.gif new file mode 100644 index 0000000000000000000000000000000000000000..133cf232b243baf857367233e750477675f3190f GIT binary patch literal 979 zcmZ?wbhEHb6krfw_|Cv!=$UBjnPB3PXyTD<>X~HXm1O3TVD6D*;+bL!L|&=p9%&Yy z$rhfe21!Q^Q_foy-7_zKYFYTes_3C(>0^ho$8NPxd}^OC{AUPgcoyFJG`!<^QvZ{z zDbMnzKTnzZDQo7}(m5|{=DsSP^R0H#i}HnEYgc@4VPKfFcR$P>d-aR%Rj;~Nz3y50x_9NPmes$yHvFEn<75zjyE6rRxuF+*-OfrGSB)`bNRn_N2hWXw`F z1SB%CNxF5h++3*4-Y2c*)x+@dA!D0_Ny3>5#Y4>Oyy6-T9SR2-+2lNnp5aC62aVf7*|&4xzT^Yd-|U2>IL4xC*cvD9p$mdk;F#a0uwaxaLi_TL;LoDk6{ z_LiSPBA|iw_G1P%(cIo|3A36`3aNVZ2}m*>X-_;{7Al|+pwP(3%EG4-A<%HJk&(@q JpNE6N8UT=&&-wrW literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/shared/left-btn.gif b/www/extras/yui-ext/resources/images/default/shared/left-btn.gif new file mode 100644 index 0000000000000000000000000000000000000000..a0ddd9ee8203b9fc45eb5ee78ae6bcb7e57aed7b GIT binary patch literal 870 zcmZ?wbhEHbSKV^zd-BO3vC604f{{R1d4Yk$n}L-sZYVSj)zmI o(Q}fL|Dq=uMNdw3X~iE>$=vYlK$lteqcf2P3=A_Zn3))?0bn93t^fc4 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/shared/right-btn.gif b/www/extras/yui-ext/resources/images/default/shared/right-btn.gif new file mode 100644 index 0000000000000000000000000000000000000000..dee63e2113fcca680699455e8a56ee3eecc81c40 GIT binary patch literal 871 zcmZ?wbhEHbSKV^zd-BO3vC604f{{R1d4Yk$hk=zr!efJiBO@aVPsE804;fk*WxQe}6c#pgOBlzkIk8cxsZYUC>4${T q6OT!%mh)U@eo8sjryPH%CUe8H16^j>kIqCIFfh!NVPs)pum%9ETq}wI literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/shared/warning.gif b/www/extras/yui-ext/resources/images/default/shared/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/resources/images/default/sizer/e-handle-dark.gif b/www/extras/yui-ext/resources/images/default/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/default/sizer/ne-handle-dark.gif b/www/extras/yui-ext/resources/images/default/sizer/ne-handle-dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..04e5ecf7d3837aec9510f5467282c10f158a5563 GIT binary patch literal 839 zcmZ?wbhEHb+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/default/sizer/ne-handle.gif b/www/extras/yui-ext/resources/images/default/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/default/sizer/nw-handle-dark.gif b/www/extras/yui-ext/resources/images/default/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/default/sizer/nw-handle.gif b/www/extras/yui-ext/resources/images/default/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/default/sizer/se-handle-dark.gif b/www/extras/yui-ext/resources/images/default/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/default/sizer/se-handle.gif b/www/extras/yui-ext/resources/images/default/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/default/sizer/sw-handle-dark.gif b/www/extras/yui-ext/resources/images/default/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/default/sizer/sw-handle.gif b/www/extras/yui-ext/resources/images/default/sizer/sw-handle.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ca0ed96df2059fe283c1d65fa1032a777e1ff97 GIT binary patch literal 855 zcmZ?wbhEHbP>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/default/tabs/tab-btm-left-bg.gif b/www/extras/yui-ext/resources/images/default/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/default/tabs/tab-btm-right-bg.gif b/www/extras/yui-ext/resources/images/default/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/default/tabs/tab-sprite.gif b/www/extras/yui-ext/resources/images/default/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/default/toolbar/btn-arrow-light.gif b/www/extras/yui-ext/resources/images/default/toolbar/btn-arrow-light.gif new file mode 100644 index 0000000000000000000000000000000000000000..b0e24b55e7ee53b419bdd5d769bb036b19fe9592 GIT binary patch literal 916 zcmZ?wbhEHbQ@i%X_#s+qO5ao&#Bg}b_z?(JW>fAX3`Gd3KV zv*q~0?WdOQKC^1y`Sph`ZaH>k$H{AZ&)(dB?ha5d!zdUHfuS4%ia%Kx85kHDbU>Z} zernn7GpqKUUw`Q0mSb0ToV>R8?9Kh>?)?A%A85cR7!84;8v=?yS(q6Z7#Vax zUI66@296R2W)2yT4GRu7a|mm>STHs?w+nNawPX}9G%#|o>fAZ8aq;nf1?Mgq&rM5C zPSyxs6?1aa(*sN*0#Y579~gX_Ir7AO7EE5yG(%Y4FT%k%!-dUUH;Lzh!*aJqzAC;N dg;0f-Rg6jrr6;$pzP>);aF?w2wgd+TYXG#xTAcs@ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/toolbar/btn-over-bg.gif b/www/extras/yui-ext/resources/images/default/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/resources/images/default/toolbar/tb-bg.gif b/www/extras/yui-ext/resources/images/default/toolbar/tb-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..4969e4efeb37821bba1319dce59cd339cec06f86 GIT binary patch literal 862 zcmZ?wbhEHbWML3xXlG!!aPPx~`#|*Z;=Kx_O l3y+3|gN`0p@r*V7q$pUm3-bnby?^AEjPaQM}t!!H*ddA;Q5t7XSu zFFE#R+3~k4PP|=t;?1g)?^d6ByXN%!b!Xl!KK^0dnGYMz0@24!=Ra;b_i6KmPg{ZL z;^*y`fauH4D?s#h_tkHEu72Hn?c2WV-}hhte(=VRgExO1zV(w~6pV(zAP51)pDfHE zXXtab`h5^C3PidkvO_ z0WD5K!ag%JGz=IV8PqwH40b4}HP7Hpvg?pkRBN3fmXy>nQ}J2b4B4c*4o;OpCENT1#2mWU{FjxZs D%xTSp literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/tree/drop-add.gif b/www/extras/yui-ext/resources/images/default/tree/drop-add.gif new file mode 100644 index 0000000000000000000000000000000000000000..b22cd1448efa13c47ad6d3b75bdea8b4031c31e9 GIT binary patch literal 1001 zcmZ?wbhEHb6krfwXlG!sZ8LT1HFNH_aOtsj?X~gjxA*9E^z3&Ep6U}i%{O4CWB5GR zxH(~o^CD6fgr+PAPg@j`zBoE{b!f)w;OtcqS!<$mRz>A)jmQU~$dc{RCEH^Pc0?BK zj4s|4Q@Ag_Y)yK_x{UHY2^CvX>NjQ8>`JNKlUBPgy>f3}?ar*)o!Rv}a|;e8R~}5M zI+k5?IJ@p(X5I1prmcC+Tl3ns7k2C@@7Z0}wX?EwUq$b}>dE`-8_$%sovdm*S<`y9 zvg=S~|DoE>6ZKu^Yp3pS>N(xmcc!K9QuCyv4O0&^O+Vf`{Y>lRvmG-|x6L@yKI2T+ z?1R&1ADl7ea@VxWol~!LO}o-P{c88ji`{c?Oj>eo%Chs*mR*>(;O5i?H>WMVJ$u!a zxvQ_tS$1N<@{-~Tgx`xUa|S^%B{CoY`?W?%iUF5@2}Z*cg>Eg z>v!B;zx&SmUDr15xw>=vgZ29!ZQJ`~+mSmvj^5pQ^4^hC_l_QYap3f`!)G2GJNw}H zxtAxeygq;Z-KCo^FW&ihj$;hsoH8C8796zp$T+b>@c4oQ4ptl9{CxcUY?nYS7uzPr^nkf~ zF-KnfWK`sLl+9v^jSOlzC8As$;v$iu&bdH0ut_86$zxX@GwwqiGMCbLCdz4)g$X=7 zcxoaWQ~HIKhmx0vy2>O}Xevx#ky5l?_wGr-qtgtHrgJ}!+;FF#5#6#i2*%nh> zyAFx!#AZoGf3_x%!Zyuz9to2P8w(l~c~334oIij5|Ns9CqhK@yhFS=VTXXjp>_!!i-ZjhjBP9&d=d&P1P-@w z2*?REbZj`-z{teJvFE@96*ex`7^N1;;s=LXIk{il(fr(WZkkH%E}e=3)qp;}RJS=1 ZACr#t%8J+VSOzWgoT4>ViN zU%dGJ;lrOVU;h61@&EsShEXsY0)sdN6o0Y+UH6|s2joUjo?zgZ#9+@MbEA=|m5*7N zuP1?_;V=Wcmd2kAjEoFSyb3l63JeWQEzG)l4<-aOJF{^!n#_11;LyO$#4EyJxnXG= zBd1*n!vlvz??xWBngt9APKV|*$upc#SeW74&N(&d!GU0fOO1}n=k{oQNISc~334!T+I5ReJa7x*DTyS#YWmWQ8@*yChwS&o6 zrsT(mM-FYgx*h@@4;QobG08Hm@c7Wg%*HKZQ}Uv~iG_ooBg3QNK|^B;FB^}5K!V!o j#pc~334eSRT}sa)VS__s8w&@Y zgu;q|!z~;Fasmw<8xA%wGBG*Ccx+O2Y*vXZDtTe_=t!5iao(F9ACgZ@)bm{w(wUgh k*e9SZBf7&RvvH|ppWc*{Usi^4=^EOswG7BU)WBd303hyMjsO4v literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/tree/drop-yes.gif b/www/extras/yui-ext/resources/images/default/tree/drop-yes.gif new file mode 100644 index 0000000000000000000000000000000000000000..8aacb307e89d690f46853e01f5c4726bd5d94e31 GIT binary patch literal 1016 zcmZ?wbhEHb6krfwXlGzhFH%vfSJo_7)vQuAsWC9EH&km;*6LR^?KiYxFJMjooS=wa?sdwqwu&r?{0KDI0upwuR+x56{~g zkq<(VSvvztwnvw2k15z6Ua%vwaA$PU&gkM@F@^i$%l9PIZcnS(l~TJWt#)5}{f^9- z1J*HzZPSi=W*zp-IqIEx!mH#^WYOu+{6mTPhZFOT08vuj(d7JNDFp|U3y&lh98WDi zo>p==rRYRP$%%~86B%VEGs{k8RUS;KJD6E_Jiqc}cGa2O`cnnX`*Pb46}28MZ8%lj zaHgpFTzUJ+%FZKY-6tw0oU5O>vwy;#zG=ssCm!gZcDil)nbs*M`lp@kn035;#_6_M zr`l(nX`gwvYwo%3nHRffUg(*1rFZuAiSsW_n15;F+#8b?UYok``qahOr>(v;d-dhn ztL{u+dw=%2>kHRkU$E}Z()D+iZN9m5#o~d_ub#R;qm;f57%vfxPJS?4f`H%+y8jS!N=PUJlT2r&He)i4xD~_ z;M%)OH{V=&_T};0@2@}p{P5-1r$2vx|NZy(|Ns9CqkyasQ2fcl%)rpgpaaqk$`cG6 zR~e)^Wjr=4aC9<_3F%-wzQDoVIAhB~=k&AfoLyW-Re?t*%+d(FBC_aGf`Fq$D3_+D zkjse)Dz(dOBqZEh6jdE-UYxkdEGT3zv4dmE!Dl=ZWi9e%{1g;@!G-s^!P$| z8==@$AR3<{5^GPA?~^>Pma%d|c$9FpHZ#?|? z{QdXWpZ@~^!zdUHf#DSbia%MH85kHDbU@w$lae%R5x_+pfh=9;jCRWxkA&~=x h2Yp#A(~SZe4mdO}wqloSIC&-M@bZAgN<174)&TX)MQs28 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/tree/elbow-end-minus.gif b/www/extras/yui-ext/resources/images/default/tree/elbow-end-minus.gif new file mode 100644 index 0000000000000000000000000000000000000000..9a8d727d70ff5161ec18c0cd0156ae8d50a23b75 GIT binary patch literal 905 zcmZ?wbhEHb6krfyXlGzB^h$R6?=)rU-Z?Z#?|? z{QdXWpZ@~^!zdUHf#DSbia%MH85kHDbU@w$``4~=2xoOmJxRJ?YUCe?7 p4c<*mc6tvw4?K5dl1^^H;N?iZ| literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/tree/elbow-end-plus-nl.gif b/www/extras/yui-ext/resources/images/default/tree/elbow-end-plus-nl.gif new file mode 100644 index 0000000000000000000000000000000000000000..9f7f69880f48db8d86785639055fcc198764617b GIT binary patch literal 900 zcmZ?wbhEHb6krfyXlGzB^h$R6?=)rU-Z?uiX3i z{QdXWpZ@~^!zdUHf#DSbia%MH85kHDbU@w$uiX3i z{QdXWpZ@~^!zdUHf#DSbia%MH85kHDbU@w$y4*XmR1y>vzmpih{E$}o|KC(Juvl9;ogEauy5=OfK literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/tree/elbow-end.gif b/www/extras/yui-ext/resources/images/default/tree/elbow-end.gif new file mode 100644 index 0000000000000000000000000000000000000000..f24ddee799ccebea4dfe60fd65a5703a6a59d44f GIT binary patch literal 844 zcmZ?wbhEHb6krfy_|CxK^xx^&v19*7!DtAK$PiHc$->A01UeuBlqVQCG#MBA01UeuBlqVQCv>6yVWIQ%3 sIM~R@rxjCSpm?~QTh?igM}U%RmzciOnH3WikN0ueH<|n}RA8_M07ViGB>(^b literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/tree/elbow-minus-nl.gif b/www/extras/yui-ext/resources/images/default/tree/elbow-minus-nl.gif new file mode 100644 index 0000000000000000000000000000000000000000..928779e92361aaebfe9446b236d95cb64256e443 GIT binary patch literal 898 zcmZ?wbhEHb6krfyXlGzB^h$R6?=)rU-Z?Z#?|? z{QdXWpZ@~^!zdUHf#DSbia%MH85kHDbU@w$lae%R5x_+pfh=9;jCRWxkA&~=x h2Yp#A(~SZe4mdO}wqloSIC&-M@bZAgN<174)&TX)MQs28 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/tree/elbow-minus.gif b/www/extras/yui-ext/resources/images/default/tree/elbow-minus.gif new file mode 100644 index 0000000000000000000000000000000000000000..97dcc7110f13c3cfb72a66a9891e8ab3ccef4a98 GIT binary patch literal 908 zcmZ?wbhEHb6krfyXlGzB^h$R6?=)rU-Z?Z#?|? z{QdXWpZ@~^!zdUHf#DSbia%MH85kHDbU@w$``4~=2xoOmJxRJ?YUCe?7 s4c<*mc6tvw4?K5duiX3i z{QdXWpZ@~^!zdUHf#DSbia%MH85kHDbU@w$uiX3i z{QdXWpZ@~^!zdUHf#DSbia%MH85kHDbU@w$y4*XmR1y>vzmpih{E$}o|KC;?;W0q*gYXG$^NPhqT literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/tree/elbow.gif b/www/extras/yui-ext/resources/images/default/tree/elbow.gif new file mode 100644 index 0000000000000000000000000000000000000000..b8f42083895bb98276f01a5d0e33debddb3ccf1b GIT binary patch literal 850 zcmZ?wbhEHb6krfy_|CxK^xx^&v19*7!DtAK$PiHc$->A01UeuBlqVQC^cfgAWIQ%3 wIM~R@rxjCSpm?~QTh?igM}U%R7pF1PhKh>{$NPBfn?f{-mK<+pWMr@g0DWQ)HUIzs literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/tree/folder-open.gif b/www/extras/yui-ext/resources/images/default/tree/folder-open.gif new file mode 100644 index 0000000000000000000000000000000000000000..56ba737bcc7734693d7ddb2f50c8f3235fceacee GIT binary patch literal 956 zcmZ?wbhEHb6krfwXlGzB^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|JV1OfBquQXEGvI4}0>6q3BdQLvD`XSzZ1sfd8&rn9pxa_cf0 z8;-R|sQDgyVbIvhINu@p(3Fo!OdU)nOn*uow`yILl(G@%_!WGtV|{}AnFkvZ9YR(b rI<1IZ9mc}SXv*Rj;4nR}iJ6T{KqBGLF$ZZACT_Vm-ya@qV6X-NkKMK> literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/default/tree/folder.gif b/www/extras/yui-ext/resources/images/default/tree/folder.gif new file mode 100644 index 0000000000000000000000000000000000000000..20412f7c1ba83b82dc3421b211db2f2e93f08bf2 GIT binary patch literal 952 zcmZ?wbhEHb6krfwXlGzB^h$R6?=&-=aaIP?oGg}kIcy8^I2IRjFD>R>Udq3sOkj1T z@R}--bv0re>LfNdN^fnF-QFU)=hNov3pP6ZL zdwbCB?S=oZs*|No!)|Nor- z|92fYaNzXm(`U|{xqSKZwQJXoU3-1w;m7CizrX(c9|#ym!DtB3CIl3JvM@6+Ff!^t&H2GZdv-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/resources/images/default/tree/loading.gif b/www/extras/yui-ext/resources/images/default/tree/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..e846e1d6c58796558015ffee1fdec546bc207ee8 GIT binary patch literal 771 zcmZ?wbhEHb6krfw*v!MQYQ=(yeQk4RPu{+D?cCXuwr^cCp}%d_ius2R?!0jBXnAQ) zOH<|l|Nj|aK=D7fpKD04vtxj(k)8oFBT!uNCkrbB0}q1^NDatX1{VJbCr|b)oWWMT zS%hVC ~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/default/tree/s.gif b/www/extras/yui-ext/resources/images/default/tree/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/gray/basic-dialog/close.gif b/www/extras/yui-ext/resources/images/gray/basic-dialog/close.gif new file mode 100644 index 0000000000000000000000000000000000000000..116234711fa716bf062135b054253090917b3cea GIT binary patch literal 893 zcmV-@1A_cVNk%w1VGjTg0EYko000010RaL60s{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^8LV00930EC2ui01p5U000PD0EfsJNU$KmAv=aBS;(-V5`;S(N?f=j z;gE|MGhVF7kfk0w8o1o_X-$(1Bs+JQOJq)U}BQ6ciK{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~EC2ui01p5U000PS0E^fdNU$J5BRz^RS;(*Noutb5CA*7*{)Xr literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/gray/basic-dialog/dlg-bg.gif b/www/extras/yui-ext/resources/images/gray/basic-dialog/dlg-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a466633d70ca1475db2c11061d37911e3b7205c GIT binary patch literal 27857 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 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/gray/basic-dialog/e-handle.gif b/www/extras/yui-ext/resources/images/gray/basic-dialog/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/gray/basic-dialog/expand.gif b/www/extras/yui-ext/resources/images/gray/basic-dialog/expand.gif new file mode 100644 index 0000000000000000000000000000000000000000..3f41ed152ab60c9c157bee3464a598f50f9dc2d9 GIT binary patch literal 911 zcmV;A191FDNk%w1VGjTg0QUd@000010RaL60s{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~EC2ui01p5U000Pd0E^hDVWXhIgEorzD8i(n!-q_Y^zZ?(V#A3=GHTpt zBx8?>KK_XuIdUS%9{-LZTY0SIzmFzS!u0Vm(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/gray/basic-dialog/s-handle.gif b/www/extras/yui-ext/resources/images/gray/basic-dialog/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#FV*|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/gray/grid/grid-hrow.gif b/www/extras/yui-ext/resources/images/gray/grid/grid-hrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..a263abb03f6467dae2f38083b7c21f78b7f56d28 GIT binary patch literal 825 zcmZ?wbhEHbWML3vXlG!!cInXTSGO5P!DtAK$PiHc$pZBEe+C_p??HKjfkTXenM1~7 X!-9j&9Ku>LCjt~2+6Cm_??HKjfkT~vnM1~7 p!-9j&j0`*>5dsX(?Y#0vF&ZBgj`> literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/gray/layout/expand.gif b/www/extras/yui-ext/resources/images/gray/layout/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/gray/layout/gradient-bg.gif b/www/extras/yui-ext/resources/images/gray/layout/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/gray/layout/ns-collapse.gif b/www/extras/yui-ext/resources/images/gray/layout/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/gray/layout/ns-expand.gif b/www/extras/yui-ext/resources/images/gray/layout/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/gray/layout/panel-title-light-bg.gif b/www/extras/yui-ext/resources/images/gray/layout/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/gray/layout/stick.gif b/www/extras/yui-ext/resources/images/gray/layout/stick.gif new file mode 100644 index 0000000000000000000000000000000000000000..afcc2bf0af8d95b8b92d5330bea9261c0c43c333 GIT binary patch literal 874 zcmZ?wbhEHbgwvrlP4cMco57RB}PMF1ciX&PZnm7cNPDMITxiSmZYXA zlxLP?D1>CBD!6<41~4$_fTTgWg@HqtfssSTW5a@j&5V3PJ}Uwe8rlWq^<*42CLL*K ZGRjJM@nO-CMmc+{9E(Xy4mB`X0{}q#BRK#7 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/gray/layout/tab-close-on.gif b/www/extras/yui-ext/resources/images/gray/layout/tab-close-on.gif new file mode 100644 index 0000000000000000000000000000000000000000..556e905b11cddb4abcacaf2160ff811ec47a894d GIT binary patch literal 880 zcmV-$1CRViNk%w1VG95Y0EYko000010RaL60s{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^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/gray/menu/checked.gif b/www/extras/yui-ext/resources/images/gray/menu/checked.gif new file mode 100644 index 0000000000000000000000000000000000000000..091268bfe3763bb304ecf33436e43ce11e2414f7 GIT binary patch literal 982 zcmZ?wbhEHb6krfwXlG!Mj4TpPjg|>);OysQYm?%f!p=2?gMTs?-xN-sdEA1Nc?70# z3r^z{oh~XpNm5`rpUMhB^)=u~p)>6D7IX;UtAF1pFe;6`t{5A@85p@{PFwuufKo){QLLs|Ns9CqhMHsfZ|UUW(Ed31|5)Z zKzV|JV>3f7hm6OD1qYj1Sv6u#1TZi#@w0GcI9)tBMJr-kL1R&qM=y(=n%TyVz+@2- zXNwvQflZvk${|KY6DK)!wDYp5h}~>l>@KDk7INc^LBawCY5TN{2ZgP!69gngSPWJj zX5p0-kYW%_Ogt#W=r(_cL}1gAUOrJi4Nc~-N7J-*)fy%^Fgi{$O1stel^gq4^*6d_<-Z#AvfW6LF2YF$tQ%Qv#xc2NN`}V1^@w|=z9PF literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/gray/menu/group-checked.gif b/www/extras/yui-ext/resources/images/gray/menu/group-checked.gif new file mode 100644 index 0000000000000000000000000000000000000000..d30b3e5a8f138bfbbfea3d1d6d5631a81268fe26 GIT binary patch literal 891 zcmZ?wbhEHb6krfwXlGzxGAUp-FJv++Vzw-1u&!ctt7CJoDF4C-YI>17M;4q>erj}J#1 znRLYtaeQ=iW)bC#?NNBB=*-HhDWD|4xae>zCoh|V$$>=XHZB1n7Kal~O{`q}VgeQu b3s{-ixj1G-bT~0I2=PqTialkbz+epkbq-F$ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/gray/menu/menu-parent.gif b/www/extras/yui-ext/resources/images/gray/menu/menu-parent.gif new file mode 100644 index 0000000000000000000000000000000000000000..7e1378a8081c518ca4e3761171d29ba6703ed9be GIT binary patch literal 846 zcmZ?wbhEHbB0Jk|j&_?%jLz=+S%k?lFvl(GVB`A)xq^ zg_(hYok0iWS5Tf{;Lv7Zl#%e*@PLtliC2szL1E#cW>zi>6OIIiMn+-IFp&v?$qju{ Mj#)Jk1_}(;0Le`qjsO4v literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/gray/menu/menu.gif b/www/extras/yui-ext/resources/images/gray/menu/menu.gif new file mode 100644 index 0000000000000000000000000000000000000000..3e12a1d80449df3802f67db9520b87813bd5a515 GIT binary patch literal 842 zcmV-Q1GW4|Nk%w1Vfp|80EYko000010RaL60s{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^8LV00930EC2ui0Qvv{000Ol0M!W`NU)&6f!NNyyZ5i5!-o(fN}Ncs UqQ#3CGiuz(v7^V27XtzSJCtde4gdfE literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/gray/menu/unchecked.gif b/www/extras/yui-ext/resources/images/gray/menu/unchecked.gif new file mode 100644 index 0000000000000000000000000000000000000000..70ba3c49e20295efab625c5b8d726ef2a9458886 GIT binary patch literal 917 zcmZ?wbhEHb6krfwXlG!M32boq?{MeN^?UbjK6r5Z(W84$pFVo=;^~_=FWR z&!0bj{rctm_isOc{`md-*WbT?{{8#+|Nno6Q7{?;Lq7x*f3h$$FfcOcfV=|A6AT_E0EYko000010RaL60s{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^8LV00930EC2ui00{t2000Qx0RIUbI8dFzg9q0sT*$EDLUs@%Mr=p1 zVnuftGiuzJ@twzyAK{4{NwTC#lkrljR4K2e%a<@+&YMZIrcIjka_ZDsucyzSKz-U9 zO0=j^qW6+2UCLA`zNb*3=8GCNpVg~Z^=aM8wd>Y>V8e+p>=mnFs)!ReUCi{TW1~SM1Kmmare&KkGs9fT`K0I1 u@IZ?8$gwm=i>NC~TJgn%Pf}qxkaE;E z!}!vcdm)qxVRJ@?p~Jr4=kNGFpC8`8f8MXx=VN&T0yezAx(&P|Nk-Df@={eV`G0P&DS4ZI!aU`(RkfGQHaUA0)s9+PSI&88XTgm+dQbizjw*Z4SIfjx zWP^9B-F(I9E3wMby|Od=YCPE{=Vsx}*A;`6F4qiVj<#sOd+ybiqV_j4u&e5d0z=J< zS@nq(Jn8Cg92c;S6S6Y*rHi!$;UG(Xs9CeCzp@YwyG^^PAh2`=z*7+w@UE6nji>xf7`L_bk3;$qI{yg=rxC_k95GhGlizj6k>Vy>c?+&NcS&6n!VQ(pA?&sVWUyP;Ja$=v+QX7TQY>NhH>71ew|p2WekiWK8`^EN+9x=g zw%X6v?O7f84_a~U{nSmHwZRWYX=_8z{d?AiH(d8fKJcP!Bp>tg(j+5U6+MzqSk9jH z&jTqo>tEiEq^*xu%}IOK$NYZo*%*KDhwaAKM}OirCc-0l8O-~X;lSvxV{Sn6n7(SXe(Fi3 zC1jf#zcR_RJ6B1Xuwigw|2}t!iMIgFcvGiUlk8Y`?4ZK>8=a8K6sPW^2kO}RXF_UR zJ$`v}m_U9xss`I_q;Zr$X@cvkvUK`=f@)RMb2ddZXQ4EY9HmqMb_6>4xmDBW0KXE^3!|!(3}~d%HC+ zmvnUa*{@^`HPV4~f!+e;xT# zqqb>Nxl|B?9-w@eMesUxZkg?SRTOOmyuMcY4y9CHth8tUUmE^35ADN}Rhk%VKt&%U zx3=WX1kmb{W`E`gqZB~fchf<)gissitRCa{!cBKTrSBE}G)KqQp>&{-%qTNGyYE)Q zQ4VSUnxpv@T@1eBegBcy<>lVGcdilp$~p7pPHKcZbsWb^WO#)q%HJj5$caW=WB6+M zyC!g)D9rG(hde*G03+wzp*30r%+JGtyU|D{nL_YIj2XHji3Wvb`o8{e>s^DH%>0*w@W7Xb_xz

          t-M8nBaURXUaboUVW83^fxJIsd4O4xB`Dqa~5)^Py95?XG6a}#?Hwz zTL6NI9Sx(MB_2c;3$_qmALU8(AW=YY5y9}WuYpHi5(_^5x?URbaLB#jA;@=R&=47c zbSFEreBZBahCPL=In|A@D)w`nB_6#_#G~C_V0#&V_4OV&mGg4NMouXvgmU#M@ zg`zXLO?|5>*`eUCePj3d`M%4kInO7Ld+N5EFTRhBYgf;)ds-|zH1 z9y-(0DAcFi>n)22B`h^!u9$5Kst$+Ym17=Q3OxGE$zj^(zD(Loj}GV^U#oHa{luYc zW3ZVSz6|^Q)qQDV_|S2QIIU?M*6cdc7lDj_`33txy8dbSa73)&w_ikr=a-ejb=sOc z4)FBx>m7QLfd{zXKbe|LG*xZzl0Ge`k2W+(xi>om`Qq?ElPST2$C1!j1SMUo3#1;{ z57k{YGrw}y@?jJ#fV;Nu$(04r&}MjLtS_rsYu;Dy!N(PkF|IVGIYKYG?LhNJvYDy) z$je_sv(ZhilIiMW*C(OVTkzpw*h<;b?b*=giBYMklwWDKxFG2M)%2OW0e!i(HemW| z@vz~qNl&q4zzj0;^zK%?pY&%lLV9{fT-*DnTfPoc3PIZ=FYZEE%eurFhR1zj#!bn_ zj{xF3-p46f#jNDSt883QW7r-+M4zw~QZDOv}psZF|YR`u5Dotk>!TL&W_ zTmsu&04C^LJph3(TtV0wZbV;efBff6oEhn&vFZa$lAZYnjlbFF?b_{ZtP)khD7F2l zT?r_u56X~=lAA=y?m(Z-PV5GtWuWNucM|0==wGeqpA%?N$b~>3`@~lzDaA; zBynq!nPyU}DCzqt%=N^ibxX{`Gt4{{V9-AIz#k>hSeci?)<~L|P`Amx&Q(rpV#3T6mlVJ_Clwqwv`@JduYd z3GsPySp`~IWQ(jKSQb@^$||L0(Ro=6VOE7)_H(W57Z%you{vCqCIlM0S;@xB)005Q-O^;*F;G&?#^}1tFsN%NGR#ih>|T z!SJFGbWs?+2+1#s6ct6u7e@n%VdCO~&}Y D2qnhi literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/gray/s.gif b/www/extras/yui-ext/resources/images/gray/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/gray/sizer/e-handle-dark.gif b/www/extras/yui-ext/resources/images/gray/sizer/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/gray/sizer/e-handle.gif b/www/extras/yui-ext/resources/images/gray/sizer/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/gray/sizer/ne-handle-dark.gif b/www/extras/yui-ext/resources/images/gray/sizer/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/gray/sizer/ne-handle.gif b/www/extras/yui-ext/resources/images/gray/sizer/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/gray/sizer/nw-handle-dark.gif b/www/extras/yui-ext/resources/images/gray/sizer/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/gray/sizer/nw-handle.gif b/www/extras/yui-ext/resources/images/gray/sizer/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/gray/sizer/s-handle-dark.gif b/www/extras/yui-ext/resources/images/gray/sizer/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/gray/sizer/se-handle-dark.gif b/www/extras/yui-ext/resources/images/gray/sizer/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/gray/sizer/sw-handle-dark.gif b/www/extras/yui-ext/resources/images/gray/sizer/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/gray/sizer/sw-handle.gif b/www/extras/yui-ext/resources/images/gray/sizer/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>-?#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/gray/tabs/tab-btm-left-bg.gif b/www/extras/yui-ext/resources/images/gray/tabs/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/gray/tabs/tab-btm-right-bg.gif b/www/extras/yui-ext/resources/images/gray/tabs/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/gray/toolbar/gray-bg.gif b/www/extras/yui-ext/resources/images/gray/toolbar/gray-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..bd49438f33937ef9547dc8300fa73c3c239d9e7e GIT binary patch literal 832 zcmZ?wbhEHbWMq(LXlGzJdusRnJ13q$x%BGAwKp%Xzj<}@-J3h_-`xN3_U?!G4?etm z{PEr65AUA*|Noz16pV(zunPgjpDaK>{b$et`3#gN7&v4Zqzw`_ELgzA$|)pg(Xe14 SBQvX#kb;4O15gDcgEauAx-gUg literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/gray/toolbar/tb-btn-sprite.gif b/www/extras/yui-ext/resources/images/gray/toolbar/tb-btn-sprite.gif new file mode 100644 index 0000000000000000000000000000000000000000..bd56f88ec1f82a93fc5e0a994f556bc930e84576 GIT binary patch literal 963 zcmZ?wbhEHbWM;5uXlGz>`0sG;+~G@?j$glY?8@a6*Ds&Aa^>WW8)xs`yY}eO^(POn zJ$ZEF$&;HeUfg~A=E=LaPv5Wg{1q&uEZQ)>4un>4~z>$fGi$%`j0>c4T7M`FAg98Q(okD`@ zVS6MN9B%KGwQrM&{FHKPsxGt31c3vLE$fU$1w0N2J2Y(8y0j=Fd(qpD?TU};W_V9; ij_s3nN!xHhJhhdxL6t+!#-iyVdxxloowR}igEat8K&-I< literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/vista/basic-dialog/bg-center.gif b/www/extras/yui-ext/resources/images/vista/basic-dialog/bg-center.gif new file mode 100644 index 0000000000000000000000000000000000000000..7bf4a4b41d57c4889b8551cbeef72cd4d432e24e GIT binary patch literal 865 zcmZ?wbhEHbWMtUD($2u3udi=oW8>=T>f__%@9)nr3PwXc;Nalv>l+dlnU*2LQ79iGl)DDv*T_w8u`nrUjU3a~{y^h$NdU%=bYO%Gqw-wwx73=-| zZOrb{$Itez7GHmVU&BwXd)`0ZCme2NR<~OtvGMV-36kD%K0iOEoSv$jzHg1>=I7@Y zSa#p@`Sm&D@>1vJc59`!zP`30@^qZ<@2@$xwc;Nalv>l+dlnU*2LQ79iGl)DDv*T_w8u`nrUjU3a~{y^h$NdU%=bYO%Gqw-wwx73=-| zZOrb{$Itez7GHmVU&BwXd)`0ZCme2NR<~OtvGMV-36kD%K0iOEoSv$jzHg1>=I7@Y zSa#p@`Sm&D@>1vJc59`!zP`30@^qZ<@2@$xwC>mi#>VpU^3c%G z*x1;Lii(nwlE}!&va+)3>gr#=ekCO(J$drP-Q7JuKR-S`-rnB6y}iAusj0rczPPy9 z$jInF5HK)UTU#^G5-9#;VPs&CXV3vz0`e0BTlE3|bPpXN`vvW3Cv&po6fUT3Tp6|Y zipKGSFRS+6$yi{pP(v+)H8qICg}=M8HEH5y_HJj9fS23?f*ee>q72m%9TL1kyqywl z3Os=d;&K9V;*%#SFa=JXIX`f&f>@x)%y}Y#OBLAM*0Tk&taoEclH9R#mt>yDC>mi#>VpU^3c%G z*x1;Lii(nwlE}!&va+)3>gr#=ekCO(J$drP-Q7JuKR-S`-rnB6y}iAusj0rczPPy9 z$jInF5HK)UTU#^G5-9#;VPs&CXV3vz0`e0BTh;;pbPpXN`vvW3Cv&po6fUT3Tp6|Y zipKGcZ>@IR%~)WdIQ!&Nhc6o>w%pJCuE@3G#`_;!4Sg?v|Cgv%;0a`FYiA2=QD6$> r=%2t5*sCBGIDJOoGzB)dd7TO@^W0dHB$uyPDVgOlbDe^`BZD;ne9vIC literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/vista/basic-dialog/dlg-bg.gif b/www/extras/yui-ext/resources/images/vista/basic-dialog/dlg-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a466633d70ca1475db2c11061d37911e3b7205c GIT binary patch literal 27857 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 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/vista/basic-dialog/e-handle.gif b/www/extras/yui-ext/resources/images/vista/basic-dialog/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/vista/basic-dialog/expand.gif b/www/extras/yui-ext/resources/images/vista/basic-dialog/expand.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b4b0d1e950e34f602f5227eb7e0fa9d707953b0 GIT binary patch literal 351 zcmZ?wbhEHbC>mi#>VpU^3c%G z*x1;Lii(nwlE}!&va+)3>gr#=ekCO(J$drP-Q7JuKR-S`-rnB6y}iAusj0rczPPy9 z$jInF5HK)UTU#^G5-9#;VPs&CXV3vz0`e0BTg?IgbPpXN`vvW3Cv&po6fUT3Tp6|Y zipKGWFRS+Q`I!WK2soF)wMd{tPORgo!@ddCV(l6WnpXVyFDfL;P$eNJ(a|ZvAKEV*;nZpmDaDF-IY IJ2F@U0DGff6aWAK literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/vista/basic-dialog/hd-sprite.gif b/www/extras/yui-ext/resources/images/vista/basic-dialog/hd-sprite.gif new file mode 100644 index 0000000000000000000000000000000000000000..3c2dd632dd60f2fbd55ca74969053abcb40a0b89 GIT binary patch literal 462 zcmZ?wbhEHbWM-&lxT?fpXlNc46>n&0rmn87t*x)GZ=$BAZDeGTpI@S_ZJ?^EnV6WC zk&zP{o0OH6UsO~c78b3ksjH@@rK@XXVq%q&l9`)ZWNKLk$fb0|QfU z?*KhLV=XN`V`EDrBlG|N|1;1ADE?$&WMEKY&;c0_@)HBw>jMEEEhk&#`URK-H$^z{ zxpy4o2-RA6ROw1a3sa*2i_oi*Q_oMUx-4vQSWy0_K!A&}VS=ctgMQ1axHDb z!irK--MyTgiYzRO^72!s3koVqOV63d%&f@9rYIz&$i?McCMn_W>Fw(u7#tcN866v+ zn4GacD<`j@NU@|$v7)M`u0gS>{bFa|l?jukOq-!NYyRDZi#*yhe_i^SKbLiK1vBI ZAG7-kT6NwL$YRiBUaqntNPvaG8UP8Kc8&l5 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/vista/basic-dialog/s-handle.gif b/www/extras/yui-ext/resources/images/vista/basic-dialog/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#Fh~h2?h>6 U21X7E0S5)gW>$7K4h{xu0Q^P?w*UYD literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/vista/gradient-bg.gif b/www/extras/yui-ext/resources/images/vista/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/vista/grid/grid-split.gif b/www/extras/yui-ext/resources/images/vista/grid/grid-split.gif new file mode 100644 index 0000000000000000000000000000000000000000..c76a16e95997a487ee9cd1675ecdd99bd2f37c17 GIT binary patch literal 817 zcmZ?wbhEHbWMbfDXlGzpvts7||Nj|A!DtAK$PiHc$pZBEe+C_p??HKjfrF2Mkww6x PV8OvA4t_Qc4hCxg>zoX) literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/vista/grid/grid-vista-hd.gif b/www/extras/yui-ext/resources/images/vista/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=`0w!X<41;3Fd70QG6WQVvM_@@t^*=Kd4hpMoq>@<#$&^R ngUt*~JRuPV49@Mm@`0w!X<41;3Fd70QG6WQVvM_=?t^*=Kd4hpMoq>@<#$&^R ngH4QVY9mEVcn)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/vista/layout/ns-collapse.gif b/www/extras/yui-ext/resources/images/vista/layout/ns-collapse.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2ad235dad390e71a096e2e943ade1f22c1de113 GIT binary patch literal 842 zcmZ?wbhEHb`0w!X<41;3Fd70QG6WQVvM_@@t^*=Kd4hpMoq>@<#$&?* n$7V)8E}jD)5)QYqC^Aiu2z=<$#VoJZv*Y8Uqy4PRObpfl%OVxB literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/vista/layout/ns-expand.gif b/www/extras/yui-ext/resources/images/vista/layout/ns-expand.gif new file mode 100644 index 0000000000000000000000000000000000000000..0817ec66fd410022c495adacc4855a4cc548ce0f GIT binary patch literal 843 zcmZ?wbhEHb`0w!X<41;3Fd70QG6WQVvM_=?t^*=Kd4hpMgMpDl#$&^R ogN=+#3Lzc_iVW>+!bUb08y~uKaLb3q?AZA5V7~%88w-Oq0L1MSzyJUM literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/vista/layout/panel-close.gif b/www/extras/yui-ext/resources/images/vista/layout/panel-close.gif new file mode 100644 index 0000000000000000000000000000000000000000..4e96481a1fdb16a6f332ae06e138f15ac24fcc03 GIT binary patch literal 829 zcmZ?wbhEHbWM^P!XlGzZj0<)6@9^Z&RfbV88UiCP1QdU=Ff%YPGU$N34$2b@98wI7 f92^b-4GxWrJbWP?8xjt;u!}3DSX@YSV6X-NNAwV) literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/vista/layout/panel-title-bg.gif b/www/extras/yui-ext/resources/images/vista/layout/panel-title-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..681f517a3c2e78c59a0a066e72c9d98c89bd5798 GIT binary patch literal 888 zcmcJOT}V@57{{M|>C|cSy*dzr-6X~>bt5B8-OE?rwTx5*riBXgoz#9DzP zf_73c5Wmu@^K&s0wVo7-u6twKw`k<)WUe1B%Jm>kn&;S4MzJtR9 zc1K788dw2fm~Ov+l3}{kYMQ1^CX-dAqFL6?^C_A(cXnz+q3Kv`HW-|W$N6M((dRp* z)f!YPox#9btv!**Od^rA*?L!3H%3Rt^m<04(VNXSr*p(;wCHq3i^ajR-TV9d@PC%j z;31yZV(1{Q5`b9f&sFvyr<4)r95y5_F87`i8s^sD6oo!s=$ituoOsj3J1#VwsIp#t zm332pvc(#k`xm=Sym^4EPKdMWC?-j@*h`S-U+>DN*J#c&u0_Z3T z@f3suFuwq24KT9=(Ey~%rUDQ1Nmz*1ei8TDPqUJ6J%#bto2YHJYKUSU&3 z<>fY35_b^=2(r>{o+6&Bf@~DWCCCyuuG-U4*6pDYbd6%t)D0{qBWJ1^#l_<v?3yLtEet$R0a-@ke1!L7RwZ{K@#|Iw3&Po6z~_Tt%#S1(?@dG+S)n|JTu zfB5+E)924$zJC4o{l|}=45MH)1O|5qDE?#tI`BV(4#=6HJi)-B&0t&dV1uJG8;`h7 m$N~dK2L?uF4iSR_21h1VZV8iu4-8H$oC?leGL}XP4AuY#5nmwy literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/vista/layout/stick.gif b/www/extras/yui-ext/resources/images/vista/layout/stick.gif new file mode 100644 index 0000000000000000000000000000000000000000..7db68eec95fc77cce1fc4560a257dd0fef64c200 GIT binary patch literal 872 zcmZ?wbhEHbgwvrlP4cMco57R!o#gWSa7h}g-^(5MS#M@b^&=k d6N!%t8@eSVt=4E1Dje_QlWr4PX`sMh4FDiwBDw$o literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/vista/layout/tab-close-on.gif b/www/extras/yui-ext/resources/images/vista/layout/tab-close-on.gif new file mode 100644 index 0000000000000000000000000000000000000000..556e905b11cddb4abcacaf2160ff811ec47a894d GIT binary patch literal 880 zcmV-$1CRViNk%w1VG95Y0EYko000010RaL60s{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^8LV00930EC2ui01E&M000P00DlP_NKl}>g9s4{d`IWkyNACTy%X5( zSCwBCFIN1ePMyV%9R;2n`Eleqf#u45yqHp;xQ{O{zWfEQ5lwL5BIf+nt*1|)1%v(y G2mm|n+a1fq{uZ2jn48o?zh6WMJix@z}87 pU?UF~kIsPx1?N_NZabd}gGC2BxnzU3XiQk-(8liE#lyj14FHlE< literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/vista/qtip/bg.gif b/www/extras/yui-ext/resources/images/vista/qtip/bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..5c0e8c92a810d244a29f21f467b90f5d61fdf0ec GIT binary patch literal 1024 zcmV+b1poU-Nk%w1VF>_E0EYko000010RaL60s{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^8LV00930EC2ui00{t2000Qx0RIUbI8dFzg9q0sT*$EDLUs@%Mr=p1 zVnuftGiuzJ@twzyAK{4{NwTC#lkrljR4K2e%a<@+&YMZIrcIjka_ZDsucyzSKz-U9 zO0=j^qW6+2UCLA`zNb*3=8GCNpVg~Z^=aM8wd>Y>V8e+p>=mnFs)!ReUCi{TW1~SM1Kmmare&KkGs9fT`K0I1 u@IZ?8$gwm=i>NC~T;$%+c3wNW3C)a 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 E0I-oB(f|Me literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/vista/s.gif b/www/extras/yui-ext/resources/images/vista/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/vista/sizer/e-handle-dark.gif b/www/extras/yui-ext/resources/images/vista/sizer/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/vista/sizer/e-handle.gif b/www/extras/yui-ext/resources/images/vista/sizer/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/vista/sizer/ne-handle-dark.gif b/www/extras/yui-ext/resources/images/vista/sizer/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/vista/sizer/ne-handle.gif b/www/extras/yui-ext/resources/images/vista/sizer/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/vista/sizer/nw-handle-dark.gif b/www/extras/yui-ext/resources/images/vista/sizer/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/vista/sizer/nw-handle.gif b/www/extras/yui-ext/resources/images/vista/sizer/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/vista/sizer/s-handle-dark.gif b/www/extras/yui-ext/resources/images/vista/sizer/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/vista/sizer/se-handle-dark.gif b/www/extras/yui-ext/resources/images/vista/sizer/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/vista/sizer/sw-handle-dark.gif b/www/extras/yui-ext/resources/images/vista/sizer/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/vista/sizer/sw-handle.gif b/www/extras/yui-ext/resources/images/vista/sizer/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>b#?Xj_V)Gl_4D&fNJvOYNy*5_$jQmc&CSir%PS}-C@d^2 zDJdx{E32%mtg5Q2t*x!EuWxEmpg2F=$T!MCXKW;pD p+|RbvM@36v9K^$0{|0b#?Xj_V)Gl_4D%!4h~L8NJvRZ$;ima$;rvh&CScpD<~)^ zEG#T3DJd%}tE{Z7s;a83t*x)GZ)|LAYHDh3ZfD!o=;-L|?Ck03VHgFYAux18 zK=CIF(6Rp+bU;o9tx;JQ*%5wKRY?ytoYTPlbe^b&9Q6dlJ&ZxbYYRl zWG&sQl9iX22Sl6odTm`5+7rA!>+Y$q3D?#o91i-cwQWu0qLlNiVzZ5PZ*MOM-qq{9 zJ@5F=vd^!2JIdGJ-yfIAB+V51M$)UOZ?PaMO6$A`+JIuvH>$MPeJX z)q{ua3T+yXI#i}*JnGa~w&GEj&bAkix($wLJnk{#J8_`b;@OJFeKy}-Jnna3(|j_) zMJ)5lL=UxTv)Kj5G@s8Yxt95SZpE{e&*#;Adzn7}f~3NW1ubG(FBW#Ft$MMj$L!UM#S`4L zUM`sumi2P!G`6mn%jT55dbxZ-o7SrpJx<@BuUxTg)vHx&w!M0_y2R;!`++rEu4TPm zyW`oa*X#Ctd-Zz#0XFS78;*!&zu9;~j{7dt8MD`KHeYble!JyLSoYhkH_}$W-FBz! z_1oUX=|YP3k7uj%_g%1k@P0o7yUvFL zEaEvI4sxik`EZEG{LP2M0`58=j|e%7A3Q3NzUJdGnesOuk1Mq6d^({rJ?GO&jpb`T zozhuv^MJ+RxX$M@Cf9R5pS5_t=JPq5?{7YzcVO53a=}I1b_=UGL&3pIKIU(~Tn=#8 z{dy%NJooF>i1f8zuf>$V{dzs2*!SQKE|v)gZ)PlC`|VcF_P5_|7aZ69ey8Mm?)SSD z&)0sxSMyq}w}F9`Md8PT7V*3v4?EP?{dm-4{_e-)3GRA7pG*nQ`}uU5xPyZOgEau_ C3isjw literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/vista/tabs/tab-btm-left-bg.gif b/www/extras/yui-ext/resources/images/vista/tabs/tab-btm-left-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..1d81e54e1043facc21074c0e90417f108e0a53f0 GIT binary patch literal 895 zcmZ?wbhEHbWM(j8XlGyu4h~L8NJvjl@9F88JbCht9Xs|PKD__%k^M)2=;(n12M!)Q zc>n(W>$e`DIgJ9J(BFZRLb%kS$iPx55vW@VhJMC>~O zX@@{iC=?ov#$Yf60)a>*ve|4tpDz#yghHWACX;T-w|7-CrBkW+8x3~8;fZy+jeBgtD|FMC?K4{>bAA)%Q@qH7J z5I-cmDLQ9zP}mZ30A9K!pm;f(>AF2*tFYuPw0i+sEL|4 zOW#*+j-y58@8C?v-w&@!=w+Of$Zb|#C7E!ZHD1bTbad8_vL-6pn*5S|BD@tZ`3W-~OC@{=r4wGZ*-J8Yf%haXc2esLOxo5})g{ zhoqI1Ncg-xk5#q&;Lw6qcr!w?t$mDq24) zs#g3QUDZ)}^V530qCK`PQQ2{%uUh#_B4tF`iD2rLUB|_VR|vq@Xw~fu?TG45rdzM- zJ`i;^}%aA^^{TbGb0l; zbFAWI3)i`cv+%syt_l1BCuo_41S6~hXjH9L7?QxSJ`YPbT164ri0|frLbUBgG=^al z!)_RD^Rev+`@)g_TKi%mm0@3kM@=>dMb9A|E2+|2$7+U-;aJP`7#)%`!AR%&xhQ<< zpU~7g;Y(Pm$+?lAjdZ;#D8{?~D#47oHcM}qTvBv9k}2H}>$w$NO&xP@)v`?P?YeoS zXQy6@_q=J;jd^yPJV$xykbPljfxI>9npe@0Fz!_n(#>8~PxdjNy0`e6Pjl~bOa$c1 F{{Xv+AMOAE literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/vista/tabs/tab-sprite.gif b/www/extras/yui-ext/resources/images/vista/tabs/tab-sprite.gif new file mode 100644 index 0000000000000000000000000000000000000000..a16eedb822c1d852020d7c58a40307659ad1f8ee GIT binary patch literal 3150 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 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/resources.jsb b/www/extras/yui-ext/resources/resources.jsb new file mode 100644 index 000000000..0d7d32517 --- /dev/null +++ b/www/extras/yui-ext/resources/resources.jsb @@ -0,0 +1,522 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/www/extras/yui-ext/source/adapter/jquery-bridge.js b/www/extras/yui-ext/source/adapter/jquery-bridge.js new file mode 100644 index 000000000..fc43cb833 --- /dev/null +++ b/www/extras/yui-ext/source/adapter/jquery-bridge.js @@ -0,0 +1,398 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +if(typeof jQuery == "undefined"){ + throw "Unable to load Ext, jQuery not found."; +} + +(function(){ + +Ext.lib.Dom = { + getViewWidth : function(full){ + // jQuery doesn't report full window size on document query, so max both + return full ? Math.max(jQuery(document).width(),jQuery(window).width()) : jQuery(window).width(); + }, + + getViewHeight : function(full){ + // jQuery doesn't report full window size on document query, so max both + return full ? Math.max(jQuery(document).height(),jQuery(window).height()) : jQuery(window).height(); + }, + + isAncestor : function(p, c){ + p = Ext.getDom(p); + c = Ext.getDom(c); + if (!p || !c) {return false;} + + if(p.contains && !Ext.isSafari) { + return p.contains(c); + }else if(p.compareDocumentPosition) { + return !!(p.compareDocumentPosition(c) & 16); + }else{ + var parent = c.parentNode; + while (parent) { + if (parent == p) { + return true; + } + else if (!parent.tagName || parent.tagName.toUpperCase() == "HTML") { + return false; + } + parent = parent.parentNode; + } + return false; + } + }, + + getRegion : function(el){ + return Ext.lib.Region.getRegion(el); + }, + + getY : function(el){ + return jQuery(el).offset({scroll:false}).top; + }, + + getX : function(el){ + return jQuery(el).offset({scroll:false}).left; + }, + + getXY : function(el){ + var o = jQuery(el).offset({scroll:false}); + return [o.left, o.top]; + }, + + setXY : function(el, xy){ + el = Ext.fly(el, '_setXY'); + el.position(); + var pts = el.translatePoints(xy); + if(xy[0] !== false){ + el.dom.style.left = pts.left + "px"; + } + if(xy[1] !== false){ + el.dom.style.top = pts.top + "px"; + } + }, + + setX : function(el, x){ + this.setXY(el, [x, false]); + }, + + setY : function(el, y){ + this.setXY(el, [false, y]); + } +}; + +Ext.lib.Event = { + getPageX : function(e){ + e = e.browserEvent || e; + return e.pageX; + }, + + getPageY : function(e){ + e = e.browserEvent || e; + return e.pageY; + }, + + getXY : function(e){ + e = e.browserEvent || e; + return [e.pageX, e.pageY]; + }, + + getTarget : function(e){ + return e.target; + }, + + // all Ext events will go through event manager which provides scoping + on : function(el, eventName, fn, scope, override){ + jQuery(el).bind(eventName, fn); + }, + + un : function(el, eventName, fn){ + jQuery(el).unbind(eventName, fn); + }, + + purgeElement : function(el){ + jQuery(el).unbind(); + }, + + preventDefault : function(e){ + e = e.browserEvent || e; + e.preventDefault(); + }, + + stopPropagation : function(e){ + e = e.browserEvent || e; + e.stopPropagation(); + }, + + stopEvent : function(e){ + e = e.browserEvent || e; + e.preventDefault(); + e.stopPropagation(); + }, + + onAvailable : function(id, fn, scope){ + var start = new Date(); + var f = function(){ + if(start.getElapsed() > 10000){ + clearInterval(iid); + } + var el = document.getElementById(id); + if(el){ + clearInterval(iid); + fn.call(scope||window, el); + } + }; + var iid = setInterval(f, 50); + }, + + resolveTextNode: function(node) { + if (node && 3 == node.nodeType) { + return node.parentNode; + } else { + return node; + } + }, + + getRelatedTarget: function(ev) { + ev = ev.browserEvent || 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); + } +}; + +Ext.lib.Ajax = function(){ + var createComplete = function(cb){ + return function(xhr, status){ + if((status == 'error' || status == 'timeout') && cb.failure){ + cb.failure.call(cb.scope||window, { + responseText: xhr.responseText, + responseXML : xhr.responseXML, + argument: cb.argument + }); + }else if(cb.success){ + cb.success.call(cb.scope||window, { + responseText: xhr.responseText, + responseXML : xhr.responseXML, + argument: cb.argument + }); + } + }; + }; + return { + request : function(method, uri, cb, data){ + jQuery.ajax({ + type: method, + url: uri, + data: data, + timeout: cb.timeout, + complete: createComplete(cb) + }); + }, + + formRequest : function(form, uri, cb, data, isUpload, sslUri){ + jQuery.ajax({ + type: Ext.getDom(form).method ||'POST', + url: uri, + data: jQuery(form).formSerialize()+(data?'&'+data:''), + timeout: cb.timeout, + complete: createComplete(cb) + }); + }, + + isCallInProgress : function(trans){ + return false; + }, + + abort : function(trans){ + return false; + }, + + serializeForm : function(form){ + return jQuery(form.dom||form).formSerialize(); + } + }; +}(); + +Ext.lib.Anim = function(){ + var createAnim = function(cb, scope){ + var animated = true; + return { + stop : function(skipToLast){ + // do nothing + }, + + isAnimated : function(){ + return animated; + }, + + proxyCallback : function(){ + animated = false; + Ext.callback(cb, scope); + } + }; + }; + return { + scroll : function(el, args, duration, easing, cb, scope){ + // scroll anim not supported so just scroll immediately + var anim = createAnim(cb, scope); + el = Ext.getDom(el); + el.scrollLeft = args.scroll.to[0]; + el.scrollTop = args.scroll.to[1]; + anim.proxyCallback(); + return anim; + }, + + motion : function(el, args, duration, easing, cb, scope){ + return this.run(el, args, duration, easing, cb, scope); + }, + + color : function(el, args, duration, easing, cb, scope){ + // color anim not supported, so execute callback immediately + var anim = createAnim(cb, scope); + anim.proxyCallback(); + return anim; + }, + + run : function(el, args, duration, easing, cb, scope, type){ + var anim = createAnim(cb, scope); + var o = {}; + for(var k in args){ + switch(k){ // jquery doesn't support, so convert + case 'points': + var by, pts, e = Ext.fly(el, '_animrun'); + e.position(); + if(by = args.points.by){ + var xy = e.getXY(); + pts = e.translatePoints([xy[0]+by[0], xy[1]+by[1]]); + }else{ + pts = e.translatePoints(args.points.to); + } + o.left = pts.left; + o.top = pts.top; + if(!parseInt(e.getStyle('left'), 10)){ // auto bug + e.setLeft(0); + } + if(!parseInt(e.getStyle('top'), 10)){ + e.setTop(0); + } + break; + case 'width': + o.width = args.width.to; + break; + case 'height': + o.height = args.height.to; + break; + case 'opacity': + o.opacity = args.opacity.to; + break; + default: + o[k] = args[k].to; + break; + } + } + // TODO: find out about easing plug in? + jQuery(el).animate(o, duration*1000, undefined, anim.proxyCallback); + return anim; + } + }; +}(); + + +Ext.lib.Region = function(t, r, b, l) { + this.top = t; + this[1] = t; + this.right = r; + this.bottom = b; + this.left = l; + this[0] = l; +}; + +Ext.lib.Region.prototype = { + contains : function(region) { + return ( region.left >= this.left && + region.right <= this.right && + region.top >= this.top && + region.bottom <= this.bottom ); + + }, + + getArea : function() { + return ( (this.bottom - this.top) * (this.right - this.left) ); + }, + + 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 Ext.lib.Region(t, r, b, l); + } else { + return null; + } + }, + 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 Ext.lib.Region(t, r, b, l); + }, + + adjust : function(t, l, b, r){ + this.top += t; + this.left += l; + this.right += r; + this.bottom += b; + return this; + } +}; + +Ext.lib.Region.getRegion = function(el) { + var p = Ext.lib.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 Ext.lib.Region(t, r, b, l); +}; + +Ext.lib.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; +}; + +Ext.lib.Point.prototype = new Ext.lib.Region(); + +// prevent IE leaks +if(Ext.isIE){ + jQuery(window).unload(function(){ + var p = Function.prototype; + delete p.createSequence; + delete p.defer; + delete p.createDelegate; + delete p.createCallback; + delete p.createInterceptor; + }); +} +})(); \ No newline at end of file diff --git a/www/extras/yui-ext/source/adapter/prototype-bridge.js b/www/extras/yui-ext/source/adapter/prototype-bridge.js new file mode 100644 index 000000000..744772bae --- /dev/null +++ b/www/extras/yui-ext/source/adapter/prototype-bridge.js @@ -0,0 +1,506 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +(function(){ + +var libFlyweight; + +Ext.lib.Dom = { + getViewWidth : function(full){ + return full ? this.getDocumentWidth() : this.getViewportWidth(); + }, + + getViewHeight : function(full){ + return full ? this.getDocumentHeight() : this.getViewportHeight(); + }, + + getDocumentHeight: function() { // missing from prototype? + var scrollHeight = (document.compatMode != "CSS1Compat") ? document.body.scrollHeight : document.documentElement.scrollHeight; + return Math.max(scrollHeight, this.getViewportHeight()); + }, + + getDocumentWidth: function() { // missing from prototype? + var scrollWidth = (document.compatMode != "CSS1Compat") ? document.body.scrollWidth : document.documentElement.scrollWidth; + return Math.max(scrollWidth, this.getViewportWidth()); + }, + + getViewportHeight: function() { // missing from prototype? + var height = self.innerHeight; + var mode = document.compatMode; + + if ( (mode || Ext.isIE) && !Ext.isOpera ) { + height = (mode == "CSS1Compat") ? + document.documentElement.clientHeight : // Standards + document.body.clientHeight; // Quirks + } + + return height; + }, + + getViewportWidth: function() { // missing from prototype? + var width = self.innerWidth; // Safari + var mode = document.compatMode; + + if (mode || Ext.isIE) { // IE, Gecko, Opera + width = (mode == "CSS1Compat") ? + document.documentElement.clientWidth : // Standards + document.body.clientWidth; // Quirks + } + return width; + }, + + isAncestor : function(p, c){ // missing from prototype? + p = Ext.getDom(p); + c = Ext.getDom(c); + if (!p || !c) {return false;} + + if(p.contains && !Ext.isSafari) { + return p.contains(c); + }else if(p.compareDocumentPosition) { + return !!(p.compareDocumentPosition(c) & 16); + }else{ + var parent = c.parentNode; + while (parent) { + if (parent == p) { + return true; + } + else if (!parent.tagName || parent.tagName.toUpperCase() == "HTML") { + return false; + } + parent = parent.parentNode; + } + return false; + } + }, + + getRegion : function(el){ + return Ext.lib.Region.getRegion(el); + }, + + getY : function(el){ + return this.getXY(el)[1]; + }, + + getX : function(el){ + return this.getXY(el)[0]; + }, + + getXY : function(el){ // this initially used Position.cumulativeOffset but it is not accurate enough + var p, pe, b, scroll, bd = document.body; + el = Ext.getDom(el); + + if(el.getBoundingClientRect){ // IE + b = el.getBoundingClientRect(); + scroll = fly(document).getScroll(); + return [b.left + scroll.left, b.top + scroll.top]; + } else{ + var x = el.offsetLeft, y = el.offsetTop; + p = el.offsetParent; + + // ** flag if a parent is positioned for Safari + var hasAbsolute = false; + + if(p != el){ + while(p){ + x += p.offsetLeft; + y += p.offsetTop; + + // ** flag Safari abs position bug - only check if needed + if(Ext.isSafari && !hasAbsolute && fly(p).getStyle("position") == "absolute"){ + hasAbsolute = true; + } + + // ** Fix gecko borders measurements + // Credit jQuery dimensions plugin for the workaround + if(Ext.isGecko){ + pe = fly(p); + var bt = parseInt(pe.getStyle("borderTopWidth"), 10) || 0; + var bl = parseInt(pe.getStyle("borderLeftWidth"), 10) || 0; + + // add borders to offset + x += bl; + y += bt; + + // Mozilla removes the border if the parent has overflow property other than visible + if(p != el && pe.getStyle('overflow') != 'visible'){ + x += bl; + y += bt; + } + } + p = p.offsetParent; + } + } + // ** safari doubles in some cases, use flag from offsetParent's as well + if(Ext.isSafari && (hasAbsolute || fly(el).getStyle("position") == "absolute")){ + x -= bd.offsetLeft; + y -= bd.offsetTop; + } + } + + p = el.parentNode; + + while(p && p != bd){ + // ** opera TR has bad scroll values, so filter them jvs + if(!Ext.isOpera || (Ext.isOpera && p.tagName != 'TR' && fly(p).getStyle("display") != "inline")){ + x -= p.scrollLeft; + y -= p.scrollTop; + } + p = p.parentNode; + } + return [x, y]; + }, + + setXY : function(el, xy){ // this initially used Position.cumulativeOffset but it is not accurate enough + el = Ext.fly(el, '_setXY'); + el.position(); + var pts = el.translatePoints(xy); + if(xy[0] !== false){ + el.dom.style.left = pts.left + "px"; + } + if(xy[1] !== false){ + el.dom.style.top = pts.top + "px"; + } + }, + + setX : function(el, x){ + this.setXY(el, [x, false]); + }, + + setY : function(el, y){ + this.setXY(el, [false, y]); + } +}; + +Ext.lib.Event = { + getPageX : function(e){ + return Event.pointerX(e.browserEvent || e); + }, + + getPageY : function(e){ + return Event.pointerY(e.browserEvent || e); + }, + + getXY : function(e){ + e = e.browserEvent || e; + return [Event.pointerX(e), Event.pointerY(e)]; + }, + + getTarget : function(e){ + return Event.element(e.browserEvent || e); + }, + + resolveTextNode: function(node) { + if (node && 3 == node.nodeType) { + return node.parentNode; + } else { + return node; + } + }, + + getRelatedTarget: function(ev) { // missing from prototype? + ev = ev.browserEvent || 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); + }, + + on : function(el, eventName, fn){ + Event.observe(el, eventName, fn, false); + }, + + un : function(el, eventName, fn){ + Event.stopObserving(el, eventName, fn, false); + }, + + purgeElement : function(el){ + // no equiv? + }, + + preventDefault : function(e){ // missing from prototype? + e = e.browserEvent || e; + if(e.preventDefault) { + e.preventDefault(); + } else { + e.returnValue = false; + } + }, + + stopPropagation : function(e){ // missing from prototype? + e = e.browserEvent || e; + if(e.stopPropagation) { + e.stopPropagation(); + } else { + e.cancelBubble = true; + } + }, + + stopEvent : function(e){ + Event.stop(e.browserEvent || e); + }, + + onAvailable : function(el, fn, scope, override){ // no equiv + var start = new Date(), iid; + var f = function(){ + if(start.getElapsed() > 10000){ + clearInterval(iid); + } + var el = document.getElementById(id); + if(el){ + clearInterval(iid); + fn.call(scope||window, el); + } + }; + iid = setInterval(f, 50); + } +}; + +Ext.lib.Ajax = function(){ + var createSuccess = function(cb){ + return cb.success ? function(xhr){ + cb.success.call(cb.scope||window, { + responseText: xhr.responseText, + responseXML : xhr.responseXML, + argument: cb.argument + }); + } : Ext.emptyFn; + }; + var createFailure = function(cb){ + return cb.failure ? function(xhr){ + cb.failure.call(cb.scope||window, { + responseText: xhr.responseText, + responseXML : xhr.responseXML, + argument: cb.argument + }); + } : Ext.emptyFn; + }; + return { + request : function(method, uri, cb, data){ + new Ajax.Request(uri, { + method: method, + parameters: data || '', + timeout: cb.timeout, + onSuccess: createSuccess(cb), + onFailure: createFailure(cb) + }); + }, + + formRequest : function(form, uri, cb, data, isUpload, sslUri){ + new Ajax.Request(uri, { + method: Ext.getDom(form).method ||'POST', + parameters: Form.serialize(form)+(data?'&'+data:''), + timeout: cb.timeout, + onSuccess: createSuccess(cb), + onFailure: createFailure(cb) + }); + }, + + isCallInProgress : function(trans){ + return false; + }, + + abort : function(trans){ + return false; + }, + + serializeForm : function(form){ + return Form.serialize(form.dom||form, true); + } + }; +}(); + + +Ext.lib.Anim = function(){ + + var easings = { + easeOut: function(pos) { + return 1-Math.pow(1-pos,2); + }, + easeIn: function(pos) { + return 1-Math.pow(1-pos,2); + } + }; + var createAnim = function(cb, scope){ + return { + stop : function(skipToLast){ + this.effect.cancel(); + }, + + isAnimated : function(){ + return this.effect.state == 'running'; + }, + + proxyCallback : function(){ + Ext.callback(cb, scope); + } + }; + }; + return { + scroll : function(el, args, duration, easing, cb, scope){ + // not supported so scroll immediately? + var anim = createAnim(cb, scope); + el = Ext.getDom(el); + el.scrollLeft = args.to[0]; + el.scrollTop = args.to[1]; + anim.proxyCallback(); + return anim; + }, + + motion : function(el, args, duration, easing, cb, scope){ + return this.run(el, args, duration, easing, cb, scope); + }, + + color : function(el, args, duration, easing, cb, scope){ + return this.run(el, args, duration, easing, cb, scope); + }, + + run : function(el, args, duration, easing, cb, scope, type){ + var o = {}; + for(var k in args){ + switch(k){ // scriptaculous doesn't support, so convert these + case 'points': + var by, pts, e = Ext.fly(el, '_animrun'); + e.position(); + if(by = args.points.by){ + var xy = e.getXY(); + pts = e.translatePoints([xy[0]+by[0], xy[1]+by[1]]); + }else{ + pts = e.translatePoints(args.points.to); + } + o.left = pts.left+'px'; + o.top = pts.top+'px'; + break; + case 'width': + o.width = args.width.to+'px'; + break; + case 'height': + o.height = args.height.to+'px'; + break; + case 'opacity': + o.opacity = String(args.opacity.to); + break; + default: + o[k] = String(args[k].to); + break; + } + } + var anim = createAnim(cb, scope); + anim.effect = new Effect.Morph(Ext.id(el), { + duration: duration, + afterFinish: anim.proxyCallback, + transition: easings[easing] || Effect.Transitions.linear, + style: o + }); + return anim; + } + }; +}(); + + +// all lib flyweight calls use their own flyweight to prevent collisions with developer flyweights +function fly(el){ + if(!libFlyweight){ + libFlyweight = new Ext.Element.Flyweight(); + } + libFlyweight.dom = el; + return libFlyweight; +} + +Ext.lib.Region = function(t, r, b, l) { + this.top = t; + this[1] = t; + this.right = r; + this.bottom = b; + this.left = l; + this[0] = l; +}; + +Ext.lib.Region.prototype = { + contains : function(region) { + return ( region.left >= this.left && + region.right <= this.right && + region.top >= this.top && + region.bottom <= this.bottom ); + + }, + + getArea : function() { + return ( (this.bottom - this.top) * (this.right - this.left) ); + }, + + 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 Ext.lib.Region(t, r, b, l); + } else { + return null; + } + }, + 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 Ext.lib.Region(t, r, b, l); + }, + + adjust : function(t, l, b, r){ + this.top += t; + this.left += l; + this.right += r; + this.bottom += b; + return this; + } +}; + +Ext.lib.Region.getRegion = function(el) { + var p = Ext.lib.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 Ext.lib.Region(t, r, b, l); +}; + +Ext.lib.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; +}; + +Ext.lib.Point.prototype = new Ext.lib.Region(); + + +// prevent IE leaks +if(Ext.isIE){ + Event.observe(window, "unload", function(){ + var p = Function.prototype; + delete p.createSequence; + delete p.defer; + delete p.createDelegate; + delete p.createCallback; + delete p.createInterceptor; + }); +} +})(); \ No newline at end of file diff --git a/www/extras/yui-ext/source/adapter/yui-bridge.js b/www/extras/yui-ext/source/adapter/yui-bridge.js new file mode 100644 index 000000000..30ea8013b --- /dev/null +++ b/www/extras/yui-ext/source/adapter/yui-bridge.js @@ -0,0 +1,304 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +if(typeof YAHOO == "undefined"){ + throw "Unable to load Ext, core YUI utilities (yahoo, dom, event) not found."; +} + +(function(){ +var E = YAHOO.util.Event; +var D = YAHOO.util.Dom; +var CN = YAHOO.util.Connect; + +var ES = YAHOO.util.Easing; +var A = YAHOO.util.Anim; +var libFlyweight; + +Ext.lib.Dom = { + getViewWidth : function(full){ + return full ? D.getDocumentWidth() : D.getViewportWidth(); + }, + + getViewHeight : function(full){ + return full ? D.getDocumentHeight() : D.getViewportHeight(); + }, + + isAncestor : function(haystack, needle){ + return D.isAncestor(haystack, needle); + }, + + getRegion : function(el){ + return D.getRegion(el); + }, + + getY : function(el){ + return this.getXY(el)[1]; + }, + + getX : function(el){ + return this.getXY(el)[0]; + }, + + // original version based on YahooUI getXY + // this version fixes several issues in Safari and FF + // and boosts performance by removing the batch overhead, repetitive dom lookups and array index calls + getXY : function(el){ + var p, pe, b, scroll, bd = document.body; + el = Ext.getDom(el); + + if(el.getBoundingClientRect){ // IE + b = el.getBoundingClientRect(); + scroll = fly(document).getScroll(); + return [b.left + scroll.left, b.top + scroll.top]; + } else{ + var x = el.offsetLeft, y = el.offsetTop; + p = el.offsetParent; + + // ** flag if a parent is positioned for Safari + var hasAbsolute = false; + + if(p != el){ + while(p){ + x += p.offsetLeft; + y += p.offsetTop; + + // ** flag Safari abs position bug - only check if needed + if(Ext.isSafari && !hasAbsolute && fly(p).getStyle("position") == "absolute"){ + hasAbsolute = true; + } + + // ** Fix gecko borders measurements + // Credit jQuery dimensions plugin for the workaround + if(Ext.isGecko){ + pe = fly(p); + var bt = parseInt(pe.getStyle("borderTopWidth"), 10) || 0; + var bl = parseInt(pe.getStyle("borderLeftWidth"), 10) || 0; + + // add borders to offset + x += bl; + y += bt; + + // Mozilla removes the border if the parent has overflow property other than visible + if(p != el && pe.getStyle('overflow') != 'visible'){ + x += bl; + y += bt; + } + } + p = p.offsetParent; + } + } + // ** safari doubles in some cases, use flag from offsetParent's as well + if(Ext.isSafari && (hasAbsolute || fly(el).getStyle("position") == "absolute")){ + x -= bd.offsetLeft; + y -= bd.offsetTop; + } + } + + p = el.parentNode; + + while(p && p != bd){ + // ** opera TR has bad scroll values, so filter them jvs + if(!Ext.isOpera || (Ext.isOpera && p.tagName != 'TR' && fly(p).getStyle("display") != "inline")){ + x -= p.scrollLeft; + y -= p.scrollTop; + } + p = p.parentNode; + } + return [x, y]; + }, + + setXY : function(el, xy){ + el = Ext.fly(el, '_setXY'); + el.position(); + var pts = el.translatePoints(xy); + if(xy[0] !== false){ + el.dom.style.left = pts.left + "px"; + } + if(xy[1] !== false){ + el.dom.style.top = pts.top + "px"; + } + }, + + setX : function(el, x){ + this.setXY(el, [x, false]); + }, + + setY : function(el, y){ + this.setXY(el, [false, y]); + } +}; + +Ext.lib.Event = { + getPageX : function(e){ + return E.getPageX(e.browserEvent || e); + }, + + getPageY : function(e){ + return E.getPageY(e.browserEvent || e); + }, + + getXY : function(e){ + return E.getXY(e.browserEvent || e); + }, + + getTarget : function(e){ + return E.getTarget(e.browserEvent || e); + }, + + getRelatedTarget : function(e){ + return E.getRelatedTarget(e.browserEvent || e); + }, + + on : function(el, eventName, fn, scope, override){ + E.on(el, eventName, fn, scope, override); + }, + + un : function(el, eventName, fn){ + E.removeListener(el, eventName, fn); + }, + + purgeElement : function(el){ + E.purgeElement(el); + }, + + preventDefault : function(e){ + E.preventDefault(e.browserEvent || e); + }, + + stopPropagation : function(e){ + E.stopPropagation(e.browserEvent || e); + }, + + stopEvent : function(e){ + E.stopEvent(e.browserEvent || e); + }, + + onAvailable : function(el, fn, scope, override){ + return E.onAvailable(el, fn, scope, override); + } +}; + +Ext.lib.Ajax = { + request : function(method, uri, cb, data){ + return CN.asyncRequest(method, uri, cb, data); + }, + + formRequest : function(form, uri, cb, data, isUpload, sslUri){ + CN.setForm(form, isUpload, sslUri); + return CN.asyncRequest(Ext.getDom(form).method ||'POST', uri, cb, data); + }, + + isCallInProgress : function(trans){ + return CN.isCallInProgress(trans); + }, + + abort : function(trans){ + return CN.abort(trans); + }, + + serializeForm : function(form){ + var d = CN.setForm(form.dom || form); + CN.resetFormState(); + return d; + } +}; + +Ext.lib.Region = YAHOO.util.Region; +Ext.lib.Point = YAHOO.util.Point; + + +Ext.lib.Anim = { + scroll : function(el, args, duration, easing, cb, scope){ + this.run(el, args, duration, easing, cb, scope, YAHOO.util.Scroll); + }, + + motion : function(el, args, duration, easing, cb, scope){ + this.run(el, args, duration, easing, cb, scope, YAHOO.util.Motion); + }, + + color : function(el, args, duration, easing, cb, scope){ + this.run(el, args, duration, easing, cb, scope, YAHOO.util.ColorAnim); + }, + + run : function(el, args, duration, easing, cb, scope, type){ + type = type || YAHOO.util.Anim; + if(typeof easing == "string"){ + easing = YAHOO.util.Easing[easing]; + } + var anim = new type(el, args, duration, easing); + anim.animateX(function(){ + Ext.callback(cb, scope); + }); + return anim; + } +}; + +// all lib flyweight calls use their own flyweight to prevent collisions with developer flyweights +function fly(el){ + if(!libFlyweight){ + libFlyweight = new Ext.Element.Flyweight(); + } + libFlyweight.dom = el; + return libFlyweight; +} + +// prevent IE leaks +if(Ext.isIE){ + YAHOO.util.Event.on(window, "unload", function(){ + var p = Function.prototype; + delete p.createSequence; + delete p.defer; + delete p.createDelegate; + delete p.createCallback; + delete p.createInterceptor; + }); +} + +// various overrides + +// add ability for callbacks with animations +if(YAHOO.util.Anim){ + YAHOO.util.Anim.prototype.animateX = function(callback, scope){ + var f = function(){ + this.onComplete.unsubscribe(f); + if(typeof callback == "function"){ + callback.call(scope || this, this); + } + }; + this.onComplete.subscribe(f, this, true); + this.animate(); + }; +} + +if(YAHOO.util.DragDrop && Ext.dd.DragDrop){ + YAHOO.util.DragDrop.defaultPadding = Ext.dd.DragDrop.defaultPadding; + YAHOO.util.DragDrop.constrainTo = Ext.dd.DragDrop.constrainTo; +} + +YAHOO.util.Dom.getXY = function(el) { + var f = function(el) { + return Ext.lib.Dom.getXY(el); + }; + return YAHOO.util.Dom.batch(el, f, YAHOO.util.Dom, true); +}; + + +// workaround for Safari anim duration speed problems +if(YAHOO.util.AnimMgr){ + YAHOO.util.AnimMgr.fps = 1000; +} + +YAHOO.util.Region.prototype.adjust = function(t, l, b, r){ + this.top += t; + this.left += l; + this.right += r; + this.bottom += b; + return this; +}; + +})(); \ No newline at end of file diff --git a/www/extras/yui-ext/source/core/CompositeElement.js b/www/extras/yui-ext/source/core/CompositeElement.js new file mode 100644 index 000000000..cf0e28e39 --- /dev/null +++ b/www/extras/yui-ext/source/core/CompositeElement.js @@ -0,0 +1,212 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.CompositeElement + * Standard composite class. Creates a Ext.Element for every element in the collection. + *

          + * NOTE: Although they are not listed, this class supports all of the set/update methods of Ext.Element. All 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 = 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);
          + 
          + */ +Ext.CompositeElement = function(els){ + this.elements = []; + this.addElements(els); +}; +Ext.CompositeElement.prototype = { + isComposite: true, + addElements : function(els){ + if(!els) return this; + if(typeof els == "string"){ + els = Ext.Element.selectorFunction(els); + } + var yels = this.elements; + var index = yels.length-1; + for(var i = 0, len = els.length; i < len; i++) { + yels[++index] = Ext.get(els[i], true); + } + return this; + }, + invoke : function(fn, args){ + var els = this.elements; + for(var i = 0, len = els.length; i < len; i++) { + 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(Ext.Element.selectorFunction(els)); + }else if(els.length !== undefined){ + 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++){ + if(fn.call(scope || els[i], els[i], this, i) === false) { + break; + } + } + return this; + }, + + /** + * Returns the Element object at the specified index + * @param {Number} index + * @return {Ext.Element} + */ + item : function(index){ + return this.elements[index]; + } +}; +(function(){ +Ext.CompositeElement.createCall = function(proto, fnName){ + if(!proto[fnName]){ + proto[fnName] = function(){ + return this.invoke(fnName, arguments); + }; + } +}; +for(var fnName in Ext.Element.prototype){ + if(typeof Ext.Element.prototype[fnName] == "function"){ + Ext.CompositeElement.createCall(Ext.CompositeElement.prototype, fnName); + } +}; +})(); + +/** + * @class Ext.CompositeElementLite + * @extends Ext.CompositeElement + * Flyweight composite class. Reuses the same Ext.Element for element operations. + *

          + * NOTE: Although they are not listed, this class supports all of the set/update methods of Ext.Element. All Ext.Element + * actions will be performed on all the elements in this collection. + */ +Ext.CompositeElementLite = function(els){ + Ext.CompositeElementLite.superclass.constructor.call(this, els); + var flyEl = function(){}; + flyEl.prototype = Ext.Element.prototype; + this.el = new Ext.Element.Flyweight(); +}; +Ext.extend(Ext.CompositeElementLite, Ext.CompositeElement, { + addElements : function(els){ + if(els){ + if(els instanceof Array){ + this.elements = this.elements.concat(els); + }else{ + var yels = this.elements; + var index = yels.length-1; + for(var i = 0, len = els.length; i < len; i++) { + yels[++index] = els[i]; + } + } + } + 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]; + Ext.Element.prototype[fn].apply(el, args); + } + return this; + }, + /** + * Returns a flyweight Element of the dom element object at the specified index + * @param {Number} index + * @return {Ext.Element} + */ + item : function(index){ + this.el.dom = this.elements[index]; + return this.el; + }, + + // fixes scope with flyweight + addListener : function(eventName, handler, scope, opt){ + var els = this.elements; + for(var i = 0, len = els.length; i < len; i++) { + Ext.EventManager.on(els[i], eventName, handler, scope || els[i], opt); + } + return this; + }, + + /** + * Calls the passed function passing (el, this, index) for each element in this composite. The element + * passed is the flyweight (shared) Ext.Element instance, so if you require a + * a reference to the dom node, use el.dom. + * @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; + var el = this.el; + for(var i = 0, len = els.length; i < len; i++){ + el.dom = els[i]; + if(fn.call(scope || el, el, this, i) === false){ + break; + } + } + return this; + } +}); +Ext.CompositeElementLite.prototype.on = Ext.CompositeElementLite.prototype.addListener; +if(Ext.DomQuery){ + Ext.Element.selectorFunction = Ext.DomQuery.select; +} + +Ext.Element.select = function(selector, unique){ + var els; + if(typeof selector == "string"){ + els = Ext.Element.selectorFunction(selector); + }else if(selector.length !== undefined){ + els = selector; + }else{ + throw "Invalid selector"; + } + if(unique === true){ + return new Ext.CompositeElement(els); + }else{ + return new Ext.CompositeElementLite(els); + } +}; +/** + * 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 Ext.Element for each element (defaults to a shared flyweight object) + * @return {CompositeElementLite/CompositeElement} + * @member Ext + * @method select + */ +Ext.select = Ext.Element.select; \ No newline at end of file diff --git a/www/extras/yui-ext/source/core/DomHelper.js b/www/extras/yui-ext/source/core/DomHelper.js new file mode 100644 index 000000000..79fde0ed5 --- /dev/null +++ b/www/extras/yui-ext/source/core/DomHelper.js @@ -0,0 +1,395 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class 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 + */ +Ext.DomHelper = function(){ + var tempTableEl = null; + var emptyTags = /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i; + + // build as innerHTML where available + /** @ignore */ + var createHtml = function(o){ + if(typeof o == 'string'){ + return o; + } + var b = ""; + if(!o.tag){ + o.tag = "div"; + } + b += "<" + o.tag; + for(var attr in o){ + if(attr == "tag" || attr == "children" || attr == "cn" || 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 += ">"; + var cn = o.children || o.cn; + if(cn){ + if(cn instanceof Array){ + for(var i = 0, len = cn.length; i < len; i++) { + b += createHtml(cn[i], b); + } + }else{ + b += createHtml(cn, b); + } + } + if(o.html){ + b += o.html; + } + b += ""; + } + return b; + }; + + // build as dom + /** @ignore */ + var createDom = function(o, parentNode){ + var el = document.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 == "cn" || 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]; + } + } + Ext.DomHelper.applyStyles(el, o.style); + var cn = o.children || o.cn; + if(cn){ + if(cn instanceof Array){ + for(var i = 0, len = cn.length; i < len; i++) { + createDom(cn[i], el); + } + }else{ + createDom(cn, el); + } + } + if(o.html){ + el.innerHTML = o.html; + } + if(parentNode){ + parentNode.appendChild(el); + } + return el; + }; + + var ieTable = function(depth, s, h, e){ + tempTableEl.innerHTML = [s, h, e].join(''); + var i = -1, el = tempTableEl; + while(++i < depth){ + el = el.firstChild; + } + return el; + }; + + // kill repeat to save bytes + var ts = '', + te = '
          ', + tbs = ts+'', + tbe = ''+te, + trs = tbs + '', + tre = ''+tbe; + + /** + * @ignore + * Nasty code for IE's broken table implementation + */ + var insertIntoTable = function(tag, where, el, html){ + if(!tempTableEl){ + tempTableEl = document.createElement('div'); + } + var node; + var before = null; + if(tag == 'td'){ + if(where == 'afterbegin' || where == 'beforeend'){ // INTO a TD + return; + } + if(where == 'beforebegin'){ + before = el; + el = el.parentNode; + } else{ + before = el.nextSibling; + el = el.parentNode; + } + node = ieTable(4, trs, html, tre); + } + else if(tag == 'tr'){ + if(where == 'beforebegin'){ + before = el; + el = el.parentNode; + node = ieTable(3, tbs, html, tbe); + } else if(where == 'afterend'){ + before = el.nextSibling; + el = el.parentNode; + node = ieTable(3, tbs, html, tbe); + } else{ // INTO a TR + if(where == 'afterbegin'){ + before = el.firstChild; + } + node = ieTable(4, trs, html, tre); + } + } else if(tag == 'tbody'){ + if(where == 'beforebegin'){ + before = el; + el = el.parentNode; + node = ieTable(2, ts, html, te); + } else if(where == 'afterend'){ + before = el.nextSibling; + el = el.parentNode; + node = ieTable(2, ts, html, te); + } else{ + if(where == 'afterbegin'){ + before = el.firstChild; + } + node = ieTable(3, tbs, html, tbe); + } + } else{ // TABLE + if(where == 'beforebegin' || where == 'afterend'){ // OUTSIDE the table + return; + } + if(where == 'afterbegin'){ + before = el.firstChild; + } + node = ieTable(2, ts, html, te); + } + el.insertBefore(node, before); + return node; + }; + + return { + /** True to force the use of DOM instead of html fragments @type Boolean */ + useDom : false, + + /** + * Returns the markup for the passed Element(s) config + * @param {Object} o The Dom object spec (and children) + * @return {String} + */ + markup : function(o){ + return createHtml(o); + }, + + /** + * 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. + */ + applyStyles : function(el, styles){ + if(styles){ + el = Ext.fly(el); + if(typeof styles == "string"){ + var re = /\s?([a-z\-]*)\:\s?([^;]*);?/gi; + var matches; + while ((matches = re.exec(styles)) != null){ + el.setStyle(matches[1], matches[2]); + } + }else if (typeof styles == "object"){ + for (var style in styles){ + el.setStyle(style, styles[style]); + } + }else if (typeof styles == "function"){ + Ext.DomHelper.applyStyles(el, styles.call()); + } + } + }, + + /** + * 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 + */ + insertHtml : function(where, el, html){ + where = where.toLowerCase(); + if(el.insertAdjacentHTML){ + var tag = el.tagName.toLowerCase(); + if(tag == "table" || tag == "tbody" || tag == "tr" || tag == 'td'){ + var rs; + if(rs = insertIntoTable(tag, where, el, html)){ + return rs; + } + } + 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); + frag = range.createContextualFragment(html); + el.insertBefore(frag, el.firstChild); + return el.firstChild; + }else{ + el.innerHTML = html; + return el.firstChild; + } + case "beforeend": + if(el.lastChild){ + range.setStartAfter(el.lastChild); + frag = range.createContextualFragment(html); + el.appendChild(frag); + return el.lastChild; + }else{ + el.innerHTML = html; + 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 {String/HTMLElement/Element} el The context element + * @param {Object} o The Dom object spec (and children) + * @param {Boolean} returnElement (optional) true to return a Ext.Element + * @return {HTMLElement} The new node + */ + insertBefore : function(el, o, returnElement){ + return this.doInsert(el, o, returnElement, "beforeBegin"); + }, + + /** + * Creates new Dom element(s) and inserts them after el + * @param {String/HTMLElement/Element} el The context element + * @param {Object} o The Dom object spec (and children) + * @param {Boolean} returnElement (optional) true to return a Ext.Element + * @return {HTMLElement} The new node + */ + insertAfter : function(el, o, returnElement){ + return this.doInsert(el, o, returnElement, "afterEnd", "nextSibling"); + }, + + /** + * Creates new Dom element(s) and inserts them as the first child of el + * @param {String/HTMLElement/Element} el The context element + * @param {Object} o The Dom object spec (and children) + * @param {Boolean} returnElement (optional) true to return a Ext.Element + * @return {HTMLElement} The new node + */ + insertFirst : function(el, o, returnElement){ + return this.doInsert(el, o, returnElement, "afterBegin"); + }, + + // private + doInsert : function(el, o, returnElement, pos, sibling){ + el = Ext.getDom(el); + var newNode; + if(this.useDom){ + newNode = createDom(o, null); + el.parentNode.insertBefore(newNode, sibling ? el[sibling] : el); + }else{ + var html = createHtml(o); + newNode = this.insertHtml(pos, el, html); + } + return returnElement ? Ext.get(newNode, true) : newNode; + }, + + /** + * Creates new Dom element(s) and appends them to el + * @param {String/HTMLElement/Element} el The context element + * @param {Object} o The Dom object spec (and children) + * @param {Boolean} returnElement (optional) true to return a Ext.Element + * @return {HTMLElement} The new node + */ + append : function(el, o, returnElement){ + el = Ext.getDom(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 ? Ext.get(newNode, true) : newNode; + }, + + /** + * Creates new Dom element(s) and overwrites the contents of el with them + * @param {String/HTMLElement/Element} el The context element + * @param {Object} o The Dom object spec (and children) + * @param {Boolean} returnElement (optional) true to return a Ext.Element + * @return {HTMLElement} The new node + */ + overwrite : function(el, o, returnElement){ + el = Ext.getDom(el); + el.innerHTML = createHtml(o); + return returnElement ? Ext.get(el.firstChild, true) : el.firstChild; + }, + + /** + * Creates a new Ext.DomHelper.Template from the Dom object spec + * @param {Object} o The Dom object spec (and children) + * @return {Ext.DomHelper.Template} The new template + */ + createTemplate : function(o){ + var html = createHtml(o); + return new Ext.Template(html); + } + }; +}(); diff --git a/www/extras/yui-ext/source/core/DomQuery.js b/www/extras/yui-ext/source/core/DomQuery.js new file mode 100644 index 000000000..5b9068df1 --- /dev/null +++ b/www/extras/yui-ext/source/core/DomQuery.js @@ -0,0 +1,715 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* + * This is code is also distributed under MIT license for use + * with jQuery and prototype JavaScript libraries. + */ +/** + * @class Ext.DomQuery + * Provides high performance selector/xpath processing by compiling queries into reusable functions. + * New pseudo classes and matchers can be plugged. It works on HTML and XML documents (if a content node is passed in). + * @singleton + */ +Ext.DomQuery = function(){ + var cache = {}, simpleCache = {}, valueCache = {}; + var nonSpace = /\S/; + var trimRe = /^\s+|\s+$/g; + var tplRe = /\{(\d+)\}/g; + var modeRe = /^(\s?[\/>]\s?|\s|$)/; + var tagTokenRe = /^(#)?([\w-\*]+)/; + + function child(p, index){ + var i = 0; + var n = p.firstChild; + while(n){ + if(n.nodeType == 1){ + if(++i == index){ + return n; + } + } + n = n.nextSibling; + } + return null; + }; + + function next(n){ + while((n = n.nextSibling) && n.nodeType != 1); + return n; + }; + + function prev(n){ + while((n = n.previousSibling) && n.nodeType != 1); + return n; + }; + + function clean(d){ + var n = d.firstChild, ni = -1; + while(n){ + var nx = n.nextSibling; + if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){ + d.removeChild(n); + }else{ + n.nodeIndex = ++ni; + } + n = nx; + } + return this; + }; + + function byClassName(c, a, v, re, cn){ + if(!v){ + return c; + } + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + cn = ci.className; + if(cn && (' '+cn+' ').indexOf(v) != -1){ + r[r.length] = ci; + } + } + return r; + }; + + function attrValue(n, attr){ + if(!n.tagName && typeof n.length != "undefined"){ + n = n[0]; + } + if(!n){ + return null; + } + if(attr == "for"){ + return n.htmlFor; + } + if(attr == "class" || attr == "className"){ + return n.className; + } + return n.getAttribute(attr) || n[attr]; + + }; + + function getNodes(ns, mode, tagName){ + var result = [], cs; + if(!ns){ + return result; + } + mode = mode ? mode.replace(trimRe, "") : ""; + tagName = tagName || "*"; + if(typeof ns.getElementsByTagName != "undefined"){ + ns = [ns]; + } + if(mode != "/" && mode != ">"){ + for(var i = 0, ni; ni = ns[i]; i++){ + cs = ni.getElementsByTagName(tagName); + for(var j = 0, ci; ci = cs[j]; j++){ + result[result.length] = ci; + } + } + }else{ + for(var i = 0, ni; ni = ns[i]; i++){ + var cn = ni.getElementsByTagName(tagName); + for(var j = 0, cj; cj = cn[j]; j++){ + if(cj.parentNode == ni){ + result[result.length] = cj; + } + } + } + } + return result; + }; + + function concat(a, b){ + if(b.slice){ + return a.concat(b); + } + for(var i = 0, l = b.length; i < l; i++){ + a[a.length] = b[i]; + } + return a; + } + + function byTag(cs, tagName){ + if(cs.tagName || cs == document){ + cs = [cs]; + } + if(!tagName){ + return cs; + } + var r = []; tagName = tagName.toLowerCase(); + for(var i = 0, ci; ci = cs[i]; i++){ + if(ci.nodeType == 1 && ci.tagName.toLowerCase()==tagName){ + r[r.length] = ci; + } + } + return r; + }; + + function byId(cs, attr, id){ + if(cs.tagName || cs == document){ + cs = [cs]; + } + if(!id){ + return cs; + } + var r = []; + for(var i = 0,ci; ci = cs[i]; i++){ + if(ci && ci.id == id){ + r[r.length] = ci; + return r; + } + } + return r; + }; + + function byAttribute(cs, attr, value, op, custom){ + var r = [], st = custom=="{"; + var f = Ext.DomQuery.operators[op]; + for(var i = 0; ci = cs[i]; i++){ + var a; + if(st){ + a = Ext.DomQuery.getStyle(ci, attr); + } + else if(attr == "class" || attr == "className"){ + a = ci.className; + }else if(attr == "for"){ + a = ci.htmlFor; + }else if(attr == "href"){ + a = ci.getAttribute("href", 2); + }else{ + a = ci.getAttribute(attr); + } + if((f && f(a, value)) || (!f && a)){ + r[r.length] = ci; + } + } + return r; + }; + + function byPseudo(cs, name, value){ + return Ext.DomQuery.pseudos[name](cs, value); + }; + + // This is for IE MSXML which does not support expandos. + // IE runs the same speed using setAttribute, however FF slows way down + // and Safari completely fails so they need to continue to use expandos. + var isIE = window.ActiveXObject ? true : false; + + var key = 30803; + + function nodupIEXml(cs){ + var d = ++key; + cs[0].setAttribute("_nodup", d); + var r = [cs[0]]; + for(var i = 1, len = cs.length; i < len; i++){ + var c = cs[i]; + if(!c.getAttribute("_nodup") != d){ + c.setAttribute("_nodup", d); + r[r.length] = c; + } + } + for(var i = 0, len = cs.length; i < len; i++){ + cs[i].removeAttribute("_nodup"); + } + return r; + } + + function nodup(cs){ + if(!cs){ + return []; + } + var len = cs.length, c, i, r = cs, cj; + if(!len || typeof cs.nodeType != "undefined" || len == 1){ + return cs; + } + if(isIE && typeof cs[0].selectSingleNode != "undefined"){ + return nodupIEXml(cs); + } + var d = ++key; + cs[0]._nodup = d; + for(i = 1; c = cs[i]; i++){ + if(c._nodup != d){ + c._nodup = d; + }else{ + r = []; + for(var j = 0; j < i; j++){ + r[r.length] = cs[j]; + } + for(j = i+1; cj = cs[j]; j++){ + if(cj._nodup != d){ + cj._nodup = d; + r[r.length] = cj; + } + } + return r; + } + } + return r; + } + + function quickDiffIEXml(c1, c2){ + var d = ++key; + for(var i = 0, len = c1.length; i < len; i++){ + c1[i].setAttribute("_qdiff", d); + } + var r = []; + for(var i = 0, len = c2.length; i < len; i++){ + if(c2[i].getAttribute("_qdiff") != d){ + r[r.length] = c2[i]; + } + } + for(var i = 0, len = c1.length; i < len; i++){ + c1[i].removeAttribute("_qdiff"); + } + return r; + } + + function quickDiff(c1, c2){ + var len1 = c1.length; + if(!len1){ + return c2; + } + if(isIE && c1[0].selectSingleNode){ + return quickDiffIEXml(c1, c2); + } + var d = ++key; + for(var i = 0; i < len1; i++){ + c1[i]._qdiff = d; + } + var r = []; + for(var i = 0, len = c2.length; i < len; i++){ + if(c2[i]._qdiff != d){ + r[r.length] = c2[i]; + } + } + return r; + } + + function quickId(ns, mode, root, id){ + if(ns == root){ + var d = root.ownerDocument || root; + return d.getElementById(id); + } + ns = getNodes(ns, mode, "*"); + return byId(ns, null, id); + } + + return { + getStyle : function(el, name){ + return Ext.fly(el).getStyle(name); + }, + /** + * Compiles a selector/xpath query into a reusable function. The returned function + * takes one parameter "root" (optional), which is the context node from where the query should start. + * @param {String} selector The selector/xpath query + * @param {String} type (optional) Either "select" (the default) or "simple" for a simple selector match + * @return {Function} + */ + compile : function(path, type){ + // strip leading slashes + while(path.substr(0, 1)=="/"){ + path = path.substr(1); + } + type = type || "select"; + + var fn = ["var f = function(root){\n var mode; var n = root || document;\n"]; + var q = path, mode, lq; + var tk = Ext.DomQuery.matchers; + var tklen = tk.length; + var mm; + while(q && lq != q){ + lq = q; + var tm = q.match(tagTokenRe); + if(type == "select"){ + if(tm){ + if(tm[1] == "#"){ + fn[fn.length] = 'n = quickId(n, mode, root, "'+tm[2]+'");'; + }else{ + fn[fn.length] = 'n = getNodes(n, mode, "'+tm[2]+'");'; + } + q = q.replace(tm[0], ""); + }else if(q.substr(0, 1) != '@'){ + fn[fn.length] = 'n = getNodes(n, mode, "*");'; + } + }else{ + if(tm){ + if(tm[1] == "#"){ + fn[fn.length] = 'n = byId(n, null, "'+tm[2]+'");'; + }else{ + fn[fn.length] = 'n = byTag(n, "'+tm[2]+'");'; + } + q = q.replace(tm[0], ""); + } + } + while(!(mm = q.match(modeRe))){ + var matched = false; + for(var j = 0; j < tklen; j++){ + var t = tk[j]; + var m = q.match(t.re); + if(m){ + fn[fn.length] = t.select.replace(tplRe, function(x, i){ + return m[i]; + }); + q = q.replace(m[0], ""); + matched = true; + break; + } + } + // prevent infinite loop on bad selector + if(!matched){ + throw 'Error parsing selector, parsing failed at "' + q + '"'; + } + } + if(mm[1]){ + fn[fn.length] = 'mode="'+mm[1]+'";'; + q = q.replace(mm[1], ""); + } + } + fn[fn.length] = "return nodup(n);\n}"; + eval(fn.join("")); + return f; + }, + + /** + * Selects a group of elements. + * @param {String} selector The selector/xpath query + * @param {Node} root (optional) The start of the query (defaults to document). + * @return {Array} + */ + select : function(path, root, type){ + if(!root || root == document){ + root = document; + } + if(typeof root == "string"){ + root = document.getElementById(root); + } + var paths = path.split(","); + var results = []; + for(var i = 0, len = paths.length; i < len; i++){ + var p = paths[i].replace(trimRe, ""); + if(!cache[p]){ + cache[p] = Ext.DomQuery.compile(p); + if(!cache[p]){ + throw p + " is not a valid selector"; + } + } + var result = cache[p](root); + if(result && result != document){ + results = results.concat(result); + } + } + return results; + }, + + /** + * Selects a single element. + * @param {String} selector The selector/xpath query + * @param {Node} root (optional) The start of the query (defaults to document). + * @return {Element} + */ + selectNode : function(path, root){ + return Ext.DomQuery.select(path, root)[0]; + }, + + /** + * Selects the value of a node, optionally replacing null with the defaultValue. + * @param {String} selector The selector/xpath query + * @param {Node} root (optional) The start of the query (defaults to document). + * @param {String} defaultValue + */ + selectValue : function(path, root, defaultValue){ + path = path.replace(trimRe, ""); + if(!valueCache[path]){ + valueCache[path] = Ext.DomQuery.compile(path, "select"); + } + var n = valueCache[path](root); + n = n[0] ? n[0] : n; + var v = (n && n.firstChild ? n.firstChild.nodeValue : null); + return (v === null ? defaultValue : v); + }, + + /** + * Selects the value of a node, parsing integers and floats. + * @param {String} selector The selector/xpath query + * @param {Node} root (optional) The start of the query (defaults to document). + * @param {Number} defaultValue + * @return {Number} + */ + selectNumber : function(path, root, defaultValue){ + var v = Ext.DomQuery.selectValue(path, root, defaultValue || 0); + return parseFloat(v); + }, + + /** + * Returns true if the passed element(s) match the passed simple selector (e.g. div.some-class or span:first-child) + * @param {String/HTMLElement/Array} el An element id, element or array of elements + * @param {String} selector The simple selector to test + * @return {Boolean} + */ + is : function(el, ss){ + if(typeof el == "string"){ + el = document.getElementById(el); + } + var isArray = (el instanceof Array); + var result = Ext.DomQuery.filter(isArray ? el : [el], ss); + return isArray ? (result.length == el.length) : (result.length > 0); + }, + + /** + * Filters an array of elements to only include matches of a simple selector (e.g. div.some-class or span:first-child) + * @param {Array} el An array of elements to filter + * @param {String} selector The simple selector to test + * @param {Boolean} nonMatches If true, it returns the elements that DON'T match + * the selector instead of the ones that match + * @return {Array} + */ + filter : function(els, ss, nonMatches){ + ss = ss.replace(trimRe, ""); + if(!simpleCache[ss]){ + simpleCache[ss] = Ext.DomQuery.compile(ss, "simple"); + } + var result = simpleCache[ss](els); + return nonMatches ? quickDiff(result, els) : result; + }, + + /** + * Collection of matching regular expressions and code snippets. + */ + matchers : [{ + re: /^\.([\w-]+)/, + select: 'n = byClassName(n, null, " {1} ");' + }, { + re: /^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/, + select: 'n = byPseudo(n, "{1}", "{2}");' + },{ + re: /^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/, + select: 'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");' + }, { + re: /^#([\w-]+)/, + select: 'n = byId(n, null, "{1}");' + },{ + re: /^@([\w-]+)/, + select: 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};' + } + ], + + /** + * Collection of operator comparison functions. The default operators are =, !=, ^=, $=, *= and %=. + * New operators can be added as long as the match the format c= where c is any character other than space, > <. + */ + operators : { + "=" : function(a, v){ + return a == v; + }, + "!=" : function(a, v){ + return a != v; + }, + "^=" : function(a, v){ + return a && a.substr(0, v.length) == v; + }, + "$=" : function(a, v){ + return a && a.substr(a.length-v.length) == v; + }, + "*=" : function(a, v){ + return a && a.indexOf(v) !== -1; + }, + "%=" : function(a, v){ + return (a % v) == 0; + } + }, + + /** + * Collection of "pseudo class" processors. Each processor is passed the current nodeset (array) + * and the argument (if any) supplied in the selector. + */ + pseudos : { + "first-child" : function(c){ + var r = [], n; + for(var i = 0, ci; ci = n = c[i]; i++){ + while((n = n.previousSibling) && n.nodeType != 1); + if(!n){ + r[r.length] = ci; + } + } + return r; + }, + + "last-child" : function(c){ + var r = []; + for(var i = 0, ci; ci = n = c[i]; i++){ + while((n = n.nextSibling) && n.nodeType != 1); + if(!n){ + r[r.length] = ci; + } + } + return r; + }, + + "nth-child" : function(c, a){ + var r = []; + if(a != "odd" && a != "even"){ + for(var i = 0, ci; ci = c[i]; i++){ + var m = child(ci.parentNode, a); + if(m == ci){ + r[r.length] = m; + } + } + return r; + } + var p; + // first let's clean up the parent nodes + for(var i = 0, l = c.length; i < l; i++){ + var cp = c[i].parentNode; + if(cp != p){ + clean(cp); + p = cp; + } + } + // then lets see if we match + for(var i = 0, ci; ci = c[i]; i++){ + var m = false; + if(a == "odd"){ + m = ((ci.nodeIndex+1) % 2 == 1); + }else if(a == "even"){ + m = ((ci.nodeIndex+1) % 2 == 0); + } + if(m){ + r[r.length] = ci; + } + } + return r; + }, + + "only-child" : function(c){ + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + if(!prev(ci) && !next(ci)){ + r[r.length] = ci; + } + } + return r; + }, + + "empty" : function(c){ + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + var cns = ci.childNodes, j = 0, cn, empty = true; + while(cn = cns[j]){ + ++j; + if(cn.nodeType == 1 || cn.nodeType == 3){ + empty = false; + break; + } + } + if(empty){ + r[r.length] = ci; + } + } + return r; + }, + + "contains" : function(c, v){ + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + if(ci.innerHTML.indexOf(v) !== -1){ + r[r.length] = ci; + } + } + return r; + }, + + "nodeValue" : function(c, v){ + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + if(ci.firstChild && ci.firstChild.nodeValue == v){ + r[r.length] = ci; + } + } + return r; + }, + + "checked" : function(c){ + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + if(ci.checked == true){ + r[r.length] = ci; + } + } + return r; + }, + + "not" : function(c, ss){ + return Ext.DomQuery.filter(c, ss, true); + }, + + "odd" : function(c){ + return this["nth-child"](c, "odd"); + }, + + "even" : function(c){ + return this["nth-child"](c, "even"); + }, + + "nth" : function(c, a){ + return c[a-1] || []; + }, + + "first" : function(c){ + return c[0] || []; + }, + + "last" : function(c){ + return c[c.length-1] || []; + }, + + "has" : function(c, ss){ + var s = Ext.DomQuery.select; + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + if(s(ss, ci).length > 0){ + r[r.length] = ci; + } + } + return r; + }, + + "next" : function(c, ss){ + var is = Ext.DomQuery.is; + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + var n = next(ci); + if(n && is(n, ss)){ + r[r.length] = ci; + } + } + return r; + }, + + "prev" : function(c, ss){ + var is = Ext.DomQuery.is; + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + var n = prev(ci); + if(n && is(n, ss)){ + r[r.length] = ci; + } + } + return r; + } + } + }; +}(); + +/** + * Selects an array of DOM nodes by CSS/XPath selector. Shorthand of {@link Ext.DomQuery#select} + * @param {String} path The selector/xpath query + * @param {Node} root (optional) The start of the query (defaults to document). + * @return {Array} + * @member Ext + * @method query + */ +Ext.query = Ext.DomQuery.select; diff --git a/www/extras/yui-ext/source/core/Element.js b/www/extras/yui-ext/source/core/Element.js new file mode 100644 index 000000000..67408dd1e --- /dev/null +++ b/www/extras/yui-ext/source/core/Element.js @@ -0,0 +1,2806 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.Element + * Represents an Element in the DOM.

          + * Usage:
          +
          
          +var el = Ext.get("my-div");
          +
          +// or with getEl
          +var el = getEl("my-div");
          +
          +// or with a DOM element
          +var el = Ext.get(myDivElement);
          +
          + * Using Ext.get() or getEl() instead of calling the constructor directly ensures you get the same object + * each call instead of constructing a new one.

          + * Animations
          + * Many of the functions for manipulating an element have an optional "animate" parameter. The animate parameter + * should either be a boolean (true) or an object literal with animation options. The animation options are: +
          +Option    Default   Description
          +--------- --------  ---------------------------------------------
          +duration  .35       The duration of the animation in seconds
          +easing    easeOut   The YUI easing method
          +callback  none      A function to execute when the anim completes
          +scope     this      The scope (this) of the callback function
          +
          +* Also, the Anim object being used for the animation will be set on your options object as "anim", which allows you to stop or +* manipulate the animation. Here's an example: +
          
          +var el = Ext.get("my-div");
          +
          +// no animation
          +el.setWidth(100);
          +
          +// default animation
          +el.setWidth(100, true);
          +
          +// animation with some options set
          +el.setWidth(100, {
          +    duration: 1, 
          +    callback: this.foo, 
          +    scope: this
          +});
          +
          +// using the "anim" property to get the Anim object
          +var opt = {
          +    duration: 1, 
          +    callback: this.foo, 
          +    scope: this
          +};
          +el.setWidth(100, opt);
          +...
          +if(opt.anim.isAnimated()){
          +    opt.anim.stop();
          +}
          +
          +* Composite (Collections of) Elements
          + * For working with collections of Elements, see Ext.CompositeElement + * @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). + */ +(function(){ +var D = Ext.lib.Dom; +var E = Ext.lib.Event; +var A = Ext.lib.Anim; + +// local style camelizing for speed +var propCache = {}; +var camelRe = /(-[a-z])/gi; +var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); }; +var view = document.defaultView; + +Ext.Element = function(element, forceNew){ + var dom = typeof element == "string" ? + document.getElementById(element) : element; + if(!dom){ // invalid id/element + return null; + } + if(!forceNew && Ext.Element.cache[dom.id]){ // element object already exists + return Ext.Element.cache[dom.id]; + } + /** + * The DOM element + * @type HTMLElement + */ + this.dom = dom; + + /** + * The DOM element ID + * @type String + */ + this.id = dom.id || Ext.id(dom); +}; + +var El = Ext.Element; + +El.prototype = { + /** + * The element's default display mode @type String + */ + originalDisplay : "", + + visibilityMode : 1, + /** + * The default unit to append to CSS values where a unit isn't provided (Defaults to px). + * @type String + */ + defaultUnit : "px", + /** + * 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 {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 {Ext.Element} this + */ + enableDisplayMode : function(display){ + this.setVisibilityMode(El.DISPLAY); + if(typeof display != "undefined") this.originalDisplay = display; + return this; + }, + + /** + * Looks at this node and then at parent nodes for a match of the passed simple selector (e.g. div.some-class or span:first-child) + * @param {String} ss The simple selector to test + * @param {Number/String/HTMLElement/Element} maxDepth (optional) The max depth to + search as a number or element (defaults to 10 || document.body) + * @param {Boolean} returnEl (optional) True to return a Ext.Element object instead of DOM node + * @return {HTMLElement} + */ + findParent : function(simpleSelector, maxDepth, returnEl){ + var p = this.dom, b = document.body, depth = 0, dq = Ext.DomQuery, stopEl; + maxDepth = maxDepth || 50; + if(typeof maxDepth != "number"){ + stopEl = Ext.getDom(maxDepth); + maxDepth = 10; + } + while(p && p.nodeType == 1 && depth < maxDepth && p != b && p != stopEl){ + if(dq.is(p, simpleSelector)){ + return returnEl ? Ext.get(p) : p; + } + depth++; + p = p.parentNode; + } + return null; + }, + + + /** + * Looks at parent nodes for a match of the passed simple selector (e.g. div.some-class or span:first-child) + * @param {String} ss The simple selector to test + * @param {Number/String/HTMLElement/Element} maxDepth (optional) The max depth to + search as a number or element (defaults to 10 || document.body) + * @param {Boolean} returnEl (optional) True to return a Ext.Element object instead of DOM node + * @return {HTMLElement} + */ + findParentNode : function(simpleSelector, maxDepth, returnEl){ + var p = Ext.fly(this.dom.parentNode, '_internal'); + return p ? p.findParent(simpleSelector, maxDepth, returnEl) : null; + }, + + /** + * Walks up the dom looking for a parent node that matches the passed simple selector (e.g. div.some-class or span:first-child). + * This is a shortcut for findParentNode() that always returns an Ext.Element. + * @param {String} ss The simple selector to test + * @param {Number/String/HTMLElement/Element} maxDepth (optional) The max depth to + search as a number or element (defaults to 10 || document.body) + * @return {Ext.Element} + */ + up : function(simpleSelector, maxDepth){ + return this.findParentNode(simpleSelector, maxDepth, true); + }, + + + + /** + * Returns true if this element matches the passed simple selector (e.g. div.some-class or span:first-child) + * @param {String} ss The simple selector to test + * @return {Boolean} + */ + is : function(simpleSelector){ + return Ext.DomQuery.is(this.dom, simpleSelector); + }, + + /** + * Perform 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 {String} easing (optional) Easing method to use. (Defaults to 'easeOut') + * @param {String} animType (optional) 'run' is the default. Can be 'color', 'motion', or 'scroll' + * @return {Ext.Element} this + */ + animate : function(args, duration, onComplete, easing, animType){ + this.anim(args, {duration: duration, callback: onComplete, easing: easing}, animType); + return this; + }, + + /* + * @private Internal animation call + */ + anim : function(args, opt, animType, defaultDur, defaultEase, cb){ + animType = animType || 'run'; + opt = opt || {}; + var anim = Ext.lib.Anim[animType]( + this.dom, args, + (opt.duration || defaultDur) || .35, + (opt.easing || defaultEase) || 'easeOut', + function(){ + Ext.callback(cb, this); + Ext.callback(opt.callback, opt.scope || this, [this, opt]); + }, + this + ); + opt.anim = anim; + return anim; + }, + + // private legacy anim prep + preanim : function(a, i){ + return !a[i] ? false : (typeof a[i] == "object" ? a[i]: {duration: a[i+1], callback: a[i+2], easing: a[i+3]}); + }, + + /** + * Removes worthless text nodes + * @param {Boolean} forceReclean (optional) By default the element + * keeps track if it has been cleaned already so + * you can call this over and over. However, if you update the element and + * need to force a reclean, you can pass true. + */ + clean : function(forceReclean){ + if(this.isCleaned && forceReclean !== true){ + return this; + } + var ns = /\S/; + var d = this.dom, n = d.firstChild, ni = -1; + while(n){ + var nx = n.nextSibling; + if(n.nodeType == 3 && !ns.test(n.nodeValue)){ + d.removeChild(n); + }else{ + n.nodeIndex = ++ni; + } + n = nx; + } + this.isCleaned = true; + return this; + }, + + calcOffsetsTo : function(el){ + el = Ext.get(el), d = el.dom; + var restorePos = false; + if(el.getStyle('position') == 'static'){ + el.position('relative'); + restorePos = true; + } + var x = 0, y =0; + var op = this.dom; + while(op && op != d && op.tagName != 'HTML'){ + x+= op.offsetLeft; + y+= op.offsetTop; + op = op.offsetParent; + } + if(restorePos){ + el.position('static'); + } + return [x, y]; + }, + + /** + * Scrolls this element into view within the passed container. + * @param {String/HTMLElement/Element} container (optional) The container element to scroll (defaults to document.body) + * @param {Boolean} hscroll (optional) false to disable horizontal scroll + * @return {Ext.Element} this + */ + scrollIntoView : function(container, hscroll){ + var c = Ext.getDom(container) || document.body; + var el = this.dom; + + var o = this.calcOffsetsTo(c), + l = o[0], + t = o[1], + b = t+el.offsetHeight, + r = l+el.offsetWidth; + + var ch = c.clientHeight; + var ct = parseInt(c.scrollTop, 10); + var cl = parseInt(c.scrollLeft, 10); + var cb = ct + ch; + var cr = cl + c.clientWidth; + + if(t < ct){ + c.scrollTop = t; + }else if(b > cb){ + c.scrollTop = b-ch; + } + + if(hscroll !== false){ + if(l < cl){ + c.scrollLeft = l; + }else if(r > cr){ + c.scrollLeft = r-c.clientWidth; + } + } + return this; + }, + + scrollChildIntoView : function(child){ + Ext.fly(child, '_scrollChildIntoView').scrollIntoView(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 {String} easing (optional) Easing method to use. + * @return {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; + }, + + /** + * Returns true if this element is an ancestor of the passed element + * @param {HTMLElement/String} el + * @return {Boolean} + */ + contains : function(el){ + if(!el){return false;} + return D.isAncestor(this.dom, el.dom ? el.dom : el); + }, + + /** + * 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 = !(this.getStyle("visibility") == "hidden" || this.getStyle("display") == "none"); + if(deep !== true || !vis){ + return vis; + } + var p = this.dom.parentNode; + while(p && p.tagName.toLowerCase() != "body"){ + if(!Ext.fly(p, '_isVisible').isVisible()){ + return false; + } + p = p.parentNode; + } + return true; + }, + + /** + * Creates a CompositeElement for 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 Ext.Element for each child (defaults to a shared flyweight object) + * @return {CompositeElement/CompositeElementLite} The composite element + */ + select : function(selector, unique){ + return El.select("#" + Ext.id(this.dom) + " " + selector, unique); + }, + + /** + * Selects child nodes based on the passed CSS selector (the selector should not contain an id) + * @param {String} selector The CSS selector + * @return {Array} An array of the matched nodes + */ + query : function(selector, unique){ + return Ext.DomQuery.select("#" + Ext.id(this.dom) + " " + selector); + }, + + /** + * Selects a single child based on the passed CSS selector (the selector should not contain an id) + * @param {String} selector The CSS selector + * @param {Boolean} returnDom true to return the DOM node instead of Ext.Element + * @return {Element} The element + */ + child : function(selector, returnDom){ + var n = Ext.DomQuery.selectNode("#" + Ext.id(this.dom) + " " + selector); + return returnDom ? n : Ext.get(n); + }, + + /** + * Selects a single *direct* child based on the passed CSS selector (the selector should not contain an id) + * @param {String} selector The CSS selector + * @param {Boolean} returnDom true to return the DOM node instead of Ext.Element + * @return {Element} The element + */ + down : function(selector, returnDom){ + var n = Ext.DomQuery.selectNode("#" + Ext.id(this.dom) + " > " + selector); + return returnDom ? n : Ext.get(n); + }, + + /** + * Initializes a Ext.dd.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 {Ext.dd.DD} The DD object + */ + initDD : function(group, config, overrides){ + var dd = new Ext.dd.DD(Ext.id(this.dom), group, config); + return Ext.apply(dd, overrides); + }, + + /** + * Initializes a Ext.dd.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 {Ext.dd.DDProxy} The DDProxy object + */ + initDDProxy : function(group, config, overrides){ + var dd = new Ext.dd.DDProxy(Ext.id(this.dom), group, config); + return Ext.apply(dd, overrides); + }, + + /** + * Initializes a Ext.dd.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 {Ext.dd.DDTarget} The DDTarget object + */ + initDDTarget : function(group, config, overrides){ + var dd = new Ext.dd.DDTarget(Ext.id(this.dom), group, config); + return Ext.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/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + setVisible : function(visible, animate){ + if(!animate || !A){ + if(this.visibilityMode == El.DISPLAY){ + this.setDisplayed(visible); + }else{ + this.fixDisplay(); + this.dom.style.visibility = visible ? "visible" : "hidden"; + } + }else{ + // closure for composites + var dom = this.dom; + var visMode = this.visibilityMode; + if(visible){ + this.setOpacity(.01); + this.setVisible(true); + } + this.anim({opacity: { to: (visible?1:0) }}, + this.preanim(arguments, 1), + null, .35, 'easeIn', function(){ + if(!visible){ + if(visMode == El.DISPLAY){ + dom.style.display = "none"; + }else{ + dom.style.visibility = "hidden"; + } + Ext.get(dom).setOpacity(1); + } + }); + } + return this; + }, + + /** + * Returns true if display is not "none" + * @return {Boolean} + */ + isDisplayed : function() { + return this.getStyle("display") != "none"; + }, + + /** + * Toggles the elements visibility or display, depending on visibility mode. + * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + toggle : function(animate){ + this.setVisible(!this.isVisible(), this.preanim(arguments, 0)); + return this; + }, + + /** + * Sets the css display. Uses originalDisplay if value is a boolean true. + * @param {Boolean} value Boolean to display the element using its default display or a string to set the display directly + * @return {Ext.Element} this + */ + setDisplayed : function(value) { + if(typeof value == "boolean"){ + value = value ? this.originalDisplay : "none"; + } + this.setStyle("display", value); + return this; + }, + + /** + * Tries to focus the element. Any exceptions are caught. + * @return {Ext.Element} this + */ + focus : function() { + try{ + this.dom.focus(); + }catch(e){} + return this; + }, + + /** + * Tries to blur the element. Any exceptions are caught. + * @return {Ext.Element} this + */ + blur : function() { + try{ + this.dom.blur(); + }catch(e){} + return this; + }, + + /** + * Add a CSS class to the element. + * @param {String/Array} className The CSS class to add or an array of classes + * @return {Ext.Element} this + */ + addClass : function(className){ + if(className instanceof Array){ + for(var i = 0, len = className.length; i < len; i++) { + this.addClass(className[i]); + } + }else{ + if(className && !this.hasClass(className)){ + this.dom.className = this.dom.className + " " + 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 {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){ + Ext.get(s).removeClass(className); + } + } + this.addClass(className); + return this; + }, + + /** + * Removes a CSS class from the element. + * @param {String/Array} className The CSS class to remove or an array of classes + * @return {Ext.Element} this + */ + removeClass : function(className){ + if(!className || !this.dom.className){ + return this; + } + if(className instanceof Array){ + for(var i = 0, len = className.length; i < len; i++) { + this.removeClass(className[i]); + } + }else{ + if(this.hasClass(className)){ + var re = this.classReCache[className]; + if (!re) { + re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)', "g"); + this.classReCache[className] = re; + } + this.dom.className = + this.dom.className.replace(re, " "); + } + } + return this; + }, + + classReCache: {}, + + /** + * Toggles (adds or removes) the passed class. + * @param {String} className + * @return {Ext.Element} this + */ + toggleClass : function(className){ + if(this.hasClass(className)){ + this.removeClass(className); + }else{ + this.addClass(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 className && (' '+this.dom.className+' ').indexOf(' '+className+' ') != -1; + }, + + /** + * 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 {Ext.Element} this + */ + replaceClass : function(oldClassName, newClassName){ + this.removeClass(oldClassName); + this.addClass(newClassName); + return this; + }, + + /** + * Get an object with properties matching the styles requested. + * e.g. el.getStyles('color', 'font-size', 'width') might return + * {'color': '#FFFFFF', 'font-size': '13px', 'width': '100px'}. + * @param {String} style1 + * @param {String} style2 + * @param {String} etc + * @return Object + */ + getStyles : function(){ + var a = arguments, len = a.length, r = {}; + for(var i = 0; i < len; i++){ + r[a[i]] = this.getStyle(a[i]); + } + return r; + }, + + /** + * Normalizes currentStyle and computedStyle. This is not YUI getStyle, it is an optimised version. + * @param {String} property The style property whose value is returned. + * @return {String} The current value of the style property for this element. + */ + getStyle : function(){ + return view && view.getComputedStyle ? + function(prop){ + var el = this.dom, v, cs, camel; + if(prop == 'float'){ + prop = "cssFloat"; + } + if(v = el.style[prop]){ + return v; + } + if(cs = view.getComputedStyle(el, "")){ + if(!(camel = propCache[prop])){ + camel = propCache[prop] = prop.replace(camelRe, camelFn); + } + return cs[camel]; + } + return null; + } : + function(prop){ + var el = this.dom, v, cs, camel; + if(prop == 'opacity'){ + if(typeof el.filter == 'string'){ + var fv = parseFloat(el.filter.match(/alpha\(opacity=(.*)\)/i)[1]); + if(!isNaN(fv)){ + return fv ? fv / 100 : 0; + } + } + return 1; + }else if(prop == 'float'){ + prop = "styleFloat"; + } + if(!(camel = propCache[prop])){ + camel = propCache[prop] = prop.replace(camelRe, camelFn); + } + if(v = el.style[camel]){ + return v; + } + if(cs = el.currentStyle){ + return cs[camel]; + } + return null; + }; + }(), + + /** + * 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 {Ext.Element} this + */ + setStyle : function(prop, value){ + if(typeof prop == "string"){ + var camel; + if(!(camel = propCache[prop])){ + camel = propCache[prop] = prop.replace(camelRe, camelFn); + } + if(camel == 'opacity') { + this.setOpacity(value); + }else{ + this.dom.style[camel] = value; + } + }else{ + for(var style in prop){ + if(typeof prop[style] != "function"){ + this.setStyle(style, prop[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 {Ext.Element} this + */ + applyStyles : function(style){ + 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 D.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 D.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 D.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/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + setX : function(x, animate){ + if(!animate || !A){ + D.setX(this.dom, x); + }else{ + this.setXY([x, this.getY()], this.preanim(arguments, 1)); + } + 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/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + setY : function(y, animate){ + if(!animate || !A){ + D.setY(this.dom, y); + }else{ + this.setXY([this.getX(), y], this.preanim(arguments, 1)); + } + return this; + }, + + /** + * Set the element's left position directly using CSS style (instead of setX()) + * @param {String} left The left CSS property value + * @return {Ext.Element} this + */ + setLeft : function(left){ + this.setStyle("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 {Ext.Element} this + */ + setTop : function(top){ + this.setStyle("top", this.addUnits(top)); + return this; + }, + + /** + * Set the element's css right style + * @param {String} right The right CSS property value + * @return {Ext.Element} this + */ + setRight : function(right){ + this.setStyle("right", this.addUnits(right)); + return this; + }, + + /** + * Set the element's css bottom style + * @param {String} bottom The bottom CSS property value + * @return {Ext.Element} this + */ + setBottom : function(bottom){ + this.setStyle("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/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + setXY : function(pos, animate){ + if(!animate || !A){ + D.setXY(this.dom, pos); + }else{ + this.anim({points: {to: pos}}, this.preanim(arguments, 1), '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/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + setLocation : function(x, y, animate){ + this.setXY([x, y], this.preanim(arguments, 2)); + 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/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + moveTo : function(x, y, animate){ + this.setXY([x, y], this.preanim(arguments, 2)); + 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 Ext.lib.Region containing "top, left, bottom, right" member data. + */ + getRegion : function(){ + return D.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 || 0; + 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 || 0; + return contentWidth !== true ? w : w-this.getBorderWidth("lr")-this.getPadding("lr"); + }, + + /** + * Returns either the offsetHeight or the height of this element based on CSS height adjusted by padding or borders + * when needed to simulate offsetHeight when offsets aren't available. This may not work on display:none elements + * if a height has not been set using CSS. + * @return {Number} + */ + getComputedHeight : function(){ + var h = Math.max(this.dom.offsetHeight, this.dom.clientHeight); + if(!h){ + h = parseInt(this.getStyle('height'), 10) || 0; + if(!this.isBorderBox()){ + h += this.getFrameWidth('tb'); + } + } + return h; + }, + + /** + * Returns either the offsetWidth or the width of this element based on CSS width adjusted by padding or borders + * when needed to simulate offsetWidth when offsets aren't available. This may not work on display:none elements + * if a width has not been set using CSS. + * @return {Number} + */ + getComputedWidth : function(){ + var w = Math.max(this.dom.offsetWidth, this.dom.clientWidth); + if(!w){ + w = parseInt(this.getStyle('width'), 10) || 0; + if(!this.isBorderBox()){ + w += this.getFrameWidth('lr'); + } + } + return w; + }, + + /** + * 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)}; + }, + + getViewSize : function(){ + var d = this.dom, doc = document, aw = 0, ah = 0; + if(d == doc || d == doc.body){ + return {width : D.getViewWidth(), height: D.getViewHeight()}; + }else{ + return { + width : d.clientWidth, + height: d.clientHeight + }; + } + }, + + /** + * Returns the value of the "value" attribute + * @param {Boolean} asNumber true to parse the value as a number + * @return {String/Number} + */ + getValue : function(asNumber){ + return asNumber ? parseInt(this.dom.value, 10) : this.dom.value; + }, + + /** @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/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + setWidth : function(width, animate){ + width = this.adjustWidth(width); + if(!animate || !A){ + this.dom.style.width = this.addUnits(width); + }else{ + this.anim({width: {to: width}}, this.preanim(arguments, 1)); + } + return this; + }, + + /** + * Set the height of the element + * @param {Number} height The new height + * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + setHeight : function(height, animate){ + height = this.adjustHeight(height); + if(!animate || !A){ + this.dom.style.height = this.addUnits(height); + }else{ + this.anim({height: {to: height}}, this.preanim(arguments, 1)); + } + 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/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + setSize : function(width, height, animate){ + if(typeof width == "object"){ // in case of object from getSize() + height = width.height; width = width.width; + } + width = this.adjustWidth(width); height = this.adjustHeight(height); + if(!animate || !A){ + this.dom.style.width = this.addUnits(width); + this.dom.style.height = this.addUnits(height); + }else{ + this.anim({width: {to: width}, height: {to: height}}, this.preanim(arguments, 2)); + } + 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/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + setBounds : function(x, y, width, height, animate){ + if(!animate || !A){ + this.setSize(width, 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}}, + this.preanim(arguments, 4), '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 {Ext.lib.Region} region The region to fill + * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + setRegion : function(region, animate){ + this.setBounds(region.left, region.top, region.right-region.left, region.bottom-region.top, this.preanim(arguments, 1)); + return this; + }, + + /** + * Appends an event handler + * + * @param {String} eventName The type of event to append + * @param {Function} fn The method the event invokes + * @param {Object} scope (optional) The scope (this object) of the fn + * @param {Object} options (optional)An object with standard EventManager options + */ + addListener : function(eventName, fn, scope, options){ + Ext.EventManager.on(this.dom, eventName, fn, scope || this, options); + }, + + /** + * Removes an event handler from this element + * @param {String} eventName the type of event to remove + * @param {Function} fn the method the event invokes + * @return {Ext.Element} this + */ + removeListener : function(eventName, fn){ + Ext.EventManager.removeListener(this.dom, eventName, fn); + return this; + }, + + /** + * Removes all previous added listeners from this element + * @return {Ext.Element} this + */ + removeAllListeners : function(){ + E.purgeElement(this.dom); + return this; + }, + + relayEvent : function(eventName, observable){ + this.on(eventName, function(e){ + observable.fireEvent(eventName, e); + }); + }, + + /** + * Set the opacity of the element + * @param {Float} opacity The new opacity. 0 = transparent, .5 = 50% visibile, 1 = fully visible, etc + * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + setOpacity : function(opacity, animate){ + if(!animate || !A){ + var s = this.dom.style; + if(Ext.isIE){ + s.zoom = 1; + s.filter = (s.filter || '').replace(/alpha\([^\)]*\)/gi,"") + + (opacity == 1 ? "" : "alpha(opacity=" + opacity * 100 + ")"); + }else{ + s.opacity = opacity; + } + }else{ + this.anim({opacity: {to: opacity}}, this.preanim(arguments, 1), null, .35, 'easeIn'); + } + 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; + } + }, + + /** + * Initializes positioning on this element. If a desired position is not passed, it will make the + * the element positioned relative IF it is not already positioned. + * @param {String} pos (optional) Positioning to use "relative", "absolute" or "fixed" + * @param {Number} zIndex (optional) The zIndex to apply + * @param {Number} x (optional) Set the page X position + * @param {Number} y (optional) Set the page Y position + */ + position : function(pos, zIndex, x, y){ + if(!pos){ + if(this.getStyle('position') == 'static'){ + this.setStyle('position', 'relative'); + } + }else{ + this.setStyle("position", pos); + } + if(zIndex){ + this.setStyle("z-index", zIndex); + } + if(x !== undefined && y !== undefined){ + this.setXY([x, y]); + }else if(x !== undefined){ + this.setX(x); + }else if(y !== undefined){ + this.setY(y); + } + }, + + /** + * Clear positioning back to the default when the document was loaded + * @param {String} value (optional) The value to use for the left,right,top,bottom, defaults to '' (empty string). You could use 'auto'. + * @return {Ext.Element} this + */ + clearPositioning : function(value){ + value = value ||''; + this.setStyle({ + "left": value, + "right": value, + "top": value, + "bottom": value, + "z-index": "", + "position" : "static" + }); + 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(){ + var l = this.getStyle("left"); + var t = this.getStyle("top"); + return { + "position" : this.getStyle("position"), + "left" : l, + "right" : l ? "" : this.getStyle("right"), + "top" : t, + "bottom" : t ? "" : this.getStyle("bottom"), + "z-index" : this.getStyle("z-index") + }; + }, + + /** + * 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, El.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, El.paddings); + }, + + /** + * Set positioning with an object returned by getPositioning(). + * @param {Object} posCfg + * @return {Ext.Element} this + */ + setPositioning : function(pc){ + this.applyStyles(pc); + if(pc.right == "auto"){ + this.dom.style.right = ""; + } + if(pc.bottom == "auto"){ + this.dom.style.bottom = ""; + } + return this; + }, + + fixDisplay : function(){ + if(this.getStyle("display") == "none"){ + this.setStyle("visibility", "hidden"); + this.setStyle("display", this.originalDisplay); // first try reverting to default + if(this.getStyle("display") == "none"){ // if that fails, default to block + this.setStyle("display", "block"); + } + } + }, + + /** + * Quick set left and top adding default units + * @return {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 its 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/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + move : function(direction, distance, animate){ + var xy = this.getXY(); + direction = direction.toLowerCase(); + switch(direction){ + case "l": + case "left": + this.moveTo(xy[0]-distance, xy[1], this.preanim(arguments, 2)); + break; + case "r": + case "right": + this.moveTo(xy[0]+distance, xy[1], this.preanim(arguments, 2)); + break; + case "t": + case "top": + case "up": + this.moveTo(xy[0], xy[1]-distance, this.preanim(arguments, 2)); + break; + case "b": + case "bottom": + case "down": + this.moveTo(xy[0], xy[1]+distance, this.preanim(arguments, 2)); + break; + } + return this; + }, + + /** + * Store the current overflow setting and clip overflow on the element - use {@link #unclip} to remove + * @return {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 {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; + }, + + + /** + * Gets the x,y coordinates specified by the anchor position on the element. + * @param {String} anchor (optional) The specified anchor position (defaults to "c"). See {@link #alignTo} for details on supported anchor positions. + * @param {Object} size (optional) An object containing the size to use for calculating anchor position + * {width: (target width), height: (target height)} (defaults to the element's current size) + * @param {Boolean} local (optional) True to get the local (element top/left-relative) anchor position instead of page coordinates + * @return {Array} [x, y] An array containing the element's x and y coordinates + */ + getAnchorXY : function(anchor, local, s){ + //Passing a different size is useful for pre-calculating anchors, + //especially for anchored animations that change the el size. + + var w, h, vp = false; + if(!s){ + var d = this.dom; + if(d == document.body || d == document){ + vp = true; + w = D.getViewWidth(); h = D.getViewHeight(); + }else{ + w = this.getWidth(); h = this.getHeight(); + } + }else{ + w = s.width; h = s.height; + } + var x = 0, y = 0, r = Math.round; + switch((anchor || "tl").toLowerCase()){ + case "c": + x = r(w*.5); + y = r(h*.5); + break; + case "t": + x = r(w*.5); + y = 0; + break; + case "l": + x = 0; + y = r(h*.5); + break; + case "r": + x = w; + y = r(h*.5); + break; + case "b": + x = r(w*.5); + y = h; + break; + case "tl": + x = 0; + y = 0; + break; + case "bl": + x = 0; + y = h; + break; + case "br": + x = w; + y = h; + break; + case "tr": + x = w; + y = 0; + break; + } + if(local === true){ + return [x, y]; + } + if(vp){ + var sc = this.getScroll(); + return [x + sc.left, y + sc.top]; + } + //Add the element's offset xy + var o = this.getXY(); + return [x+o[0], y+o[1]]; + }, + + /** + * Gets the x,y coordinates to align this element with another element. See {@link #alignTo} for more info on the + * supported position values. + * @param {String/HTMLElement/Ext.Element} element The element to align to. + * @param {String} position The position to align to. + * @param {Array} offsets (optional) Offset the positioning by [x, y] + * @return {Array} [x, y] + */ + getAlignToXY : function(el, p, o){ + el = Ext.get(el), d = this.dom; + if(!el.dom){ + throw "Element.alignTo with an element that doesn't exist"; + } + var c = false; //constrain to viewport + var p1 = "", p2 = ""; + o = o || [0,0]; + + if(!p){ + p = "tl-bl"; + }else if(p == "?"){ + p = "tl-bl?"; + }else if(p.indexOf("-") == -1){ + p = "tl-" + p; + } + p = p.toLowerCase(); + var m = p.match(/^([a-z]+)-([a-z]+)(\?)?$/); + if(!m){ + throw "Element.alignTo with an invalid alignment " + p; + } + p1 = m[1], p2 = m[2], c = m[3] ? true : false; + + //Subtract the aligned el"s internal xy from the target"s offset xy + //plus custom offset to get the aligned el's new offset xy + var a1 = this.getAnchorXY(p1, true); + var a2 = el.getAnchorXY(p2, false); + var x = a2[0] - a1[0] + o[0]; + var y = a2[1] - a1[1] + o[1]; + if(c){ + //constrain the aligned el to viewport if necessary + var w = this.getWidth(), h = this.getHeight(), r = el.getRegion(); + // 5px of margin for ie + var dw = D.getViewWidth()-5, dh = D.getViewHeight()-5; + + //If we are at a viewport boundary and the aligned el is anchored on a target border that is + //perpendicular to the vp border, allow the aligned el to slide on that border, + //otherwise swap the aligned el to the opposite border of the target. + var p1y = p1.charAt(0), p1x = p1.charAt(p1.length-1); + var p2y = p2.charAt(0), p2x = p2.charAt(p2.length-1); + var swapY = ((p1y=="t" && p2y=="b") || (p1y=="b" && p2y=="t")); + var swapX = ((p1x=="r" && p2x=="l") || (p1x=="l" && p2x=="r")); + + var doc = document; + var scrollX = (doc.documentElement.scrollLeft || doc.body.scrollLeft || 0)+5; + var scrollY = (doc.documentElement.scrollTop || doc.body.scrollTop || 0)+5; + + if((x+w) > dw){ + x = swapX ? r.left-w : dw-w; + } + if(x < scrollX){ + x = swapX ? r.right : scrollX; + } + if((y+h) > dh){ + y = swapY ? r.top-h : dh-h; + } + if (y < scrollY){ + y = swapY ? r.bottom : scrollY; + } + } + return [x,y]; + }, + + getConstrainToXY : function(){ + var os = {top:0, left:0, bottom:0, right: 0}; + + return function(el, local, offsets){ + el = Ext.get(el); + offsets = offsets ? Ext.applyIf(offsets, os) : os; + + var vw, vh, vx = 0, vy = 0; + if(el.dom == document.body || el.dom == document){ + vw = Ext.lib.Dom.getViewWidth(); + vh = Ext.lib.Dom.getViewHeight(); + }else{ + vw = el.dom.clientWidth; + vh = el.dom.clientHeight; + if(!local){ + var vxy = el.getXY(); + vx = vxy[0]; + vy = vxy[1]; + } + } + + var s = el.getScroll(); + + vx += offsets.left + s.left; + vy += offsets.top + s.top; + + vw -= offsets.right; + vh -= offsets.bottom; + + var vr = vx+vw; + var vb = vy+vh; + + var xy = !local ? this.getXY() : [this.getLeft(true), this.getTop(true)]; + var x = xy[0], y = xy[1]; + var w = this.dom.offsetWidth, h = this.dom.offsetHeight; + + // only move it if it needs it + var moved = false; + + // first validate right/bottom + if((x + w) > vr){ + x = vr - w; + moved = true; + } + if((y + h) > vb){ + y = vb - h; + moved = true; + } + // then make sure top/left isn't negative + if(x < vx){ + x = vx; + moved = true; + } + if(y < vy){ + y = vy; + moved = true; + } + return moved ? [x, y] : false; + }; + }(), + + /** + * Aligns this element with another element relative to the specified anchor points. If the other element is the + * document it aligns it to the viewport. + * The position parameter is optional, and can be specified in any one of the following formats: + *
            + *
          • Blank: Defaults to aligning the element"s top-left corner to the target"s bottom-left corner ("tl-bl").
          • + *
          • One anchor (deprecated): The passed anchor position is used as the target element's anchor point. + * The element being aligned will position its top-left corner (tl) to that point. This method has been + * deprecated in favor of the newer two anchor syntax below.
          • + *
          • Two anchors: If two values from the table below are passed separated by a dash, the first value is used as the + * element"s anchor point, and the second value is used as the target"s anchor point.
          • + *
          + * In addition to the anchor points, the position parameter also supports the "?" character. If "?" is passed at the end of + * the position string, the element will attempt to align as specified, but the position will be adjusted to constrain to + * the viewport if necessary. Note that the element being aligned might be swapped to align to a different position than + * that specified in order to enforce the viewport constraints. + * Following are all of the supported anchor positions: +
          +Value  Description
          +-----  -----------------------------
          +tl     The top left corner (default)
          +t      The center of the top edge
          +tr     The top right corner
          +l      The center of the left edge
          +c      In the center of the element
          +r      The center of the right edge
          +bl     The bottom left corner
          +b      The center of the bottom edge
          +br     The bottom right corner
          +
          +Example Usage: +
          
          +// align el to other-el using the default positioning ("tl-bl", non-constrained)
          +el.alignTo("other-el");
          +
          +// align the top left corner of el with the top right corner of other-el (constrained to viewport)
          +el.alignTo("other-el", "tr?");
          +
          +// align the bottom right corner of el with the center left edge of other-el
          +el.alignTo("other-el", "br-l?");
          +
          +// align the center of el with the bottom left corner of other-el and
          +// adjust the x position by -6 pixels (and the y position by 0)
          +el.alignTo("other-el", "c-bl", [-6, 0]);
          +
          + * @param {String/HTMLElement/Ext.Element} element The element to align to. + * @param {String} position The position to align to. + * @param {Array} offsets (optional) Offset the positioning by [x, y] + * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + alignTo : function(element, position, offsets, animate){ + var xy = this.getAlignToXY(element, position, offsets); + this.setXY(xy, this.preanim(arguments, 3)); + return this; + }, + + /** + * Anchors an element to another element and realigns it when the window is resized. + * @param {String/HTMLElement/Ext.Element} element The element to align to. + * @param {String} position The position to align to. + * @param {Array} offsets (optional) Offset the positioning by [x, y] + * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object + * @param {Boolean/Number} monitorScroll (optional) true to monitor body scroll and reposition. If this parameter + * is a number, it is used as the buffer delay (defaults to 50ms). + * @param + */ + anchorTo : function(el, alignment, offsets, animate, monitorScroll, callback){ + var action = function(){ + this.alignTo(el, alignment, offsets, animate); + Ext.callback(callback, this); + }; + Ext.EventManager.onWindowResize(action, this); + var tm = typeof monitorScroll; + if(tm != 'undefined'){ + Ext.EventManager.on(window, 'scroll', action, this, + {buffer: tm == 'number' ? monitorScroll : 50}); + } + action.call(this); // align immediately + return this; + }, + /** + * Clears any opacity settings from this element. Required in some cases for IE. + * @return {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/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + hide : function(animate){ + this.setVisible(false, this.preanim(arguments, 0)); + return this; + }, + + /** + * Show this element - Uses display mode to determine whether to use "display" or "visibility". See {@link #setVisible}. + * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + show : function(animate){ + this.setVisible(true, this.preanim(arguments, 0)); + return this; + }, + + /** + * @private Test if size has a unit, otherwise appends the default + */ + addUnits : function(size){ + return Ext.Element.addUnits(size, this.defaultUnit); + }, + + /** + * Temporarily enables offsets (width,height,x,y) for an element with display:none, use endMeasure() when done. + * @return {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, b = document.body; // start with this element + while((!el.offsetWidth && !el.offsetHeight) && p && p.tagName && p != b){ + var pe = Ext.get(p); + if(pe.getStyle('display') == 'none'){ + changed.push({el: p, visibility: pe.getStyle("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 {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 {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 = Ext.id(); + var dom = this.dom; + + html += ''; + + E.onAvailable(id, function(){ + var hd = document.getElementsByTagName("head")[0]; + var re = /(?:]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig; + var srcRe = /\ssrc=([\'\"])(.*?)\1/i; + var typeRe = /\stype=([\'\"])(.*?)\1/i; + + var match; + while(match = re.exec(html)){ + var attrs = match[1]; + var srcMatch = attrs ? attrs.match(srcRe) : false; + if(srcMatch && srcMatch[2]){ + var s = document.createElement("script"); + s.src = srcMatch[2]; + var typeMatch = attrs.match(typeRe); + if(typeMatch && typeMatch[2]){ + s.type = typeMatch[2]; + } + hd.appendChild(s); + }else if(match[2] && match[2].length > 0){ + eval(match[2]); + } + } + var el = document.getElementById(id); + if(el){el.parentNode.removeChild(el);} + if(typeof callback == "function"){ + callback(); + } + }); + dom.innerHTML = html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/ig, ""); + 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 {Ext.Element} this + */ + load : function(){ + var um = this.getUpdateManager(); + um.update.apply(um, arguments); + return this; + }, + + /** + * Gets this elements UpdateManager + * @return {Ext.UpdateManager} The UpdateManager + */ + getUpdateManager : function(){ + if(!this.updateManager){ + this.updateManager = new Ext.UpdateManager(this); + } + return this.updateManager; + }, + + /** + * Disables text selection for this element (normalized across browsers) + * @return {Ext.Element} this + */ + unselectable : function(){ + this.dom.unselectable = "on"; + this.swallowEvent("selectstart", true); + this.applyStyles("-moz-user-select:none;-khtml-user-select:none;"); + this.addClass("x-unselectable"); + return this; + }, + + /** + * Calculates the x, y to center this element on the screen + * @return {Array} The x, y values [x, y] + */ + getCenterXY : function(){ + return this.getAlignToXY(document, 'c-c'); + }, + + /** + * Centers the Element in either the viewport, or another Element. + * @param {String/HTMLElement/Ext.Element} centerIn (optional) The element in which to center the element. + */ + center : function(centerIn){ + this.alignTo(centerIn || document, 'c-c'); + return this; + }, + + /** + * Tests various css rules/browsers to determine if this element uses a border box + * @return {Boolean} + */ + isBorderBox : function(){ + return noBoxAdjust[this.dom.tagName.toLowerCase()] || Ext.isBorderBox; + }, + + /** + * 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(this.getStyle("left"), 10) || 0; + var top = parseInt(this.getStyle("top"), 10) || 0; + xy = [left, top]; + } + var el = this.dom, w = el.offsetWidth, h = el.offsetHeight, bx; + if(!contentBox){ + bx = {x: xy[0], y: xy[1], 0: xy[0], 1: 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"); + bx = {x: xy[0]+l, y: xy[1]+t, 0: xy[0]+l, 1: xy[1]+t, width: w-(l+r), height: h-(t+b)}; + } + bx.right = bx.x + bx.width; + bx.bottom = bx.y + bx.height; + return bx; + }, + + /** + * Returns the sum width of the padding and borders for the passed "sides". See getBorderWidth() + for more information about the sides. + * @param {String} sides + * @return {Number} + */ + getFrameWidth : function(sides){ + return this.getPadding(sides) + this.getBorderWidth(sides); + }, + + /** + * 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/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Ext.Element} this + */ + setBox : function(box, adjust, animate){ + 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, this.preanim(arguments, 2)); + return this; + }, + + /** + * Forces the browser to repaint this element + * @return {Ext.Element} this + */ + repaint : function(){ + var dom = this.dom; + this.addClass("x-repaint"); + setTimeout(function(){ + Ext.get(dom).removeClass("x-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, El.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 {Ext.Element} The new proxy element + */ + createProxy : function(config, renderTo, matchBox){ + if(renderTo){ + renderTo = Ext.getDom(renderTo); + }else{ + renderTo = document.body; + } + config = typeof config == "object" ? + config : {tag : "div", cls: config}; + var proxy = Ext.DomHelper.append(renderTo, config, true); + if(matchBox){ + proxy.setBox(this.getBox()); + } + return proxy; + }, + + /** + * Puts a mask over this element to disable user interaction. Requires core.css. + * This method can only be applied to elements which accept child nodes. + * @param {String} msg (optional) A message to display in the mask + * @param {String} msgCls (optional) A css class to apply to the msg element + * @return {Element} The message element + */ + mask : function(msg, msgCls){ + if(this.getStyle("position") == "static"){ + this.setStyle("position", "relative"); + } + if(!this._mask){ + this._mask = Ext.DomHelper.append(this.dom, {tag:"div", cls:"ext-el-mask"}, true); + } + this.addClass("x-masked"); + this._mask.setDisplayed(true); + if(typeof msg == 'string'){ + if(!this._maskMsg){ + this._maskMsg = Ext.DomHelper.append(this.dom, {tag:"div", cls:"ext-el-mask-msg", cn:{tag:'div'}}, true); + } + var mm = this._maskMsg; + mm.dom.className = msgCls ? "ext-el-mask-msg " + msgCls : "ext-el-mask-msg"; + mm.dom.firstChild.innerHTML = msg; + mm.setDisplayed(true); + mm.center(this); + } + return this._mask; + }, + + /** + * Removes a previously applied mask. If removeEl is true the mask overlay is destroyed, otherwise + * it is cached for reuse. + */ + unmask : function(removeEl){ + if(this._mask){ + if(removeEl === true){ + this._mask.remove(); + delete this._mask; + if(this._maskMsg){ + this._maskMsg.remove(); + delete this._maskMsg; + } + }else{ + this._mask.setDisplayed(false); + if(this._maskMsg){ + this._maskMsg.setDisplayed(false); + } + } + } + this.removeClass("x-masked"); + }, + + /** + * Returns true if this element is masked + * @return {Boolean} + */ + isMasked : function(){ + return this._mask && this._mask.isVisible(); + }, + + /** + * Creates an iframe shim for this element to keep selects and other windowed objects from + * showing through. + * @return {Ext.Element} The new shim element + */ + createShim : function(){ + var el = document.createElement('iframe'); + el.frameBorder = 'no'; + el.className = 'ext-shim'; + if(Ext.isIE && Ext.isSecure){ + el.src = Ext.SSL_SECURE_URL; + } + var shim = Ext.get(this.dom.parentNode.insertBefore(el, this.dom)); + shim.autoBoxAdjust = false; + return shim; + }, + + /** + * Removes this element from the DOM and deletes it from the cache + */ + remove : function(){ + if(this.dom.parentNode){ + this.dom.parentNode.removeChild(this.dom); + } + delete El.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 + * @param {Boolean} preventFlicker (optional) If set to true, it prevents flickering by filtering + * mouseout events for children elements + * @return {Ext.Element} this + */ + addClassOnOver : function(className, preventFlicker){ + this.on("mouseover", function(){ + Ext.fly(this, '_internal').addClass(className); + }, this.dom); + var removeFn = function(e){ + if(preventFlicker !== true || !e.within(this, true)){ + Ext.fly(this, '_internal').removeClass(className); + } + }; + this.on("mouseout", removeFn, this.dom); + return this; + }, + + /** + * Sets up event handlers to add and remove a css class when this element has the focus + * @param {String} className + * @return {Ext.Element} this + */ + addClassOnFocus : function(className){ + this.on("focus", function(){ + Ext.fly(this, '_internal').addClass(className); + }, this.dom); + this.on("blur", function(){ + Ext.fly(this, '_internal').removeClass(className); + }, this.dom); + return this; + }, + /** + * Sets up event handlers to add and remove a css class when the mouse is down and then up on this element (a click effect) + * @param {String} className + * @return {Ext.Element} this + */ + addClassOnClick : function(className){ + var dom = this.dom; + this.on("mousedown", function(){ + Ext.fly(dom, '_internal').addClass(className); + var d = Ext.get(document); + var fn = function(){ + Ext.fly(dom, '_internal').removeClass(className); + d.removeListener("mouseup", fn); + }; + d.on("mouseup", fn); + }); + return this; + }, + + /** + * Stops the specified event from bubbling and optionally prevents the default action + * @param {String} eventName + * @param {Boolean} preventDefault (optional) true to prevent the default action too + * @return {Ext.Element} this + */ + swallowEvent : function(eventName, preventDefault){ + var fn = function(e){ + e.stopPropagation(); + if(preventDefault){ + e.preventDefault(); + } + }; + if(eventName instanceof Array){ + for(var i = 0, len = eventName.length; i < len; i++){ + this.on(eventName[i], fn); + } + return this; + } + this.on(eventName, fn); + return this; + }, + + /** + * Sizes this element to its parent element's dimensions performing + * neccessary box adjustments. + * @param {Boolean} monitorResize (optional) If true maintains the fit when the browser window is resized. + * @param {String/HTMLElment/Element} targetParent (optional) The target parent, default to the parentNode. + * @return {Ext.Element} this + */ + fitToParent : function(monitorResize, targetParent){ + var p = Ext.get(targetParent || this.dom.parentNode); + this.setSize(p.getComputedWidth()-p.getFrameWidth('lr'), p.getComputedHeight()-p.getFrameWidth('tb')); + if(monitorResize === true){ + Ext.EventManager.onWindowResize(this.fitToParent.createDelegate(this, [])); + } + 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 {Ext.Element} this + */ + appendChild: function(el){ + el = Ext.get(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 + * @param {Boolean} returnDom (optional) true to return the dom node instead of creating an Element + * @return {Ext.Element} The new child element + */ + createChild: function(config, insertBefore, returnDom){ + config = config || {tag:'div'}; + if(insertBefore){ + return Ext.DomHelper.insertBefore(insertBefore, config, returnDom !== true); + } + return Ext.DomHelper[!this.dom.firstChild ? 'overwrite' : 'append'](this.dom, config, returnDom !== true); + }, + + /** + * Appends this element to the passed element + * @param {String/HTMLElement/Element} el The new parent element + * @return {Ext.Element} this + */ + appendTo: function(el){ + el = Ext.getDom(el); + el.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 {Ext.Element} this + */ + insertBefore: function(el){ + el = Ext.getDom(el); + el.parentNode.insertBefore(this.dom, el); + return this; + }, + + /** + * Inserts this element after the passed element in the DOM + * @param {String/HTMLElement/Element} el The element to insert after + * @return {Ext.Element} this + */ + insertAfter: function(el){ + el = Ext.getDom(el); + el.parentNode.insertBefore(this.dom, el.nextSibling); + return this; + }, + + /** + * Inserts (or creates) an element (or DomHelper config) as the first child of the this element + * @param {String/HTMLElement/Element/Object} el The id or element to insert or a DomHelper config to create and insert + * @return {Ext.Element} The new child + */ + insertFirst: function(el, returnDom){ + el = el || {}; + if(typeof el == 'object' && !el.nodeType){ // dh config + return this.createChild(el, this.dom.firstChild, returnDom); + }else{ + el = Ext.getDom(el); + this.dom.insertBefore(el, this.dom.firstChild); + return !returnDom ? Ext.get(el) : el; + } + }, + + /** + * Inserts (or creates) the passed element (or DomHelper config) as a sibling of this element + * @param {String/HTMLElement/Element/Object} el The id or element to insert or a DomHelper config to create and insert + * @param {String} where (optional) 'before' or 'after' defaults to before + * @param {Boolean} returnDom (optional) True to return the raw DOM element instead of Ext.Element + * @return {Ext.Element} the inserted Element + */ + insertSibling: function(el, where, returnDom){ + where = where ? where.toLowerCase() : 'before'; + el = el || {}; + var rt, refNode = where == 'before' ? this.dom : this.dom.nextSibling; + + if(typeof el == 'object' && !el.nodeType){ // dh config + if(where == 'after' && !this.dom.nextSibling){ + rt = Ext.DomHelper.append(this.dom.parentNode, el, !returnDom); + }else{ + rt = Ext.DomHelper[where == 'after' ? 'insertAfter' : 'insertBefore'](this.dom, el, !returnDom); + } + + }else{ + rt = this.dom.parentNode.insertBefore(Ext.getDom(el), + where == 'before' ? this.dom : this.dom.nextSibling); + if(!returnDom){ + rt = Ext.get(rt); + } + } + return rt; + }, + + /** + * 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 + * @param {Boolean} returnDom (optional) True to return the raw DOM element instead of Ext.Element + * @return {/HTMLElementElement} The newly created wrapper element + */ + wrap: function(config, returnDom){ + if(!config){ + config = {tag: "div"}; + } + var newEl = Ext.DomHelper.insertBefore(this.dom, config, !returnDom); + newEl.dom ? newEl.dom.appendChild(this.dom) : newEl.appendChild(this.dom); + return newEl; + }, + + /** + * Replaces the passed element with this element + * @param {String/HTMLElement/Element} el The element to replace + * @return {Ext.Element} this + */ + replace: function(el){ + el = Ext.get(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 {HTMLElement} The inserted node (or nearest related if more than 1 inserted) + */ + insertHtml : function(where, html){ + return Ext.DomHelper.insertHtml(where, this.dom, html); + }, + + /** + * 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 + * @param {Boolean} useSet (optional) false to override the default setAttribute to use expandos. + * @return {Ext.Element} this + */ + set : function(o, useSet){ + var el = this.dom; + useSet = typeof useSet == 'undefined' ? (el.setAttribute ? true : false) : useSet; + 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]; + } + } + Ext.DomHelper.applyStyles(el, o.style); + return this; + }, + + /** + * Convenience method for constructing a KeyMap + * @param {Number/Array/Object/String} key Either a string with the keys to listen for, 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 {Ext.KeyMap} The KeyMap created + */ + addKeyListener : function(key, fn, scope){ + var config; + if(typeof key != "object" || key instanceof Array){ + config = { + key: key, + fn: fn, + scope: scope + }; + }else{ + config = { + key : key.key, + shift : key.shift, + ctrl : key.ctrl, + alt : key.alt, + fn: fn, + scope: scope + }; + } + return new Ext.KeyMap(this, config); + }, + + /** + * Creates a KeyMap for this element + * @param {Object} config The KeyMap config. See {@link Ext.KeyMap} for more details + * @return {Ext.KeyMap} The KeyMap created + */ + addKeyMap : function(config){ + return new Ext.KeyMap(this, config); + }, + + /** + * Returns true if this element is scrollable. + * @return {Boolean} + */ + isScrollable : function(){ + var dom = this.dom; + return dom.scrollHeight > dom.clientHeight || dom.scrollWidth > dom.clientWidth; + }, + + /** + * Scrolls this element the specified scroll point. It does NOT do bounds checking so if you scroll to a weird value it will try to do it. For auto bounds checking, use scroll(). + * @param {String} side Either "left" for scrollLeft values or "top" for scrollTop values. + * @param {Number} value The new scroll value + * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Element} this + */ + + scrollTo : function(side, value, animate){ + var prop = side.toLowerCase() == "left" ? "scrollLeft" : "scrollTop"; + if(!animate || !A){ + this.dom[prop] = value; + }else{ + var to = prop == "scrollLeft" ? [value, this.dom.scrollTop] : [this.dom.scrollLeft, value]; + this.anim({scroll: {"to": to}}, this.preanim(arguments, 2), 'scroll'); + } + return this; + }, + + /** + * Scrolls this element the specified direction. Does bounds checking to make sure the scroll is + * within this elements scrollable range. + * @param {String} direction Possible values are: "l","left" - "r","right" - "t","top","up" - "b","bottom","down". + * @param {Number} distance How far to scroll the element in pixels + * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object + * @return {Boolean} Returns true if a scroll was triggered or false if the element + * was scrolled as far as it could go. + */ + scroll : function(direction, distance, animate){ + if(!this.isScrollable()){ + return; + } + var el = this.dom; + var l = el.scrollLeft, t = el.scrollTop; + var w = el.scrollWidth, h = el.scrollHeight; + var cw = el.clientWidth, ch = el.clientHeight; + direction = direction.toLowerCase(); + var scrolled = false; + var a = this.preanim(arguments, 2); + switch(direction){ + case "l": + case "left": + if(w - l > cw){ + var v = Math.min(l + distance, w-cw); + this.scrollTo("left", v, a); + scrolled = true; + } + break; + case "r": + case "right": + if(l > 0){ + var v = Math.max(l - distance, 0); + this.scrollTo("left", v, a); + scrolled = true; + } + break; + case "t": + case "top": + case "up": + if(t > 0){ + var v = Math.max(t - distance, 0); + this.scrollTo("top", v, a); + scrolled = true; + } + break; + case "b": + case "bottom": + case "down": + if(h - t > ch){ + var v = Math.min(t + distance, h-ch); + this.scrollTo("top", v, a); + scrolled = true; + } + break; + } + return scrolled; + }, + + /** + * Translates the passed page coordinates into left/top css values for this element + * @param {Number/Array} x The page x or an array containing [x, y] + * @param {Number} y The page y + * @param {Object} An object with left and top properties. e.g. {left: (value), top: (value)} + */ + translatePoints : function(x, y){ + if(typeof x == 'object' || x instanceof Array){ + y = x[1]; x = x[0]; + } + var p = this.getStyle('position'); + var o = this.getXY(); + + var l = parseInt(this.getStyle('left'), 10); + var t = parseInt(this.getStyle('top'), 10); + + if(isNaN(l)){ + l = (p == "relative") ? 0 : this.dom.offsetLeft; + } + if(isNaN(t)){ + t = (p == "relative") ? 0 : this.dom.offsetTop; + } + + return {left: (x - o[0] + l), top: (y - o[1] + t)}; + }, + + getScroll : function(){ + var d = this.dom, doc = document; + if(d == doc || d == doc.body){ + var l = window.pageXOffset || doc.documentElement.scrollLeft || doc.body.scrollLeft || 0; + var t = window.pageYOffset || doc.documentElement.scrollTop || doc.body.scrollTop || 0; + return {left: l, top: t}; + }else{ + return {left: d.scrollLeft, top: d.scrollTop}; + } + }, + + /** + * Return the CSS color for the specified CSS attribute. rgb, 3 digit (like #fff) and valid values + * are convert to standard 6 digit hex color. + * @param {String} attr The css attribute + * @param {String} defaultValue The default value to use when a valid color isn't found + * @param {String} prefix (optional) defaults to #. Use an empty string when working with + * YUI color anims. + */ + getColor : function(attr, defaultValue, prefix){ + var v = this.getStyle(attr); + if(!v || v == "transparent" || v == "inherit") { + return defaultValue; + } + var color = typeof prefix == "undefined" ? "#" : prefix; + if(v.substr(0, 4) == "rgb("){ + var rvs = v.slice(4, v.length -1).split(","); + for(var i = 0; i < 3; i++){ + var h = parseInt(rvs[i]).toString(16); + if(h < 16){ + h = "0" + h; + } + color += h; + } + } else { + if(v.substr(0, 1) == "#"){ + if(v.length == 4) { + for(var i = 1; i < 4; i++){ + var c = v.charAt(i); + color += c + c; + } + }else if(v.length == 7){ + color += v.substr(1); + } + } + } + return(color.length > 5 ? color.toLowerCase() : defaultValue); + }, + + boxWrap : function(cls){ + cls = cls || 'x-box'; + var el = Ext.get(this.insertHtml('beforeBegin', String.format('
          '+El.boxMarkup+'
          ', cls))); + el.child('.'+cls+'-mc').dom.appendChild(this.dom); + return el; + }, + + getAttributeNS : Ext.isIE ? function(ns, name){ + var d = this.dom; + var type = typeof d[ns+":"+name]; + if(type != 'undefined' && type != 'unknown'){ + return d[ns+":"+name]; + } + return d[name]; + } : function(ns, name){ + var d = this.dom; + return d.getAttributeNS(ns, name) || d.getAttribute(ns+":"+name) || d.getAttribute(name) || d[name]; + } +}; + +var ep = El.prototype; + +/** + * Appends an event handler (Shorthand for addListener) + * @param {String} eventName The type of event to append + * @param {Function} fn The method the event invokes + * @param {Object} scope (optional) The scope (this object) of the fn + * @param {Object} options (optional)An object with standard EventManager options + * @method + */ +ep.on = ep.addListener; + // backwards compat +ep.mon = ep.addListener; + +/** + * Removes an event handler from this element (shorthand for removeListener) + * @param {String} eventName the type of event to remove + * @param {Function} fn the method the event invokes + * @return {Ext.Element} this + * @method + */ +ep.un = ep.removeListener; + +/** + * true to automatically adjust width and height settings for box-model issues (default to true) + */ +ep.autoBoxAdjust = true; +/** + * true to automatically detect display mode and use display instead of visibility with show()/hide() (defaults to false). + * To enable this globally:
          Ext.Element.prototype.autoDisplayMode = true;
          + */ +ep.autoDisplayMode = true; + +El.unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i; + +El.addUnits = function(v, defaultUnit){ + if(v === "" || v == "auto"){ + return v; + } + if(v === undefined){ + return ''; + } + if(typeof v == "number" || !El.unitPattern.test(v)){ + return v + (defaultUnit || 'px'); + } + return v; +}; + +// special markup used throughout Ext when box wrapping elements +El.boxMarkup = '
          '; +/** + * Visibility mode constant - Use visibility to hide element + * @static + * @type Number + */ +El.VISIBILITY = 1; +/** + * Visibility mode constant - Use display to hide element + * @static + * @type Number + */ +El.DISPLAY = 2; + +El.borders = {l: "border-left-width", r: "border-right-width", t: "border-top-width", b: "border-bottom-width"}; +El.paddings = {l: "padding-left", r: "padding-right", t: "padding-top", b: "padding-bottom"}; +El.margins = {l: "margin-left", r: "margin-right", t: "margin-top", b: "margin-bottom"}; + + + +/** + * @private + */ +El.cache = {}; + +var docEl; + +/** + * Static method to retrieve 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 node, a DOM Node or an existing Element. + * @return {Element} The Element object + * @static + */ +El.get = function(el){ + var ex, elm, id; + if(!el){ return null; } + if(typeof el == "string"){ // element id + if(!(elm = document.getElementById(el))){ + return null; + } + if(ex = El.cache[el]){ + ex.dom = elm; + }else{ + ex = El.cache[el] = new El(elm); + } + return ex; + }else if(el.tagName){ // dom element + if(!(id = el.id)){ + id = Ext.id(el); + } + if(ex = El.cache[id]){ + ex.dom = el; + }else{ + ex = El.cache[id] = new El(el); + } + return ex; + }else if(el instanceof El){ + if(el != docEl){ + el.dom = document.getElementById(el.id) || el.dom; // refresh dom element in case no longer valid, + // catch case where it hasn't been appended + El.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 El.select(el); + }else if(el == document){ + // create a bogus element object representing the document object + if(!docEl){ + var f = function(){}; + f.prototype = El.prototype; + docEl = new f(); + docEl.dom = document; + } + return docEl; + } + return null; +}; + +El.uncache = function(el){ + for(var i = 0, a = arguments, len = a.length; i < len; i++) { + if(a[i]){ + delete El.cache[a[i].id || a[i]]; + } + } +}; + +// dom is optional +El.Flyweight = function(dom){ + this.dom = dom; +}; +El.Flyweight.prototype = El.prototype; + +El._flyweights = {}; +/** + * Gets the globally shared flyweight Element, with the passed node as the active element. Do not store a reference to this element - + * the dom node can be overwritten by other code. + * @param {String/HTMLElement} el The dom node or id + * @param {String} named (optional) Allows for creation of named reusable flyweights to + * prevent conflicts (e.g. internally Ext uses "_internal") + * @static + * @return {Element} The shared Element object + */ +El.fly = function(el, named){ + named = named || '_global'; + el = Ext.getDom(el); + if(!el){ + return null; + } + if(!El._flyweights[named]){ + El._flyweights[named] = new El.Flyweight(); + } + El._flyweights[named].dom = el; + return El._flyweights[named]; +}; + +/** + * Static method to retrieve 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. + * Shorthand of {@link Ext.Element#get} + * @param {String/HTMLElement/Element} el The id of the node, a DOM Node or an existing Element. + * @return {Element} The Element object + * @member Ext + * @method get + */ +Ext.get = El.get; +/** + * Gets the globally shared flyweight Element, with the passed node as the active element. Do not store a reference to this element - + * the dom node can be overwritten by other code. + * Shorthand of {@link Ext.Element#fly} + * @param {String/HTMLElement} el The dom node or id + * @param {String} named (optional) Allows for creation of named reusable flyweights to + * prevent conflicts (e.g. internally Ext uses "_internal") + * @static + * @return {Element} The shared Element object + * @member Ext + * @method fly + */ +Ext.fly = El.fly; + +// speedy lookup for elements never to box adjust +var noBoxAdjust = Ext.isStrict ? { + select:1 +} : { + input:1, select:1, textarea:1 +}; +if(Ext.isIE || Ext.isGecko){ + noBoxAdjust['button'] = 1; +} + + +Ext.EventManager.on(window, 'unload', function(){ + delete El.cache; + delete El._flyweights; +}); +})(); + diff --git a/www/extras/yui-ext/source/core/EventManager.js b/www/extras/yui-ext/source/core/EventManager.js new file mode 100644 index 000000000..df92fd66b --- /dev/null +++ b/www/extras/yui-ext/source/core/EventManager.js @@ -0,0 +1,662 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class 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 Ext.EventObject} for more details on normalized event objects. + * @singleton + */ +Ext.EventManager = function(){ + var docReadyEvent, docReadyProcId, docReadyState = false; + var resizeEvent, resizeTask, textEvent, textSize; + var E = Ext.lib.Event; + var D = Ext.lib.Dom; + + + var fireDocReady = function(){ + if(!docReadyState){ + docReadyState = true; + Ext.isReady = true; + if(docReadyProcId){ + clearInterval(docReadyProcId); + } + if(Ext.isGecko || Ext.isOpera) { + document.removeEventListener("DOMContentLoaded", fireDocReady, false); + } + if(docReadyEvent){ + docReadyEvent.fire(); + docReadyEvent.clearListeners(); + } + } + }; + + var initDocReady = function(){ + docReadyEvent = new Ext.util.Event(); + if(Ext.isGecko || Ext.isOpera) { + document.addEventListener("DOMContentLoaded", fireDocReady, false); + }else if(Ext.isIE){ + // inspired by http://www.thefutureoftheweb.com/blog/2006/6/adddomloadevent + document.write(""); + var defer = document.getElementById("ie-deferred-loader"); + defer.onreadystatechange = function(){ + if(this.readyState == "complete"){ + fireDocReady(); + defer.onreadystatechange = null; + defer.parentNode.removeChild(defer); + } + }; + }else if(Ext.isSafari){ + docReadyProcId = setInterval(function(){ + var rs = document.readyState; + if(rs == "complete") { + fireDocReady(); + } + }, 10); + } + // no matter what, make sure it fires on load + E.on(window, "load", fireDocReady); + }; + + var createBuffered = function(h, o){ + var task = new Ext.util.DelayedTask(h); + return function(e){ + // create new event object impl so new events don't wipe out properties + e = new Ext.EventObjectImpl(e); + task.delay(o.buffer, h, null, [e]); + }; + }; + + var createSingle = function(h, el, ename, fn){ + return function(e){ + Ext.EventManager.removeListener(el, ename, fn); + h(e); + }; + }; + + var createDelayed = function(h, o){ + return function(e){ + // create new event object impl so new events don't wipe out properties + e = new Ext.EventObjectImpl(e); + setTimeout(function(){ + h(e); + }, o.delay || 10); + }; + }; + + var listen = function(element, ename, opt, fn, scope){ + var o = (!opt || typeof opt == "boolean") ? {} : opt; + fn = fn || o.fn; scope = scope || o.scope; + var el = Ext.getDom(element); + if(!el){ + throw "Error listening for \"" + ename + '\". Element "' + element + '" doesn\'t exist.'; + } + var h = function(e){ + e = Ext.EventObject.setEvent(e); + var t; + if(o.delegate){ + t = e.getTarget(o.delegate, el); + if(!t){ + return; + } + }else{ + t = e.target; + } + if(o.stopEvent === true){ + e.stopEvent(); + } + if(o.preventDefault === true){ + e.preventDefault(); + } + if(o.stopPropagation === true){ + e.stopPropagation(); + } + + if(o.normalized === false){ + e = e.browserEvent; + } + + fn.call(scope || el, e, t, o); + }; + if(o.delay){ + h = createDelayed(h, o); + } + if(o.single){ + h = createSingle(h, el, ename, fn); + } + if(o.buffer){ + h = createBuffered(h, o); + } + fn._handlers = fn._handlers || []; + fn._handlers.push([Ext.id(el), ename, h]); + + E.on(el, ename, h); + if(ename == "mousewheel" && el.addEventListener){ // workaround for jQuery + el.addEventListener("DOMMouseScroll", h, false); + E.on(window, 'unload', function(){ + el.removeEventListener("DOMMouseScroll", h, false); + }); + } + if(ename == "mousedown" && el == document){ // fix stopped mousedowns on the document + Ext.EventManager.stoppedMouseDownEvent.addListener(h); + } + return h; + }; + + var stopListening = function(el, ename, fn){ + var id = Ext.id(el), hds = fn._handlers, hd = fn; + if(hds){ + for(var i = 0, len = hds.length; i < len; i++){ + var h = hds[i]; + if(h[0] == id && h[1] == ename){ + hd = h[2]; + hds.splice(i, 1); + break; + } + } + } + E.un(el, ename, hd); + el = Ext.getDom(el); + if(ename == "mousewheel" && el.addEventListener){ + el.removeEventListener("DOMMouseScroll", hd, false); + } + if(ename == "mousedown" && el == document){ // fix stopped mousedowns on the document + Ext.EventManager.stoppedMouseDownEvent.removeListener(hd); + } + }; + + var propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized)$/; + var pub = { + + /** + * This is no longer needed and is deprecated. Places a simple wrapper around an event handler to override the browser event + * object with a 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 + * @deprecated + */ + wrap : function(fn, scope, override){ + return function(e){ + Ext.EventObject.setEvent(e); + fn.call(override ? scope || window : window, Ext.EventObject, scope); + }; + }, + + /** + * Appends an event handler + * + * @param {String/HTMLElement} element The html element or id to assign the + * event to + * @param {String} eventName The type of event to append + * @param {Function} fn The method the event invokes + * @param {Object} options An object with standard EventManager options + */ + addListener : function(element, eventName, fn, scope, options){ + if(typeof eventName == "object"){ + var o = eventName; + for(var e in o){ + if(propRe.test(e)){ + continue; + } + if(typeof o[e] == "function"){ + // shared options + listen(element, e, o, o[e], o.scope); + }else{ + // individual options + listen(element, e, o[e]); + } + } + return; + } + return listen(element, eventName, options, fn, scope); + }, + + /** + * Removes an event handler + * + * @param {String/HTMLElement} element The id or html element to remove the + * event from + * @param {String} eventName The type of event + * @param {Function} fn + * @return {Boolean} True if a listener was actually removed + */ + removeListener : function(element, eventName, fn){ + return stopListening(element, eventName, fn); + }, + + /** + * Fires when the document is ready (before onload and before images are loaded). Can be + * accessed shorthanded Ext.onReady(). + * @param {Function} fn The method the event invokes + * @param {Object} scope An object that becomes the scope of the handler + * @param {boolean} options + */ + onDocumentReady : function(fn, scope, options){ + if(docReadyState){ // if it already fired + fn.call(scope || window, scope); + return; + } + if(!docReadyEvent){ + initDocReady(); + } + docReadyEvent.addListener(fn, scope, options); + }, + + /** + * 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} options + */ + onWindowResize : function(fn, scope, options){ + if(!resizeEvent){ + resizeEvent = new Ext.util.Event(); + resizeTask = new Ext.util.DelayedTask(function(){ + resizeEvent.fire(D.getViewWidth(), D.getViewHeight()); + }); + E.on(window, "resize", function(){ + if(Ext.isIE){ + resizeTask.delay(50); + }else{ + resizeEvent.fire(D.getViewWidth(), D.getViewHeight()); + } + }); + } + resizeEvent.addListener(fn, scope, options); + }, + + /** + * Fires when the user changes the active text size. Handler gets called with 2 params, the old size and the new size. + * @param {Function} fn The method the event invokes + * @param {Object} scope An object that becomes the scope of the handler + * @param {boolean} options + */ + onTextResize : function(fn, scope, options){ + if(!textEvent){ + textEvent = new Ext.util.Event(); + var textEl = new Ext.Element(document.createElement('div')); + textEl.dom.className = 'x-text-resize'; + textEl.dom.innerHTML = 'X'; + textEl.appendTo(document.body); + textSize = textEl.dom.offsetHeight; + setInterval(function(){ + if(textEl.dom.offsetHeight != textSize){ + textEvent.fire(textSize, textSize = textEl.dom.offsetHeight); + } + }, this.textResizeInterval); + } + textEvent.addListener(fn, scope, options); + }, + + /** + * Removes the passed window resize listener. + * @param {Function} fn The method the event invokes + * @param {Object} scope The scope of handler + */ + removeResizeListener : function(fn, scope){ + if(resizeEvent){ + resizeEvent.removeListener(fn, scope); + } + }, + + fireResize : function(){ + if(resizeEvent){ + resizeEvent.fire(D.getViewWidth(), D.getViewHeight()); + } + }, + /** + * Url used for onDocumentReady with using SSL (defaults to Ext.SSL_SECURE_URL) + */ + ieDeferSrc : false, + textResizeInterval : 50 + }; + /** + * Appends an event handler (shorthand for addListener) + * + * @param {String/HTMLElement} element The html element or id 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 + */ + pub.on = pub.addListener; + pub.un = pub.removeListener; + + pub.stoppedMouseDownEvent = new Ext.util.Event(); + return pub; +}(); +/** + * Fires when the document is ready (before onload and before images are loaded). Shorthand of {@link Ext.EventManager#onDocumentReady}. + * @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 + * @member Ext + * @method onReady + */ +Ext.onReady = Ext.EventManager.onDocumentReady; + +Ext.onReady(function(){ + var bd = Ext.get(document.body); + if(!bd){ return; } + var cls = Ext.isIE ? "ext-ie" + : Ext.isGecko ? "ext-gecko" + : Ext.isOpera ? "ext-opera" + : Ext.isSafari ? "ext-safari" : ""; + if(Ext.isBorderBox){ + cls += ' ext-border-box'; + } + if(Ext.isStrict){ + cls += ' ext-strict'; + } + bd.addClass(cls); +}); +/** + * @class 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 + * Example: + *
          
          + function handleClick(e){ // e is not a standard event object, it is a Ext.EventObject
          +    e.preventDefault();
          +    var target = e.getTarget();
          +    ...
          + }
          + var myDiv = Ext.get("myDiv");
          + myDiv.on("click", handleClick);
          + //or
          + Ext.EventManager.on("myDiv", 'click', handleClick);
          + Ext.EventManager.addListener("myDiv", 'click', handleClick);
          + 
          + * @singleton + */ +Ext.EventObject = function(){ + + var E = Ext.lib.Event; + + // safari keypress events for special keys return bad keycodes + var safariKeys = { + 63234 : 37, // left + 63235 : 39, // right + 63232 : 38, // up + 63233 : 40, // down + 63276 : 33, // page up + 63277 : 34, // page down + 63272 : 46, // delete + 63273 : 36, // home + 63275 : 35 // end + }; + + // normalize button clicks + var btnMap = Ext.isIE ? {1:0,4:1,2:2} : + (Ext.isSafari ? {1:0,2:1,3:2} : {0:0,1:1,2:2}); + + Ext.EventObjectImpl = function(e){ + if(e){ + this.setEvent(e.browserEvent || e); + } + }; + Ext.EventObjectImpl.prototype = { + /** The normal browser event */ + browserEvent : null, + /** The button pressed in a mouse event */ + button : -1, + /** True if the shift key was down during the event */ + shiftKey : false, + /** True if the control key was down during the event */ + ctrlKey : false, + /** True if the alt key was down during the event */ + altKey : false, + + /** Key constant @type Number */ + BACKSPACE : 8, + /** Key constant @type Number */ + TAB : 9, + /** Key constant @type Number */ + RETURN : 13, + /** Key constant @type Number */ + ENTER : 13, + /** Key constant @type Number */ + SHIFT : 16, + /** Key constant @type Number */ + CONTROL : 17, + /** Key constant @type Number */ + ESC : 27, + /** Key constant @type Number */ + SPACE : 32, + /** Key constant @type Number */ + PAGEUP : 33, + /** Key constant @type Number */ + PAGEDOWN : 34, + /** Key constant @type Number */ + END : 35, + /** Key constant @type Number */ + HOME : 36, + /** Key constant @type Number */ + LEFT : 37, + /** Key constant @type Number */ + UP : 38, + /** Key constant @type Number */ + RIGHT : 39, + /** Key constant @type Number */ + DOWN : 40, + /** Key constant @type Number */ + DELETE : 46, + /** Key constant @type Number */ + F5 : 116, + + /** @private */ + setEvent : function(e){ + if(e == this || (e && e.browserEvent)){ // already wrapped + return e; + } + this.browserEvent = e; + if(e){ + // normalize buttons + this.button = e.button ? btnMap[e.button] : (e.which ? e.which-1 : -1); + this.shiftKey = e.shiftKey; + // mac metaKey behaves like ctrlKey + this.ctrlKey = e.ctrlKey || e.metaKey; + this.altKey = e.altKey; + // in getKey these will be normalized for the mac + this.keyCode = e.keyCode; + this.charCode = e.charCode; + // cache the target for the delayed and or buffered events + this.target = E.getTarget(e); + // same for XY + this.xy = E.getXY(e); + }else{ + this.button = -1; + this.shiftKey = false; + this.ctrlKey = false; + this.altKey = false; + this.keyCode = 0; + this.charCode =0; + this.target = null; + this.xy = [0, 0]; + } + return this; + }, + + /** + * Stop the event (preventDefault and stopPropagation) + */ + stopEvent : function(){ + if(this.browserEvent){ + if(this.browserEvent.type == 'mousedown'){ + Ext.EventManager.stoppedMouseDownEvent.fire(this); + } + E.stopEvent(this.browserEvent); + } + }, + + /** + * Prevents the browsers default handling of the event. + */ + preventDefault : function(){ + if(this.browserEvent){ + E.preventDefault(this.browserEvent); + } + }, + + /** @private */ + isNavKeyPress : function(){ + var k = this.keyCode; + k = Ext.isSafari ? (safariKeys[k] || k) : k; + return (k >= 33 && k <= 40) || k == this.RETURN || k == this.TAB || k == this.ESC; + }, + + isSpecialKey : function(){ + var k = this.keyCode; + return k == 9 || k == 13 || k == 40 || k == 27 || + (k == 16) || (k == 17) || + (k >= 18 && k <= 20) || + (k >= 33 && k <= 35) || + (k >= 36 && k <= 39) || + (k >= 44 && k <= 45); + }, + /** + * Cancels bubbling of the event. + */ + stopPropagation : function(){ + if(this.browserEvent){ + if(this.browserEvent.type == 'mousedown'){ + Ext.EventManager.stoppedMouseDownEvent.fire(this); + } + E.stopPropagation(this.browserEvent); + } + }, + + /** + * Gets the key code for the event. + * @return {Number} + */ + getCharCode : function(){ + return this.charCode || this.keyCode; + }, + + /** + * Returns a normalized keyCode for the event. + * @return {Number} The key code + */ + getKey : function(){ + var k = this.keyCode || this.charCode; + return Ext.isSafari ? (safariKeys[k] || k) : k; + }, + + /** + * Gets the x coordinate of the event. + * @return {Number} + */ + getPageX : function(){ + return this.xy[0]; + }, + + /** + * Gets the y coordinate of the event. + * @return {Number} + */ + getPageY : function(){ + return this.xy[1]; + }, + + /** + * Gets the time of the event. + * @return {Number} + */ + getTime : function(){ + if(this.browserEvent){ + return E.getTime(this.browserEvent); + } + return null; + }, + + /** + * Gets the page coordinates of the event. + * @return {Array} The xy values like [x, y] + */ + getXY : function(){ + return this.xy; + }, + + /** + * Gets the target for the event. + * @param {String} selector (optional) A simple selector to filter the target or look for an ancestor of the target + * @param {Number/String/HTMLElement/Element} maxDepth (optional) The max depth to + search as a number or element (defaults to 10 || document.body) + * @param {Boolean} returnEl (optional) True to return a Ext.Element object instead of DOM node + * @return {HTMLelement} + */ + getTarget : function(selector, maxDepth, returnEl){ + return selector ? Ext.fly(this.target).findParent(selector, maxDepth, returnEl) : this.target; + }, + /** + * Gets the related target. + * @return {HTMLElement} + */ + getRelatedTarget : function(){ + if(this.browserEvent){ + return E.getRelatedTarget(this.browserEvent); + } + return null; + }, + + /** + * Normalizes mouse wheel delta across browsers + * @return {Number} The delta + */ + 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, meta, shift or alt key was pressed during this event. + * @return {Boolean} + */ + hasModifier : function(){ + return ((this.ctrlKey || this.altKey) || this.shiftKey) ? true : false; + }, + + /** + * Returns true if the target of this event equals el or is a child of el + * @param {String/HTMLElement/Element} el + * @param {Boolean} related (optional) true to test if the related target is within el instead of the target + * @return {Boolean} + */ + within : function(el, related){ + var t = this[related ? "getRelatedTarget" : "getTarget"](); + return t && Ext.fly(el).contains(t); + }, + + getPoint : function(){ + return new Ext.lib.Point(this.xy[0], this.xy[1]); + } + }; + + return new Ext.EventObjectImpl(); +}(); + + \ No newline at end of file diff --git a/www/extras/yui-ext/source/core/Ext.js b/www/extras/yui-ext/source/core/Ext.js new file mode 100644 index 000000000..cc7d77db5 --- /dev/null +++ b/www/extras/yui-ext/source/core/Ext.js @@ -0,0 +1,594 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + + +Ext = {}; + +// for old browsers +window["undefined"] = window["undefined"]; + +/** + * @class Ext + * Ext core utilties and functions + * @singleton + */ + +/** + * 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 + * @member Ext apply + */ +Ext.apply = function(o, c, defaults){ + if(defaults){ + // no "this" reference for friendly out of scope calls + Ext.apply(o, defaults); + } + if(o && c && typeof c == 'object'){ + for(var p in c){ + o[p] = c[p]; + } + } + return o; +}; + +(function(){ + var idSeed = 0; + var ua = navigator.userAgent.toLowerCase(); + + var isStrict = document.compatMode == "CSS1Compat", + isOpera = ua.indexOf("opera") > -1, + isSafari = (/webkit|khtml/).test(ua), + isIE = ua.indexOf("msie") > -1, + isIE7 = ua.indexOf("msie 7") > -1, + isGecko = !isSafari && ua.indexOf("gecko") > -1, + isBorderBox = isIE && !isStrict, + isWindows = (ua.indexOf("windows") != -1 || ua.indexOf("win32") != -1), + isMac = (ua.indexOf("macintosh") != -1 || ua.indexOf("mac os x") != -1), + isSecure = window.location.href.toLowerCase().indexOf("https") === 0; + + // remove css image flicker + if(isIE && !isIE7){ + try{ + document.execCommand("BackgroundImageCache", false, true); + }catch(e){} + } + + Ext.apply(Ext, { + /** + * True if the browser is in strict mode + * @type Boolean + */ + isStrict : isStrict, + /** + * True if the page is running over SSL + * @type Boolean + */ + isSecure : isSecure, + /** + * True when the document is fully initialized and ready for action + * @type Boolean + */ + isReady : false, + /** + * URL to a blank file used by Ext when in secure mode for iframe src and onReady src to prevent + * the IE insecure content warning (defaults to javascript:false). + * @type String + */ + SSL_SECURE_URL : "javascript:false", + + /** + * URL to a 1x1 transparent gif image used by Ext to create inline icons with CSS background images. (Defaults to + * "http://extjs.com/s.gif" and you should change this to a URL on your server). + * @type String + */ + BLANK_IMAGE_URL : "http:/"+"/extjs.com/s.gif", + + emptyFn : function(){}, + + /** + * Copies all the properties of config to obj if they don't already exist. + * @param {Object} obj The receiver of the properties + * @param {Object} config The source of the properties + * @return {Object} returns obj + */ + applyIf : function(o, c){ + if(o && c){ + for(var p in c){ + if(typeof o[p] == "undefined"){ o[p] = c[p]; } + } + } + return o; + }, + + /** + * Applies event listeners to elements by selectors when the document is ready. + * The event name is specified with an @ suffix. +
          
          +Ext.addBehaviors({
          +   // add a listener for click on all anchors in element with id foo
          +   '#foo a@click' : function(e, t){
          +       // do something
          +   },
          +
          +   // add the same listener to multiple selectors (separated by comma BEFORE the @)
          +   '#foo a, #bar span.some-class@mouseover' : function(){
          +       // do something
          +   }
          +});
          +
          + * @param {Object} obj The list of behaviors to apply + */ + addBehaviors : function(o){ + if(!Ext.isReady){ + Ext.onReady(function(){ + Ext.addBehaviors(o); + }); + return; + } + var cache = {}; // simple cache for applying multiple behaviors to same selector does query multiple times + for(var b in o){ + var parts = b.split('@'); + if(parts[1]){ // for Object prototype breakers + var s = parts[0]; + if(!cache[s]){ + cache[s] = Ext.select(s); + } + cache[s].on(parts[1], o[b]); + } + } + cache = null; + }, + + /** + * Generates unique ids. If the element already has an id, it is unchanged + * @param {String/HTMLElement/Element} el (optional) The element to generate an id for + * @param {String} prefix (optional) Id prefix (defaults "ext-gen") + */ + id : function(el, prefix){ + prefix = prefix || "ext-gen"; + el = Ext.getDom(el); + var id = prefix + (++idSeed); + return el ? (el.id ? el.id : (el.id = id)) : id; + }, + + /** + * Extends one class with another class and optionally overrides members with the passed literal. This class + * also adds the function "override()" to the class that can be used to override + * members on an instance. + * @param {Object} subclass The class inheriting the functionality + * @param {Object} superclass The class being extended + * @param {Object} overrides (optional) A literal with members + * @method extend + */ + extend : function(){ + // inline overrides + var io = function(o){ + for(var m in o){ + this[m] = o[m]; + } + }; + return function(sb, sp, overrides){ + if(typeof sp == 'object'){ + overrides = sp; + sp = sb; + sb = function(){sp.apply(this, arguments);}; + } + var F = function(){}, sbp, spp = sp.prototype; + F.prototype = spp; + sbp = sb.prototype = new F(); + sbp.constructor=sb; + sb.superclass=spp; + if(spp.constructor == Object.prototype.constructor){ + spp.constructor=sp; + } + sb.override = function(o){ + Ext.override(sb, o); + }; + sbp.override = io; + sbp.__extcls = sb; + Ext.override(sb, overrides); + return sb; + }; + }(), + + override : function(origclass, overrides){ + if(overrides){ + var p = origclass.prototype; + for(var method in overrides){ + p[method] = overrides[method]; + } + } + }, + /** + * Creates namespaces but does not assume YAHOO is the root. + * @param {String} namespace1 + * @param {String} namespace2 + * @param {String} etc + * @method namespace + */ + namespace : function(){ + var a=arguments, o=null, i, j, d, rt; + for (i=0; imyFunction.createCallback(myarg, myarg2)
          + * Will create a function that is bound to those 2 args. + * @return {Function} The new function + */ + 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 + */ + 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 (if 0 the function is executed immediately) + * @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 + */ + defer : function(millis, obj, args, appendArgs){ + var fn = this.createDelegate(obj, args, appendArgs); + if(millis){ + return setTimeout(fn, millis); + } + fn(); + return 0; + }, + /** + * 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 + */ + 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 + */ + 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); + }; + } +}); + +Ext.applyIf(String, { + + /* + * Escapes the passed string for ' and \ + * @param {String} str + * @return {String} + */ + escape : function(string) { + return string.replace(/('|\\)/g, "\\$1"); + }, + + leftPad : function (val, size, ch) { + var result = new String(val); + if (ch == null) { + ch = " "; + } + while (result.length < size) { + result = ch + result; + } + return result; + }, + + format : function(format){ + var args = Array.prototype.slice.call(arguments, 1); + return format.replace(/\{(\d+)\}/g, function(m, i){ + return args[i]; + }); + } +}); + +String.prototype.toggle = function(value, other){ + return this == value ? other : value; +}; + +Ext.applyIf(Number.prototype, { + constrain : function(min, max){ + return Math.min(Math.max(this, min), max); + } +}); + +Ext.applyIf(Array.prototype, { + indexOf : function(o){ + for (var i = 0, len = this.length; i < len; i++){ + if(this[i] == o) return i; + } + return -1; + }, + + remove : function(o){ + var index = this.indexOf(o); + if(index != -1){ + this.splice(index, 1); + } + } +}); + +/** + Returns the number of milliseconds between this date and date + @param {Date} date (optional) Defaults to now + @return {Number} The diff in milliseconds + @member Date getElapsed + */ +Date.prototype.getElapsed = function(date) { + return Math.abs((date || new Date()).getTime()-this.getTime()); +}; diff --git a/www/extras/yui-ext/source/core/Fx.js b/www/extras/yui-ext/source/core/Fx.js new file mode 100644 index 000000000..c715bcf39 --- /dev/null +++ b/www/extras/yui-ext/source/core/Fx.js @@ -0,0 +1,1000 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + + +//Notifies Element that fx methods are available +Ext.enableFx = true; + +/** + * @class Ext.Fx + *

          A class to provide basic animation and visual effects support. Note: This class is automatically applied + * to the {@link Ext.Element} interface when included, so all effects calls should be performed via Element. + * Conversely, since the effects are not actually defined in Element, Ext.Fx must be included in order for the + * Element effects to work.


          + * + *

          It is important to note that although the Fx methods and many non-Fx Element methods support "method chaining" in that + * they return the Element object itself as the method return value, it is not always possible to mix the two in a single + * method chain. The Fx methods use an internal effects queue so that each effect can be properly timed and sequenced. + * Non-Fx methods, on the other hand, have no such internal queueing and will always execute immediately. For this reason, + * while it may be possible to mix certain Fx and non-Fx method calls in a single chain, it may not always provide the + * expected results and should be done with care.


          + * + *

          Motion effects support 8-way anchoring, meaning that you can choose one of 8 different anchor points on the Element + * that will serve as either the start or end point of the animation. Following are all of the supported anchor positions:

          +
          +Value  Description
          +-----  -----------------------------
          +tl     The top left corner
          +t      The center of the top edge
          +tr     The top right corner
          +l      The center of the left edge
          +r      The center of the right edge
          +bl     The bottom left corner
          +b      The center of the bottom edge
          +br     The bottom right corner
          +
          + * Although some Fx methods accept specific custom config parameters, the ones shown in the Config Options section + * below are common options that can be passed to any Fx method. + * @cfg {Function} callback A function called when the effect is finished + * @cfg {Object} scope The scope of the effect function + * @cfg {String} easing A valid Easing value for the effect + * @cfg {String} afterCls A css class to apply after the effect + * @cfg {Number} duration The length of time (in seconds) that the effect should last + * @cfg {Boolean} remove Whether the Element should be removed from the DOM and destroyed after the effect finishes + * @cfg {Boolean} useDisplay Whether to use the display style attribute instead of visibility when hiding Elements (only applies to + * effects that end with the element being visually hidden, ignored otherwise) + * @cfg {String/Object/Function} afterStyle A style specification string eg "width:100px", or object in the form {width:"100px"}, or + * a function which returns such a specification that will be applied to the Element after the effect finishes + * @cfg {Boolean} block Whether the effect should block other effects from queueing while it runs + * @cfg {Boolean} concurrent Whether to allow subsequently-queued effects to run at the same time as the current effect, or to ensure that they run in sequence + * @cfg {Boolean} stopFx Whether subsequent effects should be stopped and removed after the current effect finishes + */ +Ext.Fx = { + /** + * Slides the element into view. An anchor point can be optionally passed to set the point of + * origin for the slide effect. This function automatically handles wrapping the element with + * a fixed-size container if needed. See the Fx class overview for valid anchor point options. + * Usage: + *
          
          +// default: slide the element in from the top
          +el.slideIn();
          +
          +// custom: slide the element in from the right with a 2-second duration
          +el.slideIn('r', { duration: 2 });
          +
          +// common config options shown with default values
          +el.slideIn('t', {
          + easing: 'easeOut',
          + duration: .5
          +}); +
          + * @param {String} anchor (optional) One of the valid Fx anchor positions (defaults to top: 't') + * @param {Object} options (optional) Object literal with any of the Fx config options + * @return {Element} The Element + */ + slideIn : function(anchor, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + + anchor = anchor || "t"; + + // fix display to visibility + this.fixDisplay(); + + // restore values after effect + var r = this.getFxRestore(); + var b = this.getBox(); + // fixed size for slide + this.setSize(b); + + // wrap if needed + var wrap = this.fxWrap(r.pos, o, "hidden"); + + var st = this.dom.style; + st.visibility = "visible"; + st.position = "absolute"; + + // clear out temp styles after slide and unwrap + var after = function(){ + el.fxUnwrap(wrap, r.pos, o); + st.width = r.width; + st.height = r.height; + el.afterFx(o); + }; + // time to calc the positions + var a, pt = {to: [b.x, b.y]}, bw = {to: b.width}, bh = {to: b.height}; + + switch(anchor.toLowerCase()){ + case "t": + wrap.setSize(b.width, 0); + st.left = st.bottom = "0"; + a = {height: bh}; + break; + case "l": + wrap.setSize(0, b.height); + st.right = st.top = "0"; + a = {width: bw}; + break; + case "r": + wrap.setSize(0, b.height); + wrap.setX(b.right); + st.left = st.top = "0"; + a = {width: bw, points: pt}; + break; + case "b": + wrap.setSize(b.width, 0); + wrap.setY(b.bottom); + st.left = st.top = "0"; + a = {height: bh, points: pt}; + break; + case "tl": + wrap.setSize(0, 0); + st.right = st.bottom = "0"; + a = {width: bw, height: bh}; + break; + case "bl": + wrap.setSize(0, 0); + wrap.setY(b.y+b.height); + st.right = st.top = "0"; + a = {width: bw, height: bh, points: pt}; + break; + case "br": + wrap.setSize(0, 0); + wrap.setXY([b.right, b.bottom]); + st.left = st.top = "0"; + a = {width: bw, height: bh, points: pt}; + break; + case "tr": + wrap.setSize(0, 0); + wrap.setX(b.x+b.width); + st.left = st.bottom = "0"; + a = {width: bw, height: bh, points: pt}; + break; + } + this.dom.style.visibility = "visible"; + wrap.show(); + + arguments.callee.anim = wrap.fxanim(a, + o, + 'motion', + .5, + 'easeOut', after); + }); + return this; + }, + + /** + * Slides the element out of view. An anchor point can be optionally passed to set the end point + * for the slide effect. When the effect is completed, the element will be hidden (visibility = + * 'hidden') but block elements will still take up space in the document. The element must be removed + * from the DOM using the 'remove' config option if desired. This function automatically handles + * wrapping the element with a fixed-size container if needed. See the Fx class overview for valid anchor point options. + * Usage: + *
          
          +// default: slide the element out to the top
          +el.slideOut();
          +
          +// custom: slide the element out to the right with a 2-second duration
          +el.slideOut('r', { duration: 2 });
          +
          +// common config options shown with default values
          +el.slideOut('t', {
          + easing: 'easeOut',
          + duration: .5,
          + remove: false,
          + useDisplay: false +}); +
          + * @param {String} anchor (optional) One of the valid Fx anchor positions (defaults to top: 't') + * @param {Object} options (optional) Object literal with any of the Fx config options + * @return {Element} The Element + */ + slideOut : function(anchor, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + + anchor = anchor || "t"; + + // restore values after effect + var r = this.getFxRestore(); + + var b = this.getBox(); + // fixed size for slide + this.setSize(b); + + // wrap if needed + var wrap = this.fxWrap(r.pos, o, "visible"); + + var st = this.dom.style; + st.visibility = "visible"; + st.position = "absolute"; + + wrap.setSize(b); + + var after = function(){ + if(o.useDisplay){ + el.setDisplayed(false); + }else{ + el.hide(); + } + + el.fxUnwrap(wrap, r.pos, o); + + st.width = r.width; + st.height = r.height; + + el.afterFx(o); + }; + + var a, zero = {to: 0}; + switch(anchor.toLowerCase()){ + case "t": + st.left = st.bottom = "0"; + a = {height: zero}; + break; + case "l": + st.right = st.top = "0"; + a = {width: zero}; + break; + case "r": + st.left = st.top = "0"; + a = {width: zero, points: {to:[b.right, b.y]}}; + break; + case "b": + st.left = st.top = "0"; + a = {height: zero, points: {to:[b.x, b.bottom]}}; + break; + case "tl": + st.right = st.bottom = "0"; + a = {width: zero, height: zero}; + break; + case "bl": + st.right = st.top = "0"; + a = {width: zero, height: zero, points: {to:[b.x, b.bottom]}}; + break; + case "br": + st.left = st.top = "0"; + a = {width: zero, height: zero, points: {to:[b.x+b.width, b.bottom]}}; + break; + case "tr": + st.left = st.bottom = "0"; + a = {width: zero, height: zero, points: {to:[b.right, b.y]}}; + break; + } + + arguments.callee.anim = wrap.fxanim(a, + o, + 'motion', + .5, + "easeOut", after); + }); + return this; + }, + + /** + * Fades the element out while slowly expanding it in all directions. When the effect is completed, the + * element will be hidden (visibility = 'hidden') but block elements will still take up space in the document. + * The element must be removed from the DOM using the 'remove' config option if desired. + * Usage: + *
          
          +// default
          +el.puff();
          +
          +// common config options shown with default values
          +el.puff({
          + easing: 'easeOut',
          + duration: .5,
          + remove: false,
          + useDisplay: false +}); +
          + * @param {Object} options (optional) Object literal with any of the Fx config options + * @return {Element} The Element + */ + puff : function(o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + this.clearOpacity(); + this.show(); + + // restore values after effect + var r = this.getFxRestore(); + var st = this.dom.style; + + var after = function(){ + if(o.useDisplay){ + el.setDisplayed(false); + }else{ + el.hide(); + } + + el.clearOpacity(); + + el.setPositioning(r.pos); + st.width = r.width; + st.height = r.height; + st.fontSize = ''; + el.afterFx(o); + }; + + var width = this.getWidth(); + var height = this.getHeight(); + + arguments.callee.anim = this.fxanim({ + width : {to: this.adjustWidth(width * 2)}, + height : {to: this.adjustHeight(height * 2)}, + points : {by: [-(width * .5), -(height * .5)]}, + opacity : {to: 0}, + fontSize: {to:200, unit: "%"} + }, + o, + 'motion', + .5, + "easeOut", after); + }); + return this; + }, + + /** + * Blinks the element as if it was clicked and then collapses on its center (similar to switching off a television). + * When the effect is completed, the element will be hidden (visibility = 'hidden') but block elements will still + * take up space in the document. The element must be removed from the using the 'remove' config option if desired. + * Usage: + *
          
          +// default
          +el.switchOff();
          +
          +// all config options shown with default values
          +el.switchOff({
          + easing: 'easeIn',
          + duration: .3,
          + remove: false,
          + useDisplay: false +}); +
          + * @param {Object} options (optional) Object literal with any of the Fx config options + * @return {Element} The Element + */ + switchOff : function(o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + this.clearOpacity(); + this.clip(); + + // restore values after effect + var r = this.getFxRestore(); + var st = this.dom.style; + + var after = function(){ + if(o.useDisplay){ + el.setDisplayed(false); + }else{ + el.hide(); + } + + el.clearOpacity(); + el.setPositioning(r.pos); + st.width = r.width; + st.height = r.height; + + el.afterFx(o); + }; + + this.fxanim({opacity:{to:0.3}}, null, null, .1, null, function(){ + this.clearOpacity(); + (function(){ + this.fxanim({ + height:{to:1}, + points:{by:[0, this.getHeight() * .5]} + }, o, 'motion', 0.3, 'easeIn', after); + }).defer(100, this); + }); + }); + return this; + }, + + /** + * Highlights the Element by setting a color (applies to the background-color by default, but can be + * changed using the "attr" config option) and then fading back to the original color. If no original + * color is available, you should provide the "endColor" config option which will be cleared after the animation. + * Usage: +
          
          +// default: highlight background to yellow
          +el.highlight();
          +
          +// custom: highlight foreground text to blue for 2 seconds
          +el.highlight("0000ff", { attr: 'color', duration: 2 });
          +
          +// common config options shown with default values
          +el.highlight("ffff9c", {
          + attr: "background-color", //can be any valid css attribute that supports a color value
          + endColor: (current color) or "ffffff",
          + easing: 'easeIn',
          + duration: 1
          +}); +
          + * @param {String} color (optional) The highlight color. Should be a 6 char hex color without the leading # (defaults to yellow: 'ffff9c') + * @param {Object} options (optional) Object literal with any of the Fx config options + * @return {Element} The Element + */ + highlight : function(color, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + color = color || "ffff9c"; + attr = o.attr || "backgroundColor"; + + this.clearOpacity(); + this.show(); + + var origColor = this.getColor(attr); + var restoreColor = this.dom.style[attr]; + endColor = (o.endColor || origColor) || "ffffff"; + + var after = function(){ + el.dom.style[attr] = restoreColor; + el.afterFx(o); + }; + + var a = {}; + a[attr] = {from: color, to: endColor}; + arguments.callee.anim = this.fxanim(a, + o, + 'color', + 1, + 'easeIn', after); + }); + return this; + }, + + /** + * Shows a ripple of exploding, attenuating borders to draw attention to an Element. + * Usage: +
          
          +// default: a single light blue ripple
          +el.frame();
          +
          +// custom: 3 red ripples lasting 3 seconds total
          +el.frame("ff0000", 3, { duration: 3 });
          +
          +// common config options shown with default values
          +el.frame("C3DAF9", 1, {
          + duration: 1 //duration of entire animation (not each individual ripple)
          + // Note: Easing is not configurable and will be ignored if included +}); +
          + * @param {String} color (optional) The color of the border. Should be a 6 char hex color without the leading # (defaults to light blue: 'C3DAF9'). + * @param {Number} count (optional) The number of ripples to display (defaults to 1) + * @param {Object} options (optional) Object literal with any of the Fx config options + * @return {Element} The Element + */ + frame : function(color, count, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + color = color || "#C3DAF9"; + if(color.length == 6){ + color = "#" + color; + } + count = count || 1; + duration = o.duration || 1; + this.show(); + + var b = this.getBox(); + var animFn = function(){ + var proxy = this.createProxy({ + tag:"div", + style:{ + visbility:"hidden", + position:"absolute", + "z-index":"35000", // yee haw + border:"0px solid " + color + } + }); + var scale = Ext.isBorderBox ? 2 : 1; + proxy.animate({ + top:{from:b.y, to:b.y - 20}, + left:{from:b.x, to:b.x - 20}, + borderWidth:{from:0, to:10}, + opacity:{from:1, to:0}, + height:{from:b.height, to:(b.height + (20*scale))}, + width:{from:b.width, to:(b.width + (20*scale))} + }, duration, function(){ + proxy.remove(); + }); + if(--count > 0){ + animFn.defer((duration/2)*1000, this); + }else{ + el.afterFx(o); + } + }; + animFn.call(this); + }); + return this; + }, + + /** + * Creates a pause before any subsequent queued effects begin. If there are + * no effects queued after the pause it will have no affect. + * Usage: +
          
          +el.pause(1);
          +
          + * @param {Number} seconds The length of time to pause (in seconds) + * @return {Element} The Element + */ + pause : function(seconds){ + var el = this.getFxEl(); + var o = {}; + + el.queueFx(o, function(){ + setTimeout(function(){ + el.afterFx(o); + }, seconds * 1000); + }); + return this; + }, + + /** + * Fade an element in (from transparent to opaque). The ending opacity can be specified + * using the "endOpacity" config option. + * Usage: +
          
          +// default: fade in from opactiy 0 to 100%
          +el.fadeIn();
          +
          +// custom: fade in from opcaity 0 to 75% over 2 seconds
          +el.fadeIn({ endOpacity: .75, duration: 2});
          +
          +// common config options shown with default values
          +el.fadeIn({
          + endOpacity: 1, //can be any value between 0 and 1 (e.g. .5)
          + easing: 'easeOut',
          + duration: .5
          +}); +
          + * @param {Object} options (optional) Object literal with any of the Fx config options + * @return {Element} The Element + */ + fadeIn : function(o){ + var el = this.getFxEl(); + o = o || {}; + el.queueFx(o, function(){ + this.setOpacity(0); + this.fixDisplay(); + this.dom.style.visibility = 'visible'; + var to = o.endOpacity || 1; + arguments.callee.anim = this.fxanim({opacity:{to:to}}, + o, null, .5, "easeOut", function(){ + if(to == 1){ + this.clearOpacity(); + } + el.afterFx(o); + }); + }); + return this; + }, + + /** + * Fade an element out (from opaque to transparent). The ending opacity can be specified + * using the "endOpacity" config option. + * Usage: +
          
          +// default: fade out from the element's current opacity to 0
          +el.fadeOut();
          +
          +// custom: fade out from the element's current opacity to 25% over 2 seconds
          +el.fadeOut({ endOpacity: .25, duration: 2});
          +
          +// common config options shown with default values
          +el.fadeOut({
          + endOpacity: 0, //can be any value between 0 and 1 (e.g. .5)
          + easing: 'easeOut',
          + duration: .5
          + remove: false,
          + useDisplay: false +}); +
          + * @param {Object} options (optional) Object literal with any of the Fx config options + * @return {Element} The Element + */ + fadeOut : function(o){ + var el = this.getFxEl(); + o = o || {}; + el.queueFx(o, function(){ + arguments.callee.anim = this.fxanim({opacity:{to:o.endOpacity || 0}}, + o, null, .5, "easeOut", function(){ + if(this.visibilityMode == Ext.Element.DISPLAY || o.useDisplay){ + this.dom.style.display = "none"; + }else{ + this.dom.style.visibility = "hidden"; + } + this.clearOpacity(); + el.afterFx(o); + }); + }); + return this; + }, + + /** + * Animates the transition of an element's dimensions from a starting height/width + * to an ending height/width. + * Usage: +
          
          +// change height and width to 100x100 pixels
          +el.scale(100, 100);
          +
          +// common config options shown with default values.  The height and width will default to
          +// the element's existing values if passed as null.
          +el.scale(
          +	[element's width],
          + [element's height], {
          + easing: 'easeOut',
          + duration: .35
          +}); +
          + * @param {Number} width The new width (pass null to keep the original width) + * @param {Number} height The new height (pass null to keep the original height) + * @param {Object} options (optional) Object literal with any of the Fx config options + * @return {Element} The Element + */ + scale : function(w, h, o){ + this.shift(Ext.apply({}, o, { + width: w, + height: h + })); + return this; + }, + + /** + * Animates the transition of any combination of an element's dimensions, xy position and/or opacity. + * Any of these properties not specified in the config object will not be changed. This effect + * requires that at least one new dimension, position or opacity setting must be passed in on + * the config object in order for the function to have any affect. + * Usage: +
          
          +// slide the element horizontally to x position 200 while changing the height and opacity
          +el.shift({ x: 200, height: 50, opacity: .8 });
          +
          +// common config options shown with default values.
          +el.shift({
          +	width: [element's width],
          + height: [element's height],
          + x: [element's x position],
          + y: [element's y position],
          + opacity: [element's opacity],
          + easing: 'easeOut',
          + duration: .35
          +}); +
          + * @param {Object} options Object literal with any of the Fx config options + * @return {Element} The Element + */ + shift : function(o){ + var el = this.getFxEl(); + o = o || {}; + el.queueFx(o, function(){ + var a = {}, w = o.width, h = o.height, x = o.x, y = o.y, op = o.opacity; + if(w !== undefined){ + a.width = {to: this.adjustWidth(w)}; + } + if(h !== undefined){ + a.height = {to: this.adjustHeight(h)}; + } + if(x !== undefined || y !== undefined){ + a.points = {to: [ + x !== undefined ? x : this.getX(), + y !== undefined ? y : this.getY() + ]}; + } + if(op !== undefined){ + a.opacity = {to: op}; + } + if(o.xy !== undefined){ + a.points = {to: o.xy}; + } + arguments.callee.anim = this.fxanim(a, + o, 'motion', .35, "easeOut", function(){ + el.afterFx(o); + }); + }); + return this; + }, + + /** + * Slides the element while fading it out of view. An anchor point can be optionally passed to set the + * ending point of the effect. + * Usage: + *
          
          +// default: slide the element downward while fading out
          +el.ghost();
          +
          +// custom: slide the element out to the right with a 2-second duration
          +el.ghost('r', { duration: 2 });
          +
          +// common config options shown with default values
          +el.ghost('b', {
          + easing: 'easeOut',
          + duration: .5
          + remove: false,
          + useDisplay: false +}); +
          + * @param {String} anchor (optional) One of the valid Fx anchor positions (defaults to bottom: 'b') + * @param {Object} options (optional) Object literal with any of the Fx config options + * @return {Element} The Element + */ + ghost : function(anchor, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + anchor = anchor || "b"; + + // restore values after effect + var r = this.getFxRestore(); + var w = this.getWidth(), + h = this.getHeight(); + + var st = this.dom.style; + + var after = function(){ + if(o.useDisplay){ + el.setDisplayed(false); + }else{ + el.hide(); + } + + el.clearOpacity(); + el.setPositioning(r.pos); + st.width = r.width; + st.height = r.height; + + el.afterFx(o); + }; + + var a = {opacity: {to: 0}, points: {}}, pt = a.points; + switch(anchor.toLowerCase()){ + case "t": + pt.by = [0, -h]; + break; + case "l": + pt.by = [-w, 0]; + break; + case "r": + pt.by = [w, 0]; + break; + case "b": + pt.by = [0, h]; + break; + case "tl": + pt.by = [-w, -h]; + break; + case "bl": + pt.by = [-w, h]; + break; + case "br": + pt.by = [w, h]; + break; + case "tr": + pt.by = [w, -h]; + break; + } + + arguments.callee.anim = this.fxanim(a, + o, + 'motion', + .5, + "easeOut", after); + }); + return this; + }, + + /** + * Ensures that all effects queued after syncFx is called on the element are + * run concurrently. This is the opposite of {@link #sequenceFx}. + * @return {Element} The Element + */ + syncFx : function(){ + this.fxDefaults = Ext.apply(this.fxDefaults || {}, { + block : false, + concurrent : true, + stopFx : false + }); + return this; + }, + + /** + * Ensures that all effects queued after sequenceFx is called on the element are + * run in sequence. This is the opposite of {@link #syncFx}. + * @return {Element} The Element + */ + sequenceFx : function(){ + this.fxDefaults = Ext.apply(this.fxDefaults || {}, { + block : false, + concurrent : false, + stopFx : false + }); + return this; + }, + + /* @private */ + nextFx : function(){ + var ef = this.fxQueue[0]; + if(ef){ + ef.call(this); + } + }, + + /** + * Returns true if the element has any effects actively running or queued, else returns false. + * @return {Boolean} True if element has active effects, else false + */ + hasActiveFx : function(){ + return this.fxQueue && this.fxQueue[0]; + }, + + /** + * Stops any running effects and clears the element's internal effects queue if it contains + * any additional effects that haven't started yet. + * @return {Element} The Element + */ + stopFx : function(){ + if(this.hasActiveFx()){ + var cur = this.fxQueue[0]; + if(cur && cur.anim && cur.anim.isAnimated()){ + this.fxQueue = [cur]; // clear out others + cur.anim.stop(true); + } + } + return this; + }, + + /* @private */ + beforeFx : function(o){ + if(this.hasActiveFx() && !o.concurrent){ + if(o.stopFx){ + this.stopFx(); + return true; + } + return false; + } + return true; + }, + + /** + * Returns true if the element is currently blocking so that no other effect can be queued + * until this effect is finished, else returns false if blocking is not set. This is commonly + * used to ensure that an effect initiated by a user action runs to completion prior to the + * same effect being restarted (e.g., firing only one effect even if the user clicks several times). + * @return {Boolean} True if blocking, else false + */ + hasFxBlock : function(){ + var q = this.fxQueue; + return q && q[0] && q[0].block; + }, + + /* @private */ + queueFx : function(o, fn){ + if(!this.fxQueue){ + this.fxQueue = []; + } + if(!this.hasFxBlock()){ + Ext.applyIf(o, this.fxDefaults); + if(!o.concurrent){ + var run = this.beforeFx(o); + fn.block = o.block; + this.fxQueue.push(fn); + if(run){ + this.nextFx(); + } + }else{ + fn.call(this); + } + } + return this; + }, + + /* @private */ + fxWrap : function(pos, o, vis){ + var wrap; + if(!o.wrap || !(wrap = Ext.get(o.wrap))){ + var wrapXY; + if(o.fixPosition){ + wrapXY = this.getXY(); + } + var div = document.createElement("div"); + div.style.visibility = vis; + wrap = Ext.get(this.dom.parentNode.insertBefore(div, this.dom)); + wrap.setPositioning(pos); + if(wrap.getStyle("position") == "static"){ + wrap.position("relative"); + } + this.clearPositioning('auto'); + wrap.clip(); + wrap.dom.appendChild(this.dom); + if(wrapXY){ + wrap.setXY(wrapXY); + } + } + return wrap; + }, + + /* @private */ + fxUnwrap : function(wrap, pos, o){ + this.clearPositioning(); + this.setPositioning(pos); + if(!o.wrap){ + wrap.dom.parentNode.insertBefore(this.dom, wrap.dom); + wrap.remove(); + } + }, + + /* @private */ + getFxRestore : function(){ + var st = this.dom.style; + return {pos: this.getPositioning(), width: st.width, height : st.height}; + }, + + /* @private */ + afterFx : function(o){ + if(o.afterStyle){ + this.applyStyles(o.afterStyle); + } + if(o.afterCls){ + this.addClass(o.afterCls); + } + if(o.remove === true){ + this.remove(); + } + Ext.callback(o.callback, o.scope, [this]); + if(!o.concurrent){ + this.fxQueue.shift(); + this.nextFx(); + } + }, + + /* @private */ + getFxEl : function(){ // support for composite element fx + return Ext.get(this.dom); + }, + + /* @private */ + fxanim : function(args, opt, animType, defaultDur, defaultEase, cb){ + animType = animType || 'run'; + opt = opt || {}; + var anim = Ext.lib.Anim[animType]( + this.dom, args, + (opt.duration || defaultDur) || .35, + (opt.easing || defaultEase) || 'easeOut', + function(){ + Ext.callback(cb, this); + }, + this + ); + opt.anim = anim; + return anim; + } +}; + +// backwords compat +Ext.Fx.resize = Ext.Fx.scale; + +//When included, Ext.Fx is automatically applied to Element so that all basic +//effects are available directly via the Element API +Ext.apply(Ext.Element.prototype, Ext.Fx); diff --git a/www/extras/yui-ext/source/core/Template.js b/www/extras/yui-ext/source/core/Template.js new file mode 100644 index 000000000..a3710b3b7 --- /dev/null +++ b/www/extras/yui-ext/source/core/Template.js @@ -0,0 +1,364 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** +* @class Ext.Template +* Represents an HTML fragment template. Templates can be precompiled for greater performance. +* For a list of available format functions, see {@link Ext.util.Format}. +
          
          +var t = new Ext.Template(
          +	'<div name="{id}">',
          +		'<span class="{cls}">{name:trim} {value:ellipsis(10)}</span>',
          +	'</div>'
          +);
          +t.append('some-element', {id: 'myid', name: 'foo', value: 'bar'});
          +
          +* For more information see this blog post with examples. +*
          +* @constructor +* @param {String/Array} html The HTML fragment or an array of fragments to join('') or multiple arguments to join('') +*/ +Ext.Template = function(html){ + if(html instanceof Array){ + html = html.join(""); + }else if(arguments.length > 1){ + html = Array.prototype.join.call(arguments, ""); + } + /**@private*/ + this.html = html; + +}; +Ext.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 useF = this.disableFormats !== true; + var fm = Ext.util.Format, tpl = this; + var fn = function(m, name, format, args){ + if(format && useF){ + if(format.substr(0, 5) == "this."){ + return tpl.call(format.substr(5), values[name]); + }else{ + if(args){ + // quoted values are required for strings in compiled templates, + // but for non compiled we need to strip them + // quoted reversed for jsmin + var re = /^\s*['"](.*)["']\s*$/; + args = args.split(','); + for(var i = 0, len = args.length; i < len; i++){ + args[i] = args[i].replace(re, "$1"); + } + args = [values[name]].concat(args); + }else{ + args = [values[name]]; + } + return fm[format].apply(fm, args); + } + }else{ + return values[name] !== undefined ? values[name] : ""; + } + }; + return this.html.replace(this.re, fn); + }, + + /** + * Sets the html used as the template and optionally compiles it + * @param {String} html + * @param {Boolean} compile (optional) + * @return {Template} this + */ + set : function(html, compile){ + this.html = html; + this.compiled = null; + if(compile){ + this.compile(); + } + return this; + }, + + /** + * True to disable format functions (default to false) + * @type Boolean + */ + disableFormats : false, + + /** + * The regular expression used to match template variables + * @type RegExp + * @property + */ + re : /\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g, + + /** + * Compiles the template into an internal function, eliminating the RegEx overhead + */ + compile : function(){ + var fm = Ext.util.Format; + var useF = this.disableFormats !== true; + var sep = Ext.isGecko ? "+" : ","; + var fn = function(m, name, format, args){ + if(format && useF){ + args = args ? ',' + args : ""; + if(format.substr(0, 5) != "this."){ + format = "fm." + format + '('; + }else{ + format = 'this.call("'+ format.substr(5) + '", '; + args = ""; + } + }else{ + args= '', format = "(values['" + name + "'] == undefined ? '' : "; + } + return "'"+ sep + format + "values['" + name + "']" + args + ")"+sep+"'"; + }; + var body; + // branched to use + in gecko and [].join() in others + if(Ext.isGecko){ + body = "this.compiled = function(values){ return '" + + this.html.replace(/(\r\n|\n)/g, '\\n').replace("'", "\\'").replace(this.re, fn) + + "';};"; + }else{ + body = ["this.compiled = function(values){ return ['"]; + body.push(this.html.replace(/(\r\n|\n)/g, '\\n').replace("'", "\\'").replace(this.re, fn)); + body.push("'].join('');};"); + body = body.join(''); + } + eval(body); + return this; + }, + + // private function used to call members + call : function(fnName, value){ + return this[fnName](value); + }, + + /** + * Applies the supplied values to the template and inserts the new node(s) as the first child of el + * @param {String/HTMLElement/Element} 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 Ext.Element + * @return {HTMLElement} The new node + */ + insertFirst: function(el, values, returnElement){ + return this.doInsert('afterBegin', el, values, returnElement); + }, + + /** + * Applies the supplied values to the template and inserts the new node(s) before el + * @param {String/HTMLElement/Element} 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 Ext.Element + * @return {HTMLElement} The new node + */ + insertBefore: function(el, values, returnElement){ + return this.doInsert('beforeBegin', el, values, returnElement); + }, + + /** + * Applies the supplied values to the template and inserts the new node(s) after el + * @param {String/HTMLElement/Element} 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 Ext.Element + * @return {HTMLElement} The new node + */ + insertAfter : function(el, values, returnElement){ + return this.doInsert('afterEnd', el, values, returnElement); + }, + + /** + * Applies the supplied values to the template and append the new node(s) to el + * @param {String/HTMLElement/Element} 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 Ext.Element + * @return {HTMLElement} The new node + */ + append : function(el, values, returnElement){ + return this.doInsert('beforeEnd', el, values, returnElement); + }, + + doInsert : function(where, el, values, returnEl){ + el = Ext.getDom(el); + var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values)); + return returnEl ? Ext.get(newNode, true) : newNode; + }, + + /** + * Applies the supplied values to the template and overwrites the content of el with the new node(s) + * @param {String/HTMLElement/Element} 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 Ext.Element + * @return {HTMLElement} The new node + */ + overwrite : function(el, values, returnElement){ + el = Ext.getDom(el); + el.innerHTML = this.applyTemplate(values); + return returnElement ? Ext.get(el.firstChild, true) : el.firstChild; + } +}; +/** + * Alias for applyTemplate + * @method + */ +Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate; + +// backwards compat +Ext.DomHelper.Template = Ext.Template; + +/** + * Creates a template from the passed element's value (display:none textarea, preferred) or innerHTML + * @param {String/HTMLElement} el + * @static + */ +Ext.Template.from = function(el){ + el = Ext.getDom(el); + return new Ext.Template(el.value || el.innerHTML); +}; + +/** + * @class Ext.MasterTemplate + * @extends Ext.Template + * Provides a template that can have child templates. The syntax is: +
          
          +var t = new Ext.MasterTemplate(
          +	'<select name="{name}">',
          +		'<tpl name="options"><option value="{value:trim}">{text:ellipsis(10)}</option></tpl>',
          +	'</select>'
          +);
          +t.add('options', {value: 'foo', text: 'bar'});
          +// or you can add multiple child elements in one shot
          +t.addAll('options', [
          +    {value: 'foo', text: 'bar'},
          +    {value: 'foo2', text: 'bar2'},
          +    {value: 'foo3', text: 'bar3'}
          +]);
          +// then append, applying the master template values
          +t.append('my-form', {name: 'my-select'});
          +
          +* A name attribute for the child template is not required if you have only one child +* template or you want to refer to them by index. + */ +Ext.MasterTemplate = function(){ + Ext.MasterTemplate.superclass.constructor.apply(this, arguments); + this.originalHtml = this.html; + var st = {}; + var m, re = this.subTemplateRe; + re.lastIndex = 0; + var subIndex = 0; + while(m = re.exec(this.html)){ + var name = m[1], content = m[2]; + st[subIndex] = { + name: name, + index: subIndex, + buffer: [], + tpl : new Ext.Template(content) + }; + if(name){ + st[name] = st[subIndex]; + } + st[subIndex].tpl.compile(); + st[subIndex].tpl.call = this.call.createDelegate(this); + subIndex++; + } + this.subCount = subIndex; + this.subs = st; +}; +Ext.extend(Ext.MasterTemplate, Ext.Template, { + /** + * The regular expression used to match sub templates + * @type RegExp + * @property + */ + subTemplateRe : /((?:.|\n)*?)<\/tpl>/gi, + + /** + * Applies the passed values to a child template. + * @param {String/Number} name (optional) The name or index of the child template + * @param {Array/Object} values The values to be applied to the template + * @return {MasterTemplate} this + */ + add : function(name, values){ + if(arguments.length == 1){ + values = arguments[0]; + name = 0; + } + var s = this.subs[name]; + s.buffer[s.buffer.length] = s.tpl.apply(values); + return this; + }, + + /** + * Applies all the passed values to a child template. + * @param {String/Number} name (optional) The name or index of the child template + * @param {Array} values The values to be applied to the template, this should be an array of objects. + * @param {Boolean} reset (optional) True to reset the template first + * @return {MasterTemplate} this + */ + fill : function(name, values, reset){ + var a = arguments; + if(a.length == 1 || (a.length == 2 && typeof a[1] == "boolean")){ + values = a[0]; + name = 0; + reset = a[1]; + } + if(reset){ + this.reset(); + } + for(var i = 0, len = values.length; i < len; i++){ + this.add(name, values[i]); + } + return this; + }, + + /** + * Resets the template for reuse + * @return {MasterTemplate} this + */ + reset : function(){ + var s = this.subs; + for(var i = 0; i < this.subCount; i++){ + s[i].buffer = []; + } + return this; + }, + + applyTemplate : function(values){ + var s = this.subs; + var replaceIndex = -1; + this.html = this.originalHtml.replace(this.subTemplateRe, function(m, name){ + return s[++replaceIndex].buffer.join(""); + }); + return Ext.MasterTemplate.superclass.applyTemplate.call(this, values); + }, + + apply : function(){ + return this.applyTemplate.apply(this, arguments); + }, + + compile : function(){return this;} +}); + +/** + * Alias for fill(). + * @method + */ +Ext.MasterTemplate.prototype.addAll = Ext.MasterTemplate.prototype.fill; + /** + * Creates a template from the passed element's value (display:none textarea, preferred) or innerHTML. e.g. + * var tpl = Ext.MasterTemplate.from('element-id'); + * @param {String/HTMLElement} el + * @static + */ +Ext.MasterTemplate.from = function(el){ + el = Ext.getDom(el); + return new Ext.MasterTemplate(el.value || el.innerHTML); +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/core/UpdateManager.js b/www/extras/yui-ext/source/core/UpdateManager.js new file mode 100644 index 000000000..44f9150e5 --- /dev/null +++ b/www/extras/yui-ext/source/core/UpdateManager.js @@ -0,0 +1,493 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.UpdateManager + * @extends Ext.util.Observable + * Provides AJAX-style update for Element object.

          + * Usage:
          + *
          
          + * // Get it from a Ext.Element object
          + * var el = Ext.get("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 Ext.UpdateManager("myElementId"); + * mgr.startAutoRefresh(60, "http://myserver.com/index.php"); + * mgr.on("update", myFcnNeedsToKnow); + *
          + // short handed call directly from the element object + Ext.get("foo").load({ + url: "bar.php", + scripts:true, + params: "for=bar", + text: "Loading Foo..." + }); + *
          + * @constructor + * Create new UpdateManager directly. + * @param {String/HTMLElement/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). + */ +Ext.UpdateManager = function(el, forceNew){ + el = Ext.get(el); + if(!forceNew && el.updateManager){ + return el.updateManager; + } + /** + * The Element object + * @type 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.addEvents({ + /** + * @event beforeupdate + * Fired before an update is made, return false from your handler and the update is cancelled. + * @param {Ext.Element} el + * @param {String/Object/Function} url + * @param {String/Object} params + */ + "beforeupdate": true, + /** + * @event update + * Fired after successful update is made. + * @param {Ext.Element} el + * @param {Object} oResponseObject The response Object + */ + "update": true, + /** + * @event failure + * Fired on update failure. + * @param {Ext.Element} el + * @param {Object} oResponseObject The response Object + */ + "failure": true + }); + var d = Ext.UpdateManager.defaults; + /** + * Blank page URL to use with SSL file uploads (Defaults to Ext.UpdateManager.defaults.sslBlankUrl or "about:blank"). + * @type String + */ + this.sslBlankUrl = d.sslBlankUrl; + /** + * Whether to append unique parameter on get request to disable caching (Defaults to Ext.UpdateManager.defaults.disableCaching or false). + * @type Boolean + */ + this.disableCaching = d.disableCaching; + /** + * Text for loading indicator (Defaults to Ext.UpdateManager.defaults.indicatorText or '<div class="loading-indicator">Loading...</div>'). + * @type String + */ + this.indicatorText = d.indicatorText; + /** + * Whether to show indicatorText when loading (Defaults to Ext.UpdateManager.defaults.showLoadIndicator or true). + * @type String + */ + this.showLoadIndicator = d.showLoadIndicator; + /** + * Timeout for requests or form posts in seconds (Defaults to Ext.UpdateManager.defaults.timeout or 30 seconds). + * @type Number + */ + this.timeout = d.timeout; + + /** + * True to process scripts in the output (Defaults to Ext.UpdateManager.defaults.loadScripts (false)). + * @type Boolean + */ + this.loadScripts = d.loadScripts; + + /** + * 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 Ext.UpdateManager.BasicRenderer}. + */ + this.renderer = new Ext.UpdateManager.BasicRenderer(); + + Ext.UpdateManager.superclass.constructor.call(this); +}; + +Ext.extend(Ext.UpdateManager, Ext.util.Observable, { + /** + * Get the Element this UpdateManager is bound to + * @return {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,
          + nocache: false,
          + text: "Loading...",
          + timeout: 30,
          + scripts: 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, oResponse) + * @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.fireEvent("beforeupdate", this.el, url, params) !== false){ + var method = this.method; + 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.method != "undefined"){method = cfg.method;}; + 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.call(this); + } + if(typeof params == "function"){ + params = params(); + } + 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.successDelegate, + failure: this.failureDelegate, + timeout: (this.timeout*1000), + argument: {"url": url, "form": null, "callback": callback, "params": params} + }; + method = method || (params ? "POST" : "GET"); + if(method == "GET"){ + url = this.prepareUrl(url); + } + this.transaction = Ext.lib.Ajax.request(method, url, cb, 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, oResponse) + */ + formUpdate : function(form, url, reset, callback){ + if(this.fireEvent("beforeupdate", this.el, form, url) !== false){ + formEl = Ext.getDom(form); + if(typeof url == "function"){ + url = url.call(this); + } + if(typeof params == "function"){ + params = params(); + } + url = url || formEl.action; + var cb = { + success: this.successDelegate, + failure: this.failureDelegate, + timeout: (this.timeout*1000), + argument: {"url": url, "form": formEl, "callback": callback, "reset": reset} + }; + var isUpload = false; + var enctype = formEl.getAttribute("enctype"); + if(enctype && enctype.toLowerCase() == "multipart/form-data"){ + isUpload = true; + cb.upload = this.successDelegate; + } + this.transaction = Ext.lib.Ajax.formRequest(formEl, url, cb, null, isUpload, this.sslBlankUrl); + this.showLoading.defer(1, this); + } + }, + + /** + * 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); + delete this.autoRefreshProcId; + } + }, + + isAutoRefreshing : function(){ + return this.autoRefreshProcId ? true : false; + }, + /** + * 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, response); + } + }, + + /** + * @private + */ + processFailure : function(response){ + this.transaction = null; + this.fireEvent("failure", this.el, response); + if(typeof response.argument.callback == "function"){ + response.argument.callback(this.el, false, response); + } + }, + + /** + * Set the content renderer for this UpdateManager. See {@link 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){ + Ext.lib.Ajax.abort(this.transaction); + } + }, + + /** + * Returns true if an update is in progress + * @return {Boolean} + */ + isUpdating : function(){ + if(this.transaction){ + return Ext.lib.Ajax.isCallInProgress(this.transaction); + } + return false; + } +}); + +/** + * @class Ext.UpdateManager.defaults + * The defaults collection enables customizing the default properties of UpdateManager + */ + 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 Boolean + */ + loadScripts : false, + + /** + * Blank page URL to use with SSL file uploads (Defaults to "javascript:false"). + * @type String + */ + sslBlankUrl : (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 Boolean + */ + showLoadIndicator : true, + /** + * Text for loading indicator (Defaults to '<div class="loading-indicator">Loading...</div>'). + * @type String + */ + indicatorText : '
          Loading...
          ' + }; + +/** + * Static convenience method. This method is deprecated in favor of el.load({url:'foo.php', ...}). + *Usage: + *
          Ext.UpdateManager.updateElement("my-div", "stuff.php");
          + * @param {String/HTMLElement/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 + * @deprecated + * @member Ext.UpdateManager + */ +Ext.UpdateManager.updateElement = function(el, url, params, options){ + var um = Ext.get(el, true).getUpdateManager(); + Ext.apply(um, options); + um.update(url, params, options ? options.callback : null); +}; +// alias for backwards compat +Ext.UpdateManager.update = Ext.UpdateManager.updateElement; +/** + * @class Ext.UpdateManager.BasicRenderer + * Default Content renderer. Updates the elements innerHTML with the responseText. + */ +Ext.UpdateManager.BasicRenderer = function(){}; + +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 {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/data/ArrayReader.js b/www/extras/yui-ext/source/data/ArrayReader.js new file mode 100644 index 000000000..b1f7fb362 --- /dev/null +++ b/www/extras/yui-ext/source/data/ArrayReader.js @@ -0,0 +1,80 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.data.ArrayReader + * @extends Ext.data.DataReader + * Data reader class to create an Array of Ext.data.Record objects from an Array. + * Each element of that Array represents a row of data fields. The + * fields are pulled into a Record object using as a subscript, the mapping property + * of the field definition if it exists, or the field's ordinal position in the definition. + *

          + * The code below lists all configuration options. + *

          
          +   var RecordDef = Ext.data.Record.create([
          +       {name: 'name', mapping: 1},
          +       {name: 'occupation', mapping: 2},
          +   ]);
          +   var myReader = new Ext.data.ArrayReader({
          +       id: 0                     // The subscript within row Array that provides an ID for the Record (optional)
          +   }, RecordDef);
          +  
          + *

          + * This would consume an Array like this: + *

          
          +   [ [1, 'Bill', 'Gardener'], [2, 'Ben', 'Horticulturalist'] ]
          +  
          + * @cfg {String} totalProperty Name of the property from which to retrieve the total number of records + * in the dataset. This is only needed if the whole dataset is not passed in one go, but is being + * paged from the remote server. + * @cfg {String} id (optional) The subscript within row Array that provides an ID for the Record + * @constructor + * Create a new JsonReader + * @param {Object} meta Metadata configuration options. + * @param {Array/Ext.data.Record constructor} recordType Either an Array of field definition objects, + * or an {@link Ext.data.Record} object created using {@link Ext.data.Record#create}. + */ +Ext.data.ArrayReader = function(meta, recordType){ + Ext.data.ArrayReader.superclass.constructor.call(this, meta, recordType); +}; + +Ext.extend(Ext.data.ArrayReader, Ext.data.JsonReader, { + /** + * Create a data block containing Ext.data.Records from an XML document. + * @param {Object} o An object which contains an Array of row objects in the property specified + * in the config as 'root, and optionally a property, specified in the config as 'totalProperty' + * which contains the total size of the dataset. + * @return {Object} data A data block which is used by an Ext.data.Store object as + * a cache of Ext.data.Records. + */ + readRecords : function(o){ + var sid = this.meta ? this.meta.id : null; + var recordType = this.recordType, fields = recordType.prototype.fields; + var records = []; + var root = o; + for(var i = 0; i < root.length; i++){ + var n = root[i]; + var values = {}; + var id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null); + for(var j = 0, jlen = fields.length; j < jlen; j++){ + var f = fields.items[j]; + var k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j; + var v = n[k] !== undefined ? n[k] : f.defaultValue; + v = f.convert(v); + values[f.name] = v; + } + var record = new recordType(values, id); + record.json = n; + records[records.length] = record; + } + return { + records : records, + totalRecords : records.length + }; + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/data/Connection.js b/www/extras/yui-ext/source/data/Connection.js new file mode 100644 index 000000000..e737ee20b --- /dev/null +++ b/www/extras/yui-ext/source/data/Connection.js @@ -0,0 +1,130 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.data.Connection + * The class encapsulates a connection to the page's originating domain, allowing requests to be made + * either to a configured URL, or to a URL specified at request time. + *

          + * Requests made by this class are asynchronous, and will return immediately, and no data from + * the server will be available. To process the returned data, us a callback in the request options + * object. + * @constructor + * @param config {Object} a configuration object. + */ +Ext.data.Connection = function(config){ + Ext.apply(this, config); + this.addEvents({ + "beforerequest" : true, + "requestcomplete" : true, + "requestexception" : true + }); + Ext.data.Connection.superclass.constructor.call(this); +}; + +Ext.extend(Ext.data.Connection, Ext.util.Observable, { + /** + * @cfg url {String} (Optional) The default URL to be used for requests to the server. + */ + /** + * @cfg extraParams {Object} (Optional) An object containing properties which are used as + * extra parameters to each request made by this object. + */ + /** + * @cfg method {String} (Optional) The default HTTP method to be used for requests. + */ + /** + * @cfg timeout {Number} (Optional) The timeout in milliseconds to be used for requests. Defaults + * to 30000. + */ + timeout : 30000, + + /** + * Sends an HTTP request to a remote server. + * @param {Object} options. An object which may contain the following properties:

            + *
          • url {String} (Optional) The URL to which to send the request. Defaults to configured URL
          • + *
          • params {Object} (Optional) An object containing properties which are used as extra parameters to the request
          • + *
          • method {String} (Optional) The HTTP method to use for the request. Defaults to the configured method, or + * if no method was configured, "GET" if no parameters are being sent, and "POST" if parameters are being sent.
          • + *
          • callback {Function} (Optional) The function to be called upon receipt of the HTTP response. + * The callback is passed the following parameters:
              + *
            • options {Object} The parameter to the request call.
            • + *
            • success {Boolean} True if the request succeeded.
            • + *
            • resopnse {Object} The XMLHttpRequest object containing the response data.
            • + *
          • + *
          • scope {Object} (Optional) The scope in which to execute the callback: The "this" object + * for the callback function. Defaults to the browser window.
          • + *
          + */ + request : function(options){ + if(this.fireEvent("beforerequest", this, options) !== false){ + var p = options.params; + if(typeof p == "object"){ + p = Ext.urlEncode(Ext.apply(options.params, this.extraParams)); + } + var cb = { + success: this.handleResponse, + failure: this.handleFailure, + scope: this, + argument: {options: options}, + timeout : this.timeout + }; + var method = options.method||this.method||(p ? "POST" : "GET"); + var url = options.url || this.url; + if(this.autoAbort !== false){ + this.abort(); + } + if(method == 'GET' && p){ + url += (url.indexOf('?') != -1 ? '&' : '?') + p; + p = ''; + } + this.transId = Ext.lib.Ajax.request(method, url, cb, p); + }else{ + if(typeof options.callback == "function"){ + options.callback.call(options.scope||window, options, null, null); + } + } + }, + + /** + * Determine whether this object has a request outstanding. + * @return {Boolean} True if there is an outstanding request. + */ + isLoading : function(){ + return this.transId ? true : false; + }, + + /** + * Aborts any outstanding request. + */ + abort : function(){ + if(this.isLoading()){ + Ext.lib.Ajax.abort(this.transId); + } + }, + + // private + handleResponse : function(response){ + this.transId = false; + var options = response.argument.options; + this.fireEvent("requestcomplete", this, response, options); + if(typeof options.callback == "function"){ + options.callback.call(options.scope||window, options, true, response); + } + }, + + // private + handleFailure : function(response, e){ + this.transId = false; + var options = response.argument.options; + this.fireEvent("requestexception", this, response, options, e); + if(typeof options.callback == "function"){ + options.callback.call(options.scope||window, options, false, response); + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/data/DataField.js b/www/extras/yui-ext/source/data/DataField.js new file mode 100644 index 000000000..fceba93e7 --- /dev/null +++ b/www/extras/yui-ext/source/data/DataField.js @@ -0,0 +1,101 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.data.Field = function(config){ + if(typeof config == "string"){ + config = {name: config}; + } + Ext.apply(this, config); + + if(!this.type){ + this.type = "auto"; + } + + var st = Ext.data.SortTypes; + // named sortTypes are supported, here we look them up + if(typeof this.sortType == "string"){ + this.sortType = st[this.sortType]; + } + + // set default sortType for strings and dates + if(!this.sortType){ + switch(this.type){ + case "string": + this.sortType = st.asUCString; + break; + case "date": + this.sortType = st.asDate; + break; + default: + this.sortType = st.none; + } + } + + // define once + var stripRe = /[\$,%]/g; + + // prebuilt conversion function for this field, instead of + // switching every time we're reading a value + if(!this.convert){ + var cv, dateFormat = this.dateFormat; + switch(this.type){ + case "": + case "auto": + case undefined: + cv = function(v){ return v; }; + break; + case "string": + cv = function(v){ return String(v); }; + break; + case "int": + cv = function(v){ + return v !== undefined && v !== null && v !== '' ? + parseInt(String(v).replace(stripRe, ""), 10) : ''; + }; + break; + case "float": + cv = function(v){ + return v !== undefined && v !== null && v !== '' ? + parseFloat(String(v).replace(stripRe, ""), 10) : ''; + }; + break; + case "bool": + case "boolean": + cv = function(v){ return v === true || v === "true" || v == 1; }; + break; + case "date": + cv = function(v){ + if(!v){ + return ''; + } + if(v instanceof Date){ + return v; + } + if(dateFormat){ + if(dateFormat == "timestamp"){ + return new Date(v*1000); + } + return Date.parseDate(v, dateFormat); + } + var parsed = Date.parse(v); + return parsed ? new Date(parsed) : null; + }; + break; + + } + this.convert = cv; + } +}; + +Ext.data.Field.prototype = { + dateFormat: null, + defaultValue: "", + mapping: null, + sortType : null, + sortDir : "ASC" +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/data/DataProxy.js b/www/extras/yui-ext/source/data/DataProxy.js new file mode 100644 index 000000000..dfced9382 --- /dev/null +++ b/www/extras/yui-ext/source/data/DataProxy.js @@ -0,0 +1,48 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.data.DataProxy + * This class is an abstract base class for implementations which provide retrieval of + * unformatted data objects. + *

          + * DataProxy implementations are usually used in conjunction with an implementation of Ext.data.DataReader + * (of the approriate type which knows how to parse the data object) to provide a block of Records + * to an Ext.data.Store. + *

          + * Custom implementations must implement the load method as described in + * {@link Ext.data.HttpProxy#load}. + */ +Ext.data.DataProxy = function(){ + this.addEvents({ + /** + * @event beforeload + * Fires before a network request is made to retrieve a data object. + * @param {Object} params The params parameter to the load function. + */ + beforeload : true, + /** + * @event load + * Fires before the load method's callback is called. + * @param {Object} o The data object. + * @param {Object} arg The callback argument object passed to the load function. + */ + load : true, + /** + * @event loadexception + * Fires if an Exception occurs during data retrieval. + * @param {Object} o The data object. + * @param {Object} arg The callback argument object passed to the load function. + * @param {Object} e The Exception. + */ + loadexception : true + }); + Ext.data.DataProxy.superclass.constructor.call(this); +}; + +Ext.extend(Ext.data.DataProxy, Ext.util.Observable); \ No newline at end of file diff --git a/www/extras/yui-ext/source/data/DataReader.js b/www/extras/yui-ext/source/data/DataReader.js new file mode 100644 index 000000000..515cdf542 --- /dev/null +++ b/www/extras/yui-ext/source/data/DataReader.js @@ -0,0 +1,17 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.data.DataReader = function(meta, recordType){ + this.meta = meta; + this.recordType = recordType instanceof Array ? + Ext.data.Record.create(recordType) : recordType; +}; + +Ext.data.DataReader.prototype = { + +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/data/HttpProxy.js b/www/extras/yui-ext/source/data/HttpProxy.js new file mode 100644 index 000000000..84becb117 --- /dev/null +++ b/www/extras/yui-ext/source/data/HttpProxy.js @@ -0,0 +1,101 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.data.HttpProxy + * An implementation of Ext.data.DataProxy that reads a data object from an Ext.data.Connection object + * configured to reference a certain URL. + *

          + * Note that this class cannot be used to retrieve data from a domain other than the domain + * from which the running page was served. + *

          + * For cross-domain access to remote data, use an Ext.data.ScriptTagProxy. + * + *

          + * Be aware that to enable the browser to parse an XML document, the server must set + * the Content-Type header to "text/xml". + * @constructor + * @param {Object} conn An Ext.data.Connection object referencing the URL from which the data object + * is to be read, or a configuration object for an Ext.data.Connection. + */ +Ext.data.HttpProxy = function(conn){ + Ext.data.HttpProxy.superclass.constructor.call(this); + // is conn a conn config or a real conn? + this.conn = conn.events ? conn : new Ext.data.Connection(conn); +}; + +Ext.extend(Ext.data.HttpProxy, Ext.data.DataProxy, { + // private + getConnection : function(){ + return this.conn; + }, + + /** + * Load data from the configured Ext.data.Connection, read the data object into + * a block of Ext.data.Records using the passed Ext.data.DataReader implementation, and + * process that block using the passed callback. + * @param {Object} params An object containing properties which are to be used as HTTP parameters + * for the request to the remote server. + * @param {Ext.data.DataReader) reader The Reader object which converts the data + * object into a block of Ext.data.Records. + * @param {Function} callback The function into which to pass the block of Ext.data.Records. + * The function must be passed

            + *
          • The Record block object
          • + *
          • The "arg" argument from the load function
          • + *
          • A boolean success indicator
          • + *
          + * @param {Object} scope The scope in which to call the callback + * @param {Object} arg An optional argument which is passed to the callback as its second parameter. + */ + load : function(params, reader, callback, scope, arg){ + if(this.fireEvent("beforeload", this, params) !== false){ + this.conn.request({ + params : params || {}, + request: { + callback : callback, + scope : scope, + arg : arg + }, + reader: reader, + callback : this.loadResponse, + scope: this + }); + }else{ + callback.call(scope||this, null, arg, false); + } + }, + + // private + loadResponse : function(o, success, response){ + if(!success){ + this.fireEvent("loadexception", this, o, response); + o.request.callback.call(o.request.scope, null, o.request.arg, false); + return; + } + var result; + try { + result = o.reader.read(response); + }catch(e){ + this.fireEvent("loadexception", this, o, response, e); + o.request.callback.call(o.request.scope, null, o.request.arg, false); + return; + } + this.fireEvent("load", this, o, o.request.arg); + o.request.callback.call(o.request.scope, result, o.request.arg, true); + }, + + // private + update : function(dataSet){ + + }, + + // private + updateResponse : function(dataSet){ + + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/data/JsonReader.js b/www/extras/yui-ext/source/data/JsonReader.js new file mode 100644 index 000000000..3d6101dda --- /dev/null +++ b/www/extras/yui-ext/source/data/JsonReader.js @@ -0,0 +1,165 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.data.JsonReader + * @extends Ext.data.DataReader + * Data reader class to create an Array of Ext.data.Record objects from a JSON response + * based on mappings in a provided Ext.data.Record constructor. + *

          + * The code below lists all configuration options. + *

          
          +   var RecordDef = Ext.data.Record.create([
          +       {name: 'name', mapping: 'name'},     // "mapping" property not needed if it's the same as "name"
          +       {name: 'occupation'},                // This field will use "occupation" as the mapping.
          +   ]);
          +   var myReader = new Ext.data.JsonReader({
          +       totalProperty: "results",    // The property which contains the number of returned records (optional)
          +       root: "rows",                // The property which contains an Array of record objects
          +       id: "id"                     // The property within the record object that provides an ID for the record (optional)
          +   }, RecordDef);
          +  
          + *

          + * This would consume a JSON file like this: + *

          
          +   { 'results': 2, 'rows': [
          +     { 'id': 1, 'name': 'Bill', occupation: 'Gardener' },
          +     { 'id': 2, 'name': 'Ben', occupation: 'Horticulturalist' } ]
          +   }
          +  
          + * @cfg {String} totalProperty Name of the property from which to retrieve the total number of records + * in the dataset. This is only needed if the whole dataset is not passed in one go, but is being + * paged from the remote server. + * @cfg {String} successProperty Name of the property from which to retrieve the success attribute used by forms. + * @cfg {String} root name of the property which contains the Array of row objects. + * @cfg {String} id Name of the property within a row object that contains a record identifier value. + * @constructor + * Create a new JsonReader + * @param {Object} meta Metadata configuration options + * @param {Object[]/Ext.data.Record constructor} recordType The record definition of the data record to produce. + */ +Ext.data.JsonReader = function(meta, recordType){ + Ext.data.JsonReader.superclass.constructor.call(this, meta, recordType); +}; +Ext.extend(Ext.data.JsonReader, Ext.data.DataReader, { + /** + * This method is only used by a DataProxy which has retrieved data from a remote server. + * @param {Object} response The XHR object which contains the JSON data in its responseText. + * @return {Object} data A data block which is used by an Ext.data.Store object as + * a cache of Ext.data.Records. + */ + read : function(response){ + var json = response.responseText; + var o = eval("("+json+")"); + if(!o) { + throw {message: "JsonReader.read: Json object not found"}; + } + return this.readRecords(o); + }, + + /** + * @ignore + */ + simpleAccess: function(obj, subsc) { + return obj[subsc]; + }, + + /** + * @ignore + */ + getJsonAccessor: function(){ + var re = /[\[\.]/; + return function(expr) { + try { + return(re.test(expr)) + ? new Function("obj", "return obj." + expr) + : function(obj){ + return obj[expr]; + }; + } catch(e){} + return Ext.emptyFn; + }; + }(), + + /** + * Create a data block containing Ext.data.Records from an XML document. + * @param {Object} o An object which contains an Array of row objects in the property specified + * in the config as 'root, and optionally a property, specified in the config as 'totalProperty' + * which contains the total size of the dataset. + * @return {Object} data A data block which is used by an Ext.data.Store object as + * a cache of Ext.data.Records. + */ + readRecords : function(o){ + /** + * After any data loads, the raw JSON data is available for further custom processing. + * @type Object + */ + this.jsonData = o; + var s = this.meta, Record = this.recordType, + f = Record.prototype.fields, fi = f.items, fl = f.length; + +// Generate extraction functions for the totalProperty, the root, the id, and for each field + if (!this.ef) { + if(s.totalProperty) { + this.getTotal = this.getJsonAccessor(s.totalProperty); + } + if(s.successProperty) { + this.getSuccess = this.getJsonAccessor(s.successProperty); + } + this.getRoot = s.root ? this.getJsonAccessor(s.root) : function(p){return p;}; + if (s.id) { + var g = this.getJsonAccessor(s.id); + this.getId = function(rec) { + var r = g(rec); + return (r === undefined || r === "") ? null : r; + }; + } else { + this.getId = function(){return null;}; + } + this.ef = []; + for(var i = 0; i < fl; i++){ + f = fi[i]; + var map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name; + this.ef[i] = this.getJsonAccessor(map); + } + } + + var root = this.getRoot(o), c = root.length, totalRecords = c, success = true; + if(s.totalProperty){ + var v = parseInt(this.getTotal(o), 10); + if(!isNaN(v)){ + totalRecords = v; + } + } + if(s.successProperty){ + var v = this.getSuccess(o); + if(v === false || v === 'false'){ + success = false; + } + } + var records = []; + for(var i = 0; i < c; i++){ + var n = root[i]; + var values = {}; + var id = this.getId(n); + for(var j = 0; j < fl; j++){ + f = fi[j]; + var v = this.ef[j](n); + values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue); + } + var record = new Record(values, id); + record.json = n; + records[i] = record; + } + return { + success : success, + records : records, + totalRecords : totalRecords + }; + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/data/MemoryProxy.js b/www/extras/yui-ext/source/data/MemoryProxy.js new file mode 100644 index 000000000..a47fe351c --- /dev/null +++ b/www/extras/yui-ext/source/data/MemoryProxy.js @@ -0,0 +1,56 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.data.MemoryProxy + * An implementation of Ext.data.DataProxy that simply passes the data specified in its constructor + * to the Reader when its load method is called. + * @constructor + * @param {Object} data The data object which the Reader uses to construct a block of Ext.data.Records. + */ +Ext.data.MemoryProxy = function(data){ + Ext.data.MemoryProxy.superclass.constructor.call(this); + this.data = data; +}; + +Ext.extend(Ext.data.MemoryProxy, Ext.data.DataProxy, { + /** + * Load data from the requested source (in this case an in-memory + * data object passed to the constructor), read the data object into + * a block of Ext.data.Records using the passed Ext.data.DataReader implementation, and + * process that block using the passed callback. + * @param {Object} params This parameter is not used by the MemoryProxy class. + * @param {Ext.data.DataReader) reader The Reader object which converts the data + * object into a block of Ext.data.Records. + * @param {Function} callback The function into which to pass the block of Ext.data.records. + * The function must be passed
            + *
          • The Record block object
          • + *
          • The "arg" argument from the load function
          • + *
          • A boolean success indicator
          • + *
          + * @param {Object} scope The scope in which to call the callback + * @param {Object} arg An optional argument which is passed to the callback as its second parameter. + */ + load : function(params, reader, callback, scope, arg){ + params = params || {}; + var result; + try { + result = reader.readRecords(this.data); + }catch(e){ + this.fireEvent("loadexception", this, arg, null, e); + callback.call(scope, null, arg, false); + return; + } + callback.call(scope, result, arg, true); + }, + + // private + update : function(params, records){ + + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/data/Record.js b/www/extras/yui-ext/source/data/Record.js new file mode 100644 index 000000000..a7c6078da --- /dev/null +++ b/www/extras/yui-ext/source/data/Record.js @@ -0,0 +1,216 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** +* @class Ext.data.Record + * Instances of this class encapsulate both record definition information, and record + * value information for use in {@link Ext.data.Store} objects, or any code which needs + * to access Records cached in an {@link Ext.data.Store} object. + *

          + * Constructors for this class are generated by passing an Array of field definition objects to {@link #create} + * and instances are usually only created by {@link Ext.data.Reader} objects when processing unformatted data + * objects. + *

          + * Record objects generated by this constructor inherit all the methods of Ext.data.Record listed below. + * @constructor + * This constructor should not be used to create Record objects. Instead, use the constructor generated by + * {@link #create}. The parameters are the same. + * @param data {Array} An associative Array of data values keyed by the field name. + * @param id (Optional) The id of the record. This id should be unique, and is used by the + * @link Ext.data.Store} object which owns the Record to index its collection of Records. If + * not specified an integer id is generated. + */ +Ext.data.Record = function(data, id){ + this.id = (id || id === 0) ? id : ++Ext.data.Record.AUTO_ID; + this.data = data; +}; + +/** + * Generate a constructor for a specific record layout. + * @param {Array} o An Array of field definition objects which specify field names, and optionally, + * data types, and a mapping for an {@link Ext.data.Reader} to extract the field's value from a data object. + * Each field definition object may contain the following properties:

            + *
          • name {String} The name by which the field is referenced within the Record. This is referenced by, + * for example the dataIndex property in column definition objects passed to {@link Ext.grid.ColumnModel}
          • + *
          • mapping {String} (Optional) A path specification for use by the {@link Ext.data.Reader} implementation + * that is creating the Record to access the data value from the data object. If an {@link Ext.data.JsonReader} + * is being used, then this is a string containing the javascript expression to reference the data relative to + * the record item's root. If an {@link Ext.data.XmlReader} is being used, this is an {@link Ext.DomQuery} path + * to the data item relative to the record element. If the mapping expression is the same as the field name, + * this may be omitted.
          • + *
          • type {String} (Optional) The data type for conversion to displayable value. Possible values are + *
            • auto (Default, implies no conversion)
            • + *
            • string
            • + *
            • int
            • + *
            • float
            • + *
            • boolean
            • + *
            • date
          • + *
          • sortType {Mixed} (Optional) A member of {@link Ext.data.SortTypes}.
          • + *
          • sortDir {String} (Optional) Initial direction to sort. "ASC" or "DESC"
          • + *
          • convert {Function} (Optional) A function which accepts a data value and returns it formatted for display.
          • + *
          • dateFormat {String} (Optional) A format String for the Date.parseDate function.
          • + *
          + *
          usage:
          
          +    var TopicRecord = Ext.data.Record.create(
          +        {name: 'title', mapping: 'topic_title'},
          +        {name: 'author', mapping: 'username'},
          +        {name: 'totalPosts', mapping: 'topic_replies', type: 'int'},
          +        {name: 'lastPost', mapping: 'post_time', type: 'date'},
          +        {name: 'lastPoster', mapping: 'user2'},
          +        {name: 'excerpt', mapping: 'post_text'}
          +    );
          +    
          +    var myNewRecord = new TopicRecord({
          +        title: 'Do my job please',
          +        author: 'noobie',
          +        totalPosts: 1,
          +        lastPost: new Date(),
          +        lastPoster: 'Animal',
          +        excerpt: 'No way dude!'
          +    });
          +    myStore.add(myNewRecord);
          +
          + */ +Ext.data.Record.create = function(o){ + var f = function(){ + f.superclass.constructor.apply(this, arguments); + }; + Ext.extend(f, Ext.data.Record); + var p = f.prototype; + p.fields = new Ext.util.MixedCollection(false, function(field){ + return field.name; + }); + for(var i = 0, len = o.length; i < len; i++){ + p.fields.add(new Ext.data.Field(o[i])); + } + f.getField = function(name){ + return p.fields.get(name); + }; + return f; +}; + +Ext.data.Record.AUTO_ID = 1000; +Ext.data.Record.EDIT = 'edit'; +Ext.data.Record.REJECT = 'reject'; +Ext.data.Record.COMMIT = 'commit'; + +Ext.data.Record.prototype = { + /** + * Readonly flag - true if this record has been modified. + * @type Boolean + */ + dirty : false, + editing : false, + error: null, + modified: null, + + // private + join : function(store){ + this.store = store; + }, + + /** + * Set the named field to the specified value. + * @param name {String} The name of the field to set. + * @param value {Object} The value to set the field to. + */ + set : function(name, value){ + if(this.data[name] == value){ + return; + } + this.dirty = true; + if(!this.modified){ + this.modified = {}; + } + if(typeof this.modified[name] == 'undefined'){ + this.modified[name] = this.data[name]; + } + this.data[name] = value; + if(!this.editing){ + this.store.afterEdit(this); + } + }, + + /** + * Get the value of the named field. + * @param name {String} The name of the field to get the value of. + * @return {Object} The value of the field. + */ + get : function(name){ + return this.data[name]; + }, + + // private + beginEdit : function(){ + this.editing = true; + this.modified = {}; + }, + + // private + cancelEdit : function(){ + this.editing = false; + delete this.modified; + }, + + // private + endEdit : function(){ + this.editing = false; + if(this.dirty && this.store){ + this.store.afterEdit(this); + } + }, + + /** + * Usually called by the {@link Ext.data.Store} which owns the Record. + * Rejects all changes made to the Record since either creation, or the last commit operation. + * Modified fields are reverted to their original values. + *

          + * Developers should subscribe to the {@link Ext.data.Store#update} event to have their code notified + * of reject operations. + */ + reject : function(){ + var m = this.modified; + for(var n in m){ + if(typeof m[n] != "function"){ + this.data[n] = m[n]; + } + } + this.dirty = false; + delete this.modified; + this.editing = false; + if(this.store){ + this.store.afterReject(this); + } + }, + + /** + * Usually called by the {@link Ext.data.Store} which owns the Record. + * Commits all changes made to the Record since either creation, or the last commit operation. + *

          + * Developers should subscribe to the {@link Ext.data.Store#update} event to have their code notified + * of commit operations. + */ + commit : function(){ + this.dirty = false; + delete this.modified; + this.editing = false; + if(this.store){ + this.store.afterCommit(this); + } + }, + + // private + hasError : function(){ + return this.error != null; + }, + + // private + clearError : function(){ + this.error = null; + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/data/ScriptTagProxy.js b/www/extras/yui-ext/source/data/ScriptTagProxy.js new file mode 100644 index 000000000..a8da9a5eb --- /dev/null +++ b/www/extras/yui-ext/source/data/ScriptTagProxy.js @@ -0,0 +1,169 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.data.ScriptTagProxy + * An implementation of Ext.data.DataProxy that reads a data object from a URL which may be in a domain + * other than the originating domain of the running page. + *

          + * Note that this class must be used to retrieve data from a domain other than the domain + * from which the running page was served. + * + * @cfg {String} url The url from which to request the data object. + * @constructor + * @param {Object} conn A configuration object. + */ +Ext.data.ScriptTagProxy = function(config){ + Ext.data.ScriptTagProxy.superclass.constructor.call(this); + Ext.apply(this, config); + this.head = document.getElementsByTagName("head")[0]; +}; + +Ext.data.ScriptTagProxy.TRANS_ID = 1000; + +Ext.extend(Ext.data.ScriptTagProxy, Ext.data.DataProxy, { + /** + * @cfg {Number} timeout (Optional) The number of milliseconds to wait for a response. Defaults to 30 seconds. + */ + timeout : 30000, + /** + * @cfg {String} callbackParam (Optional) The name of the parameter to pass to the server which tells + * the server the name of the callback function set up by the load call to process the returned data object. + * Defaults to "callback".

          The server-side processing must read this parameter value, and generate + * javascript output which calls this named function passing the data object as its only parameter. + */ + callbackParam : "callback", + /** + * @cfg nocache {Boolean} (Optional) Defaults to true. Disable cacheing by adding a unique parameter + * name to the request. + */ + nocache : true, + + /** + * Load data from the configured URL, read the data object into + * a block of Ext.data.Records using the passed Ext.data.DataReader implementation, and + * process that block using the passed callback. + * @param {Object} params An object containing properties which are to be used as HTTP parameters + * for the request to the remote server. + * @param {Ext.data.DataReader} reader The Reader object which converts the data + * object into a block of Ext.data.Records. + * @param {Function} callback The function into which to pass the block of Ext.data.Records. + * The function must be passed

            + *
          • The Record block object
          • + *
          • The "arg" argument from the load function
          • + *
          • A boolean success indicator
          • + *
          + * @param {Object} scope The scope in which to call the callback + * @param {Object} arg An optional argument which is passed to the callback as its second parameter. + */ + load : function(params, reader, callback, scope, arg){ + if(this.fireEvent("beforeload", this, params) !== false){ + + var p = Ext.urlEncode(Ext.apply(params, this.extraParams)); + + var url = this.url; + url += (url.indexOf("?") != -1 ? "&" : "?") + p; + if(this.nocache){ + url += "&_dc=" + (new Date().getTime()); + } + var transId = ++Ext.data.ScriptTagProxy.TRANS_ID; + var trans = { + id : transId, + cb : "stcCallback"+transId, + scriptId : "stcScript"+transId, + params : params, + arg : arg, + url : url, + callback : callback, + scope : scope, + reader : reader + }; + var conn = this; + + window[trans.cb] = function(o){ + conn.handleResponse(o, trans); + }; + + url += String.format("&{0}={1}", this.callbackParam, trans.cb); + + if(this.autoAbort !== false){ + this.abort(); + } + + trans.timeoutId = this.handleFailure.defer(this.timeout, this, [trans]); + + var script = document.createElement("script"); + script.setAttribute("src", url); + script.setAttribute("type", "text/javascript"); + script.setAttribute("id", trans.scriptId); + this.head.appendChild(script); + + this.trans = trans; + }else{ + callback.call(scope||this, null, arg, false); + } + }, + + // private + isLoading : function(){ + return this.trans ? true : false; + }, + + /** + * Abort the current server request. + */ + abort : function(){ + if(this.isLoading()){ + this.destroyTrans(this.trans); + } + }, + + // private + destroyTrans : function(trans, isLoaded){ + this.head.removeChild(document.getElementById(trans.scriptId)); + clearTimeout(trans.timeoutId); + if(isLoaded){ + window[trans.cb] = undefined; + try{ + delete window[trans.cb]; + }catch(e){} + }else{ + // if hasn't been loaded, wait for load to remove it to prevent script error + window[trans.cb] = function(){ + window[trans.cb] = undefined; + try{ + delete window[trans.cb]; + }catch(e){} + }; + } + }, + + // private + handleResponse : function(o, trans){ + this.trans = false; + this.destroyTrans(trans, true); + var result; + try { + result = trans.reader.readRecords(o); + }catch(e){ + this.fireEvent("loadexception", this, o, trans.arg, e); + trans.callback.call(trans.scope||window, null, trans.arg, false); + return; + } + this.fireEvent("load", this, o, trans.arg); + trans.callback.call(trans.scope||window, result, trans.arg, true); + }, + + // private + handleFailure : function(trans){ + this.trans = false; + this.destroyTrans(trans, false); + this.fireEvent("loadexception", this, null, trans.arg); + trans.callback.call(trans.scope||window, null, trans.arg, false); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/data/SimpleStore.js b/www/extras/yui-ext/source/data/SimpleStore.js new file mode 100644 index 000000000..19170d667 --- /dev/null +++ b/www/extras/yui-ext/source/data/SimpleStore.js @@ -0,0 +1,30 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.data.SimpleStore + * @extends Ext.data.Store + * Smaller help class to make creating Stores from Array data easier. + * @cfg {Number} id The index in the array that be used for record ids. Leave blank to auto generate ids. + * @cfg {Array} fields An standard field array consisting of string name or object literal field definitions + * @cfg {Array} data The multi-dimensional array of data + * @constructor + * @param {Object} config + */ +Ext.data.SimpleStore = function(config){ + Ext.data.SimpleStore.superclass.constructor.call(this, { + reader: new Ext.data.ArrayReader({ + id: config.id + }, + Ext.data.Record.create(config.fields) + ), + proxy : new Ext.data.MemoryProxy(config.data) + }); + this.load(); +}; +Ext.extend(Ext.data.SimpleStore, Ext.data.Store); \ No newline at end of file diff --git a/www/extras/yui-ext/source/data/SortTypes.js b/www/extras/yui-ext/source/data/SortTypes.js new file mode 100644 index 000000000..8dd1a1fe2 --- /dev/null +++ b/www/extras/yui-ext/source/data/SortTypes.js @@ -0,0 +1,95 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + + +/** + * @class Ext.data.SortTypes + * @singleton + * Defines the default sorting (casting?) comparison functions used when sorting data. + */ +Ext.data.SortTypes = { + /** + * Default sort that does nothing + * @param {Mixed} s The value being converted + * @return {Mixed} The comparison value + */ + none : function(s){ + return s; + }, + + /** + * The regular expression used to strip tags + * @type {RegExp} + * @property + */ + stripTagsRE : /<\/?[^>]+>/gi, + + /** + * Strips all HTML tags to sort on text only + * @param {Mixed} s The value being converted + * @return {String} The comparison value + */ + asText : function(s){ + return String(s).replace(this.stripTagsRE, ""); + }, + + /** + * Strips all HTML tags to sort on text only - Case insensitive + * @param {Mixed} s The value being converted + * @return {String} The comparison value + */ + asUCText : function(s){ + return String(s).toUpperCase().replace(this.stripTagsRE, ""); + }, + + /** + * Case insensitive string + * @param {Mixed} s The value being converted + * @return {String} The comparison value + */ + asUCString : function(s) { + return String(s).toUpperCase(); + }, + + /** + * Date sorting + * @param {Mixed} s The value being converted + * @return {Number} The comparison value + */ + asDate : function(s) { + if(!s){ + return 0; + } + if(s instanceof Date){ + return s.getTime(); + } + return Date.parse(String(s)); + }, + + /** + * Float sorting + * @param {Mixed} s The value being converted + * @return {Float} The comparison value + */ + asFloat : function(s) { + var val = parseFloat(String(s).replace(/,/g, "")); + if(isNaN(val)) val = 0; + return val; + }, + + /** + * Integer sorting + * @param {Mixed} s The value being converted + * @return {Number} The comparison value + */ + asInt : function(s) { + var val = parseInt(String(s).replace(/,/g, "")); + if(isNaN(val)) val = 0; + return val; + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/data/Store.js b/www/extras/yui-ext/source/data/Store.js new file mode 100644 index 000000000..ffcb4a7b3 --- /dev/null +++ b/www/extras/yui-ext/source/data/Store.js @@ -0,0 +1,526 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.data.Store + * @extends Ext.util.Observable + * The Store class encapsulates a client side cache of {@link Ext.data.Record} objects which provide input data + * for widgets such as the Ext.grid.Grid, or the Ext.form.ComboBox. + * A Store object uses an implementation of {@link Ext.data.DataProxy} to access a data object unless you call loadData() directly and pass in your data. The Store object + * has no knowledge of the format of the data returned by the Proxy. + * The Store object uses its configured implementation of Ext.data.DataReader to create Ext.data.Record + * instances from the data object. These records are cached and made available through accessor functions. + * @constructor + * Creates a new Store + * @param {Object} config A config object containing the objects needed for the Store to access data, + * and read the data into Records. + */ +Ext.data.Store = function(config){ + this.data = new Ext.util.MixedCollection(false); + this.data.getKey = function(o){ + return o.id; + }; + this.baseParams = {}; + this.paramNames = { + "start" : "start", + "limit" : "limit", + "sort" : "sort", + "dir" : "dir" + }; + Ext.apply(this, config); + + if(this.reader && !this.recordType){ // reader passed + this.recordType = this.reader.recordType; + } + + this.fields = this.recordType.prototype.fields; + + this.modified = []; + + this.addEvents({ + /** + * @event datachanged + * Fires when the data cache has changed, and a widget which is using this Store + * as a Record cache should refresh its view. + * @param {Store} this + */ + datachanged : true, + /** + * @event add + * Fires when Records have been added to the Store + * @param {Store} this + * @param {Ext.data.Record[]} records The array of Records added + * @param {Number} index The index at which the record(s) were added + */ + add : true, + /** + * @event remove + * Fires when Records have been removed from the Store + * @param {Store} this + * @param {Ext.data.Record} record The Record that was removed + * @param {Number} index The index at which the record was removed + */ + remove : true, + /** + * @event update + * Fires when Records have been updated + * @param {Store} this + * @param {Ext.data.Record} record The Record that was updated + * @param {String} operation The update operation being performed. Value may be one of: + *
          
          + Ext.data.Record.EDIT
          + Ext.data.Record.REJECT
          + Ext.data.Record.COMMIT
          +         * 
          + */ + update : true, + /** + * @event clear + * Fires when the data cache has been cleared. + * @param {Store} this + */ + clear : true, + /** + * @event beforeload + * Fires before a request is made for a new data object. If the beforeload handler returns false + * the load action will be canceled. + * @param {Store} this + * @param {Object} options The loading options that were specified (see {@link #load} for details) + */ + beforeload : true, + /** + * @event load + * Fires after a new set of Records has been loaded. + * @param {Store} this + * @param {Ext.data.Record[]} records The Records that were loaded + * @param {Object} options The loading options that were specified (see {@link #load} for details) + */ + load : true, + /** + * @event loadexception + * Fires if an exception occurs in the Proxy during loading. + * Called with the signature of the Proxy's "loadexception" event. + */ + loadexception : true + }); + + if(this.proxy){ + this.relayEvents(this.proxy, ["loadexception"]); + } + this.sortToggle = {}; + + Ext.data.Store.superclass.constructor.call(this); +}; +Ext.extend(Ext.data.Store, Ext.util.Observable, { + /** + * @cfg {Ext.data.DataProxy} proxy The Proxy object which provides access to a data object. + */ + /** + * @cfg {Ext.data.Reader} reader The Reader object which processes the data object and returns + * an Array of Ext.data.record objects which are cached keyed by their id property. + */ + /** + * @cfg {Object} baseParams An object containing properties which are to be sent as parameters + * on any HTTP request + */ + /** + * @cfg {Object} sortInfo A config object in the format: {field: "fieldName", direction: "ASC|DESC"} + */ + /** + * @cfg {boolean} remoteSort True if sorting is to be handled by requesting the Proxy to provide a refreshed + * version of the data object in sorted order, as opposed to sorting the Record cache in place (defaults to false). + */ + remoteSort : false, + + // private + lastOptions : null, + + /** + * Add Records to the Store and fires the add event. + * @param {Ext.data.Record[]} records An Array of Ext.data.Record objects to add to the cache. + */ + add : function(records){ + records = [].concat(records); + for(var i = 0, len = records.length; i < len; i++){ + records[i].join(this); + } + var index = this.data.length; + this.data.addAll(records); + this.fireEvent("add", this, records, index); + }, + + /** + * Remove a Record from the Store and fires the remove event. + * @param {Ext.data.Record} record Th Ext.data.Record object to remove from the cache. + */ + remove : function(record){ + var index = this.data.indexOf(record); + this.data.removeAt(index); + this.fireEvent("remove", this, record, index); + }, + + /** + * Remove all Records from the Store and fires the clear event. + */ + removeAll : function(){ + this.data.clear(); + this.fireEvent("clear", this); + }, + + /** + * Inserts Records to the Store at the given index and fires the add event. + * @param {Number} index The start index at which to insert the passed Records. + * @param {Ext.data.Record[]} records An Array of Ext.data.Record objects to add to the cache. + */ + insert : function(index, records){ + records = [].concat(records); + for(var i = 0, len = records.length; i < len; i++){ + this.data.insert(index, records[i]); + records[i].join(this); + } + this.fireEvent("add", this, records, index); + }, + + /** + * Get the index within the cache of the passed Record. + * @param {Ext.data.Record[]} records An Array of Ext.data.Record objects to add to the cache. + * @return {Number} The index of the passed Record. Returns -1 if not found. + */ + indexOf : function(record){ + return this.data.indexOf(record); + }, + + /** + * Get the index within the cache of the Record with the passed id. + * @param {String} id The id of the Record to find. + * @return {Number} The index of the Record. Returns -1 if not found. + */ + indexOfId : function(id){ + return this.data.indexOfKey(id); + }, + + /** + * Get the Record with the specified id. + * @param {String} id The id of the Record to find. + * @return {Ext.data.Record} The Record with the passed id. Returns undefined if not found. + */ + getById : function(id){ + return this.data.key(id); + }, + + /** + * Get the Record at the specified index. + * @param {String} index The index of the Record to find. + * @return {Ext.data.Record} The Record at the passed index. Returns undefined if not found. + */ + getAt : function(index){ + return this.data.itemAt(index); + }, + + /** + * Returns a range of Records between specified indices. + * @param {Number} startIndex (optional) The starting index (defaults to 0) + * @param {Number} endIndex (optional) The ending index (defaults to the last Record in the Store) + * @return {Ext.data.Record[]} An array of Records + */ + getRange : function(start, end){ + return this.data.getRange(start, end); + }, + + // private + storeOptions : function(o){ + o = Ext.apply({}, o); + delete o.callback; + delete o.scope; + this.lastOptions = o; + }, + + /** + * Loads the Record cache from the configured Proxy using the configured Reader. + *

          + * If using remote paging, then the first load call must specify the start + * and limit properties in the options.params property to establish the initial + * position within the dataset, and the number of Records to cache on each read from the Proxy. + *

          + * It is important to note that for remote data sources, loading is asynchronous, + * and this call will return before the new data has been loaded. Perform any post-processing + * in a callback function, or in a "load" event handler. + *

          + * @param {Object} options An object containing properties which control loading options: + *

          
          + params {Object} An object containing properties to pass as HTTP parameters to a remote data source.
          + callback {Function} A function to be called after the Records have been loaded. The callback is
          + passed the following arguments:
          +   r : Ext.data.Record[]
          +   options: Options object from the load call
          +   success: Boolean success indicator
          + scope {Object} Scope with which to call the callback (defaults to the Store object)
          + append {Boolean} indicator to append loaded records rather than replace the current cache.
          + * 
          + */ + load : function(options){ + options = options || {}; + if(this.fireEvent("beforeload", this, options) !== false){ + this.storeOptions(options); + var p = Ext.apply(options.params || {}, this.baseParams); + if(this.sortInfo && this.remoteSort){ + var pn = this.paramNames; + p[pn["sort"]] = this.sortInfo.field; + p[pn["dir"]] = this.sortInfo.direction; + } + this.proxy.load(p, this.reader, this.loadRecords, this, options); + } + }, + + /** + * Reloads the Record cache from the configured Proxy using the configured Reader and + * the options from the last load operation performed. + * @param {Object} options (optional) An object containing properties which may override the options + * used in the last load operation. See {@link #load} for details (defaults to null, in which case + * the most recently used options are reused). + */ + reload : function(options){ + this.load(Ext.applyIf(options||{}, this.lastOptions)); + }, + + // private + // Called as a callback by the Reader during a load operation. + loadRecords : function(o, options, success){ + if(!o || success === false){ + if(success !== false){ + this.fireEvent("load", this, [], options); + } + if(options.callback){ + options.callback.call(options.scope || this, [], options, false); + } + return; + } + var r = o.records, t = o.totalRecords || r.length; + for(var i = 0, len = r.length; i < len; i++){ + r[i].join(this); + } + if(!options || options.add !== true){ + this.data.clear(); + this.data.addAll(r); + this.totalLength = t; + this.applySort(); + this.fireEvent("datachanged", this); + }else{ + this.totalLength = Math.max(t, this.data.length+r.length); + this.data.addAll(r); + } + this.fireEvent("load", this, r, options); + if(options.callback){ + options.callback.call(options.scope || this, r, options, true); + } + }, + + /** + * Loads data from a passed data block. A Reader which understands the format of the data + * must have been configured in the constructor. + * @param {Object} data The data block from which to read the Records. The format of the data expected + * is dependent on the type of Reader that is configured and should correspond to that Reader's readRecords parameter. + * @param {Boolean} append (Optional) True to append the new Records rather than replace the existing cache. + */ + loadData : function(o, append){ + var r = this.reader.readRecords(o); + this.loadRecords(r, {add: append}, true); + }, + + /** + * Gets the number of cached records. + *

          + * If using paging, this may not be the total size of the dataset. If the data object + * used by the Reader contains the dataset size, then the getTotalCount() function returns + * the data set size + */ + getCount : function(){ + return this.data.length || 0; + }, + + /** + * Gets the total number of records in the dataset. + *

          + * If using paging, for this to be accurate, the data object used by the Reader must contain + * the dataset size + */ + getTotalCount : function(){ + return this.totalLength || 0; + }, + + /** + * Returns the sort state of the Store as an object with two properties: + *

          
          + field {String} The name of the field by which the Records are sorted
          + direction {String} The sort order, "ASC" or "DESC"
          +     * 
          + */ + getSortState : function(){ + return this.sortInfo; + }, + + // private + applySort : function(){ + if(this.sortInfo && !this.remoteSort){ + var s = this.sortInfo, f = s.field; + var st = this.fields.get(f).sortType; + var fn = function(r1, r2){ + var v1 = st(r1.data[f]), v2 = st(r2.data[f]); + return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0); + }; + this.data.sort(s.direction, fn); + if(this.snapshot && this.snapshot != this.data){ + this.snapshot.sort(s.direction, fn); + } + } + }, + + /** + * Sets the default sort column and order to be used by the next load operation. + * @param {String} fieldName The name of the field to sort by. + * @param {String} dir (optional) The sort order, "ASC" or "DESC" (defaults to "ASC") + */ + setDefaultSort : function(field, dir){ + this.sortInfo = {field: field, direction: dir ? dir.toUpperCase() : "ASC"}; + }, + + /** + * Sort the Records. + * If remote sorting is used, the sort is performed on the server, and the cache is + * reloaded. If local sorting is used, the cache is sorted internally. + * @param {String} fieldName The name of the field to sort by. + * @param {String} dir (optional) The sort order, "ASC" or "DESC" (defaults to "ASC") + */ + sort : function(fieldName, dir){ + var f = this.fields.get(fieldName); + if(!dir){ + if(this.sortInfo && this.sortInfo.field == f.name){ // toggle sort dir + dir = (this.sortToggle[f.name] || "ASC").toggle("ASC", "DESC"); + }else{ + dir = f.sortDir; + } + } + this.sortToggle[f.name] = dir; + this.sortInfo = {field: f.name, direction: dir}; + if(!this.remoteSort){ + this.applySort(); + this.fireEvent("datachanged", this); + }else{ + this.load(this.lastOptions); + } + }, + + /** + * Calls the specified function for each of the Records in the cache. + * @param {Function} fn The function to call. The Record is passed as the first parameter. + * Returning false aborts and exits the iteration. + * @param {Object} scope (optional) The scope in which to call the function (defaults to the Record). + */ + each : function(fn, scope){ + this.data.each(fn, scope); + }, + + /** + * Get all records modified since the last load, or since the last commit. + * @return {Ext.data.Record[]} An array of Records containing outstanding modifications. + */ + getModifiedRecords : function(){ + return this.modified; + }, + + /** + * Filter the records by a specified property. + * @param {String} field A field on your records + * @param {String/RegExp} value Either a string that the field + * should start with or a RegExp to test against the field + * @return {Boolean} True if the filter matched at least one record, else false + */ + filter : function(property, value){ + if(!value.exec){ // not a regex + value = String(value); + if(value.length == 0){ + return this.clearFilter(); + } + value = new RegExp("^" + Ext.escapeRe(value), "i"); + } + this.filterBy(function(r){ + return value.test(r.data[property]); + }); + }, + + /** + * Filter by a function. The specified function will be called with each + * record in this data source. If the function returns true the record is included, + * otherwise it is filtered. + * @param {Function} fn The function to be called, it will receive 2 args (record, id) + * @param {Object} scope (optional) The scope of the function (defaults to this) + */ + filterBy : function(fn, scope){ + var data = this.snapshot || this.data; + this.snapshot = data; + this.data = data.filterBy(fn, scope); + this.fireEvent("datachanged", this); + }, + + /** + * Revert to a view of the Record cache with no filtering applied. + * @param {Boolean} suppressEvent If true the filter is cleared silently without notifying listeners + */ + clearFilter : function(suppressEvent){ + if(this.snapshot && this.snapshot != this.data){ + this.data = this.snapshot; + delete this.snapshot; + if(suppressEvent !== true){ + this.fireEvent("datachanged", this); + } + } + }, + + // private + afterEdit : function(record){ + if(this.modified.indexOf(record) == -1){ + this.modified.push(record); + } + this.fireEvent("update", this, record, Ext.data.Record.EDIT); + }, + + // private + afterReject : function(record){ + this.modified.remove(record); + this.fireEvent("update", this, record, Ext.data.Record.REJECT); + }, + + // private + afterCommit : function(record){ + this.modified.remove(record); + this.fireEvent("update", this, record, Ext.data.Record.COMMIT); + }, + + /** + * Commit all Records with outstanding changes. To handle updates for changes, subscribe to the + * Store's "update" event, and perform updating when the third parameter is Ext.data.Record.COMMIT. + */ + commitChanges : function(){ + var m = this.modified.slice(0); + this.modified = []; + for(var i = 0, len = m.length; i < len; i++){ + m[i].commit(); + } + }, + + /** + * Cancel outstanding changes on all changed records. + */ + rejectChanges : function(){ + var m = this.modified.slice(0); + this.modified = []; + for(var i = 0, len = m.length; i < len; i++){ + m[i].reject(); + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/data/Tree.js b/www/extras/yui-ext/source/data/Tree.js new file mode 100644 index 000000000..38cd88a78 --- /dev/null +++ b/www/extras/yui-ext/source/data/Tree.js @@ -0,0 +1,729 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.data.Tree + * @extends Ext.util.Observable + * Represents a tree data structure and bubbles all the events for its nodes. The nodes + * in the tree have most standard DOM functionality. + * @constructor + * @param {Node} root (optional) The root node + */ +Ext.data.Tree = function(root){ + this.nodeHash = {}; + /** + * The root node for this tree + * @type Node + */ + this.root = null; + if(root){ + this.setRootNode(root); + } + this.addEvents({ + /** + * @event append + * Fires when a new child node is appended to a node in this tree. + * @param {Tree} tree The owner tree + * @param {Node} parent The parent node + * @param {Node} node The newly appended node + * @param {Number} index The index of the newly appended node + */ + "append" : true, + /** + * @event remove + * Fires when a child node is removed from a node in this tree. + * @param {Tree} tree The owner tree + * @param {Node} parent The parent node + * @param {Node} node The child node removed + */ + "remove" : true, + /** + * @event move + * Fires when a node is moved to a new location in the tree + * @param {Tree} tree The owner tree + * @param {Node} node The node moved + * @param {Node} oldParent The old parent of this node + * @param {Node} newParent The new parent of this node + * @param {Number} index The index it was moved to + */ + "move" : true, + /** + * @event insert + * Fires when a new child node is inserted in a node in this tree. + * @param {Tree} tree The owner tree + * @param {Node} parent The parent node + * @param {Node} node The child node inserted + * @param {Node} refNode The child node the node was inserted before + */ + "insert" : true, + /** + * @event beforeappend + * Fires before a new child is appended to a node in this tree, return false to cancel the append. + * @param {Tree} tree The owner tree + * @param {Node} parent The parent node + * @param {Node} node The child node to be appended + */ + "beforeappend" : true, + /** + * @event beforeremove + * Fires before a child is removed from a node in this tree, return false to cancel the remove. + * @param {Tree} tree The owner tree + * @param {Node} parent The parent node + * @param {Node} node The child node to be removed + */ + "beforeremove" : true, + /** + * @event beforemove + * Fires before a node is moved to a new location in the tree. Return false to cancel the move. + * @param {Tree} tree The owner tree + * @param {Node} node The node being moved + * @param {Node} oldParent The parent of the node + * @param {Node} newParent The new parent the node is moving to + * @param {Number} index The index it is being moved to + */ + "beforemove" : true, + /** + * @event beforeinsert + * Fires before a new child is inserted in a node in this tree, return false to cancel the insert. + * @param {Tree} tree The owner tree + * @param {Node} parent The parent node + * @param {Node} node The child node to be inserted + * @param {Node} refNode The child node the node is being inserted before + */ + "beforeinsert" : true + }); + + Ext.data.Tree.superclass.constructor.call(this); +}; + +Ext.extend(Ext.data.Tree, Ext.util.Observable, { + pathSeparator: "/", + + /** + * Returns this root node for this tree + * @return {Node} + */ + getRootNode : function(){ + return this.root; + }, + + /** + * Sets the root node for this tree + * @param {Node} node + * @return {Node} + */ + setRootNode : function(node){ + this.root = node; + node.ownerTree = this; + node.isRoot = true; + this.registerNode(node); + return node; + }, + + /** + * Gets a node in this tree by its id + * @param {String} id + * @return {Node} + */ + getNodeById : function(id){ + return this.nodeHash[id]; + }, + + registerNode : function(node){ + this.nodeHash[node.id] = node; + }, + + unregisterNode : function(node){ + delete this.nodeHash[node.id]; + }, + + toString : function(){ + return "[Tree"+(this.id?" "+this.id:"")+"]"; + } +}); + +/** + * @class Ext.data.Node + * @extends Ext.util.Observable + * @cfg {Boolean} leaf true if this node is a leaf and does not have children + * @cfg {String} id The id for this node. If one is not specified, one is generated. + * @constructor + * @param {Object} attributes The attributes/config for the node + */ +Ext.data.Node = function(attributes){ + /** + * The attributes supplied for the node. You can use this property to access any custom attributes you supplied. + * @type {Object} + */ + this.attributes = attributes || {}; + this.leaf = this.attributes.leaf; + /** + * The node id. @type String + */ + this.id = this.attributes.id; + if(!this.id){ + this.id = Ext.id(null, "ynode-"); + this.attributes.id = this.id; + } + /** + * All child nodes of this node. @type Array + */ + this.childNodes = []; + if(!this.childNodes.indexOf){ // indexOf is a must + this.childNodes.indexOf = function(o){ + for(var i = 0, len = this.length; i < len; i++){ + if(this[i] == o) return i; + } + return -1; + }; + } + /** + * The parent node for this node. @type Node + */ + this.parentNode = null; + /** + * The first direct child node of this node, or null if this node has no child nodes. @type Node + */ + this.firstChild = null; + /** + * The last direct child node of this node, or null if this node has no child nodes. @type Node + */ + this.lastChild = null; + /** + * The node immediately preceding this node in the tree, or null if there is no sibling node. @type Node + */ + this.previousSibling = null; + /** + * The node immediately following this node in the tree, or null if there is no sibling node. @type Node + */ + this.nextSibling = null; + + this.addEvents({ + /** + * @event append + * Fires when a new child node is appended + * @param {Tree} tree The owner tree + * @param {Node} this This node + * @param {Node} node The newly appended node + * @param {Number} index The index of the newly appended node + */ + "append" : true, + /** + * @event remove + * Fires when a child node is removed + * @param {Tree} tree The owner tree + * @param {Node} this This node + * @param {Node} node The removed node + */ + "remove" : true, + /** + * @event move + * Fires when this node is moved to a new location in the tree + * @param {Tree} tree The owner tree + * @param {Node} this This node + * @param {Node} oldParent The old parent of this node + * @param {Node} newParent The new parent of this node + * @param {Number} index The index it was moved to + */ + "move" : true, + /** + * @event insert + * Fires when a new child node is inserted. + * @param {Tree} tree The owner tree + * @param {Node} this This node + * @param {Node} node The child node inserted + * @param {Node} refNode The child node the node was inserted before + */ + "insert" : true, + /** + * @event beforeappend + * Fires before a new child is appended, return false to cancel the append. + * @param {Tree} tree The owner tree + * @param {Node} this This node + * @param {Node} node The child node to be appended + */ + "beforeappend" : true, + /** + * @event beforeremove + * Fires before a child is removed, return false to cancel the remove. + * @param {Tree} tree The owner tree + * @param {Node} this This node + * @param {Node} node The child node to be removed + */ + "beforeremove" : true, + /** + * @event beforemove + * Fires before this node is moved to a new location in the tree. Return false to cancel the move. + * @param {Tree} tree The owner tree + * @param {Node} this This node + * @param {Node} oldParent The parent of this node + * @param {Node} newParent The new parent this node is moving to + * @param {Number} index The index it is being moved to + */ + "beforemove" : true, + /** + * @event beforeinsert + * Fires before a new child is inserted, return false to cancel the insert. + * @param {Tree} tree The owner tree + * @param {Node} this This node + * @param {Node} node The child node to be inserted + * @param {Node} refNode The child node the node is being inserted before + */ + "beforeinsert" : true + }); + this.listeners = this.attributes.listeners; + Ext.data.Node.superclass.constructor.call(this); +}; + +Ext.extend(Ext.data.Node, Ext.util.Observable, { + fireEvent : function(evtName){ + // first do standard event for this node + if(Ext.data.Node.superclass.fireEvent.apply(this, arguments) === false){ + return false; + } + // then bubble it up to the tree if the event wasn't cancelled + var ot = this.getOwnerTree(); + if(ot){ + if(ot.fireEvent.apply(this.ownerTree, arguments) === false){ + return false; + } + } + return true; + }, + + /** + * Returns true if this node is a leaf + * @return {Boolean} + */ + isLeaf : function(){ + return this.leaf === true; + }, + + // private + setFirstChild : function(node){ + this.firstChild = node; + }, + + //private + setLastChild : function(node){ + this.lastChild = node; + }, + + + /** + * Returns true if this node is the last child of its parent + * @return {Boolean} + */ + isLast : function(){ + return (!this.parentNode ? true : this.parentNode.lastChild == this); + }, + + /** + * Returns true if this node is the first child of its parent + * @return {Boolean} + */ + isFirst : function(){ + return (!this.parentNode ? true : this.parentNode.firstChild == this); + }, + + hasChildNodes : function(){ + return !this.isLeaf() && this.childNodes.length > 0; + }, + + /** + * Insert node(s) as the last child node of this node. + * @param {Node/Array} node The node or Array of nodes to append + * @return {Node} The appended node if single append, or null if an array was passed + */ + appendChild : function(node){ + var multi = false; + if(node instanceof Array){ + multi = node; + }else if(arguments.length > 1){ + multi = arguments; + } + // if passed an array or multiple args do them one by one + if(multi){ + for(var i = 0, len = multi.length; i < len; i++) { + this.appendChild(multi[i]); + } + }else{ + if(this.fireEvent("beforeappend", this.ownerTree, this, node) === false){ + return false; + } + var index = this.childNodes.length; + var oldParent = node.parentNode; + // it's a move, make sure we move it cleanly + if(oldParent){ + if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index) === false){ + return false; + } + oldParent.removeChild(node); + } + index = this.childNodes.length; + if(index == 0){ + this.setFirstChild(node); + } + this.childNodes.push(node); + node.parentNode = this; + var ps = this.childNodes[index-1]; + if(ps){ + node.previousSibling = ps; + ps.nextSibling = node; + }else{ + node.previousSibling = null; + } + node.nextSibling = null; + this.setLastChild(node); + node.setOwnerTree(this.getOwnerTree()); + this.fireEvent("append", this.ownerTree, this, node, index); + if(oldParent){ + node.fireEvent("move", this.ownerTree, node, oldParent, this, index); + } + return node; + } + }, + + /** + * Removes a child node from this node. + * @param {Node} node The node to remove + * @return {Node} The removed node + */ + removeChild : function(node){ + var index = this.childNodes.indexOf(node); + if(index == -1){ + return false; + } + if(this.fireEvent("beforeremove", this.ownerTree, this, node) === false){ + return false; + } + + // remove it from childNodes collection + this.childNodes.splice(index, 1); + + // update siblings + if(node.previousSibling){ + node.previousSibling.nextSibling = node.nextSibling; + } + if(node.nextSibling){ + node.nextSibling.previousSibling = node.previousSibling; + } + + // update child refs + if(this.firstChild == node){ + this.setFirstChild(node.nextSibling); + } + if(this.lastChild == node){ + this.setLastChild(node.previousSibling); + } + + node.setOwnerTree(null); + // clear any references from the node + node.parentNode = null; + node.previousSibling = null; + node.nextSibling = null; + this.fireEvent("remove", this.ownerTree, this, node); + return node; + }, + + /** + * Inserts the first node before the second node in this nodes childNodes collection. + * @param {Node} node The node to insert + * @param {Node} refNode The node to insert before (if null the node is appended) + * @return {Node} The inserted node + */ + insertBefore : function(node, refNode){ + if(!refNode){ // like standard Dom, refNode can be null for append + return this.appendChild(node); + } + // nothing to do + if(node == refNode){ + return false; + } + + if(this.fireEvent("beforeinsert", this.ownerTree, this, node, refNode) === false){ + return false; + } + var index = this.childNodes.indexOf(refNode); + var oldParent = node.parentNode; + var refIndex = index; + + // when moving internally, indexes will change after remove + if(oldParent == this && this.childNodes.indexOf(node) < index){ + refIndex--; + } + + // it's a move, make sure we move it cleanly + if(oldParent){ + if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index, refNode) === false){ + return false; + } + oldParent.removeChild(node); + } + if(refIndex == 0){ + this.setFirstChild(node); + } + this.childNodes.splice(refIndex, 0, node); + node.parentNode = this; + var ps = this.childNodes[refIndex-1]; + if(ps){ + node.previousSibling = ps; + ps.nextSibling = node; + }else{ + node.previousSibling = null; + } + node.nextSibling = refNode; + refNode.previousSibling = node; + node.setOwnerTree(this.getOwnerTree()); + this.fireEvent("insert", this.ownerTree, this, node, refNode); + if(oldParent){ + node.fireEvent("move", this.ownerTree, node, oldParent, this, refIndex, refNode); + } + return node; + }, + + /** + * Returns the child node at the specified index. + * @param {Number} index + * @return {Node} + */ + item : function(index){ + return this.childNodes[index]; + }, + + /** + * Replaces one child node in this node with another. + * @param {Node} newChild The replacement node + * @param {Node} oldChild The node to replace + * @return {Node} The replaced node + */ + replaceChild : function(newChild, oldChild){ + this.insertBefore(newChild, oldChild); + this.removeChild(oldChild); + return oldChild; + }, + + /** + * Returns the index of a child node + * @param {Node} node + * @return {Number} The index of the node or -1 if it was not found + */ + indexOf : function(child){ + return this.childNodes.indexOf(child); + }, + + /** + * Returns the tree this node is in. + * @return {Tree} + */ + getOwnerTree : function(){ + // if it doesn't have one, look for one + if(!this.ownerTree){ + var p = this; + while(p){ + if(p.ownerTree){ + this.ownerTree = p.ownerTree; + break; + } + p = p.parentNode; + } + } + return this.ownerTree; + }, + + /** + * Returns depth of this node (the root node has a depth of 0) + * @return {Number} + */ + getDepth : function(){ + var depth = 0; + var p = this; + while(p.parentNode){ + ++depth; + p = p.parentNode; + } + return depth; + }, + + // private + setOwnerTree : function(tree){ + // if it's move, we need to update everyone + if(tree != this.ownerTree){ + if(this.ownerTree){ + this.ownerTree.unregisterNode(this); + } + this.ownerTree = tree; + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + cs[i].setOwnerTree(tree); + } + if(tree){ + tree.registerNode(this); + } + } + }, + + /** + * Returns the path for this node. The path can be used to expand or select this node programmatically. + * @param {String} attr (optional) The attr to use for the path (defaults to the node's id) + * @return {String} The path + */ + getPath : function(attr){ + attr = attr || "id"; + var p = this.parentNode; + var b = [this.attributes[attr]]; + while(p){ + b.unshift(p.attributes[attr]); + p = p.parentNode; + } + var sep = this.getOwnerTree().pathSeparator; + return sep + b.join(sep); + }, + + /** + * Bubbles up the tree from this node, calling the specified function with each node. The scope (this) of + * function call will be the scope provided or the current node. The arguments to the function + * will be the args provided or the current node. If the function returns false at any point, + * the bubble is stopped. + * @param {Function} fn The function to call + * @param {Object} scope (optional) The scope of the function (defaults to current node) + * @param {Array} args (optional) The args to call the function with (default to passing the current node) + */ + bubble : function(fn, scope, args){ + var p = this; + while(p){ + if(fn.call(scope || p, args || p) === false){ + break; + } + p = p.parentNode; + } + }, + + /** + * Cascades down the tree from this node, calling the specified function with each node. The scope (this) of + * function call will be the scope provided or the current node. The arguments to the function + * will be the args provided or the current node. If the function returns false at any point, + * the cascade is stopped on that branch. + * @param {Function} fn The function to call + * @param {Object} scope (optional) The scope of the function (defaults to current node) + * @param {Array} args (optional) The args to call the function with (default to passing the current node) + */ + cascade : function(fn, scope, args){ + if(fn.call(scope || this, args || this) !== false){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + cs[i].cascade(fn, scope, args); + } + } + }, + + /** + * Interates the child nodes of this node, calling the specified function with each node. The scope (this) of + * function call will be the scope provided or the current node. The arguments to the function + * will be the args provided or the current node. If the function returns false at any point, + * the iteration stops. + * @param {Function} fn The function to call + * @param {Object} scope (optional) The scope of the function (defaults to current node) + * @param {Array} args (optional) The args to call the function with (default to passing the current node) + */ + eachChild : function(fn, scope, args){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + if(fn.call(scope || this, args || cs[i]) === false){ + break; + } + } + }, + + /** + * Finds the first child that has the attribute with the specified value. + * @param {String} attribute The attribute name + * @param {Mixed} value The value to search for + * @return {Node} The found child or null if none was found + */ + findChild : function(attribute, value){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + if(cs[i].attributes[attribute] == value){ + return cs[i]; + } + } + return null; + }, + + /** + * Finds the first child by a custom function. The child matches if the function passed + * returns true. + * @param {Function} fn + * @param {Object} scope (optional) + * @return {Node} The found child or null if none was found + */ + findChildBy : function(fn, scope){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + if(fn.call(scope||cs[i], cs[i]) === true){ + return cs[i]; + } + } + return null; + }, + + /** + * Sorts this nodes children using the supplied sort function + * @param {Function} fn + * @param {Object} scope (optional) + */ + sort : function(fn, scope){ + var cs = this.childNodes; + var len = cs.length; + if(len > 0){ + var sortFn = scope ? function(){fn.apply(scope, arguments);} : fn; + cs.sort(sortFn); + for(var i = 0; i < len; i++){ + var n = cs[i]; + n.previousSibling = cs[i-1]; + n.nextSibling = cs[i+1]; + if(i == 0){ + this.setFirstChild(n); + } + if(i == len-1){ + this.setLastChild(n); + } + } + } + }, + + /** + * Returns true if this node is an ancestor (at any point) of the passed node. + * @param {Node} node + * @return {Boolean} + */ + contains : function(node){ + return node.isAncestor(this); + }, + + /** + * Returns true if the passed node is an ancestor (at any point) of this node. + * @param {Node} node + * @return {Boolean} + */ + isAncestor : function(node){ + var p = this.parentNode; + while(p){ + if(p == node){ + return true; + } + p = p.parentNode; + } + return false; + }, + + toString : function(){ + return "[Node"+(this.id?" "+this.id:"")+"]"; + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/data/XmlReader.js b/www/extras/yui-ext/source/data/XmlReader.js new file mode 100644 index 000000000..db4030bd3 --- /dev/null +++ b/www/extras/yui-ext/source/data/XmlReader.js @@ -0,0 +1,120 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.data.XmlReader + * @extends Ext.data.DataReader + * Data reader class to create an Array of {@link Ext.data.Record} objects from an XML document + * based on mappings in a provided Ext.data.Record constructor. + *

          + * The code below lists all configuration options. + *

          
          +var myReader = new Ext.data.XmlReader({
          +   record: "row",           // The repeated element which contains record information
          +   totalRecords: "results", // The element which contains the number of returned records (optional)
          +   id: "id"                 // The element within the record that provides an ID for the record (optional)
          +}, myRecordDefinition);
          +
          + *

          + * This would consume an XML file like this: + *

          
          +<?xml?>
          +<dataset>
          + <results>2</results>
          + <row>
          +   <id>1</id>
          +   <name>Bill</name>
          + </row>
          + <row>
          +   <id>2</id>
          +   <name>Ben</name>
          + </row>
          +</dataset>
          +
          + * @cfg {String} totalRecords The DomQuery path from which to retrieve the total number of records + * in the dataset. This is only needed if the whole dataset is not passed in one go, but is being + * paged from the remote server. + * @cfg {String} record The DomQuery path to the repeated element which contains record information. + * @cfg {String} success The DomQuery path to the success attribute used by forms. + * @cfg {String} id The DomQuery path relative from the record element to the element that contains + * a record identifier value. + * @constructor + * Create a new XmlReader + * @param {Object} meta Metadata configuration options + * @param {Mixed} recordType The definition of the data record type to produce. This can be either a valid + * Record subclass created with {@link Ext.data.Record#create}, or an array of objects with which to call + * Ext.data.Record.create. See the {@link Ext.data.Record} class for more details. + */ +Ext.data.XmlReader = function(meta, recordType){ + Ext.data.XmlReader.superclass.constructor.call(this, meta, recordType); +}; +Ext.extend(Ext.data.XmlReader, Ext.data.DataReader, { + /** + * This method is only used by a DataProxy which has retrieved data from a remote server. + * @param {Object} response The XHR object which contains the parsed XML document. The response is expected + * to contain a method called 'responseXML' that returns an XML document object. + * @return {Object} records A data block which is used by an {@link Ext.data.Store} as + * a cache of Ext.data.Records. + */ + read : function(response){ + var doc = response.responseXML; + if(!doc) { + throw {message: "XmlReader.read: XML Document not available"}; + } + return this.readRecords(doc); + }, + + /** + * Create a data block containing Ext.data.Records from an XML document. + * @param {Object} doc A parsed XML document. + * @return {Object} records A data block which is used by an {@link Ext.data.Store} as + * a cache of Ext.data.Records. + */ + readRecords : function(doc){ + /** + * After any data loads/reads, the raw XML Document is available for further custom processing. + * @type XMLDocument + */ + this.xmlData = doc; + var root = doc.documentElement || doc; + var q = Ext.DomQuery; + var recordType = this.recordType, fields = recordType.prototype.fields; + var sid = this.meta.id; + var totalRecords = 0, success = true; + if(this.meta.totalRecords){ + totalRecords = q.selectNumber(this.meta.totalRecords, root, 0); + } + + if(this.meta.success){ + var sv = q.selectValue(this.meta.success, root, true); + success = sv !== false && sv !== 'false'; + } + var records = []; + var ns = q.select(this.meta.record, root); + for(var i = 0, len = ns.length; i < len; i++) { + var n = ns[i]; + var values = {}; + var id = sid ? q.selectValue(sid, n) : undefined; + for(var j = 0, jlen = fields.length; j < jlen; j++){ + var f = fields.items[j]; + var v = q.selectValue(f.mapping || f.name, n, f.defaultValue); + v = f.convert(v); + values[f.name] = v; + } + var record = new recordType(values, id); + record.node = n; + records[records.length] = record; + } + + return { + success : success, + records : records, + totalRecords : totalRecords || records.length + }; + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/dd/DDCore.js b/www/extras/yui-ext/source/dd/DDCore.js new file mode 100644 index 000000000..e5b0d522c --- /dev/null +++ b/www/extras/yui-ext/source/dd/DDCore.js @@ -0,0 +1,2953 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* + * These classes are derivatives of the similarly named classes in the YUI Library. + * The original license: + * Copyright (c) 2006, Yahoo! Inc. All rights reserved. + * Code licensed under the BSD License: + * http://developer.yahoo.net/yui/license.txt + */ + +(function() { + +var Event=Ext.EventManager; +var Dom=Ext.lib.Dom; + +/** + * @class Ext.dd.DragDrop + * 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 and 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 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 Ext.dd.DD}. setDragElId() lets you define + * a separate element that would be moved, as in {@link Ext.dd.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 Ext.dd.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);
          + *  }
          + * 
          + * @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 + */ +Ext.dd.DragDrop = function(id, sGroup, config) { + if (id) { + this.init(id, sGroup, config); + } +}; + +Ext.dd.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: + * Ext.dd.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 () { + }, + + /* + * Provides default constraint padding to "constrainTo" elements (defaults to {left: 0, right:0, top:0, bottom:0}). + * @type Object + */ + defaultPadding : {left:0, right:0, top:0, bottom:0}, + + /* + * Initializes the drag drop object's constraints to restrict movement to a certain element. + * + * Usage: +
          
          + var dd = new Ext.dd.DDProxy("dragDiv1", "proxytest",
          +                { dragElId: "existingProxyDiv" });
          + dd.startDrag = function(){
          +     this.constrainTo("parent-id");
          + };
          + 
          + * Or you can initalize it using the {@link Ext.Element} object: +
          
          + Ext.get("dragDiv1").initDDProxy("proxytest", {dragElId: "existingProxyDiv"}, {
          +     startDrag : function(){
          +         this.constrainTo("parent-id");
          +     }
          + });
          + 
          + * @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) + */ + constrainTo : function(constrainTo, pad, inContent){ + if(typeof pad == "number"){ + pad = {left: pad, right:pad, top:pad, bottom:pad}; + } + pad = pad || this.defaultPadding; + var b = Ext.get(this.getEl()).getBox(); + var ce = Ext.get(constrainTo); + var s = ce.getScroll(); + var c, cd = ce.dom; + if(cd == document.body){ + c = { x: s.left, y: s.top, width: Ext.lib.Dom.getViewWidth(), height: Ext.lib.Dom.getViewHeight()}; + }else{ + xy = ce.getXY(); + c = {x : xy[0]+s.left, y: xy[1]+s.top, width: cd.clientWidth, height: cd.clientHeight}; + } + + + var topSpace = b.y - c.y; + var leftSpace = b.x - c.x; + + this.resetConstraints(); + this.setXConstraint(leftSpace - (pad.left||0), // left + c.width - leftSpace - b.width - (pad.right||0) //right + ); + this.setYConstraint(topSpace - (pad.top||0), //top + c.height - topSpace - b.height - (pad.bottom||0) //bottom + ); + }, + + /** + * Returns a reference to the linked element + * @method getEl + * @return {HTMLElement} the html element + */ + getEl: function() { + if (!this._domRef) { + this._domRef = Ext.getDom(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 Ext.dd.DDProxy + * @method getDragEl + * @return {HTMLElement} the html element + */ + getDragEl: function() { + return Ext.getDom(this.dragElId); + }, + + /** + * Sets up the DragDrop object. Must be called in the constructor of any + * Ext.dd.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); + // 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 = Ext.dd.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") { + id = Ext.id(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; + + // the linked element is the element that gets dragged by default + this.setDragElId(id); + + // by default, clicked anchors will not start drag operations. + this.invalidHandleTypes = { A: "A" }; + this.invalidHandleIds = {}; + this.invalidHandleClasses = []; + + this.applyConfig(); + + this.handleOnAvailable(); + }, + + /** + * 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") { + id = Ext.id(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") { + id = Ext.id(id); + } + Event.on(id, "mousedown", + this.handleMouseDown, this); + this.setHandleElId(id); + + this.hasOuterHandles = true; + }, + + /** + * Remove all drag and drop hooks for this element + * @method unreg + */ + unreg: function() { + Event.un(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 {Ext.dd.DragDrop} oDD the clicked dd object (this dd obj) + * @private + */ + handleMouseDown: function(e, oDD){ + if (this.primaryButtonOnly && e.button != 0) { + return; + } + + if (this.isLocked()) { + return; + } + + this.DDM.refreshCache(this.groups); + + var pt = new Ext.lib.Point(Ext.lib.Event.getPageX(e), Ext.lib.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 = Ext.lib.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") { + id = Ext.id(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") { + id = Ext.id(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. + */ + +// Only load the library once. Rewriting the manager class would orphan +// existing drag and drop instances. +if (!Ext.dd.DragDropMgr) { + +/** + * @class Ext.dd.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. + * @singleton + */ +Ext.dd.DragDropMgr = function() { + + var Event = Ext.EventManager; + + 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: 350, + + /** + * 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); + if(!this.dragCurrent.moveOnly){ + 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 = Ext.lib.Event.getPageX(e); + var y = Ext.lib.Event.getPageY(e); + var pt = new Ext.lib.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 + * Ext.dd.DragDropMgr.refreshCache(ddinstance.groups); + * + * Alternatively: + * + * Ext.dd.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 {Ext.lib.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= Ext.lib.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 Ext.lib.Region( t, r, b, l ); + }, + + /** + * Checks the cursor location to see if it over the target + * @method isOverTarget + * @param {Ext.lib.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 Ext.lib.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) { + Ext.dd.DragDropMgr.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 {Ext.dd.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(Ext.getDom(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 Ext.lib.Ext.getDom instead + * @static + */ + getElement: function(id) { + return Ext.getDom(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 Ext.lib.Dom instead + * @static + */ + getCss: function(id) { + var el = Ext.getDom(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 Ext.lib.Dom.getX instead + * @static + */ + getPosX: function(el) { + return Ext.lib.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 Ext.lib.Dom.getY instead + * @static + */ + getPosY: function(el) { + return Ext.lib.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 { + + } + 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 Ext.lib.Dom.getStyle + * @static + */ + getStyle: function(el, styleProp) { + return Ext.fly(el).getStyle(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 = Ext.lib.Dom.getXY(targetEl); + Ext.lib.Dom.setXY(moveEl, aCoord); + }, + + /** + * 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 = Ext.dd.DDM; + if ( Ext.lib.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 +Ext.dd.DDM = Ext.dd.DragDropMgr; +Ext.dd.DDM._addListeners(); + +} + +/** + * @class Ext.dd.DD + * A DragDrop implementation where the linked element follows the + * mouse cursor during a drag. + * @extends Ext.dd.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 + */ +Ext.dd.DD = function(id, sGroup, config) { + if (id) { + this.init(id, sGroup, config); + } +}; + +Ext.extend(Ext.dd.DD, Ext.dd.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) + * @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); + var fly = el.dom ? el : Ext.fly(el); + if (!this.deltaSetXY) { + var aCoord = [oCoord.x, oCoord.y]; + fly.setXY(aCoord); + var newLeft = fly.getLeft(true); + var newTop = fly.getTop(true); + this.deltaSetXY = [ newLeft - oCoord.x, newTop - oCoord.y ]; + } else { + fly.setLeftTop(oCoord.x + this.deltaSetXY[0], oCoord.y + this.deltaSetXY[1]); + } + + this.cachePosition(oCoord.x, oCoord.y); + this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth); + return oCoord; + }, + + /** + * 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 = Ext.lib.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 = Ext.lib.Dom.getViewWidth(); + + // The client width + var clientW = Ext.lib.Dom.getViewHeight(); + + // 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 + * Ext.dd.DragDrop, but all versions of this method through the + * inheritance chain are called + */ + applyConfig: function() { + Ext.dd.DD.superclass.applyConfig.call(this); + this.scroll = (this.config.scroll !== false); + }, + + /* + * Event that fires prior to the onMouseDown event. Overrides + * Ext.dd.DragDrop. + */ + b4MouseDown: function(e) { + // this.resetConstraints(); + this.autoOffset(Ext.lib.Event.getPageX(e), + Ext.lib.Event.getPageY(e)); + }, + + /* + * Event that fires prior to the onDrag event. Overrides + * Ext.dd.DragDrop. + */ + b4Drag: function(e) { + this.setDragElPos(Ext.lib.Event.getPageX(e), + Ext.lib.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) { + } + + */ + +}); +/** + * @class Ext.dd.DDProxy + * 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. + * + * @extends Ext.dd.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 + */ +Ext.dd.DDProxy = function(id, sGroup, config) { + if (id) { + this.init(id, sGroup, config); + this.initFrame(); + } +}; + +/** + * The default drag frame div id + * @property Ext.dd.DDProxy.dragElId + * @type String + * @static + */ +Ext.dd.DDProxy.dragElId = "ygddfdiv"; + +Ext.extend(Ext.dd.DDProxy, Ext.dd.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 Ext.dd.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() { + Ext.dd.DDProxy.superclass.applyConfig.call(this); + + this.resizeFrame = (this.config.resizeFrame !== false); + this.centerFrame = (this.config.centerFrame); + this.setDragElId(this.config.dragElId || Ext.dd.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); + + Ext.fly(dragEl).show(); + }, + + /** + * 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 el = this.getEl(); + Ext.fly(this.getDragEl()).setSize(el.offsetWidth, el.offsetHeight); + } + }, + + // overrides Ext.dd.DragDrop + b4MouseDown: function(e) { + var x = Ext.lib.Event.getPageX(e); + var y = Ext.lib.Event.getPageY(e); + this.autoOffset(x, y); + this.setDragElPos(x, y); + }, + + // overrides Ext.dd.DragDrop + b4StartDrag: function(x, y) { + // show the drag frame + this.showFrame(x, y); + }, + + // overrides Ext.dd.DragDrop + b4EndDrag: function(e) { + Ext.fly(this.getDragEl()).hide(); + }, + + // overrides Ext.dd.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 Ext.dd.DD. + endDrag: function(e) { + + var lel = this.getEl(); + var del = this.getDragEl(); + + // Show the drag frame briefly so we can get its position + del.style.visibility = ""; + + this.beforeMove(); + // Hide the linked element before the move to get around a Safari + // rendering bug. + lel.style.visibility = "hidden"; + Ext.dd.DDM.moveToEl(lel, del); + del.style.visibility = "hidden"; + lel.style.visibility = ""; + + this.afterDrag(); + }, + + beforeMove : function(){ + + }, + + afterDrag : function(){ + + }, + + toString: function() { + return ("DDProxy " + this.id); + } + +}); +/** + * @class Ext.dd.DDTarget + * 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. + * @extends Ext.dd.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 + */ +Ext.dd.DDTarget = function(id, sGroup, config) { + if (id) { + this.initTarget(id, sGroup, config); + } +}; + +// Ext.dd.DDTarget.prototype = new Ext.dd.DragDrop(); +Ext.extend(Ext.dd.DDTarget, Ext.dd.DragDrop, { + toString: function() { + return ("DDTarget " + this.id); + } +}); diff --git a/www/extras/yui-ext/source/dd/DragSource.js b/www/extras/yui-ext/source/dd/DragSource.js new file mode 100644 index 000000000..93316b968 --- /dev/null +++ b/www/extras/yui-ext/source/dd/DragSource.js @@ -0,0 +1,359 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.dd.DragSource + * @extends Ext.dd.DDProxy + * A simple class that provides the basic implementation needed to make any element draggable. + * @constructor + * @param {String/HTMLElement/Element} el The container element + * @param {Object} config + */ +Ext.dd.DragSource = function(el, config){ + this.el = Ext.get(el); + this.dragData = {}; + + Ext.apply(this, config); + + if(!this.proxy){ + this.proxy = new Ext.dd.StatusProxy(); + } + this.el.on("mouseup", this.handleMouseUp); + Ext.dd.DragSource.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, + {dragElId : this.proxy.id, resizeFrame: false, isTarget: false, scroll: this.scroll === true}); + + this.dragging = false; +}; + +Ext.extend(Ext.dd.DragSource, Ext.dd.DDProxy, { + /** + * @cfg {String} dropAllowed + * The CSS class returned to the drag source when drop is allowed (defaults to "x-dd-drop-ok"). + */ + dropAllowed : "x-dd-drop-ok", + /** + * @cfg {String} dropNotAllowed + * The CSS class returned to the drag source when drop is not allowed (defaults to "x-dd-drop-nodrop"). + */ + dropNotAllowed : "x-dd-drop-nodrop", + + /** + * Returns the data object associated with this drag source + * @return {Object} data An object containing arbitrary data + */ + getDragData : function(e){ + return this.dragData; + }, + + // private + onDragEnter : function(e, id){ + var target = Ext.dd.DragDropMgr.getDDById(id); + this.cachedTarget = target; + if(this.beforeDragEnter(target, e, id) !== false){ + if(target.isNotifyTarget){ + var status = target.notifyEnter(this, e, this.dragData); + this.proxy.setStatus(status); + }else{ + this.proxy.setStatus(this.dropAllowed); + } + + if(this.afterDragEnter){ + /** + * An empty function by default, but provided so that you can perform a custom action + * when the dragged item enters the drop target by providing an implementation. + * @param {Ext.dd.DragDrop} target The drop target + * @param {Event} e The event object + * @param {String} id The id of the dragged element + * @method afterDragEnter + */ + this.afterDragEnter(target, e, id); + } + } + }, + + /** + * An empty function by default, but provided so that you can perform a custom action + * before the dragged item enters the drop target and optionally cancel the onDragEnter. + * @param {Ext.dd.DragDrop} target The drop target + * @param {Event} e The event object + * @param {String} id The id of the dragged element + * @return {Boolean} isValid True if the drag event is valid, else false to cancel + */ + beforeDragEnter : function(target, e, id){ + return true; + }, + + // private + alignElWithMouse: function() { + Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments); + this.proxy.sync(); + }, + + // private + onDragOver : function(e, id){ + var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id); + if(this.beforeDragOver(target, e, id) !== false){ + if(target.isNotifyTarget){ + var status = target.notifyOver(this, e, this.dragData); + this.proxy.setStatus(status); + } + + if(this.afterDragOver){ + /** + * An empty function by default, but provided so that you can perform a custom action + * while the dragged item is over the drop target by providing an implementation. + * @param {Ext.dd.DragDrop} target The drop target + * @param {Event} e The event object + * @param {String} id The id of the dragged element + * @method afterDragOver + */ + this.afterDragOver(target, e, id); + } + } + }, + + /** + * An empty function by default, but provided so that you can perform a custom action + * while the dragged item is over the drop target and optionally cancel the onDragOver. + * @param {Ext.dd.DragDrop} target The drop target + * @param {Event} e The event object + * @param {String} id The id of the dragged element + * @return {Boolean} isValid True if the drag event is valid, else false to cancel + */ + beforeDragOver : function(target, e, id){ + return true; + }, + + // private + onDragOut : function(e, id){ + var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id); + if(this.beforeDragOut(target, e, id) !== false){ + if(target.isNotifyTarget){ + target.notifyOut(this, e, this.dragData); + } + this.proxy.reset(); + if(this.afterDragOut){ + /** + * An empty function by default, but provided so that you can perform a custom action + * after the dragged item is dragged out of the target without dropping. + * @param {Ext.dd.DragDrop} target The drop target + * @param {Event} e The event object + * @param {String} id The id of the dragged element + * @method afterDragOut + */ + this.afterDragOut(target, e, id); + } + } + this.cachedTarget = null; + }, + + /** + * An empty function by default, but provided so that you can perform a custom action before the dragged + * item is dragged out of the target without dropping, and optionally cancel the onDragOut. + * @param {Ext.dd.DragDrop} target The drop target + * @param {Event} e The event object + * @param {String} id The id of the dragged element + * @return {Boolean} isValid True if the drag event is valid, else false to cancel + */ + beforeDragOut : function(target, e, id){ + return true; + }, + + // private + onDragDrop : function(e, id){ + var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id); + if(this.beforeDragDrop(target, e, id) !== false){ + if(target.isNotifyTarget){ + if(target.notifyDrop(this, e, this.dragData)){ // valid drop? + this.onValidDrop(target, e, id); + }else{ + this.onInvalidDrop(target, e, id); + } + }else{ + this.onValidDrop(target, e, id); + } + + if(this.afterDragDrop){ + /** + * An empty function by default, but provided so that you can perform a custom action + * after a valid drag drop has occurred by providing an implementation. + * @param {Ext.dd.DragDrop} target The drop target + * @param {Event} e The event object + * @param {String} id The id of the dropped element + * @method afterDragDrop + */ + this.afterDragDrop(target, e, id); + } + } + }, + + /** + * An empty function by default, but provided so that you can perform a custom action before the dragged + * item is dropped onto the target and optionally cancel the onDragDrop. + * @param {Ext.dd.DragDrop} target The drop target + * @param {Event} e The event object + * @param {String} id The id of the dragged element + * @return {Boolean} isValid True if the drag drop event is valid, else false to cancel + */ + beforeDragDrop : function(target, e, id){ + return true; + }, + + // private + onValidDrop : function(target, e, id){ + this.hideProxy(); + }, + + // private + getRepairXY : function(e, data){ + return this.el.getXY(); + }, + + // private + onInvalidDrop : function(target, e, id){ + this.beforeInvalidDrop(target, e, id); + if(this.cachedTarget){ + if(this.cachedTarget.isNotifyTarget){ + this.cachedTarget.notifyOut(this, e, this.dragData); + } + this.cacheTarget = null; + } + this.proxy.repair(this.getRepairXY(e, this.dragData), this.afterRepair, this); + + if(this.afterInvalidDrop){ + /** + * An empty function by default, but provided so that you can perform a custom action + * after an invalid drop has occurred by providing an implementation. + * @param {Event} e The event object + * @param {String} id The id of the dropped element + * @method afterInvalidDrop + */ + this.afterInvalidDrop(e, id); + } + }, + + // private + afterRepair : function(){ + if(Ext.enableFx){ + this.el.highlight(this.hlColor || "c3daf9"); + } + this.dragging = false; + }, + + /** + * An empty function by default, but provided so that you can perform a custom action after an invalid + * drop has occurred. + * @param {Ext.dd.DragDrop} target The drop target + * @param {Event} e The event object + * @param {String} id The id of the dragged element + * @return {Boolean} isValid True if the invalid drop should proceed, else false to cancel + */ + beforeInvalidDrop : function(target, e, id){ + return true; + }, + + // private + handleMouseDown : function(e){ + if(this.dragging) { + return; + } + if(Ext.QuickTips){ + Ext.QuickTips.disable(); + } + var data = this.getDragData(e); + if(data && this.onBeforeDrag(data, e) !== false){ + this.dragData = data; + this.proxy.stop(); + Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments); + } + }, + + // private + handleMouseUp : function(e){ + if(Ext.QuickTips){ + Ext.QuickTips.enable(); + } + }, + + /** + * An empty function by default, but provided so that you can perform a custom action before the initial + * drag event begins and optionally cancel it. + * @param {Object} data An object containing arbitrary data to be shared with drop targets + * @param {Event} e The event object + * @return {Boolean} isValid True if the drag event is valid, else false to cancel + */ + onBeforeDrag : function(data, e){ + return true; + }, + + /** + * An empty function by default, but provided so that you can perform a custom action once the initial + * drag event has begun. The drag cannot be canceled from this function. + * @param {Number} x The x position of the click on the dragged object + * @param {Number} y The y position of the click on the dragged object + */ + onStartDrag : Ext.emptyFn, + + // private - YUI override + startDrag : function(x, y){ + this.proxy.reset(); + this.dragging = true; + this.proxy.update(""); + this.onInitDrag(x, y); + this.proxy.show(); + }, + + // private + onInitDrag : function(x, y){ + var clone = this.el.dom.cloneNode(true); + clone.id = Ext.id(); // prevent duplicate ids + this.proxy.update(clone); + this.onStartDrag(x, y); + return true; + }, + + /** + * Returns the drag source's underlying {@link Ext.dd.StatusProxy} + * @return {Ext.dd.StatusProxy} proxy The StatusProxy + */ + getProxy : function(){ + return this.proxy; + }, + + /** + * Hides the drag source's {@link Ext.dd.StatusProxy} + */ + hideProxy : function(){ + this.proxy.hide(); + this.proxy.reset(true); + this.dragging = false; + }, + + // private + triggerCacheRefresh : function(){ + Ext.dd.DDM.refreshCache(this.groups); + }, + + // private - override to prevent hiding + b4EndDrag: function(e) { + }, + + // private - override to prevent moving + endDrag : function(e){ + this.onEndDrag(this.dragData, e); + }, + + // private + onEndDrag : function(data, e){ + }, + + // private - pin to cursor + autoOffset : function(x, y) { + this.setDelta(-12, -20); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/dd/DragZone.js b/www/extras/yui-ext/source/dd/DragZone.js new file mode 100644 index 000000000..64cec46fd --- /dev/null +++ b/www/extras/yui-ext/source/dd/DragZone.js @@ -0,0 +1,79 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.dd.DragZone + * @extends Ext.dd.DragSource + * This class provides a container DD instance that proxies for multiple child node sources.
          + * By default, this class requires that draggable child nodes are registered with {@link Ext.dd.Registry}. + * @constructor + * @param {String/HTMLElement/Element} el The container element + * @param {Object} config + */ +Ext.dd.DragZone = function(el, config){ + Ext.dd.DragZone.superclass.constructor.call(this, el, config); + if(this.containerScroll){ + Ext.dd.ScrollManager.register(this.el); + } +}; + +Ext.extend(Ext.dd.DragZone, Ext.dd.DragSource, { + /** + * @cfg {Boolean} containerScroll True to register this container with the Scrollmanager + * for auto scrolling during drag operations. + */ + /** + * @cfg {String} hlColor The color to use when visually highlighting the drag source in the afterRepair + * method after a failed drop (defaults to "c3daf9" - light blue) + */ + + /** + * Called when a mousedown occurs in this container. Looks in {@link Ext.dd.Registry} + * for a valid target to drag based on the mouse down. Override this method + * to provide your own lookup logic (e.g. finding a child by class name). Make sure your returned + * object has a "ddel" attribute (with an HTML Element) for other functions to work. + * @param {EventObject} e The mouse down event + * @return {Object} The dragData + */ + getDragData : function(e){ + return Ext.dd.Registry.getHandleFromEvent(e); + }, + + /** + * Called once drag threshold has been reached to initialize the proxy element. By default, it clones the + * this.dragData.ddel + * @param {Number} x The x position of the click on the dragged object + * @param {Number} y The y position of the click on the dragged object + * @return {Boolean} true to continue the drag, false to cancel + */ + onInitDrag : function(x, y){ + this.proxy.update(this.dragData.ddel.cloneNode(true)); + this.onStartDrag(x, y); + return true; + }, + + /** + * Called after a repair of an invalid drop. By default, highlights this.dragData.ddel + */ + afterRepair : function(){ + if(Ext.enableFx){ + Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9"); + } + this.dragging = false; + }, + + /** + * Called before a repair of an invalid drop to get the XY to animate to. By default returns + * the XY of this.dragData.ddel + * @param {EventObject} e The mouse up event + * @return {Array} The xy location (e.g. [100, 200]) + */ + getRepairXY : function(e){ + return Ext.Element.fly(this.dragData.ddel).getXY(); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/dd/DropTarget.js b/www/extras/yui-ext/source/dd/DropTarget.js new file mode 100644 index 000000000..9d5368dd9 --- /dev/null +++ b/www/extras/yui-ext/source/dd/DropTarget.js @@ -0,0 +1,112 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.dd.DropTarget + * @extends Ext.dd.DDTarget + * A simple class that provides the basic implementation needed to make any element a drop target that can have + * draggable items dropped onto it. The drop has no effect until an implementation of notifyDrop is provided. + * @constructor + * @param {String/HTMLElement/Element} el The container element + * @param {Object} config + */ +Ext.dd.DropTarget = function(el, config){ + this.el = Ext.get(el); + + Ext.apply(this, config); + + if(this.containerScroll){ + Ext.dd.ScrollManager.register(this.el); + } + + Ext.dd.DropTarget.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, + {isTarget: true}); + +}; + +Ext.extend(Ext.dd.DropTarget, Ext.dd.DDTarget, { + /** + * @cfg {String} overClass + * The CSS class applied to the drop target element while the drag source is over it (defaults to ""). + */ + /** + * @cfg {String} dropAllowed + * The CSS class returned to the drag source when drop is allowed (defaults to "x-dd-drop-ok"). + */ + dropAllowed : "x-dd-drop-ok", + /** + * @cfg {String} dropNotAllowed + * The CSS class returned to the drag source when drop is not allowed (defaults to "x-dd-drop-nodrop"). + */ + dropNotAllowed : "x-dd-drop-nodrop", + + // private + isTarget : true, + + // private + isNotifyTarget : true, + + /** + * The function a {@link Ext.dd.DragSource} calls once to notify this drop target that the source is now over the + * target. This default implementation adds the CSS class specified by overClass (if any) to the drop element + * and returns the dropAllowed config value. This method should be overridden if drop validation is required. + * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop target + * @param {Event} e The event + * @param {Object} data An object containing arbitrary data supplied by the drag source + * @return {String} status The CSS class that communicates the drop status back to the source so that the + * underlying {@link Ext.dd.StatusProxy} can be updated + */ + notifyEnter : function(dd, e, data){ + if(this.overClass){ + this.el.addClass(this.overClass); + } + return this.dropAllowed; + }, + + /** + * The function a {@link Ext.dd.DragSource} calls continuously while it is being dragged over the target. + * This method will be called on every mouse movement while the drag source is over the drop target. + * This default implementation simply returns the dropAllowed config value. + * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop target + * @param {Event} e The event + * @param {Object} data An object containing arbitrary data supplied by the drag source + * @return {String} status The CSS class that communicates the drop status back to the source so that the + * underlying {@link Ext.dd.StatusProxy} can be updated + */ + notifyOver : function(dd, e, data){ + return this.dropAllowed; + }, + + /** + * The function a {@link Ext.dd.DragSource} calls once to notify this drop target that the source has been dragged + * out of the target without dropping. This default implementation simply removes the CSS class specified by + * overClass (if any) from the drop element. + * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop target + * @param {Event} e The event + * @param {Object} data An object containing arbitrary data supplied by the drag source + */ + notifyOut : function(dd, e, data){ + if(this.overClass){ + this.el.removeClass(this.overClass); + } + }, + + /** + * The function a {@link Ext.dd.DragSource} calls once to notify this drop target that the dragged item has + * been dropped on it. This method has no default implementation and returns false, so you must provide an + * implementation that does something to process the drop event and returns true so that the drag source's + * repair action does not run. + * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop target + * @param {Event} e The event + * @param {Object} data An object containing arbitrary data supplied by the drag source + * @return {Boolean} True if the drop was valid, else false + */ + notifyDrop : function(dd, e, data){ + return false; + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/dd/DropZone.js b/www/extras/yui-ext/source/dd/DropZone.js new file mode 100644 index 000000000..6dee68bb4 --- /dev/null +++ b/www/extras/yui-ext/source/dd/DropZone.js @@ -0,0 +1,208 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.dd.DropZone + * @extends Ext.dd.DropTarget + * This class provides a container DD instance that proxies for multiple child node targets.
          + * By default, this class requires that child nodes accepting drop are registered with {@link Ext.dd.Registry}. + * @constructor + * @param {String/HTMLElement/Element} el The container element + * @param {Object} config + */ +Ext.dd.DropZone = function(el, config){ + Ext.dd.DropZone.superclass.constructor.call(this, el, config); +}; + +Ext.extend(Ext.dd.DropZone, Ext.dd.DropTarget, { + /** + * Returns a custom data object associated with the DOM node that is the target of the event. By default + * this looks up the event target in the {@link Ext.dd.Registry}, although you can override this method to + * provide your own custom lookup. + * @param {Event} e The event + * @return {Object} data The custom data + */ + getTargetFromEvent : function(e){ + return Ext.dd.Registry.getTargetFromEvent(e); + }, + + /** + * Called internally when the DropZone determines that a {@link Ext.dd.DragSource} has entered a drop node + * that it has registered. This method has no default implementation and should be overridden to provide + * node-specific processing if necessary. + * @param {Object} nodeData The custom data associated with the drop node (this is the same value returned from + * {@link #getTargetFromEvent} for this node) + * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone + * @param {Event} e The event + * @param {Object} data An object containing arbitrary data supplied by the drag source + */ + onNodeEnter : function(n, dd, e, data){ + + }, + + /** + * Called internally while the DropZone determines that a {@link Ext.dd.DragSource} is over a drop node + * that it has registered. The default implementation returns this.dropNotAllowed, so it should be + * overridden to provide the proper feedback. + * @param {Object} nodeData The custom data associated with the drop node (this is the same value returned from + * {@link #getTargetFromEvent} for this node) + * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone + * @param {Event} e The event + * @param {Object} data An object containing arbitrary data supplied by the drag source + * @return {String} status The CSS class that communicates the drop status back to the source so that the + * underlying {@link Ext.dd.StatusProxy} can be updated + */ + onNodeOver : function(n, dd, e, data){ + return this.dropAllowed; + }, + + /** + * Called internally when the DropZone determines that a {@link Ext.dd.DragSource} has been dragged out of + * the drop node without dropping. This method has no default implementation and should be overridden to provide + * node-specific processing if necessary. + * @param {Object} nodeData The custom data associated with the drop node (this is the same value returned from + * {@link #getTargetFromEvent} for this node) + * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone + * @param {Event} e The event + * @param {Object} data An object containing arbitrary data supplied by the drag source + */ + onNodeOut : function(n, dd, e, data){ + + }, + + /** + * Called internally when the DropZone determines that a {@link Ext.dd.DragSource} has been dropped onto + * the drop node. The default implementation returns false, so it should be overridden to provide the + * appropriate processing of the drop event and return true so that the drag source's repair action does not run. + * @param {Object} nodeData The custom data associated with the drop node (this is the same value returned from + * {@link #getTargetFromEvent} for this node) + * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone + * @param {Event} e The event + * @param {Object} data An object containing arbitrary data supplied by the drag source + * @return {Boolean} True if the drop was valid, else false + */ + onNodeDrop : function(n, dd, e, data){ + return false; + }, + + /** + * Called internally while the DropZone determines that a {@link Ext.dd.DragSource} is being dragged over it, + * but not over any of its registered drop nodes. The default implementation returns this.dropNotAllowed, so + * it should be overridden to provide the proper feedback if necessary. + * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone + * @param {Event} e The event + * @param {Object} data An object containing arbitrary data supplied by the drag source + * @return {String} status The CSS class that communicates the drop status back to the source so that the + * underlying {@link Ext.dd.StatusProxy} can be updated + */ + onContainerOver : function(dd, e, data){ + return this.dropNotAllowed; + }, + + /** + * Called internally when the DropZone determines that a {@link Ext.dd.DragSource} has been dropped on it, + * but not on any of its registered drop nodes. The default implementation returns false, so it should be + * overridden to provide the appropriate processing of the drop event if you need the drop zone itself to + * be able to accept drops. It should return true when valid so that the drag source's repair action does not run. + * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone + * @param {Event} e The event + * @param {Object} data An object containing arbitrary data supplied by the drag source + * @return {Boolean} True if the drop was valid, else false + */ + onContainerDrop : function(dd, e, data){ + return false; + }, + + /** + * The function a {@link Ext.dd.DragSource} calls once to notify this drop zone that the source is now over + * the zone. The default implementation returns this.dropNotAllowed and expects that only registered drop + * nodes can process drag drop operations, so if you need the drop zone itself to be able to process drops + * you should override this method and provide a custom implementation. + * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone + * @param {Event} e The event + * @param {Object} data An object containing arbitrary data supplied by the drag source + * @return {String} status The CSS class that communicates the drop status back to the source so that the + * underlying {@link Ext.dd.StatusProxy} can be updated + */ + notifyEnter : function(dd, e, data){ + return this.dropNotAllowed; + }, + + /** + * The function a {@link Ext.dd.DragSource} calls continuously while it is being dragged over the drop zone. + * This method will be called on every mouse movement while the drag source is over the drop zone. + * It will call {@link #onNodeOver} while the drag source is over a registered node, and will also automatically + * delegate to the appropriate node-specific methods as necessary when the drag source enters and exits + * registered nodes ({@link #onNodeEnter}, {@link #onNodeOut}). If the drag source is not currently over a + * registered node, it will call {@link #onContainerOver}. + * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone + * @param {Event} e The event + * @param {Object} data An object containing arbitrary data supplied by the drag source + * @return {String} status The CSS class that communicates the drop status back to the source so that the + * underlying {@link Ext.dd.StatusProxy} can be updated + */ + notifyOver : function(dd, e, data){ + var n = this.getTargetFromEvent(e); + if(!n){ // not over valid drop target + if(this.lastOverNode){ + this.onNodeOut(this.lastOverNode, dd, e, data); + this.lastOverNode = null; + } + return this.onContainerOver(dd, e, data); + } + if(this.lastOverNode != n){ + if(this.lastOverNode){ + this.onNodeOut(this.lastOverNode, dd, e, data); + } + this.onNodeEnter(n, dd, e, data); + this.lastOverNode = n; + } + return this.onNodeOver(n, dd, e, data); + }, + + /** + * The function a {@link Ext.dd.DragSource} calls once to notify this drop zone that the source has been dragged + * out of the zone without dropping. If the drag source is currently over a registered node, the notification + * will be delegated to {@link #onNodeOut} for node-specific handling, otherwise it will be ignored. + * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop target + * @param {Event} e The event + * @param {Object} data An object containing arbitrary data supplied by the drag zone + */ + notifyOut : function(dd, e, data){ + if(this.lastOverNode){ + this.onNodeOut(this.lastOverNode, dd, e, data); + this.lastOverNode = null; + } + }, + + /** + * The function a {@link Ext.dd.DragSource} calls once to notify this drop zone that the dragged item has + * been dropped on it. The drag zone will look up the target node based on the event passed in, and if there + * is a node registered for that event, it will delegate to {@link #onNodeDrop} for node-specific handling, + * otherwise it will call {@link #onContainerDrop}. + * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone + * @param {Event} e The event + * @param {Object} data An object containing arbitrary data supplied by the drag source + * @return {Boolean} True if the drop was valid, else false + */ + notifyDrop : function(dd, e, data){ + if(this.lastOverNode){ + this.onNodeOut(this.lastOverNode, dd, e, data); + this.lastOverNode = null; + } + var n = this.getTargetFromEvent(e); + return n ? + this.onNodeDrop(n, dd, e, data) : + this.onContainerDrop(dd, e, data); + }, + + // private + triggerCacheRefresh : function(){ + Ext.dd.DDM.refreshCache(this.groups); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/dd/Registry.js b/www/extras/yui-ext/source/dd/Registry.js new file mode 100644 index 000000000..158c0c13c --- /dev/null +++ b/www/extras/yui-ext/source/dd/Registry.js @@ -0,0 +1,129 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.dd.Registry + * Provides easy access to all drag drop components that are registered on a page. Items can be retrieved either + * directly by DOM node id, or by passing in the drag drop event that occurred and looking up the event target. + * @singleton + */ +Ext.dd.Registry = function(){ + var elements = {}; + var handles = {}; + var autoIdSeed = 0; + + var getId = function(el, autogen){ + if(typeof el == "string"){ + return el; + } + var id = el.id; + if(!id && autogen !== false){ + id = "extdd-" + (++autoIdSeed); + el.id = id; + } + return id; + }; + + return { + /** + * Resgister a drag drop element + * @param {String/HTMLElement) element The id or DOM node to register + * @param {Object} data (optional) An custom data object that will be passed between the elements that are involved + * in drag drop operations. You can populate this object with any arbitrary properties that your own code + * knows how to interpret, plus there are some specific properties known to the Registry that should be + * populated in the data object (if applicable): + *
          +Value      Description
          +--------- ------------------------------------------
          +handles Array of DOM nodes that trigger dragging
          + for the element being registered
          +isHandle True if the element passed in triggers
          + dragging itself, else false +
          + */ + register : function(el, data){ + data = data || {}; + if(typeof el == "string"){ + el = document.getElementById(el); + } + data.ddel = el; + elements[getId(el)] = data; + if(data.isHandle !== false){ + handles[data.ddel.id] = data; + } + if(data.handles){ + var hs = data.handles; + for(var i = 0, len = hs.length; i < len; i++){ + handles[getId(hs[i])] = data; + } + } + }, + + /** + * Unregister a drag drop element + * @param {String/HTMLElement) element The id or DOM node to unregister + */ + unregister : function(el){ + var id = getId(el, false); + var data = elements[id]; + if(data){ + delete elements[id]; + if(data.handles){ + var hs = data.handles; + for(var i = 0, len = hs.length; i < len; i++){ + delete handles[getId(hs[i], false)]; + } + } + } + }, + + /** + * Returns the handle registered for a DOM Node by id + * @param {String/HTMLElement} id The DOM node or id to look up + * @return {Object} handle The custom handle data + */ + getHandle : function(id){ + if(typeof id != "string"){ // must be element? + id = id.id; + } + return handles[id]; + }, + + /** + * Returns the handle that is registered for the DOM node that is the target of the event + * @param {Event} e The event + * @return {Object} handle The custom handle data + */ + getHandleFromEvent : function(e){ + var t = Ext.lib.Event.getTarget(e); + return t ? handles[t.id] : null; + }, + + /** + * Returns a custom data object that is registered for a DOM node by id + * @param {String/HTMLElement} id The DOM node or id to look up + * @return {Object} data The custom data + */ + getTarget : function(id){ + if(typeof id != "string"){ // must be element? + id = id.id; + } + return elements[id]; + }, + + /** + * Returns a custom data object that is registered for the DOM node that is the target of the event + * @param {Event} e The event + * @return {Object} data The custom data + */ + getTargetFromEvent : function(e){ + var t = Ext.lib.Event.getTarget(e); + return t ? elements[t.id] || handles[t.id] : null; + } + }; +}(); \ No newline at end of file diff --git a/www/extras/yui-ext/source/dd/ScrollManager.js b/www/extras/yui-ext/source/dd/ScrollManager.js new file mode 100644 index 000000000..05eb587ae --- /dev/null +++ b/www/extras/yui-ext/source/dd/ScrollManager.js @@ -0,0 +1,178 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.dd.ScrollManager + * Provides automatic scrolling of overflow regions in the page during drag operations.

          + * Note: This class uses "Point Mode" and is untested in "Intersect Mode". + * @singleton + */ +Ext.dd.ScrollManager = function(){ + var ddm = Ext.dd.DragDropMgr; + var els = {}; + var dragEl = null; + var proc = {}; + + var onStop = function(e){ + dragEl = null; + clearProc(); + }; + + var triggerRefresh = function(){ + if(ddm.dragCurrent){ + ddm.refreshCache(ddm.dragCurrent.groups); + } + }; + + var doScroll = function(){ + if(ddm.dragCurrent){ + var dds = Ext.dd.ScrollManager; + if(!dds.animate){ + if(proc.el.scroll(proc.dir, dds.increment)){ + triggerRefresh(); + } + }else{ + proc.el.scroll(proc.dir, dds.increment, true, dds.animDuration, triggerRefresh); + } + } + }; + + var clearProc = function(){ + if(proc.id){ + clearInterval(proc.id); + } + proc.id = 0; + proc.el = null; + proc.dir = ""; + }; + + var startProc = function(el, dir){ + clearProc(); + proc.el = el; + proc.dir = dir; + proc.id = setInterval(doScroll, Ext.dd.ScrollManager.frequency); + }; + + var onFire = function(e, isDrop){ + if(isDrop || !ddm.dragCurrent){ return; } + var dds = Ext.dd.ScrollManager; + if(!dragEl || dragEl != ddm.dragCurrent){ + dragEl = ddm.dragCurrent; + // refresh regions on drag start + dds.refreshCache(); + } + + var xy = Ext.lib.Event.getXY(e); + var pt = new Ext.lib.Point(xy[0], xy[1]); + for(var id in els){ + var el = els[id], r = el._region; + if(r.contains(pt) && el.isScrollable()){ + if(r.bottom - pt.y <= dds.thresh){ + if(proc.el != el){ + startProc(el, "down"); + } + return; + }else if(r.right - pt.x <= dds.thresh){ + if(proc.el != el){ + startProc(el, "left"); + } + return; + }else if(pt.y - r.top <= dds.thresh){ + if(proc.el != el){ + startProc(el, "up"); + } + return; + }else if(pt.x - r.left <= dds.thresh){ + if(proc.el != el){ + startProc(el, "right"); + } + return; + } + } + } + clearProc(); + }; + + ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm); + ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm); + + return { + /** + * Registers new overflow element(s) to auto scroll + * @param {String/HTMLElement/Element/Array} el The id of or the element to be scrolled or an array of either + */ + register : function(el){ + if(el instanceof Array){ + for(var i = 0, len = el.length; i < len; i++) { + this.register(el[i]); + } + }else{ + el = Ext.get(el); + els[el.id] = el; + } + }, + + /** + * Unregisters overflow element(s) so they are no longer scrolled + * @param {String/HTMLElement/Element/Array} el The id of or the element to be removed or an array of either + */ + unregister : function(el){ + if(el instanceof Array){ + for(var i = 0, len = el.length; i < len; i++) { + this.unregister(el[i]); + } + }else{ + el = Ext.get(el); + delete els[el.id]; + } + }, + + /** + * The number of pixels from the edge of a container the pointer needs to be to + * trigger scrolling (defaults to 25) + * @type Number + */ + thresh : 25, + + /** + * The number of pixels to scroll in each scroll increment (defaults to 50) + * @type Number + */ + increment : 100, + + /** + * The frequency of scrolls in milliseconds (defaults to 500) + * @type Number + */ + frequency : 500, + + /** + * True to animate the scroll (defaults to true) + * @type Boolean + */ + animate: true, + + /** + * The animation duration in seconds - + * MUST BE less than Ext.dd.ScrollManager.frequency! (defaults to .4) + * @type Number + */ + animDuration: .4, + + /** + * Manually trigger a cache refresh. + */ + refreshCache : function(){ + for(var id in els){ + if(typeof els[id] == 'object'){ // for people extending the object prototype + els[id]._region = els[id].getRegion(); + } + } + } + }; +}(); \ No newline at end of file diff --git a/www/extras/yui-ext/source/dd/StatusProxy.js b/www/extras/yui-ext/source/dd/StatusProxy.js new file mode 100644 index 000000000..71d6d5241 --- /dev/null +++ b/www/extras/yui-ext/source/dd/StatusProxy.js @@ -0,0 +1,168 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.dd.StatusProxy + * A specialized drag proxy that supports a drop status icon, {@link Ext.Layer} styles and auto-repair. This is the + * default drag proxy used by all Ext.dd components. + * @constructor + * @param {Object} config + */ +Ext.dd.StatusProxy = function(config){ + Ext.apply(this, config); + this.id = this.id || Ext.id(); + this.el = new Ext.Layer({ + dh: { + id: this.id, tag: "div", cls: "x-dd-drag-proxy "+this.dropNotAllowed, children: [ + {tag: "div", cls: "x-dd-drop-icon"}, + {tag: "div", cls: "x-dd-drag-ghost"} + ] + }, + shadow: !config || config.shadow !== false + }); + this.ghost = Ext.get(this.el.dom.childNodes[1]); + this.dropStatus = this.dropNotAllowed; +}; + +Ext.dd.StatusProxy.prototype = { + /** + * @cfg {String} dropAllowed + * The CSS class to apply to the status element when drop is allowed (defaults to "x-dd-drop-ok"). + */ + dropAllowed : "x-dd-drop-ok", + /** + * @cfg {String} dropNotAllowed + * The CSS class to apply to the status element when drop is not allowed (defaults to "x-dd-drop-nodrop"). + */ + dropNotAllowed : "x-dd-drop-nodrop", + + /** + * Updates the proxy's visual element to indicate the status of whether or not drop is allowed + * over the current target element. + * @param {String} cssClass The css class for the new drop status indicator image + */ + setStatus : function(cssClass){ + cssClass = cssClass || this.dropNotAllowed; + if(this.dropStatus != cssClass){ + this.el.replaceClass(this.dropStatus, cssClass); + this.dropStatus = cssClass; + } + }, + + /** + * Resets the status indicator to the default dropNotAllowed value + * @param {Boolean} clearGhost True to also remove all content from the ghost, false to preserve it + */ + reset : function(clearGhost){ + this.el.dom.className = "x-dd-drag-proxy " + this.dropNotAllowed; + this.dropStatus = this.dropNotAllowed; + if(clearGhost){ + this.ghost.update(""); + } + }, + + /** + * Updates the contents of the ghost element + * @param {String} html The html that will replace the current innerHTML of the ghost element + */ + update : function(html){ + if(typeof html == "string"){ + this.ghost.update(html); + }else{ + this.ghost.update(""); + html.style.margin = "0"; + this.ghost.dom.appendChild(html); + } + }, + + /** + * Returns the underlying proxy {@link Ext.Layer} + * @return {Ext.Layer} el + */ + getEl : function(){ + return this.el; + }, + + /** + * Returns the ghost element + * @return {Ext.Element} el + */ + getGhost : function(){ + return this.ghost; + }, + + /** + * Hides the proxy + * @param {Boolean} clear True to reset the status and clear the ghost contents, false to preserve them + */ + hide : function(clear){ + this.el.hide(); + if(clear){ + this.reset(true); + } + }, + + /** + * Stops the repair animation if it's currently running + */ + stop : function(){ + if(this.anim && this.anim.isAnimated && this.anim.isAnimated()){ + this.anim.stop(); + } + }, + + /** + * Displays this proxy + */ + show : function(){ + this.el.show(); + }, + + /** + * Force the Layer to sync its shadow and shim positions to the element + */ + sync : function(){ + this.el.sync(); + }, + + /** + * Causes the proxy to return to its position of origin via an animation. Should be called after an + * invalid drop operation by the item being dragged. + * @param {Array} xy The XY position of the element ([x, y]) + * @param {Function} callback The function to call after the repair is complete + * @param {Object} scope The scope in which to execute the callback + */ + repair : function(xy, callback, scope){ + this.callback = callback; + this.scope = scope; + if(xy && this.animRepair !== false){ + this.el.addClass("x-dd-drag-repair"); + this.el.hideUnders(true); + this.anim = this.el.shift({ + duration: this.repairDuration || .5, + easing: 'easeOut', + xy: xy, + stopFx: true, + callback: this.afterRepair, + scope: this + }); + }else{ + this.afterRepair(); + } + }, + + // private + afterRepair : function(){ + this.hide(true); + if(typeof this.callback == "function"){ + this.callback.call(this.scope || this); + } + this.callback == null; + this.scope == null; + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/debug.js b/www/extras/yui-ext/source/debug.js new file mode 100644 index 000000000..6339f548c --- /dev/null +++ b/www/extras/yui-ext/source/debug.js @@ -0,0 +1,733 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* + * These functions are only included in -debug files + * +*/Ext.debug = { + init : function(){ + var CP = Ext.ContentPanel; + var bd = Ext.get(document.body); + + // create the dialog + var dlg = new Ext.LayoutDialog('x-debug-browser', { + autoCreate:true, + width:800, + height:450, + title: 'Ext Debug Console & Inspector', + proxyDrag:true, + shadow:true, + center:{alwaysShowTabs:true}, + constraintoviewport:false + }); + + // prevent dialog events from bubbling + dlg.el.swallowEvent('click'); + + // build the layout + var mainLayout = dlg.getLayout(); + mainLayout.beginUpdate(); + + // create the nested layouts + var clayout = mainLayout.add('center', + new Ext.debug.InnerLayout('x-debug-console', 400, { + title: 'Debug Console' + } + )); + + var ilayout = mainLayout.add('center', + new Ext.debug.InnerLayout('x-debug-inspector', 250, { + title: 'DOM Inspector' + } + )); + + var scriptPanel = clayout.add('east', new CP({ + autoCreate:{ + tag: 'div', children: [ + {tag: 'div'}, + {tag:'textarea'} + ] + }, + fitContainer:true, + fitToFrame:true, + title:'Script Console', + autoScroll: Ext.isGecko, // hideous block for firefox missing cursor AND bad sizing textareas + setSize : function(w, h){ + Ext.ContentPanel.prototype.setSize.call(this, w, h); + if(Ext.isGecko && Ext.isStrict){ + var s = this.adjustForComponents(w, h); + this.resizeEl.setSize(s.width-2, s.height-2); + } + } + })); + var sel = scriptPanel.el; + var script = sel.child('textarea'); + scriptPanel.resizeEl = script; + var sctb = scriptPanel.toolbar = new Ext.Toolbar(sel.child('div')); + sctb.add({ + text: 'Run', + handler: function(){ + var s = script.dom.value; + if(trap.checked){ + try{ + var rt = eval(s); + Ext.debug.dump(rt === undefined? '(no return)' : rt); + }catch(e){ + Ext.debug.log(e.message || e.descript); + } + }else{ + var rt = eval(s); + Ext.debug.dump(rt === undefined? '(no return)' : rt); + } + } + }, { + text: 'Clear', + handler: function(){ + script.dom.value = ''; + script.dom.focus(); + } + }); + + var trap = Ext.DomHelper.append(sctb.el, {tag:'input', type:'checkbox', checked: 'checked'}); + trap.checked = true; + sctb.add('-', trap, 'Trap Errors'); + + + var stylesGrid = new Ext.grid.PropertyGrid(bd.createChild(), { + nameText: 'Style', + enableCtxMenu: false, + enableColumnResize: false + }); + + var stylePanel = ilayout.add('east', new Ext.GridPanel(stylesGrid, + {title: '(No element selected)'})); + + stylesGrid.render(); + + // hide the header + stylesGrid.getView().mainHd.setDisplayed(false); + + clayout.tbar.add({ + text: 'Clear', + handler: function(){ + Ext.debug.console.jsonData = []; + Ext.debug.console.refresh(); + } + }); + + var treeEl = ilayout.main.getEl(); + // create main inspector toolbar + var tb = ilayout.tbar; + + var inspectIgnore, inspecting; + + function inspectListener(e, t){ + if(!inspectIgnore.contains(e.getPoint())){ + findNode(t); + } + } + + function stopInspecting(e, t){ + if(!inspectIgnore.contains(e.getPoint())){ + inspect.toggle(false); + if(findNode(t) !== false){ + e.stopEvent(); + } + } + } + + function stopInspectingEsc(e, t){ + if(e.getKey() == e.ESC){ + inspect.toggle(false); + } + } + + var inspect = tb.addButton({ + text: 'Inspect', + enableToggle: true, + pressed:false, + toggleHandler: function(n, pressed){ + var d = Ext.get(document); + if(pressed){ + d.on('mouseover', inspectListener, window, {buffer:50}); + d.on('mousedown', stopInspecting); + d.on('keydown', stopInspectingEsc); + inspectIgnore = dlg.el.getRegion(); + inspecting = true; + }else{ + d.un('mouseover', inspectListener); + d.un('mousedown', stopInspecting); + d.on('keydown', stopInspectingEsc); + inspecting = false; + var n = tree.getSelectionModel().getSelectedNode(); + if(n && n.htmlNode){ + onNodeSelect(tree, n, false); + } + } + } + }); + + tb.addSeparator(); + + var frameEl = tb.addButton({ + text: 'Highlight Selection', + enableToggle: true, + pressed:false, + toggleHandler: function(n, pressed){ + var n = tree.getSelectionModel().getSelectedNode(); + if(n && n.htmlNode){ + n[pressed ? 'frame' : 'unframe'](); + } + } + }); + + tb.addSeparator(); + + var reload = tb.addButton({ + text: 'Refresh Children', + disabled:true, + handler: function(){ + var n = tree.getSelectionModel().getSelectedNode(); + if(n && n.reload){ + n.reload(); + } + } + }); + + tb.add( '-', { + text: 'Collapse All', + handler: function(){ + tree.root.collapse(true); + } + }); + + // perform the main layout + mainLayout.endUpdate(); + + mainLayout.getRegion('center').showPanel(0); + + stylesGrid.on('propertychange', function(s, name, value){ + var node = stylesGrid.treeNode; + if(styles){ + node.htmlNode.style[name] = value; + }else{ + node.htmlNode[name] = value; + } + node.refresh(true); + }); + + // Create the style toolbar + var stb = new Ext.Toolbar(stylesGrid.view.getHeaderPanel(true)); + + var swap = stb.addButton({ + text: 'DOM Attributes', + menu: { + items: [ + new Ext.menu.CheckItem({id:'dom', text:'DOM Attributes', checked: true, group:'xdb-styles'}), + new Ext.menu.CheckItem({id:'styles', text:'CSS Properties', group:'xdb-styles'}) + ] + } + }); + + swap.menu.on('click', function(){ + styles = swap.menu.items.get('styles').checked; + showAll[styles? 'show' : 'hide'](); + swap.setText(styles ? 'CSS Properties' : 'DOM Attributes'); + var n = tree.getSelectionModel().getSelectedNode(); + if(n){ + onNodeSelect(tree, n); + } + }); + + var addStyle = stb.addButton({ + text: 'Add', + disabled: true, + handler: function(){ + Ext.MessageBox.prompt('Add Property', 'Property Name:', function(btn, v){ + // store.store is disgusting TODO: clean up the API + var store = stylesGrid.store.store; + if(btn == 'ok' && v && !store.getById(v)){ + var r = new Ext.grid.PropertyRecord({name:v, value: ''}, v); + store.add(r); + stylesGrid.startEditing(store.getCount()-1, 1); + } + }); + } + }); + + var showAll = stb.addButton({ + text: 'Computed Styles', + hidden: true, + pressed: false, + enableToggle: true, + toggleHandler: function(){ + var n = tree.getSelectionModel().getSelectedNode(); + if(n){ + onNodeSelect(tree, n); + } + } + }); + + // tree related stuff + var styles = false, hnode; + var nonSpace = /^\s*$/; + var html = Ext.util.Format.htmlEncode; + var ellipsis = Ext.util.Format.ellipsis; + var styleRe = /\s?([a-z\-]*)\:([^;]*)(?:[;\s\n\r]*)/gi; + + function findNode(n){ + if(!n || n.nodeType != 1 || n == document.body || n == document){ + return false; + } + var pn = [n], p = n; + while((p = p.parentNode) && p.nodeType == 1 && p.tagName.toUpperCase() != 'HTML'){ + pn.unshift(p); + } + var cn = hnode; + for(var i = 0, len = pn.length; i < len; i++){ + cn.expand(); + cn = cn.findChild('htmlNode', pn[i]); + if(!cn){ // in this dialog? + return false; + } + } + cn.select(); + var a = cn.ui.anchor; + treeEl.dom.scrollTop = Math.max(0 ,a.offsetTop-10); + //treeEl.dom.scrollLeft = Math.max(0 ,a.offsetLeft-10); no likey + cn.highlight(); + return true; + } + + function nodeTitle(n){ + var s = n.tagName; + if(n.id){ + s += '#'+n.id; + }else if(n.className){ + s += '.'+n.className; + } + return s; + } + + function onNodeSelect(t, n, last){ + if(last && last.unframe){ + last.unframe(); + } + var props = {}; + if(n && n.htmlNode){ + if(frameEl.pressed){ + n.frame(); + } + if(inspecting){ + return; + } + addStyle.enable(); + reload.setDisabled(n.leaf); + var dom = n.htmlNode; + stylePanel.setTitle(nodeTitle(dom)); + if(styles && !showAll.pressed){ + var s = dom.style ? dom.style.cssText : ''; + if(s){ + var m; + while ((m = styleRe.exec(s)) != null){ + props[m[1].toLowerCase()] = m[2]; + } + } + }else if(styles){ + var cl = Ext.debug.cssList; + var s = dom.style, fly = Ext.fly(dom); + if(s){ + for(var i = 0, len = cl.length; i' + ellipsis(html(String(c.nodeValue)), 35) + '', + cls: 'x-tree-noicon' + })); + } + } + cb(); + }; + + var tree = new Ext.tree.TreePanel(treeEl, { + enableDD:false , + loader: loader, + lines:false, + rootVisible:false, + animate:false, + hlColor:'ffff9c' + }); + tree.getSelectionModel().on('selectionchange', onNodeSelect, null, {buffer:250}); + + var root = tree.setRootNode(new Ext.tree.TreeNode('Ext')); + + hnode = root.appendChild(new Ext.debug.HtmlNode( + document.getElementsByTagName('html')[0] + )); + + tree.render(); + + Ext.debug.console = new Ext.JsonView(clayout.main.getEl(), + '
          > {msg}
          '); + Ext.debug.console.jsonData = []; + + Ext.debug.dialog = dlg; + }, + + show : function(){ + var d = Ext.debug; + if(!d.dialog){ + d.init(); + } + if(!d.dialog.isVisible()){ + d.dialog.show(); + } + }, + + hide : function(){ + if(Ext.debug.dialog){ + Ext.debug.dialog.hide(); + } + }, + + /** + * Debugging function. Prints all arguments to a resizable, movable, scrolling region without + * the need to include separate js or css. Double click it to hide it. + * @param {Mixed} arg1 + * @param {Mixed} arg2 + * @param {Mixed} etc + * @method print + */ + log : function(arg1, arg2, etc){ + Ext.debug.show(); + var m = ""; + for(var i = 0, len = arguments.length; i < len; i++){ + m += (i == 0 ? "" : ", ") + arguments[i]; + } + var cn = Ext.debug.console; + cn.jsonData.unshift({msg: m}); + cn.refresh(); + }, + + /** + * Applies the passed C#/DomHelper style format (e.g. "The variable {0} is equal to {1}") before calling Ext.debug.log + * @param {String} format + * @param {Mixed} arg1 + * @param {Mixed} arg2 + * @param {Mixed} etc + * @method printf + */ + logf : function(format, arg1, arg2, etc){ + Ext.debug.log(String.format.apply(String, arguments)); + }, + + /** + * Dumps an object to Ext.debug.log + * @param {Object} o + * @method dump + */ + dump : function(o){ + if(typeof o == 'string' || typeof o == 'number' || typeof o == 'undefined' || o instanceof Date){ + Ext.debug.log(o); + }else if(!o){ + Ext.debug.log("null"); + }else if(typeof o != "object"){ + Ext.debug.log('Unknown return type'); + }else if(o instanceof Array){ + Ext.debug.log('['+o.join(',')+']'); + }else{ + var b = ["{\n"]; + for(var key in o){ + var to = typeof o[key]; + if(to != "function" && to != "object"){ + b.push(String.format(" {0}: {1},\n", key, o[key])); + } + } + var s = b.join(""); + if(s.length > 3){ + s = s.substr(0, s.length-2); + } + Ext.debug.log(s + "\n}"); + } + }, + + _timers : {}, + /** + * Starts a timer. + * @param {String} name (optional) + * @method timer + */ + time : function(name){ + name = name || "def"; + Ext._timers[name] = new Date().getTime(); + }, + + /** + * Ends a timer, returns the results (formatted "{1} ms") and optionally prints them to Ext.print() + * @param {String} name (optional) + * @param {Boolean} printResults (optional) false to stop printing the results to Ext.print + * @method timerEnd + */ + timeEnd : function(name, printResults){ + var t = new Date().getTime(); + name = name || "def"; + var v = String.format("{0} ms", t-Ext._timers[name]); + Ext._timers[name] = new Date().getTime(); + if(printResults !== false){ + Ext.debug.log('Timer ' + (name == "def" ? v : name + ": " + v)); + } + return v; + } +}; + +// highly unusual class declaration +Ext.debug.HtmlNode = function(){ + var html = Ext.util.Format.htmlEncode; + var ellipsis = Ext.util.Format.ellipsis; + var nonSpace = /^\s*$/; + + var attrs = [ + {n: 'id', v: 'id'}, + {n: 'className', v: 'class'}, + {n: 'name', v: 'name'}, + {n: 'type', v: 'type'}, + {n: 'src', v: 'src'}, + {n: 'href', v: 'href'} + ]; + + function hasChild(n){ + for(var i = 0, c; c = n.childNodes[i]; i++){ + if(c.nodeType == 1){ + return true; + } + } + return false; + } + + function renderNode(n, leaf){ + var tag = n.tagName.toLowerCase(); + var s = '<' + tag; + for(var i = 0, len = attrs.length; i < len; i++){ + var a = attrs[i]; + var v = n[a.n]; + if(v && !nonSpace.test(v)){ + s += ' ' + a.v + '="' + html(v) +'"'; + } + } + var style = n.style ? n.style.cssText : ''; + if(style){ + s += ' style="' + html(style.toLowerCase()) +'"'; + } + if(leaf && n.childNodes.length > 0){ + s+='>' + ellipsis(html(String(n.innerHTML)), 35) + '</'+tag+'>'; + }else if(leaf){ + s += ' />'; + }else{ + s += '>'; + } + return s; + } + + var HtmlNode = function(n){ + var leaf = !hasChild(n); + this.htmlNode = n; + this.tagName = n.tagName.toLowerCase(); + var attr = { + text : renderNode(n, leaf), + leaf : leaf, + cls: 'x-tree-noicon' + }; + HtmlNode.superclass.constructor.call(this, attr); + this.attributes.htmlNode = n; // for searching + if(!leaf){ + this.on('expand', this.onExpand, this); + this.on('collapse', this.onCollapse, this); + } + }; + + + Ext.extend(HtmlNode, Ext.tree.AsyncTreeNode, { + cls: 'x-tree-noicon', + preventHScroll: true, + refresh : function(highlight){ + var leaf = !hasChild(this.htmlNode); + this.setText(renderNode(this.htmlNode, leaf)); + if(highlight){ + Ext.fly(this.ui.textNode).highlight(); + } + }, + + onExpand : function(){ + if(!this.closeNode && this.parentNode){ + this.closeNode = this.parentNode.insertBefore(new Ext.tree.TreeNode({ + text:'</' + this.tagName + '>', + cls: 'x-tree-noicon' + }), this.nextSibling); + }else if(this.closeNode){ + this.closeNode.ui.show(); + } + }, + + onCollapse : function(){ + if(this.closeNode){ + this.closeNode.ui.hide(); + } + }, + + render : function(bulkRender){ + HtmlNode.superclass.render.call(this, bulkRender); + }, + + highlightNode : function(){ + //Ext.fly(this.htmlNode).highlight(); + }, + + highlight : function(){ + //Ext.fly(this.ui.textNode).highlight(); + }, + + frame : function(){ + this.htmlNode.style.border = '1px solid #0000ff'; + //this.highlightNode(); + }, + + unframe : function(){ + //Ext.fly(this.htmlNode).removeClass('x-debug-frame'); + this.htmlNode.style.border = ''; + } + }); + + return HtmlNode; +}(); + +// subclass for the standard layout panels +Ext.debug.InnerLayout = function(id, w, cfg){ + // console layout + var el = Ext.DomHelper.append(document.body, {id:id}); + var layout = new Ext.BorderLayout(el, { + north: { + initialSize:28 + }, + center: { + titlebar: false + }, + east: { + split:true, + initialSize:w, + titlebar:true + } + }); + Ext.debug.InnerLayout.superclass.constructor.call(this, layout, cfg); + + layout.beginUpdate(); + + var tbPanel = layout.add('north', new Ext.ContentPanel({ + autoCreate:true, fitToFrame:true})); + + this.main = layout.add('center', new Ext.ContentPanel({ + autoCreate:true, fitToFrame:true, autoScroll:true})); + + this.tbar = new Ext.Toolbar(tbPanel.el); + + var mtbEl = tbPanel.resizeEl = tbPanel.el.child('div.x-toolbar'); + mtbEl.setStyle('border-bottom', '0 none'); + + layout.endUpdate(true); +}; + +Ext.extend(Ext.debug.InnerLayout, Ext.NestedLayoutPanel, { + add : function(){ + return this.layout.add.apply(this.layout, arguments); + } +}); + +Ext.debug.cssList = ['background-color','border','border-color','border-spacing', +'border-style','border-top','border-right','border-bottom','border-left','border-top-color', +'border-right-color','border-bottom-color','border-left-color','border-top-width','border-right-width', +'border-bottom-width','border-left-width','border-width','bottom','color','font-size','font-size-adjust', +'font-stretch','font-style','height','left','letter-spacing','line-height','margin','margin-top', +'margin-right','margin-bottom','margin-left','marker-offset','max-height','max-width','min-height', +'min-width','orphans','outline','outline-color','outline-style','outline-width','overflow','padding', +'padding-top','padding-right','padding-bottom','padding-left','quotes','right','size','text-indent', +'top','width','word-spacing','z-index','opacity','outline-offset']; + +if(typeof console == 'undefined'){ + console = Ext.debug; +} +/* +if(Ext.isSafari || Ext.isIE || Ext.isOpera){ + window.onerror = function(msg, url, line){ + Ext.log.apply(Ext, arguments); + }; +}*/ + +// attach shortcut key +Ext.EventManager.on(window, 'load', function(){ + Ext.get(document).on('keydown', function(e){ + if(e.ctrlKey && e.shiftKey && e.getKey() == e.HOME){ + Ext.debug.show(); + } + }); +}); + +// backwards compat +Ext.print = Ext.log = Ext.debug.log; +Ext.printf = Ext.logf = Ext.debug.logf; +Ext.dump = Ext.debug.dump; +Ext.timer = Ext.debug.time; +Ext.timerEnd = Ext.debug.timeEnd; diff --git a/www/extras/yui-ext/source/ext.jsb b/www/extras/yui-ext/source/ext.jsb new file mode 100644 index 000000000..7e88bdff1 --- /dev/null +++ b/www/extras/yui-ext/source/ext.jsb @@ -0,0 +1,592 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/www/extras/yui-ext/source/legacy/Actor.js b/www/extras/yui-ext/source/legacy/Actor.js new file mode 100644 index 000000000..c075d8b91 --- /dev/null +++ b/www/extras/yui-ext/source/legacy/Actor.js @@ -0,0 +1,697 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + + +/** + * @class 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 Ext.Element}. "get" methods are not captured and execute immediately. + *

          Usage:
          + *
          
          + * var actor = new 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 Ext.Actor("myElementId", null, true); + * actor.moveTo(100, 100, true); + * actor.squish(); + * actor.play(); + *
          + * @extends Ext.Element + * @requires 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 Ext.Actor + * @constructor + * Create new Actor. + * @param {String/HTMLElement} el The dom element or element id + * @param {Ext.Animator} animator (optional) The Animator that will capture this Actor's actions + * @param {Boolean} selfCapture (optional) Whether this actor should capture its own actions to support self playback without an animator (defaults to false) + */ +Ext.Actor = function(element, animator, selfCapture){ + this.el = Ext.get(element); // cache el object for playback + Ext.Actor.superclass.constructor.call(this, this.el.dom, true); + this.onCapture = new Ext.util.Event(); + if(animator){ + /** + * The animator used to sync this actor with other actors + * @member Ext.Actor + */ + animator.addActor(this); + } + /** + * Whether this actor is currently capturing + * @member Ext.Actor + */ + this.capturing = selfCapture; + this.playlist = selfCapture ? new Ext.Animator.AnimSequence() : null; +}; + +(function(){ + +/** @ignore */ +var qa = 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 Ext.Actor.AsyncAction(this, method, args, onParam)); + }else{ + return this.capture(new Ext.Actor.Action(this, method, args)); + } + }; +}; + +/** @ignore */ +var q = function(method){ + return function(){ + if(!this.capturing){ + return method.apply(this, arguments); + } + var args = Array.prototype.slice.call(arguments, 0); + return this.capture(new Ext.Actor.Action(this, method, args)); + }; +}; + +var spr = Ext.Element.prototype; + +Ext.extend(Ext.Actor, Ext.Element, { + + /** + * Captures an action for this actor. Generally called internally but can be called directly. + * @param {Ext.Actor.Action} action + */ + capture : function(action){ + if(this.playlist != null){ + this.playlist.add(action); + } + this.onCapture.fire(this, action); + return this; + }, + // basic + setVisibilityMode : q(spr.setVisibilityMode), + enableDisplayMode : q(spr.enableDisplayMode), + focus : q(spr.focus), + addClass : q(spr.addClass), + removeClass : q(spr.removeClass), + replaceClass : q(spr.replaceClass), + setStyle : q(spr.setStyle), + setLeft : q(spr.setLeft), + setTop : q(spr.setTop), + clearPositioning : q(spr.clearPositioning), + setPositioning : q(spr.setPositioning), + clip : q(spr.clip), + unclip : q(spr.unclip), + clearOpacity : q(spr.clearOpacity), + update : q(spr.update), + remove : q(spr.remove), + fitToParent : q(spr.fitToParent), + appendChild : q(spr.appendChild), + createChild : q(spr.createChild), + appendTo : q(spr.appendTo), + insertBefore : q(spr.insertBefore), + insertAfter : q(spr.insertAfter), + wrap : q(spr.wrap), + replace : q(spr.replace), + insertHtml : q(spr.insertHtml), + set : q(spr.set), + // anims + setVisible : qa(spr.setVisible, 1, 3), + toggle : qa(spr.toggle, 0, 2), + setXY : qa(spr.setXY, 1, 3), + setLocation : qa(spr.setLocation, 2, 4), + setWidth : qa(spr.setWidth, 1, 3), + setHeight : qa(spr.setHeight, 1, 3), + setSize : qa(spr.setSize, 2, 4), + setBounds : qa(spr.setBounds, 4, 6), + setOpacity : qa(spr.setOpacity, 1, 3), + moveTo : qa(spr.moveTo, 2, 4), + move : qa(spr.move, 2, 4), + alignTo : qa(spr.alignTo, 3, 5), + hide : qa(spr.hide, 0, 2), + show : qa(spr.show, 0, 2), + setBox : qa(spr.setBox, 2, 4), + autoHeight : qa(spr.autoHeight, 0, 2), + setX : qa(spr.setX, 1, 3), + setY : qa(spr.setY, 1, 3), + + load : function(){ + if(!this.capturing){ + return spr.load.apply(this, arguments); + } + var args = Array.prototype.slice.call(arguments, 0); + return this.capture(new Ext.Actor.AsyncAction(this, spr.load, + args, 2)); + }, + + animate : function(args, duration, onComplete, easing, animType){ + if(!this.capturing){ + return spr.animate.apply(this, arguments); + } + return this.capture(new Ext.Actor.AsyncAction(this, spr.animate, + [args, duration, onComplete, easing, animType], 2)); + }, + + /** + * Start self capturing calls on this Actor. All subsequent calls are captured and executed when play() is called. + */ + startCapture : function(){ + this.capturing = true; + this.playlist = new Ext.Animator.AnimSequence(); + }, + + /** + * Stop self capturing calls on this Actor. + */ + stopCapture : function(){ + this.capturing = false; + }, + + /** + * Clears any calls that have been self captured. + */ + clear : function(){ + this.playlist = new Ext.Animator.AnimSequence(); + }, + + /** + * Starts playback of self captured calls. + * @param {Function} oncomplete (optional) Callback to execute when playback has completed + */ + play : function(oncomplete){ + this.capturing = false; + if(this.playlist){ + this.playlist.play(oncomplete); + } + }, + /** + * Stops the sequence if this actor is being used without an animator + */ + stop : function(){ + if(this.playlist.isPlaying()){ + this.playlist.stop(); + } + }, + /** + * Returns true if this actor is animated and not part of an animator + * @return {Boolean} + */ + isPlaying : function(){ + return this.playlist.isPlaying(); + }, + /** + * 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 + */ + addCall : function(fcn, args, scope){ + if(!this.capturing){ + fcn.apply(scope || this, args || []); + }else{ + this.capture(new 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 + */ + addAsyncCall : function(fcn, callbackIndex, args, scope){ + if(!this.capturing){ + fcn.apply(scope || this, args || []); + }else{ + this.capture(new Ext.Actor.AsyncAction(scope, fcn, args || [], callbackIndex)); + } + }, + + /** + * Capture a pause (in seconds). + * @param {Number} seconds The seconds to pause + */ + pause : function(seconds){ + this.capture(new Ext.Actor.PauseAction(seconds)); + }, + + /** + * Shake this element from side to side + */ + 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 + */ + 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) + */ + blindShow : function(anchor, newSize, duration, easing){ + var size = this.getSize(); + this.clip(); + anchor = anchor.toLowerCase(); + switch(anchor){ + case "t": + case "top": + this.setHeight(1); + this.setVisible(true); + this.setHeight(newSize || size.height, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut); + break; + case "l": + case "left": + this.setWidth(1); + this.setVisible(true); + this.setWidth(newSize || size.width, 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) + */ + 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: [size.width, 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, size.height]}}, + 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) + */ + slideShow : function(anchor, newSize, duration, easing, clearPositioning){ + 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.blindShow(anchor, newSize, duration, easing); + return; + } + var child = Ext.get(firstChild, true); + var pos = child.getPositioning(); + this.addCall(child.position, ["absolute"], 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 || size.height, 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 || size.width, 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 || size.width, 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 || size.height, 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) + */ + 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 = Ext.get(firstChild, true); + var pos = child.getPositioning(); + this.addCall(child.position, ["absolute"], 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) + */ + 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) + */ + appear : function(duration){ + this.setVisible(true, true, duration); + return this; + }, + + /** + * Fade an element out + * @param {Float} duration (optional) How long the effect lasts (in seconds) + */ + fade : function(duration){ + this.setVisible(false, true, duration); + return this; + }, + + /** + * Blink the element as if it was clicked and then collapse on its center + * @param {Float} duration (optional) How long the effect lasts (in seconds) + */ + switchOff : function(duration){ + this.clip(); + this.setOpacity(0.3, true, 0.1); + this.clearOpacity(); + this.setVisible(true); + this.pause(0.1); + this.animate({height:{to:1}, points:{by:[0, this.getHeight() / 2]}}, duration || 0.3, null, YAHOO.util.Easing.easeIn, YAHOO.util.Motion); + this.setVisible(false); + return this; + }, + + /** + * 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) + */ + pulsate : function(count, duration){ + count = count || 3; + for(var i = 0; i < count; i++){ + this.toggle(true, duration || .25); + this.toggle(true, duration || .25); + } + return this; + }, + + /** + * Fade the element as it is falling from its current position + * @param {Float} duration (optional) How long the effect lasts (in seconds) + */ + 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); + return this; + }, + + /** + * 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) + */ + 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]; + 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-left": + 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); + return this; + }, + + /** + * 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) + */ + 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); + return this; + }, + /** + * 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 + */ + 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", + "z-index":"35000", // yee haw + 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); + return this; + } +}); + +})(); + +Ext.Actor.Action = function(actor, method, args){ + this.actor = actor; + this.method = method; + this.args = args; + } + +Ext.Actor.Action.prototype = { + play : function(onComplete){ + this.method.apply(this.actor || window, this.args); + onComplete(); + } +}; + + +Ext.Actor.AsyncAction = function(actor, method, args, onIndex){ + Ext.Actor.AsyncAction.superclass.constructor.call(this, actor, method, args); + this.onIndex = onIndex; + this.originalCallback = this.args[onIndex]; +} +Ext.extend(Ext.Actor.AsyncAction, Ext.Actor.Action, { + play : function(onComplete){ + var callbackArg = this.originalCallback ? + this.originalCallback.createSequence(onComplete) : onComplete; + this.args[this.onIndex] = callbackArg; + this.method.apply(this.actor, this.args); + } +}); + + +Ext.Actor.PauseAction = function(seconds){ + this.seconds = seconds; +}; +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/legacy/Animator.js b/www/extras/yui-ext/source/legacy/Animator.js new file mode 100644 index 000000000..5535a8009 --- /dev/null +++ b/www/extras/yui-ext/source/legacy/Animator.js @@ -0,0 +1,483 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.Animator + * Provides support for syncing animations for multiple {@link 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 Ext.Animator();
          +var cursor = new Ext.Actor("cursor-img", animator);
          +var click = new Ext.Actor("click-img", animator);
          +var resize = new 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, Ext.get("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 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 {Ext.Animator} animator (optional) The Animator that will capture this Actor's actions + * @param {Boolean} selfCapture (optional) Whether this actor should capture its own actions to support self playback without an animator (defaults to false) + */ + Ext.Animator = function(/*Actors...*/){ + this.actors = []; + this.playlist = new 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]); + } + }; + + Ext.Animator.prototype = { + + capture : function(actor, action){ + if(this.syncing){ + if(!this.syncMap[actor.id]){ + this.syncMap[actor.id] = new 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 {Ext.Actor} actor + */ + addActor : function(actor){ + actor.onCapture.addListener(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.addListener(this.captureDelegate); + } + a.capturing = true; + } + if(clearPlaylist){ + this.playlist = new Ext.Animator.AnimSequence(); + } + }, + + /** + * Checks whether this animator is listening to a specific actor. + * @param {Ext.Actor} actor + */ + isCapturing : function(actor){ + return actor.onCapture.isListening(this.captureDelegate); + }, + + /** + * Stop capturing on all added actors. + */ + stopCapture : function(){ + for(var i = 0; i < this.actors.length; i++){ + var a = this.actors[i]; + a.onCapture.removeListener(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 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 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 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 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 Ext.Actor.PauseAction(seconds)); + } + + }; +/** + * Static function to build a AnimatorComposite from a css selector (requires Ext.Element.selectorFunction be defined) + * @param {String/Array} selector The css selector or an array of nodes to animate + * @method @static + */ +Ext.Animator.select = function(selector){ + var els; + if(typeof selector == "string"){ + els = Ext.Element.selectorFunction(selector); + }else if(selector instanceof Array){ + els = selector; + }else{ + throw "Invalid selector"; + } + return new Ext.AnimatorComposite(els); +}; +//var getActors = Ext.Animator.select; +Ext.actors = Ext.Animator.select; + +/** + * @class Ext.AnimatorComposite + * Composite class with synchronized animations. This is the class returned by getActors(selector) or Ext.Animator.select(). + */ +Ext.AnimatorComposite = function(els){ + this.animator = new Ext.Animator(); + this.addElements(els); + this.syncAnims = true; +}; +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 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++) { + 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 Ext.Animator that controls the animations for this composite. + * @return {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 Ext.Actor.prototype){ + if(typeof Ext.Actor.prototype[fnName] == "function"){ + Ext.CompositeElement.createCall(Ext.AnimatorComposite.prototype, fnName); + } +} + + +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; + }; + + 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 Ext.Actor.Action(scope, fcn, args || [])); + }, + + addAsyncCall : function(fcn, callbackIndex, args, scope){ + this.actions.push(new Ext.Actor.AsyncAction(scope, fcn, args || [], callbackIndex)); + }, + + pause : function(seconds){ + this.actions.push(new Ext.Actor.PauseAction(seconds)); + } + + }; + +Ext.Animator.CompositeSequence = function(){ + this.sequences = []; + this.completed = 0; + this.trackDelegate = this.trackCompletion.createDelegate(this); +}; + +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/legacy/InlineEditor.js b/www/extras/yui-ext/source/legacy/InlineEditor.js new file mode 100644 index 000000000..9ce0b19fc --- /dev/null +++ b/www/extras/yui-ext/source/legacy/InlineEditor.js @@ -0,0 +1,223 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.InlineEditor = function(config, existingEl){ + Ext.apply(this, config); + var dh = Ext.DomHelper; + this.wrap = dh.append(this.container || document.body, { + tag:"div", + cls:"yinline-editor-wrap" + }, true); + + this.textSizeEl = dh.append(document.body, { + tag: "div", + cls: "yinline-editor-sizer " + (this.cls || "") + }); + if(Ext.isSafari){ // extra padding for safari's textboxes + this.textSizeEl.style.padding = "4px"; + this.textSizeEl.style["padding-right"] = "10px"; + } + + if(!Ext.isGecko){ // no one else needs FireFox cursor fix + this.wrap.setStyle("overflow", "hidden"); + } + + if(existingEl){ + this.el = Ext.get(existingEl); + } + if(!this.el){ + this.id = this.id || Ext.id(); + if(!this.multiline){ + this.el = this.wrap.createChild({ + tag: "input", + name: this.name || this.id, + id: this.id, + type: this.type || "text", + autocomplete: "off", + value: this.value || "", + cls: "yinline-editor " + (this.cls || ""), + maxlength: this.maxLength || "" + }); + }else{ + this.el = this.wrap.createChild({ + tag: "textarea", + name: this.name || this.id, + id: this.id, + html: this.value || "", + cls: "yinline-editor yinline-editor-multiline " + (this.cls || ""), + wrap: "none" + }); + } + }else{ + this.wrap.dom.appendChild(this.el.dom); + } + this.el.addKeyMap([{ + key: [10, 13], + fn: this.onEnter, + scope: this + },{ + key: 27, + fn: this.onEsc, + scope: this + }]); + this.el.on("keyup", this.onKeyUp, this); + this.el.on("blur", this.onBlur, this); + this.el.swallowEvent("keydown"); + this.events = { + "startedit" : true, + "beforecomplete" : true, + "complete" : true + }; + this.editing = false; + this.autoSizeTask = new Ext.util.DelayedTask(this.autoSize, this); +}; + +Ext.extend(Ext.InlineEditor, Ext.util.Observable, { + onEnter : function(k, e){ + if(this.multiline && (e.ctrlKey || e.shiftKey)){ + return; + } + this.completeEdit(); + e.stopEvent(); + }, + + onEsc : function(){ + if(this.ignoreNoChange){ + this.revert(true); + }else{ + this.revert(false); + this.completeEdit(); + } + }, + + onBlur : function(){ + if(this.editing && this.completeOnBlur !== false){ + this.completeEdit(); + } + }, + + startEdit : function(el, value){ + this.boundEl = Ext.getDom(el); + if(this.hideEl !== false){ + this.boundEl.style.visibility = "hidden"; + } + var v = value || this.boundEl.innerHTML; + this.startValue = v; + this.setValue(v); + this.moveTo(Ext.lib.Dom.getXY(this.boundEl)); + this.editing = true; + if(Ext.QuickTips){ + Ext.QuickTips.disable(); + } + this.show.defer(10, this); + }, + + onKeyUp : function(e){ + var k = e.getKey(); + if(this.editing && (k < 33 || k > 40) && k != 27){ + this.autoSizeTask.delay(50); + } + }, + + completeEdit : function(){ + var v = this.getValue(); + if(this.revertBlank !== false && v.length < 1){ + v = this.startValue; + this.revert(); + } + if(v == this.startValue && this.ignoreNoChange){ + this.hide(); + } + if(this.fireEvent("beforecomplete", this, v, this.startValue) !== false){ + if(this.updateEl !== false && this.boundEl){ + this.boundEl.innerHTML = v; + } + this.hide(); + this.fireEvent("complete", this, v, this.startValue); + } + }, + + revert : function(hide){ + this.setValue(this.startValue); + if(hide){ + this.hide(); + } + }, + + show : function(){ + this.autoSize(); + this.wrap.show(); + this.el.focus(); + if(this.selectOnEdit !== false){ + this.el.dom.select(); + } + }, + + hide : function(){ + this.editing = false; + this.wrap.hide(); + this.wrap.setLeftTop(-10000,-10000); + this.el.blur(); + if(this.hideEl !== false){ + this.boundEl.style.visibility = "visible"; + } + if(Ext.QuickTips){ + Ext.QuickTips.enable(); + } + }, + + setValue : function(v){ + this.el.dom.value = v; + }, + + getValue : function(){ + return this.el.dom.value; + }, + + autoSize : function(){ + var el = this.el; + var wrap = this.wrap; + var v = el.dom.value; + var ts = this.textSizeEl; + if(v.length < 1){ + ts.innerHTML = "  "; + }else{ + v = v.replace(/[<> ]/g, " "); + if(this.multiline){ + v = v.replace(/\n/g, "
           "); + } + ts.innerHTML = v; + } + var ww = wrap.dom.offsetWidth; + var wh = wrap.dom.offsetHeight; + var w = ts.offsetWidth; + var h = ts.offsetHeight; + // lots of magic numbers in this block - wtf? + // the logic is to prevent the scrollbars from flashing + // in firefox. Updates the correct element first + // so there's never overflow. + if(ww > w+4){ + el.setWidth(w+4); + wrap.setWidth(w+8); + }else{ + wrap.setWidth(w+8); + el.setWidth(w+4); + } + if(wh > h+4){ + el.setHeight(h); + wrap.setHeight(h+4); + }else{ + wrap.setHeight(h+4); + el.setHeight(h); + } + }, + + moveTo : function(xy){ + this.wrap.setXY(xy); + } +}); diff --git a/www/extras/yui-ext/source/legacy/compat.js b/www/extras/yui-ext/source/legacy/compat.js new file mode 100644 index 000000000..0c7d7015d --- /dev/null +++ b/www/extras/yui-ext/source/legacy/compat.js @@ -0,0 +1,168 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + + +// backwards compat +YAHOO.ext = Ext; + +YAHOO.extendX = Ext.extend; +YAHOO.namespaceX = Ext.namespace; + +Ext.Strict = Ext.isStrict; + +Ext.util.Config = {}; +Ext.util.Config.apply = Ext.apply; + +// this is nasty +Ext.util.Browser = Ext; + +// removed +YAHOO.override = Ext.override; + + + /* + * 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; i{0} a {1} de {2} registro(s)", + emptyMsg : 'Sem registros para exibir' + }); +} + +if(Ext.form.TextField){ + Ext.apply(Ext.form.TextField.prototype, { + minLengthText : "O tamanho mnimo permitido para este campo {0}", + maxLengthText : "O tamanho mximo para este campo {0}", + blankText : "Este campo obrigatrio, favor preencher.", + regexText : "", + emptyText : null + }); +} + +if(Ext.form.NumberField){ + Ext.apply(Ext.form.NumberField.prototype, { + minText : "O valor mnimo para este campo {0}", + maxText : "O valor mximo para este campo {0}", + nanText : "{0} no um nmero vlido" + }); +} + +if(Ext.form.DateField){ + Ext.apply(Ext.form.DateField.prototype, { + disabledDaysText : "Desabilitado", + disabledDatesText : "Desabilitado", + minText : "A data deste campo deve ser posterior a {0}", + maxText : "A data deste campo deve ser anterior a {0}", + invalidText : "{0} no uma data vlida - deve ser informado no formato {1}", + format : "m/d/y" + }); +} + +if(Ext.form.ComboBox){ + Ext.apply(Ext.form.ComboBox.prototype, { + loadingText : "Carregando...", + valueNotFoundText : undefined + }); +} + +if(Ext.form.VTypes){ + Ext.apply(Ext.form.VTypes, { + emailText : 'Este campo deve ser um endereo de e-mail vlido no formado "usuario@dominio.com"', + urlText : 'Este campo deve ser uma URL no formato "http:/'+'/www.dominio.com"', + alphaText : 'Este campo deve conter apenas letras e _', + alphanumText : 'Este campo devve conter apenas letras, nmeros e _' + }); +} + +if(Ext.grid.GridView){ + Ext.apply(Ext.grid.GridView.prototype, { + sortAscText : "Ordenar Ascendente", + sortDescText : "Ordenar Descendente", + lockText : "Bloquear Coluna", + unlockText : "Desbloquear Coluna", + columnsText : "Colunas" + }); +} + +if(Ext.grid.PropertyColumnModel){ + Ext.apply(Ext.grid.PropertyColumnModel.prototype, { + nameText : "Nome", + valueText : "Valor", + dateFormat : "m/j/Y" + }); +} + +if(Ext.SplitLayoutRegion){ + Ext.apply(Ext.SplitLayoutRegion.prototype, { + splitTip : "Arraste para redimencionar.", + collapsibleSplitTip : "Arraste para redimencionar. Duplo clique para esconder." + }); +} diff --git a/www/extras/yui-ext/source/locale/ext-lang-ro.js b/www/extras/yui-ext/source/locale/ext-lang-ro.js new file mode 100644 index 000000000..fef4b9647 --- /dev/null +++ b/www/extras/yui-ext/source/locale/ext-lang-ro.js @@ -0,0 +1,177 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * Translation by Lucian Lature 04-24-2007 + * Romanian Translations + */ + +Ext.UpdateManager.defaults.indicatorText = '
          Încărcare...
          '; + +if(Ext.View){ + Ext.View.prototype.emptyText = ""; +} + +if(Ext.grid.Grid){ + Ext.grid.Grid.prototype.ddText = "{0} rând(uri) selectate"; +} + +if(Ext.TabPanelItem){ + Ext.TabPanelItem.prototype.closeText = "Închide acest tab"; +} + +if(Ext.form.Field){ + Ext.form.Field.prototype.invalidText = "Valoarea acestui câmp este invalidă"; +} + +if(Ext.LoadMask){ + Ext.LoadMask.prototype.msg = "Încărcare..."; +} + +Date.monthNames = [ + "Ianuarie", + "Februarie", + "Martie", + "Aprilie", + "Mai", + "Iunie", + "Iulie", + "August", + "Septembrie", + "Octombrie", + "Noiembrie", + "Decembrie" +]; + +Date.dayNames = [ + "Duminică", + "Luni", + "Marţi", + "Miercuri", + "Joi", + "Vineri", + "Sâmbătă" +]; + +if(Ext.MessageBox){ + Ext.MessageBox.buttonText = { + ok : "OK", + cancel : "Renunţă", + yes : "Da", + no : "Nu" + }; +} + +if(Ext.util.Format){ + Ext.util.Format.date = function(v, format){ + if(!v) return ""; + if(!(v instanceof Date)) v = new Date(Date.parse(v)); + return v.dateFormat(format || "d-m-Y"); + }; +} + +if(Ext.DatePicker){ + Ext.apply(Ext.DatePicker.prototype, { + todayText : "Astăzi", + minText : "Această zi este înaintea datei de început", + maxText : "Această zi este după ultimul termen", + disabledDaysText : "", + disabledDatesText : "", + monthNames : Date.monthNames, + dayNames : Date.dayNames, + nextText : 'Următoarea lună (Control+Right)', + prevText : 'Luna anterioară (Control+Left)', + monthYearText : 'Alege o lună (Control+Up/Down pentru a parcurge anii)', + todayTip : "{0} (Spacebar)", + format : "d-m-y" + }); +} + +if(Ext.PagingToolbar){ + Ext.apply(Ext.PagingToolbar.prototype, { + beforePageText : "Pagina", + afterPageText : "din {0}", + firstText : "Prima pagină", + prevText : "Pagina precedentă", + nextText : "Următoarea pagină", + lastText : "Ultima pagină", + refreshText : "Reîmprospătare", + displayMsg : "Afişează {0} - {1} din {2}", + emptyMsg : 'Nu sunt date de afişat' + }); +} + +if(Ext.form.TextField){ + Ext.apply(Ext.form.TextField.prototype, { + minLengthText : "Lungimea minimă pentru acest câmp este de {0}", + maxLengthText : "Lungimea maximă pentru acest câmp este {0}", + blankText : "Acest câmp este obligatoriu", + regexText : "", + emptyText : null + }); +} + +if(Ext.form.NumberField){ + Ext.apply(Ext.form.NumberField.prototype, { + minText : "Valoarea minimă permisă a acestui câmp este {0}", + maxText : "Valaorea maximă permisă a acestui câmp este {0}", + nanText : "{0} nu este un număr valid" + }); +} + +if(Ext.form.DateField){ + Ext.apply(Ext.form.DateField.prototype, { + disabledDaysText : "Inactiv", + disabledDatesText : "Inactiv", + minText : "Data acestui câmp trebuie să fie după {0}", + maxText : "Data acestui câmp trebuie sa fie înainte de {0}", + invalidText : "{0} nu este o dată validă - trebuie să fie în formatul {1}", + format : "d-m-y" + }); +} + +if(Ext.form.ComboBox){ + Ext.apply(Ext.form.ComboBox.prototype, { + loadingText : "Încărcare...", + valueNotFoundText : undefined + }); +} + +if(Ext.form.VTypes){ + Ext.apply(Ext.form.VTypes, { + emailText : 'Acest câmp trebuie să conţină o adresă de e-mail în formatul "user@domain.com"', + urlText : 'Acest câmp trebuie să conţină o adresă URL în formatul "http:/'+'/www.domain.com"', + alphaText : 'Acest câmp trebuie să conţină doar litere şi _', + alphanumText : 'Acest câmp trebuie să conţină doar litere, cifre şi _' + }); +} + +if(Ext.grid.GridView){ + Ext.apply(Ext.grid.GridView.prototype, { + sortAscText : "Sortare ascendentă", + sortDescText : "Sortare descendentă", + lockText : "Blochează coloana", + unlockText : "Deblochează coloana", + columnsText : "Coloane" + }); +} + +if(Ext.grid.PropertyColumnModel){ + Ext.apply(Ext.grid.PropertyColumnModel.prototype, { + nameText : "Nume", + valueText : "Valoare", + dateFormat : "m/j/Y" + }); +} + +if(Ext.SplitLayoutRegion){ + Ext.apply(Ext.SplitLayoutRegion.prototype, { + splitTip : "Trage pentru redimensionare.", + collapsibleSplitTip : "Trage pentru redimensionare. Dublu-click pentru ascundere." + }); +} \ No newline at end of file diff --git a/www/extras/yui-ext/source/locale/ext-lang-ru.js b/www/extras/yui-ext/source/locale/ext-lang-ru.js new file mode 100644 index 000000000..8d5da9c77 --- /dev/null +++ b/www/extras/yui-ext/source/locale/ext-lang-ru.js @@ -0,0 +1,175 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* + * Russian translation + * By Arikon (utf-8 encoding) + * 08 April 2007 + */ + +Ext.UpdateManager.defaults.indicatorText = '
          Идет загрузка...
          '; + +if(Ext.View){ + Ext.View.prototype.emptyText = ""; +} + +if(Ext.grid.Grid){ + Ext.grid.Grid.prototype.ddText = "{0} выбранных Ñтрок"; +} + +if(Ext.TabPanelItem){ + Ext.TabPanelItem.prototype.closeText = "Закрыть Ñту вкладку"; +} + +if(Ext.form.Field){ + Ext.form.Field.prototype.invalidText = "Значение в Ñтом поле неверное"; +} + +Date.monthNames = [ + "Январь", + "Февраль", + "Март", + "Ðпрель", + "Май", + "Июнь", + "Июль", + "ÐвгуÑÑ‚", + "СентÑбрь", + "ОктÑбрь", + "ÐоÑбрь", + "Декабрь" +]; + +Date.dayNames = [ + "ВоÑкреÑенье", + "Понедельник", + "Вторник", + "Среда", + "Четверг", + "ПÑтница", + "Суббота" +]; + +if(Ext.MessageBox){ + Ext.MessageBox.buttonText = { + ok : "OK", + cancel : "Отмена", + yes : "Да", + no : "Ðет" + }; +} + +if(Ext.util.Format){ + Ext.util.Format.date = function(v, format){ + if(!v) return ""; + if(!(v instanceof Date)) v = new Date(Date.parse(v)); + return v.dateFormat(format || "d.m.Y"); + }; +} + +if(Ext.DatePicker){ + Ext.apply(Ext.DatePicker.prototype, { + todayText : "СегоднÑ", + minText : "Эта дата раньше минимальной даты", + maxText : "Эта дата позже макÑимальной даты", + disabledDaysText : "", + disabledDatesText : "", + monthNames : Date.monthNames, + dayNames : Date.dayNames, + nextText : 'Следующий меÑÑц (Control+Вправо)', + prevText : 'Предыдущий меÑÑц (Control+Влево)', + monthYearText : 'Выбор меÑÑца (Control+Вверх/Вниз Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° года)', + todayTip : "{0} (Пробел)", + format : "d.m.y", + startDay : 1 + }); +} + +if(Ext.PagingToolbar){ + Ext.apply(Ext.PagingToolbar.prototype, { + beforePageText : "Страница", + afterPageText : "из {0}", + firstText : "ÐŸÐµÑ€Ð²Ð°Ñ Ñтраница", + prevText : "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ñтраница", + nextText : "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтраница", + lastText : "ПоÑледнÑÑ Ñтраница", + refreshText : "Обновить", + displayMsg : "ОтображаютÑÑ Ð·Ð°Ð¿Ð¸Ñи Ñ {0} по {1}, вÑего {2}", + emptyMsg : 'Ðет данных Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ' + }); +} + +if(Ext.form.TextField){ + Ext.apply(Ext.form.TextField.prototype, { + minLengthText : "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Ñтого Ð¿Ð¾Ð»Ñ {0}", + maxLengthText : "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Ñтого Ð¿Ð¾Ð»Ñ {0}", + blankText : "Это поле обÑзательно Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ", + regexText : "", + emptyText : null + }); +} + +if(Ext.form.NumberField){ + Ext.apply(Ext.form.NumberField.prototype, { + minText : "Значение Ñтого Ð¿Ð¾Ð»Ñ Ð½Ðµ может быть меньше {0}", + maxText : "Значение Ñтого Ð¿Ð¾Ð»Ñ Ð½Ðµ может быть больше {0}", + nanText : "{0} не ÑвлÑетÑÑ Ñ‡Ð¸Ñлом" + }); +} + +if(Ext.form.DateField){ + Ext.apply(Ext.form.DateField.prototype, { + disabledDaysText : "Ðе доÑтупно", + disabledDatesText : "Ðе доÑтупно", + minText : "Дата в Ñтом поле должна быть позде {0}", + maxText : "Дата в Ñтом поле должна быть раньше {0}", + invalidText : "{0} не ÑвлÑетÑÑ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾Ð¹ датой - дата должна быть указана в формате {1}", + format : "d.m.y" + }); +} + +if(Ext.form.ComboBox){ + Ext.apply(Ext.form.ComboBox.prototype, { + loadingText : "Загрузка...", + valueNotFoundText : undefined + }); +} + +if(Ext.form.VTypes){ + Ext.apply(Ext.form.VTypes, { + emailText : 'Это поле должно Ñодержать Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в формате "user@domain.com"', + urlText : 'Это поле должно Ñодержать URL в формате "http:/'+'/www.domain.com"', + alphaText : 'Это поле должно Ñодержать только латинÑкие буквы и Ñимвол Ð¿Ð¾Ð´Ñ‡ÐµÑ€ÐºÐ¸Ð²Ð°Ð½Ð¸Ñ "_"', + alphanumText : 'Это поле должно Ñодержать только латинÑкие буквы, цифры и Ñимвол Ð¿Ð¾Ð´Ñ‡ÐµÑ€ÐºÐ¸Ð²Ð°Ð½Ð¸Ñ "_"' + }); +} + +if(Ext.grid.GridView){ + Ext.apply(Ext.grid.GridView.prototype, { + sortAscText : "Сортировать по возраÑтанию", + sortDescText : "Сортировать по убыванию", + lockText : "Закрепить Ñтолбец", + unlockText : "СнÑть закрепление Ñтолбца", + columnsText : "Столбцы" + }); +} + +if(Ext.grid.PropertyColumnModel){ + Ext.apply(Ext.grid.PropertyColumnModel.prototype, { + nameText : "Ðазвание", + valueText : "Значение", + dateFormat : "j.m.Y" + }); +} + +if(Ext.SplitLayoutRegion){ + Ext.apply(Ext.SplitLayoutRegion.prototype, { + splitTip : "ТÑните Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð°.", + collapsibleSplitTip : "ТÑните Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð°. Двойной щелчок ÑпрÑчет панель." + }); +} diff --git a/www/extras/yui-ext/source/locale/ext-lang-sk.js b/www/extras/yui-ext/source/locale/ext-lang-sk.js new file mode 100644 index 000000000..0dc482744 --- /dev/null +++ b/www/extras/yui-ext/source/locale/ext-lang-sk.js @@ -0,0 +1,180 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * List compiled by mystix on the extjs.com forums. + * Thank you Mystix! + */ + + /* Translation to Slovak by Michal Thomka + * 14 April 2007 + */ + +Ext.UpdateManager.defaults.indicatorText = '
          Nahrvam...
          '; + +if(Ext.View){ + Ext.View.prototype.emptyText = ""; +} + +if(Ext.grid.Grid){ + Ext.grid.Grid.prototype.ddText = "{0} oznaench riadkov"; +} + +if(Ext.TabPanelItem){ + Ext.TabPanelItem.prototype.closeText = "Zavrie tto zloku"; +} + +if(Ext.form.Field){ + Ext.form.Field.prototype.invalidText = "Hodnota v tomto poli je nesprvna"; +} + +Date.monthNames = [ + "Janur", + "Februr", + "Marec", + "Aprl", + "Mj", + "Jn", + "Jl", + "August", + "September", + "Oktber", + "November", + "December" +]; + +Date.dayNames = [ + "Nedea", + "Pondelok", + "Utorok", + "Streda", + "tvrtok", + "Piatok", + "Sobota" +]; + +if(Ext.MessageBox){ + Ext.MessageBox.buttonText = { + ok : "OK", + cancel : "Zrui", + yes : "no", + no : "Nie" + }; +} + +if(Ext.util.Format){ + Ext.util.Format.date = function(v, format){ + if(!v) return ""; + if(!(v instanceof Date)) v = new Date(Date.parse(v)); + return v.dateFormat(format || "m/d/R"); + }; +} + + +if(Ext.DatePicker){ + Ext.apply(Ext.DatePicker.prototype, { + todayText : "Dnes", + minText : "Tento dtum je men ako minimlny mon dtum", + maxText : "Tento dtum je v ako maximlny mon dtum", + disabledDaysText : "", + disabledDatesText : "", + monthNames : Date.monthNames, + dayNames : Date.dayNames, + nextText : 'al Mesiac (Control+Doprava)', + prevText : 'Predch. Mesiac (Control+Doava)', + monthYearText : 'Vyberte Mesiac (Control+Hore/Dole pre posun rokov)', + todayTip : "{0} (Medzernk)", + format : "m/d/r" + }); +} + + +if(Ext.PagingToolbar){ + Ext.apply(Ext.PagingToolbar.prototype, { + beforePageText : "Strana", + afterPageText : "z {0}", + firstText : "Prv Strana", + prevText : "Predch. Strana", + nextText : "alia Strana", + lastText : "Posledn strana", + refreshText : "Obnovi", + displayMsg : "Zobrazujem {0} - {1} z {2}", + emptyMsg : 'iadne dta' + }); +} + + +if(Ext.form.TextField){ + Ext.apply(Ext.form.TextField.prototype, { + minLengthText : "Minimlna dka pre toto pole je {0}", + maxLengthText : "Maximlna dka pre toto pole je {0}", + blankText : "Toto pole je povinn", + regexText : "", + emptyText : null + }); +} + +if(Ext.form.NumberField){ + Ext.apply(Ext.form.NumberField.prototype, { + minText : "Minimlna hodnota pre toto pole je {0}", + maxText : "Maximlna hodnota pre toto pole je {0}", + nanText : "{0} je nesprvne slo" + }); +} + +if(Ext.form.DateField){ + Ext.apply(Ext.form.DateField.prototype, { + disabledDaysText : "Zablokovan", + disabledDatesText : "Zablokovan", + minText : "Dtum v tomto poli mus by a po {0}", + maxText : "Dtum v tomto poli mus by pred {0}", + invalidText : "{0} nie je sprvny dtum - mus by vo formte {1}", + format : "m/d/r" + }); +} + +if(Ext.form.ComboBox){ + Ext.apply(Ext.form.ComboBox.prototype, { + loadingText : "Nahrvam...", + valueNotFoundText : undefined + }); +} + +if(Ext.form.VTypes){ + Ext.apply(Ext.form.VTypes, { + emailText : 'Toto pole mus by e-mailov adresa vo formte "user@domain.com"', + urlText : 'Toto pole mus by URL vo formte "http:/'+'/www.domain.com"', + alphaText : 'Toto poe moe obsahova iba psmen a znak _', + alphanumText : 'Toto poe moe obsahova iba psmen,sla a znak _' + }); +} + +if(Ext.grid.GridView){ + Ext.apply(Ext.grid.GridView.prototype, { + sortAscText : "Zoradi vzostupne", + sortDescText : "Zoradi zostupne", + lockText : "Zamkn stpec", + unlockText : "Odomkn stpec", + columnsText : "Stpce" + }); +} + +if(Ext.grid.PropertyColumnModel){ + Ext.apply(Ext.grid.PropertyColumnModel.prototype, { + nameText : "Nzov", + valueText : "Hodnota", + dateFormat : "m/j/Y" + }); +} + +if(Ext.SplitLayoutRegion){ + Ext.apply(Ext.SplitLayoutRegion.prototype, { + splitTip : "Potiahnite pre zmenu rozmeru", + collapsibleSplitTip : "Potiahnite pre zmenu rozmeru. Dvojklikom schovte." + }); +} diff --git a/www/extras/yui-ext/source/locale/ext-lang-sp.js b/www/extras/yui-ext/source/locale/ext-lang-sp.js new file mode 100644 index 000000000..f7ebfcba4 --- /dev/null +++ b/www/extras/yui-ext/source/locale/ext-lang-sp.js @@ -0,0 +1,173 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* + * Español/Latinoamerica Translation by genius551v 04-08-2007 + * Revised by efege, 2007-04-15. + */ + +Ext.UpdateManager.defaults.indicatorText = '
          Cargando...
          '; + +if(Ext.View){ + Ext.View.prototype.emptyText = ""; +} + +if(Ext.grid.Grid){ + Ext.grid.Grid.prototype.ddText = "{0} fila(s) seleccionada(s)"; +} + +if(Ext.TabPanelItem){ + Ext.TabPanelItem.prototype.closeText = "Cerrar esta pestaña"; +} + +if(Ext.form.Field){ + Ext.form.Field.prototype.invalidText = "El valor en este campo es inválido"; +} + +Date.monthNames = [ + "Enero", + "Febrero", + "Marzo", + "Abril", + "Mayo", + "Junio", + "Julio", + "Agosto", + "Septiembre", + "Octubre", + "Noviembre", + "Diciembre" +]; + +Date.dayNames = [ + "Domingo", + "Lunes", + "Martes", + "Miércoles", + "Jueves", + "Viernes", + "Sábado" +]; + +if(Ext.MessageBox){ + Ext.MessageBox.buttonText = { + ok : "Aceptar", + cancel : "Cancelar", + yes : "Sí", + no : "No" + }; +} + +if(Ext.util.Format){ + Ext.util.Format.date = function(v, format){ + if(!v) return ""; + if(!(v instanceof Date)) v = new Date(Date.parse(v)); + return v.dateFormat(format || "d/m/Y"); + }; +} + +if(Ext.DatePicker){ + Ext.apply(Ext.DatePicker.prototype, { + todayText : "Hoy", + minText : "Esta fecha es anterior a la fecha mínima", + maxText : "Esta fecha es posterior a la fecha máxima", + disabledDaysText : "", + disabledDatesText : "", + monthNames : Date.monthNames, + dayNames : Date.dayNames, + nextText : 'Mes Siguiente (Control+Right)', + prevText : 'Mes Anterior (Control+Left)', + monthYearText : 'Seleccione un mes (Control+Up/Down para desplazar el año)', + todayTip : "{0} (Barra espaciadora)", + format : "d/m/Y" + }); +} + +if(Ext.PagingToolbar){ + Ext.apply(Ext.PagingToolbar.prototype, { + beforePageText : "Página", + afterPageText : "de {0}", + firstText : "Primera página", + prevText : "Página anterior", + nextText : "Página siguiente", + lastText : "Última página", + refreshText : "Actualizar", + displayMsg : "Mostrando {0} - {1} de {2}", + emptyMsg : 'Sin datos para mostrar' + }); +} + +if(Ext.form.TextField){ + Ext.apply(Ext.form.TextField.prototype, { + minLengthText : "El tamaño mínimo para este campo es de {0}", + maxLengthText : "El tamaño máximo para este campo es de {0}", + blankText : "Este campo es obligatorio", + regexText : "", + emptyText : null + }); +} + +if(Ext.form.NumberField){ + Ext.apply(Ext.form.NumberField.prototype, { + minText : "El valor mínimo para este campo es de {0}", + maxText : "El valor máximo para este campo es de {0}", + nanText : "{0} no es un número válido" + }); +} + +if(Ext.form.DateField){ + Ext.apply(Ext.form.DateField.prototype, { + disabledDaysText : "Deshabilitado", + disabledDatesText : "Deshabilitado", + minText : "La fecha para este campo debe ser posterior a {0}", + maxText : "La fecha para este campo debe ser anterior a {0}", + invalidText : "{0} no es una fecha válida - debe tener el formato {1}", + format : "d/m/Y" + }); +} + +if(Ext.form.ComboBox){ + Ext.apply(Ext.form.ComboBox.prototype, { + loadingText : "Cargando...", + valueNotFoundText : undefined + }); +} + +if(Ext.form.VTypes){ + Ext.apply(Ext.form.VTypes, { + emailText : 'Este campo debe ser una dirección de correo electrónico con el formato "usuario@dominio.com"', + urlText : 'Este campo debe ser una URL con el formato "http:/'+'/www.dominio.com"', + alphaText : 'Este campo solo debe contener letras y _', + alphanumText : 'Este campo solo debe contener letras, números y _' + }); +} + +if(Ext.grid.GridView){ + Ext.apply(Ext.grid.GridView.prototype, { + sortAscText : "Ordenar en forma ascendente", + sortDescText : "Ordenar en forma descendente", + lockText : "Bloquear Columna", + unlockText : "Desbloquear Columna", + columnsText : "Columnas" + }); +} + +if(Ext.grid.PropertyColumnModel){ + Ext.apply(Ext.grid.PropertyColumnModel.prototype, { + nameText : "Nombre", + valueText : "Valor", + dateFormat : "j/m/Y" + }); +} + +if(Ext.SplitLayoutRegion){ + Ext.apply(Ext.SplitLayoutRegion.prototype, { + splitTip : "Arrastre para redimensionar.", + collapsibleSplitTip : "Arrastre para redimensionar. Doble clic para ocultar." + }); +} diff --git a/www/extras/yui-ext/source/locale/ext-lang-sv_se.js b/www/extras/yui-ext/source/locale/ext-lang-sv_se.js new file mode 100644 index 000000000..6b35c5635 --- /dev/null +++ b/www/extras/yui-ext/source/locale/ext-lang-sv_se.js @@ -0,0 +1,179 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * Swedish translation (utf8-encoding) + * By Erik Andersson, Monator Technologies + * 24 April 2007 + */ + +Ext.UpdateManager.defaults.indicatorText = '
          Laddar...
          '; + +if(Ext.View){ + Ext.View.prototype.emptyText = ""; +} + +if(Ext.grid.Grid){ + Ext.grid.Grid.prototype.ddText = "{0} markerade rad(er)"; +} + +if(Ext.TabPanelItem){ + Ext.TabPanelItem.prototype.closeText = "Stäng denna tabb"; +} + +if(Ext.form.Field){ + Ext.form.Field.prototype.invalidText = "Värdet i detta fält är icke tillåtet"; +} + +if(Ext.LoadMask){ + Ext.LoadMask.prototype.msg = "Laddar..."; +} + +Date.monthNames = [ + "Januari", + "Februari", + "Mars", + "April", + "Maj", + "Juni", + "Juli", + "Augusti", + "September", + "Oktober", + "November", + "December" +]; + +Date.dayNames = [ + "Söndag", + "Måndag", + "Tisdag", + "Onsdag", + "Torsdag", + "Fredag", + "Lördag" +]; + +if(Ext.MessageBox){ + Ext.MessageBox.buttonText = { + ok : "OK", + cancel : "Avbryt", + yes : "Ja", + no : "Nej" + }; +} + +if(Ext.util.Format){ + Ext.util.Format.date = function(v, format){ + if(!v) return ""; + if(!(v instanceof Date)) v = new Date(Date.parse(v)); + return v.dateFormat(format || "Y/m/d"); + }; +} + +if(Ext.DatePicker){ + Ext.apply(Ext.DatePicker.prototype, { + todayText : "Idag", + minText : "Detta datum är före det tidigast tillåtna", + maxText : "Detta datum är efter det senast tillåtna", + disabledDaysText : "", + disabledDatesText : "", + monthNames : Date.monthNames, + dayNames : Date.dayNames, + nextText : 'Nästa Månad (Ctrl + höger piltangent)', + prevText : 'Föregående Månad (Ctrl + vänster piltangent)', + monthYearText : 'Välj en månad (Ctrl + Uppåt/Neråt pil för att ändra årtal)', + todayTip : "{0} (Mellanslag)", + format : "y/m/d", + startDay : 1 + }); +} + +if(Ext.PagingToolbar){ + Ext.apply(Ext.PagingToolbar.prototype, { + beforePageText : "Sida", + afterPageText : "av {0}", + firstText : "Första sidan", + prevText : "Föregående sida", + nextText : "Nästa sida", + lastText : "Sista sidan", + refreshText : "Uppdatera", + displayMsg : "Visar {0} - {1} av {2}", + emptyMsg : 'Det finns ingen data att visa' + }); +} + +if(Ext.form.TextField){ + Ext.apply(Ext.form.TextField.prototype, { + minLengthText : "Minsta tillåtna längden för detta fält är {0}", + maxLengthText : "Största tillåtna längden för detta fält är {0}", + blankText : "Detta fält är obligatoriskt", + regexText : "", + emptyText : null + }); +} + +if(Ext.form.NumberField){ + Ext.apply(Ext.form.NumberField.prototype, { + minText : "Minsta tillåtna värdet för detta fält är {0}", + maxText : "Största tillåtna värdet för detta fält är {0}", + nanText : "{0} är inte ett tillåtet nummer" + }); +} + +if(Ext.form.DateField){ + Ext.apply(Ext.form.DateField.prototype, { + disabledDaysText : "Inaktiverad", + disabledDatesText : "Inaktiverad", + minText : "Datumet i detta fält måste vara efter {0}", + maxText : "Datumet i detta fält måste vara före {0}", + invalidText : "{0} är inte ett tillåtet datum - datum skall anges på formatet {1}", + format : "y/m/d" + }); +} + +if(Ext.form.ComboBox){ + Ext.apply(Ext.form.ComboBox.prototype, { + loadingText : "Laddar...", + valueNotFoundText : undefined + }); +} + +if(Ext.form.VTypes){ + Ext.apply(Ext.form.VTypes, { + emailText : 'Detta fält skall vara en e-post adress på formatet "user@domain.com"', + urlText : 'Detta fält skall vara en länk (URL) på formatet "http:/'+'/www.domain.com"', + alphaText : 'Detta fält får bara innehålla bokstäver och "_"', + alphanumText : 'Detta fält får bara innehålla bokstäver, nummer och "_"' + }); +} + +if(Ext.grid.GridView){ + Ext.apply(Ext.grid.GridView.prototype, { + sortAscText : "Sortera stigande", + sortDescText : "Sortera fallande", + lockText : "Lås kolumn", + unlockText : "Lås upp kolumn", + columnsText : "Kolumner" + }); +} + +if(Ext.grid.PropertyColumnModel){ + Ext.apply(Ext.grid.PropertyColumnModel.prototype, { + nameText : "Namn", + valueText : "Värde", + dateFormat : "Y/m/d" + }); +} + +if(Ext.SplitLayoutRegion){ + Ext.apply(Ext.SplitLayoutRegion.prototype, { + splitTip : "Drag för att ändra storleken.", + collapsibleSplitTip : "Drag för att ändra storleken. Dubbelklicka för att gömma." + }); +} \ No newline at end of file diff --git a/www/extras/yui-ext/source/locale/ext-lang-tr.js b/www/extras/yui-ext/source/locale/ext-lang-tr.js new file mode 100644 index 000000000..b335c8945 --- /dev/null +++ b/www/extras/yui-ext/source/locale/ext-lang-tr.js @@ -0,0 +1,179 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * List compiled by mystix on the extjs.com forums. + * Thank you Mystix! + */ + +/** + * Turkish translation by Hüseyin Tüfekçilerli + * 04-11-2007, 09:52 AM + */ + +Ext.UpdateManager.defaults.indicatorText = '
          Yükleniyor...
          '; + +if(Ext.View){ + Ext.View.prototype.emptyText = ""; +} + +if(Ext.grid.Grid){ + Ext.grid.Grid.prototype.ddText = "{0} seçili satır"; +} + +if(Ext.TabPanelItem){ + Ext.TabPanelItem.prototype.closeText = "Bu sekmeyi kapat"; +} + +if(Ext.form.Field){ + Ext.form.Field.prototype.invalidText = "Bu alandaki değer geçersiz"; +} + +Date.monthNames = [ + "Ocak", + "Şubat", + "Mart", + "Nisan", + "Mayıs", + "Haziran", + "Temmuz", + "Ağustos", + "Eylül", + "Ekim", + "Kasım", + "Aralık" +]; + +Date.dayNames = [ + "Pazar", + "Pazartesi", + "Salı", + "Çarşamba", + "Perşembe", + "Cuma", + "Cumartesi" +]; + +if(Ext.MessageBox){ + Ext.MessageBox.buttonText = { + ok : "Tamam", + cancel : "İptal", + yes : "Evet", + no : "Hayır" + }; +} + +if(Ext.util.Format){ + Ext.util.Format.date = function(v, format){ + if(!v) return ""; + if(!(v instanceof Date)) v = new Date(Date.parse(v)); + return v.dateFormat(format || "d/m/Y"); + }; +} + +if(Ext.DatePicker){ + Ext.apply(Ext.DatePicker.prototype, { + todayText : "Bugün", + minText : "Bu tarih minimum tarihten önce", + maxText : "Bu tarih maximum tarihten sonra", + disabledDaysText : "", + disabledDatesText : "", + monthNames : Date.monthNames, + dayNames : Date.dayNames, + nextText : 'Sonraki Ay (Ctrl+Sağ)', + prevText : 'Önceki Ay (Ctrl+Sol)', + monthYearText : 'Bir ay seçin (Yılları değiştirmek için Ctrl+Yukarı/Aşağı)', + todayTip : "{0} (Boşluk)", + format : "d/m/y", + startDay : 1 + }); +} + +if(Ext.PagingToolbar){ + Ext.apply(Ext.PagingToolbar.prototype, { + beforePageText : "Sayfa", + afterPageText : " / {0}", + firstText : "İlk Sayfa", + prevText : "Önceki Sayfa", + nextText : "Sonraki Sayfa", + lastText : "Son Sayfa", + refreshText : "Yenile", + displayMsg : "{2} satırdan {0} - {1} arası gösteriliyor", + emptyMsg : 'Gösterilecek veri yok' + }); +} + +if(Ext.form.TextField){ + Ext.apply(Ext.form.TextField.prototype, { + minLengthText : "Bu alan için minimum uzunluk {0}", + maxLengthText : "Bu alan için maximum uzunluk {0}", + blankText : "Bu alan gerekli", + regexText : "", + emptyText : null + }); +} + +if(Ext.form.NumberField){ + Ext.apply(Ext.form.NumberField.prototype, { + minText : "Bu alan için minimum değer {0}", + maxText : "Bu alan için maximum değer {0}", + nanText : "{0} geçerli bir sayı değil" + }); +} + +if(Ext.form.DateField){ + Ext.apply(Ext.form.DateField.prototype, { + disabledDaysText : "Pasif", + disabledDatesText : "Pasif", + minText : "Bu alana {0} tarihinden sonraki bir tarih girilmeli", + maxText : "Bu alana {0} tarihinden önceki bir tarih girilmeli", + invalidText : "{0} geçerli bir tarih değil - şu formatta olmalı {1}", + format : "d/m/y" + }); +} + +if(Ext.form.ComboBox){ + Ext.apply(Ext.form.ComboBox.prototype, { + loadingText : "Yükleniyor...", + valueNotFoundText : undefined + }); +} + +if(Ext.form.VTypes){ + Ext.apply(Ext.form.VTypes, { + emailText : 'Bu alan bir e-mail adresi formatında olmalı "kullanici@alanadi.com"', + urlText : 'Bu alan bir URL formatında olmalı "http:/'+'/www.alanadi.com"', + alphaText : 'Bu alan sadece harf ve _ içermeli', + alphanumText : 'Bu alan sadece harf, sayı ve _ içermeli' + }); +} + +if(Ext.grid.GridView){ + Ext.apply(Ext.grid.GridView.prototype, { + sortAscText : "Artarak Sırala", + sortDescText : "Azalarak Sırala", + lockText : "Sütünu Kilitle", + unlockText : "Sütunun Kilidini Kaldır", + columnsText : "Sütunlar" + }); +} + +if(Ext.grid.PropertyColumnModel){ + Ext.apply(Ext.grid.PropertyColumnModel.prototype, { + nameText : "İsim", + valueText : "Değer", + dateFormat : "j/m/Y" + }); +} + +if(Ext.SplitLayoutRegion){ + Ext.apply(Ext.SplitLayoutRegion.prototype, { + splitTip : "Boyutlandırmak için sürükleyin.", + collapsibleSplitTip : "Boyutlandırmak için sürükleyin. Gizlemek için çift tıklayın." + }); +} \ No newline at end of file diff --git a/www/extras/yui-ext/source/locale/ext-lang-vn.js b/www/extras/yui-ext/source/locale/ext-lang-vn.js new file mode 100644 index 000000000..66ddddda2 --- /dev/null +++ b/www/extras/yui-ext/source/locale/ext-lang-vn.js @@ -0,0 +1,179 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * List compiled by mystix on the extjs.com forums. + * Thank you Mystix! + */ + +/** + * Vietnamese translation + * By bpmtri + * 12-April-2007 04:06PM + */ + +Ext.UpdateManager.defaults.indicatorText = '
          Äang tải...
          '; + +if(Ext.View){ + Ext.View.prototype.emptyText = ""; +} + +if(Ext.grid.Grid){ + Ext.grid.Grid.prototype.ddText = "{0} dòng được chá»n"; +} + +if(Ext.TabPanelItem){ + Ext.TabPanelItem.prototype.closeText = "Äóng thẻ này"; +} + +if(Ext.form.Field){ + Ext.form.Field.prototype.invalidText = "Giá trị cá»§a ô này không hợp lệ."; +} + +Date.monthNames = [ + "Tháng 1", + "Tháng 2", + "Tháng 3", + "Tháng 4", + "Tháng 5", + "Tháng 6", + "Tháng 7", + "Tháng 8", + "Tháng 9", + "Tháng 10", + "Tháng 11", + "Tháng 12" +]; + +Date.dayNames = [ + "Chá»§ nhật", + "Thứ hai", + "Thứ ba", + "Thứ tư", + "Thứ năm", + "Thứ sáu", + "Thứ bảy" +]; + +if(Ext.MessageBox){ + Ext.MessageBox.buttonText = { + ok : "Äồng ý", + cancel : "Há»§y bá»", + yes : "Có", + no : "Không" + }; +} + +if(Ext.util.Format){ + Ext.util.Format.date = function(v, format){ + if(!v) return ""; + if(!(v instanceof Date)) v = new Date(Date.parse(v)); + return v.dateFormat(format || "d/m/Y"); + }; +} + +if(Ext.DatePicker){ + Ext.apply(Ext.DatePicker.prototype, { + todayText : "Hôm nay", + minText : "Ngày này nhá» hÆ¡n ngày nhá» nhất", + maxText : "Ngày này lá»›n hÆ¡n ngày lá»›n nhất", + disabledDaysText : "", + disabledDatesText : "", + monthNames : Date.monthNames, + dayNames : Date.dayNames, + nextText : 'Tháng sau (Control+Right)', + prevText : 'Tháng trước (Control+Left)', + monthYearText : 'Chá»n má»™t tháng (Control+Up/Down để thay đổi năm)', + todayTip : "{0} (Spacebar - Phím trắng)", + format : "d/m/y" + }); +} + +if(Ext.PagingToolbar){ + Ext.apply(Ext.PagingToolbar.prototype, { + beforePageText : "Trang", + afterPageText : "of {0}", + firstText : "Trang đầu", + prevText : "Trang trước", + nextText : "Trang sau", + lastText : "Trang cuối", + refreshText : "Tải lại", + displayMsg : "Hiển thị {0} - {1} cá»§a {2}", + emptyMsg : 'Không có dữ liệu để hiển thị' + }); +} + +if(Ext.form.TextField){ + Ext.apply(Ext.form.TextField.prototype, { + minLengthText : "Chiá»u dài tối thiểu cá»§a ô này là {0}", + maxLengthText : "Chiá»u dài tối Ä‘a cá»§a ô này là {0}", + blankText : "Ô này cần phải nhập giá trị", + regexText : "", + emptyText : null + }); +} + +if(Ext.form.NumberField){ + Ext.apply(Ext.form.NumberField.prototype, { + minText : "Giá trị nhá» nhất cá»§a ô này là {0}", + maxText : "Giá trị lá»›n nhất cá»§a ô này là {0}", + nanText : "{0} hông phải là má»™t số hợp lệ" + }); +} + +if(Ext.form.DateField){ + Ext.apply(Ext.form.DateField.prototype, { + disabledDaysText : "Vô hiệu", + disabledDatesText : "Vô hiệu", + minText : "Ngày nhập trong ô này phải sau ngày {0}", + maxText : "Ngày nhập trong ô này phải trước ngày {0}", + invalidText : "{0} không phải là má»™t ngày hợp lệ - phải có dạng {1}", + format : "d/m/y" + }); +} + +if(Ext.form.ComboBox){ + Ext.apply(Ext.form.ComboBox.prototype, { + loadingText : "Äang tải...", + valueNotFoundText : undefined + }); +} + +if(Ext.form.VTypes){ + Ext.apply(Ext.form.VTypes, { + emailText : 'Giá trị cá»§a ô này phải là má»™t địa chỉ email có dạng như "ten@abc.com"', + urlText : 'Giá trị cá»§a ô này phải là má»™t địa chỉ web(URL) hợp lệ, có dạng như "http:/'+'/www.domain.com"', + alphaText : 'Ô này chỉ được nhập các kí tá»± và gạch dưới(_)', + alphanumText : 'Ô này chỉ được nhập các kí tá»±, số và gạch dưới(_)' + }); +} + +if(Ext.grid.GridView){ + Ext.apply(Ext.grid.GridView.prototype, { + sortAscText : "Tăng dần", + sortDescText : "Giảm dần", + lockText : "Khóa cá»™t", + unlockText : "Bá» khóa cá»™t", + columnsText : "Các cá»™t" + }); +} + +if(Ext.grid.PropertyColumnModel){ + Ext.apply(Ext.grid.PropertyColumnModel.prototype, { + nameText : "Tên", + valueText : "Giá trị", + dateFormat : "j/m/Y" + }); +} + +if(Ext.SplitLayoutRegion){ + Ext.apply(Ext.SplitLayoutRegion.prototype, { + splitTip : "Kéo giữ chuá»™t để thay đổi kích thước.", + collapsibleSplitTip : "Kéo giữ chuá»™t để thay đổi kích thước. Nhấp đúp để ẩn Ä‘i." + }); +} diff --git a/www/extras/yui-ext/source/locale/ext-lang-zh_CN.js b/www/extras/yui-ext/source/locale/ext-lang-zh_CN.js new file mode 100644 index 000000000..a55e468b9 --- /dev/null +++ b/www/extras/yui-ext/source/locale/ext-lang-zh_CN.js @@ -0,0 +1,174 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* + * Simplified Chinese translation + * By DavidHu + * 09 April 2007 + */ + +Ext.UpdateManager.defaults.indicatorText = '
          加载中...
          '; + +if(Ext.View){ + Ext.View.prototype.emptyText = ""; +} + +if(Ext.grid.Grid){ + Ext.grid.Grid.prototype.ddText = "{0} 选择行"; +} + +if(Ext.TabPanelItem){ + Ext.TabPanelItem.prototype.closeText = "关闭"; +} + +if(Ext.form.Field){ + Ext.form.Field.prototype.invalidText = "è¾“å…¥å€¼éžæ³•"; +} + +Date.monthNames = [ + "一月", + "二月", + "三月", + "四月", + "五月", + "六月", + "七月", + "八月", + "乿œˆ", + "åæœˆ", + "å一月", + "å二月" +]; + +Date.dayNames = [ + "周日", + "周一", + "周二", + "周三", + "周四", + "周五", + "周六" +]; + +if(Ext.MessageBox){ + Ext.MessageBox.buttonText = { + ok : "确定", + cancel : "å–æ¶ˆ", + yes : "是", + no : "å¦" + }; +} + +if(Ext.util.Format){ + Ext.util.Format.date = function(v, format){ + if(!v) return ""; + if(!(v instanceof Date)) v = new Date(Date.parse(v)); + return v.dateFormat(format || "yå¹´m月dæ—¥"); + }; +} + +if(Ext.DatePicker){ + Ext.apply(Ext.DatePicker.prototype, { + todayText : "今天", + minText : "æ—¥æœŸåœ¨æœ€å°æ—¥æœŸä¹‹å‰", + maxText : "日期在最大日期之åŽ", + disabledDaysText : "", + disabledDatesText : "", + monthNames : Date.monthNames, + dayNames : Date.dayNames, + nextText : '下月 (Control+Right)', + prevText : '上月 (Control+Left)', + monthYearText : '选择一个月 (Control+Up/Down æ¥æ”¹å˜å¹´)', + todayTip : "{0} (Spacebar)", + format : "yå¹´m月dæ—¥" + }); +} + +if(Ext.PagingToolbar){ + Ext.apply(Ext.PagingToolbar.prototype, { + beforePageText : "页", + afterPageText : "of {0}", + firstText : "第一页", + prevText : "å‰ä¸€é¡µ", + nextText : "下一页", + lastText : "最åŽé¡µ", + refreshText : "刷新", + displayMsg : "显示 {0} - {1} of {2}", + emptyMsg : '没有数æ®éœ€è¦æ˜¾ç¤º' + }); +} + +if(Ext.form.TextField){ + Ext.apply(Ext.form.TextField.prototype, { + minLengthText : "该输入项的最å°é•¿åº¦æ˜¯ {0}", + maxLengthText : "该输入项的最大长度是 {0}", + blankText : "该输入项为必输项", + regexText : "", + emptyText : null + }); +} + +if(Ext.form.NumberField){ + Ext.apply(Ext.form.NumberField.prototype, { + minText : "该输入项的最å°å€¼æ˜¯ {0}", + maxText : "该输入项的最大值是 {0}", + nanText : "{0} 䏿˜¯æœ‰æ•ˆæ•°å€¼" + }); +} + +if(Ext.form.DateField){ + Ext.apply(Ext.form.DateField.prototype, { + disabledDaysText : "ç¦ç”¨", + disabledDatesText : "ç¦ç”¨", + minText : "该输入项的日期必须在 {0} 之åŽ", + maxText : "该输入项的日期必须在 {0} 之å‰", + invalidText : "{0} 是无效的日期 - å¿…é¡»ç¬¦åˆæ ¼å¼ï¼š {1}", + format : "yå¹´m月dæ—¥" + }); +} + +if(Ext.form.ComboBox){ + Ext.apply(Ext.form.ComboBox.prototype, { + loadingText : "加载...", + valueNotFoundText : undefined + }); +} + +if(Ext.form.VTypes){ + Ext.apply(Ext.form.VTypes, { + emailText : '该输入项必须是电å­é‚®ä»¶åœ°å€ï¼Œæ ¼å¼å¦‚: "user@domain.com"', + urlText : '该输入项必须是URL地å€ï¼Œæ ¼å¼å¦‚: "http:/'+'/www.domain.com"', + alphaText : '该输入项åªèƒ½åŒ…å«å­—符和_', + alphanumText : '该输入项åªèƒ½åŒ…å«å­—符,æ•°å­—å’Œ_' + }); +} + +if(Ext.grid.GridView){ + Ext.apply(Ext.grid.GridView.prototype, { + sortAscText : "æ­£åº", + sortDescText : "逆åº", + lockText : "é”列", + unlockText : "è§£é”列", + columnsText : "列" + }); +} + +if(Ext.grid.PropertyColumnModel){ + Ext.apply(Ext.grid.PropertyColumnModel.prototype, { + nameText : "åç§°", + valueText : "值", + dateFormat : "yå¹´m月dæ—¥" + }); +} + +if(Ext.SplitLayoutRegion){ + Ext.apply(Ext.SplitLayoutRegion.prototype, { + splitTip : "æ‹–åŠ¨æ¥æ”¹å˜å°ºå¯¸.", + collapsibleSplitTip : "æ‹–åŠ¨æ¥æ”¹å˜å°ºå¯¸. åŒå‡»éšè—." + }); +} diff --git a/www/extras/yui-ext/source/locale/ext-lang-zh_TW.js b/www/extras/yui-ext/source/locale/ext-lang-zh_TW.js new file mode 100644 index 000000000..66c348ed1 --- /dev/null +++ b/www/extras/yui-ext/source/locale/ext-lang-zh_TW.js @@ -0,0 +1,174 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* + * Traditional Chinese translation + * By hata1234 + * 09 April 2007 + */ + +Ext.UpdateManager.defaults.indicatorText = '
          讀å–中...
          '; + +if(Ext.View){ + Ext.View.prototype.emptyText = ""; +} + +if(Ext.grid.Grid){ + Ext.grid.Grid.prototype.ddText = "鏿“‡äº† {0} 行"; +} + +if(Ext.TabPanelItem){ + Ext.TabPanelItem.prototype.closeText = "關閉此標籤"; +} + +if(Ext.form.Field){ + Ext.form.Field.prototype.invalidText = "數值ä¸ç¬¦åˆæ¬„ä½è¦å®š"; +} + +Date.monthNames = [ + "一月", + "二月", + "三月", + "四月", + "五月", + "六月", + "七月", + "八月", + "乿œˆ", + "åæœˆ", + "å一月", + "å二月" +]; + +Date.dayNames = [ + "æ—¥", + "一", + "二", + "三", + "å››", + "五", + "å…­" +]; + +if(Ext.MessageBox){ + Ext.MessageBox.buttonText = { + ok : "確定", + cancel : "å–æ¶ˆ", + yes : "是", + no : "å¦" + }; +} + +if(Ext.util.Format){ + Ext.util.Format.date = function(v, format){ + if(!v) return ""; + if(!(v instanceof Date)) v = new Date(Date.parse(v)); + return v.dateFormat(format || "Y/m/d"); + }; +} + +if(Ext.DatePicker){ + Ext.apply(Ext.DatePicker.prototype, { + todayText : "今天", + minText : "日期必須大於最å°å®¹è¨±æ—¥æœŸ", + maxText : "æ—¥æœŸå¿…é ˆå°æ–¼æœ€å¤§å®¹è¨±æ—¥æœŸ", + disabledDaysText : "", + disabledDatesText : "", + monthNames : Date.monthNames, + dayNames : Date.dayNames, + nextText : "下個月 (Ctrl+峿–¹å‘éµ)", + prevText : "上個月 (Ctrl+左方å‘éµ)", + monthYearText : "鏿“‡æœˆä»½ (Ctrl+上/下方å‘éµé¸æ“‡å¹´ä»½)", + todayTip : "{0} (空白éµ)", + format : "y/m/d" + }); +} + +if(Ext.PagingToolbar){ + Ext.apply(Ext.PagingToolbar.prototype, { + beforePageText : "第", + afterPageText : "é ï¼Œå…±{0}é ", + firstText : "第一é ", + prevText : "上一é ", + nextText : "下一é ", + lastText : "最後é ", + refreshText : "釿–°æ•´ç†", + displayMsg : "顯示{0} - {1}é ,å…±{2}é ", + emptyMsg : '沒有任何資料' + }); +} + +if(Ext.form.TextField){ + Ext.apply(Ext.form.TextField.prototype, { + minLengthText : "æ­¤æ¬„ä½æœ€å°‘è¦è¼¸å…¥ {0} 個字", + maxLengthText : "æ­¤æ¬„ä½æœ€å¤šè¼¸å…¥ {0} 個字", + blankText : "此欄ä½ç‚ºå¿…å¡«", + regexText : "", + emptyText : null + }); +} + +if(Ext.form.NumberField){ + Ext.apply(Ext.form.NumberField.prototype, { + minText : "此欄ä½ä¹‹æ•¸å€¼å¿…須大於 {0}", + maxText : "此欄ä½ä¹‹æ•¸å€¼å¿…é ˆå°æ–¼ {0}", + nanText : "{0} 䏿˜¯åˆæ³•的數字" + }); +} + +if(Ext.form.DateField){ + Ext.apply(Ext.form.DateField.prototype, { + disabledDaysText : "無法使用", + disabledDatesText : "無法使用", + minText : "此欄ä½ä¹‹æ—¥æœŸå¿…須在 {0} 之後", + maxText : "此欄ä½ä¹‹æ—¥æœŸå¿…須在 {0} 之å‰", + invalidText : "{0} 䏿˜¯æ­£ç¢ºçš„æ—¥æœŸæ ¼å¼ - å¿…é ˆåƒæ˜¯ 「 {1} 〠這樣的格å¼", + format : "Y/m/d" + }); +} + +if(Ext.form.ComboBox){ + Ext.apply(Ext.form.ComboBox.prototype, { + loadingText : "讀å–中 ...", + valueNotFoundText : undefined + }); +} + +if(Ext.form.VTypes){ + Ext.apply(Ext.form.VTypes, { + emailText : '此欄ä½å¿…é ˆè¼¸å…¥åƒ "user@domain.com" 之E-Mailæ ¼å¼', + urlText : '此欄ä½å¿…é ˆè¼¸å…¥åƒ "http:/'+'/www.domain.com" ä¹‹ç¶²å€æ ¼å¼', + alphaText : '此欄ä½åƒ…能輸入åŠå½¢è‹±æ–‡å­—æ¯åŠåº•ç·š( _ )符號', + alphanumText : '此欄ä½åƒ…能輸入åŠå½¢è‹±æ–‡å­—æ¯ã€æ•¸å­—åŠåº•ç·š( _ )符號' + }); +} + +if(Ext.grid.GridView){ + Ext.apply(Ext.grid.GridView.prototype, { + sortAscText : "æ­£å‘æŽ’åº", + sortDescText : "å呿ޒåº", + lockText : "鎖定欄ä½", + unlockText : "解開欄ä½éŽ–å®š", + columnsText : "欄ä½" + }); +} + +if(Ext.grid.PropertyColumnModel){ + Ext.apply(Ext.grid.PropertyColumnModel.prototype, { + nameText : "å稱", + valueText : "數值", + dateFormat : "Y/m/d" + }); +} + +if(Ext.SplitLayoutRegion){ + Ext.apply(Ext.SplitLayoutRegion.prototype, { + splitTip : "拖曳縮放大å°.", + collapsibleSplitTip : "拖曳縮放大å°. 滑鼠雙擊隱è—." + }); +} diff --git a/www/extras/yui-ext/source/state/State.js b/www/extras/yui-ext/source/state/State.js new file mode 100644 index 000000000..bff1866dd --- /dev/null +++ b/www/extras/yui-ext/source/state/State.js @@ -0,0 +1,285 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.state.Provider + * Abstract base class for state provider implementations. This class provides methods + * for encoding and decoding typed variables including dates and defines the + * Provider interface. + */ +Ext.state.Provider = function(){ + Ext.state.Provider.superclass.constructor.call(this); + /** + * @event statechange + * Fires when a state change occurs. + * @param {Provider} this This state provider + * @param {String} key The state key which was changed + * @param {String} value The encoded value for the state + */ + this.addEvents({ + "statechange": true + }); + this.state = {}; + Ext.state.Provider.superclass.constructor.call(this); +}; +Ext.extend(Ext.state.Provider, Ext.util.Observable, { + /** + * Returns the current value for a key + * @param {String} name The key name + * @param {Mixed} defaultValue A default value to return if the key's value is not found + * @return {Mixed} The state data + */ + get : function(name, defaultValue){ + return typeof this.state[name] == "undefined" ? + defaultValue : this.state[name]; + }, + + /** + * Clears a value from the state + * @param {String} name The key name + */ + clear : function(name){ + delete this.state[name]; + this.fireEvent("statechange", this, name, null); + }, + + /** + * Sets the value for a key + * @param {String} name The key name + * @param {Mixed} value The value to set + */ + 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 The value to decode + * @return {Mixed} The decoded 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; + } + }, + + /** + * Encodes a value including type information. Decode with {@link #decodeValue}. + * @param {Mixed} value The value to encode + * @return {String} The encoded value + */ + 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 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(){
          +   Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
          +   ...
          +   // supposed you have a {@link Ext.BorderLayout}
          +   var layout = new Ext.BorderLayout(...);
          +   layout.restoreState();
          +   // or a {Ext.BasicDialog}
          +   var dialog = new Ext.BasicDialog(...);
          +   dialog.restoreState();
          + 
          + * @singleton + */ +Ext.state.Manager = function(){ + var provider = new Ext.state.Provider(); + + return { + /** + * Configures the default state provider for your application + * @param {Provider} stateProvider The state provider to set + */ + setProvider : function(stateProvider){ + provider = stateProvider; + }, + + /** + * Returns the current value for a key + * @param {String} name The key name + * @param {Mixed} defaultValue The default value to return if the key lookup does not match + * @return {Mixed} The state data + */ + get : function(key, defaultValue){ + return provider.get(key, defaultValue); + }, + + /** + * Sets the value for a key + * @param {String} name The key name + * @param {Mixed} value The state data + */ + set : function(key, value){ + provider.set(key, value); + }, + + /** + * Clears a value from the state + * @param {String} name The key name + */ + clear : function(key){ + provider.clear(key); + }, + + /** + * Gets the currently configured state provider + * @return {Provider} The state provider + */ + getProvider : function(){ + return provider; + } + }; +}(); + +/** + * @class Ext.state.CookieProvider + * @extends Ext.state.Provider + * The default Provider implementation which saves state via cookies. + *
          Usage: +
          
          +   var cp = new Ext.state.CookieProvider({
          +       path: "/cgi-bin/",
          +       expires: new Date(new Date().getTime()+(1000*60*60*24*30)); //30 days
          +       domain: "extjs.com"
          +   })
          +   Ext.state.Manager.setProvider(cp);
          + 
          + * @cfg {String} path The path for which the cookie is active (defaults to root '/' which makes it active for all pages in the site) + * @cfg {Date} expires The cookie expiration date (defaults to 7 days from now) + * @cfg {String} domain The domain to save the cookie for. Note that you cannot specify a different domain than + * your page is on, but you can specify a sub-domain, or simply the domain itself like 'extjs.com' to include + * all sub-domains if you need to access cookies across different sub-domains (defaults to null which uses the same + * domain the page is running on including the 'www' like 'www.extjs.com') + * @cfg {Boolean} secure True if the site is using SSL (defaults to false) + * @constructor + * Create a new CookieProvider + * @param {Object} config The configuration object + */ +Ext.state.CookieProvider = function(config){ + 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; + Ext.apply(this, config); + this.state = this.readCookies(); +}; + +Ext.extend(Ext.state.CookieProvider, Ext.state.Provider, { + // private + set : function(name, value){ + if(typeof value == "undefined" || value === null){ + this.clear(name); + return; + } + this.setCookie(name, value); + Ext.state.CookieProvider.superclass.set.call(this, name, value); + }, + + // private + clear : function(name){ + this.clearCookie(name); + Ext.state.CookieProvider.superclass.clear.call(this, name); + }, + + // private + 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; + }, + + // private + 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" : ""); + }, + + // private + 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/util/CSS.js b/www/extras/yui-ext/source/util/CSS.js new file mode 100644 index 000000000..c5cdf009e --- /dev/null +++ b/www/extras/yui-ext/source/util/CSS.js @@ -0,0 +1,158 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.util.CSS + * Utility class for manipulating CSS rules + * @singleton + */ +Ext.util.CSS = function(){ + var rules = null; + var doc = document; + + var camelRe = /(-[a-z])/gi; + var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); }; + + return { + /** + * Very simple dynamic creation of stylesheets from a text blob of rules. The text will wrapped in a style + * tag and appended to the HEAD of the document. + * @param {String} cssText The text containing the css rules + * @return {StyleSheet} + */ + createStyleSheet : function(cssText){ + var ss; + if(Ext.isIE){ + ss = doc.createStyleSheet(); + ss.cssText = cssText; + }else{ + var head = doc.getElementsByTagName("head")[0]; + var rules = doc.createElement("style"); + rules.setAttribute("type", "text/css"); + try{ + rules.appendChild(doc.createTextNode(cssText)); + }catch(e){ + rules.cssText = cssText; + } + head.appendChild(rules); + ss = rules.styleSheet ? rules.styleSheet : (rules.sheet || doc.styleSheets[doc.styleSheets.length-1]); + } + this.cacheStyleSheet(ss); + return ss; + }, + + /** + * Removes a style or link tag by id + * @param {String} id The id of the tag + */ + removeStyleSheet : function(id){ + var existing = doc.getElementById(id); + if(existing){ + existing.parentNode.removeChild(existing); + } + }, + + /** + * Dynamically swaps an existing stylesheet reference for a new one + * @param {String} id The id of an existing link tag to remove + * @param {String} url The href of the new stylesheet to include + */ + swapStyleSheet : function(id, url){ + this.removeStyleSheet(id); + var ss = doc.createElement("link"); + ss.setAttribute("rel", "stylesheet"); + ss.setAttribute("type", "text/css"); + ss.setAttribute("id", id); + ss.setAttribute("href", url); + doc.getElementsByTagName("head")[0].appendChild(ss); + }, + + /** + * Refresh the rule cache if you have dynamically added stylesheets + * @return {Object} An object (hash) of rules indexed by selector + */ + refreshCache : function(){ + return this.getRules(true); + }, + + // private + cacheStyleSheet : function(ss){ + if(!rules){ + rules = {}; + } + try{// try catch for cross domain access issue + var ssRules = ss.cssRules || ss.rules; + for(var j = ssRules.length-1; j >= 0; --j){ + rules[ssRules[j].selectorText] = ssRules[j]; + } + }catch(e){} + }, + + /** + * 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 + */ + getRules : function(refreshCache){ + if(rules == null || refreshCache){ + rules = {}; + var ds = doc.styleSheets; + for(var i =0, len = ds.length; i < len; i++){ + try{ + this.cacheStyleSheet(ds[i]); + }catch(e){} + } + } + 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 if you have recently updated any rules or added styles dynamically + * @return {CSSRule} The CSS rule or null if one is not found + */ + 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 + */ + updateRule : function(selector, property, value){ + if(!(selector instanceof Array)){ + var rule = this.getRule(selector); + if(rule){ + rule.style[property.replace(camelRe, camelFn)] = value; + return true; + } + }else{ + for(var i = 0; i < selector.length; i++){ + if(this.updateRule(selector[i], property, value)){ + return true; + } + } + } + return false; + } + }; +}(); \ No newline at end of file diff --git a/www/extras/yui-ext/source/util/ClickRepeater.js b/www/extras/yui-ext/source/util/ClickRepeater.js new file mode 100644 index 000000000..48114f738 --- /dev/null +++ b/www/extras/yui-ext/source/util/ClickRepeater.js @@ -0,0 +1,170 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + @class Ext.util.ClickRepeater + @extends Ext.util.Observable + + A wrapper class which can be applied to any element. Fires a "click" event while the + mouse is pressed. The interval between firings may be specified in the config but + defaults to 10 milliseconds. + + Optionally, a CSS class may be applied to the element during the time it is pressed. + + @cfg {String/HTMLElement/Element} el The element to act as a button. + @cfg {Number} delay The initial delay before the repeating event begins firing. + Similar to an autorepeat key delay. + @cfg {Number} interval The interval between firings of the "click" event. Default 10 ms. + @cfg {String} pressClass A CSS class name to be applied to the element while pressed. + @cfg {Boolean} accelerate True if autorepeating should start slowly and accelerate. + "interval" and "delay" are ignored. "immediate" is honored. + @cfg {Boolean} preventDefault True to prevent the default click event + @cfg {Boolean} stopDefault True to stop the default click event + + @history + 2007-02-02 jvs Original code contributed by Nige "Animal" White + 2007-02-02 jvs Renamed to ClickRepeater + 2007-02-03 jvs Modifications for FF Mac and Safari + + @constructor + @param {String/HTMLElement/Element} el The element to listen on + @param {Object} config + */ +Ext.util.ClickRepeater = function(el, config) +{ + this.el = Ext.get(el); + this.el.unselectable(); + + Ext.apply(this, config); + + this.addEvents({ + /** + * @event mousedown + * Fires when the mouse button is depressed. + * @param {Ext.util.ClickRepeater} this + */ + "mousedown" : true, + /** + * @event click + * Fires on a specified interval during the time the element is pressed. + * @param {Ext.util.ClickRepeater} this + */ + "click" : true, + /** + * @event mouseup + * Fires when the mouse key is released. + * @param {Ext.util.ClickRepeater} this + */ + "mouseup" : true + }); + + this.el.on("mousedown", this.handleMouseDown, this); + if(this.preventDefault || this.stopDefault){ + this.el.on("click", function(e){ + if(this.preventDefault){ + e.preventDefault(); + } + if(this.stopDefault){ + e.stopEvent(); + } + }, this); + } + + // allow inline handler + if(this.handler){ + this.on("click", this.handler, this.scope || this); + } + + Ext.util.ClickRepeater.superclass.constructor.call(this); +}; + +Ext.extend(Ext.util.ClickRepeater, Ext.util.Observable, { + interval : 20, + delay: 250, + preventDefault : true, + stopDefault : false, + timer : 0, + docEl : Ext.get(document), + + // private + handleMouseDown : function(){ + clearTimeout(this.timer); + this.el.blur(); + if(this.pressClass){ + this.el.addClass(this.pressClass); + } + this.mousedownTime = new Date(); + + this.docEl.on("mouseup", this.handleMouseUp, this); + this.el.on("mouseout", this.handleMouseOut, this); + + this.fireEvent("mousedown", this); + this.fireEvent("click", this); + + this.timer = this.click.defer(this.delay || this.interval, this); + }, + + // private + click : function(){ + this.fireEvent("click", this); + this.timer = this.click.defer(this.getInterval(), this); + }, + + // private + getInterval: function(){ + if(!this.accelerate){ + return this.interval; + } + var pressTime = this.mousedownTime.getElapsed(); + if(pressTime < 500){ + return 400; + }else if(pressTime < 1700){ + return 320; + }else if(pressTime < 2600){ + return 250; + }else if(pressTime < 3500){ + return 180; + }else if(pressTime < 4400){ + return 140; + }else if(pressTime < 5300){ + return 80; + }else if(pressTime < 6200){ + return 50; + }else{ + return 10; + } + }, + + // private + handleMouseOut : function(){ + clearTimeout(this.timer); + if(this.pressClass){ + this.el.removeClass(this.pressClass); + } + this.el.on("mouseover", this.handleMouseReturn, this); + }, + + // private + handleMouseReturn : function(){ + this.el.un("mouseover", this.handleMouseReturn); + if(this.pressClass){ + this.el.addClass(this.pressClass); + } + this.click(); + }, + + // private + handleMouseUp : function(){ + clearTimeout(this.timer); + this.el.un("mouseover", this.handleMouseReturn); + this.el.un("mouseout", this.handleMouseOut); + this.docEl.un("mouseup", this.handleMouseUp); + this.el.removeClass(this.pressClass); + this.fireEvent("mouseup", this); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/util/Date.js b/www/extras/yui-ext/source/util/Date.js new file mode 100644 index 000000000..01f5c9d1a --- /dev/null +++ b/www/extras/yui-ext/source/util/Date.js @@ -0,0 +1,711 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Date + * + * The date parsing and format syntax is a subset of + * PHP's date() function, and the formats that are + * supported will provide results equivalent to their PHP versions. + * + * Following is the list of all currently supported formats: + *
          +Sample date:
          +'Wed Jan 10 2007 15:05:01 GMT-0600 (Central Standard Time)'
          +
          +Format  Output      Description
          +------  ----------  --------------------------------------------------------------
          +  d      10         Day of the month, 2 digits with leading zeros
          +  D      Wed        A textual representation of a day, three letters
          +  j      10         Day of the month without leading zeros
          +  l      Wednesday  A full textual representation of the day of the week
          +  S      th         English ordinal day of month suffix, 2 chars (use with j)
          +  w      3          Numeric representation of the day of the week
          +  z      9          The julian date, or day of the year (0-365)
          +  W      01         ISO-8601 2-digit week number of year, weeks starting on Monday (00-52)
          +  F      January    A full textual representation of the month
          +  m      01         Numeric representation of a month, with leading zeros
          +  M      Jan        Month name abbreviation, three letters
          +  n      1          Numeric representation of a month, without leading zeros
          +  t      31         Number of days in the given month
          +  L      0          Whether it's a leap year (1 if it is a leap year, else 0)
          +  Y      2007       A full numeric representation of a year, 4 digits
          +  y      07         A two digit representation of a year
          +  a      pm         Lowercase Ante meridiem and Post meridiem	
          +  A      PM         Uppercase Ante meridiem and Post meridiem
          +  g      3          12-hour format of an hour without leading zeros
          +  G      15         24-hour format of an hour without leading zeros
          +  h      03         12-hour format of an hour with leading zeros
          +  H      15         24-hour format of an hour with leading zeros
          +  i      05         Minutes with leading zeros
          +  s      01         Seconds, with leading zeros
          +  O      -0600      Difference to Greenwich time (GMT) in hours
          +  T      CST        Timezone setting of the machine running the code
          +  Z      -21600     Timezone offset in seconds (negative if west of UTC, positive if east)
          +
          + * + * Example usage (note that you must escape format specifiers with '\\' to render them as character literals): + *
          
          +var dt = new Date('1/10/2007 03:05:01 PM GMT-0600');
          +document.write(dt.format('Y-m-d'));                         //2007-01-10
          +document.write(dt.format('F j, Y, g:i a'));                 //January 10, 2007, 3:05 pm
          +document.write(dt.format('l, \\t\\he dS of F Y h:i:s A'));  //Wednesday, the 10th of January 2007 03:05:01 PM
          + 
          + * + * Here are some standard date/time patterns that you might find helpful. They + * are not part of the source of Date.js, but to use them you can simply copy this + * block of code into any script that is included after Date.js and they will also become + * globally available on the Date object. Feel free to add or remove patterns as needed in your code. + *
          
          +Date.patterns = {
          +    ISO8601Long:"Y-m-d H:i:s",
          +    ISO8601Short:"Y-m-d",
          +    ShortDate: "n/j/Y",
          +    LongDate: "l, F d, Y",
          +    FullDateTime: "l, F d, Y g:i:s A",
          +    MonthDay: "F d",
          +    ShortTime: "g:i A",
          +    LongTime: "g:i:s A",
          +    SortableDateTime: "Y-m-d\\TH:i:s",
          +    UniversalSortableDateTime: "Y-m-d H:i:sO",
          +    YearMonth: "F, Y"
          +};
          +
          + * + * Example usage: + *
          
          +var dt = new Date();
          +document.write(dt.format(Date.patterns.ShortDate));
          + 
          + */ + +/* + * Most of the date-formatting functions below are the excellent work of Baron Schwartz. + * They generate precompiled functions from date formats instead of parsing and + * processing the pattern every time you format a date. These functions are available + * on every Date object (any javascript function). + * + * The original article and download are here: + * http://www.xaprb.com/blog/2005/12/12/javascript-closures-for-runtime-efficiency/ + * + */ + +// private +Date.parseFunctions = {count:0}; +// private +Date.parseRegexes = []; +// private +Date.formatFunctions = {count:0}; + +// private +Date.prototype.dateFormat = function(format) { + if (Date.formatFunctions[format] == null) { + Date.createNewFormat(format); + } + var func = Date.formatFunctions[format]; + return this[func](); +}; + + +/** + * Formats a date given the supplied format string + * @param {String} format The format string + * @return {String} The formatted date + * @method + */ +Date.prototype.format = Date.prototype.dateFormat; + +// private +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) + ";}"); +}; + +// private +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 the passed string using the specified format. Example Usage: +
          
          +var date = Date.parseDate('2006-12-25', 'Y-m-d');
          +
          + * @param {String} input The unparsed date as a string + * @param {String} format The format the date is in + * @return {Date} The parsed date + * @static + */ +Date.parseDate = function(input, format) { + if (Date.parseFunctions[format] == null) { + Date.createParser(format); + } + var func = Date.parseFunctions[format]; + return Date[func](input); +}; + +// private +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 { + var 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); +}; + +// private +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)}; + } +}; + +/** + * Get the timezone abbreviation of the current date (equivalent to the format specifier 'T'). + * @return {String} The abbreviated timezone name (e.g. 'CST') + */ +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"); +}; + +/** + * Get the offset from GMT of the current date (equivalent to the format specifier 'O'). + * @return {String} The 4-character offset string prefixed with + or - (e.g. '-0600') + */ +Date.prototype.getGMTOffset = function() { + return (this.getTimezoneOffset() > 0 ? "-" : "+") + + String.leftPad(Math.floor(this.getTimezoneOffset() / 60), 2, "0") + + String.leftPad(this.getTimezoneOffset() % 60, 2, "0"); +}; + +/** + * Get the numeric day number of the year, adjusted for leap year. + * @return {Number} 0 through 365 (366 in leap years) + */ +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; +}; + +/** + * Get the string representation of the numeric week number of the year + * (equivalent to the format specifier 'W'). + * @return {String} '00' through '52' + */ +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); + return String.leftPad(((now - then) / 7) + 1, 2, "0"); +}; + +/** + * Whether or not the current date is in a leap year. + * @return {Boolean} True if the current date is in a leap year, else false + */ +Date.prototype.isLeapYear = function() { + var year = this.getFullYear(); + return ((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year))); +}; + +/** + * Get the first day of the current month, adjusted for leap year. The returned value + * is the numeric day index within the week (0-6) which can be used in conjunction with + * the {@link #monthNames} array to retrieve the textual day name. + * Example: + *
          
          +var dt = new Date('1/10/2007');
          +document.write(Date.dayNames[dt.getFirstDayOfMonth()]); //output: 'Monday'
          +
          + * @return {Number} The day number (0-6) + */ +Date.prototype.getFirstDayOfMonth = function() { + var day = (this.getDay() - (this.getDate() - 1)) % 7; + return (day < 0) ? (day + 7) : day; +}; + +/** + * Get the last day of the current month, adjusted for leap year. The returned value + * is the numeric day index within the week (0-6) which can be used in conjunction with + * the {@link #monthNames} array to retrieve the textual day name. + * Example: + *
          
          +var dt = new Date('1/10/2007');
          +document.write(Date.dayNames[dt.getLastDayOfMonth()]); //output: 'Wednesday'
          +
          + * @return {Number} The day number (0-6) + */ +Date.prototype.getLastDayOfMonth = function() { + var day = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7; + return (day < 0) ? (day + 7) : day; +}; + + +/** + * Get a Date of the first day of this date's month + * @return {Date} + */ +Date.prototype.getFirstDateOfMonth = function() { + return new Date(this.getFullYear(), this.getMonth(), 1); +}; + +/** + * Get a Date of the late day of this date's month + * @return {Date} + */ +Date.prototype.getLastDateOfMonth = function() { + return new Date(this.getFullYear(), this.getMonth(), this.getDaysInMonth()); +}; +/** + * Get the number of days in the current month, adjusted for leap year. + * @return {Number} The number of days in the month + */ +Date.prototype.getDaysInMonth = function() { + Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28; + return Date.daysInMonth[this.getMonth()]; +}; + +/** + * Get the English ordinal suffix of the current day (equivalent to the format specifier 'S'). + * @return {String} 'st, 'nd', 'rd' or 'th' + */ +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"; + } +}; + +// private +Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31]; + +/** + * An array of textual month names. + * Override these values for international dates, for example... + * Date.monthNames = ['JanInYourLang', 'FebInYourLang', ...]; + * @type Array + * @static + */ +Date.monthNames = + ["January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December"]; + +/** + * An array of textual day names. + * Override these values for international dates, for example... + * Date.dayNames = ['SundayInYourLang', 'MondayInYourLang', ...]; + * @type Array + * @static + */ +Date.dayNames = + ["Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday"]; + +// private +Date.y2kYear = 50; +// private +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}; + +/** + * Creates and returns a new Date instance with the exact same date value as the called instance. + * Dates are copied and passed by reference, so if a copied date variable is modified later, the original + * variable will also be changed. When the intention is to create a new variable that will not + * modify the original instance, you should create a clone. + * + * Example of correctly cloning a date: + *
          
          +//wrong way:
          +var orig = new Date('10/1/2006');
          +var copy = orig;
          +copy.setDate(5);
          +document.write(orig);  //returns 'Thu Oct 05 2006'!
          +
          +//correct way:
          +var orig = new Date('10/1/2006');
          +var copy = orig.clone();
          +copy.setDate(5);
          +document.write(orig);  //returns 'Thu Oct 01 2006'
          +
          + * @return {Date} The new Date instance + */ +Date.prototype.clone = function() { + return new Date(this.getTime()); +}; + +/** + * Clears any time information from this date + @param {Boolean} clone true to create a clone of this date, clear the time and return it + @return {Date} this or the clone + */ +Date.prototype.clearTime = function(clone){ + if(clone){ + return this.clone().clearTime(); + } + this.setHours(0); + this.setMinutes(0); + this.setSeconds(0); + this.setMilliseconds(0); + return this; +}; + +// private +// safari setMonth is broken +if(Ext.isSafari){ + Date.brokenSetMonth = Date.prototype.setMonth; + Date.prototype.setMonth = function(num){ + if(num <= -1){ + var n = Math.ceil(-num); + var back_year = Math.ceil(n/12); + var month = (n % 12) ? 12 - n % 12 : 0 ; + this.setFullYear(this.getFullYear() - back_year); + return Date.brokenSetMonth.call(this, month); + } else { + return Date.brokenSetMonth.apply(this, arguments); + } + }; +} + +/** Date interval constant @static @type String */ +Date.MILLI = "ms"; +/** Date interval constant @static @type String */ +Date.SECOND = "s"; +/** Date interval constant @static @type String */ +Date.MINUTE = "mi"; +/** Date interval constant @static @type String */ +Date.HOUR = "h"; +/** Date interval constant @static @type String */ +Date.DAY = "d"; +/** Date interval constant @static @type String */ +Date.MONTH = "mo"; +/** Date interval constant @static @type String */ +Date.YEAR = "y"; + +/** + * Provides a convenient method of performing basic date arithmetic. This method + * does not modify the Date instance being called - it creates and returns + * a new Date instance containing the resulting date value. + * + * Examples: + *
          
          +//Basic usage:
          +var dt = new Date('10/29/2006').add(Date.DAY, 5);
          +document.write(dt); //returns 'Fri Oct 06 2006 00:00:00'
          +
          +//Negative values will subtract correctly:
          +var dt2 = new Date('10/1/2006').add(Date.DAY, -5);
          +document.write(dt2); //returns 'Tue Sep 26 2006 00:00:00'
          +
          +//You can even chain several calls together in one line!
          +var dt3 = new Date('10/1/2006').add(Date.DAY, 5).add(Date.HOUR, 8).add(Date.MINUTE, -30);
          +document.write(dt3); //returns 'Fri Oct 06 2006 07:30:00'
          + 
          + * + * @param {String} interval A valid date interval enum value + * @param {Number} value The amount to add to the current date + * @return {Date} The new Date instance + */ +Date.prototype.add = function(interval, value){ + var d = this.clone(); + if (!interval || value === 0) return d; + switch(interval.toLowerCase()){ + case Date.MILLI: + d.setMilliseconds(this.getMilliseconds() + value); + break; + case Date.SECOND: + d.setSeconds(this.getSeconds() + value); + break; + case Date.MINUTE: + d.setMinutes(this.getMinutes() + value); + break; + case Date.HOUR: + d.setHours(this.getHours() + value); + break; + case Date.DAY: + d.setDate(this.getDate() + value); + break; + case Date.MONTH: + var day = this.getDate(); + if(day > 28){ + day = Math.min(day, this.getFirstDateOfMonth().add('mo', value).getLastDateOfMonth().getDate()); + } + d.setDate(day); + d.setMonth(this.getMonth() + value); + break; + case Date.YEAR: + d.setFullYear(this.getFullYear() + value); + break; + } + return d; +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/util/DelayedTask.js b/www/extras/yui-ext/source/util/DelayedTask.js new file mode 100644 index 000000000..8b5ac1e75 --- /dev/null +++ b/www/extras/yui-ext/source/util/DelayedTask.js @@ -0,0 +1,62 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class 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 {Function} 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 + */ +Ext.util.DelayedTask = function(fn, scope, args){ + var id = null, d, t; + + var call = function(){ + var now = new Date().getTime(); + if(now - t >= d){ + clearInterval(id); + id = null; + fn.apply(scope, args || []); + } + }; + /** + * 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(id && delay != d){ + this.cancel(); + } + d = delay; + t = new Date().getTime(); + fn = newFn || fn; + scope = newScope || scope; + args = newArgs || args; + if(!id){ + id = setInterval(call, d); + } + }; + + /** + * Cancel the last queued timeout + */ + this.cancel = function(){ + if(id){ + clearInterval(id); + id = null; + } + }; +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/util/Format.js b/www/extras/yui-ext/source/util/Format.js new file mode 100644 index 000000000..20a293095 --- /dev/null +++ b/www/extras/yui-ext/source/util/Format.js @@ -0,0 +1,156 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.util.Format + * Reusable data formatting functions + * @singleton + */ +Ext.util.Format = function(){ + var trimRe = /^\s+|\s+$/g; + return { + /** + * Truncate a string and add an ellipsis ('...') to the end if it exceeds the specified length + * @param {String} value The string to truncate + * @param {Number} length The maximum length to allow before truncating + * @return {String} The converted text + */ + ellipsis : function(value, len){ + if(value && value.length > len){ + return value.substr(0, len-3)+"..."; + } + return value; + }, + + /** + * Checks a reference and converts it to empty string if it is undefined + * @param {Mixed} value Reference to check + * @return {Mixed} Empty string if converted, otherwise the original value + */ + undef : function(value){ + return typeof value != "undefined" ? value : ""; + }, + + /** + * Convert certain characters (&, <, >, and ') to their HTML character equivalents for literal display in web pages. + * @param {String} value The string to encode + * @return {String} The encoded text + */ + htmlEncode : function(value){ + return !value ? value : String(value).replace(/&/g, "&").replace(/>/g, ">").replace(/ 2){ + var args = Array.prototype.slice.call(arguments, 2); + args.unshift(value); + return eval(fn).apply(window, args); + }else{ + return eval(fn).call(window, value); + } + }, + + /** + * Format a number as US currency + * @param {Number/String} value The numeric value to format + * @return {String} The formatted currency string + */ + usMoney : function(v){ + v = (Math.round((v-0)*100))/100; + v = (v == Math.floor(v)) ? v + ".00" : ((v*10 == Math.floor(v*10)) ? v + "0" : v); + return "$" + v ; + }, + + /** + * Parse a value into a formatted date using the specified format pattern. + * @param {Mixed} value The value to format + * @param {String} format (optional) Any valid date format string (defaults to 'm/d/Y') + * @return {String} The formatted date string + */ + date : function(v, format){ + if(!v){ + return ""; + } + if(!(v instanceof Date)){ + v = new Date(Date.parse(v)); + } + return v.dateFormat(format || "m/d/Y"); + }, + + /** + * Returns a date rendering function that can be reused to apply a date format multiple times efficiently + * @param {String} format Any valid date format string + * @return {Function} The date formatting function + */ + dateRenderer : function(format){ + return function(v){ + return Ext.util.Format.date(v, format); + }; + }, + + // private + stripTagsRE : /<\/?[^>]+>/gi, + + /** + * Strips all HTML tags + * @param {Mixed} value The text from which to strip tags + * @return {String} The stripped text + */ + stripTags : function(v){ + return !v ? v : String(v).replace(this.stripTagsRE, ""); + } + }; +}(); \ No newline at end of file diff --git a/www/extras/yui-ext/source/util/JSON.js b/www/extras/yui-ext/source/util/JSON.js new file mode 100644 index 000000000..f58da1a02 --- /dev/null +++ b/www/extras/yui-ext/source/util/JSON.js @@ -0,0 +1,143 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class 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 + */ +Ext.util.JSON = new (function(){ + var useHasOwn = {}.hasOwnProperty ? true : false; + + // crashes Safari in some instances + //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" : 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 (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){ + return eval("(" + json + ')'); + }; +})(); +/** + * Shorthand for {@link Ext.util.JSON#encode} + * @member Ext encode + * @method */ +Ext.encode = Ext.util.JSON.encode; +/** + * Shorthand for {@link Ext.util.JSON#decode} + * @member Ext decode + * @method */ +Ext.decode = Ext.util.JSON.decode; diff --git a/www/extras/yui-ext/source/util/KeyMap.js b/www/extras/yui-ext/source/util/KeyMap.js new file mode 100644 index 000000000..6dddf3a23 --- /dev/null +++ b/www/extras/yui-ext/source/util/KeyMap.js @@ -0,0 +1,189 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.KeyMap + * Handles mapping keys to actions for an element. One key map can be used for multiple actions. + * The constructor accepts the same config object as defined by {@link #addBinding}. + * If you bind a callback function to a KeyMap, anytime the KeyMap handles an expected key + * combination it will call the function with this signature (if the match is a multi-key + * combination the callback will still be called only once): (String key, Ext.EventObject e) + * A KeyMap can also handle a string representation of keys.
          + * Usage: +
          
          + // map one key by key code
          + var map = new Ext.KeyMap("my-element", {
          +     key: 13, // or Ext.EventObject.ENTER
          +     fn: myHandler,
          +     scope: myObject
          + });
          + 
          + // map multiple keys to one action by string
          + var map = new Ext.KeyMap("my-element", {
          +     key: "a\r\n\t",
          +     fn: myHandler,
          +     scope: myObject
          + });
          + 
          + // map multiple keys to multiple actions by strings and array of codes
          + var map = new Ext.KeyMap("my-element", [
          +    {
          +        key: [10,13],
          +        fn: function(){ alert("Return was pressed"); }
          +    }, {
          +        key: "abc",
          +        fn: function(){ alert('a, b or c was pressed'); }
          +    }, {
          +        key: "\t",
          +        ctrl:true,
          +        shift:true,
          +        fn: function(){ alert('Control + shift + tab was pressed.'); }
          +    }
          +]);
          +
          + * Note: A KepMap starts enabled + * @constructor + * @param {String/HTMLElement/Ext.Element} el The element to bind to + * @param {Object} config The config + * @param {String} eventName (optional) The event to bind to (defaults to "keydown") + */ +Ext.KeyMap = function(el, config, eventName){ + this.el = Ext.get(el); + this.eventName = eventName || "keydown"; + this.bindings = []; + if(config instanceof Array){ + for(var i = 0, len = config.length; i < len; i++){ + this.addBinding(config[i]); + } + }else{ + this.addBinding(config); + } + this.keyDownDelegate = Ext.EventManager.wrap(this.handleKeyDown, this, true); + this.enable(); +}; + +Ext.KeyMap.prototype = { + /** + * True to stop the event from bubbling and prevent the default browser action if the + * key was handled by the KeyMap (defaults to false) + * @type Boolean + */ + stopEvent : false, + + /** + * Add a new binding to this KeyMap. The following config object properties are supported: + *
          +Property    Type             Description
          +----------  ---------------  ----------------------------------------------------------------------
          +key         String/Array     A single keycode or an array of keycodes to handle
          +shift       Boolean          True to handle key only when shift is pressed (defaults to false)
          +ctrl        Boolean          True to handle key only when ctrl is pressed (defaults to false)
          +alt         Boolean          True to handle key only when alt is pressed (defaults to false)
          +fn          Function         The function to call when KeyMap finds the expected key combination
          +scope       Object           The scope of the callback function
          +
          + * + * Usage: + *
          
          +// Create a KeyMap
          +var map = new Ext.KeyMap(document, {
          +    key: Ext.EventObject.ENTER,
          +    fn: handleKey,
          +    scope: this
          +});
          +
          +//Add a new binding to the existing KeyMap later
          +map.addBinding({
          +    key: 'abc',
          +    shift: true,
          +    fn: handleKey,
          +    scope: this
          +});
          +
          + * @param {Object} config A single KeyMap config + */ + addBinding : function(config){ + var keyCode = config.key, + shift = config.shift, + ctrl = config.ctrl, + alt = config.alt, + fn = config.fn, + scope = config.scope; + if(typeof keyCode == "string"){ + var ks = []; + var keyString = keyCode.toUpperCase(); + for(var j = 0, len = keyString.length; j < len; j++){ + ks.push(keyString.charCodeAt(j)); + } + keyCode = ks; + } + var keyArray = keyCode instanceof Array; + var handler = function(e){ + if((!shift || e.shiftKey) && (!ctrl || e.ctrlKey) && (!alt || e.altKey)){ + var k = e.getKey(); + if(keyArray){ + for(var i = 0, len = keyCode.length; i < len; i++){ + if(keyCode[i] == k){ + if(this.stopEvent){ + e.stopEvent(); + } + fn.call(scope || window, k, e); + return; + } + } + }else{ + if(k == keyCode){ + if(this.stopEvent){ + e.stopEvent(); + } + fn.call(scope || window, k, e); + } + } + } + }; + this.bindings.push(handler); + }, + + // private + handleKeyDown : function(e){ + if(this.enabled){ //just in case + var b = this.bindings; + for(var i = 0, len = b.length; i < len; i++){ + b[i].call(this, e); + } + } + }, + + /** + * Returns true if this KepMap is enabled + * @return {Boolean} + */ + isEnabled : function(){ + return this.enabled; + }, + + /** + * Enable this KeyMap + */ + enable: function(){ + if(!this.enabled){ + this.el.on(this.eventName, this.keyDownDelegate); + this.enabled = true; + } + }, + + /** + * Disable this KeyMap + */ + disable: function(){ + if(this.enabled){ + this.el.removeListener(this.eventName, this.keyDownDelegate); + this.enabled = false; + } + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/util/KeyNav.js b/www/extras/yui-ext/source/util/KeyNav.js new file mode 100644 index 000000000..c83a02a54 --- /dev/null +++ b/www/extras/yui-ext/source/util/KeyNav.js @@ -0,0 +1,131 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.KeyNav + * Provides a convenient wrapper for normalized keyboard navigation. KeyNav allows you to bind + * navigation keys to function calls that will get called when the keys are pressed. + *
          Usage: +
          
          +var nav = new Ext.KeyNav("my-element", {
          +    "left" : function(e){
          +        this.moveLeft(e.ctrlKey);
          +    },
          +    "right" : function(e){
          +        this.moveRight(e.ctrlKey);
          +    },
          +    "enter" : function(e){
          +        this.save();
          +    },
          +    scope : this
          +});
          +
          + * @constructor + * @param {String/HTMLElement/Ext.Element} el The element to bind to + * @param {Object} config The config + */ +Ext.KeyNav = function(el, config){ + this.el = Ext.get(el); + Ext.apply(this, config); + if(!this.disabled){ + this.disabled = true; + this.enable(); + } +}; + +Ext.KeyNav.prototype = { + disabled : false, + defaultEventAction: "stopEvent", + + prepareEvent : function(e){ + var k = e.getKey(); + var h = this.keyToHandler[k]; + //if(h && this[h]){ + // e.stopPropagation(); + //} + if(Ext.isSafari && h && k >= 37 && k <= 40){ + e.stopEvent(); + } + }, + + relay : function(e){ + var k = e.getKey(); + var h = this.keyToHandler[k]; + if(h && this[h]){ + if(this.doRelay(e, this[h], h) !== true){ + e[this.defaultEventAction](); + } + } + }, + + doRelay : function(e, h, hname){ + return h.call(this.scope || this, e); + }, + + // possible handlers + enter : false, + left : false, + right : false, + up : false, + down : false, + tab : false, + esc : false, + pageUp : false, + pageDown : false, + del : false, + home : false, + end : false, + + // quick lookup hash + keyToHandler : { + 37 : "left", + 39 : "right", + 38 : "up", + 40 : "down", + 33 : "pageUp", + 34 : "pageDown", + 46 : "del", + 36 : "home", + 35 : "end", + 13 : "enter", + 27 : "esc", + 9 : "tab" + }, + + /** + * Enable this KeyNav + */ + enable: function(){ + if(this.disabled){ + // ie won't do special keys on keypress, no one else will repeat keys with keydown + // the EventObject will normalize Safari automatically + if(Ext.isIE){ + this.el.on("keydown", this.relay, this); + }else{ + this.el.on("keydown", this.prepareEvent, this); + this.el.on("keypress", this.relay, this); + } + this.disabled = false; + } + }, + + /** + * Disable this KeyNav + */ + disable: function(){ + if(!this.disabled){ + if(Ext.isIE){ + this.el.un("keydown", this.relay); + }else{ + this.el.un("keydown", this.prepareEvent); + this.el.un("keypress", this.relay); + } + this.disabled = true; + } + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/util/MixedCollection.js b/www/extras/yui-ext/source/util/MixedCollection.js new file mode 100644 index 000000000..779c1240f --- /dev/null +++ b/www/extras/yui-ext/source/util/MixedCollection.js @@ -0,0 +1,510 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.util.MixedCollection + * @extends Ext.util.Observable + * 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 (defaults to false) + * @param {Function} keyFn A function that can accept an item of the type(s) stored in this MixedCollection + * and return the key value for that item. This is used when available to look up the key on items that + * were passed without an explicit key parameter to a MixedCollection method. Passing this parameter is + * equivalent to providing an implementation for the {@link #getKey} method. + */ +Ext.util.MixedCollection = function(allowFunctions, keyFn){ + this.items = []; + this.map = {}; + this.keys = []; + this.length = 0; + this.addEvents({ + /** + * @event clear + * Fires when the collection is cleared. + */ + "clear" : true, + /** + * @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" : true, + /** + * @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" : true, + /** + * @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" : true, + "sort" : true + }); + this.allowFunctions = allowFunctions === true; + if(keyFn){ + this.getKey = keyFn; + } + Ext.util.MixedCollection.superclass.constructor.call(this); +}; + +Ext.extend(Ext.util.MixedCollection, 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); + } + if(typeof key == "undefined" || key === null){ + this.length++; + this.items.push(o); + this.keys.push(null); + }else{ + var old = this.map[key]; + if(old){ + return this.replace(key, o); + } + this.length++; + this.items.push(o); + this.map[key] = o; + this.keys.push(key); + } + this.fireEvent("add", this.length-1, o, key); + return o; + }, + +/** + * MixedCollection has a generic way to fetch keys if you implement getKey. +
          
          +    // normal way
          +    var mc = new Ext.util.MixedCollection();
          +    mc.add(someEl.dom.id, someEl);
          +    mc.add(otherEl.dom.id, otherEl);
          +    //and so on
          +    
          +    // using getKey
          +    var mc = new 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 o.id; 
          +    },
          +   
          +/**
          + * 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);
          +        }
          +        var old = this.item(key);
          +        if(typeof key == "undefined" || key === null || typeof old == "undefined"){
          +             return this.add(key, o);
          +        }
          +        var index = this.indexOfKey(key);
          +        this.items[index] = o;
          +        this.map[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. returning false from the function will stop the iteration.
          + * @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){
          +        var items = [].concat(this.items); // each safe for removal
          +        for(var i = 0, len = items.length; i < len; i++){
          +            if(fn.call(scope || items[i], items[i], i, len) === false){
          +                break;
          +            }
          +        }
          +    },
          +   
          +/**
          + * 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], i, len);
          +        }
          +    },
          +   
          +/**
          + * 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], this.keys[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.length){
          +            return this.add(key, o);
          +        }
          +        this.length++;
          +        this.items.splice(index, 0, o);
          +        if(typeof key != "undefined" && key != null){
          +            this.map[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){
          +        return this.removeAt(this.indexOf(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){
          +        if(index < this.length && index >= 0){
          +            this.length--;
          +            var o = this.items[index];
          +            this.items.splice(index, 1);
          +            var key = this.keys[index];
          +            if(typeof key != "undefined"){
          +                delete this.map[key];
          +            }
          +            this.keys.splice(index, 1);
          +            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){
          +        return this.removeAt(this.indexOfKey(key));
          +    },
          +   
          +/**
          + * Returns the number of items in the collection.
          + * @return {Number} the number of items in the collection.
          + */
          +    getCount : function(){
          +        return this.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 OR index. Key has priority over index.
          + * @param {String/Number} key The key or index of the item.
          + * @return {Object} The item associated with the passed key.
          + */
          +    item : function(key){
          +        var item = typeof this.map[key] != "undefined" ? this.map[key] : this.items[key];
          +        return typeof item != 'function' || this.allowFunctions ? item : null; // for prototype!
          +    },
          +    
          +/**
          + * Returns the item at the specified index.
          + * @param {Number} index The index of the item.
          + * @return {Object}
          + */
          +    itemAt : function(index){
          +        return this.items[index];
          +    },
          +    
          +/**
          + * Returns the item associated with the passed key.
          + * @param {String/Number} key The key of the item.
          + * @return {Object} The item associated with the passed key.
          + */
          +    key : function(key){
          +        return this.map[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.map[key] != "undefined";
          +    },
          +   
          +/**
          + * Removes all items from the collection.
          + */
          +    clear : function(){
          +        this.length = 0;
          +        this.items = [];
          +        this.keys = [];
          +        this.map = {};
          +        this.fireEvent("clear");
          +    },
          +   
          +/**
          + * Returns the first item in the collection.
          + * @return {Object} the first item in the collection..
          + */
          +    first : function(){
          +        return this.items[0]; 
          +    },
          +   
          +/**
          + * Returns the last item in the collection.
          + * @return {Object} the last item in the collection..
          + */
          +    last : function(){
          +        return this.items[this.length-1];   
          +    },
          +    
          +    _sort : function(property, dir, fn){
          +        var dsc = String(dir).toUpperCase() == "DESC" ? -1 : 1;
          +        fn = fn || function(a, b){
          +            return a-b;
          +        };
          +        var c = [], k = this.keys, items = this.items;
          +        for(var i = 0, len = items.length; i < len; i++){
          +            c[c.length] = {key: k[i], value: items[i], index: i};
          +        }
          +        c.sort(function(a, b){
          +            var v = fn(a[property], b[property]) * dsc;
          +            if(v == 0){
          +                v = (a.index < b.index ? -1 : 1);
          +            }
          +            return v;
          +        });
          +        for(var i = 0, len = c.length; i < len; i++){
          +            items[i] = c[i].value;
          +            k[i] = c[i].key;
          +        }
          +        this.fireEvent("sort", this);
          +    },
          +    
          +    /**
          +     * Sorts this collection with the passed comparison function
          +     * @param {String} direction (optional) "ASC" or "DESC"
          +     * @param {Function} fn (optional) comparison function
          +     */
          +    sort : function(dir, fn){
          +        this._sort("value", dir, fn);
          +    },
          +    
          +    /**
          +     * Sorts this collection by keys
          +     * @param {String} direction (optional) "ASC" or "DESC"
          +     * @param {Function} fn (optional) a comparison function (defaults to case insensitive string)
          +     */
          +    keySort : function(dir, fn){
          +        this._sort("key", dir, fn || function(a, b){
          +            return String(a).toUpperCase()-String(b).toUpperCase();
          +        });
          +    },
          +    
          +    /**
          +     * Returns a range of items in this collection
          +     * @param {Number} startIndex (optional) defaults to 0
          +     * @param {Number} endIndex (optional) default to the last item
          +     * @return {Array} An array of items
          +     */
          +    getRange : function(start, end){
          +        var items = this.items;
          +        if(items.length < 1){
          +            return [];
          +        }
          +        start = start || 0;
          +        end = Math.min(typeof end == "undefined" ? this.length-1 : end, this.length-1);
          +        var r = [];
          +        if(start <= end){
          +            for(var i = start; i <= end; i++) {
          +        	    r[r.length] = items[i];
          +            }
          +        }else{
          +            for(var i = start; i >= end; i--) {
          +        	    r[r.length] = items[i];
          +            }
          +        }
          +        return r;
          +    },
          +        
          +    /**
          +     * Filter the objects in this collection by a specific property. 
          +     * Returns a new collection that has been filtered.
          +     * @param {String} property A property on your objects
          +     * @param {String/RegExp} value Either string that the property values 
          +     * should start with or a RegExp to test against the property
          +     * @return {MixedCollection} The new filtered collection
          +     */
          +    filter : function(property, value){
          +        if(!value.exec){ // not a regex
          +            value = String(value);
          +            if(value.length == 0){
          +                return this.clone();
          +            }
          +            value = new RegExp("^" + Ext.escapeRe(value), "i");
          +        }
          +        return this.filterBy(function(o){
          +            return o && value.test(o[property]);
          +        });
          +	},
          +    
          +    /**
          +     * Filter by a function. * Returns a new collection that has been filtered.
          +     * The passed function will be called with each 
          +     * object in the collection. If the function returns true, the value is included 
          +     * otherwise it is filtered.
          +     * @param {Function} fn The function to be called, it will receive the args o (the object), k (the key)
          +     * @param {Object} scope (optional) The scope of the function (defaults to this) 
          +     * @return {MixedCollection} The new filtered collection
          +     */
          +    filterBy : function(fn, scope){
          +        var r = new Ext.util.MixedCollection();
          +        r.getKey = this.getKey;
          +        var k = this.keys, it = this.items;
          +        for(var i = 0, len = it.length; i < len; i++){
          +            if(fn.call(scope||this, it[i], k[i])){
          +				r.add(k[i], it[i]);
          +			}
          +        }
          +        return r;
          +    },
          +    
          +    /**
          +     * Creates a duplicate of this collection
          +     * @return {MixedCollection}
          +     */
          +    clone : function(){
          +        var r = new Ext.util.MixedCollection();
          +        var k = this.keys, it = this.items;
          +        for(var i = 0, len = it.length; i < len; i++){
          +            r.add(k[i], it[i]);
          +        }
          +        r.getKey = this.getKey;
          +        return r;
          +    }
          +});
          +/**
          + * 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.
          + */
          +Ext.util.MixedCollection.prototype.get = Ext.util.MixedCollection.prototype.item;
          \ No newline at end of file
          diff --git a/www/extras/yui-ext/source/util/Observable.js b/www/extras/yui-ext/source/util/Observable.js
          new file mode 100644
          index 000000000..a8ee859f6
          --- /dev/null
          +++ b/www/extras/yui-ext/source/util/Observable.js
          @@ -0,0 +1,348 @@
          +/*
          + * Ext JS Library 1.0.1
          + * Copyright(c) 2006-2007, Ext JS, LLC.
          + * licensing@extjs.com
          + * 
          + * http://www.extjs.com/license
          + */
          +
          +
          +/**
          + * @class 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: + *
          
          + Employee = function(name){
          +    this.name = name;
          +    this.events = {
          +        "fired" : true,
          +        "quit" : true
          +    }
          + }
          + Ext.extend(Employee, Ext.util.Observable);
          +
          + */ +Ext.util.Observable = function(){ + if(this.listeners){ + this.on(this.listeners); + delete this.listeners; + } +}; +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()]; + if(typeof ce == "object"){ + return ce.fire.apply(ce, Array.prototype.slice.call(arguments, 1)); + }else{ + return true; + } + }, + + // private + filterOptRe : /^(?:scope|delay|buffer|single)$/, + + /** + * Appends an event handler to this component + * @param {String} eventName The type of event to listen for + * @param {Function} handler The method the event invokes + * @param {Object} scope (optional) The scope in which to execute the handler + * function. The handler function's "this" context. + * @param {Object} options (optional) An object containing handler configuration + * properties. This may contain any of the following properties:
            + *
          • scope {Object} The scope in which to execute the handler function. The handler function's "this" context.
          • + *
          • delegate {String} A simple selector to filter the target or look for a descendant of the target
          • + *
          • stopEvent {Boolean} True to stop the event. That is stop propagation, and prevent the default action.
          • + *
          • preventDefault {Boolean} True to prevent the default action
          • + *
          • stopPropagation {Boolean} True to prevent event propagation
          • + *
          • normalized {Boolean} False to pass a browser event to the handler function instead of an Ext.EventObject
          • + *
          • delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.
          • + *
          • single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.
          • + *
          • buffer {Number} Causes the handler to be scheduled to run in an {@link Ext.util.DelayedTask} delayed + * by the specified number of milliseconds. If the event fires again within that time, the original + * handler is not invoked, but the new handler is scheduled in its place.
          • + *
          + *

          + * Combining Options
          + * Using the options argument, it is possible to combine different types of listeners:
          + *
          + * A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)

          + * Code: + *
          el.on('click', this.onClick, this, {
          +     * 	single: true,
          +     * 	delay: 100,
          +     * 	stopEvent : true,
          +     *  forumId: 4
          +     * });
          + *

          + * The method also allows for a single argument to be passed which is a config object containing properties + * which specify multiple handlers. + *

          + * Attaching multiple handlers in 1 call
          + * Code: + *

          el.on({
          +     * 	'click' : {
          +     *     	fn: this.onClick
          +     * 		scope: this,
          +     * 		delay: 100
          +     *     }, 
          +     * 	'mouseover' : {
          +     *     	fn: this.onMouseOver
          +     * 		scope: this
          +     *     },
          +     * 	'mouseout' : {
          +     *     	fn: this.onMouseOut
          +     * 		scope: this
          +     *     }
          +     * });
          + *

          + * Or a shorthand syntax:
          + * Code: + *

          el.on({
          +     * 	'click' : this.onClick,
          +     * 	'mouseover' : this.onMouseOver,
          +     * 	'mouseout' : this.onMouseOut
          +     * 	scope: this
          +     * });
          + */ + addListener : function(eventName, fn, scope, o){ + if(typeof eventName == "object"){ + o = eventName; + for(var e in o){ + if(this.filterOptRe.test(e)){ + continue; + } + if(typeof o[e] == "function"){ + // shared options + this.addListener(e, o[e], o.scope, o); + }else{ + // individual options + this.addListener(e, o[e].fn, o[e].scope, o[e]); + } + } + return; + } + o = (!o || typeof o == "boolean") ? {} : o; + eventName = eventName.toLowerCase(); + var ce = this.events[eventName] || true; + if(typeof ce == "boolean"){ + ce = new Ext.util.Event(this, eventName); + this.events[eventName] = ce; + } + ce.addListener(fn, scope, o); + }, + + /** + * 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){ + var ce = this.events[eventName.toLowerCase()]; + if(typeof ce == "object"){ + ce.removeListener(fn, scope); + } + }, + + /** + * Removes all listeners for this object + */ + purgeListeners : function(){ + for(var evt in this.events){ + if(typeof this.events[evt] == "object"){ + this.events[evt].clearListeners(); + } + } + }, + + relayEvents : function(o, events){ + var createHandler = function(ename){ + return function(){ + return this.fireEvent.apply(this, Ext.combine(ename, Array.prototype.slice.call(arguments, 0))); + }; + }; + for(var i = 0, len = events.length; i < len; i++){ + var ename = events[i]; + if(!this.events[ename]){ this.events[ename] = true; }; + o.on(ename, createHandler(ename), this); + } + }, + + /** + * Copies any events from the passed object onto this object if they do not already exist. The passed object + * must also inherit from Observable for this method to have any effect. + * @param {Object} object The object from which to copy events + */ + addEvents : function(o){ + if(!this.events){ + this.events = {}; + } + Ext.applyIf(this.events, o); + }, + + /** + * Checks to see if this object is currently listening for a specified event + * @param {String} eventName The name of the event to check for + * @return {Boolean} True if the event is being listened for, else false + */ + hasListener : function(eventName){ + var e = this.events[eventName]; + return typeof e == "object" && e.listeners.length > 0; + } +}; +/** + * Appends an event handler to this element (shorthand for addListener) + * @param {String} eventName The type of event to listen for + * @param {Function} handler The method the event invokes + * @param {Object} options (optional) + * @method + */ +Ext.util.Observable.prototype.on = Ext.util.Observable.prototype.addListener; +/** + * Removes a listener (shorthand for removeListener) + * @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 + * @method + */ +Ext.util.Observable.prototype.un = Ext.util.Observable.prototype.removeListener; + +/** + * Starts capture on the specified Observable. All events will be passed + * to the supplied function with the event name + standard signature of the event + * before the event is fired. If the supplied function returns false, + * the event will not fire. + * @param {Observable} o The Observable to capture + * @param {Function} fn The function to call + * @param {Object} scope (optional) The scope (this object) for the fn + * @static + */ +Ext.util.Observable.capture = function(o, fn, scope){ + o.fireEvent = o.fireEvent.createInterceptor(fn, scope); +}; + +/** + * Removes all added captures from the Observable. + * @param {Observable} o The Observable to release + * @static + */ +Ext.util.Observable.releaseCapture = function(o){ + o.fireEvent = Ext.util.Observable.prototype.fireEvent; +}; + +(function(){ + + var createBuffered = function(h, o, scope){ + var task = new Ext.util.DelayedTask(); + return function(){ + task.delay(o.buffer, h, scope, Array.prototype.slice.call(arguments, 0)); + }; + }; + + var createSingle = function(h, e, fn, scope){ + return function(){ + e.removeListener(fn, scope); + return h.apply(scope, arguments); + }; + }; + + var createDelayed = function(h, o, scope){ + return function(){ + var args = Array.prototype.slice.call(arguments, 0); + setTimeout(function(){ + h.apply(scope, args); + }, o.delay || 10); + }; + }; + + Ext.util.Event = function(obj, name){ + this.name = name; + this.obj = obj; + this.listeners = []; + }; + + Ext.util.Event.prototype = { + addListener : function(fn, scope, options){ + var o = options || {}; + scope = scope || this.obj; + if(!this.isListening(fn, scope)){ + var l = {fn: fn, scope: scope, options: o}; + var h = fn; + if(o.delay){ + h = createDelayed(h, o, scope); + } + if(o.single){ + h = createSingle(h, this, fn, scope); + } + if(o.buffer){ + h = createBuffered(h, o, scope); + } + l.fireFn = h; + if(!this.firing){ // if we are currently firing this event, don't disturb the listener loop + this.listeners.push(l); + }else{ + this.listeners = this.listeners.slice(0); + this.listeners.push(l); + } + } + }, + + findListener : function(fn, scope){ + scope = scope || this.obj; + var ls = this.listeners; + for(var i = 0, len = ls.length; i < len; i++){ + var l = ls[i]; + if(l.fn == fn && l.scope == scope){ + return i; + } + } + return -1; + }, + + isListening : function(fn, scope){ + return this.findListener(fn, scope) != -1; + }, + + removeListener : function(fn, scope){ + var index; + if((index = this.findListener(fn, scope)) != -1){ + if(!this.firing){ + this.listeners.splice(index, 1); + }else{ + this.listeners = this.listeners.slice(0); + this.listeners.splice(index, 1); + } + return true; + } + return false; + }, + + clearListeners : function(){ + this.listeners = []; + }, + + fire : function(){ + var ls = this.listeners, scope, len = ls.length; + if(len > 0){ + this.firing = true; + var args = Array.prototype.slice.call(arguments, 0); + for(var i = 0; i < len; i++){ + var l = ls[i]; + if(l.fireFn.apply(l.scope, arguments) === false){ + this.firing = false; + return false; + } + } + this.firing = false; + } + return true; + } + }; +})(); \ No newline at end of file diff --git a/www/extras/yui-ext/source/util/TaskMgr.js b/www/extras/yui-ext/source/util/TaskMgr.js new file mode 100644 index 000000000..6e762a795 --- /dev/null +++ b/www/extras/yui-ext/source/util/TaskMgr.js @@ -0,0 +1,94 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.util.TaskRunner = function(interval){ + interval = interval || 10; + var tasks = [], removeQueue = []; + var id = 0; + var running = false; + + var stopThread = function(){ + running = false; + clearInterval(id); + id = 0; + }; + + var startThread = function(){ + if(!running){ + running = true; + id = setInterval(runTasks, interval); + } + }; + + var removeTask = function(task){ + removeQueue.push(task); + if(task.onStop){ + task.onStop(); + } + }; + + var runTasks = function(){ + if(removeQueue.length > 0){ + for(var i = 0, len = removeQueue.length; i < len; i++){ + tasks.remove(removeQueue[i]); + } + removeQueue = []; + if(tasks.length < 1){ + stopThread(); + return; + } + } + var now = new Date().getTime(); + for(var i = 0, len = tasks.length; i < len; ++i){ + var t = tasks[i]; + var itime = now - t.taskRunTime; + if(t.interval <= itime){ + var rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]); + t.taskRunTime = now; + if(rt === false || t.taskRunCount === t.repeat){ + removeTask(t); + return; + } + } + if(t.duration && t.duration <= (now - t.taskStartTime)){ + removeTask(t); + } + } + }; + + /** + * Queues a new task. + * @param {Object} task + */ + this.start = function(task){ + tasks.push(task); + task.taskStartTime = new Date().getTime(); + task.taskRunTime = 0; + task.taskRunCount = 0; + startThread(); + return task; + }; + + this.stop = function(task){ + removeTask(task); + return task; + }; + + this.stopAll = function(){ + stopThread(); + for(var i = 0, len = tasks.length; i < len; i++){ + if(tasks[i].onStop){ + tasks[i].onStop(); + } + } + tasks = []; + removeQueue = []; + }; +}; + +Ext.TaskMgr = new Ext.util.TaskRunner(); \ No newline at end of file diff --git a/www/extras/yui-ext/source/util/TextMetrics.js b/www/extras/yui-ext/source/util/TextMetrics.js new file mode 100644 index 000000000..752c00966 --- /dev/null +++ b/www/extras/yui-ext/source/util/TextMetrics.js @@ -0,0 +1,121 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.util.TextMetrics + * Provides precise pixel measurements for blocks of text so that you can determine exactly how high and + * wide, in pixels, a given block of text will be. + * @singleton + */ +Ext.util.TextMetrics = function(){ + var shared; + return { + /** + * Measures the size of the specified text + * @param {String/HTMLElement} el The element, dom node or id from which to copy existing CSS styles + * that can affect the size of the rendered text + * @param {String} text The text to measure + * @param {Number} fixedWidth (optional) If the text will be multiline, you have to set a fixed width + * in order to accurately measure the text height + * @return {Object} An object containing the text's size {width: (width), height: (height)} + */ + measure : function(el, text, fixedWidth){ + if(!shared){ + shared = Ext.util.TextMetrics.Instance(el, fixedWidth); + } + shared.bind(el); + shared.setFixedWidth(fixedWidth || 'auto'); + return shared.getSize(text); + }, + + /** + * Return a unique TextMetrics instance that can be bound directly to an element and reused. This reduces + * the overhead of multiple calls to initialize the style properties on each measurement. + * @param {String/HTMLElement} el The element, dom node or id that the instance will be bound to + * @param {Number} fixedWidth (optional) If the text will be multiline, you have to set a fixed width + * in order to accurately measure the text height + * @return {Ext.util.TextMetrics.Instance} instance The new instance + */ + createInstance : function(el, fixedWidth){ + return Ext.util.TextMetrics.Instance(el, fixedWidth); + } + }; +}(); + +Ext.util.TextMetrics.Instance = function(bindTo, fixedWidth){ + var ml = new Ext.Element(document.createElement('div')); + document.body.appendChild(ml.dom); + ml.position('absolute'); + ml.setLeftTop(-1000, -1000); + ml.hide(); + + if(fixedWidth){ + mi.setWidth(fixedWidth); + } + + var instance = { + /** + * Returns the size of the specified text based on the internal element's style and width properties + * @param {String} text The text to measure + * @return {Object} An object containing the text's size {width: (width), height: (height)} + */ + getSize : function(text){ + ml.update(text); + var s = ml.getSize(); + ml.update(''); + return s; + }, + + /** + * Binds this TextMetrics instance to an element from which to copy existing CSS styles + * that can affect the size of the rendered text + * @param {String/HTMLElement} el The element, dom node or id + */ + bind : function(el){ + ml.setStyle( + Ext.fly(el).getStyles('font-size','font-style', 'font-weight', 'font-family','line-height') + ); + }, + + /** + * Sets a fixed width on the internal measurement element. If the text will be multiline, you have + * to set a fixed width in order to accurately measure the text height. + * @param {Number} width The width to set on the element + */ + setFixedWidth : function(width){ + ml.setWidth(width); + }, + + /** + * Returns the measured width of the specified text + * @param {String} text The text to measure + * @return {Number} width The width in pixels + */ + getWidth : function(text){ + ml.dom.style.width = 'auto'; + return this.getSize(text).width; + }, + + /** + * Returns the measured height of the specified text. For multiline text, be sure to call + * {@link #setFixedWidth} if necessary. + * @param {String} text The text to measure + * @return {Number} height The height in pixels + */ + getHeight : function(text){ + return this.getSize(text).height; + } + }; + + instance.bind(bindTo); + + return instance; +}; + +// backwards compat +Ext.Element.measureText = Ext.util.TextMetrics.measure; \ 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..9f7ad8328 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/BasicDialog.js @@ -0,0 +1,1193 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.BasicDialog + * @extends Ext.util.Observable + * Lightweight Dialog Class. The code below shows the creation of a typical dialog using existing HTML markup: + *
          
          +    var dlg = new Ext.BasicDialog("my-dlg", {
          +        height: 200,
          +        width: 300,
          +        minHeight: 100,
          +        minWidth: 150,
          +        modal: true,
          +        proxyDrag: true,
          +        shadow: true
          +    });
          +    dlg.addKeyListener(27, dlg.hide, dlg); // ESC can also close the dialog
          +    dlg.addButton('OK', dlg.hide, dlg);    // Could call a save function instead of hiding
          +    dlg.addButton('Cancel', dlg.hide, dlg);
          +    dlg.show();
          +  
          + A Dialog should always be a direct child of the body element. + * @cfg {Boolean/DomHelper} autoCreate True to auto create from scratch, or using a DomHelper Object (defaults to false) + * @cfg {String} title Default text to display in the title bar (defaults to null) + * @cfg {Number} width Width of the dialog in pixels (can also be set via CSS). Determined by browser if unspecified. + * @cfg {Number} height Height of the dialog in pixels (can also be set via CSS). Determined by browser if unspecified. + * @cfg {Number} x The default top page coordinate of the dialog (defaults to center screen) + * @cfg {Number} y The default left page coordinate of the dialog (defaults to center screen) + * @cfg {String/Element} animateTarget Id or element from which the dialog should animate while opening + * (defaults to null with no animation) + * @cfg {Boolean} resizable False to disable manual dialog resizing (defaults to true) + * @cfg {String} resizeHandles Which resize handles to display - see the {@link Ext.Resizable} handles config + * property for valid values (defaults to 'all') + * @cfg {Number} minHeight The minimum allowable height for a resizable dialog (defaults to 80) + * @cfg {Number} minWidth The minimum allowable width for a resizable dialog (defaults to 200) + * @cfg {Boolean} modal True to show the dialog modally, preventing user interaction with the rest of the page (defaults to false) + * @cfg {Boolean} autoScroll True to allow the dialog body contents to overflow and display scrollbars (defaults to false) + * @cfg {Boolean} closable False to remove the built-in top-right corner close button (defaults to true) + * @cfg {Boolean} collapsible False to remove the built-in top-right corner collapse button (defaults to true) + * @cfg {Boolean} constraintoviewport True to keep the dialog constrained within the visible viewport boundaries (defaults to true) + * @cfg {Boolean} syncHeightBeforeShow True to cause the dimensions to be recalculated before the dialog is shown (defaults to false) + * @cfg {Boolean} draggable False to disable dragging of the dialog within the viewport (defaults to true) + * @cfg {Boolean} autoTabs If true, all elements with class 'x-dlg-tab' will get automatically converted to tabs (defaults to false) + * @cfg {String} tabTag The tag name of tab elements, used when autoTabs = true (defaults to 'div') + * @cfg {Boolean} proxyDrag True to drag a lightweight proxy element rather than the dialog itself, used when + * draggable = true (defaults to false) + * @cfg {Boolean} fixedcenter True to ensure that anytime the dialog is shown or resized it gets centered (defaults to false) + * @cfg {Boolean/String} shadow True or "sides" for the default effect, "frame" for 4-way shadow, and "drop" for bottom-right + * shadow (defaults to false) + * @cfg {Number} shadowOffset The number of pixels to offset the shadow if displayed (defaults to 5) + * @cfg {String} buttonAlign Valid values are "left," "center" and "right" (defaults to "right") + * @cfg {Number} minButtonWidth Minimum width of all dialog buttons (defaults to 75) + * @cfg {Boolean} shim True to create an iframe shim that prevents selects from showing through (defaults to false) + * @constructor + * Create a new BasicDialog. + * @param {String/HTMLElement/Ext.Element} el The container element or DOM node, or its id + * @param {Object} config Configuration options + */ +Ext.BasicDialog = function(el, config){ + this.el = Ext.get(el); + var dh = Ext.DomHelper; + if(!this.el && config && config.autoCreate){ + if(typeof config.autoCreate == "object"){ + if(!config.autoCreate.id){ + config.autoCreate.id = el; + } + this.el = dh.append(document.body, + config.autoCreate, true); + }else{ + this.el = dh.append(document.body, + {tag: "div", id: el, style:'visibility:hidden;'}, true); + } + } + el = this.el; + el.setDisplayed(true); + el.hide = this.hideAction; + this.id = el.id; + el.addClass("x-dlg"); + + Ext.apply(this, config); + + this.proxy = el.createProxy("x-dlg-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); + } + /** The header element @type Ext.Element */ + this.header = el.child("/.x-dlg-hd"); + /** The body element @type Ext.Element */ + this.body = el.child("/.x-dlg-bd"); + /** The footer element @type Ext.Element */ + this.footer = el.child("/.x-dlg-ft"); + + if(!this.header){ + this.header = el.createChild({tag: "div", cls:"x-dlg-hd", html: " "}, this.body ? this.body.dom : null); + } + if(!this.body){ + this.body = el.createChild({tag: "div", cls:"x-dlg-bd"}); + } + + this.header.unselectable(); + if(this.title){ + this.header.update(this.title); + } + // this element allows the dialog to be focused for keyboard event + this.focusEl = el.createChild({tag: "a", href:"#", cls:"x-dlg-focus", tabIndex:"-1"}); + this.focusEl.swallowEvent("click", true); + + this.header.wrap({cls:"x-dlg-hd-right"}).wrap({cls:"x-dlg-hd-left"}, true); + + // wrap the body and footer for special rendering + this.bwrap = this.body.wrap({tag: "div", cls:"x-dlg-dlg-body"}); + if(this.footer){ + this.bwrap.dom.appendChild(this.footer.dom); + } + + this.bg = this.el.createChild({ + tag: "div", cls:"x-dlg-bg", + html: '
           
          ' + }); + this.centerBg = this.bg.child("div.x-dlg-bg-center"); + + + if(this.autoScroll !== false && !this.autoTabs){ + this.body.setStyle("overflow", "auto"); + } + + this.toolbox = this.el.createChild({cls: "x-dlg-toolbox"}); + + if(this.closable !== false){ + this.el.addClass("x-dlg-closable"); + this.close = this.toolbox.createChild({cls:"x-dlg-close"}); + this.close.on("click", this.closeClick, this); + this.close.addClassOnOver("x-dlg-close-over"); + } + if(this.collapsible !== false){ + this.collapseBtn = this.toolbox.createChild({cls:"x-dlg-collapse"}); + this.collapseBtn.on("click", this.collapseClick, this); + this.collapseBtn.addClassOnOver("x-dlg-collapse-over"); + this.header.on("dblclick", this.collapseClick, this); + } + if(this.resizable !== false){ + this.el.addClass("x-dlg-resizable"); + this.resizer = new Ext.Resizable(el, { + minWidth: this.minWidth || 80, + minHeight:this.minHeight || 80, + handles: this.resizeHandles || "all", + pinned: true + }); + this.resizer.on("beforeresize", this.beforeResize, this); + this.resizer.on("resize", this.onResize, this); + } + if(this.draggable !== false){ + el.addClass("x-dlg-draggable"); + if (!this.proxyDrag) { + var dd = new Ext.dd.DD(el.dom.id, "WindowDrag"); + } + else { + var dd = new Ext.dd.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); + dd.scroll = false; + this.dd = dd; + } + if(this.modal){ + this.mask = dh.append(document.body, {tag: "div", cls:"x-dlg-mask"}, true); + this.mask.enableDisplayMode("block"); + this.mask.hide(); + this.el.addClass("x-dlg-modal"); + } + if(this.shadow){ + this.shadow = new Ext.Shadow({ + mode : typeof this.shadow == "string" ? this.shadow : "sides", + offset : this.shadowOffset + }); + }else{ + this.shadowOffset = 0; + } + if(Ext.useShims && this.shim !== false){ + this.shim = this.el.createShim(); + this.shim.hide = this.hideAction; + this.shim.hide(); + }else{ + this.shim = false; + } + if(this.autoTabs){ + this.initTabs(); + } + this.addEvents({ + /** + * @event keydown + * Fires when a key is pressed + * @param {Ext.BasicDialog} this + * @param {Ext.EventObject} e + */ + "keydown" : true, + /** + * @event move + * Fires when this dialog is moved by the user. + * @param {Ext.BasicDialog} this + * @param {Number} x The new page X + * @param {Number} y The new page Y + */ + "move" : true, + /** + * @event resize + * Fires when this dialog is resized by the user. + * @param {Ext.BasicDialog} this + * @param {Number} width The new width + * @param {Number} height The new height + */ + "resize" : true, + /** + * @event beforehide + * Fires before this dialog is hidden. + * @param {Ext.BasicDialog} this + */ + "beforehide" : true, + /** + * @event hide + * Fires when this dialog is hidden. + * @param {Ext.BasicDialog} this + */ + "hide" : true, + /** + * @event beforeshow + * Fires before this dialog is shown. + * @param {Ext.BasicDialog} this + */ + "beforeshow" : true, + /** + * @event show + * Fires when this dialog is shown. + * @param {Ext.BasicDialog} this + */ + "show" : true + }); + el.on("keydown", this.onKeyDown, this); + el.on("mousedown", this.toFront, this); + Ext.EventManager.onWindowResize(this.adjustViewport, this, true); + this.el.hide(); + Ext.DialogManager.register(this); + Ext.BasicDialog.superclass.constructor.call(this); +}; + +Ext.extend(Ext.BasicDialog, Ext.util.Observable, { + shadowOffset: 5, + minHeight: 80, + minWidth: 200, + minButtonWidth: 75, + defaultButton: null, + buttonAlign: "right", + tabTag: 'div', + firstShow: true, + + /** + * Sets the dialog title text + * @param {String} text The title text to display + * @return {Ext.BasicDialog} this + */ + setTitle : function(text){ + this.header.update(text); + return this; + }, + + // private + closeClick : function(){ + this.hide(); + }, + + // private + collapseClick : function(){ + this[this.collapsed ? "expand" : "collapse"](); + }, + + /** + * Collapses the dialog to its minimized state (only the title bar is visible). + * Equivalent to the user clicking the collapse dialog button. + */ + collapse : function(){ + if(!this.collapsed){ + this.collapsed = true; + this.el.addClass("x-dlg-collapsed"); + this.restoreHeight = this.el.getHeight(); + this.resizeTo(this.el.getWidth(), this.header.getHeight()); + } + }, + + /** + * Expands a collapsed dialog back to its normal state. Equivalent to the user + * clicking the expand dialog button. + */ + expand : function(){ + if(this.collapsed){ + this.collapsed = false; + this.el.removeClass("x-dlg-collapsed"); + this.resizeTo(this.el.getWidth(), this.restoreHeight); + } + }, + + /** + * Reinitializes the tabs component, clearing out old tabs and finding new ones. + * @return {Ext.TabPanel} The tabs component + */ + initTabs : function(){ + var tabs = this.getTabs(); + while(tabs.getTab(0)){ + tabs.removeTab(0); + } + this.el.select(this.tabTag+'.x-dlg-tab').each(function(el){ + var dom = el.dom; + tabs.addTab(Ext.id(dom), dom.title); + dom.title = ""; + }); + tabs.activate(0); + return tabs; + }, + + // private + beforeResize : function(){ + this.resizer.minHeight = Math.max(this.minHeight, this.getHeaderFooterHeight(true)+40); + }, + + // private + onResize : function(){ + this.refreshSize(); + this.syncBodyHeight(); + this.adjustAssets(); + this.focus(); + this.fireEvent("resize", this, this.size.width, this.size.height); + }, + + // private + onKeyDown : function(e){ + if(this.isVisible()){ + this.fireEvent("keydown", this, e); + } + }, + + /** + * Resizes the dialog. + * @param {Number} width + * @param {Number} height + * @return {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(); + } + this.fireEvent("resize", this, width, height); + return this; + }, + + + /** + * Resizes the dialog to fit the specified content size. + * @param {Number} width + * @param {Number} height + * @return {Ext.BasicDialog} this + */ + setContentSize : function(w, h){ + h += this.getHeaderFooterHeight() + this.body.getMargins("tb"); + w += this.body.getMargins("lr") + this.bwrap.getMargins("lr") + this.centerBg.getPadding("lr"); + //if(!this.el.isBorderBox()){ + h += this.body.getPadding("tb") + this.bwrap.getBorderWidth("tb") + this.body.getBorderWidth("tb") + this.el.getBorderWidth("tb"); + w += this.body.getPadding("lr") + this.bwrap.getBorderWidth("lr") + this.body.getBorderWidth("lr") + this.bwrap.getPadding("lr") + this.el.getBorderWidth("lr"); + //} + if(this.tabs){ + h += this.tabs.stripWrap.getHeight() + this.tabs.bodyEl.getMargins("tb") + this.tabs.bodyEl.getPadding("tb"); + w += this.tabs.bodyEl.getMargins("lr") + this.tabs.bodyEl.getPadding("lr"); + } + this.resizeTo(w, h); + return this; + }, + + /** + * Adds a key listener for when this dialog is displayed. This allows you to hook in a function that will be + * executed in response to a particular key being pressed while the dialog is active. + * @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 {Ext.BasicDialog} this + */ + addKeyListener : function(key, fn, scope){ + var keyCode, shift, ctrl, alt; + if(typeof key == "object" && !(key instanceof Array)){ + 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 (creates it if it doesn't exist). + * Note: If you wish to simply check for the existence of tabs without creating them, + * check for a null 'tabs' property. + * @return {Ext.TabPanel} The tabs component + */ + getTabs : function(){ + if(!this.tabs){ + this.el.addClass("x-dlg-auto-tabs"); + this.body.addClass(this.tabPosition == "bottom" ? "x-tabs-bottom" : "x-tabs-top"); + this.tabs = new Ext.TabPanel(this.body.dom, this.tabPosition == "bottom"); + } + return this.tabs; + }, + + /** + * Adds a button to the footer section of the dialog. + * @param {String/Object} config A string becomes the button text, an object can either be a Button config + * object or a valid 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 {Ext.Button} this + */ + addButton : function(config, handler, scope){ + var dh = Ext.DomHelper; + if(!this.footer){ + this.footer = dh.append(this.bwrap, {tag: "div", cls:"x-dlg-ft"}, true); + } + if(!this.btnContainer){ + var tb = this.footer.createChild({ + tag:"div", + cls:"x-dlg-btns x-dlg-btns-"+this.buttonAlign, + html:'
          ' + }, null, true); + this.btnContainer = tb.firstChild.firstChild.firstChild; + } + var bconfig = { + handler: handler, + scope: scope, + minWidth: this.minButtonWidth, + hideParent:true + }; + if(typeof config == "string"){ + bconfig.text = config; + }else{ + if(config.tag){ + bconfig.dhconfig = config; + }else{ + Ext.apply(bconfig, config); + } + } + var btn = new Ext.Button( + this.btnContainer.appendChild(document.createElement("td")), + bconfig + ); + this.syncBodyHeight(); + if(!this.buttons){ + /** + * Array of all the buttons that have been added to this dialog via addButton + * @type Array + */ + this.buttons = []; + } + this.buttons.push(btn); + return btn; + }, + + /** + * Sets the default button to be focused when the dialog is displayed. + * @param {Ext.BasicDialog.Button} btn The button object returned by {@link #addButton} + * @return {Ext.BasicDialog} this + */ + setDefaultButton : function(btn){ + this.defaultButton = btn; + return this; + }, + + // private + 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"); + height += this.centerBg.getPadding("tb"); + return height; + }, + + // private + syncBodyHeight : function(){ + var bd = this.body, cb = this.centerBg, bw = this.bwrap; + var height = this.size.height - this.getHeaderFooterHeight(false); + bd.setHeight(height-bd.getMargins("tb")); + var hh = this.header.getHeight(); + var h = this.size.height-hh; + cb.setHeight(h); + bw.setLeftTop(cb.getPadding("l"), hh+cb.getPadding("t")); + bw.setHeight(h-cb.getPadding("tb")); + bw.setWidth(this.el.getWidth(true)-cb.getPadding("lr")); + bd.setWidth(bw.getWidth(true)); + if(this.tabs){ + this.tabs.syncHeight(); + if(Ext.isIE){ + this.tabs.el.repaint(); + } + } + }, + + /** + * Restores the previous state of the dialog if Ext.state is configured. + * @return {Ext.BasicDialog} this + */ + restoreState : function(){ + var box = Ext.state.Manager.get(this.stateId || (this.el.id + "-state")); + if(box && box.width){ + this.xy = [box.x, box.y]; + this.resizeTo(box.width, box.height); + } + return this; + }, + + // private + beforeShow : function(){ + this.expand(); + if(this.fixedcenter){ + this.xy = this.el.getCenterXY(true); + } + if(this.modal){ + Ext.get(document.body).addClass("x-body-masked"); + this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); + this.mask.show(); + } + this.constrainXY(); + }, + + // private + animShow : function(){ + var b = Ext.get(this.animateTarget, true).getBox(); + this.proxy.setSize(b.width, b.height); + this.proxy.setLocation(b.x, b.y); + this.proxy.show(); + this.proxy.setBounds(this.xy[0], this.xy[1], this.size.width, this.size.height, + true, .35, this.showEl.createDelegate(this)); + }, + + /** + * Shows the dialog. + * @param {String/HTMLElement/Ext.Element} animateTarget (optional) Reset the animation target + * @return {Ext.BasicDialog} this + */ + show : function(animateTarget){ + if (this.fireEvent("beforeshow", this) === false){ + return; + } + if(this.syncHeightBeforeShow){ + this.syncBodyHeight(); + }else if(this.firstShow){ + this.firstShow = false; + this.syncBodyHeight(); // sync the height on the first show instead of in the constructor + } + this.animateTarget = animateTarget || this.animateTarget; + if(!this.el.isVisible()){ + this.beforeShow(); + if(this.animateTarget){ + this.animShow(); + }else{ + this.showEl(); + } + } + return this; + }, + + // private + showEl : function(){ + this.proxy.hide(); + this.el.setXY(this.xy); + this.el.show(); + this.adjustAssets(true); + this.toFront(); + this.focus(); + // IE peekaboo bug - fix found by Dave Fenwick + if(Ext.isIE){ + this.el.repaint(); + } + this.fireEvent("show", this); + }, + + /** + * Focuses the dialog. If a defaultButton is set, it will receive focus, otherwise the + * dialog itself will receive focus. + */ + focus : function(){ + if(this.defaultButton){ + this.defaultButton.focus(); + }else{ + this.focusEl.focus(); + } + }, + + // private + constrainXY : function(){ + if(this.constraintoviewport !== false){ + if(!this.viewSize){ + if(this.container){ + var s = this.container.getSize(); + this.viewSize = [s.width, s.height]; + }else{ + this.viewSize = [Ext.lib.Dom.getViewWidth(),Ext.lib.Dom.getViewHeight()]; + } + } + var s = Ext.get(this.container||document).getScroll(); + + 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+s.left){ + x = vw - w; + moved = true; + } + if(y + h > vh+s.top){ + y = vh - h; + moved = true; + } + // then make sure top/left isn't negative + if(x < s.left){ + x = s.left; + moved = true; + } + if(y < s.top){ + y = s.top; + moved = true; + } + if(moved){ + // cache xy + this.xy = [x, y]; + if(this.isVisible()){ + this.el.setLocation(x, y); + this.adjustAssets(); + } + } + } + }, + + // private + onDrag : function(){ + if(!this.proxyDrag){ + this.xy = this.el.getXY(); + this.adjustAssets(); + } + }, + + // private + 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(this.el); + } + if(this.shim){ + this.shim.show(); + } + } + if(this.shadow && this.shadow.isVisible()){ + this.shadow.show(this.el); + } + if(this.shim && this.shim.isVisible()){ + this.shim.setBounds(x, y, w, h); + } + }, + + // private + adjustViewport : function(w, h){ + if(!w || !h){ + w = Ext.lib.Dom.getViewWidth(); + h = Ext.lib.Dom.getViewHeight(); + } + // 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(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); + } + if(this.isVisible()){ + this.constrainXY(); + } + }, + + /** + * Destroys this dialog and all its supporting elements (including any tabs, shim, + * shadow, proxy, mask, etc.) Also removes all event listeners. + * @param {Boolean} removeEl (optional) true to remove the element from the DOM + */ + destroy : function(removeEl){ + if(this.isVisible()){ + this.animateTarget = null; + this.hide(); + } + Ext.EventManager.removeResizeListener(this.adjustViewport, this); + if(this.tabs){ + this.tabs.destroy(removeEl); + } + Ext.destroy( + this.shim, + this.proxy, + this.resizer, + this.close, + this.mask + ); + if(this.dd){ + this.dd.unreg(); + } + if(this.buttons){ + for(var i = 0, len = this.buttons.length; i < len; i++){ + this.buttons[i].destroy(); + } + } + this.el.removeAllListeners(); + if(removeEl === true){ + this.el.update(""); + this.el.remove(); + } + Ext.DialogManager.unregister(this); + }, + + // private + startMove : function(){ + if(this.proxyDrag){ + this.proxy.show(); + } + if(this.constraintoviewport !== false){ + this.dd.constrainTo(document.body, {right: this.shadowOffset, bottom: this.shadowOffset}); + } + }, + + // private + endMove : function(){ + if(!this.proxyDrag){ + Ext.dd.DD.prototype.endDrag.apply(this.dd, arguments); + }else{ + Ext.dd.DDProxy.prototype.endDrag.apply(this.dd, arguments); + this.proxy.hide(); + } + this.refreshSize(); + this.adjustAssets(); + this.focus(); + this.fireEvent("move", this, this.xy[0], this.xy[1]); + }, + + /** + * Brings this dialog to the front of any other visible dialogs + * @return {Ext.BasicDialog} this + */ + toFront : function(){ + Ext.DialogManager.bringToFront(this); + return this; + }, + + /** + * Sends this dialog to the back (under) of any other visible dialogs + * @return {Ext.BasicDialog} this + */ + toBack : function(){ + Ext.DialogManager.sendToBack(this); + return this; + }, + + /** + * Centers this dialog in the viewport + * @return {Ext.BasicDialog} this + */ + center : function(){ + var xy = this.el.getCenterXY(true); + this.moveTo(xy[0], xy[1]); + return this; + }, + + /** + * Moves the dialog's top-left corner to the specified point + * @param {Number} x + * @param {Number} y + * @return {Ext.BasicDialog} this + */ + moveTo : function(x, y){ + this.xy = [x,y]; + if(this.isVisible()){ + this.el.setXY(this.xy); + this.adjustAssets(); + } + return this; + }, + + /** + * Aligns the dialog to the specified element + * @param {String/HTMLElement/Ext.Element} element The element to align to. + * @param {String} position The position to align to (see {@link Ext.Element#alignTo} for more details). + * @param {Array} offsets (optional) Offset the positioning by [x, y] + * @return {Ext.BasicDialog} this + */ + alignTo : function(element, position, offsets){ + this.xy = this.el.getAlignToXY(element, position, offsets); + if(this.isVisible()){ + this.el.setXY(this.xy); + this.adjustAssets(); + } + return this; + }, + + /** + * Anchors an element to another element and realigns it when the window is resized. + * @param {String/HTMLElement/Ext.Element} element The element to align to. + * @param {String} position The position to align to (see {@link Ext.Element#alignTo} for more details) + * @param {Array} offsets (optional) Offset the positioning by [x, y] + * @param {Boolean/Number} monitorScroll (optional) true to monitor body scroll and reposition. If this parameter + * is a number, it is used as the buffer delay (defaults to 50ms). + * @return {Ext.BasicDialog} this + */ + anchorTo : function(el, alignment, offsets, monitorScroll){ + var action = function(){ + this.alignTo(el, alignment, offsets); + }; + Ext.EventManager.onWindowResize(action, this); + var tm = typeof monitorScroll; + if(tm != 'undefined'){ + Ext.EventManager.on(window, 'scroll', action, this, + {buffer: tm == 'number' ? monitorScroll : 50}); + } + action.call(this); + return this; + }, + + /** + * Returns true if the dialog is visible + * @return {Boolean} + */ + isVisible : function(){ + return this.el.isVisible(); + }, + + // private + animHide : function(callback){ + var b = Ext.get(this.animateTarget).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])); + }, + + /** + * Hides the dialog. + * @param {Function} callback (optional) Function to call when the dialog is hidden + * @return {Ext.BasicDialog} this + */ + hide : function(callback){ + if (this.fireEvent("beforehide", this) === false){ + return; + } + if(this.shadow){ + this.shadow.hide(); + } + if(this.shim) { + this.shim.hide(); + } + if(this.animateTarget){ + this.animHide(callback); + }else{ + this.el.hide(); + this.hideEl(callback); + } + return this; + }, + + // private + hideEl : function(callback){ + this.proxy.hide(); + if(this.modal){ + this.mask.hide(); + Ext.get(document.body).removeClass("x-body-masked"); + } + this.fireEvent("hide", this); + if(typeof callback == "function"){ + callback(); + } + }, + + // private + hideAction : function(){ + this.setLeft("-10000px"); + this.setTop("-10000px"); + this.setStyle("visibility", "hidden"); + }, + + // private + refreshSize : function(){ + this.size = this.el.getSize(); + this.xy = this.el.getXY(); + Ext.state.Manager.set(this.stateId || this.el.id + "-state", this.el.getBox()); + }, + + // private + // z-index is managed by the DialogManager and may be overwritten at any time + setZIndex : function(index){ + if(this.modal){ + this.mask.setStyle("z-index", index); + } + if(this.shim){ + this.shim.setStyle("z-index", ++index); + } + if(this.shadow){ + this.shadow.setZIndex(++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 {Ext.Element} The underlying dialog Element + */ + getEl : function(){ + return this.el; + } +}); + +/** + * @class Ext.DialogManager + * Provides global access to BasicDialogs that have been created and + * support for z-indexing (layering) multiple open dialogs. + */ +Ext.DialogManager = function(){ + var list = {}; + var accessList = []; + var front = null; + + // private + var sortDialogs = function(d1, d2){ + return (!d1._lastAccess || d1._lastAccess < d2._lastAccess) ? -1 : 1; + }; + + // private + var orderDialogs = function(){ + accessList.sort(sortDialogs); + var seed = Ext.DialogManager.zseed; + for(var i = 0, len = accessList.length; i < len; i++){ + var dlg = accessList[i]; + if(dlg){ + dlg.setZIndex(seed + (i*10)); + } + } + }; + + return { + /** + * The starting z-index for BasicDialogs (defaults to 9000) + * @type Number The z-index value + */ + zseed : 9000, + + // private + register : function(dlg){ + list[dlg.id] = dlg; + accessList.push(dlg); + }, + + // private + unregister : function(dlg){ + delete list[dlg.id]; + if(!accessList.indexOf){ + for(var i = 0, len = accessList.length; i < len; i++){ + if(accessList[i] == dlg){ + 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 {Ext.BasicDialog} this + */ + 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 {Ext.BasicDialog} this + */ + 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 {Ext.BasicDialog} this + */ + sendToBack : function(dlg){ + dlg = this.get(dlg); + dlg._lastAccess = -(new Date().getTime()); + orderDialogs(); + return dlg; + }, + + /** + * Hides all dialogs + */ + hideAll : function(){ + for(var id in list){ + if(list[id] && typeof list[id] != "function" && list[id].isVisible()){ + list[id].hide(); + } + } + } + }; +}(); + +/** + * @class Ext.LayoutDialog + * @extends 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 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 Ext.BorderLayout("dl-inner", {
          +        east: {
          +            initialSize: 200,
          +            autoScroll:true,
          +            split:true
          +        },
          +        center: {
          +            autoScroll:true
          +        }
          +    });
          +    innerLayout.beginUpdate();
          +    innerLayout.add("east", new Ext.ContentPanel("dl-details"));
          +    innerLayout.add("center", new Ext.ContentPanel("selection-panel"));
          +    innerLayout.endUpdate(true);
          +
          +    var layout = dialog.getLayout();
          +    layout.beginUpdate();
          +    layout.add("center", new Ext.ContentPanel("standard-panel",
          +                        {title: "Download the Source", fitToFrame:true}));
          +    layout.add("center", new Ext.NestedLayoutPanel(innerLayout,
          +               {title: "Build your own ext.js"}));
          +    layout.getRegion("center").showPanel(sp);
          +    layout.endUpdate();
          + * @constructor + * @param {String/HTMLElement/Ext.Element} el The id of or container element + * @param {Object} config configuration options + */ +Ext.LayoutDialog = function(el, config){ + config.autoTabs = false; + Ext.LayoutDialog.superclass.constructor.call(this, el, config); + this.body.setStyle({overflow:"hidden", position:"relative"}); + this.layout = new Ext.BorderLayout(this.body.dom, config); + this.layout.monitorWindowResize = false; + this.el.addClass("x-dlg-auto-layout"); + // fix case when center region overwrites center function + this.center = Ext.BasicDialog.prototype.center; + this.on("show", this.layout.layout, this.layout, true); +}; +Ext.extend(Ext.LayoutDialog, 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 {Ext.BorderLayout} + */ + getLayout : function(){ + return this.layout; + }, + + showEl : function(){ + Ext.LayoutDialog.superclass.showEl.apply(this, arguments); + if(Ext.isIE7){ + this.layout.layout(); + } + }, + + // private + // Use the syncHeightBeforeShow config option to control this automatically + syncBodyHeight : function(){ + Ext.LayoutDialog.superclass.syncBodyHeight.call(this); + if(this.layout){this.layout.layout();} + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/BoxComponent.js b/www/extras/yui-ext/source/widgets/BoxComponent.js new file mode 100644 index 000000000..f1e2a4667 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/BoxComponent.js @@ -0,0 +1,172 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.BoxComponent = function(config){ + Ext.BoxComponent.superclass.constructor.call(this, config); + this.addEvents({ + resize : true, + move : true + }); +}; + +Ext.extend(Ext.BoxComponent, Ext.Component, { + boxReady : false, + // private, used to defer height settings to subclasses + deferHeight: false, + + setSize : function(w, h){ + // support for standard size objects + if(typeof w == 'object'){ + h = w.height; + w = w.width; + } + // not rendered + if(!this.boxReady){ + this.width = w; + this.height = h; + return; + } + + // prevent recalcs when not needed + if(this.lastSize && this.lastSize.width == w && this.lastSize.height == h){ + return; + } + this.lastSize = {width: w, height: h}; + + var adj = this.adjustSize(w, h); + var aw = adj.width, ah = adj.height; + if(aw !== undefined || ah !== undefined){ // this code is nasty but performs better with floaters + var rz = this.getResizeEl(); + if(!this.deferHeight && aw !== undefined && ah !== undefined){ + rz.setSize(aw, ah); + }else if(!this.deferHeight && ah !== undefined){ + rz.setHeight(ah); + }else if(aw !== undefined){ + rz.setWidth(aw); + } + this.onResize(aw, ah, w, h); + this.fireEvent('resize', this, aw, ah, w, h); + } + return this; + }, + + getSize : function(){ + return this.el.getSize(); + }, + + getPosition : function(local){ + if(local === true){ + return [this.el.getLeft(true), this.el.getTop(true)]; + } + return this.xy || this.el.getXY(); + }, + + getBox : function(local){ + var s = this.el.getSize(); + if(local){ + s.x = this.el.getLeft(true); + s.y = this.el.getTop(true); + }else{ + var xy = this.xy || this.el.getXY(); + s.x = xy[0]; + s.y = xy[1]; + } + return s; + }, + + updateBox : function(box){ + this.setSize(box.width, box.height); + this.setPagePosition(box.x, box.y); + }, + + getResizeEl : function(){ + return this.resizeEl || this.el; + }, + + setPosition : function(x, y){ + this.x = x; + this.y = y; + if(!this.boxReady){ + return; + } + var adj = this.adjustPosition(x, y); + var ax = adj.x, ay = adj.y; + + if(ax !== undefined || ay !== undefined){ + if(ax !== undefined && ay !== undefined){ + this.el.setLeftTop(ax, ay); + }else if(ax !== undefined){ + this.el.setLeft(ax); + }else if(ay !== undefined){ + this.el.setTop(ay); + } + this.onPosition(ax, ay); + this.fireEvent('move', this, ax, ay); + } + return this; + }, + + setPagePosition : function(x, y){ + this.pageX = x; + this.pageY = y; + if(!this.boxReady){ + return; + } + if(x === undefined || y === undefined){ // cannot translate undefined points + return; + } + var p = this.el.translatePoints(x, y); + this.setPosition(p.left, p.top); + return this; + }, + + onRender : function(ct, position){ + Ext.BoxComponent.superclass.onRender.call(this, ct, position); + if(this.resizeEl){ + this.resizeEl = Ext.get(this.resizeEl); + } + }, + + afterRender : function(){ + Ext.BoxComponent.superclass.afterRender.call(this); + this.boxReady = true; + this.setSize(this.width, this.height); + if(this.x || this.y){ + this.setPosition(this.x, this.y); + } + if(this.pageX || this.pageY){ + this.setPagePosition(this.pageX, this.pageY); + } + }, + + syncSize : function(){ + this.setSize(this.el.getWidth(), this.el.getHeight()); + }, + + onResize : function(adjWidth, adjHeight, rawWidth, rawHeight){ + + }, + + onPosition : function(x, y){ + + }, + + adjustSize : function(w, h){ + if(this.autoWidth){ + w = 'auto'; + } + if(this.autoHeight){ + h = 'auto'; + } + return {width : w, height: h}; + }, + + adjustPosition : function(x, y){ + return {x : x, y: y}; + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/Button.js b/www/extras/yui-ext/source/widgets/Button.js new file mode 100644 index 000000000..ccb311a70 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/Button.js @@ -0,0 +1,462 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.Button + * @extends Ext.util.Observable + * Simple Button class + * @cfg {String} text The button text + * @cfg {String} icon The path to an image to display in the button (the image will be set as the background-image + * CSS property of the button by default, so if you want a mixed icon/text button, set cls:"x-btn-text-icon") + * @cfg {Function} handler A function called when the button is clicked (can be used instead of click event) + * @cfg {Object} scope The scope of the handler + * @cfg {Number} minWidth The minimum width for this button (used to give a set of buttons a common width) + * @cfg {String/Object} tooltip The tooltip for the button - can be a string or QuickTips config object + * @cfg {Boolean} hidden True to start hidden (defaults to false) + * @cfg {Boolean} disabled True to start disabled (defaults to false) + * @cfg {Boolean} pressed True to start pressed (only if enableToggle = true) + * @cfg {String} toggleGroup The group this toggle button is a member of (only 1 per group can be pressed, only + * applies if enableToggle = true) + * @cfg {Boolean/Object} repeat True to repeat fire the click event while the mouse is down. This can also be + an {@link Ext.util.ClickRepeater} config object (defaults to false). + * @constructor + * Create a new button + * @param {String/HTMLElement/Element} renderTo The element to append the button to + * @param {Object} config The config object + */ +Ext.Button = function(renderTo, config){ + Ext.apply(this, config); + this.addEvents({ + /** + * @event click + * Fires when this button is clicked + * @param {Button} this + * @param {EventObject} e The click event + */ + "click" : true, + /** + * @event toggle + * Fires when the "pressed" state of this button changes (only if enableToggle = true) + * @param {Button} this + * @param {Boolean} pressed + */ + "toggle" : true, + /** + * @event mouseover + * Fires when the mouse hovers over the button + * @param {Button} this + * @param {Event} e The event object + */ + 'mouseover' : true, + /** + * @event mouseout + * Fires when the mouse exits the button + * @param {Button} this + * @param {Event} e The event object + */ + 'mouseout': true + }); + if(this.menu){ + this.menu = Ext.menu.MenuMgr.get(this.menu); + } + if(renderTo){ + this.render(renderTo); + } + Ext.Button.superclass.constructor.call(this); +}; + +Ext.extend(Ext.Button, Ext.util.Observable, { + /** + * Read-only. True if this button is hidden + * @type Boolean + */ + hidden : false, + /** + * Read-only. True if this button is disabled + * @type Boolean + */ + disabled : false, + /** + * Read-only. True if this button is pressed (only if enableToggle = true) + * @type Boolean + */ + pressed : false, + + /** + * @cfg {Boolean} enableToggle + * True to enable pressed/not pressed toggling (defaults to false) + */ + enableToggle: false, + /** + * @cfg {Mixed} menu + * Standard menu attribute consisting of a reference to a menu object, a menu id or a menu config blob + */ + menu : undefined, + /** + * @cfg {String} menuAlign + * The position to align the menu to (see {@link Ext.Element#alignTo} for more details, defaults to 'tl-bl?'). + */ + menuAlign : "tl-bl?", + + // private + menuClassTarget: 'tr', + + clickEvent : 'click', + handleMouseEvents : true, + + /** + * @cfg {String} tooltipType + * The type of tooltip to use. Either "qtip" for QuickTips or "title" for title attribute. + */ + tooltipType : 'qtip', + + // private + render : function(renderTo){ + var btn; + if(this.hideParent){ + this.parentEl = Ext.get(renderTo); + } + if(!this.dhconfig){ + if(!this.template){ + if(!Ext.Button.buttonTemplate){ + // hideous table template + Ext.Button.buttonTemplate = new Ext.Template( + '', + '', + "
            
          "); + } + this.template = Ext.Button.buttonTemplate; + } + btn = this.template.append(renderTo, [this.text || ' '], true); + var btnEl = btn.child("button:first"); + btnEl.on('focus', this.onFocus, this); + btnEl.on('blur', this.onBlur, this); + if(this.cls){ + btn.addClass(this.cls); + } + if(this.icon){ + btnEl.setStyle('background-image', 'url(' +this.icon +')'); + } + if(this.tooltip){ + if(typeof this.tooltip == 'object'){ + Ext.QuickTips.tips(Ext.apply({ + target: btnEl.id + }, this.tooltip)); + } else { + btnEl.dom[this.tooltipType] = this.tooltip; + } + } + }else{ + btn = Ext.DomHelper.append(Ext.get(renderTo).dom, this.dhconfig, true); + } + this.el = btn; + if(this.id){ + this.el.dom.id = this.el.id = this.id; + } + if(this.menu){ + this.el.child(this.menuClassTarget).addClass("x-btn-with-menu"); + this.menu.on("show", this.onMenuShow, this); + this.menu.on("hide", this.onMenuHide, this); + } + btn.addClass("x-btn"); + if(Ext.isIE && !Ext.isIE7){ + this.autoWidth.defer(1, this); + }else{ + this.autoWidth(); + } + if(this.handleMouseEvents){ + btn.on("mouseover", this.onMouseOver, this); + btn.on("mouseout", this.onMouseOut, this); + btn.on("mousedown", this.onMouseDown, this); + } + btn.on(this.clickEvent, this.onClick, this); + //btn.on("mouseup", this.onMouseUp, this); + if(this.hidden){ + this.hide(); + } + if(this.disabled){ + this.disable(); + } + Ext.ButtonToggleMgr.register(this); + if(this.pressed){ + this.el.addClass("x-btn-pressed"); + } + if(this.repeat){ + var repeater = new Ext.util.ClickRepeater(btn, + typeof this.repeat == "object" ? this.repeat : {} + ); + repeater.on("click", this.onClick, this); + } + }, + /** + * Returns the button's underlying element + * @return {Ext.Element} The element + */ + getEl : function(){ + return this.el; + }, + + /** + * Destroys this Button and removes any listeners. + */ + destroy : function(){ + Ext.ButtonToggleMgr.unregister(this); + this.el.removeAllListeners(); + this.purgeListeners(); + this.el.remove(); + }, + + // private + autoWidth : function(){ + if(this.el){ + this.el.setWidth("auto"); + if(Ext.isIE7 && Ext.isStrict){ + var ib = this.el.child('button'); + if(ib && ib.getWidth() > 20){ + ib.clip(); + ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr')); + } + } + if(this.minWidth){ + if(this.hidden){ + this.el.beginMeasure(); + } + if(this.el.getWidth() < this.minWidth){ + this.el.setWidth(this.minWidth); + } + if(this.hidden){ + this.el.endMeasure(); + } + } + } + }, + + /** + * Assigns this button's click handler + * @param {Function} handler The function to call when the button is clicked + * @param {Object} scope (optional) Scope for the function passed in + */ + setHandler : function(handler, scope){ + this.handler = handler; + this.scope = scope; + }, + + /** + * Sets this button's text + * @param {String} text The button text + */ + setText : function(text){ + this.text = text; + if(this.el){ + this.el.child("td.x-btn-center button.x-btn-text").update(text); + } + this.autoWidth(); + }, + + /** + * Gets the text for this button + * @return {String} The button text + */ + getText : function(){ + return this.text; + }, + + /** + * Show this button + */ + show: function(){ + this.hidden = false; + if(this.el){ + this[this.hideParent? 'parentEl' : 'el'].setStyle("display", ""); + } + }, + + /** + * Hide this button + */ + hide: function(){ + this.hidden = true; + if(this.el){ + this[this.hideParent? 'parentEl' : '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(); + } + }, + + /** + * If a state it passed, it becomes the pressed state otherwise the current state is toggled. + * @param {Boolean} state (optional) Force a particular state + */ + toggle : function(state){ + state = state === undefined ? !this.pressed : state; + if(state != this.pressed){ + if(state){ + this.el.addClass("x-btn-pressed"); + this.pressed = true; + this.fireEvent("toggle", this, true); + }else{ + this.el.removeClass("x-btn-pressed"); + this.pressed = false; + this.fireEvent("toggle", this, false); + } + if(this.toggleHandler){ + this.toggleHandler.call(this.scope || this, this, state); + } + } + }, + + /** + * Focus the button + */ + focus : function(){ + this.el.child('button:first').focus(); + }, + + /** + * Disable this button + */ + disable : function(){ + if(this.el){ + this.el.addClass("x-btn-disabled"); + } + this.disabled = true; + }, + + /** + * Enable this button + */ + enable : function(){ + if(this.el){ + this.el.removeClass("x-btn-disabled"); + } + this.disabled = false; + }, + + /** + * Convenience function for boolean enable/disable + * @param {Boolean} enabled True to enable, false to disable + */ + setDisabled : function(v){ + this[v !== true ? "enable" : "disable"](); + }, + + // private + onClick : function(e){ + if(e){ + e.preventDefault(); + } + if(!this.disabled){ + if(this.enableToggle){ + this.toggle(); + } + if(this.menu && !this.menu.isVisible()){ + this.menu.show(this.el, this.menuAlign); + } + this.fireEvent("click", this, e); + if(this.handler){ + this.el.removeClass("x-btn-over"); + this.handler.call(this.scope || this, this, e); + } + } + }, + // private + onMouseOver : function(e){ + if(!this.disabled){ + this.el.addClass("x-btn-over"); + this.fireEvent('mouseover', this, e); + } + }, + // private + onMouseOut : function(e){ + if(!e.within(this.el, true)){ + this.el.removeClass("x-btn-over"); + this.fireEvent('mouseout', this, e); + } + }, + // private + onFocus : function(e){ + if(!this.disabled){ + this.el.addClass("x-btn-focus"); + } + }, + // private + onBlur : function(e){ + this.el.removeClass("x-btn-focus"); + }, + // private + onMouseDown : function(){ + if(!this.disabled){ + this.el.addClass("x-btn-click"); + Ext.get(document).on('mouseup', this.onMouseUp, this); + } + }, + // private + onMouseUp : function(){ + this.el.removeClass("x-btn-click"); + Ext.get(document).un('mouseup', this.onMouseUp, this); + }, + // private + onMenuShow : function(e){ + this.el.addClass("x-btn-menu-active"); + }, + // private + onMenuHide : function(e){ + this.el.removeClass("x-btn-menu-active"); + } +}); + +// Private utility class used by Button +Ext.ButtonToggleMgr = function(){ + var groups = {}; + + function toggleGroup(btn, state){ + if(state){ + var g = groups[btn.toggleGroup]; + for(var i = 0, l = g.length; i < l; i++){ + if(g[i] != btn){ + g[i].toggle(false); + } + } + } + } + + return { + register : function(btn){ + if(!btn.toggleGroup){ + return; + } + var g = groups[btn.toggleGroup]; + if(!g){ + g = groups[btn.toggleGroup] = []; + } + g.push(btn); + btn.on("toggle", toggleGroup); + }, + + unregister : function(btn){ + if(!btn.toggleGroup){ + return; + } + var g = groups[btn.toggleGroup]; + if(g){ + g.remove(btn); + btn.un("toggle", toggleGroup); + } + } + }; +}(); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/ColorPalette.js b/www/extras/yui-ext/source/widgets/ColorPalette.js new file mode 100644 index 000000000..75ed0eece --- /dev/null +++ b/www/extras/yui-ext/source/widgets/ColorPalette.js @@ -0,0 +1,136 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.ColorPalette + * @extends Ext.Component + * Simple color palette class for choosing colors. The palette can be rendered to any container.
          + * Here's an example of typical usage: + *
          
          +var cp = new Ext.ColorPalette({value:'993300'});  // initial selected color
          +cp.render('my-div');
          +
          +cp.on('select', function(palette, selColor){
          +    // do something with selColor
          +});
          +
          + * @constructor + * Create a new ColorPalette + * @param {Object} config The config object + */ +Ext.ColorPalette = function(config){ + Ext.ColorPalette.superclass.constructor.call(this, config); + this.addEvents({ + /** + * @event select + * Fires when a color is selected + * @param {ColorPalette} this + * @param {String} color The 6-digit color hex code (without the # symbol) + */ + select: true + }); + + if(this.handler){ + this.on("select", this.handler, this.scope, true); + } +}; +Ext.extend(Ext.ColorPalette, Ext.Component, { + /** + * @cfg {String} itemCls + * The CSS class to apply to the containing element (defaults to "x-color-palette") + */ + itemCls : "x-color-palette", + /** + * @cfg {String} value + * The initial color to highlight (should be a valid 6-digit color hex code without the # symbol). Note that + * the hex codes are case-sensitive. + */ + value : null, + + // private + ctype: "Ext.ColorPalette", + + /** + *

          An array of 6-digit color hex code strings (without the # symbol). This array can contain any number + * of colors, and each hex code should be unique. The width of the palette is controlled via CSS by adjusting + * the width property of the 'x-color-palette' class (or assigning a custom class), so you can balance the number + * of colors with the width setting until the box is symmetrical.

          + *

          You can override individual colors if needed:

          + *
          
          +var cp = new Ext.ColorPalette();
          +cp.colors[0] = "FF0000";  // change the first box to red
          +
          + +Or you can provide a custom array of your own for complete control: +
          
          +var cp = new Ext.ColorPalette();
          +cp.colors = ["000000", "993300", "333300"];
          +
          + * @type Array + */ + colors : [ + "000000", "993300", "333300", "003300", "003366", "000080", "333399", "333333", + "800000", "FF6600", "808000", "008000", "008080", "0000FF", "666699", "808080", + "FF0000", "FF9900", "99CC00", "339966", "33CCCC", "3366FF", "800080", "969696", + "FF00FF", "FFCC00", "FFFF00", "00FF00", "00FFFF", "00CCFF", "993366", "C0C0C0", + "FF99CC", "FFCC99", "FFFF99", "CCFFCC", "CCFFFF", "99CCFF", "CC99FF", "FFFFFF" + ], + + // private + onRender : function(container, position){ + var t = new Ext.MasterTemplate( + ' ' + ); + var c = this.colors; + for(var i = 0, len = c.length; i < len; i++){ + t.add([c[i]]); + } + var el = document.createElement("div"); + el.className = this.itemCls; + t.overwrite(el); + container.dom.insertBefore(el, position); + this.el = Ext.get(el); + this.el.on("click", this.handleClick, this, {delegate: "a"}); + }, + + // private + afterRender : function(){ + Ext.ColorPalette.superclass.afterRender.call(this); + if(this.value){ + var s = this.value; + this.value = null; + this.select(s); + } + }, + + // private + handleClick : function(e, t){ + e.preventDefault(); + if(!this.disabled){ + var c = t.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1]; + this.select(c.toUpperCase()); + } + }, + + /** + * Selects the specified color in the palette (fires the select event) + * @param {String} color A valid 6-digit color hex code (# will be stripped if included) + */ + select : function(color){ + color = color.replace("#", ""); + if(color != this.value){ + var el = this.el; + if(this.value){ + el.child("a.color-"+this.value).removeClass("x-color-palette-sel"); + } + el.child("a.color-"+color).addClass("x-color-palette-sel"); + this.value = color; + this.fireEvent("select", this, color); + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/Component.js b/www/extras/yui-ext/source/widgets/Component.js new file mode 100644 index 000000000..5026cfe65 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/Component.js @@ -0,0 +1,413 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.ComponentMgr + * Provides a common registry of all components on a page so that they can be easily accessed by component id. + * @singleton + */ +Ext.ComponentMgr = function(){ + var all = new Ext.util.MixedCollection(); + + return { + // private + register : function(c){ + all.add(c); + }, + + // private + unregister : function(c){ + all.remove(c); + }, + + /** + * Returns a component by id + * @param {String} id The component id + */ + get : function(id){ + return all.get(id); + }, + + /** + * Registers a function that will be called when a specified component is added to ComponentMgr + * @param {String} id The component id + * @param {Funtction} fn The callback function + * @param {Object} scope The scope of the callback + */ + onAvailable : function(id, fn, scope){ + all.on("add", function(index, o){ + if(o.id == id){ + fn.call(scope || o, o); + all.un("add", fn, scope); + } + }); + } + }; +}(); + +/** + * @class Ext.Component + * @extends Ext.util.Observable + * Base class for all Ext form controls that provides a common set of events and functionality shared by all components. + * @constructor + * @param {Ext.Element/String/Object} config The configuration options. If an element is passed, it is set as the internal + * element and its id used as the component id. If a string is passed, it is assumed to be the id of an existing element + * and is used as the component id. Otherwise, it is assumed to be a standard config object and is applied to the component. + */ +Ext.Component = function(config){ + config = config || {}; + if(config.tagName || config.dom || typeof config == "string"){ // element object + config = {el: config, id: config.id || config}; + } + this.initialConfig = config; + + Ext.apply(this, config); + this.addEvents({ + /** + * @event disable + * Fires after the component is disabled + * @param {Ext.Component} this + */ + disable : true, + /** + * @event enable + * Fires after the component is enabled + * @param {Ext.Component} this + */ + enable : true, + /** + * @event beforeshow + * Fires before the component is shown + * @param {Ext.Component} this + */ + beforeshow : true, + /** + * @event show + * Fires after the component is shown + * @param {Ext.Component} this + */ + show : true, + /** + * @event beforehide + * Fires before the component is hidden + * @param {Ext.Component} this + */ + beforehide : true, + /** + * @event hide + * Fires after the component is hidden + * @param {Ext.Component} this + */ + hide : true, + /** + * @event beforerender + * Fires before the component is rendered + * @param {Ext.Component} this + */ + beforerender : true, + /** + * @event render + * Fires after the component is rendered + * @param {Ext.Component} this + */ + render : true, + /** + * @event beforedestroy + * Fires before the component is destroyed + * @param {Ext.Component} this + */ + beforedestroy : true, + /** + * @event destroy + * Fires after the component is destroyed + * @param {Ext.Component} this + */ + destroy : true + }); + if(!this.id){ + this.id = "ext-comp-" + (++Ext.Component.AUTO_ID); + } + Ext.ComponentMgr.register(this); + Ext.Component.superclass.constructor.call(this); + this.initComponent(); +}; + +// private +Ext.Component.AUTO_ID = 1000; + +Ext.extend(Ext.Component, Ext.util.Observable, { + /** + * true if this component is hidden. Read-only. + */ + hidden : false, + /** + * true if this component is disabled. Read-only. + */ + disabled : false, + /** + * CSS class added to the component when it is disabled. + */ + disabledClass : "x-item-disabled", + /** + * true if this component has been rendered. Read-only. + */ + rendered : false, + + allowDomMove: true, + + // private + ctype : "Ext.Component", + + // private + actionMode : "el", + + // private + getActionEl : function(){ + return this[this.actionMode]; + }, + + initComponent : Ext.emptyFn, + /** + * If this is a lazy rendering component, render it to its container element + * @param {String/HTMLElement/Element} container (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off. + */ + render : function(container, position){ + if(!this.rendered && this.fireEvent("beforerender", this) !== false){ + if(!container && this.el){ + this.el = Ext.get(this.el); + container = this.el.dom.parentNode; + this.allowDomMove = false; + } + this.container = Ext.get(container); + this.rendered = true; + if(position !== undefined){ + if(typeof position == 'number'){ + position = this.container.dom.childNodes[position]; + }else{ + position = Ext.getDom(position); + } + } + this.onRender(this.container, position || null); + if(this.cls){ + this.el.addClass(this.cls); + delete this.cls; + } + if(this.style){ + this.el.applyStyles(this.style); + delete this.style; + } + this.fireEvent("render", this); + this.afterRender(this.container); + if(this.hidden){ + this.hide(); + } + if(this.disabled){ + this.disable(); + } + } + return this; + }, + + // private + // default function is not really useful + onRender : function(ct, position){ + if(this.el){ + this.el = Ext.get(this.el); + if(this.allowDomMove !== false){ + ct.dom.insertBefore(this.el.dom, position); + } + } + }, + + // private + getAutoCreate : function(){ + var cfg = typeof this.autoCreate == "object" ? + this.autoCreate : Ext.apply({}, this.defaultAutoCreate); + if(this.id && !cfg.id){ + cfg.id = this.id; + } + return cfg; + }, + + // private + afterRender : Ext.emptyFn, + + // private + destroy : function(){ + if(this.fireEvent("beforedestroy", this) !== false){ + this.purgeListeners(); + this.beforeDestroy(); + if(this.rendered){ + this.el.removeAllListeners(); + this.el.remove(); + if(this.actionMode == "container"){ + this.container.remove(); + } + } + this.onDestroy(); + Ext.ComponentMgr.unregister(this); + this.fireEvent("destroy", this); + } + }, + + beforeDestroy : function(){ + + }, + + onDestroy : function(){ + + }, + + /** + * Returns the underlying {@link Ext.Element} + * @return {Ext.Element} The element + */ + getEl : function(){ + return this.el; + }, + + /** + * Returns the id of this component + * @return {String} + */ + getId : function(){ + return this.id; + }, + + /** + * Try to focus this component + * @param {Boolean} selectText True to also select the text in this component (if applicable) + */ + focus : function(selectText){ + if(this.rendered){ + this.el.focus(); + if(selectText === true){ + this.el.dom.select(); + } + } + return this; + }, + + // private + blur : function(){ + if(this.rendered){ + this.el.blur(); + } + return this; + }, + + /** + * Disable this component + */ + disable : function(){ + if(this.rendered){ + this.onDisable(); + } + this.disabled = true; + this.fireEvent("disable", this); + return this; + }, + + onDisable : function(){ + this.getActionEl().addClass(this.disabledClass); + this.el.dom.disabled = true; + }, + + /** + * Enable this component + */ + enable : function(){ + if(this.rendered){ + this.onEnable(); + } + this.disabled = false; + this.fireEvent("enable", this); + return this; + }, + + onEnable : function(){ + this.getActionEl().removeClass(this.disabledClass); + this.el.dom.disabled = false; + }, + + /** + * Convenience function for setting disabled/enabled by boolean + * @param {Boolean} disabled + */ + setDisabled : function(disabled){ + this[disabled ? "disable" : "enable"](); + }, + + /** + * Show this component + */ + show: function(){ + if(this.fireEvent("beforeshow", this) !== false){ + this.hidden = false; + if(this.rendered){ + this.onShow(); + } + this.fireEvent("show", this); + } + return this; + }, + + // private + onShow : function(){ + var st = this.getActionEl().dom.style; + st.display = ""; + st.visibility = "visible"; + }, + + /** + * Hide this component + */ + hide: function(){ + if(this.fireEvent("beforehide", this) !== false){ + this.hidden = true; + if(this.rendered){ + this.onHide(); + } + this.fireEvent("hide", this); + } + return this; + }, + + // private + onHide : function(){ + this.getActionEl().dom.style.display = "none"; + }, + + /** + * Convenience function to hide or show this component by boolean + * @param {Boolean} visible True to show, false to hide + */ + setVisible: function(visible){ + if(visible) { + this.show(); + }else{ + this.hide(); + } + return this; + }, + + /** + * Returns true if this component is visible + */ + isVisible : function(){ + return this.getActionEl().isVisible(); + }, + + cloneConfig : function(overrides){ + overrides = overrides || {}; + var id = overrides.id || Ext.id(); + var cfg = Ext.applyIf(overrides, this.initialConfig); + cfg.id = id; // prevent dup id + return new this.__extcls(cfg); + } +}); \ 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..3b509a07c --- /dev/null +++ b/www/extras/yui-ext/source/widgets/DatePicker.js @@ -0,0 +1,487 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.DatePicker + * @extends Ext.Component + * Simple date picker class. + * @constructor + * Create a new DatePicker + * @param {Object} config The config object + */ +Ext.DatePicker = function(config){ + Ext.DatePicker.superclass.constructor.call(this, config); + + this.value = config && config.value ? + config.value.clearTime() : new Date().clearTime(); + + this.addEvents({ + /** + * @event select + * Fires when a date is selected + * @param {DatePicker} this + * @param {Date} date The selected date + */ + select: true + }); + + if(this.handler){ + this.on("select", this.handler, this.scope || this); + } + // build the disabledDatesRE + if(!this.disabledDatesRE && 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.disabledDatesRE = new RegExp(re + ")"); + } +}; + +Ext.extend(Ext.DatePicker, Ext.Component, { + /** + * @cfg {String} todayText + * The text to display on the button that selects the current date (defaults to "Today") + */ + todayText : "Today", + /** + * @cfg {String} todayTip + * The tooltip to display for the button that selects the current date (defaults to "{current date} (Spacebar)") + */ + todayTip : "{0} (Spacebar)", + /** + * @cfg {Date} minDate + * Minimum allowable date (JavaScript date object, defaults to null) + */ + minDate : null, + /** + * @cfg {Date} maxDate + * Maximum allowable date (JavaScript date object, defaults to null) + */ + maxDate : null, + /** + * @cfg {String} minText + * The error text to display if the minDate validation fails (defaults to "This date is before the minimum date") + */ + minText : "This date is before the minimum date", + /** + * @cfg {String} maxText + * The error text to display if the maxDate validation fails (defaults to "This date is after the maximum date") + */ + maxText : "This date is after the maximum date", + /** + * @cfg {String} format + * The default date format string which can be overriden for localization support. The format must be + * valid according to {@link Date#parseDate} (defaults to 'm/d/y'). + */ + format : "m/d/y", + /** + * @cfg {Array} disabledDays + * An array of days to disable, 0-based. For example, [0, 6] disables Sunday and Saturday (defaults to null). + */ + disabledDays : null, + /** + * @cfg {String} disabledDaysText + * The tooltip to display when the date falls on a disabled day (defaults to "") + */ + disabledDaysText : "", + /** + * @cfg {RegExp} disabledDatesRE + * JavaScript regular expression used to disable a pattern of dates (defaults to null) + */ + disabledDatesRE : null, + /** + * @cfg {String} disabledDatesText + * The tooltip text to display when the date falls on a disabled date (defaults to "") + */ + disabledDatesText : "", + /** + * @cfg {Boolean} constrainToViewport + * True to constrain the date picker to the viewport (defaults to true) + */ + constrainToViewport : true, + /** + * @cfg {Array} monthNames + * An array of textual month names which can be overriden for localization support (defaults to Date.monthNames) + */ + monthNames : Date.monthNames, + /** + * @cfg {Array} dayNames + * An array of textual day names which can be overriden for localization support (defaults to Date.dayNames) + */ + dayNames : Date.dayNames, + /** + * @cfg {String} nextText + * The next month navigation button tooltip (defaults to 'Next Month (Control+Right)') + */ + nextText: 'Next Month (Control+Right)', + /** + * @cfg {String} prevText + * The previous month navigation button tooltip (defaults to 'Previous Month (Control+Left)') + */ + prevText: 'Previous Month (Control+Left)', + /** + * @cfg {String} monthYearText + * The header month selector tooltip (defaults to 'Choose a month (Control+Up/Down to move years)') + */ + monthYearText: 'Choose a month (Control+Up/Down to move years)', + /** + * @cfg {Number} startDay + * Day index at which the week should begin, 0-based (defaults to 0, which is Sunday) + */ + startDay : 0, + + /** + * Sets the value of the date field + * @param {Date} value The date to set + */ + setValue : function(value){ + var old = this.value; + this.value = value.clearTime(true); + if(this.el){ + this.update(this.value); + } + }, + + /** + * Gets the current selected value of the date field + * @return {Date} The selected date + */ + getValue : function(){ + return this.value; + }, + + // private + focus : function(){ + if(this.el){ + this.update(this.activeDate); + } + }, + + // private + onRender : function(container, position){ + var m = [ + '', + '', + '
            
          ']; + var dn = this.dayNames; + for(var i = 0; i < 7; i++){ + var d = this.startDay+i; + if(d > 6){ + d = d-7; + } + m.push(""); + } + m[m.length] = ""; + for(var i = 0; i < 42; i++) { + if(i % 7 == 0 && i != 0){ + m[m.length] = ""; + } + m[m.length] = ''; + } + m[m.length] = '
          ", dn[d].substr(0,1), "
          '; + + var el = document.createElement("div"); + el.className = "x-date-picker"; + el.innerHTML = m.join(""); + + container.dom.insertBefore(el, position); + + this.el = Ext.get(el); + new Ext.util.ClickRepeater(this.el.child("td.x-date-left a"), {handler: this.showPrevMonth, scope: this}); + new Ext.util.ClickRepeater(this.el.child("td.x-date-right a"), {handler: this.showNextMonth, scope: this}); + + this.el.on("mousewheel", this.handleMouseWheel, this); + + + var kn = new Ext.KeyNav(this.el, { + "left" : function(e){ + e.ctrlKey ? + this.showPrevMonth() : + this.update(this.activeDate.add("d", -1)); + }, + + "right" : function(e){ + e.ctrlKey ? + this.showNextMonth() : + this.update(this.activeDate.add("d", 1)); + }, + + "up" : function(e){ + e.ctrlKey ? + this.showNextYear() : + this.update(this.activeDate.add("d", -7)); + }, + + "down" : function(e){ + e.ctrlKey ? + this.showPrevYear() : + this.update(this.activeDate.add("d", 7)); + }, + + "pageUp" : function(e){ + this.showNextMonth(); + }, + + "pageDown" : function(e){ + this.showPrevMonth(); + }, + + "enter" : function(e){ + e.stopPropagation(); + return true; + }, + + scope : this + }); + + this.el.on("click", this.handleDateClick, this, {delegate: "a.x-date-date"}); + + this.el.addKeyListener(Ext.EventObject.SPACE, this.selectToday, this); + + this.el.unselectable(); + + this.cells = this.el.select("table.x-date-inner tbody td"); + this.textNodes = this.el.query("table.x-date-inner tbody span"); + + var mmenu = new Ext.menu.Menu({ + plain:true, + cls: "x-date-mmenu", + allowOtherMenus : true + }); + + var menuGroup = Ext.id()+"months"; + for(var i = 0; i < 12; i++){ + mmenu.add(new Ext.menu.CheckItem({ + id: "mm-"+i, + text: this.monthNames[i], + group:menuGroup, + month: i + })); + } + + mmenu.on({ + "beforeshow" : function(){ + mmenu.items.get("mm-"+(this.activeDate || this.value).getMonth()).setChecked(true); + }, + "itemclick" : function(item){ + var d = (this.activeDate || this.value).clone(); + d.setMonth(item.month); + this.update(d); + }, + "show" : function(m){ + this.visibleRegion = m.el.getRegion().adjust(2, 2, -2, -2); + }, + "mouseout" : function(m, e){ + if(!this.visibleRegion.contains(e.getPoint())){ + m.hide(); + } + }, + scope: this + }); + + this.mbtn = new Ext.Button(this.el.child("td.x-date-middle", true), { + menu: mmenu, + text: " ", + menuAlign: "c-c?", + tooltip: this.monthYearText + }); + + var today = (new Date()).dateFormat(this.format); + var todayBtn = new Ext.Button(this.el.child("td.x-date-bottom", true), { + text: String.format(this.todayText, today), + tooltip: String.format(this.todayTip, today), + handler: this.selectToday, + scope: this + }); + + if(Ext.isIE){ + this.el.repaint(); + } + this.update(this.value); + }, + + // private + showPrevMonth : function(e){ + this.update(this.activeDate.add("mo", -1)); + }, + + // private + showNextMonth : function(e){ + this.update(this.activeDate.add("mo", 1)); + }, + + // private + showPrevYear : function(){ + this.update(this.activeDate.add("y", -1)); + }, + + // private + showNextYear : function(){ + this.update(this.activeDate.add("y", 1)); + }, + + // private + handleMouseWheel : function(e){ + var delta = e.getWheelDelta(); + if(delta > 0){ + this.showPrevMonth(); + e.stopEvent(); + } else if(delta < 0){ + this.showNextMonth(); + e.stopEvent(); + } + }, + + // private + handleDateClick : function(e, t){ + e.stopEvent(); + if(t.dateValue && !Ext.fly(t.parentNode).hasClass("x-date-disabled")){ + this.setValue(new Date(t.dateValue)); + this.fireEvent("select", this, this.value); + } + }, + + // private + selectToday : function(){ + this.setValue(new Date().clearTime()); + this.fireEvent("select", this, this.value); + }, + + // private + update : function(date){ + var vd = this.activeDate; + this.activeDate = date; + + if(vd && this.el){ + var t = date.getTime(); + if(vd.getMonth() == date.getMonth() && vd.getFullYear() == date.getFullYear()){ + this.cells.removeClass("x-date-selected"); + this.cells.each(function(c){ + if(c.dom.firstChild.dateValue == t){ + c.addClass("x-date-selected"); + setTimeout(function(){ + try{c.dom.firstChild.focus();}catch(e){} + }, 50); + return false; + } + }); + return; + } + } + var days = date.getDaysInMonth(); + var firstOfMonth = date.getFirstDateOfMonth(); + var startingPos = firstOfMonth.getDay()-this.startDay; + + if(startingPos <= this.startDay){ + startingPos += 7; + } + + var pm = date.add("mo", -1); + var prevStart = pm.getDaysInMonth()-startingPos; + + var cells = this.cells.elements; + var textEls = this.textNodes; + days += startingPos; + + // convert everything to numbers so it's fast + var day = 86400000; + var d = (new Date(pm.getFullYear(), pm.getMonth(), prevStart)).clearTime(); + var today = new Date().clearTime().getTime(); + var sel = date.clearTime().getTime(); + var min = this.minDate ? this.minDate.clearTime() : Number.NEGATIVE_INFINITY; + var max = this.maxDate ? this.maxDate.clearTime() : Number.POSITIVE_INFINITY; + var ddMatch = this.disabledDatesRE; + var ddText = this.disabledDatesText; + var ddays = this.disabledDays ? this.disabledDays.join("") : false; + var ddaysText = this.disabledDaysText; + var format = this.format; + + var setCellClass = function(cal, cell){ + cell.title = ""; + var t = d.getTime(); + cell.firstChild.dateValue = t; + if(t == today){ + cell.className += " x-date-today"; + cell.title = cal.todayText; + } + if(t == sel){ + cell.className += " x-date-selected"; + setTimeout(function(){ + try{cell.firstChild.focus();}catch(e){} + }, 50); + } + // disabling + if(t < min) { + cell.className = " x-date-disabled"; + cell.title = cal.minText; + return; + } + if(t > max) { + cell.className = " x-date-disabled"; + cell.title = cal.maxText; + return; + } + if(ddays){ + if(ddays.indexOf(d.getDay()) != -1){ + cell.title = ddaysText; + cell.className = " x-date-disabled"; + } + } + if(ddMatch && format){ + var fvalue = d.dateFormat(format); + if(ddMatch.test(fvalue)){ + cell.title = ddText.replace("%0", fvalue); + cell.className = " x-date-disabled"; + } + } + }; + + var i = 0; + for(; i < startingPos; i++) { + textEls[i].innerHTML = (++prevStart); + d.setDate(d.getDate()+1); + cells[i].className = "x-date-prevday"; + setCellClass(this, cells[i]); + } + for(; i < days; i++){ + intDay = i - startingPos + 1; + textEls[i].innerHTML = (intDay); + d.setDate(d.getDate()+1); + cells[i].className = "x-date-active"; + setCellClass(this, cells[i]); + } + var extraDays = 0; + for(; i < 42; i++) { + textEls[i].innerHTML = (++extraDays); + d.setDate(d.getDate()+1); + cells[i].className = "x-date-nextday"; + setCellClass(this, cells[i]); + } + + this.mbtn.setText(this.monthNames[date.getMonth()] + " " + date.getFullYear()); + + if(!this.internalRender){ + var main = this.el.dom.firstChild; + var w = main.offsetWidth; + this.el.setWidth(w + this.el.getBorderWidth("lr")); + Ext.fly(main).setWidth(w); + this.internalRender = true; + // opera does not respect the auto grow header center column + // then, after it gets a width opera refuses to recalculate + // without a second pass + if(Ext.isOpera && !this.secondPass){ + main.rows[0].cells[1].style.width = (w - (main.rows[0].cells[0].offsetWidth+main.rows[0].cells[2].offsetWidth)) + "px"; + this.secondPass = true; + this.update.defer(10, this, [date]); + } + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/Editor.js b/www/extras/yui-ext/source/widgets/Editor.js new file mode 100644 index 000000000..b698c9613 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/Editor.js @@ -0,0 +1,275 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.Editor + * @extends Ext.Component + * A base editor field that handles displaying/hiding on demand and has some built-in sizing and event handling logic. + * @constructor + * Create a new Editor + * @param {Object} config The config object + */ +Ext.Editor = function(field, config){ + Ext.Editor.superclass.constructor.call(this, config); + this.field = field; + this.addEvents({ + /** + * @event beforestartedit + * Fires when editing is initiated, but before the value changes. Editing can be canceled by returning + * false from the handler of this event. + * @param {Editor} this + * @param {Ext.Element} boundEl The underlying element bound to this editor + * @param {Mixed} value The field value being set + */ + "beforestartedit" : true, + /** + * @event startedit + * Fires when this editor is displayed + * @param {Ext.Element} boundEl The underlying element bound to this editor + * @param {Mixed} value The starting field value + */ + "startedit" : true, + /** + * @event beforecomplete + * Fires after a change has been made to the field, but before the change is reflected in the underlying + * field. Saving the change to the field can be canceled by returning false from the handler of this event. + * Note that if the value has not changed and ignoreNoChange = true, the editing will still end but this + * event will not fire since no edit actually occurred. + * @param {Editor} this + * @param {Mixed} value The current field value + * @param {Mixed} startValue The original field value + */ + "beforecomplete" : true, + /** + * @event complete + * Fires after editing is complete and any changed value has been written to the underlying field. + * @param {Editor} this + * @param {Mixed} value The current field value + * @param {Mixed} startValue The original field value + */ + "complete" : true, + /** + * @event specialkey + * Fires when special key is pressed + */ + "specialkey" : true + }); +}; + +Ext.extend(Ext.Editor, Ext.Component, { + /** + * @cfg {Boolean/String} autosize + * True for the editor to automatically adopt the size of the underlying field, "width" to adopt the width only, + * or "height" to adopt the height only (defaults to false) + */ + /** + * @cfg {Boolean} revertInvalid + * True to automatically revert the field value and cancel the edit when the user completes an edit and the field + * validation fails (defaults to true) + */ + /** + * @cfg {Boolean} ignoreNoChange + * True to skip the the edit completion process (no save, no events fired) if the user completes an edit and + * the value has not changed (defaults to false). Applies only to string values - edits for other data types + * will never be ignored. + */ + /** + * @cfg {Mixed} value + * The data value of the underlying field (defaults to "") + */ + value : "", + /** + * @cfg {String} alignment + * The position to align to (see {@link Ext.Element#alignTo} for more details, defaults to "c-c?"). + */ + alignment: "c-c?", + /** + * @cfg {Boolean/String} shadow "sides" for sides/bottom only, "frame" for 4-way shadow, and "drop" + * for bottom-right shadow (defaults to "frame") + */ + shadow : "frame", + + // private + updateEl : false, + + // private + onRender : function(ct, position){ + this.el = new Ext.Layer({ + shadow: this.shadow, + cls: "x-editor", + parentEl : ct, + shim : this.shim, + shadowOffset:3, + id: this.id + }); + this.el.setStyle("overflow", Ext.isGecko ? "auto" : "hidden"); + this.field.render(this.el); + if(Ext.isGecko){ + this.field.el.dom.setAttribute('autocomplete', 'off'); + } + this.field.show(); + this.field.on("blur", this.onBlur, this); + this.relayEvents(this.field, ["specialkey"]); + if(this.field.grow){ + this.field.on("autosize", this.el.sync, this.el, {delay:1}); + } + }, + + // private + startEdit : function(el, value){ + if(this.editing){ + this.completeEdit(); + } + this.boundEl = Ext.get(el); + var v = value !== undefined ? value : this.boundEl.dom.innerHTML; + if(!this.rendered){ + this.render(this.parentEl || document.body); + } + if(this.fireEvent("beforestartedit", this, this.boundEl, v) === false){ + return; + } + this.startValue = v; + this.field.setValue(v); + if(this.autoSize){ + var sz = this.boundEl.getSize(); + switch(this.autoSize){ + case "width": + this.setSize(sz.width, ""); + break; + case "height": + this.setSize("", sz.height); + break; + default: + this.setSize(sz.width, sz.height); + } + } + this.el.alignTo(this.boundEl, this.alignment); + this.editing = true; + if(Ext.QuickTips){ + Ext.QuickTips.disable(); + } + this.show(); + }, + + /** + * Sets the height and width of this editor + * @param {Number} width The new width + * @param {Number} height The new height + */ + setSize : function(w, h){ + this.field.setSize(w, h); + if(this.el){ + this.el.sync(); + } + }, + + /** + * Realigns the editor to the bound field based on the current alignment config value. + */ + realign : function(){ + this.el.alignTo(this.boundEl, this.alignment); + }, + + /** + * Ends the editing process, persist the changed value to the underlying field and hides the editor. + * @param {Boolean} remainVisible Override the default behavior and keep the editor visible after edit (defaults to false) + */ + completeEdit : function(remainVisible){ + if(!this.editing){ + return; + } + var v = this.getValue(); + if(this.revertInvalid !== false && !this.field.isValid()){ + v = this.startValue; + this.cancelEdit(true); + } + if(String(v) == String(this.startValue) && this.ignoreNoChange){ + this.editing = false; + this.hide(); + return; + } + if(this.fireEvent("beforecomplete", this, v, this.startValue) !== false){ + this.editing = false; + if(this.updateEl && this.boundEl){ + this.boundEl.update(v); + } + if(remainVisible !== true){ + this.hide(); + } + this.fireEvent("complete", this, v, this.startValue); + } + }, + + // private + onShow : function(){ + this.el.show(); + if(this.hideEl !== false){ + this.boundEl.hide(); + } + this.field.show(); + this.field.focus(); + this.fireEvent("startedit", this.boundEl, this.startValue); + }, + + /** + * Cancels the editing process and hides the editor without persisting any changes. The field value will be + * reverted to the original starting value. + * @param {Boolean} remainVisible Override the default behavior and keep the editor visible after + * cancel (defaults to false) + */ + cancelEdit : function(remainVisible){ + if(this.editing){ + this.setValue(this.startValue); + if(remainVisible !== true){ + this.hide(); + } + } + }, + + // private + onBlur : function(){ + if(this.allowBlur !== true && this.editing){ + this.completeEdit(); + } + }, + + // private + onHide : function(){ + if(this.editing){ + this.completeEdit(); + return; + } + this.field.blur(); + if(this.field.collapse){ + this.field.collapse(); + } + this.el.hide(); + if(this.hideEl !== false){ + this.boundEl.show(); + } + if(Ext.QuickTips){ + Ext.QuickTips.enable(); + } + }, + + /** + * Sets the data value of the editor + * @param {Mixed} value Any valid value supported by the underlying field + */ + setValue : function(v){ + this.field.setValue(v); + }, + + /** + * Gets the data value of the editor + * @return {Mixed} value The data value + */ + getValue : function(){ + return this.field.getValue(); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/JsonView.js b/www/extras/yui-ext/source/widgets/JsonView.js new file mode 100644 index 000000000..3442c0d97 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/JsonView.js @@ -0,0 +1,300 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.JsonView + * @extends Ext.View + * Shortcut class to create a JSON + UpdateManager template view. Usage: +
          
          + var view = new Ext.JsonView("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");
          +
          +
          + // Example from my blog list
          + var tpl = new Ext.Template(
          + '<div class="entry">' +
          + '<a class="entry-title" href="{link}">{title}</a>' +
          + "<h4>{date} by {author} | {comments} Comments</h4>{description}" +
          + "</div><hr />"
          + );
          +
          + var moreView = new Ext.JsonView("entry-list", tpl, {
          + jsonRoot: "posts"
          + });
          + moreView.on("beforerender", this.sortEntries, this);
          + moreView.load({
          + url:"/blog/get-posts.php",
          + params: "allposts=true",
          + text:"Loading Blog Entries..."
          + });
          + 
          + * @constructor + * Create a new JsonView + * @param {String/HTMLElement/Element} container The container element where the view is to be rendered. + * @param {Template} tpl The rendering template + * @param {Object} config The config object + */ +Ext.JsonView = function(container, tpl, config){ + Ext.JsonView.superclass.constructor.call(this, container, tpl, config); + + var um = this.el.getUpdateManager(); + um.setRenderer(this); + um.on("update", this.onLoad, this); + um.on("failure", this.onLoadException, this); + + /** + * @event beforerender + * Fires before rendering of the downloaded json data. + * @param {Ext.View} this + * @param {Object} data The json data loaded + */ + /** + * @event load + * Fires when data is loaded. + * @param {Ext.View} this + * @param {Object} data The json data loaded + * @param {Object} response The raw Connect response object + */ + /** + * @event loadexception + * Fires when loading fails. + * @param {Ext.View} this + * @param {Object} response The raw Connect response object + */ + this.addEvents({ + 'beforerender' : true, + 'load' : true, + 'loadexception' : true + }); +}; +Ext.extend(Ext.JsonView, Ext.View, { + /** + * The root property in the loaded json object that contains the data + * @type {String} + */ + jsonRoot : "", + + /** + * Refreshes the view. + */ + refresh : function(){ + this.clearSelections(); + this.el.update(""); + var html = []; + var o = this.jsonData; + if(o && o.length > 0){ + for(var i = 0, len = o.length; i < len; i++){ + var data = this.prepareData(o[i], i, o); + html[html.length] = this.tpl.apply(data); + } + }else{ + html.push(this.emptyText); + } + this.el.update(html.join("")); + this.nodes = this.el.dom.childNodes; + this.updateIndexes(0); + }, + + /** + * Performs an async request, loading the JSON from 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: +
          
          +     view.load({
          +     url: "your-url.php",
          + params: {param1: "foo", param2: "bar"}, // or a URL encoded string
          + callback: yourFunction,
          + scope: yourObject, //(optional scope)
          + discardUrl: false,
          + nocache: false,
          + text: "Loading...",
          + timeout: 30,
          + scripts: 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. + */ + load : function(){ + var um = this.el.getUpdateManager(); + um.update.apply(um, arguments); + }, + + render : function(el, response){ + this.clearSelections(); + this.el.update(""); + var o; + try{ + o = Ext.util.JSON.decode(response.responseText); + if(this.jsonRoot){ + o = eval("o." + this.jsonRoot); + } + } catch(e){ + } + /** + * The current json data or null + */ + this.jsonData = o; + this.beforeRender(); + this.refresh(); + }, + +/** + * Get the number of records in the current JSON dataset + * @return {Number} + */ + getCount : function(){ + return this.jsonData ? this.jsonData.length : 0; + }, + +/** + * Returns the JSON object for the specified node(s) + * @param {HTMLElement/Array} node The node or an array of nodes + * @return {Object/Array} If you pass in an array, you get an array back, otherwise + * you get the JSON object for the node + */ + getNodeData : function(node){ + if(node instanceof Array){ + var data = []; + for(var i = 0, len = node.length; i < len; i++){ + data.push(this.getNodeData(node[i])); + } + return data; + } + return this.jsonData[this.indexOf(node)] || null; + }, + + beforeRender : function(){ + this.snapshot = this.jsonData; + if(this.sortInfo){ + this.sort.apply(this, this.sortInfo); + } + this.fireEvent("beforerender", this, this.jsonData); + }, + + onLoad : function(el, o){ + this.fireEvent("load", this, this.jsonData, o); + }, + + onLoadException : function(el, o){ + this.fireEvent("loadexception", this, o); + }, + +/** + * Filter the data by a specific property. + * @param {String} property A property on your JSON objects + * @param {String/RegExp} value Either string that the property values + * should start with or a RegExp to test against the property + */ + filter : function(property, value){ + if(this.jsonData){ + var data = []; + var ss = this.snapshot; + if(typeof value == "string"){ + var vlen = value.length; + if(vlen == 0){ + this.clearFilter(); + return; + } + value = value.toLowerCase(); + for(var i = 0, len = ss.length; i < len; i++){ + var o = ss[i]; + if(o[property].substr(0, vlen).toLowerCase() == value){ + data.push(o); + } + } + } else if(value.exec){ // regex? + for(var i = 0, len = ss.length; i < len; i++){ + var o = ss[i]; + if(value.test(o[property])){ + data.push(o); + } + } + } else{ + return; + } + this.jsonData = data; + this.refresh(); + } + }, + +/** + * Filter by a function. The passed function will be called with each + * object in the current dataset. If the function returns true, the value is kept + * otherwise it is filtered. + * @param {Function} fn + * @param {Object} scope (optional) The scope of the function (defaults to this JsonView) + */ + filterBy : function(fn, scope){ + if(this.jsonData){ + var data = []; + var ss = this.snapshot; + for(var i = 0, len = ss.length; i < len; i++){ + var o = ss[i]; + if(fn.call(scope || this, o)){ + data.push(o); + } + } + this.jsonData = data; + this.refresh(); + } + }, + +/** + * Clears the current filter. + */ + clearFilter : function(){ + if(this.snapshot && this.jsonData != this.snapshot){ + this.jsonData = this.snapshot; + this.refresh(); + } + }, + + +/** + * Sorts the data for this view and refreshes it. + * @param {String} property A property on your JSON objects to sort on + * @param {String} direction (optional) desc or asc (defaults to asc) + * @param {Function} sortType (optional) A function to call to convert the data to a sortable value. + */ + sort : function(property, dir, sortType){ + this.sortInfo = Array.prototype.slice.call(arguments, 0); + if(this.jsonData){ + var p = property; + var dsc = dir && dir.toLowerCase() == "desc"; + var f = function(o1, o2){ + var v1 = sortType ? sortType(o1[p]) : o1[p]; + var v2 = sortType ? sortType(o2[p]) : o2[p]; + ; + if(v1 < v2){ + return dsc ? +1 : -1; + } else if(v1 > v2){ + return dsc ? -1 : +1; + } else{ + return 0; + } + }; + this.jsonData.sort(f); + this.refresh(); + if(this.jsonData != this.snapshot){ + this.snapshot.sort(f); + } + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/Layer.js b/www/extras/yui-ext/source/widgets/Layer.js new file mode 100644 index 000000000..b139a3caa --- /dev/null +++ b/www/extras/yui-ext/source/widgets/Layer.js @@ -0,0 +1,455 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.Layer + * @extends Ext.Element + * An extended Element object that supports a shadow and shim, constrain to viewport and + * automatic maintaining of shadow/shim positions. + * @cfg {Boolean} shim False to disable the iframe shim in browsers which need one (defaults to true) + * @cfg {String/Boolean} shadow True to create a shadow element with default class "x-layer-shadow" or + * you can pass a string with a css class name. False turns off the shadow. + * @cfg {Object} dh DomHelper object config to create element with (defaults to {tag: "div", cls: "x-layer"}). + * @cfg {Boolean} constrain False to disable constrain to viewport (defaults to true) + * @cfg {String} cls CSS class to add to the element + * @cfg {Number} zindex Starting z-index (defaults to 11000!) + * @cfg {Number} shadowOffset Number of pixels to offset the shadow (defaults to 3) + * @constructor + * @param {Object} config + * @param {String/HTMLElement} existingEl (optional) Uses an existing dom element. If the element is not found it creates it. + */ +(function(){ +Ext.Layer = function(config, existingEl){ + config = config || {}; + var dh = Ext.DomHelper; + var cp = config.parentEl, pel = cp ? Ext.getDom(cp) : document.body; + if(existingEl){ + this.dom = Ext.getDom(existingEl); + } + if(!this.dom){ + var o = config.dh || {tag: "div", cls: "x-layer"}; + this.dom = dh.append(pel, o); + } + if(config.cls){ + this.addClass(config.cls); + } + this.constrain = config.constrain !== false; + this.visibilityMode = Ext.Element.VISIBILITY; + if(config.id){ + this.id = this.dom.id = config.id; + }else{ + this.id = Ext.id(this.dom); + } + this.zindex = config.zindex || this.getZIndex(); + this.position("absolute", this.zindex); + if(config.shadow){ + this.shadowOffset = config.shadowOffset || 4; + this.shadow = new Ext.Shadow({ + offset : this.shadowOffset, + mode : config.shadow + }); + }else{ + this.shadowOffset = 0; + } + this.useShim = config.shim !== false && Ext.useShims; + this.useDisplay = config.useDisplay; + this.hide(); +}; + +var supr = Ext.Element.prototype; + +// shims are shared among layer to keep from having 100 iframes +var shims = []; + +Ext.extend(Ext.Layer, Ext.Element, { + + getZIndex : function(){ + return this.zindex || parseInt(this.getStyle("z-index"), 10) || 11000; + }, + + getShim : function(){ + if(!this.useShim){ + return null; + } + if(this.shim){ + return this.shim; + } + var shim = shims.shift(); + if(!shim){ + shim = this.createShim(); + shim.enableDisplayMode('block'); + shim.dom.style.display = 'none'; + shim.dom.style.visibility = 'visible'; + } + var pn = this.dom.parentNode; + if(shim.dom.parentNode != pn){ + pn.insertBefore(shim.dom, this.dom); + } + shim.setStyle('z-index', this.getZIndex()-2); + this.shim = shim; + return shim; + }, + + hideShim : function(){ + if(this.shim){ + this.shim.setDisplayed(false); + shims.push(this.shim); + delete this.shim; + } + }, + + disableShadow : function(){ + if(this.shadow){ + this.shadowDisabled = true; + this.shadow.hide(); + this.lastShadowOffset = this.shadowOffset; + this.shadowOffset = 0; + } + }, + + enableShadow : function(show){ + if(this.shadow){ + this.shadowDisabled = false; + this.shadowOffset = this.lastShadowOffset; + delete this.lastShadowOffset; + if(show){ + this.sync(true); + } + } + }, + + // private + // this code can execute repeatedly in milliseconds (i.e. during a drag) so + // code size was sacrificed for effeciency (e.g. no getBox/setBox, no XY calls) + sync : function(doShow){ + var sw = this.shadow; + if(!this.updating && this.isVisible() && (sw || this.useShim)){ + var sh = this.getShim(); + + var w = this.getWidth(), + h = this.getHeight(); + + var l = this.getLeft(true), + t = this.getTop(true); + + if(sw && !this.shadowDisabled){ + if(doShow && !sw.isVisible()){ + sw.show(this); + }else{ + sw.realign(l, t, w, h); + } + if(sh){ + if(doShow){ + sh.show(); + } + // fit the shim behind the shadow, so it is shimmed too + var a = sw.adjusts, s = sh.dom.style; + s.left = (Math.min(l, l+a.l))+"px"; + s.top = (Math.min(t, t+a.t))+"px"; + s.width = (w+a.w)+"px"; + s.height = (h+a.h)+"px"; + } + }else if(sh){ + if(doShow){ + sh.show(); + } + sh.setSize(w, h); + sh.setLeftTop(l, t); + } + + } + }, + + // private + destroy : function(){ + this.hideShim(); + if(this.shadow){ + this.shadow.hide(); + } + this.removeAllListeners(); + var pn = this.dom.parentNode; + if(pn){ + pn.removeChild(this.dom); + } + Ext.Element.uncache(this.id); + }, + + remove : function(){ + this.destroy(); + }, + + // private + beginUpdate : function(){ + this.updating = true; + }, + + // private + endUpdate : function(){ + this.updating = false; + this.sync(true); + }, + + // private + hideUnders : function(negOffset){ + if(this.shadow){ + this.shadow.hide(); + } + this.hideShim(); + }, + + // private + constrainXY : function(){ + if(this.constrain){ + var vw = Ext.lib.Dom.getViewWidth(), + vh = Ext.lib.Dom.getViewHeight(); + var s = Ext.get(document).getScroll(); + + var xy = this.getXY(); + var x = xy[0], y = xy[1]; + var w = this.dom.offsetWidth+this.shadowOffset, h = this.dom.offsetHeight+this.shadowOffset; + // only move it if it needs it + var moved = false; + // first validate right/bottom + if((x + w) > vw+s.left){ + x = vw - w - this.shadowOffset; + moved = true; + } + if((y + h) > vh+s.top){ + y = vh - h - this.shadowOffset; + moved = true; + } + // then make sure top/left isn't negative + if(x < s.left){ + x = s.left; + moved = true; + } + if(y < s.top){ + y = s.top; + moved = true; + } + if(moved){ + if(this.avoidY){ + var ay = this.avoidY; + if(y <= ay && (y+h) >= ay){ + y = ay-h-5; + } + } + xy = [x, y]; + this.storeXY(xy); + supr.setXY.call(this, xy); + this.sync(); + } + } + }, + + isVisible : function(){ + return this.visible; + }, + + // private + showAction : function(){ + this.visible = true; // track visibility to prevent getStyle calls + if(this.useDisplay === true){ + this.setDisplayed(""); + }else if(this.lastXY){ + supr.setXY.call(this, this.lastXY); + }else if(this.lastLT){ + supr.setLeftTop.call(this, this.lastLT[0], this.lastLT[1]); + } + }, + + // private + hideAction : function(){ + this.visible = false; + if(this.useDisplay === true){ + this.setDisplayed(false); + }else{ + this.setLeftTop(-10000,-10000); + } + }, + + // overridden Element method + setVisible : function(v, a, d, c, e){ + if(v){ + this.showAction(); + } + if(a && v){ + var cb = function(){ + this.sync(true); + if(c){ + c(); + } + }.createDelegate(this); + supr.setVisible.call(this, true, true, d, cb, e); + }else{ + if(!v){ + this.hideUnders(true); + } + var cb = c; + if(a){ + cb = function(){ + this.hideAction(); + if(c){ + c(); + } + }.createDelegate(this); + } + supr.setVisible.call(this, v, a, d, cb, e); + if(v){ + this.sync(true); + }else if(!a){ + this.hideAction(); + } + } + }, + + storeXY : function(xy){ + delete this.lastLT; + this.lastXY = xy; + }, + + storeLeftTop : function(left, top){ + delete this.lastXY; + this.lastLT = [left, top]; + }, + + // private + beforeFx : function(){ + this.beforeAction(); + return Ext.Layer.superclass.beforeFx.apply(this, arguments); + }, + + // private + afterFx : function(){ + Ext.Layer.superclass.afterFx.apply(this, arguments); + this.sync(this.isVisible()); + }, + + // private + beforeAction : function(){ + if(!this.updating && this.shadow){ + this.shadow.hide(); + } + }, + + // overridden Element method + setLeft : function(left){ + this.storeLeftTop(left, this.getTop(true)); + supr.setLeft.apply(this, arguments); + this.sync(); + }, + + setTop : function(top){ + this.storeLeftTop(this.getLeft(true), top); + supr.setTop.apply(this, arguments); + this.sync(); + }, + + setLeftTop : function(left, top){ + this.storeLeftTop(left, top); + supr.setLeftTop.apply(this, arguments); + this.sync(); + }, + + setXY : function(xy, a, d, c, e){ + this.fixDisplay(); + this.beforeAction(); + this.storeXY(xy); + var cb = this.createCB(c); + supr.setXY.call(this, xy, a, d, cb, e); + if(!a){ + cb(); + } + }, + + // private + createCB : function(c){ + var el = this; + return function(){ + el.constrainXY(); + el.sync(true); + if(c){ + c(); + } + }; + }, + + // overridden Element method + setX : function(x, a, d, c, e){ + this.setXY([x, this.getY()], a, d, c, e); + }, + + // overridden Element method + setY : function(y, a, d, c, e){ + this.setXY([this.getX(), y], a, d, c, e); + }, + + // overridden Element method + setSize : function(w, h, a, d, c, e){ + this.beforeAction(); + var cb = this.createCB(c); + supr.setSize.call(this, w, h, a, d, cb, e); + if(!a){ + cb(); + } + }, + + // overridden Element method + setWidth : function(w, a, d, c, e){ + this.beforeAction(); + var cb = this.createCB(c); + supr.setWidth.call(this, w, a, d, cb, e); + if(!a){ + cb(); + } + }, + + // overridden Element method + setHeight : function(h, a, d, c, e){ + this.beforeAction(); + var cb = this.createCB(c); + supr.setHeight.call(this, h, a, d, cb, e); + if(!a){ + cb(); + } + }, + + // overridden Element method + setBounds : function(x, y, w, h, a, d, c, e){ + this.beforeAction(); + var cb = this.createCB(c); + if(!a){ + this.storeXY([x, y]); + supr.setXY.call(this, [x, y]); + supr.setSize.call(this, w, h, a, d, cb, e); + cb(); + }else{ + supr.setBounds.call(this, x, y, w, h, a, d, cb, e); + } + return this; + }, + + /** + * Set the z-index of this layer and adjusts any shadow and shim z-indexes. The layer z-index is automatically + * incremented by two more than the value passed in so that it always shows above any shadow or shim (the shadow + * element, if any, will be assigned z-index + 1, and the shim element, if any, will be assigned the unmodified z-index). + * @param {Number} zindex The new z-index to set + * @return {this} The Layer + */ + setZIndex : function(zindex){ + this.zindex = zindex; + this.setStyle("z-index", zindex + 2); + if(this.shadow){ + this.shadow.setZIndex(zindex + 1); + } + if(this.shim){ + this.shim.setStyle("z-index", zindex); + } + } +}); +})(); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/LoadMask.js b/www/extras/yui-ext/source/widgets/LoadMask.js new file mode 100644 index 000000000..c2f8b0d15 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/LoadMask.js @@ -0,0 +1,99 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.LoadMask + * A simple utility class for generically masking elements while loading data. If the element being masked has + * an underlying {@link Ext.data.Store}, the masking will be automatically synchronized with the store's loading + * process and the mask element will be cached for reuse. For all other elements, this mask will replace the + * element's UpdateManager load indicator and will be destroyed after the initial load. + * @constructor + * Create a new LoadMask + * @param {Object} config The config object + */ +Ext.LoadMask = function(el, config){ + this.el = Ext.get(el); + Ext.apply(this, config); + if(this.store){ + this.store.on('beforeload', this.onBeforeLoad, this); + this.store.on('load', this.onLoad, this); + this.store.on('loadexception', this.onLoad, this); + this.removeMask = false; + }else{ + var um = this.el.getUpdateManager(); + um.showLoadIndicator = false; // disable the default indicator + um.on('beforeupdate', this.onBeforeLoad, this); + um.on('update', this.onLoad, this); + um.on('failure', this.onLoad, this); + this.removeMask = true; + } +}; + +Ext.LoadMask.prototype = { + /** + * @cfg {Boolean} removeMask + * True to create a single-use mask that is automatically destroyed after loading (useful for page loads), + * False to persist the mask element reference for multiple uses (e.g., for paged data widgets). Defaults to false. + */ + /** + * @cfg {String} msg + * The text to display in a centered loading message box (defaults to 'Loading...') + */ + msg : 'Loading...', + /** + * @cfg {String} msgCls + * The CSS class to apply to the loading message element (defaults to "x-mask-loading") + */ + msgCls : 'x-mask-loading', + + /** + * Read-only. True if the mask is currently disabled so that it will not be displayed (defaults to false) + * @type Boolean + */ + disabled: false, + + /** + * Disables the mask to prevent it from being displayed + */ + disable : function(){ + this.disabled = true; + }, + + /** + * Enables the mask so that it can be displayed + */ + enable : function(){ + this.disabled = false; + }, + + // private + onLoad : function(){ + this.el.unmask(this.removeMask); + }, + + // private + onBeforeLoad : function(){ + if(!this.disabled){ + this.el.mask(this.msg, this.msgCls); + } + }, + + // private + destroy : function(){ + if(this.store){ + this.store.un('beforeload', this.onBeforeLoad, this); + this.store.un('load', this.onLoad, this); + this.store.un('loadexception', this.onLoad, this); + }else{ + var um = this.el.getUpdateManager(); + um.un('beforeupdate', this.onBeforeLoad, this); + um.un('update', this.onLoad, this); + um.un('failure', this.onLoad, this); + } + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/MenuButton.js b/www/extras/yui-ext/source/widgets/MenuButton.js new file mode 100644 index 000000000..4f3f60389 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/MenuButton.js @@ -0,0 +1,174 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.MenuButton + * @extends Ext.Button + * A split button that provides a built-in dropdown arrow that can fire an event separately from the default + * click event of the button. Typically this would be used to display a dropdown menu that provides additional + * options to the primary button action, but any custom handler can provide the arrowclick implementation. + * @cfg {Function} arrowHandler A function called when the arrow button is clicked (can be used instead of click event) + * @cfg {String} arrowTooltip The title attribute of the arrow + * @constructor + * Create a new menu button + * @param {String/HTMLElement/Element} renderTo The element to append the button to + * @param {Object} config The config object + */ +Ext.MenuButton = function(renderTo, config){ + Ext.MenuButton.superclass.constructor.call(this, renderTo, config); + /** + * @event arrowclick + * Fires when this button's arrow is clicked + * @param {MenuButton} this + * @param {EventObject} e The click event + */ + this.addEvents({"arrowclick":true}); +}; + +Ext.extend(Ext.MenuButton, Ext.Button, { + render : function(renderTo){ + // this is one sweet looking template! + var tpl = new Ext.Template( + '
          ', + '', + '', + "
           
          ", + '', + '', + "
           
          " + ); + var btn = tpl.append(renderTo, [this.text], true); + if(this.cls){ + btn.addClass(this.cls); + } + if(this.icon){ + btn.child("button").setStyle('background-image', 'url(' +this.icon +')'); + } + this.el = btn; + this.autoWidth(); + if(this.handleMouseEvents){ + btn.on("mouseover", this.onMouseOver, this); + btn.on("mouseout", this.onMouseOut, this); + btn.on("mousedown", this.onMouseDown, this); + btn.on("mouseup", this.onMouseUp, this); + } + btn.on(this.clickEvent, this.onClick, this); + if(this.tooltip){ + var btnEl = btn.child("button:first"); + if(typeof this.tooltip == 'object'){ + Ext.QuickTips.tips(Ext.apply({ + target: btnEl.id + }, this.tooltip)); + } else { + btnEl.dom[this.tooltipType] = this.tooltip; + } + } + if(this.arrowTooltip){ + var btnEl = btn.child("button:nth(2)"); + btnEl.dom[this.tooltipType] = this.arrowTooltip; + } + if(this.hidden){ + this.hide(); + } + if(this.disabled){ + this.disable(); + } + if(this.menu){ + this.menu.on("show", this.onMenuShow, this); + this.menu.on("hide", this.onMenuHide, this); + } + }, + + // private + autoWidth : function(){ + if(this.el){ + var tbl = this.el.child("table:first"); + var tbl2 = this.el.child("table:last"); + this.el.setWidth("auto"); + tbl.setWidth("auto"); + if(Ext.isIE7 && Ext.isStrict){ + var ib = this.el.child('button:first'); + if(ib && ib.getWidth() > 20){ + ib.clip(); + ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr')); + } + } + if(this.minWidth){ + if(this.hidden){ + this.el.beginMeasure(); + } + if((tbl.getWidth()+tbl2.getWidth()) < this.minWidth){ + tbl.setWidth(this.minWidth-tbl2.getWidth()); + } + if(this.hidden){ + this.el.endMeasure(); + } + } + this.el.setWidth(tbl.getWidth()+tbl2.getWidth()); + } + }, + /** + * Sets this button's 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; + }, + + /** + * Sets this button's arrow click handler + * @param {Function} handler The function to call when the arrow is clicked + * @param {Object} scope (optional) Scope for the function passed above + */ + setArrowHandler : function(handler, scope){ + this.arrowHandler = handler; + this.scope = scope; + }, + + /** + * Focus the button + */ + focus : function(){ + if(this.el){ + this.el.child("a:first").focus(); + } + }, + + // private + onClick : function(e){ + e.preventDefault(); + if(!this.disabled){ + if(e.getTarget(".x-btn-menu-arrow-wrap")){ + if(this.menu && !this.menu.isVisible()){ + this.menu.show(this.el, this.menuAlign); + } + this.fireEvent("arrowclick", this, e); + if(this.arrowHandler){ + this.arrowHandler.call(this.scope || this, this, e); + } + }else{ + this.fireEvent("click", this, e); + if(this.handler){ + this.handler.call(this.scope || this, this, e); + } + } + } + }, + // private + onMouseDown : function(e){ + if(!this.disabled){ + Ext.fly(e.getTarget("table")).addClass("x-btn-click"); + } + }, + // private + onMouseUp : function(e){ + Ext.fly(e.getTarget("table")).removeClass("x-btn-click"); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/MessageBox.js b/www/extras/yui-ext/source/widgets/MessageBox.js new file mode 100644 index 000000000..35b78375c --- /dev/null +++ b/www/extras/yui-ext/source/widgets/MessageBox.js @@ -0,0 +1,486 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.MessageBox + * Utility class for generating different styles of message boxes. The alias Ext.Msg can also be used. + * Example usage: + *
          
          +// Basic alert:
          +Ext.Msg.alert('Status', 'Changes saved successfully.');
          +
          +// Prompt for user data:
          +Ext.Msg.prompt('Name', 'Please enter your name:', function(btn, text){
          +    if (btn == 'ok'){
          +        // process text value...
          +    }
          +});
          +
          +// Show a dialog using config options:
          +Ext.Msg.show({
          +   title:'Save Changes?',
          +   msg: 'Your are closing a tab that has unsaved changes. Would you like to save your changes?',
          +   buttons: Ext.Msg.YESNOCANCEL,
          +   fn: processResult,
          +   animEl: 'elId'
          +});
          + 
          + * @singleton + */ +Ext.MessageBox = function(){ + var dlg, opt, mask, waitTimer; + var bodyEl, msgEl, textboxEl, textareaEl, progressEl, pp; + var buttons, activeTextEl, bwidth; + + // private + var handleButton = function(button){ + dlg.hide(); + Ext.callback(opt.fn, opt.scope||window, [button, activeTextEl.dom.value], 1); + }; + + // private + var handleHide = function(){ + if(opt && opt.cls){ + dlg.el.removeClass(opt.cls); + } + if(waitTimer){ + Ext.TaskMgr.stop(waitTimer); + waitTimer = null; + } + }; + + // private + var updateButtons = function(b){ + var width = 0; + if(!b){ + buttons["ok"].hide(); + buttons["cancel"].hide(); + buttons["yes"].hide(); + buttons["no"].hide(); + dlg.footer.dom.style.display = 'none'; + return width; + } + dlg.footer.dom.style.display = ''; + for(var k in buttons){ + if(typeof buttons[k] != "function"){ + if(b[k]){ + buttons[k].show(); + buttons[k].setText(typeof b[k] == "string" ? b[k] : Ext.MessageBox.buttonText[k]); + width += buttons[k].el.getWidth()+15; + }else{ + buttons[k].hide(); + } + } + } + return width; + }; + + // private + var handleEsc = function(d, k, e){ + if(opt && opt.closable !== false){ + dlg.hide(); + } + if(e){ + e.stopEvent(); + } + }; + + return { + /** + * Returns a reference to the underlying {@link Ext.BasicDialog} element + * @return {Ext.BasicDialog} dialog The BasicDialog element + */ + getDialog : function(){ + if(!dlg){ + dlg = new Ext.BasicDialog("x-msg-box", { + autoCreate : true, + shadow: true, + draggable: true, + resizable:false, + constraintoviewport:false, + fixedcenter:true, + collapsible : false, + shim:true, + modal: true, + width:400, height:100, + buttonAlign:"center", + closeClick : function(){ + if(opt && opt.buttons && opt.buttons.no && !opt.buttons.cancel){ + handleButton("no"); + }else{ + handleButton("cancel"); + } + } + }); + dlg.on("hide", handleHide); + mask = dlg.mask; + dlg.addKeyListener(27, handleEsc); + buttons = {}; + var bt = this.buttonText; + buttons["ok"] = dlg.addButton(bt["ok"], handleButton.createCallback("ok")); + buttons["yes"] = dlg.addButton(bt["yes"], handleButton.createCallback("yes")); + buttons["no"] = dlg.addButton(bt["no"], handleButton.createCallback("no")); + buttons["cancel"] = dlg.addButton(bt["cancel"], handleButton.createCallback("cancel")); + bodyEl = dlg.body.createChild({ + tag:"div", + html:'
           
          ' + }); + msgEl = bodyEl.dom.firstChild; + textboxEl = Ext.get(bodyEl.dom.childNodes[2]); + textboxEl.enableDisplayMode(); + textboxEl.addKeyListener([10,13], function(){ + if(dlg.isVisible() && opt && opt.buttons){ + if(opt.buttons.ok){ + handleButton("ok"); + }else if(opt.buttons.yes){ + handleButton("yes"); + } + } + }); + textareaEl = Ext.get(bodyEl.dom.childNodes[3]); + textareaEl.enableDisplayMode(); + progressEl = Ext.get(bodyEl.dom.childNodes[4]); + progressEl.enableDisplayMode(); + var pf = progressEl.dom.firstChild; + pp = Ext.get(pf.firstChild); + pp.setHeight(pf.offsetHeight); + } + return dlg; + }, + + /** + * Updates the message box body text + * @param {String} text Replaces the message box element's innerHTML with the specified string (defaults to + * the XHTML-compliant non-breaking space character  ) + * @return {Ext.MessageBox} messageBox This message box + */ + updateText : function(text){ + if(!dlg.isVisible() && !opt.width){ + dlg.resizeTo(this.maxWidth, 100); // resize first so content is never clipped from previous shows + } + msgEl.innerHTML = text || ' '; + var w = Math.max(Math.min(opt.width || msgEl.offsetWidth, this.maxWidth), + Math.max(opt.minWidth || this.minWidth, bwidth)); + if(opt.prompt){ + activeTextEl.setWidth(w); + } + if(dlg.isVisible()){ + dlg.fixedcenter = false; + } + dlg.setContentSize(w, bodyEl.getHeight()); + if(dlg.isVisible()){ + dlg.fixedcenter = true; + } + return this; + }, + + /** + * Updates a progress-style message box's text and progress bar. Only relevant on message boxes + * initiated via {@link Ext.MessageBox#progress} or by calling {@link Ext.MessageBox#show} with progress: true. + * @param {Number} value Any number between 0 and 1 (e.g., .5) + * @param {String} text If defined, the message box's body text is replaced with the specified string (defaults to undefined) + * @return {Ext.MessageBox} messageBox This message box + */ + updateProgress : function(value, text){ + if(text){ + this.updateText(text); + } + pp.setWidth(Math.floor(value*progressEl.dom.firstChild.offsetWidth)); + return this; + }, + + /** + * Returns true if the message box is currently displayed + * @return {Boolean} isVisible True if the message box is visible, else false + */ + isVisible : function(){ + return dlg && dlg.isVisible(); + }, + + /** + * Hides the message box if it is displayed + */ + hide : function(){ + if(this.isVisible()){ + dlg.hide(); + } + }, + + /** + * Displays a new message box, or reinitializes an existing message box, based on the config options + * passed in. All functions (e.g. prompt, alert, etc) on MessageBox call this function internally. + * The following config object properties are supported: + *
          +Property    Type             Description
          +----------  ---------------  ----------------------------------------------------------------------
          +title       String           The title text
          +closable    Boolean          False to hide the top-right close box (defaults to true)
          +prompt      Boolean          True to prompt the user to enter single-line text (defaults to false)
          +multiline   Boolean          True to prompt the user to enter multi-line text (defaults to false)
          +progress    Boolean          True to display a progress bar (defaults to false)
          +value       String           The string value to set into the active textbox element if displayed
          +buttons     Object/Boolean   A button config object (e.g., Ext.MessageBox.OKCANCEL or {ok:'Foo',
          +                             cancel:'Bar'}), or false to not show any buttons (defaults to false)
          +msg         String           A string that will replace the existing message box body text (defaults
          +                             to the XHTML-compliant non-breaking space character  )
          +cls         String           A custom CSS class to apply to the message box element
          +proxyDrag   Boolean          True to display a lightweight proxy while dragging (defaults to false)
          +modal       Boolean          False to allow user interaction with the page while the message box is
          +                             displayed (defaults to true)
          +
          + * + * Example usage: + *
          
          +Ext.Msg.show({
          +   title: 'Address',
          +   msg: 'Please enter your address:',
          +   width: 300,
          +   buttons: Ext.MessageBox.OKCANCEL,
          +   multiline: true,
          +   fn: saveAddress,
          +   animEl: 'addAddressBtn'
          +});
          +
          + * @param {Object} config Configuration options + * @return {Ext.MessageBox} messageBox This message box + */ + show : function(options){ + if(this.isVisible()){ + this.hide(); + } + var d = this.getDialog(); + opt = options; + d.setTitle(opt.title || " "); + d.close.setDisplayed(opt.closable !== false); + activeTextEl = textboxEl; + opt.prompt = opt.prompt || (opt.multiline ? true : false); + if(opt.prompt){ + if(opt.multiline){ + textboxEl.hide(); + textareaEl.show(); + textareaEl.setHeight(typeof opt.multiline == "number" ? + opt.multiline : this.defaultTextHeight); + activeTextEl = textareaEl; + }else{ + textboxEl.show(); + textareaEl.hide(); + } + }else{ + textboxEl.hide(); + textareaEl.hide(); + } + progressEl.setDisplayed(opt.progress === true); + this.updateProgress(0); + activeTextEl.dom.value = opt.value || ""; + if(opt.prompt){ + dlg.setDefaultButton(activeTextEl); + }else{ + var bs = opt.buttons; + var db = null; + if(bs && bs.ok){ + db = buttons["ok"]; + }else if(bs && bs.yes){ + db = buttons["yes"]; + } + dlg.setDefaultButton(db); + } + bwidth = updateButtons(opt.buttons); + this.updateText(opt.msg); + if(opt.cls){ + d.el.addClass(opt.cls); + } + d.proxyDrag = opt.proxyDrag === true; + d.modal = opt.modal !== false; + d.mask = opt.modal !== false ? mask : false; + if(!d.isVisible()){ + // force it to the end of the z-index stack so it gets a cursor in FF + document.body.appendChild(dlg.el.dom); + d.animateTarget = null; + d.show(options.animEl); + } + return this; + }, + + /** + * Displays a message box with a progress bar. This message box has no buttons and is not closeable by + * the user. You are responsible for updating the progress bar as needed via {@link Ext.MessageBox#updateProgress} + * and closing the message box when the process is complete. + * @param {String} title The title bar text + * @param {String} msg The message box body text + * @return {Ext.MessageBox} messageBox This message box + */ + progress : function(title, msg){ + this.show({ + title : title, + msg : msg, + buttons: false, + progress:true, + closable:false, + minWidth: this.minProgressWidth + }); + return this; + }, + + /** + * Displays a standard read-only message box (comparable to the basic JavaScript alert prompt) with an OK + * button. If a callback function is passed it will be called after the user clicks the button, and the + * id of the button that was clicked will be passed as the only parameter to the callback + * (could also be the top-right close button). + * @param {String} title The title bar text + * @param {String} msg The message box body text + * @param {Function} fn (optional) The callback function invoked after the message box is closed + * @param {Object} scope (optional) The scope of the callback function + * @return {Ext.MessageBox} messageBox This message box + */ + alert : function(title, msg, fn, scope){ + this.show({ + title : title, + msg : msg, + buttons: this.OK, + fn: fn, + scope : scope + }); + return this; + }, + + /** + * Displays a message box with an infinitely auto-updating progress bar. This can be used to block user + * interaction while waiting for a long-running process to complete that does not have defined intervals. + * You are responsible for closing the message box when the process is complete. + * @param {String} msg The message box body text + * @param {String} title (optional) The title bar text + * @return {Ext.MessageBox} messageBox This message box + */ + wait : function(msg, title){ + this.show({ + title : title, + msg : msg, + buttons: false, + closable:false, + progress:true, + modal:true, + width:300, + wait:true + }); + waitTimer = Ext.TaskMgr.start({ + run: function(i){ + Ext.MessageBox.updateProgress(((((i+20)%20)+1)*5)*.01); + }, + interval: 1000 + }); + return this; + }, + + /** + * Displays a confirmation message box with Yes and No buttons. If a callback function is passed it will + * be called after the user clicks either button, and the id of the button that was clicked + * will be passed as the only parameter to the callback (could also be the top-right close button). + * @param {String} title The title bar text + * @param {String} msg The message box body text + * @param {Function} fn (optional) The callback function invoked after the message box is closed + * @param {Object} scope (optional) The scope of the callback function + * @return {Ext.MessageBox} messageBox This message box + */ + confirm : function(title, msg, fn, scope){ + this.show({ + title : title, + msg : msg, + buttons: this.YESNO, + fn: fn, + scope : scope + }); + return this; + }, + + /** + * Displays a message box with OK and Cancel buttons prompting the user to enter some text. The prompt can + * be a single-line or multi-line textbox. If a callback function is passed it will be called after the user + * clicks either button, and the id of the button that was clicked (could also be the top-right + * close button) and the text that was entered will be passed as the two parameters to the callback. + * @param {String} title The title bar text + * @param {String} msg The message box body text + * @param {Function} fn (optional) The callback function invoked after the message box is closed + * @param {Object} scope (optional) The scope of the callback function + * @param {Boolean/Number} multiline (optional) True to create a multiline textbox using the defaultTextHeight + * property, or the height in pixels to create the textbox (defaults to false / single-line) + * @return {Ext.MessageBox} messageBox This message box + */ + prompt : function(title, msg, fn, scope, multiline){ + this.show({ + title : title, + msg : msg, + buttons: this.OKCANCEL, + fn: fn, + minWidth:250, + scope : scope, + prompt:true, + multiline: multiline + }); + return this; + }, + + /** + * Button config that displays a single OK button + * @type Object + */ + OK : {ok:true}, + /** + * Button config that displays Yes and No buttons + * @type Object + */ + YESNO : {yes:true, no:true}, + /** + * Button config that displays OK and Cancel buttons + * @type Object + */ + OKCANCEL : {ok:true, cancel:true}, + /** + * Button config that displays Yes, No and Cancel buttons + * @type Object + */ + YESNOCANCEL : {yes:true, no:true, cancel:true}, + + /** + * The default height in pixels of the message box's multiline textarea if displayed (defaults to 75) + * @type Number + */ + defaultTextHeight : 75, + /** + * The maximum width in pixels of the message box (defaults to 600) + * @type Number + */ + maxWidth : 600, + /** + * The minimum width in pixels of the message box (defaults to 100) + * @type Number + */ + minWidth : 100, + /** + * The minimum width in pixels of the message box progress bar if displayed (defaults to 250) + * @type Number + */ + minProgressWidth : 250, + /** + * An object containing the default button text strings that can be overriden for localized language support. + * Supported properties are: ok, cancel, yes and no. + * Customize the default text like so: Ext.MessageBox.buttonText.yes = "Si"; + * @type Object + */ + buttonText : { + ok : "OK", + cancel : "Cancel", + yes : "Yes", + no : "No" + } + }; +}(); + +/** + * Shorthand for {@link Ext.MessageBox} + */ +Ext.Msg = Ext.MessageBox; \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/PagingToolbar.js b/www/extras/yui-ext/source/widgets/PagingToolbar.js new file mode 100644 index 000000000..5f148a2a9 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/PagingToolbar.js @@ -0,0 +1,268 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.PagingToolbar + * @extends Ext.Toolbar + * A specialized toolbar that is bound to a {@link Ext.data.Store} and provides automatic paging controls. + * @constructor + * Create a new PagingToolbar + * @param {String/HTMLElement/Element} container The id or element that will contain the toolbar + * @param {Ext.data.Store} store The underlying data store providing the paged data + * @param {Object} config The config object + */ +Ext.PagingToolbar = function(el, ds, config){ + Ext.PagingToolbar.superclass.constructor.call(this, el, null, config); + this.ds = ds; + this.cursor = 0; + this.renderButtons(this.el); + this.bind(ds); +}; + +Ext.extend(Ext.PagingToolbar, Ext.Toolbar, { + /** + * @cfg {Number} pageSize + * The number of records to display per page (defaults to 20) + */ + pageSize: 20, + /** + * @cfg {String} displayMsg + * The paging status message to display (defaults to "Displaying {start} - {end} of {total}") + */ + displayMsg : 'Displaying {0} - {1} of {2}', + /** + * @cfg {String} emptyMsg + * The message to display when no records are found (defaults to "No data to display") + */ + emptyMsg : 'No data to display', + /** + * 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", + + // private + renderButtons : function(el){ + this.first = this.addButton({ + tooltip: this.firstText, + cls: "x-btn-icon x-grid-page-first", + disabled: true, + handler: this.onClick.createDelegate(this, ["first"]) + }); + this.prev = this.addButton({ + tooltip: this.prevText, + cls: "x-btn-icon x-grid-page-prev", + disabled: true, + handler: this.onClick.createDelegate(this, ["prev"]) + }); + this.addSeparator(); + this.add(this.beforePageText); + this.field = Ext.get(this.addDom({ + tag: "input", + type: "text", + size: "3", + value: "1", + cls: "x-grid-page-number" + }).el); + this.field.on("keydown", this.onPagingKeydown, this); + this.field.on("focus", function(){this.dom.select();}); + this.afterTextEl = this.addText(String.format(this.afterPageText, 1)); + this.field.setHeight(18); + this.addSeparator(); + this.next = this.addButton({ + tooltip: this.nextText, + cls: "x-btn-icon x-grid-page-next", + disabled: true, + handler: this.onClick.createDelegate(this, ["next"]) + }); + this.last = this.addButton({ + tooltip: this.lastText, + cls: "x-btn-icon x-grid-page-last", + disabled: true, + handler: this.onClick.createDelegate(this, ["last"]) + }); + this.addSeparator(); + this.loading = this.addButton({ + tooltip: this.refreshText, + cls: "x-btn-icon x-grid-loading", + disabled: true, + handler: this.onClick.createDelegate(this, ["refresh"]) + }); + + if(this.displayInfo){ + this.displayEl = this.el.createChild({cls:'x-paging-info'}); + } + }, + + // private + updateInfo : function(){ + if(this.displayEl){ + var count = this.ds.getCount(); + var msg = count == 0 ? + this.emptyMsg : + String.format( + this.displayMsg, + this.cursor+1, this.cursor+count, this.ds.getTotalCount() + ); + this.displayEl.update(msg); + } + }, + + // private + onLoad : function(ds, r, o){ + this.cursor = o.params ? o.params.start : 0; + var d = this.getPageData(), ap = d.activePage, ps = d.pages; + + this.afterTextEl.el.innerHTML = String.format(this.afterPageText, d.pages); + this.field.dom.value = ap; + this.first.setDisabled(ap == 1); + this.prev.setDisabled(ap == 1); + this.next.setDisabled(ap == ps); + this.last.setDisabled(ap == ps); + this.loading.enable(); + this.updateInfo(); + }, + + // private + getPageData : function(){ + var total = this.ds.getTotalCount(); + return { + total : total, + activePage : Math.ceil((this.cursor+this.pageSize)/this.pageSize), + pages : total < this.pageSize ? 1 : Math.ceil(total/this.pageSize) + }; + }, + + // private + onLoadError : function(){ + this.loading.enable(); + }, + + // private + onPagingKeydown : function(e){ + var k = e.getKey(); + var d = this.getPageData(); + if(k == e.RETURN){ + var v = this.field.dom.value, pageNum; + if(!v || isNaN(pageNum = parseInt(v, 10))){ + this.field.dom.value = d.activePage; + return; + } + pageNum = Math.min(Math.max(1, pageNum), d.pages) - 1; + this.ds.load({params:{start: pageNum * this.pageSize, limit: this.pageSize}}); + e.stopEvent(); + } + else if(k == e.HOME || (k == e.UP && e.ctrlKey) || (k == e.PAGEUP && e.ctrlKey) || (k == e.RIGHT && e.ctrlKey) || k == e.END || (k == e.DOWN && e.ctrlKey) || (k == e.LEFT && e.ctrlKey) || (k == e.PAGEDOWN && e.ctrlKey)) + { + var pageNum = (k == e.HOME || (k == e.DOWN && e.ctrlKey) || (k == e.LEFT && e.ctrlKey) || (k == e.PAGEDOWN && e.ctrlKey)) ? 1 : d.pages; + this.field.dom.value = pageNum; + this.ds.load({params:{start: (pageNum - 1) * this.pageSize, limit: this.pageSize}}); + e.stopEvent(); + } + else if(k == e.UP || k == e.RIGHT || k == e.PAGEUP || k == e.DOWN || k == e.LEFT || k == e.PAGEDOWN) + { + var v = this.field.dom.value, pageNum; + var increment = (e.shiftKey) ? 10 : 1; + if(k == e.DOWN || k == e.LEFT || k == e.PAGEDOWN) + increment *= -1; + if(!v || isNaN(pageNum = parseInt(v, 10))) { + this.field.dom.value = d.activePage; + return; + } + else if(parseInt(v, 10) + increment >= 1 & parseInt(v, 10) + increment <= d.pages) + { + this.field.dom.value = parseInt(v, 10) + increment; + pageNum = Math.min(Math.max(1, pageNum + increment), d.pages) - 1; + this.ds.load({params:{start: pageNum * this.pageSize, limit: this.pageSize}}); + } + e.stopEvent(); + } + }, + + // private + beforeLoad : function(){ + if(this.loading){ + this.loading.disable(); + } + }, + + // private + onClick : function(which){ + var ds = this.ds; + switch(which){ + case "first": + ds.load({params:{start: 0, limit: this.pageSize}}); + break; + case "prev": + ds.load({params:{start: Math.max(0, this.cursor-this.pageSize), limit: this.pageSize}}); + break; + case "next": + ds.load({params:{start: this.cursor+this.pageSize, limit: this.pageSize}}); + break; + case "last": + var total = ds.getTotalCount(); + var extra = total % this.pageSize; + var lastStart = extra ? (total - extra) : total-this.pageSize; + ds.load({params:{start: lastStart, limit: this.pageSize}}); + break; + case "refresh": + ds.load({params:{start: this.cursor, limit: this.pageSize}}); + break; + } + }, + + /** + * Unbinds the paging toolbar from the specified {@link Ext.data.Store} + * @param {Ext.data.Store} store The data store to unbind + */ + unbind : function(ds){ + ds.un("beforeload", this.beforeLoad, this); + ds.un("load", this.onLoad, this); + ds.un("loadexception", this.onLoadError, this); + }, + + /** + * Binds the paging toolbar to the specified {@link Ext.data.Store} + * @param {Ext.data.Store} store The data store to bind + */ + bind : function(ds){ + ds.on("beforeload", this.beforeLoad, this); + ds.on("load", this.onLoad, this); + ds.on("loadexception", this.onLoadError, this); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/QuickTips.js b/www/extras/yui-ext/source/widgets/QuickTips.js new file mode 100644 index 000000000..81f7f646f --- /dev/null +++ b/www/extras/yui-ext/source/widgets/QuickTips.js @@ -0,0 +1,365 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.QuickTips + * Provides attractive and customizable tooltips for any element. + * @singleton + */ +Ext.QuickTips = function(){ + var el, tipBody, tipBodyText, tipTitle, tm, cfg, close, tagEls = {}, esc, removeCls = null, bdLeft, bdRight; + var ce, bd, xy, dd; + var visible = false, disabled = true, inited = false; + var showProc = 1, hideProc = 1, dismissProc = 1, locks = []; + + var onOver = function(e){ + if(disabled){ + return; + } + var t = e.getTarget(); + if(!t || t.nodeType !== 1 || t == document || t == document.body){ + return; + } + if(ce && t == ce.el){ + clearTimeout(hideProc); + return; + } + if(t && tagEls[t.id]){ + tagEls[t.id].el = t; + showProc = show.defer(tm.showDelay, tm, [tagEls[t.id]]); + return; + } + var ttp, et = Ext.fly(t); + var ns = cfg.namespace; + if(tm.interceptTitles && t.title){ + ttp = t.title; + t.qtip = ttp; + t.removeAttribute("title"); + e.preventDefault(); + }else{ + ttp = t.qtip || et.getAttributeNS(ns, cfg.attribute); + } + if(ttp){ + showProc = show.defer(tm.showDelay, tm, [{ + el: t, + text: ttp, + width: et.getAttributeNS(ns, cfg.width), + autoHide: et.getAttributeNS(ns, cfg.hide) != "user", + title: et.getAttributeNS(ns, cfg.title), + cls: et.getAttributeNS(ns, cfg.cls) + }]); + } + }; + + var onOut = function(e){ + clearTimeout(showProc); + var t = e.getTarget(); + if(t && ce && ce.el == t && (tm.autoHide && ce.autoHide !== false)){ + hideProc = setTimeout(hide, tm.hideDelay); + } + }; + + var onMove = function(e){ + if(disabled){ + return; + } + xy = e.getXY(); + xy[1] += 18; + if(tm.trackMouse && ce){ + el.setXY(xy); + } + }; + + var onDown = function(e){ + clearTimeout(showProc); + clearTimeout(hideProc); + if(!e.within(el)){ + if(tm.hideOnClick){ + hide(); + tm.disable(); + } + } + }; + + var onUp = function(e){ + tm.enable(); + }; + + var getPad = function(){ + return bdLeft.getPadding('l')+bdRight.getPadding('r'); + }; + + var show = function(o){ + if(disabled){ + return; + } + clearTimeout(dismissProc); + ce = o; + if(removeCls){ // in case manually hidden + el.removeClass(removeCls); + removeCls = null; + } + if(ce.cls){ + el.addClass(ce.cls); + removeCls = ce.cls; + } + if(ce.title){ + tipTitle.update(ce.title); + tipTitle.show(); + }else{ + tipTitle.update(''); + tipTitle.hide(); + } + el.dom.style.width = tm.maxWidth+'px'; + //tipBody.dom.style.width = ''; + tipBodyText.update(o.text); + var p = getPad(), w = ce.width; + if(!w){ + var td = tipBodyText.dom; + var aw = Math.max(td.offsetWidth, td.clientWidth, td.scrollWidth); + if(aw > tm.maxWidth){ + w = tm.maxWidth; + }else if(aw < tm.minWidth){ + w = tm.minWidth; + }else{ + w = aw; + } + } + //tipBody.setWidth(w); + el.setWidth(parseInt(w, 10) + p); + if(!ce.autoHide){ + close.setDisplayed(true); + if(dd){ + dd.unlock(); + } + }else{ + close.setDisplayed(false); + if(dd){ + dd.lock(); + } + } + if(xy){ + el.avoidY = xy[1]-18; + el.setXY(xy); + } + if(tm.animate){ + el.setOpacity(.1); + el.setStyle("visibility", "visible"); + el.fadeIn({callback: afterShow}); + }else{ + afterShow(); + } + }; + + var afterShow = function(){ + if(ce){ + el.show(); + esc.enable(); + if(tm.autoDismiss && ce.autoHide !== false){ + dismissProc = setTimeout(hide, tm.autoDismissDelay); + } + } + }; + + var hide = function(noanim){ + clearTimeout(dismissProc); + clearTimeout(hideProc); + ce = null; + if(el.isVisible()){ + esc.disable(); + if(noanim !== true && tm.animate){ + el.fadeOut({callback: afterHide}); + }else{ + afterHide(); + } + } + }; + + var afterHide = function(){ + el.hide(); + if(removeCls){ + el.removeClass(removeCls); + removeCls = null; + } + }; + + return { + /** + * @cfg {Number} minWidth + * The minimum width of the quick tip (defaults to 40) + */ + minWidth : 40, + /** + * @cfg {Number} maxWidth + * The maximum width of the quick tip (defaults to 300) + */ + maxWidth : 300, + /** + * @cfg {Boolean} interceptTitles + * True to automatically use the element's DOM title value if available (defaults to false) + */ + interceptTitles : false, + /** + * @cfg {Boolean} trackMouse + * True to have the quick tip follow the mouse as it moves over the target element (defaults to false) + */ + trackMouse : false, + /** + * @cfg {Boolean} hideOnClick + * True to hide the quick tip if the user clicks anywhere in the document (defaults to true) + */ + hideOnClick : true, + /** + * @cfg {Number} showDelay + * Delay in milliseconds before the quick tip displays after the mouse enters the target element (defaults to 500) + */ + showDelay : 500, + /** + * @cfg {Number} hideDelay + * Delay in milliseconds before the quick tip hides when autoHide = true (defaults to 200) + */ + hideDelay : 200, + /** + * @cfg {Boolean} autoHide + * True to automatically hide the quick tip after the mouse exits the target element (defaults to true). + * Used in conjunction with hideDelay. + */ + autoHide : true, + /** + * @cfg {Boolean} + * True to automatically hide the quick tip after a set period of time, regardless of the user's actions + * (defaults to true). Used in conjunction with autoDismissDelay. + */ + autoDismiss : true, + /** + * @cfg {Number} + * Delay in milliseconds before the quick tip hides when autoDismiss = true (defaults to 5000) + */ + autoDismissDelay : 5000, + /** + * @cfg {Boolean} animate + * True to turn on fade animation. Defaults to false (ClearType/scrollbar flicker issues in IE7). + */ + animate : false, + + // private + init : function(){ + tm = Ext.QuickTips; + cfg = tm.tagConfig; + if(!inited){ + el = new Ext.Layer({cls:"x-tip", shadow:"drop", shim: true, constrain:true, shadowOffset:3}); + el.fxDefaults = {stopFx: true}; + // maximum custom styling + el.update('

          '); + tipTitle = el.child('h3'); + tipTitle.enableDisplayMode("block"); + tipBody = el.child('div.x-tip-bd'); + tipBodyText = el.child('div.x-tip-bd-inner'); + bdLeft = el.child('div.x-tip-bd-left'); + bdRight = el.child('div.x-tip-bd-right'); + close = el.child('div.x-tip-close'); + close.enableDisplayMode("block"); + close.on("click", hide); + d = Ext.get(document); + d.on("mousedown", onDown); + d.on("mouseup", onUp); + d.on("mouseover", onOver); + d.on("mouseout", onOut); + d.on("mousemove", onMove); + esc = d.addKeyListener(27, hide); + esc.disable(); + if(Ext.dd.DD){ + dd = el.initDD("default", null, { + onDrag : function(){ + el.sync(); + } + }); + dd.setHandleElId(tipTitle.id); + dd.lock(); + } + inited = true; + } + this.enable(); + }, + + /** + * Configures a new quick tip instance and assigns it to a target element + * @param {Object} config The config object + */ + register : function(config){ + var cs = config instanceof Array ? config : arguments; + for(var i = 0, len = cs.length; i < len; i++) { + var c = cs[i]; + var target = c.target; + if(target){ + if(target instanceof Array){ + for(var j = 0, jlen = target.length; j < jlen; j++){ + tagEls[target[j]] = c; + } + }else{ + tagEls[typeof target == 'string' ? target : Ext.id(target.id)] = c; + } + } + } + }, + + /** + * Removes this quick tip from its element and destroys it + */ + unregister : function(el){ + delete tagEls[Ext.id(el)]; + }, + + /** + * Enable this quick tip + */ + enable : function(){ + if(inited){ + locks.pop(); + if(locks.length < 1){ + disabled = false; + } + } + }, + + /** + * Disable this quick tip + */ + disable : function(){ + disabled = true; + clearTimeout(showProc); + clearTimeout(hideProc); + clearTimeout(dismissProc); + if(ce){ + hide(true); + } + locks.push(1); + }, + + /** + * Returns true if the quick tip is enabled, else false + */ + isEnabled : function(){ + return !disabled; + }, + + // private + tagConfig : { + namespace : "ext", + attribute : "qtip", + width : "width", + target : "target", + title : "qtitle", + hide : "hide", + cls : "qclass" + } + }; +}(); + +// backwards compat +Ext.QuickTips.tips = Ext.QuickTips.register; \ 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..5ccf2e8da --- /dev/null +++ b/www/extras/yui-ext/source/widgets/Resizable.js @@ -0,0 +1,9 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** * @class Ext.Resizable * @extends 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 to the id of the element), or set wrap:true in your config and * the element will be wrapped for you automatically.

          *

          Here is the list of valid resize handles:

          *
          Value   Description
          ------  -------------------
           'n'     north
           's'     south
           'e'     east
           'w'     west
           'nw'    northwest
           'sw'    southwest
           'se'    southeast
           'ne'    northeast
           'all'   all
          
          *

          Here's an example showing the creation of a typical Resizable:

          *
          
          var resizer = new Ext.Resizable("element-id", {
              handles: 'all',
              minWidth: 200,
              minHeight: 100,
              maxWidth: 500,
              maxHeight: 400,
              pinned: true
          });
          resizer.on("resize", myHandler);
          
          *

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

          * @cfg {Boolean/String/Element} resizeChild True to resize the first child, or id/element to resize (defaults to false) * @cfg {Array/String} adjustments String "auto" or an array [width, height] with values to be added to the * resize operation's new size (defaults to [0, 0]) * @cfg {Number} minWidth The minimum width for the element (defaults to 5) * @cfg {Number} minHeight The minimum height for the element (defaults to 5) * @cfg {Number} maxWidth The maximum width for the element (defaults to 10000) * @cfg {Number} maxHeight The maximum height for the element (defaults to 10000) * @cfg {Boolean} enabled False to disable resizing (defaults to true) * @cfg {Boolean} wrap True to wrap an element with a div if needed (required for textareas and images, defaults to false) * @cfg {Number} width The width of the element in pixels (defaults to null) * @cfg {Number} height The height of the element in pixels (defaults to null) * @cfg {Boolean} animate True to animate the resize (not compatible with dynamic sizing, defaults to false) * @cfg {Number} duration Animation duration if animate = true (defaults to .35) * @cfg {Boolean} dynamic True to resize the element while dragging instead of using a proxy (defaults to false) * @cfg {Boolean/String} handles String consisting of the resize handles to display (defaults to false) * @cfg {Boolean} multiDirectional Deprecated. The old style of adding multi-direction resize handles, deprecated * in favor of the handles config option (defaults to false) * @cfg {Boolean} disableTrackOver True to disable mouse tracking. This is only applied at config time. (defaults to false) * @cfg {String} easing Animation easing if animate = true (defaults to 'easingOutStrong') * @cfg {Number} widthIncrement The increment to snap the width resize in pixels (dynamic must be true, defaults to 0) * @cfg {Number} heightIncrement The increment to snap the height resize in pixels (dynamic must be true, defaults to 0) * @cfg {Boolean} pinned True to ensure that the resize handles are always visible, false to display them only when the * user mouses over the resizable borders. This is only applied at config time. (defaults to false) * @cfg {Boolean} preserveRatio True to preserve the original ratio between height and width during resize (defaults to false) * @cfg {Boolean} transparent True for transparent handles. This is only applied at config time. (defaults to false) * @cfg {Number} minX The minimum allowed page X for the element (only used for west resizing, defaults to 0) * @cfg {Number} minY The minimum allowed page Y for the element (only used for north resizing, defaults to 0) * @cfg {Boolean} draggable Convenience to initialize drag drop (defaults to false) * @constructor * Create a new resizable component * @param {String/HTMLElement/Ext.Element} el The id or element to resize * @param {Object} config configuration options */ Ext.Resizable = function(el, config){ this.el = Ext.get(el); if(config && config.wrap){ config.resizeChild = this.el; this.el = this.el.wrap(typeof config.wrap == "object" ? config.wrap : {cls:"xresizable-wrap"}); 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: "x-resizable-proxy", id: this.el.id + "-rzproxy"}); this.proxy.unselectable(); this.proxy.enableDisplayMode('block'); Ext.apply(this, config); if(this.pinned){ this.disableTrackOver = true; this.el.addClass("x-resizable-pinned"); } // if the element isn't positioned, make it relative var position = this.el.getStyle("position"); if(position != "absolute" && position != "fixed"){ 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 = 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 Ext.Resizable.Handle(this, pos, this.disableTrackOver, this.transparent); } } // legacy this.corner = this.southeast; if(this.handles.indexOf("n") != -1 || this.handles.indexOf("w") != -1){ this.updateBox = true; } this.activeHandle = null; if(this.resizeChild){ if(typeof this.resizeChild == "boolean"){ this.resizeChild = Ext.get(this.el.dom.firstChild, true); }else{ this.resizeChild = Ext.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.position("relative"); 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.addEvents({ /** * @event beforeresize * Fired before resize is allowed. Set enabled to false to cancel resize. * @param {Ext.Resizable} this * @param {Ext.EventObject} e The mousedown event */ "beforeresize" : true, /** * @event resize * Fired after a resize. * @param {Ext.Resizable} this * @param {Number} width The new width * @param {Number} height The new height * @param {Ext.EventObject} e The mouseup event */ "resize" : true }); if(this.width !== null && this.height !== null){ this.resizeTo(this.width, this.height); }else{ this.updateChildSize(); } if(Ext.isIE){ this.el.dom.style.zoom = 1; } Ext.Resizable.superclass.constructor.call(this); }; Ext.extend(Ext.Resizable, Ext.util.Observable, { 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 : 'easeOutStrong', widthIncrement : 0, heightIncrement : 0, pinned : false, width : null, height : null, preserveRatio : false, transparent: false, minX: 0, minY: 0, draggable: false, /** * 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); }, // private startSizing : function(e, handle){ this.fireEvent("beforeresize", this, e); if(this.enabled){ // 2nd enabled check in case disabled before beforeresize handler if(!this.overlay){ this.overlay = this.el.createProxy({tag: "div", cls: "x-resizable-overlay", html: " "}); this.overlay.unselectable(); this.overlay.enableDisplayMode("block"); this.overlay.on("mousemove", this.onMouseMove, this); this.overlay.on("mouseup", this.onMouseUp, this); } this.overlay.setStyle("cursor", handle.el.getStyle("cursor")); 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.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); this.overlay.show(); this.proxy.setStyle('visibility', 'hidden'); // workaround display none this.proxy.show(); this.proxy.setBox(this.startBox); if(!this.dynamic){ this.proxy.setStyle('visibility', 'visible'); } } }, // private onMouseDown : function(handle, e){ if(this.enabled){ e.stopEvent(); this.activeHandle = handle; this.startSizing(e, handle); } }, // private onMouseUp : function(e){ var size = this.resizeElement(); this.resizing = false; this.handleOut(); this.overlay.hide(); this.fireEvent("resize", this, size.width, size.height, e); }, // private 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(Ext.isIE){ setTimeout(function(){ if(el.dom.offsetWidth){ var b = el.getSize(true); child.setSize(b.width+adj[0], b.height+adj[1]); } }, 10); } } }, // private 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); }, // private resizeElement : function(){ var box = this.proxy.getBox(); if(this.updateBox){ 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; }, // private constrain : function(v, diff, m, mx){ if(v - diff < m){ diff = v - m; }else if(v - diff > mx){ diff = mx - v; } return diff; }, // private 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){} } }, // private handleOver : function(){ if(this.enabled){ this.el.addClass("x-resizable-over"); } }, // private handleOut : function(){ if(!this.resizing){ this.el.removeClass("x-resizable-over"); } }, /** * Returns the element this component is bound to. * @return {Ext.Element} */ getEl : function(){ return this.el; }, /** * Returns the resizeChild element (or null). * @return {Ext.Element} */ getResizeChild : function(){ return this.resizeChild; }, /** * Destroys this resizable. If the element was wrapped and * removeEl is not true then the element remains. * @param {Boolean} removeEl (optional) true to remove the element from the DOM */ destroy : function(removeEl){ this.proxy.remove(); this.overlay.removeAllListeners(); this.overlay.remove(); var ps = Ext.Resizable.positions; for(var k in ps){ if(typeof ps[k] != "function" && this[ps[k]]){ var h = this[ps[k]]; h.el.removeAllListeners(); h.el.remove(); } } if(removeEl){ this.el.update(""); this.el.remove(); } } }); // private // hash to map config positions to true positions Ext.Resizable.positions = { n: "north", s: "south", e: "east", w: "west", se: "southeast", sw: "southwest", nw: "northwest", ne: "northeast" }; // private Ext.Resizable.Handle = function(rz, pos, disableTrackOver, transparent){ if(!this.tpl){ // only initialize the template if resizable is used var tpl = Ext.DomHelper.createTemplate( {tag: "div", cls: "x-resizable-handle x-resizable-handle-{0}"} ); tpl.compile(); 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.on("mousedown", this.onMouseDown, this); if(!disableTrackOver){ this.el.on("mouseover", this.onMouseOver, this); this.el.on("mouseout", this.onMouseOut, this); } }; // private Ext.Resizable.Handle.prototype = { afterResize : function(rz){ // do nothing }, // private onMouseDown : function(e){ this.rz.onMouseDown(this, e); }, // private onMouseOver : function(e){ this.rz.handleOver(this, e); }, // private onMouseOut : function(e){ this.rz.handleOut(this, e); } }; \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/Shadow.js b/www/extras/yui-ext/source/widgets/Shadow.js new file mode 100644 index 000000000..601008149 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/Shadow.js @@ -0,0 +1,172 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.Shadow + * Simple class that can provide a shadow effect for any element. Note that the element MUST be absolutely positioned, + * and the shadow does not provide any shimming. This should be used only in simple cases -- for more advanced + * functionality that can also provide the same shadow effect, see the {@link Ext.Layer} class. + * @constructor + * Create a new Shadow + * @param {Object} config The config object + */ +Ext.Shadow = function(config){ + Ext.apply(this, config); + if(typeof this.mode != "string"){ + this.mode = this.defaultMode; + } + var o = this.offset, a = {h: 0}; + switch(this.mode.toLowerCase()){ + case "drop": + a.w = 0; + a.l = a.t = o; + break; + case "sides": + a.w = (o*2); + a.l = -o; + a.t = o; + break; + case "frame": + a.w = a.h = (o*2); + a.l = a.t = -o; + break; + }; + this.adjusts = a; +}; + +Ext.Shadow.prototype = { + /** + * @cfg {String} mode + * The shadow display mode. Supports the following options: + *
          +Option   Description
          +-------  ----------------------------------------------
          +sides    Shadow displays on both sides and bottom only
          +frame    Shadow displays equally on all four sides
          +drop     Traditional bottom-right drop shadow
          +
          + */ + /** + * @cfg {String} offset + * The number of pixels to offset the shadow from the element (defaults to 4) + */ + offset: 4, + + // private + defaultMode: "drop", + + /** + * Displays the shadow under the target element + * @param {String/HTMLElement/Element} targetEl The id or element under which the shadow should display + */ + show : function(target){ + target = Ext.get(target); + if(!this.el){ + this.el = Ext.Shadow.Pool.pull(); + if(this.el.dom.nextSibling != target.dom){ + this.el.insertBefore(target); + } + } + this.el.setStyle("z-index", this.zIndex || parseInt(target.getStyle("z-index"), 10)-1); + if(Ext.isIE){ + this.el.dom.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius="+this.offset+")"; + } + this.realign( + target.getLeft(true), + target.getTop(true), + target.getWidth(), + target.getHeight() + ); + this.el.dom.style.display = "block"; + }, + + /** + * Returns true if the shadow is visible, else false + */ + isVisible : function(){ + return this.el ? true : false; + }, + + /** + * Direct alignment when values are already available. Show must be called at least once before + * calling this method to ensure it is initialized. + * @param {Number} left The target element left position + * @param {Number} top The target element top position + * @param {Number} width The target element width + * @param {Number} height The target element height + */ + realign : function(l, t, w, h){ + if(!this.el){ + return; + } + var a = this.adjusts, d = this.el.dom, s = d.style; + var iea = 0; + if(Ext.isIE){ + iea = -(this.offset); + } + s.left = (l+a.l+iea)+"px"; + s.top = (t+a.t+iea)+"px"; + var sw = (w+a.w), sh = (h+a.h), sws = sw +"px", shs = sh + "px"; + if(s.width != sws || s.height != shs){ + s.width = sws; + s.height = shs; + if(!Ext.isIE){ + var cn = d.childNodes; + var sww = Math.max(0, (sw-12))+"px"; + cn[0].childNodes[1].style.width = sww; + cn[1].childNodes[1].style.width = sww; + cn[2].childNodes[1].style.width = sww; + cn[1].style.height = Math.max(0, (sh-12))+"px"; + } + } + }, + + /** + * Hides this shadow + */ + hide : function(){ + if(this.el){ + this.el.dom.style.display = "none"; + Ext.Shadow.Pool.push(this.el); + delete this.el; + } + }, + + /** + * Adjust the z-index of this shadow + * @param {Number} zindex The new z-index + */ + setZIndex : function(z){ + this.zIndex = z; + if(this.el){ + this.el.setStyle("z-index", z); + } + } +}; + +// Private utility class that manages the internal Shadow cache +Ext.Shadow.Pool = function(){ + var p = []; + var markup = Ext.isIE ? + '
          ' : + '
          '; + return { + pull : function(){ + var sh = p.shift(); + if(!sh){ + sh = Ext.get(Ext.DomHelper.insertHtml("beforeBegin", document.body.firstChild, markup)); + sh.autoBoxAdjust = false; + } + return sh; + }, + + push : function(sh){ + p.push(sh); + } + }; +}(); \ 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..5a9477453 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/SplitBar.js @@ -0,0 +1,437 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.SplitBar + * @extends Ext.util.Observable + * Creates draggable splitter bar functionality from two elements. + *

          + * Usage: + *
          
          +var split = new Ext.SplitBar("elementToDrag", "elementToSize",
          +                   Ext.SplitBar.HORIZONTAL, Ext.SplitBar.LEFT);
          +split.setAdapter(new Ext.SplitBar.AbsoluteLayoutAdapter("container"));
          +split.minSize = 100;
          +split.maxSize = 600;
          +split.animate = true;
          +split.on('moved', splitterMoved);
          +
          + * @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 Ext.SplitBar.HORIZONTAL or Ext.SplitBar.VERTICAL. (Defaults to HORIZONTAL) + * @param {Number} placement (optional) Either Ext.SplitBar.LEFT or Ext.SplitBar.RIGHT for horizontal or + Ext.SplitBar.TOP or Ext.SplitBar.BOTTOM for vertical. (By default, this is determined automatically by the intial position + position of the SplitBar). + */ +Ext.SplitBar = function(dragElement, resizingElement, orientation, placement, existingProxy){ + + /** @private */ + this.el = Ext.get(dragElement, true); + this.el.dom.unselectable = "on"; + /** @private */ + this.resizingEl = Ext.get(resizingElement, true); + + /** + * @private + * The orientation of the split. Either Ext.SplitBar.HORIZONTAL or 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 || 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; + + /** + * 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; + + if(!existingProxy){ + /** @private */ + this.proxy = Ext.SplitBar.createProxy(this.orientation); + }else{ + this.proxy = Ext.get(existingProxy).dom; + } + /** @private */ + this.dd = new Ext.dd.DDProxy(this.el.dom.id, "XSplitBars", {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 Ext.SplitBar.BasicLayoutAdapter(); + this.adapter.init(this); + + if(this.orientation == Ext.SplitBar.HORIZONTAL){ + /** @private */ + this.placement = placement || (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT : Ext.SplitBar.RIGHT); + this.el.addClass("x-splitbar-h"); + }else{ + /** @private */ + this.placement = placement || (this.el.getY() > this.resizingEl.getY() ? Ext.SplitBar.TOP : Ext.SplitBar.BOTTOM); + this.el.addClass("x-splitbar-v"); + } + + this.addEvents({ + /** + * @event resize + * Fires when the splitter is moved (alias for moved) + * @param {Ext.SplitBar} this + * @param {Number} newSize the new width or height + */ + "resize" : true, + /** + * @event moved + * Fires when the splitter is moved + * @param {Ext.SplitBar} this + * @param {Number} newSize the new width or height + */ + "moved" : true, + /** + * @event beforeresize + * Fires before the splitter is dragged + * @param {Ext.SplitBar} this + */ + "beforeresize" : true, + + "beforeapply" : true + }); + + Ext.SplitBar.superclass.constructor.call(this); +}; + +Ext.extend(Ext.SplitBar, Ext.util.Observable, { + onStartProxyDrag : function(x, y){ + this.fireEvent("beforeresize", this); + if(!this.overlay){ + var o = Ext.DomHelper.insertFirst(document.body, {cls: "x-drag-overlay", html: " "}, true); + o.unselectable(); + o.enableDisplayMode("block"); + // all splitbars share the same overlay + Ext.SplitBar.prototype.overlay = o; + } + this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); + this.overlay.show(); + Ext.get(this.proxy).setDisplayed("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 == Ext.SplitBar.HORIZONTAL){ + this.dd.resetConstraints(); + this.dd.setXConstraint( + this.placement == Ext.SplitBar.LEFT ? c1 : c2, + this.placement == Ext.SplitBar.LEFT ? c2 : c1 + ); + this.dd.setYConstraint(0, 0); + }else{ + this.dd.resetConstraints(); + this.dd.setXConstraint(0, 0); + this.dd.setYConstraint( + this.placement == Ext.SplitBar.TOP ? c1 : c2, + this.placement == Ext.SplitBar.TOP ? c2 : c1 + ); + } + this.dragSpecs.startSize = size; + this.dragSpecs.startPoint = [x, y]; + Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd, x, y); + }, + + /** + * @private Called after the drag operation by the DDProxy + */ + onEndProxyDrag : function(e){ + Ext.get(this.proxy).setDisplayed(false); + var endPoint = Ext.lib.Event.getXY(e); + if(this.overlay){ + this.overlay.hide(); + } + var newSize; + if(this.orientation == Ext.SplitBar.HORIZONTAL){ + newSize = this.dragSpecs.startSize + + (this.placement == Ext.SplitBar.LEFT ? + endPoint[0] - this.dragSpecs.startPoint[0] : + this.dragSpecs.startPoint[0] - endPoint[0] + ); + }else{ + newSize = this.dragSpecs.startSize + + (this.placement == 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){ + if(this.fireEvent('beforeapply', this, newSize) !== false){ + this.adapter.setElementSize(this, newSize); + this.fireEvent("moved", this, newSize); + this.fireEvent("resize", 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; + }, + + /** + * Destroy this splitbar. + * @param {Boolean} removeEl True to remove the element + */ + destroy : function(removeEl){ + if(this.shim){ + this.shim.remove(); + } + this.dd.unreg(); + this.proxy.parentNode.removeChild(this.proxy); + if(removeEl){ + this.el.remove(); + } + } +}); + +/** + * @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. + */ +Ext.SplitBar.createProxy = function(dir){ + var proxy = new Ext.Element(document.createElement("div")); + proxy.unselectable(); + var cls = 'x-splitbar-proxy'; + proxy.addClass(cls + ' ' + (dir == Ext.SplitBar.HORIZONTAL ? cls +'-h' : cls + '-v')); + document.body.appendChild(proxy.dom); + return proxy.dom; +}; + +/** + * @class 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. + */ +Ext.SplitBar.BasicLayoutAdapter = function(){ +}; + +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 {Ext.SplitBar} s The SplitBar using this adapter + */ + getElementSize : function(s){ + if(s.orientation == 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 {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 == Ext.SplitBar.HORIZONTAL){ + if(!s.animate){ + s.resizingEl.setWidth(newSize); + if(onComplete){ + onComplete(s, newSize); + } + }else{ + s.resizingEl.setWidth(newSize, true, .1, onComplete, 'easeOut'); + } + }else{ + + if(!s.animate){ + s.resizingEl.setHeight(newSize); + if(onComplete){ + onComplete(s, newSize); + } + }else{ + s.resizingEl.setHeight(newSize, true, .1, onComplete, 'easeOut'); + } + } + } +}; + +/** + *@class Ext.SplitBar.AbsoluteLayoutAdapter + * @extends 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. + */ +Ext.SplitBar.AbsoluteLayoutAdapter = function(container){ + this.basic = new Ext.SplitBar.BasicLayoutAdapter(); + this.container = Ext.get(container); +}; + +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 = 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 + */ +Ext.SplitBar.VERTICAL = 1; + +/** + * Orientation constant - Create a horizontal SplitBar + * @static + * @type Number + */ +Ext.SplitBar.HORIZONTAL = 2; + +/** + * Placement constant - The resizing element is to the left of the splitter element + * @static + * @type Number + */ +Ext.SplitBar.LEFT = 1; + +/** + * Placement constant - The resizing element is to the right of the splitter element + * @static + * @type Number + */ +Ext.SplitBar.RIGHT = 2; + +/** + * Placement constant - The resizing element is positioned above the splitter element + * @static + * @type Number + */ +Ext.SplitBar.TOP = 3; + +/** + * Placement constant - The resizing element is positioned under splitter element + * @static + * @type Number + */ +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..8110195b9 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/TabPanel.js @@ -0,0 +1,751 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.TabPanel + * @extends Ext.util.Observable + * Creates a lightweight TabPanel component using Yahoo! UI. + *

          + * Usage: + *
          
          +    // basic tabs 1, built from existing content
          +    var tabs = new 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 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.on('activate', 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");
          +}
          + * 
          + * @constructor + * Create new TabPanel. + * @param {String/HTMLElement/Element} container The id, DOM element or 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. + */ +Ext.TabPanel = function(container, config){ + /** + * The container element for this TabPanel. + * @type Ext.Element + */ + this.el = Ext.get(container, true); + if(config){ + if(typeof config == "boolean"){ + this.tabPosition = config ? "bottom" : "top"; + }else{ + Ext.apply(this, config); + } + } + if(this.tabPosition == "bottom"){ + this.bodyEl = Ext.get(this.createBody(this.el.dom)); + this.el.addClass("x-tabs-bottom"); + } + this.stripWrap = Ext.get(this.createStrip(this.el.dom), true); + this.stripEl = Ext.get(this.createStripList(this.stripWrap.dom), true); + this.stripBody = Ext.get(this.stripWrap.dom.firstChild.firstChild, true); + if(Ext.isIE){ + Ext.fly(this.stripWrap.dom.firstChild).setStyle("overflow-x", "hidden"); + } + if(this.tabPosition != "bottom"){ + /** The body element that contains TabPaneItem bodies. + * @type Ext.Element + */ + this.bodyEl = Ext.get(this.createBody(this.el.dom)); + this.el.addClass("x-tabs-top"); + } + this.items = []; + + this.bodyEl.setStyle("position", "relative"); + + this.active = null; + this.activateDelegate = this.activate.createDelegate(this); + + this.addEvents({ + /** + * @event tabchange + * Fires when the active tab changes + * @param {Ext.TabPanel} this + * @param {Ext.TabPanelItem} activePanel The new active tab + */ + "tabchange": true, + /** + * @event beforetabchange + * Fires before the active tab changes, set cancel to true on the "e" parameter to cancel the change + * @param {Ext.TabPanel} this + * @param {Object} e Set cancel to true on this object to cancel the tab change + * @param {Ext.TabPanelItem} tab The tab being changed to + */ + "beforetabchange" : true + }); + + Ext.EventManager.onWindowResize(this.onResize, this); + this.cpad = this.el.getPadding("lr"); + this.hiddenCount = 0; + + Ext.TabPanel.superclass.constructor.call(this); +}; + +Ext.extend(Ext.TabPanel, Ext.util.Observable, { + /** The position of the tabs. Can be "top" or "bottom" @type String */ + tabPosition : "top", + currentTabWidth : 0, + /** The minimum width of a tab (ignored if resizeTabs is not true). @type Number */ + minTabWidth : 40, + /** The maximum width of a tab (ignored if resizeTabs is not true). @type Number */ + maxTabWidth : 250, + /** The preferred (default) width of a tab (ignored if resizeTabs is not true). @type Number */ + preferredTabWidth : 175, + /** Set this to true to enable dynamic tab resizing. @type Boolean */ + resizeTabs : false, + /** Set this to true to turn on window resizing monitoring (ignored if resizeTabs is not true). @type Boolean */ + monitorResize : true, + + /** + * 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 {Ext.TabPanelItem} The created TabPanelItem + */ + addTab : function(id, text, content, closable){ + var item = new 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 {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 {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(); + } + 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]; + tab.fireEvent("close", tab); + tab.purgeListeners(); + 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) + 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){ + return null; + } + 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.fireEvent("tabchange", this, this.active); + } + return tab; + }, + + /** + * Get the active TabPanelItem + * @return {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()||0)-(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)-2); + 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)-2); + } + } + }, + + /** + * Returns the number of tabs + * @return {Number} + */ + getCount : function(){ + return this.items.length; + }, + + /** + * 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){ + 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 Ext.TabPanelItem +* @extends Ext.util.Observable +*/ +Ext.TabPanelItem = function(tabPanel, id, text, closable){ + /** + * The TabPanel this TabPanelItem belongs to + * @type 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 Ext.Element + */ + this.bodyEl = Ext.get(tabPanel.createItemBody(tabPanel.bodyEl.dom, id)); + this.bodyEl.setVisibilityMode(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 = Ext.get(els.el, true); + this.inner = Ext.get(els.inner, true); + this.textEl = Ext.get(this.el.dom.firstChild.firstChild.firstChild, true); + this.pnode = Ext.get(els.el.parentNode, true); + this.el.on("mousedown", this.onTabMouseDown, this); + this.el.on("click", this.onTabClick, this); + /** @private */ + if(closable){ + var c = Ext.get(els.close, true); + c.dom.title = this.closeText; + c.addClassOnOver("close-over"); + c.on("click", this.closeClick, this); + } + + this.addEvents({ + /** + * @event activate + * Fires when this tab becomes the active tab + * @param {Ext.TabPanel} tabPanel + * @param {Ext.TabPanelItem} this + */ + "activate": true, + /** + * @event beforeclose + * Fires before this tab is closed. To cancal the close, set cancel to true on e. (e.cancel = true) + * @param {Ext.TabPanelItem} this + * @param {Object} e Set cancel to true on this object to cancel the close. + */ + "beforeclose": true, + /** + * @event close + * Fires when this tab is closed + * @param {Ext.TabPanelItem} this + */ + "close": true, + /** + * @event deactivate + * Fires when this tab is no longer the active tab + * @param {Ext.TabPanel} tabPanel + * @param {Ext.TabPanelItem} this + */ + "deactivate" : true + }); + this.hidden = false; + + Ext.TabPanelItem.superclass.constructor.call(this); +}; + +Ext.extend(Ext.TabPanelItem, Ext.util.Observable, { + purgeListeners : function(){ + 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(Ext.isOpera){ + this.tabPanel.stripWrap.repaint(); + } + this.fireEvent("activate", this.tabPanel, this); + }, + + /** + * Returns true if this tab is the active tab + * @return {Boolean} + */ + isActive : function(){ + return this.tabPanel.getActiveTab() == this; + }, + + /** + * Hide this TabPanelItem - if you don't activate another TabPanelItem this could look odd. + */ + hide : function(){ + this.pnode.removeClass("on"); + this.hideAction(); + this.fireEvent("deactivate", this.tabPanel, this); + }, + + hideAction : function(){ + this.bodyEl.hide(); + this.bodyEl.setStyle("position", "absolute"); + this.bodyEl.setLeft("-20000px"); + this.bodyEl.setTop("-20000px"); + }, + + showAction : function(){ + this.bodyEl.setStyle("position", "relative"); + this.bodyEl.setTop(""); + this.bodyEl.setLeft(""); + this.bodyEl.show(); + }, + + /** + * Set the tooltip for the tab + * @param {String} tooltip + */ + setTooltip : function(text){ + if(Ext.QuickTips && Ext.QuickTips.isEnabled()){ + this.textEl.dom.qtip = text; + this.textEl.dom.removeAttribute('title'); + }else{ + this.textEl.dom.title = text; + } + }, + + onTabClick : function(e){ + e.preventDefault(); + this.tabPanel.activate(this.id); + }, + + onTabMouseDown : 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" : ""); + }, + + /** + * Returns true if this tab is "hidden" + * @return {Boolean} + */ + isHidden : function(){ + return this.hidden; + }, + + /** + * Returns the text for this tab + * @return {String} + */ + 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(); + }, + + /** + * Sets the text for the tab (Note: this also sets the tooltip) + * @param {String} text + */ + setText : function(text){ + this.text = text; + this.textEl.update(text); + this.setTooltip(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 Ext.UpdateManager} for the body of this TabPanelItem. Enables you to perform Ajax updates. + * @return {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 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 {Ext.UpdateManager} The UpdateManager + */ + setUrl : function(url, params, loadOnce){ + if(this.refreshDelegate){ + this.un('activate', this.refreshDelegate); + } + this.refreshDelegate = this._handleRefresh.createDelegate(this, [url, params, loadOnce]); + this.on("activate", 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)); + } + }, + + /** + * Force a content refresh from the URL specified in the setUrl() method. + * Will fail silently if the setUrl method has not been called. + * This does not activate the panel, just updates its content. + */ + refresh : function(){ + if(this.refreshDelegate){ + this.loaded = false; + this.refreshDelegate(); + } + }, + + /** @private */ + _setLoaded : function(){ + this.loaded = true; + }, + + /** @private */ + closeClick : function(e){ + var o = {}; + e.stopEvent(); + this.fireEvent("beforeclose", this, o); + if(o.cancel !== true){ + this.tabPanel.removeTab(this.id); + } + }, + /** + * The text displayed in the tooltip for the close icon. + * @type String + */ + closeText : "Close this tab" +}); + +/** @private */ +Ext.TabPanel.prototype.createStrip = function(container){ + var strip = document.createElement("div"); + strip.className = "x-tabs-wrap"; + container.appendChild(strip); + return strip; +}; +/** @private */ +Ext.TabPanel.prototype.createStripList = function(strip){ + // div wrapper for retard IE + strip.innerHTML = '
          '; + return strip.firstChild.firstChild.firstChild.firstChild; +}; +/** @private */ +Ext.TabPanel.prototype.createBody = function(container){ + var body = document.createElement("div"); + Ext.id(body, "tab-body"); + Ext.fly(body).addClass("x-tabs-body"); + container.appendChild(body); + return body; +}; +/** @private */ +Ext.TabPanel.prototype.createItemBody = function(bodyEl, id){ + var body = Ext.getDom(id); + if(!body){ + body = document.createElement("div"); + body.id = id; + } + Ext.fly(body).addClass("x-tabs-item-body"); + bodyEl.insertBefore(body, bodyEl.firstChild); + return body; +}; +/** @private */ +Ext.TabPanel.prototype.createStripElements = function(stripEl, text, closable){ + var td = document.createElement("td"); + stripEl.appendChild(td); + if(closable){ + td.className = "x-tabs-closable"; + if(!this.closeTpl){ + this.closeTpl = new 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 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/Toolbar.js b/www/extras/yui-ext/source/widgets/Toolbar.js new file mode 100644 index 000000000..cd3909897 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/Toolbar.js @@ -0,0 +1,458 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.Toolbar + * Basic Toolbar class. + * @constructor + * Creates a new Toolbar + * @param {String/HTMLElement/Element} container The id or element that will contain the toolbar + * @param {Array} buttons (optional) array of button configs or elements to add + * @param {Object} config The config object + */ + Ext.Toolbar = function(container, buttons, config){ + if(container instanceof Array){ // omit the container for later rendering + buttons = container; + config = buttons; + container = null; + } + Ext.apply(this, config); + this.buttons = buttons; + if(container){ + this.render(container); + } +}; + +Ext.Toolbar.prototype = { + + render : function(ct){ + this.el = Ext.get(ct); + if(this.cls){ + this.el.addClass(this.cls); + } + // using a table allows for vertical alignment + this.el.update('
          '); + this.tr = this.el.child("tr", true); + var autoId = 0; + this.items = new Ext.util.MixedCollection(false, function(o){ + return o.id || ("item" + (++autoId)); + }); + if(this.buttons){ + this.add.apply(this, this.buttons); + delete this.buttons; + } + }, + + /** + * 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} arg1 If arg is a Toolbar.Button, 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. + * @param {Mixed} arg2 + * @param {Mixed} etc + */ + add : function(){ + var a = arguments, l = a.length; + for(var i = 0; i < l; i++){ + var el = a[i]; + if(el.applyTo){ // some kind of form field + this.addField(el); + }else if(el.render){ // some kind of Toolbar.Item + this.addItem(el); + }else if(typeof el == "string"){ // string + if(el == "separator" || el == "-"){ + this.addSeparator(); + }else if(el == " "){ + this.addSpacer(); + }else{ + this.addText(el); + } + }else if(el.tagName){ // element + this.addElement(el); + }else if(typeof el == "object"){ // must be button config? + this.addButton(el); + } + } + }, + + /** + * Returns the element for this toolbar + * @return {Ext.Element} + */ + getEl : function(){ + return this.el; + }, + + /** + * Adds a separator + * @return {Ext.Toolbar.Item} The separator item + */ + addSeparator : function(){ + return this.addItem(new Ext.Toolbar.Separator()); + }, + + /** + * Adds a spacer element + * @return {Ext.Toolbar.Item} The spacer item + */ + addSpacer : function(){ + return this.addItem(new Ext.Toolbar.Spacer()); + }, + + /** + * Adds any standard HTML element to the toolbar + * @param {String/HTMLElement/Element} el The element or id of the element to add + * @return {Ext.Toolbar.Item} The element's item + */ + addElement : function(el){ + return this.addItem(new Ext.Toolbar.Item(el)); + }, + + /** + * Adds any Toolbar.Item or subclass + * @param {Toolbar.Item} item + * @return {Ext.Toolbar.Item} The item + */ + addItem : function(item){ + var td = this.nextBlock(); + item.render(td); + this.items.add(item); + return item; + }, + + /** + * Add a button (or buttons), see {@link Ext.Toolbar.Button} for more info on the config + * @param {Object/Array} config A button config or array of configs + * @return {Ext.Toolbar.Button/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 Ext.Toolbar.Button)){ + b = new Ext.Toolbar.Button(config); + } + var td = this.nextBlock(); + b.render(td); + this.items.add(b); + return b; + }, + + /** + * Adds text to the toolbar + * @param {String} text The text to add + * @return {Ext.Toolbar.Item} The element's item + */ + addText : function(text){ + return this.addItem(new Ext.Toolbar.TextItem(text)); + }, + + /** + * Inserts any Toolbar.Item/Toolbar.Button at the specified index + * @param {Number} index The index where the item is to be inserted + * @param {Object/Toolbar.Item/Toolbar.Button (may be Array)} item The button, or button config object to be inserted. + * @return {Ext.Toolbar.Button/Item} + */ + insertButton : function(index, item){ + if(item instanceof Array){ + var buttons = []; + for(var i = 0, len = item.length; i < len; i++) { + buttons.push(this.insertButton(index + i, item[i])); + } + return buttons; + } + if (!(item instanceof Ext.Toolbar.Button)){ + item = new Ext.Toolbar.Button(item); + } + var td = document.createElement("td"); + this.tr.insertBefore(td, this.tr.childNodes[index]); + item.render(td); + this.items.insert(index, item); + return item; + }, + + /** + * Adds a new element to the toolbar from the passed DomHelper config + * @param {Object} config + * @return {Ext.Toolbar.Item} The element's item + */ + addDom : function(config, returnEl){ + var td = this.nextBlock(); + Ext.DomHelper.overwrite(td, config); + var ti = new Ext.Toolbar.Item(td.firstChild); + ti.render(td); + this.items.add(ti); + return ti; + }, + + /** + * Add a dynamically rendered Ext.form field (TextField, ComboBox, etc). Note: the field should not have + * been rendered yet. For a field that has already been rendered, use addElement. + * @param {Field} field + * @return {ToolbarItem} + */ + addField : function(field){ + var td = this.nextBlock(); + field.render(td); + var ti = new Ext.Toolbar.Item(td.firstChild); + ti.render(td); + this.items.add(ti); + return ti; + }, + + // private + nextBlock : function(){ + var td = document.createElement("td"); + this.tr.appendChild(td); + return td; + } +}; + +/** + * @class Ext.Toolbar.Item + * The base class that other classes should extend in order to get some basic common toolbar item functionality. + * @constructor + * Creates a new Item + * @param {HTMLElement} el + */ +Ext.Toolbar.Item = function(el){ + this.el = Ext.getDom(el); + this.id = Ext.id(this.el); + this.hidden = false; +}; + +Ext.Toolbar.Item.prototype = { + + /** + * Get this item's HTML Element + * @return {HTMLElement} + */ + getEl : function(){ + return this.el; + }, + + // private + render : function(td){ + this.td = td; + td.appendChild(this.el); + }, + + /** + * Remove and destroy this button + */ + destroy : function(){ + this.td.parentNode.removeChild(this.td); + }, + + /** + * Show this item + */ + show: function(){ + this.hidden = false; + this.td.style.display = ""; + }, + + /** + * Hide this item + */ + hide: function(){ + this.hidden = true; + this.td.style.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(); + } + }, + + /** + * Try to focus this item + */ + focus : function(){ + Ext.fly(this.el).focus(); + }, + + /** + * Disable this item + */ + disable : function(){ + Ext.fly(this.td).addClass("x-item-disabled"); + this.disabled = true; + this.el.disabled = true; + }, + + /** + * Enable this item + */ + enable : function(){ + Ext.fly(this.td).removeClass("x-item-disabled"); + this.disabled = false; + this.el.disabled = false; + } +}; + + +/** + * @class Ext.Toolbar.Separator + * @extends Ext.Toolbar.Item + * A simple toolbar separator class + * @constructor + * Creates a new Separator + */ +Ext.Toolbar.Separator = function(){ + var s = document.createElement("span"); + s.className = "ytb-sep"; + Ext.Toolbar.Separator.superclass.constructor.call(this, s); +}; +Ext.extend(Ext.Toolbar.Separator, Ext.Toolbar.Item); + +/** + * @class Ext.Toolbar.Spacer + * @extends Ext.Toolbar.Item + * A simple element that adds extra horizontal space to a toolbar. + * @constructor + * Creates a new Spacer + */ +Ext.Toolbar.Spacer = function(){ + var s = document.createElement("div"); + s.className = "ytb-spacer"; + Ext.Toolbar.Separator.superclass.constructor.call(this, s); +}; +Ext.extend(Ext.Toolbar.Spacer, Ext.Toolbar.Item); + +/** + * @class Ext.Toolbar.TextItem + * @extends Ext.Toolbar.Item + * A simple class that renders text directly into a toolbar. + * @constructor + * Creates a new TextItem + * @param {String} text + */ +Ext.Toolbar.TextItem = function(text){ + var s = document.createElement("span"); + s.className = "ytb-text"; + s.innerHTML = text; + Ext.Toolbar.TextItem.superclass.constructor.call(this, s); +}; +Ext.extend(Ext.Toolbar.TextItem, Ext.Toolbar.Item); + +/** + * @class Ext.Toolbar.Button + * @extends Ext.Button + * A button that renders into a toolbar. + * @constructor + * Creates a new Button + * @param {Object} config A standard {@link Ext.Button} config object + */ +Ext.Toolbar.Button = function(config){ + Ext.Toolbar.Button.superclass.constructor.call(this, null, config); +}; +Ext.extend(Ext.Toolbar.Button, Ext.Button, { + render : function(td){ + this.td = td; + Ext.Toolbar.Button.superclass.render.call(this, td); + }, + + /** + * Remove and destroy this button + */ + destroy : function(){ + Ext.Toolbar.Button.superclass.destroy.call(this); + this.td.parentNode.removeChild(this.td); + }, + + /** + * Show this button + */ + show: function(){ + this.hidden = false; + this.td.style.display = ""; + }, + + /** + * Hide this button + */ + hide: function(){ + this.hidden = true; + this.td.style.display = "none"; + }, + + /** + * Disable this item + */ + disable : function(){ + Ext.fly(this.td).addClass("x-item-disabled"); + this.disabled = true; + }, + + /** + * Enable this item + */ + enable : function(){ + Ext.fly(this.td).removeClass("x-item-disabled"); + this.disabled = false; + } +}); +// backwards compat +Ext.ToolbarButton = Ext.Toolbar.Button; + +/** + * @class Ext.Toolbar.MenuButton + * @extends Ext.MenuButton + * A menu button that renders into a toolbar. + * @constructor + * Creates a new MenuButton + * @param {Object} config A standard {@link Ext.MenuButton} config object + */ +Ext.Toolbar.MenuButton = function(config){ + Ext.Toolbar.MenuButton.superclass.constructor.call(this, null, config); +}; +Ext.extend(Ext.Toolbar.MenuButton, Ext.MenuButton, { + render : function(td){ + this.td = td; + Ext.Toolbar.MenuButton.superclass.render.call(this, td); + }, + + /** + * Remove and destroy this button + */ + destroy : function(){ + Ext.Toolbar.MenuButton.superclass.destroy.call(this); + this.td.parentNode.removeChild(this.td); + }, + + /** + * Show this button + */ + show: function(){ + this.hidden = false; + this.td.style.display = ""; + }, + + /** + * Hide this button + */ + hide: function(){ + this.hidden = true; + this.td.style.display = "none"; + } +}); + diff --git a/www/extras/yui-ext/source/widgets/View.js b/www/extras/yui-ext/source/widgets/View.js new file mode 100644 index 000000000..ff12156fa --- /dev/null +++ b/www/extras/yui-ext/source/widgets/View.js @@ -0,0 +1,459 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.View + * @extends 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 store = new Ext.data.Store(...);
          +
          + var view = new Ext.View("my-element",
          + '<div id="{0}">{2} - {1}</div>', // auto create template
          + {
          + singleSelect: true,
          + selectedClass: "ydataview-selected",
          + store: store
          + });
          +
          + // 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 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 {Object} config The config object + */ +Ext.View = function(container, tpl, config){ + this.el = Ext.get(container, true); + if(typeof tpl == "string"){ + tpl = new Ext.Template(tpl); + } + tpl.compile(); + /** + * The template used by this View + * @type {Ext.DomHelper.Template} + */ + this.tpl = tpl; + + Ext.apply(this, config); + + /** @private */ + this.addEvents({ + /** + * @event beforeclick + * Fires before a click is processed. Returns false to cancel the default action. + * @param {Ext.View} this + * @param {Number} index The index of the target node + * @param {HTMLElement} node The target node + * @param {Ext.EventObject} e The raw event object + */ + "beforeclick" : true, + /** + * @event click + * Fires when a template node is clicked. + * @param {Ext.View} this + * @param {Number} index The index of the target node + * @param {HTMLElement} node The target node + * @param {Ext.EventObject} e The raw event object + */ + "click" : true, + /** + * @event dblclick + * Fires when a template node is double clicked. + * @param {Ext.View} this + * @param {Number} index The index of the target node + * @param {HTMLElement} node The target node + * @param {Ext.EventObject} e The raw event object + */ + "dblclick" : true, + /** + * @event contextmenu + * Fires when a template node is right clicked. + * @param {Ext.View} this + * @param {Number} index The index of the target node + * @param {HTMLElement} node The target node + * @param {Ext.EventObject} e The raw event object + */ + "contextmenu" : true, + /** + * @event selectionchange + * Fires when the selected nodes change. + * @param {Ext.View} this + * @param {Array} selections Array of the selected nodes + */ + "selectionchange" : true, + + /** + * @event beforeselect + * Fires before a selection is made. If any handlers return false, the selection is cancelled. + * @param {Ext.View} this + * @param {HTMLElement} node The node to be selected + * @param {Array} selections Array of currently selected nodes + */ + "beforeselect" : true + }); + + this.el.on({ + "click": this.onClick, + "dblclick": this.onDblClick, + "contextmenu": this.onContextMenu, + scope:this + }); + + this.selections = []; + this.nodes = []; + this.cmp = new Ext.CompositeElementLite([]); + if(this.store){ + this.setStore(this.store, true); + } + Ext.View.superclass.constructor.call(this); +}; + +Ext.extend(Ext.View, Ext.util.Observable, { + /** + * The css class to add to selected nodes + * @type {Ext.DomHelper.Template} + */ + selectedClass : "x-view-selected", + + emptyText : "", + /** + * Returns the element this view is bound to. + * @return {Ext.Element} + */ + getEl : function(){ + return this.el; + }, + + /** + * Refreshes the view. + */ + refresh : function(){ + var t = this.tpl; + this.clearSelections(); + this.el.update(""); + var html = []; + var records = this.store.getRange(); + if(records.length < 1){ + this.el.update(this.emptyText); + return; + } + for(var i = 0, len = records.length; i < len; i++){ + var data = this.prepareData(records[i].data, i, records[i]); + html[html.length] = t.apply(data); + } + this.el.update(html.join("")); + 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). + */ + prepareData : function(data){ + return data; + }, + + onUpdate : function(ds, record){ + this.clearSelections(); + var index = this.store.indexOf(record); + var n = this.nodes[index]; + this.tpl.insertBefore(n, this.prepareData(record.data)); + n.parentNode.removeChild(n); + this.updateIndexes(index, index); + }, + + onAdd : function(ds, records, index){ + this.clearSelections(); + if(this.nodes.length == 0){ + this.refresh(); + return; + } + var n = this.nodes[index]; + for(var i = 0, len = records.length; i < len; i++){ + var d = this.prepareData(records[i].data); + if(n){ + this.tpl.insertBefore(n, d); + }else{ + this.tpl.append(this.el, d); + } + } + this.updateIndexes(index); + }, + + onRemove : function(ds, record, index){ + this.clearSelections(); + this.el.dom.removeChild(this.nodes[index]); + this.updateIndexes(index); + }, + + /** + * Refresh an individual node. + * @param {Number} index + */ + refreshNode : function(index){ + this.onUpdate(this.store, this.store.getAt(index)); + }, + + updateIndexes : function(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 store this view uses and refresh the view. + * @param {Store} store + */ + setStore : function(store, initial){ + if(!initial && this.store){ + this.store.un("datachanged", this.refresh); + this.store.un("add", this.onAdd); + this.store.un("remove", this.onRemove); + this.store.un("update", this.onUpdate); + this.store.un("clear", this.refresh); + } + if(store){ + store.on("datachanged", this.refresh, this); + store.on("add", this.onAdd, this); + store.on("remove", this.onRemove, this); + store.on("update", this.onUpdate, this); + store.on("clear", this.refresh, this); + } + this.store = store; + this.refresh(); + }, + + /** + * 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); + if(this.onItemClick(item, index, e) !== false){ + 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.fireEvent("beforeclick", this, index, item, e) === false){ + return false; + } + 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; + } + e.preventDefault(); + } + return true; + }, + + /** + * 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 = [], s = this.selections; + for(var i = 0, len = s.length; i < len; i++){ + indexes.push(s[i].nodeIndex); + } + return indexes; + }, + + /** + * Clear all selections + * @param {Boolean} suppressEvent (optional) true to skip firing of the selectionchange event + */ + clearSelections : function(suppressEvent){ + if(this.nodes && (this.multiSelect || this.singleSelect) && this.selections.length > 0){ + this.cmp.elements = this.selections; + this.cmp.removeClass(this.selectedClass); + this.selections = []; + if(!suppressEvent){ + this.fireEvent("selectionchange", this, this.selections); + } + } + }, + + /** + * Returns true if the passed node is selected + * @param {HTMLElement/Number} node The node or node index + * @return {Boolean} + */ + isSelected : function(node){ + var s = this.selections; + if(s.length < 1){ + return false; + } + node = this.getNode(node); + return s.indexOf(node) !== -1; + }, + + /** + * 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(nodeInfo instanceof Array){ + if(!keepExisting){ + this.clearSelections(true); + } + for(var i = 0, len = nodeInfo.length; i < len; i++){ + this.select(nodeInfo[i], true, true); + } + } else{ + var node = this.getNode(nodeInfo); + if(node && !this.isSelected(node)){ + if(!keepExisting){ + this.clearSelections(true); + } + if(this.fireEvent("beforeselect", this, node, this.selections) !== false){ + Ext.fly(node).addClass(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 == "string"){ + return document.getElementById(nodeInfo); + }else if(typeof nodeInfo == "number"){ + return this.nodes[nodeInfo]; + } + return nodeInfo; + }, + + /** + * 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; + start = start || 0; + end = typeof end == "undefined" ? ns.length - 1 : end; + var nodes = []; + if(start <= end){ + for(var i = start; i <= end; i++){ + nodes.push(ns[i]); + } + } else{ + 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; + } +}); diff --git a/www/extras/yui-ext/source/widgets/form/Action.js b/www/extras/yui-ext/source/widgets/form/Action.js new file mode 100644 index 000000000..d14595220 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/form/Action.js @@ -0,0 +1,202 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +// define the action interface +Ext.form.Action = function(form, options){ + this.form = form; + this.options = options || {}; +}; + +Ext.form.Action.CLIENT_INVALID = 'client'; +Ext.form.Action.SERVER_INVALID = 'server'; +Ext.form.Action.CONNECT_FAILURE = 'connect'; +Ext.form.Action.LOAD_FAILURE = 'load'; + +Ext.form.Action.prototype = { + type : 'default', + failureType : undefined, + response : undefined, + result : undefined, + + // interface method + run : function(options){ + + }, + + // interface method + success : function(response){ + + }, + + // interface method + handleResponse : function(response){ + + }, + + // default connection failure + failure : function(response){ + this.response = response; + this.failureType = Ext.form.Action.CONNECT_FAILURE; + this.form.afterAction(this, false); + }, + + processResponse : function(response){ + this.response = response; + if(!response.responseText){ + return true; + } + this.result = this.handleResponse(response); + return this.result; + }, + + // utility functions used internally + getUrl : function(appendParams){ + var url = this.options.url || this.form.url || this.form.el.dom.action; + if(appendParams){ + var p = this.getParams(); + if(p){ + url += (url.indexOf('?') != -1 ? '&' : '?') + p; + } + } + return url; + }, + + getMethod : function(){ + return (this.options.method || this.form.method || this.form.el.dom.method || 'POST').toUpperCase(); + }, + + getParams : function(){ + var bp = this.form.baseParams; + var p = this.options.params; + if(p){ + if(typeof p == "object"){ + p = Ext.urlEncode(Ext.applyIf(p, bp)); + }else if(typeof p == 'string' && bp){ + p += '&' + Ext.urlEncode(bp); + } + }else if(bp){ + p = Ext.urlEncode(bp); + } + return p; + }, + + createCallback : function(){ + return { + success: this.success, + failure: this.failure, + scope: this, + timeout: (this.form.timeout*1000), + upload: this.form.fileUpload ? this.success : undefined + }; + } +}; + +Ext.form.Action.Submit = function(form, options){ + Ext.form.Action.Submit.superclass.constructor.call(this, form, options); +}; + +Ext.extend(Ext.form.Action.Submit, Ext.form.Action, { + type : 'submit', + + run : function(){ + var o = this.options; + var isPost = this.getMethod() == 'POST'; + if(o.clientValidation === false || this.form.isValid()){ + Ext.lib.Ajax.formRequest( + this.form.el.dom, + this.getUrl(!isPost), + this.createCallback(), + isPost ? this.getParams() : null, this.form.fileUpload, Ext.SSL_SECURE_URL); + + }else if (o.clientValidation !== false){ // client validation failed + this.failureType = Ext.form.Action.CLIENT_INVALID; + this.form.afterAction(this, false); + } + }, + + success : function(response){ + var result = this.processResponse(response); + if(result === true || result.success){ + this.form.afterAction(this, true); + return; + } + if(result.errors){ + this.form.markInvalid(result.errors); + this.failureType = Ext.form.Action.SERVER_INVALID; + } + this.form.afterAction(this, false); + }, + + handleResponse : function(response){ + if(this.form.errorReader){ + var rs = this.form.errorReader.read(response); + var errors = []; + if(rs.records){ + for(var i = 0, len = rs.records.length; i < len; i++) { + var r = rs.records[i]; + errors[i] = r.data; + } + } + if(errors.length < 1){ + errors = null; + } + return { + success : rs.success, + errors : errors + }; + } + return Ext.decode(response.responseText); + } +}); + + +Ext.form.Action.Load = function(form, options){ + Ext.form.Action.Load.superclass.constructor.call(this, form, options); + this.reader = this.form.reader; +}; + +Ext.extend(Ext.form.Action.Load, Ext.form.Action, { + type : 'load', + + run : function(){ + Ext.lib.Ajax.request( + this.getMethod(), + this.getUrl(false), + this.createCallback(), + this.getParams()); + }, + + success : function(response){ + var result = this.processResponse(response); + if(result === true || !result.success || !result.data){ + this.failureType = Ext.form.Action.LOAD_FAILURE; + this.form.afterAction(this, false); + return; + } + this.form.clearInvalid(); + this.form.setValues(result.data); + this.form.afterAction(this, true); + }, + + handleResponse : function(response){ + if(this.form.reader){ + var rs = this.form.reader.read(response); + var data = rs.records && rs.records[0] ? rs.records[0].data : null; + return { + success : rs.success, + data : data + }; + } + return Ext.decode(response.responseText); + } +}); + +Ext.form.Action.ACTION_TYPES = { + 'load' : Ext.form.Action.Load, + 'submit' : Ext.form.Action.Submit +}; diff --git a/www/extras/yui-ext/source/widgets/form/BasicForm.js b/www/extras/yui-ext/source/widgets/form/BasicForm.js new file mode 100644 index 000000000..efcf5c372 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/form/BasicForm.js @@ -0,0 +1,362 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.form.BasicForm + * @extends Ext.util.Observable + * Supplies the functionality to do "actions" on forms and initialize Ext.form.Field types on existing markup. + * @constructor + * @param {String/HTMLElement/Ext.Element} el The form element or its id + * @param {Object} config Configuration options + */ +Ext.form.BasicForm = function(el, config){ + Ext.apply(this, config); + /* + * The Ext.form.Field items in this form + * @type MixedCollection + */ + this.items = new Ext.util.MixedCollection(false, function(o){ + return o.id || (o.id = Ext.id()); + }); + this.addEvents({ + /** + * @event beforeaction + * Fires before any action is performed. Return false to cancel the action. + * @param {Form} this + * @param {Action} action The action to be performed + */ + beforeaction: true, + /** + * @event actionfailed + * Fires when an action fails + * @param {Form} this + * @param {Action} action The action that failed + */ + actionfailed : true, + /** + * @event actioncomplete + * Fires when an action is completed + * @param {Form} this + * @param {Action} action The action that completed + */ + actioncomplete : true + }); + if(el){ + this.initEl(el); + } + Ext.form.BasicForm.superclass.constructor.call(this); +}; + +Ext.extend(Ext.form.BasicForm, Ext.util.Observable, { + /** + * @cfg {String} method + * The request method to use (GET or POST) for form actions if one isn't supplied in the action options + */ + /** + * @cfg {DataReader} reader + * An Ext.data.DataReader (e.g. {@link Ext.data.XmlReader} to be used to read data when executing "load" actions. + * This is completely optional as there is built-in support for processing JSON. + */ + /** + * @cfg {DataReader} errorReader + * An Ext.data.DataReader (e.g. {@link Ext.data.XmlReader} to be used to read data when reading validation errors on "submit" actions. + * This is completely optional as there is built-in support for processing JSON. + */ + /** + * @cfg {String} url + * The url to use for form actions if one isn't supplied in the action options + */ + /** + * @cfg {Boolean} fileUpload + * Set to true if this form is a file upload (YUI adapter only) + */ + /** + * @cfg {Object} baseParams + * Parameters to pass with all requests. e.g. baseParams: {id: '123', foo: 'bar'} + */ + /** + * @cfg {Number} timeout + */ + timeout: 30, + + // private + activeAction : null, + + /** + * By default wait messages are displayed with Ext.MessageBox.wait. You can target a specific + * element by passing it or its id or mask the form itself by passing in true. + * @type Mixed + */ + waitMsgTarget : undefined, + + // private + initEl : function(el){ + this.el = Ext.get(el); + this.id = this.el.id || Ext.id(); + this.el.on('submit', this.onSubmit, this); + this.el.addClass('x-form'); + }, + + // private + onSubmit : function(e){ + e.stopEvent(); + }, + + /** + * Returns true is client-side validation on the form is successful + * @return Boolean + */ + isValid : function(){ + var valid = true; + this.items.each(function(f){ + if(!f.validate()){ + valid = false; + } + }); + return valid; + }, + + /** + * Performs a predefined action (submit or load) or custom actions you define on this form + * @param {String} actionName The name of the action type + * @param {Object} options The options to pass to the action + */ + doAction : function(action, options){ + if(typeof action == 'string'){ + action = new Ext.form.Action.ACTION_TYPES[action](this, options); + } + if(this.fireEvent('beforeaction', this, action) !== false){ + this.beforeAction(action); + action.run.defer(100, action); + } + }, + + /** + * Shortcut to do a submit action + * @param {Object} options The options to pass to the action + */ + submit : function(options){ + this.doAction('submit', options); + }, + + /** + * Shortcut to do a load action + * @param {Object} options The options to pass to the action + */ + load : function(options){ + this.doAction('load', options); + }, + + /** + * Persists the values in this form into the passed Ext.data.Record object in a beginEdit/endEdit block. + * @param {Record} record The record to edit + */ + updateRecord : function(record){ + record.beginEdit(); + var fs = record.fields; + fs.each(function(f){ + var field = this.findField(f.name); + if(field){ + record.set(f.name, field.getValue()); + } + }, this); + record.endEdit(); + }, + + // private + beforeAction : function(action){ + var o = action.options; + if(o.waitMsg){ + if(this.waitMsgTarget === true){ + this.el.mask(o.waitMsg, 'x-mask-loading'); + }else if(this.waitMsgTarget){ + this.waitMsgTarget = Ext.get(this.waitMsgTarget); + this.waitMsgTarget.mask(o.waitMsg, 'x-mask-loading'); + }else{ + Ext.MessageBox.wait(o.waitMsg, o.waitTitle || this.waitTitle || 'Please Wait...'); + } + } + }, + + // private + afterAction : function(action, success){ + this.activeAction = null; + var o = action.options; + if(o.waitMsg){ + if(this.waitMsgTarget === true){ + this.el.unmask(); + }else if(this.waitMsgTarget){ + this.waitMsgTarget.unmask(); + }else{ + Ext.MessageBox.updateProgress(1); + Ext.MessageBox.hide(); + } + } + if(success){ + if(o.reset){ + this.reset(); + } + Ext.callback(o.success, o.scope, [this, action]); + this.fireEvent('actioncomplete', this, action); + }else{ + Ext.callback(o.failure, o.scope, [this, action]); + this.fireEvent('actionfailed', this, action); + } + }, + + /** + * Find a Ext.form.Field in this form by id, dataIndex, name or hiddenName + * @param {String} id The value to search for + * @return Field + */ + findField : function(id){ + var field = this.items.get(id); + if(!field){ + this.items.each(function(f){ + if(f.isFormField && (f.dataIndex == id || f.id == id || f.getName() == id)){ + field = f; + return false; + } + }); + } + return field || null; + }, + + + /** + * Mark fields in this form invalid in bulk. + * @param {Array/Object} errors Either an array in the form [{id:'fieldId', msg:'The message'},...] or an object hash of {id: msg, id2: msg2} + */ + markInvalid : function(errors){ + if(errors instanceof Array){ + for(var i = 0, len = errors.length; i < len; i++){ + var fieldError = errors[i]; + var f = this.findField(fieldError.id); + if(f){ + f.markInvalid(fieldError.msg); + } + } + }else{ + var field, id; + for(id in errors){ + if(typeof errors[id] != 'function' && (field = this.findField(id))){ + field.markInvalid(errors[id]); + } + } + } + }, + + /** + * Set values for fields in this form in bulk. + * @param {Array/Object} values Either an array in the form [{id:'fieldId', value:'foo'},...] or an object hash of {id: value, id2: value2} + */ + setValues : function(values){ + if(values instanceof Array){ // array of objects + for(var i = 0, len = values.length; i < len; i++){ + var v = values[i]; + var f = this.findField(v.id); + if(f){ + f.setValue(v.value); + } + } + }else{ // object hash + var field, id; + for(id in values){ + if(typeof values[id] != 'function' && (field = this.findField(id))){ + field.setValue(values[id]); + } + } + } + }, + + /** + * Returns the fields in this form as an object with key value pair. If multiple fields exist with the same name + * they are returned as an array. + * @param {Boolean} asString + * @return {Object} + */ + getValues : function(asString){ + var fs = Ext.lib.Ajax.serializeForm(this.el.dom); + if(asString === true){ + return fs; + } + return Ext.urlDecode(fs); + }, + + /** + * Clears all invalid messages in this form + */ + clearInvalid : function(){ + this.items.each(function(f){ + f.clearInvalid(); + }); + }, + + /** + * Resets this form + */ + reset : function(){ + this.items.each(function(f){ + f.reset(); + }); + }, + + /** + * Add Ext.form components to this form + * @param {Field} field1 + * @param {Field} field2 (optional) + * @param {Field} etc (optional) + */ + add : function(){ + this.items.addAll(Array.prototype.slice.call(arguments, 0)); + }, + + + /** + * Removes a field from the items collection (does NOT remove its markup) + * @param {Field} field + */ + remove : function(field){ + this.items.remove(field); + }, + + /** + * Looks at the fields in this form, checks them for an id attribute + * and call applyTo on the existing dom element with that id + */ + render : function(){ + this.items.each(function(f){ + if(f.isFormField && !f.rendered && document.getElementById(f.id)){ // if the element exists + f.applyTo(f.id); + } + }); + }, + + /** + * Calls {@link Ext#apply} for all field in this form with the passed object + * @param {Object} values + */ + applyToFields : function(o){ + this.items.each(function(f){ + Ext.apply(f, o); + }); + }, + + /** + * Calls {@link Ext#applyIf} for all field in this form with the passed object + * @param {Object} values + */ + applyIfToFields : function(o){ + this.items.each(function(f){ + Ext.applyIf(f, o); + }); + } +}); + +// back compat +Ext.BasicForm = Ext.form.BasicForm; \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/form/Checkbox.js b/www/extras/yui-ext/source/widgets/form/Checkbox.js new file mode 100644 index 000000000..1d835ced2 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/form/Checkbox.js @@ -0,0 +1,123 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.form.Checkbox + * @extends Ext.form.Field + * Single checkbox field. Can be used as a direct replacement for traditional checkbox fields. + * @constructor + * Creates a new CheckBox + * @param {Object} config Configuration options + */ +Ext.form.Checkbox = function(config){ + Ext.form.Checkbox.superclass.constructor.call(this, config); + this.addEvents({ + /** + * @event check + * Fires when the checkbox is checked or unchecked + * @param {Ext.form.Checkbox} this This checkbox + * @param {Boolean} checked The new checked value + */ + check : true + }); +}; + +Ext.extend(Ext.form.Checkbox, Ext.form.Field, { + /** + * @cfg {String} focusClass The CSS class to use when the checkbox receives focus (defaults to 'x-form-check-focus') + */ + focusClass : "x-form-check-focus", + /** + * @cfg {String} fieldClass The default CSS class for the checkbox (defaults to "x-form-field") + */ + fieldClass: "x-form-field", + /** + * @cfg {Boolean} checked True if the the checkbox should render already checked (defaults to false) + */ + checked: false, + + // private + defaultAutoCreate : { tag: "input", type: 'checkbox', autocomplete: "off"}, + /** + * @cfg {String} boxLabel The text that appears beside the checkbox + */ + boxLabel : undefined, + /** + * @cfg {String} inputValue The value that should go into the generated input element's value attribute + */ + /** + * Sets the width and height of the checkbox wrapper element + * @param {Number} width New width in pixels + * @param {Number} height New height in pixels + */ + setSize : function(w, h){ + if(!this.wrap){ + this.width = w; + this.height = h; + return; + } + this.wrap.setSize(w, h); + if(!this.boxLabel){ + this.el.alignTo(this.wrap, 'c-c'); + } + }, + + initEvents : function(){ + Ext.form.Checkbox.superclass.initEvents.call(this); + this.el.on("click", this.onClick, this); + this.el.on("change", this.onClick, this); + }, + + + // private + onRender : function(ct, position){ + Ext.form.Checkbox.superclass.onRender.call(this, ct, position); + if(this.inputValue !== undefined){ + this.el.dom.value = this.inputValue; + } + this.wrap = this.el.wrap({cls: "x-form-check-wrap"}); + if(this.boxLabel){ + this.wrap.createChild({tag: 'label', htmlFor: this.el.id, cls: 'x-form-cb-label', html: this.boxLabel}); + } + if(this.checked){ + this.setValue(true); + } + }, + + // private + initValue : Ext.emptyFn, + + /** + * Returns the checked state of the checkbox. + * @return {Boolean} True if checked, else false + */ + getValue : function(){ + if(this.rendered){ + return this.el.dom.checked; + } + return false; + }, + + onClick : function(){ + if(this.el.dom.checked != this.checked){ + this.setValue(this.el.dom.checked); + } + }, + + /** + * Sets the checked state of the checkbox + * @param {Boolean/String} checked True, 'true,' or '1' to check the checkbox, any other value will uncheck it + */ + setValue : function(v){ + this.checked = (v === true || v === 'true' || v == '1'); + if(this.el && this.el.dom){ + this.el.dom.checked = this.checked; + } + this.fireEvent("check", this, this.checked); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/form/Combo.js b/www/extras/yui-ext/source/widgets/form/Combo.js new file mode 100644 index 000000000..863763797 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/form/Combo.js @@ -0,0 +1,806 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.form.ComboBox + * @extends Ext.form.TriggerField + * A combobox control with support for autocomplete, remote-loading, paging and many other features. + * @constructor + * Create a new ComboBox. + * @param {Object} config Configuration options + */ +Ext.form.ComboBox = function(config){ + Ext.form.ComboBox.superclass.constructor.call(this, config); + this.addEvents({ + /** + * @event expand + * Fires when the dropdown list is expanded + * @param {Ext.form.ComboBox} combo This combo box + */ + 'expand' : true, + /** + * @event collapse + * Fires when the dropdown list is collapsed + * @param {Ext.form.ComboBox} combo This combo box + */ + 'collapse' : true, + /** + * @event beforeselect + * Fires before a list item is selected. Return false to cancel the selection. + * @param {Ext.form.ComboBox} combo This combo box + * @param {Ext.data.Record} record The data record returned from the underlying store + * @param {Number} index The index of the selected item in the dropdown list + */ + 'beforeselect' : true, + /** + * @event select + * Fires when a list item is selected + * @param {Ext.form.ComboBox} combo This combo box + * @param {Ext.data.Record} record The data record returned from the underlying store + * @param {Number} index The index of the selected item in the dropdown list + */ + 'select' : true, + /** + * @event beforequery + * Fires before all queries are processed. Return false to cancel the query or set cancel to true. + * The event object passed has these properties: + *
            + *
          • {Ext.form.ComboBox} combo - This combo box
          • + *
          • {String} query - The query
          • + *
          • {Boolean} forceAll - true to force "all" query
          • + *
          • {Boolean} cancel - set to true to cancel the query.
          • + *
          + * @param {Object} e The query event object + */ + 'beforequery': true + }); + if(this.transform){ + var s = Ext.getDom(this.transform); + if(!this.hiddenName){ + this.hiddenName = s.name; + } + if(!this.store){ + this.mode = 'local'; + var d = [], opts = s.options; + for(var i = 0, len = opts.length;i < len; i++){ + var o = opts[i]; + var value = (Ext.isIE ? o.getAttributeNode('value').specified : o.hasAttribute('value')) ? o.value : o.text; + if(o.selected) { + this.value = value; + } + d.push([value, o.text]); + } + this.store = new Ext.data.SimpleStore({ + 'id': 0, + fields: ['value', 'text'], + data : d + }); + this.valueField = 'value'; + this.displayField = 'text'; + } + s.name = Ext.id(); // wipe out the name in case somewhere else they have a reference + if(!this.lazyRender){ + this.target = true; + this.el = Ext.DomHelper.insertBefore(s, this.autoCreate || this.defaultAutoCreate); + s.parentNode.removeChild(s); // remove it + this.render(this.el.parentNode); + }else{ + s.parentNode.removeChild(s); // remove it + } + + } + this.selectedIndex = -1; + if(this.mode == 'local'){ + if(config.queryDelay === undefined){ + this.queryDelay = 10; + } + if(config.minChars === undefined){ + this.minChars = 0; + } + } +}; + +Ext.extend(Ext.form.ComboBox, Ext.form.TriggerField, { + /** + * @cfg {String/HTMLElement/Element} transform The id, DOM node or element of an existing select to convert to a ComboBox + */ + /** + * @cfg {Boolean} lazyRender True to prevent the ComboBox from rendering until requested (should always be used when + * rendering into an Ext.Editor, defaults to false) + */ + /** + * @cfg {Boolean/Object} autoCreate A DomHelper element spec, or true for a default element spec (defaults to: + * {tag: "input", type: "text", size: "24", autocomplete: "off"}) + */ + + // private + defaultAutoCreate : {tag: "input", type: "text", size: "24", autocomplete: "off"}, + /** + * @cfg {Number} listWidth The width in pixels of the dropdown list (defaults to the width of the ComboBox field) + */ + listWidth: undefined, + /** + * @cfg {String} displayField The underlying data field name to bind to this CombBox (defaults to undefined if + * mode = 'remote' or 'text' if mode = 'local') + */ + displayField: undefined, + /** + * @cfg {String} valueField The underlying data value name to bind to this CombBox (defaults to undefined if + * mode = 'remote' or 'value' if mode = 'local') + */ + valueField: undefined, + /** + * @cfg {String} hiddenName If specified, a hidden form field with this name is dynamically generated to store the + * field's data value (defaults to the underlying DOM element's name) + */ + hiddenName: undefined, + /** + * @cfg {String} listClass CSS class to apply to the dropdown list element (defaults to '') + */ + listClass: '', + /** + * @cfg {String} selectedClass CSS class to apply to the selected item in the dropdown list (defaults to 'x-combo-selected') + */ + selectedClass: 'x-combo-selected', + /** + * @cfg {String} triggerClass An additional CSS class used to style the trigger button. The trigger will always get the + * class 'x-form-trigger' and triggerClass will be appended if specified (defaults to 'x-form-arrow-trigger' + * which displays a downward arrow icon). + */ + triggerClass : 'x-form-arrow-trigger', + /** + * @cfg {Boolean/String} shadow True or "sides" for the default effect, "frame" for 4-way shadow, and "drop" for bottom-right + */ + shadow:'sides', + /** + * @cfg {String} listAlign A valid anchor position value. See {@link Ext.Element#alignTo} for details on supported + * anchor positions (defaults to 'tl-bl') + */ + listAlign: 'tl-bl?', + /** + * @cfg {Number} maxHeight The maximum height in pixels of the dropdown list before scrollbars are shown (defaults to 300) + */ + maxHeight: 300, + /** + * @cfg {String} triggerAction The action to execute when the trigger field is activated. Use 'all' to run the + * query specified by the allQuery config option (defaults to 'query') + */ + triggerAction: 'query', + /** + * @cfg {Number} minChars The minimum number of characters the user must type before autocomplete and typeahead activate + * (defaults to 4, does not apply if editable = false) + */ + minChars : 4, + /** + * @cfg {Boolean} typeAhead True to populate and autoselect the remainder of the text being typed after a configurable + * delay (typeAheadDelay) if it matches a known value (defaults to false) + */ + typeAhead: false, + /** + * @cfg {Number} queryDelay The length of time in milliseconds to delay between the start of typing and sending the + * query to filter the dropdown list (defaults to 500 if mode = 'remote' or 10 if mode = 'local') + */ + queryDelay: 500, + /** + * @cfg {Number} pageSize If greater than 0, a paging toolbar is displayed in the footer of the dropdown list and the + * filter queries will execute with page start and limit parameters. Only applies when mode = 'remote' (defaults to 0) + */ + pageSize: 0, + /** + * @cfg {Boolean} selectOnFocus True to select any existing text in the field immediately on focus. Only applies + * when editable = true (defaults to false) + */ + selectOnFocus:false, + /** + * @cfg {String} queryParam Name of the query as it will be passed on the querystring (defaults to 'query') + */ + queryParam: 'query', + /** + * @cfg {String} loadingText The text to display in the dropdown list while data is loading. Only applies + * when mode = 'remote' (defaults to 'Loading...') + */ + loadingText: 'Loading...', + /** + * @cfg {Boolean} resizable True to add a resize handle to the bottom of the dropdown list (defaults to false) + */ + resizable: false, + /** + * @cfg {Number} handleHeight The height in pixels of the dropdown list resize handle if resizable = true (defaults to 8) + */ + handleHeight : 8, + /** + * @cfg {Boolean} editable False to prevent the user from typing text directly into the field, just like a + * traditional select (defaults to true) + */ + editable: true, + /** + * @cfg {String} allQuery The text query to send to the server to return all records for the list with no filtering (defaults to '') + */ + allQuery: '', + /** + * @cfg {String} mode Set to 'local' if the ComboBox loads local data (defaults to 'remote' which loads from the server) + */ + mode: 'remote', + /** + * @cfg {Number} minListWidth The minimum width of the dropdown list in pixels (defaults to 70, will be ignored if + * listWidth has a higher value) + */ + minListWidth : 70, + /** + * @cfg {Boolean} forceSelection True to restrict the selected value to one of the values in the list, false to + * allow the user to set arbitrary text into the field (defaults to false) + */ + forceSelection:false, + /** + * @cfg {Number} typeAheadDelay The length of time in milliseconds to wait until the typeahead text is displayed + * if typeAhead = true (defaults to 250) + */ + typeAheadDelay : 250, + /** + * @cfg {String} valueNotFoundText When using a name/value combo, if the value passed to setValue is not found in + * the store, valueNotFoundText will be displayed as the field text if defined (defaults to undefined) + */ + valueNotFoundText : undefined, + + // private + onRender : function(ct, position){ + Ext.form.ComboBox.superclass.onRender.call(this, ct, position); + if(this.hiddenName){ + this.hiddenField = this.el.insertSibling({tag:'input', type:'hidden', name: this.hiddenName, id: this.hiddenName}, + 'before', true); + this.hiddenField.value = + this.hiddenValue !== undefined ? this.hiddenValue : + this.value !== undefined ? this.value : ''; + + // prevent input submission + this.el.dom.removeAttribute('name'); + } + if(Ext.isGecko){ + this.el.dom.setAttribute('autocomplete', 'off'); + } + + var cls = 'x-combo-list'; + + this.list = new Ext.Layer({ + shadow: this.shadow, cls: [cls, this.listClass].join(' '), constrain:false + }); + + this.list.setWidth(this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth)); + this.list.swallowEvent('mousewheel'); + this.assetHeight = 0; + + if(this.title){ + this.header = this.list.createChild({cls:cls+'-hd', html: this.title}); + this.assetHeight += this.header.getHeight(); + } + + this.innerList = this.list.createChild({cls:cls+'-inner'}); + this.innerList.on('mouseover', this.onViewOver, this); + this.innerList.on('mousemove', this.onViewMove, this); + + if(this.pageSize){ + this.footer = this.list.createChild({cls:cls+'-ft'}); + this.pageTb = new Ext.PagingToolbar(this.footer, this.store, + {pageSize: this.pageSize}); + this.assetHeight += this.footer.getHeight(); + } + + if(!this.tpl){ + this.tpl = '
          {' + this.displayField + '}
          '; + } + + this.view = new Ext.View(this.innerList, this.tpl, { + singleSelect:true, store: this.store, selectedClass: this.selectedClass + }); + + this.view.on('click', this.onViewClick, this); + + this.store.on('beforeload', this.onBeforeLoad, this); + this.store.on('load', this.onLoad, this); + this.store.on('loadexception', this.collapse, this); + + if(this.resizable){ + this.resizer = new Ext.Resizable(this.list, { + pinned:true, handles:'se' + }); + this.resizer.on('resize', function(r, w, h){ + this.maxHeight = h-this.handleHeight-this.list.getFrameWidth('tb')-this.assetHeight; + this.listWidth = w; + this.restrictHeight(); + }, this); + this[this.pageSize?'footer':'innerList'].setStyle('margin-bottom', this.handleHeight+'px'); + } + if(!this.editable){ + this.editable = true; + this.setEditable(false); + } + }, + + // private + initEvents : function(){ + Ext.form.ComboBox.superclass.initEvents.call(this); + + this.keyNav = new Ext.KeyNav(this.el, { + "up" : function(e){ + this.inKeyMode = true; + this.selectPrev(); + }, + + "down" : function(e){ + if(!this.isExpanded()){ + this.onTriggerClick(); + }else{ + this.inKeyMode = true; + this.selectNext(); + } + }, + + "enter" : function(e){ + this.onViewClick(); + //return true; + }, + + "esc" : function(e){ + this.collapse(); + }, + + "tab" : function(e){ + this.onViewClick(false); + return true; + }, + + scope : this, + + doRelay : function(foo, bar, hname){ + if(hname == 'down' || this.scope.isExpanded()){ + return Ext.KeyNav.prototype.doRelay.apply(this, arguments); + } + return true; + } + }); + this.queryDelay = Math.max(this.queryDelay || 10, + this.mode == 'local' ? 10 : 250); + this.dqTask = new Ext.util.DelayedTask(this.initQuery, this); + if(this.typeAhead){ + this.taTask = new Ext.util.DelayedTask(this.onTypeAhead, this); + } + if(this.editable !== false){ + this.el.on("keyup", this.onKeyUp, this); + } + if(this.forceSelection){ + this.on('blur', this.doForce, this); + } + }, + + onDestroy : function(){ + if(this.view){ + this.view.setStore(null); + this.view.el.removeAllListeners(); + this.view.el.remove(); + this.view.purgeListeners(); + } + if(this.list){ + this.list.destroy(); + } + if(this.store){ + this.store.un('beforeload', this.onBeforeLoad, this); + this.store.un('load', this.onLoad, this); + this.store.un('loadexception', this.collapse, this); + } + Ext.form.ComboBox.superclass.onDestroy.call(this); + }, + + // private + fireKey : function(e){ + if(e.isNavKeyPress() && !this.list.isVisible()){ + this.fireEvent("specialkey", this, e); + } + }, + + // private + onResize: function(w, h){ + if(this.list && this.listWidth === undefined){ + this.list.setWidth(Math.max(w, this.minListWidth)); + } + }, + + /** + * Allow or prevent the user from directly editing the field text. If false is passed in, + * the user will only be able to select from the items defined in the dropdown list. This method + * is the runtime equivalent of setting the editable config option at config time. + */ + setEditable : function(value){ + if(value == this.editable){ + return; + } + this.editable = value; + if(!value){ + this.el.dom.setAttribute('readOnly', true); + this.el.on('mousedown', this.onTriggerClick, this); + this.el.addClass('x-combo-noedit'); + }else{ + this.el.dom.setAttribute('readOnly', false); + this.el.un('mousedown', this.onTriggerClick, this); + this.el.removeClass('x-combo-noedit'); + } + }, + + // private + onBeforeLoad : function(){ + if(!this.hasFocus){ + return; + } + this.innerList.update(this.loadingText ? + '
          '+this.loadingText+'
          ' : ''); + this.restrictHeight(); + this.selectedIndex = -1; + }, + + // private + onLoad : function(){ + if(!this.hasFocus){ + return; + } + if(this.store.getCount() > 0){ + this.expand(); + this.restrictHeight(); + if(this.lastQuery == this.allQuery){ + if(this.editable){ + this.el.dom.select(); + } + if(!this.selectByValue(this.value, true)){ + this.select(0, true); + } + }else{ + this.selectNext(); + if(this.typeAhead && this.lastKey != Ext.EventObject.BACKSPACE && this.lastKey != Ext.EventObject.DELETE){ + this.taTask.delay(this.typeAheadDelay); + } + } + }else{ + this.onEmptyResults(); + } + //this.el.focus(); + }, + + // private + onTypeAhead : function(){ + if(this.store.getCount() > 0){ + var r = this.store.getAt(0); + var newValue = r.data[this.displayField]; + var len = newValue.length; + var selStart = this.getRawValue().length; + if(selStart != len){ + this.setRawValue(newValue); + this.selectText(selStart, newValue.length); + } + } + }, + + // private + onSelect : function(record, index){ + if(this.fireEvent('beforeselect', this, record, index) !== false){ + this.setValue(record.data[this.valueField || this.displayField]); + this.collapse(); + this.fireEvent('select', this, record, index); + } + }, + + /** + * Returns the currently-selected field value or empty string if no value is set. + * @return {String} value The selected value + */ + getValue : function(){ + if(this.valueField){ + return typeof this.value != 'undefined' ? this.value : ''; + }else{ + return Ext.form.ComboBox.superclass.getValue.call(this); + } + }, + + /** + * Clears any text/value currently set in the field + */ + clearValue : function(){ + if(this.hiddenField){ + this.hiddenField.value = ''; + } + this.setRawValue(''); + this.lastSelectionText = ''; + }, + + /** + * Sets the specified value into the field. If the value finds a match, the corresponding record text + * will be displayed in the field. If the value does not match the data value of an existing item, + * and the valueNotFoundText config option is defined, it will be displayed as the default field text. + * Otherwise the field will be blank (although the value will still be set). + * @param {String} value The value to match + */ + setValue : function(v){ + var text = v; + if(this.valueField){ + var r = this.findRecord(this.valueField, v); + if(r){ + text = r.data[this.displayField]; + }else if(this.valueNotFoundText){ + text = this.valueNotFoundText; + } + } + this.lastSelectionText = text; + if(this.hiddenField){ + this.hiddenField.value = v; + } + Ext.form.ComboBox.superclass.setValue.call(this, text); + this.value = v; + }, + + // private + findRecord : function(prop, value){ + var record; + if(this.store.getCount() > 0){ + this.store.each(function(r){ + if(r.data[prop] == value){ + record = r; + return false; + } + }); + } + return record; + }, + + // private + onViewMove : function(e, t){ + this.inKeyMode = false; + }, + + // private + onViewOver : function(e, t){ + if(this.inKeyMode){ // prevent key nav and mouse over conflicts + return; + } + var item = this.view.findItemFromChild(t); + if(item){ + var index = this.view.indexOf(item); + this.select(index, false); + } + }, + + // private + onViewClick : function(doFocus){ + var index = this.view.getSelectedIndexes()[0]; + var r = this.store.getAt(index); + if(r){ + this.onSelect(r, index); + } + if(doFocus !== false){ + this.el.focus(); + } + }, + + // private + restrictHeight : function(){ + this.innerList.dom.style.height = ''; + var inner = this.innerList.dom; + var h = Math.max(inner.clientHeight, inner.offsetHeight, inner.scrollHeight); + this.innerList.setHeight(h < this.maxHeight ? 'auto' : this.maxHeight); + this.list.beginUpdate(); + this.list.setHeight(this.innerList.getHeight()+this.list.getFrameWidth('tb')+(this.resizable?this.handleHeight:0)+this.assetHeight); + this.list.alignTo(this.el, this.listAlign); + this.list.endUpdate(); + }, + + // private + onEmptyResults : function(){ + this.collapse(); + }, + + /** + * Returns true if the dropdown list is expanded, else false. + */ + isExpanded : function(){ + return this.list.isVisible(); + }, + + /** + * Select an item in the dropdown list by its data value + * @param {String} value The data value of the item to select + * @param {Boolean} scrollIntoView False to prevent the dropdown list from autoscrolling to display the + * selected item if it is not currently in view (defaults to true) + * @return {Boolean} valueFound True if the value matched an item in the list, else false + */ + selectByValue : function(v, scrollIntoView){ + if(v !== undefined && v !== null){ + var r = this.findRecord(this.valueField || this.displayField, v); + if(r){ + this.select(this.store.indexOf(r), scrollIntoView); + return true; + } + } + return false; + }, + + /** + * Select an item in the dropdown list by its numeric index in the list + * @param {Number} index The zero-based index of the list item to select + * @param {Boolean} scrollIntoView False to prevent the dropdown list from autoscrolling to display the + * selected item if it is not currently in view (defaults to true) + */ + select : function(index, scrollIntoView){ + this.selectedIndex = index; + this.view.select(index); + if(scrollIntoView !== false){ + var el = this.view.getNode(index); + if(el){ + this.innerList.scrollChildIntoView(el); + } + } + }, + + /** + * Select the next item in the dropdown list (selects the first item by default if no items are currently selected) + */ + selectNext : function(){ + var ct = this.store.getCount(); + if(ct > 0){ + if(this.selectedIndex == -1){ + this.select(0); + }else if(this.selectedIndex < ct-1){ + this.select(this.selectedIndex+1); + } + } + }, + + /** + * Select the previous item in the dropdown list (selects the first item by default if no items are currently selected) + */ + selectPrev : function(){ + var ct = this.store.getCount(); + if(ct > 0){ + if(this.selectedIndex == -1){ + this.select(0); + }else if(this.selectedIndex != 0){ + this.select(this.selectedIndex-1); + } + } + }, + + // private + onKeyUp : function(e){ + if(this.editable !== false && !e.isSpecialKey()){ + this.lastKey = e.getKey(); + this.dqTask.delay(this.queryDelay); + } + }, + + // private + validateBlur : function(){ + return !this.list || !this.list.isVisible(); + }, + + // private + initQuery : function(){ + this.doQuery(this.getRawValue()); + }, + + // private + doForce : function(){ + if(this.el.dom.value.length > 0){ + this.el.dom.value = + this.lastSelectionText === undefined ? '' : this.lastSelectionText; + this.applyEmptyText(); + } + }, + + /** + * Execute a query to filter the dropdown list. Fires the beforequery event prior to performing the + * query allowing the query action to be canceled if needed. + * @param {String} query The sql query to execute + * @param {Boolean} forceAll True to force the query to execute even if there are currently fewer characters + * in the field than the minimum specified by the minChars config option. It also clears any filter previously + * saved in the current store (defaults to false) + */ + doQuery : function(q, forceAll){ + if(q === undefined || q === null){ + q = ''; + } + var qe = { + query: q, + forceAll: forceAll, + combo: this, + cancel:false + }; + if(this.fireEvent('beforequery', qe)===false || qe.cancel){ + return false; + } + q = qe.query; + forceAll = qe.forceAll; + if(forceAll === true || (q.length >= this.minChars)){ + if(this.lastQuery != q){ + this.lastQuery = q; + if(this.mode == 'local'){ + this.selectedIndex = -1; + if(forceAll){ + this.store.clearFilter(); + }else{ + this.store.filter(this.displayField, q); + } + this.onLoad(); + }else{ + this.store.baseParams[this.queryParam] = q; + this.store.load({ + params: this.getParams(q) + }); + this.expand(); + } + }else{ + this.selectedIndex = -1; + this.onLoad(); + } + } + }, + + // private + getParams : function(q){ + var p = {}; + //p[this.queryParam] = q; + if(this.pageSize){ + p.start = 0; + p.limit = this.pageSize; + } + return p; + }, + + /** + * Hides the dropdown list if it is currently expanded. Fires the 'collapse' event on completion. + */ + collapse : function(){ + if(!this.isExpanded()){ + return; + } + this.list.hide(); + Ext.get(document).un('mousedown', this.collapseIf, this); + this.fireEvent('collapse', this); + }, + + // private + collapseIf : function(e){ + if(!e.within(this.wrap) && !e.within(this.list)){ + this.collapse(); + } + }, + + /** + * Expands the dropdown list if it is currently hidden. Fires the 'expand' event on completion. + */ + expand : function(){ + if(this.isExpanded() || !this.hasFocus){ + return; + } + this.list.alignTo(this.el, this.listAlign); + this.list.show(); + Ext.get(document).on('mousedown', this.collapseIf, this); + this.fireEvent('expand', this); + }, + + // private + // Implements the default empty TriggerField.onTriggerClick function + onTriggerClick : function(){ + if(this.disabled){ + return; + } + if(this.isExpanded()){ + this.collapse(); + this.el.focus(); + }else{ + this.hasFocus = true; + this.doQuery(this.triggerAction == 'all' ? + this.doQuery(this.allQuery, true) : this.doQuery(this.getRawValue())); + this.el.focus(); + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/form/DateField.js b/www/extras/yui-ext/source/widgets/form/DateField.js new file mode 100644 index 000000000..591e84e30 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/form/DateField.js @@ -0,0 +1,251 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.form.DateField + * @extends Ext.form.TriggerField + * Provides a date input field with a {@link Ext.DatePicker} dropdown and automatic date validation. +* @constructor +* Create a new DateField +* @param {Object} config + */ +Ext.form.DateField = function(config){ + Ext.form.DateField.superclass.constructor.call(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 = null; + 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 + ")"); + } +}; + +Ext.extend(Ext.form.DateField, Ext.form.TriggerField, { + /** + * @cfg {String} format + * The default date format string which can be overriden for localization support. The format must be + * valid according to {@link Date#parseDate} (defaults to 'm/d/y'). + */ + format : "m/d/y", + /** + * @cfg {Array} disabledDays + * An array of days to disable, 0 based. For example, [0, 6] disables Sunday and Saturday (defaults to null). + */ + disabledDays : null, + /** + * @cfg {String} disabledDaysText + * The tooltip to display when the date falls on a disabled day (defaults to 'Disabled') + */ + disabledDaysText : "Disabled", + /** + * @cfg {Array} 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. Some examples: + *
            + *
          • ["03/08/2003", "09/16/2003"] would disable those exact dates
          • + *
          • ["03/08", "09/16"] would disable those days for every year
          • + *
          • ["^03/08"] would only match the beginning (useful if you are using short years)
          • + *
          • ["03/../2006"] would disable every day in March 2006
          • + *
          • ["^03"] would disable every day in every March
          • + *
          + * 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"]. + */ + disabledDates : null, + /** + * @cfg {String} disabledDatesText + * The tooltip text to display when the date falls on a disabled date (defaults to 'Disabled') + */ + disabledDatesText : "Disabled", + /** + * @cfg {Date/String} minValue + * The minimum allowed date. Can be either a Javascript date object or a string date in a + * valid format (defaults to null). + */ + minValue : null, + /** + * @cfg {Date/String} maxValue + * The maximum allowed date. Can be either a Javascript date object or a string date in a + * valid format (defaults to null). + */ + maxValue : null, + /** + * @cfg {String} minText + * The error text to display when the date in the cell is before minValue (defaults to + * 'The date in this field must be after {minValue}'). + */ + minText : "The date in this field must be after {0}", + /** + * @cfg {String} maxText + * The error text to display when the date in the cell is before maxValue (defaults to + * 'The date in this field must be before {maxValue}'). + */ + maxText : "The date in this field must be before {0}", + /** + * @cfg {String} invalidText + * The error to display when the date in the field is invalid (defaults to + * '{value} is not a valid date - it must be in the format {format}'). + */ + invalidText : "{0} is not a valid date - it must be in the format {1}", + /** + * @cfg {String} triggerClass + * An additional CSS class used to style the trigger button. The trigger will always get the + * class 'x-form-trigger' and triggerClass will be appended if specified (defaults to 'x-form-date-trigger' + * which displays a calendar icon). + */ + triggerClass : 'x-form-date-trigger', + /** + * @cfg {String/Object} autoCreate + * A DomHelper element spec, or true for a default element spec (defaults to + * {tag: "input", type: "text", size: "10", autocomplete: "off"}) + */ + + // private + defaultAutoCreate : {tag: "input", type: "text", size: "10", autocomplete: "off"}, + + // private + validateValue : function(value){ + value = this.formatDate(value); + if(!Ext.form.DateField.superclass.validateValue.call(this, value)){ + return false; + } + if(value.length < 1){ // if it's blank and textfield didn't flag it then it's valid + return true; + } + var svalue = value; + value = this.parseDate(value); + if(!value){ + this.markInvalid(String.format(this.invalidText, svalue, this.format)); + return false; + } + var time = value.getTime(); + if(this.minValue && time < this.minValue.getTime()){ + this.markInvalid(String.format(this.minText, this.formatDate(this.minValue))); + return false; + } + if(this.maxValue && time > this.maxValue.getTime()){ + this.markInvalid(String.format(this.maxText, this.formatDate(this.maxValue))); + return false; + } + if(this.disabledDays){ + var day = value.getDay(); + for(var i = 0; i < this.disabledDays.length; i++) { + if(day === this.disabledDays[i]){ + this.markInvalid(this.disabledDaysText); + return false; + } + } + } + var fvalue = this.formatDate(value); + if(this.ddMatch && this.ddMatch.test(fvalue)){ + this.markInvalid(String.format(this.disabledDatesText, fvalue)); + return false; + } + return true; + }, + + // private + // Provides logic to override the default TriggerField.validateBlur which just returns true + validateBlur : function(){ + return !this.menu || !this.menu.isVisible(); + }, + + /** + * Returns the current date value of the date field + * @return {Date} value The date value + */ + getValue : function(){ + return this.parseDate(Ext.form.DateField.superclass.getValue.call(this)) || ""; + }, + + /** + * Sets the value of the date field. You can pass a date object or any string that can be parsed into a valid + * date, using DateField.format as the date format, according to the same rules as {@link Date#parseDate} + * (the default format used is "m/d/y"). + *
          Usage: + *
          
          +//All of these calls set the same date value (May 4, 2006)
          +
          +//Pass a date object:
          +var dt = new Date('5/4/06');
          +dateField.setValue(dt);
          +
          +//Pass a date string (default format):
          +dateField.setValue('5/4/06');
          +
          +//Pass a date string (custom format):
          +dateField.format = 'Y-m-d';
          +dateField.setValue('2006-5-4');
          +
          + * @param {String/Date} date The date or valid date string + */ + setValue : function(date){ + Ext.form.DateField.superclass.setValue.call(this, this.formatDate(this.parseDate(date))); + }, + + // private + parseDate : function(value){ + return (!value || value instanceof Date) ? + value : Date.parseDate(value, this.format); + }, + + // private + formatDate : function(date){ + return (!date || !(date instanceof Date)) ? + date : date.dateFormat(this.format); + }, + + // private + menuListeners : { + select: function(m, d){ + this.setValue(d); + }, + show : function(){ // retain focus styling + this.onFocus(); + }, + hide : function(){ + this.focus(); + var ml = this.menuListeners; + this.menu.un("select", ml.select, this); + this.menu.un("show", ml.show, this); + this.menu.un("hide", ml.hide, this); + } + }, + + // private + // Implements the default empty TriggerField.onTriggerClick function to display the DatePicker + onTriggerClick : function(){ + if(this.disabled){ + return; + } + if(this.menu == null){ + this.menu = new Ext.menu.DateMenu(); + } + Ext.apply(this.menu.picker, { + minDate : this.minValue, + maxDate : this.maxValue, + disabledDatesRE : this.ddMatch, + disabledDatesText : this.disabledDatesText, + disabledDays : this.disabledDays, + disabledDaysText : this.disabledDaysText, + format : this.format, + minText : String.format(this.minText, this.formatDate(this.minValue)), + maxText : String.format(this.maxText, this.formatDate(this.maxValue)) + }); + this.menu.on(Ext.apply({}, this.menuListeners, { + scope:this + })); + this.menu.picker.setValue(this.getValue() || new Date()); + this.menu.show(this.el, "tl-bl?"); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/form/Field.js b/www/extras/yui-ext/source/widgets/form/Field.js new file mode 100644 index 000000000..a24ebea6d --- /dev/null +++ b/www/extras/yui-ext/source/widgets/form/Field.js @@ -0,0 +1,497 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.form.Field + * @extends Ext.Component + * Base class for form fields that provides default event handling, sizing, value handling and other functionality. + * @constructor + * Creates a new Field + * @param {Object} config Configuration options + */ +Ext.form.Field = function(config){ + Ext.form.Field.superclass.constructor.call(this, config); + this.addEvents({ + /** + * @event focus + * Fires when this field receives input focus + * @param {Ext.form.Field} this + */ + focus : true, + /** + * @event blur + * Fires when + * @param {Ext.form.Field} this + */ + blur : true, + /** + * @event specialkey + * Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can check + * {@link Ext.EventObject#getKey} to determine which key was pressed. + * @param {Ext.form.Field} this + * @param {Ext.EventObject} e The event object + */ + specialkey : true, + /** + * @event change + * Fires just before the field blurs if the field value has changed + * @param {Ext.form.Field} this + * @param {Mixed} value The changed value + * @param {Mixed} value The original value + */ + change : true, + /** + * @event invalid + * Fires after the field has been marked as invalid + * @param {Ext.form.Field} this + * @param {String} msg The validation message + */ + invalid : true, + /** + * @event valid + * Fires after the field has been validated with no errors + * @param {Ext.form.Field} this + */ + valid : true + }); +}; + +Ext.extend(Ext.form.Field, Ext.Component, { + /** + * @cfg {String} invalidClass The CSS class to use when marking a field invalid (defaults to "x-form-invalid") + */ + invalidClass : "x-form-invalid", + /** + * @cfg {String} invalidText The error text to use when marking a field invalid and no message is provided (defaults to "The value in this field is invalid") + */ + invalidText : "The value in this field is invalid", + /** + * @cfg {String} focusClass The CSS class to use when the field receives focus (defaults to "x-form-focus") + */ + focusClass : "x-form-focus", + /** + * @cfg {String/Boolean} validationEvent The event that should initiate field validation. Set to false to disable + automatic validation. (defaults to "keyup") + */ + validationEvent : "keyup", + /** + * @cfg {String/Boolean} validateOnBlur Defaults to true. + */ + validateOnBlur : true, + /** + * @cfg {Number} validationDelay The length of time in milliseconds after user input begins until validation is initiated (defaults to 250) + */ + validationDelay : 250, + /** + * @cfg {String/Object} autoCreate A DomHelper element spec, or true for a default element spec (defaults to + * {tag: "input", type: "text", size: "20", autocomplete: "off"}) + */ + defaultAutoCreate : {tag: "input", type: "text", size: "20", autocomplete: "off"}, + /** + * @cfg {String} fieldClass The default CSS class for the field (defaults to "x-form-field") + */ + fieldClass: "x-form-field", + /** + * @cfg {String} msgTarget The location where error text should display. Should be one of the following values (defaults to 'qtip'): + *
          +Value         Description
          +-----------   ----------------------------------------------------------------------
          +qtip          Display a quick tip when the user hovers over the field
          +title         Display a default browser title attribute popup
          +under         Add a block div beneath the field containing the error text
          +side          Add an error icon to the right of the field with a popup on hover
          +[element id]  Add the error text directly to the innerHTML of the specified element
          +
          + */ + msgTarget: 'qtip', + /** + * @cfg {String} msgFx Experimental The effect used when displaying a validation message under the field (defaults to 'normal'). + */ + msgFx : 'normal', + + /** + * @cfg {String} inputType The type attribute for input fields - e.g. radio, text, password. (defaults to "text") + */ + inputType : undefined, + + // private + isFormField : true, + + // private + hasFocus : false, + + /** + * @cfg {Mixed} value A value to initialize this field with + */ + value : undefined, + + + /** + * Returns the name attribute of the field if available + * @return {String} name The field name + */ + getName: function(){ + return this.rendered && this.el.dom.name ? this.el.dom.name : (this.hiddenName || ''); + }, + + /** + * Apply the behaviors of this component to an existing element. This is used instead of render(). + * @param {String/HTMLElement/Element} el The id of the node, a DOM Node or an existing Element + * @return {Ext.form.Field} this + */ + applyTo : function(target){ + this.target = target; + this.el = Ext.get(target); + this.render(this.el.dom.parentNode); + return this; + }, + + // private + onRender : function(ct, position){ + if(this.el){ + this.el = Ext.get(this.el); + if(!this.target){ + ct.dom.appendChild(this.el.dom); + } + }else { + var cfg = this.getAutoCreate(); + if(!cfg.name){ + cfg.name = this.name || this.id; + } + if(this.inputType){ + cfg.type = this.inputType; + } + if(this.tabIndex !== undefined){ + cfg.tabIndex = this.tabIndex; + } + this.el = ct.createChild(cfg, position); + } + var type = this.el.dom.type; + if(type){ + if(type == 'password'){ + type = 'text'; + } + this.el.addClass('x-form-'+type); + } + if(!this.customSize && (this.width || this.height)){ + this.setSize(this.width || "", this.height || ""); + } + if(this.readOnly){ + this.el.dom.readOnly = true; + } + + this.el.addClass([this.fieldClass, this.cls]); + this.initValue(); + }, + + // private + initValue : function(){ + if(this.value !== undefined){ + this.setValue(this.value); + }else if(this.el.dom.value.length > 0){ + this.setValue(this.el.dom.value); + } + }, + + // private + afterRender : function(){ + Ext.form.Field.superclass.afterRender.call(this); + this.initEvents(); + }, + + // private + fireKey : function(e){ + if(e.isNavKeyPress()){ + this.fireEvent("specialkey", this, e); + } + }, + + /** + * Resets the current field value to the originally-loaded value and clears any validation messages + */ + reset : function(){ + this.setValue(this.originalValue); + this.clearInvalid(); + }, + + // private + initEvents : function(){ + this.el.on(Ext.isIE ? "keydown" : "keypress", this.fireKey, this); + this.el.on("focus", this.onFocus, this); + this.el.on("blur", this.onBlur, this); + + // reference to original value for reset + this.originalValue = this.getValue(); + }, + + // private + onFocus : function(){ + if(!Ext.isOpera){ // don't touch in Opera + this.el.addClass(this.focusClass); + } + this.hasFocus = true; + this.startValue = this.getValue(); + this.fireEvent("focus", this); + }, + + // private + onBlur : function(){ + this.el.removeClass(this.focusClass); + this.hasFocus = false; + if(this.validationEvent !== false && this.validateOnBlur && this.validationEvent != "blur"){ + this.validate(); + } + var v = this.getValue(); + if(v != this.startValue){ + this.fireEvent('change', this, v, this.startValue); + } + this.fireEvent("blur", this); + }, + + /** + * Sets the height and width of the field + * @param {Number} width The new field width in pixels + * @param {Number} height The new field height in pixels + */ + setSize : function(w, h){ + if(!this.rendered || !this.el){ + this.width = w; + this.height = h; + return; + } + if(w){ + w = this.adjustWidth(this.el.dom.tagName, w); + this.el.setWidth(w); + } + if(h){ + this.el.setHeight(h); + } + var h = this.el.dom.offsetHeight; // force browser recalc + }, + + /** + * Returns whether or not the field value is currently valid + * @param {Boolean} preventMark True to disable marking the field invalid + * @return {Boolean} True if the value is valid, else false + */ + isValid : function(preventMark){ + if(this.disabled){ + return true; + } + var restore = this.preventMark; + this.preventMark = preventMark === true; + var v = this.validateValue(this.getRawValue()); + this.preventMark = restore; + return v; + }, + + /** + * Validates the field value + * @return {Boolean} True if the value is valid, else false + */ + validate : function(){ + if(this.disabled || this.validateValue(this.getRawValue())){ + this.clearInvalid(); + return true; + } + return false; + }, + + // private + // Subclasses should provide the validation implementation by overriding this + validateValue : function(value){ + return true; + }, + + /** + * Mark this field as invalid + * @param {String} msg The validation message + */ + markInvalid : function(msg){ + if(!this.rendered || this.preventMark){ // not rendered + return; + } + this.el.addClass(this.invalidClass); + msg = msg || this.invalidText; + switch(this.msgTarget){ + case 'qtip': + this.el.dom.qtip = msg; + this.el.dom.qclass = 'x-form-invalid-tip'; + break; + case 'title': + this.el.dom.title = msg; + break; + case 'under': + if(!this.errorEl){ + var elp = this.el.findParent('.x-form-element', 5, true); + this.errorEl = elp.createChild({cls:'x-form-invalid-msg'}); + this.errorEl.setWidth(elp.getWidth(true)-20); + } + this.errorEl.update(msg); + Ext.form.Field.msgFx[this.msgFx].show(this.errorEl, this); + break; + case 'side': + if(!this.errorIcon){ + var elp = this.el.findParent('.x-form-element', 5, true); + this.errorIcon = elp.createChild({cls:'x-form-invalid-icon'}); + } + this.alignErrorIcon(); + this.errorIcon.dom.qtip = msg; + this.errorIcon.dom.qclass = 'x-form-invalid-tip'; + this.errorIcon.show(); + break; + default: + var t = Ext.getDom(this.msgTarget); + t.innerHTML = msg; + t.style.display = this.msgDisplay; + break; + } + this.fireEvent('invalid', this, msg); + }, + + // private + alignErrorIcon : function(){ + this.errorIcon.alignTo(this.el, 'tl-tr', [2, 0]); + }, + + /** + * Clear any invalid styles/messages for this field + */ + clearInvalid : function(){ + if(!this.rendered || this.preventMark){ // not rendered + return; + } + this.el.removeClass(this.invalidClass); + switch(this.msgTarget){ + case 'qtip': + this.el.dom.qtip = ''; + break; + case 'title': + this.el.dom.title = ''; + break; + case 'under': + if(this.errorEl){ + Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl, this); + } + break; + case 'side': + if(this.errorIcon){ + this.errorIcon.dom.qtip = ''; + this.errorIcon.hide(); + } + break; + default: + var t = Ext.getDom(this.msgTarget); + t.innerHTML = ''; + t.style.display = 'none'; + break; + } + this.fireEvent('valid', this); + }, + + /** + * Returns the raw data value which may or may not be a valid, defined value. To return a normalized value see {@link #getValue}. + * @return {Mixed} value The field value + */ + getRawValue : function(){ + return this.el.getValue(); + }, + + /** + * Returns the normalized data value (undefined or emptyText will be returned as ''). To return the raw value see {@link #getRawValue}. + * @return {Mixed} value The field value + */ + getValue : function(){ + var v = this.el.getValue(); + if(v == this.emptyText || v === undefined){ + v = ''; + } + return v; + }, + + /** + * Sets the underlying DOM field's value directly, bypassing validation. To set the value with validation see {@link #setValue}. + * @param {Mixed} value The value to set + */ + setRawValue : function(v){ + return this.el.dom.value = v; + }, + + /** + * Sets a data value into the field and validates it. To set the value directly without validation see {@link #setRawValue}. + * @param {Mixed} value The value to set + */ + setValue : function(v){ + this.value = v; + if(this.rendered){ + this.el.dom.value = v; + this.validate(); + } + }, + + // private + adjustWidth : function(tag, w){ + tag = tag.toLowerCase(); + if(typeof w == 'number' && Ext.isStrict && !Ext.isSafari){ + if(Ext.isIE && (tag == 'input' || tag == 'textarea')){ + if(tag == 'input'){ + return w + 2; + } + if(tag = 'textarea'){ + return w-2; + } + }else if(Ext.isGecko && tag == 'textarea'){ + return w-6; + }else if(Ext.isOpera){ + if(tag == 'input'){ + return w + 2; + } + if(tag = 'textarea'){ + return w-2; + } + } + } + return w; + } +}); + + +// anything other than normal should be considered experimental +Ext.form.Field.msgFx = { + normal : { + show: function(msgEl, f){ + msgEl.setDisplayed('block'); + }, + + hide : function(msgEl, f){ + msgEl.setDisplayed(false).update(''); + } + }, + + slide : { + show: function(msgEl, f){ + msgEl.slideIn('t', {stopFx:true}); + }, + + hide : function(msgEl, f){ + msgEl.slideOut('t', {stopFx:true,useDisplay:true}); + } + }, + + slideRight : { + show: function(msgEl, f){ + msgEl.fixDisplay(); + msgEl.alignTo(f.el, 'tl-tr'); + msgEl.slideIn('l', {stopFx:true}); + }, + + hide : function(msgEl, f){ + msgEl.slideOut('l', {stopFx:true,useDisplay:true}); + } + } +}; diff --git a/www/extras/yui-ext/source/widgets/form/Form.js b/www/extras/yui-ext/source/widgets/form/Form.js new file mode 100644 index 000000000..77daf452d --- /dev/null +++ b/www/extras/yui-ext/source/widgets/form/Form.js @@ -0,0 +1,295 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.form.Form + * @extends Ext.form.BasicForm + * Adds the ability to dynamically render forms with JS to {@link Ext.form.BasicForm}. + * @constructor + * @param {Object} config Configuration options + */ +Ext.form.Form = function(config){ + Ext.form.Form.superclass.constructor.call(this, null, config); + this.url = this.url || this.action; + if(!this.root){ + this.root = new Ext.form.Layout(Ext.applyIf({ + id: Ext.id() + }, config)); + } + this.active = this.root; + /** + * Array of all the buttons that have been added to this form via addButton + * @type Array + */ + this.buttons = []; + this.addEvents({ + /** + * @event clientvalidation + * If the monitorValid config option is true, this event fires repetitively to notify of valid state + * @param {Form} this + * @param {Boolean} valid true if the form has passed client-side validation + */ + clientvalidation: true + }); +}; + +Ext.extend(Ext.form.Form, Ext.form.BasicForm, { + /** + * @cfg {Number} labelWidth The width of labels. This property cascades to child containers. + */ + /** + * @cfg {String} itemCls A css class to apply to the x-form-item of fields. This property cascades to child containers. + */ + /** + * @cfg {String} buttonAlign Valid values are "left," "center" and "right" (defaults to "center") + */ + buttonAlign:'center', + + /** + * @cfg {Number} minButtonWidth Minimum width of all buttons (defaults to 75) + */ + minButtonWidth:75, + + /** + * @cfg {String} labelAlign Valid values are "left," "top" and "right" (defaults to "left"). + * This property cascades to child containers if not set. + */ + labelAlign:'left', + + /** + * @cfg {Boolean} monitorValid If true the form monitors it's valid state client-side and + * fires a looping event with that state. This is required to bind buttons to the valid + * state using the config value bindForm:true on the button. + */ + monitorValid : false, + + /** + * @cfg {Number} monitorPoll The milliseconds to poll valid state, ignored if monitorValid is not true (defaults to 200) + */ + monitorPoll : 200, + + /** + * Opens the a new {@link Ext.form.Column} container in the layout stack. If fields are passed after the config, the + * fields are added and the column is closed. If no fields are passed the column remains open + * until end() is called. + * @param {Object} config The config to pass to the column + * @param {Field} field1 (optional) + * @param {Field} field2 (optional) + * @param {Field} etc (optional) + * @return Column The column container object + */ + column : function(c){ + var col = new Ext.form.Column(c); + this.start(col); + if(arguments.length > 1){ // duplicate code required because of Opera + this.add.apply(this, Array.prototype.slice.call(arguments, 1)); + this.end(); + } + return col; + }, + + /** + * Opens the a new {@link Ext.form.FieldSet} container in the layout stack. If fields are passed after the config, the + * fields are added and the fieldset is closed. If no fields are passed the fieldset remains open + * until end() is called. + * @param {Object} config The config to pass to the fieldset + * @param {Field} field1 (optional) + * @param {Field} field2 (optional) + * @param {Field} etc (optional) + * @return FieldSet The fieldset container object + */ + fieldset : function(c){ + var fs = new Ext.form.FieldSet(c); + this.start(fs); + if(arguments.length > 1){ // duplicate code required because of Opera + this.add.apply(this, Array.prototype.slice.call(arguments, 1)); + this.end(); + } + return fs; + }, + + /** + * Opens the a new {@link Ext.form.Layout} container in the layout stack. If fields are passed after the config, the + * fields are added and the container is closed. If no fields are passed the container remains open + * until end() is called. + * @param {Object} config The config to pass to the Layout + * @param {Field} field1 (optional) + * @param {Field} field2 (optional) + * @param {Field} etc (optional) + * @return Layout The container object + */ + container : function(c){ + var l = new Ext.form.Layout(c); + this.start(l); + if(arguments.length > 1){ // duplicate code required because of Opera + this.add.apply(this, Array.prototype.slice.call(arguments, 1)); + this.end(); + } + return l; + }, + + /** + * Opens the passed container in the layout stack. The container can be any {@link Ext.form.Layout} or subclass. + * @param {Object} container A Ext.form.Layout or subclass of Layout + * @return {Form} this + */ + start : function(c){ + // cascade label info + Ext.applyIf(c, {'labelAlign': this.active.labelAlign, 'labelWidth': this.active.labelWidth, 'itemCls': this.active.itemCls}); + this.active.stack.push(c); + c.ownerCt = this.active; + this.active = c; + return this; + }, + + /** + * Closes the current open container + * @return {Form} this + */ + end : function(){ + if(this.active == this.root){ + return this; + } + this.active = this.active.ownerCt; + return this; + }, + + /** + * Add Ext.form components to the current open container (e.g. column, fieldset, etc) + * @param {Field} field1 + * @param {Field} field2 (optional) + * @param {Field} etc (optional) + * @return {Form} this + */ + add : function(){ + this.active.stack.push.apply(this.active.stack, arguments); + var r = []; + for(var i = 0, a = arguments, len = a.length; i < len; i++) { + if(a[i].isFormField){ + r.push(a[i]); + } + } + if(r.length > 0){ + Ext.form.Form.superclass.add.apply(this, r); + } + return this; + }, + + /** + * Render this form into the passed container. This should only be called once! + * @param {String/HTMLElement/Element} container The element this component should be rendered into + * @return {Form} this + */ + render : function(ct){ + ct = Ext.get(ct); + var o = this.autoCreate || { + tag: 'form', + method : this.method || 'POST', + id : this.id || Ext.id() + }; + this.initEl(ct.createChild(o)); + + this.root.render(this.el); + + this.items.each(function(f){ + f.render('x-form-el-'+f.id); + }); + + if(this.buttons.length > 0){ + // tables are required to maintain order and for correct IE layout + var tb = this.el.createChild({cls:'x-form-btns-ct', cn: { + cls:"x-form-btns x-form-btns-"+this.buttonAlign, + html:'
          ' + }}, null, true); + var tr = tb.getElementsByTagName('tr')[0]; + for(var i = 0, len = this.buttons.length; i < len; i++) { + var b = this.buttons[i]; + var td = document.createElement('td'); + td.className = 'x-form-btn-td'; + b.render(tr.appendChild(td)); + } + } + if(this.monitorValid){ // initialize after render + this.startMonitoring(); + } + return this; + }, + + /** + * Adds a button to the footer of the form - this must be called before the form is rendered. + * @param {String/Object} config A string becomes the button text, an object can either be a Button config + * object or a valid 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 {Ext.Button} + */ + addButton : function(config, handler, scope){ + var bc = { + handler: handler, + scope: scope, + minWidth: this.minButtonWidth, + hideParent:true + }; + if(typeof config == "string"){ + bc.text = config; + }else{ + Ext.apply(bc, config); + } + var btn = new Ext.Button(null, bc); + this.buttons.push(btn); + return btn; + }, + + /** + * Starts monitoring of the valid state of this form. Usually this is don't by passing the config + * option "monitorValid" + */ + startMonitoring : function(){ + if(!this.bound){ + this.bound = true; + Ext.TaskMgr.start({ + run : this.bindHandler, + interval : this.monitorPoll || 200, + scope: this + }); + } + }, + + /** + * Stops monitoring of the valid state of this form + */ + stopMonitoring : function(){ + this.bound = false; + }, + + // private + bindHandler : function(){ + if(!this.bound){ + return false; // stops binding + } + var valid = true; + this.items.each(function(f){ + if(!f.isValid(true)){ + valid = false; + return false; + } + }); + for(var i = 0, len = this.buttons.length; i < len; i++){ + var btn = this.buttons[i]; + if(btn.formBind === true && btn.disabled === valid){ + btn.setDisabled(!valid); + } + } + this.fireEvent('clientvalidation', this, valid); + } +}); + + +// back compat +Ext.Form = Ext.form.Form; + diff --git a/www/extras/yui-ext/source/widgets/form/Layout.js b/www/extras/yui-ext/source/widgets/form/Layout.js new file mode 100644 index 000000000..a798e9f58 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/form/Layout.js @@ -0,0 +1,201 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.form.Layout + * @extends Ext.Component + * Creates a container for layout and rendering of fields in an {@link Ext.form.Form}. + * @constructor + * @param {Object} config Configuration options + */ +Ext.form.Layout = function(config){ + Ext.form.Layout.superclass.constructor.call(this, config); + this.stack = []; +}; + +Ext.extend(Ext.form.Layout, Ext.Component, { + /** + * @cfg {String/Object} autoCreate + * A DomHelper element spec used to autocreate the layout (defaults to {tag: 'div', cls: 'x-form-ct'}) + */ + /** + * @cfg {String/Object/Function} style + * A style specification string eg "width:100px", or object in the form {width:"100px"}, or + * a function which returns such a specification. + */ + /** + * @cfg {String} labelAlign + * Valid values are "left," "top" and "right" (defaults to "left") + */ + /** + * @cfg {Number} labelWidth + * Fixed width in pixels of all field labels (defaults to undefined) + */ + /** + * @cfg {Boolean} clear + * True to add a clearing element at the end of this layout, equivalent to CSS clear: both (defaults to true) + */ + clear : true, + /** + * @cfg {String} labelSeparator + * The separator to use after field labels (defaults to ':') + */ + labelSeparator : ':', + /** + * @cfg {Boolean} hideLabels + * True to suppress the display of field labels in this layout (defaults to false) + */ + hideLabels : false, + + // private + defaultAutoCreate : {tag: 'div', cls: 'x-form-ct'}, + + // private + onRender : function(ct, position){ + if(this.el){ // from markup + this.el = Ext.get(this.el); + }else { // generate + var cfg = this.getAutoCreate(); + this.el = ct.createChild(cfg, position); + } + if(this.style){ + this.el.applyStyles(this.style); + } + if(this.labelAlign){ + this.el.addClass('x-form-label-'+this.labelAlign); + } + if(this.hideLabels){ + this.labelStyle = "display:none"; + this.elementStyle = "padding-left:0;"; + }else{ + if(typeof this.labelWidth == 'number'){ + this.labelStyle = "width:"+this.labelWidth+"px;"; + this.elementStyle = "padding-left:"+((this.labelWidth+(typeof this.labelPad == 'number' ? this.labelPad : 5))+'px')+";"; + } + if(this.labelAlign == 'top'){ + this.labelStyle = "width:auto;"; + this.elementStyle = "padding-left:0;"; + } + } + var stack = this.stack; + var slen = stack.length; + if(slen > 0){ + if(!this.fieldTpl){ + var t = new Ext.Template( + '
          ', + '', + '
          ', + '
          ', + '
          ' + ); + t.disableFormats = true; + t.compile(); + Ext.form.Layout.prototype.fieldTpl = t; + } + for(var i = 0; i < slen; i++) { + if(stack[i].isFormField){ + this.renderField(stack[i]); + }else{ + this.renderComponent(stack[i]); + } + } + } + if(this.clear){ + this.el.createChild({cls:'x-form-clear'}); + } + }, + + // private + renderField : function(f){ + this.fieldTpl.append(this.el, [ + f.id, f.fieldLabel, + f.labelStyle||this.labelStyle||'', + this.elementStyle||'', + typeof f.labelSeparator == 'undefined' ? this.labelSeparator : f.labelSeparator, + f.itemCls||this.itemCls||'' + ]); + }, + + // private + renderComponent : function(c){ + c.render(this.el); + } +}); + +/** + * @class Ext.form.Column + * @extends Ext.form.Layout + * Creates a column container for layout and rendering of fields in an {@link Ext.form.Form}. + * @constructor + * @param {Object} config Configuration options + */ +Ext.form.Column = function(config){ + Ext.form.Column.superclass.constructor.call(this, config); +}; + +Ext.extend(Ext.form.Column, Ext.form.Layout, { + /** + * @cfg {Number} width + * The fixed width of the column in pixels (defaults to auto) + */ + /** + * @cfg {String/Object} autoCreate + * A DomHelper element spec used to autocreate the column (defaults to {tag: 'div', cls: 'x-form-ct x-form-column'}) + */ + + // private + defaultAutoCreate : {tag: 'div', cls: 'x-form-ct x-form-column'}, + + // private + onRender : function(ct, position){ + Ext.form.Column.superclass.onRender.call(this, ct, position); + if(this.width){ + this.el.setWidth(this.width); + } + } +}); + +/** + * @class Ext.form.FieldSet + * @extends Ext.form.Layout + * Creates a fieldset container for layout and rendering of fields in an {@link Ext.form.Form}. + * @constructor + * @param {Object} config Configuration options + */ +Ext.form.FieldSet = function(config){ + Ext.form.FieldSet.superclass.constructor.call(this, config); +}; + +Ext.extend(Ext.form.FieldSet, Ext.form.Layout, { + /** + * @cfg {String} legend + * The text to display as the legend for the FieldSet (defaults to '') + */ + /** + * @cfg {String/Object} autoCreate + * A DomHelper element spec used to autocreate the fieldset (defaults to {tag: 'fieldset', cn: {tag:'legend'}}) + */ + + // private + defaultAutoCreate : {tag: 'fieldset', cn: {tag:'legend'}}, + + // private + onRender : function(ct, position){ + Ext.form.FieldSet.superclass.onRender.call(this, ct, position); + if(this.legend){ + this.setLegend(this.legend); + } + }, + + // private + setLegend : function(text){ + if(this.rendered){ + this.el.child('legend').update(text); + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/form/NumberField.js b/www/extras/yui-ext/source/widgets/form/NumberField.js new file mode 100644 index 000000000..9fb357dd1 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/form/NumberField.js @@ -0,0 +1,138 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.form.NumberField + * @extends Ext.form.TextField + * Numeric text field that provides automatic keystroke filtering and numeric validation. + * @constructor + * Creates a new NumberField + * @param {Object} config Configuration options + */ +Ext.form.NumberField = function(config){ + Ext.form.NumberField.superclass.constructor.call(this, config); +}; + +Ext.extend(Ext.form.NumberField, Ext.form.TextField, { + /** + * @cfg {String} fieldClass The default CSS class for the field (defaults to "x-form-field x-form-num-field") + */ + fieldClass: "x-form-field x-form-num-field", + /** + * @cfg {Boolean} allowDecimals False to disallow decimal values (defaults to true) + */ + allowDecimals : true, + /** + * @cfg {String} decimalSeparator Character(s) to allow as the decimal separator (defaults to '.') + */ + decimalSeparator : ".", + /** + * @cfg {Number} decimalPrecision The maximum precision to display after the decimal separator (defaults to 2) + */ + decimalPrecision : 2, + /** + * @cfg {Boolean} allowNegative False to require only positive numbers (defaults to true) + */ + allowNegative : true, + /** + * @cfg {Number} minValue The minimum allowed value (defaults to Number.NEGATIVE_INFINITY) + */ + minValue : Number.NEGATIVE_INFINITY, + /** + * @cfg {Number} maxValue The maximum allowed value (defaults to Number.MAX_VALUE) + */ + maxValue : Number.MAX_VALUE, + /** + * @cfg {String} minText Error text to display if the minimum value validation fails (defaults to "The minimum value for this field is {minValue}") + */ + minText : "The minimum value for this field is {0}", + /** + * @cfg {String} maxText Error text to display if the maximum value validation fails (defaults to "The maximum value for this field is {maxValue}") + */ + maxText : "The maximum value for this field is {0}", + /** + * @cfg {String} nanText Error text to display if the value is not a valid number. For example, this can happen + * if a valid character like '.' or '-' is left in the field with no number (defaults to "{value} is not a valid number") + */ + nanText : "{0} is not a valid number", + + // private + initEvents : function(){ + Ext.form.NumberField.superclass.initEvents.call(this); + var allowed = "0123456789"; + if(this.allowDecimals){ + allowed += this.decimalSeparator; + } + if(this.allowNegative){ + allowed += "-"; + } + var keyPress = function(e){ + var k = e.getKey(); + if(!Ext.isIE && (e.isNavKeyPress() || k == e.BACKSPACE || (k == e.DELETE && e.button == -1))){ + return; + } + var c = e.getCharCode(); + if(allowed.indexOf(String.fromCharCode(c)) === -1){ + e.stopEvent(); + } + }; + this.el.on("keypress", keyPress, this); + }, + + // private + validateValue : function(value){ + if(!Ext.form.NumberField.superclass.validateValue.call(this, value)){ + return false; + } + if(value.length < 1){ // if it's blank and textfield didn't flag it then it's valid + return true; + } + value = String(value).replace(this.decimalSeparator, "."); + if(isNaN(value)){ + this.markInvalid(String.format(this.nanText, value)); + return false; + } + var num = this.parseValue(value); + if(num < this.minValue){ + this.markInvalid(String.format(this.minText, this.minValue)); + return false; + } + if(num > this.maxValue){ + this.markInvalid(String.format(this.maxText, this.maxValue)); + return false; + } + return true; + }, + + // private + parseValue : function(value){ + return parseFloat(String(value).replace(this.decimalSeparator, ".")); + }, + + // private + 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); + }, + + // private + decimalPrecisionFcn : function(v){ + return Math.floor(v); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/form/Radio.js b/www/extras/yui-ext/source/widgets/form/Radio.js new file mode 100644 index 000000000..83781d250 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/form/Radio.js @@ -0,0 +1,23 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.form.Radio + * @extends Ext.form.Checkbox + * Single radio field. Same as Checkbox, but provided as a convenience for automatically setting the input type. + * Radio grouping is handled automatically by the browser if you give each radio in a group the same name. + * @constructor + * Creates a new Radio + * @param {Object} config Configuration options + */ +Ext.form.Radio = function(){ + Ext.form.Radio.superclass.constructor.apply(this, arguments); +}; +Ext.extend(Ext.form.Radio, Ext.form.Checkbox, { + inputType: 'radio' +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/form/TextArea.js b/www/extras/yui-ext/source/widgets/form/TextArea.js new file mode 100644 index 000000000..53c019bff --- /dev/null +++ b/www/extras/yui-ext/source/widgets/form/TextArea.js @@ -0,0 +1,108 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.form.TextArea + * @extends Ext.form.TextField + * Multiline text field. Can be used as a direct replacement for traditional textarea fields, plus adds + * support for auto-sizing. + * @constructor + * Creates a new TextArea + * @param {Object} config Configuration options + */ +Ext.form.TextArea = function(config){ + Ext.form.TextArea.superclass.constructor.call(this, config); + // these are provided exchanges for backwards compat + // minHeight/maxHeight were replaced by growMin/growMax to be + // compatible with TextField growing config values + if(this.minHeight !== undefined){ + this.growMin = this.minHeight; + } + if(this.maxHeight !== undefined){ + this.growMax = this.maxHeight; + } +}; + +Ext.extend(Ext.form.TextArea, Ext.form.TextField, { + /** + * @cfg {Number} growMin The minimum height to allow when grow = true (defaults to 60) + */ + growMin : 60, + /** + * @cfg {Number} growMax The maximum height to allow when grow = true (defaults to 1000) + */ + growMax: 1000, + /** + * @cfg {Boolean} preventScrollbars True to prevent scrollbars from appearing regardless of how much text is + * in the field (equivalent to setting overflow: hidden, defaults to false) + */ + preventScrollbars: false, + + // private + onRender : function(ct, position){ + if(!this.el){ + this.defaultAutoCreate = { + tag: "textarea", + style:"width:300px;height:60px;", + autocomplete: "off" + }; + } + Ext.form.TextArea.superclass.onRender.call(this, ct, position); + if(this.grow){ + this.textSizeEl = Ext.DomHelper.append(document.body, { + tag: "pre", cls: "x-form-grow-sizer" + }); + if(this.preventScrollbars){ + this.el.setStyle("overflow", "hidden"); + } + this.el.setHeight(this.growMin); + } + }, + + // private + onKeyUp : function(e){ + if(!e.isNavKeyPress() || e.getKey() == e.ENTER){ + this.autoSize(); + } + }, + + /** + * Automatically grows the field to accomodate the height of the text up to the maximum field height allowed. + * This only takes effect if grow = true and fires the autosize event. + */ + autoSize : function(){ + if(!this.grow || !this.textSizeEl){ + return; + } + var el = this.el; + var v = el.dom.value; + var ts = this.textSizeEl; + Ext.fly(ts).setWidth(this.el.getWidth()); + if(v.length < 1){ + v = "  "; + }else{ + v += " \n "; + } + if(Ext.isIE){ + v = v.replace(/\n/g, '
          '); + } + ts.innerHTML = v; + var h = Math.min(this.growMax, Math.max(ts.offsetHeight, this.growMin)); + if(h != this.lastHeight){ + this.lastHeight = h; + this.el.setHeight(h); + this.fireEvent("autosize", this, h); + } + }, + + // private + setValue : function(v){ + Ext.form.TextArea.superclass.setValue.call(this, v); + this.autoSize(); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/form/TextField.js b/www/extras/yui-ext/source/widgets/form/TextField.js new file mode 100644 index 000000000..1464eb14b --- /dev/null +++ b/www/extras/yui-ext/source/widgets/form/TextField.js @@ -0,0 +1,288 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.form.TextField + * @extends Ext.form.Field + * Basic text field. Can be used as a direct replacement for traditional text inputs, or as the base + * class for more sophisticated input controls (like {@link Ext.form.TextArea} and {@link Ext.form.ComboBox}). + * @constructor + * Creates a new TextField + * @param {Object} config Configuration options + */ +Ext.form.TextField = function(config){ + Ext.form.TextField.superclass.constructor.call(this, config); + this.addEvents({ + /** + * @event autosize + * Fires when the autosize function is triggered. The field may or may not have actually changed size + * according to the default logic, but this event provides a hook for the developer to apply additional + * logic at runtime to resize the field if needed. + * @param {Ext.form.Field} this This text field + * @param {Number} width The new field width + */ + autosize : true + }); +}; + +Ext.extend(Ext.form.TextField, Ext.form.Field, { + /** + * @cfg {Boolean} grow True if this field should automatically grow and shrink to its content + */ + grow : false, + /** + * @cfg {Number} growMin The minimum width to allow when grow = true (defaults to 30) + */ + growMin : 30, + /** + * @cfg {Number} growMax The maximum width to allow when grow = true (defaults to 800) + */ + growMax : 800, + /** + * @cfg {String} vtype A validation type name as defined in {@link Ext.form.VTypes} (defaults to null) + */ + vtype : null, + /** + * @cfg {String} maskRe An input mask regular expression that will be used to filter keystrokes that don't match (defaults to null) + */ + maskRe : null, + /** + * @cfg {Boolean} disableKeyFilter True to disable input keystroke filtering (defaults to false) + */ + disableKeyFilter : false, + /** + * @cfg {Boolean} allowBlank False to validate that the value length > 0 (defaults to true) + */ + allowBlank : true, + /** + * @cfg {Number} minLength Minimum input field length required (defaults to 0) + */ + minLength : 0, + /** + * @cfg {Number} maxLength Maximum input field length allowed (defaults to Number.MAX_VALUE) + */ + maxLength : Number.MAX_VALUE, + /** + * @cfg {String} minLengthText Error text to display if the minimum length validation fails (defaults to "The minimum length for this field is {minLength}") + */ + minLengthText : "The minimum length for this field is {0}", + /** + * @cfg {String} maxLengthText Error text to display if the maximum length validation fails (defaults to "The maximum length for this field is {maxLength}") + */ + maxLengthText : "The maximum length for this field is {0}", + /** + * @cfg {Boolean} selectOnFocus True to automatically select any existing field text when the field receives input focus (defaults to false) + */ + selectOnFocus : false, + /** + * @cfg {String} blankText Error text to display if the allow blank validation fails (defaults to "This field is required") + */ + blankText : "This field is required", + /** + * @cfg {Function} validator A custom validation function to be called during field validation (defaults to null). + * If available, this function will be called only after the basic validators all return true, and will be passed the + * current field value and expected to return boolean true if the value is valid or a string error message if invalid. + */ + validator : null, + /** + * @cfg {RegExp} regex A JavaScript RegExp object to be tested against the field value during validation (defaults to null). + * If available, this regex will be evaluated only after the basic validators all return true, and will be passed the + * current field value. If the test fails, the field will be marked invalid using {@link #regexText}. + */ + regex : null, + /** + * @cfg {String} regexText The error text to display if {@link #regex} is used and the test fails during validation (defaults to "") + */ + regexText : "", + /** + * @cfg {String} emptyText The default text to display in an empty field (defaults to null). + */ + emptyText : null, + /** + * @cfg {String} emptyClass The CSS class to apply to an empty field to style the {@link #emptyText} (defaults to + * 'x-form-empty-field'). This class is automatically added and removed as needed depending on the current field value. + */ + emptyClass : 'x-form-empty-field', + + // private + initEvents : function(){ + Ext.form.TextField.superclass.initEvents.call(this); + if(this.validationEvent == 'keyup'){ + this.validationTask = new Ext.util.DelayedTask(this.validate, this); + this.el.on('keyup', this.filterValidation, this); + } + else if(this.validationEvent !== false){ + this.el.on(this.validationEvent, this.validate, this, {buffer: this.validationDelay}); + } + if(this.selectOnFocus || this.emptyText){ + this.on("focus", this.preFocus, this); + if(this.emptyText){ + this.on('blur', this.postBlur, this); + this.applyEmptyText(); + } + } + if(this.maskRe || (this.vtype && this.disableKeyFilter !== true && (this.maskRe = Ext.form.VTypes[this.vtype+'Mask']))){ + this.el.on("keypress", this.filterKeys, this); + } + if(this.grow){ + this.el.on("keyup", this.onKeyUp, this, {buffer:50}); + this.el.on("click", this.autoSize, this); + } + }, + + filterValidation : function(e){ + if(!e.isNavKeyPress()){ + this.validationTask.delay(this.validationDelay); + } + }, + + // private + onKeyUp : function(e){ + if(!e.isNavKeyPress()){ + this.autoSize(); + } + }, + + /** + * Resets the current field value to the originally-loaded value and clears any validation messages. + * Also adds emptyText and emptyClass if the original value was blank. + */ + reset : function(){ + Ext.form.TextField.superclass.reset.call(this); + this.applyEmptyText(); + }, + + applyEmptyText : function(){ + if(this.rendered && this.emptyText && this.getRawValue().length < 1){ + this.setRawValue(this.emptyText); + this.el.addClass(this.emptyClass); + } + }, + + // private + preFocus : function(){ + if(this.emptyText){ + if(this.getRawValue() == this.emptyText){ + this.setRawValue(''); + } + this.el.removeClass(this.emptyClass); + } + if(this.selectOnFocus){ + this.el.dom.select(); + } + }, + + // private + postBlur : function(){ + this.applyEmptyText(); + }, + + // private + filterKeys : function(e){ + var k = e.getKey(); + if(!Ext.isIE && (e.isNavKeyPress() || k == e.BACKSPACE || (k == e.DELETE && e.button == -1))){ + return; + } + var c = e.getCharCode(); + if(!this.maskRe.test(String.fromCharCode(c) || '')){ + e.stopEvent(); + } + }, + + setValue : function(v){ + if(this.emptyText && v !== undefined && v !== null && v !== ''){ + this.el.removeClass(this.emptyClass); + } + Ext.form.TextField.superclass.setValue.apply(this, arguments); + }, + + /** + * Validates a value according to the field's validation rules and marks the field as invalid + * if the validation fails + * @param {Mixed} value The value to validate + * @return {Boolean} True if the value is valid, else false + */ + validateValue : function(value){ + if(value.length < 1 || value === this.emptyText){ // if it's blank + if(this.allowBlank){ + this.clearInvalid(); + return true; + }else{ + this.markInvalid(this.blankText); + return false; + } + } + if(value.length < this.minLength){ + this.markInvalid(String.format(this.minLengthText, this.minLength)); + return false; + } + if(value.length > this.maxLength){ + this.markInvalid(String.format(this.maxLengthText, this.maxLength)); + return false; + } + if(this.vtype){ + var vt = Ext.form.VTypes; + if(!vt[this.vtype](value)){ + this.markInvalid(this.vtypeText || vt[this.vtype +'Text']); + return false; + } + } + if(typeof this.validator == "function"){ + var msg = this.validator(value); + if(msg !== true){ + this.markInvalid(msg); + return false; + } + } + if(this.regex && !this.regex.test(value)){ + this.markInvalid(this.regexText); + return false; + } + return true; + }, + + /** + * Selects text in this field + * @param {Number} start (optional) The index where the selection should start (defaults to 0) + * @param {Number} end (optional) The index where the selection should end (defaults to the text length) + */ + selectText : function(start, end){ + var v = this.getRawValue(); + if(v.length > 0){ + start = start === undefined ? 0 : start; + end = end === undefined ? v.length : end; + var d = this.el.dom; + if(d.setSelectionRange){ + d.setSelectionRange(start, end); + }else if(d.createTextRange){ + var range = d.createTextRange(); + range.moveStart("character", start); + range.moveEnd("character", v.length-end); + range.select(); + } + } + }, + + /** + * Automatically grows the field to accomodate the width of the text up to the maximum field width allowed. + * This only takes effect if grow = true and fires the autosize event. + */ + autoSize : function(){ + if(!this.grow || !this.rendered){ + return; + } + if(!this.metrics){ + this.metrics = Ext.util.TextMetrics.createInstance(this.el); + } + var el = this.el; + var v = el.dom.value + " "; + var w = Math.min(this.growMax, Math.max(this.metrics.getWidth(v) + /* add extra padding */ 10, this.growMin)); + this.el.setWidth(w); + this.fireEvent("autosize", this, w); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/form/TriggerField.js b/www/extras/yui-ext/source/widgets/form/TriggerField.js new file mode 100644 index 000000000..a0df990a6 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/form/TriggerField.js @@ -0,0 +1,199 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.form.TriggerField + * @extends Ext.form.TextField + * Provides a convenient wrapper for TextFields that adds a clickable trigger button (looks like a combobox by default). + * The trigger has no default action, so you must assign a function to implement the trigger click handler by + * overriding {@link #onTriggerClick}. You can create a TriggerField directly, as it renders exactly like a combobox + * for which you can provide a custom implementation. For example: + *
          
          +var trigger = new Ext.form.TriggerField();
          +trigger.onTriggerClick = myTriggerFn;
          +trigger.applyTo('my-field');
          +
          + * + * However, in general you will most likely want to use TriggerField as the base class for a reusable component. + * {@link Ext.form.DateField} and {@link Ext.form.ComboBox} are perfect examples of this. + * @cfg {String} triggerClass An additional CSS class used to style the trigger button. The trigger will always get the + * class 'x-form-trigger' by default and triggerClass will be appended if specified. + * @constructor + * Create a new TriggerField. + * @param {Object} config Configuration options (valid {@Ext.form.TextField} config options will also be applied + * to the base TextField) + */ +Ext.form.TriggerField = function(config){ + Ext.form.TriggerField.superclass.constructor.call(this, config); + this.mimicing = false; + this.on('disable', this.disableWrapper, this); + this.on('enable', this.enableWrapper, this); +}; + +Ext.extend(Ext.form.TriggerField, Ext.form.TextField, { + /** + * @cfg {String/Object} autoCreate A DomHelper element spec, or true for a default element spec (defaults to + * {tag: "input", type: "text", size: "16", autocomplete: "off"}) + */ + + // private + defaultAutoCreate : {tag: "input", type: "text", size: "16", autocomplete: "off"}, + /** + * @cfg {Boolean} hideTrigger True to hide the trigger element and display only the base text field (defaults to false) + */ + hideTrigger:false, + + /** @cfg {Boolean} grow @hide */ + /** @cfg {Number} growMin @hide */ + /** @cfg {Number} growMax @hide */ + + /** + * @hide + * @method + */ + autoSize: Ext.emptyFn, + + monitorTab : true, + + // private + customSize : true, + + // private + setSize : function(w, h){ + if(!this.wrap){ + this.width = w; + this.height = h; + return; + } + if(w){ + var wrapWidth = w; + w = w - this.trigger.getWidth(); + Ext.form.TriggerField.superclass.setSize.call(this, w, h); + this.wrap.setWidth(wrapWidth); + if(this.onResize){ + this.onResize(wrapWidth, h); + } + }else{ + Ext.form.TriggerField.superclass.setSize.call(this, w, h); + this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth()); + } + }, + + // private + alignErrorIcon : function(){ + this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]); + }, + + // private + onRender : function(ct, position){ + Ext.form.TriggerField.superclass.onRender.call(this, ct, position); + this.wrap = this.el.wrap({cls: "x-form-field-wrap"}); + this.trigger = this.wrap.createChild({ + tag: "img", src: Ext.BLANK_IMAGE_URL, cls: "x-form-trigger "+this.triggerClass}); + this.trigger.on("click", this.onTriggerClick, this, {preventDefault:true}); + this.trigger.addClassOnOver('x-form-trigger-over'); + this.trigger.addClassOnClick('x-form-trigger-click'); + if(this.hideTrigger){ + this.trigger.setDisplayed(false); + } + this.setSize(this.width||'', this.height||''); + }, + + onDestroy : function(){ + if(this.trigger){ + this.trigger.removeAllListeners(); + this.trigger.remove(); + } + if(this.wrap){ + this.wrap.remove(); + } + Ext.form.TriggerField.superclass.onDestroy.call(this); + }, + + // private + onFocus : function(){ + Ext.form.TriggerField.superclass.onFocus.call(this); + if(!this.mimicing){ + this.mimicing = true; + Ext.get(Ext.isIE ? document.body : document).on("mousedown", this.mimicBlur, this); + if(this.monitorTab){ + this.el.on("keydown", this.checkTab, this); + } + } + }, + + // private + checkTab : function(e){ + if(e.getKey() == e.TAB){ + this.triggerBlur(); + } + }, + + // private + onBlur : function(){ + // do nothing + }, + + // private + mimicBlur : function(e, t){ + if(!this.wrap.contains(t) && this.validateBlur()){ + this.triggerBlur(); + } + }, + + // private + triggerBlur : function(){ + this.mimicing = false; + Ext.get(Ext.isIE ? document.body : document).un("mousedown", this.mimicBlur); + if(this.monitorTab){ + this.el.un("keydown", this.checkTab, this); + } + Ext.form.TriggerField.superclass.onBlur.call(this); + }, + + // private + // This should be overriden by any subclass that needs to check whether or not the field can be blurred. + validateBlur : function(e, t){ + return true; + }, + + // private + disableWrapper : function(){ + if(this.wrap){ + this.wrap.addClass('x-item-disabled'); + } + }, + + // private + enableWrapper : function(){ + if(this.wrap){ + this.wrap.removeClass('x-item-disabled'); + } + }, + + // private + onShow : function(){ + if(this.wrap){ + this.wrap.dom.style.display = ''; + this.wrap.dom.style.visibility = 'visible'; + } + }, + + // private + onHide : function(){ + this.wrap.dom.style.display = 'none'; + }, + + /** + * The function that should handle the trigger's click event. This method does nothing by default until overridden + * by a handler implementation. + * @method + * @param {EventObject} e + */ + onTriggerClick : Ext.emptyFn +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/form/VTypes.js b/www/extras/yui-ext/source/widgets/form/VTypes.js new file mode 100644 index 000000000..5dfd88526 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/form/VTypes.js @@ -0,0 +1,90 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.form.VTypes + * Overrideable validation definitions. The validations provided are basic and intended to be easily customizable and extended. + * @singleton + */ +Ext.form.VTypes = function(){ + // closure these in so they are only created once. + var alpha = /^[a-zA-Z_]+$/; + var alphanum = /^[a-zA-Z0-9_]+$/; + var email = /^([\w]+)(.[\w]+)*@([\w-]+\.){1,5}([A-Za-z]){2,4}$/; + var url = /(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i; + + // All these messages and functions are configurable + return { + /** + * The function used to validate email addresses + * @param {String} value The email address + */ + 'email' : function(v){ + return email.test(v); + }, + /** + * The error text to display when the email validation function returns false + * @type String + */ + 'emailText' : 'This field should be an e-mail address in the format "user@domain.com"', + /** + * The keystroke filter mask to be applied on email input + * @type RegExp + */ + 'emailMask' : /[a-z0-9_\.\-@]/i, + + /** + * The function used to validate urls + * @param {String} value The url + */ + 'url' : function(v){ + return url.test(v); + }, + /** + * The error text to display when the url validation function returns false + * @type String + */ + 'urlText' : 'This field should be a URL in the format "http:/'+'/www.domain.com"', + + /** + * The function used to validate alpha values + * @param {String} value The value + */ + 'alpha' : function(v){ + return alpha.test(v); + }, + /** + * The error text to display when the alpha validation function returns false + * @type String + */ + 'alphaText' : 'This field should only contain letters and _', + /** + * The keystroke filter mask to be applied on alpha input + * @type RegExp + */ + 'alphaMask' : /[a-z_]/i, + + /** + * The function used to validate alphanumeric values + * @param {String} value The value + */ + 'alphanum' : function(v){ + return alphanum.test(v); + }, + /** + * The error text to display when the alphanumeric validation function returns false + * @type String + */ + 'alphanumText' : 'This field should only contain letters, numbers and _', + /** + * The keystroke filter mask to be applied on alphanumeric input + * @type RegExp + */ + 'alphanumMask' : /[a-z0-9_]/i + }; +}(); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/grid/AbstractGridView.js b/www/extras/yui-ext/source/widgets/grid/AbstractGridView.js new file mode 100644 index 000000000..797f080a5 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/grid/AbstractGridView.js @@ -0,0 +1,96 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.grid.AbstractGridView = function(){ + this.grid = null; + + this.events = { + "beforerowremoved" : true, + "beforerowsinserted" : true, + "beforerefresh" : true, + "rowremoved" : true, + "rowsinserted" : true, + "rowupdated" : true, + "refresh" : true + }; + Ext.grid.AbstractGridView.superclass.constructor.call(this); +}; + +Ext.extend(Ext.grid.AbstractGridView, Ext.util.Observable, { + rowClass : "x-grid-row", + cellClass : "x-grid-cell", + tdClass : "x-grid-td", + hdClass : "x-grid-hd", + splitClass : "x-grid-hd-split", + + init: function(grid){ + this.grid = grid; + var cid = this.grid.container.id; + this.colSelector = "#" + cid + " ." + this.cellClass + "-"; + this.tdSelector = "#" + cid + " ." + this.tdClass + "-"; + this.hdSelector = "#" + cid + " ." + this.hdClass + "-"; + this.splitSelector = "#" + cid + " ." + this.splitClass + "-"; + }, + + getColumnRenderers : function(){ + var renderers = []; + var cm = this.grid.colModel; + var colCount = cm.getColumnCount(); + for(var i = 0; i < colCount; i++){ + renderers[i] = cm.getRenderer(i); + } + return renderers; + }, + + getColumnIds : function(){ + var ids = []; + var cm = this.grid.colModel; + var colCount = cm.getColumnCount(); + for(var i = 0; i < colCount; i++){ + ids[i] = cm.getColumnId(i); + } + return ids; + }, + + 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]; + }, + + /** + * 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 + " .x-grid-col-" + colIndex; + Ext.util.CSS.updateRule(selector, name, value); + }, + + generateRules : function(cm){ + var ruleBuf = []; + for(var i = 0, len = cm.getColumnCount(); i < len; i++){ + var cid = cm.getColumnId(i); + ruleBuf.push(this.colSelector, cid, " {\n", cm.config[i].css, "}\n", + this.tdSelector, cid, " {\n}\n", + this.hdSelector, cid, " {\n}\n", + this.splitSelector, cid, " {\n}\n"); + } + return Ext.util.CSS.createStyleSheet(ruleBuf.join("")); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/grid/AbstractSelectionModel.js b/www/extras/yui-ext/source/widgets/grid/AbstractSelectionModel.js new file mode 100644 index 000000000..545bfc467 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/grid/AbstractSelectionModel.js @@ -0,0 +1,47 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + @class Ext.grid.AbstractSelectionModel + @extends Ext.util.Observable + @constructor + */ +Ext.grid.AbstractSelectionModel = function(){ + this.locked = false; + Ext.grid.AbstractSelectionModel.superclass.constructor.call(this); +}; + +Ext.extend(Ext.grid.AbstractSelectionModel, Ext.util.Observable, { + /** @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; + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/grid/CellSelectionModel.js b/www/extras/yui-ext/source/widgets/grid/CellSelectionModel.js new file mode 100644 index 000000000..96a891e6b --- /dev/null +++ b/www/extras/yui-ext/source/widgets/grid/CellSelectionModel.js @@ -0,0 +1,227 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + @class Ext.grid.CellSelectionModel + * @extends Ext.grid.AbstractSelectionModel + @constructor + * @param {Object} config + */ +Ext.grid.CellSelectionModel = function(config){ + Ext.apply(this, config); + + this.selection = null; + + this.addEvents({ + /** + * @event beforerowselect + * Fires before a cell is selected. + * @param {SelectionModel} this + * @param {Number} rowIndex The selected row index + * @param {Number} colIndex The selected cell index + */ + "beforecellselect" : true, + /** + * @event cellselect + * Fires when a cell is selected. + * @param {SelectionModel} this + * @param {Number} rowIndex The selected row index + * @param {Number} colIndex The selected cell index + */ + "cellselect" : true, + /** + * @event selectionchange + * Fires when the active selection changes. + * @param {SelectionModel} this + * @param {Object} selection null for no selection or an object (o) with two properties +
            +
          • o.record: the record object for the row the selection is in
          • +
          • o.cell: An array of [rowIndex, columnIndex]
          • +
          + */ + "selectionchange" : true + }); +}; + +Ext.extend(Ext.grid.CellSelectionModel, Ext.grid.AbstractSelectionModel, { + + /** @ignore */ + initEvents : function(){ + this.grid.on("mousedown", this.handleMouseDown, this); + this.grid.container.on(Ext.isIE ? "keydown" : "keypress", this.handleKeyDown, this); + var view = this.grid.view; + view.on("refresh", this.onViewChange, this); + view.on("rowupdated", this.onRowUpdated, this); + view.on("beforerowremoved", this.clearSelections, this); + view.on("beforerowsinserted", this.clearSelections, this); + if(this.grid.isEditor){ + this.grid.on("beforeedit", this.beforeEdit, this); + } + }, + + beforeEdit : function(e){ + this.select(e.row, e.column, false, true, e.record); + }, + + onRowUpdated : function(v, index, r){ + if(this.selection && this.selection.record == r){ + v.onCellSelect(index, this.selection.cell[1]); + } + }, + + onViewChange : function(){ + this.clearSelections(true); + }, + + getSelectedCell : function(){ + return this.selection ? this.selection.cell : null; + }, + + /** + * Clears all selections. + */ + clearSelections : function(preventNotify){ + var s = this.selection; + if(s){ + if(preventNotify !== true){ + this.grid.view.onCellDeselect(s.cell[0], s.cell[1]); + } + this.selection = null; + this.fireEvent("selectionchange", this, null); + } + }, + + /** + * Returns True if there is a selection. + * @return {Boolean} + */ + hasSelection : function(){ + return this.selection ? true : false; + }, + + /** @ignore */ + handleMouseDown : function(e, t){ + var v = this.grid.getView(); + if(this.isLocked()){ + return; + }; + var row = v.findRowIndex(t); + var cell = v.findCellIndex(t); + if(row !== false && cell !== false){ + this.select(row, cell); + } + }, + + /** + * Selects a cell. + * @param {Number} rowIndex + * @param {Number} collIndex + */ + select : function(rowIndex, colIndex, preventViewNotify, preventFocus, /*internal*/ r){ + if(this.fireEvent("beforecellselect", this, rowIndex, colIndex) !== false){ + this.clearSelections(); + r = r || this.grid.dataSource.getAt(rowIndex); + this.selection = { + record : r, + cell : [rowIndex, colIndex] + }; + if(!preventViewNotify){ + var v = this.grid.getView(); + v.onCellSelect(rowIndex, colIndex); + if(preventFocus !== true){ + v.focusCell(rowIndex, colIndex); + } + } + this.fireEvent("cellselect", this, rowIndex, colIndex); + this.fireEvent("selectionchange", this, this.selection); + } + }, + + isSelectable : function(rowIndex, colIndex, cm){ + return !cm.isHidden(colIndex); + }, + + /** @ignore */ + handleKeyDown : function(e){ + if(!e.isNavKeyPress()){ + return; + } + var g = this.grid, s = this.selection; + if(!s){ + e.stopEvent(); + var cell = g.walkCells(0, 0, 1, this.isSelectable, this); + if(cell){ + this.select(cell[0], cell[1]); + } + return; + } + var sm = this; + var walk = function(row, col, step){ + return g.walkCells(row, col, step, sm.isSelectable, sm); + }; + var k = e.getKey(), r = s.cell[0], c = s.cell[1]; + var newCell; + + switch(k){ + case e.TAB: + if(e.shiftKey){ + newCell = walk(r, c-1, -1); + }else{ + newCell = walk(r, c+1, 1); + } + break; + case e.DOWN: + newCell = walk(r+1, c, 1); + break; + case e.UP: + newCell = walk(r-1, c, -1); + break; + case e.RIGHT: + newCell = walk(r, c+1, 1); + break; + case e.LEFT: + newCell = walk(r, c-1, -1); + break; + case e.ENTER: + if(g.isEditor && !g.editing){ + g.startEditing(r, c); + e.stopEvent(); + return; + } + break; + }; + if(newCell){ + this.select(newCell[0], newCell[1]); + e.stopEvent(); + } + }, + + acceptsNav : function(row, col, cm){ + return !cm.isHidden(col) && cm.isCellEditable(col, row); + }, + + onEditorKey : function(field, e){ + var k = e.getKey(), newCell, g = this.grid, ed = g.activeEditor; + if(k == e.TAB){ + if(e.shiftKey){ + newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this); + }else{ + newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this); + } + e.stopEvent(); + }else if(k == e.ENTER && !e.ctrlKey){ + ed.completeEdit(); + e.stopEvent(); + }else if(k == e.ESC){ + ed.cancelEdit(); + } + if(newCell){ + g.startEditing(newCell[0], newCell[1]); + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/grid/ColumnDD.js b/www/extras/yui-ext/source/widgets/grid/ColumnDD.js new file mode 100644 index 000000000..aad0ee790 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/grid/ColumnDD.js @@ -0,0 +1,196 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +// private +// This is a support class used internally by the Grid components +Ext.grid.HeaderDragZone = function(grid, hd, hd2){ + this.grid = grid; + this.view = grid.getView(); + this.ddGroup = "gridHeader" + this.grid.container.id; + Ext.grid.HeaderDragZone.superclass.constructor.call(this, hd); + if(hd2){ + this.setHandleElId(Ext.id(hd)); + this.setOuterHandleElId(Ext.id(hd2)); + } + this.scroll = false; +}; +Ext.extend(Ext.grid.HeaderDragZone, Ext.dd.DragZone, { + maxDragWidth: 120, + getDragData : function(e){ + var t = Ext.lib.Event.getTarget(e); + var h = this.view.findHeaderCell(t); + if(h){ + return {ddel: h.firstChild, header:h}; + } + return false; + }, + + onInitDrag : function(e){ + this.view.headersDisabled = true; + var clone = this.dragData.ddel.cloneNode(true); + clone.style.width = Math.min(this.dragData.header.offsetWidth,this.maxDragWidth) + "px"; + this.proxy.update(clone); + return true; + }, + + afterValidDrop : function(){ + var v = this.view; + setTimeout(function(){ + v.headersDisabled = false; + }, 50); + }, + + afterInvalidDrop : function(){ + var v = this.view; + setTimeout(function(){ + v.headersDisabled = false; + }, 50); + } +}); + +// private +// This is a support class used internally by the Grid components +Ext.grid.HeaderDropZone = function(grid, hd, hd2){ + this.grid = grid; + this.view = grid.getView(); + // split the proxies so they don't interfere with mouse events + this.proxyTop = Ext.DomHelper.append(document.body, { + tag:"div", cls:"col-move-top", html:" " + }, true); + this.proxyBottom = Ext.DomHelper.append(document.body, { + tag:"div", cls:"col-move-bottom", html:" " + }, true); + this.proxyTop.hide = this.proxyBottom.hide = function(){ + this.setLeftTop(-100,-100); + this.setStyle("visibility", "hidden"); + }; + this.ddGroup = "gridHeader" + this.grid.container.id; + // temporarily disabled + //Ext.dd.ScrollManager.register(this.view.scroller.dom); + Ext.grid.HeaderDropZone.superclass.constructor.call(this, grid.container.dom); +}; +Ext.extend(Ext.grid.HeaderDropZone, Ext.dd.DropZone, { + proxyOffsets : [-4, -9], + fly: Ext.Element.fly, + + getTargetFromEvent : function(e){ + var t = Ext.lib.Event.getTarget(e); + var cindex = this.view.findCellIndex(t); + if(cindex !== false){ + return this.view.getHeaderCell(cindex); + } + }, + + nextVisible : function(h){ + var v = this.view, cm = this.grid.colModel; + h = h.nextSibling; + while(h){ + if(!cm.isHidden(v.getCellIndex(h))){ + return h; + } + h = h.nextSibling; + } + return null; + }, + + prevVisible : function(h){ + var v = this.view, cm = this.grid.colModel; + h = h.prevSibling; + while(h){ + if(!cm.isHidden(v.getCellIndex(h))){ + return h; + } + h = h.prevSibling; + } + return null; + }, + + positionIndicator : function(h, n, e){ + var x = Ext.lib.Event.getPageX(e); + var r = Ext.lib.Dom.getRegion(n.firstChild); + var px, pt, py = r.top + this.proxyOffsets[1]; + if((r.right - x) <= (r.right-r.left)/2){ + px = r.right+this.view.borderWidth; + pt = "after"; + }else{ + px = r.left; + pt = "before"; + } + var oldIndex = this.view.getCellIndex(h); + var newIndex = this.view.getCellIndex(n); + var locked = this.grid.colModel.isLocked(newIndex); + if(pt == "after"){ + newIndex++; + } + if(oldIndex < newIndex){ + newIndex--; + } + if(oldIndex == newIndex && (locked == this.grid.colModel.isLocked(oldIndex))){ + return false; + } + px += this.proxyOffsets[0]; + this.proxyTop.setLeftTop(px, py); + this.proxyTop.show(); + if(!this.bottomOffset){ + this.bottomOffset = this.view.mainHd.getHeight(); + } + this.proxyBottom.setLeftTop(px, py+this.proxyTop.dom.offsetHeight+this.bottomOffset); + this.proxyBottom.show(); + return pt; + }, + + onNodeEnter : function(n, dd, e, data){ + if(data.header != n){ + this.positionIndicator(data.header, n, e); + } + }, + + onNodeOver : function(n, dd, e, data){ + var result = false; + if(data.header != n){ + result = this.positionIndicator(data.header, n, e); + } + if(!result){ + this.proxyTop.hide(); + this.proxyBottom.hide(); + } + return result ? this.dropAllowed : this.dropNotAllowed; + }, + + onNodeOut : function(n, dd, e, data){ + this.proxyTop.hide(); + this.proxyBottom.hide(); + }, + + onNodeDrop : function(n, dd, e, data){ + var h = data.header; + if(h != n){ + var cm = this.grid.colModel; + var x = Ext.lib.Event.getPageX(e); + var r = Ext.lib.Dom.getRegion(n.firstChild); + var pt = (r.right - x) <= ((r.right-r.left)/2) ? "after" : "before"; + var oldIndex = this.view.getCellIndex(h); + var newIndex = this.view.getCellIndex(n); + var locked = cm.isLocked(newIndex); + if(pt == "after"){ + newIndex++; + } + if(oldIndex < newIndex){ + newIndex--; + } + if(oldIndex == newIndex && (locked == cm.isLocked(oldIndex))){ + return false; + } + cm.setLocked(oldIndex, locked, true); + cm.moveColumn(oldIndex, newIndex); + this.grid.fireEvent("columnmove", oldIndex, newIndex); + return true; + } + return false; + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/grid/ColumnModel.js b/www/extras/yui-ext/source/widgets/grid/ColumnModel.js new file mode 100644 index 000000000..0b076ba87 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/grid/ColumnModel.js @@ -0,0 +1,449 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.grid.ColumnModel + * @extends Ext.util.Observable + * This is the default implementation of a ColumnModel used by the Grid. It defines + * the columns in the grid. + *
          Usage:
          +
          
          + var colModel = new Ext.grid.ColumnModel([
          +	{header: "Ticker", width: 60, sortable: true, locked: true},
          +	{header: "Company Name", width: 150, sortable: true},
          +	{header: "Market Cap.", width: 100, sortable: true},
          +	{header: "$ Sales", width: 100, sortable: true, renderer: money},
          +	{header: "Employees", width: 100, sortable: true, resizable: false}
          + ]);
          + 
          + *

          + * The config options listed for this class, are options which may appear in each + * individual column definition. + * @constructor + * @param {Object} config An Array of column config objects. See this class's + * config objects for details. +*/ +Ext.grid.ColumnModel = function(config){ + Ext.grid.ColumnModel.superclass.constructor.call(this); + /** + * The config passed into the constructor + */ + this.config = config; + this.lookup = {}; + + // if id, create one + // if the column does not have a dataIndex mapping, + // map it to the order it is in the config + for(var i = 0, len = config.length; i < len; i++){ + if(typeof config[i].dataIndex == "undefined"){ + config[i].dataIndex = i; + } + if(typeof config[i].renderer == "string"){ + config[i].renderer = Ext.util.Format[config[i].renderer]; + } + if(typeof config[i].id == "undefined"){ + config[i].id = i; + } + this.lookup[config[i].id] = config[i]; + } + + /** + * 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; + + this.addEvents({ + /** + * @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": true, + /** + * @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": true, + /** + * @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": true, + /** + * @event columnmoved + * Fires when a column is moved + * @param {ColumnModel} this + * @param {Number} oldIndex + * @param {Number} newIndex + */ + "columnmoved" : true, + /** + * @event columlockchange + * Fires when a column's locked state is changed + * @param {ColumnModel} this + * @param {Number} colIndex + * @param {Boolean} locked true if locked + */ + "columnlockchange" : true + }); + Ext.grid.ColumnModel.superclass.constructor.call(this); +}; +Ext.extend(Ext.grid.ColumnModel, Ext.util.Observable, { + /** + * @cfg header {String} The header text to display in the Grid view. + */ + /** + * @cfg dataIndex {String} The name of the field in the grid's {@link Ext.data.Store}'s + * {@link Ext.data.Record} definition from which to draw the column's value. If not + * specified, the column's index is used as an index into the Record's data Array. + */ + /** + * @cfg width {Number} (Optional) The initial width in pixels of the column. Using this + * instead of {@link Ext.grid.Grid#autoSizeColumns} is more efficient. + */ + /** + * @cfg sortable {Boolean} True if sorting is to be allowed on this column. Defaults to true. + * Whether local/remote sorting is used is specified in {@link Ext.data.Store#remoteSort}. + */ + /** + * @cfg locked {Boolean} True to lock the column in place while scrolling the Grid. + * Defaults to false. + */ + /** + * @cfg resizable {Boolean} False to disable column resizing. Defaults to true. + */ + /** + * @cfg renderer {Function} (Optional) A function used to generate HTML markup for a cell + * given the cell's data value. See {@link #setRenderer}. If not specified, the + * default renderer uses the raw data value. + */ + + /** + * Returns the id of the column at the specified index + * @param {Number} index + * @return {String} the id + */ + getColumnId : function(index){ + return this.config[index].id; + }, + + getColumnById : function(id){ + return this.lookup[id]; + }, + + getIndexById : function(id){ + for(var i = 0, len = this.config.length; i < len; i++){ + if(this.config[i].id == id){ + return i; + } + } + return -1; + }, + + moveColumn : function(oldIndex, newIndex){ + var c = this.config[oldIndex]; + this.config.splice(oldIndex, 1); + this.config.splice(newIndex, 0, c); + this.dataMap = null; + this.fireEvent("columnmoved", this, oldIndex, newIndex); + }, + + isLocked : function(colIndex){ + return this.config[colIndex].locked === true; + }, + + setLocked : function(colIndex, value, suppressEvent){ + if(this.isLocked(colIndex) == value){ + return; + } + this.config[colIndex].locked = value; + if(!suppressEvent){ + this.fireEvent("columnlockchange", this, colIndex, value); + } + }, + + getTotalLockedWidth : function(){ + var totalWidth = 0; + for(var i = 0; i < this.config.length; i++){ + if(this.isLocked(i) && !this.isHidden(i)){ + this.totalWidth += this.getColumnWidth(i); + } + } + return totalWidth; + }, + + getLockedCount : function(){ + for(var i = 0, len = this.config.length; i < len; i++){ + if(!this.isLocked(i)){ + return i; + } + } + }, + + /** + * Returns the number of columns. + * @return {Number} + */ + getColumnCount : function(visibleOnly){ + if(visibleOnly == true){ + var c = 0; + for(var i = 0, len = this.config.length; i < len; i++){ + if(!this.isHidden(i)){ + c++; + } + } + return c; + } + 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 rendering (formatting) function defined for the column. + * @param {Number} col The column index. + * @return {Function} The function used to render the cell. See {@link #setRenderer}. + */ + getRenderer : function(col){ + if(!this.config[col].renderer){ + return Ext.grid.ColumnModel.defaultRenderer; + } + return this.config[col].renderer; + }, + + /** + * Sets the rendering (formatting) function for a column. + * @param {Number} col The column index + * @param {Function} fn The function to use to process the cell's raw data + * to return HTML markup for the grid view. The render function is called with + * the following parameters:

            + *
          • Data value.
          • + *
          • Cell metadata. An object in which you may set the following attributes:
              + *
            • css A CSS style string to apply to the table cell.
            • + *
            • attr An HTML attribute definition string to apply to the data container element within the table cell.
            + *
          • The {@link Ext.data.Record} from which the data was extracted.
          • + *
          • Row index
          • + *
          • Column index
          • + *
          • The {@link Ext.data.Store} object from which the Record was extracted
          + */ + 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.fireEvent("widthchange", 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, len = this.config.length; i < len; 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.fireEvent("headerchange", this, col, header); + }, + + /** + * Returns the tooltip for the specified column. + * @param {Number} col The column index + * @return {String} + */ + getColumnTooltip : function(col){ + return this.config[col].tooltip; + }, + /** + * Sets the tooltip for a column. + * @param {Number} col The column index + * @param {String} tooltip The new tooltip + */ + setColumnTooltip : function(col, tooltip){ + this.config[col].tooltip = tooltip; + }, + + /** + * Returns the dataIndex for the specified column. + * @param {Number} col The column index + * @return {Number} + */ + getDataIndex : function(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; + }, + + findColumnIndex : function(dataIndex){ + var c = this.config; + for(var i = 0, len = c.length; i < len; i++){ + if(c[i].dataIndex == dataIndex){ + return i; + } + } + return -1; + }, + + /** + * 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)) ? true : false; + }, + + /** + * 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 + * @return {Boolean} + */ + isResizable : function(colIndex){ + return this.config[colIndex].resizable !== false; + }, + /** + * Sets if a column is hidden. + * @param {Number} colIndex The column index + * @param {Boolean} hidden True if the column is hidden + */ + setHidden : function(colIndex, hidden){ + this.config[colIndex].hidden = hidden; + this.totalWidth = null; + this.fireEvent("hiddenchange", this, 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; + } +}); + +Ext.grid.ColumnModel.defaultRenderer = function(value){ + if(typeof value == "string" && value.length < 1){ + return " "; + } + return value; +}; + +// Alias for backwards compatibility +Ext.grid.DefaultColumnModel = Ext.grid.ColumnModel; diff --git a/www/extras/yui-ext/source/widgets/grid/ColumnSplitDD.js b/www/extras/yui-ext/source/widgets/grid/ColumnSplitDD.js new file mode 100644 index 000000000..1885e061a --- /dev/null +++ b/www/extras/yui-ext/source/widgets/grid/ColumnSplitDD.js @@ -0,0 +1,64 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +// private +// This is a support class used internally by the Grid components +Ext.grid.SplitDragZone = function(grid, hd, hd2){ + this.grid = grid; + this.view = grid.getView(); + this.proxy = this.view.resizeProxy; + Ext.grid.SplitDragZone.superclass.constructor.call(this, hd, + "gridSplitters" + this.grid.container.id, { + dragElId : Ext.id(this.proxy.dom), resizeFrame:false + }); + this.setHandleElId(Ext.id(hd)); + this.setOuterHandleElId(Ext.id(hd2)); + this.scroll = false; +}; +Ext.extend(Ext.grid.SplitDragZone, Ext.dd.DDProxy, { + fly: Ext.Element.fly, + + b4StartDrag : function(x, y){ + this.view.headersDisabled = true; + this.proxy.setHeight(this.view.mainWrap.getHeight()); + var w = this.cm.getColumnWidth(this.cellIndex); + var minw = Math.max(w-this.grid.minColumnWidth, 0); + this.resetConstraints(); + this.setXConstraint(minw, 1000); + this.setYConstraint(0, 0); + this.minX = x - minw; + this.maxX = x + 1000; + this.startPos = x; + Ext.dd.DDProxy.prototype.b4StartDrag.call(this, x, y); + }, + + + handleMouseDown : function(e){ + ev = Ext.EventObject.setEvent(e); + var t = this.fly(ev.getTarget()); + if(t.hasClass("x-grid-split")){ + this.cellIndex = this.view.getCellIndex(t.dom); + this.split = t.dom; + this.cm = this.grid.colModel; + if(this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)){ + Ext.grid.SplitDragZone.superclass.handleMouseDown.apply(this, arguments); + } + } + }, + + endDrag : function(e){ + this.view.headersDisabled = false; + var endX = Math.max(this.minX, Ext.lib.Event.getPageX(e)); + var diff = endX - this.startPos; + this.view.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex)+diff); + }, + + autoOffset : function(){ + this.setDelta(0,0); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/grid/EditorGrid.js b/www/extras/yui-ext/source/widgets/grid/EditorGrid.js new file mode 100644 index 000000000..d995f337d --- /dev/null +++ b/www/extras/yui-ext/source/widgets/grid/EditorGrid.js @@ -0,0 +1,163 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.grid.EditorGrid + * @extends Ext.grid.Grid + * Class for creating and editable grid. + * @param {String/HTMLElement/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} dataSource The data model to bind to + * @param {Object} colModel The column model with info about this grid's columns + */ +Ext.grid.EditorGrid = function(container, config){ + Ext.grid.EditorGrid.superclass.constructor.call(this, container, config); + this.container.addClass("xedit-grid"); + + if(!this.selModel){ + this.selModel = new Ext.grid.CellSelectionModel(); + } + + this.activeEditor = null; + + this.addEvents({ + /** + * @event beforeedit + * Fires before cell editing is triggered. The edit event object has the following properties
          + *
            + *
          • grid - This grid
          • + *
          • record - The record being edited
          • + *
          • field - The field name being edited
          • + *
          • value - The value for the field being edited.
          • + *
          • row - The grid row index
          • + *
          • column - The grid column index
          • + *
          • cancel - Set this to true to cancel the edit or return false from your handler.
          • + *
          + * @param {Object} e An edit event (see above for description) + */ + "beforeedit" : true, + /** + * @event afteredit + * Fires after a cell is edited.
          + *
            + *
          • grid - This grid
          • + *
          • record - The record being edited
          • + *
          • field - The field name being edited
          • + *
          • value - The value being set
          • + *
          • originalValue - The original value for the field, before the edit.
          • + *
          • row - The grid row index
          • + *
          • column - The grid column index
          • + *
          + * @param {Object} e An edit event (see above for description) + */ + "afteredit" : true, + /** + * @event validateedit + * Fires after a cell is edited, but before the value is set in the record. Return false + * to cancel the change. The edit event object has the following properties
          + *
            + *
          • grid - This grid
          • + *
          • record - The record being edited
          • + *
          • field - The field name being edited
          • + *
          • value - The value being set
          • + *
          • originalValue - The original value for the field, before the edit.
          • + *
          • row - The grid row index
          • + *
          • column - The grid column index
          • + *
          • cancel - Set this to true to cancel the edit or return false from your handler.
          • + *
          + * @param {Object} e An edit event (see above for description) + */ + "validateedit" : true + }); + this.on("bodyscroll", this.stopEditing, this); + this.on(this.clicksToEdit == 1 ? "cellclick" : "celldblclick", this.onCellDblClick, this); +}; + +Ext.extend(Ext.grid.EditorGrid, Ext.grid.Grid, { + isEditor : true, + clicksToEdit: 2, + trackMouseOver: false, // causes very odd FF errors + + onCellDblClick : function(g, row, col){ + this.startEditing(row, col); + }, + + onEditComplete : function(ed, value, startValue){ + this.editing = false; + this.activeEditor = null; + ed.un("specialkey", this.selModel.onEditorKey, this.selModel); + if(String(value) != String(startValue)){ + var r = ed.record; + var field = this.colModel.getDataIndex(ed.col); + var e = { + grid: this, + record: r, + field: field, + originalValue: startValue, + value: value, + row: ed.row, + column: ed.col, + cancel:false + }; + if(this.fireEvent("validateedit", e) !== false && !e.cancel){ + r.set(field, e.value); + delete e.cancel; + this.fireEvent("afteredit", e); + } + } + this.view.focusCell(ed.row, ed.col); + }, + + /** + * Starts editing the specified for the specified row/column + * @param {Number} rowIndex + * @param {Number} colIndex + */ + startEditing : function(row, col){ + this.stopEditing(); + if(this.colModel.isCellEditable(col, row)){ + this.view.focusCell(row, col); + var r = this.dataSource.getAt(row); + var field = this.colModel.getDataIndex(col); + var e = { + grid: this, + record: r, + field: field, + value: r.data[field], + row: row, + column: col, + cancel:false + }; + if(this.fireEvent("beforeedit", e) !== false && !e.cancel){ + this.editing = true; // flag for buffering of orphan key strokes + (function(){ // complex but required for focus issues in safari, ie and opera + var ed = this.colModel.getCellEditor(col, row); + ed.row = row; + ed.col = col; + ed.record = r; + ed.on("complete", this.onEditComplete, this, {single: true}); + ed.on("specialkey", this.selModel.onEditorKey, this.selModel); + this.activeEditor = ed; + var v = r.data[field]; + ed.startEdit(this.view.getCell(row, col), v); + }).defer(50, this); + } + } + }, + + /** + * Stops any active editing + */ + stopEditing : function(){ + if(this.activeEditor){ + this.activeEditor.completeEdit(); + } + this.activeEditor = null; + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/grid/Grid.js b/www/extras/yui-ext/source/widgets/grid/Grid.js new file mode 100644 index 000000000..7fdbfd17e --- /dev/null +++ b/www/extras/yui-ext/source/widgets/grid/Grid.js @@ -0,0 +1,604 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.grid.Grid + * @extends Ext.util.Observable + * This class represents the primary interface of a component based grid control. + *

          Usage:
          
          + var grid = new Ext.grid.Grid("my-container-id", {
          +     ds: myDataStore,
          +     cm: myColModel,
          +     selModel: mySelectionModel,
          +     autoSizeColumns: true,
          +     monitorWindowResize: false,
          +     trackMouseOver: true
          + });
          + // 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 render the grid into an element with display:none. Try using visibility:hidden. Otherwise there is no way for the + * grid to calculate dimensions/offsets.
          + * @constructor + * @param {String/HTMLElement/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} config A config object that sets properties on this grid. + */ +Ext.grid.Grid = function(container, config){ + // initialize the container + this.container = Ext.get(container); + this.container.update(""); + this.container.setStyle("overflow", "hidden"); + this.container.addClass('x-grid-container'); + + this.id = this.container.id; + + Ext.apply(this, config); + // check and correct shorthanded configs + if(this.ds){ + this.dataSource = this.ds; + delete this.ds; + } + if(this.cm){ + this.colModel = this.cm; + delete this.cm; + } + if(this.sm){ + this.selModel = this.sm; + delete this.sm; + } + + if(this.width){ + this.container.setWidth(this.width); + } + + if(this.height){ + this.container.setHeight(this.height); + } + /** @private */ + this.addEvents({ + // raw events + /** + * @event click + * The raw click event for the entire grid. + * @param {Ext.EventObject} e + */ + "click" : true, + /** + * @event dblclick + * The raw dblclick event for the entire grid. + * @param {Ext.EventObject} e + */ + "dblclick" : true, + /** + * @event contextmenu + * The raw contextmenu event for the entire grid. + * @param {Ext.EventObject} e + */ + "contextmenu" : true, + /** + * @event mousedown + * The raw mousedown event for the entire grid. + * @param {Ext.EventObject} e + */ + "mousedown" : true, + /** + * @event mouseup + * The raw mouseup event for the entire grid. + * @param {Ext.EventObject} e + */ + "mouseup" : true, + /** + * @event mouseover + * The raw mouseover event for the entire grid. + * @param {Ext.EventObject} e + */ + "mouseover" : true, + /** + * @event mouseout + * The raw mouseout event for the entire grid. + * @param {Ext.EventObject} e + */ + "mouseout" : true, + /** + * @event keypress + * The raw keypress event for the entire grid. + * @param {Ext.EventObject} e + */ + "keypress" : true, + /** + * @event keydown + * The raw keydown event for the entire grid. + * @param {Ext.EventObject} e + */ + "keydown" : true, + + // custom events + + /** + * @event cellclick + * Fires when a cell is clicked + * @param {Grid} this + * @param {Number} rowIndex + * @param {Number} columnIndex + * @param {Ext.EventObject} e + */ + "cellclick" : true, + /** + * @event celldblclick + * Fires when a cell is double clicked + * @param {Grid} this + * @param {Number} rowIndex + * @param {Number} columnIndex + * @param {Ext.EventObject} e + */ + "celldblclick" : true, + /** + * @event rowclick + * Fires when a row is clicked + * @param {Grid} this + * @param {Number} rowIndex + * @param {Ext.EventObject} e + */ + "rowclick" : true, + /** + * @event rowdblclick + * Fires when a row is double clicked + * @param {Grid} this + * @param {Number} rowIndex + * @param {Ext.EventObject} e + */ + "rowdblclick" : true, + /** + * @event headerclick + * Fires when a header is clicked + * @param {Grid} this + * @param {Number} columnIndex + * @param {Ext.EventObject} e + */ + "headerclick" : true, + /** + * @event headerdblclick + * Fires when a header cell is double clicked + * @param {Grid} this + * @param {Number} rowIndex + * @param {Number} columnIndex + * @param {Ext.EventObject} e + */ + "headerdblclick" : true, + /** + * @event rowcontextmenu + * Fires when a row is right clicked + * @param {Grid} this + * @param {Number} rowIndex + * @param {Ext.EventObject} e + */ + "rowcontextmenu" : true, + /** + * @event cellcontextmenu + * Fires when a cell is right clicked + * @param {Grid} this + * @param {Number} rowIndex + * @param {Number} cellIndex + * @param {Ext.EventObject} e + */ + "cellcontextmenu" : true, + /** + * @event headercontextmenu + * Fires when a header is right clicked + * @param {Grid} this + * @param {Number} columnIndex + * @param {Ext.EventObject} e + */ + "headercontextmenu" : true, + /** + * @event bodyscroll + * Fires when the body element is scrolled + * @param {Number} scrollLeft + * @param {Number} scrollTop + */ + "bodyscroll" : true, + /** + * @event columnresize + * Fires when the user resizes a column + * @param {Number} columnIndex + * @param {Number} newSize + */ + "columnresize" : true, + /** + * @event columnmove + * Fires when the user moves a column + * @param {Number} oldIndex + * @param {Number} newIndex + */ + "columnmove" : true, + /** + * @event startdrag + * Fires when row(s) start being dragged + * @param {Grid} this + * @param {Ext.GridDD} dd The drag drop object + * @param {event} e The raw browser event + */ + "startdrag" : true, + /** + * @event enddrag + * Fires when a drag operation is complete + * @param {Grid} this + * @param {Ext.GridDD} dd The drag drop object + * @param {event} e The raw browser event + */ + "enddrag" : true, + /** + * @event dragdrop + * Fires when dragged row(s) are dropped on a valid DD target + * @param {Grid} this + * @param {Ext.GridDD} dd The drag drop object + * @param {String} targetId The target drag drop object + * @param {event} e The raw browser event + */ + "dragdrop" : true, + /** + * @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 {Ext.GridDD} dd The drag drop object + * @param {String} targetId The target drag drop object + * @param {event} e The raw browser event + */ + "dragover" : true, + /** + * @event dragenter + * Fires when the dragged row(s) first cross another DD target while being dragged + * @param {Grid} this + * @param {Ext.GridDD} dd The drag drop object + * @param {String} targetId The target drag drop object + * @param {event} e The raw browser event + */ + "dragenter" : true, + /** + * @event dragout + * Fires when the dragged row(s) leave another DD target while being dragged + * @param {Grid} this + * @param {Ext.GridDD} dd The drag drop object + * @param {String} targetId The target drag drop object + * @param {event} e The raw browser event + */ + "dragout" : true + }); + + Ext.grid.Grid.superclass.constructor.call(this); +}; +Ext.extend(Ext.grid.Grid, Ext.util.Observable, { + /** + * @cfg {Number} The minimum width a column can be resized to. Defaults to 25. + */ + minColumnWidth : 25, + + /** + * @cfg {Boolean} True to automatically resize the columns to fit their content + * on initial render. It is more efficient to explicitly size the columns + * through the ColumnModel's {@link Ext.grid.ColumnModel#width} config option. + */ + autoSizeColumns : false, + + /** + * @cfg {Boolean} True to measure headers with column data when auto sizing columns. + */ + autoSizeHeaders : true, + + /** + * @cfg {Boolean} True to autoSize the grid when the window resizes. Defaults to true. + */ + monitorWindowResize : true, + + /** + * @cfg {Boolean} 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). + */ + maxRowsToMeasure : 0, + + /** + * @cfg {Boolean} True to highlight rows when the mouse is over. Default is false. + */ + trackMouseOver : true, + + /** + * @cfg {Boolean} True to enable drag and drop of rows. + */ + enableDragDrop : false, + + /** + * @cfg {Boolean} True to enable drag and drop reorder of columns. + */ + enableColumnMove : true, + + /** + * @cfg {Boolean} True to enable hiding of columns with the header context menu. + */ + enableColumnHide : true, + + /** + * @cfg {Boolean} True to manually sync row heights across locked and not locked rows. + */ + enableRowHeightSync : false, + + /** + * @cfg {Boolean} True to stripe the rows. Default is true. + */ + stripeRows : true, + + /** + * @cfg {Boolean} True to fit the height of the grid container to the height of the data. Defaults to false. + */ + autoHeight : false, + + /** + * @cfg {String} The id of a column in this grid that should expand to fill unused space. + */ + autoExpandColumn : false, + + /** + * @cfg {Number} The minimum width the autoExpandColumn can have (if enabled). + * defaults to 50. + */ + autoExpandMin : 50, + + /** + * @cfg {Number} The maximum width the autoExpandColumn can have (if enabled). Defaults to 1000. + */ + autoExpandMax : 1000, + + /** + * @cfg {Object} The {@link Ext.grid.GridView} used by the grid. This can be set before a call to render(). + */ + view : null, + + /** + * @cfg {Object} A javascript RegExp defining tagNames + * allowed to have text selection (Defaults to /INPUT|TEXTAREA|SELECT/i). + */ + allowTextSelectionPattern : /INPUT|TEXTAREA|SELECT/i, + + /** + * @cfg {Object} An {@link Ext.LoadMask} config or true to mask the grid while loading (defaults to false). + */ + loadMask : false, + + // private + rendered : false, + + /** + * Sets the maximum height of the grid - ignored if autoHeight is not on. + * @type Number + */ + /** + * Called once after all setup has been completed and the grid is ready to be rendered. + * @return {Ext.grid.Grid} this + */ + render : function(){ + var c = this.container; + // try to detect autoHeight/width mode + if((!c.dom.offsetHeight || c.dom.offsetHeight < 20) || c.getStyle("height") == "auto"){ + this.autoHeight = true; + } + var view = this.getView(); + view.init(this); + + c.on("click", this.onClick, this); + c.on("dblclick", this.onDblClick, this); + c.on("contextmenu", this.onContextMenu, this); + c.on("keydown", this.onKeyDown, this); + + this.relayEvents(c, ["mousedown","mouseup","mouseover","mouseout","keypress"]); + + this.getSelectionModel().init(this); + + view.render(); + + if(this.loadMask){ + this.loadMask = new Ext.LoadMask(this.container, + Ext.apply({store:this.dataSource}, this.loadMask)); + } + this.rendered = true; + return this; + }, + + reconfigure : function(dataSource, colModel){ + if(this.loadMask){ + this.loadMask.destroy(); + this.loadMask = new Ext.LoadMask(this.container, + Ext.apply({store:dataSource}, this.loadMask)); + } + this.view.bind(dataSource, colModel); + this.dataSource = dataSource; + this.colModel = colModel; + this.view.refresh(true); + }, + + onKeyDown : function(e){ + this.fireEvent("keydown", e); + }, + + /** + * Destroy this grid. + * @param {Boolean} removeEl True to remove the element + */ + destroy : function(removeEl, keepListeners){ + if(this.loadMask){ + this.loadMask.destroy(); + } + var c = this.container; + c.removeAllListeners(); + this.view.destroy(); + this.colModel.purgeListeners(); + if(!keepListeners){ + this.purgeListeners(); + } + c.update(""); + if(removeEl === true){ + c.remove(); + } + }, + + // private + processEvent : function(name, e){ + this.fireEvent(name, e); + var t = e.getTarget(); + var v = this.view; + var header = v.findHeaderIndex(t); + if(header !== false){ + this.fireEvent("header" + name, this, header, e); + }else{ + var row = v.findRowIndex(t); + var cell = v.findCellIndex(t); + if(row !== false){ + this.fireEvent("row" + name, this, row, e); + if(cell !== false){ + this.fireEvent("cell" + name, this, row, cell, e); + } + } + } + }, + + // private + onClick : function(e){ + this.processEvent("click", e); + }, + + // private + onContextMenu : function(e, t){ + this.processEvent("contextmenu", e); + }, + + // private + onDblClick : function(e){ + this.processEvent("dblclick", e); + }, + + walkCells : function(row, col, step, fn, scope){ + var cm = this.colModel, clen = cm.getColumnCount(); + var ds = this.dataSource, rlen = ds.getCount(), first = true; + if(step < 0){ + if(col < 0){ + row--; + first = false; + } + while(row >= 0){ + if(!first){ + col = clen-1; + } + first = false; + while(col >= 0){ + if(fn.call(scope || this, row, col, cm) === true){ + return [row, col]; + } + col--; + } + row--; + } + } else { + if(col >= clen){ + row++; + first = false; + } + while(row < rlen){ + if(!first){ + col = 0; + } + first = false; + while(col < clen){ + if(fn.call(scope || this, row, col, cm) === true){ + return [row, col]; + } + col++; + } + row++; + } + } + return null; + }, + + getSelections : function(){ + return this.selModel.getSelections(); + }, + + /** + * Causes the grid to manually recalculate its dimensions. Generally this is done automatically, + * but if manual update is required this method will initiate it. + */ + autoSize : function(){ + if(this.rendered){ + this.view.layout(); + if(this.view.adjustForScroll){ + this.view.adjustForScroll(); + } + } + }, + + // private for compatibility, overridden by editor grid + stopEditing : function(){}, + + /** + * Returns the grid's SelectionModel. + * @return {SelectionModel} + */ + getSelectionModel : function(){ + if(!this.selModel){ + this.selModel = new Ext.grid.RowSelectionModel(); + } + return this.selModel; + }, + + /** + * Returns the grid's DataSource. + * @return {DataSource} + */ + getDataSource : function(){ + return this.dataSource; + }, + + /** + * Returns the grid's ColumnModel. + * @return {ColumnModel} + */ + getColumnModel : function(){ + return this.colModel; + }, + + /** + * Returns the grid's GridView object. + * @return {GridView} + */ + getView : function(){ + if(!this.view){ + this.view = new Ext.grid.GridView(); + } + return this.view; + }, + /** + * Called to get grid's drag proxy text, by default returns this.ddText. + * @return {String} + */ + getDragDropText : function(){ + var count = this.selModel.getCount(); + return String.format(this.ddText, count, count == 1 ? '' : 's'); + } +}); +/** + * Configures the text is the drag proxy (defaults to "%0 selected row(s)"). + * %0 is replaced with the number of selected rows. + * @type String + */ +Ext.grid.Grid.prototype.ddText = "{0} selected row{1}"; \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/grid/GridDD.js b/www/extras/yui-ext/source/widgets/grid/GridDD.js new file mode 100644 index 000000000..e15891d80 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/grid/GridDD.js @@ -0,0 +1,65 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +// private +// This is a support class used internally by the Grid components +Ext.grid.GridDragZone = function(grid, config){ + this.view = grid.getView(); + Ext.grid.GridDragZone.superclass.constructor.call(this, this.view.lockedBody.dom, config); + this.setHandleElId(Ext.id(this.view.lockedBody.dom)); + this.setOuterHandleElId(Ext.id(this.view.mainBody.dom)); + this.scroll = false; + this.grid = grid; + this.ddel = document.createElement('div'); + this.ddel.className = 'x-grid-dd-wrap'; +}; + +Ext.extend(Ext.grid.GridDragZone, Ext.dd.DragZone, { + ddGroup : "GridDD", + + getDragData : function(e){ + var t = Ext.lib.Event.getTarget(e); + var rowIndex = this.view.findRowIndex(t); + if(rowIndex !== false){ + var sm = this.grid.selModel; + if(!sm.isSelected(rowIndex) || e.hasModifier()){ + sm.handleMouseDown(e, t); + } + return {grid: this.grid, ddel: this.ddel, rowIndex: rowIndex, selections:sm.getSelections()}; + } + return false; + }, + + onInitDrag : function(e){ + var data = this.dragData; + this.ddel.innerHTML = this.grid.getDragDropText(); + this.proxy.update(this.ddel); + // fire start drag? + }, + + afterRepair : function(){ + this.dragging = false; + }, + + getRepairXY : function(e, data){ + return false; + }, + + onEndDrag : function(data, e){ + // fire end drag? + }, + + onValidDrop : function(dd, e, id){ + // fire drag drop? + this.hideProxy(); + }, + + beforeInvalidDrop : function(e, id){ + + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/grid/GridEditor.js b/www/extras/yui-ext/source/widgets/grid/GridEditor.js new file mode 100644 index 000000000..dacf2340e --- /dev/null +++ b/www/extras/yui-ext/source/widgets/grid/GridEditor.js @@ -0,0 +1,23 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +// private +// This is a support class used internally by the Grid components +Ext.grid.GridEditor = function(field, config){ + Ext.grid.GridEditor.superclass.constructor.call(this, field, config); + field.monitorTab = false; +}; + +Ext.extend(Ext.grid.GridEditor, Ext.Editor, { + alignment: "tl-tl", + autoSize: "width", + hideEl : false, + cls: "x-small-editor x-grid-editor", + shim:false, + shadow:"frame" +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/grid/GridView.js b/www/extras/yui-ext/source/widgets/grid/GridView.js new file mode 100644 index 000000000..50a655b21 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/grid/GridView.js @@ -0,0 +1,1512 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.grid.GridView + * @extends AbstractGridView + * The default GridView implementation + * @constructor + * @param {Object} config + */ + +Ext.grid.GridView = function(config){ + Ext.grid.GridView.superclass.constructor.call(this); + this.el = null; + + Ext.apply(this, config); +}; + +Ext.extend(Ext.grid.GridView, Ext.grid.AbstractGridView, { + + /** + * Override this function to apply custom css classes to rows during rendering + * @param {Record} record The record + * @param {Number} index + * @method getRowClass + */ + rowClass : "x-grid-row", + + cellClass : "x-grid-col", + + tdClass : "x-grid-td", + + hdClass : "x-grid-hd", + + splitClass : "x-grid-split", + + sortClasses : ["sort-asc", "sort-desc"], + + enableMoveAnim : false, + + hlColor: "C3DAF9", + + dh : Ext.DomHelper, + + fly : Ext.Element.fly, + + css : Ext.util.CSS, + + borderWidth: 1, + + splitOffset: 3, + + scrollIncrement : 22, + + cellRE: /(?:.*?)x-grid-(?:hd|cell|csplit)-(?:[\d]+)-([\d]+)(?:.*?)/, + + findRE: /\s?(?:x-grid-hd|x-grid-col|x-grid-csplit)\s/, + + bind : function(ds, cm){ + if(this.ds){ + this.ds.un("load", this.onLoad, this); + this.ds.un("datachanged", this.onDataChange); + this.ds.un("add", this.onAdd); + this.ds.un("remove", this.onRemove); + this.ds.un("update", this.onUpdate); + this.ds.un("clear", this.onClear); + } + if(ds){ + ds.on("load", this.onLoad, this); + ds.on("datachanged", this.onDataChange, this); + ds.on("add", this.onAdd, this); + ds.on("remove", this.onRemove, this); + ds.on("update", this.onUpdate, this); + ds.on("clear", this.onClear, this); + } + this.ds = ds; + + if(this.cm){ + this.cm.un("widthchange", this.onColWidthChange, this); + this.cm.un("headerchange", this.onHeaderChange, this); + this.cm.un("hiddenchange", this.onHiddenChange, this); + this.cm.un("columnmoved", this.onColumnMove, this); + this.cm.un("columnlockchange", this.onColumnLock, this); + } + if(cm){ + this.generateRules(cm); + cm.on("widthchange", this.onColWidthChange, this); + cm.on("headerchange", this.onHeaderChange, this); + cm.on("hiddenchange", this.onHiddenChange, this); + cm.on("columnmoved", this.onColumnMove, this); + cm.on("columnlockchange", this.onColumnLock, this); + } + this.cm = cm; + }, + + init: function(grid){ + Ext.grid.GridView.superclass.init.call(this, grid); + + this.bind(grid.dataSource, grid.colModel); + + grid.on("headerclick", this.handleHeaderClick, this); + + if(grid.trackMouseOver){ + grid.on("mouseover", this.onRowOver, this); + grid.on("mouseout", this.onRowOut, this); + } + grid.cancelTextSelection = function(){}; + this.gridId = grid.id; + + var tpls = this.templates || {}; + + if(!tpls.master){ + tpls.master = new Ext.Template( + '
          ', + '
          ', + '
          ', + '
          ', + '
          {lockedHeader}
          ', + '
          {lockedBody}
          ', + "
          ", + '
          ', + '
          {header}
          ', + '
          {body}
          ', + "
          ", + '
          ', + '', + '
           
          ', + "
          " + ); + tpls.master.disableformats = true; + } + + if(!tpls.header){ + tpls.header = new Ext.Template( + '', + '{cells}', + "
          {splits}" + ); + tpls.header.disableformats = true; + } + tpls.header.compile(); + + if(!tpls.hcell){ + tpls.hcell = new Ext.Template( + '
          ', + '
          {value}
          ', + "
          " + ); + tpls.hcell.disableFormats = true; + } + tpls.hcell.compile(); + + if(!tpls.hsplit){ + tpls.hsplit = new Ext.Template('
           
          '); + tpls.hsplit.disableFormats = true; + } + tpls.hsplit.compile(); + + if(!tpls.body){ + tpls.body = new Ext.Template( + '', + "{rows}", + "
          " + ); + tpls.body.disableFormats = true; + } + tpls.body.compile(); + + if(!tpls.row){ + tpls.row = new Ext.Template('{cells}'); + tpls.row.disableFormats = true; + } + tpls.row.compile(); + + if(!tpls.cell){ + tpls.cell = new Ext.Template( + '', + '
          {value}
          ', + "" + ); + tpls.cell.disableFormats = true; + } + tpls.cell.compile(); + + this.templates = tpls; + }, + + // remap these for backwards compat + onColWidthChange : function(){ + this.updateColumns.apply(this, arguments); + }, + onHeaderChange : function(){ + this.updateHeaders.apply(this, arguments); + }, + onHiddenChange : function(){ + this.handleHiddenChange.apply(this, arguments); + }, + onColumnMove : function(){ + this.handleColumnMove.apply(this, arguments); + }, + onColumnLock : function(){ + this.handleLockChange.apply(this, arguments); + }, + + onDataChange : function(){ + this.refresh(); + this.updateHeaderSortState(); + }, + + onClear : function(){ + this.refresh(); + }, + + onUpdate : function(ds, record){ + this.refreshRow(record); + }, + + refreshRow : function(record){ + var ds = this.ds, index; + if(typeof record == 'number'){ + index = record; + record = ds.getAt(index); + }else{ + index = ds.indexOf(record); + } + var rows = this.getRowComposite(index); + var cls = []; + this.insertRows(ds, index, index, true); + this.onRemove(ds, record, index+1, true); + this.syncRowHeights(index, index); + this.layout(); + this.fireEvent("rowupdated", this, index, record); + }, + + onAdd : function(ds, records, index){ + this.insertRows(ds, index, index + (records.length-1)); + }, + + onRemove : function(ds, record, index, isUpdate){ + if(isUpdate !== true){ + this.fireEvent("beforerowremoved", this, index, record); + } + var bt = this.getBodyTable(), lt = this.getLockedTable(); + if(bt.rows[index]){ + bt.firstChild.removeChild(bt.rows[index]); + } + if(lt.rows[index]){ + lt.firstChild.removeChild(lt.rows[index]); + } + if(isUpdate !== true){ + this.stripeRows(index); + this.syncRowHeights(index, index); + this.layout(); + this.fireEvent("rowremoved", this, index, record); + } + }, + + onLoad : function(){ + this.scrollToTop(); + }, + + /** + * Scrolls the grid to the top + */ + scrollToTop : function(){ + if(this.scroller){ + this.scroller.dom.scrollTop = 0; + this.syncScroll(); + } + }, + + /** + * Gets a panel in the header of the grid that can be used for toolbars etc. + * After modifying the contents of this panel a call to grid.autoSize() may be + * required to register any changes in size. + * @param {Boolean} doShow By default the header is hidden. Pass true to show the panel + * @return Ext.Element + */ + getHeaderPanel : function(doShow){ + if(doShow){ + this.headerPanel.show(); + } + return this.headerPanel; + }, + + /** + * Gets a panel in the footer of the grid that can be used for toolbars etc. + * After modifying the contents of this panel a call to grid.autoSize() may be + * required to register any changes in size. + * @param {Boolean} doShow By default the footer is hidden. Pass true to show the panel + * @return Ext.Element + */ + getFooterPanel : function(doShow){ + if(doShow){ + this.footerPanel.show(); + } + return this.footerPanel; + }, + + initElements : function(){ + var E = Ext.Element; + var el = this.grid.container.dom.firstChild; + var cs = el.childNodes; + + this.el = new E(el); + this.headerPanel = new E(el.firstChild); + this.headerPanel.enableDisplayMode("block"); + + this.scroller = new E(cs[1]); + this.scrollSizer = new E(this.scroller.dom.firstChild); + + this.lockedWrap = new E(cs[2]); + this.lockedHd = new E(this.lockedWrap.dom.firstChild); + this.lockedBody = new E(this.lockedWrap.dom.childNodes[1]); + + this.mainWrap = new E(cs[3]); + this.mainHd = new E(this.mainWrap.dom.firstChild); + this.mainBody = new E(this.mainWrap.dom.childNodes[1]); + + this.footerPanel = new E(cs[4]); + this.footerPanel.enableDisplayMode("block"); + + this.focusEl = new E(cs[5]); + this.focusEl.swallowEvent("click", true); + this.resizeProxy = new E(cs[6]); + + this.headerSelector = String.format( + '#{0} td.x-grid-hd, #{1} td.x-grid-hd', + this.lockedHd.id, this.mainHd.id + ); + + this.splitterSelector = String.format( + '#{0} div.x-grid-split, #{1} div.x-grid-split', + this.lockedHd.id, this.mainHd.id + ); + }, + + getHeaderCell : function(index){ + return Ext.DomQuery.select(this.headerSelector)[index]; + }, + + getHeaderCellMeasure : function(index){ + return this.getHeaderCell(index).firstChild; + }, + + getHeaderCellText : function(index){ + return this.getHeaderCell(index).firstChild.firstChild; + }, + + getLockedTable : function(){ + return this.lockedBody.dom.firstChild; + }, + + getBodyTable : function(){ + return this.mainBody.dom.firstChild; + }, + + getLockedRow : function(index){ + return this.getLockedTable().rows[index]; + }, + + getRow : function(index){ + return this.getBodyTable().rows[index]; + }, + + getRowComposite : function(index){ + if(!this.rowEl){ + this.rowEl = new Ext.CompositeElementLite(); + } + var els = [], lrow, mrow; + if(lrow = this.getLockedRow(index)){ + els.push(lrow); + } + if(mrow = this.getRow(index)){ + els.push(mrow); + } + this.rowEl.elements = els; + return this.rowEl; + }, + + getCell : function(rowIndex, colIndex){ + var locked = this.cm.getLockedCount(); + var source; + if(colIndex < locked){ + source = this.lockedBody.dom.firstChild; + }else{ + source = this.mainBody.dom.firstChild; + colIndex -= locked; + } + return source.rows[rowIndex].childNodes[colIndex]; + }, + + getCellText : function(rowIndex, colIndex){ + return this.getCell(rowIndex, colIndex).firstChild.firstChild; + }, + + getCellBox : function(cell){ + var b = this.fly(cell).getBox(); + if(Ext.isOpera){ // opera fails to report the Y + b.y = cell.offsetTop + this.mainBody.getY(); + } + return b; + }, + + getCellIndex : function(cell){ + var id = String(cell.className).match(this.cellRE); + if(id){ + return parseInt(id[1], 10); + } + return 0; + }, + + findHeaderIndex : function(n){ + var r = Ext.fly(n).findParent("td." + this.hdClass, 6); + return r ? this.getCellIndex(r) : false; + }, + + findHeaderCell : function(n){ + var r = Ext.fly(n).findParent("td." + this.hdClass, 6); + return r ? r : false; + }, + + findRowIndex : function(n){ + if(!n){ + return false; + } + var r = Ext.fly(n).findParent("tr." + this.rowClass, 6); + return r ? r.rowIndex : false; + }, + + findCellIndex : function(node){ + var stop = this.el.dom; + while(node && node != stop){ + if(this.findRE.test(node.className)){ + return this.getCellIndex(node); + } + node = node.parentNode; + } + return false; + }, + + getColumnId : function(index){ + return this.cm.getColumnId(index); + }, + + getSplitters : function(){ + if(this.splitterSelector){ + return Ext.DomQuery.select(this.splitterSelector); + }else{ + return null; + } + }, + + getSplitter : function(index){ + return this.getSplitters()[index]; + }, + + onRowOver : function(e, t){ + var row; + if((row = this.findRowIndex(t)) !== false){ + this.getRowComposite(row).addClass("x-grid-row-over"); + } + }, + + onRowOut : function(e, t){ + var row; + if((row = this.findRowIndex(t)) !== false && row !== this.findRowIndex(e.getRelatedTarget())){ + this.getRowComposite(row).removeClass("x-grid-row-over"); + } + }, + + renderHeaders : function(){ + var cm = this.cm; + var ct = this.templates.hcell, ht = this.templates.header, st = this.templates.hsplit; + var cb = [], lb = [], sb = [], lsb = [], p = {}; + for(var i = 0, len = cm.getColumnCount(); i < len; i++){ + p.cellId = "x-grid-hd-0-" + i; + p.splitId = "x-grid-csplit-0-" + i; + p.id = cm.getColumnId(i); + p.title = cm.getColumnTooltip(i) || ""; + p.value = cm.getColumnHeader(i) || ""; + p.style = (this.grid.enableColumnResize === false || !cm.isResizable(i) || cm.isFixed(i)) ? 'cursor:default' : ''; + if(!cm.isLocked(i)){ + cb[cb.length] = ct.apply(p); + sb[sb.length] = st.apply(p); + }else{ + lb[lb.length] = ct.apply(p); + lsb[lsb.length] = st.apply(p); + } + } + return [ht.apply({cells: lb.join(""), splits:lsb.join("")}), + ht.apply({cells: cb.join(""), splits:sb.join("")})]; + }, + + updateHeaders : function(){ + var html = this.renderHeaders(); + this.lockedHd.update(html[0]); + this.mainHd.update(html[1]); + }, + + /** + * Focuses the specified row. + * @param {Number} row The row index + */ + focusRow : function(row){ + var x = this.scroller.dom.scrollLeft; + this.focusCell(row, 0, false); + this.scroller.dom.scrollLeft = x; + }, + + /** + * Focuses the specified cell. + * @param {Number} row The row index + * @param {Number} col The column index + * @param {Boolean} hscroll false to disable horizontal scrolling + */ + focusCell : function(row, col, hscroll){ + var el = this.ensureVisible(row, col, hscroll); + this.focusEl.alignTo(el, "tl-tl"); + if(Ext.isGecko){ + this.focusEl.focus(); + }else{ + this.focusEl.focus.defer(1, this.focusEl); + } + }, + + /** + * Scrolls the specified cell into view + * @param {Number} row The row index + * @param {Number} col The column index + * @param {Boolean} hscroll false to disable horizontal scrolling + */ + ensureVisible : function(row, col, hscroll){ + if(typeof row != "number"){ + row = row.rowIndex; + } + if(row < 0 && row >= this.ds.getCount()){ + return; + } + col = (col !== undefined ? col : 0); + var cm = this.grid.colModel; + while(cm.isHidden(col)){ + col++; + } + + var el = this.getCell(row, col); + if(!el){ + return; + } + var c = this.scroller.dom; + + var ctop = parseInt(el.offsetTop, 10); + var cleft = parseInt(el.offsetLeft, 10); + var cbot = ctop + el.offsetHeight; + var cright = cleft + el.offsetWidth; + + var ch = c.clientHeight - this.mainHd.dom.offsetHeight; + var stop = parseInt(c.scrollTop, 10); + var sleft = parseInt(c.scrollLeft, 10); + var sbot = stop + ch; + var sright = sleft + c.clientWidth; + + if(ctop < stop){ + c.scrollTop = ctop; + }else if(cbot > sbot){ + c.scrollTop = cbot-ch; + } + + if(hscroll !== false){ + if(cleft < sleft){ + c.scrollLeft = cleft; + }else if(cright > sright){ + c.scrollLeft = cright-c.clientWidth; + } + } + return el; + }, + + updateColumns : function(){ + this.grid.stopEditing(); + var cm = this.grid.colModel, colIds = this.getColumnIds(); + //var totalWidth = cm.getTotalWidth(); + var pos = 0; + for(var i = 0, len = cm.getColumnCount(); i < len; i++){ + //if(cm.isHidden(i)) continue; + var w = cm.getColumnWidth(i); + this.css.updateRule(this.colSelector+colIds[i], "width", (w - this.borderWidth) + "px"); + this.css.updateRule(this.hdSelector+colIds[i], "width", (w - this.borderWidth) + "px"); + } + this.updateSplitters(); + }, + + updateSplitters : function(){ + var cm = this.cm, s = this.getSplitters(); + if(s){ // splitters not created yet + var pos = 0, locked = true; + for(var i = 0, len = cm.getColumnCount(); i < len; i++){ + if(cm.isHidden(i)) continue; + var w = cm.getColumnWidth(i); + if(!cm.isLocked(i) && locked){ + pos = 0; + locked = false; + } + pos += w; + s[i].style.left = (pos-this.splitOffset) + "px"; + } + } + }, + + handleHiddenChange : function(colModel, colIndex, hidden){ + if(hidden){ + this.hideColumn(colIndex); + }else{ + this.unhideColumn(colIndex); + } + }, + + hideColumn : function(colIndex){ + var cid = this.getColumnId(colIndex); + this.css.updateRule(this.tdSelector+cid, "display", "none"); + this.css.updateRule(this.splitSelector+cid, "display", "none"); + if(Ext.isSafari){ + this.updateHeaders(); + } + this.updateSplitters(); + this.layout(); + }, + + unhideColumn : function(colIndex){ + var cid = this.getColumnId(colIndex); + this.css.updateRule(this.tdSelector+cid, "display", ""); + this.css.updateRule(this.splitSelector+cid, "display", ""); + + if(Ext.isSafari){ + this.updateHeaders(); + } + this.updateSplitters(); + this.layout(); + }, + + insertRows : function(dm, firstRow, lastRow, isUpdate){ + if(firstRow == 0 && lastRow == dm.getCount()-1){ + this.refresh(); + }else{ + if(!isUpdate){ + this.fireEvent("beforerowsinserted", this, firstRow, lastRow); + } + var s = this.getScrollState(); + var markup = this.renderRows(firstRow, lastRow); + this.bufferRows(markup[0], this.getLockedTable(), firstRow); + this.bufferRows(markup[1], this.getBodyTable(), firstRow); + this.restoreScroll(s); + if(!isUpdate){ + this.fireEvent("rowsinserted", this, firstRow, lastRow); + this.syncRowHeights(firstRow, lastRow); + this.stripeRows(firstRow); + this.layout(); + } + } + }, + + bufferRows : function(markup, target, index){ + var before = null, trows = target.rows, tbody = target.tBodies[0]; + if(index < trows.length){ + before = trows[index]; + } + var b = document.createElement("div"); + b.innerHTML = ""+markup+"
          "; + var rows = b.firstChild.rows; + for(var i = 0, len = rows.length; i < len; i++){ + if(before){ + tbody.insertBefore(rows[0], before); + }else{ + tbody.appendChild(rows[0]); + } + } + b.innerHTML = ""; + b = null; + }, + + deleteRows : function(dm, firstRow, lastRow){ + if(dm.getRowCount()<1){ + this.fireEvent("beforerefresh", this); + this.mainBody.update(""); + this.lockedBody.update(""); + this.fireEvent("refresh", this); + }else{ + this.fireEvent("beforerowsdeleted", this, firstRow, lastRow); + var bt = this.getBodyTable(); + var tbody = bt.firstChild; + var rows = bt.rows; + for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){ + tbody.removeChild(rows[firstRow]); + } + this.stripeRows(firstRow); + this.fireEvent("rowsdeleted", this, firstRow, lastRow); + } + }, + + updateRows : function(dataSource, firstRow, lastRow){ + var s = this.getScrollState(); + this.refresh(); + this.restoreScroll(s); + }, + + handleSort : function(dataSource, sortColumnIndex, sortDir, noRefresh){ + if(!noRefresh){ + this.refresh(); + } + this.updateHeaderSortState(); + }, + + getScrollState : function(){ + var sb = this.scroller.dom; + return {left: sb.scrollLeft, top: sb.scrollTop}; + }, + + stripeRows : function(startRow){ + if(!this.grid.stripeRows || this.ds.getCount() < 1){ + return; + } + startRow = startRow || 0; + var rows = this.getBodyTable().rows; + var lrows = this.getLockedTable().rows; + var cls = ' x-grid-row-alt '; + for(var i = startRow, len = rows.length; i < len; i++){ + var row = rows[i], lrow = lrows[i]; + var isAlt = ((i+1) % 2 == 0); + var hasAlt = (' '+row.className + ' ').indexOf(cls) != -1; + if(isAlt == hasAlt){ + continue; + } + if(isAlt){ + row.className += " x-grid-row-alt"; + }else{ + row.className = row.className.replace("x-grid-row-alt", ""); + } + if(lrow){ + lrow.className = row.className; + } + } + }, + + restoreScroll : function(state){ + var sb = this.scroller.dom; + sb.scrollLeft = state.left; + sb.scrollTop = state.top; + this.syncScroll(); + }, + + syncScroll : function(){ + var sb = this.scroller.dom; + var sh = this.mainHd.dom; + var bs = this.mainBody.dom; + var lv = this.lockedBody.dom; + sh.scrollLeft = bs.scrollLeft = sb.scrollLeft; + lv.scrollTop = bs.scrollTop = sb.scrollTop; + }, + + handleScroll : function(e){ + this.syncScroll(); + var sb = this.scroller.dom; + this.grid.fireEvent("bodyscroll", sb.scrollLeft, sb.scrollTop); + e.stopEvent(); + }, + + handleWheel : function(e){ + var d = e.getWheelDelta(); + this.scroller.dom.scrollTop -= d*22; + // set this here to prevent jumpy scrolling on large tables + this.lockedBody.dom.scrollTop = this.mainBody.dom.scrollTop = this.scroller.dom.scrollTop; + e.stopEvent(); + }, + + renderRows : function(startRow, endRow){ + // pull in all the crap needed to render rows + var g = this.grid, cm = g.colModel, ds = g.dataSource, stripe = g.stripeRows; + var colCount = cm.getColumnCount(); + + if(ds.getCount() < 1){ + return ["", ""]; + } + + // build a map for all the columns + var cs = []; + for(var i = 0; i < colCount; i++){ + var name = cm.getDataIndex(i); + cs[i] = { + name : typeof name == 'undefined' ? ds.fields.get(i).name : name, + renderer : cm.getRenderer(i), + id : cm.getColumnId(i), + locked : cm.isLocked(i) + }; + } + + startRow = startRow || 0; + endRow = typeof endRow == "undefined"? ds.getCount()-1 : endRow; + + // records to render + var rs = ds.getRange(startRow, endRow); + + return this.doRender(cs, rs, ds, startRow, colCount, stripe); + }, + + // As much as I hate to duplicate code, this was branched because FireFox really hates + // [].join("") on strings. The performance difference was substantial enough to + // branch this function + doRender : Ext.isGecko ? + function(cs, rs, ds, startRow, colCount, stripe){ + var ts = this.templates, ct = ts.cell, rt = ts.row; + // buffers + var buf = "", lbuf = "", cb, lcb, c, p = {}, rp = {}, r; + for(var j = 0, len = rs.length; j < len; j++){ + r = rs[j], cb = "", lcb = "", rowIndex = (j+startRow); + for(var i = 0; i < colCount; i++){ + c = cs[i]; + p.cellId = "x-grid-cell-" + rowIndex + "-" + i; + p.id = c.id; + p.css = p.attr = ""; + p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds); + if(p.value == undefined || p.value === "") p.value = " "; + if(r.dirty && typeof r.modified[c.name] !== 'undefined'){ + p.css += p.css ? ' x-grid-dirty-cell' : 'x-grid-dirty-cell'; + } + var markup = ct.apply(p); + if(!c.locked){ + cb+= markup; + }else{ + lcb+= markup; + } + } + var alt = []; + if(stripe && ((rowIndex+1) % 2 == 0)){ + alt[0] = "x-grid-row-alt"; + } + if(r.dirty){ + alt[1] = " x-grid-dirty-row"; + } + rp.cells = lcb; + if(this.getRowClass){ + alt[2] = this.getRowClass(r, rowIndex); + } + rp.alt = alt.join(" "); + lbuf+= rt.apply(rp); + rp.cells = cb; + buf+= rt.apply(rp); + } + return [lbuf, buf]; + } : + function(cs, rs, ds, startRow, colCount, stripe){ + var ts = this.templates, ct = ts.cell, rt = ts.row; + // buffers + var buf = [], lbuf = [], cb, lcb, c, p = {}, rp = {}, r; + for(var j = 0, len = rs.length; j < len; j++){ + r = rs[j], cb = [], lcb = [], rowIndex = (j+startRow); + for(var i = 0; i < colCount; i++){ + c = cs[i]; + p.cellId = "x-grid-cell-" + rowIndex + "-" + i; + p.id = c.id; + p.css = p.attr = ""; + p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds); + if(p.value == undefined || p.value === "") p.value = " "; + if(r.dirty && typeof r.modified[c.name] !== 'undefined'){ + p.css += p.css ? ' x-grid-dirty-cell' : 'x-grid-dirty-cell'; + } + var markup = ct.apply(p); + if(!c.locked){ + cb[cb.length] = markup; + }else{ + lcb[lcb.length] = markup; + } + } + var alt = []; + if(stripe && ((rowIndex+1) % 2 == 0)){ + alt[0] = "x-grid-row-alt"; + } + if(r.dirty){ + alt[1] = " x-grid-dirty-row"; + } + rp.cells = lcb; + if(this.getRowClass){ + alt[2] = this.getRowClass(r, rowIndex); + } + rp.alt = alt.join(" "); + rp.cells = lcb.join(""); + lbuf[lbuf.length] = rt.apply(rp); + rp.cells = cb.join(""); + buf[buf.length] = rt.apply(rp); + } + return [lbuf.join(""), buf.join("")]; + }, + + renderBody : function(){ + var markup = this.renderRows(); + var bt = this.templates.body; + return [bt.apply({rows: markup[0]}), bt.apply({rows: markup[1]})]; + }, + + /** + * Refreshes the grid + * @param {Boolean} headersToo + */ + refresh : function(headersToo){ + this.fireEvent("beforerefresh", this); + this.grid.stopEditing(); + var result = this.renderBody(); + this.lockedBody.update(result[0]); + this.mainBody.update(result[1]); + if(headersToo === true){ + this.updateHeaders(); + this.updateColumns(); + this.updateSplitters(); + this.updateHeaderSortState(); + } + this.syncRowHeights(); + this.layout(); + this.fireEvent("refresh", this); + }, + + handleColumnMove : function(cm, oldIndex, newIndex){ + this.indexMap = null; + var s = this.getScrollState(); + this.refresh(true); + this.restoreScroll(s); + this.afterMove(newIndex); + }, + + afterMove : function(colIndex){ + if(this.enableMoveAnim && Ext.enableFx){ + this.fly(this.getHeaderCell(colIndex).firstChild).highlight(this.hlColor); + } + }, + + updateCell : function(dm, rowIndex, dataIndex){ + var colIndex = this.getColumnIndexByDataIndex(dataIndex); + if(typeof colIndex == "undefined"){ // not present in grid + return; + } + var cm = this.grid.colModel; + var cell = this.getCell(rowIndex, colIndex); + var cellText = this.getCellText(rowIndex, colIndex); + + var p = { + cellId : "x-grid-cell-" + rowIndex + "-" + colIndex, + id : cm.getColumnId(colIndex), + css: colIndex == cm.getColumnCount()-1 ? "x-grid-col-last" : "" + }; + var renderer = cm.getRenderer(colIndex); + var val = renderer(dm.getValueAt(rowIndex, dataIndex), p, rowIndex, colIndex, dm); + if(typeof val == "undefined" || val === "") val = " "; + cellText.innerHTML = val; + cell.className = this.cellClass + " " + p.cellId + " " + p.css; + this.syncRowHeights(rowIndex, rowIndex); + }, + + calcColumnWidth : function(colIndex, maxRowsToMeasure){ + var maxWidth = 0; + if(this.grid.autoSizeHeaders){ + var h = this.getHeaderCellMeasure(colIndex); + maxWidth = Math.max(maxWidth, h.scrollWidth); + } + var tb, index; + if(this.cm.isLocked(colIndex)){ + tb = this.getLockedTable(); + index = colIndex; + }else{ + tb = this.getBodyTable(); + index = colIndex - this.cm.getLockedCount(); + } + if(tb && tb.rows){ + var rows = tb.rows; + var stopIndex = Math.min(maxRowsToMeasure || rows.length, rows.length); + for(var i = 0; i < stopIndex; i++){ + var cell = rows[i].childNodes[index].firstChild; + maxWidth = Math.max(maxWidth, cell.scrollWidth); + } + } + return maxWidth + /*margin for error in IE*/ 5; + }, + /** + * Autofit a column to its content. + * @param {Number} colIndex + * @param {Boolean} forceMinSize true to force the column to go smaller if possible + */ + autoSizeColumn : function(colIndex, forceMinSize, suppressEvent){ + if(this.cm.isHidden(colIndex)){ + return; // can't calc a hidden column + } + if(forceMinSize){ + var cid = this.cm.getColumnId(colIndex); + this.css.updateRule(this.colSelector + cid, "width", this.grid.minColumnWidth + "px"); + if(this.grid.autoSizeHeaders){ + this.css.updateRule(this.hdSelector + cid, "width", this.grid.minColumnWidth + "px"); + } + } + var newWidth = this.calcColumnWidth(colIndex); + this.cm.setColumnWidth(colIndex, + Math.max(this.grid.minColumnWidth, newWidth), suppressEvent); + if(!suppressEvent){ + 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 cm = this.grid.colModel; + var colCount = cm.getColumnCount(); + for(var i = 0; i < colCount; i++){ + this.autoSizeColumn(i, true, true); + } + if(cm.getTotalWidth() < this.scroller.dom.clientWidth){ + this.fitColumns(); + }else{ + this.updateColumns(); + this.layout(); + } + }, + + /** + * Autofits all columns to the grid's width proportionate with their current size + * @param {Boolean} reserveScrollSpace Reserve space for a scrollbar + */ + fitColumns : function(reserveScrollSpace){ + 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 avail = Math.min(this.scroller.dom.clientWidth, this.el.getWidth()); + if(reserveScrollSpace){ + avail -= 17; + } + var frac = (avail - cm.getTotalWidth())/width; + while (cols.length){ + w = cols.pop(); + i = cols.pop(); + cm.setColumnWidth(i, Math.floor(w + w*frac), true); + } + this.updateColumns(); + this.layout(); + }, + + onRowSelect : function(rowIndex){ + var row = this.getRowComposite(rowIndex); + row.addClass("x-grid-row-selected"); + }, + + onRowDeselect : function(rowIndex){ + var row = this.getRowComposite(rowIndex); + row.removeClass("x-grid-row-selected"); + }, + + onCellSelect : function(row, col){ + var cell = this.getCell(row, col); + if(cell){ + Ext.fly(cell).addClass("x-grid-cell-selected"); + } + }, + + onCellDeselect : function(row, col){ + var cell = this.getCell(row, col); + if(cell){ + Ext.fly(cell).removeClass("x-grid-cell-selected"); + } + }, + + updateHeaderSortState : function(){ + var state = this.ds.getSortState(); + if(!state){ + return; + } + this.sortState = state; + var sortColumn = this.cm.findColumnIndex(state.field); + if(sortColumn != -1){ + var sortDir = state.direction; + var sc = this.sortClasses; + var hds = this.el.select(this.headerSelector).removeClass(sc); + hds.item(sortColumn).addClass(sc[sortDir == "DESC" ? 1 : 0]); + } + }, + + handleHeaderClick : function(g, index){ + if(this.headersDisabled){ + return; + } + var dm = g.dataSource, cm = g.colModel; + if(!cm.isSortable(index)){ + return; + } + g.stopEditing(); + dm.sort(cm.getDataIndex(index)); + }, + + + destroy : function(){ + if(this.colMenu){ + this.colMenu.removeAll(); + Ext.menu.MenuMgr.unregister(this.colMenu); + this.colMenu.getEl().remove(); + delete this.colMenu; + } + if(this.hmenu){ + this.hmenu.removeAll(); + Ext.menu.MenuMgr.unregister(this.hmenu); + this.hmenu.getEl().remove(); + delete this.hmenu; + } + if(this.grid.enableColumnMove){ + var dds = Ext.dd.DDM.ids['gridHeader' + this.grid.container.id]; + if(dds){ + for(var dd in dds){ + if(!dds[dd].config.isTarget && dds[dd].dragElId){ + var elid = dds[dd].dragElId; + dds[dd].unreg(); + Ext.get(elid).remove(); + } else if(dds[dd].config.isTarget){ + dds[dd].proxyTop.remove(); + dds[dd].proxyBottom.remove(); + dds[dd].unreg(); + } + if(Ext.dd.DDM.locationCache[dd]){ + delete Ext.dd.DDM.locationCache[dd]; + } + } + delete Ext.dd.DDM.ids['gridHeader' + this.grid.container.id]; + } + } + + this.bind(null, null); + Ext.EventManager.removeResizeListener(this.onWindowResize, this); + }, + + handleLockChange : function(){ + this.refresh(true); + }, + + onDenyColumnLock : function(){ + + }, + + onDenyColumnHide : function(){ + + }, + + handleHdMenuClick : function(item){ + var index = this.hdCtxIndex; + var cm = this.cm, ds = this.ds; + switch(item.id){ + case "asc": + ds.sort(cm.getDataIndex(index), "ASC"); + break; + case "desc": + ds.sort(cm.getDataIndex(index), "DESC"); + break; + case "lock": + var lc = cm.getLockedCount(); + if(cm.getColumnCount(true) <= lc+1){ + this.onDenyColumnLock(); + return; + } + if(lc != index){ + cm.setLocked(index, true, true); + cm.moveColumn(index, lc); + this.grid.fireEvent("columnmove", index, lc); + }else{ + cm.setLocked(index, true); + } + break; + case "unlock": + var lc = cm.getLockedCount(); + if((lc-1) != index){ + cm.setLocked(index, false, true); + cm.moveColumn(index, lc-1); + this.grid.fireEvent("columnmove", index, lc-1); + }else{ + cm.setLocked(index, false); + } + break; + default: + index = cm.getIndexById(item.id.substr(4)); + if(index != -1){ + if(item.checked && cm.getColumnCount(true) <= 1){ + this.onDenyColumnHide(); + return false; + } + cm.setHidden(index, item.checked); + } + } + return true; + }, + + beforeColMenuShow : function(){ + var cm = this.cm, colCount = cm.getColumnCount(); + this.colMenu.removeAll(); + for(var i = 0; i < colCount; i++){ + this.colMenu.add(new Ext.menu.CheckItem({ + id: "col-"+cm.getColumnId(i), + text: cm.getColumnHeader(i), + checked: !cm.isHidden(i), + hideOnClick:false + })); + } + }, + + handleHdCtx : function(g, index, e){ + e.stopEvent(); + var hd = this.getHeaderCell(index); + this.hdCtxIndex = index; + var ms = this.hmenu.items, cm = this.cm; + ms.get("asc").setDisabled(!cm.isSortable(index)); + ms.get("desc").setDisabled(!cm.isSortable(index)); + if(this.grid.enableColLock !== false){ + ms.get("lock").setDisabled(cm.isLocked(index)); + ms.get("unlock").setDisabled(!cm.isLocked(index)); + } + this.hmenu.show(hd, "tl-bl"); + }, + + handleHdOver : function(e){ + var hd = this.findHeaderCell(e.getTarget()); + if(hd && !this.headersDisabled){ + if(this.grid.colModel.isSortable(this.getCellIndex(hd))){ + this.fly(hd).addClass("x-grid-hd-over"); + } + } + }, + + handleHdOut : function(e){ + var hd = this.findHeaderCell(e.getTarget()); + if(hd){ + this.fly(hd).removeClass("x-grid-hd-over"); + } + }, + + handleSplitDblClick : function(e, t){ + var i = this.getCellIndex(t); + if(this.grid.enableColumnResize !== false && this.cm.isResizable(i) && !this.cm.isFixed(i)){ + this.autoSizeColumn(i, true); + this.layout(); + } + }, + + render : function(){ + + var cm = this.cm; + var colCount = cm.getColumnCount(); + + if(this.grid.monitorWindowResize === true){ + Ext.EventManager.onWindowResize(this.onWindowResize, this, true); + } + var header = this.renderHeaders(); + var body = this.templates.body.apply({rows:""}); + var html = this.templates.master.apply({ + lockedBody: body, + body: body, + lockedHeader: header[0], + header: header[1] + }); + + this.updateColumns(); + + this.grid.container.dom.innerHTML = html; + + this.initElements(); + + this.scroller.on("scroll", this.handleScroll, this); + this.lockedBody.on("mousewheel", this.handleWheel, this); + this.mainBody.on("mousewheel", this.handleWheel, this); + + this.mainHd.on("mouseover", this.handleHdOver, this); + this.mainHd.on("mouseout", this.handleHdOut, this); + this.mainHd.on("dblclick", this.handleSplitDblClick, this, + {delegate: "."+this.splitClass}); + + this.lockedHd.on("mouseover", this.handleHdOver, this); + this.lockedHd.on("mouseout", this.handleHdOut, this); + this.lockedHd.on("dblclick", this.handleSplitDblClick, this, + {delegate: "."+this.splitClass}); + + if(this.grid.enableColumnResize !== false && Ext.grid.SplitDragZone){ + new Ext.grid.SplitDragZone(this.grid, this.lockedHd.dom, this.mainHd.dom); + } + + this.updateSplitters(); + + if(this.grid.enableColumnMove && Ext.grid.HeaderDragZone){ + new Ext.grid.HeaderDragZone(this.grid, this.lockedHd.dom, this.mainHd.dom); + new Ext.grid.HeaderDropZone(this.grid, this.lockedHd.dom, this.mainHd.dom); + } + + if(this.grid.enableCtxMenu !== false && Ext.menu.Menu){ + this.hmenu = new Ext.menu.Menu({id: this.grid.id + "-hctx"}); + this.hmenu.add( + {id:"asc", text: this.sortAscText, cls: "xg-hmenu-sort-asc"}, + {id:"desc", text: this.sortDescText, cls: "xg-hmenu-sort-desc"} + ); + if(this.grid.enableColLock !== false){ + this.hmenu.add('-', + {id:"lock", text: this.lockText, cls: "xg-hmenu-lock"}, + {id:"unlock", text: this.unlockText, cls: "xg-hmenu-unlock"} + ); + } + if(this.grid.enableColumnHide !== false){ + + this.colMenu = new Ext.menu.Menu({id:this.grid.id + "-hcols-menu"}); + this.colMenu.on("beforeshow", this.beforeColMenuShow, this); + this.colMenu.on("itemclick", this.handleHdMenuClick, this); + + this.hmenu.add('-', + {id:"columns", text: this.columnsText, menu: this.colMenu} + ); + } + this.hmenu.on("itemclick", this.handleHdMenuClick, this); + + this.grid.on("headercontextmenu", this.handleHdCtx, this); + } + + if((this.grid.enableDragDrop || this.grid.enableDrag) && Ext.grid.GridDragZone){ + this.dd = new Ext.grid.GridDragZone(this.grid, { + ddGroup : this.grid.ddGroup || 'GridDD' + }); + } + for(var i = 0; i < colCount; i++){ + if(cm.isHidden(i)){ + this.hideColumn(i); + } + if(cm.config[i].align){ + this.css.updateRule(this.colSelector + i, "textAlign", cm.config[i].align); + this.css.updateRule(this.hdSelector + i, "textAlign", cm.config[i].align); + } + } + + this.updateHeaderSortState(); + + this.beforeInitialResize(); + this.layout(true); + + // two part rendering gives faster view to the user + this.renderPhase2.defer(1, this); + }, + + renderPhase2 : function(){ + // render the rows now + this.refresh(); + if(this.grid.autoSizeColumns){ + this.autoSizeColumns(); + } + }, + + beforeInitialResize : function(){ + + }, + + onColumnSplitterMoved : function(i, w){ + this.userResized = true; + var cm = this.grid.colModel; + cm.setColumnWidth(i, w, true); + var cid = cm.getColumnId(i); + this.css.updateRule(this.colSelector + cid, "width", (w-this.borderWidth) + "px"); + this.css.updateRule(this.hdSelector + cid, "width", (w-this.borderWidth) + "px"); + this.updateSplitters(); + this.layout(); + this.grid.fireEvent("columnresize", i, w); + }, + + syncRowHeights : function(startIndex, endIndex){ + if(this.grid.enableRowHeightSync === true && this.cm.getLockedCount() > 0){ + startIndex = startIndex || 0; + var mrows = this.getBodyTable().rows; + var lrows = this.getLockedTable().rows; + var len = mrows.length-1; + endIndex = Math.min(endIndex || len, len); + for(var i = startIndex; i <= endIndex; i++){ + var m = mrows[i], l = lrows[i]; + var h = Math.max(m.offsetHeight, l.offsetHeight); + m.style.height = l.style.height = h + "px"; + } + } + }, + + layout : function(initialRender, is2ndPass){ + var g = this.grid; + var auto = g.autoHeight; + var scrollOffset = 16; + var c = g.container, cm = this.cm, + expandCol = g.autoExpandColumn, + gv = this; + //c.beginMeasure(); + + if(!c.dom.offsetWidth){ // display:none? + if(initialRender){ + this.lockedWrap.show(); + this.mainWrap.show(); + } + return; + } + + var hasLock = this.cm.isLocked(0); + + var tbh = this.headerPanel.getHeight(); + var bbh = this.footerPanel.getHeight(); + + if(auto){ + var ch = this.getBodyTable().offsetHeight + tbh + bbh + this.mainHd.getHeight(); + var newHeight = ch + c.getBorderWidth("tb"); + if(g.maxHeight){ + newHeight = Math.min(g.maxHeight, newHeight); + } + c.setHeight(newHeight); + } + + if(g.autoWidth){ + c.setWidth(cm.getTotalWidth()+c.getBorderWidth('lr')); + } + + var s = this.scroller; + + var csize = c.getSize(true); + + this.el.setSize(csize.width, csize.height); + + this.headerPanel.setWidth(csize.width); + this.footerPanel.setWidth(csize.width); + + var hdHeight = this.mainHd.getHeight(); + var vw = csize.width; + var vh = csize.height - (tbh + bbh); + + s.setSize(vw, vh); + + var bt = this.getBodyTable(); + var ltWidth = hasLock ? + Math.max(this.getLockedTable().offsetWidth, this.lockedHd.dom.firstChild.offsetWidth) : 0; + + var scrollHeight = bt.offsetHeight; + var scrollWidth = ltWidth + bt.offsetWidth; + var vscroll = false, hscroll = false; + + this.scrollSizer.setSize(scrollWidth, scrollHeight+hdHeight); + + var lw = this.lockedWrap, mw = this.mainWrap; + var lb = this.lockedBody, mb = this.mainBody; + + setTimeout(function(){ + var t = s.dom.offsetTop; + var w = s.dom.clientWidth, + h = s.dom.clientHeight; + + lw.setTop(t); + lw.setSize(ltWidth, h); + + mw.setLeftTop(ltWidth, t); + mw.setSize(w-ltWidth, h); + + lb.setHeight(h-hdHeight); + mb.setHeight(h-hdHeight); + + if(is2ndPass !== true && !gv.userResized && expandCol){ + // high speed resize without full column calculation + var ci = cm.getIndexById(expandCol); + var tw = cm.getTotalWidth(false); + var currentWidth = cm.getColumnWidth(ci); + var cw = Math.min(Math.max(((w-tw)+currentWidth-2)-/*scrollbar*/(w <= s.dom.offsetWidth ? 0 : 18), g.autoExpandMin), g.autoExpandMax); + if(currentWidth != cw){ + cm.setColumnWidth(ci, cw, true); + gv.css.updateRule(gv.colSelector+expandCol, "width", (cw - gv.borderWidth) + "px"); + gv.css.updateRule(gv.hdSelector+expandCol, "width", (cw - gv.borderWidth) + "px"); + gv.updateSplitters(); + gv.layout(false, true); + } + } + + if(initialRender){ + lw.show(); + mw.show(); + } + //c.endMeasure(); + }, 10); + }, + + onWindowResize : function(){ + if(!this.grid.monitorWindowResize || this.grid.autoHeight){ + return; + } + this.layout(); + }, + + appendFooter : function(parentEl){ + return null; + }, + + sortAscText : "Sort Ascending", + sortDescText : "Sort Descending", + lockText : "Lock Column", + unlockText : "Unlock Column", + columnsText : "Columns" +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/grid/PropertyGrid.js b/www/extras/yui-ext/source/widgets/grid/PropertyGrid.js new file mode 100644 index 000000000..b60dce17d --- /dev/null +++ b/www/extras/yui-ext/source/widgets/grid/PropertyGrid.js @@ -0,0 +1,208 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.grid.PropertyRecord = Ext.data.Record.create([ + {name:'name',type:'string'}, 'value' +]); + +Ext.grid.PropertyStore = function(grid, source){ + this.grid = grid; + this.store = new Ext.data.Store({ + recordType : Ext.grid.PropertyRecord + }); + this.store.on('update', this.onUpdate, this); + if(source){ + this.setSource(source); + } + Ext.grid.PropertyStore.superclass.constructor.call(this); +}; +Ext.extend(Ext.grid.PropertyStore, Ext.util.Observable, { + setSource : function(o){ + this.source = o; + this.store.removeAll(); + var data = []; + for(var k in o){ + if(this.isEditableValue(o[k])){ + data.push(new Ext.grid.PropertyRecord({name: k, value: o[k]}, k)); + } + } + this.store.loadRecords({records: data}, {}, true); + }, + + onUpdate : function(ds, record, type){ + if(type == Ext.data.Record.EDIT){ + var v = record.data['value']; + var oldValue = record.modified['value']; + if(this.grid.fireEvent('beforepropertychange', this.source, record.id, v, oldValue) !== false){ + this.source[record.id] = v; + record.commit(); + this.grid.fireEvent('propertychange', this.source, record.id, v, oldValue); + }else{ + record.reject(); + } + } + }, + + getProperty : function(row){ + return this.store.getAt(row); + }, + + isEditableValue: function(val){ + if(val && val instanceof Date){ + return true; + }else if(typeof val == 'object' || typeof val == 'function'){ + return false; + } + return true; + }, + + setValue : function(prop, value){ + this.source[prop] = value; + this.store.getById(prop).set('value', value); + }, + + getSource : function(){ + return this.source; + } +}); + +Ext.grid.PropertyColumnModel = function(grid, store){ + this.grid = grid; + var g = Ext.grid; + g.PropertyColumnModel.superclass.constructor.call(this, [ + {header: this.nameText, sortable: true, dataIndex:'name', id: 'name'}, + {header: this.valueText, resizable:false, dataIndex: 'value', id: 'value'} + ]); + this.store = store; + this.bselect = Ext.DomHelper.append(document.body, { + tag: 'select', style:'display:none', cls: 'x-grid-editor', children: [ + {tag: 'option', value: 'true', html: 'true'}, + {tag: 'option', value: 'false', html: 'false'} + ] + }); + Ext.id(this.bselect); + var f = Ext.form; + this.editors = { + 'date' : new g.GridEditor(new f.DateField({selectOnFocus:true})), + 'string' : new g.GridEditor(new f.TextField({selectOnFocus:true})), + 'number' : new g.GridEditor(new f.NumberField({selectOnFocus:true, style:'text-align:left;'})), + 'boolean' : new g.GridEditor(new f.Field({el:this.beselect,selectOnFocus:true})) + }; + this.renderCellDelegate = this.renderCell.createDelegate(this); + this.renderPropDelegate = this.renderProp.createDelegate(this); +}; + +Ext.extend(Ext.grid.PropertyColumnModel, Ext.grid.ColumnModel, { + nameText : 'Name', + valueText : 'Value', + dateFormat : 'm/j/Y', + renderDate : function(dateVal){ + return dateVal.dateFormat(this.dateFormat); + }, + + renderBool : function(bVal){ + return bVal ? 'true' : 'false'; + }, + + isCellEditable : function(colIndex, rowIndex){ + return colIndex == 1; + }, + + getRenderer : function(col){ + return col == 1 ? + this.renderCellDelegate : this.renderPropDelegate; + }, + + renderProp : function(v){ + return this.getPropertyName(v); + }, + + renderCell : function(val){ + var rv = val; + if(val instanceof Date){ + rv = this.renderDate(val); + }else if(typeof val == 'boolean'){ + rv = this.renderBool(val); + } + return Ext.util.Format.htmlEncode(rv); + }, + + getPropertyName : function(name){ + var pn = this.grid.propertyNames; + return pn && pn[name] ? pn[name] : name; + }, + + getCellEditor : function(colIndex, rowIndex){ + var p = this.store.getProperty(rowIndex); + var n = p.data['name'], val = p.data['value']; + if(this.grid.customEditors[n]){ + return this.grid.customEditors[n]; + } + 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']; + } + } +}); + +Ext.grid.PropertyGrid = function(container, config){ + config = config || {}; + var store = new Ext.grid.PropertyStore(this); + this.store = store; + var cm = new Ext.grid.PropertyColumnModel(this, store); + store.store.sort('name', 'ASC'); + Ext.grid.PropertyGrid.superclass.constructor.call(this, container, Ext.apply({ + ds: store.store, + cm: cm, + enableColLock:false, + enableColumnMove:false, + stripeRows:false, + trackMouseOver: false, + clicksToEdit:1 + }, config)); + this.container.addClass('x-props-grid'); + this.lastEditRow = null; + this.on('columnresize', this.onColumnResize, this); + this.addEvents({ + beforepropertychange: true, + propertychange: true + }); + this.customEditors = this.customEditors || {}; +}; +Ext.extend(Ext.grid.PropertyGrid, Ext.grid.EditorGrid, { + render : function(){ + Ext.grid.PropertyGrid.superclass.render.call(this); + this.autoSize.defer(100, this); + }, + + autoSize : function(){ + Ext.grid.PropertyGrid.superclass.autoSize.call(this); + if(this.view){ + this.view.fitColumns(); + } + }, + + onColumnResize : function(){ + this.colModel.setColumnWidth(1, this.container.getWidth(true)-this.colModel.getColumnWidth(0)); + this.autoSize(); + }, + + setSource : function(source){ + this.store.setSource(source); + //this.autoSize(); + }, + + getSource : function(){ + return this.store.getSource(); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/grid/RowSelectionModel.js b/www/extras/yui-ext/source/widgets/grid/RowSelectionModel.js new file mode 100644 index 000000000..85bd12c70 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/grid/RowSelectionModel.js @@ -0,0 +1,418 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + @class Ext.grid.RowSelectionModel + * @extends Ext.grid.AbstractSelectionModel + * The default SelectionModel used by {@link Ext.grid.Grid}. + It supports multiple selections and keyboard selection/navigation.

          + @constructor + * @param {Object} config + */ +Ext.grid.RowSelectionModel = function(config){ + Ext.apply(this, config); + this.selections = new Ext.util.MixedCollection(false, function(o){ + return o.id; + }); + + this.last = false; + this.lastActive = false; + + this.addEvents({ + /** + * @event selectionchange + * Fires when the selection changes + * @param {SelectionModel} this + */ + "selectionchange" : true, + /** + * @event beforerowselect + * Fires when a row is selected being selected, return false to cancel. + * @param {SelectionModel} this + * @param {Number} rowIndex The selected index + */ + "beforerowselect" : true, + /** + * @event rowselect + * Fires when a row is selected. + * @param {SelectionModel} this + * @param {Number} rowIndex The selected index + */ + "rowselect" : true, + + "rowdeselect" : true + }); + + this.locked = false; +}; + +Ext.extend(Ext.grid.RowSelectionModel, Ext.grid.AbstractSelectionModel, { + /** + * @cfg {Boolean} singleSelect + * True to allow selection of only one row at a time (defaults to false) + */ + singleSelect : false, + + // private + initEvents : function(){ + + if(!this.grid.enableDragDrop && !this.grid.enableDrag){ + this.grid.on("mousedown", this.handleMouseDown, this); + } + + this.rowNav = new Ext.KeyNav(this.grid.container, { + "up" : function(e){ + if(!e.shiftKey){ + this.selectPrevious(e.shiftKey); + }else if(this.last !== false && this.lastActive !== false){ + var last = this.last; + this.selectRange(this.last, this.lastActive-1); + this.grid.getView().focusRow(this.lastActive); + if(last !== false){ + this.last = last; + } + }else{ + this.selectFirstRow(); + } + }, + "down" : function(e){ + if(!e.shiftKey){ + this.selectNext(e.shiftKey); + }else if(this.last !== false && this.lastActive !== false){ + var last = this.last; + this.selectRange(this.last, this.lastActive+1); + this.grid.getView().focusRow(this.lastActive); + if(last !== false){ + this.last = last; + } + }else{ + this.selectFirstRow(); + } + }, + scope: this + }); + + var view = this.grid.view; + view.on("refresh", this.onRefresh, this); + view.on("rowupdated", this.onRowUpdated, this); + view.on("rowremoved", this.onRemove, this); + }, + + // private + onRefresh : function(){ + var ds = this.grid.dataSource, i, v = this.grid.view; + var s = this.selections; + s.each(function(r){ + if((i = ds.indexOfId(r.id)) != -1){ + v.onRowSelect(i); + }else{ + s.remove(r); + } + }); + }, + + // private + onRemove : function(v, index, r){ + this.selections.remove(r); + }, + + // private + onRowUpdated : function(v, index, r){ + if(this.isSelected(r)){ + v.onRowSelect(index); + } + }, + + /** + * Select records. + * @param {Array} records The records to select + * @param {Boolean} keepExisting (optional) True to keep existing selections + */ + selectRecords : function(records, keepExisting){ + if(!keepExisting){ + this.clearSelections(); + } + var ds = this.grid.dataSource; + for(var i = 0, len = records.length; i < len; i++){ + this.selectRow(ds.indexOf(records[i]), true); + } + }, + + /** + * Gets the number of selected rows. + * @return {Number} + */ + getCount : function(){ + return this.selections.length; + }, + + /** + * Selects the first row in the grid. + */ + selectFirstRow : function(){ + this.selectRow(0); + }, + + /** + * Select the last row. + * @param {Boolean} keepExisting (optional) True to keep existing selections + */ + selectLastRow : function(keepExisting){ + this.selectRow(this.grid.dataSource.getCount() - 1, keepExisting); + }, + + /** + * Selects the row immediately following the last selected row. + * @param {Boolean} keepExisting (optional) True to keep existing selections + */ + selectNext : function(keepExisting){ + if(this.last !== false && (this.last+1) < this.grid.dataSource.getCount()){ + this.selectRow(this.last+1, keepExisting); + this.grid.getView().focusRow(this.last); + } + }, + + /** + * Selects the row that precedes the last selected row. + * @param {Boolean} keepExisting (optional) True to keep existing selections + */ + selectPrevious : function(keepExisting){ + if(this.last){ + this.selectRow(this.last-1, keepExisting); + this.grid.getView().focusRow(this.last); + } + }, + + /** + * Returns the selected records + * @return {Array} Array of selected records + */ + getSelections : function(){ + return [].concat(this.selections.items); + }, + + /** + * Returns the first selected record. + * @return {Record} + */ + getSelected : function(){ + return this.selections.itemAt(0); + }, + + + /** + * Clears all selections. + */ + clearSelections : function(fast){ + if(this.locked) return; + if(fast !== true){ + var ds = this.grid.dataSource; + var s = this.selections; + s.each(function(r){ + this.deselectRow(ds.indexOfId(r.id)); + }, this); + s.clear(); + }else{ + this.selections.clear(); + } + this.last = false; + }, + + + /** + * Selects all rows. + */ + selectAll : function(){ + if(this.locked) return; + this.selections.clear(); + for(var i = 0, len = this.grid.dataSource.getCount(); i < len; i++){ + this.selectRow(i, true); + } + }, + + /** + * Returns True if there is a selection. + * @return {Boolean} + */ + hasSelection : function(){ + return this.selections.length > 0; + }, + + /** + * Returns True if the specified row is selected. + * @param {Number/Record} record The record or index of the record to check + * @return {Boolean} + */ + isSelected : function(index){ + var r = typeof index == "number" ? this.grid.dataSource.getAt(index) : index; + return (r && this.selections.key(r.id) ? true : false); + }, + + /** + * Returns True if the specified record id is selected. + * @param {String} id The id of record to check + * @return {Boolean} + */ + isIdSelected : function(id){ + return (this.selections.key(id) ? true : false); + }, + + // private + handleMouseDown : function(e, t){ + var view = this.grid.getView(), rowIndex; + if(this.isLocked() || (rowIndex = view.findRowIndex(t)) === false){ + return; + }; + if(e.shiftKey && this.last !== false){ + var last = this.last; + this.selectRange(last, rowIndex, e.ctrlKey); + this.last = last; // reset the last + view.focusRow(rowIndex); + }else{ + var isSelected = this.isSelected(rowIndex); + if(e.button != 0 && isSelected){ + view.focusRow(rowIndex); + }else if(e.ctrlKey && isSelected){ + this.deselectRow(rowIndex); + }else{ + this.selectRow(rowIndex, e.button == 0 && (e.ctrlKey || e.shiftKey)); + view.focusRow(rowIndex); + } + } + }, + + /** + * Selects multiple rows. + * @param {Array} rows Array of the indexes of the row to select + * @param {Boolean} keepExisting (optional) True to keep existing selections + */ + selectRows : function(rows, keepExisting){ + if(!keepExisting){ + this.clearSelections(); + } + for(var i = 0, len = rows.length; i < len; i++){ + this.selectRow(rows[i], true); + } + }, + + /** + * Selects a range of rows. All rows in between startRow and endRow are also selected. + * @param {Number} startRow The index of the first row in the range + * @param {Number} endRow The index of the last row in the range + * @param {Boolean} keepExisting (optional) True to retain existing selections + */ + selectRange : function(startRow, endRow, keepExisting){ + if(this.locked) return; + if(!keepExisting){ + this.clearSelections(); + } + if(startRow <= endRow){ + for(var i = startRow; i <= endRow; i++){ + this.selectRow(i, true); + } + }else{ + for(var i = startRow; i >= endRow; i--){ + this.selectRow(i, true); + } + } + }, + + /** + * Deselects a range of rows. All rows in between startRow and endRow are also deselected. + * @param {Number} startRow The index of the first row in the range + * @param {Number} endRow The index of the last row in the range + */ + deselectRange : function(startRow, endRow, preventViewNotify){ + if(this.locked) return; + for(var i = startRow; i <= endRow; i++){ + this.deselectRow(i, preventViewNotify); + } + }, + + /** + * Selects a row. + * @param {Number} row The index of the row to select + * @param {Boolean} keepExisting (optional) True to keep existing selections + */ + selectRow : function(index, keepExisting, preventViewNotify){ + if(this.locked || (index < 0 || index >= this.grid.dataSource.getCount())) return; + if(this.fireEvent("beforerowselect", this, index, keepExisting) !== false){ + if(!keepExisting || this.singleSelect){ + this.clearSelections(); + } + var r = this.grid.dataSource.getAt(index); + this.selections.add(r); + this.last = this.lastActive = index; + if(!preventViewNotify){ + this.grid.getView().onRowSelect(index); + } + this.fireEvent("rowselect", this, index, r); + this.fireEvent("selectionchange", this); + } + }, + + /** + * Deselects a row. + * @param {Number} row The index of the row to deselect + */ + deselectRow : function(index, preventViewNotify){ + if(this.locked) return; + if(this.last == index){ + this.last = false; + } + if(this.lastActive == index){ + this.lastActive = false; + } + var r = this.grid.dataSource.getAt(index); + this.selections.remove(r); + if(!preventViewNotify){ + this.grid.getView().onRowDeselect(index); + } + this.fireEvent("rowdeselect", this, index); + this.fireEvent("selectionchange", this); + }, + + // private + restoreLast : function(){ + if(this._last){ + this.last = this._last; + } + }, + + // private + acceptsNav : function(row, col, cm){ + return !cm.isHidden(col) && cm.isCellEditable(col, row); + }, + + // private + onEditorKey : function(field, e){ + var k = e.getKey(), newCell, g = this.grid, ed = g.activeEditor; + if(k == e.TAB){ + ed.completeEdit(); + if(e.shiftKey){ + newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this); + }else{ + newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this); + } + e.stopEvent(); + }else if(k == e.ENTER && !e.ctrlKey){ + ed.completeEdit(); + if(e.shiftKey){ + newCell = g.walkCells(ed.row-1, ed.col, -1, this.acceptsNav, this); + }else{ + newCell = g.walkCells(ed.row+1, ed.col, 1, this.acceptsNav, this); + } + e.stopEvent(); + }else if(k == e.ESC){ + ed.cancelEdit(); + } + if(newCell){ + g.startEditing(newCell[0], newCell[1]); + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/layout/BasicLayoutRegion.js b/www/extras/yui-ext/source/widgets/layout/BasicLayoutRegion.js new file mode 100644 index 000000000..d07d1d83e --- /dev/null +++ b/www/extras/yui-ext/source/widgets/layout/BasicLayoutRegion.js @@ -0,0 +1,292 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.BasicLayoutRegion + * @extends Ext.util.Observable + * This class represents a lightweight region in a layout manager. This region does not move dom nodes + * and does not have a titlebar, tabs or any other features. All it does is size and position + * panels. To create a BasicLayoutRegion, add lightweight:true or basic:true to your regions config. + */ +Ext.BasicLayoutRegion = function(mgr, config, pos, skipConfig){ + this.mgr = mgr; + this.position = pos; + this.events = { + /** + * @event beforeremove + * Fires before a panel is removed (or closed). To cancel the removal set "e.cancel = true" on the event argument. + * @param {Ext.LayoutRegion} this + * @param {Ext.ContentPanel} panel The panel + * @param {Object} e The cancel event object + */ + "beforeremove" : true, + /** + * @event invalidated + * Fires when the layout for this region is changed. + * @param {Ext.LayoutRegion} this + */ + "invalidated" : true, + /** + * @event visibilitychange + * Fires when this region is shown or hidden + * @param {Ext.LayoutRegion} this + * @param {Boolean} visibility true or false + */ + "visibilitychange" : true, + /** + * @event paneladded + * Fires when a panel is added. + * @param {Ext.LayoutRegion} this + * @param {Ext.ContentPanel} panel The panel + */ + "paneladded" : true, + /** + * @event panelremoved + * Fires when a panel is removed. + * @param {Ext.LayoutRegion} this + * @param {Ext.ContentPanel} panel The panel + */ + "panelremoved" : true, + /** + * @event collapsed + * Fires when this region is collapsed. + * @param {Ext.LayoutRegion} this + */ + "collapsed" : true, + /** + * @event expanded + * Fires when this region is expanded. + * @param {Ext.LayoutRegion} this + */ + "expanded" : true, + /** + * @event slideshow + * Fires when this region is slid into view. + * @param {Ext.LayoutRegion} this + */ + "slideshow" : true, + /** + * @event slidehide + * Fires when this region slides out of view. + * @param {Ext.LayoutRegion} this + */ + "slidehide" : true, + /** + * @event panelactivated + * Fires when a panel is activated. + * @param {Ext.LayoutRegion} this + * @param {Ext.ContentPanel} panel The activated panel + */ + "panelactivated" : true, + /** + * @event resized + * Fires when the user resizes this region. + * @param {Ext.LayoutRegion} this + * @param {Number} newSize The new size (width for east/west, height for north/south) + */ + "resized" : true + }; + /** A collection of panels in this region. @type Ext.util.MixedCollection */ + this.panels = new Ext.util.MixedCollection(); + this.panels.getKey = this.getPanelId.createDelegate(this); + this.box = null; + this.activePanel = null; + if(skipConfig !== true){ + this.applyConfig(config); + } +}; + +Ext.extend(Ext.BasicLayoutRegion, Ext.util.Observable, { + getPanelId : function(p){ + return p.getId(); + }, + + applyConfig : function(config){ + this.margins = config.margins || this.margins || {top: 0, left: 0, right:0, bottom: 0}; + this.config = config; + }, + + /** + * 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){ + var el = this.el ? this.el : + (this.activePanel ? this.activePanel.getEl() : null); + if(el){ + switch(this.position){ + case "east": + case "west": + el.setWidth(newSize); + this.fireEvent("resized", this, newSize); + break; + case "north": + case "south": + el.setHeight(newSize); + this.fireEvent("resized", this, newSize); + break; + } + } + }, + + getBox : function(){ + return this.activePanel ? this.activePanel.getEl().getBox(false, true) : null; + }, + + getMargins : function(){ + return this.margins; + }, + + updateBox : function(box){ + this.box = box; + var el = this.activePanel.getEl(); + el.dom.style.left = box.x + "px"; + el.dom.style.top = box.y + "px"; + this.activePanel.setSize(box.width, box.height); + }, + + /** + * Returns the container element for this region. + * @return {Ext.Element} + */ + getEl : function(){ + return this.activePanel; + }, + + /** + * Returns true if this region is currently visible. + * @return {Boolean} + */ + isVisible : function(){ + return this.activePanel ? true : false; + }, + + setActivePanel : function(panel){ + panel = this.getPanel(panel); + if(this.activePanel && this.activePanel != panel){ + this.activePanel.setActiveState(false); + this.activePanel.getEl().setLeftTop(-10000,-10000); + } + this.activePanel = panel; + panel.setActiveState(true); + if(this.box){ + panel.setSize(this.box.width, this.box.height); + } + this.fireEvent("panelactivated", this, panel); + this.fireEvent("invalidated"); + }, + + /** + * Show the specified panel. + * @param {Number/String/ContentPanel} panelId The panels index, id or the panel itself + * @return {Ext.ContentPanel} The shown panel or null + */ + showPanel : function(panel){ + if(panel = this.getPanel(panel)){ + this.setActivePanel(panel); + } + return panel; + }, + + /** + * Get the active panel for this region. + * @return {Ext.ContentPanel} The active panel or null + */ + getActivePanel : function(){ + return this.activePanel; + }, + + /** + * Add the passed ContentPanel(s) + * @param {ContentPanel...} panel The ContentPanel(s) to add (you can pass more than one) + * @return {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; + } + if(this.hasPanel(panel)){ + this.showPanel(panel); + return panel; + } + var el = panel.getEl(); + if(el.dom.parentNode != this.mgr.el.dom){ + this.mgr.el.dom.appendChild(el.dom); + } + if(panel.setRegion){ + panel.setRegion(this); + } + this.panels.add(panel); + el.setStyle("position", "absolute"); + if(!panel.background){ + this.setActivePanel(panel); + if(this.config.initialSize && this.panels.getCount()==1){ + this.resizeTo(this.config.initialSize); + } + } + 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; + }, + + /** + * 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 {Ext.ContentPanel} The panel that was removed + */ + remove : function(panel, preservePanel){ + panel = this.getPanel(panel); + if(!panel){ + return null; + } + var e = {}; + this.fireEvent("beforeremove", this, panel, e); + if(e.cancel === true){ + return null; + } + var panelId = panel.getId(); + this.panels.removeKey(panelId); + return panel; + }, + + /** + * 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 {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; + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/layout/BorderLayout.js b/www/extras/yui-ext/source/widgets/layout/BorderLayout.js new file mode 100644 index 000000000..1b9c5bf56 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/layout/BorderLayout.js @@ -0,0 +1,338 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.BorderLayout + * @extends 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 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 = 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();
          +
          + +The container the layout is rendered into can be either the body element or any other element. +If it is not the body element, the element needs to either be an absolute positioned element, +or you will need to add "position:relative" to the css of the element. + +* @constructor +* Create a new BorderLayout +* @param {String/HTMLElement/Element} container The container this layout is bound to +* @param {Object} config Configuration options + */ +Ext.BorderLayout = function(container, config){ + config = config || {}; + Ext.BorderLayout.superclass.constructor.call(this, container, config); + this.factory = config.factory || Ext.BorderLayout.RegionFactory; + 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]); + } + } +}; + +Ext.extend(Ext.BorderLayout, 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.bindRegion(target, r); + } + return this.regions[target]; + }, + + // private (kinda) + bindRegion : function(name, r){ + this.regions[name] = r; + r.on("visibilitychange", this.layout, this); + r.on("paneladded", this.layout, this); + r.on("panelremoved", this.layout, this); + r.on("invalidated", this.layout, this); + r.on("resized", this.onRegionResized, this); + r.on("collapsed", this.onRegionCollapsed, this); + r.on("expanded", this.onRegionExpanded, this); + }, + + /** + * Performs a layout update. + */ + 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){ // not supported anymore + //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; + }, + + /** + * Adds a ContentPanel (or subclass) to this layout. + * @param {String} target The target region key (north, south, east, west or center). + * @param {Ext.ContentPanel} panel The panel to add + * @return {Ext.ContentPanel} The added panel + */ + add : function(target, panel){ + target = target.toLowerCase(); + return this.regions[target].add(panel); + }, + + /** + * Remove a ContentPanel (or subclass) to this layout. + * @param {String} target The target region key (north, south, east, west or center). + * @param {Number/String/Ext.ContentPanel} panel The index, id or panel to remove + * @return {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 {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 {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 Ext.state.Manager or the state provided by the passed provider. + * @param {Ext.state.Provider} provider (optional) An alternate state provider + */ + restoreState : function(provider){ + if(!provider){ + provider = Ext.state.Manager; + } + var sm = new Ext.LayoutStateManager(); + sm.init(this, provider); + }, + + + batchAdd : function(regions){ + this.beginUpdate(); + for(var rname in regions){ + var lr = this.regions[rname]; + if(lr){ + this.addTypedPanels(lr, regions[rname]); + } + } + this.endUpdate(); + }, + + /* @private */ + addTypedPanels : function(lr, ps){ + if(typeof ps == 'string'){ + lr.add(new Ext.ContentPanel(ps)); + } + else if(ps instanceof Array){ + for(var i =0, len = ps.length; i < len; i++){ + this.addTypedPanels(lr, ps[i]); + } + } + else if(!ps.events){ // raw config? + var el = ps.el; + delete ps.el; // prevent conflict + lr.add(new Ext.ContentPanel(el || Ext.id(), ps)); + } + else { // panel object assumed! + lr.add(ps); + } + } +}); + +Ext.BorderLayout.create = function(config, targetEl){ + var layout = new Ext.BorderLayout(targetEl || document.body, config); + layout.beginUpdate(); + var regions = Ext.BorderLayout.RegionFactory.validRegions; + for(var j = 0, jlen = regions.length; j < jlen; j++){ + var lr = regions[j]; + if(layout.regions[lr] && config[lr].panels){ + var r = layout.regions[lr]; + var ps = config[lr].panels; + layout.addTypedPanels(r, ps); + } + } + layout.endUpdate(); + return layout; +}; + +Ext.BorderLayout.RegionFactory = { + validRegions : ["north","south","east","west","center"], + + create : function(target, mgr, config){ + target = target.toLowerCase(); + if(config.lightweight || config.basic){ + return new Ext.BasicLayoutRegion(mgr, config, target); + } + switch(target){ + case "north": + return new Ext.NorthLayoutRegion(mgr, config); + case "south": + return new Ext.SouthLayoutRegion(mgr, config); + case "east": + return new Ext.EastLayoutRegion(mgr, config); + case "west": + return new Ext.WestLayoutRegion(mgr, config); + case "center": + return new Ext.CenterLayoutRegion(mgr, config); + } + throw 'Layout region "'+target+'" not supported.'; + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/layout/BorderLayoutRegions.js b/www/extras/yui-ext/source/widgets/layout/BorderLayoutRegions.js new file mode 100644 index 000000000..c147b3b9a --- /dev/null +++ b/www/extras/yui-ext/source/widgets/layout/BorderLayoutRegions.js @@ -0,0 +1,201 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* + * These classes are private internal classes + */ +Ext.CenterLayoutRegion = function(mgr, config){ + Ext.CenterLayoutRegion.superclass.constructor.call(this, mgr, config, "center"); + this.visible = true; + this.minWidth = config.minWidth || 20; + this.minHeight = config.minHeight || 20; +}; + +Ext.extend(Ext.CenterLayoutRegion, 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; + } +}); + + +Ext.NorthLayoutRegion = function(mgr, config){ + Ext.NorthLayoutRegion.superclass.constructor.call(this, mgr, config, "north", "n-resize"); + if(this.split){ + this.split.placement = Ext.SplitBar.TOP; + this.split.orientation = Ext.SplitBar.VERTICAL; + this.split.el.addClass("x-layout-split-v"); + } + var size = config.initialSize || config.height; + if(typeof size != "undefined"){ + this.el.setHeight(size); + } +}; +Ext.extend(Ext.NorthLayoutRegion, Ext.SplitLayoutRegion, { + orientation: Ext.SplitBar.VERTICAL, + 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.updateBody(box.width, null); + } + Ext.NorthLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +Ext.SouthLayoutRegion = function(mgr, config){ + Ext.SouthLayoutRegion.superclass.constructor.call(this, mgr, config, "south", "s-resize"); + if(this.split){ + this.split.placement = Ext.SplitBar.BOTTOM; + this.split.orientation = Ext.SplitBar.VERTICAL; + this.split.el.addClass("x-layout-split-v"); + } + var size = config.initialSize || config.height; + if(typeof size != "undefined"){ + this.el.setHeight(size); + } +}; +Ext.extend(Ext.SouthLayoutRegion, Ext.SplitLayoutRegion, { + orientation: Ext.SplitBar.VERTICAL, + 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.updateBody(box.width, null); + } + Ext.SouthLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +Ext.EastLayoutRegion = function(mgr, config){ + Ext.EastLayoutRegion.superclass.constructor.call(this, mgr, config, "east", "e-resize"); + if(this.split){ + this.split.placement = Ext.SplitBar.RIGHT; + this.split.orientation = Ext.SplitBar.HORIZONTAL; + this.split.el.addClass("x-layout-split-h"); + } + var size = config.initialSize || config.width; + if(typeof size != "undefined"){ + this.el.setWidth(size); + } +}; +Ext.extend(Ext.EastLayoutRegion, Ext.SplitLayoutRegion, { + orientation: Ext.SplitBar.HORIZONTAL, + 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.updateBody(null, box.height); + } + Ext.EastLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +Ext.WestLayoutRegion = function(mgr, config){ + Ext.WestLayoutRegion.superclass.constructor.call(this, mgr, config, "west", "w-resize"); + if(this.split){ + this.split.placement = Ext.SplitBar.LEFT; + this.split.orientation = Ext.SplitBar.HORIZONTAL; + this.split.el.addClass("x-layout-split-h"); + } + var size = config.initialSize || config.width; + if(typeof size != "undefined"){ + this.el.setWidth(size); + } +}; +Ext.extend(Ext.WestLayoutRegion, Ext.SplitLayoutRegion, { + orientation: Ext.SplitBar.HORIZONTAL, + 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.updateBody(null, box.height); + } + Ext.WestLayoutRegion.superclass.updateBox.call(this, box); + } +}); diff --git a/www/extras/yui-ext/source/widgets/layout/ContentPanels.js b/www/extras/yui-ext/source/widgets/layout/ContentPanels.js new file mode 100644 index 000000000..ed59f71fc --- /dev/null +++ b/www/extras/yui-ext/source/widgets/layout/ContentPanels.js @@ -0,0 +1,474 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.ContentPanel + * @extends Ext.util.Observable + * A basic ContentPanel element. + * @cfg {Boolean} fitToFrame True for this panel to adjust its size to fit when the region resizes (defaults to false) + * @cfg {Boolean} fitContainer When using fitToFrame and resizeEl, you can also fit the parent container (defaults to false) + * @cfg {Boolean/Object} autoCreate True to auto generate the DOM element for this panel, or a DomHelper config of the element to create + * @cfg {Boolean} closable True if the panel can be closed/removed + * @cfg {Boolean} background True if the panel should not be activated when it is added (defaults to false) + * @cfg {String/HTMLElement/Element} resizeEl An element to resize if fitToFrame is true (instead of this panel's element) + * @cfg {Toolbar} toolbar A toolbar for this panel + * @cfg {Boolean} autoScroll True to scroll overflow in this panel (use with fitToFrame) + * @cfg {String} title The title for this panel + * @cfg {Array} adjustments Values to add to the width/height when doing a fitToFrame (default is [0, 0]) + * @cfg {String} url Calls setUrl() with this value + * @cfg {String/Object} params When used with "url", calls setUrl() with this value + * @cfg {Boolean} loadOnce Calls When used with "url", calls setUrl() with this value + * @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 + */ +Ext.ContentPanel = function(el, config, content){ + Ext.ContentPanel.superclass.constructor.call(this); + if(el.autoCreate){ + config = el; + el = Ext.id(); + } + this.el = Ext.get(el); + if(!this.el && config && config.autoCreate){ + if(typeof config.autoCreate == "object"){ + if(!config.autoCreate.id){ + config.autoCreate.id = config.id||el; + } + this.el = Ext.DomHelper.append(document.body, + config.autoCreate, true); + }else{ + this.el = Ext.DomHelper.append(document.body, + {tag: "div", cls: "x-layout-inactive-content", id: config.id||el}, true); + } + } + this.closable = false; + this.loaded = false; + this.active = false; + if(typeof config == "string"){ + this.title = config; + }else{ + Ext.apply(this, config); + } + if(this.resizeEl){ + this.resizeEl = Ext.get(this.resizeEl, true); + }else{ + this.resizeEl = this.el; + } + this.addEvents({ + /** + * @event activate + * Fires when this panel is activated. + * @param {Ext.ContentPanel} this + */ + "activate" : true, + /** + * @event deactivate + * Fires when this panel is activated. + * @param {Ext.ContentPanel} this + */ + "deactivate" : true, + + /** + * @event resize + * Fires when this panel is resized if fitToFrame is true. + * @param {Ext.ContentPanel} this + * @param {Number} width The width after any component adjustments + * @param {Number} height The height after any component adjustments + */ + "resize" : true + }); + if(this.autoScroll){ + this.resizeEl.setStyle("overflow", "auto"); + } + content = content || this.content; + if(content){ + this.setContent(content); + } + if(config && config.url){ + this.setUrl(this.url, this.params, this.loadOnce); + } +}; + +Ext.extend(Ext.ContentPanel, Ext.util.Observable, { + tabTip:'', + setRegion : function(region){ + this.region = region; + if(region){ + this.el.replaceClass("x-layout-inactive-content", "x-layout-active-content"); + }else{ + this.el.replaceClass("x-layout-active-content", "x-layout-inactive-content"); + } + }, + + /** + * Returns the toolbar for this Panel if one was configured. + * @return {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); + }, + + ignoreResize : function(w, h){ + if(this.lastSize && this.lastSize.width == w && this.lastSize.height == h){ + return true; + }else{ + this.lastSize = {width: w, height: h}; + return false; + } + }, + /** + * Get the {@link Ext.UpdateManager} for this panel. Enables you to perform Ajax updates. + * @return {Ext.UpdateManager} The UpdateManager + */ + getUpdateManager : function(){ + return this.el.getUpdateManager(); + }, + /** + * Loads this content panel immediately with content from XHR. Note: to delay loading until the panel is activated, use setUrl. + * @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: +
          
          +panel.load({
          + url: "your-url.php",
          + params: {param1: "foo", param2: "bar"}, // or a URL encoded string
          + callback: yourFunction,
          + scope: yourObject, //(optional scope)
          + discardUrl: false,
          + nocache: false,
          + text: "Loading...",
          + timeout: 30,
          + scripts: 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 panel 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, oResponse) + * @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 {Ext.ContentPanel} this + */ + load : function(){ + var um = this.el.getUpdateManager(); + um.update.apply(um, arguments); + return this; + }, + + + /** + * Set a URL to be used to load the content for this panel. When this panel is activated, the content will be loaded from that URL. + * @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 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 {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 {Ext.Element} + */ + getEl : function(){ + return this.el; + }, + + adjustForComponents : function(width, height){ + if(this.resizeEl != this.el){ + width -= this.el.getFrameWidth('lr'); + height -= this.el.getFrameWidth('tb'); + } + if(this.toolbar){ + var te = this.toolbar.getEl(); + height -= te.getHeight(); + te.setWidth(width); + } + if(this.adjustments){ + width += this.adjustments[0]; + height += this.adjustments[1]; + } + return {"width": width, "height": height}; + }, + + setSize : function(width, height){ + if(this.fitToFrame && !this.ignoreResize(width, height)){ + if(this.fitContainer && this.resizeEl != this.el){ + this.el.setSize(width, height); + } + var size = this.adjustForComponents(width, height); + this.resizeEl.setSize(this.autoWidth ? "auto" : size.width, this.autoHeight ? "auto" : size.height); + this.fireEvent('resize', this, 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(); + }, + + /** + * Force a content refresh from the URL specified in the setUrl() method. + * Will fail silently if the setUrl method has not been called. + * This does not activate the panel, just updates its content. + */ + refresh : function(){ + if(this.refreshDelegate){ + this.loaded = false; + this.refreshDelegate(); + } + }, + + /** + * Destroys this panel + */ + destroy : function(){ + this.el.removeAllListeners(); + var tempEl = document.createElement("span"); + tempEl.appendChild(this.el.dom); + tempEl.innerHTML = ""; + this.el.remove(); + this.el = null; + } +}); + +/** + * @class Ext.GridPanel + * @extends Ext.ContentPanel + * @constructor + * Create a new GridPanel. + * @param {Ext.grid.Grid} grid The grid for this panel + * @param {String/Object} config A string to set only the title or a config object + */ +Ext.GridPanel = function(grid, config){ + this.wrapper = Ext.DomHelper.append(document.body, // wrapper for IE7 strict & safari scroll issue + {tag: "div", cls: "x-layout-grid-wrapper x-layout-inactive-content"}, true); + this.wrapper.dom.appendChild(grid.container.dom); + 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("x-layout-inactive-content", "x-layout-component-panel"); +}; + +Ext.extend(Ext.GridPanel, Ext.ContentPanel, { + getId : function(){ + return this.grid.id; + }, + + /** + * Returns the grid for this panel + * @return {Ext.grid.Grid} + */ + getGrid : function(){ + return this.grid; + }, + + setSize : function(width, height){ + if(!this.ignoreResize(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().scroller.clip(); + }, + + afterSlide : function(){ + this.grid.getView().scroller.unclip(); + }, + + destroy : function(){ + this.grid.destroy(); + delete this.grid; + Ext.GridPanel.superclass.destroy.call(this); + } +}); + + +/** + * @class Ext.NestedLayoutPanel + * @extends Ext.ContentPanel + * @constructor + * Create a new NestedLayoutPanel. + * @param {Ext.BorderLayout} layout The layout for this panel + * @param {String/Object} config A string to set only the title or a config object + */ +Ext.NestedLayoutPanel = function(layout, config){ + Ext.NestedLayoutPanel.superclass.constructor.call(this, layout.getEl(), config); + layout.monitorWindowResize = false; // turn off autosizing + this.layout = layout; + this.layout.getEl().addClass("x-layout-nested-layout"); +}; + +Ext.extend(Ext.NestedLayoutPanel, Ext.ContentPanel, { + + setSize : function(width, height){ + if(!this.ignoreResize(width, height)){ + var size = this.adjustForComponents(width, height); + var el = this.layout.getEl(); + el.setSize(size.width, size.height); + var touch = el.dom.offsetWidth; + this.layout.layout(); + // ie requires a double layout on the first pass + if(Ext.isIE && !this.initialized){ + this.initialized = true; + this.layout.layout(); + } + } + }, + + /** + * Returns the nested BorderLayout for this panel + * @return {Ext.BorderLayout} + */ + getLayout : function(){ + return this.layout; + } +}); + +Ext.ScrollPanel = function(el, config, content){ + config = config || {}; + config.fitToFrame = true; + Ext.ScrollPanel.superclass.constructor.call(this, el, config, content); + + this.el.dom.style.overflow = "hidden"; + var wrap = this.el.wrap({cls: "x-scroller x-layout-inactive-content"}); + this.el.removeClass("x-layout-inactive-content"); + this.el.on("mousewheel", this.onWheel, this); + + var up = wrap.createChild({cls: "x-scroller-up", html: " "}, this.el.dom); + var down = wrap.createChild({cls: "x-scroller-down", html: " "}); + up.unselectable(); down.unselectable(); + up.on("click", this.scrollUp, this); + down.on("click", this.scrollDown, this); + up.addClassOnOver("x-scroller-btn-over"); + down.addClassOnOver("x-scroller-btn-over"); + up.addClassOnClick("x-scroller-btn-click"); + down.addClassOnClick("x-scroller-btn-click"); + this.adjustments = [0, -(up.getHeight() + down.getHeight())]; + + this.resizeEl = this.el; + this.el = wrap; this.up = up; this.down = down; +}; + +Ext.extend(Ext.ScrollPanel, Ext.ContentPanel, { + increment : 100, + wheelIncrement : 5, + scrollUp : function(){ + this.resizeEl.scroll("up", this.increment, {callback: this.afterScroll, scope: this}); + }, + + scrollDown : function(){ + this.resizeEl.scroll("down", this.increment, {callback: this.afterScroll, scope: this}); + }, + + afterScroll : function(){ + var el = this.resizeEl; + var t = el.dom.scrollTop, h = el.dom.scrollHeight, ch = el.dom.clientHeight; + this.up[t == 0 ? "addClass" : "removeClass"]("x-scroller-btn-disabled"); + this.down[h - t <= ch ? "addClass" : "removeClass"]("x-scroller-btn-disabled"); + }, + + setSize : function(){ + Ext.ScrollPanel.superclass.setSize.apply(this, arguments); + this.afterScroll(); + }, + + onWheel : function(e){ + var d = e.getWheelDelta(); + this.resizeEl.dom.scrollTop -= (d*this.wheelIncrement); + this.afterScroll(); + e.stopEvent(); + }, + + setContent : function(content, loadScripts){ + this.resizeEl.update(content, loadScripts); + } + +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/layout/LayoutManager.js b/www/extras/yui-ext/source/widgets/layout/LayoutManager.js new file mode 100644 index 000000000..5ab85c70b --- /dev/null +++ b/www/extras/yui-ext/source/widgets/layout/LayoutManager.js @@ -0,0 +1,143 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.LayoutManager + * @extends Ext.util.Observable + * Base class for layout managers. + */ +Ext.LayoutManager = function(container, config){ + Ext.LayoutManager.superclass.constructor.call(this); + this.el = Ext.get(container); + // ie scrollbar fix + if(this.el.dom == document.body && Ext.isIE && !config.allowScroll){ + document.body.scroll = "no"; + }else if(this.el.dom != document.body && this.el.getStyle('position') == 'static'){ + this.el.position('relative'); + } + this.id = this.el.id; + this.el.addClass("x-layout-container"); + /** false to disable window resize monitoring @type Boolean */ + this.monitorWindowResize = true; + this.regions = {}; + this.addEvents({ + /** + * @event layout + * Fires when a layout is performed. + * @param {Ext.LayoutManager} this + */ + "layout" : true, + /** + * @event regionresized + * Fires when the user resizes a region. + * @param {Ext.LayoutRegion} region + * @param {Number} newSize The new size (width for east/west, height for north/south) + */ + "regionresized" : true, + /** + * @event regioncollapsed + * Fires when a region is collapsed. + * @param {Ext.LayoutRegion} region + */ + "regioncollapsed" : true, + /** + * @event regionexpanded + * Fires when a region is expanded. + * @param {Ext.LayoutRegion} region + */ + "regionexpanded" : true + }); + this.updating = false; + Ext.EventManager.onWindowResize(this.onWindowResize, this, true); +}; + +Ext.extend(Ext.LayoutManager, 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){ + size = this.el.getSize(); + }else{ + size = {width: Ext.lib.Dom.getViewWidth(), height: Ext.lib.Dom.getViewHeight()}; + } + 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 {Ext.Element} + */ + getEl : function(){ + return this.el; + }, + + /** + * Returns the specified region. + * @param {String} target The region key + * @return {Ext.LayoutRegion} + */ + getRegion : function(target){ + return this.regions[target.toLowerCase()]; + }, + + onWindowResize : function(){ + if(this.monitorWindowResize){ + this.layout(); + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/layout/LayoutRegion.js b/www/extras/yui-ext/source/widgets/layout/LayoutRegion.js new file mode 100644 index 000000000..dc6d6467e --- /dev/null +++ b/www/extras/yui-ext/source/widgets/layout/LayoutRegion.js @@ -0,0 +1,590 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.LayoutRegion + * @extends Ext.BasicLayoutRegion + * This class represents a region in a layout manager. + * @cfg {Boolean} collapsible False to disable collapsing (defaults to true) + * @cfg {Boolean} collapsed True to set the initial display to collapsed (defaults to false) + * @cfg {Boolean} floatable False to disable floating (defaults to true) + * @cfg {Object} margins Margins for the element (defaults to {top: 0, left: 0, right:0, bottom: 0}) + * @cfg {Object} cmargins Margins for the element when collapsed (defaults to: north/south {top: 2, left: 0, right:0, bottom: 2} or east/west {top: 0, left: 2, right:2, bottom: 0}) + * @cfg {String} tabPosition "top" or "bottom" (defaults to "bottom") + * @cfg {String} collapsedTitle Optional string message to display in the collapsed block of a north or south region + * @cfg {Boolean} alwaysShowTabs True to always display tabs even when only 1 panel (defaults to false) + * @cfg {Boolean} autoScroll True to enable overflow scrolling (defaults to false) + * @cfg {Boolean} titlebar True to display a title bar (defaults to true) + * @cfg {String} title The title for the region (overrides panel titles) + * @cfg {Boolean} animate True to animate expand/collapse (defaults to false) + * @cfg {Boolean} autoHide False to disable autoHide when the mouse leaves the "floated" region (defaults to true) + * @cfg {Boolean} preservePanels True to preserve removed panels so they can be readded later (defaults to false) + * @cfg {Boolean} closeOnTab True to place the close icon on the tabs instead of the region titlebar (defaults to false) + * @cfg {Boolean} hideTabs True to hide the tab strip (defaults to false) + * @cfg {Boolean} resizeTabs True to enable automatic tab resizing. This will resize the tabs so they are all the same size and fit within + * the space available, similar to FireFox 1.5 tabs (defaults to false) + * @cfg {Number} minTabWidth The minimum tab width (defaults to 40) + * @cfg {Number} preferredTabWidth The preferred tab width (defaults to 150) + * @cfg {Boolean} showPin True to show a pin button +* @cfg {Boolean} hidden True to start the region hidden +* @cfg {Boolean} hideWhenEmpty True to hide the region when it has no panels +* @cfg {Boolean} disableTabTips True to disable tab tooltips + */ +Ext.LayoutRegion = function(mgr, config, pos){ + Ext.LayoutRegion.superclass.constructor.call(this, mgr, config, pos, true); + var dh = Ext.DomHelper; + /** This regions container element @type Ext.Element */ + this.el = dh.append(mgr.el.dom, {tag: "div", cls: "x-layout-panel x-layout-panel-" + this.position}, true); + /** This regions title element @type Ext.Element */ + + this.titleEl = dh.append(this.el.dom, {tag: "div", unselectable: "on", cls: "x-unselectable x-layout-panel-hd x-layout-title-"+this.position, children:[ + {tag: "span", cls: "x-unselectable x-layout-panel-hd-text", unselectable: "on", html: " "}, + {tag: "div", cls: "x-unselectable x-layout-panel-hd-tools", unselectable: "on"} + ]}, true); + this.titleEl.enableDisplayMode(); + /** This regions title text element @type HTMLElement */ + this.titleTextEl = this.titleEl.dom.firstChild; + this.tools = Ext.get(this.titleEl.dom.childNodes[1], true); + this.closeBtn = this.createTool(this.tools.dom, "x-layout-close"); + this.closeBtn.enableDisplayMode(); + this.closeBtn.on("click", this.closeClicked, this); + this.closeBtn.hide(); + + this.createBody(config); + this.visible = true; + this.collapsed = false; + + if(config.hideWhenEmpty){ + this.hide(); + this.on("paneladded", this.validateVisibility, this); + this.on("panelremoved", this.validateVisibility, this); + } + this.applyConfig(config); +}; + +Ext.extend(Ext.LayoutRegion, Ext.BasicLayoutRegion, { + + createBody : function(){ + /** This regions body element @type Ext.Element */ + this.bodyEl = this.el.createChild({tag: "div", cls: "x-layout-panel-body"}); + }, + + applyConfig : function(c){ + if(c.collapsible && this.position != "center" && !this.collapsedEl){ + var dh = Ext.DomHelper; + if(c.titlebar !== false){ + this.collapseBtn = this.createTool(this.tools.dom, "x-layout-collapse-"+this.position); + this.collapseBtn.on("click", this.collapse, this); + this.collapseBtn.enableDisplayMode(); + + if(c.showPin === true || this.showPin){ + this.stickBtn = this.createTool(this.tools.dom, "x-layout-stick"); + this.stickBtn.enableDisplayMode(); + this.stickBtn.on("click", this.expand, this); + this.stickBtn.hide(); + } + } + /** This region's collapsed element @type Ext.Element */ + this.collapsedEl = dh.append(this.mgr.el.dom, {cls: "x-layout-collapsed x-layout-collapsed-"+this.position, children:[ + {cls: "x-layout-collapsed-tools", children:[{cls: "x-layout-ctools-inner"}]} + ]}, true); + if(c.floatable !== false){ + this.collapsedEl.addClassOnOver("x-layout-collapsed-over"); + this.collapsedEl.on("click", this.collapseClick, this); + } + + if(c.collapsedTitle && (this.position == "north" || this.position== "south")) { + this.collapsedTitleTextEl = dh.append(this.collapsedEl.dom, {tag: "div", cls: "x-unselectable x-layout-panel-hd-text", + id: "message", unselectable: "on", style:{"float":"left"}}); + this.collapsedTitleTextEl.innerHTML = c.collapsedTitle; + } + this.expandBtn = this.createTool(this.collapsedEl.dom.firstChild.firstChild, "x-layout-expand-"+this.position); + this.expandBtn.on("click", this.expand, this); + } + if(this.collapseBtn){ + this.collapseBtn.setVisible(c.collapsible == true); + } + this.cmargins = c.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 = c.margins || this.margins || {top: 0, left: 0, right:0, bottom: 0}; + this.bottomTabs = c.tabPosition != "top"; + this.autoScroll = c.autoScroll || false; + if(this.autoScroll){ + this.bodyEl.setStyle("overflow", "auto"); + }else{ + this.bodyEl.setStyle("overflow", "hidden"); + } + //if(c.titlebar !== false){ + if((!c.titlebar && !c.title) || c.titlebar === false){ + this.titleEl.hide(); + }else{ + this.titleEl.show(); + if(c.title){ + this.titleTextEl.innerHTML = c.title; + } + } + //} + this.duration = c.duration || .30; + this.slideDuration = c.slideDuration || .45; + this.config = c; + if(c.collapsed){ + this.collapse(true); + } + if(c.hidden){ + this.hide(); + } + }, + /** + * Returns true if this region is currently visible. + * @return {Boolean} + */ + isVisible : function(){ + return this.visible; + }, + + /** + * Updates the collapsed text for north/south regions (used with collapsedTitle config option) + */ + setCollapsedTitle : function(title){ + title = title || " "; + if(this.collapsedTitleTextEl){ + this.collapsedTitleTextEl.innerHTML = title; + } + }, + + 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("x-layout-panel-dragover"); + }, + + unhighlight : function(){ + this.el.removeClass("x-layout-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.updateBody(box.width, box.height); + }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(); + } + }, + + updateBody : function(w, h){ + if(w !== null){ + this.el.setWidth(w); + w -= this.el.getBorderWidth("rl"); + if(this.config.adjustments){ + w += this.config.adjustments[0]; + } + } + if(h !== null){ + this.el.setHeight(h); + h = this.titleEl && this.titleEl.isDisplayed() ? h - (this.titleEl.getHeight()||0) : h; + h -= this.el.getBorderWidth("tb"); + if(this.config.adjustments){ + h += this.config.adjustments[1]; + } + this.bodyEl.setHeight(h); + if(this.tabs){ + h = this.tabs.syncHeight(h); + } + } + if(this.panelSize){ + w = w !== null ? w : this.panelSize.width; + h = h !== null ? h : this.panelSize.height; + } + if(this.activePanel){ + var el = this.activePanel.getEl(); + w = w !== null ? w : el.getWidth(); + h = h !== null ? h : el.getHeight(); + this.panelSize = {width: w, height: h}; + this.activePanel.setSize(w, h); + } + if(Ext.isIE && this.tabs){ + this.tabs.el.repaint(); + } + }, + + /** + * Returns the container element for this region. + * @return {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); + }, + + 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.fireEvent("invalidated", this); + 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 {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 || this.el.hasActiveFx()) return; + if(this.isSlid){ + this.afterSlideIn(); + skipAnim = true; + } + this.collapsed = false; + if(this.config.animate && skipAnim !== true){ + this.animateExpand(); + }else{ + this.el.show(); + 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 Ext.TabPanel(this.bodyEl.dom, { + tabPosition: this.bottomTabs ? 'bottom' : 'top', + disableTooltips: this.config.disableTabTips + }); + if(this.config.hideTabs){ + ts.stripWrap.setDisplayed(false); + } + 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"); + ts.bodyEl.addClass('x-layout-tabs-body'); + 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()); + if(panel.tabTip !== undefined){ + ti.setTooltip(panel.tabTip); + } + ti.on("activate", function(){ + this.setActivePanel(panel); + }, this); + if(this.config.closeOnTab){ + ti.on("beforeclose", function(t, e){ + e.cancel = true; + this.remove(panel); + }, this); + } + return ti; + }, + + updatePanelTitle : function(panel, title){ + if(this.activePanel == panel){ + this.updateTitle(title); + } + if(this.tabs){ + var ti = this.tabs.getTab(panel.getEl().id); + ti.setText(title); + if(panel.tabTip !== undefined){ + ti.setTooltip(panel.tabTip); + } + } + }, + + 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); + } + if(this.closeBtn){ + this.closeBtn.setVisible(!this.config.closeOnTab && !this.isSlid && panel.isClosable()); + } + this.updateTitle(panel.getTitle()); + if(this.tabs){ + this.fireEvent("invalidated", this); + } + this.fireEvent("panelactivated", this, panel); + }, + + /** + * Show the specified panel. + * @param {Number/String/ContentPanel} panelId The panels index, id or the panel itself + * @return {Ext.ContentPanel} The shown panel or null + */ + showPanel : function(panel){ + if(panel = this.getPanel(panel)){ + if(this.tabs){ + var tab = this.tabs.getTab(panel.getEl().id); + if(tab.isHidden()){ + this.tabs.unhideTab(tab.id); + } + tab.activate(); + }else{ + this.setActivePanel(panel); + } + } + return panel; + }, + + /** + * Get the active panel for this region. + * @return {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 {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; + } + if(this.hasPanel(panel)){ + this.showPanel(panel); + return panel; + } + panel.setRegion(this); + this.panels.add(panel); + if(this.panels.getCount() == 1 && !this.config.alwaysShowTabs){ + this.bodyEl.dom.appendChild(panel.getEl().dom); + if(panel.background !== true){ + this.setActivePanel(panel); + } + this.fireEvent("paneladded", this, panel); + return panel; + } + if(!this.tabs){ + this.initTabs(); + }else{ + this.initPanelAsTab(panel); + } + if(panel.background !== true){ + this.tabs.activate(panel.getEl().id); + } + this.fireEvent("paneladded", this, panel); + return panel; + }, + + /** + * 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); + } + }, + + clearPanels : function(){ + while(this.panels.getCount() > 0){ + this.remove(this.panels.first()); + } + }, + + /** + * 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 {Ext.ContentPanel} The panel that was removed + */ + remove : function(panel, preservePanel){ + panel = this.getPanel(panel); + if(!panel){ + return null; + } + var e = {}; + this.fireEvent("beforeremove", this, panel, e); + if(e.cancel === true){ + return null; + } + preservePanel = (typeof preservePanel != "undefined" ? preservePanel : (this.config.preservePanels === true || panel.preserve === 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("div"); // 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 {Ext.TabPanel} + */ + getTabs : function(){ + return this.tabs; + }, + + createTool : function(parentEl, className){ + var btn = Ext.DomHelper.append(parentEl, {tag: "div", cls: "x-layout-tools-button", + children: [{tag: "div", cls: "x-layout-tools-button-inner " + className, html: " "}]}, true); + btn.addClassOnOver("x-layout-tools-button-over"); + return btn; + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/layout/LayoutStateManager.js b/www/extras/yui-ext/source/widgets/layout/LayoutStateManager.js new file mode 100644 index 000000000..c87d03899 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/layout/LayoutStateManager.js @@ -0,0 +1,76 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* + * Private internal class for reading and applying state + */ +Ext.LayoutStateManager = function(layout){ + // default empty state + this.state = { + north: {}, + south: {}, + east: {}, + west: {} + }; +}; + +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); + layout.on("regioncollapsed", this.onRegionCollapsed, this); + layout.on("regionexpanded", this.onRegionExpanded, this); + }, + + 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/widgets/layout/ReaderLayout.js b/www/extras/yui-ext/source/widgets/layout/ReaderLayout.js new file mode 100644 index 000000000..3300e0056 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/layout/ReaderLayout.js @@ -0,0 +1,105 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.ReaderLayout + * @extends Ext.BorderLayout + * This is a pre-built layout that represents a classic, 5-pane application. It consists of a header, a primary + * center region containing two nested regions (a top one for a list view and one for item preview below), + * and regions on either side that can be used for navigation, application commands, informational displays, etc. + * The setup and configuration work exactly the same as it does for a {@link Ext.BorderLayout} - this class simply + * expedites the setup of the overall layout and regions for this common application style. + * Example: +
          
          +var reader = new Ext.ReaderLayout();
          +var CP = Ext.ContentPanel;  // shortcut for adding
          +
          +reader.beginUpdate();
          +reader.add("north", new CP("north", "North"));
          +reader.add("west", new CP("west", {title: "West"}));
          +reader.add("east", new CP("east", {title: "East"}));
          +
          +reader.regions.listView.add(new CP("listView", "List"));
          +reader.regions.preview.add(new CP("preview", "Preview"));
          +reader.endUpdate();
          +
          +* @constructor +* Create a new ReaderLayout +* @param {Object} config Configuration options +* @param {String/HTMLElement/Element} container (optional) The container this layout is bound to (defaults to +* document.body if omitted) +*/ +Ext.ReaderLayout = function(config, renderTo){ + var c = config || {size:{}}; + Ext.ReaderLayout.superclass.constructor.call(this, renderTo || document.body, { + north: c.north !== false ? Ext.apply({ + split:false, + initialSize: 32, + titlebar: false + }, c.north) : false, + west: c.west !== false ? Ext.apply({ + split:true, + initialSize: 200, + minSize: 175, + maxSize: 400, + titlebar: true, + collapsible: true, + animate: true, + margins:{left:5,right:0,bottom:5,top:5}, + cmargins:{left:5,right:5,bottom:5,top:5} + }, c.west) : false, + east: c.east !== false ? Ext.apply({ + split:true, + initialSize: 200, + minSize: 175, + maxSize: 400, + titlebar: true, + collapsible: true, + animate: true, + margins:{left:0,right:5,bottom:5,top:5}, + cmargins:{left:5,right:5,bottom:5,top:5} + }, c.east) : false, + center: Ext.apply({ + tabPosition: 'top', + autoScroll:false, + closeOnTab: true, + titlebar:false, + margins:{left:c.west!==false ? 0 : 5,right:c.east!==false ? 0 : 5,bottom:5,top:2} + }, c.center) + }); + + this.el.addClass('x-reader'); + + this.beginUpdate(); + + var inner = new Ext.BorderLayout(Ext.get(document.body).createChild(), { + south: c.preview !== false ? Ext.apply({ + split:true, + initialSize: 200, + minSize: 100, + autoScroll:true, + collapsible:true, + titlebar: true, + cmargins:{top:5,left:0, right:0, bottom:0} + }, c.preview) : false, + center: Ext.apply({ + autoScroll:false, + titlebar:false, + minHeight:200 + }, c.listView) + }); + this.add('center', new Ext.NestedLayoutPanel(inner, + Ext.apply({title: c.mainTitle || '',tabTip:''},c.innerPanelCfg))); + + this.endUpdate(); + + this.regions.preview = inner.getRegion('south'); + this.regions.listView = inner.getRegion('center'); +}; + +Ext.extend(Ext.ReaderLayout, Ext.BorderLayout); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/layout/SplitLayoutRegion.js b/www/extras/yui-ext/source/widgets/layout/SplitLayoutRegion.js new file mode 100644 index 000000000..b806d7e2a --- /dev/null +++ b/www/extras/yui-ext/source/widgets/layout/SplitLayoutRegion.js @@ -0,0 +1,333 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.SplitLayoutRegion + * @extends Ext.LayoutRegion + * Adds a splitbar and other (private) useful functionality to a LayoutRegion + */ +Ext.SplitLayoutRegion = function(mgr, config, pos, cursor){ + this.cursor = cursor; + Ext.SplitLayoutRegion.superclass.constructor.call(this, mgr, config, pos); +}; + +Ext.extend(Ext.SplitLayoutRegion, Ext.LayoutRegion, { + splitTip : "Drag to resize.", + collapsibleSplitTip : "Drag to resize. Double click to hide.", + useSplitTips : false, + + applyConfig : function(config){ + Ext.SplitLayoutRegion.superclass.applyConfig.call(this, config); + if(config.split){ + if(!this.split){ + var splitEl = Ext.DomHelper.append(this.mgr.el.dom, + {tag: "div", id: this.el.id + "-split", cls: "x-layout-split x-layout-split-"+this.position, html: " "}); + /** The SplitBar for this region @type Ext.SplitBar */ + this.split = new Ext.SplitBar(splitEl, this.el, this.orientation); + this.split.on("moved", this.onSplitMove, this); + this.split.useShim = config.useShim === true; + this.split.getMaximumSize = this[this.position == 'north' || this.position == 'south' ? 'getVMaxSize' : 'getHMaxSize'].createDelegate(this); + if(this.useSplitTips){ + this.split.el.dom.title = config.collapsible ? this.collapsibleSplitTip : this.splitTip; + } + if(config.collapsible){ + this.split.el.on("dblclick", this.collapse, this); + } + } + if(typeof config.minSize != "undefined"){ + this.split.minSize = config.minSize; + } + if(typeof config.maxSize != "undefined"){ + this.split.maxSize = config.maxSize; + } + if(config.hideWhenEmpty || config.hidden){ + this.hideSplitter(); + } + } + }, + + getHMaxSize : 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()); + }, + + getVMaxSize : function(){ + var cmax = this.config.maxSize || 10000; + var center = this.mgr.getRegion("center"); + return Math.min(cmax, (this.el.getHeight()+center.getEl().getHeight())-center.getMinHeight()); + }, + + onSplitMove : function(split, newSize){ + this.fireEvent("resized", this, newSize); + }, + + /** + * Returns the SplitBar for this region. + * @return {Ext.SplitBar} + */ + getSplitBar : function(){ + return this.split; + }, + + hide : function(){ + this.hideSplitter(); + Ext.SplitLayoutRegion.superclass.hide.call(this); + }, + + hideSplitter : function(){ + if(this.split){ + this.split.el.setLocation(-2000,-2000); + this.split.el.hide(); + } + }, + + show : function(){ + if(this.split){ + this.split.el.show(); + } + Ext.SplitLayoutRegion.superclass.show.call(this); + }, + + beforeSlide: function(){ + if(Ext.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(Ext.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(); + } + } + } + }, + + initAutoHide : function(){ + if(this.autoHide !== false){ + if(!this.autoHideHd){ + var st = new Ext.util.DelayedTask(this.slideIn, this); + this.autoHideHd = { + "mouseout": function(e){ + if(!e.within(this.el, true)){ + st.delay(500); + } + }, + "mouseover" : function(e){ + st.cancel(); + }, + scope : this + }; + } + this.el.on(this.autoHideHd); + } + }, + + clearAutoHide : function(){ + if(this.autoHide !== false){ + this.el.un("mouseout", this.autoHideHd.mouseout); + this.el.un("mouseover", this.autoHideHd.mouseover); + } + }, + + clearMonitor : function(){ + Ext.get(document).un("click", this.slideInIf, this); + }, + + // these names are backwards but not changed for compat + slideOut : function(){ + if(this.isSlid || this.el.hasActiveFx()){ + return; + } + this.isSlid = true; + if(this.collapseBtn){ + this.collapseBtn.hide(); + } + this.closeBtnState = this.closeBtn.getStyle('display'); + this.closeBtn.hide(); + if(this.stickBtn){ + this.stickBtn.show(); + } + this.el.show(); + this.el.alignTo(this.collapsedEl, this.getCollapseAnchor()); + this.beforeSlide(); + this.el.setStyle("z-index", 20000); + this.el.slideIn(this.getSlideAnchor(), { + callback: function(){ + this.afterSlide(); + this.initAutoHide(); + Ext.get(document).on("click", this.slideInIf, this); + this.fireEvent("slideshow", this); + }, + scope: this, + block: true + }); + }, + + afterSlideIn : function(){ + this.clearAutoHide(); + this.isSlid = false; + this.clearMonitor(); + this.el.setStyle("z-index", ""); + if(this.collapseBtn){ + this.collapseBtn.show(); + } + this.closeBtn.setStyle('display', this.closeBtnState); + if(this.stickBtn){ + this.stickBtn.hide(); + } + this.fireEvent("slidehide", this); + }, + + slideIn : function(cb){ + if(!this.isSlid || this.el.hasActiveFx()){ + Ext.callback(cb); + return; + } + this.isSlid = false; + this.beforeSlide(); + this.el.slideOut(this.getSlideAnchor(), { + callback: function(){ + this.el.setLeftTop(-10000, -10000); + this.afterSlide(); + this.afterSlideIn(); + Ext.callback(cb); + }, + scope: this, + block: true + }); + }, + + slideInIf : function(e){ + if(!e.within(this.el)){ + this.slideIn(); + } + }, + + animateCollapse : function(){ + this.beforeSlide(); + this.el.setStyle("z-index", 20000); + var anchor = this.getSlideAnchor(); + this.el.slideOut(anchor, { + callback : function(){ + this.el.setStyle("z-index", ""); + this.collapsedEl.slideIn(anchor, {duration:.3}); + this.afterSlide(); + this.el.setLocation(-10000,-10000); + this.el.hide(); + this.fireEvent("collapsed", this); + }, + scope: this, + block: true + }); + }, + + animateExpand : function(){ + this.beforeSlide(); + this.el.alignTo(this.collapsedEl, this.getCollapseAnchor(), this.getExpandAdj()); + this.el.setStyle("z-index", 20000); + this.collapsedEl.hide({ + duration:.1 + }); + this.el.slideIn(this.getSlideAnchor(), { + callback : function(){ + this.el.setStyle("z-index", ""); + this.afterSlide(); + if(this.split){ + this.split.el.show(); + } + this.fireEvent("invalidated", this); + this.fireEvent("expanded", this); + }, + scope: this, + block: true + }); + }, + + anchors : { + "west" : "left", + "east" : "right", + "north" : "top", + "south" : "bottom" + }, + + sanchors : { + "west" : "l", + "east" : "r", + "north" : "t", + "south" : "b" + }, + + canchors : { + "west" : "tl-tr", + "east" : "tr-tl", + "north" : "tl-bl", + "south" : "bl-tl" + }, + + getAnchor : function(){ + return this.anchors[this.position]; + }, + + getCollapseAnchor : function(){ + return this.canchors[this.position]; + }, + + getSlideAnchor : function(){ + return this.sanchors[this.position]; + }, + + getAlignAdj : function(){ + var cm = this.cmargins; + switch(this.position){ + case "west": + return [0, 0]; + break; + case "east": + return [0, 0]; + break; + case "north": + return [0, 0]; + break; + case "south": + return [0, 0]; + break; + } + }, + + getExpandAdj : function(){ + var c = this.collapsedEl, cm = this.cmargins; + switch(this.position){ + case "west": + return [-(cm.right+c.getWidth()+cm.left), 0]; + break; + case "east": + return [cm.right+c.getWidth()+cm.left, 0]; + break; + case "north": + return [0, -(cm.top+cm.bottom+c.getHeight())]; + break; + case "south": + return [0, cm.top+cm.bottom+c.getHeight()]; + break; + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/menu/Adapter.js b/www/extras/yui-ext/source/widgets/menu/Adapter.js new file mode 100644 index 000000000..13585e058 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/menu/Adapter.js @@ -0,0 +1,58 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.menu.Adapter + * @extends Ext.menu.BaseItem + * A base utility class that adapts a non-menu component so that it can be wrapped by a menu item and added to a menu. + * It provides basic rendering, activation management and enable/disable logic required to work in menus. + * @constructor + * Creates a new Adapter + * @param {Object} config Configuration options + */ +Ext.menu.Adapter = function(component, config){ + Ext.menu.Adapter.superclass.constructor.call(this, config); + this.component = component; +}; +Ext.extend(Ext.menu.Adapter, Ext.menu.BaseItem, { + // private + canActivate : true, + + // private + onRender : function(container, position){ + this.component.render(container); + this.el = this.component.getEl(); + }, + + // private + activate : function(){ + if(this.disabled){ + return false; + } + this.component.focus(); + this.fireEvent("activate", this); + return true; + }, + + // private + deactivate : function(){ + this.fireEvent("deactivate", this); + }, + + // private + disable : function(){ + this.component.disable(); + Ext.menu.Adapter.superclass.disable.call(this); + }, + + // private + enable : function(){ + this.component.enable(); + Ext.menu.Adapter.superclass.enable.call(this); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/menu/BaseItem.js b/www/extras/yui-ext/source/widgets/menu/BaseItem.js new file mode 100644 index 000000000..aa054e770 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/menu/BaseItem.js @@ -0,0 +1,138 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.menu.BaseItem + * @extends Ext.Component + * The base class for all items that render into menus. BaseItem provides default rendering, activated state + * management and base configuration options shared by all menu components. + * @constructor + * Creates a new BaseItem + * @param {Object} config Configuration options + */ +Ext.menu.BaseItem = function(config){ + Ext.menu.BaseItem.superclass.constructor.call(this, config); + + this.addEvents({ + /** + * @event click + * Fires when this item is clicked + * @param {Ext.menu.BaseItem} this + * @param {Ext.EventObject} e + */ + click: true, + /** + * @event activate + * Fires when this item is activated + * @param {Ext.menu.BaseItem} this + */ + activate : true, + /** + * @event deactivate + * Fires when this item is deactivated + * @param {Ext.menu.BaseItem} this + */ + deactivate : true + }); + + if(this.handler){ + this.on("click", this.handler, this.scope, true); + } +}; + +Ext.extend(Ext.menu.BaseItem, Ext.Component, { + /** + * @cfg {Function} handler + * A function that will handle the click event of this menu item (defaults to undefined) + */ + /** + * @cfg {Boolean} canActivate True if this item can be visually activated (defaults to false) + */ + canActivate : false, + /** + * @cfg {String} activeClass The CSS class to use when the item becomes activated (defaults to "x-menu-item-active") + */ + activeClass : "x-menu-item-active", + /** + * @cfg {Boolean} hideOnClick True to hide the containing menu after this item is clicked (defaults to true) + */ + hideOnClick : true, + /** + * @cfg {Number} hideDelay Length of time in milliseconds to wait before hiding after a click (defaults to 100) + */ + hideDelay : 100, + + // private + ctype: "Ext.menu.BaseItem", + + // private + actionMode : "container", + + // private + render : function(container, parentMenu){ + this.parentMenu = parentMenu; + Ext.menu.BaseItem.superclass.render.call(this, container); + this.container.menuItemId = this.id; + }, + + // private + onRender : function(container, position){ + this.el = Ext.get(this.el); + container.dom.appendChild(this.el.dom); + }, + + // private + onClick : function(e){ + if(!this.disabled && this.fireEvent("click", this, e) !== false + && this.parentMenu.fireEvent("itemclick", this, e) !== false){ + this.handleClick(e); + }else{ + e.stopEvent(); + } + }, + + // private + activate : function(){ + if(this.disabled){ + return false; + } + var li = this.container; + li.addClass(this.activeClass); + this.region = li.getRegion().adjust(2, 2, -2, -2); + this.fireEvent("activate", this); + return true; + }, + + // private + deactivate : function(){ + this.container.removeClass(this.activeClass); + this.fireEvent("deactivate", this); + }, + + // private + shouldDeactivate : function(e){ + return !this.region || !this.region.contains(e.getPoint()); + }, + + // private + handleClick : function(e){ + if(this.hideOnClick){ + this.parentMenu.hide.defer(this.hideDelay, this.parentMenu, [true]); + } + }, + + // private + expandMenu : function(autoActivate){ + // do nothing + }, + + // private + hideMenu : function(){ + // do nothing + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/menu/CheckItem.js b/www/extras/yui-ext/source/widgets/menu/CheckItem.js new file mode 100644 index 000000000..624b9959d --- /dev/null +++ b/www/extras/yui-ext/source/widgets/menu/CheckItem.js @@ -0,0 +1,109 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.menu.CheckItem + * @extends Ext.menu.Item + * Adds a menu item that contains a checkbox by default, but can also be part of a radio group. + * @constructor + * Creates a new CheckItem + * @param {Object} config Configuration options + */ +Ext.menu.CheckItem = function(config){ + Ext.menu.CheckItem.superclass.constructor.call(this, config); + this.addEvents({ + /** + * @event beforecheckchange + * Fires before the checked value is set, providing an opportunity to cancel if needed + * @param {Ext.menu.CheckItem} this + * @param {Boolean} checked The new checked value that will be set + */ + "beforecheckchange" : true, + /** + * @event checkchange + * Fires after the checked value has been set + * @param {Ext.menu.CheckItem} this + * @param {Boolean} checked The checked value that was set + */ + "checkchange" : true + }); + if(this.checkHandler){ + this.on('checkchange', this.checkHandler, this.scope); + } +}; +Ext.extend(Ext.menu.CheckItem, Ext.menu.Item, { + /** + * @cfg {String} group + * All check items with the same group name will automatically be grouped into a single-select + * radio button group (defaults to '') + */ + /** + * @cfg {String} itemCls The default CSS class to use for check items (defaults to "x-menu-item x-menu-check-item") + */ + itemCls : "x-menu-item x-menu-check-item", + /** + * @cfg {String} groupClass The default CSS class to use for radio group check items (defaults to "x-menu-group-item") + */ + groupClass : "x-menu-group-item", + + /** + * @cfg {Boolean} checked True to initialize this checkbox as checked (defaults to false). Note that + * if this checkbox is part of a radio group (group = true) only the last item in the group that is + * initialized with checked = true will be rendered as checked. + */ + checked: false, + + // private + ctype: "Ext.menu.CheckItem", + + // private + onRender : function(c){ + Ext.menu.CheckItem.superclass.onRender.apply(this, arguments); + if(this.group){ + this.el.addClass(this.groupClass); + } + Ext.menu.MenuMgr.registerCheckable(this); + if(this.checked){ + this.checked = false; + this.setChecked(true, true); + } + }, + + // private + destroy : function(){ + if(this.rendered){ + Ext.menu.MenuMgr.unregisterCheckable(this); + } + Ext.menu.CheckItem.superclass.destroy.apply(this, arguments); + }, + + /** + * Set the checked state of this item + * @param {Boolean} checked The new checked value + * @param {Boolean} suppressEvent (optional) True to prevent the checkchange event from firing (defaults to false) + */ + setChecked : function(state, suppressEvent){ + if(this.checked != state && this.fireEvent("beforecheckchange", this, state) !== false){ + if(this.container){ + this.container[state ? "addClass" : "removeClass"]("x-menu-item-checked"); + } + this.checked = state; + if(suppressEvent !== true){ + this.fireEvent("checkchange", this, state); + } + } + }, + + // private + handleClick : function(e){ + if(!this.disabled && !(this.checked && this.group)){// disable unselect on radio item + this.setChecked(!this.checked); + } + Ext.menu.CheckItem.superclass.handleClick.apply(this, arguments); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/menu/ColorItem.js b/www/extras/yui-ext/source/widgets/menu/ColorItem.js new file mode 100644 index 000000000..d35528775 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/menu/ColorItem.js @@ -0,0 +1,26 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.menu.ColorItem + * @extends Ext.menu.Adapter + * A menu item that wraps the {@link Ext.ColorPalette} component. + * @constructor + * Creates a new ColorItem + * @param {Object} config Configuration options + */ +Ext.menu.ColorItem = function(config){ + Ext.menu.ColorItem.superclass.constructor.call(this, new Ext.ColorPalette(config), config); + /** The Ext.ColorPalette object @type Ext.ColorPalette */ + this.palette = this.component; + this.relayEvents(this.palette, ["select"]); + if(this.selectHandler){ + this.on('select', this.selectHandler, this.scope); + } +}; +Ext.extend(Ext.menu.ColorItem, Ext.menu.Adapter); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/menu/ColorMenu.js b/www/extras/yui-ext/source/widgets/menu/ColorMenu.js new file mode 100644 index 000000000..a047252cd --- /dev/null +++ b/www/extras/yui-ext/source/widgets/menu/ColorMenu.js @@ -0,0 +1,34 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.menu.ColorMenu + * @extends Ext.menu.Menu + * A menu containing a {@link Ext.menu.ColorItem} component (which provides a basic color picker). + * @constructor + * Creates a new ColorMenu + * @param {Object} config Configuration options + */ +Ext.menu.ColorMenu = function(config){ + Ext.menu.ColorMenu.superclass.constructor.call(this, config); + this.plain = true; + var ci = new Ext.menu.ColorItem(config); + this.add(ci); + /** + * The {@link Ext.ColorPalette} instance for this ColorMenu + * @type ColorPalette + */ + this.palette = ci.palette; + /** + * @event select + * @param {ColorPalette} palette + * @param {String} color + */ + this.relayEvents(ci, ["select"]); +}; +Ext.extend(Ext.menu.ColorMenu, Ext.menu.Menu); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/menu/DateItem.js b/www/extras/yui-ext/source/widgets/menu/DateItem.js new file mode 100644 index 000000000..20ebf84c2 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/menu/DateItem.js @@ -0,0 +1,37 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.menu.DateItem + * @extends Ext.menu.Adapter + * A menu item that wraps the {@link Ext.DatPicker} component. + * @constructor + * Creates a new DateItem + * @param {Object} config Configuration options + */ +Ext.menu.DateItem = function(config){ + Ext.menu.DateItem.superclass.constructor.call(this, new Ext.DatePicker(config), config); + /** The Ext.DatePicker object @type Ext.DatePicker */ + this.picker = this.component; + this.addEvents({select: true}); + + this.picker.on("render", function(picker){ + picker.getEl().swallowEvent("click"); + picker.container.addClass("x-menu-date-item"); + }); + + this.picker.on("select", this.onSelect, this); +}; + +Ext.extend(Ext.menu.DateItem, Ext.menu.Adapter, { + // private + onSelect : function(picker, date){ + this.fireEvent("select", this, date, picker); + Ext.menu.DateItem.superclass.handleClick.call(this); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/menu/DateMenu.js b/www/extras/yui-ext/source/widgets/menu/DateMenu.js new file mode 100644 index 000000000..aaac0baea --- /dev/null +++ b/www/extras/yui-ext/source/widgets/menu/DateMenu.js @@ -0,0 +1,34 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.menu.DateMenu + * @extends Ext.menu.Menu + * A menu containing a {@link Ext.menu.DateItem} component (which provides a date picker). + * @constructor + * Creates a new DateMenu + * @param {Object} config Configuration options + */ +Ext.menu.DateMenu = function(config){ + Ext.menu.DateMenu.superclass.constructor.call(this, config); + this.plain = true; + var di = new Ext.menu.DateItem(config); + this.add(di); + /** + * The {@link Ext.DatePicker} instance for this DateMenu + * @type DatePicker + */ + this.picker = di.picker; + /** + * @event select + * @param {DatePicker} picker + * @param {Date} date + */ + this.relayEvents(di, ["select"]); +}; +Ext.extend(Ext.menu.DateMenu, Ext.menu.Menu); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/menu/Item.js b/www/extras/yui-ext/source/widgets/menu/Item.js new file mode 100644 index 000000000..134bef02d --- /dev/null +++ b/www/extras/yui-ext/source/widgets/menu/Item.js @@ -0,0 +1,127 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.menu.Item + * @extends Ext.menu.BaseItem + * A base class for all menu items that require menu-related functionality (like sub-menus) and are not static + * display items. Item extends the base functionality of {@link Ext.menu.BaseItem} by adding menu-specific + * activation and click handling. + * @constructor + * Creates a new Item + * @param {Object} config Configuration options + */ +Ext.menu.Item = function(config){ + Ext.menu.Item.superclass.constructor.call(this, config); + if(this.menu){ + this.menu = Ext.menu.MenuMgr.get(this.menu); + } +}; +Ext.extend(Ext.menu.Item, Ext.menu.BaseItem, { + /** + * @cfg {String} icon + * The path to an icon to display in this menu item (defaults to Ext.BLANK_IMAGE_URL) + */ + /** + * @cfg {String} itemCls The default CSS class to use for menu items (defaults to "x-menu-item") + */ + itemCls : "x-menu-item", + /** + * @cfg {Boolean} canActivate True if this item can be visually activated (defaults to true) + */ + canActivate : true, + + // private + ctype: "Ext.menu.Item", + + // private + onRender : function(container, position){ + var el = document.createElement("a"); + el.hideFocus = true; + el.unselectable = "on"; + el.href = this.href || "#"; + if(this.hrefTarget){ + el.target = this.hrefTarget; + } + el.className = this.itemCls + (this.menu ? " x-menu-item-arrow" : "") + (this.cls ? " " + this.cls : ""); + el.innerHTML = String.format( + '{1}', + this.icon || Ext.BLANK_IMAGE_URL, this.text); + this.el = el; + Ext.menu.Item.superclass.onRender.call(this, container, position); + }, + + /** + * Sets the text to display in this menu item + * @param {String} text The text to display + */ + setText : function(text){ + this.text = text; + if(this.rendered){ + this.el.update(String.format( + '{1}', + this.icon || Ext.BLANK_IMAGE_URL, this.text)); + this.parentMenu.autoWidth(); + } + }, + + // private + handleClick : function(e){ + if(!this.href){ // if no link defined, stop the event automatically + e.stopEvent(); + } + Ext.menu.Item.superclass.handleClick.apply(this, arguments); + }, + + // private + activate : function(autoExpand){ + if(Ext.menu.Item.superclass.activate.apply(this, arguments)){ + this.focus(); + if(autoExpand){ + this.expandMenu(); + } + } + return true; + }, + + // private + shouldDeactivate : function(e){ + if(Ext.menu.Item.superclass.shouldDeactivate.call(this, e)){ + if(this.menu && this.menu.isVisible()){ + return !this.menu.getEl().getRegion().contains(e.getPoint()); + } + return true; + } + return false; + }, + + // private + deactivate : function(){ + Ext.menu.Item.superclass.deactivate.apply(this, arguments); + this.hideMenu(); + }, + + // private + expandMenu : function(autoActivate){ + if(!this.disabled && this.menu){ + if(!this.menu.isVisible()){ + this.menu.show(this.container, this.parentMenu.subMenuAlign || "tl-tr?", this.parentMenu); + } + if(autoActivate){ + this.menu.tryActivate(0, 1); + } + } + }, + + // private + hideMenu : function(){ + if(this.menu && this.menu.isVisible()){ + this.menu.hide(); + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/menu/Menu.js b/www/extras/yui-ext/source/widgets/menu/Menu.js new file mode 100644 index 000000000..11188d10d --- /dev/null +++ b/www/extras/yui-ext/source/widgets/menu/Menu.js @@ -0,0 +1,508 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.menu.Menu + * @extends Ext.util.Observable + * A menu object. This is the container to which you add all other menu items. Menu can also serve a as a base class + * when you want a specialzed menu based off of another component (like {@link Ext.menu.DateMenu} for example). + * @constructor + * Creates a new Menu + * @param {Object} config Configuration options + */ +Ext.menu.Menu = function(config){ + Ext.apply(this, config); + this.id = this.id || Ext.id(); + this.addEvents({ + /** + * @event beforeshow + * Fires before this menu is displayed + * @param {Ext.menu.Menu} this + */ + beforeshow : true, + /** + * @event beforehide + * Fires before this menu is hidden + * @param {Ext.menu.Menu} this + */ + beforehide : true, + /** + * @event show + * Fires after this menu is displayed + * @param {Ext.menu.Menu} this + */ + show : true, + /** + * @event hide + * Fires after this menu is hidden + * @param {Ext.menu.Menu} this + */ + hide : true, + /** + * @event click + * Fires when this menu is clicked (or when the enter key is pressed while it is active) + * @param {Ext.menu.Menu} this + * @param {String} menuItemId The id of the menu item that was clicked + * @param {Ext.EventObject} e + */ + click : true, + /** + * @event mouseover + * Fires when the mouse is hovering over this menu + * @param {Ext.menu.Menu} this + * @param {Ext.EventObject} e + * @param {String} menuItemId The id of the menu item that the mouse is over + */ + mouseover : true, + /** + * @event mouseout + * Fires when the mouse exits this menu + * @param {Ext.menu.Menu} this + * @param {Ext.EventObject} e + * @param {String} menuItemId The id of the menu item that the mouse has exited + */ + mouseout : true, + /** + * @event itemclick + * Fires when a menu item contained in this menu is clicked + * @param {Ext.menu.BaseItem} baseItem The BaseItem that was clicked + * @param {Ext.EventObject} e + */ + itemclick: true + }); + Ext.menu.MenuMgr.register(this); + var mis = this.items; + this.items = new Ext.util.MixedCollection(); + if(mis){ + this.add.apply(this, mis); + } +}; + +Ext.extend(Ext.menu.Menu, Ext.util.Observable, { + /** + * @cfg {Number} minWidth The minimum width of the menu in pixels (defaults to 120) + */ + minWidth : 120, + /** + * @cfg {Boolean/String} shadow True or "sides" for the default effect, "frame" for 4-way shadow, and "drop" + * for bottom-right shadow (defaults to "sides") + */ + shadow : "sides", + /** + * @cfg {String} subMenuAlign The {@link Ext.Element#alignTo) anchor position value to use for submenus of + * this menu (defaults to "tl-tr?") + */ + subMenuAlign : "tl-tr?", + /** + * @cfg {String} defaultAlign The default {@link Ext.Element#alignTo) anchor position value for this menu + * relative to its element of origin (defaults to "tl-bl?") + */ + defaultAlign : "tl-bl?", + /** + * @cfg {Boolean} allowOtherMenus True to allow multiple menus to be displayed at the same time (defaults to false) + */ + allowOtherMenus : false, + + // private + render : function(){ + if(this.el){ + return; + } + var el = this.el = new Ext.Layer({ + cls: "x-menu", + shadow:this.shadow, + constrain: false, + parentEl: this.parentEl || document.body, + zindex:15000 + }); + + this.keyNav = new Ext.menu.MenuNav(this); + + if(this.plain){ + el.addClass("x-menu-plain"); + } + if(this.cls){ + el.addClass(this.cls); + } + // generic focus element + this.focusEl = el.createChild({ + tag: "a", cls: "x-menu-focus", href: "#", onclick: "return false;", tabIndex:"-1" + }); + var ul = el.createChild({tag: "ul", cls: "x-menu-list"}); + ul.on("click", this.onClick, this); + ul.on("mouseover", this.onMouseOver, this); + ul.on("mouseout", this.onMouseOut, this); + this.items.each(function(item){ + var li = document.createElement("li"); + li.className = "x-menu-list-item"; + ul.dom.appendChild(li); + item.render(li, this); + }, this); + this.ul = ul; + this.autoWidth(); + }, + + // private + autoWidth : function(){ + var el = this.el, ul = this.ul; + if(!el){ + return; + } + var w = this.width; + if(w){ + el.setWidth(w); + }else if(Ext.isIE){ + el.setWidth(this.minWidth); + var t = el.dom.offsetWidth; // force recalc + el.setWidth(ul.getWidth()+el.getFrameWidth("lr")); + } + }, + + // private + delayAutoWidth : function(){ + if(this.rendered){ + if(!this.awTask){ + this.awTask = new Ext.util.DelayedTask(this.autoWidth, this); + } + this.awTask.delay(20); + } + }, + + // private + findTargetItem : function(e){ + var t = e.getTarget(".x-menu-list-item", this.ul, true); + if(t && t.menuItemId){ + return this.items.get(t.menuItemId); + } + }, + + // private + onClick : function(e){ + var t; + if(t = this.findTargetItem(e)){ + t.onClick(e); + this.fireEvent("click", this, t, e); + } + }, + + // private + setActiveItem : function(item, autoExpand){ + if(item != this.activeItem){ + if(this.activeItem){ + this.activeItem.deactivate(); + } + this.activeItem = item; + item.activate(autoExpand); + }else if(autoExpand){ + item.expandMenu(); + } + }, + + // private + tryActivate : function(start, step){ + var items = this.items; + for(var i = start, len = items.length; i >= 0 && i < len; i+= step){ + var item = items.get(i); + if(!item.disabled && item.canActivate){ + this.setActiveItem(item, false); + return item; + } + } + return false; + }, + + // private + onMouseOver : function(e){ + var t; + if(t = this.findTargetItem(e)){ + if(t.canActivate && !t.disabled){ + this.setActiveItem(t, true); + } + } + this.fireEvent("mouseover", this, e, t); + }, + + // private + onMouseOut : function(e){ + var t; + if(t = this.findTargetItem(e)){ + if(t == this.activeItem && t.shouldDeactivate(e)){ + this.activeItem.deactivate(); + delete this.activeItem; + } + } + this.fireEvent("mouseout", this, e, t); + }, + + /** + * Read-only. Returns true if the menu is currently displayed, else false. + * @type Boolean + */ + isVisible : function(){ + return this.el && this.el.isVisible(); + }, + + /** + * Displays this menu relative to another element + * @param {String/HTMLElement/Ext.Element} element The element to align to + * @param {String} position (optional) The {@link Ext.Element#alignTo} anchor position to use in aligning to + * the element (defaults to this.defaultAlign) + * @param {Ext.menu.Menu} parentMenu (optional) This menu's parent menu, if applicable (defaults to undefined) + */ + show : function(el, pos, parentMenu){ + this.parentMenu = parentMenu; + if(!this.el){ + this.render(); + } + this.fireEvent("beforeshow", this); + this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign), parentMenu, false); + }, + + /** + * Displays this menu at a specific xy position + * @param {Array} xyPosition Contains X & Y [x, y] values for the position at which to show the menu (coordinates are page-based) + * @param {Ext.menu.Menu} parentMenu (optional) This menu's parent menu, if applicable (defaults to undefined) + */ + showAt : function(xy, parentMenu, /* private: */_fireBefore){ + this.parentMenu = parentMenu; + if(!this.el){ + this.render(); + } + if(_fireBefore !== false){ + this.fireEvent("beforeshow", this); + } + this.el.setXY(xy); + this.el.show(); + this.focusEl.focus.defer(50, this.focusEl); + this.fireEvent("show", this); + }, + + /** + * Hides this menu and optionally all parent menus + * @param {Boolean} deep (optional) True to hide all parent menus recursively, if any (defaults to false) + */ + hide : function(deep){ + if(this.el && this.isVisible()){ + this.fireEvent("beforehide", this); + if(this.activeItem){ + this.activeItem.deactivate(); + this.activeItem = null; + } + this.el.hide(); + this.fireEvent("hide", this); + } + if(deep === true && this.parentMenu){ + this.parentMenu.hide(true); + } + }, + + /** + * Addds one or more items of any type supported by the Menu class, or that can be converted into menu items. + * Any of the following are valid: + *
            + *
          • Any menu item object based on {@link Ext.menu.Item}
          • + *
          • An HTMLElement object which will be converted to a menu item
          • + *
          • A menu item config object that will be created as a new menu item
          • + *
          • A string, which can either be '-' or 'separator' to add a menu separator, otherwise + * it will be converted into a {@link Ext.menu.TextItem} and added
          • + *
          + * Usage: + *
          
          +// Create the menu
          +var menu = new Ext.menu.Menu();
          +
          +// Create a menu item to add by reference
          +var menuItem = new Ext.menu.Item({ text: 'New Item!' });
          +
          +// Add a bunch of items at once using different methods.
          +// Only the last item added will be returned.
          +var item = menu.add(
          +    menuItem,                // add existing item by ref
          +    'Dynamic Item',          // new TextItem
          +    '-',                     // new separator
          +    { text: 'Config Item' }  // new item by config
          +);
          +
          + * @param {Mixed} args One or more menu items, menu item configs or other objects that can be converted to menu items + * @return {Ext.menu.Item} The menu item that was added, or the last one if multiple items were added + */ + add : function(){ + var a = arguments, l = a.length, item; + for(var i = 0; i < l; i++){ + var el = a[i]; + if(el.render){ // some kind of Item + item = this.addItem(el); + }else if(typeof el == "string"){ // string + if(el == "separator" || el == "-"){ + item = this.addSeparator(); + }else{ + item = this.addText(el); + } + }else if(el.tagName || el.el){ // element + item = this.addElement(el); + }else if(typeof el == "object"){ // must be menu item config? + item = this.addMenuItem(el); + } + } + return item; + }, + + /** + * Returns this menu's underlying {@link Ext.Element} object + * @return {Ext.Element} The element + */ + getEl : function(){ + if(!this.el){ + this.render(); + } + return this.el; + }, + + /** + * Adds a separator bar to the menu + * @return {Ext.menu.Item} The menu item that was added + */ + addSeparator : function(){ + return this.addItem(new Ext.menu.Separator()); + }, + + /** + * Adds an {@link Ext.Element} object to the menu + * @param {String/HTMLElement/Ext.Element} el The element or DOM node to add, or its id + * @return {Ext.menu.Item} The menu item that was added + */ + addElement : function(el){ + return this.addItem(new Ext.menu.BaseItem(el)); + }, + + /** + * Adds an existing object based on {@link Ext.menu.Item} to the menu + * @param {Ext.menu.Item} item The menu item to add + * @return {Ext.menu.Item} The menu item that was added + */ + addItem : function(item){ + this.items.add(item); + if(this.ul){ + var li = document.createElement("li"); + li.className = "x-menu-list-item"; + this.ul.dom.appendChild(li); + item.render(li, this); + this.delayAutoWidth(); + } + return item; + }, + + /** + * Creates a new {@link Ext.menu.Item} based an the supplied config object and adds it to the menu + * @param {Object} config A MenuItem config object + * @return {Ext.menu.Item} The menu item that was added + */ + addMenuItem : function(config){ + if(!(config instanceof Ext.menu.Item)){ + config = new Ext.menu.Item(config); + } + return this.addItem(config); + }, + + /** + * Creates a new {@link Ext.menu.TextItem} with the supplied text and adds it to the menu + * @param {String} text The text to display in the menu item + * @return {Ext.menu.Item} The menu item that was added + */ + addText : function(text){ + return this.addItem(new Ext.menu.TextItem(text)); + }, + + /** + * Inserts an existing object based on {@link Ext.menu.Item} to the menu at a specified index + * @param {Number} index The index in the menu's list of current items where the new item should be inserted + * @param {Ext.menu.Item} item The menu item to add + * @return {Ext.menu.Item} The menu item that was added + */ + insert : function(index, item){ + this.items.insert(index, item); + if(this.ul){ + var li = document.createElement("li"); + li.className = "x-menu-list-item"; + this.ul.dom.insertBefore(li, this.ul.dom.childNodes[index]); + item.render(li, this); + this.delayAutoWidth(); + } + return item; + }, + + /** + * Removes an {@link Ext.menu.Item} from the menu and destroys the object + * @param {Ext.menu.Item} item The menu item to remove + */ + remove : function(item){ + this.items.removeKey(item.id); + item.destroy(); + }, + + /** + * Removes and destroys all items in the menu + */ + removeAll : function(){ + var f; + while(f = this.items.first()){ + this.remove(f); + } + } +}); + +// MenuNav is a private utility class used internally by the Menu +Ext.menu.MenuNav = function(menu){ + Ext.menu.MenuNav.superclass.constructor.call(this, menu.el); + this.scope = this.menu = menu; +}; + +Ext.extend(Ext.menu.MenuNav, Ext.KeyNav, { + doRelay : function(e, h){ + var k = e.getKey(); + if(!this.menu.activeItem && e.isNavKeyPress() && k != e.SPACE && k != e.RETURN){ + this.menu.tryActivate(0, 1); + return false; + } + return h.call(this.scope || this, e, this.menu); + }, + + up : function(e, m){ + if(!m.tryActivate(m.items.indexOf(m.activeItem)-1, -1)){ + m.tryActivate(m.items.length-1, -1); + } + }, + + down : function(e, m){ + if(!m.tryActivate(m.items.indexOf(m.activeItem)+1, 1)){ + m.tryActivate(0, 1); + } + }, + + right : function(e, m){ + if(m.activeItem){ + m.activeItem.expandMenu(true); + } + }, + + left : function(e, m){ + m.hide(); + if(m.parentMenu && m.parentMenu.activeItem){ + m.parentMenu.activeItem.activate(); + } + }, + + enter : function(e, m){ + if(m.activeItem){ + e.stopPropagation(); + m.activeItem.onClick(e); + m.fireEvent("click", this, m.activeItem); + return true; + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/menu/MenuMgr.js b/www/extras/yui-ext/source/widgets/menu/MenuMgr.js new file mode 100644 index 000000000..3ee740003 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/menu/MenuMgr.js @@ -0,0 +1,182 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.menu.MenuMgr + * Provides a common registry of all menu items on a page so that they can be easily accessed by id. + * @singleton + */ +Ext.menu.MenuMgr = function(){ + var menus, active, groups = {}, attached = false, lastShow = new Date(); + + // private - called when first menu is created + function init(){ + menus = {}, active = new Ext.util.MixedCollection(); + Ext.get(document).addKeyListener(27, function(){ + if(active.length > 0){ + hideAll(); + } + }); + } + + // private + function hideAll(){ + if(active.length > 0){ + var c = active.clone(); + c.each(function(m){ + m.hide(); + }); + } + } + + // private + function onHide(m){ + active.remove(m); + if(active.length < 1){ + Ext.get(document).un("mousedown", onMouseDown); + attached = false; + } + } + + // private + function onShow(m){ + var last = active.last(); + lastShow = new Date(); + active.add(m); + if(!attached){ + Ext.get(document).on("mousedown", onMouseDown); + attached = true; + } + if(m.parentMenu){ + m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3); + m.parentMenu.activeChild = m; + }else if(last && last.isVisible()){ + m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3); + } + } + + // private + function onBeforeHide(m){ + if(m.activeChild){ + m.activeChild.hide(); + } + if(m.autoHideTimer){ + clearTimeout(m.autoHideTimer); + delete m.autoHideTimer; + } + } + + // private + function onBeforeShow(m){ + var pm = m.parentMenu; + if(!pm && !m.allowOtherMenus){ + hideAll(); + }else if(pm && pm.activeChild){ + pm.activeChild.hide(); + } + } + + // private + function onMouseDown(e){ + if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){ + hideAll(); + } + } + + // private + function onBeforeCheck(mi, state){ + if(state){ + var g = groups[mi.group]; + for(var i = 0, l = g.length; i < l; i++){ + if(g[i] != mi){ + g[i].setChecked(false); + } + } + } + } + + return { + + /** + * Hides all menus that are currently visible + */ + hideAll : function(){ + hideAll(); + }, + + // private + register : function(menu){ + if(!menus){ + init(); + } + menus[menu.id] = menu; + menu.on("beforehide", onBeforeHide); + menu.on("hide", onHide); + menu.on("beforeshow", onBeforeShow); + menu.on("show", onShow); + var g = menu.group; + if(g && menu.events["checkchange"]){ + if(!groups[g]){ + groups[g] = []; + } + groups[g].push(menu); + menu.on("checkchange", onCheck); + } + }, + + /** + * Returns a {@link Ext.menu.Menu} object + * @param {String/Object} menu The string menu id, an existing menu object reference, or a Menu config that will + * be used to generate and return a new Menu instance. + */ + get : function(menu){ + if(typeof menu == "string"){ // menu id + return menus[menu]; + }else if(menu.events){ // menu instance + return menu; + }else{ // otherwise, must be a config + return new Ext.menu.Menu(menu); + } + }, + + // private + unregister : function(menu){ + delete menus[menu.id]; + menu.un("beforehide", onBeforeHide); + menu.un("hide", onHide); + menu.un("beforeshow", onBeforeShow); + menu.un("show", onShow); + var g = menu.group; + if(g && menu.events["checkchange"]){ + groups[g].remove(menu); + menu.un("checkchange", onCheck); + } + }, + + // private + registerCheckable : function(menuItem){ + var g = menuItem.group; + if(g){ + if(!groups[g]){ + groups[g] = []; + } + groups[g].push(menuItem); + menuItem.on("beforecheckchange", onBeforeCheck); + } + }, + + // private + unregisterCheckable : function(menuItem){ + var g = menuItem.group; + if(g){ + groups[g].remove(menuItem); + menuItem.un("beforecheckchange", onBeforeCheck); + } + } + }; +}(); diff --git a/www/extras/yui-ext/source/widgets/menu/Separator.js b/www/extras/yui-ext/source/widgets/menu/Separator.js new file mode 100644 index 000000000..327203ab8 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/menu/Separator.js @@ -0,0 +1,40 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.menu.Separator + * @extends Ext.menu.BaseItem + * Adds a separator bar to a menu, used to divide logical groups of menu items. Generally you will + * add one of these by using "-" in you call to add() or in your items config rather than creating one directly. + * @constructor + * @param {Object} config Configuration options + */ +Ext.menu.Separator = function(config){ + Ext.menu.Separator.superclass.constructor.call(this, config); +}; + +Ext.extend(Ext.menu.Separator, Ext.menu.BaseItem, { + /** + * @cfg {String} itemCls The default CSS class to use for separators (defaults to "x-menu-sep") + */ + itemCls : "x-menu-sep", + /** + * @cfg {Boolean} hideOnClick True to hide the containing menu after this item is clicked (defaults to false) + */ + hideOnClick : false, + + // private + onRender : function(li){ + var s = document.createElement("span"); + s.className = this.itemCls; + s.innerHTML = " "; + this.el = s; + li.addClass("x-menu-sep-li"); + Ext.menu.Separator.superclass.onRender.apply(this, arguments); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/menu/TextItem.js b/www/extras/yui-ext/source/widgets/menu/TextItem.js new file mode 100644 index 000000000..c7561f0ee --- /dev/null +++ b/www/extras/yui-ext/source/widgets/menu/TextItem.js @@ -0,0 +1,40 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.menu.TextItem + * @extends Ext.menu.BaseItem + * Adds a static text string to a menu, usually used as either a heading or group separator. + * @constructor + * Creates a new TextItem + * @param {String} text The text to display + */ +Ext.menu.TextItem = function(text){ + this.text = text; + Ext.menu.TextItem.superclass.constructor.call(this); +}; + +Ext.extend(Ext.menu.TextItem, Ext.menu.BaseItem, { + /** + * @cfg {Boolean} hideOnClick True to hide the containing menu after this item is clicked (defaults to false) + */ + hideOnClick : false, + /** + * @cfg {String} itemCls The default CSS class to use for text items (defaults to "x-menu-text") + */ + itemCls : "x-menu-text", + + // private + onRender : function(){ + var s = document.createElement("span"); + s.className = this.itemCls; + s.innerHTML = this.text; + this.el = s; + Ext.menu.TextItem.superclass.onRender.apply(this, arguments); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/tree/AsyncTreeNode.js b/www/extras/yui-ext/source/widgets/tree/AsyncTreeNode.js new file mode 100644 index 000000000..cd36409c2 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/tree/AsyncTreeNode.js @@ -0,0 +1,113 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.tree.AsyncTreeNode + * @extends Ext.tree.TreeNode + * @cfg {TreeLoader} loader A TreeLoader to be used by this node (defaults to the loader defined on the tree) + * @constructor + * @param {Object/String} attributes The attributes/config for the node or just a string with the text for the node + */ + Ext.tree.AsyncTreeNode = function(config){ + this.loaded = false; + this.loading = false; + Ext.tree.AsyncTreeNode.superclass.constructor.apply(this, arguments); + /** + * @event beforeload + * Fires before this node is loaded, return false to cancel + * @param {Node} this This node + */ + this.addEvents({'beforeload':true, 'load': true}); + /** + * @event load + * Fires when this node is loaded + * @param {Node} this This node + */ + /** + * The loader used by this node (defaults to using the tree's defined loader) + * @type TreeLoader + * @property loader + */ +}; +Ext.extend(Ext.tree.AsyncTreeNode, Ext.tree.TreeNode, { + expand : function(deep, anim, callback){ + if(this.loading){ // if an async load is already running, waiting til it's done + var timer; + var f = function(){ + if(!this.loading){ // done loading + clearInterval(timer); + this.expand(deep, anim, callback); + } + }.createDelegate(this); + timer = setInterval(f, 200); + return; + } + if(!this.loaded){ + if(this.fireEvent("beforeload", this) === false){ + return; + } + this.loading = true; + this.ui.beforeLoad(this); + var loader = this.loader || this.attributes.loader || this.getOwnerTree().getLoader(); + if(loader){ + loader.load(this, this.loadComplete.createDelegate(this, [deep, anim, callback])); + return; + } + } + Ext.tree.AsyncTreeNode.superclass.expand.call(this, deep, anim, callback); + }, + + /** + * Returns true if this node is currently loading + * @return {Boolean} + */ + isLoading : function(){ + return this.loading; + }, + + loadComplete : function(deep, anim, callback){ + this.loading = false; + this.loaded = true; + this.ui.afterLoad(this); + this.fireEvent("load", this); + this.expand(deep, anim, callback); + }, + + /** + * Returns true if this node has been loaded + * @return {Boolean} + */ + isLoaded : function(){ + return this.loaded; + }, + + hasChildNodes : function(){ + if(!this.isLeaf() && !this.loaded){ + return true; + }else{ + return Ext.tree.AsyncTreeNode.superclass.hasChildNodes.call(this); + } + }, + + /** + * Trigger a reload for this node + * @param {Function} callback + */ + reload : function(callback){ + this.collapse(false, false); + while(this.firstChild){ + this.removeChild(this.firstChild); + } + this.childrenRendered = false; + this.loaded = false; + if(this.isHiddenRoot()){ + this.expanded = false; + } + this.expand(false, false, callback); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/tree/TreeDragZone.js b/www/extras/yui-ext/source/widgets/tree/TreeDragZone.js new file mode 100644 index 000000000..116179122 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/tree/TreeDragZone.js @@ -0,0 +1,51 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +if(Ext.dd.DragZone){ +Ext.tree.TreeDragZone = function(tree, config){ + Ext.tree.TreeDragZone.superclass.constructor.call(this, tree.getEl(), config); + this.tree = tree; +}; + +Ext.extend(Ext.tree.TreeDragZone, Ext.dd.DragZone, { + ddGroup : "TreeDD", + + onBeforeDrag : function(data, e){ + var n = data.node; + return n && n.draggable && !n.disabled; + }, + + onInitDrag : function(e){ + var data = this.dragData; + this.tree.getSelectionModel().select(data.node); + this.proxy.update(""); + data.node.ui.appendDDGhost(this.proxy.ghost.dom); + this.tree.fireEvent("startdrag", this.tree, data.node, e); + }, + + getRepairXY : function(e, data){ + return data.node.ui.getDDRepairXY(); + }, + + onEndDrag : function(data, e){ + this.tree.fireEvent("enddrag", this.tree, data.node, e); + }, + + onValidDrop : function(dd, e, id){ + this.tree.fireEvent("dragdrop", this.tree, this.dragData.node, dd, e); + this.hideProxy(); + }, + + beforeInvalidDrop : function(e, id){ + // this scrolls the original position back into view + var sm = this.tree.getSelectionModel(); + sm.clearSelections(); + sm.select(this.dragData.node); + } +}); +} \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/tree/TreeDropZone.js b/www/extras/yui-ext/source/widgets/tree/TreeDropZone.js new file mode 100644 index 000000000..a2507bfb7 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/tree/TreeDropZone.js @@ -0,0 +1,242 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +if(Ext.dd.DropZone){ + +Ext.tree.TreeDropZone = function(tree, config){ + this.allowParentInsert = false; + this.allowContainerDrop = false; + this.appendOnly = false; + Ext.tree.TreeDropZone.superclass.constructor.call(this, tree.container, config); + this.tree = tree; + this.lastInsertClass = "x-tree-no-status"; + this.dragOverData = {}; +}; + +Ext.extend(Ext.tree.TreeDropZone, Ext.dd.DropZone, { + ddGroup : "TreeDD", + + expandDelay : 1000, + + expandNode : function(node){ + if(node.hasChildNodes() && !node.isExpanded()){ + node.expand(false, null, this.triggerCacheRefresh.createDelegate(this)); + } + }, + + queueExpand : function(node){ + this.expandProcId = this.expandNode.defer(this.expandDelay, this, [node]); + }, + + cancelExpand : function(){ + if(this.expandProcId){ + clearTimeout(this.expandProcId); + this.expandProcId = false; + } + }, + + isValidDropPoint : function(n, pt, dd, e, data){ + if(!n || !data){ return false; } + var targetNode = n.node; + var dropNode = data.node; + // default drop rules + if(!(targetNode && targetNode.isTarget && pt)){ + return false; + } + if(pt == "append" && targetNode.allowChildren === false){ + return false; + } + if((pt == "above" || pt == "below") && (targetNode.parentNode && targetNode.parentNode.allowChildren === false)){ + return false; + } + if(dropNode && (targetNode == dropNode || dropNode.contains(targetNode))){ + return false; + } + // reuse the object + var overEvent = this.dragOverData; + overEvent.tree = this.tree; + overEvent.target = targetNode; + overEvent.data = data; + overEvent.point = pt; + overEvent.source = dd; + overEvent.rawEvent = e; + overEvent.dropNode = dropNode; + overEvent.cancel = false; + var result = this.tree.fireEvent("nodedragover", overEvent); + return overEvent.cancel === false && result !== false; + }, + + getDropPoint : function(e, n, dd){ + var tn = n.node; + if(tn.isRoot){ + return tn.allowChildren !== false ? "append" : false; // always append for root + } + var dragEl = n.ddel; + var t = Ext.lib.Dom.getY(dragEl), b = t + dragEl.offsetHeight; + var y = Ext.lib.Event.getPageY(e); + var noAppend = tn.allowChildren === false || tn.isLeaf(); + if(this.appendOnly || tn.parentNode.allowChildren === false){ + return noAppend ? false : "append"; + } + var noBelow = false; + if(!this.allowParentInsert){ + noBelow = tn.hasChildNodes() && tn.isExpanded(); + } + var q = (b - t) / (noAppend ? 2 : 3); + if(y >= t && y < (t + q)){ + return "above"; + }else if(!noBelow && (noAppend || y >= b-q && y <= b)){ + return "below"; + }else{ + return "append"; + } + }, + + onNodeEnter : function(n, dd, e, data){ + this.cancelExpand(); + }, + + onNodeOver : function(n, dd, e, data){ + var pt = this.getDropPoint(e, n, dd); + var node = n.node; + + // auto node expand check + if(!this.expandProcId && pt == "append" && node.hasChildNodes() && !n.node.isExpanded()){ + this.queueExpand(node); + }else if(pt != "append"){ + this.cancelExpand(); + } + + // set the insert point style on the target node + var returnCls = this.dropNotAllowed; + if(this.isValidDropPoint(n, pt, dd, e, data)){ + if(pt){ + var el = n.ddel; + var cls; + if(pt == "above"){ + returnCls = n.node.isFirst() ? "x-tree-drop-ok-above" : "x-tree-drop-ok-between"; + cls = "x-tree-drag-insert-above"; + }else if(pt == "below"){ + returnCls = n.node.isLast() ? "x-tree-drop-ok-below" : "x-tree-drop-ok-between"; + cls = "x-tree-drag-insert-below"; + }else{ + returnCls = "x-tree-drop-ok-append"; + cls = "x-tree-drag-append"; + } + if(this.lastInsertClass != cls){ + Ext.fly(el).replaceClass(this.lastInsertClass, cls); + this.lastInsertClass = cls; + } + } + } + return returnCls; + }, + + onNodeOut : function(n, dd, e, data){ + this.cancelExpand(); + this.removeDropIndicators(n); + }, + + onNodeDrop : function(n, dd, e, data){ + var point = this.getDropPoint(e, n, dd); + var targetNode = n.node; + targetNode.ui.startDrop(); + if(!this.isValidDropPoint(n, point, dd, e, data)){ + targetNode.ui.endDrop(); + return false; + } + // first try to find the drop node + var dropNode = data.node || (dd.getTreeNode ? dd.getTreeNode(data, targetNode, point, e) : null); + var dropEvent = { + tree : this.tree, + target: targetNode, + data: data, + point: point, + source: dd, + rawEvent: e, + dropNode: dropNode, + cancel: !dropNode + }; + var retval = this.tree.fireEvent("beforenodedrop", dropEvent); + if(retval === false || dropEvent.cancel === true || !dropEvent.dropNode){ + targetNode.ui.endDrop(); + return false; + } + // allow target changing + targetNode = dropEvent.target; + if(point == "append" && !targetNode.isExpanded()){ + targetNode.expand(false, null, function(){ + this.completeDrop(dropEvent); + }.createDelegate(this)); + }else{ + this.completeDrop(dropEvent); + } + return true; + }, + + completeDrop : function(de){ + var ns = de.dropNode, p = de.point, t = de.target; + if(!(ns instanceof Array)){ + ns = [ns]; + } + var n; + for(var i = 0, len = ns.length; i < len; i++){ + n = ns[i]; + if(p == "above"){ + t.parentNode.insertBefore(n, t); + }else if(p == "below"){ + t.parentNode.insertBefore(n, t.nextSibling); + }else{ + t.appendChild(n); + } + } + n.ui.focus(); + if(this.tree.hlDrop){ + n.ui.highlight(); + } + t.ui.endDrop(); + this.tree.fireEvent("nodedrop", de); + }, + + afterNodeMoved : function(dd, data, e, targetNode, dropNode){ + if(this.tree.hlDrop){ + dropNode.ui.focus(); + dropNode.ui.highlight(); + } + this.tree.fireEvent("nodedrop", this.tree, targetNode, data, dd, e); + }, + + getTree : function(){ + return this.tree; + }, + + removeDropIndicators : function(n){ + if(n && n.ddel){ + var el = n.ddel; + Ext.fly(el).removeClass([ + "x-tree-drag-insert-above", + "x-tree-drag-insert-below", + "x-tree-drag-append"]); + this.lastInsertClass = "_noclass"; + } + }, + + beforeDragDrop : function(target, e, id){ + this.cancelExpand(); + return true; + }, + + afterRepair : function(data){ + if(data && Ext.enableFx){ + data.node.ui.highlight(); + } + this.hideProxy(); + } +}); + +} \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/tree/TreeEditor.js b/www/extras/yui-ext/source/widgets/tree/TreeEditor.js new file mode 100644 index 000000000..5ea0858ac --- /dev/null +++ b/www/extras/yui-ext/source/widgets/tree/TreeEditor.js @@ -0,0 +1,77 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +Ext.tree.TreeEditor = function(tree, config){ + config = config || {}; + // config can either be a prebuilt field, or a field config + var field = config.events ? config : new Ext.form.TextField(config); + Ext.tree.TreeEditor.superclass.constructor.call(this, field); + + this.tree = tree; + + tree.on('beforeclick', this.beforeNodeClick, this); + tree.el.on('mousedown', this.hide, this); + this.on('complete', this.updateNode, this); + this.on('beforestartedit', this.fitToTree, this); + this.on('startedit', this.bindScroll, this, {delay:10}); + this.on('specialkey', this.onSpecialKey, this); +}; + +Ext.extend(Ext.tree.TreeEditor, Ext.Editor, { + alignment: "l-l", + autoSize: false, + hideEl : false, + cls: "x-small-editor x-tree-editor", + shim:false, + shadow:"frame", + maxWidth: 250, + + fitToTree : function(ed, el){ + var td = this.tree.el.dom, nd = el.dom; + if(td.scrollLeft > nd.offsetLeft){ // ensure the node left point is visible + td.scrollLeft = nd.offsetLeft; + } + var w = Math.min( + this.maxWidth, + (td.clientWidth > 20 ? td.clientWidth : td.offsetWidth) - Math.max(0, nd.offsetLeft-td.scrollLeft) - /*cushion*/5); + this.setSize(w, ''); + }, + + triggerEdit : function(node){ + this.completeEdit(); + this.editNode = node; + this.startEdit(node.ui.textNode, node.text); + }, + + bindScroll : function(){ + this.tree.el.on('scroll', this.cancelEdit, this); + }, + + beforeNodeClick : function(node){ + if(this.tree.getSelectionModel().isSelected(node)){ + this.triggerEdit(node); + return false; + } + }, + + updateNode : function(ed, value){ + this.tree.el.un('scroll', this.cancelEdit, this); + this.editNode.setText(value); + }, + + onSpecialKey : function(field, e){ + var k = e.getKey(); + if(k == e.ESC){ + this.cancelEdit(); + e.stopEvent(); + }else if(k == e.ENTER && !e.hasModifier()){ + this.completeEdit(); + e.stopEvent(); + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/tree/TreeFilter.js b/www/extras/yui-ext/source/widgets/tree/TreeFilter.js new file mode 100644 index 000000000..8912552e1 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/tree/TreeFilter.js @@ -0,0 +1,113 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * This doesn't update the indent (lines) or expand collapse icons of the nodes + */ +Ext.tree.TreeFilter = function(tree, config){ + this.tree = tree; + this.filtered = {}; + Ext.apply(this, config, { + clearBlank:false, + reverse:false, + autoClear:false, + remove:false + }); +}; + +Ext.tree.TreeFilter.prototype = { + /** + * Filter the data by a specific attribute. + * @param {String/RegExp} value Either string that the attribute value + * should start with or a RegExp to test against the attribute + * @param {String} attr (optional) The attribute passed in your node's attributes collection. Defaults to "text". + * @param {TreeNode} startNode (optional) The node to start the filter at. + */ + filter : function(value, attr, startNode){ + attr = attr || "text"; + var f; + if(typeof value == "string"){ + var vlen = value.length; + // auto clear empty filter + if(vlen == 0 && this.clearBlank){ + this.clearFilter(); + return; + } + value = value.toLowerCase(); + f = function(n){ + return n.attributes[attr].substr(0, vlen).toLowerCase() == value; + }; + }else if(value.exec){ // regex? + f = function(n){ + return value.test(n.attributes[attr]); + }; + }else{ + throw 'Illegal filter type, must be string or regex'; + } + this.filterBy(f, null, startNode); + }, + + /** + * Filter by a function. The passed function will be called with each + * node in the tree (or from the startNode). If the function returns true, the node is kept + * otherwise it is filtered. If a node is filtered, its children are also filtered. + * @param {Function} fn The filter function + * @param {Object} scope (optional) The scope of the function (defaults to the current node) + */ + filterBy : function(fn, scope, startNode){ + startNode = startNode || this.tree.root; + if(this.autoClear){ + this.clearFilter(); + } + var af = this.filtered, rv = this.reverse; + var f = function(n){ + if(n == startNode){ + return true; + } + if(af[n.id]){ + return false; + } + var m = fn.call(scope || n, n); + if(!m || rv){ + af[n.id] = n; + n.ui.hide(); + return false; + } + return true; + }; + startNode.cascade(f); + if(this.remove){ + for(var id in af){ + if(typeof id != "function"){ + var n = af[id]; + if(n && n.parentNode){ + n.parentNode.removeChild(n); + } + } + } + } + }, + + /** + * Clears the current filter. Note: with the "remove" option + * set a filter cannot be cleared. + */ + clear : function(){ + var t = this.tree; + var af = this.filtered; + for(var id in af){ + if(typeof id != "function"){ + var n = af[id]; + if(n){ + n.ui.show(); + } + } + } + this.filtered = {}; + } +}; diff --git a/www/extras/yui-ext/source/widgets/tree/TreeLoader.js b/www/extras/yui-ext/source/widgets/tree/TreeLoader.js new file mode 100644 index 000000000..fac0d449f --- /dev/null +++ b/www/extras/yui-ext/source/widgets/tree/TreeLoader.js @@ -0,0 +1,134 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.tree.TreeLoader + */ +Ext.tree.TreeLoader = function(config){ + this.baseParams = {}; + this.requestMethod = "POST"; + Ext.apply(this, config); + + this.addEvents({ + "beforeload" : true, + "load" : true, + "loadexception" : true + }); +}; + +Ext.extend(Ext.tree.TreeLoader, Ext.util.Observable, { + uiProviders : {}, + clearOnLoad : true, + load : function(node, callback){ + if(this.clearOnLoad){ + while(node.firstChild){ + node.removeChild(node.firstChild); + } + } + if(node.attributes.children){ // preloaded json children + var cs = node.attributes.children; + for(var i = 0, len = cs.length; i < len; i++){ + node.appendChild(this.createNode(cs[i])); + } + if(typeof callback == "function"){ + callback(); + } + }else if(this.dataUrl){ + this.requestData(node, callback); + } + }, + + getParams: function(node){ + var buf = [], bp = this.baseParams; + for(var key in bp){ + if(typeof bp[key] != "function"){ + buf.push(encodeURIComponent(key), "=", encodeURIComponent(bp[key]), "&"); + } + } + buf.push("node=", encodeURIComponent(node.id)); + return buf.join(""); + }, + + requestData : function(node, callback){ + if(this.fireEvent("beforeload", this, node, callback) !== false){ + var params = this.getParams(node); + var cb = { + success: this.handleResponse, + failure: this.handleFailure, + scope: this, + argument: {callback: callback, node: node} + }; + this.transId = Ext.lib.Ajax.request(this.requestMethod, this.dataUrl, cb, params); + }else{ + // if the load is cancelled, make sure we notify + // the node that we are done + if(typeof callback == "function"){ + callback(); + } + } + }, + + isLoading : function(){ + return this.transId ? true : false; + }, + + abort : function(){ + if(this.isLoading()){ + Ext.lib.Ajax.abort(this.transId); + } + }, + + /** + * Override this function for custom TreeNode node implementation + */ + createNode : function(attr){ + if(this.applyLoader !== false){ + attr.loader = this; + } + if(typeof attr.uiProvider == 'string'){ + attr.uiProvider = this.uiProviders[attr.uiProvider] || eval(attr.uiProvider); + } + return(attr.leaf ? + new Ext.tree.TreeNode(attr) : + new Ext.tree.AsyncTreeNode(attr)); + }, + + processResponse : function(response, node, callback){ + var json = response.responseText; + try { + var o = eval("("+json+")"); + for(var i = 0, len = o.length; i < len; i++){ + var n = this.createNode(o[i]); + if(n){ + node.appendChild(n); + } + } + if(typeof callback == "function"){ + callback(this, node); + } + }catch(e){ + this.handleFailure(response); + } + }, + + handleResponse : function(response){ + this.transId = false; + var a = response.argument; + this.processResponse(response, a.node, a.callback); + this.fireEvent("load", this, a.node, response); + }, + + handleFailure : function(response){ + this.transId = false; + var a = response.argument; + this.fireEvent("loadexception", this, a.node, response); + if(typeof a.callback == "function"){ + a.callback(this, a.node); + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/tree/TreeNode.js b/www/extras/yui-ext/source/widgets/tree/TreeNode.js new file mode 100644 index 000000000..0faa95257 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/tree/TreeNode.js @@ -0,0 +1,468 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.tree.TreeNode + * @extends Ext.data.Node + * @cfg {String} text The text for this node + * @cfg {Boolean} expanded true to start the node expanded + * @cfg {Boolean} allowDrag false to make this node undraggable if DD is on (defaults to true) + * @cfg {Boolean} allowDrop false if this node cannot be drop on + * @cfg {Boolean} disabled true to start the node disabled + * @cfg {String} icon The path to an icon for the node. The preferred way to do this + * is to use the cls or iconCls attributes and add the icon via a CSS background image. + * @cfg {String} cls A css class to be added to the node + * @cfg {String} iconCls A css class to be added to the nodes icon element for applying css background images + * @cfg {String} href URL of the link used for the node (defaults to #) + * @cfg {String} hrefTarget target frame for the link + * @cfg {String} qtip An Ext QuickTip for the node + * @cfg {Boolean} singleClickExpand True for single click expand on this node + * @cfg {Function} uiProvider A UI class to use for this node (defaults to Ext.tree.TreeNodeUI) + * @constructor + * @param {Object/String} attributes The attributes/config for the node or just a string with the text for the node + */ +Ext.tree.TreeNode = function(attributes){ + attributes = attributes || {}; + if(typeof attributes == "string"){ + attributes = {text: attributes}; + } + this.childrenRendered = false; + this.rendered = false; + Ext.tree.TreeNode.superclass.constructor.call(this, attributes); + this.expanded = attributes.expanded === true; + this.isTarget = attributes.isTarget !== false; + this.draggable = attributes.draggable !== false && attributes.allowDrag !== false; + this.allowChildren = attributes.allowChildren !== false && attributes.allowDrop !== false; + + /** + * Read-only. The text for this node. To change it use setText(). + * @type String + */ + this.text = attributes.text; + /** + * True if this node is disabled. + * @type Boolean + */ + this.disabled = attributes.disabled === true; + + this.addEvents({ + /** + * @event textchange + * Fires when the text for this node is changed + * @param {Node} this This node + * @param {String} text The new text + * @param {String} oldText The old text + */ + "textchange" : true, + /** + * @event beforeexpand + * Fires before this node is expanded, return false to cancel. + * @param {Node} this This node + * @param {Boolean} deep + * @param {Boolean} anim + */ + "beforeexpand" : true, + /** + * @event beforecollapse + * Fires before this node is collapsed, return false to cancel. + * @param {Node} this This node + * @param {Boolean} deep + * @param {Boolean} anim + */ + "beforecollapse" : true, + /** + * @event expand + * Fires when this node is expanded + * @param {Node} this This node + */ + "expand" : true, + /** + * @event disabledchange + * Fires when the disabled status of this node changes + * @param {Node} this This node + * @param {Boolean} disabled + */ + "disabledchange" : true, + /** + * @event collapse + * Fires when this node is collapsed + * @param {Node} this This node + */ + "collapse" : true, + /** + * @event beforeclick + * Fires before click processing. Return false to cancel the default action. + * @param {Node} this This node + * @param {Ext.EventObject} e The event object + */ + "beforeclick":true, + /** + * @event click + * Fires when this node is clicked + * @param {Node} this This node + * @param {Ext.EventObject} e The event object + */ + "click":true, + /** + * @event dblclick + * Fires when this node is double clicked + * @param {Node} this This node + * @param {Ext.EventObject} e The event object + */ + "dblclick":true, + /** + * @event contextmenu + * Fires when this node is right clicked + * @param {Node} this This node + * @param {Ext.EventObject} e The event object + */ + "contextmenu":true, + /** + * @event beforechildrenrendered + * Fires right before the child nodes for this node are rendered + * @param {Node} this This node + */ + "beforechildrenrendered":true + }); + + var uiClass = this.attributes.uiProvider || Ext.tree.TreeNodeUI; + + /** + * Read-only. The UI for this node + * @type TreeNodeUI + */ + this.ui = new uiClass(this); +}; +Ext.extend(Ext.tree.TreeNode, Ext.data.Node, { + preventHScroll: true, + + /** + * Returns true if this node is expanded + * @return {Boolean} + */ + isExpanded : function(){ + return this.expanded; + }, + + /** + * Returns the UI object for this node + * @return {TreeNodeUI} + */ + getUI : function(){ + return this.ui; + }, + + // private override + setFirstChild : function(node){ + var of = this.firstChild; + Ext.tree.TreeNode.superclass.setFirstChild.call(this, node); + if(this.childrenRendered && of && node != of){ + of.renderIndent(true, true); + } + if(this.rendered){ + this.renderIndent(true, true); + } + }, + + // private override + setLastChild : function(node){ + var ol = this.lastChild; + Ext.tree.TreeNode.superclass.setLastChild.call(this, node); + if(this.childrenRendered && ol && node != ol){ + ol.renderIndent(true, true); + } + if(this.rendered){ + this.renderIndent(true, true); + } + }, + + // these methods are overridden to provide lazy rendering support + // private override + appendChild : function(){ + var node = Ext.tree.TreeNode.superclass.appendChild.apply(this, arguments); + if(node && this.childrenRendered){ + node.render(); + } + this.ui.updateExpandIcon(); + return node; + }, + + // private override + removeChild : function(node){ + this.ownerTree.getSelectionModel().unselect(node); + Ext.tree.TreeNode.superclass.removeChild.apply(this, arguments); + // if it's been rendered remove dom node + if(this.childrenRendered){ + node.ui.remove(); + } + if(this.childNodes.length < 1){ + this.collapse(false, false); + }else{ + this.ui.updateExpandIcon(); + } + return node; + }, + + // private override + insertBefore : function(node, refNode){ + var newNode = Ext.tree.TreeNode.superclass.insertBefore.apply(this, arguments); + if(newNode && refNode && this.childrenRendered){ + node.render(); + } + this.ui.updateExpandIcon(); + return newNode; + }, + + /** + * Sets the text for this node + * @param {String} text + */ + setText : function(text){ + var oldText = this.text; + this.text = text; + this.attributes.text = text; + if(this.rendered){ // event without subscribing + this.ui.onTextChange(this, text, oldText); + } + this.fireEvent("textchange", this, text, oldText); + }, + + /** + * Triggers selection of this node + */ + select : function(){ + this.getOwnerTree().getSelectionModel().select(this); + }, + + /** + * Triggers deselection of this node + */ + unselect : function(){ + this.getOwnerTree().getSelectionModel().unselect(this); + }, + + /** + * Returns true if this node is selected + * @return {Boolean} + */ + isSelected : function(){ + return this.getOwnerTree().getSelectionModel().isSelected(this); + }, + + /** + * Expand this node. + * @param {Boolean} deep (optional) True to expand all children as well + * @param {Boolean} anim (optional) false to cancel the default animation + * @param {Function} callback (optional) A callback to be called when + * expanding this node completes (does not wait for deep expand to complete). + * Called with 1 parameter, this node. + */ + expand : function(deep, anim, callback){ + if(!this.expanded){ + if(this.fireEvent("beforeexpand", this, deep, anim) === false){ + return; + } + if(!this.childrenRendered){ + this.renderChildren(); + } + this.expanded = true; + if(!this.isHiddenRoot() && (this.getOwnerTree().animate && anim !== false) || anim){ + this.ui.animExpand(function(){ + this.fireEvent("expand", this); + if(typeof callback == "function"){ + callback(this); + } + if(deep === true){ + this.expandChildNodes(true); + } + }.createDelegate(this)); + return; + }else{ + this.ui.expand(); + this.fireEvent("expand", this); + if(typeof callback == "function"){ + callback(this); + } + } + }else{ + if(typeof callback == "function"){ + callback(this); + } + } + if(deep === true){ + this.expandChildNodes(true); + } + }, + + isHiddenRoot : function(){ + return this.isRoot && !this.getOwnerTree().rootVisible; + }, + + /** + * Collapse this node. + * @param {Boolean} deep (optional) True to collapse all children as well + * @param {Boolean} anim (optional) false to cancel the default animation + */ + collapse : function(deep, anim){ + if(this.expanded && !this.isHiddenRoot()){ + if(this.fireEvent("beforecollapse", this, deep, anim) === false){ + return; + } + this.expanded = false; + if((this.getOwnerTree().animate && anim !== false) || anim){ + this.ui.animCollapse(function(){ + this.fireEvent("collapse", this); + if(deep === true){ + this.collapseChildNodes(true); + } + }.createDelegate(this)); + return; + }else{ + this.ui.collapse(); + this.fireEvent("collapse", this); + } + } + if(deep === true){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + cs[i].collapse(true); + } + } + }, + + // private + delayedExpand : function(delay){ + if(!this.expandProcId){ + this.expandProcId = this.expand.defer(delay, this); + } + }, + + // private + cancelExpand : function(){ + if(this.expandProcId){ + clearTimeout(this.expandProcId); + } + this.expandProcId = false; + }, + + /** + * Toggles expanded/collapsed state of the node + */ + toggle : function(){ + if(this.expanded){ + this.collapse(); + }else{ + this.expand(); + } + }, + + /** + * Ensures all parent nodes are expanded + */ + ensureVisible : function(callback){ + var tree = this.getOwnerTree(); + tree.expandPath(this.getPath(), false, function(){ + tree.getEl().scrollChildIntoView(this.ui.anchor); + Ext.callback(callback); + }.createDelegate(this)); + }, + + /** + * Expand all child nodes + * @param {Boolean} deep (optional) true if the child nodes should also expand their child nodes + */ + expandChildNodes : function(deep){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + cs[i].expand(deep); + } + }, + + /** + * Collapse all child nodes + * @param {Boolean} deep (optional) true if the child nodes should also collapse their child nodes + */ + collapseChildNodes : function(deep){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + cs[i].collapse(deep); + } + }, + + /** + * Disables this node + */ + disable : function(){ + this.disabled = true; + this.unselect(); + if(this.rendered && this.ui.onDisableChange){ // event without subscribing + this.ui.onDisableChange(this, true); + } + this.fireEvent("disabledchange", this, true); + }, + + /** + * Enables this node + */ + enable : function(){ + this.disabled = false; + if(this.rendered && this.ui.onDisableChange){ // event without subscribing + this.ui.onDisableChange(this, false); + } + this.fireEvent("disabledchange", this, false); + }, + + // private + renderChildren : function(suppressEvent){ + if(suppressEvent !== false){ + this.fireEvent("beforechildrenrendered", this); + } + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++){ + cs[i].render(true); + } + this.childrenRendered = true; + }, + + // private + sort : function(fn, scope){ + Ext.tree.TreeNode.superclass.sort.apply(this, arguments); + if(this.childrenRendered){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++){ + cs[i].render(true); + } + } + }, + + // private + render : function(bulkRender){ + this.ui.render(bulkRender); + if(!this.rendered){ + this.rendered = true; + if(this.expanded){ + this.expanded = false; + this.expand(false, false); + } + } + }, + + // private + renderIndent : function(deep, refresh){ + if(refresh){ + this.ui.childIndent = null; + } + this.ui.renderIndent(); + if(deep === true && this.childrenRendered){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++){ + cs[i].renderIndent(true, refresh); + } + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/tree/TreeNodeUI.js b/www/extras/yui-ext/source/widgets/tree/TreeNodeUI.js new file mode 100644 index 000000000..98797287d --- /dev/null +++ b/www/extras/yui-ext/source/widgets/tree/TreeNodeUI.js @@ -0,0 +1,471 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * The TreeNode UI implementation is separate from the + * tree implementation. Unless you are customizing the tree UI, + * you should never have to use this directly. + */ +Ext.tree.TreeNodeUI = function(node){ + this.node = node; + this.rendered = false; + this.animating = false; + this.emptyIcon = Ext.BLANK_IMAGE_URL; +}; + +Ext.tree.TreeNodeUI.prototype = { + removeChild : function(node){ + if(this.rendered){ + this.ctNode.removeChild(node.ui.getEl()); + } + }, + + beforeLoad : function(){ + this.addClass("x-tree-node-loading"); + }, + + afterLoad : function(){ + this.removeClass("x-tree-node-loading"); + }, + + onTextChange : function(node, text, oldText){ + if(this.rendered){ + this.textNode.innerHTML = text; + } + }, + + onDisableChange : function(node, state){ + this.disabled = state; + if(state){ + this.addClass("x-tree-node-disabled"); + }else{ + this.removeClass("x-tree-node-disabled"); + } + }, + + onSelectedChange : function(state){ + if(state){ + this.focus(); + this.addClass("x-tree-selected"); + }else{ + //this.blur(); + this.removeClass("x-tree-selected"); + } + }, + + onMove : function(tree, node, oldParent, newParent, index, refNode){ + this.childIndent = null; + if(this.rendered){ + var targetNode = newParent.ui.getContainer(); + if(!targetNode){//target not rendered + this.holder = document.createElement("div"); + this.holder.appendChild(this.wrap); + return; + } + var insertBefore = refNode ? refNode.ui.getEl() : null; + if(insertBefore){ + targetNode.insertBefore(this.wrap, insertBefore); + }else{ + targetNode.appendChild(this.wrap); + } + this.node.renderIndent(true); + } + }, + + addClass : function(cls){ + if(this.elNode){ + Ext.fly(this.elNode).addClass(cls); + } + }, + + removeClass : function(cls){ + if(this.elNode){ + Ext.fly(this.elNode).removeClass(cls); + } + }, + + remove : function(){ + if(this.rendered){ + this.holder = document.createElement("div"); + this.holder.appendChild(this.wrap); + } + }, + + fireEvent : function(){ + return this.node.fireEvent.apply(this.node, arguments); + }, + + initEvents : function(){ + this.node.on("move", this.onMove, this); + var E = Ext.EventManager; + var a = this.anchor; + + var el = Ext.fly(a); + + if(Ext.isOpera){ // opera render bug ignores the CSS + el.setStyle("text-decoration", "none"); + } + + el.on("click", this.onClick, this); + el.on("dblclick", this.onDblClick, this); + el.on("contextmenu", this.onContextMenu, this); + + var icon = Ext.fly(this.iconNode); + icon.on("click", this.onClick, this); + icon.on("dblclick", this.onDblClick, this); + icon.on("contextmenu", this.onContextMenu, this); + E.on(this.ecNode, "click", this.ecClick, this, true); + + if(this.node.disabled){ + this.addClass("x-tree-node-disabled"); + } + if(this.node.hidden){ + this.addClass("x-tree-node-disabled"); + } + var ot = this.node.getOwnerTree(); + var dd = ot.enableDD || ot.enableDrag || ot.enableDrop; + if(dd && (!this.node.isRoot || ot.rootVisible)){ + Ext.dd.Registry.register(this.elNode, { + node: this.node, + handles: [this.iconNode, this.textNode], + isHandle: false + }); + } + }, + + hide : function(){ + if(this.rendered){ + this.wrap.style.display = "none"; + } + }, + + show : function(){ + if(this.rendered){ + this.wrap.style.display = ""; + } + }, + + onContextMenu : function(e){ + e.preventDefault(); + this.focus(); + this.fireEvent("contextmenu", this.node, e); + }, + + onClick : function(e){ + if(this.dropping){ + return; + } + if(this.fireEvent("beforeclick", this.node, e) !== false){ + if(!this.disabled && this.node.attributes.href){ + this.fireEvent("click", this.node, e); + return; + } + e.preventDefault(); + if(this.disabled){ + return; + } + + if(this.node.attributes.singleClickExpand && !this.animating && this.node.hasChildNodes()){ + this.node.toggle(); + } + + this.fireEvent("click", this.node, e); + }else{ + e.stopEvent(); + } + }, + + onDblClick : function(e){ + e.preventDefault(); + if(this.disabled){ + return; + } + if(!this.animating && this.node.hasChildNodes()){ + this.node.toggle(); + } + this.fireEvent("dblclick", this.node, e); + }, + + ecClick : function(e){ + if(!this.animating && this.node.hasChildNodes()){ + this.node.toggle(); + } + }, + + startDrop : function(){ + this.dropping = true; + }, + + // delayed drop so the click event doesn't get fired on a drop + endDrop : function(){ + setTimeout(function(){ + this.dropping = false; + }.createDelegate(this), 50); + }, + + expand : function(){ + this.updateExpandIcon(); + this.ctNode.style.display = ""; + }, + + focus : function(){ + if(!this.node.preventHScroll){ + try{this.anchor.focus(); + }catch(e){} + }else if(!Ext.isIE){ + try{ + var noscroll = this.node.getOwnerTree().el.dom; + var l = noscroll.scrollLeft; + this.anchor.focus(); + noscroll.scrollLeft = l; + }catch(e){} + } + }, + + blur : function(){ + try{ + this.anchor.blur(); + }catch(e){} + }, + + animExpand : function(callback){ + var ct = Ext.get(this.ctNode); + ct.stopFx(); + if(!this.node.hasChildNodes()){ + this.updateExpandIcon(); + this.ctNode.style.display = ""; + Ext.callback(callback); + return; + } + this.animating = true; + this.updateExpandIcon(); + + ct.slideIn('t', { + callback : function(){ + this.animating = false; + Ext.callback(callback); + }, + scope: this, + duration: this.node.ownerTree.duration || .25 + }); + }, + + highlight : function(){ + var tree = this.node.getOwnerTree(); + Ext.fly(this.wrap).highlight( + tree.hlColor || "C3DAF9", + {endColor: tree.hlBaseColor} + ); + }, + + collapse : function(){ + this.updateExpandIcon(); + this.ctNode.style.display = "none"; + }, + + animCollapse : function(callback){ + var ct = Ext.get(this.ctNode); + ct.enableDisplayMode('block'); + ct.stopFx(); + + this.animating = true; + this.updateExpandIcon(); + + ct.slideOut('t', { + callback : function(){ + this.animating = false; + Ext.callback(callback); + }, + scope: this, + duration: this.node.ownerTree.duration || .25 + }); + }, + + getContainer : function(){ + return this.ctNode; + }, + + getEl : function(){ + return this.wrap; + }, + + appendDDGhost : function(ghostNode){ + ghostNode.appendChild(this.elNode.cloneNode(true)); + }, + + getDDRepairXY : function(){ + return Ext.lib.Dom.getXY(this.iconNode); + }, + + onRender : function(){ + this.render(); + }, + + render : function(bulkRender){ + var n = this.node; + var targetNode = n.parentNode ? + n.parentNode.ui.getContainer() : n.ownerTree.container.dom; + if(!this.rendered){ + this.rendered = true; + var a = n.attributes; + + // add some indent caching, this helps performance when rendering a large tree + this.indentMarkup = ""; + if(n.parentNode){ + this.indentMarkup = n.parentNode.ui.getChildIndent(); + } + + var buf = ['
        • ', + '',this.indentMarkup,"", + '', + '', + '',n.text,"
          ", + '', + "
        • "]; + + if(bulkRender !== true && n.nextSibling && n.nextSibling.ui.getEl()){ + this.wrap = Ext.DomHelper.insertHtml("beforeBegin", + n.nextSibling.ui.getEl(), buf.join("")); + }else{ + this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf.join("")); + } + this.elNode = this.wrap.childNodes[0]; + this.ctNode = this.wrap.childNodes[1]; + var cs = this.elNode.childNodes; + this.indentNode = cs[0]; + this.ecNode = cs[1]; + this.iconNode = cs[2]; + this.anchor = cs[3]; + this.textNode = cs[3].firstChild; + if(a.qtip){ + if(this.textNode.setAttributeNS){ + this.textNode.setAttributeNS("ext", "qtip", a.qtip); + if(a.qtipTitle){ + this.textNode.setAttributeNS("ext", "qtitle", a.qtipTitle); + } + }else{ + this.textNode.setAttribute("ext:qtip", a.qtip); + if(a.qtipTitle){ + this.textNode.setAttribute("ext:qtitle", a.qtipTitle); + } + } + } + this.initEvents(); + if(!this.node.expanded){ + this.updateExpandIcon(); + } + }else{ + if(bulkRender === true) { + targetNode.appendChild(this.wrap); + } + } + }, + + getAnchor : function(){ + return this.anchor; + }, + + getTextEl : function(){ + return this.textNode; + }, + + getIconEl : function(){ + return this.iconNode; + }, + + updateExpandIcon : function(){ + if(this.rendered){ + var n = this.node, c1, c2; + //console.log(n.id) + var cls = n.isLast() ? "x-tree-elbow-end" : "x-tree-elbow"; + var hasChild = n.hasChildNodes(); + if(hasChild){ + if(n.expanded){ + cls += "-minus"; + c1 = "x-tree-node-collapsed"; + c2 = "x-tree-node-expanded"; + }else{ + cls += "-plus"; + c1 = "x-tree-node-expanded"; + c2 = "x-tree-node-collapsed"; + } + if(this.wasLeaf){ + this.removeClass("x-tree-node-leaf"); + this.wasLeaf = false; + } + if(this.c1 != c1 || this.c2 != c2){ + Ext.fly(this.elNode).replaceClass(c1, c2); + this.c1 = c1; this.c2 = c2; + } + }else{ + if(!this.wasLeaf){ + Ext.fly(this.elNode).replaceClass("x-tree-node-expanded", "x-tree-node-leaf"); + this.wasLeaf = true; + } + } + var ecc = "x-tree-ec-icon "+cls; + if(this.ecc != ecc){ + this.ecNode.className = ecc; + this.ecc = ecc; + } + } + }, + + getChildIndent : function(){ + if(!this.childIndent){ + var buf = []; + var p = this.node; + while(p){ + if(!p.isRoot || (p.isRoot && p.ownerTree.rootVisible)){ + if(!p.isLast()) { + buf.unshift(''); + } else { + buf.unshift(''); + } + } + p = p.parentNode; + } + this.childIndent = buf.join(""); + } + return this.childIndent; + }, + + renderIndent : function(){ + if(this.rendered){ + var indent = ""; + var p = this.node.parentNode; + if(p){ + indent = p.ui.getChildIndent(); + } + if(this.indentMarkup != indent){ // don't rerender if not required + this.indentNode.innerHTML = indent; + this.indentMarkup = indent; + } + this.updateExpandIcon(); + } + } +}; + +Ext.tree.RootTreeNodeUI = function(){ + Ext.tree.RootTreeNodeUI.superclass.constructor.apply(this, arguments); +}; +Ext.extend(Ext.tree.RootTreeNodeUI, Ext.tree.TreeNodeUI, { + render : function(){ + if(!this.rendered){ + var targetNode = this.node.ownerTree.container.dom; + this.node.expanded = true; + targetNode.innerHTML = '
          '; + this.wrap = this.ctNode = targetNode.firstChild; + } + }, + collapse : function(){ + }, + expand : function(){ + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/tree/TreePanel.js b/www/extras/yui-ext/source/widgets/tree/TreePanel.js new file mode 100644 index 000000000..c984d914c --- /dev/null +++ b/www/extras/yui-ext/source/widgets/tree/TreePanel.js @@ -0,0 +1,390 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.tree.TreePanel + * @extends Ext.data.Tree + + * @cfg {Boolean} rootVisible false to hide the root node (defaults to true) + * @cfg {Boolean} lines false to disable tree lines (defaults to true) + * @cfg {Boolean} enableDD true to enable drag and drop + * @cfg {Boolean} enableDrag true to enable just drag + * @cfg {Boolean} enableDrop true to enable just drop + * @cfg {Object} dragConfig Custom config to pass to the {@link Ext.tree.TreeDragZone} instance + * @cfg {Object} dropConfig Custom config to pass to the {@link Ext.tree.TreeDropZone} instance + * @cfg {String} ddGroup The DD group this TreePanel belongs to + * @cfg {String} ddAppendOnly True if the tree should only allow append drops (use for trees which are sorted) + * @cfg {Boolean} ddScroll true to enable YUI body scrolling + * @cfg {Boolean} containerScroll true to register this container with ScrollManager + * @cfg {Boolean} hlDrop false to disable node highlight on drop (defaults to true) + * @cfg {String} hlColor The color of the node highlight (defaults to C3DAF9) + * @cfg {Boolean} animate true to enable animated expand/collapse + * @cfg {Boolean} singleExpand true if only 1 node per branch may be expanded + * @cfg {Boolean} selModel A tree selection model to use with this TreePanel (defaults to a {@link Ext.tree.DefaultSelectionModel}) + * @cfg {Boolean} loader A TreeLoader for use with this TreePanel + * @constructor + * @param {String/HTMLElement/Element} el The container element + * @param {Object} config + */ +Ext.tree.TreePanel = function(el, config){ + Ext.tree.TreePanel.superclass.constructor.call(this); + this.el = Ext.get(el); + this.el.addClass('x-tree'); + /** + * Read-only. The id of the container element becomes this TreePanel's id. + */ + this.id = this.el.id; + Ext.apply(this, config); + this.addEvents({ + /** + * @event beforeload + * Fires before a node is loaded, return false to cancel + * @param {Node} node The node being loaded + */ + "beforeload" : true, + /** + * @event load + * Fires when a node is loaded + * @param {Node} node The node that was loaded + */ + "load" : true, + /** + * @event textchange + * Fires when the text for a node is changed + * @param {Node} node The node + * @param {String} text The new text + * @param {String} oldText The old text + */ + "textchange" : true, + /** + * @event beforeexpand + * Fires before a node is expanded, return false to cancel. + * @param {Node} node The node + * @param {Boolean} deep + * @param {Boolean} anim + */ + "beforeexpand" : true, + /** + * @event beforecollapse + * Fires before a node is collapsed, return false to cancel. + * @param {Node} node The node + * @param {Boolean} deep + * @param {Boolean} anim + */ + "beforecollapse" : true, + /** + * @event expand + * Fires when a node is expanded + * @param {Node} node The node + */ + "expand" : true, + /** + * @event disabledchange + * Fires when the disabled status of a node changes + * @param {Node} node The node + * @param {Boolean} disabled + */ + "disabledchange" : true, + /** + * @event collapse + * Fires when a node is collapsed + * @param {Node} node The node + */ + "collapse" : true, + /** + * @event beforeclick + * Fires before click processing on a node. Return false to cancel the default action. + * @param {Node} node The node + * @param {Ext.EventObject} e The event object + */ + "beforeclick":true, + /** + * @event click + * Fires when a node is clicked + * @param {Node} node The node + * @param {Ext.EventObject} e The event object + */ + "click":true, + /** + * @event dblclick + * Fires when a node is double clicked + * @param {Node} node The node + * @param {Ext.EventObject} e The event object + */ + "dblclick":true, + /** + * @event contextmenu + * Fires when a node is right clicked + * @param {Node} node The node + * @param {Ext.EventObject} e The event object + */ + "contextmenu":true, + /** + * @event beforechildrenrendered + * Fires right before the child nodes for a node are rendered + * @param {Node} node The node + */ + "beforechildrenrendered":true, + /** + * @event startdrag + * Fires when a node starts being dragged + * @param {Ext.tree.TreePanel} this + * @param {Ext.tree.TreeNode} node + * @param {event} e The raw browser event + */ + "startdrag" : true, + /** + * @event enddrag + * Fires when a drag operation is complete + * @param {Ext.tree.TreePanel} this + * @param {Ext.tree.TreeNode} node + * @param {event} e The raw browser event + */ + "enddrag" : true, + /** + * @event dragdrop + * Fires when a dragged node is dropped on a valid DD target + * @param {Ext.tree.TreePanel} this + * @param {Ext.tree.TreeNode} node + * @param {DD} dd The dd it was dropped on + * @param {event} e The raw browser event + */ + "dragdrop" : true, + /** + * @event beforenodedrop + * Fires when a DD object is dropped on a node in this tree for preprocessing. Return false to cancel the drop. The dropEvent + * passed to handlers has the following properties:
          + *
            + *
          • tree - The TreePanel
          • + *
          • target - The node being targeted for the drop
          • + *
          • data - The drag data from the drag source
          • + *
          • point - The point of the drop - append, above or below
          • + *
          • source - The drag source
          • + *
          • rawEvent - Raw mouse event
          • + *
          • dropNode - Drop node(s) provided by the source OR you can supply node(s) + * to be inserted by setting them on this object.
          • + *
          • cancel - Set this to true to cancel the drop.
          • + *
          + * @param {Object} dropEvent + */ + "beforenodedrop" : true, + /** + * @event nodedrop + * Fires after a DD object is dropped on a node in this tree. The dropEvent + * passed to handlers has the following properties:
          + *
            + *
          • tree - The TreePanel
          • + *
          • target - The node being targeted for the drop
          • + *
          • data - The drag data from the drag source
          • + *
          • point - The point of the drop - append, above or below
          • + *
          • source - The drag source
          • + *
          • rawEvent - Raw mouse event
          • + *
          • dropNode - Dropped node(s).
          • + *
          + * @param {Object} dropEvent + */ + "nodedrop" : true, + /** + * @event nodedragover + * Fires when a tree node is being targeted for a drag drop, return false to signal drop not allowed. The dragOverEvent + * passed to handlers has the following properties:
          + *
            + *
          • tree - The TreePanel
          • + *
          • target - The node being targeted for the drop
          • + *
          • data - The drag data from the drag source
          • + *
          • point - The point of the drop - append, above or below
          • + *
          • source - The drag source
          • + *
          • rawEvent - Raw mouse event
          • + *
          • dropNode - Drop node(s) provided by the source.
          • + *
          • cancel - Set this to true to signal drop not allowed.
          • + *
          + * @param {Object} dragOverEvent + */ + "nodedragover" : true + }); + if(this.singleExpand){ + this.on("beforeexpand", this.restrictExpand, this); + } +}; +Ext.extend(Ext.tree.TreePanel, Ext.data.Tree, { + rootVisible : true, + animate: Ext.enableFx, + lines : true, + enableDD : false, + hlDrop : Ext.enableFx, + + // private + restrictExpand : function(node){ + var p = node.parentNode; + if(p){ + if(p.expandedChild && p.expandedChild.parentNode == p){ + p.expandedChild.collapse(); + } + p.expandedChild = node; + } + }, + + // private override + setRootNode : function(node){ + Ext.tree.TreePanel.superclass.setRootNode.call(this, node); + if(!this.rootVisible){ + node.ui = new Ext.tree.RootTreeNodeUI(node); + } + return node; + }, + + /** + * Returns the container element for this TreePanel + */ + getEl : function(){ + return this.el; + }, + + /** + * Returns the default TreeLoader for this TreePanel + */ + getLoader : function(){ + return this.loader; + }, + + /** + * Expand all nodes + */ + expandAll : function(){ + this.root.expand(true); + }, + + /** + * Collapse all nodes + */ + collapseAll : function(){ + this.root.collapse(true); + }, + + /** + * Returns the selection model used by this TreePanel + */ + getSelectionModel : function(){ + if(!this.selModel){ + this.selModel = new Ext.tree.DefaultSelectionModel(); + } + return this.selModel; + }, + + /** + * Expands a specified path in this TreePanel. A path can be retrieved from a node with {@link Ext.data.Node#getPath} + * @param {String} path + * @param {String} attr (optional) The attribute used in the path (see {@link Ext.data.Node#getPath} for more info) + * @param {Function} callback (optional) The callback to call when the expand is complete. The callback will be called with + * (bSuccess, oLastNode) where bSuccess is if the expand was successful and oLastNode is the last node that was expanded. + */ + expandPath : function(path, attr, callback){ + attr = attr || "id"; + var keys = path.split(this.pathSeparator); + var curNode = this.root; + if(curNode.attributes[attr] != keys[1]){ // invalid root + if(callback){ + callback(false, null); + } + return; + } + var index = 1; + var f = function(){ + if(++index == keys.length){ + if(callback){ + callback(true, curNode); + } + return; + } + var c = curNode.findChild(attr, keys[index]); + if(!c){ + if(callback){ + callback(false, curNode); + } + return; + } + curNode = c; + c.expand(false, false, f); + }; + curNode.expand(false, false, f); + }, + + /** + * Selects the node in this tree at the specified path. A path can be retrieved from a node with {@link Ext.data.Node#getPath} + * @param {String} path + * @param {String} attr (optional) The attribute used in the path (see {@link Ext.data.Node#getPath} for more info) + * @param {Function} callback (optional) The callback to call when the selection is complete. The callback will be called with + * (bSuccess, oSelNode) where bSuccess is if the selection was successful and oSelNode is the selected node. + */ + selectPath : function(path, attr, callback){ + attr = attr || "id"; + var keys = path.split(this.pathSeparator); + var v = keys.pop(); + if(keys.length > 0){ + var f = function(success, node){ + if(success && node){ + var n = node.findChild(attr, v); + if(n){ + n.select(); + if(callback){ + callback(true, n); + } + } + }else{ + if(callback){ + callback(false, n); + } + } + }; + this.expandPath(keys.join(this.pathSeparator), attr, f); + }else{ + this.root.select(); + if(callback){ + callback(true, this.root); + } + } + }, + + /** + * Trigger rendering of this TreePanel + */ + render : function(){ + this.container = this.el.createChild({tag:"ul", + cls:"x-tree-root-ct " + + (this.lines ? "x-tree-lines" : "x-tree-no-lines")}); + + if(this.containerScroll){ + Ext.dd.ScrollManager.register(this.el); + } + if((this.enableDD || this.enableDrop) && !this.dropZone){ + /** + * The dropZone used by this tree if drop is enabled + * @type Ext.tree.TreeDropZone + */ + this.dropZone = new Ext.tree.TreeDropZone(this, this.dropConfig || { + ddGroup: this.ddGroup || "TreeDD", appendOnly: this.ddAppendOnly === true + }); + } + if((this.enableDD || this.enableDrag) && !this.dragZone){ + /** + * The dragZone used by this tree if drag is enabled + * @type Ext.tree.TreeDragZone + */ + this.dragZone = new Ext.tree.TreeDragZone(this, this.dragConfig || { + ddGroup: this.ddGroup || "TreeDD", + scroll: this.ddScroll + }); + } + this.getSelectionModel().init(this); + this.root.render(); + if(!this.rootVisible){ + this.root.renderChildren(); + } + return this; + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/tree/TreeSelectionModel.js b/www/extras/yui-ext/source/widgets/tree/TreeSelectionModel.js new file mode 100644 index 000000000..e5769aa82 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/tree/TreeSelectionModel.js @@ -0,0 +1,316 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.tree.DefaultSelectionModel + * @extends Ext.util.Observable + * The default single selection for a TreePanel. + */ +Ext.tree.DefaultSelectionModel = function(){ + this.selNode = null; + + this.addEvents({ + /** + * @event selectionchange + * Fires when the selected node changes + * @param {DefaultSelectionModel} this + * @param {TreeNode} node the new selection + */ + "selectionchange" : true, + + /** + * @event beforeselect + * Fires before the selected node changes, return false to cancel the change + * @param {DefaultSelectionModel} this + * @param {TreeNode} node the new selection + * @param {TreeNode} node the old selection + */ + "beforeselect" : true + }); +}; + +Ext.extend(Ext.tree.DefaultSelectionModel, Ext.util.Observable, { + init : function(tree){ + this.tree = tree; + tree.el.on("keydown", this.onKeyDown, this); + tree.on("click", this.onNodeClick, this); + }, + + onNodeClick : function(node, e){ + this.select(node); + }, + + /** + * Select a node. + * @param {TreeNode} node The node to select + * @return {TreeNode} The selected node + */ + select : function(node){ + var last = this.selNode; + if(last != node && this.fireEvent('beforeselect', this, node, last) !== false){ + if(last){ + last.ui.onSelectedChange(false); + } + this.selNode = node; + node.ui.onSelectedChange(true); + this.fireEvent("selectionchange", this, node, last); + } + return node; + }, + + /** + * Deselect a node. + * @param {TreeNode} node The node to unselect + */ + unselect : function(node){ + if(this.selNode == node){ + this.clearSelections(); + } + }, + + /** + * Clear all selections + */ + clearSelections : function(){ + var n = this.selNode; + if(n){ + n.ui.onSelectedChange(false); + this.selNode = null; + this.fireEvent("selectionchange", this, null); + } + return n; + }, + + /** + * Get the selected node + * @return {TreeNode} The selected node + */ + getSelectedNode : function(){ + return this.selNode; + }, + + /** + * Returns true if the node is selected + * @param {TreeNode} node The node to check + * @return {Boolean} + */ + isSelected : function(node){ + return this.selNode == node; + }, + + /** + * Selects the node above the selected node in the tree, intelligently walking the nodes + * @return TreeNode The new selection + */ + selectPrevious : function(){ + var s = this.selNode || this.lastSelNode; + if(!s){ + return null; + } + var ps = s.previousSibling; + if(ps){ + if(!ps.isExpanded() || ps.childNodes.length < 1){ + return this.select(ps); + } else{ + var lc = ps.lastChild; + while(lc && lc.isExpanded() && lc.childNodes.length > 0){ + lc = lc.lastChild; + } + return this.select(lc); + } + } else if(s.parentNode && (this.tree.rootVisible || !s.parentNode.isRoot)){ + return this.select(s.parentNode); + } + return null; + }, + + /** + * Selects the node above the selected node in the tree, intelligently walking the nodes + * @return TreeNode The new selection + */ + selectNext : function(){ + var s = this.selNode || this.lastSelNode; + if(!s){ + return null; + } + if(s.firstChild && s.isExpanded()){ + return this.select(s.firstChild); + }else if(s.nextSibling){ + return this.select(s.nextSibling); + }else if(s.parentNode){ + var newS = null; + s.parentNode.bubble(function(){ + if(this.nextSibling){ + newS = this.getOwnerTree().selModel.select(this.nextSibling); + return false; + } + }); + return newS; + } + return null; + }, + + onKeyDown : function(e){ + var s = this.selNode || this.lastSelNode; + // undesirable, but required + var sm = this; + if(!s){ + return; + } + var k = e.getKey(); + switch(k){ + case e.DOWN: + e.stopEvent(); + this.selectNext(); + break; + case e.UP: + e.stopEvent(); + this.selectPrevious(); + break; + case e.RIGHT: + e.preventDefault(); + if(s.hasChildNodes()){ + if(!s.isExpanded()){ + s.expand(); + }else if(s.firstChild){ + this.select(s.firstChild, e); + } + } + break; + case e.LEFT: + e.preventDefault(); + if(s.hasChildNodes() && s.isExpanded()){ + s.collapse(); + }else if(s.parentNode && (this.tree.rootVisible || s.parentNode != this.tree.getRootNode())){ + this.select(s.parentNode, e); + } + break; + }; + } +}); + +/** + * @class Ext.tree.MultiSelectionModel + * @extends Ext.util.Observable + * Multi selection for a TreePanel. + */ +Ext.tree.MultiSelectionModel = function(){ + this.selNodes = []; + this.selMap = {}; + this.addEvents({ + /** + * @event selectionchange + * Fires when the selected nodes change + * @param {MultiSelectionModel} this + * @param {Array} nodes Array of the selected nodes + */ + "selectionchange" : true + }); +}; + +Ext.extend(Ext.tree.MultiSelectionModel, Ext.util.Observable, { + init : function(tree){ + this.tree = tree; + tree.el.on("keydown", this.onKeyDown, this); + tree.on("click", this.onNodeClick, this); + }, + + onNodeClick : function(node, e){ + this.select(node, e, e.ctrlKey); + }, + + /** + * Select a node. + * @param {TreeNode} node The node to select + * @param {EventObject} e (optional) An event associated with the selection + * @param {Boolean} keepExisting True to retain existing selections + * @return {TreeNode} The selected node + */ + select : function(node, e, keepExisting){ + if(keepExisting !== true){ + this.clearSelections(true); + } + if(this.isSelected(node)){ + this.lastSelNode = node; + return node; + } + this.selNodes.push(node); + this.selMap[node.id] = node; + this.lastSelNode = node; + node.ui.onSelectedChange(true); + this.fireEvent("selectionchange", this, this.selNodes); + return node; + }, + + /** + * Deselect a node. + * @param {TreeNode} node The node to unselect + */ + unselect : function(node){ + if(this.selMap[node.id]){ + node.ui.onSelectedChange(false); + var sn = this.selNodes; + var index = -1; + if(sn.indexOf){ + index = sn.indexOf(node); + }else{ + for(var i = 0, len = sn.length; i < len; i++){ + if(sn[i] == node){ + index = i; + break; + } + } + } + if(index != -1){ + this.selNodes.splice(index, 1); + } + delete this.selMap[node.id]; + this.fireEvent("selectionchange", this, this.selNodes); + } + }, + + /** + * Clear all selections + */ + clearSelections : function(suppressEvent){ + var sn = this.selNodes; + if(sn.length > 0){ + for(var i = 0, len = sn.length; i < len; i++){ + sn[i].ui.onSelectedChange(false); + } + this.selNodes = []; + this.selMap = {}; + if(suppressEvent !== true){ + this.fireEvent("selectionchange", this, this.selNodes); + } + } + }, + + /** + * Returns true if the node is selected + * @param {TreeNode} node The node to check + * @return {Boolean} + */ + isSelected : function(node){ + return this.selMap[node.id] ? true : false; + }, + + /** + * Returns an array of the selected nodes + * @return {Array} + */ + getSelectedNodes : function(){ + return this.selNodes; + }, + + onKeyDown : Ext.tree.DefaultSelectionModel.prototype.onKeyDown, + + selectNext : Ext.tree.DefaultSelectionModel.prototype.selectNext, + + selectPrevious : Ext.tree.DefaultSelectionModel.prototype.selectPrevious +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/tree/TreeSorter.js b/www/extras/yui-ext/source/widgets/tree/TreeSorter.js new file mode 100644 index 000000000..5c0011707 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/tree/TreeSorter.js @@ -0,0 +1,72 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/** + * @class Ext.tree.TreeSorter + * Provides sorting of nodes in a TreePanel + * + * @cfg {Boolean} folderSort True to sort leaf nodes under non leaf nodes + * @cfg {String} property The named attribute on the node to sort by (defaults to text) + * @cfg {String} dir The direction to sort (asc or desc) (defaults to asc) + * @cfg {String} leafAttr The attribute used to determine leaf nodes in folder sort (defaults to "leaf") + * @cfg {Boolean} caseSensitive true for case sensitive sort (defaults to false) + * @cfg {Function} sortType A custom "casting" function used to convert node values before sorting + * @constructor + * @param {TreePanel} tree + * @param {Object} config + */ +Ext.tree.TreeSorter = function(tree, config){ + Ext.apply(this, config); + tree.on("beforechildrenrendered", this.doSort, this); + tree.on("append", this.updateSort, this); + tree.on("insert", this.updateSort, this); + + var dsc = this.dir && this.dir.toLowerCase() == "desc"; + var p = this.property || "text"; + var sortType = this.sortType; + var fs = this.folderSort; + var cs = this.caseSensitive === true; + var leafAttr = this.leafAttr || 'leaf'; + + this.sortFn = function(n1, n2){ + if(fs){ + if(n1.attributes[leafAttr] && !n2.attributes[leafAttr]){ + return 1; + } + if(!n1.attributes[leafAttr] && n2.attributes[leafAttr]){ + return -1; + } + } + var v1 = sortType ? sortType(n1) : (cs ? n1[p] : n1[p].toUpperCase()); + var v2 = sortType ? sortType(n2) : (cs ? n2[p] : n2[p].toUpperCase()); + if(v1 < v2){ + return dsc ? +1 : -1; + }else if(v1 > v2){ + return dsc ? -1 : +1; + }else{ + return 0; + } + }; +}; + +Ext.tree.TreeSorter.prototype = { + doSort : function(node){ + node.sort(this.sortFn); + }, + + compareNodes : function(n1, n2){ + + return (n1.text.toUpperCase() > n2.text.toUpperCase() ? 1 : -1); + }, + + updateSort : function(tree, node){ + if(node.childrenRendered){ + this.doSort.defer(1, this, [node]); + } + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/yui/animation.js b/www/extras/yui-ext/source/yui/animation.js new file mode 100644 index 000000000..7f4d64436 --- /dev/null +++ b/www/extras/yui-ext/source/yui/animation.js @@ -0,0 +1,1366 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +*/ + +/** + * The animation module provides allows effects to be added to HTMLElements. + * @module animation + * @requires yahoo, event, dom + */ + +/** + * + * 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. Should only be needed for subclass use. + * @method setRuntimeAttribute + * @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 = 1000; + + /** + * 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[0].isAnimated() ) { + this.unRegister(queue[0], 0); + } + } + + 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] ]; + + }; +}; +(function() { +/** + * 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) + */ + 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} a Amplitude (optional) + * @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} a Amplitude (optional) + * @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} a Amplitude (optional) + * @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; + } + 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; + } +}; + +(function() { +/** + * 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) + */ + 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'); + }; +})(); +(function() { +/** + * 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) + */ + 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); + } + }; +})(); +YAHOO.register("animation", YAHOO.util.Anim, {version: "2.2.0", build: "127"}); diff --git a/www/extras/yui-ext/source/yui/connection.js b/www/extras/yui-ext/source/yui/connection.js new file mode 100644 index 000000000..06cf75f4a --- /dev/null +++ b/www/extras/yui-ext/source/yui/connection.js @@ -0,0 +1,1062 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/** + * 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 + * @requires yahoo + */ + +/** + * The Connection Manager singleton provides methods for creating and managing + * asynchronous transactions. + * + * @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_headers:{}, + + /** + * @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 client HTTP headers sent for POST + * transactions. + * @property _default_post_header + * @private + * @static + * @type boolean + */ + _default_post_header:'application/x-www-form-urlencoded', + + /** + * @description Determines if a default header of + * 'X-Requested-With: XMLHttpRequest' + * will be added to each transaction. + * @property _use_default_xhr_header + * @private + * @static + * @type boolean + */ + _use_default_xhr_header:true, + + /** + * @description The default header value for the label + * "X-Requested-With". This is sent with each + * transaction, by default, to identify the + * request as being made by YUI Connection Manager. + * @property _default_xhr_header + * @private + * @static + * @type boolean + */ + _default_xhr_header:'XMLHttpRequest', + + /** + * @description Determines if custom, default headers + * are set for each transaction. + * @property _has_default_header + * @private + * @static + * @type boolean + */ + _has_default_headers:true, + + /** + * @description Determines if custom, default headers + * are set for each transaction. + * @property _has_default_header + * @private + * @static + * @type boolean + */ + _default_headers:{}, + + /** + * @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 enable or disable the default POST header. + * @method setDefaultXhrHeader + * @public + * @static + * @param {boolean} b Set and use default header - true or false . + * @return void + */ + setDefaultXhrHeader:function(b) + { + this._use_default_xhr_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= 200 && httpStatus < 300){ + 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]); + } + } + } + else{ + 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]); + } + } + } + } + + 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'); + + // 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 = []; + 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 uploadEncoding = 'multipart/form-data'; + 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 it uses the property - "encoding". + this._formNode.encoding = uploadEncoding; + } + else{ + this._formNode.enctype = uploadEncoding; + } + + + if(postData){ + var oElements = this.appendPostData(postData); + } + + this._formNode.submit(); + + if(oElements && oElements.length > 0){ + for(var i=0; i < oElements.length; i++){ + this._formNode.removeChild(oElements[i]); + } + } + + // 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 && 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; + } +}; +YAHOO.register("connection", YAHOO.widget.Module, {version: "2.2.0", build: "127"}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/yui/dom.js b/www/extras/yui-ext/source/yui/dom.js new file mode 100644 index 000000000..d929c56ee --- /dev/null +++ b/www/extras/yui-ext/source/yui/dom.js @@ -0,0 +1,909 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +*/ + +/** + * 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'; } + + if (!noRetry) { + var newXY = this.getXY(el); + + // if retry is true, try one more time if we miss + if ( (pos[0] !== null && newXY[0] != pos[0]) || + (pos[1] !== null && 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 + * @return {Array} Array of HTMLElements + */ + getElementsBy: function(method, tag, root) { + tag = tag || '*'; + + var nodes = []; + + if (root) { + root = Y.Dom.get(root); + if (!root) { // if no root node, then no children + return nodes; + } + } else { + root = document; + } + + 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(); + +YAHOO.register("dom", YAHOO.util.Dom, {version: "2.2.0", build: "127"}); diff --git a/www/extras/yui-ext/source/yui/event.js b/www/extras/yui-ext/source/yui/event.js new file mode 100644 index 000000000..fb807fadd --- /dev/null +++ b/www/extras/yui-ext/source/yui/event.js @@ -0,0 +1,2062 @@ +/* + * Ext JS Library 1.0.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/** + * 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. +// @TODO this needs to be changed so that only the state data that needs to +// be preserved is kept, while methods are overwritten/added as needed. +// This means that the module pattern can't be used. +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; + + /** + * addListener/removeListener can throw errors in unexpected scenarios. + * These errors are suppressed, the method returns false, and this property + * is set + * @property lastError + * @type Error + */ + var lastError = null; + + return { + + /** + * 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. Since this function has been used outside of this + * utility, it was changed to detect all KHTML browser to be more + * friendly towards the non-Safari browsers that share the engine. + * Internally, the preventDefault bug detection now uses the + * webkit property. + * @property isSafari + * @private + * @static + * @deprecated + */ + isSafari: (/KHTML/gi).test(navigator.userAgent), + + /** + * If WebKit is detected, we keep track of the version number of + * the engine. + * Safari 1.3.2 (312.6): 312.8.1 <-- currently the latest + * available on Mac OSX 10.3. + * Safari 2.0.2: 416 <-- hasOwnProperty introduced + * Safari 2.0.4: 418 <-- preventDefault fixed (I believe) + * Safari 2.0.4 (419.3): 418.9.1 <-- current release + * + * http://developer.apple.com/internet/safari/uamatrix.html + * @property webkit + */ + webkit: function() { + var v=navigator.userAgent.match(/AppleWebKit\/([^ ]*)/); + if (v&&v[1]) { + return v[1]; + } + return null; + }(), + + /** + * 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.webkit && !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 listener attached, + * or if the operation throws an exception. + * @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
          or <a>) that map to +* Button configuration attributes and sets them into a collection that is +* passed to the Button constructor. +* @private +* @param {HTMLInputElement|HTMLAnchorElement} p_oElement Object reference to the HTML +* element (either <input> or <span>) +* used to create the button. +* @param {Object} p_oAttributes Object reference for the collection of +* configuration attributes used to create the button. +*/ +function setAttributesFromSrcElement(p_oElement, p_oAttributes) { + + var me = this; + + /** + * @method setAttributeFromDOMAttribute + * @description Gets the value of the specified DOM attribute and sets it + * into the collection of configuration attributes used to configure + * the button. + * @private + * @param {String} p_sAttribute String representing the name of the + * attribute to retrieve from the DOM element. + */ + function setAttributeFromDOMAttribute(p_sAttribute) { + + if( !(p_sAttribute in p_oAttributes) ) { + + /* + Need to use "getAttributeNode" instead of "getAttribute" + because using "getAttribute," IE will return the innerText of + a <button> for the value attribute rather + than the value of the "value" attribute. + */ + + var oAttribute = p_oElement.getAttributeNode(p_sAttribute); + + + if(oAttribute && ("value" in oAttribute)) { + + me.logger.log( + "Setting attribute \"" + p_sAttribute + "\" using " + + "source element's attribute value of \"" + + oAttribute.value + "\"" + ); + + p_oAttributes[p_sAttribute] = oAttribute.value; + + } + + } + + } + + + /** + * @method setFormElementProperties + * @description Gets the value of the attributes from the form element and + * sets them into the collection of configuration attributes used to + * configure the button. + * @private + */ + function setFormElementProperties() { + + setAttributeFromDOMAttribute("type"); + + if( !("disabled" in p_oAttributes) ) { + + p_oAttributes.disabled = p_oElement.disabled; + + } + + setAttributeFromDOMAttribute("name"); + setAttributeFromDOMAttribute("value"); + setAttributeFromDOMAttribute("title"); + + } + + + var sSrcElementTagName = p_oElement.tagName.toUpperCase(); + + + if( !("label" in p_oAttributes) ) { + + // Set the "label" property + + var sText = sSrcElementTagName == "INPUT" ? + p_oElement.value : p_oElement.innerHTML; + + + if(sText && sText.length > 0) { + + p_oAttributes.label = sText; + + } + + } + + + setAttributeFromDOMAttribute("tabindex"); + setAttributeFromDOMAttribute("accesskey"); + + + switch(sSrcElementTagName) { + + case "A": + + p_oAttributes.type = "link"; + + setAttributeFromDOMAttribute("href"); + setAttributeFromDOMAttribute("target"); + + break; + + case "INPUT": + + setFormElementProperties(); + + if( !("checked" in p_oAttributes) ) { + + p_oAttributes.checked = p_oElement.checked; + + } + + break; + + case "BUTTON": + + setFormElementProperties(); + + var oRootNode = p_oElement.parentNode.parentNode; + + if(Dom.hasClass(oRootNode, "checked")) { + + p_oAttributes.checked = true; + + } + + if(Dom.hasClass(oRootNode, "disabled")) { + + p_oAttributes.disabled = true; + + } + + p_oElement.removeAttribute("name"); + p_oElement.removeAttribute("value"); + + p_oElement.setAttribute("type", "button"); + + break; + + } + +} + + +/** +* @method initConfig +* @description Initializes the set of configuration attributes that are used to +* instantiate the button. +* @private +* @param {Object} Object representing the button's set of +* configuration attributes. +*/ +function initConfig(p_oConfig) { + + var oAttributes = p_oConfig.attributes, + oSrcElement = oAttributes.srcelement, + sSrcElementTagName = oSrcElement.tagName.toUpperCase(); + + + if(sSrcElementTagName == this.TAG_NAME) { + + p_oConfig.element = oSrcElement; + + var oFirstChild = getFirstElement(p_oConfig.element); + + Dom.addClass(oFirstChild, "first-child"); + + if(oFirstChild) { + + var oButton = getFirstElement(oFirstChild); + + + if(oButton) { + + var sButtonTagName = oButton.tagName.toUpperCase(); + + + if(sButtonTagName == "A" || sButtonTagName == "BUTTON") { + + setAttributesFromSrcElement.call( + this, + oButton, + oAttributes + ); + + } + + } + + } + + } + else if(sSrcElementTagName == "INPUT") { + + setAttributesFromSrcElement.call(this, oSrcElement, oAttributes); + + } + +} + + +YAHOO.extend(YAHOO.widget.Button, YAHOO.util.Element, { + + +// Protected properties + + +/** +* @property _button +* @description Object reference to the button's internal +* <a> or <button> element. +* @default null +* @protected +* @type HTMLAnchorElement|HTMLButtonElement +*/ +_button: null, + + +/** +* @property _menu +* @description Object reference to the button's menu. +* @default null +* @protected +* @type YAHOO.widget.Menu +*/ +_menu: null, + + +/** +* @property _hiddenField +* @description Object reference to the <input> element +* used when the button's parent form is submitted. +* @default null +* @protected +* @type HTMLInputElement +*/ +_hiddenField: null, + + +/** +* @property _onclickAttributeValue +* @description Object reference to the button's current value for the "onclick" +* configuration attribute. +* @default null +* @protected +* @type Object +*/ +_onclickAttributeValue: null, + + +/** +* @property _activationKeyPressed +* @description Boolean indicating if the key(s) that toggle the button's +* "active" state have been pressed. +* @default false +* @protected +* @type Boolean +*/ +_activationKeyPressed: false, + + +/** +* @property _activationButtonPressed +* @description Boolean indicating if the mouse button that toggles the button's +* "active" state has been pressed. +* @default false +* @protected +* @type Boolean +*/ +_activationButtonPressed: false, + + +/** +* @property _hasKeyEventHandlers +* @description Boolean indicating if the button's "blur", "keydown" and +* "keyup" event handlers are assigned +* @default false +* @protected +* @type Boolean +*/ +_hasKeyEventHandlers: false, + + +/** +* @property _hasMouseEventHandlers +* @description Boolean indicating if the button's "mouseout" and "mousedown" +* and "mouseup" event handlers are assigned +* @default false +* @protected +* @type Boolean +*/ +_hasMouseEventHandlers: false, + + + +// Constants + + +/** +* @property TAG_NAME +* @description The name of the tag to be used for the button's root element. +* @default "SPAN" +* @final +* @type String +*/ +TAG_NAME: "SPAN", + + +/** +* @property CHECK_ACTIVATION_KEYS +* @description Array of numbers representing keys that (when pressed) toggle +* the button's "checked" attribute. +* @default [32] +* @final +* @type Array +*/ +CHECK_ACTIVATION_KEYS: [32], + + +/** +* @property ACTIVATION_KEYS +* @description Array of numbers representing keys that (when presed) toggle +* the button's "active" state. +* @default [13, 32] +* @final +* @type Array +*/ +ACTIVATION_KEYS: [13, 32], + + +/** +* @property OPTION_AREA_WIDTH +* @description Width (in pixels) of the area of a split button that when +* pressed will display a menu. +* @default 20 +* @final +* @type Number +*/ +OPTION_AREA_WIDTH: 20, + + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the +* button's root element. +* @default "yuibutton" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuibutton", + + +/** +* @property RADIO_DEFAULT_TITLE +* @description String representing the default title applied to buttons of +* type "radio." +* @default "Unchecked. Click to check." +* @final +* @type String +*/ +RADIO_DEFAULT_TITLE: "Unchecked. Click to check.", + + +/** +* @property RADIO_CHECKED_TITLE +* @description String representing the title applied to buttons of type "radio" +* when checked. +* @default "Checked. Click to uncheck." +* @final +* @type String +*/ +RADIO_CHECKED_TITLE: "Checked. Click to uncheck.", + + +/** +* @property CHECKBOX_DEFAULT_TITLE +* @description String representing the default title applied to buttons of +* type "checkbox." +* @default "Unchecked. Click to check." +* @final +* @type String +*/ +CHECKBOX_DEFAULT_TITLE: "Unchecked. Click to check.", + + +/** +* @property CHECKBOX_CHECKED_TITLE +* @description String representing the title applied to buttons of type +* "checkbox" when checked. +* @default "Checked. Click to uncheck." +* @final +* @type String +*/ +CHECKBOX_CHECKED_TITLE: "Checked. Click to uncheck.", + + +/** +* @property MENUBUTTON_DEFAULT_TITLE +* @description String representing the default title applied to buttons of +* type "menubutton." +* @default "Menu collapsed. Click to expand." +* @final +* @type String +*/ +MENUBUTTON_DEFAULT_TITLE: "Menu collapsed. Click to expand.", + + +/** +* @property MENUBUTTON_MENU_VISIBLE_TITLE +* @description String representing the title applied to buttons of type +* "menubutton" when the button's menu is visible. +* @default "Menu expanded. Click or press Esc to collapse." +* @final +* @type String +*/ +MENUBUTTON_MENU_VISIBLE_TITLE: + "Menu expanded. Click or press Esc to collapse.", + + +/** +* @property SPLITBUTTON_DEFAULT_TITLE +* @description String representing the default title applied to buttons of +* type "splitebutton." +* @default "Menu collapsed. Click inside option region or press +* Ctrl + Shift + M to show the menu." +* @final +* @type String +*/ +SPLITBUTTON_DEFAULT_TITLE: + "Menu collapsed. Click inside option region or press Ctrl + Shift + M to show the menu.", + + +/** +* @property SPLITBUTTON_OPTION_VISIBLE_TITLE +* @description String representing the title applied to buttons of type +* "splitbutton" when the button's menu is visible. +* @default "Menu expanded. Press Esc or Ctrl + Shift + M to hide the menu." +* @final +* @type String +*/ +SPLITBUTTON_OPTION_VISIBLE_TITLE: + "Menu expanded. Press Esc or Ctrl + Shift + M to hide the menu.", + + +/** +* @property SUBMIT_TITLE +* @description String representing the title applied to buttons of +* type "submit." +* @default "Click to submit form." +* @final +* @type String +*/ +SUBMIT_TITLE: "Click to submit form.", + + + +// Protected attribute setter methods + + +/** +* @method _setType +* @description Sets the value of the button's "type" attribute. +* @protected +* @param {String} p_sType String indicating the value for the button's +* "type" attribute. +*/ +_setType: function(p_sType) { + + if(p_sType == "splitbutton") { + + this.on("option", this._onOption); + + } + +}, + + +/** +* @method _setLabel +* @description Sets the value of the button's "label" attribute. +* @protected +* @param {String} p_sLabel String indicating the value for the button's +* "label" attribute. +*/ +_setLabel: function(p_sLabel) { + + this._button.innerHTML = p_sLabel; + +}, + + +/** +* @method _setTabIndex +* @description Sets the value of the button's "tabindex" attribute. +* @protected +* @param {Number} p_nTabIndex Number indicating the value for the button's +* "tabindex" attribute. +*/ +_setTabIndex: function(p_nTabIndex) { + + this._button.tabIndex = p_nTabIndex; + +}, + + +/** +* @method _setTitle +* @description Sets the value of the button's "title" attribute. +* @protected +* @param {String} p_nTabIndex Number indicating the value for the button's +* "title" attribute. +*/ +_setTitle: function(p_sTitle) { + + if(this.get("type") != "link") { + + var sTitle = p_sTitle; + + if(!sTitle) { + + + var sType = this.get("type"); + + switch(sType) { + + case "radio": + + sTitle = this.RADIO_DEFAULT_TITLE; + + break; + + case "checkbox": + + sTitle = this.CHECKBOX_DEFAULT_TITLE; + + break; + + case "menubutton": + + sTitle = this.MENUBUTTON_DEFAULT_TITLE; + + break; + + case "splitbutton": + + sTitle = this.SPLITBUTTON_DEFAULT_TITLE; + + break; + + case "submit": + + sTitle = this.SUBMIT_TITLE; + + break; + + } + + } + + this._button.title = sTitle; + + } + +}, + + +/** +* @method _setDisabled +* @description Sets the value of the button's "disabled" attribute. +* @protected +* @param {Boolean} p_bDisabled Boolean indicating the value for the button's +* "disabled" attribute. +*/ +_setDisabled: function(p_bDisabled) { + + if(this.get("type") != "link") { + + if(p_bDisabled) { + + if(this.hasFocus()) { + + this.blur(); + + } + + this._button.setAttribute("disabled", "disabled"); + + this.addClass("disabled"); + + } + else { + + this._button.removeAttribute("disabled"); + + this.removeClass("disabled"); + + } + + } + +}, + + +/** +* @method _setAccessKey +* @description Sets the value of the button's "accesskey" attribute. +* @protected +* @param {String} p_sAccessKey String indicating the value for the button's +* "accesskey" attribute. +*/ +_setAccessKey: function(p_sAccessKey) { + + this._button.accessKey = p_sAccessKey; + +}, + + +/** +* @method _setHref +* @description Sets the value of the button's "href" attribute. +* @protected +* @param {String} p_sHref String indicating the value for the button's +* "href" attribute. +*/ +_setHref: function(p_sHref) { + + if(this.get("type") == "link") { + + this._button.href = p_sHref; + + } + +}, + + +/** +* @method _setTarget +* @description Sets the value of the button's "target" attribute. +* @protected +* @param {String} p_sTarget String indicating the value for the button's +* "target" attribute. +*/ +_setTarget: function(p_sTarget) { + + if(this.get("type") == "link") { + + this._button.setAttribute("target", p_sTarget); + + } + +}, + + +/** +* @method _setChecked +* @description Sets the value of the button's "target" attribute. +* @protected +* @param {Boolean} p_bChecked Boolean indicating the value for the button's +* "checked" attribute. +*/ +_setChecked: function(p_bChecked) { + + var sType = this.get("type"), + sTitle; + + if(sType == "checkbox" || sType == "radio") { + + if(p_bChecked) { + + this.addClass("checked"); + + sTitle = (sType == "radio") ? + this.RADIO_CHECKED_TITLE : + this.CHECKBOX_CHECKED_TITLE; + + } + else { + + this.removeClass("checked"); + + sTitle = (sType == "radio") ? + this.RADIO_DEFAULT_TITLE : + this.CHECKBOX_DEFAULT_TITLE; + + } + + this.set("title", sTitle); + + } + +}, + + +/** +* @method _setMenu +* @description Sets the value of the button's "menu" attribute. +* @protected +* @param {Object} p_oMenu Object indicating the value for the button's +* "menu" attribute. +*/ +_setMenu: function(p_oMenu) { + + var Menu = YAHOO.widget.Menu, + oMenu, + me = this; + + if(!Menu) { + + this.logger.log("YAHOO.widget.Menu dependency not met.", "error"); + + return false; + + } + + + function initMenu() { + + if(oMenu) { + + oMenu.showEvent.subscribe(this._onMenuShow, this, true); + oMenu.hideEvent.subscribe(this._onMenuHide, this, true); + oMenu.keyDownEvent.subscribe(this._onMenuKeyDown, this, true); + oMenu.renderEvent.subscribe(this._onMenuRender, this, true); + oMenu.clickEvent.subscribe(this._onMenuClick, this, true); + oMenu.itemAddedEvent.subscribe(this._onMenuItemAdded, this, true); + + var oSrcElement = oMenu.srcElement; + + if(oSrcElement && oSrcElement.tagName.toUpperCase() == "SELECT") { + + oSrcElement.style.display = "none"; + oSrcElement.parentNode.removeChild(oSrcElement); + + } + + this._menu = oMenu; + + } + else { + + this._menu.destroy(); + this._menu = null; + + } + + } + + + if(p_oMenu instanceof Menu) { + + oMenu = p_oMenu; + + var aItems = oMenu.getItems(), + nItems = aItems.length, + oItem; + + if(nItems > 0) { + + var i = nItems - 1; + + do { + + oItem = aItems[i]; + + if(oItem) { + + oItem.cfg.subscribeToConfigEvent( + "selected", + this._onMenuItemSelected, + oItem, + this + ); + + } + + } + while(i--); + + } + + initMenu.call(this); + + } + else if(Lang.isArray(p_oMenu)) { + + this.on("appendTo", function() { + + oMenu = new Menu( + Dom.generateId(), + { lazyload: true, itemdata: p_oMenu } + ); + + initMenu.call(me); + + }); + + } + else if(Lang.isString(p_oMenu)) { + + Event.onContentReady(p_oMenu, function() { + + oMenu = new Menu(this, { lazyload: true }); + + initMenu.call(me); + + }); + + } + else if(p_oMenu && p_oMenu.nodeName) { + + oMenu = new Menu(p_oMenu, { lazyload: true }); + + initMenu.call(this); + + } + +}, + + +/** +* @method _setOnClick +* @description Sets the value of the button's "onclick" attribute. +* @protected +* @param {Object} p_oObject Object indicating the value for the button's +* "onclick" attribute. +*/ +_setOnClick: function(p_oObject) { + + /* + Remove any existing listeners if a "click" event handler has already + been specified. + */ + + if( + this._onclickAttributeValue && + (this._onclickAttributeValue != p_oObject) + ) { + + this.removeListener("click", this._onclickAttributeValue.fn); + + this._onclickAttributeValue = null; + + } + + + if( + !this._onclickAttributeValue && + Lang.isObject(p_oObject) && + Lang.isFunction(p_oObject.fn) + ) { + + this.on("click", p_oObject.fn, p_oObject.obj, p_oObject.scope); + + this._onclickAttributeValue = p_oObject; + + } + +}, + + + +// Protected methods + + +/** +* @method _createButtonElement +* @description Creates the button's element. +* @protected +* @param {String} p_sType String indicating the type of element to create. +* @return {HTMLElement} +*/ +_createButtonElement: function(p_sType) { + + var sTagName = this.TAG_NAME, + oElement = document.createElement(sTagName); + + oElement.innerHTML = + + "<" + sTagName + " class=\"first-child\">" + + (p_sType == "link" ? "" : "") + + ""; + + return oElement; + +}, + + +/** +* @method _isActivationKey +* @description Determines if the specified keycode is one that toggles the +* button's "active" state. +* @protected +* @param {Number} p_nKeyCode Number representing the keycode to be evaluated. +* @return {Boolean} +*/ +_isActivationKey: function(p_nKeyCode) { + + var sType = this.get("type"), + aKeyCodes = (sType == "checkbox" || sType == "radio") ? + this.CHECK_ACTIVATION_KEYS : this.ACTIVATION_KEYS, + + nKeyCodes = aKeyCodes.length; + + if(nKeyCodes > 0) { + + var i = nKeyCodes - 1; + + do { + + if(p_nKeyCode == aKeyCodes[i]) { + + return true; + + } + + } + while(i--); + + } + +}, + + +/** +* @method _isSplitButtonOptionKey +* @description Determines if the specified keycode is one that toggles the +* display of the split button's menu. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @return {Boolean} +*/ +_isSplitButtonOptionKey: function(p_oEvent) { + + return ( + p_oEvent.ctrlKey && + p_oEvent.shiftKey && + Event.getCharCode(p_oEvent) == 77 + ); + +}, + + +/** +* @method _addListenersToForm +* @description Adds event handlers to the button's form. +* @protected +*/ +_addListenersToForm: function() { + + var oForm = this.getForm(); + + if(oForm) { + + Event.on(oForm, "reset", this._onFormReset, null, this); + Event.on(oForm, "submit", this._onFormSubmit, null, this); + + var oSrcElement = this.get("srcelement"); + + + if ( + (m_bIE || m_bGecko) && + ( + this.get("type") == "submit" || + (oSrcElement && oSrcElement.type == "submit") + ) + ) { + + var aListeners = Event.getListeners(oForm, "keydown"), + bHasKeyDownListener = false; + + if(aListeners) { + + var nListeners = aListeners.length; + + if(nListeners > 0) { + + var i = nListeners - 1; + + do { + + if( + aListeners[i].fn == + YAHOO.widget.Button.onFormKeyDown + ) { + + bHasKeyDownListener = true; + break; + + } + + } + while(i--); + + } + + } + + + if(!bHasKeyDownListener) { + + Event.on( + oForm, + "keydown", + YAHOO.widget.Button.onFormKeyDown, + null, + this + ); + + } + + } + + } + +}, + + +_originalMaxHeight: -1, + + +/** +* @method _showMenu +* @description Shows the button's menu. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event) that triggered the display of +* the menu. +*/ +_showMenu: function(p_oEvent) { + + var oMenu = this._menu; + + if(oMenu) { + + YAHOO.widget.MenuManager.hideVisible(); + + oMenu.cfg.applyConfig({ + context:[this.get("id"), "tl", "bl"], + clicktohide: false, + constraintoviewport: false, + visible: true + }); + + oMenu.cfg.fireQueue(); + + /* + Stop the propagation of the event so that the MenuManager + doesn't blur the menu after it gets focus. + */ + + if(p_oEvent.type == "mousedown") { + + Event.stopPropagation(p_oEvent); + + } + + this._menu.focus(); + + + var nViewportHeight = Dom.getViewportHeight(), + nMenuHeight = oMenu.element.offsetHeight; + + + if((oMenu.cfg.getProperty("y") + nMenuHeight) > nViewportHeight) { + + this.logger.log("Current menu position will place a portion, or " + + "the entire menu outside the boundary of the viewport. " + + "Repositioning the menu to stay inside the viewport."); + + oMenu.align("bl", "tl"); + + var nY = oMenu.cfg.getProperty("y"), + + nScrollTop = ( + document.documentElement.scrollTop || + document.body.scrollTop + ); + + + if(nScrollTop >= nY) { + + if(this._originalMaxHeight == -1) { + + this._originalMaxHeight = + oMenu.cfg.getProperty("maxheight"); + + } + + oMenu.cfg.setProperty( + "maxheight", + (nMenuHeight - ((nScrollTop - nY) + 20)) + ); + + oMenu.align("bl", "tl"); + + } + + } + + oMenu.cfg.setProperty("constraintoviewport", true); + + } + +}, + + +/** +* @method _hideMenu +* @description Hides the button's menu. +* @protected +*/ +_hideMenu: function() { + + var oMenu = this._menu; + + if(oMenu && oMenu.cfg.getProperty("visible")) { + + oMenu.hide(); + + } + +}, + + + + +// Protected event handlers + + +/** +* @method _onMouseOver +* @description "mouseover" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onMouseOver: function(p_oEvent) { + + if(!this._hasMouseEventHandlers) { + + this.on("mouseout", this._onMouseOut); + this.on("mousedown", this._onMouseDown); + this.on("mouseup", this._onMouseUp); + + this._hasMouseEventHandlers = true; + + } + + this.addClass("hover"); + + if(this._activationButtonPressed) { + + this.addClass("active"); + + } + + + if(this._bOptionPressed) { + + this.addClass("activeoption"); + + } + +}, + + +/** +* @method _onMouseOut +* @description "mouseout" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onMouseOut: function(p_oEvent) { + + this.removeClass("hover"); + + if(this.get("type") != "menubutton") { + + this.removeClass("active"); + + } + + if(this._activationButtonPressed || this._bOptionPressed) { + + Event.on(document, "mouseup", this._onDocumentMouseUp, null, this); + + } + +}, + + +/** +* @method _onDocumentMouseUp +* @description "mouseup" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onDocumentMouseUp: function(p_oEvent) { + + this._activationButtonPressed = false; + this._bOptionPressed = false; + + var sType = this.get("type"); + + if(sType == "menubutton" || sType == "splitbutton") { + + this.removeClass((sType == "menubutton" ? "active" : "activeoption")); + + this._hideMenu(); + + } + + Event.removeListener(document, "mouseup", this._onDocumentMouseUp); + +}, + + +/** +* @method _onMouseDown +* @description "mousedown" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onMouseDown: function(p_oEvent) { + + if((p_oEvent.which || p_oEvent.button) == 1) { + + if(!this.hasFocus()) { + + this.focus(); + + } + + + var sType = this.get("type"); + + + if(sType == "splitbutton") { + + var oElement = this.get("element"), + nX = Event.getPageX(p_oEvent) - Dom.getX(oElement); + + if((oElement.offsetWidth - this.OPTION_AREA_WIDTH) < nX) { + + this.fireEvent("option", p_oEvent); + + } + else { + + this.addClass("active"); + + this._activationButtonPressed = true; + + } + + } + else if(sType == "menubutton") { + + if(this.hasClass("active")) { + + this._hideMenu(); + + this._activationButtonPressed = false; + + } + else { + + this._showMenu(p_oEvent); + + this._activationButtonPressed = true; + + } + + } + else { + + this.addClass("active"); + + this._activationButtonPressed = true; + + } + + + + if(sType == "splitbutton" || sType == "menubutton") { + + var me = this; + + + function onMouseUp() { + + me._hideMenu(); + me.removeListener("mouseup", onMouseUp); + + } + + + this._hideMenuTimerId = window.setTimeout(function() { + + me.on("mouseup", onMouseUp); + + }, 250); + + } + + } + +}, + + +/** +* @method _onMouseUp +* @description "mouseup" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onMouseUp: function(p_oEvent) { + + if(this._hideMenuTimerId) { + + window.clearTimeout(this._hideMenuTimerId); + + } + + var sType = this.get("type"); + + if(sType == "checkbox" || sType == "radio") { + + this.set("checked", !(this.get("checked"))); + + } + + + this._activationButtonPressed = false; + + + if(this.get("type") != "menubutton") { + + this.removeClass("active"); + + } + +}, + + +/** +* @method _onFocus +* @description "focus" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onFocus: function(p_oEvent) { + + this.addClass("focus"); + + if(this._activationKeyPressed) { + + this.addClass("active"); + + } + + m_oFocusedButton = this; + + + if(!this._hasKeyEventHandlers) { + + var oElement = this._button; + + Event.on(oElement, "blur", this._onBlur, null, this); + Event.on(oElement, "keydown", this._onKeyDown, null, this); + Event.on(oElement, "keyup", this._onKeyUp, null, this); + + this._hasKeyEventHandlers = true; + + } + + + this.fireEvent("focus", p_oEvent); + +}, + + +/** +* @method _onBlur +* @description "blur" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onBlur: function(p_oEvent) { + + this.removeClass("focus"); + + if(this.get("type") != "menubutton") { + + this.removeClass("active"); + + } + + if(this._activationKeyPressed) { + + Event.on(document, "keyup", this._onDocumentKeyUp, null, this); + + } + + + m_oFocusedButton = null; + + this.fireEvent("blur", p_oEvent); + +}, + + +/** +* @method _onDocumentKeyUp +* @description "keyup" event handler for the document. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onDocumentKeyUp: function(p_oEvent) { + + if(this._isActivationKey(Event.getCharCode(p_oEvent))) { + + this._activationKeyPressed = false; + + Event.removeListener(document, "keyup", this._onDocumentKeyUp); + + } + +}, + + +/** +* @method _onKeyDown +* @description "keydown" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onKeyDown: function(p_oEvent) { + + if( + this.get("type") == "splitbutton" && + this._isSplitButtonOptionKey(p_oEvent) + ) { + + this.fireEvent("option", p_oEvent); + + } + else if(this._isActivationKey(Event.getCharCode(p_oEvent))) { + + if(this.get("type") == "menubutton") { + + this._showMenu(p_oEvent); + + } + else { + + this._activationKeyPressed = true; + + this.addClass("active"); + + } + + } + + + var oMenu = this._menu; + + if( + oMenu && oMenu.cfg.getProperty("visible") && + Event.getCharCode(p_oEvent) == 27 + ) { + + oMenu.hide(); + this.focus(); + + } + +}, + + +/** +* @method _onKeyUp +* @description "keyup" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onKeyUp: function(p_oEvent) { + + if(this._isActivationKey(Event.getCharCode(p_oEvent))) { + + var sType = this.get("type"); + + if(sType == "checkbox" || sType == "radio") { + + this.set("checked", !(this.get("checked"))); + + } + + this._activationKeyPressed = false; + + if(this.get("type") != "menubutton") { + + this.removeClass("active"); + + } + + } + +}, + + +/** +* @method _onClick +* @description "click" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onClick: function(p_oEvent) { + + var sType = this.get("type"), + sTitle; + + switch(sType) { + + case "radio": + case "checkbox": + + if(this.get("checked")) { + + sTitle = (sType == "radio") ? + this.RADIO_CHECKED_TITLE : + this.CHECKBOX_CHECKED_TITLE; + + } + else { + + sTitle = (sType == "radio") ? + this.RADIO_DEFAULT_TITLE : + this.CHECKBOX_DEFAULT_TITLE; + + } + + this.set("title", sTitle); + + break; + + case "submit": + + this.submitForm(); + + break; + + case "reset": + + var oForm = this.getForm(); + + if(oForm) { + + oForm.reset(); + + } + + break; + + case "menubutton": + + sTitle = this._menu.cfg.getProperty("visible") ? + this.MENUBUTTON_MENU_VISIBLE_TITLE : + this.MENUBUTTON_DEFAULT_TITLE; + + this.set("title", sTitle); + + break; + + case "splitbutton": + + var oElement = this.get("element"), + nX = Event.getPageX(p_oEvent) - Dom.getX(oElement); + + if((oElement.offsetWidth - this.OPTION_AREA_WIDTH) < nX) { + + return false; + + } + else { + + this._hideMenu(); + + var oSrcElement = this.get("srcelement"); + + if(oSrcElement && oSrcElement.type == "submit") { + + this.submitForm(); + + } + + } + + sTitle = this._menu.cfg.getProperty("visible") ? + this.SPLITBUTTON_OPTION_VISIBLE_TITLE : + this.SPLITBUTTON_DEFAULT_TITLE; + + this.set("title", sTitle); + + break; + + } + +}, + + +/** +* @method _onAppendTo +* @description "appendTo" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onAppendTo: function(p_oEvent) { + + /* + It is necessary to call "getForm" using "setTimeout" to make sure that + the button's "form" property returns a node reference. Sometimes, if + you try to get the reference immediately after appending the field, it + is null. + */ + + var me = this; + + window.setTimeout(function() { + + me._addListenersToForm(); + + }, 0); + +}, + + +/** +* @method _onFormSubmit +* @description "submit" event handler for the button's form. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onFormSubmit: function(p_oEvent) { + + var sType = this.get("type"), + oMenuItem = this.get("selectedMenuItem"), + oForm = this.getForm(); + + + if(sType == "radio" || sType == "checkbox") { + + YAHOO.log("Creating hidden field for button: " + this); + + this.createHiddenField(); + + } + else if(oMenuItem) { + + var oSrcElement = this._menu.srcElement; + + if(oSrcElement && oSrcElement.tagName.toUpperCase() == "SELECT") { + + oForm.appendChild(oSrcElement); + oSrcElement.selectedIndex = oMenuItem.index; + + } + else { + + var oValue = (oMenuItem.value === null || oMenuItem.value === "") ? + oMenuItem.cfg.getProperty("text") : + oMenuItem.value; + + + if(oValue) { + + var oField = createInputElement( + "hidden", + (this.get("name") + "_options"), + oValue + ); + + oForm.appendChild(oField); + + } + + } + + } + +}, + + +/** +* @method _onFormReset +* @description "reset" event handler for the button's form. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onFormReset: function(p_oEvent) { + + var sType = this.get("type"); + + if(sType == "checkbox" || sType == "radio") { + + this.resetValue("checked"); + + } + + if(this._menu) { + + this.resetValue("selectedMenuItem"); + + } + +}, + + +/** +* @method _onDocumentMouseDown +* @description "mousedown" event handler for the document. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onDocumentMouseDown: function(p_oEvent) { + + var oTarget = Event.getTarget(p_oEvent), + oButtonElement = this.get("element"), + oMenuElement = this._menu.element; + + if( + oTarget != oButtonElement && + !Dom.isAncestor(oButtonElement, oTarget) && + oTarget != oMenuElement && + !Dom.isAncestor(oMenuElement, oTarget) + ) { + + this._hideMenu(); + + Event.removeListener( + document, + "mousedown", + this._onDocumentMouseDown + ); + + } + +}, + + +/** +* @method _onOption +* @description "option" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onOption: function(p_oEvent) { + + if(this.hasClass("activeoption")) { + + this._hideMenu(); + + this._bOptionPressed = false; + + } + else { + + this._showMenu(p_oEvent); + + this._bOptionPressed = true; + + } + +}, + + +/** +* @method _onMenuShow +* @description "show" event handler for the button's 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. +*/ +_onMenuShow: function(p_sType, p_aArgs) { + + Event.on(document, "mousedown", this._onDocumentMouseDown, null, this); + + var sTitle, + sClass; + + if(this.get("type") == "splitbutton") { + + sTitle = this.SPLITBUTTON_OPTION_VISIBLE_TITLE; + sClass = "activeoption"; + + } + else { + + sTitle = this.MENUBUTTON_MENU_VISIBLE_TITLE; + sClass = "active"; + + } + + this.addClass(sClass); + this.set("title", sTitle); + +}, + + +/** +* @method _onMenuHide +* @description "hide" event handler for the button's 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. +*/ +_onMenuHide: function(p_sType, p_aArgs) { + + if(this._originalMaxHeight != -1) { + + this._menu.cfg.setProperty("maxheight", this._originalMaxHeight); + + } + + + var sTitle, + sClass; + + if(this.get("type") == "splitbutton") { + + sTitle = this.SPLITBUTTON_DEFAULT_TITLE; + sClass = "activeoption"; + + } + else { + + sTitle = this.MENUBUTTON_DEFAULT_TITLE; + sClass = "active"; + } + + + this.removeClass(sClass); + this.set("title", sTitle); + + + if(this.get("type") == "splitbutton") { + + this._bOptionPressed = false; + + } + +}, + + +/** +* @method _onMenuKeyDown +* @description "keydown" event handler for the button's 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. +*/ +_onMenuKeyDown: function(p_sType, p_aArgs) { + + var oEvent = p_aArgs[0]; + + if(Event.getCharCode(oEvent) == 27) { + + this.focus(); + + if(this.get("type") == "splitbutton") { + + this._bOptionPressed = false; + + } + + } + +}, + + +/** +* @method _onMenuRender +* @description "render" event handler for the button's 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. +*/ +_onMenuRender: function(p_sType, p_aArgs) { + + this.get("element").parentNode.appendChild(this._menu.element); + +}, + + +/** +* @method _onMenuItemSelected +* @description "selectedchange" event handler for each item in the +* button's 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.MenuItem} +* p_oItem Object representing the menu item that subscribed to the event. +*/ +_onMenuItemSelected: function(p_sType, p_aArgs, p_oItem) { + + this.set("selectedMenuItem", p_oItem); + +}, + + +/** +* @method _onMenuItemAdded +* @description "itemadded" event handler for the button's 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.MenuItem} +* p_oItem Object representing the menu item that subscribed to the event. +*/ +_onMenuItemAdded: function(p_sType, p_aArgs, p_oItem) { + + var oItem = p_aArgs[0]; + + oItem.cfg.subscribeToConfigEvent( + "selected", + this._onMenuItemSelected, + oItem, + this + ); + +}, + + +/** +* @method _onMenuClick +* @description "click" event handler for the button's 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. +*/ +_onMenuClick: function(p_sType, p_aArgs) { + + var oItem = p_aArgs[1]; + + if(oItem) { + + var oSrcElement = this.get("srcelement"); + + if(oSrcElement && oSrcElement.type == "submit") { + + this.submitForm(); + + } + + this._hideMenu(); + + } + +}, + + + +// Public methods + + +/** +* @method createHiddenField +* @description Creates the button's hidden form field and appends it to its +* parent form. +* @return {HTMLInputElement} +*/ +createHiddenField: function () { + + if (!this.get("disabled")) { + + var sType = this.get("type"), + + bCheckable = (sType == "checkbox" || sType == "radio"), + + oField = createInputElement( + + /* + Use "submit" type for IE so that the input + element will be able to be clicked via a call to + the "click" method by the "submitForm" method. + */ + + (bCheckable ? sType : (m_bIE ? "submit" : "hidden")), + this.get("name"), + this.get("value"), + this.get("checked") + ), + + oForm = this.getForm(); + + + if (oField) { + + if (bCheckable || oField.type == "submit") { + + oField.style.display = "none"; + + } + + + if (oForm) { + + var oHiddenField = this._hiddenField; + + if (oHiddenField && Dom.inDocument(oHiddenField)) { + + oForm.replaceChild(oField, oHiddenField); + + } + else { + + oForm.appendChild(oField); + + } + + } + + this._hiddenField = oField; + + return oField; + + } + + } + +}, + + +/** +* @method submitForm +* @description Submits the form to which the button belongs. +* @protected +*/ +submitForm: function(p_oMenuItem) { + + var oForm = this.getForm(); + + if (oForm) { + + var oInput = this.createHiddenField(); + + if (m_bIE) { + + /* + Clicking the button via a call to the "click" method will + cause IE to both fire the form's "submit" event as well as + submit the form. Originally tried just firing the "submit" + event via "fireEvent," but then the event could not + be cancelled. + */ + + oInput.click(); + + } + else { // Gecko, Opera, and Safari + + var oEvent = document.createEvent("HTMLEvents"); + oEvent.initEvent("submit", true, true); + + /* + In Safari, dispatching a "submit" event to a form WILL cause + the form's "submit" event to fire, but WILL NOT submit the + form. Therefore, we need to call the "submit" method as well. + */ + + var bSubmitForm = oForm.dispatchEvent(oEvent); + + if(m_bSafari && bSubmitForm) { + + oForm.submit(); + + } + + } + + } + +}, + + +/** +* @method init +* @description The Button class's initialization method. +* @param {String} p_oElement String specifying the id attribute of the +* <input>, <a> or +* <span> element to be used to create the button. +* @param {HTMLInputElement|HTMLElement} p_oElement Object reference for the +* <input>, <a> or +* <span> element to be used to create the button. +* @param {Object} p_oElement Object literal specifying a set of configuration +* attributes used to create the button. +* @param {Object} p_oAttributes Optional. Object literal specifying a set of +* configuration attributes used to create the button. +*/ +init: function(p_oElement, p_oAttributes) { + + var sTagName = p_oAttributes.type == "link" ? "A" : "BUTTON", + oSrcElement = p_oAttributes.srcelement; + + + this._button = p_oElement.getElementsByTagName(sTagName)[0]; + + + YAHOO.widget.Button.superclass.init.call( + this, p_oElement, + p_oAttributes + ); + + + m_oButtons[this.get("id")] = this; + + + this.addClass(this.CSS_CLASS_NAME); + + if(m_bIE && !m_bIE7) { + + this.addClass("ie6"); + + } + + this.addClass(this.get("type")); + + Event.on(this._button, "focus", this._onFocus, null, this); + this.on("mouseover", this._onMouseOver); + this.on("click", this._onClick); + this.on("appendTo", this._onAppendTo); + + var oContainer = this.get("container"), + oElement = this.get("element"); + + + if(oContainer) { + + if(Lang.isString(oContainer)) { + + var me = this; + + Event.onContentReady(oContainer, function() { + + me.appendTo(this); + + }); + + } + else { + + this.appendTo(oContainer); + + } + + } + else if( + !Dom.inDocument(oElement) && + oSrcElement && + oSrcElement.tagName.toUpperCase() == "INPUT" + ) { + + var oParentNode = oSrcElement.parentNode; + + if(oParentNode) { + + this.fireEvent("beforeAppendTo", { + type: "beforeAppendTo", + target: oParentNode + }); + + oParentNode.replaceChild(oElement, oSrcElement); + + this.fireEvent("appendTo", { + type: "appendTo", + target: oParentNode + }); + + } + + } + else if( + Dom.inDocument(oElement) && + oSrcElement.tagName.toUpperCase() == "SPAN" + ) { + + this._addListenersToForm(); + + } + + this.logger.log("Initialization completed."); + +}, + + +/** +* @method initAttributes +* @description Initializes all of the configuration attributes used to create +* the button. +* @param {Object} p_oAttributes Object literal specifying a set of +* configuration attributes used to create the button. +*/ +initAttributes: function(p_oAttributes) { + + var oAttributes = p_oAttributes || {}; + + YAHOO.widget.Button.superclass.initAttributes.call(this, oAttributes); + + + /** + * @config type + * @description String specifying the button's type. Possible values are: + * "button," "link," "submit," "reset," "checkbox," "radio," "menubutton," + * and "splitbutton." + * @default "button" + * @type String + */ + this.setAttributeConfig("type", { + + value: (oAttributes.type || "button"), + validator: Lang.isString, + writeOnce: true, + method: this._setType + + }); + + + /** + * @config label + * @description String specifying the button's text label or innerHTML. + * @default null + * @type String + */ + this.setAttributeConfig("label", { + + value: oAttributes.label, + validator: Lang.isString, + method: this._setLabel + + }); + + + /** + * @config value + * @description Object specifying the value for the button. + * @default null + * @type Object + */ + this.setAttributeConfig("value", { + + value: oAttributes.value + + }); + + + /** + * @config name + * @description String specifying the name for the button. + * @default null + * @type String + */ + this.setAttributeConfig("name", { + + value: oAttributes.name, + validator: Lang.isString + + }); + + + /** + * @config tabindex + * @description Number specifying the tabindex for the button. + * @default null + * @type Number + */ + this.setAttributeConfig("tabindex", { + + value: oAttributes.tabindex, + validator: Lang.isNumber, + method: this._setTabIndex + + }); + + + /** + * @config title + * @description String specifying the title for the button. + * @default null + * @type String + */ + this.configureAttribute("title", { + + value: oAttributes.title, + validator: Lang.isString, + method: this._setTitle + + }); + + + /** + * @config disabled + * @description Boolean indicating if the button should be disabled. + * (Disabled buttons are dimmed and will not respond to user input + * or fire events. Does not apply to button's of type "link.") + * @default false + * @type Boolean + */ + this.setAttributeConfig("disabled", { + + value: (oAttributes.disabled || false), + validator: Lang.isBoolean, + method: this._setDisabled + + }); + + + /** + * @config href + * @description String specifying the href for the button. Applies only to + * buttons of type "link." + * @type String + */ + this.setAttributeConfig("href", { + + value: oAttributes.href, + validator: Lang.isString, + method: this._setHref + + }); + + + /** + * @config target + * @description String specifying the target for the button. Applies only + * to buttons of type "link." + * @type String + */ + this.setAttributeConfig("target", { + + value: oAttributes.target, + validator: Lang.isString, + method: this._setTarget + + }); + + + /** + * @config checked + * @description Boolean indicating if the button is checked. Applies only + * to buttons of type "radio" and "checkbox." + * @default false + * @type Boolean + */ + this.setAttributeConfig("checked", { + + value: (oAttributes.checked || false), + validator: Lang.isBoolean, + method: this._setChecked + + }); + + + /** + * @config container + * @description HTML element reference or string specifying the id + * attribute of the HTML element that the button's markup should be + * rendered into. + * @type HTMLElement|String + * @default null + */ + this.setAttributeConfig("container", { + + value: oAttributes.container + + }); + + + /** + * @config srcelement + * @description Object reference to the HTML element (either + * <input> or <span>) used to + * create the button. + * @type HTMLElement|String + * @default null + */ + this.setAttributeConfig("srcelement", { + + value: oAttributes.srcelement, + writeOnce: true + + }); + + + /** + * @config menu + * @description Object specifying the menu for the button. The value can be + * one of the following: + *
            + *
          • Object specifying a + * YAHOO.widget.Menu instance.
          • + *
          • String specifying the id attribute of the <div> + * element used to create the menu.
          • + *
          • String specifying the id attribute of the + * <select> element used to create the menu.
          • + *
          • Object specifying the <div> element used to + * create the menu.
          • + *
          • Object specifying the <select> element used to + * create the menu.
          • + *
          • Array of object literals, each representing a set of + * YAHOO.widget.MenuItem + * configuration attributes.
          • + *
          • Array of strings representing the text labels for each menu item in + * the menu.
          • + *
          + * @type HTMLElement|String|Array + * @default null + */ + this.setAttributeConfig("menu", { + + value: null, + method: this._setMenu + + }); + + + /** + * @config selectedMenuItem + * @description Reference to the item in the button's menu that is + * currently selected. + * @type YAHOO.widget.MenuItem + * @default null + */ + this.setAttributeConfig("selectedMenuItem", { + + value: null + + }); + + + /** + * @config onclick + * @description Object literal representing the code to be executed when + * the button is clicked. Format:
          {
          + * fn: Function, // The handler to call when the + * event fires.
          obj: Object, // An object to + * pass back to the handler.
          scope: Object // + * The object to use for the scope of the handler.
          }
          + * @type Object + * @default null + */ + this.setAttributeConfig("onclick", { + + value: oAttributes.onclick, + method: this._setOnClick + + }); + +}, + + +/** +* @method focus +* @description Causes the button to receive the focus and fires the button's +* "focus" event. +*/ +focus: function() { + + if(!this.get("disabled")) { + + this._button.focus(); + + } + +}, + + +/** +* @method blur +* @description Causes the button to lose focus and fires the button's +* "blur" event. +*/ +blur: function() { + + if(!this.get("disabled")) { + + this._button.blur(); + + } + +}, + + +/** +* @method hasFocus +* @description Returns a boolean indicating whether or not the button has focus. +* @return {Boolean} +*/ +hasFocus: function() { + + return (m_oFocusedButton == this); + +}, + + +/** +* @method isActive +* @description Returns a boolean indicating whether or not the button is active. +* @return {Boolean} +*/ +isActive: function() { + + return this.hasClass("active"); + +}, + + +/** +* @method getMenu +* @description Returns a reference to the button's menu. +* @return {YAHOO.widget.Menu} +*/ +getMenu: function() { + + return this._menu; + +}, + + +/** +* @method getForm +* @description Returns a reference to the button's parent form. +* @return {HTMLFormElement} +*/ +getForm: function() { + + return this._button.form; + +}, + + +/** +* @method getHiddenField +* @description Returns a reference to the <input> element +* used when the button's parent form is submitted. +* @return {HTMLInputElement} +*/ +getHiddenField: function() { + + return this._hiddenField; + +}, + + +/** +* @method destroy +* @description Removes the button's element from its parent element and +* removes all event handlers. +*/ +destroy: function() { + + this.logger.log("Destroying ..."); + + var oElement = this.get("element"), + oParentNode = oElement.parentNode, + oMenu = this._menu; + + if(oMenu) { + + this.logger.log("Destroying menu."); + + oMenu.destroy(); + + } + + this.logger.log("Removing DOM event handlers."); + + Event.purgeElement(oElement); + Event.purgeElement(this._button); + Event.removeListener(document, "mouseup", this._onDocumentMouseUp); + Event.removeListener(document, "keyup", this._onDocumentKeyUp); + Event.removeListener(document, "mousedown", this._onDocumentMouseDown); + + + var oForm = this.getForm(); + + if(oForm) { + + Event.removeListener(oForm, "reset", this._onFormReset); + Event.removeListener(oForm, "submit", this._onFormSubmit); + + } + + + oParentNode.removeChild(oElement); + + this.logger.log("Removing from document."); + + delete m_oButtons[this.get("id")]; + + this.logger.log("Destroyed."); + +}, + + +fireEvent: function(p_sType , p_aArgs) { + + // Disabled buttons should not respond to DOM events + + if(this.DOM_EVENTS[p_sType] && this.get("disabled")) { + + return; + + } + + YAHOO.widget.Button.superclass.fireEvent.call(this, p_sType, p_aArgs); + +}, + + +/** +* @method toString +* @description Returns a string representing the button. +* @return {String} +*/ +toString: function() { + + return ("Button " + this.get("id")); + +} + +}); + + +/** +* @method onFormKeyDown +* @description "keydown" event handler for the button's form. +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +YAHOO.widget.Button.onFormKeyDown = function(p_oEvent) { + + var oTarget = Event.getTarget(p_oEvent), + nCharCode = Event.getCharCode(p_oEvent); + + + if ( + nCharCode == 13 && + oTarget.tagName && + oTarget.tagName.toUpperCase() == "INPUT" + ) { + + var sType = oTarget.type; + + + if( + sType == "text" || sType == "password" || sType == "checkbox" || + sType == "radio" || sType == "file" + ) { + + + function isYUISubmitButton(p_oElement) { + + var sId = p_oElement.id; + + if (sId) { + + var oButton = m_oButtons[sId]; + + if (oButton) { + + var oSrcElement = oButton.get("srcelement"); + + return ( + oButton.get("type") == "submit" || + ( + oSrcElement && + oSrcElement.type == "submit" + ) + ); + + } + + } + + } + + + var aButtons = Dom.getElementsBy( + isYUISubmitButton, + this.TAG_NAME, + this.getForm() + ), + + nButtons = aButtons.length; + + + if (nButtons > 0) { + + m_oButtons[aButtons[0].id].submitForm(); + + } + + + } + + } + +}; + + +/** +* @method addHiddenFieldsToForm +* @description Searches the specified form and adds hidden fields for instances +* of YAHOO.widget.Button that are of type "radio," "checkbox," "menubutton," +* and "splitbutton." +* @param {HTMLFormElement} p_oForm Object reference +* for the form to search. +*/ +YAHOO.widget.Button.addHiddenFieldsToForm = function(p_oForm) { + + var aButtons = Dom.getElementsByClassName("yuibutton", "*", p_oForm), + nButtons = aButtons.length; + + + if(nButtons > 0) { + + YAHOO.log("Form contains " + nButtons + " YUI buttons."); + + var oButton = null, + sType = null, + oMenuItem = null, + oMenu = null; + + for(var i=0; i
          or <a>) that map to +* Button configuration attributes and sets them into a collection that is +* passed to the Button constructor. +* @private +* @param {HTMLInputElement|HTMLAnchorElement} p_oElement Object reference to the HTML +* element (either <input> or <span>) +* used to create the button. +* @param {Object} p_oAttributes Object reference for the collection of +* configuration attributes used to create the button. +*/ +function setAttributesFromSrcElement(p_oElement, p_oAttributes) { + + var me = this; + + /** + * @method setAttributeFromDOMAttribute + * @description Gets the value of the specified DOM attribute and sets it + * into the collection of configuration attributes used to configure + * the button. + * @private + * @param {String} p_sAttribute String representing the name of the + * attribute to retrieve from the DOM element. + */ + function setAttributeFromDOMAttribute(p_sAttribute) { + + if( !(p_sAttribute in p_oAttributes) ) { + + /* + Need to use "getAttributeNode" instead of "getAttribute" + because using "getAttribute," IE will return the innerText of + a <button> for the value attribute rather + than the value of the "value" attribute. + */ + + var oAttribute = p_oElement.getAttributeNode(p_sAttribute); + + + if(oAttribute && ("value" in oAttribute)) { + + + p_oAttributes[p_sAttribute] = oAttribute.value; + + } + + } + + } + + + /** + * @method setFormElementProperties + * @description Gets the value of the attributes from the form element and + * sets them into the collection of configuration attributes used to + * configure the button. + * @private + */ + function setFormElementProperties() { + + setAttributeFromDOMAttribute("type"); + + if( !("disabled" in p_oAttributes) ) { + + p_oAttributes.disabled = p_oElement.disabled; + + } + + setAttributeFromDOMAttribute("name"); + setAttributeFromDOMAttribute("value"); + setAttributeFromDOMAttribute("title"); + + } + + + var sSrcElementTagName = p_oElement.tagName.toUpperCase(); + + + if( !("label" in p_oAttributes) ) { + + // Set the "label" property + + var sText = sSrcElementTagName == "INPUT" ? + p_oElement.value : p_oElement.innerHTML; + + + if(sText && sText.length > 0) { + + p_oAttributes.label = sText; + + } + + } + + + setAttributeFromDOMAttribute("tabindex"); + setAttributeFromDOMAttribute("accesskey"); + + + switch(sSrcElementTagName) { + + case "A": + + p_oAttributes.type = "link"; + + setAttributeFromDOMAttribute("href"); + setAttributeFromDOMAttribute("target"); + + break; + + case "INPUT": + + setFormElementProperties(); + + if( !("checked" in p_oAttributes) ) { + + p_oAttributes.checked = p_oElement.checked; + + } + + break; + + case "BUTTON": + + setFormElementProperties(); + + var oRootNode = p_oElement.parentNode.parentNode; + + if(Dom.hasClass(oRootNode, "checked")) { + + p_oAttributes.checked = true; + + } + + if(Dom.hasClass(oRootNode, "disabled")) { + + p_oAttributes.disabled = true; + + } + + p_oElement.removeAttribute("name"); + p_oElement.removeAttribute("value"); + + p_oElement.setAttribute("type", "button"); + + break; + + } + +} + + +/** +* @method initConfig +* @description Initializes the set of configuration attributes that are used to +* instantiate the button. +* @private +* @param {Object} Object representing the button's set of +* configuration attributes. +*/ +function initConfig(p_oConfig) { + + var oAttributes = p_oConfig.attributes, + oSrcElement = oAttributes.srcelement, + sSrcElementTagName = oSrcElement.tagName.toUpperCase(); + + + if(sSrcElementTagName == this.TAG_NAME) { + + p_oConfig.element = oSrcElement; + + var oFirstChild = getFirstElement(p_oConfig.element); + + Dom.addClass(oFirstChild, "first-child"); + + if(oFirstChild) { + + var oButton = getFirstElement(oFirstChild); + + + if(oButton) { + + var sButtonTagName = oButton.tagName.toUpperCase(); + + + if(sButtonTagName == "A" || sButtonTagName == "BUTTON") { + + setAttributesFromSrcElement.call( + this, + oButton, + oAttributes + ); + + } + + } + + } + + } + else if(sSrcElementTagName == "INPUT") { + + setAttributesFromSrcElement.call(this, oSrcElement, oAttributes); + + } + +} + + +YAHOO.extend(YAHOO.widget.Button, YAHOO.util.Element, { + + +// Protected properties + + +/** +* @property _button +* @description Object reference to the button's internal +* <a> or <button> element. +* @default null +* @protected +* @type HTMLAnchorElement|HTMLButtonElement +*/ +_button: null, + + +/** +* @property _menu +* @description Object reference to the button's menu. +* @default null +* @protected +* @type YAHOO.widget.Menu +*/ +_menu: null, + + +/** +* @property _hiddenField +* @description Object reference to the <input> element +* used when the button's parent form is submitted. +* @default null +* @protected +* @type HTMLInputElement +*/ +_hiddenField: null, + + +/** +* @property _onclickAttributeValue +* @description Object reference to the button's current value for the "onclick" +* configuration attribute. +* @default null +* @protected +* @type Object +*/ +_onclickAttributeValue: null, + + +/** +* @property _activationKeyPressed +* @description Boolean indicating if the key(s) that toggle the button's +* "active" state have been pressed. +* @default false +* @protected +* @type Boolean +*/ +_activationKeyPressed: false, + + +/** +* @property _activationButtonPressed +* @description Boolean indicating if the mouse button that toggles the button's +* "active" state has been pressed. +* @default false +* @protected +* @type Boolean +*/ +_activationButtonPressed: false, + + +/** +* @property _hasKeyEventHandlers +* @description Boolean indicating if the button's "blur", "keydown" and +* "keyup" event handlers are assigned +* @default false +* @protected +* @type Boolean +*/ +_hasKeyEventHandlers: false, + + +/** +* @property _hasMouseEventHandlers +* @description Boolean indicating if the button's "mouseout" and "mousedown" +* and "mouseup" event handlers are assigned +* @default false +* @protected +* @type Boolean +*/ +_hasMouseEventHandlers: false, + + + +// Constants + + +/** +* @property TAG_NAME +* @description The name of the tag to be used for the button's root element. +* @default "SPAN" +* @final +* @type String +*/ +TAG_NAME: "SPAN", + + +/** +* @property CHECK_ACTIVATION_KEYS +* @description Array of numbers representing keys that (when pressed) toggle +* the button's "checked" attribute. +* @default [32] +* @final +* @type Array +*/ +CHECK_ACTIVATION_KEYS: [32], + + +/** +* @property ACTIVATION_KEYS +* @description Array of numbers representing keys that (when presed) toggle +* the button's "active" state. +* @default [13, 32] +* @final +* @type Array +*/ +ACTIVATION_KEYS: [13, 32], + + +/** +* @property OPTION_AREA_WIDTH +* @description Width (in pixels) of the area of a split button that when +* pressed will display a menu. +* @default 20 +* @final +* @type Number +*/ +OPTION_AREA_WIDTH: 20, + + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the +* button's root element. +* @default "yuibutton" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuibutton", + + +/** +* @property RADIO_DEFAULT_TITLE +* @description String representing the default title applied to buttons of +* type "radio." +* @default "Unchecked. Click to check." +* @final +* @type String +*/ +RADIO_DEFAULT_TITLE: "Unchecked. Click to check.", + + +/** +* @property RADIO_CHECKED_TITLE +* @description String representing the title applied to buttons of type "radio" +* when checked. +* @default "Checked. Click to uncheck." +* @final +* @type String +*/ +RADIO_CHECKED_TITLE: "Checked. Click to uncheck.", + + +/** +* @property CHECKBOX_DEFAULT_TITLE +* @description String representing the default title applied to buttons of +* type "checkbox." +* @default "Unchecked. Click to check." +* @final +* @type String +*/ +CHECKBOX_DEFAULT_TITLE: "Unchecked. Click to check.", + + +/** +* @property CHECKBOX_CHECKED_TITLE +* @description String representing the title applied to buttons of type +* "checkbox" when checked. +* @default "Checked. Click to uncheck." +* @final +* @type String +*/ +CHECKBOX_CHECKED_TITLE: "Checked. Click to uncheck.", + + +/** +* @property MENUBUTTON_DEFAULT_TITLE +* @description String representing the default title applied to buttons of +* type "menubutton." +* @default "Menu collapsed. Click to expand." +* @final +* @type String +*/ +MENUBUTTON_DEFAULT_TITLE: "Menu collapsed. Click to expand.", + + +/** +* @property MENUBUTTON_MENU_VISIBLE_TITLE +* @description String representing the title applied to buttons of type +* "menubutton" when the button's menu is visible. +* @default "Menu expanded. Click or press Esc to collapse." +* @final +* @type String +*/ +MENUBUTTON_MENU_VISIBLE_TITLE: + "Menu expanded. Click or press Esc to collapse.", + + +/** +* @property SPLITBUTTON_DEFAULT_TITLE +* @description String representing the default title applied to buttons of +* type "splitebutton." +* @default "Menu collapsed. Click inside option region or press +* Ctrl + Shift + M to show the menu." +* @final +* @type String +*/ +SPLITBUTTON_DEFAULT_TITLE: + "Menu collapsed. Click inside option region or press Ctrl + Shift + M to show the menu.", + + +/** +* @property SPLITBUTTON_OPTION_VISIBLE_TITLE +* @description String representing the title applied to buttons of type +* "splitbutton" when the button's menu is visible. +* @default "Menu expanded. Press Esc or Ctrl + Shift + M to hide the menu." +* @final +* @type String +*/ +SPLITBUTTON_OPTION_VISIBLE_TITLE: + "Menu expanded. Press Esc or Ctrl + Shift + M to hide the menu.", + + +/** +* @property SUBMIT_TITLE +* @description String representing the title applied to buttons of +* type "submit." +* @default "Click to submit form." +* @final +* @type String +*/ +SUBMIT_TITLE: "Click to submit form.", + + + +// Protected attribute setter methods + + +/** +* @method _setType +* @description Sets the value of the button's "type" attribute. +* @protected +* @param {String} p_sType String indicating the value for the button's +* "type" attribute. +*/ +_setType: function(p_sType) { + + if(p_sType == "splitbutton") { + + this.on("option", this._onOption); + + } + +}, + + +/** +* @method _setLabel +* @description Sets the value of the button's "label" attribute. +* @protected +* @param {String} p_sLabel String indicating the value for the button's +* "label" attribute. +*/ +_setLabel: function(p_sLabel) { + + this._button.innerHTML = p_sLabel; + +}, + + +/** +* @method _setTabIndex +* @description Sets the value of the button's "tabindex" attribute. +* @protected +* @param {Number} p_nTabIndex Number indicating the value for the button's +* "tabindex" attribute. +*/ +_setTabIndex: function(p_nTabIndex) { + + this._button.tabIndex = p_nTabIndex; + +}, + + +/** +* @method _setTitle +* @description Sets the value of the button's "title" attribute. +* @protected +* @param {String} p_nTabIndex Number indicating the value for the button's +* "title" attribute. +*/ +_setTitle: function(p_sTitle) { + + if(this.get("type") != "link") { + + var sTitle = p_sTitle; + + if(!sTitle) { + + + var sType = this.get("type"); + + switch(sType) { + + case "radio": + + sTitle = this.RADIO_DEFAULT_TITLE; + + break; + + case "checkbox": + + sTitle = this.CHECKBOX_DEFAULT_TITLE; + + break; + + case "menubutton": + + sTitle = this.MENUBUTTON_DEFAULT_TITLE; + + break; + + case "splitbutton": + + sTitle = this.SPLITBUTTON_DEFAULT_TITLE; + + break; + + case "submit": + + sTitle = this.SUBMIT_TITLE; + + break; + + } + + } + + this._button.title = sTitle; + + } + +}, + + +/** +* @method _setDisabled +* @description Sets the value of the button's "disabled" attribute. +* @protected +* @param {Boolean} p_bDisabled Boolean indicating the value for the button's +* "disabled" attribute. +*/ +_setDisabled: function(p_bDisabled) { + + if(this.get("type") != "link") { + + if(p_bDisabled) { + + if(this.hasFocus()) { + + this.blur(); + + } + + this._button.setAttribute("disabled", "disabled"); + + this.addClass("disabled"); + + } + else { + + this._button.removeAttribute("disabled"); + + this.removeClass("disabled"); + + } + + } + +}, + + +/** +* @method _setAccessKey +* @description Sets the value of the button's "accesskey" attribute. +* @protected +* @param {String} p_sAccessKey String indicating the value for the button's +* "accesskey" attribute. +*/ +_setAccessKey: function(p_sAccessKey) { + + this._button.accessKey = p_sAccessKey; + +}, + + +/** +* @method _setHref +* @description Sets the value of the button's "href" attribute. +* @protected +* @param {String} p_sHref String indicating the value for the button's +* "href" attribute. +*/ +_setHref: function(p_sHref) { + + if(this.get("type") == "link") { + + this._button.href = p_sHref; + + } + +}, + + +/** +* @method _setTarget +* @description Sets the value of the button's "target" attribute. +* @protected +* @param {String} p_sTarget String indicating the value for the button's +* "target" attribute. +*/ +_setTarget: function(p_sTarget) { + + if(this.get("type") == "link") { + + this._button.setAttribute("target", p_sTarget); + + } + +}, + + +/** +* @method _setChecked +* @description Sets the value of the button's "target" attribute. +* @protected +* @param {Boolean} p_bChecked Boolean indicating the value for the button's +* "checked" attribute. +*/ +_setChecked: function(p_bChecked) { + + var sType = this.get("type"), + sTitle; + + if(sType == "checkbox" || sType == "radio") { + + if(p_bChecked) { + + this.addClass("checked"); + + sTitle = (sType == "radio") ? + this.RADIO_CHECKED_TITLE : + this.CHECKBOX_CHECKED_TITLE; + + } + else { + + this.removeClass("checked"); + + sTitle = (sType == "radio") ? + this.RADIO_DEFAULT_TITLE : + this.CHECKBOX_DEFAULT_TITLE; + + } + + this.set("title", sTitle); + + } + +}, + + +/** +* @method _setMenu +* @description Sets the value of the button's "menu" attribute. +* @protected +* @param {Object} p_oMenu Object indicating the value for the button's +* "menu" attribute. +*/ +_setMenu: function(p_oMenu) { + + var Menu = YAHOO.widget.Menu, + oMenu, + me = this; + + if(!Menu) { + + + return false; + + } + + + function initMenu() { + + if(oMenu) { + + oMenu.showEvent.subscribe(this._onMenuShow, this, true); + oMenu.hideEvent.subscribe(this._onMenuHide, this, true); + oMenu.keyDownEvent.subscribe(this._onMenuKeyDown, this, true); + oMenu.renderEvent.subscribe(this._onMenuRender, this, true); + oMenu.clickEvent.subscribe(this._onMenuClick, this, true); + oMenu.itemAddedEvent.subscribe(this._onMenuItemAdded, this, true); + + var oSrcElement = oMenu.srcElement; + + if(oSrcElement && oSrcElement.tagName.toUpperCase() == "SELECT") { + + oSrcElement.style.display = "none"; + oSrcElement.parentNode.removeChild(oSrcElement); + + } + + this._menu = oMenu; + + } + else { + + this._menu.destroy(); + this._menu = null; + + } + + } + + + if(p_oMenu instanceof Menu) { + + oMenu = p_oMenu; + + var aItems = oMenu.getItems(), + nItems = aItems.length, + oItem; + + if(nItems > 0) { + + var i = nItems - 1; + + do { + + oItem = aItems[i]; + + if(oItem) { + + oItem.cfg.subscribeToConfigEvent( + "selected", + this._onMenuItemSelected, + oItem, + this + ); + + } + + } + while(i--); + + } + + initMenu.call(this); + + } + else if(Lang.isArray(p_oMenu)) { + + this.on("appendTo", function() { + + oMenu = new Menu( + Dom.generateId(), + { lazyload: true, itemdata: p_oMenu } + ); + + initMenu.call(me); + + }); + + } + else if(Lang.isString(p_oMenu)) { + + Event.onContentReady(p_oMenu, function() { + + oMenu = new Menu(this, { lazyload: true }); + + initMenu.call(me); + + }); + + } + else if(p_oMenu && p_oMenu.nodeName) { + + oMenu = new Menu(p_oMenu, { lazyload: true }); + + initMenu.call(this); + + } + +}, + + +/** +* @method _setOnClick +* @description Sets the value of the button's "onclick" attribute. +* @protected +* @param {Object} p_oObject Object indicating the value for the button's +* "onclick" attribute. +*/ +_setOnClick: function(p_oObject) { + + /* + Remove any existing listeners if a "click" event handler has already + been specified. + */ + + if( + this._onclickAttributeValue && + (this._onclickAttributeValue != p_oObject) + ) { + + this.removeListener("click", this._onclickAttributeValue.fn); + + this._onclickAttributeValue = null; + + } + + + if( + !this._onclickAttributeValue && + Lang.isObject(p_oObject) && + Lang.isFunction(p_oObject.fn) + ) { + + this.on("click", p_oObject.fn, p_oObject.obj, p_oObject.scope); + + this._onclickAttributeValue = p_oObject; + + } + +}, + + + +// Protected methods + + +/** +* @method _createButtonElement +* @description Creates the button's element. +* @protected +* @param {String} p_sType String indicating the type of element to create. +* @return {HTMLElement} +*/ +_createButtonElement: function(p_sType) { + + var sTagName = this.TAG_NAME, + oElement = document.createElement(sTagName); + + oElement.innerHTML = + + "<" + sTagName + " class=\"first-child\">" + + (p_sType == "link" ? "" : "") + + ""; + + return oElement; + +}, + + +/** +* @method _isActivationKey +* @description Determines if the specified keycode is one that toggles the +* button's "active" state. +* @protected +* @param {Number} p_nKeyCode Number representing the keycode to be evaluated. +* @return {Boolean} +*/ +_isActivationKey: function(p_nKeyCode) { + + var sType = this.get("type"), + aKeyCodes = (sType == "checkbox" || sType == "radio") ? + this.CHECK_ACTIVATION_KEYS : this.ACTIVATION_KEYS, + + nKeyCodes = aKeyCodes.length; + + if(nKeyCodes > 0) { + + var i = nKeyCodes - 1; + + do { + + if(p_nKeyCode == aKeyCodes[i]) { + + return true; + + } + + } + while(i--); + + } + +}, + + +/** +* @method _isSplitButtonOptionKey +* @description Determines if the specified keycode is one that toggles the +* display of the split button's menu. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @return {Boolean} +*/ +_isSplitButtonOptionKey: function(p_oEvent) { + + return ( + p_oEvent.ctrlKey && + p_oEvent.shiftKey && + Event.getCharCode(p_oEvent) == 77 + ); + +}, + + +/** +* @method _addListenersToForm +* @description Adds event handlers to the button's form. +* @protected +*/ +_addListenersToForm: function() { + + var oForm = this.getForm(); + + if(oForm) { + + Event.on(oForm, "reset", this._onFormReset, null, this); + Event.on(oForm, "submit", this._onFormSubmit, null, this); + + var oSrcElement = this.get("srcelement"); + + + if ( + (m_bIE || m_bGecko) && + ( + this.get("type") == "submit" || + (oSrcElement && oSrcElement.type == "submit") + ) + ) { + + var aListeners = Event.getListeners(oForm, "keydown"), + bHasKeyDownListener = false; + + if(aListeners) { + + var nListeners = aListeners.length; + + if(nListeners > 0) { + + var i = nListeners - 1; + + do { + + if( + aListeners[i].fn == + YAHOO.widget.Button.onFormKeyDown + ) { + + bHasKeyDownListener = true; + break; + + } + + } + while(i--); + + } + + } + + + if(!bHasKeyDownListener) { + + Event.on( + oForm, + "keydown", + YAHOO.widget.Button.onFormKeyDown, + null, + this + ); + + } + + } + + } + +}, + + +_originalMaxHeight: -1, + + +/** +* @method _showMenu +* @description Shows the button's menu. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event) that triggered the display of +* the menu. +*/ +_showMenu: function(p_oEvent) { + + var oMenu = this._menu; + + if(oMenu) { + + YAHOO.widget.MenuManager.hideVisible(); + + oMenu.cfg.applyConfig({ + context:[this.get("id"), "tl", "bl"], + clicktohide: false, + constraintoviewport: false, + visible: true + }); + + oMenu.cfg.fireQueue(); + + /* + Stop the propagation of the event so that the MenuManager + doesn't blur the menu after it gets focus. + */ + + if(p_oEvent.type == "mousedown") { + + Event.stopPropagation(p_oEvent); + + } + + this._menu.focus(); + + + var nViewportHeight = Dom.getViewportHeight(), + nMenuHeight = oMenu.element.offsetHeight; + + + if((oMenu.cfg.getProperty("y") + nMenuHeight) > nViewportHeight) { + + + oMenu.align("bl", "tl"); + + var nY = oMenu.cfg.getProperty("y"), + + nScrollTop = ( + document.documentElement.scrollTop || + document.body.scrollTop + ); + + + if(nScrollTop >= nY) { + + if(this._originalMaxHeight == -1) { + + this._originalMaxHeight = + oMenu.cfg.getProperty("maxheight"); + + } + + oMenu.cfg.setProperty( + "maxheight", + (nMenuHeight - ((nScrollTop - nY) + 20)) + ); + + oMenu.align("bl", "tl"); + + } + + } + + oMenu.cfg.setProperty("constraintoviewport", true); + + } + +}, + + +/** +* @method _hideMenu +* @description Hides the button's menu. +* @protected +*/ +_hideMenu: function() { + + var oMenu = this._menu; + + if(oMenu && oMenu.cfg.getProperty("visible")) { + + oMenu.hide(); + + } + +}, + + + + +// Protected event handlers + + +/** +* @method _onMouseOver +* @description "mouseover" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onMouseOver: function(p_oEvent) { + + if(!this._hasMouseEventHandlers) { + + this.on("mouseout", this._onMouseOut); + this.on("mousedown", this._onMouseDown); + this.on("mouseup", this._onMouseUp); + + this._hasMouseEventHandlers = true; + + } + + this.addClass("hover"); + + if(this._activationButtonPressed) { + + this.addClass("active"); + + } + + + if(this._bOptionPressed) { + + this.addClass("activeoption"); + + } + +}, + + +/** +* @method _onMouseOut +* @description "mouseout" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onMouseOut: function(p_oEvent) { + + this.removeClass("hover"); + + if(this.get("type") != "menubutton") { + + this.removeClass("active"); + + } + + if(this._activationButtonPressed || this._bOptionPressed) { + + Event.on(document, "mouseup", this._onDocumentMouseUp, null, this); + + } + +}, + + +/** +* @method _onDocumentMouseUp +* @description "mouseup" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onDocumentMouseUp: function(p_oEvent) { + + this._activationButtonPressed = false; + this._bOptionPressed = false; + + var sType = this.get("type"); + + if(sType == "menubutton" || sType == "splitbutton") { + + this.removeClass((sType == "menubutton" ? "active" : "activeoption")); + + this._hideMenu(); + + } + + Event.removeListener(document, "mouseup", this._onDocumentMouseUp); + +}, + + +/** +* @method _onMouseDown +* @description "mousedown" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onMouseDown: function(p_oEvent) { + + if((p_oEvent.which || p_oEvent.button) == 1) { + + if(!this.hasFocus()) { + + this.focus(); + + } + + + var sType = this.get("type"); + + + if(sType == "splitbutton") { + + var oElement = this.get("element"), + nX = Event.getPageX(p_oEvent) - Dom.getX(oElement); + + if((oElement.offsetWidth - this.OPTION_AREA_WIDTH) < nX) { + + this.fireEvent("option", p_oEvent); + + } + else { + + this.addClass("active"); + + this._activationButtonPressed = true; + + } + + } + else if(sType == "menubutton") { + + if(this.hasClass("active")) { + + this._hideMenu(); + + this._activationButtonPressed = false; + + } + else { + + this._showMenu(p_oEvent); + + this._activationButtonPressed = true; + + } + + } + else { + + this.addClass("active"); + + this._activationButtonPressed = true; + + } + + + + if(sType == "splitbutton" || sType == "menubutton") { + + var me = this; + + + function onMouseUp() { + + me._hideMenu(); + me.removeListener("mouseup", onMouseUp); + + } + + + this._hideMenuTimerId = window.setTimeout(function() { + + me.on("mouseup", onMouseUp); + + }, 250); + + } + + } + +}, + + +/** +* @method _onMouseUp +* @description "mouseup" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onMouseUp: function(p_oEvent) { + + if(this._hideMenuTimerId) { + + window.clearTimeout(this._hideMenuTimerId); + + } + + var sType = this.get("type"); + + if(sType == "checkbox" || sType == "radio") { + + this.set("checked", !(this.get("checked"))); + + } + + + this._activationButtonPressed = false; + + + if(this.get("type") != "menubutton") { + + this.removeClass("active"); + + } + +}, + + +/** +* @method _onFocus +* @description "focus" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onFocus: function(p_oEvent) { + + this.addClass("focus"); + + if(this._activationKeyPressed) { + + this.addClass("active"); + + } + + m_oFocusedButton = this; + + + if(!this._hasKeyEventHandlers) { + + var oElement = this._button; + + Event.on(oElement, "blur", this._onBlur, null, this); + Event.on(oElement, "keydown", this._onKeyDown, null, this); + Event.on(oElement, "keyup", this._onKeyUp, null, this); + + this._hasKeyEventHandlers = true; + + } + + + this.fireEvent("focus", p_oEvent); + +}, + + +/** +* @method _onBlur +* @description "blur" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onBlur: function(p_oEvent) { + + this.removeClass("focus"); + + if(this.get("type") != "menubutton") { + + this.removeClass("active"); + + } + + if(this._activationKeyPressed) { + + Event.on(document, "keyup", this._onDocumentKeyUp, null, this); + + } + + + m_oFocusedButton = null; + + this.fireEvent("blur", p_oEvent); + +}, + + +/** +* @method _onDocumentKeyUp +* @description "keyup" event handler for the document. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onDocumentKeyUp: function(p_oEvent) { + + if(this._isActivationKey(Event.getCharCode(p_oEvent))) { + + this._activationKeyPressed = false; + + Event.removeListener(document, "keyup", this._onDocumentKeyUp); + + } + +}, + + +/** +* @method _onKeyDown +* @description "keydown" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onKeyDown: function(p_oEvent) { + + if( + this.get("type") == "splitbutton" && + this._isSplitButtonOptionKey(p_oEvent) + ) { + + this.fireEvent("option", p_oEvent); + + } + else if(this._isActivationKey(Event.getCharCode(p_oEvent))) { + + if(this.get("type") == "menubutton") { + + this._showMenu(p_oEvent); + + } + else { + + this._activationKeyPressed = true; + + this.addClass("active"); + + } + + } + + + var oMenu = this._menu; + + if( + oMenu && oMenu.cfg.getProperty("visible") && + Event.getCharCode(p_oEvent) == 27 + ) { + + oMenu.hide(); + this.focus(); + + } + +}, + + +/** +* @method _onKeyUp +* @description "keyup" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onKeyUp: function(p_oEvent) { + + if(this._isActivationKey(Event.getCharCode(p_oEvent))) { + + var sType = this.get("type"); + + if(sType == "checkbox" || sType == "radio") { + + this.set("checked", !(this.get("checked"))); + + } + + this._activationKeyPressed = false; + + if(this.get("type") != "menubutton") { + + this.removeClass("active"); + + } + + } + +}, + + +/** +* @method _onClick +* @description "click" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onClick: function(p_oEvent) { + + var sType = this.get("type"), + sTitle; + + switch(sType) { + + case "radio": + case "checkbox": + + if(this.get("checked")) { + + sTitle = (sType == "radio") ? + this.RADIO_CHECKED_TITLE : + this.CHECKBOX_CHECKED_TITLE; + + } + else { + + sTitle = (sType == "radio") ? + this.RADIO_DEFAULT_TITLE : + this.CHECKBOX_DEFAULT_TITLE; + + } + + this.set("title", sTitle); + + break; + + case "submit": + + this.submitForm(); + + break; + + case "reset": + + var oForm = this.getForm(); + + if(oForm) { + + oForm.reset(); + + } + + break; + + case "menubutton": + + sTitle = this._menu.cfg.getProperty("visible") ? + this.MENUBUTTON_MENU_VISIBLE_TITLE : + this.MENUBUTTON_DEFAULT_TITLE; + + this.set("title", sTitle); + + break; + + case "splitbutton": + + var oElement = this.get("element"), + nX = Event.getPageX(p_oEvent) - Dom.getX(oElement); + + if((oElement.offsetWidth - this.OPTION_AREA_WIDTH) < nX) { + + return false; + + } + else { + + this._hideMenu(); + + var oSrcElement = this.get("srcelement"); + + if(oSrcElement && oSrcElement.type == "submit") { + + this.submitForm(); + + } + + } + + sTitle = this._menu.cfg.getProperty("visible") ? + this.SPLITBUTTON_OPTION_VISIBLE_TITLE : + this.SPLITBUTTON_DEFAULT_TITLE; + + this.set("title", sTitle); + + break; + + } + +}, + + +/** +* @method _onAppendTo +* @description "appendTo" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onAppendTo: function(p_oEvent) { + + /* + It is necessary to call "getForm" using "setTimeout" to make sure that + the button's "form" property returns a node reference. Sometimes, if + you try to get the reference immediately after appending the field, it + is null. + */ + + var me = this; + + window.setTimeout(function() { + + me._addListenersToForm(); + + }, 0); + +}, + + +/** +* @method _onFormSubmit +* @description "submit" event handler for the button's form. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onFormSubmit: function(p_oEvent) { + + var sType = this.get("type"), + oMenuItem = this.get("selectedMenuItem"), + oForm = this.getForm(); + + + if(sType == "radio" || sType == "checkbox") { + + + this.createHiddenField(); + + } + else if(oMenuItem) { + + var oSrcElement = this._menu.srcElement; + + if(oSrcElement && oSrcElement.tagName.toUpperCase() == "SELECT") { + + oForm.appendChild(oSrcElement); + oSrcElement.selectedIndex = oMenuItem.index; + + } + else { + + var oValue = (oMenuItem.value === null || oMenuItem.value === "") ? + oMenuItem.cfg.getProperty("text") : + oMenuItem.value; + + + if(oValue) { + + var oField = createInputElement( + "hidden", + (this.get("name") + "_options"), + oValue + ); + + oForm.appendChild(oField); + + } + + } + + } + +}, + + +/** +* @method _onFormReset +* @description "reset" event handler for the button's form. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onFormReset: function(p_oEvent) { + + var sType = this.get("type"); + + if(sType == "checkbox" || sType == "radio") { + + this.resetValue("checked"); + + } + + if(this._menu) { + + this.resetValue("selectedMenuItem"); + + } + +}, + + +/** +* @method _onDocumentMouseDown +* @description "mousedown" event handler for the document. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onDocumentMouseDown: function(p_oEvent) { + + var oTarget = Event.getTarget(p_oEvent), + oButtonElement = this.get("element"), + oMenuElement = this._menu.element; + + if( + oTarget != oButtonElement && + !Dom.isAncestor(oButtonElement, oTarget) && + oTarget != oMenuElement && + !Dom.isAncestor(oMenuElement, oTarget) + ) { + + this._hideMenu(); + + Event.removeListener( + document, + "mousedown", + this._onDocumentMouseDown + ); + + } + +}, + + +/** +* @method _onOption +* @description "option" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onOption: function(p_oEvent) { + + if(this.hasClass("activeoption")) { + + this._hideMenu(); + + this._bOptionPressed = false; + + } + else { + + this._showMenu(p_oEvent); + + this._bOptionPressed = true; + + } + +}, + + +/** +* @method _onMenuShow +* @description "show" event handler for the button's 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. +*/ +_onMenuShow: function(p_sType, p_aArgs) { + + Event.on(document, "mousedown", this._onDocumentMouseDown, null, this); + + var sTitle, + sClass; + + if(this.get("type") == "splitbutton") { + + sTitle = this.SPLITBUTTON_OPTION_VISIBLE_TITLE; + sClass = "activeoption"; + + } + else { + + sTitle = this.MENUBUTTON_MENU_VISIBLE_TITLE; + sClass = "active"; + + } + + this.addClass(sClass); + this.set("title", sTitle); + +}, + + +/** +* @method _onMenuHide +* @description "hide" event handler for the button's 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. +*/ +_onMenuHide: function(p_sType, p_aArgs) { + + if(this._originalMaxHeight != -1) { + + this._menu.cfg.setProperty("maxheight", this._originalMaxHeight); + + } + + + var sTitle, + sClass; + + if(this.get("type") == "splitbutton") { + + sTitle = this.SPLITBUTTON_DEFAULT_TITLE; + sClass = "activeoption"; + + } + else { + + sTitle = this.MENUBUTTON_DEFAULT_TITLE; + sClass = "active"; + } + + + this.removeClass(sClass); + this.set("title", sTitle); + + + if(this.get("type") == "splitbutton") { + + this._bOptionPressed = false; + + } + +}, + + +/** +* @method _onMenuKeyDown +* @description "keydown" event handler for the button's 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. +*/ +_onMenuKeyDown: function(p_sType, p_aArgs) { + + var oEvent = p_aArgs[0]; + + if(Event.getCharCode(oEvent) == 27) { + + this.focus(); + + if(this.get("type") == "splitbutton") { + + this._bOptionPressed = false; + + } + + } + +}, + + +/** +* @method _onMenuRender +* @description "render" event handler for the button's 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. +*/ +_onMenuRender: function(p_sType, p_aArgs) { + + this.get("element").parentNode.appendChild(this._menu.element); + +}, + + +/** +* @method _onMenuItemSelected +* @description "selectedchange" event handler for each item in the +* button's 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.MenuItem} +* p_oItem Object representing the menu item that subscribed to the event. +*/ +_onMenuItemSelected: function(p_sType, p_aArgs, p_oItem) { + + this.set("selectedMenuItem", p_oItem); + +}, + + +/** +* @method _onMenuItemAdded +* @description "itemadded" event handler for the button's 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.MenuItem} +* p_oItem Object representing the menu item that subscribed to the event. +*/ +_onMenuItemAdded: function(p_sType, p_aArgs, p_oItem) { + + var oItem = p_aArgs[0]; + + oItem.cfg.subscribeToConfigEvent( + "selected", + this._onMenuItemSelected, + oItem, + this + ); + +}, + + +/** +* @method _onMenuClick +* @description "click" event handler for the button's 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. +*/ +_onMenuClick: function(p_sType, p_aArgs) { + + var oItem = p_aArgs[1]; + + if(oItem) { + + var oSrcElement = this.get("srcelement"); + + if(oSrcElement && oSrcElement.type == "submit") { + + this.submitForm(); + + } + + this._hideMenu(); + + } + +}, + + + +// Public methods + + +/** +* @method createHiddenField +* @description Creates the button's hidden form field and appends it to its +* parent form. +* @return {HTMLInputElement} +*/ +createHiddenField: function () { + + if (!this.get("disabled")) { + + var sType = this.get("type"), + + bCheckable = (sType == "checkbox" || sType == "radio"), + + oField = createInputElement( + + /* + Use "submit" type for IE so that the input + element will be able to be clicked via a call to + the "click" method by the "submitForm" method. + */ + + (bCheckable ? sType : (m_bIE ? "submit" : "hidden")), + this.get("name"), + this.get("value"), + this.get("checked") + ), + + oForm = this.getForm(); + + + if (oField) { + + if (bCheckable || oField.type == "submit") { + + oField.style.display = "none"; + + } + + + if (oForm) { + + var oHiddenField = this._hiddenField; + + if (oHiddenField && Dom.inDocument(oHiddenField)) { + + oForm.replaceChild(oField, oHiddenField); + + } + else { + + oForm.appendChild(oField); + + } + + } + + this._hiddenField = oField; + + return oField; + + } + + } + +}, + + +/** +* @method submitForm +* @description Submits the form to which the button belongs. +* @protected +*/ +submitForm: function(p_oMenuItem) { + + var oForm = this.getForm(); + + if (oForm) { + + var oInput = this.createHiddenField(); + + if (m_bIE) { + + /* + Clicking the button via a call to the "click" method will + cause IE to both fire the form's "submit" event as well as + submit the form. Originally tried just firing the "submit" + event via "fireEvent," but then the event could not + be cancelled. + */ + + oInput.click(); + + } + else { // Gecko, Opera, and Safari + + var oEvent = document.createEvent("HTMLEvents"); + oEvent.initEvent("submit", true, true); + + /* + In Safari, dispatching a "submit" event to a form WILL cause + the form's "submit" event to fire, but WILL NOT submit the + form. Therefore, we need to call the "submit" method as well. + */ + + var bSubmitForm = oForm.dispatchEvent(oEvent); + + if(m_bSafari && bSubmitForm) { + + oForm.submit(); + + } + + } + + } + +}, + + +/** +* @method init +* @description The Button class's initialization method. +* @param {String} p_oElement String specifying the id attribute of the +* <input>, <a> or +* <span> element to be used to create the button. +* @param {HTMLInputElement|HTMLElement} p_oElement Object reference for the +* <input>, <a> or +* <span> element to be used to create the button. +* @param {Object} p_oElement Object literal specifying a set of configuration +* attributes used to create the button. +* @param {Object} p_oAttributes Optional. Object literal specifying a set of +* configuration attributes used to create the button. +*/ +init: function(p_oElement, p_oAttributes) { + + var sTagName = p_oAttributes.type == "link" ? "A" : "BUTTON", + oSrcElement = p_oAttributes.srcelement; + + + this._button = p_oElement.getElementsByTagName(sTagName)[0]; + + + YAHOO.widget.Button.superclass.init.call( + this, p_oElement, + p_oAttributes + ); + + + m_oButtons[this.get("id")] = this; + + + this.addClass(this.CSS_CLASS_NAME); + + if(m_bIE && !m_bIE7) { + + this.addClass("ie6"); + + } + + this.addClass(this.get("type")); + + Event.on(this._button, "focus", this._onFocus, null, this); + this.on("mouseover", this._onMouseOver); + this.on("click", this._onClick); + this.on("appendTo", this._onAppendTo); + + var oContainer = this.get("container"), + oElement = this.get("element"); + + + if(oContainer) { + + if(Lang.isString(oContainer)) { + + var me = this; + + Event.onContentReady(oContainer, function() { + + me.appendTo(this); + + }); + + } + else { + + this.appendTo(oContainer); + + } + + } + else if( + !Dom.inDocument(oElement) && + oSrcElement && + oSrcElement.tagName.toUpperCase() == "INPUT" + ) { + + var oParentNode = oSrcElement.parentNode; + + if(oParentNode) { + + this.fireEvent("beforeAppendTo", { + type: "beforeAppendTo", + target: oParentNode + }); + + oParentNode.replaceChild(oElement, oSrcElement); + + this.fireEvent("appendTo", { + type: "appendTo", + target: oParentNode + }); + + } + + } + else if( + Dom.inDocument(oElement) && + oSrcElement.tagName.toUpperCase() == "SPAN" + ) { + + this._addListenersToForm(); + + } + + +}, + + +/** +* @method initAttributes +* @description Initializes all of the configuration attributes used to create +* the button. +* @param {Object} p_oAttributes Object literal specifying a set of +* configuration attributes used to create the button. +*/ +initAttributes: function(p_oAttributes) { + + var oAttributes = p_oAttributes || {}; + + YAHOO.widget.Button.superclass.initAttributes.call(this, oAttributes); + + + /** + * @config type + * @description String specifying the button's type. Possible values are: + * "button," "link," "submit," "reset," "checkbox," "radio," "menubutton," + * and "splitbutton." + * @default "button" + * @type String + */ + this.setAttributeConfig("type", { + + value: (oAttributes.type || "button"), + validator: Lang.isString, + writeOnce: true, + method: this._setType + + }); + + + /** + * @config label + * @description String specifying the button's text label or innerHTML. + * @default null + * @type String + */ + this.setAttributeConfig("label", { + + value: oAttributes.label, + validator: Lang.isString, + method: this._setLabel + + }); + + + /** + * @config value + * @description Object specifying the value for the button. + * @default null + * @type Object + */ + this.setAttributeConfig("value", { + + value: oAttributes.value + + }); + + + /** + * @config name + * @description String specifying the name for the button. + * @default null + * @type String + */ + this.setAttributeConfig("name", { + + value: oAttributes.name, + validator: Lang.isString + + }); + + + /** + * @config tabindex + * @description Number specifying the tabindex for the button. + * @default null + * @type Number + */ + this.setAttributeConfig("tabindex", { + + value: oAttributes.tabindex, + validator: Lang.isNumber, + method: this._setTabIndex + + }); + + + /** + * @config title + * @description String specifying the title for the button. + * @default null + * @type String + */ + this.configureAttribute("title", { + + value: oAttributes.title, + validator: Lang.isString, + method: this._setTitle + + }); + + + /** + * @config disabled + * @description Boolean indicating if the button should be disabled. + * (Disabled buttons are dimmed and will not respond to user input + * or fire events. Does not apply to button's of type "link.") + * @default false + * @type Boolean + */ + this.setAttributeConfig("disabled", { + + value: (oAttributes.disabled || false), + validator: Lang.isBoolean, + method: this._setDisabled + + }); + + + /** + * @config href + * @description String specifying the href for the button. Applies only to + * buttons of type "link." + * @type String + */ + this.setAttributeConfig("href", { + + value: oAttributes.href, + validator: Lang.isString, + method: this._setHref + + }); + + + /** + * @config target + * @description String specifying the target for the button. Applies only + * to buttons of type "link." + * @type String + */ + this.setAttributeConfig("target", { + + value: oAttributes.target, + validator: Lang.isString, + method: this._setTarget + + }); + + + /** + * @config checked + * @description Boolean indicating if the button is checked. Applies only + * to buttons of type "radio" and "checkbox." + * @default false + * @type Boolean + */ + this.setAttributeConfig("checked", { + + value: (oAttributes.checked || false), + validator: Lang.isBoolean, + method: this._setChecked + + }); + + + /** + * @config container + * @description HTML element reference or string specifying the id + * attribute of the HTML element that the button's markup should be + * rendered into. + * @type HTMLElement|String + * @default null + */ + this.setAttributeConfig("container", { + + value: oAttributes.container + + }); + + + /** + * @config srcelement + * @description Object reference to the HTML element (either + * <input> or <span>) used to + * create the button. + * @type HTMLElement|String + * @default null + */ + this.setAttributeConfig("srcelement", { + + value: oAttributes.srcelement, + writeOnce: true + + }); + + + /** + * @config menu + * @description Object specifying the menu for the button. The value can be + * one of the following: + *
            + *
          • Object specifying a + * YAHOO.widget.Menu instance.
          • + *
          • String specifying the id attribute of the <div> + * element used to create the menu.
          • + *
          • String specifying the id attribute of the + * <select> element used to create the menu.
          • + *
          • Object specifying the <div> element used to + * create the menu.
          • + *
          • Object specifying the <select> element used to + * create the menu.
          • + *
          • Array of object literals, each representing a set of + * YAHOO.widget.MenuItem + * configuration attributes.
          • + *
          • Array of strings representing the text labels for each menu item in + * the menu.
          • + *
          + * @type HTMLElement|String|Array + * @default null + */ + this.setAttributeConfig("menu", { + + value: null, + method: this._setMenu + + }); + + + /** + * @config selectedMenuItem + * @description Reference to the item in the button's menu that is + * currently selected. + * @type YAHOO.widget.MenuItem + * @default null + */ + this.setAttributeConfig("selectedMenuItem", { + + value: null + + }); + + + /** + * @config onclick + * @description Object literal representing the code to be executed when + * the button is clicked. Format:
          {
          + * fn: Function, // The handler to call when the + * event fires.
          obj: Object, // An object to + * pass back to the handler.
          scope: Object // + * The object to use for the scope of the handler.
          }
          + * @type Object + * @default null + */ + this.setAttributeConfig("onclick", { + + value: oAttributes.onclick, + method: this._setOnClick + + }); + +}, + + +/** +* @method focus +* @description Causes the button to receive the focus and fires the button's +* "focus" event. +*/ +focus: function() { + + if(!this.get("disabled")) { + + this._button.focus(); + + } + +}, + + +/** +* @method blur +* @description Causes the button to lose focus and fires the button's +* "blur" event. +*/ +blur: function() { + + if(!this.get("disabled")) { + + this._button.blur(); + + } + +}, + + +/** +* @method hasFocus +* @description Returns a boolean indicating whether or not the button has focus. +* @return {Boolean} +*/ +hasFocus: function() { + + return (m_oFocusedButton == this); + +}, + + +/** +* @method isActive +* @description Returns a boolean indicating whether or not the button is active. +* @return {Boolean} +*/ +isActive: function() { + + return this.hasClass("active"); + +}, + + +/** +* @method getMenu +* @description Returns a reference to the button's menu. +* @return {YAHOO.widget.Menu} +*/ +getMenu: function() { + + return this._menu; + +}, + + +/** +* @method getForm +* @description Returns a reference to the button's parent form. +* @return {HTMLFormElement} +*/ +getForm: function() { + + return this._button.form; + +}, + + +/** +* @method getHiddenField +* @description Returns a reference to the <input> element +* used when the button's parent form is submitted. +* @return {HTMLInputElement} +*/ +getHiddenField: function() { + + return this._hiddenField; + +}, + + +/** +* @method destroy +* @description Removes the button's element from its parent element and +* removes all event handlers. +*/ +destroy: function() { + + + var oElement = this.get("element"), + oParentNode = oElement.parentNode, + oMenu = this._menu; + + if(oMenu) { + + + oMenu.destroy(); + + } + + + Event.purgeElement(oElement); + Event.purgeElement(this._button); + Event.removeListener(document, "mouseup", this._onDocumentMouseUp); + Event.removeListener(document, "keyup", this._onDocumentKeyUp); + Event.removeListener(document, "mousedown", this._onDocumentMouseDown); + + + var oForm = this.getForm(); + + if(oForm) { + + Event.removeListener(oForm, "reset", this._onFormReset); + Event.removeListener(oForm, "submit", this._onFormSubmit); + + } + + + oParentNode.removeChild(oElement); + + + delete m_oButtons[this.get("id")]; + + +}, + + +fireEvent: function(p_sType , p_aArgs) { + + // Disabled buttons should not respond to DOM events + + if(this.DOM_EVENTS[p_sType] && this.get("disabled")) { + + return; + + } + + YAHOO.widget.Button.superclass.fireEvent.call(this, p_sType, p_aArgs); + +}, + + +/** +* @method toString +* @description Returns a string representing the button. +* @return {String} +*/ +toString: function() { + + return ("Button " + this.get("id")); + +} + +}); + + +/** +* @method onFormKeyDown +* @description "keydown" event handler for the button's form. +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +YAHOO.widget.Button.onFormKeyDown = function(p_oEvent) { + + var oTarget = Event.getTarget(p_oEvent), + nCharCode = Event.getCharCode(p_oEvent); + + + if ( + nCharCode == 13 && + oTarget.tagName && + oTarget.tagName.toUpperCase() == "INPUT" + ) { + + var sType = oTarget.type; + + + if( + sType == "text" || sType == "password" || sType == "checkbox" || + sType == "radio" || sType == "file" + ) { + + + function isYUISubmitButton(p_oElement) { + + var sId = p_oElement.id; + + if (sId) { + + var oButton = m_oButtons[sId]; + + if (oButton) { + + var oSrcElement = oButton.get("srcelement"); + + return ( + oButton.get("type") == "submit" || + ( + oSrcElement && + oSrcElement.type == "submit" + ) + ); + + } + + } + + } + + + var aButtons = Dom.getElementsBy( + isYUISubmitButton, + this.TAG_NAME, + this.getForm() + ), + + nButtons = aButtons.length; + + + if (nButtons > 0) { + + m_oButtons[aButtons[0].id].submitForm(); + + } + + + } + + } + +}; + + +/** +* @method addHiddenFieldsToForm +* @description Searches the specified form and adds hidden fields for instances +* of YAHOO.widget.Button that are of type "radio," "checkbox," "menubutton," +* and "splitbutton." +* @param {HTMLFormElement} p_oForm Object reference +* for the form to search. +*/ +YAHOO.widget.Button.addHiddenFieldsToForm = function(p_oForm) { + + var aButtons = Dom.getElementsByClassName("yuibutton", "*", p_oForm), + nButtons = aButtons.length; + + + if(nButtons > 0) { + + + var oButton = null, + sType = null, + oMenuItem = null, + oMenu = null; + + for(var i=0; iElement.addListener for more +* information on listening for this event. +* @type YAHOO.util.CustomEvent +*/ + + +/** +* @event blur +* @description Fires when the menu item loses the input focus. Passes back a +* single object representing the original DOM event object passed back by the +* event utility (YAHOO.util.Event) when the event was fired. See Element.addListener for more +* information on listening for this event. +* @type YAHOO.util.CustomEvent +*/ + + +/** +* @event option +* @description Fires when the user invokes the button's option. Passes back a +* single object representing the original DOM event (either "mousedown" or +* "keydown") that caused the "option" event to fire. See Element.addListener for more +* information on listening for this event. +* @type YAHOO.util.CustomEvent +*/ + +})(); +(function() { + +// Shorthard for utilities + +var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Lang = YAHOO.lang, + Button = YAHOO.widget.Button; + + // Private collection of radio buttons + + m_oButtons = {}; + + + +/** +* The ButtonGroup class creates a set of buttons that are mutually exclusive; +* checking one button in the set will uncheck all others in the button group. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the button group. +* @param {HTMLDivElement} p_oElement Object +* specifying the <div> element of the button group. +* @param {Object} p_oElement Object literal specifying a set of +* configuration attributes used to create the button group. +* @param {Object} p_oAttributes Optional. Object literal specifying a set of +* configuration attributes used to create the button group. +* @namespace YAHOO.widget +* @class ButtonGroup +* @constructor +* @extends YAHOO.util.Element +*/ +YAHOO.widget.ButtonGroup = function(p_oElement, p_oAttributes) { + + var fnSuperClass = YAHOO.widget.ButtonGroup.superclass.constructor; + + if( + arguments.length == 1 && + !Lang.isString(p_oElement) && + !p_oElement.nodeName + ) { + + if(!p_oElement.id) { + + var sId = Dom.generateId(); + + p_oElement.id = sId; + + + } + + + + fnSuperClass.call(this, (this._createGroupElement()), p_oElement); + + } + else if(Lang.isString(p_oElement)) { + + var oElement = Dom.get(p_oElement); + + if (oElement) { + + if(oElement.nodeName.toUpperCase() == this.TAG_NAME) { + + + fnSuperClass.call(this, oElement, p_oAttributes); + + } + + } + + } + else { + + var sNodeName = p_oElement.nodeName; + + if(sNodeName && sNodeName == this.TAG_NAME) { + + if(!p_oElement.id) { + + p_oElement.id = Dom.generateId(); + + + } + + + fnSuperClass.call(this, p_oElement, p_oAttributes); + + } + + } + +}; + + +YAHOO.extend(YAHOO.widget.ButtonGroup, YAHOO.util.Element, { + + +// Protected properties + + +/** +* @property _buttons +* @description Array of buttons in the button group. +* @default null +* @protected +* @type Array +*/ +_buttons: null, + + + +// Constants + + +/** +* @property TAG_NAME +* @description The name of the tag to be used for the button group's element. +* @default "DIV" +* @final +* @type String +*/ +TAG_NAME: "DIV", + + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the +* button group's element. +* @default "yuibuttongroup" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuibuttongroup", + + + +// Protected methods + + +/** +* @method _createGroupElement +* @description Creates the button group's element. +* @protected +* @return {HTMLDivElement} +*/ +_createGroupElement: function() { + + var oElement = document.createElement(this.TAG_NAME); + + oElement.className = this.CSS_CLASS_NAME; + + return oElement; + +}, + + + +// Protected attribute setter methods + + +/** +* @method _setDisabled +* @description Sets the value of the button groups's "disabled" attribute. +* @protected +* @param {Boolean} p_bDisabled Boolean indicating the value for the button +* group's "disabled" attribute. +*/ +_setDisabled: function(p_bDisabled) { + + var nButtons = this.getCount(); + + if(nButtons > 0) { + + var i = nButtons - 1; + + do { + + this._buttons[i].set("disabled", p_bDisabled); + + } + while(i--); + + } + +}, + + + +// Protected event handlers + + +/** +* @method _onKeyDown +* @description "keydown" event handler for the button group. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onKeyDown: function(p_oEvent) { + + var oTarget = Event.getTarget(p_oEvent), + nCharCode = Event.getCharCode(p_oEvent), + sId = oTarget.parentNode.parentNode.id, + oButton = m_oButtons[sId], + nIndex = -1; + + + if(nCharCode == 37 || nCharCode == 38) { + + nIndex = (oButton.index === 0) ? + (this._buttons.length -1) : (oButton.index - 1); + + } + else if(nCharCode == 39 || nCharCode == 40) { + + nIndex = (oButton.index === (this._buttons.length - 1)) ? + 0 : (oButton.index + 1); + + } + + + if(nIndex > -1) { + + this.check(nIndex); + this.getButton(nIndex).focus(); + + } + +}, + + +/** +* @method _onAppendTo +* @description "appendTo" event handler for the button group. +* @protected +* @param {Event} p_oEvent Object representing the event that was fired. +*/ +_onAppendTo: function(p_oEvent) { + + var aButtons = this._buttons, + nButtons = aButtons.length; + + for(var i=0; iYAHOO.widget.Button} p_oButton +* Object representing the button that fired the event. +*/ +_onButtonCheckedChange: function(p_oEvent, p_oButton) { + + var bChecked = p_oEvent.newValue, + oCheckedButton = this.get("checkedButton"); + + if(bChecked && oCheckedButton != p_oButton) { + + if(oCheckedButton) { + + oCheckedButton.set("checked", false, true); + + } + + this.set("checkedButton", p_oButton); + this.set("value", p_oButton.get("value")); + + } + else if(oCheckedButton && !oCheckedButton.set("checked")) { + + oCheckedButton.set("checked", true, true); + + } + +}, + + + +// Public methods + + +/** +* @method init +* @description The ButtonGroup class's initialization method. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the button group. +* @param {HTMLDivElement} p_oElement Object +* specifying the <div> element of the button group. +* @param {Object} p_oElement Object literal specifying a set of configuration +* attributes used to create the button group. +* @param {Object} p_oAttributes Optional. Object literal specifying a set of +* configuration attributes used to create the button group. +*/ +init: function(p_oElement, p_oAttributes) { + + this._buttons = []; + + YAHOO.widget.ButtonGroup.superclass.init.call( + this, p_oElement, + p_oAttributes + ); + + + + var aButtons = this.getElementsByClassName("yuibutton"); + + + if(aButtons.length > 0) { + + + this.addButtons(aButtons); + + } + + + + function isRadioButton(p_oElement) { + + return (p_oElement.type == "radio"); + + } + + aButtons = Dom.getElementsBy(isRadioButton, "input", this.get("element")); + + + if(aButtons.length > 0) { + + + this.addButtons(aButtons); + + } + + this.on("keydown", this._onKeyDown); + this.on("appendTo", this._onAppendTo); + + var oContainer = this.get("container"); + + if(oContainer) { + + if(Lang.isString(oContainer)) { + + var me = this; + + Event.onContentReady(oContainer, function() { + + me.appendTo(this); + + }); + + } + else { + + this.appendTo(oContainer); + + } + + } + + + +}, + + +/** +* @method initAttributes +* @description Initializes all of the configuration attributes used to create +* the button group. +* @param {Object} p_oAttributes Object literal specifying a set of +* configuration attributes used to create the button group. +*/ +initAttributes: function(p_oAttributes) { + + var oAttributes = p_oAttributes || {}; + + YAHOO.widget.ButtonGroup.superclass.initAttributes.call( + this, + oAttributes + ); + + + /** + * @config name + * @description String specifying the name for the button group. This + * name will be applied to each button in the button group. + * @default null + * @type String + */ + this.setAttributeConfig("name", { + + value: oAttributes.name, + validator: Lang.isString + + }); + + + /** + * @config disabled + * @description Boolean indicating if the button group should be disabled. + * Disabling the button group will disable each button in the button group. + * Disabled buttons are dimmed and will not respond to user input + * or fire events. + * @default false + * @type Boolean + */ + this.setAttributeConfig("disabled", { + + value: (oAttributes.disabled || false), + validator: Lang.isBoolean, + method: this._setDisabled + + }); + + + /** + * @config value + * @description Object specifying the value for the button group. + * @default null + * @type Object + */ + this.setAttributeConfig("value", { + + value: oAttributes.value + + }); + + + /** + * @config container + * @description HTML element reference or string specifying the id + * attribute of the HTML element that the button group's markup should be + * rendered into. + * @type HTMLElement|String + * @default null + */ + this.setAttributeConfig("container", { + + value: oAttributes.container + + }); + + + /** + * @config checkedButton + * @description Reference for the button in the button group that + * is checked. + * @type {YAHOO.widget.Button} + * @default null + */ + this.setAttributeConfig("checkedButton", { + + value: null + + }); + +}, + + +/** +* @method addButton +* @description Adds the button to the button group. +* @param {YAHOO.widget.Button} p_oButton +* Object reference for the +* YAHOO.widget.Button instance to be added to the button group. +* @param {String} p_oButton String specifying the id attribute of the +* <input> or <span> element to be +* used to create the button to be added to the button group. +* @param {HTMLInputElement|HTMLElement} p_oButton Object reference for the +* <input> or <span> element to be +* used to create the button to be added to the button group. +* @param {Object} p_oButton Object literal specifying a set of +* YAHOO.widget.Button configuration +* attributes used to configure the button to be added to the button group. +* @return {YAHOO.widget.Button} +*/ +addButton: function(p_oButton) { + + var oButton; + + + if(p_oButton instanceof Button && p_oButton.get("type") == "radio") { + + oButton = p_oButton; + + } + else if(!Lang.isString(p_oButton) && !p_oButton.nodeName) { + + p_oButton.type = "radio"; + + oButton = new Button(p_oButton); + + } + else { + + oButton = new Button(p_oButton, { type: "radio" }); + + } + + + if(oButton) { + + var nIndex = this._buttons.length, + sButtonName = oButton.get("name"), + sGroupName = this.get("name"); + + oButton.index = nIndex; + + this._buttons[nIndex] = oButton; + m_oButtons[oButton.get("id")] = oButton; + + + if(sButtonName != sGroupName) { + + oButton.set("name", sGroupName); + + } + + + if(this.get("disabled")) { + + oButton.set("disabled", true); + + } + + + if(oButton.get("checked")) { + + this.set("checkedButton", oButton); + + } + + + oButton.on("checkedChange", this._onButtonCheckedChange, oButton, this); + + + return oButton; + + } + +}, + + +/** +* @method addButtons +* @description Adds the array of buttons to the button group. +* @param {Array} p_aButtons Array of +* YAHOO.widget.Button instances to be added +* to the button group. +* @param {Array} p_aButtons Array of strings specifying the id attribute of +* the <input> or <span> elements to +* be used to create the buttons to be added to the button group. +* @param {Array} p_aButtons Array of object references for the +* <input> or <span> elements to be +* used to create the buttons to be added to the button group. +* @param {Array} p_aButtons Array of object literals, each containing a set of +* YAHOO.widget.Button configuration +* attributes used to configure each button to be added to the button group. +* @return {Array} +*/ +addButtons: function(p_aButtons) { + + if(Lang.isArray(p_aButtons)) { + + var nButtons = p_aButtons.length, + oButton, + aButtons = []; + + if(nButtons > 0) { + + for(var i=0; i 0) { + + + return aButtons; + + } + + } + + } + +}, + + +/** +* @method removeButton +* @description Removes the button at the specified index from the button group. +* @param {Number} p_nIndex Number specifying the index of the button to be +* removed from the button group. +*/ +removeButton: function(p_nIndex) { + + var oButton = this.getButton(p_nIndex); + + if(oButton) { + + + this._buttons.splice(p_nIndex, 1); + delete m_oButtons[oButton.get("id")]; + + oButton.removeListener("checkedChange", this._onButtonCheckedChange); + oButton.destroy(); + + + var nButtons = this._buttons.length; + + if(nButtons > 0) { + + var i = this._buttons.length - 1; + + do { + + this._buttons[i].index = i; + + } + while(i--); + + } + + + } + +}, + + +/** +* @method getButton +* @description Returns the button at the specified index. +* @param {Number} p_nIndex The index of the button to retrieve from the +* button group. +* @return {YAHOO.widget.Button} +*/ +getButton: function(p_nIndex) { + + if(Lang.isNumber(p_nIndex)) { + + return this._buttons[p_nIndex]; + + } + +}, + + +/** +* @method getButtons +* @description Returns an array of the buttons in the button group. +* @return {Array} +*/ +getButtons: function() { + + return this._buttons; + +}, + + +/** +* @method getCount +* @description Returns the number of buttons in the button group. +* @return {Number} +*/ +getCount: function() { + + return this._buttons.length; + +}, + + +/** +* @method focus +* @description Sets focus to the button at the specified index. +* @param {Number} p_nIndex Number indicating the index of the button to focus. +*/ +focus: function(p_nIndex) { + + var oButton; + + if(Lang.isNumber(p_nIndex)) { + + oButton = this._buttons[p_nIndex]; + + if(oButton) { + + oButton.focus(); + + } + + } + else { + + var nButtons = this.getCount(); + + for(var i=0; i 0) { + + var i = this._buttons.length - 1; + + do { + + this._buttons[i].destroy(); + + } + while(i--); + + } + + + Event.purgeElement(oElement); + + + oParentNode.removeChild(oElement); + +}, + + +/** +* @method toString +* @description Returns a string representing the button group. +* @return {String} +*/ +toString: function() { + + return ("ButtonGroup " + this.get("id")); + +} + +}); + +})(); +YAHOO.register("button", YAHOO.widget.Button, {version: "2.2.2", build: "204"}); diff --git a/www/extras/yui/build/calendar/README b/www/extras/yui/build/calendar/README new file mode 100644 index 000000000..8f30538e2 --- /dev/null +++ b/www/extras/yui/build/calendar/README @@ -0,0 +1,100 @@ +Calendar Release Notes + +*** version 2.2.2 *** + + - Fixed problem with selected dates being shared across instances, when more than one Calendar/CalendarGroup was on the page + +*** version 2.2.1 *** + + - Fixed problem with selectCell adding duplicate selected date entries for dates which were already selected + - Fixed problem with CalendarGroup iframe shim not covering the CalendarGroup title area + - Removed javascript:void(null) from close button and cell links which was interrupting form submission and firing onbeforeunload in IE + - Fixed problem with CalendarGroup getSelectedDates returning invalid results, when used in conjunction with the "selected" Config property (either passed in the constructor config argument or set seperately after construction) + - Refactored Calendar and CalendarGroup to improve performance, especially when working with a large number of instances in IE6 + +*** version 2.2.0 *** + + - Image customization can now be done through CSS. Images for Close, Left and Right Arrows are now pulled in using CSS defined in calendar.css and by default use relative paths to the images in the same directory as calendar.css. + - Deprecated Calendar.IMG_ROOT and NAV_ARROW_LEFT, NAV_ARROW_RIGHT configuration properties. Customizations based on older releases which set these properties will still function as expected. + - Deprecated CalendarGroup.CSS_2UPCLOSE. Calendar's Style.CSS_CLOSE property now represents the new default CSS class (calclose) for the close button. CSS_2UPCLOSE is still applied along with CSS_CLOSE to the new markup for the close button to support existing customizations of the CSS_2UPCLOSE CSS class (close-icon) + - Fixed problem with Safari setting Calendar pages to incorrect dates if the pages spanned a year boundary in CalendarGroups with 3 or more pages, due to a bug in Safari's implementation of Date setMonth + - Fixed problem with CalendarGroup setMonth rendering Calendar pages with incorrect dates in all browsers if current pages spanned year boundary + - Fixed incorrect CalendarGroup logging statement in calendar-debug.js + - Fixed domEventMap support for Safari versions prior to 2.0.2, caused by hasOwnProperty not being supported + - Removed unused private property : _pageDate from Calendar class + +*** version 0.12.2 *** + + - Corrected documentation for clearTime function to reflect the change from midnight to noon + +*** version 0.12.1 *** + + - Calendar and CalendarGroup now automatically parse the argument passed to setMonth and setYear into an integer, eliminating potential concatenation bugs. + +*** 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..9c762691e --- /dev/null +++ b/www/extras/yui/build/calendar/assets/calendar.css @@ -0,0 +1,197 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +.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; +} + +.yui-calcontainer .calclose { + background: url("calx.gif") no-repeat; + width:17px; + height:13px; + cursor:pointer; +} + +/* 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; + cursor:pointer; + top:2px; + bottom:0; + width:9px; + height:12px; + left:2px; + z-index:1; + background: url("callt.gif") no-repeat; +} + +.yui-calendar .calnavright { + position:absolute; + cursor:pointer; + top:2px; + bottom:0; + width:9px; + height:12px; + right:2px; + z-index:1; + background: url("calrt.gif") no-repeat; +} + +.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 .calbody 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..5be3b0340 --- /dev/null +++ b/www/extras/yui/build/calendar/calendar-debug.js @@ -0,0 +1,4570 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +/** +* 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. +* @namespace YAHOO.util +* @class Config +* @constructor +* @param {Object} owner The owner Object to which this Config Object belongs +*/ +YAHOO.util.Config = function(owner) { + if (owner) { + this.init(owner); + } + if (!owner) { YAHOO.log("No owner specified for Config object", "error"); } +}; + +/** + * Constant representing the CustomEvent type for the config changed event. + * @property YAHOO.util.Config.CONFIG_CHANGED_EVENT + * @private + * @static + * @final + */ +YAHOO.util.Config.CONFIG_CHANGED_EVENT = "configChanged"; + +/** + * Constant representing the boolean type string + * @property YAHOO.util.Config.BOOLEAN_TYPE + * @private + * @static + * @final + */ +YAHOO.util.Config.BOOLEAN_TYPE = "boolean"; + +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, + + /** + * Maintains the local collection of configuration property objects and their specified values + * @property config + * @private + * @type Object + */ + config : null, + + /** + * 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 + */ + initialConfig : null, + + /** + * Maintains the local, normalized CustomEvent queue + * @property eventQueue + * @private + * @type Object + */ + eventQueue : null, + + /** + * Custom Event, notifying subscribers when Config properties are set (setProperty is called without the silent flag + * @event configChangedEvent + */ + configChangedEvent : null, + + /** + * 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) { + return (typeof val == YAHOO.util.Config.BOOLEAN_TYPE); + }, + + /** + * 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) { + return (!isNaN(val)); + }, + + /** + * 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 + */ + fireEvent : function( key, value ) { + YAHOO.log("Firing Config event: " + key + "=" + value, "info"); + var property = this.config[key]; + + if (property && property.event) { + property.event.fire(value); + } + }, + + /** + * 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 + */ + addProperty : function( key, propertyObject ) { + key = key.toLowerCase(); + YAHOO.log("Added property: " + key, "info"); + + this.config[key] = propertyObject; + + propertyObject.event = new YAHOO.util.CustomEvent(key, this.owner); + propertyObject.key = key; + + if (propertyObject.handler) { + propertyObject.event.subscribe(propertyObject.handler, this.owner); + } + + 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 + */ + getConfig : function() { + var cfg = {}; + + for (var prop in this.config) { + var property = this.config[prop]; + if (property && 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 + */ + getProperty : function(key) { + var property = this.config[key.toLowerCase()]; + if (property && 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 + */ + resetProperty : function(key) { + key = key.toLowerCase(); + + var property = this.config[key]; + if (property && property.event) { + if (this.initialConfig[key] && !YAHOO.lang.isUndefined(this.initialConfig[key])) { + this.setProperty(key, this.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. + */ + 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 = this.config[key]; + if (property && property.event) { + if (property.validator && ! property.validator(value)) { // validator + return false; + } else { + property.value = value; + if (! silent) { + this.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. + */ + queueProperty : function(key, value) { + key = key.toLowerCase(); + YAHOO.log("queueProperty: " + key + "=" + value, "info"); + + var property = this.config[key]; + + if (property && property.event) { + if (!YAHOO.lang.isUndefined(value) && property.validator && ! property.validator(value)) { // validator + return false; + } else { + + if (!YAHOO.lang.isUndefined(value)) { + property.value = value; + } else { + value = property.value; + } + + var foundDuplicate = false; + var iLen = this.eventQueue.length; + for (var i=0; i < iLen; i++) { + var queueItem = this.eventQueue[i]; + + if (queueItem) { + var queueItemKey = queueItem[0]; + var queueItemValue = queueItem[1]; + + if (queueItemKey == key) { + // found a dupe... push to end of queue, null current item, and break + this.eventQueue[i] = null; + this.eventQueue.push([key, (!YAHOO.lang.isUndefined(value) ? value : queueItemValue)]); + foundDuplicate = true; + break; + } + } + } + + if (! foundDuplicate && !YAHOO.lang.isUndefined(value)) { // this is a refire, or a new property in the queue + this.eventQueue.push([key, value]); + } + } + + if (property.supercedes) { + var sLen = property.supercedes.length; + for (var s=0; s < sLen; s++) { + var supercedesCheck = property.supercedes[s]; + var qLen = this.eventQueue.length; + for (var q=0; q < qLen; q++) { + var queueItemCheck = this.eventQueue[q]; + + if (queueItemCheck) { + var queueItemCheckKey = queueItemCheck[0]; + var queueItemCheckValue = queueItemCheck[1]; + + if ( queueItemCheckKey == supercedesCheck.toLowerCase() ) { + this.eventQueue.push([queueItemCheckKey, queueItemCheckValue]); + this.eventQueue[q] = null; + break; + } + } + } + } + } + YAHOO.log("Config event queue: " + this.outputEventQueue(), "info"); + + 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 + */ + refireEvent : function(key) { + key = key.toLowerCase(); + + var property = this.config[key]; + if (property && property.event && !YAHOO.lang.isUndefined(property.value)) { + if (this.queueInProgress) { + this.queueProperty(key); + } else { + this.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. + */ + applyConfig : function(userConfig, init) { + if (init) { + this.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 + */ + refresh : function() { + for (var prop in this.config) { + this.refireEvent(prop); + } + }, + + /** + * Fires the normalized list of queued property change events + * @method fireQueue + */ + fireQueue : function() { + this.queueInProgress = true; + 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 12 noon. + * @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 +* @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 +* @deprecated You can now customize images by overriding the calclose, calnavleft and calnavright default CSS classes for the close icon, left arrow and right arrow respectively +* @type String +*/ +YAHOO.widget.Calendar.IMG_ROOT = null; + +/** +* 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"; + +/** +* Constant used to represent short date field string formats (e.g. Tu or Feb) +* @property YAHOO.widget.Calendar.SHORT +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.SHORT = "short"; + +/** +* Constant used to represent long date field string formats (e.g. Monday or February) +* @property YAHOO.widget.Calendar.LONG +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.LONG = "long"; + +/** +* Constant used to represent medium date field string formats (e.g. Mon) +* @property YAHOO.widget.Calendar.MEDIUM +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.MEDIUM = "medium"; + +/** +* Constant used to represent single character date field string formats (e.g. M, T, W) +* @property YAHOO.widget.Calendar.ONE_CHAR +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.ONE_CHAR = "1char"; + +/** +* The set of default Config property keys and values for the Calendar +* @property YAHOO.widget.Calendar._DEFAULT_CONFIG +* @final +* @static +* @private +* @type Object +*/ +YAHOO.widget.Calendar._DEFAULT_CONFIG = { + // Default values for pagedate and selected are not class level constants - they are set during instance creation + PAGEDATE : {key:"pagedate", value:null}, + SELECTED : {key:"selected", value:null}, + TITLE : {key:"title", value:""}, + CLOSE : {key:"close", value:false}, + IFRAME : {key:"iframe", value:true}, + MINDATE : {key:"mindate", value:null}, + MAXDATE : {key:"maxdate", value:null}, + MULTI_SELECT : {key:"multi_select", value:false}, + START_WEEKDAY : {key:"start_weekday", value:0}, + SHOW_WEEKDAYS : {key:"show_weekdays", value:true}, + SHOW_WEEK_HEADER : {key:"show_week_header", value:false}, + SHOW_WEEK_FOOTER : {key:"show_week_footer", value:false}, + HIDE_BLANK_WEEKS : {key:"hide_blank_weeks", value:false}, + NAV_ARROW_LEFT: {key:"nav_arrow_left", value:null} , + NAV_ARROW_RIGHT : {key:"nav_arrow_right", value:null} , + MONTHS_SHORT : {key:"months_short", value:["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]}, + MONTHS_LONG: {key:"months_long", value:["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]}, + WEEKDAYS_1CHAR: {key:"weekdays_1char", value:["S", "M", "T", "W", "T", "F", "S"]}, + WEEKDAYS_SHORT: {key:"weekdays_short", value:["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]}, + WEEKDAYS_MEDIUM: {key:"weekdays_medium", value:["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]}, + WEEKDAYS_LONG: {key:"weekdays_long", value:["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]}, + LOCALE_MONTHS:{key:"locale_months", value:"long"}, + LOCALE_WEEKDAYS:{key:"locale_weekdays", value:"short"}, + DATE_DELIMITER:{key:"date_delimiter", value:","}, + DATE_FIELD_DELIMITER:{key:"date_field_delimiter", value:"/"}, + DATE_RANGE_DELIMITER:{key:"date_range_delimiter", value:"-"}, + MY_MONTH_POSITION:{key:"my_month_position", value:1}, + MY_YEAR_POSITION:{key:"my_year_position", value:2}, + MD_MONTH_POSITION:{key:"md_month_position", value:1}, + MD_DAY_POSITION:{key:"md_day_position", value:2}, + MDY_MONTH_POSITION:{key:"mdy_month_position", value:1}, + MDY_DAY_POSITION:{key:"mdy_day_position", value:2}, + MDY_YEAR_POSITION:{key:"mdy_year_position", value:3} +}; + +/** +* The set of Custom Event types supported by the Calendar +* @property YAHOO.widget.Calendar._EVENT_TYPES +* @final +* @static +* @private +* @type Object +*/ +YAHOO.widget.Calendar._EVENT_TYPES = { + BEFORE_SELECT : "beforeSelect", + SELECT : "select", + BEFORE_DESELECT : "beforeDeselect", + DESELECT : "deselect", + CHANGE_PAGE : "changePage", + BEFORE_RENDER : "beforeRender", + RENDER : "render", + RESET : "reset", + CLEAR : "clear" +}; + +/** +* The set of default style constants for the Calendar +* @property YAHOO.widget.Calendar._STYLES +* @final +* @static +* @private +* @type Object +*/ +YAHOO.widget.Calendar._STYLES = { + CSS_ROW_HEADER: "calrowhead", + CSS_ROW_FOOTER: "calrowfoot", + CSS_CELL : "calcell", + CSS_CELL_SELECTOR : "selector", + CSS_CELL_SELECTED : "selected", + CSS_CELL_SELECTABLE : "selectable", + CSS_CELL_RESTRICTED : "restricted", + CSS_CELL_TODAY : "today", + CSS_CELL_OOM : "oom", + CSS_CELL_OOB : "previous", + CSS_HEADER : "calheader", + CSS_HEADER_TEXT : "calhead", + CSS_BODY : "calbody", + CSS_WEEKDAY_CELL : "calweekdaycell", + CSS_WEEKDAY_ROW : "calweekdayrow", + CSS_FOOTER : "calfoot", + CSS_CALENDAR : "yui-calendar", + CSS_SINGLE : "single", + CSS_CONTAINER : "yui-calcontainer", + CSS_NAV_LEFT : "calnavleft", + CSS_NAV_RIGHT : "calnavright", + CSS_CLOSE : "calclose", + CSS_CELL_TOP : "calcelltop", + CSS_CELL_LEFT : "calcellleft", + CSS_CELL_RIGHT : "calcellright", + CSS_CELL_BOTTOM : "calcellbottom", + CSS_CELL_HOVER : "calcellhover", + CSS_CELL_HIGHLIGHT1 : "highlight1", + CSS_CELL_HIGHLIGHT2 : "highlight2", + CSS_CELL_HIGHLIGHT3 : "highlight3", + CSS_CELL_HIGHLIGHT4 : "highlight4" +}; + +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, + + /** + * 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 (!this.parent) { + 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(YAHOO.widget.Calendar._DEFAULT_CONFIG.CLOSE.key); + + 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(YAHOO.widget.Calendar._DEFAULT_CONFIG.TITLE.key); + + var DEPR_CLOSE_PATH = "us/my/bn/x_d.gif"; + + var linkClose; + + if (close === true) { + linkClose = YAHOO.util.Dom.getElementsByClassName("link-close", "a", this.oDomContainer)[0] || document.createElement("a"); + linkClose.href = "#"; + linkClose.className = "link-close"; + YAHOO.util.Event.addListener(linkClose, "click", function(e, cal) {cal.hide(); YAHOO.util.Event.preventDefault(e); }, this); + + if (YAHOO.widget.Calendar.IMG_ROOT !== null) { + var imgClose = document.createElement("img"); + imgClose.src = YAHOO.widget.Calendar.IMG_ROOT + DEPR_CLOSE_PATH; + imgClose.className = YAHOO.widget.CalendarGroup.CSS_2UPCLOSE; + linkClose.appendChild(imgClose); + } else { + linkClose.innerHTML = ''; + } + + 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() { + + var defEvents = YAHOO.widget.Calendar._EVENT_TYPES; + + /** + * Fired before a selection is made + * @event beforeSelectEvent + */ + this.beforeSelectEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_SELECT); + + /** + * 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(defEvents.SELECT); + + /** + * Fired before a selection is made + * @event beforeDeselectEvent + */ + this.beforeDeselectEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_DESELECT); + + /** + * 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(defEvents.DESELECT); + + /** + * Fired when the Calendar page is changed + * @event changePageEvent + */ + this.changePageEvent = new YAHOO.util.CustomEvent(defEvents.CHANGE_PAGE); + + /** + * Fired before the Calendar is rendered + * @event beforeRenderEvent + */ + this.beforeRenderEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_RENDER); + + /** + * Fired when the Calendar is rendered + * @event renderEvent + */ + this.renderEvent = new YAHOO.util.CustomEvent(defEvents.RENDER); + + /** + * Fired when the Calendar is reset + * @event resetEvent + */ + this.resetEvent = new YAHOO.util.CustomEvent(defEvents.RESET); + + /** + * Fired when the Calendar is cleared + * @event clearEvent + */ + this.clearEvent = new YAHOO.util.CustomEvent(defEvents.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 cell,index,d,date; + + var target = YAHOO.util.Event.getTarget(e); + var tagName = target.tagName.toLowerCase(); + var defSelector = false; + + while (tagName != "td" && ! YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) { + + if (!defSelector && tagName == "a" && YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTOR)) { + defSelector = true; + } + + target = target.parentNode; + tagName = target.tagName.toLowerCase(); + if (tagName == "html") { + return; + } + } + + if (defSelector) { + // Stop link href navigation for default renderer + YAHOO.util.Event.preventDefault(e); + } + + 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; + + 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() { + + var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; + + /** + * The month/year representing the current visible Calendar date (mm/yyyy) + * @config pagedate + * @type String + * @default today's date + */ + this.cfg.addProperty(defCfg.PAGEDATE.key, { 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(defCfg.SELECTED.key, { value:[], handler:this.configSelected } ); + + /** + * The title to display above the Calendar's month header + * @config title + * @type String + * @default "" + */ + this.cfg.addProperty(defCfg.TITLE.key, { value:defCfg.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(defCfg.CLOSE.key, { value:defCfg.CLOSE.value, 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(defCfg.IFRAME.key, { value:defCfg.IFRAME.value, 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(defCfg.MINDATE.key, { value:defCfg.MINDATE.value, handler:this.configMinDate } ); + + /** + * The maximum selectable date in the current Calendar (mm/dd/yyyy) + * @config maxdate + * @type String + * @default null + */ + this.cfg.addProperty(defCfg.MAXDATE.key, { value:defCfg.MAXDATE.value, 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(defCfg.MULTI_SELECT.key, { value:defCfg.MULTI_SELECT.value, 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(defCfg.START_WEEKDAY.key, { value:defCfg.START_WEEKDAY.value, 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(defCfg.SHOW_WEEKDAYS.key, { value:defCfg.SHOW_WEEKDAYS.value, 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(defCfg.SHOW_WEEK_HEADER.key, { value:defCfg.SHOW_WEEK_HEADER.value, 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(defCfg.SHOW_WEEK_FOOTER.key,{ value:defCfg.SHOW_WEEK_FOOTER.value, 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(defCfg.HIDE_BLANK_WEEKS.key, { value:defCfg.HIDE_BLANK_WEEKS.value, handler:this.configOptions, validator:this.cfg.checkBoolean } ); + + /** + * The image that should be used for the left navigation arrow. + * @config NAV_ARROW_LEFT + * @type String + * @deprecated You can customize the image by overriding the default CSS class for the left arrow - "calnavleft" + * @default null + */ + this.cfg.addProperty(defCfg.NAV_ARROW_LEFT.key, { value:defCfg.NAV_ARROW_LEFT.value, handler:this.configOptions } ); + + /** + * The image that should be used for the right navigation arrow. + * @config NAV_ARROW_RIGHT + * @type String + * @deprecated You can customize the image by overriding the default CSS class for the right arrow - "calnavright" + * @default null + */ + this.cfg.addProperty(defCfg.NAV_ARROW_RIGHT.key, { value:defCfg.NAV_ARROW_RIGHT.value, 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(defCfg.MONTHS_SHORT.key, { value:defCfg.MONTHS_SHORT.value, 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(defCfg.MONTHS_LONG.key, { value:defCfg.MONTHS_LONG.value, 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(defCfg.WEEKDAYS_1CHAR.key, { value:defCfg.WEEKDAYS_1CHAR.value, 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(defCfg.WEEKDAYS_SHORT.key, { value:defCfg.WEEKDAYS_SHORT.value, 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(defCfg.WEEKDAYS_MEDIUM.key, { value:defCfg.WEEKDAYS_MEDIUM.value, 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(defCfg.WEEKDAYS_LONG.key, { value:defCfg.WEEKDAYS_LONG.value, handler:this.configLocale } ); + + /** + * Refreshes the locale values used to build the Calendar. + * @method refreshLocale + * @private + */ + var refreshLocale = function() { + this.cfg.refireEvent(defCfg.LOCALE_MONTHS.key); + this.cfg.refireEvent(defCfg.LOCALE_WEEKDAYS.key); + }; + + this.cfg.subscribeToConfigEvent(defCfg.START_WEEKDAY.key, refreshLocale, this, true); + this.cfg.subscribeToConfigEvent(defCfg.MONTHS_SHORT.key, refreshLocale, this, true); + this.cfg.subscribeToConfigEvent(defCfg.MONTHS_LONG.key, refreshLocale, this, true); + this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_1CHAR.key, refreshLocale, this, true); + this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_SHORT.key, refreshLocale, this, true); + this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_MEDIUM.key, refreshLocale, this, true); + this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_LONG.key, 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(defCfg.LOCALE_MONTHS.key, { value:defCfg.LOCALE_MONTHS.value, 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(defCfg.LOCALE_WEEKDAYS.key, { value:defCfg.LOCALE_WEEKDAYS.value, 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(defCfg.DATE_DELIMITER.key, { value:defCfg.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(defCfg.DATE_FIELD_DELIMITER.key, { value:defCfg.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(defCfg.DATE_RANGE_DELIMITER.key, { value:defCfg.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(defCfg.MY_MONTH_POSITION.key, { value:defCfg.MY_MONTH_POSITION.value, 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(defCfg.MY_YEAR_POSITION.key, { value:defCfg.MY_YEAR_POSITION.value, 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(defCfg.MD_MONTH_POSITION.key, { value:defCfg.MD_MONTH_POSITION.value, 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(defCfg.MD_DAY_POSITION.key, { value:defCfg.MD_DAY_POSITION.value, 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(defCfg.MDY_MONTH_POSITION.key, { value:defCfg.MDY_MONTH_POSITION.value, 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(defCfg.MDY_DAY_POSITION.key, { value:defCfg.MDY_DAY_POSITION.value, 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(defCfg.MDY_YEAR_POSITION.key, { value:defCfg.MDY_YEAR_POSITION.value, 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) { + this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key, this._parsePageDate(args[0]), true); +}; + +/** +* The default handler for the "mindate" property +* @method configMinDate +*/ +YAHOO.widget.Calendar.prototype.configMinDate = function(type, args, obj) { + var val = args[0]; + if (YAHOO.lang.isString(val)) { + val = this._parseDate(val); + this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.MINDATE.key, 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 (YAHOO.lang.isString(val)) { + val = this._parseDate(val); + this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.MAXDATE.key, 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]; + var cfgSelected = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key; + + if (selected) { + if (YAHOO.lang.isString(selected)) { + this.cfg.setProperty(cfgSelected, this._parseDates(selected), true); + } + } + if (! this._selectedDates) { + this._selectedDates = this.cfg.getProperty(cfgSelected); + } +}; + +/** +* The default handler for all configuration options properties +* @method configOptions +*/ +YAHOO.widget.Calendar.prototype.configOptions = function(type, args, obj) { + this.Options[type.toUpperCase()] = args[0]; +}; + +/** +* The default handler for all configuration locale properties +* @method configLocale +*/ +YAHOO.widget.Calendar.prototype.configLocale = function(type, args, obj) { + var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; + this.Locale[type.toUpperCase()] = args[0]; + + this.cfg.refireEvent(defCfg.LOCALE_MONTHS.key); + this.cfg.refireEvent(defCfg.LOCALE_WEEKDAYS.key); +}; + +/** +* The default handler for all configuration locale field length properties +* @method configLocaleValues +*/ +YAHOO.widget.Calendar.prototype.configLocaleValues = function(type, args, obj) { + var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; + + type = type.toLowerCase(); + var val = args[0]; + + switch (type) { + case defCfg.LOCALE_MONTHS.key: + switch (val) { + case YAHOO.widget.Calendar.SHORT: + this.Locale.LOCALE_MONTHS = this.cfg.getProperty(defCfg.MONTHS_SHORT.key).concat(); + break; + case YAHOO.widget.Calendar.LONG: + this.Locale.LOCALE_MONTHS = this.cfg.getProperty(defCfg.MONTHS_LONG.key).concat(); + break; + } + break; + case defCfg.LOCALE_WEEKDAYS.key: + switch (val) { + case YAHOO.widget.Calendar.ONE_CHAR: + this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_1CHAR.key).concat(); + break; + case YAHOO.widget.Calendar.SHORT: + this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_SHORT.key).concat(); + break; + case YAHOO.widget.Calendar.MEDIUM: + this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_MEDIUM.key).concat(); + break; + case YAHOO.widget.Calendar.LONG: + this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_LONG.key).concat(); + break; + } + + var START_WEEKDAY = this.cfg.getProperty(defCfg.START_WEEKDAY.key); + + 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) { + var leftArrow = this.cfg.getProperty(defCfg.NAV_ARROW_LEFT.key); + // Check for deprecated customization - If someone set IMG_ROOT, but didn't set NAV_ARROW_LEFT, then set NAV_ARROW_LEFT to the old deprecated value + if (leftArrow === null && YAHOO.widget.Calendar.IMG_ROOT !== null) { + leftArrow = YAHOO.widget.Calendar.IMG_ROOT + DEPR_NAV_LEFT; + } + var leftStyle = (leftArrow === null) ? "" : ' style="background-image:url(' + leftArrow + ')"'; + html[html.length] = ' '; + } + + html[html.length] = this.buildMonthLabel(); + + if (renderRight) { + var rightArrow = this.cfg.getProperty(defCfg.NAV_ARROW_RIGHT.key); + if (rightArrow === null && YAHOO.widget.Calendar.IMG_ROOT !== null) { + rightArrow = YAHOO.widget.Calendar.IMG_ROOT + DEPR_NAV_RIGHT; + } + var rightStyle = (rightArrow === null) ? "" : ' style="background-image:url(' + rightArrow + ')"'; + html[html.length] = ' '; + } + + html[html.length] = '
          \n\n'; + + if (this.cfg.getProperty(defCfg.SHOW_WEEKDAYS.key)) { + 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) { + + var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; + + html[html.length] = ''; + + if (this.cfg.getProperty(defCfg.SHOW_WEEK_HEADER.key)) { + html[html.length] = ' '; + } + + for(var i=0;i'; + } + + if (this.cfg.getProperty(defCfg.SHOW_WEEK_FOOTER.key)) { + 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 defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; + + var startDay = this.cfg.getProperty(defCfg.START_WEEKDAY.key); + + 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 weekNum,weekClass; + var weekPrefix = "w"; + var cellPrefix = "_cell"; + var workingDayPrefix = "wd"; + var dayPrefix = "d"; + + var cellRenderers; + var renderer; + + var todayYear = this.today.getFullYear(); + var todayMonth = this.today.getMonth(); + var todayDate = this.today.getDate(); + + var useDate = this.cfg.getProperty(defCfg.PAGEDATE.key); + var hideBlankWeeks = this.cfg.getProperty(defCfg.HIDE_BLANK_WEEKS.key); + var showWeekFooter = this.cfg.getProperty(defCfg.SHOW_WEEK_FOOTER.key); + var showWeekHeader = this.cfg.getProperty(defCfg.SHOW_WEEK_HEADER.key); + var mindate = this.cfg.getProperty(defCfg.MINDATE.key); + var maxdate = this.cfg.getProperty(defCfg.MAXDATE.key); + + if (mindate) { + mindate = YAHOO.widget.DateMath.clearTime(mindate); + } + if (maxdate) { + maxdate = YAHOO.widget.DateMath.clearTime(maxdate); + } + + 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 = weekPrefix + weekNum; + + // Local OOM check for performance, since we already have pagedate + if (r !== 0 && hideBlankWeeks === true && workingDate.getMonth() != useDate.getMonth()) { + break; + } else { + + html[html.length] = ''; + + if (showWeekHeader) { html = this.renderRowHeader(weekNum, html); } + + for (var d=0;d<7;d++){ // Render actual days + + cellRenderers = []; + renderer = null; + + this.clearElement(cell); + cell.className = this.Style.CSS_CELL; + cell.id = this.id + cellPrefix + i; + this.logger.log("Rendering cell " + cell.id + " (" + workingDate.getFullYear() + "-" + (workingDate.getMonth()+1) + "-" + workingDate.getDate() + ")", "cellrender"); + + if (workingDate.getDate() == todayDate && + workingDate.getMonth() == todayMonth && + workingDate.getFullYear() == todayYear) { + cellRenderers[cellRenderers.length]=cal.renderCellStyleToday; + } + + var workingArray = [workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()]; + this.cellDates[this.cellDates.length] = workingArray; // Add this date to cellDates + + // Local OOM check for performance, since we already have pagedate + if (workingDate.getMonth() != useDate.getMonth()) { + cellRenderers[cellRenderers.length]=cal.renderCellNotThisMonth; + } else { + YAHOO.util.Dom.addClass(cell, workingDayPrefix + workingDate.getDay()); + YAHOO.util.Dom.addClass(cell, dayPrefix + 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(workingArray) > -1) { + cellRenderers[cellRenderers.length]=cal.renderCellStyleSelected; + } + + 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) { + this.logger.log("renderer[" + x + "] for (" + workingDate.getFullYear() + "-" + (workingDate.getMonth()+1) + "-" + workingDate.getDate() + ")", "cellrender"); + if (cellRenderers[x].call(cal, 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 (hideBlankWeeks && postDays >= 7) { + 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 (showWeekFooter) { 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(); + + var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; + + // Find starting day of the current month + var workingDate = YAHOO.widget.DateMath.findMonthStart(this.cfg.getProperty(defCfg.PAGEDATE.key)); + + 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(defCfg.TITLE.key); + this.cfg.refireEvent(defCfg.CLOSE.key); + this.cfg.refireEvent(defCfg.IFRAME.key); + + 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 anchor = "a"; + var mousedown = "mousedown"; + + var linkLeft = YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_LEFT, anchor, root); + var linkRight = YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_RIGHT, anchor, root); + + if (linkLeft && linkLeft.length > 0) { + this.linkLeft = linkLeft[0]; + YAHOO.util.Event.addListener(this.linkLeft, mousedown, cal.previousMonth, cal, true); + } + + if (linkRight && linkRight.length > 0) { + 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 (YAHOO.lang.hasOwnProperty(this.domEventMap, 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) { + var cfgPageDate = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key; + this.cfg.setProperty(cfgPageDate, YAHOO.widget.DateMath.add(this.cfg.getProperty(cfgPageDate), 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) { + var cfgPageDate = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key; + this.cfg.setProperty(cfgPageDate, YAHOO.widget.DateMath.subtract(this.cfg.getProperty(cfgPageDate), 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) { + var cfgPageDate = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key; + this.cfg.setProperty(cfgPageDate, YAHOO.widget.DateMath.add(this.cfg.getProperty(cfgPageDate), 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) { + var cfgPageDate = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key; + this.cfg.setProperty(cfgPageDate, YAHOO.widget.DateMath.subtract(this.cfg.getProperty(cfgPageDate), 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() { + var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; + this.cfg.resetProperty(defCfg.SELECTED.key); + this.cfg.resetProperty(defCfg.PAGEDATE.key); + 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() { + var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; + this.cfg.setProperty(defCfg.SELECTED.key, []); + this.cfg.setProperty(defCfg.PAGEDATE.key, 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 cfgSelected = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key; + + var selected = this.cfg.getProperty(cfgSelected); + var aToBeSelected = this._toFieldArray(date); + this.logger.log("Selection field array: " + aToBeSelected, "info"); + + for (var a=0;a -1) { + if (this.cfg.getProperty(defCfg.PAGEDATE.key).getMonth() == dCellDate.getMonth() && + this.cfg.getProperty(defCfg.PAGEDATE.key).getFullYear() == dCellDate.getFullYear()) { + YAHOO.util.Dom.removeClass(cell, this.Style.CSS_CELL_SELECTED); + } + + selected.splice(cellDateIndex, 1); + } + + if (this.parent) { + this.parent.cfg.setProperty(defCfg.SELECTED.key, selected); + } else { + this.cfg.setProperty(defCfg.SELECTED.key, 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 cfgSelected = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key; + + var selected = this.cfg.getProperty(cfgSelected); + var count = selected.length; + var sel = selected.concat(); + + if (this.parent) { + this.parent.cfg.setProperty(cfgSelected, []); + } else { + this.cfg.setProperty(cfgSelected, []); + } + + 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 (YAHOO.lang.isString(date)) { + returnDate = this._parseDates(date); + } else if (YAHOO.lang.isArray(date)) { + 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 " + this.pages.length + "-page CalendarGroup", "info"); +}; + + +YAHOO.widget.CalendarGroup.prototype.setupConfig = function() { + + var defCfg = YAHOO.widget.CalendarGroup._DEFAULT_CONFIG; + + /** + * 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(defCfg.PAGES.key, { value:defCfg.PAGES.value, 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(defCfg.PAGEDATE.key, { 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(defCfg.SELECTED.key, { value:[], handler:this.configSelected } ); + + /** + * The title to display above the CalendarGroup's month header + * @config title + * @type String + * @default "" + */ + this.cfg.addProperty(defCfg.TITLE.key, { value:defCfg.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(defCfg.CLOSE.key, { value:defCfg.CLOSE.value, 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(defCfg.IFRAME.key, { value:defCfg.IFRAME.value, 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(defCfg.MINDATE.key, { value:defCfg.MINDATE.value, handler:this.delegateConfig } ); + + /** + * The maximum selectable date in the current Calendar (mm/dd/yyyy) + * @config maxdate + * @type String + * @default null + */ + this.cfg.addProperty(defCfg.MAXDATE.key, { value:defCfg.MAXDATE.value, 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(defCfg.MULTI_SELECT.key, { value:defCfg.MULTI_SELECT.value, 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(defCfg.START_WEEKDAY.key, { value:defCfg.START_WEEKDAY.value, 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(defCfg.SHOW_WEEKDAYS.key, { value:defCfg.SHOW_WEEKDAYS.value, 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(defCfg.SHOW_WEEK_HEADER.key,{ value:defCfg.SHOW_WEEK_HEADER.value, 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(defCfg.SHOW_WEEK_FOOTER.key,{ value:defCfg.SHOW_WEEK_FOOTER.value, 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(defCfg.HIDE_BLANK_WEEKS.key,{ value:defCfg.HIDE_BLANK_WEEKS.value, handler:this.delegateConfig, validator:this.cfg.checkBoolean } ); + + /** + * The image that should be used for the left navigation arrow. + * @config NAV_ARROW_LEFT + * @type String + * @deprecated You can customize the image by overriding the default CSS class for the left arrow - "calnavleft" + * @default null + */ + this.cfg.addProperty(defCfg.NAV_ARROW_LEFT.key, { value:defCfg.NAV_ARROW_LEFT.value, handler:this.delegateConfig } ); + + /** + * The image that should be used for the right navigation arrow. + * @config NAV_ARROW_RIGHT + * @type String + * @deprecated You can customize the image by overriding the default CSS class for the right arrow - "calnavright" + * @default null + */ + this.cfg.addProperty(defCfg.NAV_ARROW_RIGHT.key, { value:defCfg.NAV_ARROW_RIGHT.value, 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(defCfg.MONTHS_SHORT.key, { value:defCfg.MONTHS_SHORT.value, 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(defCfg.MONTHS_LONG.key, { value:defCfg.MONTHS_LONG.value, 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(defCfg.WEEKDAYS_1CHAR.key, { value:defCfg.WEEKDAYS_1CHAR.value, 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(defCfg.WEEKDAYS_SHORT.key, { value:defCfg.WEEKDAYS_SHORT.value, 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(defCfg.WEEKDAYS_MEDIUM.key, { value:defCfg.WEEKDAYS_MEDIUM.value, 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(defCfg.WEEKDAYS_LONG.key, { value:defCfg.WEEKDAYS_LONG.value, 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(defCfg.LOCALE_MONTHS.key, { value:defCfg.LOCALE_MONTHS.value, 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(defCfg.LOCALE_WEEKDAYS.key, { value:defCfg.LOCALE_WEEKDAYS.value, 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(defCfg.DATE_DELIMITER.key, { value:defCfg.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(defCfg.DATE_FIELD_DELIMITER.key,{ value:defCfg.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(defCfg.DATE_RANGE_DELIMITER.key,{ value:defCfg.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(defCfg.MY_MONTH_POSITION.key, { value:defCfg.MY_MONTH_POSITION.value, 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(defCfg.MY_YEAR_POSITION.key, { value:defCfg.MY_YEAR_POSITION.value, 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(defCfg.MD_MONTH_POSITION.key, { value:defCfg.MD_MONTH_POSITION.value, 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(defCfg.MD_DAY_POSITION.key, { value:defCfg.MD_DAY_POSITION.value, 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(defCfg.MDY_MONTH_POSITION.key, { value:defCfg.MDY_MONTH_POSITION.value, 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(defCfg.MDY_DAY_POSITION.key, { value:defCfg.MDY_DAY_POSITION.value, 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(defCfg.MDY_YEAR_POSITION.key, { value:defCfg.MDY_YEAR_POSITION.value, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + +}; + +/** +* Initializes CalendarGroup's built-in CustomEvents +* @method initEvents +*/ +YAHOO.widget.CalendarGroup.prototype.initEvents = function() { + var me = this; + var strEvent = "Event"; + + /** + * 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 0) ? this.pages[0].cfg.getProperty(cfgSelected) : []; + this.cfg.setProperty(cfgSelected, selected, true); +}; + + +/** +* 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;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 +*
        • If MULTI_SELECT is false, selectCell will select the cell at the specified index for only the last displayed Calendar page.
        • +*
        • If MULTI_SELECT is true, selectCell will select the cell at the specified index, on each displayed Calendar page.
        • +* +* @method selectCell +* @param {Number} cellIndex The index of the cell to be selected. +* @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=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 11)) { + var DM = YAHOO.widget.DateMath; + var newDate = DM.add(date, DM.MONTH, iMonth-date.getMonth()); + date.setTime(newDate.getTime()); + } else { + date.setMonth(iMonth); + } +}; + + +/** +* 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 +* @deprecated Along with Calendar.IMG_ROOT and NAV_ARROW_LEFT, NAV_ARROW_RIGHT configuration properties. +* Calendar's Style.CSS_CLOSE property now represents the CSS class used to render the close icon +* @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", + "configIframe", + "hide", + "show", + "browser"); + +/** +* The set of default Config property keys and values for the CalendarGroup +* @property YAHOO.widget.CalendarGroup._DEFAULT_CONFIG +* @final +* @static +* @private +* @type Object +*/ +YAHOO.widget.CalendarGroup._DEFAULT_CONFIG = YAHOO.widget.Calendar._DEFAULT_CONFIG; +YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.PAGES = {key:"pages", value:2}; + +/** +* 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; + +YAHOO.register("calendar", YAHOO.widget.Calendar, {version: "2.2.2", build: "204"}); diff --git a/www/extras/yui/build/calendar/calendar-min.js b/www/extras/yui/build/calendar/calendar-min.js new file mode 100644 index 000000000..d1ddad51e --- /dev/null +++ b/www/extras/yui/build/calendar/calendar-min.js @@ -0,0 +1,118 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ + +YAHOO.util.Config=function(owner){if(owner){this.init(owner);}};YAHOO.util.Config.CONFIG_CHANGED_EVENT="configChanged";YAHOO.util.Config.BOOLEAN_TYPE="boolean";YAHOO.util.Config.prototype={owner:null,queueInProgress:false,config:null,initialConfig:null,eventQueue:null,configChangedEvent:null,checkBoolean:function(val){return(typeof val==YAHOO.util.Config.BOOLEAN_TYPE);},checkNumber:function(val){return(!isNaN(val));},fireEvent:function(key,value){var property=this.config[key];if(property&&property.event){property.event.fire(value);}},addProperty:function(key,propertyObject){key=key.toLowerCase();this.config[key]=propertyObject;propertyObject.event=new YAHOO.util.CustomEvent(key,this.owner);propertyObject.key=key;if(propertyObject.handler){propertyObject.event.subscribe(propertyObject.handler,this.owner);} +this.setProperty(key,propertyObject.value,true);if(!propertyObject.suppressEvent){this.queueProperty(key,propertyObject.value);}},getConfig:function(){var cfg={};for(var prop in this.config){var property=this.config[prop];if(property&&property.event){cfg[prop]=property.value;}} +return cfg;},getProperty:function(key){var property=this.config[key.toLowerCase()];if(property&&property.event){return property.value;}else{return undefined;}},resetProperty:function(key){key=key.toLowerCase();var property=this.config[key];if(property&&property.event){if(this.initialConfig[key]&&!YAHOO.lang.isUndefined(this.initialConfig[key])){this.setProperty(key,this.initialConfig[key]);} +return true;}else{return false;}},setProperty:function(key,value,silent){key=key.toLowerCase();if(this.queueInProgress&&!silent){this.queueProperty(key,value);return true;}else{var property=this.config[key];if(property&&property.event){if(property.validator&&!property.validator(value)){return false;}else{property.value=value;if(!silent){this.fireEvent(key,value);this.configChangedEvent.fire([key,value]);} +return true;}}else{return false;}}},queueProperty:function(key,value){key=key.toLowerCase();var property=this.config[key];if(property&&property.event){if(!YAHOO.lang.isUndefined(value)&&property.validator&&!property.validator(value)){return false;}else{if(!YAHOO.lang.isUndefined(value)){property.value=value;}else{value=property.value;} +var foundDuplicate=false;var iLen=this.eventQueue.length;for(var i=0;i11){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=null;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.SHORT="short";YAHOO.widget.Calendar.LONG="long";YAHOO.widget.Calendar.MEDIUM="medium";YAHOO.widget.Calendar.ONE_CHAR="1char";YAHOO.widget.Calendar._DEFAULT_CONFIG={PAGEDATE:{key:"pagedate",value:null},SELECTED:{key:"selected",value:null},TITLE:{key:"title",value:""},CLOSE:{key:"close",value:false},IFRAME:{key:"iframe",value:true},MINDATE:{key:"mindate",value:null},MAXDATE:{key:"maxdate",value:null},MULTI_SELECT:{key:"multi_select",value:false},START_WEEKDAY:{key:"start_weekday",value:0},SHOW_WEEKDAYS:{key:"show_weekdays",value:true},SHOW_WEEK_HEADER:{key:"show_week_header",value:false},SHOW_WEEK_FOOTER:{key:"show_week_footer",value:false},HIDE_BLANK_WEEKS:{key:"hide_blank_weeks",value:false},NAV_ARROW_LEFT:{key:"nav_arrow_left",value:null},NAV_ARROW_RIGHT:{key:"nav_arrow_right",value:null},MONTHS_SHORT:{key:"months_short",value:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},MONTHS_LONG:{key:"months_long",value:["January","February","March","April","May","June","July","August","September","October","November","December"]},WEEKDAYS_1CHAR:{key:"weekdays_1char",value:["S","M","T","W","T","F","S"]},WEEKDAYS_SHORT:{key:"weekdays_short",value:["Su","Mo","Tu","We","Th","Fr","Sa"]},WEEKDAYS_MEDIUM:{key:"weekdays_medium",value:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},WEEKDAYS_LONG:{key:"weekdays_long",value:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},LOCALE_MONTHS:{key:"locale_months",value:"long"},LOCALE_WEEKDAYS:{key:"locale_weekdays",value:"short"},DATE_DELIMITER:{key:"date_delimiter",value:","},DATE_FIELD_DELIMITER:{key:"date_field_delimiter",value:"/"},DATE_RANGE_DELIMITER:{key:"date_range_delimiter",value:"-"},MY_MONTH_POSITION:{key:"my_month_position",value:1},MY_YEAR_POSITION:{key:"my_year_position",value:2},MD_MONTH_POSITION:{key:"md_month_position",value:1},MD_DAY_POSITION:{key:"md_day_position",value:2},MDY_MONTH_POSITION:{key:"mdy_month_position",value:1},MDY_DAY_POSITION:{key:"mdy_day_position",value:2},MDY_YEAR_POSITION:{key:"mdy_year_position",value:3}};YAHOO.widget.Calendar._EVENT_TYPES={BEFORE_SELECT:"beforeSelect",SELECT:"select",BEFORE_DESELECT:"beforeDeselect",DESELECT:"deselect",CHANGE_PAGE:"changePage",BEFORE_RENDER:"beforeRender",RENDER:"render",RESET:"reset",CLEAR:"clear"};YAHOO.widget.Calendar._STYLES={CSS_ROW_HEADER:"calrowhead",CSS_ROW_FOOTER:"calrowfoot",CSS_CELL:"calcell",CSS_CELL_SELECTOR:"selector",CSS_CELL_SELECTED:"selected",CSS_CELL_SELECTABLE:"selectable",CSS_CELL_RESTRICTED:"restricted",CSS_CELL_TODAY:"today",CSS_CELL_OOM:"oom",CSS_CELL_OOB:"previous",CSS_HEADER:"calheader",CSS_HEADER_TEXT:"calhead",CSS_BODY:"calbody",CSS_WEEKDAY_CELL:"calweekdaycell",CSS_WEEKDAY_ROW:"calweekdayrow",CSS_FOOTER:"calfoot",CSS_CALENDAR:"yui-calendar",CSS_SINGLE:"single",CSS_CONTAINER:"yui-calcontainer",CSS_NAV_LEFT:"calnavleft",CSS_NAV_RIGHT:"calnavright",CSS_CLOSE:"calclose",CSS_CELL_TOP:"calcelltop",CSS_CELL_LEFT:"calcellleft",CSS_CELL_RIGHT:"calcellright",CSS_CELL_BOTTOM:"calcellbottom",CSS_CELL_HOVER:"calcellhover",CSS_CELL_HIGHLIGHT1:"highlight1",CSS_CELL_HIGHLIGHT2:"highlight2",CSS_CELL_HIGHLIGHT3:"highlight3",CSS_CELL_HIGHLIGHT4:"highlight4"};YAHOO.widget.Calendar.prototype={Config:null,parent:null,index:-1,cells:null,cellDates:null,id:null,oDomContainer:null,today:null,renderStack:null,_renderStack: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(!this.parent){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(YAHOO.widget.Calendar._DEFAULT_CONFIG.CLOSE.key);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(YAHOO.widget.Calendar._DEFAULT_CONFIG.TITLE.key);var DEPR_CLOSE_PATH="us/my/bn/x_d.gif";var linkClose;if(close===true){linkClose=YAHOO.util.Dom.getElementsByClassName("link-close","a",this.oDomContainer)[0]||document.createElement("a");linkClose.href="#";linkClose.className="link-close";YAHOO.util.Event.addListener(linkClose,"click",function(e,cal){cal.hide();YAHOO.util.Event.preventDefault(e);},this);if(YAHOO.widget.Calendar.IMG_ROOT!==null){var imgClose=document.createElement("img");imgClose.src=YAHOO.widget.Calendar.IMG_ROOT+DEPR_CLOSE_PATH;imgClose.className=YAHOO.widget.CalendarGroup.CSS_2UPCLOSE;linkClose.appendChild(imgClose);}else{linkClose.innerHTML='';} +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(){var defEvents=YAHOO.widget.Calendar._EVENT_TYPES;this.beforeSelectEvent=new YAHOO.util.CustomEvent(defEvents.BEFORE_SELECT);this.selectEvent=new YAHOO.util.CustomEvent(defEvents.SELECT);this.beforeDeselectEvent=new YAHOO.util.CustomEvent(defEvents.BEFORE_DESELECT);this.deselectEvent=new YAHOO.util.CustomEvent(defEvents.DESELECT);this.changePageEvent=new YAHOO.util.CustomEvent(defEvents.CHANGE_PAGE);this.beforeRenderEvent=new YAHOO.util.CustomEvent(defEvents.BEFORE_RENDER);this.renderEvent=new YAHOO.util.CustomEvent(defEvents.RENDER);this.resetEvent=new YAHOO.util.CustomEvent(defEvents.RESET);this.clearEvent=new YAHOO.util.CustomEvent(defEvents.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 cell,index,d,date;var target=YAHOO.util.Event.getTarget(e);var tagName=target.tagName.toLowerCase();var defSelector=false;while(tagName!="td"&&!YAHOO.util.Dom.hasClass(target,cal.Style.CSS_CELL_SELECTABLE)){if(!defSelector&&tagName=="a"&&YAHOO.util.Dom.hasClass(target,cal.Style.CSS_CELL_SELECTOR)){defSelector=true;} +target=target.parentNode;tagName=target.tagName.toLowerCase();if(tagName=="html"){return;}} +if(defSelector){YAHOO.util.Event.preventDefault(e);} +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(){var defCfg=YAHOO.widget.Calendar._DEFAULT_CONFIG;this.cfg.addProperty(defCfg.PAGEDATE.key,{value:new Date(),handler:this.configPageDate});this.cfg.addProperty(defCfg.SELECTED.key,{value:[],handler:this.configSelected});this.cfg.addProperty(defCfg.TITLE.key,{value:defCfg.TITLE.value,handler:this.configTitle});this.cfg.addProperty(defCfg.CLOSE.key,{value:defCfg.CLOSE.value,handler:this.configClose});this.cfg.addProperty(defCfg.IFRAME.key,{value:defCfg.IFRAME.value,handler:this.configIframe,validator:this.cfg.checkBoolean});this.cfg.addProperty(defCfg.MINDATE.key,{value:defCfg.MINDATE.value,handler:this.configMinDate});this.cfg.addProperty(defCfg.MAXDATE.key,{value:defCfg.MAXDATE.value,handler:this.configMaxDate});this.cfg.addProperty(defCfg.MULTI_SELECT.key,{value:defCfg.MULTI_SELECT.value,handler:this.configOptions,validator:this.cfg.checkBoolean});this.cfg.addProperty(defCfg.START_WEEKDAY.key,{value:defCfg.START_WEEKDAY.value,handler:this.configOptions,validator:this.cfg.checkNumber});this.cfg.addProperty(defCfg.SHOW_WEEKDAYS.key,{value:defCfg.SHOW_WEEKDAYS.value,handler:this.configOptions,validator:this.cfg.checkBoolean});this.cfg.addProperty(defCfg.SHOW_WEEK_HEADER.key,{value:defCfg.SHOW_WEEK_HEADER.value,handler:this.configOptions,validator:this.cfg.checkBoolean});this.cfg.addProperty(defCfg.SHOW_WEEK_FOOTER.key,{value:defCfg.SHOW_WEEK_FOOTER.value,handler:this.configOptions,validator:this.cfg.checkBoolean});this.cfg.addProperty(defCfg.HIDE_BLANK_WEEKS.key,{value:defCfg.HIDE_BLANK_WEEKS.value,handler:this.configOptions,validator:this.cfg.checkBoolean});this.cfg.addProperty(defCfg.NAV_ARROW_LEFT.key,{value:defCfg.NAV_ARROW_LEFT.value,handler:this.configOptions});this.cfg.addProperty(defCfg.NAV_ARROW_RIGHT.key,{value:defCfg.NAV_ARROW_RIGHT.value,handler:this.configOptions});this.cfg.addProperty(defCfg.MONTHS_SHORT.key,{value:defCfg.MONTHS_SHORT.value,handler:this.configLocale});this.cfg.addProperty(defCfg.MONTHS_LONG.key,{value:defCfg.MONTHS_LONG.value,handler:this.configLocale});this.cfg.addProperty(defCfg.WEEKDAYS_1CHAR.key,{value:defCfg.WEEKDAYS_1CHAR.value,handler:this.configLocale});this.cfg.addProperty(defCfg.WEEKDAYS_SHORT.key,{value:defCfg.WEEKDAYS_SHORT.value,handler:this.configLocale});this.cfg.addProperty(defCfg.WEEKDAYS_MEDIUM.key,{value:defCfg.WEEKDAYS_MEDIUM.value,handler:this.configLocale});this.cfg.addProperty(defCfg.WEEKDAYS_LONG.key,{value:defCfg.WEEKDAYS_LONG.value,handler:this.configLocale});var refreshLocale=function(){this.cfg.refireEvent(defCfg.LOCALE_MONTHS.key);this.cfg.refireEvent(defCfg.LOCALE_WEEKDAYS.key);};this.cfg.subscribeToConfigEvent(defCfg.START_WEEKDAY.key,refreshLocale,this,true);this.cfg.subscribeToConfigEvent(defCfg.MONTHS_SHORT.key,refreshLocale,this,true);this.cfg.subscribeToConfigEvent(defCfg.MONTHS_LONG.key,refreshLocale,this,true);this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_1CHAR.key,refreshLocale,this,true);this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_SHORT.key,refreshLocale,this,true);this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_MEDIUM.key,refreshLocale,this,true);this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_LONG.key,refreshLocale,this,true);this.cfg.addProperty(defCfg.LOCALE_MONTHS.key,{value:defCfg.LOCALE_MONTHS.value,handler:this.configLocaleValues});this.cfg.addProperty(defCfg.LOCALE_WEEKDAYS.key,{value:defCfg.LOCALE_WEEKDAYS.value,handler:this.configLocaleValues});this.cfg.addProperty(defCfg.DATE_DELIMITER.key,{value:defCfg.DATE_DELIMITER.value,handler:this.configLocale});this.cfg.addProperty(defCfg.DATE_FIELD_DELIMITER.key,{value:defCfg.DATE_FIELD_DELIMITER.value,handler:this.configLocale});this.cfg.addProperty(defCfg.DATE_RANGE_DELIMITER.key,{value:defCfg.DATE_RANGE_DELIMITER.value,handler:this.configLocale});this.cfg.addProperty(defCfg.MY_MONTH_POSITION.key,{value:defCfg.MY_MONTH_POSITION.value,handler:this.configLocale,validator:this.cfg.checkNumber});this.cfg.addProperty(defCfg.MY_YEAR_POSITION.key,{value:defCfg.MY_YEAR_POSITION.value,handler:this.configLocale,validator:this.cfg.checkNumber});this.cfg.addProperty(defCfg.MD_MONTH_POSITION.key,{value:defCfg.MD_MONTH_POSITION.value,handler:this.configLocale,validator:this.cfg.checkNumber});this.cfg.addProperty(defCfg.MD_DAY_POSITION.key,{value:defCfg.MD_DAY_POSITION.value,handler:this.configLocale,validator:this.cfg.checkNumber});this.cfg.addProperty(defCfg.MDY_MONTH_POSITION.key,{value:defCfg.MDY_MONTH_POSITION.value,handler:this.configLocale,validator:this.cfg.checkNumber});this.cfg.addProperty(defCfg.MDY_DAY_POSITION.key,{value:defCfg.MDY_DAY_POSITION.value,handler:this.configLocale,validator:this.cfg.checkNumber});this.cfg.addProperty(defCfg.MDY_YEAR_POSITION.key,{value:defCfg.MDY_YEAR_POSITION.value,handler:this.configLocale,validator:this.cfg.checkNumber});};YAHOO.widget.Calendar.prototype.configPageDate=function(type,args,obj){this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key,this._parsePageDate(args[0]),true);};YAHOO.widget.Calendar.prototype.configMinDate=function(type,args,obj){var val=args[0];if(YAHOO.lang.isString(val)){val=this._parseDate(val);this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.MINDATE.key,new Date(val[0],(val[1]-1),val[2]));}};YAHOO.widget.Calendar.prototype.configMaxDate=function(type,args,obj){var val=args[0];if(YAHOO.lang.isString(val)){val=this._parseDate(val);this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.MAXDATE.key,new Date(val[0],(val[1]-1),val[2]));}};YAHOO.widget.Calendar.prototype.configSelected=function(type,args,obj){var selected=args[0];var cfgSelected=YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key;if(selected){if(YAHOO.lang.isString(selected)){this.cfg.setProperty(cfgSelected,this._parseDates(selected),true);}} +if(!this._selectedDates){this._selectedDates=this.cfg.getProperty(cfgSelected);}};YAHOO.widget.Calendar.prototype.configOptions=function(type,args,obj){this.Options[type.toUpperCase()]=args[0];};YAHOO.widget.Calendar.prototype.configLocale=function(type,args,obj){var defCfg=YAHOO.widget.Calendar._DEFAULT_CONFIG;this.Locale[type.toUpperCase()]=args[0];this.cfg.refireEvent(defCfg.LOCALE_MONTHS.key);this.cfg.refireEvent(defCfg.LOCALE_WEEKDAYS.key);};YAHOO.widget.Calendar.prototype.configLocaleValues=function(type,args,obj){var defCfg=YAHOO.widget.Calendar._DEFAULT_CONFIG;type=type.toLowerCase();var val=args[0];switch(type){case defCfg.LOCALE_MONTHS.key:switch(val){case YAHOO.widget.Calendar.SHORT:this.Locale.LOCALE_MONTHS=this.cfg.getProperty(defCfg.MONTHS_SHORT.key).concat();break;case YAHOO.widget.Calendar.LONG:this.Locale.LOCALE_MONTHS=this.cfg.getProperty(defCfg.MONTHS_LONG.key).concat();break;} +break;case defCfg.LOCALE_WEEKDAYS.key:switch(val){case YAHOO.widget.Calendar.ONE_CHAR:this.Locale.LOCALE_WEEKDAYS=this.cfg.getProperty(defCfg.WEEKDAYS_1CHAR.key).concat();break;case YAHOO.widget.Calendar.SHORT:this.Locale.LOCALE_WEEKDAYS=this.cfg.getProperty(defCfg.WEEKDAYS_SHORT.key).concat();break;case YAHOO.widget.Calendar.MEDIUM:this.Locale.LOCALE_WEEKDAYS=this.cfg.getProperty(defCfg.WEEKDAYS_MEDIUM.key).concat();break;case YAHOO.widget.Calendar.LONG:this.Locale.LOCALE_WEEKDAYS=this.cfg.getProperty(defCfg.WEEKDAYS_LONG.key).concat();break;} +var START_WEEKDAY=this.cfg.getProperty(defCfg.START_WEEKDAY.key);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){var leftArrow=this.cfg.getProperty(defCfg.NAV_ARROW_LEFT.key);if(leftArrow===null&&YAHOO.widget.Calendar.IMG_ROOT!==null){leftArrow=YAHOO.widget.Calendar.IMG_ROOT+DEPR_NAV_LEFT;} +var leftStyle=(leftArrow===null)?"":' style="background-image:url('+leftArrow+')"';html[html.length]=' ';} +html[html.length]=this.buildMonthLabel();if(renderRight){var rightArrow=this.cfg.getProperty(defCfg.NAV_ARROW_RIGHT.key);if(rightArrow===null&&YAHOO.widget.Calendar.IMG_ROOT!==null){rightArrow=YAHOO.widget.Calendar.IMG_ROOT+DEPR_NAV_RIGHT;} +var rightStyle=(rightArrow===null)?"":' style="background-image:url('+rightArrow+')"';html[html.length]=' ';} +html[html.length]='
          \n\n';if(this.cfg.getProperty(defCfg.SHOW_WEEKDAYS.key)){html=this.buildWeekdays(html);} +html[html.length]='';return html;};YAHOO.widget.Calendar.prototype.buildWeekdays=function(html){var defCfg=YAHOO.widget.Calendar._DEFAULT_CONFIG;html[html.length]='';if(this.cfg.getProperty(defCfg.SHOW_WEEK_HEADER.key)){html[html.length]=' ';} +for(var i=0;i'+this.Locale.LOCALE_WEEKDAYS[i]+'';} +if(this.cfg.getProperty(defCfg.SHOW_WEEK_FOOTER.key)){html[html.length]=' ';} +html[html.length]='';return html;};YAHOO.widget.Calendar.prototype.renderBody=function(workingDate,html){var defCfg=YAHOO.widget.Calendar._DEFAULT_CONFIG;var startDay=this.cfg.getProperty(defCfg.START_WEEKDAY.key);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 weekNum,weekClass;var weekPrefix="w";var cellPrefix="_cell";var workingDayPrefix="wd";var dayPrefix="d";var cellRenderers;var renderer;var todayYear=this.today.getFullYear();var todayMonth=this.today.getMonth();var todayDate=this.today.getDate();var useDate=this.cfg.getProperty(defCfg.PAGEDATE.key);var hideBlankWeeks=this.cfg.getProperty(defCfg.HIDE_BLANK_WEEKS.key);var showWeekFooter=this.cfg.getProperty(defCfg.SHOW_WEEK_FOOTER.key);var showWeekHeader=this.cfg.getProperty(defCfg.SHOW_WEEK_HEADER.key);var mindate=this.cfg.getProperty(defCfg.MINDATE.key);var maxdate=this.cfg.getProperty(defCfg.MAXDATE.key);if(mindate){mindate=YAHOO.widget.DateMath.clearTime(mindate);} +if(maxdate){maxdate=YAHOO.widget.DateMath.clearTime(maxdate);} +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=weekPrefix+weekNum;if(r!==0&&hideBlankWeeks===true&&workingDate.getMonth()!=useDate.getMonth()){break;}else{html[html.length]='';if(showWeekHeader){html=this.renderRowHeader(weekNum,html);} +for(var d=0;d<7;d++){cellRenderers=[];renderer=null;this.clearElement(cell);cell.className=this.Style.CSS_CELL;cell.id=this.id+cellPrefix+i;if(workingDate.getDate()==todayDate&&workingDate.getMonth()==todayMonth&&workingDate.getFullYear()==todayYear){cellRenderers[cellRenderers.length]=cal.renderCellStyleToday;} +var workingArray=[workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()];this.cellDates[this.cellDates.length]=workingArray;if(workingDate.getMonth()!=useDate.getMonth()){cellRenderers[cellRenderers.length]=cal.renderCellNotThisMonth;}else{YAHOO.util.Dom.addClass(cell,workingDayPrefix+workingDate.getDay());YAHOO.util.Dom.addClass(cell,dayPrefix+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(workingArray)>-1){cellRenderers[cellRenderers.length]=cal.renderCellStyleSelected;} +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(hideBlankWeeks&&postDays>=7){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(showWeekFooter){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 defCfg=YAHOO.widget.Calendar._DEFAULT_CONFIG;var workingDate=YAHOO.widget.DateMath.findMonthStart(this.cfg.getProperty(defCfg.PAGEDATE.key));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(defCfg.TITLE.key);this.cfg.refireEvent(defCfg.CLOSE.key);this.cfg.refireEvent(defCfg.IFRAME.key);this.renderEvent.fire();};YAHOO.widget.Calendar.prototype.applyListeners=function(){var root=this.oDomContainer;var cal=this.parent||this;var anchor="a";var mousedown="mousedown";var linkLeft=YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_LEFT,anchor,root);var linkRight=YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_RIGHT,anchor,root);if(linkLeft&&linkLeft.length>0){this.linkLeft=linkLeft[0];YAHOO.util.Event.addListener(this.linkLeft,mousedown,cal.previousMonth,cal,true);} +if(linkRight&&linkRight.length>0){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(YAHOO.lang.hasOwnProperty(this.domEventMap,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){var cfgPageDate=YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key;this.cfg.setProperty(cfgPageDate,YAHOO.widget.DateMath.add(this.cfg.getProperty(cfgPageDate),YAHOO.widget.DateMath.MONTH,count));this.resetRenderers();this.changePageEvent.fire();};YAHOO.widget.Calendar.prototype.subtractMonths=function(count){var cfgPageDate=YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key;this.cfg.setProperty(cfgPageDate,YAHOO.widget.DateMath.subtract(this.cfg.getProperty(cfgPageDate),YAHOO.widget.DateMath.MONTH,count));this.resetRenderers();this.changePageEvent.fire();};YAHOO.widget.Calendar.prototype.addYears=function(count){var cfgPageDate=YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key;this.cfg.setProperty(cfgPageDate,YAHOO.widget.DateMath.add(this.cfg.getProperty(cfgPageDate),YAHOO.widget.DateMath.YEAR,count));this.resetRenderers();this.changePageEvent.fire();};YAHOO.widget.Calendar.prototype.subtractYears=function(count){var cfgPageDate=YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key;this.cfg.setProperty(cfgPageDate,YAHOO.widget.DateMath.subtract(this.cfg.getProperty(cfgPageDate),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(){var defCfg=YAHOO.widget.Calendar._DEFAULT_CONFIG;this.cfg.resetProperty(defCfg.SELECTED.key);this.cfg.resetProperty(defCfg.PAGEDATE.key);this.resetEvent.fire();};YAHOO.widget.Calendar.prototype.clear=function(){var defCfg=YAHOO.widget.Calendar._DEFAULT_CONFIG;this.cfg.setProperty(defCfg.SELECTED.key,[]);this.cfg.setProperty(defCfg.PAGEDATE.key,new Date(this.today.getTime()));this.clearEvent.fire();};YAHOO.widget.Calendar.prototype.select=function(date){this.beforeSelectEvent.fire();var cfgSelected=YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key;var selected=this.cfg.getProperty(cfgSelected);var aToBeSelected=this._toFieldArray(date);for(var a=0;a-1){if(this.cfg.getProperty(defCfg.PAGEDATE.key).getMonth()==dCellDate.getMonth()&&this.cfg.getProperty(defCfg.PAGEDATE.key).getFullYear()==dCellDate.getFullYear()){YAHOO.util.Dom.removeClass(cell,this.Style.CSS_CELL_SELECTED);} +selected.splice(cellDateIndex,1);} +if(this.parent){this.parent.cfg.setProperty(defCfg.SELECTED.key,selected);}else{this.cfg.setProperty(defCfg.SELECTED.key,selected);} +this.deselectEvent.fire(selectDate);return this.getSelectedDates();};YAHOO.widget.Calendar.prototype.deselectAll=function(){this.beforeDeselectEvent.fire();var cfgSelected=YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key;var selected=this.cfg.getProperty(cfgSelected);var count=selected.length;var sel=selected.concat();if(this.parent){this.parent.cfg.setProperty(cfgSelected,[]);}else{this.cfg.setProperty(cfgSelected,[]);} +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(YAHOO.lang.isString(date)){returnDate=this._parseDates(date);}else if(YAHOO.lang.isArray(date)){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(){var defCfg=YAHOO.widget.CalendarGroup._DEFAULT_CONFIG;this.cfg.addProperty(defCfg.PAGES.key,{value:defCfg.PAGES.value,validator:this.cfg.checkNumber,handler:this.configPages});this.cfg.addProperty(defCfg.PAGEDATE.key,{value:new Date(),handler:this.configPageDate});this.cfg.addProperty(defCfg.SELECTED.key,{value:[],handler:this.configSelected});this.cfg.addProperty(defCfg.TITLE.key,{value:defCfg.TITLE.value,handler:this.configTitle});this.cfg.addProperty(defCfg.CLOSE.key,{value:defCfg.CLOSE.value,handler:this.configClose});this.cfg.addProperty(defCfg.IFRAME.key,{value:defCfg.IFRAME.value,handler:this.configIframe,validator:this.cfg.checkBoolean});this.cfg.addProperty(defCfg.MINDATE.key,{value:defCfg.MINDATE.value,handler:this.delegateConfig});this.cfg.addProperty(defCfg.MAXDATE.key,{value:defCfg.MAXDATE.value,handler:this.delegateConfig});this.cfg.addProperty(defCfg.MULTI_SELECT.key,{value:defCfg.MULTI_SELECT.value,handler:this.delegateConfig,validator:this.cfg.checkBoolean});this.cfg.addProperty(defCfg.START_WEEKDAY.key,{value:defCfg.START_WEEKDAY.value,handler:this.delegateConfig,validator:this.cfg.checkNumber});this.cfg.addProperty(defCfg.SHOW_WEEKDAYS.key,{value:defCfg.SHOW_WEEKDAYS.value,handler:this.delegateConfig,validator:this.cfg.checkBoolean});this.cfg.addProperty(defCfg.SHOW_WEEK_HEADER.key,{value:defCfg.SHOW_WEEK_HEADER.value,handler:this.delegateConfig,validator:this.cfg.checkBoolean});this.cfg.addProperty(defCfg.SHOW_WEEK_FOOTER.key,{value:defCfg.SHOW_WEEK_FOOTER.value,handler:this.delegateConfig,validator:this.cfg.checkBoolean});this.cfg.addProperty(defCfg.HIDE_BLANK_WEEKS.key,{value:defCfg.HIDE_BLANK_WEEKS.value,handler:this.delegateConfig,validator:this.cfg.checkBoolean});this.cfg.addProperty(defCfg.NAV_ARROW_LEFT.key,{value:defCfg.NAV_ARROW_LEFT.value,handler:this.delegateConfig});this.cfg.addProperty(defCfg.NAV_ARROW_RIGHT.key,{value:defCfg.NAV_ARROW_RIGHT.value,handler:this.delegateConfig});this.cfg.addProperty(defCfg.MONTHS_SHORT.key,{value:defCfg.MONTHS_SHORT.value,handler:this.delegateConfig});this.cfg.addProperty(defCfg.MONTHS_LONG.key,{value:defCfg.MONTHS_LONG.value,handler:this.delegateConfig});this.cfg.addProperty(defCfg.WEEKDAYS_1CHAR.key,{value:defCfg.WEEKDAYS_1CHAR.value,handler:this.delegateConfig});this.cfg.addProperty(defCfg.WEEKDAYS_SHORT.key,{value:defCfg.WEEKDAYS_SHORT.value,handler:this.delegateConfig});this.cfg.addProperty(defCfg.WEEKDAYS_MEDIUM.key,{value:defCfg.WEEKDAYS_MEDIUM.value,handler:this.delegateConfig});this.cfg.addProperty(defCfg.WEEKDAYS_LONG.key,{value:defCfg.WEEKDAYS_LONG.value,handler:this.delegateConfig});this.cfg.addProperty(defCfg.LOCALE_MONTHS.key,{value:defCfg.LOCALE_MONTHS.value,handler:this.delegateConfig});this.cfg.addProperty(defCfg.LOCALE_WEEKDAYS.key,{value:defCfg.LOCALE_WEEKDAYS.value,handler:this.delegateConfig});this.cfg.addProperty(defCfg.DATE_DELIMITER.key,{value:defCfg.DATE_DELIMITER.value,handler:this.delegateConfig});this.cfg.addProperty(defCfg.DATE_FIELD_DELIMITER.key,{value:defCfg.DATE_FIELD_DELIMITER.value,handler:this.delegateConfig});this.cfg.addProperty(defCfg.DATE_RANGE_DELIMITER.key,{value:defCfg.DATE_RANGE_DELIMITER.value,handler:this.delegateConfig});this.cfg.addProperty(defCfg.MY_MONTH_POSITION.key,{value:defCfg.MY_MONTH_POSITION.value,handler:this.delegateConfig,validator:this.cfg.checkNumber});this.cfg.addProperty(defCfg.MY_YEAR_POSITION.key,{value:defCfg.MY_YEAR_POSITION.value,handler:this.delegateConfig,validator:this.cfg.checkNumber});this.cfg.addProperty(defCfg.MD_MONTH_POSITION.key,{value:defCfg.MD_MONTH_POSITION.value,handler:this.delegateConfig,validator:this.cfg.checkNumber});this.cfg.addProperty(defCfg.MD_DAY_POSITION.key,{value:defCfg.MD_DAY_POSITION.value,handler:this.delegateConfig,validator:this.cfg.checkNumber});this.cfg.addProperty(defCfg.MDY_MONTH_POSITION.key,{value:defCfg.MDY_MONTH_POSITION.value,handler:this.delegateConfig,validator:this.cfg.checkNumber});this.cfg.addProperty(defCfg.MDY_DAY_POSITION.key,{value:defCfg.MDY_DAY_POSITION.value,handler:this.delegateConfig,validator:this.cfg.checkNumber});this.cfg.addProperty(defCfg.MDY_YEAR_POSITION.key,{value:defCfg.MDY_YEAR_POSITION.value,handler:this.delegateConfig,validator:this.cfg.checkNumber});};YAHOO.widget.CalendarGroup.prototype.initEvents=function(){var me=this;var strEvent="Event";var sub=function(fn,obj,bOverride){for(var p=0;p0)?this.pages[0].cfg.getProperty(cfgSelected):[];this.cfg.setProperty(cfgSelected,selected,true);};YAHOO.widget.CalendarGroup.prototype.delegateConfig=function(type,args,obj){var val=args[0];var cal;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;p11)){var DM=YAHOO.widget.DateMath;var newDate=DM.add(date,DM.MONTH,iMonth-date.getMonth());date.setTime(newDate.getTime());}else{date.setMonth(iMonth);}};YAHOO.widget.CalendarGroup.CSS_CONTAINER="yui-calcontainer";YAHOO.widget.CalendarGroup.CSS_MULTI_UP="multi";YAHOO.widget.CalendarGroup.CSS_2UPTITLE="title";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","configIframe","hide","show","browser");YAHOO.widget.CalendarGroup._DEFAULT_CONFIG=YAHOO.widget.Calendar._DEFAULT_CONFIG;YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.PAGES={key:"pages",value:2};YAHOO.widget.CalendarGroup.prototype.toString=function(){return"CalendarGroup "+this.id;};YAHOO.widget.CalGrp=YAHOO.widget.CalendarGroup;YAHOO.widget.Calendar2up=function(id,containerId,config){this.init(id,containerId,config);};YAHOO.extend(YAHOO.widget.Calendar2up,YAHOO.widget.CalendarGroup);YAHOO.widget.Cal2up=YAHOO.widget.Calendar2up;YAHOO.register("calendar",YAHOO.widget.Calendar,{version:"2.2.2",build:"204"}); \ No newline at end of file diff --git a/www/extras/yui/build/calendar/calendar.js b/www/extras/yui/build/calendar/calendar.js new file mode 100644 index 000000000..9e0fa846d --- /dev/null +++ b/www/extras/yui/build/calendar/calendar.js @@ -0,0 +1,4548 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +/** +* 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. +* @namespace YAHOO.util +* @class Config +* @constructor +* @param {Object} owner The owner Object to which this Config Object belongs +*/ +YAHOO.util.Config = function(owner) { + if (owner) { + this.init(owner); + } +}; + +/** + * Constant representing the CustomEvent type for the config changed event. + * @property YAHOO.util.Config.CONFIG_CHANGED_EVENT + * @private + * @static + * @final + */ +YAHOO.util.Config.CONFIG_CHANGED_EVENT = "configChanged"; + +/** + * Constant representing the boolean type string + * @property YAHOO.util.Config.BOOLEAN_TYPE + * @private + * @static + * @final + */ +YAHOO.util.Config.BOOLEAN_TYPE = "boolean"; + +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, + + /** + * Maintains the local collection of configuration property objects and their specified values + * @property config + * @private + * @type Object + */ + config : null, + + /** + * 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 + */ + initialConfig : null, + + /** + * Maintains the local, normalized CustomEvent queue + * @property eventQueue + * @private + * @type Object + */ + eventQueue : null, + + /** + * Custom Event, notifying subscribers when Config properties are set (setProperty is called without the silent flag + * @event configChangedEvent + */ + configChangedEvent : null, + + /** + * 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) { + return (typeof val == YAHOO.util.Config.BOOLEAN_TYPE); + }, + + /** + * 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) { + return (!isNaN(val)); + }, + + /** + * 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 + */ + fireEvent : function( key, value ) { + var property = this.config[key]; + + if (property && property.event) { + property.event.fire(value); + } + }, + + /** + * 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 + */ + addProperty : function( key, propertyObject ) { + key = key.toLowerCase(); + + this.config[key] = propertyObject; + + propertyObject.event = new YAHOO.util.CustomEvent(key, this.owner); + propertyObject.key = key; + + if (propertyObject.handler) { + propertyObject.event.subscribe(propertyObject.handler, this.owner); + } + + 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 + */ + getConfig : function() { + var cfg = {}; + + for (var prop in this.config) { + var property = this.config[prop]; + if (property && 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 + */ + getProperty : function(key) { + var property = this.config[key.toLowerCase()]; + if (property && 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 + */ + resetProperty : function(key) { + key = key.toLowerCase(); + + var property = this.config[key]; + if (property && property.event) { + if (this.initialConfig[key] && !YAHOO.lang.isUndefined(this.initialConfig[key])) { + this.setProperty(key, this.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. + */ + 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 = this.config[key]; + if (property && property.event) { + if (property.validator && ! property.validator(value)) { // validator + return false; + } else { + property.value = value; + if (! silent) { + this.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. + */ + queueProperty : function(key, value) { + key = key.toLowerCase(); + + var property = this.config[key]; + + if (property && property.event) { + if (!YAHOO.lang.isUndefined(value) && property.validator && ! property.validator(value)) { // validator + return false; + } else { + + if (!YAHOO.lang.isUndefined(value)) { + property.value = value; + } else { + value = property.value; + } + + var foundDuplicate = false; + var iLen = this.eventQueue.length; + for (var i=0; i < iLen; i++) { + var queueItem = this.eventQueue[i]; + + if (queueItem) { + var queueItemKey = queueItem[0]; + var queueItemValue = queueItem[1]; + + if (queueItemKey == key) { + // found a dupe... push to end of queue, null current item, and break + this.eventQueue[i] = null; + this.eventQueue.push([key, (!YAHOO.lang.isUndefined(value) ? value : queueItemValue)]); + foundDuplicate = true; + break; + } + } + } + + if (! foundDuplicate && !YAHOO.lang.isUndefined(value)) { // this is a refire, or a new property in the queue + this.eventQueue.push([key, value]); + } + } + + if (property.supercedes) { + var sLen = property.supercedes.length; + for (var s=0; s < sLen; s++) { + var supercedesCheck = property.supercedes[s]; + var qLen = this.eventQueue.length; + for (var q=0; q < qLen; q++) { + var queueItemCheck = this.eventQueue[q]; + + if (queueItemCheck) { + var queueItemCheckKey = queueItemCheck[0]; + var queueItemCheckValue = queueItemCheck[1]; + + if ( queueItemCheckKey == supercedesCheck.toLowerCase() ) { + this.eventQueue.push([queueItemCheckKey, queueItemCheckValue]); + this.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 + */ + refireEvent : function(key) { + key = key.toLowerCase(); + + var property = this.config[key]; + if (property && property.event && !YAHOO.lang.isUndefined(property.value)) { + if (this.queueInProgress) { + this.queueProperty(key); + } else { + this.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. + */ + applyConfig : function(userConfig, init) { + if (init) { + this.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 + */ + refresh : function() { + for (var prop in this.config) { + this.refireEvent(prop); + } + }, + + /** + * Fires the normalized list of queued property change events + * @method fireQueue + */ + fireQueue : function() { + this.queueInProgress = true; + 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 12 noon. + * @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 +* @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 +* @deprecated You can now customize images by overriding the calclose, calnavleft and calnavright default CSS classes for the close icon, left arrow and right arrow respectively +* @type String +*/ +YAHOO.widget.Calendar.IMG_ROOT = null; + +/** +* 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"; + +/** +* Constant used to represent short date field string formats (e.g. Tu or Feb) +* @property YAHOO.widget.Calendar.SHORT +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.SHORT = "short"; + +/** +* Constant used to represent long date field string formats (e.g. Monday or February) +* @property YAHOO.widget.Calendar.LONG +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.LONG = "long"; + +/** +* Constant used to represent medium date field string formats (e.g. Mon) +* @property YAHOO.widget.Calendar.MEDIUM +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.MEDIUM = "medium"; + +/** +* Constant used to represent single character date field string formats (e.g. M, T, W) +* @property YAHOO.widget.Calendar.ONE_CHAR +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.ONE_CHAR = "1char"; + +/** +* The set of default Config property keys and values for the Calendar +* @property YAHOO.widget.Calendar._DEFAULT_CONFIG +* @final +* @static +* @private +* @type Object +*/ +YAHOO.widget.Calendar._DEFAULT_CONFIG = { + // Default values for pagedate and selected are not class level constants - they are set during instance creation + PAGEDATE : {key:"pagedate", value:null}, + SELECTED : {key:"selected", value:null}, + TITLE : {key:"title", value:""}, + CLOSE : {key:"close", value:false}, + IFRAME : {key:"iframe", value:true}, + MINDATE : {key:"mindate", value:null}, + MAXDATE : {key:"maxdate", value:null}, + MULTI_SELECT : {key:"multi_select", value:false}, + START_WEEKDAY : {key:"start_weekday", value:0}, + SHOW_WEEKDAYS : {key:"show_weekdays", value:true}, + SHOW_WEEK_HEADER : {key:"show_week_header", value:false}, + SHOW_WEEK_FOOTER : {key:"show_week_footer", value:false}, + HIDE_BLANK_WEEKS : {key:"hide_blank_weeks", value:false}, + NAV_ARROW_LEFT: {key:"nav_arrow_left", value:null} , + NAV_ARROW_RIGHT : {key:"nav_arrow_right", value:null} , + MONTHS_SHORT : {key:"months_short", value:["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]}, + MONTHS_LONG: {key:"months_long", value:["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]}, + WEEKDAYS_1CHAR: {key:"weekdays_1char", value:["S", "M", "T", "W", "T", "F", "S"]}, + WEEKDAYS_SHORT: {key:"weekdays_short", value:["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]}, + WEEKDAYS_MEDIUM: {key:"weekdays_medium", value:["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]}, + WEEKDAYS_LONG: {key:"weekdays_long", value:["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]}, + LOCALE_MONTHS:{key:"locale_months", value:"long"}, + LOCALE_WEEKDAYS:{key:"locale_weekdays", value:"short"}, + DATE_DELIMITER:{key:"date_delimiter", value:","}, + DATE_FIELD_DELIMITER:{key:"date_field_delimiter", value:"/"}, + DATE_RANGE_DELIMITER:{key:"date_range_delimiter", value:"-"}, + MY_MONTH_POSITION:{key:"my_month_position", value:1}, + MY_YEAR_POSITION:{key:"my_year_position", value:2}, + MD_MONTH_POSITION:{key:"md_month_position", value:1}, + MD_DAY_POSITION:{key:"md_day_position", value:2}, + MDY_MONTH_POSITION:{key:"mdy_month_position", value:1}, + MDY_DAY_POSITION:{key:"mdy_day_position", value:2}, + MDY_YEAR_POSITION:{key:"mdy_year_position", value:3} +}; + +/** +* The set of Custom Event types supported by the Calendar +* @property YAHOO.widget.Calendar._EVENT_TYPES +* @final +* @static +* @private +* @type Object +*/ +YAHOO.widget.Calendar._EVENT_TYPES = { + BEFORE_SELECT : "beforeSelect", + SELECT : "select", + BEFORE_DESELECT : "beforeDeselect", + DESELECT : "deselect", + CHANGE_PAGE : "changePage", + BEFORE_RENDER : "beforeRender", + RENDER : "render", + RESET : "reset", + CLEAR : "clear" +}; + +/** +* The set of default style constants for the Calendar +* @property YAHOO.widget.Calendar._STYLES +* @final +* @static +* @private +* @type Object +*/ +YAHOO.widget.Calendar._STYLES = { + CSS_ROW_HEADER: "calrowhead", + CSS_ROW_FOOTER: "calrowfoot", + CSS_CELL : "calcell", + CSS_CELL_SELECTOR : "selector", + CSS_CELL_SELECTED : "selected", + CSS_CELL_SELECTABLE : "selectable", + CSS_CELL_RESTRICTED : "restricted", + CSS_CELL_TODAY : "today", + CSS_CELL_OOM : "oom", + CSS_CELL_OOB : "previous", + CSS_HEADER : "calheader", + CSS_HEADER_TEXT : "calhead", + CSS_BODY : "calbody", + CSS_WEEKDAY_CELL : "calweekdaycell", + CSS_WEEKDAY_ROW : "calweekdayrow", + CSS_FOOTER : "calfoot", + CSS_CALENDAR : "yui-calendar", + CSS_SINGLE : "single", + CSS_CONTAINER : "yui-calcontainer", + CSS_NAV_LEFT : "calnavleft", + CSS_NAV_RIGHT : "calnavright", + CSS_CLOSE : "calclose", + CSS_CELL_TOP : "calcelltop", + CSS_CELL_LEFT : "calcellleft", + CSS_CELL_RIGHT : "calcellright", + CSS_CELL_BOTTOM : "calcellbottom", + CSS_CELL_HOVER : "calcellhover", + CSS_CELL_HIGHLIGHT1 : "highlight1", + CSS_CELL_HIGHLIGHT2 : "highlight2", + CSS_CELL_HIGHLIGHT3 : "highlight3", + CSS_CELL_HIGHLIGHT4 : "highlight4" +}; + +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, + + /** + * 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 (!this.parent) { + 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(YAHOO.widget.Calendar._DEFAULT_CONFIG.CLOSE.key); + + 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(YAHOO.widget.Calendar._DEFAULT_CONFIG.TITLE.key); + + var DEPR_CLOSE_PATH = "us/my/bn/x_d.gif"; + + var linkClose; + + if (close === true) { + linkClose = YAHOO.util.Dom.getElementsByClassName("link-close", "a", this.oDomContainer)[0] || document.createElement("a"); + linkClose.href = "#"; + linkClose.className = "link-close"; + YAHOO.util.Event.addListener(linkClose, "click", function(e, cal) {cal.hide(); YAHOO.util.Event.preventDefault(e); }, this); + + if (YAHOO.widget.Calendar.IMG_ROOT !== null) { + var imgClose = document.createElement("img"); + imgClose.src = YAHOO.widget.Calendar.IMG_ROOT + DEPR_CLOSE_PATH; + imgClose.className = YAHOO.widget.CalendarGroup.CSS_2UPCLOSE; + linkClose.appendChild(imgClose); + } else { + linkClose.innerHTML = ''; + } + + 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() { + + var defEvents = YAHOO.widget.Calendar._EVENT_TYPES; + + /** + * Fired before a selection is made + * @event beforeSelectEvent + */ + this.beforeSelectEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_SELECT); + + /** + * 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(defEvents.SELECT); + + /** + * Fired before a selection is made + * @event beforeDeselectEvent + */ + this.beforeDeselectEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_DESELECT); + + /** + * 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(defEvents.DESELECT); + + /** + * Fired when the Calendar page is changed + * @event changePageEvent + */ + this.changePageEvent = new YAHOO.util.CustomEvent(defEvents.CHANGE_PAGE); + + /** + * Fired before the Calendar is rendered + * @event beforeRenderEvent + */ + this.beforeRenderEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_RENDER); + + /** + * Fired when the Calendar is rendered + * @event renderEvent + */ + this.renderEvent = new YAHOO.util.CustomEvent(defEvents.RENDER); + + /** + * Fired when the Calendar is reset + * @event resetEvent + */ + this.resetEvent = new YAHOO.util.CustomEvent(defEvents.RESET); + + /** + * Fired when the Calendar is cleared + * @event clearEvent + */ + this.clearEvent = new YAHOO.util.CustomEvent(defEvents.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 cell,index,d,date; + + var target = YAHOO.util.Event.getTarget(e); + var tagName = target.tagName.toLowerCase(); + var defSelector = false; + + while (tagName != "td" && ! YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) { + + if (!defSelector && tagName == "a" && YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTOR)) { + defSelector = true; + } + + target = target.parentNode; + tagName = target.tagName.toLowerCase(); + if (tagName == "html") { + return; + } + } + + if (defSelector) { + // Stop link href navigation for default renderer + YAHOO.util.Event.preventDefault(e); + } + + 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() { + + var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; + + /** + * The month/year representing the current visible Calendar date (mm/yyyy) + * @config pagedate + * @type String + * @default today's date + */ + this.cfg.addProperty(defCfg.PAGEDATE.key, { 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(defCfg.SELECTED.key, { value:[], handler:this.configSelected } ); + + /** + * The title to display above the Calendar's month header + * @config title + * @type String + * @default "" + */ + this.cfg.addProperty(defCfg.TITLE.key, { value:defCfg.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(defCfg.CLOSE.key, { value:defCfg.CLOSE.value, 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(defCfg.IFRAME.key, { value:defCfg.IFRAME.value, 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(defCfg.MINDATE.key, { value:defCfg.MINDATE.value, handler:this.configMinDate } ); + + /** + * The maximum selectable date in the current Calendar (mm/dd/yyyy) + * @config maxdate + * @type String + * @default null + */ + this.cfg.addProperty(defCfg.MAXDATE.key, { value:defCfg.MAXDATE.value, 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(defCfg.MULTI_SELECT.key, { value:defCfg.MULTI_SELECT.value, 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(defCfg.START_WEEKDAY.key, { value:defCfg.START_WEEKDAY.value, 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(defCfg.SHOW_WEEKDAYS.key, { value:defCfg.SHOW_WEEKDAYS.value, 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(defCfg.SHOW_WEEK_HEADER.key, { value:defCfg.SHOW_WEEK_HEADER.value, 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(defCfg.SHOW_WEEK_FOOTER.key,{ value:defCfg.SHOW_WEEK_FOOTER.value, 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(defCfg.HIDE_BLANK_WEEKS.key, { value:defCfg.HIDE_BLANK_WEEKS.value, handler:this.configOptions, validator:this.cfg.checkBoolean } ); + + /** + * The image that should be used for the left navigation arrow. + * @config NAV_ARROW_LEFT + * @type String + * @deprecated You can customize the image by overriding the default CSS class for the left arrow - "calnavleft" + * @default null + */ + this.cfg.addProperty(defCfg.NAV_ARROW_LEFT.key, { value:defCfg.NAV_ARROW_LEFT.value, handler:this.configOptions } ); + + /** + * The image that should be used for the right navigation arrow. + * @config NAV_ARROW_RIGHT + * @type String + * @deprecated You can customize the image by overriding the default CSS class for the right arrow - "calnavright" + * @default null + */ + this.cfg.addProperty(defCfg.NAV_ARROW_RIGHT.key, { value:defCfg.NAV_ARROW_RIGHT.value, 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(defCfg.MONTHS_SHORT.key, { value:defCfg.MONTHS_SHORT.value, 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(defCfg.MONTHS_LONG.key, { value:defCfg.MONTHS_LONG.value, 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(defCfg.WEEKDAYS_1CHAR.key, { value:defCfg.WEEKDAYS_1CHAR.value, 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(defCfg.WEEKDAYS_SHORT.key, { value:defCfg.WEEKDAYS_SHORT.value, 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(defCfg.WEEKDAYS_MEDIUM.key, { value:defCfg.WEEKDAYS_MEDIUM.value, 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(defCfg.WEEKDAYS_LONG.key, { value:defCfg.WEEKDAYS_LONG.value, handler:this.configLocale } ); + + /** + * Refreshes the locale values used to build the Calendar. + * @method refreshLocale + * @private + */ + var refreshLocale = function() { + this.cfg.refireEvent(defCfg.LOCALE_MONTHS.key); + this.cfg.refireEvent(defCfg.LOCALE_WEEKDAYS.key); + }; + + this.cfg.subscribeToConfigEvent(defCfg.START_WEEKDAY.key, refreshLocale, this, true); + this.cfg.subscribeToConfigEvent(defCfg.MONTHS_SHORT.key, refreshLocale, this, true); + this.cfg.subscribeToConfigEvent(defCfg.MONTHS_LONG.key, refreshLocale, this, true); + this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_1CHAR.key, refreshLocale, this, true); + this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_SHORT.key, refreshLocale, this, true); + this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_MEDIUM.key, refreshLocale, this, true); + this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_LONG.key, 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(defCfg.LOCALE_MONTHS.key, { value:defCfg.LOCALE_MONTHS.value, 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(defCfg.LOCALE_WEEKDAYS.key, { value:defCfg.LOCALE_WEEKDAYS.value, 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(defCfg.DATE_DELIMITER.key, { value:defCfg.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(defCfg.DATE_FIELD_DELIMITER.key, { value:defCfg.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(defCfg.DATE_RANGE_DELIMITER.key, { value:defCfg.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(defCfg.MY_MONTH_POSITION.key, { value:defCfg.MY_MONTH_POSITION.value, 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(defCfg.MY_YEAR_POSITION.key, { value:defCfg.MY_YEAR_POSITION.value, 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(defCfg.MD_MONTH_POSITION.key, { value:defCfg.MD_MONTH_POSITION.value, 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(defCfg.MD_DAY_POSITION.key, { value:defCfg.MD_DAY_POSITION.value, 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(defCfg.MDY_MONTH_POSITION.key, { value:defCfg.MDY_MONTH_POSITION.value, 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(defCfg.MDY_DAY_POSITION.key, { value:defCfg.MDY_DAY_POSITION.value, 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(defCfg.MDY_YEAR_POSITION.key, { value:defCfg.MDY_YEAR_POSITION.value, 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) { + this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key, this._parsePageDate(args[0]), true); +}; + +/** +* The default handler for the "mindate" property +* @method configMinDate +*/ +YAHOO.widget.Calendar.prototype.configMinDate = function(type, args, obj) { + var val = args[0]; + if (YAHOO.lang.isString(val)) { + val = this._parseDate(val); + this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.MINDATE.key, 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 (YAHOO.lang.isString(val)) { + val = this._parseDate(val); + this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.MAXDATE.key, 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]; + var cfgSelected = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key; + + if (selected) { + if (YAHOO.lang.isString(selected)) { + this.cfg.setProperty(cfgSelected, this._parseDates(selected), true); + } + } + if (! this._selectedDates) { + this._selectedDates = this.cfg.getProperty(cfgSelected); + } +}; + +/** +* The default handler for all configuration options properties +* @method configOptions +*/ +YAHOO.widget.Calendar.prototype.configOptions = function(type, args, obj) { + this.Options[type.toUpperCase()] = args[0]; +}; + +/** +* The default handler for all configuration locale properties +* @method configLocale +*/ +YAHOO.widget.Calendar.prototype.configLocale = function(type, args, obj) { + var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; + this.Locale[type.toUpperCase()] = args[0]; + + this.cfg.refireEvent(defCfg.LOCALE_MONTHS.key); + this.cfg.refireEvent(defCfg.LOCALE_WEEKDAYS.key); +}; + +/** +* The default handler for all configuration locale field length properties +* @method configLocaleValues +*/ +YAHOO.widget.Calendar.prototype.configLocaleValues = function(type, args, obj) { + var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; + + type = type.toLowerCase(); + var val = args[0]; + + switch (type) { + case defCfg.LOCALE_MONTHS.key: + switch (val) { + case YAHOO.widget.Calendar.SHORT: + this.Locale.LOCALE_MONTHS = this.cfg.getProperty(defCfg.MONTHS_SHORT.key).concat(); + break; + case YAHOO.widget.Calendar.LONG: + this.Locale.LOCALE_MONTHS = this.cfg.getProperty(defCfg.MONTHS_LONG.key).concat(); + break; + } + break; + case defCfg.LOCALE_WEEKDAYS.key: + switch (val) { + case YAHOO.widget.Calendar.ONE_CHAR: + this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_1CHAR.key).concat(); + break; + case YAHOO.widget.Calendar.SHORT: + this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_SHORT.key).concat(); + break; + case YAHOO.widget.Calendar.MEDIUM: + this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_MEDIUM.key).concat(); + break; + case YAHOO.widget.Calendar.LONG: + this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_LONG.key).concat(); + break; + } + + var START_WEEKDAY = this.cfg.getProperty(defCfg.START_WEEKDAY.key); + + 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) { + var leftArrow = this.cfg.getProperty(defCfg.NAV_ARROW_LEFT.key); + // Check for deprecated customization - If someone set IMG_ROOT, but didn't set NAV_ARROW_LEFT, then set NAV_ARROW_LEFT to the old deprecated value + if (leftArrow === null && YAHOO.widget.Calendar.IMG_ROOT !== null) { + leftArrow = YAHOO.widget.Calendar.IMG_ROOT + DEPR_NAV_LEFT; + } + var leftStyle = (leftArrow === null) ? "" : ' style="background-image:url(' + leftArrow + ')"'; + html[html.length] = ' '; + } + + html[html.length] = this.buildMonthLabel(); + + if (renderRight) { + var rightArrow = this.cfg.getProperty(defCfg.NAV_ARROW_RIGHT.key); + if (rightArrow === null && YAHOO.widget.Calendar.IMG_ROOT !== null) { + rightArrow = YAHOO.widget.Calendar.IMG_ROOT + DEPR_NAV_RIGHT; + } + var rightStyle = (rightArrow === null) ? "" : ' style="background-image:url(' + rightArrow + ')"'; + html[html.length] = ' '; + } + + html[html.length] = '
          \n\n'; + + if (this.cfg.getProperty(defCfg.SHOW_WEEKDAYS.key)) { + 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) { + + var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; + + html[html.length] = ''; + + if (this.cfg.getProperty(defCfg.SHOW_WEEK_HEADER.key)) { + html[html.length] = ' '; + } + + for(var i=0;i'; + } + + if (this.cfg.getProperty(defCfg.SHOW_WEEK_FOOTER.key)) { + 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 defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; + + var startDay = this.cfg.getProperty(defCfg.START_WEEKDAY.key); + + 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 weekNum,weekClass; + var weekPrefix = "w"; + var cellPrefix = "_cell"; + var workingDayPrefix = "wd"; + var dayPrefix = "d"; + + var cellRenderers; + var renderer; + + var todayYear = this.today.getFullYear(); + var todayMonth = this.today.getMonth(); + var todayDate = this.today.getDate(); + + var useDate = this.cfg.getProperty(defCfg.PAGEDATE.key); + var hideBlankWeeks = this.cfg.getProperty(defCfg.HIDE_BLANK_WEEKS.key); + var showWeekFooter = this.cfg.getProperty(defCfg.SHOW_WEEK_FOOTER.key); + var showWeekHeader = this.cfg.getProperty(defCfg.SHOW_WEEK_HEADER.key); + var mindate = this.cfg.getProperty(defCfg.MINDATE.key); + var maxdate = this.cfg.getProperty(defCfg.MAXDATE.key); + + if (mindate) { + mindate = YAHOO.widget.DateMath.clearTime(mindate); + } + if (maxdate) { + maxdate = YAHOO.widget.DateMath.clearTime(maxdate); + } + + 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 = weekPrefix + weekNum; + + // Local OOM check for performance, since we already have pagedate + if (r !== 0 && hideBlankWeeks === true && workingDate.getMonth() != useDate.getMonth()) { + break; + } else { + + html[html.length] = ''; + + if (showWeekHeader) { html = this.renderRowHeader(weekNum, html); } + + for (var d=0;d<7;d++){ // Render actual days + + cellRenderers = []; + renderer = null; + + this.clearElement(cell); + cell.className = this.Style.CSS_CELL; + cell.id = this.id + cellPrefix + i; + + if (workingDate.getDate() == todayDate && + workingDate.getMonth() == todayMonth && + workingDate.getFullYear() == todayYear) { + cellRenderers[cellRenderers.length]=cal.renderCellStyleToday; + } + + var workingArray = [workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()]; + this.cellDates[this.cellDates.length] = workingArray; // Add this date to cellDates + + // Local OOM check for performance, since we already have pagedate + if (workingDate.getMonth() != useDate.getMonth()) { + cellRenderers[cellRenderers.length]=cal.renderCellNotThisMonth; + } else { + YAHOO.util.Dom.addClass(cell, workingDayPrefix + workingDate.getDay()); + YAHOO.util.Dom.addClass(cell, dayPrefix + 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(workingArray) > -1) { + cellRenderers[cellRenderers.length]=cal.renderCellStyleSelected; + } + + 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) { + if (cellRenderers[x].call(cal, 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 (hideBlankWeeks && postDays >= 7) { + 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 (showWeekFooter) { 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(); + + var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; + + // Find starting day of the current month + var workingDate = YAHOO.widget.DateMath.findMonthStart(this.cfg.getProperty(defCfg.PAGEDATE.key)); + + 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(defCfg.TITLE.key); + this.cfg.refireEvent(defCfg.CLOSE.key); + this.cfg.refireEvent(defCfg.IFRAME.key); + + 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 anchor = "a"; + var mousedown = "mousedown"; + + var linkLeft = YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_LEFT, anchor, root); + var linkRight = YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_RIGHT, anchor, root); + + if (linkLeft && linkLeft.length > 0) { + this.linkLeft = linkLeft[0]; + YAHOO.util.Event.addListener(this.linkLeft, mousedown, cal.previousMonth, cal, true); + } + + if (linkRight && linkRight.length > 0) { + 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 (YAHOO.lang.hasOwnProperty(this.domEventMap, 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) { + var cfgPageDate = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key; + this.cfg.setProperty(cfgPageDate, YAHOO.widget.DateMath.add(this.cfg.getProperty(cfgPageDate), 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) { + var cfgPageDate = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key; + this.cfg.setProperty(cfgPageDate, YAHOO.widget.DateMath.subtract(this.cfg.getProperty(cfgPageDate), 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) { + var cfgPageDate = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key; + this.cfg.setProperty(cfgPageDate, YAHOO.widget.DateMath.add(this.cfg.getProperty(cfgPageDate), 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) { + var cfgPageDate = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key; + this.cfg.setProperty(cfgPageDate, YAHOO.widget.DateMath.subtract(this.cfg.getProperty(cfgPageDate), 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() { + var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; + this.cfg.resetProperty(defCfg.SELECTED.key); + this.cfg.resetProperty(defCfg.PAGEDATE.key); + 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() { + var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; + this.cfg.setProperty(defCfg.SELECTED.key, []); + this.cfg.setProperty(defCfg.PAGEDATE.key, 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 cfgSelected = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key; + + var selected = this.cfg.getProperty(cfgSelected); + var aToBeSelected = this._toFieldArray(date); + + for (var a=0;a -1) { + if (this.cfg.getProperty(defCfg.PAGEDATE.key).getMonth() == dCellDate.getMonth() && + this.cfg.getProperty(defCfg.PAGEDATE.key).getFullYear() == dCellDate.getFullYear()) { + YAHOO.util.Dom.removeClass(cell, this.Style.CSS_CELL_SELECTED); + } + + selected.splice(cellDateIndex, 1); + } + + if (this.parent) { + this.parent.cfg.setProperty(defCfg.SELECTED.key, selected); + } else { + this.cfg.setProperty(defCfg.SELECTED.key, 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 cfgSelected = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key; + + var selected = this.cfg.getProperty(cfgSelected); + var count = selected.length; + var sel = selected.concat(); + + if (this.parent) { + this.parent.cfg.setProperty(cfgSelected, []); + } else { + this.cfg.setProperty(cfgSelected, []); + } + + 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 (YAHOO.lang.isString(date)) { + returnDate = this._parseDates(date); + } else if (YAHOO.lang.isArray(date)) { + 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() { + + var defCfg = YAHOO.widget.CalendarGroup._DEFAULT_CONFIG; + + /** + * 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(defCfg.PAGES.key, { value:defCfg.PAGES.value, 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(defCfg.PAGEDATE.key, { 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(defCfg.SELECTED.key, { value:[], handler:this.configSelected } ); + + /** + * The title to display above the CalendarGroup's month header + * @config title + * @type String + * @default "" + */ + this.cfg.addProperty(defCfg.TITLE.key, { value:defCfg.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(defCfg.CLOSE.key, { value:defCfg.CLOSE.value, 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(defCfg.IFRAME.key, { value:defCfg.IFRAME.value, 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(defCfg.MINDATE.key, { value:defCfg.MINDATE.value, handler:this.delegateConfig } ); + + /** + * The maximum selectable date in the current Calendar (mm/dd/yyyy) + * @config maxdate + * @type String + * @default null + */ + this.cfg.addProperty(defCfg.MAXDATE.key, { value:defCfg.MAXDATE.value, 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(defCfg.MULTI_SELECT.key, { value:defCfg.MULTI_SELECT.value, 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(defCfg.START_WEEKDAY.key, { value:defCfg.START_WEEKDAY.value, 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(defCfg.SHOW_WEEKDAYS.key, { value:defCfg.SHOW_WEEKDAYS.value, 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(defCfg.SHOW_WEEK_HEADER.key,{ value:defCfg.SHOW_WEEK_HEADER.value, 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(defCfg.SHOW_WEEK_FOOTER.key,{ value:defCfg.SHOW_WEEK_FOOTER.value, 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(defCfg.HIDE_BLANK_WEEKS.key,{ value:defCfg.HIDE_BLANK_WEEKS.value, handler:this.delegateConfig, validator:this.cfg.checkBoolean } ); + + /** + * The image that should be used for the left navigation arrow. + * @config NAV_ARROW_LEFT + * @type String + * @deprecated You can customize the image by overriding the default CSS class for the left arrow - "calnavleft" + * @default null + */ + this.cfg.addProperty(defCfg.NAV_ARROW_LEFT.key, { value:defCfg.NAV_ARROW_LEFT.value, handler:this.delegateConfig } ); + + /** + * The image that should be used for the right navigation arrow. + * @config NAV_ARROW_RIGHT + * @type String + * @deprecated You can customize the image by overriding the default CSS class for the right arrow - "calnavright" + * @default null + */ + this.cfg.addProperty(defCfg.NAV_ARROW_RIGHT.key, { value:defCfg.NAV_ARROW_RIGHT.value, 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(defCfg.MONTHS_SHORT.key, { value:defCfg.MONTHS_SHORT.value, 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(defCfg.MONTHS_LONG.key, { value:defCfg.MONTHS_LONG.value, 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(defCfg.WEEKDAYS_1CHAR.key, { value:defCfg.WEEKDAYS_1CHAR.value, 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(defCfg.WEEKDAYS_SHORT.key, { value:defCfg.WEEKDAYS_SHORT.value, 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(defCfg.WEEKDAYS_MEDIUM.key, { value:defCfg.WEEKDAYS_MEDIUM.value, 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(defCfg.WEEKDAYS_LONG.key, { value:defCfg.WEEKDAYS_LONG.value, 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(defCfg.LOCALE_MONTHS.key, { value:defCfg.LOCALE_MONTHS.value, 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(defCfg.LOCALE_WEEKDAYS.key, { value:defCfg.LOCALE_WEEKDAYS.value, 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(defCfg.DATE_DELIMITER.key, { value:defCfg.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(defCfg.DATE_FIELD_DELIMITER.key,{ value:defCfg.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(defCfg.DATE_RANGE_DELIMITER.key,{ value:defCfg.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(defCfg.MY_MONTH_POSITION.key, { value:defCfg.MY_MONTH_POSITION.value, 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(defCfg.MY_YEAR_POSITION.key, { value:defCfg.MY_YEAR_POSITION.value, 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(defCfg.MD_MONTH_POSITION.key, { value:defCfg.MD_MONTH_POSITION.value, 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(defCfg.MD_DAY_POSITION.key, { value:defCfg.MD_DAY_POSITION.value, 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(defCfg.MDY_MONTH_POSITION.key, { value:defCfg.MDY_MONTH_POSITION.value, 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(defCfg.MDY_DAY_POSITION.key, { value:defCfg.MDY_DAY_POSITION.value, 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(defCfg.MDY_YEAR_POSITION.key, { value:defCfg.MDY_YEAR_POSITION.value, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + +}; + +/** +* Initializes CalendarGroup's built-in CustomEvents +* @method initEvents +*/ +YAHOO.widget.CalendarGroup.prototype.initEvents = function() { + var me = this; + var strEvent = "Event"; + + /** + * 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 0) ? this.pages[0].cfg.getProperty(cfgSelected) : []; + this.cfg.setProperty(cfgSelected, selected, true); +}; + + +/** +* 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;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 +*
        • If MULTI_SELECT is false, selectCell will select the cell at the specified index for only the last displayed Calendar page.
        • +*
        • If MULTI_SELECT is true, selectCell will select the cell at the specified index, on each displayed Calendar page.
        • +* +* @method selectCell +* @param {Number} cellIndex The index of the cell to be selected. +* @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=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 11)) { + var DM = YAHOO.widget.DateMath; + var newDate = DM.add(date, DM.MONTH, iMonth-date.getMonth()); + date.setTime(newDate.getTime()); + } else { + date.setMonth(iMonth); + } +}; + + +/** +* 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 +* @deprecated Along with Calendar.IMG_ROOT and NAV_ARROW_LEFT, NAV_ARROW_RIGHT configuration properties. +* Calendar's Style.CSS_CLOSE property now represents the CSS class used to render the close icon +* @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", + "configIframe", + "hide", + "show", + "browser"); + +/** +* The set of default Config property keys and values for the CalendarGroup +* @property YAHOO.widget.CalendarGroup._DEFAULT_CONFIG +* @final +* @static +* @private +* @type Object +*/ +YAHOO.widget.CalendarGroup._DEFAULT_CONFIG = YAHOO.widget.Calendar._DEFAULT_CONFIG; +YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.PAGES = {key:"pages", value:2}; + +/** +* 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; + +YAHOO.register("calendar", YAHOO.widget.Calendar, {version: "2.2.2", build: "204"}); diff --git a/www/extras/yui/build/connection/README b/www/extras/yui/build/connection/README new file mode 100644 index 000000000..69e251af4 --- /dev/null +++ b/www/extras/yui/build/connection/README @@ -0,0 +1,206 @@ +Connection Manager Release Notes + +*** version 2.2.2 *** + +* No revisions. + +*** version 2.2.1 *** + +* setForm() will include the correct name-value of the HTML Submit button +clicked where multiple HTML Submit button options are present in an HTML form. +To enable this feature, include the Event utility source file as a dependency +before the Connection Manager source file. + +* The XHR implementation in IE6 and IE7, Opera, and Safari do not properly +handle an HTTP 204 response. IE6/7 will instead return a Win error 1223. +handleTransactionResponse() will treat 1223 as an HTTP 204, and route the +response appropriately to the success callback. createResponseObject() will +normalize the response object's status and statusText values to 204 and "No +Content" respectively. However, no headers are returned. + +Opera and Safari provide no discernable response with HTTP 204(e.g., response +object's properties are undefined). This response will trigger the failure +callback with a status of 0 and statusText of "communication failure". + +*** version 2.2.0 *** + +* initHeader() now accepts a third argument as a boolean. When set to true, +this specific header will automatically be sent with each transaction. +Otherwise, the header will be set and sent for the specific transaction only. +Example: initHeader('X-YUI-State','Beta', true); all transactions will send this +header. + * resetDefaultHeaders() will clear the default headers collection. + +* All Connection Mananger transactions will broadcast the header: "X-Requested- +With: XMLHttpRequest". + * This can be turned off: YAHOO.util.Connect.setDefaultXhrHeader(false); + +* The HTTP method argument in asyncRequest is now case-insensitive. + +* uploadFile() will now correctly handle the absence of a callback object, +allowing the transaction to complete silently. + +*** version 0.12.2 *** + +* The Opera/Connection Manager concurrent object condition, described in version +0.12.0, no longer tests applies for Opera, version 9.10. + +*** version 0.12.1 *** + +* connection-debug.js corrected and synchronized with connection.js. Code +inconsistencies between the two files existed in 0.12.0. + +*** version 0.12.0 *** + +* When uploading files via setForm() and asyncRequest includes a POST data +argument, appendPostData() will create hidden input fields for each postData +label/value and append each field to the form object. + +* setForm() returns the assembled label/value string of the parsed HTML form +fields. + +* NOTE: Opera 9.02 does not allow for more than 12 concurrent Connection Manager +objects. + +The following example creates 12 requests in a loop: +for(var n=0; n<=12; i++){ + conn[n] = YAHOO.util.Connect.asyncRequest('GET', sUrl, callback); +} + +If n > 13, Opera 9.02 will crash. Connection manager objects count n must be <= +12 at all times. This condition was not present in Opera version 9.01. + +This condition does not apply to other A-Grade browsers ( +http://developer.yahoo.com/yui/articles/gbs/gbs_browser-chart.html) + +*** version 0.11.3 *** + +* YUI Event dependency for file uploading is now optional. + +* uploadFile() now sets unique IDs for each file upload transaction to prevent +iframe collisions with parallel uploads. + +* The callback object now has property responseXML to provide support for file +upload transactions that return an XML document. + +* setForm() will verify if a select option value attribute is present and use +its value, including empty string, before using the text node value. + +* Modified polling mechanism in handleReadyState() and +handleTransactionResponse() to prevent infinite polling if JavaScript errors +occur in the user-defined callback. + +* createFrame() will now accept a boolean argument of true to set the frame +source to "javascript:false" to prevent IE from throwing security warnings in an +HTTPS environment. + +* setHeader() now enumerates through the _http_header object using +hasOwnProperty() to prevent collisions with members added to Object via +prototype. + +* If using setForm() and asyncRequest includes a POST data argument, the data +will be concatenated to the HTML form POST message. + +*** version 0.11.2 *** + +* No revisions. + +*** version 0.11.1 *** + +* uploadFile() now verifies the existence of callback.upload before invoking +callback, with or without object scope. + +*** version 0.11.0 *** + +* Each transaction can be defined with a timeout threshold, in milliseconds, +through the callback object. If the threshold is reached, and the transaction +hasn't yet completed, the transaction will call abort(). + +* abort() will now accept a callback object as the second argument. The +failure callback will receive a response object to indicate the transaction was +aborted. + +* setForm() will now support file uploads by setting the second argument to +true (e.g., YAHOO.util.Connect.setForm(formObject, true). File upload does not +use the callback success or failure handler. Instead, it uses a new callback +object handler: upload. + +* HTML form submit will no longer submit form fields without a defined name +attribute. + +* The default POST header of 'Content-Type','application/x-www-form-urlencoded' +can be overridden by calling setDefaultPostHeader(false). This +will remove the default header from non-HTML form, POST submissions. + +* setHeader() now enumerates through the _http_header object with +propertyIsEnumerable to prevent collisions with members added to Object via +prototype. + +*** version 0.10.0 *** + +* handleTransactionResponse() now treats the full HTTP 2xx range as a success +case, instead of just HTTP 200. + +* To accommodate multiple field values in Mozilla/Firefox, multiple initHeader +calls with the same label will now result in the values concatenated to a +comma- delimited string value. +Example: +Setting Content-Type:'application/x-www-form-urlencoded' and Content- +Type:'text/xml' will result in Content-Type:'application/x-www-form-urlencoded, +text/xml'. + +* Default polling interval lowered to 50ms. + +* YAHOO.util.Connect.setPollingInterval() will allow you to set a polling +interval -- in milliseconds -- to override the default value. + +* YAHOO.util.Connect.getResponseHeader[headerLabel] now supported as a response +object property to provide symmetry with the native XHR object's property. +Example: +YAHOO.util.Connect.getResponseHeader['Content-Length'] will return the value +for the Content-Length header, if the header is available. + +* YAHOO.util.Connect.allResponseHeaders property renamed to +getAllResponseHeaders to provide symmetry with the native XHR object's +property. + +* YAHOO.util.Connect.setForm() now supports HTTP GET as well as HTTP POST. + +* YAHOO.util.Connect.setForm() now accepts an HTML form object as well as its +name attribute value. + +* YAHOO.util.Connect.setForm() will not submit HTML form fields that are +disabled or do not have a name attribute value. + +* [FIXED] Response exceptions result in infinite callback loop in +Mozilla/Firefox. + +* [FIXED] YAHOO.util.Connect.abort() now properly clears polling interval. + +* [FIXED] isCallInProgress() now verifies whether XHR instance still exists, +and returns false if the connection object is no longer available. + +*** version 0.9.0 *** + +* Initial release + + + + + + + + + + + + + + + + + + + + + diff --git a/www/extras/yui/build/connection/connection-debug.js b/www/extras/yui/build/connection/connection-debug.js new file mode 100644 index 000000000..7d3c7168d --- /dev/null +++ b/www/extras/yui/build/connection/connection-debug.js @@ -0,0 +1,1129 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +/** + * 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 + * @requires yahoo + */ + +/** + * The Connection Manager singleton provides methods for creating and managing + * asynchronous transactions. + * + * @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_headers:{}, + + /** + * @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 client HTTP headers sent for POST + * transactions. + * @property _default_post_header + * @private + * @static + * @type boolean + */ + _default_post_header:'application/x-www-form-urlencoded; charset=UTF-8', + + /** + * @description Determines if a default header of + * 'X-Requested-With: XMLHttpRequest' + * will be added to each transaction. + * @property _use_default_xhr_header + * @private + * @static + * @type boolean + */ + _use_default_xhr_header:true, + + /** + * @description The default header value for the label + * "X-Requested-With". This is sent with each + * transaction, by default, to identify the + * request as being made by YUI Connection Manager. + * @property _default_xhr_header + * @private + * @static + * @type boolean + */ + _default_xhr_header:'XMLHttpRequest', + + /** + * @description Determines if custom, default headers + * are set for each transaction. + * @property _has_default_header + * @private + * @static + * @type boolean + */ + _has_default_headers:true, + + /** + * @description Determines if custom, default headers + * are set for each transaction. + * @property _has_default_header + * @private + * @static + * @type boolean + */ + _default_headers:{}, + + /** + * @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 Tracks the name-value pair of the "clicked" submit button if multiple submit + * buttons are present in an HTML form; and, if YAHOO.util.Event is available. + * @property _submitElementValue + * @private + * @static + * @type string + */ + _submitElementValue:null, + + /** + * @description Determines whether YAHOO.util.Event is available and returns true or false. + * If true, an event listener is bound at the document level to trap click events that + * resolve to a target type of "Submit". This listener will enable setForm() to determine + * the clicked "Submit" value in a multi-Submit button, HTML form. + * @property _hasSubmitListener + * @private + * @static + * @type boolean + */ + _hasSubmitListener:(function() + { + if(YAHOO.util.Event){ + YAHOO.util.Event.addListener( + document, + 'click', + function(e){ + var obj = YAHOO.util.Event.getTarget(e); + if(obj.type == 'submit'){ + YAHOO.util.Connect._submitElementValue = encodeURIComponent(obj.name) + "=" + encodeURIComponent(obj.value); + } + }) + return true; + } + return false; + })(), + + /** + * @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); + YAHOO.log('ActiveX Program Id ' + id + ' added to _msxml_progid.', 'info', 'Connection'); + }, + + /** + * @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; + YAHOO.log('Use default POST header set to ' + b, 'info', 'Connection'); + }, + + /** + * @description Member to enable or disable the default POST header. + * @method setDefaultXhrHeader + * @public + * @static + * @param {boolean} b Set and use default header - true or false . + * @return void + */ + setDefaultXhrHeader:function(b) + { + this._use_default_xhr_header = b; + YAHOO.log('Use default transaction header set to ' + b, 'info', 'Connection'); + }, + + /** + * @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; + YAHOO.log('Default polling interval set to ' + i +'ms', 'info', 'Connection'); + } + }, + + /** + * @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 }; + YAHOO.log('XHR object created for transaction ' + transactionId, 'info', 'Connection'); + } + catch(e) + { + for(var i=0; i= 200 && httpStatus < 300 || httpStatus === 1223){ + responseObject = this.createResponseObject(o, callback.argument); + if(callback.success){ + if(!callback.scope){ + callback.success(responseObject); + YAHOO.log('Success callback. HTTP code is ' + httpStatus, 'info', 'Connection'); + } + else{ + // If a scope property is defined, the callback will be fired from + // the context of the object. + callback.success.apply(callback.scope, [responseObject]); + YAHOO.log('Success callback with scope. HTTP code is ' + httpStatus, 'info', 'Connection'); + } + } + } + else{ + 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); + YAHOO.log('Failure callback. Exception detected. Status code is ' + httpStatus, 'warn', 'Connection'); + } + else{ + callback.failure.apply(callback.scope, [responseObject]); + YAHOO.log('Failure callback with scope. Exception detected. Status code is ' + httpStatus, 'warn', 'Connection'); + } + } + break; + default: + responseObject = this.createResponseObject(o, callback.argument); + if(callback.failure){ + if(!callback.scope){ + callback.failure(responseObject); + YAHOO.log('Failure callback. HTTP status code is ' + httpStatus, 'warn', 'Connection'); + } + else{ + callback.failure.apply(callback.scope, [responseObject]); + YAHOO.log('Failure callback with scope. HTTP status code is ' + httpStatus, 'warn', 'Connection'); + } + } + } + } + + 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'); + + // 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); + YAHOO.log('File upload iframe created. Id is:' + frameId, 'info', 'Connection'); + }, + + /** + * @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 = []; + 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 uploadEncoding = 'multipart/form-data'; + var io = document.getElementById(frameId); + + // Initialize the HTML form properties in case they are + // not defined in the HTML form. + this._formNode.setAttribute('action', uri); + this._formNode.setAttribute('method', 'POST'); + this._formNode.setAttribute("target", frameId); + + if(this._formNode.encoding){ + // IE does not respect property enctype for HTML forms. + // Instead it uses the property - "encoding". + this._formNode.encoding = uploadEncoding; + } + else{ + this._formNode.enctype = uploadEncoding; + } + + + if(postData){ + var oElements = this.appendPostData(postData); + } + + this._formNode.submit(); + + if(oElements && oElements.length > 0){ + for(var i=0; i < oElements.length; i++){ + this._formNode.removeChild(oElements[i]); + } + } + + // 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 && callback.upload){ + if(!callback.scope){ + callback.upload(obj); + YAHOO.log('Upload callback.', 'info', 'Connection'); + } + else{ + callback.upload.apply(callback.scope, [obj]); + YAHOO.log('Upload callback with scope.', 'info', 'Connection'); + } + } + + 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); + YAHOO.log('File upload iframe destroyed. Id is:' + frameId, 'info', 'Connection'); + }, 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); + YAHOO.log('Transaction ' + o.tId + ' aborted.', 'info', 'Connection'); + + return true; + } + else{ + YAHOO.log('Transaction ' + o.tId + ' abort call failed.', 'warn', 'Connection'); + 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; + YAHOO.log('Connection object for transaction ' + o.tId + ' destroyed.', 'info', 'Connection'); + //dereference the connection object. + o = null; + } +}; + +YAHOO.register("connection", YAHOO.util.Connect, {version: "2.2.2", build: "204"}); diff --git a/www/extras/yui/build/connection/connection-min.js b/www/extras/yui/build/connection/connection-min.js new file mode 100644 index 000000000..0118f4089 --- /dev/null +++ b/www/extras/yui/build/connection/connection-min.js @@ -0,0 +1,109 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ + +YAHOO.util.Connect={_msxml_progid:['MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP','Microsoft.XMLHTTP'],_http_headers:{},_has_http_headers:false,_use_default_post_header:true,_default_post_header:'application/x-www-form-urlencoded; charset=UTF-8',_use_default_xhr_header:true,_default_xhr_header:'XMLHttpRequest',_has_default_headers:true,_default_headers:{},_isFormSubmit:false,_isFileUpload:false,_formNode:null,_sFormData:null,_poll:{},_timeOut:{},_polling_interval:50,_transaction_id:0,_submitElementValue:null,_hasSubmitListener:(function() +{if(YAHOO.util.Event){YAHOO.util.Event.addListener(document,'click',function(e){var obj=YAHOO.util.Event.getTarget(e);if(obj.type=='submit'){YAHOO.util.Connect._submitElementValue=encodeURIComponent(obj.name)+"="+encodeURIComponent(obj.value);}}) +return true;} +return false;})(),setProgId:function(id) +{this._msxml_progid.unshift(id);},setDefaultPostHeader:function(b) +{this._use_default_post_header=b;},setDefaultXhrHeader:function(b) +{this._use_default_xhr_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=200&&httpStatus<300||httpStatus===1223){responseObject=this.createResponseObject(o,callback.argument);if(callback.success){if(!callback.scope){callback.success(responseObject);} +else{callback.success.apply(callback.scope,[responseObject]);}}} +else{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]);}}}} +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');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=[];var postMessage=postData.split('&');for(var i=0;i0){for(var i=0;i= 200 && httpStatus < 300 || httpStatus === 1223){ + 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]); + } + } + } + else{ + 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]); + } + } + } + } + + 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'); + + // 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 = []; + 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 uploadEncoding = 'multipart/form-data'; + var io = document.getElementById(frameId); + + // Initialize the HTML form properties in case they are + // not defined in the HTML form. + this._formNode.setAttribute('action', uri); + this._formNode.setAttribute('method', 'POST'); + this._formNode.setAttribute("target", frameId); + + if(this._formNode.encoding){ + // IE does not respect property enctype for HTML forms. + // Instead it uses the property - "encoding". + this._formNode.encoding = uploadEncoding; + } + else{ + this._formNode.enctype = uploadEncoding; + } + + + if(postData){ + var oElements = this.appendPostData(postData); + } + + this._formNode.submit(); + + if(oElements && oElements.length > 0){ + for(var i=0; i < oElements.length; i++){ + this._formNode.removeChild(oElements[i]); + } + } + + // 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 && 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; + } +}; + +YAHOO.register("connection", YAHOO.util.Connect, {version: "2.2.2", build: "204"}); diff --git a/www/extras/yui/build/container/README b/www/extras/yui/build/container/README new file mode 100644 index 000000000..f9f5690db --- /dev/null +++ b/www/extras/yui/build/container/README @@ -0,0 +1,277 @@ +Container Release Notes + +*** version 2.2.2 *** + ++ Clicking the close button of a Panel (or any instance of a Panel subclass) + registered with an OverlayManager will no longer result in the Panel + receiving focus. + ++ Overlay instances registered with an OverlayManager will now correctly + blur themselves when hidden. + ++ Calling the "destroy" method of an Overlay instance will now result in it + being removed from its OverlayManager instance(s). + ++ The DOM event listener for the event defined by the "focusevent" + configuration property of an OverlayManager instance is now removed from each + Overlay instance when it is removed from its OverlayManager. + ++ All subscribers for an Overlay instance's "focus" and "blur" events are + now unsubscribed when it is removed from its OverlayManager. + + +*** version 2.2.1 *** + ++ Made the default scope for all Custom Events published by Module, Overlay, + Panel, Tooltip, Dialog and SimpleDialog the widget instance. Previously the + default scope for Custom Events was inconsistent across classes; the default + scope for Custom Events published by Overlay was always the Overlay instance + whereas the Custom Events published by all of the other classes had no + default scope. + ++ Added default scope for CustomEvents published by YAHOO.util.Config: + - Default scope for the "configChangedEvent" is now the Config instance. + - Default scope for Config property events is now the Config's owner (widget). + ++ Panel and Tooltip now always convert the value of a DOM element's "tagName" + property to uppercase before evaluating it. This improves + XHTML compatibility. + ++ Pressing the enter key while focused on a form field inside a Dialog will + now trigger the "click" event handler defined by the Dialog's default + button in IE and Firefox. Previously, this behavior only worked in Safari + and Opera. + ++ Added a "yui" prefix to the default CSS class name for Module to be + consistent with the other Container family widgets. + ++ Container/Panel's underlay shadow is now defined as partially-transparent + black rather than gray. This prevents the shadow from lightening the + background color of elements beneath it. + ++ Fixed memory leaks in Panel and Dialog. + ++ The Drag and Drop library is now a truly optional dependency for Panel and its + subclasses. + ++ Panel "focus" and "blur" events are now fired when Panels are focused and + blurred via the "focus" and "blurAll" methods of YAHOO.widget.OverlayManager. + ++ Panel instances rendered without setting the value for the "width" + configuration property will now have their "width" configuration + property set to the value of the Panel's element's "offsetWidth" property + when rendered. This fixes an issue in IE 6 and 7 where Panels that are + rendered without setting the "width" configuration property will only be + draggable by mousing down on the text inside the header, rather than anywhere + inside the header. + ++ Refactored the Container family including the Config class to improve + performance, especially when working with a large number of instances in IE6. + + + +*** version 2.2.0 *** + + Module + - Removed hardcoded file paths for image roots. Affected properties + include: + - YAHOO.widget.Module.IMG_ROOT + - YAHOO.widget.Module.IMG_ROOT_SSL + - HTML elements, created via createElement, now use lowercase. + + Panel + - To shield against CSS class collision, the following references now + have a "yui-" prefix: + - YAHOO.widget.Panel.CSS_PANEL now references CSS class "yui- + panel". + - YAHOO.widget.Panel.CSS_PANEL_CONTAINER now references CSS class + "yui-panel-container". + - Close button can now be configured via the CSS class "container- + close". + - HTML elements, created via createElement, now use lowercase. + + Dialog + - To shield against CSS class collision, the following references now + have a "yui-" prefix: + - YAHOO.widget.Dialog.CSS_DIALOG now references CSS class "yui- + dialog". + - HTML elements, created via createElement, now use lowercase. + + SimpleDialog + - Removed hardcoded file paths for SimpleDialog icons, which are now + configurable in CSS: + - YAHOO.widget.SimpleDialog.ICON_BLOCK now references CSS class + "blckicon". + - YAHOO.widget.SimpleDialog.ICON_ALARM now references CSS class + "alrticon". + - YAHOO.widget.SimpleDialog.ICON_HELP now references CSS class + "hlpicon". + - YAHOO.widget.SimpleDialog.ICON_INFO now references CSS class + "infoicon". + - YAHOO.widget.SimpleDialog.ICON_WARN now references CSS class + "warnicon". + - YAHOO.widget.SimpleDialog.ICON_TIP now references CSS class + "tipicon". + - To provide shield against CSS class collision the following + references now have a "yui-" prefix: + - YAHOO.widget.SimpleDialog.CSS_SIMPLEDIALOG now references CSS + class "yui-simple-dialog"; + + Tooltip + - To shield against CSS class collision, the following references now + have a "yui-" prefix: + - YAHOO.widget.Tooltip.CSS_TOOLTIP now references CSS class "yui- + tipicon" "yui-tt"; + +*** version 0.12.2 *** + + Module + - Corrected issue where listener was not properly removed from resize + monitor element when "monitorresize" is disabled + + Panel + - Fixed issue that would sometimes prevent select lists from working + properly in Firefox + + Dialog + - Fixed error that would occur when trying to create a Dialog where + the first form element is set to "disabled" + - Modified "close" property handler for Dialog/SimpleDialog to call + "cancel" instead of "hide" + +*** version 0.12.1 *** + + All Classes + - "monitorresize" property now functions in situations where + document.domain has been modified. + - YAHOO.widget.Module.textResizeEvent now fires when the font size is + changed (except for Opera, which uses "zoom" functionality that + prevents this) + - Event listeners attached to container elements are now properly + purged on destroy using YAHOO.util.Event.purgeElement + + Panel + - Fixed issue where focus events were broken on the page when a modal + Panel was created + + Dialog + - Fixed bug where hitting "enter" on a Dialog was forcing the default + submission behavior of the form's action to execute + - Dialog no longer tries to give focus to hidden form elements. + - Replaced   references in Panel with   for XHTML + compliance. + - Fixed issue that was preventing Safari from successfully using the + getData() function + +*** version 0.12 *** + + All Classes + - New documentation format implemented, and removed unnecessary + prototype null references previously used for generating + documentation + + Config + - Added 'undefined' check when reading initial properties for + .reset() + - Fixed Firefox warning on .resetProperty() + - Fixed issue preventing resetProperty() from resetting values + correctly + + Module + - Removed unused "childNodesInDom" property + + Overlay + - Converted center() to use Dom utility + - Fixed configVisible() to properly detect actual visible/hidden + status in Internet Explorer, which reports "inherit" for all elements + by default. + - Updated onDomResize to properly reapply "context" property + - Unified scroll/resize handlers so that they fire properly (when the + event has completed) as opposed to constantly (as seen in Mozilla- + based browsers) + + Panel + - Modified modality mask to show before Panel is shown (prior to any + animation) + - Modified buildWrapper to eliminate cloning of the initial markup + module, which fixes issues with select options not maintaining their + default selections in IE + - Modality mask is now z-indexed properly so that the mask z-index is + always one less than the Panel z-index + + Dialog + - Fixed Connection to get "action" attribute using getAttribute, to + allow for form fields named "action" + - Added support for "GET" by retrieving the form "method" rather than + always defaulting to "POST" + + KeyListener + - Fixed to work properly with Safari 2.0 by matching against keyCode + or charCode + +*** version 0.11.4 *** + + - Panel: Modality mask is now properly removed from DOM on Panel + destroy. + +*** version 0.11.3 *** + + - Module: Fixed SSL warning issue in IE + - Overlay: Fixed memory leak related to iframe shim in IE + - Panel: No focusable elements under the mask can now be tabbed to + - Panel: Set Panel container overflow to hidden to fix scrolling issue + in Opera 9 + +*** version 0.11.2 *** + + - All: JsLint optimization + - Overlay: Fixed SSL issues with monitorresize property + - OverlayManager: Fixed z-index incrementing issues + - Dialog: Form elements called "name" will now function properly + - Dialog: Removed unnecessary scope:this reference + +*** version 0.11.1 *** + + - Tooltip: Removed incorrect logger statement + - Dialog: Corrected logic that was causing browser lockup in IE for + SimpleDialog + - Dialog: Fixed "firstButtom" typo + +*** version 0.11.0 *** + + - toString function added to all classes for easy logging + - YAHOO.extend is now being used for inheritance on all container + classes + - Module: monitorresize feature now works on all browsers + - Module: Fixed bug with image root and isSecure + - Overlay: Fixed bugs related to IFRAME shim positioning + - Overlay: center() now works in quirks mode + - Overlay: Overlay now has a custom destroy() method that also removes + the IFRAME shim + - OverlayManager: Fixed bug in the prototype that was preventing + multiple Managers on one page + - OverlayManager: focusEvent now fires at all appropriate times + - Tooltip: context can now be specified as an array, so Tooltips can be + reused across multiple context elements + - Tooltip: preventoverlap now functions properly for large context + elements (i.e, images) + - Tooltip: fixed bugs regarding setTimeout + - Tooltip: added mousemove event to allow for more accurate Tooltip + positioning + - Panel: added dragEvent for monitoring all event handlers for drag and + drop + - Panel: modality mask is now resized on scroll + - Panel: KeyListeners are now properly destroyed when the Panel is + destroyed + - Panel: Header is now sized properly in quirks mode + - Dialog: Blinking cursor issue is fixed for Firefox + - Dialog: callback object for Connection is now public (this.callback) + - Dialog: onsuccess/onfailure properties removed (as a result of the + public callback object) + - Dialog: Dialog is now invisible by default + - Dialog: Buttons are now properly cleaned up on destroy + +*** version 0.10.0 *** + +* Initial release + diff --git a/www/extras/yui/build/container/assets/alrt16_1.gif b/www/extras/yui/build/container/assets/alrt16_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..443d39bbfcdb29d508f2f0d632ee15d72579005c GIT binary patch literal 971 zcmZ?wbhEHb6krfw`0mT_Vuj7`SDU^+*!lD9j92^3o-eU|xzpn17Rwi_te?$sc(LB< z`69b#bM2qaw|lwG^2HjPmpd$8tg(Kv(dxwptLMvXpD(q2xykCqTI>I}<~*C}@N9;| z|NsA=EwFpJ-~8Duhv%zpo=tOjvC8JfTC11aEne+4d$G;p=@iFjvmIXTGJmnj^5t&x zr&AqYZnu2C(C+0{%NHwcUM#bHwa@(3Zu94hZJ#f+eLBtY*<_~|n=N1MF@Ler`q^B& z=Zo#W-Ku@Q+~(ON$ETAWU+pt{x!3&pJiF%$?4B>Pd9lIz8}k zv#+Op7)HTp2w)2V#h)yU3=F;uIv`0dcnCdYow$ryRwm)l6DB4Gk+g(dC56_L>4~z^wOeRtW784ndaCP%f(TF<}v9Z6kOWey$LV&><04x5_ Al>h($ literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/container/assets/blck16_1.gif b/www/extras/yui/build/container/assets/blck16_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..56689611db271fcafe42e652c6496b703f38d9e3 GIT binary patch literal 591 zcmZ?wbhEHb6krfwcox9$rM&!ief{ri*M2G}{3$H|$;0!--TkMg=1&okpCKVXxwt;N zxcth@c*Vv2Q&{-tkt5$~YJLa`{ycj0>&%&7XV3nrrS+MI=d+K`XHn5_?d?BJO@AsW z{Zv)`YG(E_BlD|}&_^rl?}CEgy1RcG8h!;T5EXr^r~ge|{U;yaPbsON?(SbLEx!~N zewCB^p{Ms#Qu3>h&(GwzuioCjFJJy*Wc1VC{%e2#Pd2unyu9D6tbX$I|8#Tv8W#4` z*!ZWP-%n1?Zxt0Ei;A9yhW*sn|0yl~B{cM_i_2#lo8P&)@4~{r#K!(ijJwXn^eM>g z=bk;^jExxv8BqMm!pOi7z@P(i7bs2`*w-`!G&Q%hw)(O7cKNdSwFUV3dV3pk+G$z# zwM?AM$uQsA)PL55N#5K{&1U{ctY~3a#+}>aQ#-+$7*~BS71qnO#&}r^Q57t%-%1S=z?9MTNskuE|eA zUvtWbrb&uSd}>SPv=lTvVCIq34bX6?IN{XT%~f}2LB`yc8I$0kO%o As{jB1 literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/container/assets/close12_1.gif b/www/extras/yui/build/container/assets/close12_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..e2f67d72efc158da4e069822cbe338915761e396 GIT binary patch literal 85 zcmZ?wbhEHbz lf$Gy9znh?Y?^x%Bps9Cfw!UsJn!aoAS>7kV)`>G%0|4uCA&me4 literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/container/assets/container.css b/www/extras/yui/build/container/assets/container.css new file mode 100644 index 000000000..a0ae3a921 --- /dev/null +++ b/www/extras/yui/build/container/assets/container.css @@ -0,0 +1,233 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +.yui-overlay { + position:absolute; + display:block; +} + +.yui-tt { + visibility:hidden; + position:absolute; + color:#333; + background-color:#FDFFB4; + font-family:arial,helvetica,verdana,sans-serif; + padding:2px; + border:1px solid #FCC90D; + font:100% sans-serif; + width:auto; +} + +* html body.masked select { + visibility:hidden; +} + +* html div.yui-panel-container select { + visibility:inherit; +} + +* html div.drag select { + visibility:hidden; +} + +* html div.hide-select select { + visibility:hidden; +} + +.mask { + z-index:0; + display:none; + position:absolute; + top:0; + left:0; + -moz-opacity: 0.5; + opacity:.50; + filter: alpha(opacity=50); + background-color:#CCC; +} + +.hide-scrollbars * { + overflow:hidden; +} + +.hide-scrollbars textarea, .hide-scrollbars select { + overflow:hidden; + display:none; +} + +.show-scrollbars textarea, .show-scrollbars select { + overflow:visible; +} + +.yui-panel-container { + position:absolute; + background-color:transparent; + z-index:6; + visibility:hidden; + overflow:visible; + width:auto; +} + +.yui-panel-container.focused { +} + + +.yui-panel-container.matte { + padding:3px; + background-color:#FFF; +} + +.yui-panel-container.matte .underlay { + display:none; +} + +.yui-panel-container.shadow { + padding:0px; + background-color:transparent; +} + +.yui-panel-container.shadow .underlay { + visibility:inherit; + position:absolute; + background-color:#000; + top:3px;left:3px; + z-index:0; + width:100%; + height:100%; + -moz-opacity: 0.12; + opacity:.12; + filter:alpha(opacity=12); + zoom:1; +} + +.yui-panel { + visibility:hidden; + border-collapse:separate; + position:relative; + left:0px;top:0px; + font:1em Arial; + background-color:#FFF; + border:1px solid #000; + z-index:1; + overflow:hidden; +} + +.yui-panel .hd { + background-color:#3d77cb; + color:#FFF; + font-size:100%; + line-height:100%; + border:1px solid #FFF; + border-bottom:1px solid #000; + font-weight:bold; + overflow:hidden; + padding:4px; +} + +.yui-panel .bd { + overflow:hidden; + padding:4px; +} + +.yui-panel .bd p { + margin:0 0 1em; +} + +.yui-panel .container-close { + position:absolute; + top:5px; + right:4px; + z-index:6; + height:12px; + width:12px; + margin:0px; + padding:0px; + background:url(close12_1.gif) no-repeat; + cursor:pointer; + visibility:inherit; +} + +.yui-panel .ft { + padding:4px; + overflow:hidden; +} + +.yui-simple-dialog .bd .yui-icon { + background-repeat:no-repeat; + width:16px; + height:16px; + margin-right:10px; + float:left; +} + +.yui-simple-dialog .bd span.blckicon { + background: url("blck16_1.gif") no-repeat; +} + +.yui-simple-dialog .bd span.alrticon { + background: url("alrt16_1.gif") no-repeat; +} + +.yui-simple-dialog .bd span.hlpicon { + background: url("hlp16_1.gif") no-repeat; +} + +.yui-simple-dialog .bd span.infoicon { + background: url("info16_1.gif") no-repeat; +} + +.yui-simple-dialog .bd span.warnicon { + background: url("warn16_1.gif") no-repeat; +} + +.yui-simple-dialog .bd span.tipicon { + background: url("tip16_1.gif") no-repeat; +} + +.yui-dialog .ft, +.yui-simple-dialog .ft { + padding-bottom:5px; + padding-right:5px; + text-align:right; +} + +.yui-dialog form, +.yui-simple-dialog form { + margin:0; +} + +.button-group button { + font:100 76% verdana; + text-decoration:none; + background-color: #E4E4E4; + color: #333; + cursor: hand; + vertical-align: middle; + border: 2px solid #797979; + border-top-color:#FFF; + border-left-color:#FFF; + margin:2px; + padding:2px; +} + +.button-group button.default { + font-weight:bold; +} + +.button-group button:hover, +.button-group button.hover { + border:2px solid #90A029; + background-color:#EBF09E; + border-top-color:#FFF; + border-left-color:#FFF; +} + +.button-group button:active { + border:2px solid #E4E4E4; + background-color:#BBB; + border-top-color:#333; + border-left-color:#333; +} \ No newline at end of file diff --git a/www/extras/yui/build/container/assets/hlp16_1.gif b/www/extras/yui/build/container/assets/hlp16_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..4645c8fdfa693126bd5fe969737dc1ccac1e62e1 GIT binary patch literal 928 zcmZ?wbhEHb6krfw_-?>(y^ZbFe)X>pdVXIIcs^hJNiYA4HF8fnd0uW*csg0|*(}jl z`_x|_)OfyJ`tcvW#7eMYJ$(NgzUhYtNHbdmqF11(tG+wNe ze>Pv@+j-kFHC!JrMKFwl(GZ|x2q^w!VPs%1V9){C3Ca@;9JLII94(3qS`Uipv+%@l zJbu8yCTA2-aZun`HzT7AOT>bMhd6me#LFrcC_U-sP!kYHkZ^G7YSj;u&^QoqpnHNC zZ;t}w0;My&@@fnRB0st^3#zvLlHqv7#J$v;RfvPpREvjIBSs+hlwxDp>V#Uch7Y1| R8o5%}?uytg>gK>;4FF6EfMoyx literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/container/assets/info16_1.gif b/www/extras/yui/build/container/assets/info16_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..22f697a9917f3bae423726ef6c541e618e7a0221 GIT binary patch literal 601 zcmZ?wbhEHb6krfwc*ekR^2`$>r}fqW+ji}_yJYokZHxH}m!7X}I}?_)$H;t^iq<51 z=Q+}%ZYnzMy4K6|tXJyWt`_1CmRGK`4ch7!yH!cOTSh)#$8w3X<^)ZX8Jjj7)YD4R zv0UsNwN+Im+c|Qxyi$XTZl|efbxhsqsOlp&_LH02_MbZYysT(KOUEHeshsMn1>ULK zcJ8{NpjI!y<89(Jm7mMa#AU9wZo~BX*R*u%c{v=rOEb1M1WP>7`>p}+xYXGoF!2kdN literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/container/assets/tip16_1.gif b/www/extras/yui/build/container/assets/tip16_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f0be2b8d1fc2151459ddf48c8676f296489a32e GIT binary patch literal 552 zcmZ?wbhEHb6krfwcoxdAqKt250pG88J6`NoJHNgC#7vPV=gNM)KlSdk6-h;E3R*j89zJi_ws8jg}jVf1H%U_x=y1GH>{3efE$9ulq^}jNY_s7%7Yg^Q> zZ&AOxukg+`jfa=Ee7NLzbDQSVEiw;Q@LgK3a&HmayE9fFE_$AvDtPZi>Gka<>-s%k z9n`(GMepbgxjmD_e!N<=V~Wp)c9DO7zkGWX`t@GmmMQi>->ki{LVRtP{*x0vzu)HE z*rxgVklvf)rq8x3zBy*}WTVvm#T@rfmVUgN{`~e~hJgl(KUo+V7(y9zKn?-L2?Kj; zLugZTOKTgOrGd7zMO(9!ryG-*zam#3o3IlTuYjqwl1`hJJ(HKFjJS^5O<_s*)niv=?xL6ph0rg?UhX4Qo literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/container/assets/warn16_1.gif b/www/extras/yui/build/container/assets/warn16_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..d679df5aae924ed5a4b16a921c3c4578cd6ea970 GIT binary patch literal 580 zcmZ?wbhEHb6krfwc*el+xK`w8Ci9Cj{%bZ0KW-lQw59R=42!=X9>1HQ`TNnaZ`+e^ zxiCGg7yWvC!5vSgkFyM)RZCt{XMB>%`sdC4t0s)k%aq@3nExPx>EmqU4>OHk)k?l; zmwHep@UBKJ>`yaTpH~^(FBLo^!f?M>@KLq! zyFQK2XP13hAOB*u@2iQ4XT=zlAmgF^t_P!+l2!krs_OSVY}-KO z3Gm&T$hkGa!JyeyIZAdbXW(hOppYg{Dbv$z99yjz{Nj?#h4@c%Sjh2c$H!|Ji8%`> xGW^tE_3^J0v%kfc?(0rR4(Mwo&Dn84<+vz2ch7_c1uBQyRW;c{tVB2%tO4c8+`#|< literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/container/container-debug.js b/www/extras/yui/build/container/container-debug.js new file mode 100644 index 000000000..18ce2d441 --- /dev/null +++ b/www/extras/yui/build/container/container-debug.js @@ -0,0 +1,5487 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +/** +* 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. +* @namespace YAHOO.util +* @class Config +* @constructor +* @param {Object} owner The owner Object to which this Config Object belongs +*/ +YAHOO.util.Config = function(owner) { + if (owner) { + this.init(owner); + } + if (!owner) { YAHOO.log("No owner specified for Config object", "error"); } +}; + +/** + * Constant representing the CustomEvent type for the config changed event. + * @property YAHOO.util.Config.CONFIG_CHANGED_EVENT + * @private + * @static + * @final + */ +YAHOO.util.Config.CONFIG_CHANGED_EVENT = "configChanged"; + +/** + * Constant representing the boolean type string + * @property YAHOO.util.Config.BOOLEAN_TYPE + * @private + * @static + * @final + */ +YAHOO.util.Config.BOOLEAN_TYPE = "boolean"; + +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, + + /** + * Maintains the local collection of configuration property objects and their specified values + * @property config + * @private + * @type Object + */ + config : null, + + /** + * 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 + */ + initialConfig : null, + + /** + * Maintains the local, normalized CustomEvent queue + * @property eventQueue + * @private + * @type Object + */ + eventQueue : null, + + /** + * Custom Event, notifying subscribers when Config properties are set (setProperty is called without the silent flag + * @event configChangedEvent + */ + configChangedEvent : null, + + /** + * 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) { + return (typeof val == YAHOO.util.Config.BOOLEAN_TYPE); + }, + + /** + * 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) { + return (!isNaN(val)); + }, + + /** + * 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 + */ + fireEvent : function( key, value ) { + YAHOO.log("Firing Config event: " + key + "=" + value, "info"); + var property = this.config[key]; + + if (property && property.event) { + property.event.fire(value); + } + }, + + /** + * 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 + */ + addProperty : function( key, propertyObject ) { + key = key.toLowerCase(); + YAHOO.log("Added property: " + key, "info"); + + this.config[key] = propertyObject; + + propertyObject.event = new YAHOO.util.CustomEvent(key, this.owner); + propertyObject.key = key; + + if (propertyObject.handler) { + propertyObject.event.subscribe(propertyObject.handler, this.owner); + } + + 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 + */ + getConfig : function() { + var cfg = {}; + + for (var prop in this.config) { + var property = this.config[prop]; + if (property && 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 + */ + getProperty : function(key) { + var property = this.config[key.toLowerCase()]; + if (property && 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 + */ + resetProperty : function(key) { + key = key.toLowerCase(); + + var property = this.config[key]; + if (property && property.event) { + if (this.initialConfig[key] && !YAHOO.lang.isUndefined(this.initialConfig[key])) { + this.setProperty(key, this.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. + */ + 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 = this.config[key]; + if (property && property.event) { + if (property.validator && ! property.validator(value)) { // validator + return false; + } else { + property.value = value; + if (! silent) { + this.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. + */ + queueProperty : function(key, value) { + key = key.toLowerCase(); + YAHOO.log("queueProperty: " + key + "=" + value, "info"); + + var property = this.config[key]; + + if (property && property.event) { + if (!YAHOO.lang.isUndefined(value) && property.validator && ! property.validator(value)) { // validator + return false; + } else { + + if (!YAHOO.lang.isUndefined(value)) { + property.value = value; + } else { + value = property.value; + } + + var foundDuplicate = false; + var iLen = this.eventQueue.length; + for (var i=0; i < iLen; i++) { + var queueItem = this.eventQueue[i]; + + if (queueItem) { + var queueItemKey = queueItem[0]; + var queueItemValue = queueItem[1]; + + if (queueItemKey == key) { + // found a dupe... push to end of queue, null current item, and break + this.eventQueue[i] = null; + this.eventQueue.push([key, (!YAHOO.lang.isUndefined(value) ? value : queueItemValue)]); + foundDuplicate = true; + break; + } + } + } + + if (! foundDuplicate && !YAHOO.lang.isUndefined(value)) { // this is a refire, or a new property in the queue + this.eventQueue.push([key, value]); + } + } + + if (property.supercedes) { + var sLen = property.supercedes.length; + for (var s=0; s < sLen; s++) { + var supercedesCheck = property.supercedes[s]; + var qLen = this.eventQueue.length; + for (var q=0; q < qLen; q++) { + var queueItemCheck = this.eventQueue[q]; + + if (queueItemCheck) { + var queueItemCheckKey = queueItemCheck[0]; + var queueItemCheckValue = queueItemCheck[1]; + + if ( queueItemCheckKey == supercedesCheck.toLowerCase() ) { + this.eventQueue.push([queueItemCheckKey, queueItemCheckValue]); + this.eventQueue[q] = null; + break; + } + } + } + } + } + YAHOO.log("Config event queue: " + this.outputEventQueue(), "info"); + + 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 + */ + refireEvent : function(key) { + key = key.toLowerCase(); + + var property = this.config[key]; + if (property && property.event && !YAHOO.lang.isUndefined(property.value)) { + if (this.queueInProgress) { + this.queueProperty(key); + } else { + this.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. + */ + applyConfig : function(userConfig, init) { + if (init) { + this.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 + */ + refresh : function() { + for (var prop in this.config) { + this.refireEvent(prop); + } + }, + + /** + * Fires the normalized list of queued property change events + * @method fireQueue + */ + fireQueue : function() { + this.queueInProgress = true; + for (var i=0;iOR +* @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); + } else { + YAHOO.log("No element or element ID specified for Module instantiation", "error"); + } +}; + +/** +* 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 = null; + +/** +* 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 = null; + +/** +* 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 = "yui-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;"; + +/** +* Singleton CustomEvent fired when the font size is changed in the browser. +* Opera's "zoom" functionality currently does not support text size detection. +* @event YAHOO.widget.Module.textResizeEvent +*/ +YAHOO.widget.Module.textResizeEvent = new YAHOO.util.CustomEvent("textResize"); + +/** +* Constant representing the name of the Module's events +* @property YAHOO.widget.Module._EVENT_TYPES +* @private +* @final +* @type Object +*/ +YAHOO.widget.Module._EVENT_TYPES = { + + "BEFORE_INIT": "beforeInit", + "INIT": "init", + "APPEND": "append", + "BEFORE_RENDER": "beforeRender", + "RENDER": "render", + "CHANGE_HEADER": "changeHeader", + "CHANGE_BODY": "changeBody", + "CHANGE_FOOTER": "changeFooter", + "CHANGE_CONTENT": "changeContent", + "DESTORY": "destroy", + "BEFORE_SHOW": "beforeShow", + "SHOW": "show", + "BEFORE_HIDE": "beforeHide", + "HIDE": "hide" + +}; + +/** +* Constant representing the Module's configuration properties +* @property YAHOO.widget.Module._DEFAULT_CONFIG +* @private +* @final +* @type Object +*/ +YAHOO.widget.Module._DEFAULT_CONFIG = { + + "VISIBLE": { + key: "visible", + value: true, + validator: YAHOO.lang.isBoolean + }, + + "EFFECT": { + key: "effect", + suppressEvent:true, + supercedes:["visible"] + }, + + "MONITOR_RESIZE": { + key: "monitorresize", + value:true + } + +}; + + +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() { + + var EVENT_TYPES = YAHOO.widget.Module._EVENT_TYPES; + + /** + * 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(EVENT_TYPES.BEFORE_INIT, this); + + /** + * 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(EVENT_TYPES.INIT, this); + + /** + * CustomEvent fired when the Module is appended to the DOM + * @event appendEvent + */ + this.appendEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.APPEND, this); + + /** + * CustomEvent fired before the Module is rendered + * @event beforeRenderEvent + */ + this.beforeRenderEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.BEFORE_RENDER, this); + + /** + * CustomEvent fired after the Module is rendered + * @event renderEvent + */ + this.renderEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.RENDER, this); + + /** + * 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(EVENT_TYPES.CHANGE_HEADER, this); + + /** + * 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(EVENT_TYPES.CHANGE_BODY, this); + + /** + * 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(EVENT_TYPES.CHANGE_FOOTER, this); + + /** + * CustomEvent fired when the content of the Module is modified + * @event changeContentEvent + */ + this.changeContentEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.CHANGE_CONTENT, this); + + /** + * CustomEvent fired when the Module is destroyed + * @event destroyEvent + */ + this.destroyEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.DESTORY, this); + + /** + * CustomEvent fired before the Module is shown + * @event beforeShowEvent + */ + this.beforeShowEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.BEFORE_SHOW, this); + + /** + * CustomEvent fired after the Module is shown + * @event showEvent + */ + this.showEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.SHOW, this); + + /** + * CustomEvent fired before the Module is hidden + * @event beforeHideEvent + */ + this.beforeHideEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.BEFORE_HIDE, this); + + /** + * CustomEvent fired after the Module is hidden + * @event hideEvent + */ + this.hideEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.HIDE, this); + }, + + /** + * 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 // + + var DEFAULT_CONFIG = YAHOO.widget.Module._DEFAULT_CONFIG; + + /** + * Specifies whether the Module is visible on the page. + * @config visible + * @type Boolean + * @default true + */ + this.cfg.addProperty( + DEFAULT_CONFIG.VISIBLE.key, + { + handler: this.configVisible, + value: DEFAULT_CONFIG.VISIBLE.value, + validator: DEFAULT_CONFIG.VISIBLE.validator + } + ); + + /** + * 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( + DEFAULT_CONFIG.EFFECT.key, + { + suppressEvent: DEFAULT_CONFIG.EFFECT.suppressEvent, + supercedes: DEFAULT_CONFIG.EFFECT.supercedes + } + ); + + /** + * 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( + DEFAULT_CONFIG.MONITOR_RESIZE.key, + { + handler: this.configMonitorResize, + value: DEFAULT_CONFIG.MONITOR_RESIZE.value + } + ); + + }, + + /** + * 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 OR + * @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;iOR + * @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 OR + * @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 OR + * @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 OR + * @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)) { + YAHOO.log("Render failed. Must specify appendTo node if Module isn't already in the DOM.", "error"); + 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() { + var parent; + + if (this.element) { + YAHOO.util.Event.purgeElement(this.element, true); + parent = this.element.parentNode; + } + if (parent) { + parent.removeChild(this.element); + } + + this.element = null; + this.header = null; + this.body = null; + this.footer = null; + + for (var e in this) { + if (e instanceof YAHOO.util.CustomEvent) { + e.unsubscribeAll(); + } + } + + YAHOO.widget.Module.textResizeEvent.unsubscribe(this.onDomResize, this); + + 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.widget.Module.textResizeEvent.unsubscribe(this.onDomResize, this, true); + 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. +* @namespace YAHOO.widget +* @class Overlay +* @extends YAHOO.widget.Module +* @param {String} el The element ID representing the Overlay OR +* @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); + +/** +* Constant representing the name of the Overlay's events +* @property YAHOO.widget.Overlay._EVENT_TYPES +* @private +* @final +* @type Object +*/ +YAHOO.widget.Overlay._EVENT_TYPES = { + + "BEFORE_MOVE": "beforeMove", + "MOVE": "move" + +}; + +/** +* Constant representing the Overlay's configuration properties +* @property YAHOO.widget.Overlay._DEFAULT_CONFIG +* @private +* @final +* @type Object +*/ +YAHOO.widget.Overlay._DEFAULT_CONFIG = { + + "X": { + key: "x", + validator:YAHOO.lang.isNumber, + suppressEvent:true, supercedes:["iframe"] + }, + + "Y": { + key: "y", + validator:YAHOO.lang.isNumber, + suppressEvent:true, supercedes:["iframe"] + }, + + "XY": { + key: "xy", + suppressEvent:true, + supercedes:["iframe"] + }, + + "CONTEXT": { + key: "context", + suppressEvent:true, + supercedes:["iframe"] + }, + + "FIXED_CENTER": { + key: "fixedcenter", + value:false, + validator:YAHOO.lang.isBoolean, + supercedes:["iframe","visible"] + }, + + "WIDTH": { + key: "width", + suppressEvent:true, + supercedes:["iframe"] + }, + + "HEIGHT": { + key: "height", + suppressEvent:true, + supercedes:["iframe"] + }, + + "ZINDEX": { + key: "zindex", + value:null + }, + + "CONSTRAIN_TO_VIEWPORT": { + key: "constraintoviewport", + value:false, + validator:YAHOO.lang.isBoolean, + supercedes:["iframe","x","y","xy"] + }, + + "IFRAME": { + key: "iframe", + value:(YAHOO.widget.Module.prototype.browser == "ie" ? true : false), + validator:YAHOO.lang.isBoolean, + supercedes:["zIndex"] + } + +}; + +/** +* 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 = "yui-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 OR +* @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); + + var EVENT_TYPES = YAHOO.widget.Overlay._EVENT_TYPES; + + /** + * 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(EVENT_TYPES.BEFORE_MOVE, 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(EVENT_TYPES.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 // + + var DEFAULT_CONFIG = YAHOO.widget.Overlay._DEFAULT_CONFIG; + + /** + * The absolute x-coordinate position of the Overlay + * @config x + * @type Number + * @default null + */ + this.cfg.addProperty( + DEFAULT_CONFIG.X.key, + { + handler: this.configX, + validator: DEFAULT_CONFIG.X.validator, + suppressEvent: DEFAULT_CONFIG.X.suppressEvent, + supercedes: DEFAULT_CONFIG.X.supercedes + } + ); + + /** + * The absolute y-coordinate position of the Overlay + * @config y + * @type Number + * @default null + */ + this.cfg.addProperty( + DEFAULT_CONFIG.Y.key, + { + handler: this.configY, + validator: DEFAULT_CONFIG.Y.validator, + suppressEvent: DEFAULT_CONFIG.Y.suppressEvent, + supercedes: DEFAULT_CONFIG.Y.supercedes + } + ); + + /** + * An array with the absolute x and y positions of the Overlay + * @config xy + * @type Number[] + * @default null + */ + this.cfg.addProperty( + DEFAULT_CONFIG.XY.key, + { + handler: this.configXY, + suppressEvent: DEFAULT_CONFIG.XY.suppressEvent, + supercedes: DEFAULT_CONFIG.XY.supercedes + } + ); + + /** + * 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( + DEFAULT_CONFIG.CONTEXT.key, + { + handler: this.configContext, + suppressEvent: DEFAULT_CONFIG.CONTEXT.suppressEvent, + supercedes: DEFAULT_CONFIG.CONTEXT.supercedes + } + ); + + /** + * True if the Overlay should be anchored to the center of the viewport. + * @config fixedcenter + * @type Boolean + * @default false + */ + this.cfg.addProperty( + DEFAULT_CONFIG.FIXED_CENTER.key, + { + handler: this.configFixedCenter, + value: DEFAULT_CONFIG.FIXED_CENTER.value, + validator: DEFAULT_CONFIG.FIXED_CENTER.validator, + supercedes: DEFAULT_CONFIG.FIXED_CENTER.supercedes + } + ); + + /** + * CSS width of the Overlay. + * @config width + * @type String + * @default null + */ + this.cfg.addProperty( + DEFAULT_CONFIG.WIDTH.key, + { + handler: this.configWidth, + suppressEvent: DEFAULT_CONFIG.WIDTH.suppressEvent, + supercedes: DEFAULT_CONFIG.WIDTH.supercedes + } + ); + + /** + * CSS height of the Overlay. + * @config height + * @type String + * @default null + */ + this.cfg.addProperty( + DEFAULT_CONFIG.HEIGHT.key, + { + handler: this.configHeight, + suppressEvent: DEFAULT_CONFIG.HEIGHT.suppressEvent, + supercedes: DEFAULT_CONFIG.HEIGHT.supercedes + } + ); + + /** + * CSS z-index of the Overlay. + * @config zIndex + * @type Number + * @default null + */ + this.cfg.addProperty( + DEFAULT_CONFIG.ZINDEX.key, + { + handler: this.configzIndex, + value: DEFAULT_CONFIG.ZINDEX.value + } + ); + + /** + * True if the Overlay should be prevented from being positioned out of the viewport. + * @config constraintoviewport + * @type Boolean + * @default false + */ + this.cfg.addProperty( + DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.key, + { + handler: this.configConstrainToViewport, + value: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.value, + validator: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.validator, + supercedes: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.supercedes + } + ); + + /** + * 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( + DEFAULT_CONFIG.IFRAME.key, + { + handler: this.configIframe, + value: DEFAULT_CONFIG.IFRAME.value, + validator: DEFAULT_CONFIG.IFRAME.validator, + supercedes: DEFAULT_CONFIG.IFRAME.supercedes + } + ); + +}; + +/** +* 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 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.windowResizeEvent.unsubscribe(this.doCenterOnDOMEvent, this); + YAHOO.widget.Overlay.windowScrollEvent.unsubscribe(this.doCenterOnDOMEvent, this); + + 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) { + + if (activeOverlay != o) { + + if(activeOverlay) { + + activeOverlay.blur(); + + } + + 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); + + o.focusEvent.fire(); + + } + + } + + }; + + /** + * 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.hideEvent.unsubscribe(o.blur); + o.destroyEvent.unsubscribe(this._onOverlayDestroy, o); + + if (o.element) { + + YAHOO.util.Event.removeListener(o.element, this.cfg.getProperty("focusevent"), this._onOverlayElementFocus); + + } + + o.cfg.setProperty("zIndex", originalZ, true); + o.cfg.setProperty("manager", null); + + o.focusEvent.unsubscribeAll(); + o.blurEvent.unsubscribeAll(); + + 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() { + for (var o=0;o 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 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;oOR +* @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 = "yui-tt"; + +/** +* Constant representing the Tooltip's configuration properties +* @property YAHOO.widget.Tooltip._DEFAULT_CONFIG +* @private +* @final +* @type Object +*/ +YAHOO.widget.Tooltip._DEFAULT_CONFIG = { + + "PREVENT_OVERLAP": { + key: "preventoverlap", + value:true, + validator:YAHOO.lang.isBoolean, + supercedes:["x","y","xy"] + }, + + "SHOW_DELAY": { + key: "showdelay", + value:200, + validator:YAHOO.lang.isNumber + }, + + "AUTO_DISMISS_DELAY": { + key: "autodismissdelay", + value:5000, + validator:YAHOO.lang.isNumber + }, + + "HIDE_DELAY": { + key: "hidedelay", + value:250, + validator:YAHOO.lang.isNumber + }, + + "TEXT": { + key: "text", + suppressEvent:true + }, + + "CONTAINER": { + key: "container" + } + +}; + +/** +* 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 OR +* @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) { + this.logger = YAHOO.widget.Tooltip.logger; + + 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); + + var DEFAULT_CONFIG = YAHOO.widget.Tooltip._DEFAULT_CONFIG; + + /** + * Specifies whether the Tooltip should be kept from overlapping its context element. + * @config preventoverlap + * @type Boolean + * @default true + */ + this.cfg.addProperty( + DEFAULT_CONFIG.PREVENT_OVERLAP.key, + { + value: DEFAULT_CONFIG.PREVENT_OVERLAP.value, + validator: DEFAULT_CONFIG.PREVENT_OVERLAP.validator, + supercedes: DEFAULT_CONFIG.PREVENT_OVERLAP.supercedes + } + ); + + /** + * The number of milliseconds to wait before showing a Tooltip on mouseover. + * @config showdelay + * @type Number + * @default 200 + */ + this.cfg.addProperty( + DEFAULT_CONFIG.SHOW_DELAY.key, + { + handler: this.configShowDelay, + value: 200, + validator: DEFAULT_CONFIG.SHOW_DELAY.validator + } + ); + + /** + * 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( + DEFAULT_CONFIG.AUTO_DISMISS_DELAY.key, + { + handler: this.configAutoDismissDelay, + value: DEFAULT_CONFIG.AUTO_DISMISS_DELAY.value, + validator: DEFAULT_CONFIG.AUTO_DISMISS_DELAY.validator + } + ); + + /** + * The number of milliseconds to wait before hiding a Tooltip on mouseover. + * @config hidedelay + * @type Number + * @default 250 + */ + this.cfg.addProperty( + DEFAULT_CONFIG.HIDE_DELAY.key, + { + handler: this.configHideDelay, + value: DEFAULT_CONFIG.HIDE_DELAY.value, + validator: DEFAULT_CONFIG.HIDE_DELAY.validator + } + ); + + /** + * Specifies the Tooltip's text. + * @config text + * @type String + * @default null + */ + this.cfg.addProperty( + DEFAULT_CONFIG.TEXT.key, + { + handler: this.configText, + suppressEvent: DEFAULT_CONFIG.TEXT.suppressEvent + } + ); + + /** + * Specifies the container element that the Tooltip's markup should be rendered into. + * @config container + * @type HTMLElement/String + * @default document.body + */ + this.cfg.addProperty( + DEFAULT_CONFIG.CONTAINER.key, + { + handler: this.configContainer, + value: document.body + } + ); + + /** + * 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); + } +}; + +/** +* @method _removeEventListeners +* @description Removes all of the DOM event handlers from the HTML element(s) +* that trigger the display of the tooltip. +* @protected +*/ +YAHOO.widget.Tooltip.prototype._removeEventListeners = function() { + + var aElements = this._context; + + if (aElements) { + + var nElements = aElements.length; + + if (nElements > 0) { + + var i = nElements - 1, + oElement; + + do { + + oElement = aElements[i]; + + YAHOO.util.Event.removeListener(oElement, "mouseover", this.onContextMouseOver); + YAHOO.util.Event.removeListener(oElement, "mousemove", this.onContextMouseMove); + YAHOO.util.Event.removeListener(oElement, "mouseout", this.onContextMouseOut); + + } + while(i--); + + } + + } + +}; + +/** +* 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 + this._removeEventListeners(); + + // Add mouseover/mouseout listeners to context elements + this._context = context; + + var aElements = this._context; + + if (aElements) { + + var nElements = aElements.length; + + if (nElements > 0) { + + var i = nElements - 1, + oElement; + + do { + + oElement = aElements[i]; + + YAHOO.util.Event.addListener(oElement, "mouseover", this.onContextMouseOver, this); + YAHOO.util.Event.addListener(oElement, "mousemove", this.onContextMouseMove, this); + YAHOO.util.Event.addListener(oElement, "mouseout", this.onContextMouseOut, this); + + } + while(i--); + + } + + } + + } +}; + +// 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.logger.log("Clearing hide timer: " + obj.hideProcId, "time"); + 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); + obj.logger.log("Setting show tooltip timeout: " + this.showProcId, "time"); +}; + +/** +* 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.logger.log("Clearing show timer: " + obj.showProcId, "time"); + obj.showProcId = null; + } + + if (obj.hideProcId) { + clearTimeout(obj.hideProcId); + obj.logger.log("Clearing hide timer: " + obj.hideProcId, "time"); + 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 && context.tagName.toUpperCase() == "A") { + yOffset += 12; + } + + var me = this; + return setTimeout( + function() { + if (me._tempTitle) { + me.setBody(me._tempTitle); + } else { + me.cfg.refireEvent("text"); + } + + me.logger.log("Show tooltip", "time"); + 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(); + me.logger.log("Hide tooltip time active: " + me.hideProcId, "time"); + }, + 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; + me.logger.log("Setting hide tooltip timeout", "time"); + return setTimeout( + function() { + me.logger.log("Hide tooltip", "time"); + 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); + + this.logger.log("context " + elementRegion, "ttip"); + this.logger.log("mouse " + mousePoint, "ttip"); + + if (elementRegion.contains(mousePoint)) { + this.logger.log("OVERLAP", "warn"); + this.cfg.setProperty("y", (pageY-height-5)); + } +}; + +/** +* Removes the Tooltip element from the DOM and sets all child elements to null. +* @method destroy +*/ +YAHOO.widget.Tooltip.prototype.destroy = function() { + + // Remove any existing mouseover/mouseout listeners + this._removeEventListeners(); + + YAHOO.widget.Tooltip.superclass.destroy.call(this); + +}; + +/** +* 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 OR +* @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 = "yui-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 = "yui-panel-container"; + +/** +* Constant representing the name of the Panel's events +* @property YAHOO.widget.Panel._EVENT_TYPES +* @private +* @final +* @type Object +*/ +YAHOO.widget.Panel._EVENT_TYPES = { + + "SHOW_MASK": "showMask", + "HIDE_MASK": "hideMask", + "DRAG": "drag" + +}; + +/** +* Constant representing the Panel's configuration properties +* @property YAHOO.widget.Panel._DEFAULT_CONFIG +* @private +* @final +* @type Object +*/ +YAHOO.widget.Panel._DEFAULT_CONFIG = { + + "CLOSE": { + key: "close", + value:true, + validator:YAHOO.lang.isBoolean, + supercedes:["visible"] + }, + + "DRAGGABLE": { + key: "draggable", + value:(YAHOO.util.DD ? true : false), + validator:YAHOO.lang.isBoolean, + supercedes:["visible"] + }, + + "UNDERLAY": { + key: "underlay", + value:"shadow", + supercedes:["visible"] + }, + + "MODAL": { + key: "modal", + value:false, + validator:YAHOO.lang.isBoolean, + supercedes:["visible"] + }, + + "KEY_LISTENERS": { + key: "keylisteners", + suppressEvent:true, + supercedes:["visible"] + } + +}; + +/** +* 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 OR +* @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(" "); + } + } + }, this, true); + + + this.renderEvent.subscribe(function() { + + /* + If no value for the "width" configuration property was specified, + set it to the offsetWidth. If the "width" is not set, then in IE + you can only drag the panel when you put the cursor on the + header's text. + */ + + var sWidth = this.cfg.getProperty("width"); + + if(!sWidth) { + + this.cfg.setProperty("width", (this.element.offsetWidth + "px")); + + } + + }); + + + var me = this; + + var doBlur = function() { + this.blur(); + }; + + this.showMaskEvent.subscribe(function() { + + var checkFocusable = function(el) { + + var sTagName = el.tagName.toUpperCase(), + bFocusable = false; + + switch(sTagName) { + + case "A": + case "BUTTON": + case "SELECT": + case "TEXTAREA": + + if (! YAHOO.util.Dom.isAncestor(me.element, el)) { + YAHOO.util.Event.addListener(el, "focus", doBlur, el, true); + bFocusable = true; + } + + break; + + case "INPUT": + + if (el.type != "hidden" && ! YAHOO.util.Dom.isAncestor(me.element, el)) { + + YAHOO.util.Event.addListener(el, "focus", doBlur, el, true); + bFocusable = true; + + } + + break; + + } + + return bFocusable; + + }; + + this.focusableElements = YAHOO.util.Dom.getElementsBy(checkFocusable); + }, this, true); + + this.hideMaskEvent.subscribe(function() { + for (var i=0;i
          "] : + + ["

          ", label, " ", + totalTime, "ms (+", elapsedTime, ") ", + localTime, ": ", + sourceAndDetail, ": ", + msg, "

          "]; + + 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, "&").replace(//g, ">"); + } + return ""; +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class member to index multiple LogReader 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; + +//TODO: remove +/** + * A class member shared by all LogReaders 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; + +/** + * Hash of filters and their related checkbox elements. + * + * @property _filterCheckboxes + * @type Object + * @private + */ +YAHOO.widget.LogReader.prototype._filterCheckboxes = 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; + +/** + * LogReader container element. + * + * @property _elContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elContainer = null; + +/** + * LogReader header element. + * + * @property _elHd + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elHd = null; + +/** + * LogReader collapse element. + * + * @property _elCollapse + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elCollapse = null; + +/** + * LogReader collapse button element. + * + * @property _btnCollapse + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._btnCollapse = null; + +/** + * LogReader title header element. + * + * @property _title + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._title = null; + +/** + * LogReader console element. + * + * @property _elConsole + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elConsole = null; + +/** + * LogReader footer element. + * + * @property _elFt + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elFt = null; + +/** + * LogReader buttons container element. + * + * @property _elBtns + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elBtns = null; + +/** + * Container element for LogReader category filter checkboxes. + * + * @property _elCategoryFilters + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elCategoryFilters = null; + +/** + * Container element for LogReader source filter checkboxes. + * + * @property _elSourceFilters + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elSourceFilters = null; + +/** + * LogReader 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 LogReader 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; + + this._filterCheckboxes[sCategory] = chkCategory; + } +}; + +/** + * Creates a checkbox in the LogReader 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; + + this._filterCheckboxes[sSource] = chkSource; + } +}; + +/** + * 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()); + } +}; + +/** + * 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.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 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"); + + +YAHOO.register("logger", YAHOO.widget.Logger, {version: "2.2.2", build: "204"}); diff --git a/www/extras/yui/build/logger/logger-min.js b/www/extras/yui/build/logger/logger-min.js new file mode 100644 index 000000000..3cd433ad5 --- /dev/null +++ b/www/extras/yui/build/logger/logger-min.js @@ -0,0 +1,66 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ + +YAHOO.widget.LogMsg=function(oConfigs){if(oConfigs&&(oConfigs.constructor==Object)){for(var param in oConfigs){this[param]=oConfigs[param];}}};YAHOO.widget.LogMsg.prototype.msg=null;YAHOO.widget.LogMsg.prototype.time=null;YAHOO.widget.LogMsg.prototype.category=null;YAHOO.widget.LogMsg.prototype.source=null;YAHOO.widget.LogMsg.prototype.sourceDetail=null;YAHOO.widget.LogWriter=function(sSource){if(!sSource){YAHOO.log("Could not instantiate LogWriter due to invalid source.","error","LogWriter");return;} +this._source=sSource;};YAHOO.widget.LogWriter.prototype.toString=function(){return"LogWriter "+this._sSource;};YAHOO.widget.LogWriter.prototype.log=function(sMsg,sCategory){YAHOO.widget.Logger.log(sMsg,sCategory,this._source);};YAHOO.widget.LogWriter.prototype.getSource=function(){return this._sSource;};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;}};YAHOO.widget.LogWriter.prototype._source=null;YAHOO.widget.LogReader=function(elContainer,oConfigs){var oSelf=this;this._sName=YAHOO.widget.LogReader._index;YAHOO.widget.LogReader._index++;if(oConfigs&&(oConfigs.constructor==Object)){for(var param in oConfigs){this[param]=oConfigs[param];}} +elContainer=YAHOO.util.Dom.get(elContainer);if(elContainer&&elContainer.tagName&&(elContainer.tagName.toLowerCase()=="div")){this._elContainer=elContainer;YAHOO.util.Dom.addClass(this._elContainer,"yui-log");} +else{this._elContainer=document.body.appendChild(document.createElement("div"));YAHOO.util.Dom.addClass(this._elContainer,"yui-log");YAHOO.util.Dom.addClass(this._elContainer,"yui-log-container");var containerStyle=this._elContainer.style;if(this.width){containerStyle.width=this.width;} +if(this.right){containerStyle.right=this.right;} +if(this.top){containerStyle.top=this.top;} +if(this.left){containerStyle.left=this.left;containerStyle.right="auto";} +if(this.bottom){containerStyle.bottom=this.bottom;containerStyle.top="auto";} +if(this.fontSize){containerStyle.fontSize=this.fontSize;} +if(navigator.userAgent.toLowerCase().indexOf("opera")!=-1){document.body.style+='';}} +if(this._elContainer){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(!this._elConsole){this._elConsole=this._elContainer.appendChild(document.createElement("div"));this._elConsole.className="yui-log-bd";if(this.height){this._elConsole.style.height=this.height;}} +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";}} +if(YAHOO.util.DD&&this.draggable){var ylog_dd=new YAHOO.util.DD(this._elContainer);ylog_dd.setHandleElId(this._elHd.id);this._elHd.style.cursor="move";} +if(!this._buffer){this._buffer=[];} +this._lastTime=YAHOO.widget.Logger.getStartTime();YAHOO.widget.Logger.newLogEvent.subscribe(this._onNewLog,this);YAHOO.widget.Logger.logResetEvent.subscribe(this._onReset,this);this._filterCheckboxes={};this._categoryFilters=[];var catsLen=YAHOO.widget.Logger.categories.length;if(this._elCategoryFilters){for(var i=0;i-1){return;}} +else{for(var i=0;i-1){return;}} +else{for(var i=0;i

          ",label," ",totalTime,"ms (+",elapsedTime,") ",localTime,": ","

          ",sourceAndDetail,":

          ",msg,"

          "]:["

          ",label," ",totalTime,"ms (+",elapsedTime,") ",localTime,": ",sourceAndDetail,": ",msg,"

          "];return output.join("");};YAHOO.widget.LogReader.prototype.html2Text=function(sHtml){if(sHtml){sHtml+="";return sHtml.replace(/&/g,"&").replace(//g,">");} +return"";};YAHOO.widget.LogReader._index=0;YAHOO.widget.LogReader.prototype._sName=null;YAHOO.widget.LogReader.prototype._buffer=null;YAHOO.widget.LogReader.prototype._consoleMsgCount=0;YAHOO.widget.LogReader.prototype._lastTime=null;YAHOO.widget.LogReader.prototype._timeout=null;YAHOO.widget.LogReader.prototype._filterCheckboxes=null;YAHOO.widget.LogReader.prototype._categoryFilters=null;YAHOO.widget.LogReader.prototype._sourceFilters=null;YAHOO.widget.LogReader.prototype._elContainer=null;YAHOO.widget.LogReader.prototype._elHd=null;YAHOO.widget.LogReader.prototype._elCollapse=null;YAHOO.widget.LogReader.prototype._btnCollapse=null;YAHOO.widget.LogReader.prototype._title=null;YAHOO.widget.LogReader.prototype._elConsole=null;YAHOO.widget.LogReader.prototype._elFt=null;YAHOO.widget.LogReader.prototype._elBtns=null;YAHOO.widget.LogReader.prototype._elCategoryFilters=null;YAHOO.widget.LogReader.prototype._elSourceFilters=null;YAHOO.widget.LogReader.prototype._btnPause=null;YAHOO.widget.LogReader.prototype._btnClear=null;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";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;filters.push(sCategory);YAHOO.util.Event.addListener(chkCategory,'click',oSelf._onCheckCategory,oSelf);var lblCategory=elFilter.appendChild(document.createElement("label"));lblCategory.htmlFor=chkCategory.id;lblCategory.className=sCategory;lblCategory.innerHTML=sCategory;this._filterCheckboxes[sCategory]=chkCategory;}};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";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;filters.push(sSource);YAHOO.util.Event.addListener(chkSource,'click',oSelf._onCheckSource,oSelf);var lblSource=elFilter.appendChild(document.createElement("label"));lblSource.htmlFor=chkSource.id;lblSource.className=sSource;lblSource.innerHTML=sSource;this._filterCheckboxes[sSource]=chkSource;}};YAHOO.widget.LogReader.prototype._filterLogs=function(){if(this._elConsole!==null){this.clearConsole();this._printToConsole(YAHOO.widget.Logger.getStack());}};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._consoleMsgCountthis.thresholdMax)){thresholdMin=0;} +var entriesStartIndex=(entriesLen>thresholdMin)?(entriesLen-thresholdMin):0;var sourceFiltersLen=this._sourceFilters.length;var categoryFiltersLen=this._categoryFilters.length;for(var i=entriesStartIndex;i0){sClass=sSource.substring(0,spaceIndex);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;}};YAHOO.widget.Logger.reset=function(){this._stack=[];this._startTime=new Date().getTime();this.loggerEnabled=true;this.log("Logger reset");this.logResetEvent.fire();};YAHOO.widget.Logger.getStack=function(){return this._stack;};YAHOO.widget.Logger.getStartTime=function(){return this._startTime;};YAHOO.widget.Logger.disableBrowserConsole=function(){YAHOO.log("Logger output to the function console.log() has been disabled.");this._browserConsoleEnabled=false;};YAHOO.widget.Logger.enableBrowserConsole=function(){this._browserConsoleEnabled=true;YAHOO.log("Logger output to the function console.log() has been enabled.");};YAHOO.widget.Logger.categoryCreateEvent=new YAHOO.util.CustomEvent("categoryCreate",this,true);YAHOO.widget.Logger.sourceCreateEvent=new YAHOO.util.CustomEvent("sourceCreate",this,true);YAHOO.widget.Logger.newLogEvent=new YAHOO.util.CustomEvent("newLog",this,true);YAHOO.widget.Logger.logResetEvent=new YAHOO.util.CustomEvent("logReset",this,true);YAHOO.widget.Logger._createNewCategory=function(sCategory){this.categories.push(sCategory);this.categoryCreateEvent.fire(sCategory);};YAHOO.widget.Logger._isNewCategory=function(sCategory){for(var i=0;i -1) { + return; + } + } + // ...or do it the old-fashioned way + else { + for(var i=0; i -1) { + return; + } + } + // ...or do it the old-fashioned way + else { + for(var i=0; i

          ", label, " ", + totalTime, "ms (+", elapsedTime, ") ", + localTime, ": ", + "

          ", + sourceAndDetail, + ":

          ", + msg, + "

          "] : + + ["

          ", label, " ", + totalTime, "ms (+", elapsedTime, ") ", + localTime, ": ", + sourceAndDetail, ": ", + msg, "

          "]; + + 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, "&").replace(//g, ">"); + } + return ""; +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class member to index multiple LogReader 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; + +//TODO: remove +/** + * A class member shared by all LogReaders 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; + +/** + * Hash of filters and their related checkbox elements. + * + * @property _filterCheckboxes + * @type Object + * @private + */ +YAHOO.widget.LogReader.prototype._filterCheckboxes = 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; + +/** + * LogReader container element. + * + * @property _elContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elContainer = null; + +/** + * LogReader header element. + * + * @property _elHd + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elHd = null; + +/** + * LogReader collapse element. + * + * @property _elCollapse + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elCollapse = null; + +/** + * LogReader collapse button element. + * + * @property _btnCollapse + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._btnCollapse = null; + +/** + * LogReader title header element. + * + * @property _title + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._title = null; + +/** + * LogReader console element. + * + * @property _elConsole + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elConsole = null; + +/** + * LogReader footer element. + * + * @property _elFt + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elFt = null; + +/** + * LogReader buttons container element. + * + * @property _elBtns + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elBtns = null; + +/** + * Container element for LogReader category filter checkboxes. + * + * @property _elCategoryFilters + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elCategoryFilters = null; + +/** + * Container element for LogReader source filter checkboxes. + * + * @property _elSourceFilters + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elSourceFilters = null; + +/** + * LogReader 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 LogReader 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; + + this._filterCheckboxes[sCategory] = chkCategory; + } +}; + +/** + * Creates a checkbox in the LogReader 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; + + this._filterCheckboxes[sSource] = chkSource; + } +}; + +/** + * 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()); + } +}; + +/** + * 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.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 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"); + + +YAHOO.register("logger", YAHOO.widget.Logger, {version: "2.2.2", build: "204"}); diff --git a/www/extras/yui/build/menu/README b/www/extras/yui/build/menu/README new file mode 100644 index 000000000..037510e9f --- /dev/null +++ b/www/extras/yui/build/menu/README @@ -0,0 +1,478 @@ +*** version 2.2.2 *** + +Fixed the following bugs: +------------------------- + ++ "toString" method of MenuItem, MenuBarItem and ContextMenuItem classes will + no longer throw a JavaScript error when using the debug version + of the Event utility. + ++ "toString" method of Menu, MenuBar and ContextMenu classes will + no longer attempt to output the instance's id if it is not available. + ++ Logger statements output by debug version of MenuManager are now properly + categorized as "MenuManager" + + + +*** version 2.2.1 *** + +Added the following features: +----------------------------- + ++ Added the following methods to YAHOO.widget.Menu: + - "focus" + - "blur" + - "hasFocus" + ++ Added the following Custom Events to YAHOO.widget.Menu: + + "focusEvent" + + "blurEvent" + ++ Added the following methods to YAHOO.widget.MenuManager: + - "getFocusedMenuItem" + - "getFocusedMenu" + ++ Added "hasFocus" method to YAHOO.widget.MenuItem + + +Fixed the following bugs: +------------------------- + ++ Menu instances no longer set focus to themselves by default when made + visible. Menus only receive focus in response to the following events: + - The user mouses down on a MenuItem instance + - The user tabs into a MenuItem instance + ++ Application of the "maxheight" configuration property is now correctly + deferred until the "render" event fires when Menu instance is being + lazy loaded. + ++ The "maxheight" configuration property can now be set multiple times without + a Menu instance restoring itself to its original default height. + ++ The "maxheight" configuration property can now be set on hidden Menu + instances that use lazy loading. + ++ Menu instances with a "width" configuration property set will now render + at the specified width rather than shrink wrapping to their contents. + ++ Menu item help text no longer wraps to the next line in Opera 9. + ++ Immediate submenus of a Menubar instance will no longer shift their position + to try and remain inside the confines of the browser's viewport. + ++ Lazy loaded ContextMenu instances now appear in the correct position when + they are made visible for the first time. + ++ MenuBar instances no longer throw JavaScript errors when navigating items with + submenus containing no active items using the keyboard. + ++ Replaced use of native "hasOwnProperty" method + with YAHOO.lang.hasOwnProperty. + ++ Rendered Menu instances will now update their width when items are added + or removed. + ++ Mousing over a Menu instance in an IE window that does not have focus will + no longer cause the window to receive focus. + + +Changes: +-------- + ++ "activeItem" property of YAHOO.widget.Menu now returns a reference to the + Menu's currently selected item. + ++ Added a "visible" CSS class that is applied to visible Menu instances. + ++ Refactored the Menu family to improve performance, especially when working + with a large number of instances in IE6. + + + +*** version 2.2.0 *** + +Added the following features: +----------------------------- + +* Added two new methods to YAHOO.widget.Menu: + + * "getItems" - Returns a flat array of the items in a menu. + + * "clearContent" - Removes all of the content from the menu, including the + menu items, group titles, header and footer. + + +* Added three new configuration attributes to YAHOO.widget.Menu: + + * "submenuhidedelay" - Number indicating the time (in milliseconds) that + should expire before a submenu is hidden when the user mouses out of a + menu item heading in the direction of a submenu. The value must be + greater than or equal to the value specified for the "showdelay" + configuration property. + + * "maxheight" - Defines the maximum height (in pixels) for a menu before + the contents of the body are scrolled. + + * "classname" - CSS class to be applied to the menu's root
          element. + The specified class(es) are appended in addition to the default class as + specified by the menu's CSS_CLASS_NAME constant. + + +* Added new constants to YAHOO.widget.MenuItem: + + * COLLAPSED_SUBMENU_INDICATOR_TEXT - String representing the text for the + element used for the submenu arrow indicator. + + * EXPANDED_SUBMENU_INDICATOR_TEXT - String representing the text for the + submenu arrow indicator element () when the submenu is visible. + + * DISABLED_SUBMENU_INDICATOR_ALT_TEXT - String representing the text for + the submenu arrow indicator element () when the menu item is disabled. + + * CHECKED_TEXT - String representing the text to be used for the checked + indicator element (). + + * DISABLED_CHECKED_TEXT - String representing the text to be used for the + checked indicator element () when the menu item is disabled. + + +* Added two new configuration attributes to YAHOO.widget.MenuItem: + + * "onclick" - Object literal representing the code to be executed when the + button is clicked. Format: + + { + fn: Function, // The handler to call when the event fires. + obj: Object, // An object to pass back to the handler. + scope: Object // The object to use for the scope of the handler. + } + + * "classname" - CSS class to be applied to the menu item's root
        • + element. The specified class(es) are appended in addition to the default + class as specified by the menu item's CSS_CLASS_NAME constant. + + +* Added an "id" property to YAHOO.widget.MenuItem that represents the id of + the menu item's root
        • node. Although not a configuration attribute, this + property should be set via the object literal of configuration attributes + passed as the second argument to the constructor. If no value is + specified, then one will be generated using the "generateId" method of the + Dom utility (YAHOO.widget.Dom). + +* Added a "trigger context menu event" + (YAHOO.widget.ContextMenu.triggerContextMenuEvent) that fires when the DOM + "contextmenu" event ("mousedown" for Opera) is fired by one of the elemeents + defined as a YAHOO.widget.ContextMenu instance's trigger. + +* Added a "cancel" method to YAHOO.widget.ContextMenu that can be used to + cancel the display of a YAHOO.widget.ContextMen instance. This method + should be called within the scope of a "context menu" event handler for + one of the context menu's triggers + (YAHOO.widget.ContextMenu.triggerContextMenuEvent). + + +Fixed the following bugs: +------------------------- + +* Users can now move diagonally from a menu item to its corresponding submenu + without the submenu hiding immediately. + +* "destroy" method of YAHOO.widget.Menu now unsubscribes from the "text resize" + event (YAHOO.widget.Module.textResizeEvent). + +* Browser progress bar no longer flashes when hovering over checked menu items + or menu items with submenus. + +* Menu item submenu indicator image no longer jumps to the next line in + quirks mode. + +* Mouse events no longer fire in Firefox if a YAHOO.widget.Menu instance is + moved by script into a stationary mouse pointer. + +* Modified "toString" method of YAHOO.widget.ContextMenuItem to return the + correct class name, as it was reporting as YAHOO.widget.MenuBarItem. + + +Changes: +-------- + +* Default value for the "showdelay" configuration attribute is now 250 + +* Modified code so that all Menu images are added via CSS background images. + As a result, the following constants and properties have been deprecated: + + * YAHOO.widget.MenuItem.SUBMENU_INDICATOR_IMAGE_PATH + * YAHOO.widget.MenuItem.SELECTED_SUBMENU_INDICATOR_IMAGE_PATH + * YAHOO.widget.MenuItem.DISABLED_SUBMENU_INDICATOR_IMAGE_PATH + * YAHOO.widget.MenuItem.COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT + * YAHOO.widget.MenuItem.EXPANDED_SUBMENU_INDICATOR_ALT_TEXT + * YAHOO.widget.MenuItem.DISABLED_SUBMENU_INDICATOR_ALT_TEXT + * YAHOO.widget.MenuItem.CHECKED_IMAGE_PATH + * YAHOO.widget.MenuItem.SELECTED_CHECKED_IMAGE_PATH + * YAHOO.widget.MenuItem.DISABLED_CHECKED_IMAGE_PATH + * YAHOO.widget.MenuItem.CHECKED_IMAGE_ALT_TEXT + * YAHOO.widget.MenuItem.DISABLED_CHECKED_IMAGE_ALT_TEXT + * YAHOO.widget.MenuItem.IMG_ROOT + * YAHOO.widget.MenuItem.IMG_ROOT_SSL + * YAHOO.widget.MenuItem.imageRoot + * YAHOO.widget.MenuItem.isSecure + + + +*** version 0.12.2 *** + +* No changes + + + +*** version 0.12.1 *** + +Fixed the following bugs: +------------------------- + +* Placed the call to the DOM "focus" method used by the MenuItem class inside + a zero-second timeout to resolve a race condition between menu positioning + and focusing of a menu item that resulted in the browser viewport + scrolling unnecessarily. + +* Switched to JSMin for JavaScript compression to resolve issues with the + minified version. + +* Disabled menu item instances will no longer display a submenu if the item is + clicked or moused over. + +* Can no longer select more than one item in a menu if using the keyboard and + mouse simultaneously. + +* Calling the "destory" method on a menu will now unregister all of the menu's + submenus from the MenuManager. + + + +*** version 0.12 *** + +Added the following features: +----------------------------- + +* Added the YAHOO.widget.MenuManager singleton class. + +* Added two new methods to YAHOO.widget.Menu: + + * "addItems" - Adds an array of items to a menu. + + * "getRoot" - Returns the root menu in a menu hierarchy. + +* Added two new events to YAHOO.widget.Menu: + + * "itemAddedEvent" - Fires when an item is added to a menu. + + * "itemRemovedEvent" - Fires when an item is removed from a menu. + +* Added two new properties to YAHOO.widget.Menu: + + * "itemData" - Array of items to be added to the menu. + + * "lazyLoad" - Boolean indicating if the menu's "lazy load" feature + is enabled. + +* Added new configuration properties to YAHOO.widget.Menu: + + * "hidedelay" - Hides the menu after the specified number of milliseconds. + + * "showdelay" - Shows the menu after the specified number of milliseconds. + + * "container" - The containing element the menu should be rendered into. + + * "clicktohide" - Boolean indicating if the menu will automatically be + hidden if the user clicks outside of it. + + * "autosubmenudisplay" - Boolean indicating if submenus are automatically + made visible when the user mouses over the menu's items. + +* Added a "toString" method to YAHOO.widget.MenuItem, YAHOO.widget.MenuBarItem + and YAHOO.widget.ContextMenuItem that returns the class name followed by the + value of the item's "text" configuration property. + + +Fixed the following bugs: +------------------------- + +* Setting a YAHOO.widget.ContextMenu instance's "trigger" configuration + property will remove all previous triggers before setting up the new ones. + +* "destroy" method of YAHOO.widget.ContextMenu cleans up all DOM event handlers. + +* Clicking on a menu item with a submenu no longer hides/collapses the + entire menu. + +* Clicking an item's submenu indicator image no longer collapses the + entire menu. + + +Changes: +-------- + +* Deprecated the YAHOO.widget.MenuModule and YAHOO.widget.MenuModuleItem + classes. The Base classes are now YAHOO.widget.Menu and + YAHOO.widget.MenuItem. + +* "addItem" and "insertItem" methods of YAHOO.widget.Menu now accept an + object literal representing YAHOO.widget.MenuItem configuration properties. + +* "clearActiveItem" now takes an argument: flag indicating if the Menu + instance's active item should be blurred. + +* Switched the default value of the "visible" configuration property for + YAHOO.widget.Menu to "false." + +* Switched the default value of the "constraintoviewport" configuration + property for YAHOO.widget.Menu to "true." + +* Overloaded the "submenu" configuration property for YAHOO.widget.MenuItem + so that it now can accept any of the following: + + * YAHOO.widget.Menu instance + * Object literal representation of a menu + * Element id + * Element reference + +* "hide" and "show" methods of statically positioned menus now toggle the their + element's "display" style property between "block" and "none." + + + +*** version 0.10.0 *** + +* Initial release + +* Known issues: + + * Some Firefox extensions disable the ability for JavaScript to prevent + the display of the browser's default context menu. These extensions + can cause the YUI ContextMenu to stop working. If you encounter this + problem, you can reset the context menu preference in Firefox back to + the default by making sure the "Disable or replace context menus" + preference is checked: + + Mac Firefox 1.0: + ------------------- + Preferences > Web Features > + Advanced... > Disable or replace context menus + + Mac Firefox 1.5 + ------------------- + Preferences > Context > + Advanced... > Disable or replace context menus + + Windows Firefox 1.0 + ------------------- + Tools > Options > Web Features > + Advanced... > Disable or replace context menus + + Windows Firefox 1.5 + ------------------- + Tools > Options > Context > + Advanced... > Disable or replace context menus + + + +*** version 0.11.3 *** + +Added the following features: +----------------------------- + +* Added a "target" configuration property to the MenuModuleItem object that + allows the user to specify the target of an item's anchor element. Items + that make use of the "target" configuration property will require the user + to click exactly on the item's anchor element to navigate to the specified + URL. + +* Items without a "url" property set will automatically hide their parent + menu instance(s) when clicked. + + +Fixed the following bugs: +------------------------- + +* Items in a submenu should now navigate to their specified URL when clicked. + +* Removed MenuBar's use of "overflow:hidden." This fixes an issue in Firefox + 1.5 in which submenus of a Menubar instance cannot overlay other absolutely + positioned elements on the page. + +* Submenus of a Menubar instance will now automatically have their iframe shim + enabled in IE<7. + +* Statically positioned Menubar and Menu instances will now render with the + correct position and dimensions in Safari. + +* MenuModuleItem's "focus" method now checks to make sure that an item's + "display" style property is not "none" before trying to set focus to its + anchor element. + +* A ContextMenu instance will now hide all other ContextMenu instances before + displaying itself. + +* Removed the dead space in front of an item's submenu indicator image in IE. + This space was causing an item's submenu to flicker when the user hovered + over it. + + +Changes: +-------- + +* Moved the DOM event handlers for every menu from the root DIV node of each + instance to the document object. This change reduces the number of DOM event + handlers used by Menu to eight, improving the cleanup time required by the + Event utility. + + + +*** version 0.11.0 *** + +Added the following features: +----------------------------- +* Overloaded the "addItem" and "insertItem" methods of MenuModule to accept a + string or a MenuModuleItem instance + +* Added the ability to define a MenuItem instance as being "checked" + + +Fixed the following bugs: +------------------------- +* Changing the path for the submenu indicator image of one MenuModuleItem + subclass will no longer affect other subclasses + +* MenuItem instances built from existing markup without anchor tags will no + longer trigger a JavaScript error when clicked + +* Modified the implementation of the "imageRoot" property for the + MenuModuleItem class so that it is set to a secure/non-secure path when the + object is instantiated + +* Menu instances now resize in response to changes to the browser's font size + +* Modified the propagation of the MenuModule class's "submenualignment" + configuration property so that it only applies to instances of the same type + +* Adjusted the specificity of the style rule that controls the position of a + MenuItem instance's submenu indicator image to prevent it from wrapping in IE + +* Specified a width and height for submenu indicator images in the Menu + stylesheet to ensure that Menu instances are always rendered at the correct + width + +* Clicking a MenuItem instance will no longer trigger two HTTP GET requests + +* Users can now control or shift-click on MenuItem links + + +Changes: +-------- +* In the Menu stylesheet (menu.css), switched from using "first" class to + "first-of-type" class + +* Changed case of MenuModuleItem class's "subMenuIndicator" property + to "submenuIndicator" \ No newline at end of file diff --git a/www/extras/yui/build/menu/assets/map.gif b/www/extras/yui/build/menu/assets/map.gif new file mode 100644 index 0000000000000000000000000000000000000000..715859aa8b7e006cce52c4533c659e0bc022b868 GIT binary patch literal 264 zcmZ?wbhEHbTNsJ9jQJGU7iNFkl0UKUo+V7&sVo zK$0Lc7+AInC?+qN`sLP|^s9Hibw0?Db#Gswb$h3{&dF@4+u?yLtoE1N`d%=aA|mKM z)#%8{78|vmBColJVss?A%2!qGKb)|B#qX#4G929*E^J_AFn#3Psr*2mStj9# zEK3YWi$+tMh6sC8w?uR;dwsoBr#Q=Wp_y}L&tznr*~Y>sv~a%o!lhEo8SB=EO!4=t vRQBJnW9P2j9u6tiNok&YjvU?NvsF%9WXiE~=l3MqC#QLMUcInOkii-N{U~MY literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/menu/assets/menu.css b/www/extras/yui/build/menu/assets/menu.css new file mode 100644 index 000000000..ba8d7c386 --- /dev/null +++ b/www/extras/yui/build/menu/assets/menu.css @@ -0,0 +1,401 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +/* Menu styles */ + +div.yuimenu { + + background-color:#f6f7ee; + border:solid 1px #c4c4be; + padding:1px; + +} + +/* Submenus are positioned absolute and hidden by default */ + +div.yuimenu div.yuimenu, +div.yuimenubar div.yuimenu { + + position:absolute; + visibility:hidden; + +} + +/* MenuBar Styles */ + +div.yuimenubar { + + background-color:#f6f7ee; + +} + +/* + Applying a width triggers "haslayout" in IE so that the module's + body clears its floated elements +*/ +div.yuimenubar div.bd { + + width:100%; + +} + +/* + Clear the module body for other browsers +*/ +div.yuimenubar div.bd:after { + + content:'.'; + display:block; + clear:both; + visibility:hidden; + height:0; + +} + +/* Matches the group title (H6) inside a Menu or MenuBar instance */ + +div.yuimenu h6, +div.yuimenubar h6 { + + font-size:100%; + font-weight:normal; + margin:0; + border:solid 1px #c4c4be; + color:#b9b9b9; + +} + +div.yuimenubar h6 { + + float:left; + display:inline; /* Prevent margin doubling in IE */ + padding:4px 12px; + border-width:0 1px 0 0; + +} + +div.yuimenu h6 { + + float:none; + display:block; + border-width:1px 0 0 0; + padding:5px 10px 0 10px; + +} + +/* Matches the UL inside a Menu or MenuBar instance */ + +div.yuimenubar ul { + + list-style-type:none; + margin:0; + padding:0; + +} + +div.yuimenu ul { + + list-style-type:none; + border:solid 1px #c4c4be; + border-width:1px 0 0 0; + margin:0; + padding:10px 0; + +} + +div.yuimenu ul.first-of-type, +div.yuimenu ul.hastitle, +div.yuimenu h6.first-of-type { + + border-width:0; + +} + +/* + Styles for the menu's header and footer elements that are used as controls + to scroll the menu's body element when the menu's height exceeds the + value of the "maxheight" configuration property. +*/ + +div.yuimenu div.topscrollbar, +div.yuimenu div.bottomscrollbar { + + height:16px; + background-image:url(map.gif); + background-repeat:no-repeat; + +} + + +div.yuimenu div.topscrollbar { + + background-image:url(map.gif); + background-position:center -72px; + +} + + +div.yuimenu div.topscrollbar_disabled { + + background-image:url(map.gif); + background-position:center -88px; + +} + + +div.yuimenu div.bottomscrollbar { + + background-image:url(map.gif); + background-position:center -104px; + +} + + +div.yuimenu div.bottomscrollbar_disabled { + + background-image:url(map.gif); + background-position:center -120px; + +} + + +/* MenuItem and MenuBarItem styles */ + +div.yuimenu li, +div.yuimenubar li { + + font-size:85%; + cursor:pointer; + cursor:hand; + white-space:nowrap; + text-align:left; + +} + +div.yuimenu li.yuimenuitem { + + padding:2px 24px; + +} + +div.yuimenu li li, +div.yuimenubar li li { + + font-size:100%; + +} + + +/* Matches the help text for a menu item */ + +div.yuimenu li.hashelptext em.helptext { + + font-style:normal; + margin:0 0 0 40px; + +} + +div.yuimenu li a, +div.yuimenubar li a { + + /* + "zoom:1" triggers "haslayout" in IE to ensure that the mouseover and + mouseout events bubble to the parent LI in IE. + */ + zoom:1; + color:#000; + text-decoration:none; + +} + +div.yuimenu li.hassubmenu, +div.yuimenu li.hashelptext { + + text-align:right; + +} + +div.yuimenu li.hassubmenu a.hassubmenu, +div.yuimenu li.hashelptext a.hashelptext { + + /* + Need to apply float immediately for IE or help text will jump to the + next line + */ + + *float:left; + *display:inline; /* Prevent margin doubling in IE */ + text-align:left; + +} + +div.yuimenu.visible li.hassubmenu a.hassubmenu, +div.yuimenu.visible li.hashelptext a.hashelptext { + + /* + Apply the float only when the menu is visible to prevent the help + text from wrapping to the next line in Opera. + */ + + float:left; + +} + + +/* Matches selected menu items */ + +div.yuimenu li.selected, +div.yuimenubar li.selected { + + background-color:#8c8ad0; + +} + +div.yuimenu li.selected a.selected, +div.yuimenubar li.selected a.selected { + + text-decoration:underline; + +} + +div.yuimenu li.selected a.selected, +div.yuimenu li.selected em.selected, +div.yuimenubar li.selected a.selected { + + color:#fff; + +} + + +/* Matches disabled menu items */ + +div.yuimenu li.disabled, +div.yuimenubar li.disabled { + + cursor:default; + +} + +div.yuimenu li.disabled a.disabled, +div.yuimenu li.disabled em.disabled, +div.yuimenubar li.disabled a.disabled { + + color:#b9b9b9; + cursor:default; + +} + +div.yuimenubar li.yuimenubaritem { + + float:left; + display:inline; /* Prevent margin doubling in IE */ + border-width:0 0 0 1px; + border-style:solid; + border-color:#c4c4be; + padding:4px 24px; + margin:0; + +} + +div.yuimenubar li.yuimenubaritem.first-of-type { + + border-width:0; + +} + + +/* Styles for the the submenu indicator for menu items */ + +div.yuimenu li.hassubmenu em.submenuindicator, +div.yuimenubar li.hassubmenu em.submenuindicator { + + display:-moz-inline-box; /* Mozilla */ + display:inline-block; /* IE, Opera and Safari */ + vertical-align:middle; + height:8px; + width:8px; + text-indent:9px; + font:0/0 arial; + overflow:hidden; + background-image:url(map.gif); + background-repeat:no-repeat; + +} + +div.yuimenubar li.hassubmenu em.submenuindicator { + + background-position:0 -24px; + margin:0 0 0 10px; + +} + +div.yuimenubar li.hassubmenu em.submenuindicator.selected { + + background-position:0 -32px; + +} + +div.yuimenubar li.hassubmenu em.submenuindicator.disabled { + + background-position:0 -40px; + +} + +div.yuimenu li.hassubmenu em.submenuindicator { + + background-position:0 0; + margin:0 -16px 0 10px; + +} + +div.yuimenu li.hassubmenu em.submenuindicator.selected { + + background-position:0 -8px; + +} + +div.yuimenu li.hassubmenu em.submenuindicator.disabled { + + background-position:0 -16px; + +} + + +/* Styles for a menu item's "checked" state */ + +div.yuimenu li.checked { + + position:relative; + +} + +div.yuimenu li.checked em.checkedindicator { + + height:8px; + width:8px; + text-indent:9px; + overflow:hidden; + background-image:url(map.gif); + background-position:0 -48px; + background-repeat:no-repeat; + position:absolute; + left:6px; + _left:-16px; /* Underscore hack b/c this is for IE 6 only */ + top:.5em; + +} + +div.yuimenu li.checked em.checkedindicator.selected { + + background-position:0 -56px; + +} + +div.yuimenu li.checked em.checkedindicator.disabled { + + background-position:0 -64px; + +} \ No newline at end of file diff --git a/www/extras/yui/build/menu/assets/menuarodwn8_dim_1.gif b/www/extras/yui/build/menu/assets/menuarodwn8_dim_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..60b38365a203237a6cfd8b95002bbd0b4322fe99 GIT binary patch literal 53 zcmZ?wbhEHb{|1&T!DE?$&WME)s&;hc6vK$NyOd@ma8`w7K Vws;w`SgzXn>&^zA2Z0O>)&O?c6EFY( literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/menu/assets/menuchk8_nrm_1.gif b/www/extras/yui/build/menu/assets/menuchk8_nrm_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..9732837a7755b6bee23b95f32eb998c487daa53c GIT binary patch literal 67 zcmZ?wbhEHbThe Menu family of components features a collection of +* controls that make it easy to add menus to your website or web application. +* With the Menu Controls you can create website fly-out menus, customized +* context menus, or application-style menu bars with just a small amount of +* scripting.

          The Menu family of controls features:

          +*
            +*
          • Screen-reader accessibility.
          • +*
          • Keyboard and mouse navigation.
          • +*
          • A rich event model that provides access to all of a menu's +* interesting moments.
          • +*
          • Support for +* Progressive +* Enhancement; Menus can be created from simple, +* semantic markup on the page or purely through JavaScript.
          • +*
          +* @title Menu +* @namespace YAHOO.widget +* @requires Event, Dom, Container +*/ +(function() { + +var Dom = YAHOO.util.Dom, + 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 = function() { + + // Private member variables + + + // Flag indicating if the DOM event handlers have been attached + + var m_bInitializedEventHandlers = false, + + + // Collection of menus + + m_oMenus = {}, + + + // Collection of menu items + + m_oItems = {}, + + + // Collection of visible menus + + m_oVisibleMenus = {}, + + + // Map of DOM event types to their equivalent CustomEvent types + + m_oEventTypes = { + "click": "clickEvent", + "mousedown": "mouseDownEvent", + "mouseup": "mouseUpEvent", + "mouseover": "mouseOverEvent", + "mouseout": "mouseOutEvent", + "keydown": "keyDownEvent", + "keyup": "keyUpEvent", + "keypress": "keyPressEvent" + }, + + + m_oFocusedMenuItem = null; + + + var m_oLogger = new YAHOO.widget.LogWriter("MenuManager"); + + + // Private methods + + + /** + * @method addItem + * @description 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. + */ + function addItem(p_oItem) { + + var sId = p_oItem.id; + + if(p_oItem && m_oItems[sId] != p_oItem) { + + m_oItems[sId] = p_oItem; + + p_oItem.destroyEvent.subscribe(onItemDestroy); + + m_oLogger.log("Item: " + + p_oItem.toString() + " successfully registered."); + + } + + } + + + /** + * @method removeItem + * @description 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. + */ + function removeItem(p_oItem) { + + var sId = p_oItem.id; + + if(sId && m_oItems[sId]) { + + delete m_oItems[sId]; + + m_oLogger.log("Item: " + + p_oItem.toString() + " successfully unregistered."); + + } + + } + + + /** + * @method getMenuRootElement + * @description Finds the root DIV node of a menu or the root LI node of a + * menu item. + * @private + * @param {HTMLElement} p_oElement Object specifying + * an HTML element. + */ + function getMenuRootElement(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, "hd") || + Dom.hasClass(p_oElement, "bd") || + Dom.hasClass(p_oElement, "ft") + ) + && + 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 + + + /** + * @method onDOMEvent + * @description 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). + */ + function onDOMEvent(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 + + oElement = getMenuRootElement(oTarget), + oMenuItem, + oMenu; + + + if(oElement) { + + var sTagName = oElement.tagName.toUpperCase(); + + if(sTagName == "LI") { + + var sId = oElement.id; + + if(sId && m_oItems[sId]) { + + oMenuItem = m_oItems[sId]; + oMenu = oMenuItem.parent; + + } + + } + else if(sTagName == "DIV") { + + if(oElement.id) { + + oMenu = m_oMenus[oElement.id]; + + } + + } + + } + + + if(oMenu) { + + var sCustomEventType = m_oEventTypes[p_oEvent.type]; + + + // Fire the Custom Event that corresponds the current DOM event + + if(oMenuItem && !oMenuItem.cfg.getProperty("disabled")) { + + oMenuItem[sCustomEventType].fire(p_oEvent); + + + if (p_oEvent.type == "keyup" || p_oEvent.type == "mousedown") { + + if (m_oFocusedMenuItem != oMenuItem) { + + if(m_oFocusedMenuItem) { + + m_oFocusedMenuItem.blurEvent.fire(); + + } + + oMenuItem.focusEvent.fire(); + + } + + } + + } + + oMenu[sCustomEventType].fire(p_oEvent, oMenuItem); + + } + else if(p_oEvent.type == "mousedown") { + + if(m_oFocusedMenuItem) { + + m_oFocusedMenuItem.blurEvent.fire(); + + m_oFocusedMenuItem = null; + + } + + + /* + If the target of the event wasn't a menu, hide all + dynamically positioned menus + */ + + for(var i in m_oMenus) { + + if(YAHOO.lang.hasOwnProperty(m_oMenus,i)) { + + oMenu = m_oMenus[i]; + + if( + oMenu.cfg.getProperty("clicktohide") && + oMenu.cfg.getProperty("position") == "dynamic" + ) { + + oMenu.hide(); + + } + else { + + oMenu.clearActiveItem(true); + + } + + } + + } + + } + else if(p_oEvent.type == "keyup") { + + if(m_oFocusedMenuItem) { + + m_oFocusedMenuItem.blurEvent.fire(); + + m_oFocusedMenuItem = null; + + } + + } + + } + + + /** + * @method onMenuDestroy + * @description "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. + */ + function onMenuDestroy(p_sType, p_aArgs) { + + if(m_oMenus[this.id]) { + + delete m_oMenus[this.id]; + + m_oLogger.log("Menu: " + + this.toString() + " successfully unregistered."); + + } + + } + + + /** + * @method onMenuFocus + * @description "focus" 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. + */ + function onMenuFocus(p_sType, p_aArgs) { + + var oItem = p_aArgs[0]; + + if (oItem) { + + m_oFocusedMenuItem = oItem; + + } + + } + + + /** + * @method onMenuBlur + * @description "blur" 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. + */ + function onMenuBlur(p_sType, p_aArgs) { + + m_oFocusedMenuItem = null; + + } + + + /** + * @method onItemDestroy + * @description "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. + */ + function onItemDestroy(p_sType, p_aArgs) { + + var sId = this.id; + + if(sId && m_oItems[sId]) { + + delete m_oItems[sId]; + + } + + } + + + /** + * @method onMenuVisibleConfigChange + * @description 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. + */ + function onMenuVisibleConfigChange(p_sType, p_aArgs) { + + var bVisible = p_aArgs[0]; + + if(bVisible) { + + m_oVisibleMenus[this.id] = this; + + m_oLogger.log("Menu: " + + this.toString() + + " registered with the collection of visible menus."); + + } + else if(m_oVisibleMenus[this.id]) { + + delete m_oVisibleMenus[this.id]; + + m_oLogger.log("Menu: " + + this.toString() + + " unregistered from the collection of visible menus."); + + } + + } + + + /** + * @method onItemAdded + * @description "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. + */ + function onItemAdded(p_sType, p_aArgs) { + + addItem(p_aArgs[0]); + + } + + + /** + * @method onItemRemoved + * @description "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. + */ + function onItemRemoved(p_sType, p_aArgs) { + + removeItem(p_aArgs[0]); + + } + + + + return { + + // 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. + */ + 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.on(oDoc, "mouseover", onDOMEvent, this, true); + Event.on(oDoc, "mouseout", onDOMEvent, this, true); + Event.on(oDoc, "mousedown", onDOMEvent, this, true); + Event.on(oDoc, "mouseup", onDOMEvent, this, true); + Event.on(oDoc, "click", onDOMEvent, this, true); + Event.on(oDoc, "keydown", onDOMEvent, this, true); + Event.on(oDoc, "keyup", onDOMEvent, this, true); + Event.on(oDoc, "keypress", onDOMEvent, this, true); + + + m_bInitializedEventHandlers = true; + + m_oLogger.log("DOM event handlers initialized."); + + } + + p_oMenu.destroyEvent.subscribe(onMenuDestroy); + + p_oMenu.cfg.subscribeToConfigEvent( + "visible", + onMenuVisibleConfigChange + ); + + p_oMenu.itemAddedEvent.subscribe(onItemAdded); + p_oMenu.itemRemovedEvent.subscribe(onItemRemoved); + p_oMenu.focusEvent.subscribe(onMenuFocus); + p_oMenu.blurEvent.subscribe(onMenuBlur); + + m_oLogger.log("Menu: " + + p_oMenu.toString() + " successfully registered."); + + } + + }, + + + /** + * @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. + */ + removeMenu: function(p_oMenu) { + + if(p_oMenu && m_oMenus[p_oMenu.id]) { + + delete m_oMenus[p_oMenu.id]; + + m_oLogger.log("Menu: " + + p_oMenu.toString() + " successfully unregistered."); + + } + + }, + + + /** + * @method hideVisible + * @description Hides all visible, dynamically positioned menus. + */ + hideVisible: function() { + + var oMenu; + + for(var i in m_oVisibleMenus) { + + if(YAHOO.lang.hasOwnProperty(m_oVisibleMenus,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} + */ + 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} + */ + getMenu: function(p_sId) { + + if(m_oMenus[p_sId]) { + + return m_oMenus[p_sId]; + + } + + }, + + + /** + * @method getFocusedMenuItem + * @description Returns a reference to the menu item that currently + * has focus. + * @return {YAHOO.widget.MenuItem} + */ + getFocusedMenuItem: function() { + + return m_oFocusedMenuItem; + + }, + + + /** + * @method getFocusedMenu + * @description Returns a reference to the menu that currently has focus. + * @return {YAHOO.widget.Menu} + */ + getFocusedMenu: function() { + + if(m_oFocusedMenuItem) { + + return (m_oFocusedMenuItem.parent.getRoot()); + + } + + }, + + + /** + * @method toString + * @description Returns a string representing the menu manager. + * @return {String} + */ + toString: function() { + + return ("MenuManager"); + + } + + }; + +}(); + +})(); + + + +/** +* 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 +* <div> element of the menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source +* for the menu. +* @param {HTMLDivElement} p_oElement Object +* specifying the <div> element of the menu. +* @param {HTMLSelectElement} p_oElement +* Object specifying the <select> 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 +*/ +(function() { + +var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + CustomEvent = YAHOO.util.CustomEvent, + Lang = YAHOO.lang; + + +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 + ); + +}; + + +/** +* Constant representing the name of the Menu's events +* @property YAHOO.widget.Menu._EVENT_TYPES +* @private +* @final +* @type Object +*/ +YAHOO.widget.Menu._EVENT_TYPES = { + + "MOUSE_OVER": "mouseover", + "MOUSE_OUT": "mouseout", + "MOUSE_DOWN": "mousedown", + "MOUSE_UP": "mouseup", + "CLICK": "click", + "KEY_PRESS": "keypress", + "KEY_DOWN": "keydown", + "KEY_UP": "keyup", + "FOCUS": "focus", + "BLUR": "blur", + "ITEM_ADDED": "itemAdded", + "ITEM_REMOVED": "itemRemoved" + +}; + + + +/** +* @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} +*/ +YAHOO.widget.Menu._checkPosition = function(p_sPosition) { + + if(typeof p_sPosition == "string") { + + var sPosition = p_sPosition.toLowerCase(); + + return ("dynamic,static".indexOf(sPosition) != -1); + + } + +}; + + + +/** +* Constant representing the Menu's configuration properties +* @property YAHOO.widget.Menu._DEFAULT_CONFIG +* @private +* @final +* @type Object +*/ +YAHOO.widget.Menu._DEFAULT_CONFIG = { + + "VISIBLE": { + key: "visible", + value: false, + validator: Lang.isBoolean + }, + + "CONSTRAIN_TO_VIEWPORT": { + key: "constraintoviewport", + value: true, + validator: Lang.isBoolean, + supercedes: ["iframe","x","y","xy"] + }, + + "POSITION": { + key: "position", + value: "dynamic", + validator: YAHOO.widget.Menu._checkPosition, + supercedes: ["visible"] + }, + + "SUBMENU_ALIGNMENT": { + key: "submenualignment", + value: ["tl","tr"] + }, + + "AUTO_SUBMENU_DISPLAY": { + key: "autosubmenudisplay", + value: true, + validator: Lang.isBoolean + }, + + "SHOW_DELAY": { + key: "showdelay", + value: 250, + validator: Lang.isNumber + }, + + "HIDE_DELAY": { + key: "hidedelay", + value: 0, + validator: Lang.isNumber, + suppressEvent: true + }, + + "SUBMENU_HIDE_DELAY": { + key: "submenuhidedelay", + value: 250, + validator: Lang.isNumber + }, + + "CLICK_TO_HIDE": { + key: "clicktohide", + value: true, + validator: Lang.isBoolean + }, + + "CONTAINER": { + key: "container" + }, + + "MAX_HEIGHT": { + key: "maxheight", + value: 0, + validator: Lang.isNumber + }, + + "CLASS_NAME": { + key: "classname", + value: null, + validator: Lang.isString + } + +}; + + +YAHOO.lang.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 <div> 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 <li> element, +* <optgroup> element or <option>) +* 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 _nSubmenuHideDelayId +* @description Number representing the time-out setting used to cancel the +* hiding of a submenu. +* @default null +* @private +* @type Number +*/ +_nSubmenuHideDelayId: null, + + +/** +* @property _nBodyScrollId +* @description Number representing the time-out setting used to cancel the +* scrolling of the menu's body element. +* @default null +* @private +* @type Number +*/ +_nBodyScrollId: null, + + +/** +* @property _bHideDelayEventHandlersAssigned +* @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 +*/ +_bHideDelayEventHandlersAssigned: 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 Multi-dimensional Array representing the menu items as they +* are grouped in the menu. +* @default [] +* @private +* @type Array +*/ +_aItemGroups: null, + + +/** +* @property _aListElements +* @description Array of <ul> elements, each of which is +* the parent node for each item's <li> element. +* @default [] +* @private +* @type Array +*/ +_aListElements: null, + + +/** +* @property _nCurrentMouseX +* @description The current x coordinate of the mouse inside the area of +* the menu. +* @default 0 +* @private +* @type Number +*/ +_nCurrentMouseX: 0, + + +/** +* @property _nMaxHeight +* @description The original value of the "maxheight" configuration property +* as set by the user. +* @default -1 +* @private +* @type Number +*/ +_nMaxHeight: -1, + + +/** +* @property _bStopMouseEventHandlers +* @description Stops "mouseover," "mouseout," and "mousemove" event handlers +* from executing. +* @default false +* @private +* @type Boolean +*/ +_bStopMouseEventHandlers: false, + + +/** +* @property _sClassName +* @description The current value of the "classname" configuration attribute. +* @default null +* @private +* @type String +*/ +_sClassName: 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 is selected. +* @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 +* <select> or <div>) used to +* create the menu. +* @default null +* @type HTMLSelectElement|HTMLDivElement +*/ +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 +* <div> element of the menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source +* for the menu. +* @param {HTMLDivElement} p_oElement Object +* specifying the <div> element of the menu. +* @param {HTMLSelectElement} p_oElement +* Object specifying the <select> 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); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + this.logger.log("Source element: " + this.srcElement.tagName); + + 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); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + this.logger.log("Source element: " + this.srcElement.tagName); + + 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); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + this.logger.log("No source element found. " + + "Created element with id: " + this.id); + + } + + + 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.beforeShowEvent.subscribe(this._onBeforeShow, this, true); + this.showEvent.subscribe(this._onShow, this, true); + this.beforeHideEvent.subscribe(this._onBeforeHide, this, true); + this.hideEvent.subscribe(this._onHide, 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); + this.keyPressEvent.subscribe(this._onKeyPress, this, true); + + YAHOO.widget.Module.textResizeEvent.subscribe( + this._onTextResize, + 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.toUpperCase() == "DIV") { + + /* + Populate the collection of item groups and item + group titles + */ + + oNode = this.body.firstChild; + + var nGroup = 0, + 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; + + this.logger.log("Searching DOM for items to initialize."); + + if(this.srcElement.tagName) { + + var sSrcElementTagName = this.srcElement.tagName.toUpperCase(); + + + switch(sSrcElementTagName) { + + case "DIV": + + if(this._aListElements.length > 0) { + + this.logger.log("Found " + + this._aListElements.length + + " item groups to initialize."); + + var i = this._aListElements.length - 1; + + do { + + oNode = this._aListElements[i].firstChild; + + this.logger.log("Scanning " + + this._aListElements[i].childNodes.length + + " child nodes for items to initialize."); + + do { + + if( + oNode && + oNode.tagName && + oNode.tagName.toUpperCase() == "LI" + ) { + + this.logger.log("Initializing " + + oNode.tagName + " node."); + + this.addItem( + new this.ITEM_TYPE( + oNode, + { parent: this } + ), + i + ); + + } + + } + while((oNode = oNode.nextSibling)); + + } + while(i--); + + } + + break; + + case "SELECT": + + this.logger.log("Scanning " + + this.srcElement.childNodes.length + + " child nodes for items to initialize."); + + oNode = this.srcElement.firstChild; + + do { + + if(oNode && oNode.tagName) { + + switch(oNode.tagName.toUpperCase()) { + + case "OPTGROUP": + case "OPTION": + + this.logger.log("Initializing " + + oNode.tagName + " node."); + + 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 aItems = this.getItems(), + nItems = aItems.length, + oItem; + + for(var i=0; i= 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 { + + function getNextItemSibling(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.logger.log("Item inserted." + + " Text: " + oGroupItem.cfg.getProperty("text") + ", " + + " Index: " + oGroupItem.index + ", " + + " Group Index: " + oGroupItem.groupIndex); + + 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.logger.log("Item added." + + " Text: " + oGroupItem.cfg.getProperty("text") + ", " + + " Index: " + oGroupItem.index + ", " + + " Group Index: " + oGroupItem.groupIndex); + + + 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, + aGroup = this._getItemGroup(nGroupIndex); + + if(aGroup) { + + var aArray = aGroup.splice(p_nItemIndex, 1), + 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, + 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), + nItems = aGroup.length; + + if(nItems > 0) { + + var i = nItems - 1, + oItem, + 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 +* <ul> 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, null, p_oItem); + oSubmenu.hideEvent.subscribe(this._onSubmenuHide, null, p_oItem); + + } + +}, + + +/** +* @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.blurEvent.subscribe(this._onMenuItemBlur); + + p_oItem.cfg.configChangedEvent.subscribe( + this._onMenuItemConfigChange, + p_oItem, + this + ); + +}, + + +/** +* @method _getOffsetWidth +* @description Returns the offset width of the menu's +* <div> 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 _setWidth +* @description Sets the width of the menu's root <div> +* element to its offsetWidth. +* @private +*/ +_setWidth: function() { + + var sWidth; + + if (this.element.parentNode.tagName.toUpperCase() == "BODY") { + + if (this.browser == "opera") { + + sWidth = this._getOffsetWidth(); + + } + else { + + Dom.setStyle(this.element, "width", "auto"); + + sWidth = this.element.offsetWidth; + + } + + } + else { + + sWidth = this._getOffsetWidth(); + + } + + this.cfg.setProperty("width", (sWidth + "px")); + +}, + + +/** +* @method _onWidthChange +* @description Change event handler for the the menu's "width" configuration +* property. +* @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. +*/ +_onWidthChange: function(p_sType, p_aArgs) { + + var sWidth = p_aArgs[0]; + + if (sWidth && !this._hasSetWidthHandlers) { + + this.itemAddedEvent.subscribe(this._setWidth); + this.itemRemovedEvent.subscribe(this._setWidth); + + this._hasSetWidthHandlers = true; + + } + else if (this._hasSetWidthHandlers) { + + this.itemAddedEvent.unsubscribe(this._setWidth); + this.itemRemovedEvent.unsubscribe(this._setWidth); + + this._hasSetWidthHandlers = false; + + } + +}, + + +/** +* @method _onVisibleChange +* @description Change event handler for the the menu's "visible" configuration +* property. +* @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. +*/ +_onVisibleChange: function(p_sType, p_aArgs) { + + var bVisible = p_aArgs[0]; + + if (bVisible) { + + Dom.addClass(this.element, "visible"); + + } + else { + + Dom.removeClass(this.element, "visible"); + + } + +}, + + +/** +* @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(), + me = this; + + function hideMenu() { + + 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) { + + var oRoot = this.getRoot(); + + function showMenu() { + + if(p_oMenu.parent.cfg.getProperty("selected")) { + + p_oMenu.show(); + + } + + } + + + oRoot._nShowDelayId = + window.setTimeout(showMenu, oRoot.cfg.getProperty("showdelay")); + +}, + + +/** +* @method _execSubmenuHideDelay +* @description Hides a submenu after the number of milliseconds specified by +* the "submenuhidedelay" configuration property have ellapsed. +* @private +* @param {YAHOO.widget.Menu} p_oSubmenu Object specifying the submenu that +* should be hidden. +* @param {Number} p_nMouseX The x coordinate of the mouse when it left +* the specified submenu's parent menu item. +* @param {Number} p_nHideDelay The number of milliseconds that should ellapse +* before the submenu is hidden. +*/ +_execSubmenuHideDelay: function(p_oSubmenu, p_nMouseX, p_nHideDelay) { + + var me = this; + + p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () { + + if(me._nCurrentMouseX > (p_nMouseX + 10)) { + + p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () { + + p_oSubmenu.hide(); + + }, p_nHideDelay); + + } + else { + + p_oSubmenu.hide(); + + } + + }, 50); + +}, + + + +// Protected methods + + +/** +* @method _disableScrollHeader +* @description Disables the header used for scrolling the body of the menu. +* @protected +*/ +_disableScrollHeader: function() { + + if(!this._bHeaderDisabled) { + + Dom.addClass(this.header, "topscrollbar_disabled"); + this._bHeaderDisabled = true; + + } + +}, + + +/** +* @method _disableScrollFooter +* @description Disables the footer used for scrolling the body of the menu. +* @protected +*/ +_disableScrollFooter: function() { + + if(!this._bFooterDisabled) { + + Dom.addClass(this.footer, "bottomscrollbar_disabled"); + this._bFooterDisabled = true; + + } + +}, + + +/** +* @method _enableScrollHeader +* @description Enables the header used for scrolling the body of the menu. +* @protected +*/ +_enableScrollHeader: function() { + + if(this._bHeaderDisabled) { + + Dom.removeClass(this.header, "topscrollbar_disabled"); + this._bHeaderDisabled = false; + + } + +}, + + +/** +* @method _enableScrollFooter +* @description Enables the footer used for scrolling the body of the menu. +* @protected +*/ +_enableScrollFooter: function() { + + if(this._bFooterDisabled) { + + Dom.removeClass(this.footer, "bottomscrollbar_disabled"); + this._bFooterDisabled = false; + + } + +}, + + +/** +* @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) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oTarget = Event.getTarget(oEvent); + + + if( + !this._bHandledMouseOverEvent && + (oTarget == this.element || Dom.isAncestor(this.element, oTarget)) + ) { + + // Menu mouseover logic + + this._nCurrentMouseX = 0; + + Event.on( + this.element, + "mousemove", + this._onMouseMove, + this, + true + ); + + + this.clearActiveItem(); + + + if(this.parent && this._nSubmenuHideDelayId) { + + window.clearTimeout(this._nSubmenuHideDelayId); + + this.parent.cfg.setProperty("selected", true); + + var oParentMenu = this.parent.parent; + + oParentMenu._bHandledMouseOutEvent = true; + oParentMenu._bHandledMouseOverEvent = false; + + } + + + this._bHandledMouseOverEvent = true; + this._bHandledMouseOutEvent = false; + + } + + + if( + oItem && !oItem.handledMouseOverEvent && + !oItem.cfg.getProperty("disabled") && + (oTarget == oItem.element || Dom.isAncestor(oItem.element, oTarget)) + ) { + + // Menu Item mouseover logic + + var nShowDelay = this.cfg.getProperty("showdelay"), + bShowDelay = (nShowDelay > 0); + + + if(bShowDelay) { + + this._cancelShowDelay(); + + } + + + var oActiveItem = this.activeItem; + + if(oActiveItem) { + + oActiveItem.cfg.setProperty("selected", false); + + } + + + var oItemCfg = oItem.cfg; + + // Select and focus the current menu item + + oItemCfg.setProperty("selected", true); + + + if (this.hasFocus()) { + + oItem.focus(); + + } + + + if(this.cfg.getProperty("autosubmenudisplay")) { + + // Show the submenu this menu item + + var oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(bShowDelay) { + + 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) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oRelatedTarget = Event.getRelatedTarget(oEvent), + bMovingToSubmenu = false; + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + 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 + ) + ) { + + // Menu Item mouseout logic + + if(!bMovingToSubmenu) { + + oItem.cfg.setProperty("selected", false); + + + if(oSubmenu) { + + var nSubmenuHideDelay = + this.cfg.getProperty("submenuhidedelay"), + + nShowDelay = this.cfg.getProperty("showdelay"); + + if( + !(this instanceof YAHOO.widget.MenuBar) && + nSubmenuHideDelay > 0 && + nShowDelay >= nSubmenuHideDelay + ) { + + this._execSubmenuHideDelay( + oSubmenu, + Event.getPageX(oEvent), + nSubmenuHideDelay + ); + + } + else { + + oSubmenu.hide(); + + } + + } + + } + + + oItem.handledMouseOutEvent = true; + oItem.handledMouseOverEvent = false; + + } + + } + + + if( + !this._bHandledMouseOutEvent && + ( + ( + oRelatedTarget != this.element && + !Dom.isAncestor(this.element, oRelatedTarget) + ) + || bMovingToSubmenu + ) + ) { + + // Menu mouseout logic + + Event.removeListener(this.element, "mousemove", this._onMouseMove); + + this._nCurrentMouseX = Event.getPageX(oEvent); + + this._bHandledMouseOutEvent = true; + this._bHandledMouseOverEvent = false; + + } + +}, + + +/** +* @method _onMouseMove +* @description "click" event handler for the menu. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onMouseMove: function(p_oEvent, p_oMenu) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + this._nCurrentMouseX = Event.getPageX(p_oEvent); + +}, + + +/** +* @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], + oItem = p_aArgs[1], + oTarget = Event.getTarget(oEvent); + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + 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(); + + oSubmenu.parent.focus(); + + } + else { + + this.clearActiveItem(); + + oItem.cfg.setProperty("selected", true); + + oSubmenu.show(); + + oSubmenu.setInitialFocus(); + + } + + } + else { + + var sURL = oItemCfg.getProperty("url"), + bCurrentPageURL = (sURL.substr((sURL.length-1),1) == "#"), + sTarget = oItemCfg.getProperty("target"), + bHasTarget = (sTarget && sTarget.length > 0); + + /* + Prevent the browser from following links + equal to "#" + */ + + if( + oTarget.tagName.toUpperCase() == "A" && + bCurrentPageURL && !bHasTarget + ) { + + Event.preventDefault(oEvent); + + oItem.focus(); + + } + + 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 if(oRoot.cfg.getProperty("clicktohide")) { + + 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], + oItem = p_aArgs[1], + me = this, + oSubmenu; + + + /* + This function is called to prevent a bug in Firefox. In Firefox, + moving a DOM element into a stationary mouse pointer will cause the + browser to fire mouse events. This can result in the menu mouse + event handlers being called uncessarily, especially when menus are + moved into a stationary mouse pointer as a result of a + key event handler. + */ + function stopMouseEventHandlers() { + + me._bStopMouseEventHandlers = true; + + window.setTimeout(function() { + + me._bStopMouseEventHandlers = false; + + }, 10); + + } + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + oParentItem = this.parent, + oRoot, + oNextItem; + + + switch(oEvent.keyCode) { + + case 38: // Up arrow + case 40: // Down arrow + + oNextItem = (oEvent.keyCode == 38) ? + oItem.getPreviousEnabledSibling() : + oItem.getNextEnabledSibling(); + + if(oNextItem) { + + this.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + oNextItem.focus(); + + + if(this.cfg.getProperty("maxheight") > 0) { + + var oBody = this.body; + + oBody.scrollTop = + + ( + oNextItem.element.offsetTop + + oNextItem.element.offsetHeight + ) - oBody.offsetHeight; + + + var nScrollTop = oBody.scrollTop, + nScrollTarget = + oBody.scrollHeight - oBody.offsetHeight; + + if(nScrollTop === 0) { + + this._disableScrollHeader(); + this._enableScrollFooter(); + + } + else if(nScrollTop == nScrollTarget) { + + this._enableScrollHeader(); + this._disableScrollFooter(); + + } + else { + + this._enableScrollHeader(); + this._enableScrollFooter(); + + } + + } + + } + + + Event.preventDefault(oEvent); + + stopMouseEventHandlers(); + + break; + + + case 39: // Right arrow + + oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(!oItemCfg.getProperty("selected")) { + + oItemCfg.setProperty("selected", true); + + } + + oSubmenu.show(); + oSubmenu.setInitialFocus(); + 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); + + stopMouseEventHandlers(); + + 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); + + stopMouseEventHandlers(); + + 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.blur(); + this.activeItem.cfg.setProperty("selected", false); + + } + + } + + + Event.preventDefault(oEvent); + + } + +}, + + +/** +* @method _onKeyPress +* @description "keypress" event handler for a Menu instance. +* @protected +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event +* was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance that fired the event. +*/ +_onKeyPress: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0]; + + + if(oEvent.keyCode == 40 || oEvent.keyCode == 38) { + + YAHOO.util.Event.preventDefault(oEvent); + + } + +}, + + +/** +* @method _onTextResize +* @description "textresize" 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. +*/ +_onTextResize: function(p_sType, p_aArgs, p_oMenu) { + + if(this.browser == "gecko" && !this._handleResize) { + + this._handleResize = true; + return; + + } + + + var oConfig = this.cfg; + + if(oConfig.getProperty("position") == "dynamic") { + + oConfig.setProperty("width", (this._getOffsetWidth() + "px")); + + } + +}, + + +/** +* @method _onScrollTargetMouseOver +* @description "mouseover" event handler for the menu's "header" and "footer" +* elements. Used to scroll the body of the menu up and down when the +* menu's "maxheight" configuration property is set to a value greater than 0. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onScrollTargetMouseOver: function(p_oEvent, p_oMenu) { + + this._cancelHideDelay(); + + var oTarget = Event.getTarget(p_oEvent), + oBody = this.body, + me = this, + nScrollTarget, + fnScrollFunction; + + + function scrollBodyDown() { + + var nScrollTop = oBody.scrollTop; + + + if(nScrollTop < nScrollTarget) { + + oBody.scrollTop = (nScrollTop + 1); + + me._enableScrollHeader(); + + } + else { + + oBody.scrollTop = nScrollTarget; + + window.clearInterval(me._nBodyScrollId); + + me._disableScrollFooter(); + + } + + } + + + function scrollBodyUp() { + + var nScrollTop = oBody.scrollTop; + + + if(nScrollTop > 0) { + + oBody.scrollTop = (nScrollTop - 1); + + me._enableScrollFooter(); + + } + else { + + oBody.scrollTop = 0; + + window.clearInterval(me._nBodyScrollId); + + me._disableScrollHeader(); + + } + + } + + + if(Dom.hasClass(oTarget, "hd")) { + + fnScrollFunction = scrollBodyUp; + + } + else { + + nScrollTarget = oBody.scrollHeight - oBody.offsetHeight; + + fnScrollFunction = scrollBodyDown; + + } + + + this._nBodyScrollId = window.setInterval(fnScrollFunction, 10); + +}, + + +/** +* @method _onScrollTargetMouseOut +* @description "mouseout" event handler for the menu's "header" and "footer" +* elements. Used to stop scrolling the body of the menu up and down when the +* menu's "maxheight" configuration property is set to a value greater than 0. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onScrollTargetMouseOut: function(p_oEvent, p_oMenu) { + + window.clearInterval(this._nBodyScrollId); + + this._cancelHideDelay(); + +}, + + + +// 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) { + + this.cfg.subscribeToConfigEvent("width", this._onWidthChange); + this.cfg.subscribeToConfigEvent("visible", this._onVisibleChange); + + 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 +* <ul>, <li> 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, + oEl = this.element, + nListElements = this._aListElements.length; + + + if(nListElements > 0) { + + var i = 0, + bFirstList = true, + oUL, + 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. +*/ +_onRender: function(p_sType, p_aArgs) { + + if ( + this.cfg.getProperty("position") == "dynamic" && + !this.cfg.getProperty("width") + ) { + + this._setWidth(); + + } + +}, + + +/** +* @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= nViewportHeight) { + + var nMaxHeight = this.cfg.getProperty("maxheight"); + + /* + Cache the original value for the "maxheight" configuration + property so that we can set it back when the menu is hidden. + */ + + this._nMaxHeight = nMaxHeight; + + this.cfg.setProperty("maxheight", (nViewportHeight - 20)); + + } + + + if(this.cfg.getProperty("maxheight") > 0) { + + var oBody = this.body; + + if(oBody.scrollTop > 0) { + + oBody.scrollTop = 0; + + } + + this._disableScrollHeader(); + this._enableScrollFooter(); + + } + + } + + +}, + + +/** +* @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) { + + var oParent = this.parent; + + if(oParent) { + + var oParentMenu = oParent.parent, + aParentAlignment = oParentMenu.cfg.getProperty("submenualignment"), + 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); + + + function disableAutoSubmenuDisplay(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.on(document, "mousedown", disableAutoSubmenuDisplay); + Event.on(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) { + + var oActiveItem = this.activeItem; + + if(oActiveItem) { + + var oConfig = oActiveItem.cfg; + + oConfig.setProperty("selected", false); + + var oSubmenu = oConfig.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.hide(); + + } + + } + + if (this == this.getRoot()) { + + this.blur(); + + } + +}, + + +/** +* @method _onHide +* @description "hide" 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. +*/ +_onHide: function(p_sType, p_aArgs, p_oMenu) { + + if(this._nMaxHeight != -1) { + + this.cfg.setProperty("maxheight", this._nMaxHeight); + + this._nMaxHeight = -1; + + } + +}, + + +/** +* @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], + oPropertyValue = p_aArgs[0][1]; + + switch(sPropertyName) { + + case "iframe": + case "constraintoviewport": + case "hidedelay": + case "showdelay": + case "submenuhidedelay": + case "clicktohide": + case "effect": + case "classname": + + 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) { + + var oParentMenu = p_oSubmenu.parent.parent, + + oConfig = { + + constraintoviewport: + oParentMenu.cfg.getProperty("constraintoviewport"), + + xy: [0,0], + + clicktohide: oParentMenu.cfg.getProperty("clicktohide"), + + effect: oParentMenu.cfg.getProperty("effect"), + + showdelay: oParentMenu.cfg.getProperty("showdelay"), + + hidedelay: oParentMenu.cfg.getProperty("hidedelay"), + + submenuhidedelay: oParentMenu.cfg.getProperty("submenuhidedelay"), + + classname: oParentMenu.cfg.getProperty("classname") + + }; + + + /* + 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) { + + var oLI = this.parent.element; + + if(this.element.parentNode == oLI) { + + this.render(); + + } + else { + + this.render(oLI); + + } + + } + +}, + + +/** +* @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, + aAlignment = oParent.parent.cfg.getProperty("submenualignment"); + + this.cfg.setProperty( + "context", + [oParent.element, aAlignment[0], aAlignment[1]] + ); + + + var nScrollTop = oParent.parent.body.scrollTop; + + if( + (this.browser == "gecko" || this.browser == "safari") + && nScrollTop > 0 + ) { + + this.cfg.setProperty("y", (this.cfg.getProperty("y") - nScrollTop)); + + } + +}, + + +/** +* @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. +*/ +_onSubmenuShow: function(p_sType, p_aArgs) { + + this.submenuIndicator.firstChild.nodeValue = + this.EXPANDED_SUBMENU_INDICATOR_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. +*/ +_onSubmenuHide: function(p_sType, p_aArgs) { + + this.submenuIndicator.firstChild.nodeValue = + this.COLLAPSED_SUBMENU_INDICATOR_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. +*/ +_onMenuItemFocus: function(p_sType, p_aArgs) { + + this.parent.focusEvent.fire(this); + +}, + + +/** +* @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.parent.blurEvent.fire(this); + +}, + + +/** +* @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 sPropertyName = p_aArgs[0][0], + oPropertyValue = p_aArgs[0][1]; + + switch(sPropertyName) { + + case "selected": + + if (oPropertyValue === true) { + + this.activeItem = p_oItem; + + } + + break; + + 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) { + + if(this.parent && !(this.parent.parent instanceof YAHOO.widget.MenuBar)) { + + var oConfig = this.cfg, + pos = args[0], + + x = pos[0], + y = pos[1], + + offsetHeight = this.element.offsetHeight, + offsetWidth = this.element.offsetWidth, + + viewPortWidth = YAHOO.util.Dom.getViewportWidth(), + viewPortHeight = YAHOO.util.Dom.getViewportHeight(), + + scrollX = Math.max( + document.documentElement.scrollLeft, + document.body.scrollLeft + ), + + scrollY = Math.max( + document.documentElement.scrollTop, + document.body.scrollTop + ), + + nPadding = ( + this.parent && + this.parent.parent instanceof YAHOO.widget.MenuBar + ) ? 0 : 10, + + topConstraint = scrollY + nPadding, + leftConstraint = scrollX + nPadding, + bottomConstraint = + scrollY + viewPortHeight - offsetHeight - nPadding, + rightConstraint = scrollX + viewPortWidth - offsetWidth - nPadding, + + aContext = oConfig.getProperty("context"), + 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); + oConfig.setProperty("xy", [x,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], + 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", + 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], + oMouseOutEvent = this.mouseOutEvent, + oMouseOverEvent = this.mouseOverEvent, + 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._bHideDelayEventHandlersAssigned) { + + oMouseOutEvent.subscribe(this._execHideDelay, this); + oMouseOverEvent.subscribe(this._cancelHideDelay, this, true); + oKeyDownEvent.subscribe(this._cancelHideDelay, this, true); + + this._bHideDelayEventHandlersAssigned = true; + + } + + } + else { + + oMouseOutEvent.unsubscribe(this._execHideDelay, this); + oMouseOverEvent.unsubscribe(this._cancelHideDelay, this); + oKeyDownEvent.unsubscribe(this._cancelHideDelay, this); + + this._bHideDelayEventHandlersAssigned = 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 + ); + + } + +}, + + +/** +* @method _setMaxHeight +* @description "renderEvent" handler used to defer the setting of the +* "maxheight" configuration property until the menu is rendered in lazy +* load scenarios. +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event +* was fired. +* @param {Number} p_nMaxHeight Number representing the value to set for the +* "maxheight" configuration property. +* @private +*/ +_setMaxHeight: function(p_sType, p_aArgs, p_nMaxHeight) { + + this.cfg.setProperty("maxheight", p_nMaxHeight); + this.renderEvent.unsubscribe(this._setMaxHeight); + +}, + + +/** +* @method configMaxHeight +* @description Event handler for when the "maxheight" configuration property of +* a Menu changes. +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event +* was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance fired +* the event. +*/ +configMaxHeight: function(p_sType, p_aArgs, p_oMenu) { + + var nMaxHeight = p_aArgs[0], + oBody = this.body; + + + if(this.lazyLoad && !oBody) { + + this.renderEvent.unsubscribe(this._setMaxHeight); + + if(nMaxHeight > 0) { + + this.renderEvent.subscribe(this._setMaxHeight, nMaxHeight, this); + + } + + return; + + } + + Dom.setStyle(oBody, "height", "auto"); + Dom.setStyle(oBody, "overflow", "visible"); + + var oHeader = this.header, + oFooter = this.footer, + fnMouseOver = this._onScrollTargetMouseOver, + fnMouseOut = this._onScrollTargetMouseOut; + + + if((nMaxHeight > 0) && (oBody.offsetHeight > nMaxHeight)) { + + if(!this.cfg.getProperty("width")) { + + this._setWidth(); + + } + + if(!oHeader && !oFooter) { + + this.setHeader(" "); + this.setFooter(" "); + + oHeader = this.header; + oFooter = this.footer; + + Dom.addClass(oHeader, "topscrollbar"); + Dom.addClass(oFooter, "bottomscrollbar"); + + this.element.insertBefore(oHeader, oBody); + this.element.appendChild(oFooter); + + Event.on(oHeader, "mouseover", fnMouseOver, this, true); + Event.on(oHeader, "mouseout", fnMouseOut, this, true); + Event.on(oFooter, "mouseover", fnMouseOver, this, true); + Event.on(oFooter, "mouseout", fnMouseOut, this, true); + + } + + var nHeight = + + ( + nMaxHeight - + (this.footer.offsetHeight + this.header.offsetHeight) + ); + + Dom.setStyle(oBody, "height", (nHeight + "px")); + Dom.setStyle(oBody, "overflow", "hidden"); + + } + else if(oHeader && oFooter) { + + Dom.setStyle(oBody, "height", "auto"); + Dom.setStyle(oBody, "overflow", "visible"); + + Event.removeListener(oHeader, "mouseover", fnMouseOver); + Event.removeListener(oHeader, "mouseout", fnMouseOut); + Event.removeListener(oFooter, "mouseover", fnMouseOver); + Event.removeListener(oFooter, "mouseout", fnMouseOut); + + this.element.removeChild(oHeader); + this.element.removeChild(oFooter); + + this.header = null; + this.footer = null; + + } + +}, + + +/** +* @method configClassName +* @description Event handler for when the "classname" configuration property of +* a menu changes. +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance fired the event. +*/ +configClassName: function(p_sType, p_aArgs, p_oMenu) { + + var sClassName = p_aArgs[0]; + + if(this._sClassName) { + + Dom.removeClass(this.element, this._sClassName); + + } + + Dom.addClass(this.element, sClassName); + this._sClassName = sClassName; + +}, + + + +// Public methods + + + +/** +* @method initEvents +* @description Initializes the custom events for the menu. +*/ +initEvents: function() { + + YAHOO.widget.Menu.superclass.initEvents.call(this); + + // Create custom events + + var EVENT_TYPES = YAHOO.widget.Menu._EVENT_TYPES; + + this.mouseOverEvent = new CustomEvent(EVENT_TYPES.MOUSE_OVER, this); + this.mouseOutEvent = new CustomEvent(EVENT_TYPES.MOUSE_OUT, this); + this.mouseDownEvent = new CustomEvent(EVENT_TYPES.MOUSE_DOWN, this); + this.mouseUpEvent = new CustomEvent(EVENT_TYPES.MOUSE_UP, this); + this.clickEvent = new CustomEvent(EVENT_TYPES.CLICK, this); + this.keyPressEvent = new CustomEvent(EVENT_TYPES.KEY_PRESS, this); + this.keyDownEvent = new CustomEvent(EVENT_TYPES.KEY_DOWN, this); + this.keyUpEvent = new CustomEvent(EVENT_TYPES.KEY_UP, this); + this.focusEvent = new CustomEvent(EVENT_TYPES.FOCUS, this); + this.blurEvent = new CustomEvent(EVENT_TYPES.BLUR, this); + this.itemAddedEvent = new CustomEvent(EVENT_TYPES.ITEM_ADDED, this); + this.itemRemovedEvent = new CustomEvent(EVENT_TYPES.ITEM_REMOVED, 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() { + + var sReturnVal = "Menu", + sId = this.id; + + if(sId) { + + sReturnVal += (" " + sId); + + } + + return sReturnVal; + +}, + + +/** +* @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, + 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, + 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) { + + if(Lang.isArray(p_aItems)) { + + var nItems = p_aItems.length, + aItems = [], + oItem; + + + for(var i=0; i 0) { + + var i = nItems - 1, + oItem, + oSubmenu; + + do { + + oItem = aItems[i]; + + if(oItem) { + + oSubmenu = oItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + this.cfg.configChangedEvent.unsubscribe( + this._onParentMenuConfigChange, + oSubmenu + ); + + this.renderEvent.unsubscribe( + this._onParentMenuRender, + oSubmenu + ); + + } + + oItem.destroy(); + + } + + } + while(i--); + + } + + + if(oHeader) { + + Event.purgeElement(oHeader); + oElement.removeChild(oHeader); + + } + + + if(oFooter) { + + Event.purgeElement(oFooter); + oElement.removeChild(oFooter); + } + + + if(oBody) { + + Event.purgeElement(oBody); + + oBody.innerHTML = ""; + + } + + + this._aItemGroups = []; + this._aListElements = []; + this._aGroupTitleElements = []; + + this.cfg.setProperty("width", null); + +}, + + +/** +* @method destroy +* @description Removes the menu's <div> element +* (and accompanying child nodes) from the document. +*/ +destroy: function() { + + // Remove all DOM event listeners + + Event.purgeElement(this.element); + + + // 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(); + this.focusEvent.unsubscribeAll(); + this.blurEvent.unsubscribeAll(); + this.itemAddedEvent.unsubscribeAll(); + this.itemRemovedEvent.unsubscribeAll(); + this.cfg.unsubscribeFromConfigEvent("width", this._onWidthChange); + this.cfg.unsubscribeFromConfigEvent("visible", this._onVisibleChange); + + if (this._hasSetWidthHandlers) { + + this.itemAddedEvent.unsubscribe(this._setWidth); + this.itemRemovedEvent.unsubscribe(this._setWidth); + + this._hasSetWidthHandlers = false; + + } + + YAHOO.widget.Module.textResizeEvent.unsubscribe(this._onTextResize, this); + + + // Remove all items + + this.clearContent(); + + + this._aItemGroups = null; + this._aListElements = null; + this._aGroupTitleElements = null; + + + // Continue with the superclass implementation of this method + + YAHOO.widget.Menu.superclass.destroy.call(this); + + this.logger.log("Destroyed."); + +}, + + +/** +* @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; + + if(p_bBlur) { + + oActiveItem.blur(); + + } + + oConfig.setProperty("selected", false); + + var oSubmenu = oConfig.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.hide(); + + } + + this.activeItem = null; + + } + +}, + + +/** +* @method focus +* @description Causes the menu to receive focus and fires the "focus" event. +*/ +focus: function() { + + if (!this.hasFocus()) { + + this.setInitialFocus(); + + } + +}, + + +/** +* @method blur +* @description Causes the menu to lose focus and fires the "blur" event. +*/ +blur: function() { + + if (this.hasFocus()) { + + var oItem = YAHOO.widget.MenuManager.getFocusedMenuItem(); + + if (oItem) { + + oItem.blur(); + + } + + } + +}, + + +/** +* @method hasFocus +* @description Returns a boolean indicating whether or not the menu has focus. +* @return {Boolean} +*/ +hasFocus: function() { + + return (YAHOO.widget.MenuManager.getFocusedMenu() == this.getRoot()); + +}, + + +/** +* @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, + DEFAULT_CONFIG = YAHOO.widget.Menu._DEFAULT_CONFIG; + + // Add configuration attributes + + /* + Change the default value for the "visible" configuration + property to "false" by re-adding the property. + */ + + /** + * @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 <div> + * 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 + * <div> element's "display" style property + * between "block" (true) or "none" (false). + * @default false + * @type Boolean + */ + oConfig.addProperty( + DEFAULT_CONFIG.VISIBLE.key, + { + handler: this.configVisible, + value: DEFAULT_CONFIG.VISIBLE.value, + validator: DEFAULT_CONFIG.VISIBLE.validator + } + ); + + + /* + Change the default value for the "constraintoviewport" configuration + property to "true" by re-adding the property. + */ + + /** + * @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( + DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.key, + { + handler: this.configConstrainToViewport, + value: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.value, + validator: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.validator, + supercedes: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.supercedes + } + ); + + + /** + * @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( + DEFAULT_CONFIG.POSITION.key, + { + handler: this.configPosition, + value: DEFAULT_CONFIG.POSITION.value, + validator: DEFAULT_CONFIG.POSITION.validator, + supercedes: DEFAULT_CONFIG.POSITION.supercedes + } + ); + + + /** + * @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( + DEFAULT_CONFIG.SUBMENU_ALIGNMENT.key, + { + value: DEFAULT_CONFIG.SUBMENU_ALIGNMENT.value + } + ); + + + /** + * @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( + DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.key, + { + value: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.value, + validator: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.validator + } + ); + + + /** + * @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 250 + * @type Number + */ + oConfig.addProperty( + DEFAULT_CONFIG.SHOW_DELAY.key, + { + value: DEFAULT_CONFIG.SHOW_DELAY.value, + validator: DEFAULT_CONFIG.SHOW_DELAY.validator + } + ); + + + /** + * @config hidedelay + * @description Number indicating the time (in milliseconds) that should + * expire before the menu is hidden. + * @default 0 + * @type Number + */ + oConfig.addProperty( + DEFAULT_CONFIG.HIDE_DELAY.key, + { + handler: this.configHideDelay, + value: DEFAULT_CONFIG.HIDE_DELAY.value, + validator: DEFAULT_CONFIG.HIDE_DELAY.validator, + suppressEvent: DEFAULT_CONFIG.HIDE_DELAY.suppressEvent + } + ); + + + /** + * @config submenuhidedelay + * @description Number indicating the time (in milliseconds) that should + * expire before a submenu is hidden when the user mouses out of a menu item + * heading in the direction of a submenu. The value must be greater than or + * equal to the value specified for the "showdelay" configuration property. + * @default 250 + * @type Number + */ + oConfig.addProperty( + DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.key, + { + value: DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.value, + validator: DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.validator + } + ); + + + /** + * @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( + DEFAULT_CONFIG.CLICK_TO_HIDE.key, + { + value: DEFAULT_CONFIG.CLICK_TO_HIDE.value, + validator: DEFAULT_CONFIG.CLICK_TO_HIDE.validator + } + ); + + + /** + * @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 HTMLElement|String + * @default document.body + */ + oConfig.addProperty( + DEFAULT_CONFIG.CONTAINER.key, + { + handler: this.configContainer, + value: document.body + } + ); + + + /** + * @config maxheight + * @description Defines the maximum height (in pixels) for a menu before the + * contents of the body are scrolled. + * @default 0 + * @type Number + */ + oConfig.addProperty( + DEFAULT_CONFIG.MAX_HEIGHT.key, + { + handler: this.configMaxHeight, + value: DEFAULT_CONFIG.MAX_HEIGHT.value, + validator: DEFAULT_CONFIG.MAX_HEIGHT.validator + } + ); + + + /** + * @config classname + * @description CSS class to be applied to the menu's root + * <div> element. The specified class(es) are + * appended in addition to the default class as specified by the menu's + * CSS_CLASS_NAME constant. + * @default null + * @type String + */ + oConfig.addProperty( + DEFAULT_CONFIG.CLASS_NAME.key, + { + handler: this.configClassName, + value: DEFAULT_CONFIG.CLASS_NAME.value, + validator: DEFAULT_CONFIG.CLASS_NAME.validator + } + ); + +} + +}); // END YAHOO.lang.extend + +})(); + + + +(function() { + +var Dom = YAHOO.util.Dom, + Module = YAHOO.widget.Module, + Menu = YAHOO.widget.Menu, + CustomEvent = YAHOO.util.CustomEvent, + Lang = YAHOO.lang; + +/** +* Creates an item for a menu. +* +* @param {String} p_oObject String specifying the text of the menu item. +* @param {HTMLLIElement} p_oObject Object specifying +* the <li> element of the menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu item. +* @param {HTMLOptionElement} p_oObject Object +* specifying the <option> 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.id = p_oConfig.id; + + } + + this.init(p_oObject, p_oConfig); + + } + +}; + + +/** +* Constant representing the name of the MenuItem's events +* @property YAHOO.widget.MenuItem._EVENT_TYPES +* @private +* @final +* @type Object +*/ +YAHOO.widget.MenuItem._EVENT_TYPES = { + + "MOUSE_OVER": "mouseover", + "MOUSE_OUT": "mouseout", + "MOUSE_DOWN": "mousedown", + "MOUSE_UP": "mouseup", + "CLICK": "click", + "KEY_PRESS": "keypress", + "KEY_DOWN": "keydown", + "KEY_UP": "keyup", + "ITEM_ADDED": "itemAdded", + "ITEM_REMOVED": "itemRemoved", + "FOCUS": "focus", + "BLUR": "blur", + "DESTROY": "destroy" + +}; + + +/** +* Constant representing the MenuItem's configuration properties +* @property YAHOO.widget.MenuItem._DEFAULT_CONFIG +* @private +* @final +* @type Object +*/ +YAHOO.widget.MenuItem._DEFAULT_CONFIG = { + + "TEXT": { + key: "text", + value: "", + validator: Lang.isString, + suppressEvent: true + }, + + "HELP_TEXT": { + key: "helptext" + }, + + "URL": { + key: "url", + value: "#", + suppressEvent: true + }, + + "TARGET": { + key: "target", + suppressEvent: true + }, + + "EMPHASIS": { + key: "emphasis", + value: false, + validator: Lang.isBoolean, + suppressEvent: true + }, + + "STRONG_EMPHASIS": { + key: "strongemphasis", + value: false, + validator: Lang.isBoolean, + suppressEvent: true + }, + + "CHECKED": { + key: "checked", + value: false, + validator: Lang.isBoolean, + suppressEvent: true, + supercedes:["disabled"] + }, + + "DISABLED": { + key: "disabled", + value: false, + validator: Lang.isBoolean, + suppressEvent: true + }, + + "SELECTED": { + key: "selected", + value: false, + validator: Lang.isBoolean, + suppressEvent: true + }, + + "SUBMENU": { + key: "submenu" + }, + + "ONCLICK": { + key: "onclick" + }, + + "CLASS_NAME": { + key: "classname", + value: null, + validator: Lang.isString + } + +}; + + +YAHOO.widget.MenuItem.prototype = { + + // Constants + + + /** + * @property COLLAPSED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the <em> + * element used for the submenu arrow indicator. + * @default "Submenu collapsed. Click to expand submenu." + * @final + * @type String + */ + COLLAPSED_SUBMENU_INDICATOR_TEXT: + "Submenu collapsed. Click to expand submenu.", + + + /** + * @property EXPANDED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the submenu arrow indicator + * element (<em>) when the submenu is visible. + * @default "Submenu expanded. Click to collapse submenu." + * @final + * @type String + */ + EXPANDED_SUBMENU_INDICATOR_TEXT: + "Submenu expanded. Click to collapse submenu.", + + + /** + * @property DISABLED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the submenu arrow indicator + * element (<em>) when the menu item is disabled. + * @default "Submenu collapsed. (Item disabled.)." + * @final + * @type String + */ + DISABLED_SUBMENU_INDICATOR_TEXT: "Submenu collapsed. (Item disabled.)", + + + /** + * @property CHECKED_TEXT + * @description String representing the text to be used for the checked + * indicator element (<em>). + * @default "Checked." + * @final + * @type String + */ + CHECKED_TEXT: "Menu item checked.", + + + /** + * @property DISABLED_CHECKED_TEXT + * @description String representing the text to be used for the checked + * indicator element (<em>) when the menu item + * is disabled. + * @default "Checked. (Item disabled.)" + * @final + * @type String + */ + DISABLED_CHECKED_TEXT: "Checked. (Item disabled.)", + + + /** + * @property CSS_CLASS_NAME + * @description String representing the CSS class(es) to be applied to the + * <li> 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, + + + + // Private member variables + + + /** + * @property _oAnchor + * @description Object reference to the menu item's + * <a> element. + * @default null + * @private + * @type HTMLAnchorElement + */ + _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 + * <em> element. + * @default null + * @private + * @type HTMLElement + */ + _oHelpTextEM: null, + + + /** + * @property _oSubmenu + * @description Object reference to the menu item's submenu. + * @default null + * @private + * @type YAHOO.widget.Menu + */ + _oSubmenu: null, + + + /** + * @property _oCheckedIndicator + * @description Object reference to the menu item's checkmark image. + * @default HTMLElement + * @private + * @type HTMLElement + */ + _oCheckedIndicator: null, + + + /** + * @property _oOnclickAttributeValue + * @description Object reference to the menu item's current value for the + * "onclick" configuration attribute. + * @default null + * @private + * @type Object + */ + _oOnclickAttributeValue: null, + + + /** + * @property _sClassName + * @description The current value of the "classname" configuration attribute. + * @default null + * @private + * @type String + */ + _sClassName: 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 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 + * <li> element. + * @default HTMLLIElement + * @type HTMLLIElement + */ + element: null, + + + /** + * @property srcElement + * @description Object reference to the HTML element (either + * <li>, <optgroup> or + * <option>) used create the menu item. + * @default HTMLLIElement|HTMLOptGroupElement|HTMLOptionElement + * @type HTMLLIElement| + * HTMLOptGroupElement|HTMLOptionElement + */ + 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 <em> element + * used to create the submenu indicator for the menu item. + * @default HTMLElement + * @type HTMLElement + */ + submenuIndicator: null, + + + /** + * @property browser + * @description String representing the browser. + * @type String + */ + browser: Module.prototype.browser, + + + /** + * @property id + * @description Id of the menu item's root <li> + * element. This property should be set via the constructor using the + * configuration object literal. If an id is not specified, then one will + * be created using the "generateId" method of the Dom utility. + * @default null + * @type String + */ + id: null, + + + + // Events + + + /** + * @event destroyEvent + * @description Fires when the menu item's <li> + * element is removed from its parent <ul> 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 {HTMLLIElement} p_oObject Object specifying + * the <li> element of the menu item. + * @param {HTMLOptGroupElement} p_oObject Object + * specifying the <optgroup> element of the menu item. + * @param {HTMLOptionElement} p_oObject Object + * specifying the <option> 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) { + + + 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(Lang.isString(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"), + sURL = "#", + sTarget, + sText; + + + // 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), + bEmphasis = false, + 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) { + + var sId = this.element.id; + + if(!sId) { + + sId = this.id || Dom.generateId(); + + this.element.id = sId; + + } + + this.id = sId; + + + Dom.addClass(this.element, this.CSS_CLASS_NAME); + + + // Create custom events + + var EVENT_TYPES = YAHOO.widget.MenuItem._EVENT_TYPES; + + this.mouseOverEvent = new CustomEvent(EVENT_TYPES.MOUSE_OVER, this); + this.mouseOutEvent = new CustomEvent(EVENT_TYPES.MOUSE_OUT, this); + this.mouseDownEvent = new CustomEvent(EVENT_TYPES.MOUSE_DOWN, this); + this.mouseUpEvent = new CustomEvent(EVENT_TYPES.MOUSE_UP, this); + this.clickEvent = new CustomEvent(EVENT_TYPES.CLICK, this); + this.keyPressEvent = new CustomEvent(EVENT_TYPES.KEY_PRESS, this); + this.keyDownEvent = new CustomEvent(EVENT_TYPES.KEY_DOWN, this); + this.keyUpEvent = new CustomEvent(EVENT_TYPES.KEY_UP, this); + this.focusEvent = new CustomEvent(EVENT_TYPES.FOCUS, this); + this.blurEvent = new CustomEvent(EVENT_TYPES.BLUR, this); + this.destroyEvent = new CustomEvent(EVENT_TYPES.DESTROY, 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 {HTMLElement} 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 {HTMLElement} + */ + _getFirstElement: function(p_oElement, p_sTagName) { + + var oFirstChild = p_oElement.firstChild, + oElement; + + if(oFirstChild) { + + if(oFirstChild.nodeType == 1) { + + oElement = oFirstChild; + + } + else { + + var oNextSibling = oFirstChild.nextSibling; + + if(oNextSibling && oNextSibling.nodeType == 1) { + + oElement = oNextSibling; + + } + + } + + } + + + if(p_sTagName) { + + return (oElement && oElement.tagName.toUpperCase() == p_sTagName) ? + oElement : false; + + } + + return oElement; + + }, + + + /** + * @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 () { + + var oTemplate = YAHOO.widget.MenuItem._MenuItemTemplate; + + if(!oTemplate) { + + oTemplate = document.createElement("li"); + oTemplate.innerHTML = "s"; + + YAHOO.widget.MenuItem._MenuItemTemplate = oTemplate; + + } + + this.element = oTemplate.cloneNode(true); + this._oAnchor = this.element.firstChild; + this._oText = this._oAnchor.firstChild; + + 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, + 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, + 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 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], + oAnchor = this._oAnchor, + oText = this._oText, + oConfig = this.cfg, + 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"); + + if(oEM) { + + 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], + oAnchor = this._oAnchor, + oText = this._oText, + oConfig = this.cfg, + 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"); + + if(oStrong) { + + 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], + oEl = this.element, + oConfig = this.cfg, + oEM; + + + if(bChecked) { + + var oTemplate = YAHOO.widget.MenuItem._CheckedIndicatorTemplate; + + if(!oTemplate) { + + oTemplate = document.createElement("em"); + oTemplate.innerHTML = this.CHECKED_TEXT; + oTemplate.className = "checkedindicator"; + + YAHOO.widget.MenuItem._CheckedIndicatorTemplate = oTemplate; + + } + + oEM = oTemplate.cloneNode(true); + + var oSubmenu = this.cfg.getProperty("submenu"); + + if(oSubmenu && oSubmenu.element) { + + oEl.insertBefore(oEM, oSubmenu.element); + + } + else { + + oEl.appendChild(oEM); + + } + + + Dom.addClass(oEl, "checked"); + + this._oCheckedIndicator = oEM; + + if(oConfig.getProperty("disabled")) { + + oConfig.refireEvent("disabled"); + + } + + if(oConfig.getProperty("selected")) { + + oConfig.refireEvent("selected"); + + } + + } + else { + + oEM = this._oCheckedIndicator; + + Dom.removeClass(oEl, "checked"); + + if(oEM) { + + oEl.removeChild(oEM); + + } + + this._oCheckedIndicator = 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], + oConfig = this.cfg, + oAnchor = this._oAnchor, + aNodes = [this.element, oAnchor], + oHelpText = this._oHelpTextEM, + oCheckedIndicator = this._oCheckedIndicator, + oSubmenuIndicator = this.submenuIndicator, + i = 1; + + + if(oHelpText) { + + i++; + aNodes[i] = oHelpText; + + } + + + if(oCheckedIndicator) { + + oCheckedIndicator.firstChild.nodeValue = bDisabled ? + this.DISABLED_CHECKED_TEXT : + this.CHECKED_TEXT; + + i++; + aNodes[i] = oCheckedIndicator; + + } + + + if(oSubmenuIndicator) { + + oSubmenuIndicator.firstChild.nodeValue = bDisabled ? + this.DISABLED_SUBMENU_INDICATOR_TEXT : + this.COLLAPSED_SUBMENU_INDICATOR_TEXT; + + i++; + aNodes[i] = oSubmenuIndicator; + + } + + + if(bDisabled) { + + if(oConfig.getProperty("selected")) { + + oConfig.setProperty("selected", false); + + } + + oAnchor.removeAttribute("href"); + + Dom.addClass(aNodes, "disabled"); + + } + else { + + oAnchor.setAttribute("href", oConfig.getProperty("url")); + + Dom.removeClass(aNodes, "disabled"); + + } + + }, + + + /** + * @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], + oHelpText = this._oHelpTextEM, + oSubmenuIndicator = this.submenuIndicator, + oCheckedIndicator = this._oCheckedIndicator, + aNodes = [this.element, this._oAnchor], + i = 1; + + + if(oHelpText) { + + i++; + aNodes[i] = oHelpText; + + } + + + if(oSubmenuIndicator) { + + i++; + aNodes[i] = oSubmenuIndicator; + + } + + + if(oCheckedIndicator) { + + i++; + aNodes[i] = oCheckedIndicator; + + } + + + if(bSelected) { + + Dom.addClass(aNodes, "selected"); + + } + else { + + Dom.removeClass(aNodes, "selected"); + + } + + } + + }, + + + /** + * @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, + oSubmenu = p_aArgs[0], + oSubmenuIndicator = this.submenuIndicator, + oConfig = this.cfg, + aNodes = [this.element, this._oAnchor], + bLazyLoad = this.parent && this.parent.lazyLoad, + oMenu; + + + 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, + oSubmenuConfig = oSubmenu; + + 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(!oSubmenuIndicator) { + + var oTemplate = + YAHOO.widget.MenuItem._oSubmenuIndicatorTemplate; + + if(!oTemplate) { + + oTemplate = document.createElement("em"); + oTemplate.innerHTML = + this.COLLAPSED_SUBMENU_INDICATOR_TEXT; + oTemplate.className = "submenuindicator"; + + YAHOO.widget.MenuItem._oSubmenuIndicatorTemplate = + oTemplate; + + } + + + oSubmenuIndicator = oTemplate.cloneNode(true); + + + if(oMenu.element.parentNode == oEl) { + + if(this.browser == "opera") { + + oEl.appendChild(oSubmenuIndicator); + + oMenu.renderEvent.subscribe(function() { + + oSubmenuIndicator.parentNode.insertBefore( + oSubmenuIndicator, + oMenu.element + ); + + }); + + } + else { + + oEl.insertBefore(oSubmenuIndicator, oMenu.element); + + } + + } + else { + + oEl.appendChild(oSubmenuIndicator); + + } + + this.submenuIndicator = oSubmenuIndicator; + + } + + + Dom.addClass(aNodes, "hassubmenu"); + + + if(oConfig.getProperty("disabled")) { + + oConfig.refireEvent("disabled"); + + } + + if(oConfig.getProperty("selected")) { + + oConfig.refireEvent("selected"); + + } + + } + + } + else { + + Dom.removeClass(aNodes, "hassubmenu"); + + if(oSubmenuIndicator) { + + oEl.removeChild(oSubmenuIndicator); + + } + + if(this._oSubmenu) { + + this._oSubmenu.destroy(); + + } + + } + + }, + + + /** + * @method configOnClick + * @description Event handler for when the "onclick" 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. + */ + configOnClick: function(p_sType, p_aArgs, p_oItem) { + + var oObject = p_aArgs[0]; + + /* + Remove any existing listeners if a "click" event handler has + already been specified. + */ + + if( + this._oOnclickAttributeValue && + (this._oOnclickAttributeValue != oObject) + ) { + + this.clickEvent.unsubscribe( + this._oOnclickAttributeValue.fn, + this._oOnclickAttributeValue.obj + ); + + this._oOnclickAttributeValue = null; + + } + + + if( + !this._oOnclickAttributeValue && + typeof oObject == "object" && + typeof oObject.fn == "function" + ) { + + this.clickEvent.subscribe( + oObject.fn, + (oObject.obj || this), + oObject.scope + ); + + this._oOnclickAttributeValue = oObject; + + } + + }, + + + /** + * @method configClassName + * @description Event handler for when the "classname" configuration + * property of a 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. + */ + configClassName: function(p_sType, p_aArgs, p_oItem) { + + var sClassName = p_aArgs[0]; + + if(this._sClassName) { + + Dom.removeClass(this.element, this._sClassName); + + } + + Dom.addClass(this.element, sClassName); + this._sClassName = sClassName; + + }, + + + + // Public methods + + + /** + * @method initDefaultConfig + * @description Initializes an item's configurable properties. + */ + initDefaultConfig : function() { + + var oConfig = this.cfg, + DEFAULT_CONFIG = YAHOO.widget.MenuItem._DEFAULT_CONFIG; + + + // Define the configuration attributes + + /** + * @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( + DEFAULT_CONFIG.TEXT.key, + { + handler: this.configText, + value: DEFAULT_CONFIG.TEXT.value, + validator: DEFAULT_CONFIG.TEXT.validator, + suppressEvent: DEFAULT_CONFIG.TEXT.suppressEvent + } + ); + + + /** + * @config helptext + * @description String specifying additional instructional text to + * accompany the text for the nenu item. + * @default null + * @type String| + * HTMLElement + */ + oConfig.addProperty( + DEFAULT_CONFIG.HELP_TEXT.key, + { 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( + DEFAULT_CONFIG.URL.key, + { + handler: this.configURL, + value: DEFAULT_CONFIG.URL.value, + suppressEvent: DEFAULT_CONFIG.URL.suppressEvent + } + ); + + + /** + * @config target + * @description String specifying the value for the "target" attribute + * of the menu item's anchor element. 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. + * 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( + DEFAULT_CONFIG.TARGET.key, + { + handler: this.configTarget, + suppressEvent: DEFAULT_CONFIG.TARGET.suppressEvent + } + ); + + + /** + * @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( + DEFAULT_CONFIG.EMPHASIS.key, + { + handler: this.configEmphasis, + value: DEFAULT_CONFIG.EMPHASIS.value, + validator: DEFAULT_CONFIG.EMPHASIS.validator, + suppressEvent: DEFAULT_CONFIG.EMPHASIS.suppressEvent + } + ); + + + /** + * @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( + DEFAULT_CONFIG.STRONG_EMPHASIS.key, + { + handler: this.configStrongEmphasis, + value: DEFAULT_CONFIG.STRONG_EMPHASIS.value, + validator: DEFAULT_CONFIG.STRONG_EMPHASIS.validator, + suppressEvent: DEFAULT_CONFIG.STRONG_EMPHASIS.suppressEvent + } + ); + + + /** + * @config checked + * @description Boolean indicating if the menu item should be rendered + * with a checkmark. + * @default false + * @type Boolean + */ + oConfig.addProperty( + DEFAULT_CONFIG.CHECKED.key, + { + handler: this.configChecked, + value: DEFAULT_CONFIG.CHECKED.value, + validator: DEFAULT_CONFIG.CHECKED.validator, + suppressEvent: DEFAULT_CONFIG.CHECKED.suppressEvent, + supercedes: DEFAULT_CONFIG.CHECKED.supercedes + } + ); + + + /** + * @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( + DEFAULT_CONFIG.DISABLED.key, + { + handler: this.configDisabled, + value: DEFAULT_CONFIG.DISABLED.value, + validator: DEFAULT_CONFIG.DISABLED.validator, + suppressEvent: DEFAULT_CONFIG.DISABLED.suppressEvent + } + ); + + + /** + * @config selected + * @description Boolean indicating if the menu item should + * be highlighted. + * @default false + * @type Boolean + */ + oConfig.addProperty( + DEFAULT_CONFIG.SELECTED.key, + { + handler: this.configSelected, + value: DEFAULT_CONFIG.SELECTED.value, + validator: DEFAULT_CONFIG.SELECTED.validator, + suppressEvent: DEFAULT_CONFIG.SELECTED.suppressEvent + } + ); + + + /** + * @config submenu + * @description Object specifying the submenu to be appended to the + * menu item. The value can be one of the following:
          • Object + * specifying a Menu instance.
          • Object literal specifying the + * menu to be created. Format: { id: [menu id], itemdata: + * [array of values for + * items] }.
          • String specifying the id attribute + * of the <div> element of the menu.
          • + * Object specifying the <div> element of the + * menu.
          + * @default null + * @type Menu|String|Object| + * HTMLElement + */ + oConfig.addProperty( + DEFAULT_CONFIG.SUBMENU.key, + { handler: this.configSubmenu } + ); + + + /** + * @config onclick + * @description Object literal representing the code to be executed when + * the button is clicked. Format:
          {
          + * fn: Function, // The handler to call when + * the event fires.
          obj: Object, // An + * object to pass back to the handler.
          scope: + * Object // The object to use for the scope of the handler. + *
          }
          + * @type Object + * @default null + */ + oConfig.addProperty( + DEFAULT_CONFIG.ONCLICK.key, + { handler: this.configOnClick } + ); + + + /** + * @config classname + * @description CSS class to be applied to the menu item's root + * <li> element. The specified class(es) are + * appended in addition to the default class as specified by the menu + * item's CSS_CLASS_NAME constant. + * @default null + * @type String + */ + oConfig.addProperty( + DEFAULT_CONFIG.CLASS_NAME.key, + { + handler: this.configClassName, + value: DEFAULT_CONFIG.CLASS_NAME.value, + validator: DEFAULT_CONFIG.CLASS_NAME.validator + } + ); + + }, + + + /** + * @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; + + function getNextArrayItem(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] || + getNextArrayItem(p_aArray, (p_nStartIndex+1)); + + } + + + var aItemGroups = this.parent.getItemGroups(), + 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; + + function getPreviousArrayItem(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] || + getPreviousArrayItem(p_aArray, (p_nStartIndex-1)); + + } + + function getFirstItemIndex(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] ? + p_nStartIndex : + getFirstItemIndex(p_aArray, (p_nStartIndex+1)); + + } + + var aItemGroups = this.parent.getItemGroups(), + 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, + oAnchor = this._oAnchor, + oActiveItem = oParent.activeItem, + me = this; + + + function setFocus() { + + try { + + if ( + (me.browser == "ie" || me.browser == "ie7") && + !document.hasFocus() + ) { + + return; + + } + + oAnchor.focus(); + + } + catch(e) { + + } + + } + + + if( + !this.cfg.getProperty("disabled") && + oParent && + oParent.cfg.getProperty("visible") && + this.element.style.display != "none" + ) { + + if(oActiveItem) { + + oActiveItem.blur(); + + } + + + /* + Setting focus via a timer fixes a race condition in Firefox, IE + and Opera where the browser viewport jumps as it trys to + position and focus the menu. + */ + + window.setTimeout(setFocus, 0); + + this.focusEvent.fire(); + + } + + }, + + + /** + * @method blur + * @description Causes the menu item to lose focus and fires the + * blur 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 hasFocus + * @description Returns a boolean indicating whether or not the menu item + * has focus. + * @return {Boolean} + */ + hasFocus: function() { + + return (YAHOO.widget.MenuManager.getFocusedMenuItem() == this); + + }, + + + /** + * @method destroy + * @description Removes the menu item's <li> element + * from its parent <ul> element. + */ + destroy: function() { + + var oEl = this.element; + + if(oEl) { + + + // If the item has a submenu, destroy it first + + var oSubmenu = this.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.destroy(); + + } + + + // 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() { + + var sReturnVal = "MenuItem"; + + if(this.cfg && this.cfg.getProperty("text")) { + + sReturnVal += (": " + this.cfg.getProperty("text")); + + } + + return sReturnVal; + + } + +}; + +})(); + + + +/** +* 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 +* <div> element of the context menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* context menu. +* @param {HTMLDivElement} p_oElement Object specifying the +* <div> element of the context menu. +* @param {HTMLSelectElement} p_oElement Object specifying +* the <select> 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 + ); + +}; + + +/** +* Constant representing the name of the ContextMenu's events +* @property YAHOO.widget.ContextMenu._EVENT_TYPES +* @private +* @final +* @type Object +*/ +YAHOO.widget.ContextMenu._EVENT_TYPES = { + + "TRIGGER_CONTEXT_MENU": "triggerContextMenu", + + "CONTEXT_MENU": ( + (YAHOO.widget.Module.prototype.browser == "opera" ? + "mousedown" : "contextmenu") + ), + "CLICK": "click" + +}; + + +/** +* Constant representing the ContextMenu's configuration properties +* @property YAHOO.widget.ContextMenu._DEFAULT_CONFIG +* @private +* @final +* @type Object +*/ +YAHOO.widget.ContextMenu._DEFAULT_CONFIG = { + + "TRIGGER": { + key: "trigger" + } + +}; + + +YAHOO.lang.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|HTMLElement|Array +*/ +_oTrigger: null, + + +/** +* @property _bCancelled +* @description Boolean indicating if the display of the context menu should +* be cancelled. +* @default false +* @private +* @type Boolean +*/ +_bCancelled: false, + + + +// 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 HTMLElement +*/ +contextEventTarget: null, + + + +// Events + + +/** +* @event triggerContextMenuEvent +* @description Custom Event wrapper for the "contextmenu" DOM event +* ("mousedown" for Opera) fired by the element(s) that trigger the display of +* the context menu. +*/ +triggerContextMenuEvent: 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 +* <div> element of the context menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for +* the context menu. +* @param {HTMLDivElement} p_oElement Object specifying the +* <div> element of the context menu. +* @param {HTMLSelectElement} p_oElement Object specifying +* the <select> 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); + +}, + + +/** +* @method initEvents +* @description Initializes the custom events for the context menu. +*/ +initEvents: function() { + + YAHOO.widget.ContextMenu.superclass.initEvents.call(this); + + // Create custom events + + this.triggerContextMenuEvent = + + new YAHOO.util.CustomEvent( + YAHOO.widget.ContextMenu._EVENT_TYPES.TRIGGER_CONTEXT_MENU, + this + ); + +}, + + +/** +* @method cancel +* @description Cancels the display of the context menu. +*/ +cancel: function() { + + this._bCancelled = true; + +}, + + + +// 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, + oTrigger = this._oTrigger; + + + // Remove the event handlers from the trigger(s) + + if (oTrigger) { + + Event.removeListener( + oTrigger, + YAHOO.widget.ContextMenu._EVENT_TYPES.CONTEXT_MENU, + this._onTriggerContextMenu + ); + + if(this.browser == "opera") { + + Event.removeListener( + oTrigger, + YAHOO.widget.ContextMenu._EVENT_TYPES.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) { + + var Event = YAHOO.util.Event; + + if(p_oEvent.type == "mousedown" && !p_oEvent.ctrlKey) { + + return; + + } + + + /* + 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); + + + // Hide any other ContextMenu instances that might be visible + + YAHOO.widget.MenuManager.hideVisible(); + + + this.contextEventTarget = Event.getTarget(p_oEvent); + + this.triggerContextMenuEvent.fire(p_oEvent); + + + if(!this._bCancelled) { + + // Position and display the context menu + + this.cfg.setProperty("xy", Event.getXY(p_oEvent)); + + this.show(); + + } + + this._bCancelled = false; + +}, + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the context menu. +* @return {String} +*/ +toString: function() { + + var sReturnVal = "ContextMenu", + sId = this.id; + + if(sId) { + + sReturnVal += (" " + sId); + + } + + return sReturnVal; + +}, + + +/** +* @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|HTMLElement|Array + */ + this.cfg.addProperty( + YAHOO.widget.ContextMenu._DEFAULT_CONFIG.TRIGGER.key, + { handler: this.configTrigger } + ); + +}, + + +/** +* @method destroy +* @description Removes the context menu's <div> 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, + 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 + */ + + Event.on( + oTrigger, + YAHOO.widget.ContextMenu._EVENT_TYPES.CONTEXT_MENU, + this._onTriggerContextMenu, + this, + true + ); + + + /* + Assign a "click" event handler to the trigger element(s) for + Opera to prevent default browser behaviors. + */ + + if(this.browser == "opera") { + + Event.on( + oTrigger, + YAHOO.widget.ContextMenu._EVENT_TYPES.CLICK, + this._onTriggerClick, + this, + true + ); + + } + + } + else { + + this._removeEventHandlers(); + + } + +} + +}); // END YAHOO.lang.extend + + + +/** +* Creates an item for a context menu. +* +* @param {String} p_oObject String specifying the text of the context menu item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the context menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the context +* menu item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> 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.lang.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 {HTMLLIElement} p_oObject Object specifying the +* <li> element of the context menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the context +* menu item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> 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() { + + var sReturnVal = "ContextMenuItem"; + + if(this.cfg && this.cfg.getProperty("text")) { + + sReturnVal += (": " + this.cfg.getProperty("text")); + + } + + return sReturnVal; + +} + +}); // END YAHOO.lang.extend + + + +/** +* Horizontal collection of items, each of which can contain a submenu. +* +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu bar. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* menu bar. +* @param {HTMLDivElement} p_oElement Object specifying +* the <div> element of the menu bar. +* @param {HTMLSelectElement} p_oElement Object +* specifying the <select> 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 + ); + +}; + + +/** +* Constant representing the MenuBar's configuration properties +* @property YAHOO.widget.MenuBar._DEFAULT_CONFIG +* @private +* @final +* @type Object +*/ +YAHOO.widget.MenuBar._DEFAULT_CONFIG = { + + "POSITION": { + key: "position", + value: "static", + validator: YAHOO.widget.Menu._checkPosition, + supercedes: ["visible"] + }, + + "SUBMENU_ALIGNMENT": { + key: "submenualignment", + value: ["tl","bl"] + }, + + "AUTO_SUBMENU_DISPLAY": { + key: "autosubmenudisplay", + value: false, + validator: YAHOO.lang.isBoolean + } + +}; + + + +YAHOO.lang.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 +* <div> element of the menu bar. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* menu bar. +* @param {HTMLDivElement} p_oElement Object specifying +* the <div> element of the menu bar. +* @param {HTMLSelectElement} p_oElement Object +* specifying the <select> 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 <div> 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, + oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oSubmenu; + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg; + + switch(oEvent.keyCode) { + + 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(); + + } + + } + + 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; + + } + + } + + + if(oEvent.keyCode == 27 && this.activeItem) { // Esc key + + 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); + + } + +}, + + +/** +* @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 && !oItem.cfg.getProperty("disabled")) { + + var Event = YAHOO.util.Event, + Dom = YAHOO.util.Dom, + + oEvent = p_aArgs[0], + oTarget = Event.getTarget(oEvent), + + oActiveItem = this.activeItem, + oConfig = this.cfg; + + + // Hide any other submenus that might be visible + + if(oActiveItem && oActiveItem != oItem) { + + this.clearActiveItem(); + + } + + + oItem.cfg.setProperty("selected", true); + + + // 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() { + + var sReturnVal = "MenuBar", + sId = this.id; + + if(sId) { + + sReturnVal += (" " + sId); + + } + + return sReturnVal; + +}, + + +/** +* @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, + DEFAULT_CONFIG = YAHOO.widget.MenuBar._DEFAULT_CONFIG; + + // Add configuration properties + + + /* + Set the default value for the "position" configuration property + to "static" by re-adding the property. + */ + + + /** + * @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( + DEFAULT_CONFIG.POSITION.key, + { + handler: this.configPosition, + value: DEFAULT_CONFIG.POSITION.value, + validator: DEFAULT_CONFIG.POSITION.validator, + supercedes: DEFAULT_CONFIG.POSITION.supercedes + } + ); + + + /* + Set the default value for the "submenualignment" configuration property + to ["tl","bl"] by re-adding the property. + */ + + /** + * @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( + DEFAULT_CONFIG.SUBMENU_ALIGNMENT.key, + { + value: DEFAULT_CONFIG.SUBMENU_ALIGNMENT.value + } + ); + + + /* + Change the default value for the "autosubmenudisplay" configuration + property to "false" by re-adding the property. + */ + + /** + * @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( + DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.key, + { + value: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.value, + validator: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.validator + } + ); + +} + +}); // END YAHOO.lang.extend + + + +/** +* Creates an item for a menu bar. +* +* @param {String} p_oObject String specifying the text of the menu bar item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the menu bar item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu bar item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> 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.lang.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 {HTMLLIElement} p_oObject Object specifying the +* <li> element of the menu bar item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu bar item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> 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 +* <li> element of the menu bar item. +* @default "yuimenubaritem" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuimenubaritem", + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the menu bar item. +* @return {String} +*/ +toString: function() { + + var sReturnVal = "MenuBarItem"; + + if(this.cfg && this.cfg.getProperty("text")) { + + sReturnVal += (": " + this.cfg.getProperty("text")); + + } + + return sReturnVal; + +} + +}); // END YAHOO.lang.extend +YAHOO.register("menu", YAHOO.widget.Menu, {version: "2.2.2", build: "204"}); diff --git a/www/extras/yui/build/menu/menu-min.js b/www/extras/yui/build/menu/menu-min.js new file mode 100644 index 000000000..b189aba34 --- /dev/null +++ b/www/extras/yui/build/menu/menu-min.js @@ -0,0 +1,280 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ + +(function(){var Dom=YAHOO.util.Dom,Event=YAHOO.util.Event;YAHOO.widget.MenuManager=function(){var m_bInitializedEventHandlers=false,m_oMenus={},m_oItems={},m_oVisibleMenus={},m_oEventTypes={"click":"clickEvent","mousedown":"mouseDownEvent","mouseup":"mouseUpEvent","mouseover":"mouseOverEvent","mouseout":"mouseOutEvent","keydown":"keyDownEvent","keyup":"keyUpEvent","keypress":"keyPressEvent"},m_oFocusedMenuItem=null;function addItem(p_oItem){var sId=p_oItem.id;if(p_oItem&&m_oItems[sId]!=p_oItem){m_oItems[sId]=p_oItem;p_oItem.destroyEvent.subscribe(onItemDestroy);}} +function removeItem(p_oItem){var sId=p_oItem.id;if(sId&&m_oItems[sId]){delete m_oItems[sId];}} +function getMenuRootElement(p_oElement){var oParentNode;if(p_oElement&&p_oElement.tagName){switch(p_oElement.tagName.toUpperCase()){case"DIV":oParentNode=p_oElement.parentNode;if((Dom.hasClass(p_oElement,"hd")||Dom.hasClass(p_oElement,"bd")||Dom.hasClass(p_oElement,"ft"))&&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;}}} +function onDOMEvent(p_oEvent){var oTarget=Event.getTarget(p_oEvent),oElement=getMenuRootElement(oTarget),oMenuItem,oMenu;if(oElement){var sTagName=oElement.tagName.toUpperCase();if(sTagName=="LI"){var sId=oElement.id;if(sId&&m_oItems[sId]){oMenuItem=m_oItems[sId];oMenu=oMenuItem.parent;}} +else if(sTagName=="DIV"){if(oElement.id){oMenu=m_oMenus[oElement.id];}}} +if(oMenu){var sCustomEventType=m_oEventTypes[p_oEvent.type];if(oMenuItem&&!oMenuItem.cfg.getProperty("disabled")){oMenuItem[sCustomEventType].fire(p_oEvent);if(p_oEvent.type=="keyup"||p_oEvent.type=="mousedown"){if(m_oFocusedMenuItem!=oMenuItem){if(m_oFocusedMenuItem){m_oFocusedMenuItem.blurEvent.fire();} +oMenuItem.focusEvent.fire();}}} +oMenu[sCustomEventType].fire(p_oEvent,oMenuItem);} +else if(p_oEvent.type=="mousedown"){if(m_oFocusedMenuItem){m_oFocusedMenuItem.blurEvent.fire();m_oFocusedMenuItem=null;} +for(var i in m_oMenus){if(YAHOO.lang.hasOwnProperty(m_oMenus,i)){oMenu=m_oMenus[i];if(oMenu.cfg.getProperty("clicktohide")&&oMenu.cfg.getProperty("position")=="dynamic"){oMenu.hide();} +else{oMenu.clearActiveItem(true);}}}} +else if(p_oEvent.type=="keyup"){if(m_oFocusedMenuItem){m_oFocusedMenuItem.blurEvent.fire();m_oFocusedMenuItem=null;}}} +function onMenuDestroy(p_sType,p_aArgs){if(m_oMenus[this.id]){delete m_oMenus[this.id];}} +function onMenuFocus(p_sType,p_aArgs){var oItem=p_aArgs[0];if(oItem){m_oFocusedMenuItem=oItem;}} +function onMenuBlur(p_sType,p_aArgs){m_oFocusedMenuItem=null;} +function onItemDestroy(p_sType,p_aArgs){var sId=this.id;if(sId&&m_oItems[sId]){delete m_oItems[sId];}} +function onMenuVisibleConfigChange(p_sType,p_aArgs){var bVisible=p_aArgs[0];if(bVisible){m_oVisibleMenus[this.id]=this;} +else if(m_oVisibleMenus[this.id]){delete m_oVisibleMenus[this.id];}} +function onItemAdded(p_sType,p_aArgs){addItem(p_aArgs[0]);} +function onItemRemoved(p_sType,p_aArgs){removeItem(p_aArgs[0]);} +return{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.on(oDoc,"mouseover",onDOMEvent,this,true);Event.on(oDoc,"mouseout",onDOMEvent,this,true);Event.on(oDoc,"mousedown",onDOMEvent,this,true);Event.on(oDoc,"mouseup",onDOMEvent,this,true);Event.on(oDoc,"click",onDOMEvent,this,true);Event.on(oDoc,"keydown",onDOMEvent,this,true);Event.on(oDoc,"keyup",onDOMEvent,this,true);Event.on(oDoc,"keypress",onDOMEvent,this,true);m_bInitializedEventHandlers=true;} +p_oMenu.destroyEvent.subscribe(onMenuDestroy);p_oMenu.cfg.subscribeToConfigEvent("visible",onMenuVisibleConfigChange);p_oMenu.itemAddedEvent.subscribe(onItemAdded);p_oMenu.itemRemovedEvent.subscribe(onItemRemoved);p_oMenu.focusEvent.subscribe(onMenuFocus);p_oMenu.blurEvent.subscribe(onMenuBlur);}},removeMenu:function(p_oMenu){if(p_oMenu&&m_oMenus[p_oMenu.id]){delete m_oMenus[p_oMenu.id];}},hideVisible:function(){var oMenu;for(var i in m_oVisibleMenus){if(YAHOO.lang.hasOwnProperty(m_oVisibleMenus,i)){oMenu=m_oVisibleMenus[i];if(oMenu.cfg.getProperty("position")=="dynamic"){oMenu.hide();}}}},getMenus:function(){return m_oMenus;},getMenu:function(p_sId){if(m_oMenus[p_sId]){return m_oMenus[p_sId];}},getFocusedMenuItem:function(){return m_oFocusedMenuItem;},getFocusedMenu:function(){if(m_oFocusedMenuItem){return(m_oFocusedMenuItem.parent.getRoot());}},toString:function(){return("MenuManager");}};}();})();(function(){var Dom=YAHOO.util.Dom,Event=YAHOO.util.Event,CustomEvent=YAHOO.util.CustomEvent,Lang=YAHOO.lang;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.widget.Menu._EVENT_TYPES={"MOUSE_OVER":"mouseover","MOUSE_OUT":"mouseout","MOUSE_DOWN":"mousedown","MOUSE_UP":"mouseup","CLICK":"click","KEY_PRESS":"keypress","KEY_DOWN":"keydown","KEY_UP":"keyup","FOCUS":"focus","BLUR":"blur","ITEM_ADDED":"itemAdded","ITEM_REMOVED":"itemRemoved"};YAHOO.widget.Menu._checkPosition=function(p_sPosition){if(typeof p_sPosition=="string"){var sPosition=p_sPosition.toLowerCase();return("dynamic,static".indexOf(sPosition)!=-1);}};YAHOO.widget.Menu._DEFAULT_CONFIG={"VISIBLE":{key:"visible",value:false,validator:Lang.isBoolean},"CONSTRAIN_TO_VIEWPORT":{key:"constraintoviewport",value:true,validator:Lang.isBoolean,supercedes:["iframe","x","y","xy"]},"POSITION":{key:"position",value:"dynamic",validator:YAHOO.widget.Menu._checkPosition,supercedes:["visible"]},"SUBMENU_ALIGNMENT":{key:"submenualignment",value:["tl","tr"]},"AUTO_SUBMENU_DISPLAY":{key:"autosubmenudisplay",value:true,validator:Lang.isBoolean},"SHOW_DELAY":{key:"showdelay",value:250,validator:Lang.isNumber},"HIDE_DELAY":{key:"hidedelay",value:0,validator:Lang.isNumber,suppressEvent:true},"SUBMENU_HIDE_DELAY":{key:"submenuhidedelay",value:250,validator:Lang.isNumber},"CLICK_TO_HIDE":{key:"clicktohide",value:true,validator:Lang.isBoolean},"CONTAINER":{key:"container"},"MAX_HEIGHT":{key:"maxheight",value:0,validator:Lang.isNumber},"CLASS_NAME":{key:"classname",value:null,validator:Lang.isString}};YAHOO.lang.extend(YAHOO.widget.Menu,YAHOO.widget.Overlay,{CSS_CLASS_NAME:"yuimenu",ITEM_TYPE:null,GROUP_TITLE_TAG_NAME:"h6",_nHideDelayId:null,_nShowDelayId:null,_nSubmenuHideDelayId:null,_nBodyScrollId:null,_bHideDelayEventHandlersAssigned:false,_bHandledMouseOverEvent:false,_bHandledMouseOutEvent:false,_aGroupTitleElements:null,_aItemGroups:null,_aListElements:null,_nCurrentMouseX:0,_nMaxHeight:-1,_bStopMouseEventHandlers:false,_sClassName:null,lazyLoad:false,itemData:null,activeItem:null,parent:null,srcElement:null,mouseOverEvent:null,mouseOutEvent:null,mouseDownEvent:null,mouseUpEvent:null,clickEvent:null,keyPressEvent:null,keyDownEvent:null,keyUpEvent:null,itemAddedEvent:null,itemRemovedEvent:null,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());} +YAHOO.widget.Menu.superclass.init.call(this,oElement);this.beforeInitEvent.fire(YAHOO.widget.Menu);break;case"SELECT":this.srcElement=oElement;YAHOO.widget.Menu.superclass.init.call(this,Dom.generateId());this.beforeInitEvent.fire(YAHOO.widget.Menu);break;}} +else{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);this.initEvent.subscribe(this._onInit,this,true);this.beforeRenderEvent.subscribe(this._onBeforeRender,this,true);this.renderEvent.subscribe(this._onRender);this.beforeShowEvent.subscribe(this._onBeforeShow,this,true);this.showEvent.subscribe(this._onShow,this,true);this.beforeHideEvent.subscribe(this._onBeforeHide,this,true);this.hideEvent.subscribe(this._onHide,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);this.keyPressEvent.subscribe(this._onKeyPress,this,true);YAHOO.widget.Module.textResizeEvent.subscribe(this._onTextResize,this,true);if(p_oConfig){this.cfg.applyConfig(p_oConfig,true);} +YAHOO.widget.MenuManager.addMenu(this);this.initEvent.fire(YAHOO.widget.Menu);}},_initSubTree:function(){var oNode;if(this.srcElement.tagName.toUpperCase()=="DIV"){oNode=this.body.firstChild;var nGroup=0,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));if(this._aListElements[0]){Dom.addClass(this._aListElements[0],"first-of-type");}} +oNode=null;if(this.srcElement.tagName){var sSrcElementTagName=this.srcElement.tagName.toUpperCase();switch(sSrcElementTagName){case"DIV":if(this._aListElements.length>0){var i=this._aListElements.length-1;do{oNode=this._aListElements[i].firstChild;do{if(oNode&&oNode.tagName&&oNode.tagName.toUpperCase()=="LI"){this.addItem(new this.ITEM_TYPE(oNode,{parent:this}),i);}} +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;}}},_getFirstEnabledItem:function(){var aItems=this.getItems(),nItems=aItems.length,oItem;for(var i=0;i=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{function getNextItemSibling(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;}}}},_removeItemFromGroupByIndex:function(p_nGroupIndex,p_nItemIndex){var nGroupIndex=typeof p_nGroupIndex=="number"?p_nGroupIndex:0,aGroup=this._getItemGroup(nGroupIndex);if(aGroup){var aArray=aGroup.splice(p_nItemIndex,1),oItem=aArray[0];if(oItem){this._updateItemProperties(nGroupIndex);if(aGroup.length===0){var oUL=this._aListElements[nGroupIndex];if(this.body&&oUL){this.body.removeChild(oUL);} +this._aItemGroups.splice(nGroupIndex,1);this._aListElements.splice(nGroupIndex,1);oUL=this._aListElements[0];if(oUL){Dom.addClass(oUL,"first-of-type");}} +this.itemRemovedEvent.fire(oItem);return oItem;}}},_removeItemFromGroupByValue:function(p_nGroupIndex,p_oItem){var aGroup=this._getItemGroup(p_nGroupIndex);if(aGroup){var nItems=aGroup.length,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);}}}},_updateItemProperties:function(p_nGroupIndex){var aGroup=this._getItemGroup(p_nGroupIndex),nItems=aGroup.length;if(nItems>0){var i=nItems-1,oItem,oLI;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");}}},_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];}},_getItemGroup:function(p_nIndex){var nIndex=((typeof p_nIndex=="number")?p_nIndex:0);return this._aItemGroups[nIndex];},_configureSubmenu:function(p_oItem){var oSubmenu=p_oItem.cfg.getProperty("submenu");if(oSubmenu){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,null,p_oItem);oSubmenu.hideEvent.subscribe(this._onSubmenuHide,null,p_oItem);}},_subscribeToItemEvents:function(p_oItem){p_oItem.focusEvent.subscribe(this._onMenuItemFocus);p_oItem.blurEvent.subscribe(this._onMenuItemBlur);p_oItem.cfg.configChangedEvent.subscribe(this._onMenuItemConfigChange,p_oItem,this);},_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;},_setWidth:function(){var sWidth;if(this.element.parentNode.tagName.toUpperCase()=="BODY"){if(this.browser=="opera"){sWidth=this._getOffsetWidth();} +else{Dom.setStyle(this.element,"width","auto");sWidth=this.element.offsetWidth;}} +else{sWidth=this._getOffsetWidth();} +this.cfg.setProperty("width",(sWidth+"px"));},_onWidthChange:function(p_sType,p_aArgs){var sWidth=p_aArgs[0];if(sWidth&&!this._hasSetWidthHandlers){this.itemAddedEvent.subscribe(this._setWidth);this.itemRemovedEvent.subscribe(this._setWidth);this._hasSetWidthHandlers=true;} +else if(this._hasSetWidthHandlers){this.itemAddedEvent.unsubscribe(this._setWidth);this.itemRemovedEvent.unsubscribe(this._setWidth);this._hasSetWidthHandlers=false;}},_onVisibleChange:function(p_sType,p_aArgs){var bVisible=p_aArgs[0];if(bVisible){Dom.addClass(this.element,"visible");} +else{Dom.removeClass(this.element,"visible");}},_cancelHideDelay:function(){var oRoot=this.getRoot();if(oRoot._nHideDelayId){window.clearTimeout(oRoot._nHideDelayId);}},_execHideDelay:function(){this._cancelHideDelay();var oRoot=this.getRoot(),me=this;function hideMenu(){if(oRoot.activeItem){oRoot.clearActiveItem();} +if(oRoot==me&&me.cfg.getProperty("position")=="dynamic"){me.hide();}} +oRoot._nHideDelayId=window.setTimeout(hideMenu,oRoot.cfg.getProperty("hidedelay"));},_cancelShowDelay:function(){var oRoot=this.getRoot();if(oRoot._nShowDelayId){window.clearTimeout(oRoot._nShowDelayId);}},_execShowDelay:function(p_oMenu){var oRoot=this.getRoot();function showMenu(){if(p_oMenu.parent.cfg.getProperty("selected")){p_oMenu.show();}} +oRoot._nShowDelayId=window.setTimeout(showMenu,oRoot.cfg.getProperty("showdelay"));},_execSubmenuHideDelay:function(p_oSubmenu,p_nMouseX,p_nHideDelay){var me=this;p_oSubmenu._nSubmenuHideDelayId=window.setTimeout(function(){if(me._nCurrentMouseX>(p_nMouseX+10)){p_oSubmenu._nSubmenuHideDelayId=window.setTimeout(function(){p_oSubmenu.hide();},p_nHideDelay);} +else{p_oSubmenu.hide();}},50);},_disableScrollHeader:function(){if(!this._bHeaderDisabled){Dom.addClass(this.header,"topscrollbar_disabled");this._bHeaderDisabled=true;}},_disableScrollFooter:function(){if(!this._bFooterDisabled){Dom.addClass(this.footer,"bottomscrollbar_disabled");this._bFooterDisabled=true;}},_enableScrollHeader:function(){if(this._bHeaderDisabled){Dom.removeClass(this.header,"topscrollbar_disabled");this._bHeaderDisabled=false;}},_enableScrollFooter:function(){if(this._bFooterDisabled){Dom.removeClass(this.footer,"bottomscrollbar_disabled");this._bFooterDisabled=false;}},_onMouseOver:function(p_sType,p_aArgs,p_oMenu){if(this._bStopMouseEventHandlers){return false;} +var oEvent=p_aArgs[0],oItem=p_aArgs[1],oTarget=Event.getTarget(oEvent);if(!this._bHandledMouseOverEvent&&(oTarget==this.element||Dom.isAncestor(this.element,oTarget))){this._nCurrentMouseX=0;Event.on(this.element,"mousemove",this._onMouseMove,this,true);this.clearActiveItem();if(this.parent&&this._nSubmenuHideDelayId){window.clearTimeout(this._nSubmenuHideDelayId);this.parent.cfg.setProperty("selected",true);var oParentMenu=this.parent.parent;oParentMenu._bHandledMouseOutEvent=true;oParentMenu._bHandledMouseOverEvent=false;} +this._bHandledMouseOverEvent=true;this._bHandledMouseOutEvent=false;} +if(oItem&&!oItem.handledMouseOverEvent&&!oItem.cfg.getProperty("disabled")&&(oTarget==oItem.element||Dom.isAncestor(oItem.element,oTarget))){var nShowDelay=this.cfg.getProperty("showdelay"),bShowDelay=(nShowDelay>0);if(bShowDelay){this._cancelShowDelay();} +var oActiveItem=this.activeItem;if(oActiveItem){oActiveItem.cfg.setProperty("selected",false);} +var oItemCfg=oItem.cfg;oItemCfg.setProperty("selected",true);if(this.hasFocus()){oItem.focus();} +if(this.cfg.getProperty("autosubmenudisplay")){var oSubmenu=oItemCfg.getProperty("submenu");if(oSubmenu){if(bShowDelay){this._execShowDelay(oSubmenu);} +else{oSubmenu.show();}}} +oItem.handledMouseOverEvent=true;oItem.handledMouseOutEvent=false;}},_onMouseOut:function(p_sType,p_aArgs,p_oMenu){if(this._bStopMouseEventHandlers){return false;} +var oEvent=p_aArgs[0],oItem=p_aArgs[1],oRelatedTarget=Event.getRelatedTarget(oEvent),bMovingToSubmenu=false;if(oItem&&!oItem.cfg.getProperty("disabled")){var oItemCfg=oItem.cfg,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(!bMovingToSubmenu){oItem.cfg.setProperty("selected",false);if(oSubmenu){var nSubmenuHideDelay=this.cfg.getProperty("submenuhidedelay"),nShowDelay=this.cfg.getProperty("showdelay");if(!(this instanceof YAHOO.widget.MenuBar)&&nSubmenuHideDelay>0&&nShowDelay>=nSubmenuHideDelay){this._execSubmenuHideDelay(oSubmenu,Event.getPageX(oEvent),nSubmenuHideDelay);} +else{oSubmenu.hide();}}} +oItem.handledMouseOutEvent=true;oItem.handledMouseOverEvent=false;}} +if(!this._bHandledMouseOutEvent&&((oRelatedTarget!=this.element&&!Dom.isAncestor(this.element,oRelatedTarget))||bMovingToSubmenu)){Event.removeListener(this.element,"mousemove",this._onMouseMove);this._nCurrentMouseX=Event.getPageX(oEvent);this._bHandledMouseOutEvent=true;this._bHandledMouseOverEvent=false;}},_onMouseMove:function(p_oEvent,p_oMenu){if(this._bStopMouseEventHandlers){return false;} +this._nCurrentMouseX=Event.getPageX(p_oEvent);},_onClick:function(p_sType,p_aArgs,p_oMenu){var oEvent=p_aArgs[0],oItem=p_aArgs[1],oTarget=Event.getTarget(oEvent);if(oItem&&!oItem.cfg.getProperty("disabled")){var oItemCfg=oItem.cfg,oSubmenu=oItemCfg.getProperty("submenu");if(oTarget==oItem.submenuIndicator&&oSubmenu){if(oSubmenu.cfg.getProperty("visible")){oSubmenu.hide();oSubmenu.parent.focus();} +else{this.clearActiveItem();oItem.cfg.setProperty("selected",true);oSubmenu.show();oSubmenu.setInitialFocus();}} +else{var sURL=oItemCfg.getProperty("url"),bCurrentPageURL=(sURL.substr((sURL.length-1),1)=="#"),sTarget=oItemCfg.getProperty("target"),bHasTarget=(sTarget&&sTarget.length>0);if(oTarget.tagName.toUpperCase()=="A"&&bCurrentPageURL&&!bHasTarget){Event.preventDefault(oEvent);oItem.focus();} +if(oTarget.tagName.toUpperCase()!="A"&&!bCurrentPageURL&&!bHasTarget){document.location=sURL;} +if(bCurrentPageURL&&!oSubmenu){var oRoot=this.getRoot();if(oRoot.cfg.getProperty("position")=="static"){oRoot.clearActiveItem();} +else if(oRoot.cfg.getProperty("clicktohide")){oRoot.hide();}}}}},_onKeyDown:function(p_sType,p_aArgs,p_oMenu){var oEvent=p_aArgs[0],oItem=p_aArgs[1],me=this,oSubmenu;function stopMouseEventHandlers(){me._bStopMouseEventHandlers=true;window.setTimeout(function(){me._bStopMouseEventHandlers=false;},10);} +if(oItem&&!oItem.cfg.getProperty("disabled")){var oItemCfg=oItem.cfg,oParentItem=this.parent,oRoot,oNextItem;switch(oEvent.keyCode){case 38:case 40:oNextItem=(oEvent.keyCode==38)?oItem.getPreviousEnabledSibling():oItem.getNextEnabledSibling();if(oNextItem){this.clearActiveItem();oNextItem.cfg.setProperty("selected",true);oNextItem.focus();if(this.cfg.getProperty("maxheight")>0){var oBody=this.body;oBody.scrollTop=(oNextItem.element.offsetTop+ +oNextItem.element.offsetHeight)-oBody.offsetHeight;var nScrollTop=oBody.scrollTop,nScrollTarget=oBody.scrollHeight-oBody.offsetHeight;if(nScrollTop===0){this._disableScrollHeader();this._enableScrollFooter();} +else if(nScrollTop==nScrollTarget){this._enableScrollHeader();this._disableScrollFooter();} +else{this._enableScrollHeader();this._enableScrollFooter();}}} +Event.preventDefault(oEvent);stopMouseEventHandlers();break;case 39:oSubmenu=oItemCfg.getProperty("submenu");if(oSubmenu){if(!oItemCfg.getProperty("selected")){oItemCfg.setProperty("selected",true);} +oSubmenu.show();oSubmenu.setInitialFocus();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);stopMouseEventHandlers();break;case 37: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);stopMouseEventHandlers();break;}} +if(oEvent.keyCode==27){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.blur();this.activeItem.cfg.setProperty("selected",false);}} +Event.preventDefault(oEvent);}},_onKeyPress:function(p_sType,p_aArgs,p_oMenu){var oEvent=p_aArgs[0];if(oEvent.keyCode==40||oEvent.keyCode==38){YAHOO.util.Event.preventDefault(oEvent);}},_onTextResize:function(p_sType,p_aArgs,p_oMenu){if(this.browser=="gecko"&&!this._handleResize){this._handleResize=true;return;} +var oConfig=this.cfg;if(oConfig.getProperty("position")=="dynamic"){oConfig.setProperty("width",(this._getOffsetWidth()+"px"));}},_onScrollTargetMouseOver:function(p_oEvent,p_oMenu){this._cancelHideDelay();var oTarget=Event.getTarget(p_oEvent),oBody=this.body,me=this,nScrollTarget,fnScrollFunction;function scrollBodyDown(){var nScrollTop=oBody.scrollTop;if(nScrollTop0){oBody.scrollTop=(nScrollTop-1);me._enableScrollFooter();} +else{oBody.scrollTop=0;window.clearInterval(me._nBodyScrollId);me._disableScrollHeader();}} +if(Dom.hasClass(oTarget,"hd")){fnScrollFunction=scrollBodyUp;} +else{nScrollTarget=oBody.scrollHeight-oBody.offsetHeight;fnScrollFunction=scrollBodyDown;} +this._nBodyScrollId=window.setInterval(fnScrollFunction,10);},_onScrollTargetMouseOut:function(p_oEvent,p_oMenu){window.clearInterval(this._nBodyScrollId);this._cancelHideDelay();},_onInit:function(p_sType,p_aArgs,p_oMenu){this.cfg.subscribeToConfigEvent("width",this._onWidthChange);this.cfg.subscribeToConfigEvent("visible",this._onVisibleChange);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();}},_onBeforeRender:function(p_sType,p_aArgs,p_oMenu){var oConfig=this.cfg,oEl=this.element,nListElements=this._aListElements.length;if(nListElements>0){var i=0,bFirstList=true,oUL,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=nViewportHeight){var nMaxHeight=this.cfg.getProperty("maxheight");this._nMaxHeight=nMaxHeight;this.cfg.setProperty("maxheight",(nViewportHeight-20));} +if(this.cfg.getProperty("maxheight")>0){var oBody=this.body;if(oBody.scrollTop>0){oBody.scrollTop=0;} +this._disableScrollHeader();this._enableScrollFooter();}}},_onShow:function(p_sType,p_aArgs,p_oMenu){var oParent=this.parent;if(oParent){var oParentMenu=oParent.parent,aParentAlignment=oParentMenu.cfg.getProperty("submenualignment"),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);function disableAutoSubmenuDisplay(p_oEvent){if(p_oEvent.type=="mousedown"||(p_oEvent.type=="keydown"&&p_oEvent.keyCode==27)){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.on(document,"mousedown",disableAutoSubmenuDisplay);Event.on(document,"keydown",disableAutoSubmenuDisplay);}}},_onBeforeHide:function(p_sType,p_aArgs,p_oMenu){var oActiveItem=this.activeItem;if(oActiveItem){var oConfig=oActiveItem.cfg;oConfig.setProperty("selected",false);var oSubmenu=oConfig.getProperty("submenu");if(oSubmenu){oSubmenu.hide();}} +if(this==this.getRoot()){this.blur();}},_onHide:function(p_sType,p_aArgs,p_oMenu){if(this._nMaxHeight!=-1){this.cfg.setProperty("maxheight",this._nMaxHeight);this._nMaxHeight=-1;}},_onParentMenuConfigChange:function(p_sType,p_aArgs,p_oSubmenu){var sPropertyName=p_aArgs[0][0],oPropertyValue=p_aArgs[0][1];switch(sPropertyName){case"iframe":case"constraintoviewport":case"hidedelay":case"showdelay":case"submenuhidedelay":case"clicktohide":case"effect":case"classname":p_oSubmenu.cfg.setProperty(sPropertyName,oPropertyValue);break;}},_onParentMenuRender:function(p_sType,p_aArgs,p_oSubmenu){var oParentMenu=p_oSubmenu.parent.parent,oConfig={constraintoviewport:oParentMenu.cfg.getProperty("constraintoviewport"),xy:[0,0],clicktohide:oParentMenu.cfg.getProperty("clicktohide"),effect:oParentMenu.cfg.getProperty("effect"),showdelay:oParentMenu.cfg.getProperty("showdelay"),hidedelay:oParentMenu.cfg.getProperty("hidedelay"),submenuhidedelay:oParentMenu.cfg.getProperty("submenuhidedelay"),classname:oParentMenu.cfg.getProperty("classname")};if(this.cfg.getProperty("position")==oParentMenu.cfg.getProperty("position")){oConfig.iframe=oParentMenu.cfg.getProperty("iframe");} +p_oSubmenu.cfg.applyConfig(oConfig);if(!this.lazyLoad){var oLI=this.parent.element;if(this.element.parentNode==oLI){this.render();} +else{this.render(oLI);}}},_onSubmenuBeforeShow:function(p_sType,p_aArgs,p_oSubmenu){var oParent=this.parent,aAlignment=oParent.parent.cfg.getProperty("submenualignment");this.cfg.setProperty("context",[oParent.element,aAlignment[0],aAlignment[1]]);var nScrollTop=oParent.parent.body.scrollTop;if((this.browser=="gecko"||this.browser=="safari")&&nScrollTop>0){this.cfg.setProperty("y",(this.cfg.getProperty("y")-nScrollTop));}},_onSubmenuShow:function(p_sType,p_aArgs){this.submenuIndicator.firstChild.nodeValue=this.EXPANDED_SUBMENU_INDICATOR_TEXT;},_onSubmenuHide:function(p_sType,p_aArgs){this.submenuIndicator.firstChild.nodeValue=this.COLLAPSED_SUBMENU_INDICATOR_TEXT;},_onMenuItemFocus:function(p_sType,p_aArgs){this.parent.focusEvent.fire(this);},_onMenuItemBlur:function(p_sType,p_aArgs){this.parent.blurEvent.fire(this);},_onMenuItemConfigChange:function(p_sType,p_aArgs,p_oItem){var sPropertyName=p_aArgs[0][0],oPropertyValue=p_aArgs[0][1];switch(sPropertyName){case"selected":if(oPropertyValue===true){this.activeItem=p_oItem;} +break;case"submenu":var oSubmenu=p_aArgs[0][1];if(oSubmenu){this._configureSubmenu(p_oItem);} +break;case"text":case"helptext":if(this.element.style.width){var sWidth=this._getOffsetWidth()+"px";Dom.setStyle(this.element,"width",sWidth);} +break;}},enforceConstraints:function(type,args,obj){if(this.parent&&!(this.parent.parent instanceof YAHOO.widget.MenuBar)){var oConfig=this.cfg,pos=args[0],x=pos[0],y=pos[1],offsetHeight=this.element.offsetHeight,offsetWidth=this.element.offsetWidth,viewPortWidth=YAHOO.util.Dom.getViewportWidth(),viewPortHeight=YAHOO.util.Dom.getViewportHeight(),scrollX=Math.max(document.documentElement.scrollLeft,document.body.scrollLeft),scrollY=Math.max(document.documentElement.scrollTop,document.body.scrollTop),nPadding=(this.parent&&this.parent.parent instanceof YAHOO.widget.MenuBar)?0:10,topConstraint=scrollY+nPadding,leftConstraint=scrollX+nPadding,bottomConstraint=scrollY+viewPortHeight-offsetHeight-nPadding,rightConstraint=scrollX+viewPortWidth-offsetWidth-nPadding,aContext=oConfig.getProperty("context"),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);oConfig.setProperty("xy",[x,y],true);}},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],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();}}}},configPosition:function(p_sType,p_aArgs,p_oMenu){var sCSSPosition=p_aArgs[0]=="static"?"static":"absolute",oCfg=this.cfg;Dom.setStyle(this.element,"position",sCSSPosition);if(sCSSPosition=="static"){oCfg.setProperty("iframe",false);Dom.setStyle(this.element,"display","block");oCfg.setProperty("visible",true);} +else{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);}}},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);}},configHideDelay:function(p_sType,p_aArgs,p_oMenu){var nHideDelay=p_aArgs[0],oMouseOutEvent=this.mouseOutEvent,oMouseOverEvent=this.mouseOverEvent,oKeyDownEvent=this.keyDownEvent;if(nHideDelay>0){if(!this._bHideDelayEventHandlersAssigned){oMouseOutEvent.subscribe(this._execHideDelay,this);oMouseOverEvent.subscribe(this._cancelHideDelay,this,true);oKeyDownEvent.subscribe(this._cancelHideDelay,this,true);this._bHideDelayEventHandlersAssigned=true;}} +else{oMouseOutEvent.unsubscribe(this._execHideDelay,this);oMouseOverEvent.unsubscribe(this._cancelHideDelay,this);oKeyDownEvent.unsubscribe(this._cancelHideDelay,this);this._bHideDelayEventHandlersAssigned=false;}},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);}},_setMaxHeight:function(p_sType,p_aArgs,p_nMaxHeight){this.cfg.setProperty("maxheight",p_nMaxHeight);this.renderEvent.unsubscribe(this._setMaxHeight);},configMaxHeight:function(p_sType,p_aArgs,p_oMenu){var nMaxHeight=p_aArgs[0],oBody=this.body;if(this.lazyLoad&&!oBody){this.renderEvent.unsubscribe(this._setMaxHeight);if(nMaxHeight>0){this.renderEvent.subscribe(this._setMaxHeight,nMaxHeight,this);} +return;} +Dom.setStyle(oBody,"height","auto");Dom.setStyle(oBody,"overflow","visible");var oHeader=this.header,oFooter=this.footer,fnMouseOver=this._onScrollTargetMouseOver,fnMouseOut=this._onScrollTargetMouseOut;if((nMaxHeight>0)&&(oBody.offsetHeight>nMaxHeight)){if(!this.cfg.getProperty("width")){this._setWidth();} +if(!oHeader&&!oFooter){this.setHeader(" ");this.setFooter(" ");oHeader=this.header;oFooter=this.footer;Dom.addClass(oHeader,"topscrollbar");Dom.addClass(oFooter,"bottomscrollbar");this.element.insertBefore(oHeader,oBody);this.element.appendChild(oFooter);Event.on(oHeader,"mouseover",fnMouseOver,this,true);Event.on(oHeader,"mouseout",fnMouseOut,this,true);Event.on(oFooter,"mouseover",fnMouseOver,this,true);Event.on(oFooter,"mouseout",fnMouseOut,this,true);} +var nHeight=(nMaxHeight- +(this.footer.offsetHeight+this.header.offsetHeight));Dom.setStyle(oBody,"height",(nHeight+"px"));Dom.setStyle(oBody,"overflow","hidden");} +else if(oHeader&&oFooter){Dom.setStyle(oBody,"height","auto");Dom.setStyle(oBody,"overflow","visible");Event.removeListener(oHeader,"mouseover",fnMouseOver);Event.removeListener(oHeader,"mouseout",fnMouseOut);Event.removeListener(oFooter,"mouseover",fnMouseOver);Event.removeListener(oFooter,"mouseout",fnMouseOut);this.element.removeChild(oHeader);this.element.removeChild(oFooter);this.header=null;this.footer=null;}},configClassName:function(p_sType,p_aArgs,p_oMenu){var sClassName=p_aArgs[0];if(this._sClassName){Dom.removeClass(this.element,this._sClassName);} +Dom.addClass(this.element,sClassName);this._sClassName=sClassName;},initEvents:function(){YAHOO.widget.Menu.superclass.initEvents.call(this);var EVENT_TYPES=YAHOO.widget.Menu._EVENT_TYPES;this.mouseOverEvent=new CustomEvent(EVENT_TYPES.MOUSE_OVER,this);this.mouseOutEvent=new CustomEvent(EVENT_TYPES.MOUSE_OUT,this);this.mouseDownEvent=new CustomEvent(EVENT_TYPES.MOUSE_DOWN,this);this.mouseUpEvent=new CustomEvent(EVENT_TYPES.MOUSE_UP,this);this.clickEvent=new CustomEvent(EVENT_TYPES.CLICK,this);this.keyPressEvent=new CustomEvent(EVENT_TYPES.KEY_PRESS,this);this.keyDownEvent=new CustomEvent(EVENT_TYPES.KEY_DOWN,this);this.keyUpEvent=new CustomEvent(EVENT_TYPES.KEY_UP,this);this.focusEvent=new CustomEvent(EVENT_TYPES.FOCUS,this);this.blurEvent=new CustomEvent(EVENT_TYPES.BLUR,this);this.itemAddedEvent=new CustomEvent(EVENT_TYPES.ITEM_ADDED,this);this.itemRemovedEvent=new CustomEvent(EVENT_TYPES.ITEM_REMOVED,this);},getRoot:function(){var oItem=this.parent;if(oItem){var oParentMenu=oItem.parent;return oParentMenu?oParentMenu.getRoot():this;} +else{return this;}},toString:function(){var sReturnVal="Menu",sId=this.id;if(sId){sReturnVal+=(" "+sId);} +return sReturnVal;},setItemGroupTitle:function(p_sGroupTitle,p_nGroupIndex){if(typeof p_sGroupTitle=="string"&&p_sGroupTitle.length>0){var nGroupIndex=typeof p_nGroupIndex=="number"?p_nGroupIndex:0,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,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");}}},addItem:function(p_oItem,p_nGroupIndex){if(p_oItem){return this._addItemToGroup(p_nGroupIndex,p_oItem);}},addItems:function(p_aItems,p_nGroupIndex){if(Lang.isArray(p_aItems)){var nItems=p_aItems.length,aItems=[],oItem;for(var i=0;i0){var i=nItems-1,oItem,oSubmenu;do{oItem=aItems[i];if(oItem){oSubmenu=oItem.cfg.getProperty("submenu");if(oSubmenu){this.cfg.configChangedEvent.unsubscribe(this._onParentMenuConfigChange,oSubmenu);this.renderEvent.unsubscribe(this._onParentMenuRender,oSubmenu);} +oItem.destroy();}} +while(i--);} +if(oHeader){Event.purgeElement(oHeader);oElement.removeChild(oHeader);} +if(oFooter){Event.purgeElement(oFooter);oElement.removeChild(oFooter);} +if(oBody){Event.purgeElement(oBody);oBody.innerHTML="";} +this._aItemGroups=[];this._aListElements=[];this._aGroupTitleElements=[];this.cfg.setProperty("width",null);},destroy:function(){Event.purgeElement(this.element);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.itemAddedEvent.unsubscribeAll();this.itemRemovedEvent.unsubscribeAll();this.cfg.unsubscribeFromConfigEvent("width",this._onWidthChange);this.cfg.unsubscribeFromConfigEvent("visible",this._onVisibleChange);if(this._hasSetWidthHandlers){this.itemAddedEvent.unsubscribe(this._setWidth);this.itemRemovedEvent.unsubscribe(this._setWidth);this._hasSetWidthHandlers=false;} +YAHOO.widget.Module.textResizeEvent.unsubscribe(this._onTextResize,this);this.clearContent();this._aItemGroups=null;this._aListElements=null;this._aGroupTitleElements=null;YAHOO.widget.Menu.superclass.destroy.call(this);},setInitialFocus:function(){var oItem=this._getFirstEnabledItem();if(oItem){oItem.focus();}},setInitialSelection:function(){var oItem=this._getFirstEnabledItem();if(oItem){oItem.cfg.setProperty("selected",true);}},clearActiveItem:function(p_bBlur){if(this.cfg.getProperty("showdelay")>0){this._cancelShowDelay();} +var oActiveItem=this.activeItem;if(oActiveItem){var oConfig=oActiveItem.cfg;if(p_bBlur){oActiveItem.blur();} +oConfig.setProperty("selected",false);var oSubmenu=oConfig.getProperty("submenu");if(oSubmenu){oSubmenu.hide();} +this.activeItem=null;}},focus:function(){if(!this.hasFocus()){this.setInitialFocus();}},blur:function(){if(this.hasFocus()){var oItem=YAHOO.widget.MenuManager.getFocusedMenuItem();if(oItem){oItem.blur();}}},hasFocus:function(){return(YAHOO.widget.MenuManager.getFocusedMenu()==this.getRoot());},initDefaultConfig:function(){YAHOO.widget.Menu.superclass.initDefaultConfig.call(this);var oConfig=this.cfg,DEFAULT_CONFIG=YAHOO.widget.Menu._DEFAULT_CONFIG;oConfig.addProperty(DEFAULT_CONFIG.VISIBLE.key,{handler:this.configVisible,value:DEFAULT_CONFIG.VISIBLE.value,validator:DEFAULT_CONFIG.VISIBLE.validator});oConfig.addProperty(DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.key,{handler:this.configConstrainToViewport,value:DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.value,validator:DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.validator,supercedes:DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.supercedes});oConfig.addProperty(DEFAULT_CONFIG.POSITION.key,{handler:this.configPosition,value:DEFAULT_CONFIG.POSITION.value,validator:DEFAULT_CONFIG.POSITION.validator,supercedes:DEFAULT_CONFIG.POSITION.supercedes});oConfig.addProperty(DEFAULT_CONFIG.SUBMENU_ALIGNMENT.key,{value:DEFAULT_CONFIG.SUBMENU_ALIGNMENT.value});oConfig.addProperty(DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.key,{value:DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.value,validator:DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.validator});oConfig.addProperty(DEFAULT_CONFIG.SHOW_DELAY.key,{value:DEFAULT_CONFIG.SHOW_DELAY.value,validator:DEFAULT_CONFIG.SHOW_DELAY.validator});oConfig.addProperty(DEFAULT_CONFIG.HIDE_DELAY.key,{handler:this.configHideDelay,value:DEFAULT_CONFIG.HIDE_DELAY.value,validator:DEFAULT_CONFIG.HIDE_DELAY.validator,suppressEvent:DEFAULT_CONFIG.HIDE_DELAY.suppressEvent});oConfig.addProperty(DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.key,{value:DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.value,validator:DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.validator});oConfig.addProperty(DEFAULT_CONFIG.CLICK_TO_HIDE.key,{value:DEFAULT_CONFIG.CLICK_TO_HIDE.value,validator:DEFAULT_CONFIG.CLICK_TO_HIDE.validator});oConfig.addProperty(DEFAULT_CONFIG.CONTAINER.key,{handler:this.configContainer,value:document.body});oConfig.addProperty(DEFAULT_CONFIG.MAX_HEIGHT.key,{handler:this.configMaxHeight,value:DEFAULT_CONFIG.MAX_HEIGHT.value,validator:DEFAULT_CONFIG.MAX_HEIGHT.validator});oConfig.addProperty(DEFAULT_CONFIG.CLASS_NAME.key,{handler:this.configClassName,value:DEFAULT_CONFIG.CLASS_NAME.value,validator:DEFAULT_CONFIG.CLASS_NAME.validator});}});})();(function(){var Dom=YAHOO.util.Dom,Module=YAHOO.widget.Module,Menu=YAHOO.widget.Menu,CustomEvent=YAHOO.util.CustomEvent,Lang=YAHOO.lang;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.id=p_oConfig.id;} +this.init(p_oObject,p_oConfig);}};YAHOO.widget.MenuItem._EVENT_TYPES={"MOUSE_OVER":"mouseover","MOUSE_OUT":"mouseout","MOUSE_DOWN":"mousedown","MOUSE_UP":"mouseup","CLICK":"click","KEY_PRESS":"keypress","KEY_DOWN":"keydown","KEY_UP":"keyup","ITEM_ADDED":"itemAdded","ITEM_REMOVED":"itemRemoved","FOCUS":"focus","BLUR":"blur","DESTROY":"destroy"};YAHOO.widget.MenuItem._DEFAULT_CONFIG={"TEXT":{key:"text",value:"",validator:Lang.isString,suppressEvent:true},"HELP_TEXT":{key:"helptext"},"URL":{key:"url",value:"#",suppressEvent:true},"TARGET":{key:"target",suppressEvent:true},"EMPHASIS":{key:"emphasis",value:false,validator:Lang.isBoolean,suppressEvent:true},"STRONG_EMPHASIS":{key:"strongemphasis",value:false,validator:Lang.isBoolean,suppressEvent:true},"CHECKED":{key:"checked",value:false,validator:Lang.isBoolean,suppressEvent:true,supercedes:["disabled"]},"DISABLED":{key:"disabled",value:false,validator:Lang.isBoolean,suppressEvent:true},"SELECTED":{key:"selected",value:false,validator:Lang.isBoolean,suppressEvent:true},"SUBMENU":{key:"submenu"},"ONCLICK":{key:"onclick"},"CLASS_NAME":{key:"classname",value:null,validator:Lang.isString}};YAHOO.widget.MenuItem.prototype={COLLAPSED_SUBMENU_INDICATOR_TEXT:"Submenu collapsed. Click to expand submenu.",EXPANDED_SUBMENU_INDICATOR_TEXT:"Submenu expanded. Click to collapse submenu.",DISABLED_SUBMENU_INDICATOR_TEXT:"Submenu collapsed. (Item disabled.)",CHECKED_TEXT:"Menu item checked.",DISABLED_CHECKED_TEXT:"Checked. (Item disabled.)",CSS_CLASS_NAME:"yuimenuitem",SUBMENU_TYPE:null,_oAnchor:null,_oText:null,_oHelpTextEM:null,_oSubmenu:null,_oCheckedIndicator:null,_oOnclickAttributeValue:null,_sClassName:null,constructor:YAHOO.widget.MenuItem,index:null,groupIndex:null,parent:null,element:null,srcElement:null,value:null,submenuIndicator:null,browser:Module.prototype.browser,id:null,destroyEvent:null,mouseOverEvent:null,mouseOutEvent:null,mouseDownEvent:null,mouseUpEvent:null,clickEvent:null,keyPressEvent:null,keyDownEvent:null,keyUpEvent:null,focusEvent:null,blurEvent:null,init:function(p_oObject,p_oConfig){if(!this.SUBMENU_TYPE){this.SUBMENU_TYPE=Menu;} +this.cfg=new YAHOO.util.Config(this);this.initDefaultConfig();var oConfig=this.cfg;if(Lang.isString(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":var oAnchor=this._getFirstElement(p_oObject,"A"),sURL="#",sTarget,sText;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;var oEmphasisNode=this._getFirstElement(oAnchor),bEmphasis=false,bStrongEmphasis=false;if(oEmphasisNode){this._oText=oEmphasisNode.firstChild;switch(oEmphasisNode.tagName.toUpperCase()){case"EM":bEmphasis=true;break;case"STRONG":bStrongEmphasis=true;break;}} +else{this._oText=oAnchor.firstChild;} +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){var sId=this.element.id;if(!sId){sId=this.id||Dom.generateId();this.element.id=sId;} +this.id=sId;Dom.addClass(this.element,this.CSS_CLASS_NAME);var EVENT_TYPES=YAHOO.widget.MenuItem._EVENT_TYPES;this.mouseOverEvent=new CustomEvent(EVENT_TYPES.MOUSE_OVER,this);this.mouseOutEvent=new CustomEvent(EVENT_TYPES.MOUSE_OUT,this);this.mouseDownEvent=new CustomEvent(EVENT_TYPES.MOUSE_DOWN,this);this.mouseUpEvent=new CustomEvent(EVENT_TYPES.MOUSE_UP,this);this.clickEvent=new CustomEvent(EVENT_TYPES.CLICK,this);this.keyPressEvent=new CustomEvent(EVENT_TYPES.KEY_PRESS,this);this.keyDownEvent=new CustomEvent(EVENT_TYPES.KEY_DOWN,this);this.keyUpEvent=new CustomEvent(EVENT_TYPES.KEY_UP,this);this.focusEvent=new CustomEvent(EVENT_TYPES.FOCUS,this);this.blurEvent=new CustomEvent(EVENT_TYPES.BLUR,this);this.destroyEvent=new CustomEvent(EVENT_TYPES.DESTROY,this);if(p_oConfig){oConfig.applyConfig(p_oConfig);} +oConfig.fireQueue();}},_getFirstElement:function(p_oElement,p_sTagName){var oFirstChild=p_oElement.firstChild,oElement;if(oFirstChild){if(oFirstChild.nodeType==1){oElement=oFirstChild;} +else{var oNextSibling=oFirstChild.nextSibling;if(oNextSibling&&oNextSibling.nodeType==1){oElement=oNextSibling;}}} +if(p_sTagName){return(oElement&&oElement.tagName.toUpperCase()==p_sTagName)?oElement:false;} +return oElement;},_checkDOMNode:function(p_oObject){return(p_oObject&&p_oObject.tagName);},_createRootNodeStructure:function(){var oTemplate=YAHOO.widget.MenuItem._MenuItemTemplate;if(!oTemplate){oTemplate=document.createElement("li");oTemplate.innerHTML="s";YAHOO.widget.MenuItem._MenuItemTemplate=oTemplate;} +this.element=oTemplate.cloneNode(true);this._oAnchor=this.element.firstChild;this._oText=this._oAnchor.firstChild;this.element.appendChild(this._oAnchor);},_initSubTree:function(){var oSrcEl=this.srcElement,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,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;n0){oAnchor.setAttribute("target",sTarget);} +else{oAnchor.removeAttribute("target");}},configEmphasis:function(p_sType,p_aArgs,p_oItem){var bEmphasis=p_aArgs[0],oAnchor=this._oAnchor,oText=this._oText,oConfig=this.cfg,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");if(oEM){oAnchor.removeChild(oEM);oAnchor.appendChild(oText);}}}},configStrongEmphasis:function(p_sType,p_aArgs,p_oItem){var bStrongEmphasis=p_aArgs[0],oAnchor=this._oAnchor,oText=this._oText,oConfig=this.cfg,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");if(oStrong){oAnchor.removeChild(oStrong);oAnchor.appendChild(oText);}}}},configChecked:function(p_sType,p_aArgs,p_oItem){var bChecked=p_aArgs[0],oEl=this.element,oConfig=this.cfg,oEM;if(bChecked){var oTemplate=YAHOO.widget.MenuItem._CheckedIndicatorTemplate;if(!oTemplate){oTemplate=document.createElement("em");oTemplate.innerHTML=this.CHECKED_TEXT;oTemplate.className="checkedindicator";YAHOO.widget.MenuItem._CheckedIndicatorTemplate=oTemplate;} +oEM=oTemplate.cloneNode(true);var oSubmenu=this.cfg.getProperty("submenu");if(oSubmenu&&oSubmenu.element){oEl.insertBefore(oEM,oSubmenu.element);} +else{oEl.appendChild(oEM);} +Dom.addClass(oEl,"checked");this._oCheckedIndicator=oEM;if(oConfig.getProperty("disabled")){oConfig.refireEvent("disabled");} +if(oConfig.getProperty("selected")){oConfig.refireEvent("selected");}} +else{oEM=this._oCheckedIndicator;Dom.removeClass(oEl,"checked");if(oEM){oEl.removeChild(oEM);} +this._oCheckedIndicator=null;}},configDisabled:function(p_sType,p_aArgs,p_oItem){var bDisabled=p_aArgs[0],oConfig=this.cfg,oAnchor=this._oAnchor,aNodes=[this.element,oAnchor],oHelpText=this._oHelpTextEM,oCheckedIndicator=this._oCheckedIndicator,oSubmenuIndicator=this.submenuIndicator,i=1;if(oHelpText){i++;aNodes[i]=oHelpText;} +if(oCheckedIndicator){oCheckedIndicator.firstChild.nodeValue=bDisabled?this.DISABLED_CHECKED_TEXT:this.CHECKED_TEXT;i++;aNodes[i]=oCheckedIndicator;} +if(oSubmenuIndicator){oSubmenuIndicator.firstChild.nodeValue=bDisabled?this.DISABLED_SUBMENU_INDICATOR_TEXT:this.COLLAPSED_SUBMENU_INDICATOR_TEXT;i++;aNodes[i]=oSubmenuIndicator;} +if(bDisabled){if(oConfig.getProperty("selected")){oConfig.setProperty("selected",false);} +oAnchor.removeAttribute("href");Dom.addClass(aNodes,"disabled");} +else{oAnchor.setAttribute("href",oConfig.getProperty("url"));Dom.removeClass(aNodes,"disabled");}},configSelected:function(p_sType,p_aArgs,p_oItem){if(!this.cfg.getProperty("disabled")){var bSelected=p_aArgs[0],oHelpText=this._oHelpTextEM,oSubmenuIndicator=this.submenuIndicator,oCheckedIndicator=this._oCheckedIndicator,aNodes=[this.element,this._oAnchor],i=1;if(oHelpText){i++;aNodes[i]=oHelpText;} +if(oSubmenuIndicator){i++;aNodes[i]=oSubmenuIndicator;} +if(oCheckedIndicator){i++;aNodes[i]=oCheckedIndicator;} +if(bSelected){Dom.addClass(aNodes,"selected");} +else{Dom.removeClass(aNodes,"selected");}}},configSubmenu:function(p_sType,p_aArgs,p_oItem){var oEl=this.element,oSubmenu=p_aArgs[0],oSubmenuIndicator=this.submenuIndicator,oConfig=this.cfg,aNodes=[this.element,this._oAnchor],bLazyLoad=this.parent&&this.parent.lazyLoad,oMenu;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,oSubmenuConfig=oSubmenu;oSubmenuConfig.lazyload=bLazyLoad;oSubmenuConfig.parent=this;oMenu=new this.SUBMENU_TYPE(sSubmenuId,oSubmenuConfig);this.cfg.setProperty("submenu",oMenu,true);} +else{oMenu=new this.SUBMENU_TYPE(oSubmenu,{lazyload:bLazyLoad,parent:this});this.cfg.setProperty("submenu",oMenu,true);} +if(oMenu){this._oSubmenu=oMenu;if(!oSubmenuIndicator){var oTemplate=YAHOO.widget.MenuItem._oSubmenuIndicatorTemplate;if(!oTemplate){oTemplate=document.createElement("em");oTemplate.innerHTML=this.COLLAPSED_SUBMENU_INDICATOR_TEXT;oTemplate.className="submenuindicator";YAHOO.widget.MenuItem._oSubmenuIndicatorTemplate=oTemplate;} +oSubmenuIndicator=oTemplate.cloneNode(true);if(oMenu.element.parentNode==oEl){if(this.browser=="opera"){oEl.appendChild(oSubmenuIndicator);oMenu.renderEvent.subscribe(function(){oSubmenuIndicator.parentNode.insertBefore(oSubmenuIndicator,oMenu.element);});} +else{oEl.insertBefore(oSubmenuIndicator,oMenu.element);}} +else{oEl.appendChild(oSubmenuIndicator);} +this.submenuIndicator=oSubmenuIndicator;} +Dom.addClass(aNodes,"hassubmenu");if(oConfig.getProperty("disabled")){oConfig.refireEvent("disabled");} +if(oConfig.getProperty("selected")){oConfig.refireEvent("selected");}}} +else{Dom.removeClass(aNodes,"hassubmenu");if(oSubmenuIndicator){oEl.removeChild(oSubmenuIndicator);} +if(this._oSubmenu){this._oSubmenu.destroy();}}},configOnClick:function(p_sType,p_aArgs,p_oItem){var oObject=p_aArgs[0];if(this._oOnclickAttributeValue&&(this._oOnclickAttributeValue!=oObject)){this.clickEvent.unsubscribe(this._oOnclickAttributeValue.fn,this._oOnclickAttributeValue.obj);this._oOnclickAttributeValue=null;} +if(!this._oOnclickAttributeValue&&typeof oObject=="object"&&typeof oObject.fn=="function"){this.clickEvent.subscribe(oObject.fn,(oObject.obj||this),oObject.scope);this._oOnclickAttributeValue=oObject;}},configClassName:function(p_sType,p_aArgs,p_oItem){var sClassName=p_aArgs[0];if(this._sClassName){Dom.removeClass(this.element,this._sClassName);} +Dom.addClass(this.element,sClassName);this._sClassName=sClassName;},initDefaultConfig:function(){var oConfig=this.cfg,DEFAULT_CONFIG=YAHOO.widget.MenuItem._DEFAULT_CONFIG;oConfig.addProperty(DEFAULT_CONFIG.TEXT.key,{handler:this.configText,value:DEFAULT_CONFIG.TEXT.value,validator:DEFAULT_CONFIG.TEXT.validator,suppressEvent:DEFAULT_CONFIG.TEXT.suppressEvent});oConfig.addProperty(DEFAULT_CONFIG.HELP_TEXT.key,{handler:this.configHelpText});oConfig.addProperty(DEFAULT_CONFIG.URL.key,{handler:this.configURL,value:DEFAULT_CONFIG.URL.value,suppressEvent:DEFAULT_CONFIG.URL.suppressEvent});oConfig.addProperty(DEFAULT_CONFIG.TARGET.key,{handler:this.configTarget,suppressEvent:DEFAULT_CONFIG.TARGET.suppressEvent});oConfig.addProperty(DEFAULT_CONFIG.EMPHASIS.key,{handler:this.configEmphasis,value:DEFAULT_CONFIG.EMPHASIS.value,validator:DEFAULT_CONFIG.EMPHASIS.validator,suppressEvent:DEFAULT_CONFIG.EMPHASIS.suppressEvent});oConfig.addProperty(DEFAULT_CONFIG.STRONG_EMPHASIS.key,{handler:this.configStrongEmphasis,value:DEFAULT_CONFIG.STRONG_EMPHASIS.value,validator:DEFAULT_CONFIG.STRONG_EMPHASIS.validator,suppressEvent:DEFAULT_CONFIG.STRONG_EMPHASIS.suppressEvent});oConfig.addProperty(DEFAULT_CONFIG.CHECKED.key,{handler:this.configChecked,value:DEFAULT_CONFIG.CHECKED.value,validator:DEFAULT_CONFIG.CHECKED.validator,suppressEvent:DEFAULT_CONFIG.CHECKED.suppressEvent,supercedes:DEFAULT_CONFIG.CHECKED.supercedes});oConfig.addProperty(DEFAULT_CONFIG.DISABLED.key,{handler:this.configDisabled,value:DEFAULT_CONFIG.DISABLED.value,validator:DEFAULT_CONFIG.DISABLED.validator,suppressEvent:DEFAULT_CONFIG.DISABLED.suppressEvent});oConfig.addProperty(DEFAULT_CONFIG.SELECTED.key,{handler:this.configSelected,value:DEFAULT_CONFIG.SELECTED.value,validator:DEFAULT_CONFIG.SELECTED.validator,suppressEvent:DEFAULT_CONFIG.SELECTED.suppressEvent});oConfig.addProperty(DEFAULT_CONFIG.SUBMENU.key,{handler:this.configSubmenu});oConfig.addProperty(DEFAULT_CONFIG.ONCLICK.key,{handler:this.configOnClick});oConfig.addProperty(DEFAULT_CONFIG.CLASS_NAME.key,{handler:this.configClassName,value:DEFAULT_CONFIG.CLASS_NAME.value,validator:DEFAULT_CONFIG.CLASS_NAME.validator});},getNextEnabledSibling:function(){if(this.parent instanceof Menu){var nGroupIndex=this.groupIndex;function getNextArrayItem(p_aArray,p_nStartIndex){return p_aArray[p_nStartIndex]||getNextArrayItem(p_aArray,(p_nStartIndex+1));} +var aItemGroups=this.parent.getItemGroups(),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);oNextItem=getNextArrayItem(aNextGroup,0);} +return(oNextItem.cfg.getProperty("disabled")||oNextItem.element.style.display=="none")?oNextItem.getNextEnabledSibling():oNextItem;}},getPreviousEnabledSibling:function(){if(this.parent instanceof Menu){var nGroupIndex=this.groupIndex;function getPreviousArrayItem(p_aArray,p_nStartIndex){return p_aArray[p_nStartIndex]||getPreviousArrayItem(p_aArray,(p_nStartIndex-1));} +function getFirstItemIndex(p_aArray,p_nStartIndex){return p_aArray[p_nStartIndex]?p_nStartIndex:getFirstItemIndex(p_aArray,(p_nStartIndex+1));} +var aItemGroups=this.parent.getItemGroups(),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;}},focus:function(){var oParent=this.parent,oAnchor=this._oAnchor,oActiveItem=oParent.activeItem,me=this;function setFocus(){try{if((me.browser=="ie"||me.browser=="ie7")&&!document.hasFocus()){return;} +oAnchor.focus();} +catch(e){}} +if(!this.cfg.getProperty("disabled")&&oParent&&oParent.cfg.getProperty("visible")&&this.element.style.display!="none"){if(oActiveItem){oActiveItem.blur();} +window.setTimeout(setFocus,0);this.focusEvent.fire();}},blur:function(){var oParent=this.parent;if(!this.cfg.getProperty("disabled")&&oParent&&Dom.getStyle(oParent.element,"visibility")=="visible"){this._oAnchor.blur();this.blurEvent.fire();}},hasFocus:function(){return(YAHOO.widget.MenuManager.getFocusedMenuItem()==this);},destroy:function(){var oEl=this.element;if(oEl){var oSubmenu=this.cfg.getProperty("submenu");if(oSubmenu){oSubmenu.destroy();} +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();var oParentNode=oEl.parentNode;if(oParentNode){oParentNode.removeChild(oEl);this.destroyEvent.fire();} +this.destroyEvent.unsubscribeAll();}},toString:function(){var sReturnVal="MenuItem";if(this.cfg&&this.cfg.getProperty("text")){sReturnVal+=(": "+this.cfg.getProperty("text"));} +return sReturnVal;}};})();YAHOO.widget.ContextMenu=function(p_oElement,p_oConfig){YAHOO.widget.ContextMenu.superclass.constructor.call(this,p_oElement,p_oConfig);};YAHOO.widget.ContextMenu._EVENT_TYPES={"TRIGGER_CONTEXT_MENU":"triggerContextMenu","CONTEXT_MENU":((YAHOO.widget.Module.prototype.browser=="opera"?"mousedown":"contextmenu")),"CLICK":"click"};YAHOO.widget.ContextMenu._DEFAULT_CONFIG={"TRIGGER":{key:"trigger"}};YAHOO.lang.extend(YAHOO.widget.ContextMenu,YAHOO.widget.Menu,{_oTrigger:null,_bCancelled:false,contextEventTarget:null,triggerContextMenuEvent:null,init:function(p_oElement,p_oConfig){if(!this.ITEM_TYPE){this.ITEM_TYPE=YAHOO.widget.ContextMenuItem;} +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);},initEvents:function(){YAHOO.widget.ContextMenu.superclass.initEvents.call(this);this.triggerContextMenuEvent=new YAHOO.util.CustomEvent(YAHOO.widget.ContextMenu._EVENT_TYPES.TRIGGER_CONTEXT_MENU,this);},cancel:function(){this._bCancelled=true;},_removeEventHandlers:function(){var Event=YAHOO.util.Event,oTrigger=this._oTrigger;if(oTrigger){Event.removeListener(oTrigger,YAHOO.widget.ContextMenu._EVENT_TYPES.CONTEXT_MENU,this._onTriggerContextMenu);if(this.browser=="opera"){Event.removeListener(oTrigger,YAHOO.widget.ContextMenu._EVENT_TYPES.CLICK,this._onTriggerClick);}}},_onTriggerClick:function(p_oEvent,p_oMenu){if(p_oEvent.ctrlKey){YAHOO.util.Event.stopEvent(p_oEvent);}},_onTriggerContextMenu:function(p_oEvent,p_oMenu){var Event=YAHOO.util.Event;if(p_oEvent.type=="mousedown"&&!p_oEvent.ctrlKey){return;} +Event.stopEvent(p_oEvent);YAHOO.widget.MenuManager.hideVisible();this.contextEventTarget=Event.getTarget(p_oEvent);this.triggerContextMenuEvent.fire(p_oEvent);if(!this._bCancelled){this.cfg.setProperty("xy",Event.getXY(p_oEvent));this.show();} +this._bCancelled=false;},toString:function(){var sReturnVal="ContextMenu",sId=this.id;if(sId){sReturnVal+=(" "+sId);} +return sReturnVal;},initDefaultConfig:function(){YAHOO.widget.ContextMenu.superclass.initDefaultConfig.call(this);this.cfg.addProperty(YAHOO.widget.ContextMenu._DEFAULT_CONFIG.TRIGGER.key,{handler:this.configTrigger});},destroy:function(){this._removeEventHandlers();YAHOO.widget.ContextMenu.superclass.destroy.call(this);},configTrigger:function(p_sType,p_aArgs,p_oMenu){var Event=YAHOO.util.Event,oTrigger=p_aArgs[0];if(oTrigger){if(this._oTrigger){this._removeEventHandlers();} +this._oTrigger=oTrigger;Event.on(oTrigger,YAHOO.widget.ContextMenu._EVENT_TYPES.CONTEXT_MENU,this._onTriggerContextMenu,this,true);if(this.browser=="opera"){Event.on(oTrigger,YAHOO.widget.ContextMenu._EVENT_TYPES.CLICK,this._onTriggerClick,this,true);}} +else{this._removeEventHandlers();}}});YAHOO.widget.ContextMenuItem=function(p_oObject,p_oConfig){YAHOO.widget.ContextMenuItem.superclass.constructor.call(this,p_oObject,p_oConfig);};YAHOO.lang.extend(YAHOO.widget.ContextMenuItem,YAHOO.widget.MenuItem,{init:function(p_oObject,p_oConfig){if(!this.SUBMENU_TYPE){this.SUBMENU_TYPE=YAHOO.widget.ContextMenu;} +YAHOO.widget.ContextMenuItem.superclass.init.call(this,p_oObject);var oConfig=this.cfg;if(p_oConfig){oConfig.applyConfig(p_oConfig,true);} +oConfig.fireQueue();},toString:function(){var sReturnVal="ContextMenuItem";if(this.cfg&&this.cfg.getProperty("text")){sReturnVal+=(": "+this.cfg.getProperty("text"));} +return sReturnVal;}});YAHOO.widget.MenuBar=function(p_oElement,p_oConfig){YAHOO.widget.MenuBar.superclass.constructor.call(this,p_oElement,p_oConfig);};YAHOO.widget.MenuBar._DEFAULT_CONFIG={"POSITION":{key:"position",value:"static",validator:YAHOO.widget.Menu._checkPosition,supercedes:["visible"]},"SUBMENU_ALIGNMENT":{key:"submenualignment",value:["tl","bl"]},"AUTO_SUBMENU_DISPLAY":{key:"autosubmenudisplay",value:false,validator:YAHOO.lang.isBoolean}};YAHOO.lang.extend(YAHOO.widget.MenuBar,YAHOO.widget.Menu,{init:function(p_oElement,p_oConfig){if(!this.ITEM_TYPE){this.ITEM_TYPE=YAHOO.widget.MenuBarItem;} +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);},CSS_CLASS_NAME:"yuimenubar",_onKeyDown:function(p_sType,p_aArgs,p_oMenuBar){var Event=YAHOO.util.Event,oEvent=p_aArgs[0],oItem=p_aArgs[1],oSubmenu;if(oItem&&!oItem.cfg.getProperty("disabled")){var oItemCfg=oItem.cfg;switch(oEvent.keyCode){case 37:case 39: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();}} +oNextItem.focus();}} +Event.preventDefault(oEvent);break;case 40: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;}} +if(oEvent.keyCode==27&&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);}},_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&&!oItem.cfg.getProperty("disabled")){var Event=YAHOO.util.Event,Dom=YAHOO.util.Dom,oEvent=p_aArgs[0],oTarget=Event.getTarget(oEvent),oActiveItem=this.activeItem,oConfig=this.cfg;if(oActiveItem&&oActiveItem!=oItem){this.clearActiveItem();} +oItem.cfg.setProperty("selected",true);var oSubmenu=oItem.cfg.getProperty("submenu");if(oSubmenu&&oTarget!=oItem.submenuIndicator){if(oSubmenu.cfg.getProperty("visible")){oSubmenu.hide();} +else{oSubmenu.show();}}}},toString:function(){var sReturnVal="MenuBar",sId=this.id;if(sId){sReturnVal+=(" "+sId);} +return sReturnVal;},initDefaultConfig:function(){YAHOO.widget.MenuBar.superclass.initDefaultConfig.call(this);var oConfig=this.cfg,DEFAULT_CONFIG=YAHOO.widget.MenuBar._DEFAULT_CONFIG;oConfig.addProperty(DEFAULT_CONFIG.POSITION.key,{handler:this.configPosition,value:DEFAULT_CONFIG.POSITION.value,validator:DEFAULT_CONFIG.POSITION.validator,supercedes:DEFAULT_CONFIG.POSITION.supercedes});oConfig.addProperty(DEFAULT_CONFIG.SUBMENU_ALIGNMENT.key,{value:DEFAULT_CONFIG.SUBMENU_ALIGNMENT.value});oConfig.addProperty(DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.key,{value:DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.value,validator:DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.validator});}});YAHOO.widget.MenuBarItem=function(p_oObject,p_oConfig){YAHOO.widget.MenuBarItem.superclass.constructor.call(this,p_oObject,p_oConfig);};YAHOO.lang.extend(YAHOO.widget.MenuBarItem,YAHOO.widget.MenuItem,{init:function(p_oObject,p_oConfig){if(!this.SUBMENU_TYPE){this.SUBMENU_TYPE=YAHOO.widget.Menu;} +YAHOO.widget.MenuBarItem.superclass.init.call(this,p_oObject);var oConfig=this.cfg;if(p_oConfig){oConfig.applyConfig(p_oConfig,true);} +oConfig.fireQueue();},CSS_CLASS_NAME:"yuimenubaritem",toString:function(){var sReturnVal="MenuBarItem";if(this.cfg&&this.cfg.getProperty("text")){sReturnVal+=(": "+this.cfg.getProperty("text"));} +return sReturnVal;}});YAHOO.register("menu",YAHOO.widget.Menu,{version:"2.2.2",build:"204"}); \ No newline at end of file diff --git a/www/extras/yui/build/menu/menu.js b/www/extras/yui/build/menu/menu.js new file mode 100644 index 000000000..e6f6b7c7d --- /dev/null +++ b/www/extras/yui/build/menu/menu.js @@ -0,0 +1,8726 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ + + +/** +* @module menu +* @description

          The Menu family of components features a collection of +* controls that make it easy to add menus to your website or web application. +* With the Menu Controls you can create website fly-out menus, customized +* context menus, or application-style menu bars with just a small amount of +* scripting.

          The Menu family of controls features:

          +*
            +*
          • Screen-reader accessibility.
          • +*
          • Keyboard and mouse navigation.
          • +*
          • A rich event model that provides access to all of a menu's +* interesting moments.
          • +*
          • Support for +* Progressive +* Enhancement; Menus can be created from simple, +* semantic markup on the page or purely through JavaScript.
          • +*
          +* @title Menu +* @namespace YAHOO.widget +* @requires Event, Dom, Container +*/ +(function() { + +var Dom = YAHOO.util.Dom, + 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 = function() { + + // Private member variables + + + // Flag indicating if the DOM event handlers have been attached + + var m_bInitializedEventHandlers = false, + + + // Collection of menus + + m_oMenus = {}, + + + // Collection of menu items + + m_oItems = {}, + + + // Collection of visible menus + + m_oVisibleMenus = {}, + + + // Map of DOM event types to their equivalent CustomEvent types + + m_oEventTypes = { + "click": "clickEvent", + "mousedown": "mouseDownEvent", + "mouseup": "mouseUpEvent", + "mouseover": "mouseOverEvent", + "mouseout": "mouseOutEvent", + "keydown": "keyDownEvent", + "keyup": "keyUpEvent", + "keypress": "keyPressEvent" + }, + + + m_oFocusedMenuItem = null; + + + + + // Private methods + + + /** + * @method addItem + * @description 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. + */ + function addItem(p_oItem) { + + var sId = p_oItem.id; + + if(p_oItem && m_oItems[sId] != p_oItem) { + + m_oItems[sId] = p_oItem; + + p_oItem.destroyEvent.subscribe(onItemDestroy); + + + } + + } + + + /** + * @method removeItem + * @description 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. + */ + function removeItem(p_oItem) { + + var sId = p_oItem.id; + + if(sId && m_oItems[sId]) { + + delete m_oItems[sId]; + + + } + + } + + + /** + * @method getMenuRootElement + * @description Finds the root DIV node of a menu or the root LI node of a + * menu item. + * @private + * @param {HTMLElement} p_oElement Object specifying + * an HTML element. + */ + function getMenuRootElement(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, "hd") || + Dom.hasClass(p_oElement, "bd") || + Dom.hasClass(p_oElement, "ft") + ) + && + 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 + + + /** + * @method onDOMEvent + * @description 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). + */ + function onDOMEvent(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 + + oElement = getMenuRootElement(oTarget), + oMenuItem, + oMenu; + + + if(oElement) { + + var sTagName = oElement.tagName.toUpperCase(); + + if(sTagName == "LI") { + + var sId = oElement.id; + + if(sId && m_oItems[sId]) { + + oMenuItem = m_oItems[sId]; + oMenu = oMenuItem.parent; + + } + + } + else if(sTagName == "DIV") { + + if(oElement.id) { + + oMenu = m_oMenus[oElement.id]; + + } + + } + + } + + + if(oMenu) { + + var sCustomEventType = m_oEventTypes[p_oEvent.type]; + + + // Fire the Custom Event that corresponds the current DOM event + + if(oMenuItem && !oMenuItem.cfg.getProperty("disabled")) { + + oMenuItem[sCustomEventType].fire(p_oEvent); + + + if (p_oEvent.type == "keyup" || p_oEvent.type == "mousedown") { + + if (m_oFocusedMenuItem != oMenuItem) { + + if(m_oFocusedMenuItem) { + + m_oFocusedMenuItem.blurEvent.fire(); + + } + + oMenuItem.focusEvent.fire(); + + } + + } + + } + + oMenu[sCustomEventType].fire(p_oEvent, oMenuItem); + + } + else if(p_oEvent.type == "mousedown") { + + if(m_oFocusedMenuItem) { + + m_oFocusedMenuItem.blurEvent.fire(); + + m_oFocusedMenuItem = null; + + } + + + /* + If the target of the event wasn't a menu, hide all + dynamically positioned menus + */ + + for(var i in m_oMenus) { + + if(YAHOO.lang.hasOwnProperty(m_oMenus,i)) { + + oMenu = m_oMenus[i]; + + if( + oMenu.cfg.getProperty("clicktohide") && + oMenu.cfg.getProperty("position") == "dynamic" + ) { + + oMenu.hide(); + + } + else { + + oMenu.clearActiveItem(true); + + } + + } + + } + + } + else if(p_oEvent.type == "keyup") { + + if(m_oFocusedMenuItem) { + + m_oFocusedMenuItem.blurEvent.fire(); + + m_oFocusedMenuItem = null; + + } + + } + + } + + + /** + * @method onMenuDestroy + * @description "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. + */ + function onMenuDestroy(p_sType, p_aArgs) { + + if(m_oMenus[this.id]) { + + delete m_oMenus[this.id]; + + + } + + } + + + /** + * @method onMenuFocus + * @description "focus" 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. + */ + function onMenuFocus(p_sType, p_aArgs) { + + var oItem = p_aArgs[0]; + + if (oItem) { + + m_oFocusedMenuItem = oItem; + + } + + } + + + /** + * @method onMenuBlur + * @description "blur" 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. + */ + function onMenuBlur(p_sType, p_aArgs) { + + m_oFocusedMenuItem = null; + + } + + + /** + * @method onItemDestroy + * @description "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. + */ + function onItemDestroy(p_sType, p_aArgs) { + + var sId = this.id; + + if(sId && m_oItems[sId]) { + + delete m_oItems[sId]; + + } + + } + + + /** + * @method onMenuVisibleConfigChange + * @description 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. + */ + function onMenuVisibleConfigChange(p_sType, p_aArgs) { + + var bVisible = p_aArgs[0]; + + if(bVisible) { + + m_oVisibleMenus[this.id] = this; + + + } + else if(m_oVisibleMenus[this.id]) { + + delete m_oVisibleMenus[this.id]; + + + } + + } + + + /** + * @method onItemAdded + * @description "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. + */ + function onItemAdded(p_sType, p_aArgs) { + + addItem(p_aArgs[0]); + + } + + + /** + * @method onItemRemoved + * @description "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. + */ + function onItemRemoved(p_sType, p_aArgs) { + + removeItem(p_aArgs[0]); + + } + + + + return { + + // 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. + */ + 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.on(oDoc, "mouseover", onDOMEvent, this, true); + Event.on(oDoc, "mouseout", onDOMEvent, this, true); + Event.on(oDoc, "mousedown", onDOMEvent, this, true); + Event.on(oDoc, "mouseup", onDOMEvent, this, true); + Event.on(oDoc, "click", onDOMEvent, this, true); + Event.on(oDoc, "keydown", onDOMEvent, this, true); + Event.on(oDoc, "keyup", onDOMEvent, this, true); + Event.on(oDoc, "keypress", onDOMEvent, this, true); + + + m_bInitializedEventHandlers = true; + + + } + + p_oMenu.destroyEvent.subscribe(onMenuDestroy); + + p_oMenu.cfg.subscribeToConfigEvent( + "visible", + onMenuVisibleConfigChange + ); + + p_oMenu.itemAddedEvent.subscribe(onItemAdded); + p_oMenu.itemRemovedEvent.subscribe(onItemRemoved); + p_oMenu.focusEvent.subscribe(onMenuFocus); + p_oMenu.blurEvent.subscribe(onMenuBlur); + + + } + + }, + + + /** + * @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. + */ + 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. + */ + hideVisible: function() { + + var oMenu; + + for(var i in m_oVisibleMenus) { + + if(YAHOO.lang.hasOwnProperty(m_oVisibleMenus,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} + */ + 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} + */ + getMenu: function(p_sId) { + + if(m_oMenus[p_sId]) { + + return m_oMenus[p_sId]; + + } + + }, + + + /** + * @method getFocusedMenuItem + * @description Returns a reference to the menu item that currently + * has focus. + * @return {YAHOO.widget.MenuItem} + */ + getFocusedMenuItem: function() { + + return m_oFocusedMenuItem; + + }, + + + /** + * @method getFocusedMenu + * @description Returns a reference to the menu that currently has focus. + * @return {YAHOO.widget.Menu} + */ + getFocusedMenu: function() { + + if(m_oFocusedMenuItem) { + + return (m_oFocusedMenuItem.parent.getRoot()); + + } + + }, + + + /** + * @method toString + * @description Returns a string representing the menu manager. + * @return {String} + */ + toString: function() { + + return ("MenuManager"); + + } + + }; + +}(); + +})(); + + + +/** +* 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 +* <div> element of the menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source +* for the menu. +* @param {HTMLDivElement} p_oElement Object +* specifying the <div> element of the menu. +* @param {HTMLSelectElement} p_oElement +* Object specifying the <select> 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 +*/ +(function() { + +var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + CustomEvent = YAHOO.util.CustomEvent, + Lang = YAHOO.lang; + + +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 + ); + +}; + + +/** +* Constant representing the name of the Menu's events +* @property YAHOO.widget.Menu._EVENT_TYPES +* @private +* @final +* @type Object +*/ +YAHOO.widget.Menu._EVENT_TYPES = { + + "MOUSE_OVER": "mouseover", + "MOUSE_OUT": "mouseout", + "MOUSE_DOWN": "mousedown", + "MOUSE_UP": "mouseup", + "CLICK": "click", + "KEY_PRESS": "keypress", + "KEY_DOWN": "keydown", + "KEY_UP": "keyup", + "FOCUS": "focus", + "BLUR": "blur", + "ITEM_ADDED": "itemAdded", + "ITEM_REMOVED": "itemRemoved" + +}; + + + +/** +* @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} +*/ +YAHOO.widget.Menu._checkPosition = function(p_sPosition) { + + if(typeof p_sPosition == "string") { + + var sPosition = p_sPosition.toLowerCase(); + + return ("dynamic,static".indexOf(sPosition) != -1); + + } + +}; + + + +/** +* Constant representing the Menu's configuration properties +* @property YAHOO.widget.Menu._DEFAULT_CONFIG +* @private +* @final +* @type Object +*/ +YAHOO.widget.Menu._DEFAULT_CONFIG = { + + "VISIBLE": { + key: "visible", + value: false, + validator: Lang.isBoolean + }, + + "CONSTRAIN_TO_VIEWPORT": { + key: "constraintoviewport", + value: true, + validator: Lang.isBoolean, + supercedes: ["iframe","x","y","xy"] + }, + + "POSITION": { + key: "position", + value: "dynamic", + validator: YAHOO.widget.Menu._checkPosition, + supercedes: ["visible"] + }, + + "SUBMENU_ALIGNMENT": { + key: "submenualignment", + value: ["tl","tr"] + }, + + "AUTO_SUBMENU_DISPLAY": { + key: "autosubmenudisplay", + value: true, + validator: Lang.isBoolean + }, + + "SHOW_DELAY": { + key: "showdelay", + value: 250, + validator: Lang.isNumber + }, + + "HIDE_DELAY": { + key: "hidedelay", + value: 0, + validator: Lang.isNumber, + suppressEvent: true + }, + + "SUBMENU_HIDE_DELAY": { + key: "submenuhidedelay", + value: 250, + validator: Lang.isNumber + }, + + "CLICK_TO_HIDE": { + key: "clicktohide", + value: true, + validator: Lang.isBoolean + }, + + "CONTAINER": { + key: "container" + }, + + "MAX_HEIGHT": { + key: "maxheight", + value: 0, + validator: Lang.isNumber + }, + + "CLASS_NAME": { + key: "classname", + value: null, + validator: Lang.isString + } + +}; + + +YAHOO.lang.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 <div> 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 <li> element, +* <optgroup> element or <option>) +* 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 _nSubmenuHideDelayId +* @description Number representing the time-out setting used to cancel the +* hiding of a submenu. +* @default null +* @private +* @type Number +*/ +_nSubmenuHideDelayId: null, + + +/** +* @property _nBodyScrollId +* @description Number representing the time-out setting used to cancel the +* scrolling of the menu's body element. +* @default null +* @private +* @type Number +*/ +_nBodyScrollId: null, + + +/** +* @property _bHideDelayEventHandlersAssigned +* @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 +*/ +_bHideDelayEventHandlersAssigned: 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 Multi-dimensional Array representing the menu items as they +* are grouped in the menu. +* @default [] +* @private +* @type Array +*/ +_aItemGroups: null, + + +/** +* @property _aListElements +* @description Array of <ul> elements, each of which is +* the parent node for each item's <li> element. +* @default [] +* @private +* @type Array +*/ +_aListElements: null, + + +/** +* @property _nCurrentMouseX +* @description The current x coordinate of the mouse inside the area of +* the menu. +* @default 0 +* @private +* @type Number +*/ +_nCurrentMouseX: 0, + + +/** +* @property _nMaxHeight +* @description The original value of the "maxheight" configuration property +* as set by the user. +* @default -1 +* @private +* @type Number +*/ +_nMaxHeight: -1, + + +/** +* @property _bStopMouseEventHandlers +* @description Stops "mouseover," "mouseout," and "mousemove" event handlers +* from executing. +* @default false +* @private +* @type Boolean +*/ +_bStopMouseEventHandlers: false, + + +/** +* @property _sClassName +* @description The current value of the "classname" configuration attribute. +* @default null +* @private +* @type String +*/ +_sClassName: 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 is selected. +* @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 +* <select> or <div>) used to +* create the menu. +* @default null +* @type HTMLSelectElement|HTMLDivElement +*/ +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 +* <div> element of the menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source +* for the menu. +* @param {HTMLDivElement} p_oElement Object +* specifying the <div> element of the menu. +* @param {HTMLSelectElement} p_oElement +* Object specifying the <select> 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.beforeShowEvent.subscribe(this._onBeforeShow, this, true); + this.showEvent.subscribe(this._onShow, this, true); + this.beforeHideEvent.subscribe(this._onBeforeHide, this, true); + this.hideEvent.subscribe(this._onHide, 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); + this.keyPressEvent.subscribe(this._onKeyPress, this, true); + + YAHOO.widget.Module.textResizeEvent.subscribe( + this._onTextResize, + 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.toUpperCase() == "DIV") { + + /* + Populate the collection of item groups and item + group titles + */ + + oNode = this.body.firstChild; + + var nGroup = 0, + 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) { + + var sSrcElementTagName = this.srcElement.tagName.toUpperCase(); + + + switch(sSrcElementTagName) { + + case "DIV": + + if(this._aListElements.length > 0) { + + + var i = this._aListElements.length - 1; + + do { + + oNode = this._aListElements[i].firstChild; + + + do { + + if( + oNode && + oNode.tagName && + oNode.tagName.toUpperCase() == "LI" + ) { + + + this.addItem( + new this.ITEM_TYPE( + oNode, + { parent: this } + ), + i + ); + + } + + } + 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 aItems = this.getItems(), + nItems = aItems.length, + oItem; + + for(var i=0; i= 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 { + + function getNextItemSibling(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, + aGroup = this._getItemGroup(nGroupIndex); + + if(aGroup) { + + var aArray = aGroup.splice(p_nItemIndex, 1), + 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, + 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), + nItems = aGroup.length; + + if(nItems > 0) { + + var i = nItems - 1, + oItem, + 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 +* <ul> 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, null, p_oItem); + oSubmenu.hideEvent.subscribe(this._onSubmenuHide, null, p_oItem); + + } + +}, + + +/** +* @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.blurEvent.subscribe(this._onMenuItemBlur); + + p_oItem.cfg.configChangedEvent.subscribe( + this._onMenuItemConfigChange, + p_oItem, + this + ); + +}, + + +/** +* @method _getOffsetWidth +* @description Returns the offset width of the menu's +* <div> 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 _setWidth +* @description Sets the width of the menu's root <div> +* element to its offsetWidth. +* @private +*/ +_setWidth: function() { + + var sWidth; + + if (this.element.parentNode.tagName.toUpperCase() == "BODY") { + + if (this.browser == "opera") { + + sWidth = this._getOffsetWidth(); + + } + else { + + Dom.setStyle(this.element, "width", "auto"); + + sWidth = this.element.offsetWidth; + + } + + } + else { + + sWidth = this._getOffsetWidth(); + + } + + this.cfg.setProperty("width", (sWidth + "px")); + +}, + + +/** +* @method _onWidthChange +* @description Change event handler for the the menu's "width" configuration +* property. +* @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. +*/ +_onWidthChange: function(p_sType, p_aArgs) { + + var sWidth = p_aArgs[0]; + + if (sWidth && !this._hasSetWidthHandlers) { + + this.itemAddedEvent.subscribe(this._setWidth); + this.itemRemovedEvent.subscribe(this._setWidth); + + this._hasSetWidthHandlers = true; + + } + else if (this._hasSetWidthHandlers) { + + this.itemAddedEvent.unsubscribe(this._setWidth); + this.itemRemovedEvent.unsubscribe(this._setWidth); + + this._hasSetWidthHandlers = false; + + } + +}, + + +/** +* @method _onVisibleChange +* @description Change event handler for the the menu's "visible" configuration +* property. +* @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. +*/ +_onVisibleChange: function(p_sType, p_aArgs) { + + var bVisible = p_aArgs[0]; + + if (bVisible) { + + Dom.addClass(this.element, "visible"); + + } + else { + + Dom.removeClass(this.element, "visible"); + + } + +}, + + +/** +* @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(), + me = this; + + function hideMenu() { + + 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) { + + var oRoot = this.getRoot(); + + function showMenu() { + + if(p_oMenu.parent.cfg.getProperty("selected")) { + + p_oMenu.show(); + + } + + } + + + oRoot._nShowDelayId = + window.setTimeout(showMenu, oRoot.cfg.getProperty("showdelay")); + +}, + + +/** +* @method _execSubmenuHideDelay +* @description Hides a submenu after the number of milliseconds specified by +* the "submenuhidedelay" configuration property have ellapsed. +* @private +* @param {YAHOO.widget.Menu} p_oSubmenu Object specifying the submenu that +* should be hidden. +* @param {Number} p_nMouseX The x coordinate of the mouse when it left +* the specified submenu's parent menu item. +* @param {Number} p_nHideDelay The number of milliseconds that should ellapse +* before the submenu is hidden. +*/ +_execSubmenuHideDelay: function(p_oSubmenu, p_nMouseX, p_nHideDelay) { + + var me = this; + + p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () { + + if(me._nCurrentMouseX > (p_nMouseX + 10)) { + + p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () { + + p_oSubmenu.hide(); + + }, p_nHideDelay); + + } + else { + + p_oSubmenu.hide(); + + } + + }, 50); + +}, + + + +// Protected methods + + +/** +* @method _disableScrollHeader +* @description Disables the header used for scrolling the body of the menu. +* @protected +*/ +_disableScrollHeader: function() { + + if(!this._bHeaderDisabled) { + + Dom.addClass(this.header, "topscrollbar_disabled"); + this._bHeaderDisabled = true; + + } + +}, + + +/** +* @method _disableScrollFooter +* @description Disables the footer used for scrolling the body of the menu. +* @protected +*/ +_disableScrollFooter: function() { + + if(!this._bFooterDisabled) { + + Dom.addClass(this.footer, "bottomscrollbar_disabled"); + this._bFooterDisabled = true; + + } + +}, + + +/** +* @method _enableScrollHeader +* @description Enables the header used for scrolling the body of the menu. +* @protected +*/ +_enableScrollHeader: function() { + + if(this._bHeaderDisabled) { + + Dom.removeClass(this.header, "topscrollbar_disabled"); + this._bHeaderDisabled = false; + + } + +}, + + +/** +* @method _enableScrollFooter +* @description Enables the footer used for scrolling the body of the menu. +* @protected +*/ +_enableScrollFooter: function() { + + if(this._bFooterDisabled) { + + Dom.removeClass(this.footer, "bottomscrollbar_disabled"); + this._bFooterDisabled = false; + + } + +}, + + +/** +* @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) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oTarget = Event.getTarget(oEvent); + + + if( + !this._bHandledMouseOverEvent && + (oTarget == this.element || Dom.isAncestor(this.element, oTarget)) + ) { + + // Menu mouseover logic + + this._nCurrentMouseX = 0; + + Event.on( + this.element, + "mousemove", + this._onMouseMove, + this, + true + ); + + + this.clearActiveItem(); + + + if(this.parent && this._nSubmenuHideDelayId) { + + window.clearTimeout(this._nSubmenuHideDelayId); + + this.parent.cfg.setProperty("selected", true); + + var oParentMenu = this.parent.parent; + + oParentMenu._bHandledMouseOutEvent = true; + oParentMenu._bHandledMouseOverEvent = false; + + } + + + this._bHandledMouseOverEvent = true; + this._bHandledMouseOutEvent = false; + + } + + + if( + oItem && !oItem.handledMouseOverEvent && + !oItem.cfg.getProperty("disabled") && + (oTarget == oItem.element || Dom.isAncestor(oItem.element, oTarget)) + ) { + + // Menu Item mouseover logic + + var nShowDelay = this.cfg.getProperty("showdelay"), + bShowDelay = (nShowDelay > 0); + + + if(bShowDelay) { + + this._cancelShowDelay(); + + } + + + var oActiveItem = this.activeItem; + + if(oActiveItem) { + + oActiveItem.cfg.setProperty("selected", false); + + } + + + var oItemCfg = oItem.cfg; + + // Select and focus the current menu item + + oItemCfg.setProperty("selected", true); + + + if (this.hasFocus()) { + + oItem.focus(); + + } + + + if(this.cfg.getProperty("autosubmenudisplay")) { + + // Show the submenu this menu item + + var oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(bShowDelay) { + + 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) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oRelatedTarget = Event.getRelatedTarget(oEvent), + bMovingToSubmenu = false; + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + 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 + ) + ) { + + // Menu Item mouseout logic + + if(!bMovingToSubmenu) { + + oItem.cfg.setProperty("selected", false); + + + if(oSubmenu) { + + var nSubmenuHideDelay = + this.cfg.getProperty("submenuhidedelay"), + + nShowDelay = this.cfg.getProperty("showdelay"); + + if( + !(this instanceof YAHOO.widget.MenuBar) && + nSubmenuHideDelay > 0 && + nShowDelay >= nSubmenuHideDelay + ) { + + this._execSubmenuHideDelay( + oSubmenu, + Event.getPageX(oEvent), + nSubmenuHideDelay + ); + + } + else { + + oSubmenu.hide(); + + } + + } + + } + + + oItem.handledMouseOutEvent = true; + oItem.handledMouseOverEvent = false; + + } + + } + + + if( + !this._bHandledMouseOutEvent && + ( + ( + oRelatedTarget != this.element && + !Dom.isAncestor(this.element, oRelatedTarget) + ) + || bMovingToSubmenu + ) + ) { + + // Menu mouseout logic + + Event.removeListener(this.element, "mousemove", this._onMouseMove); + + this._nCurrentMouseX = Event.getPageX(oEvent); + + this._bHandledMouseOutEvent = true; + this._bHandledMouseOverEvent = false; + + } + +}, + + +/** +* @method _onMouseMove +* @description "click" event handler for the menu. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onMouseMove: function(p_oEvent, p_oMenu) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + this._nCurrentMouseX = Event.getPageX(p_oEvent); + +}, + + +/** +* @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], + oItem = p_aArgs[1], + oTarget = Event.getTarget(oEvent); + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + 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(); + + oSubmenu.parent.focus(); + + } + else { + + this.clearActiveItem(); + + oItem.cfg.setProperty("selected", true); + + oSubmenu.show(); + + oSubmenu.setInitialFocus(); + + } + + } + else { + + var sURL = oItemCfg.getProperty("url"), + bCurrentPageURL = (sURL.substr((sURL.length-1),1) == "#"), + sTarget = oItemCfg.getProperty("target"), + bHasTarget = (sTarget && sTarget.length > 0); + + /* + Prevent the browser from following links + equal to "#" + */ + + if( + oTarget.tagName.toUpperCase() == "A" && + bCurrentPageURL && !bHasTarget + ) { + + Event.preventDefault(oEvent); + + oItem.focus(); + + } + + 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 if(oRoot.cfg.getProperty("clicktohide")) { + + 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], + oItem = p_aArgs[1], + me = this, + oSubmenu; + + + /* + This function is called to prevent a bug in Firefox. In Firefox, + moving a DOM element into a stationary mouse pointer will cause the + browser to fire mouse events. This can result in the menu mouse + event handlers being called uncessarily, especially when menus are + moved into a stationary mouse pointer as a result of a + key event handler. + */ + function stopMouseEventHandlers() { + + me._bStopMouseEventHandlers = true; + + window.setTimeout(function() { + + me._bStopMouseEventHandlers = false; + + }, 10); + + } + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + oParentItem = this.parent, + oRoot, + oNextItem; + + + switch(oEvent.keyCode) { + + case 38: // Up arrow + case 40: // Down arrow + + oNextItem = (oEvent.keyCode == 38) ? + oItem.getPreviousEnabledSibling() : + oItem.getNextEnabledSibling(); + + if(oNextItem) { + + this.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + oNextItem.focus(); + + + if(this.cfg.getProperty("maxheight") > 0) { + + var oBody = this.body; + + oBody.scrollTop = + + ( + oNextItem.element.offsetTop + + oNextItem.element.offsetHeight + ) - oBody.offsetHeight; + + + var nScrollTop = oBody.scrollTop, + nScrollTarget = + oBody.scrollHeight - oBody.offsetHeight; + + if(nScrollTop === 0) { + + this._disableScrollHeader(); + this._enableScrollFooter(); + + } + else if(nScrollTop == nScrollTarget) { + + this._enableScrollHeader(); + this._disableScrollFooter(); + + } + else { + + this._enableScrollHeader(); + this._enableScrollFooter(); + + } + + } + + } + + + Event.preventDefault(oEvent); + + stopMouseEventHandlers(); + + break; + + + case 39: // Right arrow + + oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(!oItemCfg.getProperty("selected")) { + + oItemCfg.setProperty("selected", true); + + } + + oSubmenu.show(); + oSubmenu.setInitialFocus(); + 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); + + stopMouseEventHandlers(); + + 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); + + stopMouseEventHandlers(); + + 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.blur(); + this.activeItem.cfg.setProperty("selected", false); + + } + + } + + + Event.preventDefault(oEvent); + + } + +}, + + +/** +* @method _onKeyPress +* @description "keypress" event handler for a Menu instance. +* @protected +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event +* was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance that fired the event. +*/ +_onKeyPress: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0]; + + + if(oEvent.keyCode == 40 || oEvent.keyCode == 38) { + + YAHOO.util.Event.preventDefault(oEvent); + + } + +}, + + +/** +* @method _onTextResize +* @description "textresize" 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. +*/ +_onTextResize: function(p_sType, p_aArgs, p_oMenu) { + + if(this.browser == "gecko" && !this._handleResize) { + + this._handleResize = true; + return; + + } + + + var oConfig = this.cfg; + + if(oConfig.getProperty("position") == "dynamic") { + + oConfig.setProperty("width", (this._getOffsetWidth() + "px")); + + } + +}, + + +/** +* @method _onScrollTargetMouseOver +* @description "mouseover" event handler for the menu's "header" and "footer" +* elements. Used to scroll the body of the menu up and down when the +* menu's "maxheight" configuration property is set to a value greater than 0. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onScrollTargetMouseOver: function(p_oEvent, p_oMenu) { + + this._cancelHideDelay(); + + var oTarget = Event.getTarget(p_oEvent), + oBody = this.body, + me = this, + nScrollTarget, + fnScrollFunction; + + + function scrollBodyDown() { + + var nScrollTop = oBody.scrollTop; + + + if(nScrollTop < nScrollTarget) { + + oBody.scrollTop = (nScrollTop + 1); + + me._enableScrollHeader(); + + } + else { + + oBody.scrollTop = nScrollTarget; + + window.clearInterval(me._nBodyScrollId); + + me._disableScrollFooter(); + + } + + } + + + function scrollBodyUp() { + + var nScrollTop = oBody.scrollTop; + + + if(nScrollTop > 0) { + + oBody.scrollTop = (nScrollTop - 1); + + me._enableScrollFooter(); + + } + else { + + oBody.scrollTop = 0; + + window.clearInterval(me._nBodyScrollId); + + me._disableScrollHeader(); + + } + + } + + + if(Dom.hasClass(oTarget, "hd")) { + + fnScrollFunction = scrollBodyUp; + + } + else { + + nScrollTarget = oBody.scrollHeight - oBody.offsetHeight; + + fnScrollFunction = scrollBodyDown; + + } + + + this._nBodyScrollId = window.setInterval(fnScrollFunction, 10); + +}, + + +/** +* @method _onScrollTargetMouseOut +* @description "mouseout" event handler for the menu's "header" and "footer" +* elements. Used to stop scrolling the body of the menu up and down when the +* menu's "maxheight" configuration property is set to a value greater than 0. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onScrollTargetMouseOut: function(p_oEvent, p_oMenu) { + + window.clearInterval(this._nBodyScrollId); + + this._cancelHideDelay(); + +}, + + + +// 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) { + + this.cfg.subscribeToConfigEvent("width", this._onWidthChange); + this.cfg.subscribeToConfigEvent("visible", this._onVisibleChange); + + 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 +* <ul>, <li> 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, + oEl = this.element, + nListElements = this._aListElements.length; + + + if(nListElements > 0) { + + var i = 0, + bFirstList = true, + oUL, + 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. +*/ +_onRender: function(p_sType, p_aArgs) { + + if ( + this.cfg.getProperty("position") == "dynamic" && + !this.cfg.getProperty("width") + ) { + + this._setWidth(); + + } + +}, + + +/** +* @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= nViewportHeight) { + + var nMaxHeight = this.cfg.getProperty("maxheight"); + + /* + Cache the original value for the "maxheight" configuration + property so that we can set it back when the menu is hidden. + */ + + this._nMaxHeight = nMaxHeight; + + this.cfg.setProperty("maxheight", (nViewportHeight - 20)); + + } + + + if(this.cfg.getProperty("maxheight") > 0) { + + var oBody = this.body; + + if(oBody.scrollTop > 0) { + + oBody.scrollTop = 0; + + } + + this._disableScrollHeader(); + this._enableScrollFooter(); + + } + + } + + +}, + + +/** +* @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) { + + var oParent = this.parent; + + if(oParent) { + + var oParentMenu = oParent.parent, + aParentAlignment = oParentMenu.cfg.getProperty("submenualignment"), + 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); + + + function disableAutoSubmenuDisplay(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.on(document, "mousedown", disableAutoSubmenuDisplay); + Event.on(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) { + + var oActiveItem = this.activeItem; + + if(oActiveItem) { + + var oConfig = oActiveItem.cfg; + + oConfig.setProperty("selected", false); + + var oSubmenu = oConfig.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.hide(); + + } + + } + + if (this == this.getRoot()) { + + this.blur(); + + } + +}, + + +/** +* @method _onHide +* @description "hide" 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. +*/ +_onHide: function(p_sType, p_aArgs, p_oMenu) { + + if(this._nMaxHeight != -1) { + + this.cfg.setProperty("maxheight", this._nMaxHeight); + + this._nMaxHeight = -1; + + } + +}, + + +/** +* @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], + oPropertyValue = p_aArgs[0][1]; + + switch(sPropertyName) { + + case "iframe": + case "constraintoviewport": + case "hidedelay": + case "showdelay": + case "submenuhidedelay": + case "clicktohide": + case "effect": + case "classname": + + 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) { + + var oParentMenu = p_oSubmenu.parent.parent, + + oConfig = { + + constraintoviewport: + oParentMenu.cfg.getProperty("constraintoviewport"), + + xy: [0,0], + + clicktohide: oParentMenu.cfg.getProperty("clicktohide"), + + effect: oParentMenu.cfg.getProperty("effect"), + + showdelay: oParentMenu.cfg.getProperty("showdelay"), + + hidedelay: oParentMenu.cfg.getProperty("hidedelay"), + + submenuhidedelay: oParentMenu.cfg.getProperty("submenuhidedelay"), + + classname: oParentMenu.cfg.getProperty("classname") + + }; + + + /* + 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) { + + var oLI = this.parent.element; + + if(this.element.parentNode == oLI) { + + this.render(); + + } + else { + + this.render(oLI); + + } + + } + +}, + + +/** +* @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, + aAlignment = oParent.parent.cfg.getProperty("submenualignment"); + + this.cfg.setProperty( + "context", + [oParent.element, aAlignment[0], aAlignment[1]] + ); + + + var nScrollTop = oParent.parent.body.scrollTop; + + if( + (this.browser == "gecko" || this.browser == "safari") + && nScrollTop > 0 + ) { + + this.cfg.setProperty("y", (this.cfg.getProperty("y") - nScrollTop)); + + } + +}, + + +/** +* @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. +*/ +_onSubmenuShow: function(p_sType, p_aArgs) { + + this.submenuIndicator.firstChild.nodeValue = + this.EXPANDED_SUBMENU_INDICATOR_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. +*/ +_onSubmenuHide: function(p_sType, p_aArgs) { + + this.submenuIndicator.firstChild.nodeValue = + this.COLLAPSED_SUBMENU_INDICATOR_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. +*/ +_onMenuItemFocus: function(p_sType, p_aArgs) { + + this.parent.focusEvent.fire(this); + +}, + + +/** +* @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.parent.blurEvent.fire(this); + +}, + + +/** +* @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 sPropertyName = p_aArgs[0][0], + oPropertyValue = p_aArgs[0][1]; + + switch(sPropertyName) { + + case "selected": + + if (oPropertyValue === true) { + + this.activeItem = p_oItem; + + } + + break; + + 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) { + + if(this.parent && !(this.parent.parent instanceof YAHOO.widget.MenuBar)) { + + var oConfig = this.cfg, + pos = args[0], + + x = pos[0], + y = pos[1], + + offsetHeight = this.element.offsetHeight, + offsetWidth = this.element.offsetWidth, + + viewPortWidth = YAHOO.util.Dom.getViewportWidth(), + viewPortHeight = YAHOO.util.Dom.getViewportHeight(), + + scrollX = Math.max( + document.documentElement.scrollLeft, + document.body.scrollLeft + ), + + scrollY = Math.max( + document.documentElement.scrollTop, + document.body.scrollTop + ), + + nPadding = ( + this.parent && + this.parent.parent instanceof YAHOO.widget.MenuBar + ) ? 0 : 10, + + topConstraint = scrollY + nPadding, + leftConstraint = scrollX + nPadding, + bottomConstraint = + scrollY + viewPortHeight - offsetHeight - nPadding, + rightConstraint = scrollX + viewPortWidth - offsetWidth - nPadding, + + aContext = oConfig.getProperty("context"), + 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); + oConfig.setProperty("xy", [x,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], + 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", + 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], + oMouseOutEvent = this.mouseOutEvent, + oMouseOverEvent = this.mouseOverEvent, + 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._bHideDelayEventHandlersAssigned) { + + oMouseOutEvent.subscribe(this._execHideDelay, this); + oMouseOverEvent.subscribe(this._cancelHideDelay, this, true); + oKeyDownEvent.subscribe(this._cancelHideDelay, this, true); + + this._bHideDelayEventHandlersAssigned = true; + + } + + } + else { + + oMouseOutEvent.unsubscribe(this._execHideDelay, this); + oMouseOverEvent.unsubscribe(this._cancelHideDelay, this); + oKeyDownEvent.unsubscribe(this._cancelHideDelay, this); + + this._bHideDelayEventHandlersAssigned = 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 + ); + + } + +}, + + +/** +* @method _setMaxHeight +* @description "renderEvent" handler used to defer the setting of the +* "maxheight" configuration property until the menu is rendered in lazy +* load scenarios. +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event +* was fired. +* @param {Number} p_nMaxHeight Number representing the value to set for the +* "maxheight" configuration property. +* @private +*/ +_setMaxHeight: function(p_sType, p_aArgs, p_nMaxHeight) { + + this.cfg.setProperty("maxheight", p_nMaxHeight); + this.renderEvent.unsubscribe(this._setMaxHeight); + +}, + + +/** +* @method configMaxHeight +* @description Event handler for when the "maxheight" configuration property of +* a Menu changes. +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event +* was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance fired +* the event. +*/ +configMaxHeight: function(p_sType, p_aArgs, p_oMenu) { + + var nMaxHeight = p_aArgs[0], + oBody = this.body; + + + if(this.lazyLoad && !oBody) { + + this.renderEvent.unsubscribe(this._setMaxHeight); + + if(nMaxHeight > 0) { + + this.renderEvent.subscribe(this._setMaxHeight, nMaxHeight, this); + + } + + return; + + } + + Dom.setStyle(oBody, "height", "auto"); + Dom.setStyle(oBody, "overflow", "visible"); + + var oHeader = this.header, + oFooter = this.footer, + fnMouseOver = this._onScrollTargetMouseOver, + fnMouseOut = this._onScrollTargetMouseOut; + + + if((nMaxHeight > 0) && (oBody.offsetHeight > nMaxHeight)) { + + if(!this.cfg.getProperty("width")) { + + this._setWidth(); + + } + + if(!oHeader && !oFooter) { + + this.setHeader(" "); + this.setFooter(" "); + + oHeader = this.header; + oFooter = this.footer; + + Dom.addClass(oHeader, "topscrollbar"); + Dom.addClass(oFooter, "bottomscrollbar"); + + this.element.insertBefore(oHeader, oBody); + this.element.appendChild(oFooter); + + Event.on(oHeader, "mouseover", fnMouseOver, this, true); + Event.on(oHeader, "mouseout", fnMouseOut, this, true); + Event.on(oFooter, "mouseover", fnMouseOver, this, true); + Event.on(oFooter, "mouseout", fnMouseOut, this, true); + + } + + var nHeight = + + ( + nMaxHeight - + (this.footer.offsetHeight + this.header.offsetHeight) + ); + + Dom.setStyle(oBody, "height", (nHeight + "px")); + Dom.setStyle(oBody, "overflow", "hidden"); + + } + else if(oHeader && oFooter) { + + Dom.setStyle(oBody, "height", "auto"); + Dom.setStyle(oBody, "overflow", "visible"); + + Event.removeListener(oHeader, "mouseover", fnMouseOver); + Event.removeListener(oHeader, "mouseout", fnMouseOut); + Event.removeListener(oFooter, "mouseover", fnMouseOver); + Event.removeListener(oFooter, "mouseout", fnMouseOut); + + this.element.removeChild(oHeader); + this.element.removeChild(oFooter); + + this.header = null; + this.footer = null; + + } + +}, + + +/** +* @method configClassName +* @description Event handler for when the "classname" configuration property of +* a menu changes. +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance fired the event. +*/ +configClassName: function(p_sType, p_aArgs, p_oMenu) { + + var sClassName = p_aArgs[0]; + + if(this._sClassName) { + + Dom.removeClass(this.element, this._sClassName); + + } + + Dom.addClass(this.element, sClassName); + this._sClassName = sClassName; + +}, + + + +// Public methods + + + +/** +* @method initEvents +* @description Initializes the custom events for the menu. +*/ +initEvents: function() { + + YAHOO.widget.Menu.superclass.initEvents.call(this); + + // Create custom events + + var EVENT_TYPES = YAHOO.widget.Menu._EVENT_TYPES; + + this.mouseOverEvent = new CustomEvent(EVENT_TYPES.MOUSE_OVER, this); + this.mouseOutEvent = new CustomEvent(EVENT_TYPES.MOUSE_OUT, this); + this.mouseDownEvent = new CustomEvent(EVENT_TYPES.MOUSE_DOWN, this); + this.mouseUpEvent = new CustomEvent(EVENT_TYPES.MOUSE_UP, this); + this.clickEvent = new CustomEvent(EVENT_TYPES.CLICK, this); + this.keyPressEvent = new CustomEvent(EVENT_TYPES.KEY_PRESS, this); + this.keyDownEvent = new CustomEvent(EVENT_TYPES.KEY_DOWN, this); + this.keyUpEvent = new CustomEvent(EVENT_TYPES.KEY_UP, this); + this.focusEvent = new CustomEvent(EVENT_TYPES.FOCUS, this); + this.blurEvent = new CustomEvent(EVENT_TYPES.BLUR, this); + this.itemAddedEvent = new CustomEvent(EVENT_TYPES.ITEM_ADDED, this); + this.itemRemovedEvent = new CustomEvent(EVENT_TYPES.ITEM_REMOVED, 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() { + + var sReturnVal = "Menu", + sId = this.id; + + if(sId) { + + sReturnVal += (" " + sId); + + } + + return sReturnVal; + +}, + + +/** +* @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, + 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, + 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) { + + if(Lang.isArray(p_aItems)) { + + var nItems = p_aItems.length, + aItems = [], + oItem; + + + for(var i=0; i 0) { + + var i = nItems - 1, + oItem, + oSubmenu; + + do { + + oItem = aItems[i]; + + if(oItem) { + + oSubmenu = oItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + this.cfg.configChangedEvent.unsubscribe( + this._onParentMenuConfigChange, + oSubmenu + ); + + this.renderEvent.unsubscribe( + this._onParentMenuRender, + oSubmenu + ); + + } + + oItem.destroy(); + + } + + } + while(i--); + + } + + + if(oHeader) { + + Event.purgeElement(oHeader); + oElement.removeChild(oHeader); + + } + + + if(oFooter) { + + Event.purgeElement(oFooter); + oElement.removeChild(oFooter); + } + + + if(oBody) { + + Event.purgeElement(oBody); + + oBody.innerHTML = ""; + + } + + + this._aItemGroups = []; + this._aListElements = []; + this._aGroupTitleElements = []; + + this.cfg.setProperty("width", null); + +}, + + +/** +* @method destroy +* @description Removes the menu's <div> element +* (and accompanying child nodes) from the document. +*/ +destroy: function() { + + // Remove all DOM event listeners + + Event.purgeElement(this.element); + + + // 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(); + this.focusEvent.unsubscribeAll(); + this.blurEvent.unsubscribeAll(); + this.itemAddedEvent.unsubscribeAll(); + this.itemRemovedEvent.unsubscribeAll(); + this.cfg.unsubscribeFromConfigEvent("width", this._onWidthChange); + this.cfg.unsubscribeFromConfigEvent("visible", this._onVisibleChange); + + if (this._hasSetWidthHandlers) { + + this.itemAddedEvent.unsubscribe(this._setWidth); + this.itemRemovedEvent.unsubscribe(this._setWidth); + + this._hasSetWidthHandlers = false; + + } + + YAHOO.widget.Module.textResizeEvent.unsubscribe(this._onTextResize, this); + + + // Remove all items + + this.clearContent(); + + + this._aItemGroups = null; + this._aListElements = null; + this._aGroupTitleElements = null; + + + // 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; + + if(p_bBlur) { + + oActiveItem.blur(); + + } + + oConfig.setProperty("selected", false); + + var oSubmenu = oConfig.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.hide(); + + } + + this.activeItem = null; + + } + +}, + + +/** +* @method focus +* @description Causes the menu to receive focus and fires the "focus" event. +*/ +focus: function() { + + if (!this.hasFocus()) { + + this.setInitialFocus(); + + } + +}, + + +/** +* @method blur +* @description Causes the menu to lose focus and fires the "blur" event. +*/ +blur: function() { + + if (this.hasFocus()) { + + var oItem = YAHOO.widget.MenuManager.getFocusedMenuItem(); + + if (oItem) { + + oItem.blur(); + + } + + } + +}, + + +/** +* @method hasFocus +* @description Returns a boolean indicating whether or not the menu has focus. +* @return {Boolean} +*/ +hasFocus: function() { + + return (YAHOO.widget.MenuManager.getFocusedMenu() == this.getRoot()); + +}, + + +/** +* @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, + DEFAULT_CONFIG = YAHOO.widget.Menu._DEFAULT_CONFIG; + + // Add configuration attributes + + /* + Change the default value for the "visible" configuration + property to "false" by re-adding the property. + */ + + /** + * @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 <div> + * 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 + * <div> element's "display" style property + * between "block" (true) or "none" (false). + * @default false + * @type Boolean + */ + oConfig.addProperty( + DEFAULT_CONFIG.VISIBLE.key, + { + handler: this.configVisible, + value: DEFAULT_CONFIG.VISIBLE.value, + validator: DEFAULT_CONFIG.VISIBLE.validator + } + ); + + + /* + Change the default value for the "constraintoviewport" configuration + property to "true" by re-adding the property. + */ + + /** + * @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( + DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.key, + { + handler: this.configConstrainToViewport, + value: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.value, + validator: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.validator, + supercedes: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.supercedes + } + ); + + + /** + * @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( + DEFAULT_CONFIG.POSITION.key, + { + handler: this.configPosition, + value: DEFAULT_CONFIG.POSITION.value, + validator: DEFAULT_CONFIG.POSITION.validator, + supercedes: DEFAULT_CONFIG.POSITION.supercedes + } + ); + + + /** + * @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( + DEFAULT_CONFIG.SUBMENU_ALIGNMENT.key, + { + value: DEFAULT_CONFIG.SUBMENU_ALIGNMENT.value + } + ); + + + /** + * @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( + DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.key, + { + value: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.value, + validator: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.validator + } + ); + + + /** + * @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 250 + * @type Number + */ + oConfig.addProperty( + DEFAULT_CONFIG.SHOW_DELAY.key, + { + value: DEFAULT_CONFIG.SHOW_DELAY.value, + validator: DEFAULT_CONFIG.SHOW_DELAY.validator + } + ); + + + /** + * @config hidedelay + * @description Number indicating the time (in milliseconds) that should + * expire before the menu is hidden. + * @default 0 + * @type Number + */ + oConfig.addProperty( + DEFAULT_CONFIG.HIDE_DELAY.key, + { + handler: this.configHideDelay, + value: DEFAULT_CONFIG.HIDE_DELAY.value, + validator: DEFAULT_CONFIG.HIDE_DELAY.validator, + suppressEvent: DEFAULT_CONFIG.HIDE_DELAY.suppressEvent + } + ); + + + /** + * @config submenuhidedelay + * @description Number indicating the time (in milliseconds) that should + * expire before a submenu is hidden when the user mouses out of a menu item + * heading in the direction of a submenu. The value must be greater than or + * equal to the value specified for the "showdelay" configuration property. + * @default 250 + * @type Number + */ + oConfig.addProperty( + DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.key, + { + value: DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.value, + validator: DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.validator + } + ); + + + /** + * @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( + DEFAULT_CONFIG.CLICK_TO_HIDE.key, + { + value: DEFAULT_CONFIG.CLICK_TO_HIDE.value, + validator: DEFAULT_CONFIG.CLICK_TO_HIDE.validator + } + ); + + + /** + * @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 HTMLElement|String + * @default document.body + */ + oConfig.addProperty( + DEFAULT_CONFIG.CONTAINER.key, + { + handler: this.configContainer, + value: document.body + } + ); + + + /** + * @config maxheight + * @description Defines the maximum height (in pixels) for a menu before the + * contents of the body are scrolled. + * @default 0 + * @type Number + */ + oConfig.addProperty( + DEFAULT_CONFIG.MAX_HEIGHT.key, + { + handler: this.configMaxHeight, + value: DEFAULT_CONFIG.MAX_HEIGHT.value, + validator: DEFAULT_CONFIG.MAX_HEIGHT.validator + } + ); + + + /** + * @config classname + * @description CSS class to be applied to the menu's root + * <div> element. The specified class(es) are + * appended in addition to the default class as specified by the menu's + * CSS_CLASS_NAME constant. + * @default null + * @type String + */ + oConfig.addProperty( + DEFAULT_CONFIG.CLASS_NAME.key, + { + handler: this.configClassName, + value: DEFAULT_CONFIG.CLASS_NAME.value, + validator: DEFAULT_CONFIG.CLASS_NAME.validator + } + ); + +} + +}); // END YAHOO.lang.extend + +})(); + + + +(function() { + +var Dom = YAHOO.util.Dom, + Module = YAHOO.widget.Module, + Menu = YAHOO.widget.Menu, + CustomEvent = YAHOO.util.CustomEvent, + Lang = YAHOO.lang; + +/** +* Creates an item for a menu. +* +* @param {String} p_oObject String specifying the text of the menu item. +* @param {HTMLLIElement} p_oObject Object specifying +* the <li> element of the menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu item. +* @param {HTMLOptionElement} p_oObject Object +* specifying the <option> 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.id = p_oConfig.id; + + } + + this.init(p_oObject, p_oConfig); + + } + +}; + + +/** +* Constant representing the name of the MenuItem's events +* @property YAHOO.widget.MenuItem._EVENT_TYPES +* @private +* @final +* @type Object +*/ +YAHOO.widget.MenuItem._EVENT_TYPES = { + + "MOUSE_OVER": "mouseover", + "MOUSE_OUT": "mouseout", + "MOUSE_DOWN": "mousedown", + "MOUSE_UP": "mouseup", + "CLICK": "click", + "KEY_PRESS": "keypress", + "KEY_DOWN": "keydown", + "KEY_UP": "keyup", + "ITEM_ADDED": "itemAdded", + "ITEM_REMOVED": "itemRemoved", + "FOCUS": "focus", + "BLUR": "blur", + "DESTROY": "destroy" + +}; + + +/** +* Constant representing the MenuItem's configuration properties +* @property YAHOO.widget.MenuItem._DEFAULT_CONFIG +* @private +* @final +* @type Object +*/ +YAHOO.widget.MenuItem._DEFAULT_CONFIG = { + + "TEXT": { + key: "text", + value: "", + validator: Lang.isString, + suppressEvent: true + }, + + "HELP_TEXT": { + key: "helptext" + }, + + "URL": { + key: "url", + value: "#", + suppressEvent: true + }, + + "TARGET": { + key: "target", + suppressEvent: true + }, + + "EMPHASIS": { + key: "emphasis", + value: false, + validator: Lang.isBoolean, + suppressEvent: true + }, + + "STRONG_EMPHASIS": { + key: "strongemphasis", + value: false, + validator: Lang.isBoolean, + suppressEvent: true + }, + + "CHECKED": { + key: "checked", + value: false, + validator: Lang.isBoolean, + suppressEvent: true, + supercedes:["disabled"] + }, + + "DISABLED": { + key: "disabled", + value: false, + validator: Lang.isBoolean, + suppressEvent: true + }, + + "SELECTED": { + key: "selected", + value: false, + validator: Lang.isBoolean, + suppressEvent: true + }, + + "SUBMENU": { + key: "submenu" + }, + + "ONCLICK": { + key: "onclick" + }, + + "CLASS_NAME": { + key: "classname", + value: null, + validator: Lang.isString + } + +}; + + +YAHOO.widget.MenuItem.prototype = { + + // Constants + + + /** + * @property COLLAPSED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the <em> + * element used for the submenu arrow indicator. + * @default "Submenu collapsed. Click to expand submenu." + * @final + * @type String + */ + COLLAPSED_SUBMENU_INDICATOR_TEXT: + "Submenu collapsed. Click to expand submenu.", + + + /** + * @property EXPANDED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the submenu arrow indicator + * element (<em>) when the submenu is visible. + * @default "Submenu expanded. Click to collapse submenu." + * @final + * @type String + */ + EXPANDED_SUBMENU_INDICATOR_TEXT: + "Submenu expanded. Click to collapse submenu.", + + + /** + * @property DISABLED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the submenu arrow indicator + * element (<em>) when the menu item is disabled. + * @default "Submenu collapsed. (Item disabled.)." + * @final + * @type String + */ + DISABLED_SUBMENU_INDICATOR_TEXT: "Submenu collapsed. (Item disabled.)", + + + /** + * @property CHECKED_TEXT + * @description String representing the text to be used for the checked + * indicator element (<em>). + * @default "Checked." + * @final + * @type String + */ + CHECKED_TEXT: "Menu item checked.", + + + /** + * @property DISABLED_CHECKED_TEXT + * @description String representing the text to be used for the checked + * indicator element (<em>) when the menu item + * is disabled. + * @default "Checked. (Item disabled.)" + * @final + * @type String + */ + DISABLED_CHECKED_TEXT: "Checked. (Item disabled.)", + + + /** + * @property CSS_CLASS_NAME + * @description String representing the CSS class(es) to be applied to the + * <li> 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, + + + + // Private member variables + + + /** + * @property _oAnchor + * @description Object reference to the menu item's + * <a> element. + * @default null + * @private + * @type HTMLAnchorElement + */ + _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 + * <em> element. + * @default null + * @private + * @type HTMLElement + */ + _oHelpTextEM: null, + + + /** + * @property _oSubmenu + * @description Object reference to the menu item's submenu. + * @default null + * @private + * @type YAHOO.widget.Menu + */ + _oSubmenu: null, + + + /** + * @property _oCheckedIndicator + * @description Object reference to the menu item's checkmark image. + * @default HTMLElement + * @private + * @type HTMLElement + */ + _oCheckedIndicator: null, + + + /** + * @property _oOnclickAttributeValue + * @description Object reference to the menu item's current value for the + * "onclick" configuration attribute. + * @default null + * @private + * @type Object + */ + _oOnclickAttributeValue: null, + + + /** + * @property _sClassName + * @description The current value of the "classname" configuration attribute. + * @default null + * @private + * @type String + */ + _sClassName: 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 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 + * <li> element. + * @default HTMLLIElement + * @type HTMLLIElement + */ + element: null, + + + /** + * @property srcElement + * @description Object reference to the HTML element (either + * <li>, <optgroup> or + * <option>) used create the menu item. + * @default HTMLLIElement|HTMLOptGroupElement|HTMLOptionElement + * @type HTMLLIElement| + * HTMLOptGroupElement|HTMLOptionElement + */ + 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 <em> element + * used to create the submenu indicator for the menu item. + * @default HTMLElement + * @type HTMLElement + */ + submenuIndicator: null, + + + /** + * @property browser + * @description String representing the browser. + * @type String + */ + browser: Module.prototype.browser, + + + /** + * @property id + * @description Id of the menu item's root <li> + * element. This property should be set via the constructor using the + * configuration object literal. If an id is not specified, then one will + * be created using the "generateId" method of the Dom utility. + * @default null + * @type String + */ + id: null, + + + + // Events + + + /** + * @event destroyEvent + * @description Fires when the menu item's <li> + * element is removed from its parent <ul> 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 {HTMLLIElement} p_oObject Object specifying + * the <li> element of the menu item. + * @param {HTMLOptGroupElement} p_oObject Object + * specifying the <optgroup> element of the menu item. + * @param {HTMLOptionElement} p_oObject Object + * specifying the <option> 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) { + + + 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(Lang.isString(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"), + sURL = "#", + sTarget, + sText; + + + // 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), + bEmphasis = false, + 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) { + + var sId = this.element.id; + + if(!sId) { + + sId = this.id || Dom.generateId(); + + this.element.id = sId; + + } + + this.id = sId; + + + Dom.addClass(this.element, this.CSS_CLASS_NAME); + + + // Create custom events + + var EVENT_TYPES = YAHOO.widget.MenuItem._EVENT_TYPES; + + this.mouseOverEvent = new CustomEvent(EVENT_TYPES.MOUSE_OVER, this); + this.mouseOutEvent = new CustomEvent(EVENT_TYPES.MOUSE_OUT, this); + this.mouseDownEvent = new CustomEvent(EVENT_TYPES.MOUSE_DOWN, this); + this.mouseUpEvent = new CustomEvent(EVENT_TYPES.MOUSE_UP, this); + this.clickEvent = new CustomEvent(EVENT_TYPES.CLICK, this); + this.keyPressEvent = new CustomEvent(EVENT_TYPES.KEY_PRESS, this); + this.keyDownEvent = new CustomEvent(EVENT_TYPES.KEY_DOWN, this); + this.keyUpEvent = new CustomEvent(EVENT_TYPES.KEY_UP, this); + this.focusEvent = new CustomEvent(EVENT_TYPES.FOCUS, this); + this.blurEvent = new CustomEvent(EVENT_TYPES.BLUR, this); + this.destroyEvent = new CustomEvent(EVENT_TYPES.DESTROY, 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 {HTMLElement} 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 {HTMLElement} + */ + _getFirstElement: function(p_oElement, p_sTagName) { + + var oFirstChild = p_oElement.firstChild, + oElement; + + if(oFirstChild) { + + if(oFirstChild.nodeType == 1) { + + oElement = oFirstChild; + + } + else { + + var oNextSibling = oFirstChild.nextSibling; + + if(oNextSibling && oNextSibling.nodeType == 1) { + + oElement = oNextSibling; + + } + + } + + } + + + if(p_sTagName) { + + return (oElement && oElement.tagName.toUpperCase() == p_sTagName) ? + oElement : false; + + } + + return oElement; + + }, + + + /** + * @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 () { + + var oTemplate = YAHOO.widget.MenuItem._MenuItemTemplate; + + if(!oTemplate) { + + oTemplate = document.createElement("li"); + oTemplate.innerHTML = "s"; + + YAHOO.widget.MenuItem._MenuItemTemplate = oTemplate; + + } + + this.element = oTemplate.cloneNode(true); + this._oAnchor = this.element.firstChild; + this._oText = this._oAnchor.firstChild; + + 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, + 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, + 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 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], + oAnchor = this._oAnchor, + oText = this._oText, + oConfig = this.cfg, + 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"); + + if(oEM) { + + 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], + oAnchor = this._oAnchor, + oText = this._oText, + oConfig = this.cfg, + 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"); + + if(oStrong) { + + 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], + oEl = this.element, + oConfig = this.cfg, + oEM; + + + if(bChecked) { + + var oTemplate = YAHOO.widget.MenuItem._CheckedIndicatorTemplate; + + if(!oTemplate) { + + oTemplate = document.createElement("em"); + oTemplate.innerHTML = this.CHECKED_TEXT; + oTemplate.className = "checkedindicator"; + + YAHOO.widget.MenuItem._CheckedIndicatorTemplate = oTemplate; + + } + + oEM = oTemplate.cloneNode(true); + + var oSubmenu = this.cfg.getProperty("submenu"); + + if(oSubmenu && oSubmenu.element) { + + oEl.insertBefore(oEM, oSubmenu.element); + + } + else { + + oEl.appendChild(oEM); + + } + + + Dom.addClass(oEl, "checked"); + + this._oCheckedIndicator = oEM; + + if(oConfig.getProperty("disabled")) { + + oConfig.refireEvent("disabled"); + + } + + if(oConfig.getProperty("selected")) { + + oConfig.refireEvent("selected"); + + } + + } + else { + + oEM = this._oCheckedIndicator; + + Dom.removeClass(oEl, "checked"); + + if(oEM) { + + oEl.removeChild(oEM); + + } + + this._oCheckedIndicator = 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], + oConfig = this.cfg, + oAnchor = this._oAnchor, + aNodes = [this.element, oAnchor], + oHelpText = this._oHelpTextEM, + oCheckedIndicator = this._oCheckedIndicator, + oSubmenuIndicator = this.submenuIndicator, + i = 1; + + + if(oHelpText) { + + i++; + aNodes[i] = oHelpText; + + } + + + if(oCheckedIndicator) { + + oCheckedIndicator.firstChild.nodeValue = bDisabled ? + this.DISABLED_CHECKED_TEXT : + this.CHECKED_TEXT; + + i++; + aNodes[i] = oCheckedIndicator; + + } + + + if(oSubmenuIndicator) { + + oSubmenuIndicator.firstChild.nodeValue = bDisabled ? + this.DISABLED_SUBMENU_INDICATOR_TEXT : + this.COLLAPSED_SUBMENU_INDICATOR_TEXT; + + i++; + aNodes[i] = oSubmenuIndicator; + + } + + + if(bDisabled) { + + if(oConfig.getProperty("selected")) { + + oConfig.setProperty("selected", false); + + } + + oAnchor.removeAttribute("href"); + + Dom.addClass(aNodes, "disabled"); + + } + else { + + oAnchor.setAttribute("href", oConfig.getProperty("url")); + + Dom.removeClass(aNodes, "disabled"); + + } + + }, + + + /** + * @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], + oHelpText = this._oHelpTextEM, + oSubmenuIndicator = this.submenuIndicator, + oCheckedIndicator = this._oCheckedIndicator, + aNodes = [this.element, this._oAnchor], + i = 1; + + + if(oHelpText) { + + i++; + aNodes[i] = oHelpText; + + } + + + if(oSubmenuIndicator) { + + i++; + aNodes[i] = oSubmenuIndicator; + + } + + + if(oCheckedIndicator) { + + i++; + aNodes[i] = oCheckedIndicator; + + } + + + if(bSelected) { + + Dom.addClass(aNodes, "selected"); + + } + else { + + Dom.removeClass(aNodes, "selected"); + + } + + } + + }, + + + /** + * @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, + oSubmenu = p_aArgs[0], + oSubmenuIndicator = this.submenuIndicator, + oConfig = this.cfg, + aNodes = [this.element, this._oAnchor], + bLazyLoad = this.parent && this.parent.lazyLoad, + oMenu; + + + 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, + oSubmenuConfig = oSubmenu; + + 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(!oSubmenuIndicator) { + + var oTemplate = + YAHOO.widget.MenuItem._oSubmenuIndicatorTemplate; + + if(!oTemplate) { + + oTemplate = document.createElement("em"); + oTemplate.innerHTML = + this.COLLAPSED_SUBMENU_INDICATOR_TEXT; + oTemplate.className = "submenuindicator"; + + YAHOO.widget.MenuItem._oSubmenuIndicatorTemplate = + oTemplate; + + } + + + oSubmenuIndicator = oTemplate.cloneNode(true); + + + if(oMenu.element.parentNode == oEl) { + + if(this.browser == "opera") { + + oEl.appendChild(oSubmenuIndicator); + + oMenu.renderEvent.subscribe(function() { + + oSubmenuIndicator.parentNode.insertBefore( + oSubmenuIndicator, + oMenu.element + ); + + }); + + } + else { + + oEl.insertBefore(oSubmenuIndicator, oMenu.element); + + } + + } + else { + + oEl.appendChild(oSubmenuIndicator); + + } + + this.submenuIndicator = oSubmenuIndicator; + + } + + + Dom.addClass(aNodes, "hassubmenu"); + + + if(oConfig.getProperty("disabled")) { + + oConfig.refireEvent("disabled"); + + } + + if(oConfig.getProperty("selected")) { + + oConfig.refireEvent("selected"); + + } + + } + + } + else { + + Dom.removeClass(aNodes, "hassubmenu"); + + if(oSubmenuIndicator) { + + oEl.removeChild(oSubmenuIndicator); + + } + + if(this._oSubmenu) { + + this._oSubmenu.destroy(); + + } + + } + + }, + + + /** + * @method configOnClick + * @description Event handler for when the "onclick" 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. + */ + configOnClick: function(p_sType, p_aArgs, p_oItem) { + + var oObject = p_aArgs[0]; + + /* + Remove any existing listeners if a "click" event handler has + already been specified. + */ + + if( + this._oOnclickAttributeValue && + (this._oOnclickAttributeValue != oObject) + ) { + + this.clickEvent.unsubscribe( + this._oOnclickAttributeValue.fn, + this._oOnclickAttributeValue.obj + ); + + this._oOnclickAttributeValue = null; + + } + + + if( + !this._oOnclickAttributeValue && + typeof oObject == "object" && + typeof oObject.fn == "function" + ) { + + this.clickEvent.subscribe( + oObject.fn, + (oObject.obj || this), + oObject.scope + ); + + this._oOnclickAttributeValue = oObject; + + } + + }, + + + /** + * @method configClassName + * @description Event handler for when the "classname" configuration + * property of a 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. + */ + configClassName: function(p_sType, p_aArgs, p_oItem) { + + var sClassName = p_aArgs[0]; + + if(this._sClassName) { + + Dom.removeClass(this.element, this._sClassName); + + } + + Dom.addClass(this.element, sClassName); + this._sClassName = sClassName; + + }, + + + + // Public methods + + + /** + * @method initDefaultConfig + * @description Initializes an item's configurable properties. + */ + initDefaultConfig : function() { + + var oConfig = this.cfg, + DEFAULT_CONFIG = YAHOO.widget.MenuItem._DEFAULT_CONFIG; + + + // Define the configuration attributes + + /** + * @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( + DEFAULT_CONFIG.TEXT.key, + { + handler: this.configText, + value: DEFAULT_CONFIG.TEXT.value, + validator: DEFAULT_CONFIG.TEXT.validator, + suppressEvent: DEFAULT_CONFIG.TEXT.suppressEvent + } + ); + + + /** + * @config helptext + * @description String specifying additional instructional text to + * accompany the text for the nenu item. + * @default null + * @type String| + * HTMLElement + */ + oConfig.addProperty( + DEFAULT_CONFIG.HELP_TEXT.key, + { 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( + DEFAULT_CONFIG.URL.key, + { + handler: this.configURL, + value: DEFAULT_CONFIG.URL.value, + suppressEvent: DEFAULT_CONFIG.URL.suppressEvent + } + ); + + + /** + * @config target + * @description String specifying the value for the "target" attribute + * of the menu item's anchor element. 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. + * 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( + DEFAULT_CONFIG.TARGET.key, + { + handler: this.configTarget, + suppressEvent: DEFAULT_CONFIG.TARGET.suppressEvent + } + ); + + + /** + * @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( + DEFAULT_CONFIG.EMPHASIS.key, + { + handler: this.configEmphasis, + value: DEFAULT_CONFIG.EMPHASIS.value, + validator: DEFAULT_CONFIG.EMPHASIS.validator, + suppressEvent: DEFAULT_CONFIG.EMPHASIS.suppressEvent + } + ); + + + /** + * @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( + DEFAULT_CONFIG.STRONG_EMPHASIS.key, + { + handler: this.configStrongEmphasis, + value: DEFAULT_CONFIG.STRONG_EMPHASIS.value, + validator: DEFAULT_CONFIG.STRONG_EMPHASIS.validator, + suppressEvent: DEFAULT_CONFIG.STRONG_EMPHASIS.suppressEvent + } + ); + + + /** + * @config checked + * @description Boolean indicating if the menu item should be rendered + * with a checkmark. + * @default false + * @type Boolean + */ + oConfig.addProperty( + DEFAULT_CONFIG.CHECKED.key, + { + handler: this.configChecked, + value: DEFAULT_CONFIG.CHECKED.value, + validator: DEFAULT_CONFIG.CHECKED.validator, + suppressEvent: DEFAULT_CONFIG.CHECKED.suppressEvent, + supercedes: DEFAULT_CONFIG.CHECKED.supercedes + } + ); + + + /** + * @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( + DEFAULT_CONFIG.DISABLED.key, + { + handler: this.configDisabled, + value: DEFAULT_CONFIG.DISABLED.value, + validator: DEFAULT_CONFIG.DISABLED.validator, + suppressEvent: DEFAULT_CONFIG.DISABLED.suppressEvent + } + ); + + + /** + * @config selected + * @description Boolean indicating if the menu item should + * be highlighted. + * @default false + * @type Boolean + */ + oConfig.addProperty( + DEFAULT_CONFIG.SELECTED.key, + { + handler: this.configSelected, + value: DEFAULT_CONFIG.SELECTED.value, + validator: DEFAULT_CONFIG.SELECTED.validator, + suppressEvent: DEFAULT_CONFIG.SELECTED.suppressEvent + } + ); + + + /** + * @config submenu + * @description Object specifying the submenu to be appended to the + * menu item. The value can be one of the following:
          • Object + * specifying a Menu instance.
          • Object literal specifying the + * menu to be created. Format: { id: [menu id], itemdata: + * [array of values for + * items] }.
          • String specifying the id attribute + * of the <div> element of the menu.
          • + * Object specifying the <div> element of the + * menu.
          + * @default null + * @type Menu|String|Object| + * HTMLElement + */ + oConfig.addProperty( + DEFAULT_CONFIG.SUBMENU.key, + { handler: this.configSubmenu } + ); + + + /** + * @config onclick + * @description Object literal representing the code to be executed when + * the button is clicked. Format:
          {
          + * fn: Function, // The handler to call when + * the event fires.
          obj: Object, // An + * object to pass back to the handler.
          scope: + * Object // The object to use for the scope of the handler. + *
          }
          + * @type Object + * @default null + */ + oConfig.addProperty( + DEFAULT_CONFIG.ONCLICK.key, + { handler: this.configOnClick } + ); + + + /** + * @config classname + * @description CSS class to be applied to the menu item's root + * <li> element. The specified class(es) are + * appended in addition to the default class as specified by the menu + * item's CSS_CLASS_NAME constant. + * @default null + * @type String + */ + oConfig.addProperty( + DEFAULT_CONFIG.CLASS_NAME.key, + { + handler: this.configClassName, + value: DEFAULT_CONFIG.CLASS_NAME.value, + validator: DEFAULT_CONFIG.CLASS_NAME.validator + } + ); + + }, + + + /** + * @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; + + function getNextArrayItem(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] || + getNextArrayItem(p_aArray, (p_nStartIndex+1)); + + } + + + var aItemGroups = this.parent.getItemGroups(), + 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; + + function getPreviousArrayItem(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] || + getPreviousArrayItem(p_aArray, (p_nStartIndex-1)); + + } + + function getFirstItemIndex(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] ? + p_nStartIndex : + getFirstItemIndex(p_aArray, (p_nStartIndex+1)); + + } + + var aItemGroups = this.parent.getItemGroups(), + 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, + oAnchor = this._oAnchor, + oActiveItem = oParent.activeItem, + me = this; + + + function setFocus() { + + try { + + if ( + (me.browser == "ie" || me.browser == "ie7") && + !document.hasFocus() + ) { + + return; + + } + + oAnchor.focus(); + + } + catch(e) { + + } + + } + + + if( + !this.cfg.getProperty("disabled") && + oParent && + oParent.cfg.getProperty("visible") && + this.element.style.display != "none" + ) { + + if(oActiveItem) { + + oActiveItem.blur(); + + } + + + /* + Setting focus via a timer fixes a race condition in Firefox, IE + and Opera where the browser viewport jumps as it trys to + position and focus the menu. + */ + + window.setTimeout(setFocus, 0); + + this.focusEvent.fire(); + + } + + }, + + + /** + * @method blur + * @description Causes the menu item to lose focus and fires the + * blur 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 hasFocus + * @description Returns a boolean indicating whether or not the menu item + * has focus. + * @return {Boolean} + */ + hasFocus: function() { + + return (YAHOO.widget.MenuManager.getFocusedMenuItem() == this); + + }, + + + /** + * @method destroy + * @description Removes the menu item's <li> element + * from its parent <ul> element. + */ + destroy: function() { + + var oEl = this.element; + + if(oEl) { + + + // If the item has a submenu, destroy it first + + var oSubmenu = this.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.destroy(); + + } + + + // 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() { + + var sReturnVal = "MenuItem"; + + if(this.cfg && this.cfg.getProperty("text")) { + + sReturnVal += (": " + this.cfg.getProperty("text")); + + } + + return sReturnVal; + + } + +}; + +})(); + + + +/** +* 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 +* <div> element of the context menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* context menu. +* @param {HTMLDivElement} p_oElement Object specifying the +* <div> element of the context menu. +* @param {HTMLSelectElement} p_oElement Object specifying +* the <select> 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 + ); + +}; + + +/** +* Constant representing the name of the ContextMenu's events +* @property YAHOO.widget.ContextMenu._EVENT_TYPES +* @private +* @final +* @type Object +*/ +YAHOO.widget.ContextMenu._EVENT_TYPES = { + + "TRIGGER_CONTEXT_MENU": "triggerContextMenu", + + "CONTEXT_MENU": ( + (YAHOO.widget.Module.prototype.browser == "opera" ? + "mousedown" : "contextmenu") + ), + "CLICK": "click" + +}; + + +/** +* Constant representing the ContextMenu's configuration properties +* @property YAHOO.widget.ContextMenu._DEFAULT_CONFIG +* @private +* @final +* @type Object +*/ +YAHOO.widget.ContextMenu._DEFAULT_CONFIG = { + + "TRIGGER": { + key: "trigger" + } + +}; + + +YAHOO.lang.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|HTMLElement|Array +*/ +_oTrigger: null, + + +/** +* @property _bCancelled +* @description Boolean indicating if the display of the context menu should +* be cancelled. +* @default false +* @private +* @type Boolean +*/ +_bCancelled: false, + + + +// 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 HTMLElement +*/ +contextEventTarget: null, + + + +// Events + + +/** +* @event triggerContextMenuEvent +* @description Custom Event wrapper for the "contextmenu" DOM event +* ("mousedown" for Opera) fired by the element(s) that trigger the display of +* the context menu. +*/ +triggerContextMenuEvent: 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 +* <div> element of the context menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for +* the context menu. +* @param {HTMLDivElement} p_oElement Object specifying the +* <div> element of the context menu. +* @param {HTMLSelectElement} p_oElement Object specifying +* the <select> 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); + +}, + + +/** +* @method initEvents +* @description Initializes the custom events for the context menu. +*/ +initEvents: function() { + + YAHOO.widget.ContextMenu.superclass.initEvents.call(this); + + // Create custom events + + this.triggerContextMenuEvent = + + new YAHOO.util.CustomEvent( + YAHOO.widget.ContextMenu._EVENT_TYPES.TRIGGER_CONTEXT_MENU, + this + ); + +}, + + +/** +* @method cancel +* @description Cancels the display of the context menu. +*/ +cancel: function() { + + this._bCancelled = true; + +}, + + + +// 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, + oTrigger = this._oTrigger; + + + // Remove the event handlers from the trigger(s) + + if (oTrigger) { + + Event.removeListener( + oTrigger, + YAHOO.widget.ContextMenu._EVENT_TYPES.CONTEXT_MENU, + this._onTriggerContextMenu + ); + + if(this.browser == "opera") { + + Event.removeListener( + oTrigger, + YAHOO.widget.ContextMenu._EVENT_TYPES.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) { + + var Event = YAHOO.util.Event; + + if(p_oEvent.type == "mousedown" && !p_oEvent.ctrlKey) { + + return; + + } + + + /* + 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); + + + // Hide any other ContextMenu instances that might be visible + + YAHOO.widget.MenuManager.hideVisible(); + + + this.contextEventTarget = Event.getTarget(p_oEvent); + + this.triggerContextMenuEvent.fire(p_oEvent); + + + if(!this._bCancelled) { + + // Position and display the context menu + + this.cfg.setProperty("xy", Event.getXY(p_oEvent)); + + this.show(); + + } + + this._bCancelled = false; + +}, + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the context menu. +* @return {String} +*/ +toString: function() { + + var sReturnVal = "ContextMenu", + sId = this.id; + + if(sId) { + + sReturnVal += (" " + sId); + + } + + return sReturnVal; + +}, + + +/** +* @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|HTMLElement|Array + */ + this.cfg.addProperty( + YAHOO.widget.ContextMenu._DEFAULT_CONFIG.TRIGGER.key, + { handler: this.configTrigger } + ); + +}, + + +/** +* @method destroy +* @description Removes the context menu's <div> 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, + 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 + */ + + Event.on( + oTrigger, + YAHOO.widget.ContextMenu._EVENT_TYPES.CONTEXT_MENU, + this._onTriggerContextMenu, + this, + true + ); + + + /* + Assign a "click" event handler to the trigger element(s) for + Opera to prevent default browser behaviors. + */ + + if(this.browser == "opera") { + + Event.on( + oTrigger, + YAHOO.widget.ContextMenu._EVENT_TYPES.CLICK, + this._onTriggerClick, + this, + true + ); + + } + + } + else { + + this._removeEventHandlers(); + + } + +} + +}); // END YAHOO.lang.extend + + + +/** +* Creates an item for a context menu. +* +* @param {String} p_oObject String specifying the text of the context menu item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the context menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the context +* menu item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> 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.lang.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 {HTMLLIElement} p_oObject Object specifying the +* <li> element of the context menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the context +* menu item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> 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() { + + var sReturnVal = "ContextMenuItem"; + + if(this.cfg && this.cfg.getProperty("text")) { + + sReturnVal += (": " + this.cfg.getProperty("text")); + + } + + return sReturnVal; + +} + +}); // END YAHOO.lang.extend + + + +/** +* Horizontal collection of items, each of which can contain a submenu. +* +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu bar. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* menu bar. +* @param {HTMLDivElement} p_oElement Object specifying +* the <div> element of the menu bar. +* @param {HTMLSelectElement} p_oElement Object +* specifying the <select> 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 + ); + +}; + + +/** +* Constant representing the MenuBar's configuration properties +* @property YAHOO.widget.MenuBar._DEFAULT_CONFIG +* @private +* @final +* @type Object +*/ +YAHOO.widget.MenuBar._DEFAULT_CONFIG = { + + "POSITION": { + key: "position", + value: "static", + validator: YAHOO.widget.Menu._checkPosition, + supercedes: ["visible"] + }, + + "SUBMENU_ALIGNMENT": { + key: "submenualignment", + value: ["tl","bl"] + }, + + "AUTO_SUBMENU_DISPLAY": { + key: "autosubmenudisplay", + value: false, + validator: YAHOO.lang.isBoolean + } + +}; + + + +YAHOO.lang.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 +* <div> element of the menu bar. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* menu bar. +* @param {HTMLDivElement} p_oElement Object specifying +* the <div> element of the menu bar. +* @param {HTMLSelectElement} p_oElement Object +* specifying the <select> 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 <div> 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, + oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oSubmenu; + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg; + + switch(oEvent.keyCode) { + + 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(); + + } + + } + + 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; + + } + + } + + + if(oEvent.keyCode == 27 && this.activeItem) { // Esc key + + 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); + + } + +}, + + +/** +* @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 && !oItem.cfg.getProperty("disabled")) { + + var Event = YAHOO.util.Event, + Dom = YAHOO.util.Dom, + + oEvent = p_aArgs[0], + oTarget = Event.getTarget(oEvent), + + oActiveItem = this.activeItem, + oConfig = this.cfg; + + + // Hide any other submenus that might be visible + + if(oActiveItem && oActiveItem != oItem) { + + this.clearActiveItem(); + + } + + + oItem.cfg.setProperty("selected", true); + + + // 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() { + + var sReturnVal = "MenuBar", + sId = this.id; + + if(sId) { + + sReturnVal += (" " + sId); + + } + + return sReturnVal; + +}, + + +/** +* @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, + DEFAULT_CONFIG = YAHOO.widget.MenuBar._DEFAULT_CONFIG; + + // Add configuration properties + + + /* + Set the default value for the "position" configuration property + to "static" by re-adding the property. + */ + + + /** + * @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( + DEFAULT_CONFIG.POSITION.key, + { + handler: this.configPosition, + value: DEFAULT_CONFIG.POSITION.value, + validator: DEFAULT_CONFIG.POSITION.validator, + supercedes: DEFAULT_CONFIG.POSITION.supercedes + } + ); + + + /* + Set the default value for the "submenualignment" configuration property + to ["tl","bl"] by re-adding the property. + */ + + /** + * @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( + DEFAULT_CONFIG.SUBMENU_ALIGNMENT.key, + { + value: DEFAULT_CONFIG.SUBMENU_ALIGNMENT.value + } + ); + + + /* + Change the default value for the "autosubmenudisplay" configuration + property to "false" by re-adding the property. + */ + + /** + * @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( + DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.key, + { + value: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.value, + validator: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.validator + } + ); + +} + +}); // END YAHOO.lang.extend + + + +/** +* Creates an item for a menu bar. +* +* @param {String} p_oObject String specifying the text of the menu bar item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the menu bar item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu bar item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> 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.lang.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 {HTMLLIElement} p_oObject Object specifying the +* <li> element of the menu bar item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu bar item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> 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 +* <li> element of the menu bar item. +* @default "yuimenubaritem" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuimenubaritem", + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the menu bar item. +* @return {String} +*/ +toString: function() { + + var sReturnVal = "MenuBarItem"; + + if(this.cfg && this.cfg.getProperty("text")) { + + sReturnVal += (": " + this.cfg.getProperty("text")); + + } + + return sReturnVal; + +} + +}); // END YAHOO.lang.extend +YAHOO.register("menu", YAHOO.widget.Menu, {version: "2.2.2", build: "204"}); diff --git a/www/extras/yui/build/reset-fonts-grids/README b/www/extras/yui/build/reset-fonts-grids/README new file mode 100644 index 000000000..b7ea9abd8 --- /dev/null +++ b/www/extras/yui/build/reset-fonts-grids/README @@ -0,0 +1,24 @@ +YUI Library - Reset+Fonts+Grids (RFG) - Release Notes + +*** NOTE *** + +This document is not updated with each release. Changes to +the reset-fonts-grids.css source are noted in the README +file for each component that comprises this aggregate: + +reset/README +fonts/README +grids/README + +************ + +Version 2.2.0 - 2.2.2 + + * No changes. + +Version 0.12.0 + + * Initial release. + + * This file is a convenience file containing an in-order + concatonation of Reset, Fonts, and Grids. \ No newline at end of file diff --git a/www/extras/yui/build/reset-fonts-grids/reset-fonts-grids.css b/www/extras/yui/build/reset-fonts-grids/reset-fonts-grids.css new file mode 100644 index 000000000..824acf727 --- /dev/null +++ b/www/extras/yui/build/reset-fonts-grids/reset-fonts-grids.css @@ -0,0 +1,9 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +/*reset.css*/body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing: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%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym {border:0;} +/*fonts.css*/body{font:13px arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}table {font-size:inherit;font:100%;}select, input, textarea {font:99% arial,helvetica,clean,sans-serif;}pre, code {font:115% monospace;*font-size:100%;}body * {line-height:1.22em;} +/*grids.css*/body{text-align:center;}#ft{clear:both;}#doc,#doc2,#doc3,.yui-t1,.yui-t2,.yui-t3,.yui-t4,.yui-t5,.yui-t6,.yui-t7{margin:auto;text-align:left;width:57.69em;*width:56.3em;min-width:750px;}#doc2{width:73.074em;*width:71.313em;min-width:950px;}#doc3{margin:auto 10px;width:auto;}.yui-b{position:relative;}.yui-b{_position:static;}#yui-main .yui-b{position:static;}#yui-main{width:100%;}.yui-t1 #yui-main,.yui-t2 #yui-main,.yui-t3 #yui-main{float:right;margin-left:-25em;}.yui-t4 #yui-main,.yui-t5 #yui-main,.yui-t6 #yui-main{float:left;margin-right:-25em;}.yui-t1 .yui-b{float:left;width:12.3207em;*width:12.0106em;}.yui-t1 #yui-main .yui-b{margin-left:13.3207em;*margin-left:13.0106em;}.yui-t2 .yui-b{float:left;width:13.8456em;*width:13.512em;}.yui-t2 #yui-main .yui-b{margin-left:14.8456em;*margin-left:14.512em;}.yui-t3 .yui-b{float:left;width:23.0759em;*width:22.52em;}.yui-t3 #yui-main .yui-b{margin-left:24.0759em;*margin-left:23.52em;}.yui-t4 .yui-b{float:right;width:13.8456em;*width:13.512em;}.yui-t4 #yui-main .yui-b{margin-right:14.8456em;*margin-right:14.512em;}.yui-t5 .yui-b{float:right;width:18.4608em;*width:18.016em;}.yui-t5 #yui-main .yui-b{margin-right:19.4608em;*margin-right:19.016em;}.yui-t6 .yui-b{float:right;width:23.0759em;*width:22.52em;}.yui-t6 #yui-main .yui-b{margin-right:24.0759em;*margin-right:23.52em;}.yui-t7 #yui-main .yui-b{display:block;margin:0 0 1em 0;}#yui-main .yui-b{float:none;width:auto;}.yui-g .yui-u,.yui-g .yui-g,.yui-gc .yui-u,.yui-gc .yui-g .yui-u,.yui-ge .yui-u,.yui-gf .yui-u{float:right;display:inline;}.yui-g div.first,.yui-gc div.first,.yui-gc div.first div.first,.yui-gd div.first,.yui-ge div.first,.yui-gf div.first{float:left;}.yui-g .yui-u,.yui-g .yui-g{width:49.1%;}.yui-g .yui-g .yui-u,.yui-gc .yui-g .yui-u{width:48.1%;}.yui-gb .yui-u,.yui-gc .yui-u,.yui-gd .yui-u{float:left;margin-left:2%;*margin-left:1.895%;width:32%;}.yui-gb div.first,.yui-gc div.first,.yui-gd div.first{margin-left:0;}.yui-gc div.first,.yui-gd .yui-u{width:66%;}.yui-gd div.first{width:32%;}.yui-ge .yui-u{width:24%;}.yui-ge div.first,.yui-gf .yui-u{width:74.2%;}.yui-gf div.first{width:24%;}.yui-ge div.first{width:74.2%;}#bd:after,.yui-g:after,.yui-gb:after,.yui-gc:after,.yui-gd:after,.yui-ge:after,.yui-gf:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#bd,.yui-g,.yui-gb,.yui-gc,.yui-gd,.yui-ge,.yui-gf{zoom:1;} \ No newline at end of file diff --git a/www/extras/yui/build/reset/README b/www/extras/yui/build/reset/README new file mode 100644 index 000000000..66ad20fd4 --- /dev/null +++ b/www/extras/yui/build/reset/README @@ -0,0 +1,25 @@ +YUI Library - Reset - Release Notes + +Version 2.2.0 - 2.2.2 + + * No changes. + +Version 0.12.1 - 0.12.2 + + * No changes. + +Version 0.12.0 + + * Added: h1,h2,h3,h4,h5,h6{font-weight:normal;} + + * Added: abbr,acronym {border:0;} + + * Added: textarea {padding:0;margin:0;} + +Version 0.11.0 + + * No changes. + +Version 0.10.0 + + * Initial release. \ No newline at end of file diff --git a/www/extras/yui/build/reset/reset-min.css b/www/extras/yui/build/reset/reset-min.css new file mode 100644 index 000000000..bab98868f --- /dev/null +++ b/www/extras/yui/build/reset/reset-min.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing: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%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym {border:0;} \ No newline at end of file diff --git a/www/extras/yui/build/reset/reset.css b/www/extras/yui/build/reset/reset.css new file mode 100644 index 000000000..8af42457a --- /dev/null +++ b/www/extras/yui/build/reset/reset.css @@ -0,0 +1,15 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;} +table{border-collapse:collapse;border-spacing: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%;font-weight:normal;} +q:before,q:after{content:'';} +abbr,acronym {border:0;} \ No newline at end of file diff --git a/www/extras/yui/build/slider/README b/www/extras/yui/build/slider/README new file mode 100644 index 000000000..2a440ae1b --- /dev/null +++ b/www/extras/yui/build/slider/README @@ -0,0 +1,72 @@ +Slider - Release Notes + +2.2.2 + * No change + +2.2.1 + * No change + +2.2.0 + * Added the missing "force" parameter to the signature for setRegionValue + * deprecated the moveComplete flag + +0.12.2 + * No change + +0.12.1 + + * Removed unneccessary getXY calls that were contribuing to slower performance + in FireFox when the slider was deeply nested in the DOM. + +0.12.0 + + * Added "slideStart", "slideEnd", and "change" custom events. The abstract + methods these will eventually replace still work. + + * The default animation duration is 0.2 seconds (reduced from 0.4 seconds), + and is configurable via the animationDuration property. + + * Keyboard navigation is now built in. The background needs a tabindex for + keyboard nav to work. Keyboard nav can be disabled by setting enableKeys + to false. The number of pixels the slider moves when the arrow keys + are pressed is controlled by keyIncrement, and defaults to 20. Note, + Safari support limited to background element types that support focus + in that browser. http://bugs.webkit.org/show_bug.cgi?id=7138 + + * Fixed broken doctype in examples/index.html + + * Catching an unhandled script exception in FF that could occur when + attempting to focus the slider background while a text field without + autocomplete="false" has focus + +0.11.3 + + * No change + +0.11.0 + + * When the thumb is clicked and dragged, the click position delta is properly + applied. + + * The slider background can be disabled by setting backgroundEnabled to false. + + * Added SliderThumb->clearTicks + + * Incorporated updated drag and drop performance improvements + +0.10.0 + + * Drag and drop's autoscroll feature is now turned off by default + in the slider. + + * The slider no longer sets its initial value upon initialization + + * RGB slider example fixed for IE7. + + * Updated to work with the onAvailable feature in Drag and Drop. + + * Updated the basic slider example page to make the control more + accessible to non-FF1.5 browsers. + + * Split the examples into separate pages + diff --git a/www/extras/yui/build/slider/slider-debug.js b/www/extras/yui/build/slider/slider-debug.js new file mode 100644 index 000000000..cb47cc719 --- /dev/null +++ b/www/extras/yui/build/slider/slider-debug.js @@ -0,0 +1,1259 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +/** + * 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 + */ + +/** + * 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 + * @uses YAHOO.util.EventProvider + * @constructor + * @param {String} id The id of the element linked to this instance + * @param {String} sGroup The group of related DragDrop items + * @param {SliderThumb} oThumb The thumb for this slider + * @param {String} sType The type of slider (horiz, vert, region) + */ +YAHOO.widget.Slider = function(sElementId, sGroup, oThumb, sType) { + if (sElementId) { + this.init(sElementId, sGroup, true); + this.initSlider(sType); + this.initThumb(oThumb); + } +}; + +/** + * 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, { + + /** + * Initializes the slider. Executed in the constructor + * @method initSlider + * @param {string} sType the type of slider (horiz, vert, region) + */ + initSlider: function(sType) { + + /** + * The type of the slider (horiz, vert, region) + * @property type + * @type string + */ + this.type = sType; + + //this.removeInvalidHandleType("A"); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + /** + * 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} newOffset|x the new offset for normal sliders, or the new + * x offset for region sliders + * @param {int} y the number of pixels the thumb has moved on the y axis + * (region sliders only) + */ + this.createEvent("change", this); + + /** + * Event that fires at the beginning 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); + + /** + * 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. + * Deprecated because this flag is only useful when the background is + * clicked and the slider is animated. If the user drags the thumb, + * the flag is updated when the drag is over ... the final onDrag event + * fires before the mouseup the ends the drag, so the implementer will + * never see it. + * + * @property moveComplete + * @type Boolean + * @deprecated use the slideEnd event instead + */ + 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; + }, + + /** + * Initializes the slider's thumb. Executed in the constructor. + * @method initThumb + * @param {YAHOO.widget.SliderThumb} t the slider thumb + */ + initThumb: function(t) { + + var self = 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 = t; + t.cacheBetweenDrags = true; + + // add handler for the handle onchange event + t.onChange = function() { + self.handleThumbChange(); + }; + + if (t._isHoriz && t.xTicks && t.xTicks.length) { + this.tickPause = Math.round(360 / t.xTicks.length); + } else if (t.yTicks && t.yTicks.length) { + this.tickPause = Math.round(360 / t.yTicks.length); + } + + this.logger.log("tickPause: " + this.tickPause); + + // delegate thumb methods + t.onMouseDown = function () { return self.focus(); }; + t.onMouseUp = function() { self.thumbMouseUp(); }; + t.onDrag = function() { self.fireEvents(true); }; + t.onAvailable = function() { return self.setStartSliderState(); }; + + }, + + /** + * Executed when the slider element is available + * @method onAvailable + */ + 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); + }, + + /** + * Executed when a keypress event happens with the control focused. + * Prevents the default behavior for navigation keys. The actual + * logic for moving the slider thumb in response to a key event + * happens in handleKeyDown. + * @param {Event} e the keypress event + */ + 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: + } + } + }, + + /** + * Executed when a keydown event happens with the control focused. + * Updates the slider value and display when the keypress is an + * arrow key, home, or end as long as enableKeys is set to true. + * @param {Event} e the keydown event + */ + 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 setStartSliderState + */ + setStartSliderState: function() { + + this.logger.log("Fixing state"); + + 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, 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 + * 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.logger.log("locking"); + this.thumb.lock(); + this.locked = true; + }, + + /** + * Unlocks the slider, overrides YAHOO.util.DragDrop + * @method unlock + */ + unlock: function() { + this.logger.log("unlocking"); + this.thumb.unlock(); + this.locked = false; + }, + + /** + * Handles mouseup event on the slider background + * @method thumbMouseUp + * @private + */ + thumbMouseUp: function() { + this.logger.log("bg mouseup"); + 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() { + this.logger.log("focus"); + + // 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 */ + this.logger.log("onChange: " + firstOffset + ", " + secondOffset); + }, + + /** + * 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 */ + this.logger.log("onSlideStart"); + }, + + /** + * Event that fires at the end of a slider thumb move + * @method onSliderEnd + * @deprecated use instance.subscribe("slideEnd") instead + */ + onSlideEnd: function () { + /* override me */ + this.logger.log("onSlideEnd"); + }, + + /** + * 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) { + this.logger.log("setValue " + newOffset); + + if (!this.thumb.available) { + this.logger.log("defer setValue until after onAvailble"); + this.deferredSetValue = arguments; + return false; + } + + if (this.isLocked() && !force) { + this.logger.log("Can't set the value, the control is locked"); + return false; + } + + if ( isNaN(newOffset) ) { + this.logger.log("setValue, Illegal argument: " + newOffset); + return false; + } + + var t = this.thumb; + var newX, newY; + this.verifyOffset(true); + 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, force) { + + if (!this.thumb.available) { + this.logger.log("defer setRegionValue until after onAvailble"); + this.deferredSetRegionValue = arguments; + return false; + } + + if (this.isLocked() && !force) { + this.logger.log("Can't set the value, the control is locked"); + return false; + } + + if ( isNaN(newOffset) ) { + this.logger.log("setRegionValue, Illegal argument: " + 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 + * @param checkPos {boolean} check the position instead of using cached value + * @method verifyOffset + * @return {boolean} True if the offset is the same as the baseline. + */ + verifyOffset: function(checkPos) { + + var newPos = YAHOO.util.Dom.getXY(this.getEl()); + //var newPos = [this.initPageX, this.initPageY]; + + this.logger.log("newPos: " + newPos, "warn"); + + if (newPos[0] != this.baselinePos[0] || newPos[1] != this.baselinePos[1]) { + this.logger.log("background moved, resetting constraints"); + 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) { + + // this.logger.log("move thumb", "warn"); + + var t = this.thumb; + var self = this; + + if (!t.available) { + this.logger.log("thumb is not available yet, aborting move"); + return; + } + + this.logger.log("move thumb, x: " + x + ", y: " + y); + + // 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.logger.log("graduated"); + // this.thumb._animating = true; + this.lock(); + + // cache the current thumb pos + this.curCoord = YAHOO.util.Dom.getXY(this.thumb.getEl()); + + setTimeout( function() { self.moveOneTick(p); }, this.tickPause ); + + } else if (this.animate && YAHOO.widget.Slider.ANIM_AVAIL && !skipAnim) { + this.logger.log("animating to " + p); + + // 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, tmp; + + + // redundant call to getXY since we set the position most of time prior + // to getting here. Moved to this.curCoord + //var curCoord = YAHOO.util.Dom.getXY(t.getEl()); + + // alignElWithMouse caches position in lastPageX, lastPageY .. doesn't work + //var curCoord = [this.lastPageX, this.lastPageY]; + + // 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(this.curCoord, finalCoord); + var tmpX = (nextCoord) ? nextCoord[0] : this.curCoord[0]; + nextCoord = this._getNextY([tmpX, this.curCoord[1]], finalCoord); + + } else if (t._isHoriz) { + nextCoord = this._getNextX(this.curCoord, finalCoord); + } else { + nextCoord = this._getNextY(this.curCoord, finalCoord); + } + + this.logger.log("moveOneTick: " + + " finalCoord: " + finalCoord + + " this.curCoord: " + this.curCoord + + " nextCoord: " + nextCoord); + + if (nextCoord) { + + // cache the position + this.curCoord = 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) { + this.logger.log("getNextX: " + 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.logger.log("bg mousedown: " + x + "," + y); + + 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 + * @param {boolean} thumbEvent set to true if this event is fired from an event + * that occurred on the thumb. If it is, the state of the + * thumb dd object should be correct. Otherwise, the event + * originated on the background, so the thumb state needs to + * be refreshed before proceeding. + * @private + */ + fireEvents: function (thumbEvent) { + + var t = this.thumb; + // this.logger.log("FireEvents: " + t._isRegion); + + if (!thumbEvent) { + t.cachePosition(); + } + + if (! this.isLocked()) { + if (t._isRegion) { + this.logger.log("region"); + var newX = t.getXValue(); + var newY = t.getYValue(); + + if (newX != this.previousX || newY != this.previousY) { + // this.logger.log("Firing onchange"); + 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.logger.log("Firing onchange: " + newVal); + 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); + YAHOO.widget.SliderThumb.superclass.constructor.call(this, id, sGroup); + + /** + * The id of the thumbs parent HTML element (the slider background + * element). + * @property parentElId + * @type string + */ + this.parentElId = sGroup; + } + + + //this.removeInvalidHandleType("A"); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + /** + * 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] + */ + getOffsetFromParent0: 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]) ]; + }, + + getOffsetFromParent: function(parentPos) { + + var el = this.getEl(); + + if (!this.deltaOffset) { + + var myPos = YAHOO.util.Dom.getXY(el); + var ppos = parentPos || YAHOO.util.Dom.getXY(this.parentElId); + + var newOffset = [ (myPos[0] - ppos[0]), (myPos[1] - ppos[1]) ]; + + var l = parseInt( YAHOO.util.Dom.getStyle(el, "left"), 10 ); + var t = parseInt( YAHOO.util.Dom.getStyle(el, "top" ), 10 ); + + var deltaX = l - newOffset[0]; + var deltaY = t - newOffset[1]; + + if (isNaN(deltaX) || isNaN(deltaY)) { + this.logger.log("element does not have a position style def yet"); + } else { + this.deltaOffset = [deltaX, deltaY]; + } + + } else { + var newLeft = parseInt( YAHOO.util.Dom.getStyle(el, "left"), 10 ); + var newTop = parseInt( YAHOO.util.Dom.getStyle(el, "top" ), 10 ); + + newOffset = [newLeft + this.deltaOffset[0], newTop + this.deltaOffset[1]]; + } + + return newOffset; + + //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) { + + + //document these. new for 0.12.1 + this.initLeft = iLeft; + this.initRight = iRight; + this.initUp = iUp; + this.initDown = iDown; + + 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.tickSize = 0; + 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(); + //this.logger.log("getVal: " + val); + 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; +} + +YAHOO.register("slider", YAHOO.widget.Slider, {version: "2.2.2", build: "204"}); diff --git a/www/extras/yui/build/slider/slider-min.js b/www/extras/yui/build/slider/slider-min.js new file mode 100644 index 000000000..ac7048ad9 --- /dev/null +++ b/www/extras/yui/build/slider/slider-min.js @@ -0,0 +1,36 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ + +YAHOO.widget.Slider=function(sElementId,sGroup,oThumb,sType){if(sElementId){this.init(sElementId,sGroup,true);this.initSlider(sType);this.initThumb(oThumb);}};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");};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");};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");};YAHOO.widget.Slider.ANIM_AVAIL=true;YAHOO.extend(YAHOO.widget.Slider,YAHOO.util.DragDrop,{initSlider:function(sType){this.type=sType;this.createEvent("change",this);this.createEvent("slideStart",this);this.createEvent("slideEnd",this);this.isTarget=false;this.animate=YAHOO.widget.Slider.ANIM_AVAIL;this.backgroundEnabled=true;this.tickPause=40;this.enableKeys=true;this.keyIncrement=20;this.moveComplete=true;this.animationDuration=0.2;},initThumb:function(t){var self=this;this.thumb=t;t.cacheBetweenDrags=true;t.onChange=function(){self.handleThumbChange();};if(t._isHoriz&&t.xTicks&&t.xTicks.length){this.tickPause=Math.round(360/t.xTicks.length);}else if(t.yTicks&&t.yTicks.length){this.tickPause=Math.round(360/t.yTicks.length);} +t.onMouseDown=function(){return self.focus();};t.onMouseUp=function(){self.thumbMouseUp();};t.onDrag=function(){self.fireEvents(true);};t.onAvailable=function(){return self.setStartSliderState();};},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:case 0x26:case 0x27:case 0x28:case 0x24:case 0x23: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){case 0x25:h-=this.keyIncrement;break;case 0x26:v-=this.keyIncrement;break;case 0x27:h+=this.keyIncrement;break;case 0x28:v+=this.keyIncrement;break;case 0x24:h=t.leftConstraint;v=t.topConstraint;break;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);}}},setStartSliderState:function(){this.setThumbCenterPoint();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,true);}}else{if(this.deferredSetValue){this.setValue.apply(this,this.deferredSetValue,true);this.deferredSetValue=null;}else{this.setValue(0,true,true);}}},setThumbCenterPoint:function(){var el=this.thumb.getEl();if(el){this.thumbCenterPoint={x:parseInt(el.offsetWidth/2,10),y:parseInt(el.offsetHeight/2,10)};}},lock:function(){this.thumb.lock();this.locked=true;},unlock:function(){this.thumb.unlock();this.locked=false;},thumbMouseUp:function(){if(!this.isLocked()&&!this.moveComplete){this.endMove();}},getThumb:function(){return this.thumb;},focus:function(){var el=this.getEl();if(el.focus){try{el.focus();}catch(e){}} +this.verifyOffset();if(this.isLocked()){return false;}else{this.onSlideStart();return true;}},onChange:function(firstOffset,secondOffset){},onSlideStart:function(){},onSlideEnd:function(){},getValue:function(){return this.thumb.getValue();},getXValue:function(){return this.thumb.getXValue();},getYValue:function(){return this.thumb.getYValue();},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());}},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(true);if(t._isRegion){return false;}else if(t._isHoriz){this.onSlideStart();newX=t.initPageX+newOffset+this.thumbCenterPoint.x;this.moveThumb(newX,t.initPageY,skipAnim);}else{this.onSlideStart();newY=t.initPageY+newOffset+this.thumbCenterPoint.y;this.moveThumb(t.initPageX,newY,skipAnim);} +return true;},setRegionValue:function(newOffset,newOffset2,skipAnim,force){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;},verifyOffset:function(checkPos){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;},moveThumb:function(x,y,skipAnim){var t=this.thumb;var self=this;if(!t.available){return;} +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.lock();this.curCoord=YAHOO.util.Dom.getXY(this.thumb.getEl());setTimeout(function(){self.moveOneTick(p);},this.tickPause);}else if(this.animate&&YAHOO.widget.Slider.ANIM_AVAIL&&!skipAnim){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.endMove();}},moveOneTick:function(finalCoord){var t=this.thumb,tmp;var nextCoord=null;if(t._isRegion){nextCoord=this._getNextX(this.curCoord,finalCoord);var tmpX=(nextCoord)?nextCoord[0]:this.curCoord[0];nextCoord=this._getNextY([tmpX,this.curCoord[1]],finalCoord);}else if(t._isHoriz){nextCoord=this._getNextX(this.curCoord,finalCoord);}else{nextCoord=this._getNextY(this.curCoord,finalCoord);} +if(nextCoord){this.curCoord=nextCoord;this.thumb.alignElWithMouse(t.getEl(),nextCoord[0],nextCoord[1]);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();}},_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[1]){thresh=t.tickSize-this.thumbCenterPoint.y;tmp=t.getTargetCoord(curCoord[0],curCoord[1]-thresh);nextCoord=[tmp.x,tmp.y];}else if(curCoord[1]1){this._graduated=true;} +this._isHoriz=(iLeft||iRight);this._isVert=(iUp||iDown);this._isRegion=(this._isHoriz&&this._isVert);},clearTicks:function(){YAHOO.widget.SliderThumb.superclass.clearTicks.call(this);this.tickSize=0;this._graduated=false;},getValue:function(){if(!this.available){return 0;} +var val=(this._isHoriz)?this.getXValue():this.getYValue();return val;},getXValue:function(){if(!this.available){return 0;} +var newOffset=this.getOffsetFromParent();return(newOffset[0]-this.startOffset[0]);},getYValue:function(){if(!this.available){return 0;} +var newOffset=this.getOffsetFromParent();return(newOffset[1]-this.startOffset[1]);},toString:function(){return"SliderThumb "+this.id;},onChange:function(x,y){}});if("undefined"==typeof YAHOO.util.Anim){YAHOO.widget.Slider.ANIM_AVAIL=false;} +YAHOO.register("slider",YAHOO.widget.Slider,{version:"2.2.2",build:"204"}); \ No newline at end of file diff --git a/www/extras/yui/build/slider/slider.js b/www/extras/yui/build/slider/slider.js new file mode 100644 index 000000000..efbd74eef --- /dev/null +++ b/www/extras/yui/build/slider/slider.js @@ -0,0 +1,1222 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +/** + * 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 + */ + +/** + * 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 + * @uses YAHOO.util.EventProvider + * @constructor + * @param {String} id The id of the element linked to this instance + * @param {String} sGroup The group of related DragDrop items + * @param {SliderThumb} oThumb The thumb for this slider + * @param {String} sType The type of slider (horiz, vert, region) + */ +YAHOO.widget.Slider = function(sElementId, sGroup, oThumb, sType) { + if (sElementId) { + this.init(sElementId, sGroup, true); + this.initSlider(sType); + this.initThumb(oThumb); + } +}; + +/** + * 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, { + + /** + * Initializes the slider. Executed in the constructor + * @method initSlider + * @param {string} sType the type of slider (horiz, vert, region) + */ + initSlider: function(sType) { + + /** + * The type of the slider (horiz, vert, region) + * @property type + * @type string + */ + this.type = sType; + + //this.removeInvalidHandleType("A"); + + + /** + * 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} newOffset|x the new offset for normal sliders, or the new + * x offset for region sliders + * @param {int} y the number of pixels the thumb has moved on the y axis + * (region sliders only) + */ + this.createEvent("change", this); + + /** + * Event that fires at the beginning 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); + + /** + * 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. + * Deprecated because this flag is only useful when the background is + * clicked and the slider is animated. If the user drags the thumb, + * the flag is updated when the drag is over ... the final onDrag event + * fires before the mouseup the ends the drag, so the implementer will + * never see it. + * + * @property moveComplete + * @type Boolean + * @deprecated use the slideEnd event instead + */ + 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; + }, + + /** + * Initializes the slider's thumb. Executed in the constructor. + * @method initThumb + * @param {YAHOO.widget.SliderThumb} t the slider thumb + */ + initThumb: function(t) { + + var self = 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 = t; + t.cacheBetweenDrags = true; + + // add handler for the handle onchange event + t.onChange = function() { + self.handleThumbChange(); + }; + + if (t._isHoriz && t.xTicks && t.xTicks.length) { + this.tickPause = Math.round(360 / t.xTicks.length); + } else if (t.yTicks && t.yTicks.length) { + this.tickPause = Math.round(360 / t.yTicks.length); + } + + + // delegate thumb methods + t.onMouseDown = function () { return self.focus(); }; + t.onMouseUp = function() { self.thumbMouseUp(); }; + t.onDrag = function() { self.fireEvents(true); }; + t.onAvailable = function() { return self.setStartSliderState(); }; + + }, + + /** + * Executed when the slider element is available + * @method onAvailable + */ + 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); + }, + + /** + * Executed when a keypress event happens with the control focused. + * Prevents the default behavior for navigation keys. The actual + * logic for moving the slider thumb in response to a key event + * happens in handleKeyDown. + * @param {Event} e the keypress event + */ + 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: + } + } + }, + + /** + * Executed when a keydown event happens with the control focused. + * Updates the slider value and display when the keypress is an + * arrow key, home, or end as long as enableKeys is set to true. + * @param {Event} e the keydown event + */ + 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 setStartSliderState + */ + 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, 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 + * 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(true); + 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, force) { + + 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 + * @param checkPos {boolean} check the position instead of using cached value + * @method verifyOffset + * @return {boolean} True if the offset is the same as the baseline. + */ + verifyOffset: function(checkPos) { + + var newPos = YAHOO.util.Dom.getXY(this.getEl()); + //var newPos = [this.initPageX, this.initPageY]; + + + 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(); + + // cache the current thumb pos + this.curCoord = YAHOO.util.Dom.getXY(this.thumb.getEl()); + + 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, tmp; + + + // redundant call to getXY since we set the position most of time prior + // to getting here. Moved to this.curCoord + //var curCoord = YAHOO.util.Dom.getXY(t.getEl()); + + // alignElWithMouse caches position in lastPageX, lastPageY .. doesn't work + //var curCoord = [this.lastPageX, this.lastPageY]; + + // 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(this.curCoord, finalCoord); + var tmpX = (nextCoord) ? nextCoord[0] : this.curCoord[0]; + nextCoord = this._getNextY([tmpX, this.curCoord[1]], finalCoord); + + } else if (t._isHoriz) { + nextCoord = this._getNextX(this.curCoord, finalCoord); + } else { + nextCoord = this._getNextY(this.curCoord, finalCoord); + } + + + if (nextCoord) { + + // cache the position + this.curCoord = 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 + * @param {boolean} thumbEvent set to true if this event is fired from an event + * that occurred on the thumb. If it is, the state of the + * thumb dd object should be correct. Otherwise, the event + * originated on the background, so the thumb state needs to + * be refreshed before proceeding. + * @private + */ + fireEvents: function (thumbEvent) { + + var t = this.thumb; + + if (!thumbEvent) { + 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); + YAHOO.widget.SliderThumb.superclass.constructor.call(this, 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] + */ + getOffsetFromParent0: 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]) ]; + }, + + getOffsetFromParent: function(parentPos) { + + var el = this.getEl(); + + if (!this.deltaOffset) { + + var myPos = YAHOO.util.Dom.getXY(el); + var ppos = parentPos || YAHOO.util.Dom.getXY(this.parentElId); + + var newOffset = [ (myPos[0] - ppos[0]), (myPos[1] - ppos[1]) ]; + + var l = parseInt( YAHOO.util.Dom.getStyle(el, "left"), 10 ); + var t = parseInt( YAHOO.util.Dom.getStyle(el, "top" ), 10 ); + + var deltaX = l - newOffset[0]; + var deltaY = t - newOffset[1]; + + if (isNaN(deltaX) || isNaN(deltaY)) { + } else { + this.deltaOffset = [deltaX, deltaY]; + } + + } else { + var newLeft = parseInt( YAHOO.util.Dom.getStyle(el, "left"), 10 ); + var newTop = parseInt( YAHOO.util.Dom.getStyle(el, "top" ), 10 ); + + newOffset = [newLeft + this.deltaOffset[0], newTop + this.deltaOffset[1]]; + } + + return newOffset; + + //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) { + + + //document these. new for 0.12.1 + this.initLeft = iLeft; + this.initRight = iRight; + this.initUp = iUp; + this.initDown = iDown; + + 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.tickSize = 0; + 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; +} + +YAHOO.register("slider", YAHOO.widget.Slider, {version: "2.2.2", build: "204"}); diff --git a/www/extras/yui/build/tabview/README b/www/extras/yui/build/tabview/README new file mode 100644 index 000000000..779218875 --- /dev/null +++ b/www/extras/yui/build/tabview/README @@ -0,0 +1,32 @@ +TabView Release Notes + +*** version 2.2.2 *** + +* no change + + +*** version 2.2.1 *** + +* no change + +*** version 2.2.0 *** + +* Element broken out into seperate pkg + NOTE: new dependency required - element-beta.js + +*** version 0.12.2 *** + +* var Tab is now private +* fixed Element.configureAttribute + +*** version 0.12.1 *** + +* tabs.css renamed to tabview.css +* calls to "set" now queued so they can be made before "contentReady" + + +*** version 0.12.0 *** + +* TabView widget introduced + +* Note: border_tabs.css included as basic skin to enable "tabs" look diff --git a/www/extras/yui/build/tabview/assets/border_tabs.css b/www/extras/yui/build/tabview/assets/border_tabs.css new file mode 100644 index 000000000..e0db1d98a --- /dev/null +++ b/www/extras/yui/build/tabview/assets/border_tabs.css @@ -0,0 +1,54 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +.yui-navset .yui-nav li a, .yui-navset .yui-content { + border:1px solid #000; /* label and content borders */ +} + +.yui-navset .yui-nav .selected a, .yui-navset .yui-nav a:hover, .yui-navset .yui-content { + background-color:#f6f7ee; /* active tab, tab hover, and content bgcolor */ +} + +.yui-navset .yui-nav li em { padding:.5em; } /* tab padding */ + +/* defaults to orientation "top" */ +.yui-navset .yui-nav .selected a { + border-bottom-width:0; /* no bottom border for active tab */ + padding-bottom:1px; /* to match height of other tabs */ +} + +.yui-navset .yui-content { + margin-top:-1px; /* for active tab overlap */ +} + +/* overrides for other orientations */ + +.yui-navset-bottom .yui-nav .selected a { + border-width:0 1px 1px; /* no top border for active tab */ + padding:1px 0 0; /* to match height of other tabs */ +} + +.yui-navset-bottom .yui-content { + margin:0 0 -1px; /* for active tab overlap */ +} + +.yui-navset-left .yui-nav li.selected a { + border-width:1px 0 1px 1px; /* no right border for active tab */ + padding:0 1px 0 0; /* to match width of other tabs */ +} + +.yui-navset-left .yui-content { + margin:0 0 0 -1px; /* for active tab overlap */ +} + +.yui-navset-right .yui-nav li.selected a { + border-width:1px 1px 1px 0; /* no left border for active tab */ + padding:0 0 0 1px; /* to match width of other tabs */ +} + +.yui-navset-right .yui-content { + margin:0 -1px 0 0; /* for active tab overlap */ +} \ No newline at end of file diff --git a/www/extras/yui/build/tabview/assets/tabview.css b/www/extras/yui/build/tabview/assets/tabview.css new file mode 100644 index 000000000..2434d7c90 --- /dev/null +++ b/www/extras/yui/build/tabview/assets/tabview.css @@ -0,0 +1,75 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +/* default space between tabs */ +.yui-navset .yui-nav li { + margin-right:0.5em; /* horizontal tabs */ +} +.yui-navset-left .yui-nav li, .yui-navset-right .yui-nav li { + margin:0 0 0.5em; /* vertical tabs */ +} + +/* default width for side tabs */ +.yui-navset-left .yui-nav, .yui-navset-right .yui-nav { width:6em; } +.yui-navset-left { padding-left:6em; } /* map to nav width */ +.yui-navset-right { padding-right:6em; } /* ditto */ + +/* core */ + +.yui-nav, .yui-nav li { + margin:0; + padding:0; + list-style:none; +} +.yui-navset li em { font-style:normal; } + +.yui-navset { + position:relative; /* contain absolute positioned tabs (left/right) */ + zoom:1; +} + +.yui-navset .yui-content { zoom:1; } + +.yui-navset .yui-nav li { + display:inline-block; + display:-moz-inline-stack; + *display:inline; /* IE */ + vertical-align:bottom; /* safari: for overlap */ + cursor:pointer; /* gecko: due to -moz-inline-stack on anchor */ + zoom:1; /* IE: kill space between horizontal tabs */ +} + +.yui-navset-left .yui-nav li, .yui-navset-right .yui-nav li { + display:block; +} + +.yui-navset .yui-nav a { + outline:0; /* gecko: keep from shifting */ +} + +.yui-navset .yui-nav a { position:relative; } /* IE: to allow overlap */ + +.yui-navset .yui-nav li a { + display:block; + display:inline-block; + vertical-align:bottom; /* safari: for overlap */ + zoom:1; +} + +.yui-navset-left .yui-nav li a, .yui-navset-right .yui-nav li a { + display:block; +} + +.yui-navset-bottom .yui-nav li a { + vertical-align:text-top; /* for inline overlap (reverse for Op border bug) */ +} + +.yui-navset .yui-nav li a em { display:block; } + +/* position left and right oriented tabs */ +.yui-navset-left .yui-nav, .yui-navset-right .yui-nav { position:absolute; z-index:1; } +.yui-navset-left .yui-nav { left:0; } +.yui-navset-right .yui-nav { right:0; } diff --git a/www/extras/yui/build/tabview/tabview-debug.js b/www/extras/yui/build/tabview/tabview-debug.js new file mode 100644 index 000000000..aa97d92e1 --- /dev/null +++ b/www/extras/yui/build/tabview/tabview-debug.js @@ -0,0 +1,1025 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +(function() { + + /** + * The tabview module provides a widget for managing content bound to tabs. + * @module tabview + * @requires yahoo, dom, event, element + * + */ + /** + * 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 && !YAHOO.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 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); + }; + + /** + * setAttributeConfigs 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.setAttributeConfig('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.setAttributeConfig('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.setAttributeConfig('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.setAttributeConfig('activeTab', { + value: attr.activeTab, + method: function(tab) { + var activeTab = this.get('activeTab'); + + if (tab) { + tab.set('active', true); + this._configs['activeIndex'].value = this.getTabIndex(tab); // keep in sync + } + + 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 ( YAHOO.lang.hasOwnProperty(this.DOM_EVENTS, 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. + *

          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);

          + * @event beforeActiveTabChange + */ + +/** + * 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);

          + * @event activeTabChange + */ + +/** + * 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);

          + * @event beforeOrientationChange + */ + +/** + * 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);

          + * @event orientationChange + */ +})(); + +(function() { + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * 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 + */ + var Tab = function(el, attr) { + attr = attr || {}; + if (arguments.length == 1 && !YAHOO.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; + }; + + /** + * setAttributeConfigs 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.setAttributeConfig('activationEvent', { + value: attr.activationEvent || 'click' + }); + + /** + * The element that contains the tab's label. + * @config labelEl + * @type HTMLElement + */ + this.setAttributeConfig('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.setAttributeConfig('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.setAttributeConfig('contentEl', { + 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.setAttributeConfig('content', { + value: attr.content, + 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.setAttributeConfig('dataSrc', { + value: attr.dataSrc + }); + + /** + * Whether or not content should be reloaded for every view. + * @config cacheData + * @type Boolean + * @default false + */ + this.setAttributeConfig('cacheData', { + value: attr.cacheData || false, + validator: YAHOO.lang.isBoolean + }); + + /** + * The method to use for the data request. + * @config loadMethod + * @type String + * @default "GET" + */ + this.setAttributeConfig('loadMethod', { + value: attr.loadMethod || 'GET', + validator: YAHOO.lang.isString + }); + + /** + * Whether or not any data has been loaded from the server. + * @config dataLoaded + * @type Boolean + */ + this.setAttributeConfig('dataLoaded', { + value: false, + validator: YAHOO.lang.isBoolean, + writeOnce: true + }); + + /** + * Number if milliseconds before aborting and calling failure handler. + * @config dataTimeout + * @type Number + * @default null + */ + this.setAttributeConfig('dataTimeout', { + value: attr.dataTimeout || null, + validator: YAHOO.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.setAttributeConfig('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 YAHOO.lang.isBoolean(value) && !this.get('disabled') ; + } + }); + + /** + * Whether or not the tab is disabled. + * @config disabled + * @type Boolean + */ + this.setAttributeConfig('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: YAHOO.lang.isBoolean + }); + + /** + * The href of the tab's anchor element. + * @config href + * @type String + * @default '#' + */ + this.setAttributeConfig('href', { + value: attr.href || '#', + method: function(value) { + this.getElementsByTagName('a')[0].href = value; + }, + validator: YAHOO.lang.isString + }); + + /** + * The Whether or not the tab's content is visible. + * @config contentVisible + * @type Boolean + * @default false + */ + this.setAttributeConfig('contentVisible', { + value: attr.contentVisible, + method: function(value) { + if (value) { + 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: YAHOO.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. + *

          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);

          + * @event beforeActiveChange + */ + + /** + * 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);

          + * @event activeChange + */ + + /** + * 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);

          + * @event beforeLabelChange + */ + + /** + * 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);

          + * @event labelChange + */ + + /** + * 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);

          + * @event beforeContentChange + */ + + /** + * 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);

          + * @event contentChange + */ +})(); + +YAHOO.register("tabview", YAHOO.widget.TabView, {version: "2.2.2", build: "204"}); diff --git a/www/extras/yui/build/tabview/tabview-min.js b/www/extras/yui/build/tabview/tabview-min.js new file mode 100644 index 000000000..0b5a7eab7 --- /dev/null +++ b/www/extras/yui/build/tabview/tabview-min.js @@ -0,0 +1,35 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ + +(function(){YAHOO.widget.TabView=function(el,attr){attr=attr||{};if(arguments.length==1&&!YAHOO.lang.isString(el)&&!el.nodeName){attr=el;el=attr.element||null;} +if(!el&&!attr.element){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 Event=YAHOO.util.Event;var Tab=YAHOO.widget.Tab;proto.CLASSNAME='yui-navset';proto.TAB_PARENT_CLASSNAME='yui-nav';proto.CONTENT_PARENT_CLASSNAME='yui-content';proto._tabParent=null;proto._contentParent=null;proto.addTab=function(tab,index){var tabs=this.get('tabs');if(!tabs){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);}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);};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;i1){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);};proto.toString=function(){var name=this.get('id')||this.get('tagName');return"TabView "+name;};proto.contentTransition=function(newTab,oldTab){newTab.set('contentVisible',true);oldTab.set('contentVisible',false);};proto.initAttributes=function(attr){YAHOO.widget.TabView.superclass.initAttributes.call(this,attr);if(!attr.orientation){attr.orientation='top';} +var el=this.get('element');this.setAttributeConfig('tabs',{value:[],readOnly:true});this._tabParent=this.getElementsByClassName(this.TAB_PARENT_CLASSNAME,'ul')[0]||_createTabParent.call(this);this._contentParent=this.getElementsByClassName(this.CONTENT_PARENT_CLASSNAME,'div')[0]||_createContentParent.call(this);this.setAttributeConfig('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;}}});this.setAttributeConfig('activeIndex',{value:attr.activeIndex,method:function(value){this.set('activeTab',this.getTab(value));},validator:function(value){return!this.getTab(value).get('disabled');}});this.setAttributeConfig('activeTab',{value:attr.activeTab,method:function(tab){var activeTab=this.get('activeTab');if(tab){tab.set('active',true);this._configs['activeIndex'].value=this.getTabIndex(tab);} +if(activeTab&&activeTab!=tab){activeTab.set('active',false);} +if(activeTab&&tab!=activeTab){this.contentTransition(tab,activeTab);}else if(tab){tab.set('contentVisible',true);}},validator:function(value){return!value.get('disabled');}});if(this._tabParent){_initTabs.call(this);} +for(var type in this.DOM_EVENTS){if(YAHOO.lang.hasOwnProperty(this.DOM_EVENTS,type)){this.addListener.call(this,type,this.DOMEventHandler);}}};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 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); + }; + + /** + * setAttributeConfigs 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.setAttributeConfig('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.setAttributeConfig('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.setAttributeConfig('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.setAttributeConfig('activeTab', { + value: attr.activeTab, + method: function(tab) { + var activeTab = this.get('activeTab'); + + if (tab) { + tab.set('active', true); + this._configs['activeIndex'].value = this.getTabIndex(tab); // keep in sync + } + + 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 ( YAHOO.lang.hasOwnProperty(this.DOM_EVENTS, 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. + *

          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);

          + * @event beforeActiveTabChange + */ + +/** + * 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);

          + * @event activeTabChange + */ + +/** + * 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);

          + * @event beforeOrientationChange + */ + +/** + * 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);

          + * @event orientationChange + */ +})(); + +(function() { + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * 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 + */ + var Tab = function(el, attr) { + attr = attr || {}; + if (arguments.length == 1 && !YAHOO.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) { + } + }; + + 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; + }; + + /** + * setAttributeConfigs 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.setAttributeConfig('activationEvent', { + value: attr.activationEvent || 'click' + }); + + /** + * The element that contains the tab's label. + * @config labelEl + * @type HTMLElement + */ + this.setAttributeConfig('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.setAttributeConfig('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.setAttributeConfig('contentEl', { + 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.setAttributeConfig('content', { + value: attr.content, + 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.setAttributeConfig('dataSrc', { + value: attr.dataSrc + }); + + /** + * Whether or not content should be reloaded for every view. + * @config cacheData + * @type Boolean + * @default false + */ + this.setAttributeConfig('cacheData', { + value: attr.cacheData || false, + validator: YAHOO.lang.isBoolean + }); + + /** + * The method to use for the data request. + * @config loadMethod + * @type String + * @default "GET" + */ + this.setAttributeConfig('loadMethod', { + value: attr.loadMethod || 'GET', + validator: YAHOO.lang.isString + }); + + /** + * Whether or not any data has been loaded from the server. + * @config dataLoaded + * @type Boolean + */ + this.setAttributeConfig('dataLoaded', { + value: false, + validator: YAHOO.lang.isBoolean, + writeOnce: true + }); + + /** + * Number if milliseconds before aborting and calling failure handler. + * @config dataTimeout + * @type Number + * @default null + */ + this.setAttributeConfig('dataTimeout', { + value: attr.dataTimeout || null, + validator: YAHOO.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.setAttributeConfig('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 YAHOO.lang.isBoolean(value) && !this.get('disabled') ; + } + }); + + /** + * Whether or not the tab is disabled. + * @config disabled + * @type Boolean + */ + this.setAttributeConfig('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: YAHOO.lang.isBoolean + }); + + /** + * The href of the tab's anchor element. + * @config href + * @type String + * @default '#' + */ + this.setAttributeConfig('href', { + value: attr.href || '#', + method: function(value) { + this.getElementsByTagName('a')[0].href = value; + }, + validator: YAHOO.lang.isString + }); + + /** + * The Whether or not the tab's content is visible. + * @config contentVisible + * @type Boolean + * @default false + */ + this.setAttributeConfig('contentVisible', { + value: attr.contentVisible, + method: function(value) { + if (value) { + 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: YAHOO.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) { + 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. + *

          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);

          + * @event beforeActiveChange + */ + + /** + * 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);

          + * @event activeChange + */ + + /** + * 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);

          + * @event beforeLabelChange + */ + + /** + * 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);

          + * @event labelChange + */ + + /** + * 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);

          + * @event beforeContentChange + */ + + /** + * 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);

          + * @event contentChange + */ +})(); + +YAHOO.register("tabview", YAHOO.widget.TabView, {version: "2.2.2", build: "204"}); diff --git a/www/extras/yui/build/treeview/README b/www/extras/yui/build/treeview/README new file mode 100644 index 000000000..81def706a --- /dev/null +++ b/www/extras/yui/build/treeview/README @@ -0,0 +1,154 @@ +TreeView - Release Notes + +2.2.2 + * No change + +2.2.1 + * Fixed the default value in the documentation for the nowrap property in Node + (the default value is false). + +2.2.0 + + * Node::insertAfter properly nulls the nextSibling attribute when the + inserted before the firstChild. + + * MenuNodes inserted at the root level will no longer lose the menu behavior. + + * TextNode::setUpLabel sets the data.label property as well as the label property. + + * TaskNode example: made the logger optional, and moved the creation of the logger + instance to the proper location. + + * TaskNodes added to a node that is in a fully selected state will update the + parent to a partially selected state. + + * TaskNode example fixed to propagate the labelClick event + + +0.12.2 + + * removeChildren will now work properly on the root node. + +0.12.1 + + * Added custom events for expandComplete and collapseComplete. These events are + needed in situations where the implementer needs to resize or reposition + something based on the new offset. + + * Added a "nowrap" property to Node, and set the default to false. Specifies + whether or not the content area of the node should be allowed to wrap + naturally. + + * Added additional HTML elements to preserve the tree presentation when constrained + by a parent element. + +0.12.0 + + * TreeView now augments EventProvider, and has custom events for expand, + collapse, animStart, animComplete, and labelClick. Existing implementations + using abstract methods for these events (if they exist) will still work. + New events can be plugged into the tree by the Node implementation. For + example, TaskNode adds a checkClick event. EventProvider makes it safe + to do this because implementing code can call subscribe() prior to the + event creation. + + * YAHOO.util.Event is now a requirement for the widget + + * TreeView::removeChildren no longer expands and collapses the node. + + * Documented the moveComplete property + + * createElement("DIV") changed to createElement("div") + +0.11.4 + + * Fixed a javascript error on the HTML node example page. + +0.11.3 + + * popNode now clears the tree, previousSibling, nextSibling, and parent + properties of the node that is being removed from the tree. + + * Fixed the paths to the images in the tree.css file that is included in + build/assets. + +0.11.0 + + * Added TreeView -> popNode, which differs from removeNode in that the + node's children are preserved so the entire branch can be re-inserted + into another part of the tree, or another tree. + + * Added TreeView -> getNodesByProperty, which differs from + getNodeByProperty by returning an array of all nodes that have the + specified property rather than just the first one. + + * Added Node -> insertBefore, insertAfter, and appendTo. These method + can be used to reorganize the tree. + + * removeChildren properly resets the node icon when executed against a + collpased node. + + * Moved depth assignment from the constructor to appendChild so that the + value is set properly if the node is moved within the tree. + + * Fixed broken loop in removeChildren. + + * RootNode -> loadComplete calls tree.draw for hot-wiring the dynamic load + feature for the top level nodes. + + * The treeview constructor will accept an element instead of an id. + +0.10.0 + + * If the child collection changes prior to a refresh(), the icon is now + changed appropriately. + + * Added TreeView removeChildren(node). This will recursively purge the node's + children, and reset its dynamic load state. + + * previousSibling and nextSibling are now adjusted correctly when a + node is deleted. + + * expand()/collapse() now will not expand/collapse the node if false is + returned from the onExpand/onCollapse event handlers. + + * The onExpand and onCollapse events now fire before the node is expanded + or collapsed so that the implementer can modify the node's child collection + prior to display. + + * The childrenRendered property previous was used to indicate both that + a dynamically loaded node has received its data, and also to indicate + that the children html has been created. This has been split into + two properties. dynamicLoadComplete and childrenRendered. + + * Implemented the renderHidden flag. If set to true, the html for the entire + tree will be created when tree.draw() is called, not just the html for the + visible nodes. + + * Added an onLabelClick listener to TextNode + + * TreeView.removeNode no longer automatically refreshes the tree. It has an + optional parameter to perform the refresh. + + * removeNode can now be executed on nodes that have not been rendered. + + * You can now delete top-level nodes. + + * Added onCheckClick listener to the TaskNode example + + * Added Node.iconMode, which is a property that configures the way + dynamically loaded nodes are displayed when they are expanded and contain + no children. + + * TreeView/Node.setDynamicLoad now accepts an optional second parameter to + set the iconMode property. + + * Fixed an issue in the TaskNode.js example that prevented setting the checked + state of a node through the constructor. + + * Fixed an issue in HTMLNode that caused rendering issues when hasIcon was + set to true. + + * Added TreeView.removeNode + + * Added Node.refresh diff --git a/www/extras/yui/build/treeview/assets/lm.gif b/www/extras/yui/build/treeview/assets/lm.gif new file mode 100644 index 0000000000000000000000000000000000000000..e7d0a3ce92eb825a95ca188133567cd4f8f31499 GIT binary patch literal 94 zcmZ?wbhEHb6krfzn8?8J|NsAnh6V;OL-8jIs|W)#gAS0(0Fq~5(x216Qtb79sX3ZA us+DiZoVZmeFVu3oV#=XiRnDKMs-2p#PO1G%cj6U(9b}?;FOZ literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/treeview/assets/ln.gif b/www/extras/yui/build/treeview/assets/ln.gif new file mode 100644 index 0000000000000000000000000000000000000000..b7b3e55cd044af047e571b8e46d99dd4b801ee60 GIT binary patch literal 142 zcmZ?wbhEHb6krfz*v!Dt(9rPz|9=MJ08pjkPZmZ727U&`e=?ytsfj5H?w)Q6!MTY= zCBcbhsYME5Ky0LEz@P&%5oCu0i}Z(+o~!p-ygs}8e}YEQf$*yI>683lZcElVAIHLA F4FFl;B{Tp4 literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/treeview/assets/loading.gif b/www/extras/yui/build/treeview/assets/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..0bbf3bc0c0e5e635553e8d1bf9ceddefbc402396 GIT binary patch literal 2673 zcmchY_gj;P7RTSb83YJ1>=8y5ONL=ZcEgk+C?FydumNNz8c=c6`n&|fmMu_HHG%^w zNLVjHyfy)hAgHK_Kxkz+0Ktm5M|X*?y?g!o_3yv`{_^F^wY9YuFJ3GxEUd1s-nnz<)vH(c?%i8n zUVirM+2rIT007UQKY#e};oRKZty{MqJa}MhYina;bNBAu-+udTYHDhBcJ|n@WA*j* z-+lL;iHS*OX6D|#dm|zu!o$ON?b=mbT)bh!26uP&kdP1u2Zx!N8486$B9X?&$DclZ zdgI28>FMdk#l`#g@Bj4EPc=0)2M!!4EG!%z9?s6rzI5r**|TSdhK8)HtXf)HHgDc+ zZEek9Fk)k4xm@nHZQC3j9o^jACMG6~jg9m3^EYnX2*Yq^XJ>6~?X_#y4jnqQbLUQp zM6z$+zMp^o*}}p?p-?n8H=jOzx~Zv&N~Km+RkgLX9X@>c=FOXxm6dsUd1NvZ zX=yul?BMZua=F~p)O7py?EwJ+w{PD*dGh2hzx?v((WCP6au$mb!vmnqSpF6-9Ona(JQT#e>!KODwxYzG5#S|?M#v6eD#mgO^`=~9EL;yL&>*dd5*+XG=_`^3=CG25PbLa+LJ%N(PW_s z=_-TaM{SB!w(n7k+dMDN2G6VPqUA$u7F4m@ABAZ1D`*UMfe}E6csJU}J1Trmp#~7hZ5QSGpNvd1Uz$!Rf3q28pgSj9o zx?zwoWa8GYK@TOz^)mp#V2_VR5WfJ0W9BSSbn+cKb z7B9l9)K#s!?PSt;g%c8u;y7rd?hkP%>vq5BY=N>c=98V=+T&RSPgSu|E(FAK>B?vNN1 zPszwcbxJ?Oh|1pGd!9?gxzSWOR8o=x5!rGh+6r3hBL-14aTaAQxvJ|Y-S_m4niV2S zK@?}-9Dkhg<+w{Ny!vjyp-QmjyGmIW1DFB{k>P2=8cm~9M^_P#8?JFDumGEPaqJvf zZ{f;B#CG;H7q8a_hQ$pR6%%6So8vKM+W+cNPE_TI46^dn9q@qBr@1bUgxcPGB*b-i z3Hx_0(Esy5KKx^Y0yfgB6~}t>@!ctk>J|!vgVRhE2CPQ;AOKY2y%5nM@YF^ZMS~q}%L-n>Lpor#4w48UHYViOt={{43LMRvkIp+rkbs*s; z14}4q0y6`s8DL?uo-~*R@5tnFsC1DR#BGxT8fA20u_o?`0iDNI6lf;^$@AkR1dPTz z>XF1ZAqNjU95c@Vn59Wo;Z6b(YG+L$xy3(?j2I*vQ>PmzMEdh`yw3=)E}JYMDG|*x mDkGVJ;D)fXhxDI?kcM(ish)oPv+$)O9m7&lFF%`-bKA@>z>*#XDKFr20=RDO%adz+epk!mc6H literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/treeview/assets/lph.gif b/www/extras/yui/build/treeview/assets/lph.gif new file mode 100644 index 0000000000000000000000000000000000000000..e3478d8e37dadeba8c9d68c84ad29c3b2843a69b GIT binary patch literal 111 zcmZ?wbhEHb6krfzSj586(9qzWyyp6yrwj}X|Ns97k`SQylZBCifrUW_#09BkU^emC zb!Xj!lRuUA>b}?;FOZcNk%w1VGsZy1Cav&|Ns90004l1fdBvhA^8LW00093EC2ui01yBm0{{a5 zoR6s{>%SVDN!WWM*c`~(aUUXt+jx}0x_U$Nl_tuVt|Eu@i(%By01AUc;I0@!{*Fpg zbHaSSq>t#++QcfgNN&+P1PjGRs)M{VC)E{p+ns{PY55GCCfKT zdutnudlj5Dyj9$F{FNNGJl0(HoBNy=EnH1}ZJdp~t=!H0?Hmr>3p`F;E`5$S&AzVp z{?`tlZe5Rkubt1m@7)jnPh3E9yb6{Yh|XXugzgy9Q&`KPym)~q60+C`qA!W^6**q? znDL-Sb09BaG+A=fNOdVgwOqB*UQB#5_0{Be(_c=2I|cS6C^G26p9zIVB-#+^L!%p& zPJB7bX-BCasfHZNl%!RZTUBOd+0|uOm|tamHq3)NWI} zN%=0-tJUw*u~7w2HCz?()w_VfD(3pwYh$yM(N< zs&K4`v9z;VwY#}pyCWrW*|_c0@z(R$uJ^F-()E4(hW?AL_0z|Vpf`iy5Q;dvYwa^J{*Cj$a(RI*^pgD(@tTsX5~&4)K5=A5{*V$X{pgJ%4> zk!VMwABPGRiIn70lTA@ZRhg3IQW>=eEafa17mSEp06Pc% BB!B<_ literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/treeview/assets/tn.gif b/www/extras/yui/build/treeview/assets/tn.gif new file mode 100644 index 0000000000000000000000000000000000000000..4a280397de0ae7564f625d9356204a1cb6a1f399 GIT binary patch literal 504 zcmVi2fsz(rj1Z(I%uk_Z1$dUHLJCFC+@t*{rh7DQ$tg6bPOd)Ib9R>WJIOY zC1?7iG(~*cW?M%k^nH`*-V=i`xtK z>l-Y#TUe}i?3nDfEc#3uZ90uwt$NLx?Ya%yEz9_=8%|Cu4t!3WF5E0v&bw~>jvTK% z&s^_(54|tlPyNqYKx_lG736l%TS9Q=7LIEO5uQVI6V+8@m(N{9de0Z-ZN%5n-ba2T z{gniGQeaAgD-E_p_)=j^h7xB!tcjDOO^Q1$_QV)c-%pP@K@JsJlw?wqOHnpe`IKc; zms4R@m3ft>&a5}LdNsJN672wB*X9FPF}IdUNW|t3S66 u{d%%SVDDcF0XR#Je|A>GGlz1le|i8=~as(Px~3Y#jsDi#ZROFE0Y zt6NK!%i1gaYZh!fj9iR%44mw|tk!J&OdZWO&0MX0?UpUQ4c-m+jU8@2E_d#|PTsDb zepk*OpEvJbzjqJ+%A4QU&sRWV1CsGaU6>nC( zTlseN`xS6l!D9)RHGCFv+PjSNHs1TVZ{)v|16Lk=xp3ygn-h0l>^L-J(UM71HfVqJ9X~WyIc2u{X2H>*|v-0Hm(~vZ{@z319vVQI`QMwlUHAU dy?OTM+oN}%ZaqA9@!H9AH}4%ic+3R=06S)30ObGx literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/treeview/assets/tph.gif b/www/extras/yui/build/treeview/assets/tph.gif new file mode 100644 index 0000000000000000000000000000000000000000..e4d7d991e44f0ebbe5f05ec261eb831d96332a4e GIT binary patch literal 568 zcmV-80>}MFNk%w1VGsZy1EK@~*WBexW2^uG0Dypi|Ns900000000000A^8LW000C4 zEC2ui01yBm0{{d6NV?pvH@CVug*84wib4m7AKKl%9&5pQE9md6;~nrKG2-t)^qB zU9PdTVX}#@thKPWwqLl8yS}}^zh=j1$!g1N&2GDcSq!^Z7?+4Av#^Y-0ZW&C?{%!M{?3ielPvS1UOS*O@cQK=0vztVNZrX9j4qE zv|`bVM^CC8$};Ikrz4@36gjo!C6iB?!qh60D^0I9!QvFFlPpiOKG6bID|D$_qHK-E zMLJh0+_z2ZX2rXeZ&$xx0f!YlmT+0aXA!4Wyq0m>yO8rbmOGhlWxJ9i_tpHDb70Sd zK^GQ%m~>*(i%~aL{W!Dh&96Jh{yaN$?a{YO=RUnVb??=`Tf-hMn>cObwvppjuA4b; z=f0r>moB`x_2bu*XJ5X(dH3hvqlce9zB=~v+R<}Y@0~q(_u}D`mv273{q^_T=YMZI G0RTJi9wSr$ literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/treeview/assets/tree.css b/www/extras/yui/build/treeview/assets/tree.css new file mode 100644 index 000000000..b9abc4554 --- /dev/null +++ b/www/extras/yui/build/treeview/assets/tree.css @@ -0,0 +1,102 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +/* first or middle sibling, no children */ +.ygtvtn { + width:16px; height:22px; + background: url(tn.gif) 0 0 no-repeat; +} + +/* first or middle sibling, collapsable */ +.ygtvtm { + width:16px; height:22px; + cursor:pointer ; + background: url(tm.gif) 0 0 no-repeat; +} + +/* first or middle sibling, collapsable, hover */ +.ygtvtmh { + width:16px; height:22px; + cursor:pointer ; + background: url(tmh.gif) 0 0 no-repeat; +} + +/* first or middle sibling, expandable */ +.ygtvtp { + width:16px; height:22px; + cursor:pointer ; + background: url(tp.gif) 0 0 no-repeat; +} + +/* first or middle sibling, expandable, hover */ +.ygtvtph { + width:16px; height:22px; + cursor:pointer ; + background: url(tph.gif) 0 0 no-repeat; +} + +/* last sibling, no children */ +.ygtvln { + width:16px; height:22px; + background: url(ln.gif) 0 0 no-repeat; +} + +/* Last sibling, collapsable */ +.ygtvlm { + width:16px; height:22px; + cursor:pointer ; + background: url(lm.gif) 0 0 no-repeat; +} + +/* Last sibling, collapsable, hover */ +.ygtvlmh { + width:16px; height:22px; + cursor:pointer ; + background: url(lmh.gif) 0 0 no-repeat; +} + +/* Last sibling, expandable */ +.ygtvlp { + width:16px; height:22px; + cursor:pointer ; + background: url(lp.gif) 0 0 no-repeat; +} + +/* Last sibling, expandable, hover */ +.ygtvlph { + width:16px; height:22px; cursor:pointer ; + background: url(lph.gif) 0 0 no-repeat; +} + +/* Loading icon */ +.ygtvloading { + width:16px; height:22px; + background: url(loading.gif) 0 0 no-repeat; +} + +/* the style for the empty cells that are used for rendering the depth + * of the node */ +.ygtvdepthcell { + width:16px; height:22px; + background: url(vline.gif) 0 0 no-repeat; +} + +.ygtvblankdepthcell { width:16px; height:22px; } + +/* the style of the div around each node */ +.ygtvitem { } + +/* the style of the div around each node's collection of children */ +.ygtvchildren { } +* html .ygtvchildren { height:2%; } + +/* the style of the text label in ygTextNode */ +.ygtvlabel, .ygtvlabel:link, .ygtvlabel:visited, .ygtvlabel:hover { + margin-left:2px; + text-decoration: none; +} + +.ygtvspacer { height: 10px; width: 10px; margin: 2px; } diff --git a/www/extras/yui/build/treeview/assets/vline.gif b/www/extras/yui/build/treeview/assets/vline.gif new file mode 100644 index 0000000000000000000000000000000000000000..1fb0de8bb2911a51ff29f91fe7d231c0a5529091 GIT binary patch literal 503 zcmV^fYPpKps`<(p>p2TrD|$=1D3^=ctGbK# zdo|2eJQh57td{J!4A)HgY!_`h&36sRSk21q>J1AnD^5#pYmSSqyUot4?)whhE*wu> zZ+wqDubj`k@7xdCKWPD}4YXDeTS9H_4t8_+4PrQn<0zK1cn)Jajn3;DdZfn@UPyT# z`Hi%95?@MvB>}GV*OK5%fiV%zG+6Ut&WJlF_N@5xV$h63Hx}&(@~B9qB$GNd$rNQ& zl~Y+hby*eWRhe07ZnfDJ=U1I$d6xBg7HC?bYl*fs`W7kFxJ&6aor@Q%U8#Gi_O+Uq z>tC&b!4CFXm~3LRi_tb#`$+IcfwtO2i=-iumcis&gwQteGNf$RAoON>7%V9T{{hW3I06UMq^ke`4 literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/treeview/treeview-debug.js b/www/extras/yui/build/treeview/treeview-debug.js new file mode 100644 index 000000000..2ab8a4de8 --- /dev/null +++ b/www/extras/yui/build/treeview/treeview-debug.js @@ -0,0 +1,2287 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +/** + * The treeview widget is a generic tree building tool. + * @module treeview + * @title TreeView Widget + * @requires yahoo, event + * @optional animation + * @namespace YAHOO.widget + */ + +/** + * Contains the tree view state data and the root node. + * + * @class TreeView + * @uses YAHOO.util.EventProvider + * @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. This is a sparse + * array, so the length property can't be relied upon for a + * node count for the 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) { + this.logger.log("animating expand"); + + 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) { + this.logger.log("animating collapse"); + + 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.logger.log("expand complete: " + this.id); + --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.logger.log("collapse complete: " + this.id); + --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 collapsed. Return false to stop + * the collapse. + * @event collapse + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is collapsing + */ + this.createEvent("collapse", this); + + /** + * Fires after a node is successfully collapsed. This event will not fire + * if the "collapse" event was cancelled. + * @event collapseComplete + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that was collapsed + */ + this.createEvent("collapseComplete", this); + + /** + * Fires when a node is going to be expanded. Return false to stop + * the collapse. + * @event expand + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding + */ + this.createEvent("expand", this); + + /** + * Fires after a node is successfully expanded. This event will not fire + * if the "expand" event was cancelled. + * @event expandComplete + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that was expanded + */ + this.createEvent("expandComplete", 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); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + this.logger.log("tree init: " + this.id); + + //YAHOO.util.Event.onContentReady(this.id, this.handleAvailable, this, true); + YAHOO.util.Event.on(this.id, "click", this.handleClick, this, true); + }, + + + //handleAvailable: function() { + //var Event = YAHOO.util.Event; + //Event.on(this.id, + //}, + + /** + * 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) { + this.logger.log("Removing children for " + 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 '; + } + + 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 + * @uses YAHOO.util.EventProvider + * @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, + + /** + * Specifies whether or not the content area of the node should be allowed + * to wrap. + * @property nowrap + * @type boolean + * @default false + */ + nowrap: false, + + /** + * 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", + */ + + /** + * 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; + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + /** + * 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 tree 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(); + } + + // @todo why was this put here. This causes new nodes added at the + // root level to lose the menu behavior. + // 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 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] = '
          '; + sb[sb.length] = this.getNodeHtml(); + sb[sb.length] = this.getChildrenHtml(); + sb[sb.length] = '
          '; + 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] = '
          = this.depth || depth < 0) { + this.logger.log("illegal getAncestor depth: " + depth); + 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() { + this.logger.log("Generating html"); + 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); + +/** + * 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); + } + + this.logger = new YAHOO.widget.LogWriter(this.toString()); +}; + +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; + this.data.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() { + this.logger.log("Generating html"); + var sb = []; + + sb[sb.length] = ''; + sb[sb.length] = ''; + + for (var i=0;i '; + //sb[sb.length] = ''; + sb[sb.length] = ''; + } + + var getNode = 'YAHOO.widget.TreeView.getNode(\'' + + this.tree.id + '\',' + this.index + ')'; + + sb[sb.length] = ''; + + sb[sb.length] = '
          '; + + /* + sb[sb.length] = ' '; + sb[sb.length] = '
          '; + } + + if (this.hasIcon) { + sb[sb.length] = ' ';} +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);YAHOO.widget.Node=function(oData,oParent,expanded){if(oData){this.init(oData,oParent,expanded);}};YAHOO.widget.Node.prototype={index:0,children:null,tree:null,data:null,parent:null,depth:-1,href:null,target:"_self",expanded:false,multiExpand:true,renderHidden:false,childrenRendered:false,dynamicLoadComplete:false,previousSibling:null,nextSibling:null,_dynLoad:false,dataLoader:null,isLoading:false,hasIcon:true,iconMode:0,nowrap:false,_type:"Node",init:function(oData,oParent,expanded){this.data=oData;this.children=[];this.index=YAHOO.widget.TreeView.nodeCount;++YAHOO.widget.TreeView.nodeCount;this.expanded=expanded;this.createEvent("parentChange",this);if(oParent){oParent.appendChild(this);}},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();} +this.tree.regNode(this);parentNode.childrenRendered=false;for(var i=0,len=this.children.length;i0||(checkForLazyLoad&&this.isDynamic()&&!this.dynamicLoadComplete));},toggle:function(){if(!this.tree.locked&&(this.hasChildren(true)||this.isDynamic())){if(this.expanded){this.collapse();}else{this.expand();}}},getHtml:function(){this.childrenRendered=false;var sb=[];sb[sb.length]='
          ';sb[sb.length]=this.getNodeHtml();sb[sb.length]=this.getChildrenHtml();sb[sb.length]='
          ';return sb.join("");},getChildrenHtml:function(){var sb=[];sb[sb.length]='
          =this.depth||depth<0){return null;} +var p=this.parent;while(p.depth>depth){p=p.parent;} +return p;},getDepthStyle:function(depth){return(this.getAncestor(depth).nextSibling)?"ygtvdepthcell":"ygtvblankdepthcell";},getNodeHtml:function(){return"";},refresh:function(){this.getChildrenEl().innerHTML=this.completeRender();if(this.hasIcon){var el=this.getToggleEl();if(el){el.className=this.getStyle();}}},toString:function(){return"Node ("+this.index+")";}};YAHOO.augment(YAHOO.widget.Node,YAHOO.util.EventProvider);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,{labelStyle:"ygtvlabel",labelElId:null,label:null,textNodeParentChange:function(){if(this.tree&&!this.tree.hasEvent("labelClick")){this.tree.createEvent("labelClick",this.tree);}},setUpLabel:function(oData){this.textNodeParentChange();this.subscribe("parentChange",this.textNodeParentChange);if(typeof oData=="string"){oData={label:oData};} +this.label=oData.label;this.data.label=oData.label;if(oData.href){this.href=oData.href;} +if(oData.target){this.target=oData.target;} +if(oData.style){this.labelStyle=oData.style;} +this.labelElId="ygtvlabelel"+this.index;},getLabelEl:function(){return document.getElementById(this.labelElId);},getNodeHtml:function(){var sb=[];sb[sb.length]='
          ';sb[sb.length]='';for(var i=0;i
          ';} +var getNode='YAHOO.widget.TreeView.getNode(\''+ +this.tree.id+'\','+this.index+')';sb[sb.length]='';sb[sb.length]='
          ';sb[sb.length]='
          ';sb[sb.length]='';sb[sb.length]='
          ';sb[sb.length]='';sb[sb.length]='
          ';sb[sb.length]='
          ';return sb.join("");},onLabelClick:function(me){return me.tree.fireEvent("labelClick",me);},toString:function(){return"TextNode ("+this.index+") "+this.label;}});YAHOO.widget.RootNode=function(oTree){this.init(null,null,true);this.tree=oTree;};YAHOO.extend(YAHOO.widget.RootNode,YAHOO.widget.Node,{getNodeHtml:function(){return"";},toString:function(){return"RootNode";},loadComplete:function(){this.tree.draw();},collapse:function(){},expand:function(){}});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,{contentStyle:"ygtvhtml",contentElId:null,content:null,initContent:function(oData,hasIcon){if(typeof oData=="string"){oData={html:oData};} +this.html=oData.html;this.contentElId="ygtvcontentel"+this.index;this.hasIcon=hasIcon;},getContentEl:function(){return document.getElementById(this.contentElId);},getNodeHtml:function(){var sb=[];sb[sb.length]='';sb[sb.length]='';for(var i=0;i
          ';} +if(this.hasIcon){sb[sb.length]='';sb[sb.length]='
          ';sb[sb.length]='
          ';return sb.join("");},toString:function(){return"HTMLNode ("+this.index+")";}});YAHOO.widget.MenuNode=function(oData,oParent,expanded){if(oData){this.init(oData,oParent,expanded);this.setUpLabel(oData);} +this.multiExpand=false;};YAHOO.extend(YAHOO.widget.MenuNode,YAHOO.widget.TextNode,{toString:function(){return"MenuNode ("+this.index+") "+this.label;}});YAHOO.widget.TVAnim=function(){return{FADE_IN:"TVFadeIn",FADE_OUT:"TVFadeOut",getAnim:function(type,el,callback){if(YAHOO.widget[type]){return new YAHOO.widget[type](el,callback);}else{return null;}},isValid:function(type){return(YAHOO.widget[type]);}};}();YAHOO.widget.TVFadeIn=function(el,callback){this.el=el;this.callback=callback;};YAHOO.widget.TVFadeIn.prototype={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();},onComplete:function(){this.callback();},toString:function(){return"TVFadeIn";}};YAHOO.widget.TVFadeOut=function(el,callback){this.el=el;this.callback=callback;};YAHOO.widget.TVFadeOut.prototype={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();},onComplete:function(){var s=this.el.style;s.display="none";s.filter="alpha(opacity=100)";this.callback();},toString:function(){return"TVFadeOut";}};YAHOO.register("treeview",YAHOO.widget.TreeView,{version:"2.2.2",build:"204"}); \ No newline at end of file diff --git a/www/extras/yui/build/treeview/treeview.js b/www/extras/yui/build/treeview/treeview.js new file mode 100644 index 000000000..05ef9fe6d --- /dev/null +++ b/www/extras/yui/build/treeview/treeview.js @@ -0,0 +1,2248 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ +/** + * The treeview widget is a generic tree building tool. + * @module treeview + * @title TreeView Widget + * @requires yahoo, event + * @optional animation + * @namespace YAHOO.widget + */ + +/** + * Contains the tree view state data and the root node. + * + * @class TreeView + * @uses YAHOO.util.EventProvider + * @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. This is a sparse + * array, so the length property can't be relied upon for a + * node count for the 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 collapsed. Return false to stop + * the collapse. + * @event collapse + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is collapsing + */ + this.createEvent("collapse", this); + + /** + * Fires after a node is successfully collapsed. This event will not fire + * if the "collapse" event was cancelled. + * @event collapseComplete + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that was collapsed + */ + this.createEvent("collapseComplete", this); + + /** + * Fires when a node is going to be expanded. Return false to stop + * the collapse. + * @event expand + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding + */ + this.createEvent("expand", this); + + /** + * Fires after a node is successfully expanded. This event will not fire + * if the "expand" event was cancelled. + * @event expandComplete + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that was expanded + */ + this.createEvent("expandComplete", 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); + + + + //YAHOO.util.Event.onContentReady(this.id, this.handleAvailable, this, true); + YAHOO.util.Event.on(this.id, "click", this.handleClick, this, true); + }, + + + //handleAvailable: function() { + //var Event = YAHOO.util.Event; + //Event.on(this.id, + //}, + + /** + * 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 '; + } + + 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 + * @uses YAHOO.util.EventProvider + * @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, + + /** + * Specifies whether or not the content area of the node should be allowed + * to wrap. + * @property nowrap + * @type boolean + * @default false + */ + nowrap: false, + + /** + * 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", + */ + + /** + * 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 tree 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(); + } + + // @todo why was this put here. This causes new nodes added at the + // root level to lose the menu behavior. + // 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 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] = '
          '; + sb[sb.length] = this.getNodeHtml(); + sb[sb.length] = this.getChildrenHtml(); + sb[sb.length] = '
          '; + 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] = '
          = 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); + +/** + * 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; + this.data.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] = ''; + sb[sb.length] = ''; + + for (var i=0;i '; + //sb[sb.length] = ''; + sb[sb.length] = ''; + } + + var getNode = 'YAHOO.widget.TreeView.getNode(\'' + + this.tree.id + '\',' + this.index + ')'; + + sb[sb.length] = ''; + + sb[sb.length] = '
          '; + + /* + sb[sb.length] = ' '; + sb[sb.length] = '
          '; + } + + if (this.hasIcon) { + sb[sb.length] = '-1){return true;}else{return YAHOO.lang.isObject(obj)&&obj.constructor==Array;}},isBoolean:function(obj){return typeof obj=='boolean';},isFunction:function(obj){return typeof obj=='function';},isNull:function(obj){return obj===null;},isNumber:function(obj){return typeof obj=='number'&&isFinite(obj);},isObject:function(obj){return obj&&(typeof obj=='object'||YAHOO.lang.isFunction(obj));},isString:function(obj){return typeof obj=='string';},isUndefined:function(obj){return typeof obj=='undefined';},hasOwnProperty:function(obj,prop){if(Object.prototype.hasOwnProperty){return obj.hasOwnProperty(prop);} +return!YAHOO.lang.isUndefined(obj[prop])&&obj.constructor.prototype[prop]!==obj[prop];},extend:function(subc,superc,overrides){if(!superc||!subc){throw new Error("YAHOO.lang.extend failed, please check that "+"all dependencies are included.");} +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];}}},augment:function(r,s){if(!s||!r){throw new Error("YAHOO.lang.augment failed, please check that "+"all dependencies are included.");} +var rp=r.prototype,sp=s.prototype,a=arguments,i,p;if(a[2]){for(i=2;i-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,ROOT_TAG:/body|html/i};var toCamel=function(property){if(!patterns.HYPHEN.test(property)){return property;} +if(propertyCache[property]){return propertyCache[property];} +var converted=property;while(patterns.HYPHEN.exec(converted)){converted=converted.replace(RegExp.$1,RegExp.$1.substr(1).toUpperCase());} +propertyCache[property]=converted;return converted;};if(document.defaultView&&document.defaultView.getComputedStyle){getStyle=function(el,property){var value=null;if(property=='float'){property='cssFloat';} +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;case'float':property='styleFloat';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(YAHOO.lang.isString(el.style.filter)){el.style.filter='alpha(opacity='+val*100+')';if(!el.currentStyle||!el.currentStyle.hasLayout){el.style.zoom=1;}} +break;case'float':property='styleFloat';default:el.style[property]=val;}};}else{setStyle=function(el,property,val){if(property=='float'){property='cssFloat';} +el.style[property]=val;};} +YAHOO.util.Dom={get:function(el){if(YAHOO.lang.isString(el)){return document.getElementById(el);} +if(YAHOO.lang.isArray(el)){var c=[];for(var i=0,len=el.length;i=this.left&®ion.right<=this.right&®ion.top>=this.top&®ion.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.register("dom",YAHOO.util.Dom,{version:"2.2.2",build:"204"}); +YAHOO.util.CustomEvent=function(type,oScope,silent,signature){this.type=type;this.scope=oScope||window;this.silent=silent;this.signature=signature||YAHOO.util.CustomEvent.LIST;this.subscribers=[];if(!this.silent){} +var onsubscribeType="_YUICEOnSubscribe";if(type!==onsubscribeType){this.subscribeEvent=new YAHOO.util.CustomEvent(onsubscribeType,this,true);}};YAHOO.util.CustomEvent.LIST=0;YAHOO.util.CustomEvent.FLAT=1;YAHOO.util.CustomEvent.prototype={subscribe:function(fn,obj,override){if(!fn){throw new Error("Invalid callback for subscriber to '"+this.type+"'");} +if(this.subscribeEvent){this.subscribeEvent.fire(fn,obj,override);} +this.subscribers.push(new YAHOO.util.Subscriber(fn,obj,override));},unsubscribe:function(fn,obj){if(!fn){return this.unsubscribeAll();} +var found=false;for(var i=0,len=this.subscribers.length;i0){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){} +return false;}}} +return true;},unsubscribeAll:function(){for(var i=0,len=this.subscribers.length;i=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;i0);} +var notAvail=[];var executeItem=function(el,item){var scope=el;if(item.override){if(item.override===true){scope=item.obj;}else{scope=item.override;}} +item.fn.call(scope,item.obj);};var i,len,item,el;for(i=0,len=onAvailStack.length;i0){for(var i=0,len=searchList.length;i0){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');var el=document.getElementById("_yui_eu_dr");el.onreadystatechange=function(){if("complete"==this.readyState){this.parentNode.removeChild(this);YAHOO.util.Event._ready();}};el=null;YAHOO.util.Event.onDOMReady(YAHOO.util.Event._tryPreloadAttach,YAHOO.util.Event,true);}else if(EU.webkit){EU._drwatch=setInterval(function(){var rs=document.readyState;if("loaded"==rs||"complete"==rs){clearInterval(EU._drwatch);EU._drwatch=null;EU._ready();}},EU.POLL_INTERVAL);}else{EU._simpleAdd(document,"DOMContentLoaded",EU._ready);} +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(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});}},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;}},unsubscribeAll:function(p_type){return this.unsubscribe(p_type);},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=200&&httpStatus<300||httpStatus===1223){responseObject=this.createResponseObject(o,callback.argument);if(callback.success){if(!callback.scope){callback.success(responseObject);} +else{callback.success.apply(callback.scope,[responseObject]);}}} +else{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]);}}}} +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');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=[];var postMessage=postData.split('&');for(var i=0;i0){for(var i=0;i0)?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);}};})();YAHOO.register("animation",YAHOO.util.Anim,{version:"2.2.2",build:"204"}); +if(!YAHOO.util.DragDropMgr){YAHOO.util.DragDropMgr=function(){var Event=YAHOO.util.Event;return{ids:{},handleIds:{},dragCurrent:null,dragOvers:{},deltaX:0,deltaY:0,preventDefault:true,stopPropagation:true,initalized:false,locked:false,interactionInfo:null,init:function(){this.initialized=true;},POINT:0,INTERSECT:1,STRICT_INTERSECT:2,mode:0,_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);}}},_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);},_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,sGroup){if(!this.initialized){this.init();} +if(!this.ids[sGroup]){this.ids[sGroup]={};} +this.ids[sGroup][oDD.id]=oDD;},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];}},_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(sDDId,sHandleId){if(!this.handleIds[sDDId]){this.handleIds[sDDId]={};} +this.handleIds[sDDId][sHandleId]=sHandleId;},isDragDrop:function(id){return(this.getDDById(id))?true:false;},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;},isLegalTarget:function(oDD,oTargetDD){var targets=this.getRelated(oDD,true);for(var i=0,len=targets.length;ithis.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;},fireEvents:function(e,isDrop){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 pos=dc.getTargetCoord(pt.x,pt.y);var el=dc.getDragEl();curRegion=new YAHOO.util.Region(pos.y,pos.x+el.offsetWidth,pos.y+el.offsetHeight,pos.x);var oldOvers=[];var outEvts=[];var overEvts=[];var dropEvts=[];var enterEvts=[];for(var i in this.dragOvers){var ddo=this.dragOvers[i];if(!this.isTypeOfDD(ddo)){continue;} +if(!this.isOverTarget(pt,ddo,this.mode,curRegion)){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,curRegion)){if(isDrop){dropEvts.push(oDD);}else{if(!oldOvers[oDD.id]){enterEvts.push(oDD);}else{overEvts.push(oDD);} +this.dragOvers[oDD.id]=oDD;}}}}} +this.interactionInfo={out:outEvts,enter:enterEvts,over:overEvts,drop:dropEvts,point:pt,draggedRegion:curRegion,sourceRegion:this.locationCache[dc.id],validDrop:isDrop};if(isDrop&&!dropEvts.length){this.interactionInfo.validDrop=false;dc.onInvalidDrop(e);} +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{var len=0;for(i=0,len=outEvts.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();} +(function(){var Event=YAHOO.util.Event;var Dom=YAHOO.util.Dom;YAHOO.util.DragDrop=function(id,sGroup,config){if(id){this.init(id,sGroup,config);}};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,deltaX:0,deltaY: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=Dom.get(this.id);} +return this._domRef;},getDragEl:function(){return Dom.get(this.dragElId);},init:function(id,sGroup,config){this.initTarget(id,sGroup,config);Event.on(this.id,"mousedown",this.handleMouseDown,this,true);},initTarget:function(id,sGroup,config){this.config=config||{};this.DDM=YAHOO.util.DDM;this.groups={};if(typeof id!=="string"){id=Dom.generateId(id);} +this.id=id;this.addToGroup((sGroup)?sGroup:"default");this.handleElId=id;Event.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(iTop,iRight,iBot,iLeft){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];}},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);},setStartPosition:function(pos){var p=pos||Dom.getXY(this.getEl());this.deltaSetXY=null;this.startPageX=p[0];this.startPageY=p[1];},addToGroup:function(sGroup){this.groups[sGroup]=true;this.DDM.regDragDrop(this,sGroup);},removeFromGroup:function(sGroup){if(this.groups[sGroup]){delete this.groups[sGroup];} +this.DDM.removeDDFromGroup(this,sGroup);},setDragElId:function(id){this.dragElId=id;},setHandleElId:function(id){if(typeof id!=="string"){id=Dom.generateId(id);} +this.handleElId=id;this.DDM.regHandle(this.id,id);},setOuterHandleElId:function(id){if(typeof id!=="string"){id=Dom.generateId(id);} +Event.on(id,"mousedown",this.handleMouseDown,this,true);this.setHandleElId(id);this.hasOuterHandles=true;},unreg:function(){Event.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 button=e.which||e.button;if(this.primaryButtonOnly&&button>1){return;} +if(this.isLocked()){return;} +this.b4MouseDown(e);this.onMouseDown(e);this.DDM.refreshCache(this.groups);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)){this.setStartPosition();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)));},getTargetCoord:function(iPageX,iPageY){var x=iPageX-this.deltaX;var y=iPageY-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};},addInvalidHandleType:function(tagName){var type=tagName.toUpperCase();this.invalidHandleTypes[type]=type;},addInvalidHandleId:function(id){if(typeof id!=="string"){id=Dom.generateId(id);} +this.invalidHandleIds[id]=id;},addInvalidHandleClass:function(cssClass){this.invalidHandleClasses.push(cssClass);},removeInvalidHandleType:function(tagName){var type=tagName.toUpperCase();delete this.invalidHandleTypes[type];},removeInvalidHandleId:function(id){if(typeof id!=="string"){id=Dom.generateId(id);} +delete this.invalidHandleIds[id];},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);},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);},setXConstraint:function(iLeft,iRight,iTickSize){this.leftConstraint=parseInt(iLeft,10);this.rightConstraint=parseInt(iRight,10);this.minX=this.initPageX-this.leftConstraint;this.maxX=this.initPageX+this.rightConstraint;if(iTickSize){this.setXTicks(this.initPageX,iTickSize);} +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,iDown,iTickSize){this.topConstraint=parseInt(iUp,10);this.bottomConstraint=parseInt(iDown,10);this.minY=this.initPageY-this.topConstraint;this.maxY=this.initPageY+this.bottomConstraint;if(iTickSize){this.setYTicks(this.initPageY,iTickSize);} +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,tickArray){if(!tickArray){return val;}else if(tickArray[0]>=val){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];}} +return tickArray[tickArray.length-1];}},toString:function(){return("DragDrop "+this.id);}};})();YAHOO.util.DD=function(id,sGroup,config){if(id){this.init(id,sGroup,config);}};YAHOO.extend(YAHOO.util.DD,YAHOO.util.DragDrop,{scroll:true,autoOffset:function(iPageX,iPageY){var x=iPageX-this.startPageX;var y=iPageY-this.startPageY;this.setDelta(x,y);},setDelta:function(iDeltaX,iDeltaY){this.deltaX=iDeltaX;this.deltaY=iDeltaY;},setDragElPos:function(iPageX,iPageY){var el=this.getDragEl();this.alignElWithMouse(el,iPageX,iPageY);},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);},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];}},autoScroll:function(x,y,h,w){if(this.scroll){var clientH=this.DDM.getClientHeight();var clientW=this.DDM.getClientWidth();var st=this.DDM.getScrollTop();var sl=this.DDM.getScrollLeft();var bot=h+y;var right=w+x;var toBot=(clientH+st-y-this.deltaY);var toRight=(clientW+sl-x-this.deltaX);var thresh=40;var scrAmt=(document.all)?80:30;if(bot>clientH&&toBot0&&y-stclientW&&toRight0&&x-sl-1){return true;}else{return YAHOO.lang.isObject(obj)&&obj.constructor==Array;}},isBoolean:function(obj){return typeof obj=='boolean';},isFunction:function(obj){return typeof obj=='function';},isNull:function(obj){return obj===null;},isNumber:function(obj){return typeof obj=='number'&&isFinite(obj);},isObject:function(obj){return obj&&(typeof obj=='object'||YAHOO.lang.isFunction(obj));},isString:function(obj){return typeof obj=='string';},isUndefined:function(obj){return typeof obj=='undefined';},hasOwnProperty:function(obj,prop){if(Object.prototype.hasOwnProperty){return obj.hasOwnProperty(prop);} +return!YAHOO.lang.isUndefined(obj[prop])&&obj.constructor.prototype[prop]!==obj[prop];},extend:function(subc,superc,overrides){if(!superc||!subc){throw new Error("YAHOO.lang.extend failed, please check that "+"all dependencies are included.");} +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];}}},augment:function(r,s){if(!s||!r){throw new Error("YAHOO.lang.augment failed, please check that "+"all dependencies are included.");} +var rp=r.prototype,sp=s.prototype,a=arguments,i,p;if(a[2]){for(i=2;i-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,ROOT_TAG:/body|html/i};var toCamel=function(property){if(!patterns.HYPHEN.test(property)){return property;} +if(propertyCache[property]){return propertyCache[property];} +var converted=property;while(patterns.HYPHEN.exec(converted)){converted=converted.replace(RegExp.$1,RegExp.$1.substr(1).toUpperCase());} +propertyCache[property]=converted;return converted;};if(document.defaultView&&document.defaultView.getComputedStyle){getStyle=function(el,property){var value=null;if(property=='float'){property='cssFloat';} +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;case'float':property='styleFloat';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(YAHOO.lang.isString(el.style.filter)){el.style.filter='alpha(opacity='+val*100+')';if(!el.currentStyle||!el.currentStyle.hasLayout){el.style.zoom=1;}} +break;case'float':property='styleFloat';default:el.style[property]=val;}};}else{setStyle=function(el,property,val){if(property=='float'){property='cssFloat';} +el.style[property]=val;};} +YAHOO.util.Dom={get:function(el){if(YAHOO.lang.isString(el)){return document.getElementById(el);} +if(YAHOO.lang.isArray(el)){var c=[];for(var i=0,len=el.length;i=this.left&®ion.right<=this.right&®ion.top>=this.top&®ion.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.register("dom",YAHOO.util.Dom,{version:"2.2.2",build:"204"}); +YAHOO.util.CustomEvent=function(type,oScope,silent,signature){this.type=type;this.scope=oScope||window;this.silent=silent;this.signature=signature||YAHOO.util.CustomEvent.LIST;this.subscribers=[];if(!this.silent){} +var onsubscribeType="_YUICEOnSubscribe";if(type!==onsubscribeType){this.subscribeEvent=new YAHOO.util.CustomEvent(onsubscribeType,this,true);}};YAHOO.util.CustomEvent.LIST=0;YAHOO.util.CustomEvent.FLAT=1;YAHOO.util.CustomEvent.prototype={subscribe:function(fn,obj,override){if(!fn){throw new Error("Invalid callback for subscriber to '"+this.type+"'");} +if(this.subscribeEvent){this.subscribeEvent.fire(fn,obj,override);} +this.subscribers.push(new YAHOO.util.Subscriber(fn,obj,override));},unsubscribe:function(fn,obj){if(!fn){return this.unsubscribeAll();} +var found=false;for(var i=0,len=this.subscribers.length;i0){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){} +return false;}}} +return true;},unsubscribeAll:function(){for(var i=0,len=this.subscribers.length;i=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;i0);} +var notAvail=[];var executeItem=function(el,item){var scope=el;if(item.override){if(item.override===true){scope=item.obj;}else{scope=item.override;}} +item.fn.call(scope,item.obj);};var i,len,item,el;for(i=0,len=onAvailStack.length;i0){for(var i=0,len=searchList.length;i0){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');var el=document.getElementById("_yui_eu_dr");el.onreadystatechange=function(){if("complete"==this.readyState){this.parentNode.removeChild(this);YAHOO.util.Event._ready();}};el=null;YAHOO.util.Event.onDOMReady(YAHOO.util.Event._tryPreloadAttach,YAHOO.util.Event,true);}else if(EU.webkit){EU._drwatch=setInterval(function(){var rs=document.readyState;if("loaded"==rs||"complete"==rs){clearInterval(EU._drwatch);EU._drwatch=null;EU._ready();}},EU.POLL_INTERVAL);}else{EU._simpleAdd(document,"DOMContentLoaded",EU._ready);} +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(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});}},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;}},unsubscribeAll:function(p_type){return this.unsubscribe(p_type);},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 + * YAHOO.env.getVersion for the description of the version data structure. + * @property listener + * @static + */ +if (typeof YAHOO == "undefined") { + /** + * The YAHOO global namespace object. If YAHOO is already defined, the + * existing YAHOO object will not be overwritten so that defined + * namespaces are preserved. + * @class YAHOO + * @static + */ + var YAHOO = {}; +} + +/** + * 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 + * + * @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 + *
          name:
          The name of the module
          + *
          version:
          The version in use
          + *
          build:
          The build number in use
          + *
          versions:
          All versions that were registered
          + *
          builds:
          All builds that were registered.
          + *
          mainClass:
          An object that was was stamped with the + * current version and build. If + * mainClass.VERSION != version or mainClass.BUILD != build, + * multiple versions of pieces of the library have been + * loaded, potentially causing issues.
          + * + * + * @method getVersion + * @static + * @param {String} name the name of the module (event, slider, etc) + * @return {Object} The version info + */ + getVersion: function(name) { + return YAHOO.env.modules[name] || null; + } +}; + +/** + * Provides the language utilites and extensions used by the library + * @class YAHOO.lang + */ +YAHOO.lang = { + /** + * Determines whether or not the provided object is an array + * @method isArray + * @param {any} obj The object being testing + * @return Boolean + */ + isArray: function(obj) { // frames lose type, so test constructor string + if (obj && obj.constructor && + obj.constructor.toString().indexOf('Array') > -1) { + return true; + } else { + return YAHOO.lang.isObject(obj) && obj.constructor == Array; + } + }, + + /** + * Determines whether or not the provided object is a boolean + * @method isBoolean + * @param {any} obj The object being testing + * @return Boolean + */ + isBoolean: function(obj) { + return typeof obj == 'boolean'; + }, + + /** + * Determines whether or not the provided object is a function + * @method isFunction + * @param {any} obj The object being testing + * @return Boolean + */ + isFunction: function(obj) { + return typeof obj == 'function'; + }, + + /** + * Determines whether or not the provided object is null + * @method isNull + * @param {any} obj The object being testing + * @return Boolean + */ + isNull: function(obj) { + return obj === null; + }, + + /** + * Determines whether or not the provided object is a legal number + * @method isNumber + * @param {any} obj The object being testing + * @return Boolean + */ + isNumber: function(obj) { + return typeof obj == 'number' && isFinite(obj); + }, + + /** + * Determines whether or not the provided object is of type object + * or function + * @method isObject + * @param {any} obj The object being testing + * @return Boolean + */ + isObject: function(obj) { + return obj && (typeof obj == 'object' || YAHOO.lang.isFunction(obj)); + }, + + /** + * Determines whether or not the provided object is a string + * @method isString + * @param {any} obj The object being testing + * @return Boolean + */ + isString: function(obj) { + return typeof obj == 'string'; + }, + + /** + * Determines whether or not the provided object is undefined + * @method isUndefined + * @param {any} obj The object being testing + * @return Boolean + */ + isUndefined: function(obj) { + return typeof obj == 'undefined'; + }, + + /** + * Determines whether or not the property was added + * to the object instance. Returns false if the property is not present + * in the object, or was inherited from the prototype. + * This abstraction is provided to enable hasOwnProperty for Safari 1.3.x. + * There is a discrepancy between YAHOO.lang.hasOwnProperty and + * Object.prototype.hasOwnProperty when the property is a primitive added to + * both the instance AND prototype with the same value: + *
          +     * var A = function() {};
          +     * A.prototype.foo = 'foo';
          +     * var a = new A();
          +     * a.foo = 'foo';
          +     * alert(a.hasOwnProperty('foo')); // true
          +     * alert(YAHOO.lang.hasOwnProperty(a, 'foo')); // false when using fallback
          +     * 
          + * @method hasOwnProperty + * @param {any} obj The object being testing + * @return Boolean + */ + hasOwnProperty: function(obj, prop) { + if (Object.prototype.hasOwnProperty) { + return obj.hasOwnProperty(prop); + } + + return !YAHOO.lang.isUndefined(obj[prop]) && + obj.constructor.prototype[prop] !== obj[prop]; + }, + + /** + * 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 {Object} overrides additional properties/methods to add to the + * subclass prototype. These will override the + * matching items obtained from the superclass + * if present. + */ + extend: function(subc, superc, overrides) { + if (!superc||!subc) { + throw new Error("YAHOO.lang.extend failed, please check that " + + "all dependencies are included."); + } + 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 + */ + augment: function(r, s) { + if (!s||!r) { + throw new Error("YAHOO.lang.augment failed, please check that " + + "all dependencies are included."); + } + var rp=r.prototype, sp=s.prototype, a=arguments, i, p; + if (a[2]) { + for (i=2; iYAHOO.lang + * @class YAHOO.util.Lang + */ +YAHOO.util.Lang = YAHOO.lang; + +/** + * An alias for YAHOO.lang.augment + * @for YAHOO + * @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 = YAHOO.lang.augment; + +/** + * An alias for YAHOO.lang.extend + * @method extend + * @static + * @param {Function} subc the object to modify + * @param {Function} superc the object to inherit + * @param {Object} overrides additional properties/methods to add to the + * subclass prototype. These will override the + * matching items obtained from the superclass + * if present. + */ +YAHOO.extend = YAHOO.lang.extend; + +YAHOO.register("yahoo", YAHOO, {version: "2.2.2", build: "204"}); diff --git a/www/extras/yui/build/yahoo/yahoo-min.js b/www/extras/yui/build/yahoo/yahoo-min.js new file mode 100644 index 000000000..7aca8f4b5 --- /dev/null +++ b/www/extras/yui/build/yahoo/yahoo-min.js @@ -0,0 +1,17 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.2 +*/ + +if(typeof YAHOO=="undefined"){var YAHOO={};} +YAHOO.namespace=function(){var a=arguments,o=null,i,j,d;for(i=0;i-1){return true;}else{return YAHOO.lang.isObject(obj)&&obj.constructor==Array;}},isBoolean:function(obj){return typeof obj=='boolean';},isFunction:function(obj){return typeof obj=='function';},isNull:function(obj){return obj===null;},isNumber:function(obj){return typeof obj=='number'&&isFinite(obj);},isObject:function(obj){return obj&&(typeof obj=='object'||YAHOO.lang.isFunction(obj));},isString:function(obj){return typeof obj=='string';},isUndefined:function(obj){return typeof obj=='undefined';},hasOwnProperty:function(obj,prop){if(Object.prototype.hasOwnProperty){return obj.hasOwnProperty(prop);} +return!YAHOO.lang.isUndefined(obj[prop])&&obj.constructor.prototype[prop]!==obj[prop];},extend:function(subc,superc,overrides){if(!superc||!subc){throw new Error("YAHOO.lang.extend failed, please check that "+"all dependencies are included.");} +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];}}},augment:function(r,s){if(!s||!r){throw new Error("YAHOO.lang.augment failed, please check that "+"all dependencies are included.");} +var rp=r.prototype,sp=s.prototype,a=arguments,i,p;if(a[2]){for(i=2;i + * YAHOO.env.getVersion for the description of the version data structure. + * @property listener + * @static + */ +if (typeof YAHOO == "undefined") { + /** + * The YAHOO global namespace object. If YAHOO is already defined, the + * existing YAHOO object will not be overwritten so that defined + * namespaces are preserved. + * @class YAHOO + * @static + */ + var YAHOO = {}; +} + +/** + * 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 + * + * @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 + *
          name:
          The name of the module
          + *
          version:
          The version in use
          + *
          build:
          The build number in use
          + *
          versions:
          All versions that were registered
          + *
          builds:
          All builds that were registered.
          + *
          mainClass:
          An object that was was stamped with the + * current version and build. If + * mainClass.VERSION != version or mainClass.BUILD != build, + * multiple versions of pieces of the library have been + * loaded, potentially causing issues.
          + * + * + * @method getVersion + * @static + * @param {String} name the name of the module (event, slider, etc) + * @return {Object} The version info + */ + getVersion: function(name) { + return YAHOO.env.modules[name] || null; + } +}; + +/** + * Provides the language utilites and extensions used by the library + * @class YAHOO.lang + */ +YAHOO.lang = { + /** + * Determines whether or not the provided object is an array + * @method isArray + * @param {any} obj The object being testing + * @return Boolean + */ + isArray: function(obj) { // frames lose type, so test constructor string + if (obj && obj.constructor && + obj.constructor.toString().indexOf('Array') > -1) { + return true; + } else { + return YAHOO.lang.isObject(obj) && obj.constructor == Array; + } + }, + + /** + * Determines whether or not the provided object is a boolean + * @method isBoolean + * @param {any} obj The object being testing + * @return Boolean + */ + isBoolean: function(obj) { + return typeof obj == 'boolean'; + }, + + /** + * Determines whether or not the provided object is a function + * @method isFunction + * @param {any} obj The object being testing + * @return Boolean + */ + isFunction: function(obj) { + return typeof obj == 'function'; + }, + + /** + * Determines whether or not the provided object is null + * @method isNull + * @param {any} obj The object being testing + * @return Boolean + */ + isNull: function(obj) { + return obj === null; + }, + + /** + * Determines whether or not the provided object is a legal number + * @method isNumber + * @param {any} obj The object being testing + * @return Boolean + */ + isNumber: function(obj) { + return typeof obj == 'number' && isFinite(obj); + }, + + /** + * Determines whether or not the provided object is of type object + * or function + * @method isObject + * @param {any} obj The object being testing + * @return Boolean + */ + isObject: function(obj) { + return obj && (typeof obj == 'object' || YAHOO.lang.isFunction(obj)); + }, + + /** + * Determines whether or not the provided object is a string + * @method isString + * @param {any} obj The object being testing + * @return Boolean + */ + isString: function(obj) { + return typeof obj == 'string'; + }, + + /** + * Determines whether or not the provided object is undefined + * @method isUndefined + * @param {any} obj The object being testing + * @return Boolean + */ + isUndefined: function(obj) { + return typeof obj == 'undefined'; + }, + + /** + * Determines whether or not the property was added + * to the object instance. Returns false if the property is not present + * in the object, or was inherited from the prototype. + * This abstraction is provided to enable hasOwnProperty for Safari 1.3.x. + * There is a discrepancy between YAHOO.lang.hasOwnProperty and + * Object.prototype.hasOwnProperty when the property is a primitive added to + * both the instance AND prototype with the same value: + *
          +     * var A = function() {};
          +     * A.prototype.foo = 'foo';
          +     * var a = new A();
          +     * a.foo = 'foo';
          +     * alert(a.hasOwnProperty('foo')); // true
          +     * alert(YAHOO.lang.hasOwnProperty(a, 'foo')); // false when using fallback
          +     * 
          + * @method hasOwnProperty + * @param {any} obj The object being testing + * @return Boolean + */ + hasOwnProperty: function(obj, prop) { + if (Object.prototype.hasOwnProperty) { + return obj.hasOwnProperty(prop); + } + + return !YAHOO.lang.isUndefined(obj[prop]) && + obj.constructor.prototype[prop] !== obj[prop]; + }, + + /** + * 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 {Object} overrides additional properties/methods to add to the + * subclass prototype. These will override the + * matching items obtained from the superclass + * if present. + */ + extend: function(subc, superc, overrides) { + if (!superc||!subc) { + throw new Error("YAHOO.lang.extend failed, please check that " + + "all dependencies are included."); + } + 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 + */ + augment: function(r, s) { + if (!s||!r) { + throw new Error("YAHOO.lang.augment failed, please check that " + + "all dependencies are included."); + } + var rp=r.prototype, sp=s.prototype, a=arguments, i, p; + if (a[2]) { + for (i=2; iYAHOO.lang + * @class YAHOO.util.Lang + */ +YAHOO.util.Lang = YAHOO.lang; + +/** + * An alias for YAHOO.lang.augment + * @for YAHOO + * @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 = YAHOO.lang.augment; + +/** + * An alias for YAHOO.lang.extend + * @method extend + * @static + * @param {Function} subc the object to modify + * @param {Function} superc the object to inherit + * @param {Object} overrides additional properties/methods to add to the + * subclass prototype. These will override the + * matching items obtained from the superclass + * if present. + */ +YAHOO.extend = YAHOO.lang.extend; + +YAHOO.register("yahoo", YAHOO, {version: "2.2.2", build: "204"}); diff --git a/www/extras/yui/docs/Anim.js.html b/www/extras/yui/docs/Anim.js.html new file mode 100644 index 000000000..27a629bc7 --- /dev/null +++ b/www/extras/yui/docs/Anim.js.html @@ -0,0 +1,552 @@ + + + + API: animation Anim.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          animation  2.2.2

          +

          + Yahoo! UI Library + > animation + + > Anim.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /*
          +Copyright (c) 2006, Yahoo! Inc. All rights reserved.
          +Code licensed under the BSD License:
          +http://developer.yahoo.net/yui/license.txt
          +*/
          +
          +/**
          + * The animation module provides allows effects to be added to HTMLElements.
          + * @module animation
          + * @requires yahoo, event, dom
          + */
          +
          +/**
          + *
          + * 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.  Should only be needed for subclass use.
          +     * @method setRuntimeAttribute
          +     * @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);
          +    }
          +};
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/AnimMgr.js.html b/www/extras/yui/docs/AnimMgr.js.html new file mode 100644 index 000000000..051c46d61 --- /dev/null +++ b/www/extras/yui/docs/AnimMgr.js.html @@ -0,0 +1,293 @@ + + + + API: animation AnimMgr.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          animation  2.2.2

          +

          + Yahoo! UI Library + > animation + + > AnimMgr.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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 = 1000;
          +
          +    /** 
          +     * 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[0].isAnimated() ) {
          +                    this.unRegister(queue[0], 0);  
          +                }
          +            }
          +
          +            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;      
          +        }
          +    };
          +};
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Attribute.js.html b/www/extras/yui/docs/Attribute.js.html new file mode 100644 index 000000000..1730f676a --- /dev/null +++ b/www/extras/yui/docs/Attribute.js.html @@ -0,0 +1,301 @@ + + + + API: element Attribute.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          element  2.2.2

          +

          + Yahoo! UI Library + > element + + > Attribute.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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 && YAHOO.lang.hasOwnProperty(map, 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);
          +    }
          +};
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/AttributeProvider.js.html b/www/extras/yui/docs/AttributeProvider.js.html new file mode 100644 index 000000000..dc042a7d9 --- /dev/null +++ b/www/extras/yui/docs/AttributeProvider.js.html @@ -0,0 +1,349 @@ + + + + API: element AttributeProvider.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          element  2.2.2

          +

          + Yahoo! UI Library + > element + + > AttributeProvider.js (source view) +

          +
          + +
          +
          +
          + +
          +
          (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
          +    */
          +    
          +    /**
          +     * 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 ( Lang.hasOwnProperty(configs, 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 ( Lang.hasOwnProperty(map, 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.
          +         * @deprecated Use setAttributeConfig
          +         */
          +        register: function(key, map) {
          +            this.setAttributeConfig(key, map);
          +        },
          +        
          +        
          +        /**
          +         * 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 ( Lang.hasOwnProperty(config, key) ) {
          +                    map[key] = config[key];
          +                }
          +            }
          +    
          +            return map;
          +        },
          +        
          +        /**
          +         * Sets or updates an Attribute instance's properties. 
          +         * @method setAttributeConfig
          +         * @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.
          +         */
          +        setAttributeConfig: function(key, map, init) {
          +            var configs = this._configs || {};
          +            map = map || {};
          +            if (!configs[key]) {
          +                map.name = key;
          +                configs[key] = new YAHOO.util.Attribute(map, this);
          +            } else {
          +                configs[key].configure(map, init);
          +            }
          +        },
          +        
          +        /**
          +         * 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.
          +         * @deprecated Use setAttributeConfig
          +         */
          +        configureAttribute: function(key, map, init) {
          +            this.setAttributeConfig(key, 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);
          +})();
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/AutoComplete.js.html b/www/extras/yui/docs/AutoComplete.js.html new file mode 100644 index 000000000..33a61460d --- /dev/null +++ b/www/extras/yui/docs/AutoComplete.js.html @@ -0,0 +1,2114 @@ + + + + API: autocomplete AutoComplete.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          AutoComplete Widget  2.2.2

          +

          + Yahoo! UI Library + > autocomplete + + > AutoComplete.js (source view) +

          +
          + +
          +
          +
          + +
          +
           /**
          + * 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
          + * @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:
          + * <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 {YAHOO.widget.DataSource} DataSource instance.
          + * @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 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(YAHOO.lang.isString(elInput)) {
          +                    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(YAHOO.lang.isString(elContainer)) {
          +                    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(oConfigs && (oConfigs.constructor == 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 YAHOO.widget.DataSource
          + */
          +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 highlightClassName
          + * @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 | Object[]} 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 "yui-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 "yui-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 "yui-ac-bd".
          + *
          + * @method setBody
          + * @param sBody {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 {YAHOO.widget.AutoComplete} The AutoComplete instance.
          + */
          +YAHOO.widget.AutoComplete.prototype.textboxFocusEvent = null;
          +
          +/**
          + * Fired when the input field receives key input.
          + *
          + * @event textboxKeyEvent
          + * @param oSelf {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} The AutoComplete instance.
          + * @param sQuery {String} The query string.
          + * @param aResults {Object[]} 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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} The AutoComplete instance.
          + */
          +YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent = null;
          +
          +/**
          + * Fired when the results container is collapsed.
          + *
          + * @event containerCollapseEvent
          + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance.
          + */
          +YAHOO.widget.AutoComplete.prototype.containerCollapseEvent = null;
          +
          +/**
          + * Fired when the input field loses focus.
          + *
          + * @event textboxBlurEvent
          + * @param oSelf {YAHOO.widget.AutoComplete} 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 HTMLElement[]
          + * @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(!YAHOO.lang.isNumber(minQueryLength) || (minQueryLength < 1)) {
          +        minQueryLength = 1;
          +    }
          +    var maxResultsDisplayed = this.maxResultsDisplayed;
          +    if(!YAHOO.lang.isNumber(maxResultsDisplayed) || (maxResultsDisplayed < 1)) {
          +        maxResultsDisplayed = 10;
          +    }
          +    var queryDelay = this.queryDelay;
          +    if(!YAHOO.lang.isNumber(queryDelay) || (queryDelay < 0)) {
          +        queryDelay = 0.5;
          +    }
          +    var delimChar = this.delimChar;
          +    if(YAHOO.lang.isString(delimChar)) {
          +        delimChar = [delimChar];
          +    }
          +    else if(!YAHOO.lang.isArray(delimChar)) {
          +        delimChar = null;
          +    }
          +    var animSpeed = this.animSpeed;
          +    if((this.animHoriz || this.animVert) && YAHOO.util.Anim) {
          +        if(!YAHOO.lang.isNumber(animSpeed) || (animSpeed < 0)) {
          +            animSpeed = 0.3;
          +        }
          +        if(!this._oAnim ) {
          +            oAnim = new YAHOO.util.Anim(this._oContainer._oContent, {}, animSpeed);
          +            this._oAnim = oAnim;
          +        }
          +        else {
          +            this._oAnim.duration = animSpeed;
          +        }
          +    }
          +    if(this.forceSelection && 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 &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; oldi--) {
          +                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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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 {Object[]} An array of query result objects from the DataSource.
          + * @param oSelf {YAHOO.widget.AutoComplete} 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 || (this._nKeyCode == 8)) {
          +        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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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)) {
          +                    YAHOO.util.Event.stopEvent(v);
          +                }
          +                break;
          +            case 13: // enter
          +                if(oSelf._nKeyCode != nKeyCode) {
          +                    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 {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} The AutoComplete instance.
          + * @private
          + */
          +YAHOO.widget.AutoComplete.prototype._onTextboxFocus = function (v,oSelf) {
          +    oSelf._oTextbox.setAttribute("autocomplete","off");
          +    oSelf._bFocused = true;
          +    if(!oSelf._bItemSelected) {
          +        oSelf.textboxFocusEvent.fire(oSelf);
          +    }
          +};
          +
          +/**
          + * Handles text input box losing focus.
          + *
          + * @method _onTextboxBlur
          + * @param v {HTMLEvent} The focus event.
          + * @param oSelf {YAHOO.widget.AutoComplete} 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 {YAHOO.widget.AutoComplete} 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");
          +    }
          +};
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Bezier.js.html b/www/extras/yui/docs/Bezier.js.html new file mode 100644 index 000000000..44a67286e --- /dev/null +++ b/www/extras/yui/docs/Bezier.js.html @@ -0,0 +1,154 @@ + + + + API: animation Bezier.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          animation  2.2.2

          +

          + Yahoo! UI Library + > animation + + > Bezier.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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] ]; 
          +    
          +    };
          +};
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Calendar.js.html b/www/extras/yui/docs/Calendar.js.html new file mode 100644 index 000000000..b7871c80d --- /dev/null +++ b/www/extras/yui/docs/Calendar.js.html @@ -0,0 +1,2804 @@ + + + + API: calendar Calendar.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Calendar  2.2.2

          +

          + Yahoo! UI Library + > calendar + + > Calendar.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +* 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
          +* @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.
          +* <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
          +* @deprecated	You can now customize images by overriding the calclose, calnavleft and calnavright default CSS classes for the close icon, left arrow and right arrow respectively
          +* @type String
          +*/
          +YAHOO.widget.Calendar.IMG_ROOT = null;
          +
          +/**
          +* 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";
          +
          +/**
          +* Constant used to represent short date field string formats (e.g. Tu or Feb)
          +* @property YAHOO.widget.Calendar.SHORT
          +* @static
          +* @final
          +* @type String
          +*/
          +YAHOO.widget.Calendar.SHORT = "short";
          +
          +/**
          +* Constant used to represent long date field string formats (e.g. Monday or February)
          +* @property YAHOO.widget.Calendar.LONG
          +* @static
          +* @final
          +* @type String
          +*/
          +YAHOO.widget.Calendar.LONG = "long";
          +
          +/**
          +* Constant used to represent medium date field string formats (e.g. Mon)
          +* @property YAHOO.widget.Calendar.MEDIUM
          +* @static
          +* @final
          +* @type String
          +*/
          +YAHOO.widget.Calendar.MEDIUM = "medium";
          +
          +/**
          +* Constant used to represent single character date field string formats (e.g. M, T, W)
          +* @property YAHOO.widget.Calendar.ONE_CHAR
          +* @static
          +* @final
          +* @type String
          +*/
          +YAHOO.widget.Calendar.ONE_CHAR = "1char";
          +
          +/**
          +* The set of default Config property keys and values for the Calendar
          +* @property YAHOO.widget.Calendar._DEFAULT_CONFIG
          +* @final
          +* @static
          +* @private
          +* @type Object
          +*/
          +YAHOO.widget.Calendar._DEFAULT_CONFIG = {
          +	// Default values for pagedate and selected are not class level constants - they are set during instance creation 
          +	PAGEDATE : {key:"pagedate", value:null},
          +	SELECTED : {key:"selected", value:null},
          +	TITLE : {key:"title", value:""},
          +	CLOSE : {key:"close", value:false},
          +	IFRAME : {key:"iframe", value:true},
          +	MINDATE : {key:"mindate", value:null},
          +	MAXDATE : {key:"maxdate", value:null},
          +	MULTI_SELECT : {key:"multi_select", value:false},
          +	START_WEEKDAY : {key:"start_weekday", value:0},
          +	SHOW_WEEKDAYS : {key:"show_weekdays", value:true},
          +	SHOW_WEEK_HEADER : {key:"show_week_header", value:false},
          +	SHOW_WEEK_FOOTER : {key:"show_week_footer", value:false},
          +	HIDE_BLANK_WEEKS : {key:"hide_blank_weeks", value:false},
          +	NAV_ARROW_LEFT: {key:"nav_arrow_left", value:null} ,
          +	NAV_ARROW_RIGHT : {key:"nav_arrow_right", value:null} ,
          +	MONTHS_SHORT : {key:"months_short", value:["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]},
          +	MONTHS_LONG: {key:"months_long", value:["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]},
          +	WEEKDAYS_1CHAR: {key:"weekdays_1char", value:["S", "M", "T", "W", "T", "F", "S"]},
          +	WEEKDAYS_SHORT: {key:"weekdays_short", value:["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]},
          +	WEEKDAYS_MEDIUM: {key:"weekdays_medium", value:["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]},
          +	WEEKDAYS_LONG: {key:"weekdays_long", value:["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]},
          +	LOCALE_MONTHS:{key:"locale_months", value:"long"},
          +	LOCALE_WEEKDAYS:{key:"locale_weekdays", value:"short"},
          +	DATE_DELIMITER:{key:"date_delimiter", value:","},
          +	DATE_FIELD_DELIMITER:{key:"date_field_delimiter", value:"/"},
          +	DATE_RANGE_DELIMITER:{key:"date_range_delimiter", value:"-"},
          +	MY_MONTH_POSITION:{key:"my_month_position", value:1},
          +	MY_YEAR_POSITION:{key:"my_year_position", value:2},
          +	MD_MONTH_POSITION:{key:"md_month_position", value:1},
          +	MD_DAY_POSITION:{key:"md_day_position", value:2},
          +	MDY_MONTH_POSITION:{key:"mdy_month_position", value:1},
          +	MDY_DAY_POSITION:{key:"mdy_day_position", value:2},
          +	MDY_YEAR_POSITION:{key:"mdy_year_position", value:3}
          +};
          +
          +/**
          +* The set of Custom Event types supported by the Calendar
          +* @property YAHOO.widget.Calendar._EVENT_TYPES
          +* @final
          +* @static
          +* @private
          +* @type Object
          +*/
          +YAHOO.widget.Calendar._EVENT_TYPES = {
          +	BEFORE_SELECT : "beforeSelect", 
          +	SELECT : "select",
          +	BEFORE_DESELECT : "beforeDeselect",
          +	DESELECT : "deselect",
          +	CHANGE_PAGE : "changePage",
          +	BEFORE_RENDER : "beforeRender",
          +	RENDER : "render",
          +	RESET : "reset",
          +	CLEAR : "clear"
          +};
          +
          +/**
          +* The set of default style constants for the Calendar
          +* @property YAHOO.widget.Calendar._STYLES
          +* @final
          +* @static
          +* @private
          +* @type Object
          +*/
          +YAHOO.widget.Calendar._STYLES = {
          +	CSS_ROW_HEADER: "calrowhead",
          +	CSS_ROW_FOOTER: "calrowfoot",
          +	CSS_CELL : "calcell",
          +	CSS_CELL_SELECTOR : "selector",
          +	CSS_CELL_SELECTED : "selected",
          +	CSS_CELL_SELECTABLE : "selectable",
          +	CSS_CELL_RESTRICTED : "restricted",
          +	CSS_CELL_TODAY : "today",
          +	CSS_CELL_OOM : "oom",
          +	CSS_CELL_OOB : "previous",
          +	CSS_HEADER : "calheader",
          +	CSS_HEADER_TEXT : "calhead",
          +	CSS_BODY : "calbody",
          +	CSS_WEEKDAY_CELL : "calweekdaycell",
          +	CSS_WEEKDAY_ROW : "calweekdayrow",
          +	CSS_FOOTER : "calfoot",
          +	CSS_CALENDAR : "yui-calendar",
          +	CSS_SINGLE : "single",
          +	CSS_CONTAINER : "yui-calcontainer",
          +	CSS_NAV_LEFT : "calnavleft",
          +	CSS_NAV_RIGHT : "calnavright",
          +	CSS_CLOSE : "calclose",
          +	CSS_CELL_TOP : "calcelltop",
          +	CSS_CELL_LEFT : "calcellleft",
          +	CSS_CELL_RIGHT : "calcellright",
          +	CSS_CELL_BOTTOM : "calcellbottom",
          +	CSS_CELL_HOVER : "calcellhover",
          +	CSS_CELL_HIGHLIGHT1 : "highlight1",
          +	CSS_CELL_HIGHLIGHT2 : "highlight2",
          +	CSS_CELL_HIGHLIGHT3 : "highlight3",
          +	CSS_CELL_HIGHLIGHT4 : "highlight4"
          +};
          +
          +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,
          +
          +	/**
          +	* 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 (!this.parent) {
          +		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(YAHOO.widget.Calendar._DEFAULT_CONFIG.CLOSE.key);
          +	
          +	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(YAHOO.widget.Calendar._DEFAULT_CONFIG.TITLE.key);
          +	
          +	var DEPR_CLOSE_PATH = "us/my/bn/x_d.gif";
          +
          +	var linkClose;
          +
          +	if (close === true) {
          +		linkClose = YAHOO.util.Dom.getElementsByClassName("link-close", "a", this.oDomContainer)[0] || document.createElement("a");
          +		linkClose.href = "#";
          +		linkClose.className = "link-close";
          +		YAHOO.util.Event.addListener(linkClose, "click", function(e, cal) {cal.hide(); YAHOO.util.Event.preventDefault(e); }, this);
          +		
          +		if (YAHOO.widget.Calendar.IMG_ROOT !== null) {
          +			var imgClose = document.createElement("img");
          +			imgClose.src = YAHOO.widget.Calendar.IMG_ROOT + DEPR_CLOSE_PATH;
          +			imgClose.className = YAHOO.widget.CalendarGroup.CSS_2UPCLOSE;
          +			linkClose.appendChild(imgClose);
          +		} else {
          +			linkClose.innerHTML = '<span class="' + YAHOO.widget.CalendarGroup.CSS_2UPCLOSE + ' ' + this.Style.CSS_CLOSE + '"></span>';
          +		}
          +		
          +		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() {
          +
          +	var defEvents = YAHOO.widget.Calendar._EVENT_TYPES;
          +
          +	/**
          +	* Fired before a selection is made
          +	* @event beforeSelectEvent
          +	*/
          +	this.beforeSelectEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_SELECT); 
          +
          +	/**
          +	* 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(defEvents.SELECT);
          +
          +	/**
          +	* Fired before a selection is made
          +	* @event beforeDeselectEvent
          +	*/
          +	this.beforeDeselectEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_DESELECT);
          +
          +	/**
          +	* 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(defEvents.DESELECT);
          +
          +	/**
          +	* Fired when the Calendar page is changed
          +	* @event changePageEvent
          +	*/
          +	this.changePageEvent = new YAHOO.util.CustomEvent(defEvents.CHANGE_PAGE);
          +
          +	/**
          +	* Fired before the Calendar is rendered
          +	* @event beforeRenderEvent
          +	*/
          +	this.beforeRenderEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_RENDER);
          +
          +	/**
          +	* Fired when the Calendar is rendered
          +	* @event renderEvent
          +	*/
          +	this.renderEvent = new YAHOO.util.CustomEvent(defEvents.RENDER);
          +
          +	/**
          +	* Fired when the Calendar is reset
          +	* @event resetEvent
          +	*/
          +	this.resetEvent = new YAHOO.util.CustomEvent(defEvents.RESET);
          +
          +	/**
          +	* Fired when the Calendar is cleared
          +	* @event clearEvent
          +	*/
          +	this.clearEvent = new YAHOO.util.CustomEvent(defEvents.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 cell,index,d,date;
          +
          +	var target = YAHOO.util.Event.getTarget(e);
          +	var tagName = target.tagName.toLowerCase();
          +	var defSelector = false;
          +
          +	while (tagName != "td" && ! YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) {
          +
          +		if (!defSelector && tagName == "a" && YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTOR)) {
          +			defSelector = true;	
          +		}
          +
          +		target = target.parentNode;
          +		tagName = target.tagName.toLowerCase(); 
          +		if (tagName == "html") {
          +			return;
          +		}
          +	}
          +
          +	if (defSelector) {
          +		// Stop link href navigation for default renderer
          +		YAHOO.util.Event.preventDefault(e);
          +	}
          +
          +	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;
          +
          +		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() {
          +
          +	var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
          +
          +	/**
          +	* The month/year representing the current visible Calendar date (mm/yyyy)
          +	* @config pagedate
          +	* @type String
          +	* @default today's date
          +	*/
          +	this.cfg.addProperty(defCfg.PAGEDATE.key, { 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(defCfg.SELECTED.key, { value:[], handler:this.configSelected } );
          +
          +	/**
          +	* The title to display above the Calendar's month header
          +	* @config title
          +	* @type String
          +	* @default ""
          +	*/
          +	this.cfg.addProperty(defCfg.TITLE.key, { value:defCfg.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(defCfg.CLOSE.key, { value:defCfg.CLOSE.value, 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(defCfg.IFRAME.key, { value:defCfg.IFRAME.value, 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(defCfg.MINDATE.key, { value:defCfg.MINDATE.value, handler:this.configMinDate } );
          +
          +	/**
          +	* The maximum selectable date in the current Calendar (mm/dd/yyyy)
          +	* @config maxdate
          +	* @type String
          +	* @default null
          +	*/
          +	this.cfg.addProperty(defCfg.MAXDATE.key, { value:defCfg.MAXDATE.value, 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(defCfg.MULTI_SELECT.key,	{ value:defCfg.MULTI_SELECT.value, 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(defCfg.START_WEEKDAY.key,	{ value:defCfg.START_WEEKDAY.value, 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(defCfg.SHOW_WEEKDAYS.key,	{ value:defCfg.SHOW_WEEKDAYS.value, 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(defCfg.SHOW_WEEK_HEADER.key, { value:defCfg.SHOW_WEEK_HEADER.value, 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(defCfg.SHOW_WEEK_FOOTER.key,{ value:defCfg.SHOW_WEEK_FOOTER.value, 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(defCfg.HIDE_BLANK_WEEKS.key, { value:defCfg.HIDE_BLANK_WEEKS.value, handler:this.configOptions, validator:this.cfg.checkBoolean } );
          +	
          +	/**
          +	* The image that should be used for the left navigation arrow.
          +	* @config NAV_ARROW_LEFT
          +	* @type String
          +	* @deprecated	You can customize the image by overriding the default CSS class for the left arrow - "calnavleft"  
          +	* @default null
          +	*/	
          +	this.cfg.addProperty(defCfg.NAV_ARROW_LEFT.key,	{ value:defCfg.NAV_ARROW_LEFT.value, handler:this.configOptions } );
          +
          +	/**
          +	* The image that should be used for the right navigation arrow.
          +	* @config NAV_ARROW_RIGHT
          +	* @type String
          +	* @deprecated	You can customize the image by overriding the default CSS class for the right arrow - "calnavright"
          +	* @default null
          +	*/	
          +	this.cfg.addProperty(defCfg.NAV_ARROW_RIGHT.key, { value:defCfg.NAV_ARROW_RIGHT.value, 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(defCfg.MONTHS_SHORT.key,	{ value:defCfg.MONTHS_SHORT.value, 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(defCfg.MONTHS_LONG.key,		{ value:defCfg.MONTHS_LONG.value, 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(defCfg.WEEKDAYS_1CHAR.key,	{ value:defCfg.WEEKDAYS_1CHAR.value, 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(defCfg.WEEKDAYS_SHORT.key,	{ value:defCfg.WEEKDAYS_SHORT.value, 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(defCfg.WEEKDAYS_MEDIUM.key,	{ value:defCfg.WEEKDAYS_MEDIUM.value, 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(defCfg.WEEKDAYS_LONG.key,	{ value:defCfg.WEEKDAYS_LONG.value, handler:this.configLocale } );
          +
          +	/**
          +	* Refreshes the locale values used to build the Calendar.
          +	* @method refreshLocale
          +	* @private
          +	*/
          +	var refreshLocale = function() {
          +		this.cfg.refireEvent(defCfg.LOCALE_MONTHS.key);
          +		this.cfg.refireEvent(defCfg.LOCALE_WEEKDAYS.key);
          +	};
          +
          +	this.cfg.subscribeToConfigEvent(defCfg.START_WEEKDAY.key, refreshLocale, this, true);
          +	this.cfg.subscribeToConfigEvent(defCfg.MONTHS_SHORT.key, refreshLocale, this, true);
          +	this.cfg.subscribeToConfigEvent(defCfg.MONTHS_LONG.key, refreshLocale, this, true);
          +	this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_1CHAR.key, refreshLocale, this, true);
          +	this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_SHORT.key, refreshLocale, this, true);
          +	this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_MEDIUM.key, refreshLocale, this, true);
          +	this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_LONG.key, 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(defCfg.LOCALE_MONTHS.key,	{ value:defCfg.LOCALE_MONTHS.value, 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(defCfg.LOCALE_WEEKDAYS.key,	{ value:defCfg.LOCALE_WEEKDAYS.value, 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(defCfg.DATE_DELIMITER.key,		{ value:defCfg.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(defCfg.DATE_FIELD_DELIMITER.key, { value:defCfg.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(defCfg.DATE_RANGE_DELIMITER.key, { value:defCfg.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(defCfg.MY_MONTH_POSITION.key,	{ value:defCfg.MY_MONTH_POSITION.value, 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(defCfg.MY_YEAR_POSITION.key,	{ value:defCfg.MY_YEAR_POSITION.value, 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(defCfg.MD_MONTH_POSITION.key,	{ value:defCfg.MD_MONTH_POSITION.value, 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(defCfg.MD_DAY_POSITION.key,		{ value:defCfg.MD_DAY_POSITION.value, 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(defCfg.MDY_MONTH_POSITION.key,	{ value:defCfg.MDY_MONTH_POSITION.value, 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(defCfg.MDY_DAY_POSITION.key,	{ value:defCfg.MDY_DAY_POSITION.value, 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(defCfg.MDY_YEAR_POSITION.key,	{ value:defCfg.MDY_YEAR_POSITION.value, 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) {
          +	this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key, this._parsePageDate(args[0]), true);
          +};
          +
          +/**
          +* The default handler for the "mindate" property
          +* @method configMinDate
          +*/
          +YAHOO.widget.Calendar.prototype.configMinDate = function(type, args, obj) {
          +	var val = args[0];
          +	if (YAHOO.lang.isString(val)) {
          +		val = this._parseDate(val);
          +		this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.MINDATE.key, 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 (YAHOO.lang.isString(val)) {
          +		val = this._parseDate(val);
          +		this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.MAXDATE.key, 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];
          +	var cfgSelected = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key;
          +	
          +	if (selected) {
          +		if (YAHOO.lang.isString(selected)) {
          +			this.cfg.setProperty(cfgSelected, this._parseDates(selected), true);
          +		} 
          +	}
          +	if (! this._selectedDates) {
          +		this._selectedDates = this.cfg.getProperty(cfgSelected);
          +	}
          +};
          +
          +/**
          +* The default handler for all configuration options properties
          +* @method configOptions
          +*/
          +YAHOO.widget.Calendar.prototype.configOptions = function(type, args, obj) {
          +	this.Options[type.toUpperCase()] = args[0];
          +};
          +
          +/**
          +* The default handler for all configuration locale properties
          +* @method configLocale
          +*/
          +YAHOO.widget.Calendar.prototype.configLocale = function(type, args, obj) {
          +	var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
          +	this.Locale[type.toUpperCase()] = args[0];
          +
          +	this.cfg.refireEvent(defCfg.LOCALE_MONTHS.key);
          +	this.cfg.refireEvent(defCfg.LOCALE_WEEKDAYS.key);
          +};
          +
          +/**
          +* The default handler for all configuration locale field length properties
          +* @method configLocaleValues
          +*/
          +YAHOO.widget.Calendar.prototype.configLocaleValues = function(type, args, obj) {
          +	var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; 
          +
          +	type = type.toLowerCase();
          +	var val = args[0];
          +
          +	switch (type) {
          +		case defCfg.LOCALE_MONTHS.key:
          +			switch (val) {
          +				case YAHOO.widget.Calendar.SHORT:
          +					this.Locale.LOCALE_MONTHS = this.cfg.getProperty(defCfg.MONTHS_SHORT.key).concat();
          +					break;
          +				case YAHOO.widget.Calendar.LONG:
          +					this.Locale.LOCALE_MONTHS = this.cfg.getProperty(defCfg.MONTHS_LONG.key).concat();
          +					break;
          +			}
          +			break;
          +		case defCfg.LOCALE_WEEKDAYS.key:
          +			switch (val) {
          +				case YAHOO.widget.Calendar.ONE_CHAR:
          +					this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_1CHAR.key).concat();
          +					break;
          +				case YAHOO.widget.Calendar.SHORT:
          +					this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_SHORT.key).concat();
          +					break;
          +				case YAHOO.widget.Calendar.MEDIUM:
          +					this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_MEDIUM.key).concat();
          +					break;
          +				case YAHOO.widget.Calendar.LONG:
          +					this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_LONG.key).concat();
          +					break;
          +			}
          +			
          +			var START_WEEKDAY = this.cfg.getProperty(defCfg.START_WEEKDAY.key);
          +
          +			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() {
          +
          +	var defStyle = YAHOO.widget.Calendar._STYLES;
          +
          +	this.Style = {
          +		/**
          +		* @property Style.CSS_ROW_HEADER
          +		*/
          +		CSS_ROW_HEADER: defStyle.CSS_ROW_HEADER,
          +		/**
          +		* @property Style.CSS_ROW_FOOTER
          +		*/
          +		CSS_ROW_FOOTER: defStyle.CSS_ROW_FOOTER,
          +		/**
          +		* @property Style.CSS_CELL
          +		*/
          +		CSS_CELL : defStyle.CSS_CELL,
          +		/**
          +		* @property Style.CSS_CELL_SELECTOR
          +		*/
          +		CSS_CELL_SELECTOR : defStyle.CSS_CELL_SELECTOR,
          +		/**
          +		* @property Style.CSS_CELL_SELECTED
          +		*/
          +		CSS_CELL_SELECTED : defStyle.CSS_CELL_SELECTED,
          +		/**
          +		* @property Style.CSS_CELL_SELECTABLE
          +		*/
          +		CSS_CELL_SELECTABLE : defStyle.CSS_CELL_SELECTABLE,
          +		/**
          +		* @property Style.CSS_CELL_RESTRICTED
          +		*/
          +		CSS_CELL_RESTRICTED : defStyle.CSS_CELL_RESTRICTED,
          +		/**
          +		* @property Style.CSS_CELL_TODAY
          +		*/
          +		CSS_CELL_TODAY : defStyle.CSS_CELL_TODAY,
          +		/**
          +		* @property Style.CSS_CELL_OOM
          +		*/
          +		CSS_CELL_OOM : defStyle.CSS_CELL_OOM,
          +		/**
          +		* @property Style.CSS_CELL_OOB
          +		*/
          +		CSS_CELL_OOB : defStyle.CSS_CELL_OOB,
          +		/**
          +		* @property Style.CSS_HEADER
          +		*/
          +		CSS_HEADER : defStyle.CSS_HEADER,
          +		/**
          +		* @property Style.CSS_HEADER_TEXT
          +		*/
          +		CSS_HEADER_TEXT : defStyle.CSS_HEADER_TEXT,
          +		/**
          +		* @property Style.CSS_BODY
          +		*/
          +		CSS_BODY : defStyle.CSS_BODY,
          +		/**
          +		* @property Style.CSS_WEEKDAY_CELL
          +		*/
          +		CSS_WEEKDAY_CELL : defStyle.CSS_WEEKDAY_CELL,
          +		/**
          +		* @property Style.CSS_WEEKDAY_ROW
          +		*/
          +		CSS_WEEKDAY_ROW : defStyle.CSS_WEEKDAY_ROW,
          +		/**
          +		* @property Style.CSS_FOOTER
          +		*/
          +		CSS_FOOTER : defStyle.CSS_FOOTER,
          +		/**
          +		* @property Style.CSS_CALENDAR
          +		*/
          +		CSS_CALENDAR : defStyle.CSS_CALENDAR,
          +		/**
          +		* @property Style.CSS_SINGLE
          +		*/
          +		CSS_SINGLE : defStyle.CSS_SINGLE,
          +		/**
          +		* @property Style.CSS_CONTAINER
          +		*/
          +		CSS_CONTAINER : defStyle.CSS_CONTAINER,
          +		/**
          +		* @property Style.CSS_NAV_LEFT
          +		*/
          +		CSS_NAV_LEFT : defStyle.CSS_NAV_LEFT,
          +		/**
          +		* @property Style.CSS_NAV_RIGHT
          +		*/
          +		CSS_NAV_RIGHT : defStyle.CSS_NAV_RIGHT,
          +		/**
          +		* @property Style.CSS_CLOSE
          +		*/
          +		CSS_CLOSE : defStyle.CSS_CLOSE,
          +		/**
          +		* @property Style.CSS_CELL_TOP
          +		*/
          +		CSS_CELL_TOP : defStyle.CSS_CELL_TOP,
          +		/**
          +		* @property Style.CSS_CELL_LEFT
          +		*/
          +		CSS_CELL_LEFT : defStyle.CSS_CELL_LEFT,
          +		/**
          +		* @property Style.CSS_CELL_RIGHT
          +		*/
          +		CSS_CELL_RIGHT : defStyle.CSS_CELL_RIGHT,
          +		/**
          +		* @property Style.CSS_CELL_BOTTOM
          +		*/
          +		CSS_CELL_BOTTOM : defStyle.CSS_CELL_BOTTOM,
          +		/**
          +		* @property Style.CSS_CELL_HOVER
          +		*/
          +		CSS_CELL_HOVER : defStyle.CSS_CELL_HOVER,
          +		/**
          +		* @property Style.CSS_CELL_HIGHLIGHT1
          +		*/
          +		CSS_CELL_HIGHLIGHT1 : defStyle.CSS_CELL_HIGHLIGHT1,
          +		/**
          +		* @property Style.CSS_CELL_HIGHLIGHT2
          +		*/
          +		CSS_CELL_HIGHLIGHT2 : defStyle.CSS_CELL_HIGHLIGHT2,
          +		/**
          +		* @property Style.CSS_CELL_HIGHLIGHT3
          +		*/
          +		CSS_CELL_HIGHLIGHT3 : defStyle.CSS_CELL_HIGHLIGHT3,
          +		/**
          +		* @property Style.CSS_CELL_HIGHLIGHT4
          +		*/
          +		CSS_CELL_HIGHLIGHT4 : defStyle.CSS_CELL_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 pageDate = this.cfg.getProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key);
          +	return this.Locale.LOCALE_MONTHS[pageDate.getMonth()] + " " + pageDate.getFullYear();
          +};
          +
          +/**
          +* 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) {
          +	return workingDate.getDate();
          +};
          +
          +/**
          +* 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) {
          +	this.logger.log("Rendering header", "info");
          +	var colSpan = 7;
          +	
          +	var DEPR_NAV_LEFT = "us/tr/callt.gif";
          +	var DEPR_NAV_RIGHT = "us/tr/calrt.gif";	
          +	var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
          +	
          +	if (this.cfg.getProperty(defCfg.SHOW_WEEK_HEADER.key)) {
          +		colSpan += 1;
          +	}
          +
          +	if (this.cfg.getProperty(defCfg.SHOW_WEEK_FOOTER.key)) {
          +		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) {
          +		var leftArrow = this.cfg.getProperty(defCfg.NAV_ARROW_LEFT.key);
          +		// Check for deprecated customization - If someone set IMG_ROOT, but didn't set NAV_ARROW_LEFT, then set NAV_ARROW_LEFT to the old deprecated value
          +		if (leftArrow === null && YAHOO.widget.Calendar.IMG_ROOT !== null) {
          +			leftArrow = YAHOO.widget.Calendar.IMG_ROOT + DEPR_NAV_LEFT;
          +		}
          +		var leftStyle = (leftArrow === null) ? "" : ' style="background-image:url(' + leftArrow + ')"';
          +		html[html.length] = '<a class="' + this.Style.CSS_NAV_LEFT + '"' + leftStyle + ' >&#160;</a>';
          +	}
          +	
          +	html[html.length] = this.buildMonthLabel();
          +	
          +	if (renderRight) {
          +		var rightArrow = this.cfg.getProperty(defCfg.NAV_ARROW_RIGHT.key);
          +		if (rightArrow === null && YAHOO.widget.Calendar.IMG_ROOT !== null) {
          +			rightArrow = YAHOO.widget.Calendar.IMG_ROOT + DEPR_NAV_RIGHT;
          +		}
          +		var rightStyle = (rightArrow === null) ? "" : ' style="background-image:url(' + rightArrow + ')"';
          +		html[html.length] = '<a class="' + this.Style.CSS_NAV_RIGHT + '"' + rightStyle + ' >&#160;</a>';
          +	}
          +
          +	html[html.length] =	'</div>\n</th>\n</tr>';
          +
          +	if (this.cfg.getProperty(defCfg.SHOW_WEEKDAYS.key)) {
          +		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) {
          +
          +	var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
          +
          +	html[html.length] = '<tr class="' + this.Style.CSS_WEEKDAY_ROW + '">';
          +
          +	if (this.cfg.getProperty(defCfg.SHOW_WEEK_HEADER.key)) {
          +		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(defCfg.SHOW_WEEK_FOOTER.key)) {
          +		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) {
          +	this.logger.log("Rendering body", "info");
          +	var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
          +
          +	var startDay = this.cfg.getProperty(defCfg.START_WEEKDAY.key);
          +
          +	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 weekNum,weekClass;
          +	var weekPrefix = "w";
          +	var cellPrefix = "_cell";
          +	var workingDayPrefix = "wd";
          +	var dayPrefix = "d";
          +	
          +	var cellRenderers;
          +	var renderer;
          +	
          +	var todayYear = this.today.getFullYear();
          +	var todayMonth = this.today.getMonth();
          +	var todayDate = this.today.getDate();
          +	
          +	var useDate = this.cfg.getProperty(defCfg.PAGEDATE.key);
          +	var hideBlankWeeks = this.cfg.getProperty(defCfg.HIDE_BLANK_WEEKS.key);
          +	var showWeekFooter = this.cfg.getProperty(defCfg.SHOW_WEEK_FOOTER.key);
          +	var showWeekHeader = this.cfg.getProperty(defCfg.SHOW_WEEK_HEADER.key);
          +	var mindate = this.cfg.getProperty(defCfg.MINDATE.key);
          +	var maxdate = this.cfg.getProperty(defCfg.MAXDATE.key);
          +
          +	if (mindate) {
          +		mindate = YAHOO.widget.DateMath.clearTime(mindate);
          +	}
          +	if (maxdate) {
          +		maxdate = YAHOO.widget.DateMath.clearTime(maxdate);
          +	}
          +	
          +	html[html.length] = '<tbody class="m' + (useDate.getMonth()+1) + ' ' + this.Style.CSS_BODY + '">';
          +	
          +	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 = weekPrefix + weekNum;
          +
          +		// Local OOM check for performance, since we already have pagedate
          +		if (r !== 0 && hideBlankWeeks === true && workingDate.getMonth() != useDate.getMonth()) {
          +			break;
          +		} else {
          +
          +			html[html.length] = '<tr class="' + weekClass + '">';
          +			
          +			if (showWeekHeader) { html = this.renderRowHeader(weekNum, html); }
          +			
          +			for (var d=0;d<7;d++){ // Render actual days
          +
          +				cellRenderers = [];
          +				renderer = null;
          +
          +				this.clearElement(cell);
          +				cell.className = this.Style.CSS_CELL;
          +				cell.id = this.id + cellPrefix + i;
          +				this.logger.log("Rendering cell " + cell.id + " (" + workingDate.getFullYear() + "-" + (workingDate.getMonth()+1) + "-" + workingDate.getDate() + ")", "cellrender");
          +
          +				if (workingDate.getDate()		== todayDate && 
          +					workingDate.getMonth()		== todayMonth &&
          +					workingDate.getFullYear()	== todayYear) {
          +					cellRenderers[cellRenderers.length]=cal.renderCellStyleToday;
          +				}
          +				
          +				var workingArray = [workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()];
          +				this.cellDates[this.cellDates.length] = workingArray; // Add this date to cellDates
          +				
          +				// Local OOM check for performance, since we already have pagedate
          +				if (workingDate.getMonth() != useDate.getMonth()) {
          +					cellRenderers[cellRenderers.length]=cal.renderCellNotThisMonth;
          +				} else {
          +					YAHOO.util.Dom.addClass(cell, workingDayPrefix + workingDate.getDay());
          +					YAHOO.util.Dom.addClass(cell, dayPrefix + 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(workingArray) > -1) {
          +					cellRenderers[cellRenderers.length]=cal.renderCellStyleSelected; 
          +				}
          +
          +				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) {
          +					this.logger.log("renderer[" + x + "] for (" + workingDate.getFullYear() + "-" + (workingDate.getMonth()+1) + "-" + workingDate.getDate() + ")", "cellrender");
          +					if (cellRenderers[x].call(cal, 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 (hideBlankWeeks && postDays >= 7) {
          +					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 (showWeekFooter) { 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();
          +
          +	var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
          +
          +	// Find starting day of the current month
          +	var workingDate = YAHOO.widget.DateMath.findMonthStart(this.cfg.getProperty(defCfg.PAGEDATE.key));
          +
          +	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(defCfg.TITLE.key);
          +	this.cfg.refireEvent(defCfg.CLOSE.key);
          +	this.cfg.refireEvent(defCfg.IFRAME.key);
          +
          +	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 anchor = "a";
          +	var mousedown = "mousedown";
          +
          +	var linkLeft = YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_LEFT, anchor, root);
          +	var linkRight = YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_RIGHT, anchor, root);
          +
          +	if (linkLeft && linkLeft.length > 0) {
          +		this.linkLeft = linkLeft[0];
          +		YAHOO.util.Event.addListener(this.linkLeft, mousedown, cal.previousMonth, cal, true);
          +	}
          +
          +	if (linkRight && linkRight.length > 0) {
          +		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 (YAHOO.lang.hasOwnProperty(this.domEventMap, 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="#" class="' + this.Style.CSS_CELL_SELECTOR + '">' + 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) {
          +	var cfgPageDate = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key;
          +	this.cfg.setProperty(cfgPageDate, YAHOO.widget.DateMath.add(this.cfg.getProperty(cfgPageDate), 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) {
          +	var cfgPageDate = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key;
          +	this.cfg.setProperty(cfgPageDate, YAHOO.widget.DateMath.subtract(this.cfg.getProperty(cfgPageDate), 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) {
          +	var cfgPageDate = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key;
          +	this.cfg.setProperty(cfgPageDate, YAHOO.widget.DateMath.add(this.cfg.getProperty(cfgPageDate), 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) {
          +	var cfgPageDate = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key;
          +	this.cfg.setProperty(cfgPageDate, YAHOO.widget.DateMath.subtract(this.cfg.getProperty(cfgPageDate), 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() {
          +	var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
          +	this.cfg.resetProperty(defCfg.SELECTED.key);
          +	this.cfg.resetProperty(defCfg.PAGEDATE.key);
          +	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() {
          +	var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
          +	this.cfg.setProperty(defCfg.SELECTED.key, []);
          +	this.cfg.setProperty(defCfg.PAGEDATE.key, 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 cfgSelected = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key;
          +
          +	var selected = this.cfg.getProperty(cfgSelected);
          +	var aToBeSelected = this._toFieldArray(date);
          +	this.logger.log("Selection field array: " + aToBeSelected, "info");
          +
          +	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(cfgSelected, selected);
          +	} else {
          +		this.cfg.setProperty(cfgSelected, 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 cfgSelected = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key;
          +	var selected = this.cfg.getProperty(cfgSelected);
          +
          +	var cell = this.cells[cellIndex];
          +	var cellDate = this.cellDates[cellIndex];
          +
          +	var dCellDate = this._toDate(cellDate);
          +	this.logger.log("Select: " + dCellDate, "info");
          +
          +	var selectDate = cellDate.concat();
          +
          +	if (this._indexOfSelectedFieldArray(selectDate) == -1) {
          +		selected[selected.length] = selectDate;
          +	}
          +
          +	if (this.parent) {
          +		this.parent.cfg.setProperty(cfgSelected, selected);
          +	} else {
          +		this.cfg.setProperty(cfgSelected, 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 cfgSelected = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key;
          +
          +	var selected = this.cfg.getProperty(cfgSelected);
          +
          +	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(cfgSelected, selected);
          +	} else {
          +		this.cfg.setProperty(cfgSelected, 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 defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
          +	
          +	var selected = this.cfg.getProperty(defCfg.SELECTED.key);
          +
          +	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(defCfg.PAGEDATE.key).getMonth() == dCellDate.getMonth() &&
          +			this.cfg.getProperty(defCfg.PAGEDATE.key).getFullYear() == dCellDate.getFullYear()) {
          +			YAHOO.util.Dom.removeClass(cell, this.Style.CSS_CELL_SELECTED);
          +		}
          +
          +		selected.splice(cellDateIndex, 1);
          +	}
          +
          +	if (this.parent) {
          +		this.parent.cfg.setProperty(defCfg.SELECTED.key, selected);
          +	} else {
          +		this.cfg.setProperty(defCfg.SELECTED.key, 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 cfgSelected = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key;
          +
          +	var selected = this.cfg.getProperty(cfgSelected);
          +	var count = selected.length;
          +	var sel = selected.concat();
          +
          +	if (this.parent) {
          +		this.parent.cfg.setProperty(cfgSelected, []);
          +	} else {
          +		this.cfg.setProperty(cfgSelected, []);
          +	}
          +	
          +	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 (YAHOO.lang.isString(date)) {
          +		returnDate = this._parseDates(date);
          +	} else if (YAHOO.lang.isArray(date)) {
          +		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(YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key);
          +
          +	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) {
          +	return (date.getMonth() != this.cfg.getProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key).getMonth());
          +};
          +
          +/**
          + * Parses a pagedate configuration property value. The value can either be specified as a string of form "mm/yyyy" or a Date object 
          + * and is parsed into a Date object normalized to the first day of the month. If no value is passed in, the month and year from today's date are used to create the Date object 
          + * @method	_parsePageDate
          + * @private
          + * @param {Date|String}	date	Pagedate value which needs to be parsed
          + * @return {Date}	The Date object representing the pagedate
          + */
          +YAHOO.widget.Calendar.prototype._parsePageDate = function(date) {
          +	var parsedDate;
          +	
          +	var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
          +
          +	if (date) {
          +		if (date instanceof Date) {
          +			parsedDate = YAHOO.widget.DateMath.findMonthStart(date);
          +		} else {
          +			var month, year, aMonthYear;
          +			aMonthYear = date.split(this.cfg.getProperty(defCfg.DATE_FIELD_DELIMITER.key));
          +			month = parseInt(aMonthYear[this.cfg.getProperty(defCfg.MY_MONTH_POSITION.key)-1], 10)-1;
          +			year = parseInt(aMonthYear[this.cfg.getProperty(defCfg.MY_YEAR_POSITION.key)-1], 10);
          +			
          +			parsedDate = new Date(year, month, 1);
          +		}
          +	} else {
          +		parsedDate = new Date(this.today.getFullYear(), this.today.getMonth(), 1);
          +	}
          +	return parsedDate;
          +};
          +
          +// 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(YAHOO.widget.Calendar._DEFAULT_CONFIG.MULTI_SELECT.key) === 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 cfgPageDate = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key;
          +	var current = this.cfg.getProperty(cfgPageDate);
          +	current.setMonth(parseInt(month, 10));
          +	this.cfg.setProperty(cfgPageDate, 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 cfgPageDate = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key;
          +	var current = this.cfg.getProperty(cfgPageDate);
          +	current.setFullYear(parseInt(year, 10));
          +	this.cfg.setProperty(cfgPageDate, 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(YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key);
          +
          +	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;
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/CalendarGroup.js.html b/www/extras/yui/docs/CalendarGroup.js.html new file mode 100644 index 000000000..63d2b1c37 --- /dev/null +++ b/www/extras/yui/docs/CalendarGroup.js.html @@ -0,0 +1,1230 @@ + + + + API: calendar CalendarGroup.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Calendar  2.2.2

          +

          + Yahoo! UI Library + > calendar + + > CalendarGroup.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +* 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.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<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);
          +	}
          +	this.logger.log("Initialized " + this.pages.length + "-page CalendarGroup", "info");
          +};
          +
          +
          +YAHOO.widget.CalendarGroup.prototype.setupConfig = function() {
          +	
          +	var defCfg = YAHOO.widget.CalendarGroup._DEFAULT_CONFIG;
          +	
          +	/**
          +	* 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(defCfg.PAGES.key, { value:defCfg.PAGES.value, 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(defCfg.PAGEDATE.key, { 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(defCfg.SELECTED.key, { value:[], handler:this.configSelected } );
          +
          +	/**
          +	* The title to display above the CalendarGroup's month header
          +	* @config title
          +	* @type String
          +	* @default ""
          +	*/
          +	this.cfg.addProperty(defCfg.TITLE.key, { value:defCfg.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(defCfg.CLOSE.key, { value:defCfg.CLOSE.value, 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(defCfg.IFRAME.key, { value:defCfg.IFRAME.value, 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(defCfg.MINDATE.key, { value:defCfg.MINDATE.value, handler:this.delegateConfig } );
          +
          +	/**
          +	* The maximum selectable date in the current Calendar (mm/dd/yyyy)
          +	* @config maxdate
          +	* @type String
          +	* @default null
          +	*/	
          +	this.cfg.addProperty(defCfg.MAXDATE.key, { value:defCfg.MAXDATE.value, 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(defCfg.MULTI_SELECT.key,	{ value:defCfg.MULTI_SELECT.value, 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(defCfg.START_WEEKDAY.key,	{ value:defCfg.START_WEEKDAY.value, 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(defCfg.SHOW_WEEKDAYS.key,	{ value:defCfg.SHOW_WEEKDAYS.value, 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(defCfg.SHOW_WEEK_HEADER.key,{ value:defCfg.SHOW_WEEK_HEADER.value, 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(defCfg.SHOW_WEEK_FOOTER.key,{ value:defCfg.SHOW_WEEK_FOOTER.value, 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(defCfg.HIDE_BLANK_WEEKS.key,{ value:defCfg.HIDE_BLANK_WEEKS.value, handler:this.delegateConfig, validator:this.cfg.checkBoolean } );
          +	
          +	/**
          +	* The image that should be used for the left navigation arrow.
          +	* @config NAV_ARROW_LEFT
          +	* @type String
          +	* @deprecated	You can customize the image by overriding the default CSS class for the left arrow - "calnavleft"
          +	* @default null
          +	*/		
          +	this.cfg.addProperty(defCfg.NAV_ARROW_LEFT.key,	{ value:defCfg.NAV_ARROW_LEFT.value, handler:this.delegateConfig } );
          +	
          +	/**
          +	* The image that should be used for the right navigation arrow.
          +	* @config NAV_ARROW_RIGHT
          +	* @type String
          +	* @deprecated	You can customize the image by overriding the default CSS class for the right arrow - "calnavright"
          +	* @default null
          +	*/		
          +	this.cfg.addProperty(defCfg.NAV_ARROW_RIGHT.key,	{ value:defCfg.NAV_ARROW_RIGHT.value, 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(defCfg.MONTHS_SHORT.key,	{ value:defCfg.MONTHS_SHORT.value, 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(defCfg.MONTHS_LONG.key,		{ value:defCfg.MONTHS_LONG.value, 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(defCfg.WEEKDAYS_1CHAR.key,	{ value:defCfg.WEEKDAYS_1CHAR.value, 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(defCfg.WEEKDAYS_SHORT.key,	{ value:defCfg.WEEKDAYS_SHORT.value, 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(defCfg.WEEKDAYS_MEDIUM.key,	{ value:defCfg.WEEKDAYS_MEDIUM.value, 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(defCfg.WEEKDAYS_LONG.key,	{ value:defCfg.WEEKDAYS_LONG.value, 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(defCfg.LOCALE_MONTHS.key,	{ value:defCfg.LOCALE_MONTHS.value, 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(defCfg.LOCALE_WEEKDAYS.key,	{ value:defCfg.LOCALE_WEEKDAYS.value, 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(defCfg.DATE_DELIMITER.key,		{ value:defCfg.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(defCfg.DATE_FIELD_DELIMITER.key,{ value:defCfg.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(defCfg.DATE_RANGE_DELIMITER.key,{ value:defCfg.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(defCfg.MY_MONTH_POSITION.key,	{ value:defCfg.MY_MONTH_POSITION.value, 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(defCfg.MY_YEAR_POSITION.key,	{ value:defCfg.MY_YEAR_POSITION.value, 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(defCfg.MD_MONTH_POSITION.key,	{ value:defCfg.MD_MONTH_POSITION.value, 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(defCfg.MD_DAY_POSITION.key,		{ value:defCfg.MD_DAY_POSITION.value, 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(defCfg.MDY_MONTH_POSITION.key,	{ value:defCfg.MDY_MONTH_POSITION.value, 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(defCfg.MDY_DAY_POSITION.key,	{ value:defCfg.MDY_DAY_POSITION.value, 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(defCfg.MDY_YEAR_POSITION.key,	{ value:defCfg.MDY_YEAR_POSITION.value, handler:this.delegateConfig, validator:this.cfg.checkNumber } );
          +
          +};
          +
          +/**
          +* Initializes CalendarGroup's built-in CustomEvents
          +* @method initEvents
          +*/
          +YAHOO.widget.CalendarGroup.prototype.initEvents = function() {
          +	var me = this;
          +	var strEvent = "Event";
          +
          +	/**
          +	* 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 + strEvent].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 + strEvent].unsubscribe(fn, obj);
          +		}
          +	};
          +	
          +	var defEvents = YAHOO.widget.Calendar._EVENT_TYPES;
          +
          +	/**
          +	* Fired before a selection is made
          +	* @event beforeSelectEvent
          +	*/
          +	this.beforeSelectEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_SELECT);
          +	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(defEvents.SELECT); 
          +	this.selectEvent.subscribe = sub; this.selectEvent.unsubscribe = unsub;
          +
          +	/**
          +	* Fired before a selection is made
          +	* @event beforeDeselectEvent
          +	*/
          +	this.beforeDeselectEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_DESELECT); 
          +	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(defEvents.DESELECT); 
          +	this.deselectEvent.subscribe = sub; this.deselectEvent.unsubscribe = unsub;
          +	
          +	/**
          +	* Fired when the Calendar page is changed
          +	* @event changePageEvent
          +	*/
          +	this.changePageEvent = new YAHOO.util.CustomEvent(defEvents.CHANGE_PAGE); 
          +	this.changePageEvent.subscribe = sub; this.changePageEvent.unsubscribe = unsub;
          +
          +	/**
          +	* Fired before the Calendar is rendered
          +	* @event beforeRenderEvent
          +	*/
          +	this.beforeRenderEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_RENDER);
          +	this.beforeRenderEvent.subscribe = sub; this.beforeRenderEvent.unsubscribe = unsub;
          +
          +	/**
          +	* Fired when the Calendar is rendered
          +	* @event renderEvent
          +	*/
          +	this.renderEvent = new YAHOO.util.CustomEvent(defEvents.RENDER);
          +	this.renderEvent.subscribe = sub; this.renderEvent.unsubscribe = unsub;
          +
          +	/**
          +	* Fired when the Calendar is reset
          +	* @event resetEvent
          +	*/
          +	this.resetEvent = new YAHOO.util.CustomEvent(defEvents.RESET); 
          +	this.resetEvent.subscribe = sub; this.resetEvent.unsubscribe = unsub;
          +
          +	/**
          +	* Fired when the Calendar is cleared
          +	* @event clearEvent
          +	*/
          +	this.clearEvent = new YAHOO.util.CustomEvent(defEvents.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];
          +
          +	var cfgPageDate = YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.PAGEDATE.key;
          +
          +	// Define literals outside loop	
          +	var sep = "_";
          +	var groupCalClass = "groupcal";
          +	var firstClass = "first";
          +	var lastClass = "last";
          +
          +	for (var p=0;p<pageCount;++p) {
          +		var calId = this.id + sep + p;
          +		var calContainerId = this.containerId + sep + p;
          +
          +		var childConfig = this.cfg.getConfig();
          +		childConfig.close = false;
          +		childConfig.title = false;
          +
          +		var cal = this.constructChild(calId, calContainerId, childConfig);
          +		var caldate = cal.cfg.getProperty(cfgPageDate);
          +		this._setMonthOnDate(caldate, caldate.getMonth() + p);
          +		cal.cfg.setProperty(cfgPageDate, caldate);
          +		
          +		YAHOO.util.Dom.removeClass(cal.oDomContainer, this.Style.CSS_SINGLE);
          +		YAHOO.util.Dom.addClass(cal.oDomContainer, groupCalClass);
          +		
          +		if (p===0) {
          +			YAHOO.util.Dom.addClass(cal.oDomContainer, firstClass);
          +		}
          +
          +		if (p==(pageCount-1)) {
          +			YAHOO.util.Dom.addClass(cal.oDomContainer, lastClass);
          +		}
          +		
          +		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];
          +	var firstPageDate;
          +	
          +	var cfgPageDate = YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.PAGEDATE.key;
          +	
          +	for (var p=0;p<this.pages.length;++p) {
          +		var cal = this.pages[p];
          +		if (p === 0) {
          +			firstPageDate = cal._parsePageDate(val);
          +			cal.cfg.setProperty(cfgPageDate, firstPageDate);
          +		} else {
          +			var pageDate = new Date(firstPageDate);
          +			this._setMonthOnDate(pageDate, pageDate.getMonth() + p);
          +			cal.cfg.setProperty(cfgPageDate, pageDate);
          +		}
          +	}
          +};
          +
          +/**
          +* The default Config handler for the CalendarGroup "selected" property
          +* @method configSelected
          +* @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.configSelected = function(type, args, obj) {
          +	var cfgSelected = YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.SELECTED.key;
          +	this.delegateConfig(type, args, obj);
          +	var selected = (this.pages.length > 0) ? this.pages[0].cfg.getProperty(cfgSelected) : []; 
          +	this.cfg.setProperty(cfgSelected, selected, true);
          +};
          +
          +
          +/**
          +* 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(YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.PAGES.key);
          +
          +	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(YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.PAGES.key);
          +
          +	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
          +* page of the multi-page calendar, and all other months will be iterated appropriately.
          +* @method setMonth
          +* @param {Number}	month		The numeric month, from 0 (January) to 11 (December)
          +*/
          +YAHOO.widget.CalendarGroup.prototype.setMonth = function(month) {
          +	month = parseInt(month, 10);
          +	var currYear;
          +	
          +	var cfgPageDate = YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.PAGEDATE.key;
          +	
          +	for (var p=0; p<this.pages.length; ++p) {
          +		var cal = this.pages[p];
          +		var pageDate = cal.cfg.getProperty(cfgPageDate);
          +		if (p === 0) {
          +			currYear = pageDate.getFullYear();
          +		} else {
          +			pageDate.setYear(currYear);
          +		}
          +		this._setMonthOnDate(pageDate, month+p); 
          +		cal.cfg.setProperty(cfgPageDate, pageDate);
          +	}
          +};
          +
          +/**
          +* 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.
          +* @method setYear
          +* @param {Number}	year		The numeric 4-digit year
          +*/
          +YAHOO.widget.CalendarGroup.prototype.setYear = function(year) {
          +
          +	var cfgPageDate = YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.PAGEDATE.key;
          +
          +	year = parseInt(year, 10);
          +	for (var p=0;p<this.pages.length;++p) {
          +		var cal = this.pages[p];
          +		var pageDate = cal.cfg.getProperty(cfgPageDate);
          +
          +		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 dates in the CalendarGroup based on the cell index provided. This method is used to select cells without having to do a full render. The selected style is applied to the cells directly.
          +* The value of the MULTI_SELECT Configuration attribute will determine the set of dates which get selected. 
          +* <ul>
          +*    <li>If MULTI_SELECT is false, selectCell will select the cell at the specified index for only the last displayed Calendar page.</li>
          +*    <li>If MULTI_SELECT is true, selectCell will select the cell at the specified index, on each displayed Calendar page.</li>
          +* </ul>
          +* @method selectCell
          +* @param	{Number}	cellIndex	The index of the cell to be selected. 
          +* @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 dates in the CalendarGroup based on the cell index provided. This method is used to select cells without having to do a full render. The selected style is applied to the cells directly.
          +* deselectCell will deselect the cell at the specified index on each displayed Calendar page.
          +*
          +* @method deselectCell
          +* @param	{Number}	cellIndex	The index of the cell to deselect. 
          +* @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(YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.SELECTED.key);
          +	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);
          +};
          +
          +/**
          +* Sets the month on a Date object, taking into account year rollover if the month is less than 0 or greater than 11.
          +* The Date object passed in is modified. It should be cloned before passing it into this method if the original value needs to be maintained
          +* @method	_setMonthOnDate
          +* @private
          +* @param	{Date}	date	The Date object on which to set the month index
          +* @param	{Number}	iMonth	The month index to set
          +*/
          +YAHOO.widget.CalendarGroup.prototype._setMonthOnDate = function(date, iMonth) {
          +	// BUG in Safari 1.3, 2.0 (WebKit build < 420), Date.setMonth does not work consistently if iMonth is not 0-11
          +	if (this.browser == "safari" && (iMonth < 0 || iMonth > 11)) {
          +		var DM = YAHOO.widget.DateMath;
          +		var newDate = DM.add(date, DM.MONTH, iMonth-date.getMonth());
          +		date.setTime(newDate.getTime());
          +	} else {
          +		date.setMonth(iMonth);
          +	}
          +};
          +
          +
          +/**
          +* 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
          +* @deprecated	Along with Calendar.IMG_ROOT and NAV_ARROW_LEFT, NAV_ARROW_RIGHT configuration properties.
          +*					Calendar's <a href="YAHOO.widget.Calendar.html#Style.CSS_CLOSE">Style.CSS_CLOSE</a> property now represents the CSS class used to render the close icon
          +* @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",
          +																 "configIframe",
          +																 "hide",
          +																 "show",
          +																 "browser");
          +
          +/**
          +* The set of default Config property keys and values for the CalendarGroup
          +* @property YAHOO.widget.CalendarGroup._DEFAULT_CONFIG
          +* @final
          +* @static
          +* @private
          +* @type Object
          +*/
          +YAHOO.widget.CalendarGroup._DEFAULT_CONFIG = YAHOO.widget.Calendar._DEFAULT_CONFIG;
          +YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.PAGES = {key:"pages", value:2};
          +
          +/**
          +* 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 © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/ColorAnim.js.html b/www/extras/yui/docs/ColorAnim.js.html new file mode 100644 index 000000000..ab6eb9bb9 --- /dev/null +++ b/www/extras/yui/docs/ColorAnim.js.html @@ -0,0 +1,253 @@ + + + + API: animation ColorAnim.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          animation  2.2.2

          +

          + Yahoo! UI Library + > animation + + > ColorAnim.js (source view) +

          +
          + +
          +
          +
          + +
          +
          (function() {
          +/**
          + * 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)
          + */
          +    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;
          +        }
          +    };
          +})();
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Column.html b/www/extras/yui/docs/Column.html new file mode 100644 index 000000000..5b5f7a51a --- /dev/null +++ b/www/extras/yui/docs/Column.html @@ -0,0 +1,1602 @@ + + + + API: datatable Column (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          DataTable Widget  2.2.2

          +

          + Yahoo! UI Library + > datatable + > Column + +

          +
          + +
          +
          +
          + + +

          + + + + + Class Column + + + + + + + +

          + + + + + +
          + The Column class defines and manages attributes of DataTable Columns +
          + +
          +

          Constructor

          +
          +
          + Column + + ( + + + + oConfigs + ) + +
          +
          +
          Parameters:
          +
          + oConfigs + <Object> + + Object literal of configuration values. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _children + - private YAHOO.widget.Column[] +

          +
          +
          + Array of Column's chilren, or null. +
          +
          + + + + +
          +

          _colspan + - private Number +

          +
          +
          + Number of table cells the Column spans. +
          +
          + + + + +
          +

          _id + - private String +

          +
          +
          + Unique ID, also assigned as DOM ID. +
          +
          + + + + +
          +

          _index + - private Number +

          +
          +
          + Reference to Column's index within its ColumnSet's key array, or null if not applicable. +
          +
          + + + + +
          +

          _minWidth + - private Number +

          +
          +
          + Minimum width the Column can support (in pixels). Value is populated only if table +is fixedWidth, null otherwise. +
          +
          + + + + +
          +

          _nCount + - static Number +

          +
          +
          + Internal instance counter. +
          +
          + + +
          + Default Value: 0 +
          + + +
          +

          _parent + - private YAHOO.widget.Column +

          +
          +
          + Column's parent, or null. +
          +
          + + + + +
          +

          _rowspan + - private Number +

          +
          +
          + Number of table rows the Column spans. +
          +
          + + + + +
          +

          _width + - private Number +

          +
          +
          + Current offsetWidth of the Column (in pixels). +
          +
          + + + + +
          +

          abbr + - String +

          +
          +
          + Column head cell ABBR for accessibility. +
          +
          + + + + +
          +

          children + - Object[] +

          +
          +
          + Array of object literals that define children (nested headers) of a Column. +
          +
          + + + + +
          +

          className + - String +

          +
          +
          + Custom CSS class to be applied to every cell in the Column. +
          +
          + + + + +
          +

          editor + - String +

          +
          +
          + Defines the type of editor for Column, otherwise Column is not editable. +
          +
          + + + + +
          +

          formatter + - HTMLFunction +

          +
          +
          + Defines a custom format function for Column, otherwise default is used, +according to Column type. +
          +
          + + + + +
          +

          getIndex + - object +

          +
          +
          + Public accessor returns Column's index within its ColumnSet's key array, or +null if not applicable. +
          +
          + + + + +
          +

          key + - String +

          +
          +
          + Associated database field, or null. +
          +
          + + + + +
          +

          parser + - HTMLFunction +

          +
          +
          + Defines a custom parse function for Column, otherwise default is used, +according to Column type. +
          +
          + + + + +
          +

          resizeable + - Boolean +

          +
          +
          + True if Column is resizeable, false otherwise. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          sortable + - Boolean +

          +
          +
          + True if Column is sortable, false otherwise. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          sortOptions.ascFunction + - Function +

          +
          +
          + Custom sort handler to arrange Column in ascending order. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          sortOptions.descFunction + - Function +

          +
          +
          + Custom sort handler to arrange Column in descending order. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          text + - String +

          +
          +
          + Text or HTML for display in Column's assocated TH element. +
          +
          + + + + +
          +

          type + - String +

          +
          +
          + Data types: "string", "number", "date", "currency", "checkbox", "select", +"email", "link". +
          +
          + + +
          + Default Value: "string" +
          + + +
          +

          width + - String +

          +
          +
          + Column width. +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + format

          +
          + + + + + HTML + format + ( + + + elCell + + + , + oRecord + + + ) + + +
          + Outputs markup into the given TD based on given Record. +
          + +
          + +
          +
          Parameters:
          +
          + elCell <HTMLElement> + TD to format for display. +
          +
          + oRecord <YAHOO.widget.Record> + Record that holds data for the row. +
          +
          + +
          +
          Returns: + + HTML +
          +
          Markup.
          +
          + +
          + +
          +
          +

          + formatCheckbox

          +
          + + + static + + void + formatCheckbox + ( + + + elCell + + + , + oRecord + + + , + oColumn + + + , + oData + + + ) + + +
          + Formats cells in Columns of type "checkbox". +
          + +
          + +
          +
          Parameters:
          +
          + elCell <HTMLElement> + Table cell element. +
          +
          + oRecord <YAHOO.widget.Record> + Record instance. +
          +
          + oColumn <YAHOO.widget.Column> + Column instance. +
          +
          + oData <Object> + Data value for the cell, or null +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + formatCurrency

          +
          + + + static + + void + formatCurrency + ( + + + elCell + + + , + oRecord + + + , + oColumn + + + , + oData + + + ) + + +
          + Formats cells in Columns of type "currency". Can be overridden for custom formatting. +
          + +
          + +
          +
          Parameters:
          +
          + elCell <HTMLElement> + Table cell element. +
          +
          + oRecord <YAHOO.widget.Record> + Record instance. +
          +
          + oColumn <YAHOO.widget.Column> + Column instance. +
          +
          + oData <Object> + Data value for the cell, or null +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + formatDate

          +
          + + + static + + void + formatDate + ( + + + elCell + + + , + oRecord + + + , + oColumn + + + , + oData + + + ) + + +
          + Formats cells in Columns of type "date". +
          + +
          + +
          +
          Parameters:
          +
          + elCell <HTMLElement> + Table cell element. +
          +
          + oRecord <YAHOO.widget.Record> + Record instance. +
          +
          + oColumn <YAHOO.widget.Column> + Column instance. +
          +
          + oData <Object> + Data value for the cell, or null +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + formatEmail

          +
          + + + static + + void + formatEmail + ( + + + elCell + + + , + oRecord + + + , + oColumn + + + , + oData + + + ) + + +
          + Formats cells in Columns of type "email". +
          + +
          + +
          +
          Parameters:
          +
          + elCell <HTMLElement> + Table cell element. +
          +
          + oRecord <YAHOO.widget.Record> + Record instance. +
          +
          + oColumn <YAHOO.widget.Column> + Column instance. +
          +
          + oData <Object> + Data value for the cell, or null +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + formatLink

          +
          + + + static + + void + formatLink + ( + + + elCell + + + , + oRecord + + + , + oColumn + + + , + oData + + + ) + + +
          + Formats cells in Columns of type "link". +
          + +
          + +
          +
          Parameters:
          +
          + elCell <HTMLElement> + Table cell element. +
          +
          + oRecord <YAHOO.widget.Record> + Record instance. +
          +
          + oColumn <YAHOO.widget.Column> + Column instance. +
          +
          + oData <Object> + Data value for the cell, or null +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + formatNumber

          +
          + + + static + + void + formatNumber + ( + + + elCell + + + , + oRecord + + + , + oColumn + + + , + oData + + + ) + + +
          + Formats cells in Columns of type "number". +
          + +
          + +
          +
          Parameters:
          +
          + elCell <HTMLElement> + Table cell element. +
          +
          + oRecord <YAHOO.widget.Record> + Record instance. +
          +
          + oColumn <YAHOO.widget.Column> + Column instance. +
          +
          + oData <Object> + Data value for the cell, or null +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + formatSelect

          +
          + + + static + + void + formatSelect + ( + + + elCell + + + , + oRecord + + + , + oColumn + + + , + oData + + + ) + + +
          + Formats cells in Columns of type "select". +
          + +
          + +
          +
          Parameters:
          +
          + elCell <HTMLElement> + Table cell element. +
          +
          + oRecord <YAHOO.widget.Record> + Record instance. +
          +
          + oColumn <YAHOO.widget.Column> + Column instance. +
          +
          + oData <Object> + Data value for the cell, or null +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getColSpan

          +
          + + + + + Number + getColSpan + ( + ) + + +
          + Public accessor returns Column's colspan number. +
          + +
          + + +
          +
          Returns: + + Number +
          +
          Column's colspan number.
          +
          + +
          + +
          +
          +

          + getId

          +
          + + + + + String + getId + ( + ) + + +
          + Public accessor returns Column's ID string. +
          + +
          + + +
          +
          Returns: + + String +
          +
          Column's ID string.
          +
          + +
          + +
          +
          +

          + getRowSpan

          +
          + + + + + Number + getRowSpan + ( + ) + + +
          + Public accessor returns Column's rowspan number. +
          + +
          + + +
          +
          Returns: + + Number +
          +
          Column's rowspan number.
          +
          + +
          + +
          +
          +

          + parse

          +
          + + + + + Object + parse + ( + + + sMarkup + + + ) + + +
          + Takes innerHTML from TD and parses out data for storage in RecordSet. +
          + +
          + +
          +
          Parameters:
          +
          + sMarkup <String> + The TD's innerHTML value. +
          +
          + +
          +
          Returns: + + Object +
          +
          Data.
          +
          + +
          + +
          +
          +

          + parseCheckbox

          +
          + + + + + bChecked + parseCheckbox + ( + + + sMarkup + + + ) + + +
          + Default parse function for Columns of type "checkbox" takes markup and +extracts data. Can be overridden for custom parsing. +
          + +
          + +
          +
          Parameters:
          +
          + sMarkup <object> + +
          +
          + +
          +
          Returns: + + bChecked +
          +
          True if checkbox is checked.
          +
          + +
          + +
          +
          +

          + parseCurrency

          +
          + + + + + nAmount + parseCurrency + ( + + + sMarkup + + + ) + + +
          + Default parse function for Columns of type "currency" takes markup and +extracts data. Can be overridden for custom parsing. +
          + +
          + +
          +
          Parameters:
          +
          + sMarkup <object> + +
          +
          + +
          +
          Returns: + + nAmount +
          +
          Floating point amount.
          +
          + +
          + +
          +
          +

          + parseDate

          +
          + + + + + oDate + parseDate + ( + + + sMarkup + + + ) + + +
          + Default parse function for Columns of type "date" takes markup and extracts +data. Can be overridden for custom parsing. +
          + +
          + +
          +
          Parameters:
          +
          + sMarkup <object> + +
          +
          + +
          +
          Returns: + + oDate +
          +
          Date instance.
          +
          + +
          + +
          +
          +

          + parseNumber

          +
          + + + + + nNumber + parseNumber + ( + + + sMarkup + + + ) + + +
          + Default parse function for Columns of type "number" takes markup and extracts +data. Can be overridden for custom parsing. +
          + +
          + +
          +
          Parameters:
          +
          + sMarkup <object> + +
          +
          + +
          +
          Returns: + + nNumber +
          +
          Number.
          +
          + +
          + +
          +
          +

          + parseSelect

          +
          + + + + + sValue + parseSelect + ( + + + sMarkup + + + ) + + +
          + Default parse function for Columns of type "select" takes markup and extracts +data. Can be overridden for custom parsing. +
          + +
          + +
          +
          Parameters:
          +
          + sMarkup <object> + +
          +
          + +
          +
          Returns: + + sValue +
          +
          Value of selected option.
          +
          + +
          + +
          +
          +

          + showEditor

          +
          + + + + + void + showEditor + ( + + + elCell + + + , + oRecord + + + ) + + +
          + Outputs editor markup into the given TD based on given Record. +
          + +
          + +
          +
          Parameters:
          +
          + elCell <HTMLElement> + The cell to edit. +
          +
          + oRecord <YAHOO.widget.Record> + The DataTable Record of the cell. +
          +
          + +
          +
          Returns: + + void +
          +
          YAHOO.widget.ColumnEditor
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/ColumnEditor.html b/www/extras/yui/docs/ColumnEditor.html new file mode 100644 index 000000000..088c03ed7 --- /dev/null +++ b/www/extras/yui/docs/ColumnEditor.html @@ -0,0 +1,744 @@ + + + + API: datatable ColumnEditor (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          DataTable Widget  2.2.2

          +

          + Yahoo! UI Library + > datatable + > ColumnEditor + +

          +
          + +
          +
          +
          + + +

          + + + + + Class ColumnEditor + + + + + + + +

          + + + + + +
          + The ColumnEditor defines and manages inline editing functionality for a +DataTable Column. +
          + +
          +

          Constructor

          +
          +
          + ColumnEditor + + ( + + + + elCell + + , + oRecord + + , + oColumn + ) + +
          +
          +
          Parameters:
          +
          + elCell + <HTMLElement> + + The cell to edit. +
          +
          + oRecord + <YAHOO.widget.Record> + + The DataTable Record of the cell. +
          +
          + oColumn + <YAHOO.widget.Column> + + The DataTable Column of the cell. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _nCount + - static Number +

          +
          +
          + Internal instance counter. +
          +
          + + +
          + Default Value: 0 +
          + + +
          +

          column + - YAHOO.widget.Column +

          +
          +
          + Reference to the ColumnEditor's Column instance. +
          +
          + + + + +
          +

          container + - HTMLElement +

          +
          +
          + Reference to the container DOM element for the ColumnEditor. +
          +
          + + + + +
          +

          input + - HTMLElement || HTMLElement[] +

          +
          +
          + Reference to form element(s) of the ColumnEditor. +
          +
          + + + + +
          +

          type + - String +

          +
          +
          + Type of editor: "textbox", etc. +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + createTextareaEditor

          +
          + + + + + HTML + createTextareaEditor + ( + ) + + +
          + Creates a textarea editor in the DOM. +
          + +
          + + +
          +
          Returns: + + HTML +
          +
          ???
          +
          + +
          + +
          +
          +

          + createTextboxEditor

          +
          + + + + + HTML + createTextboxEditor + ( + ) + + +
          + Creates a textbox editor in the DOM. +
          + +
          + + +
          +
          Returns: + + HTML +
          +
          ???
          +
          + +
          + +
          +
          +

          + getTextareaEditorValue

          +
          + + + + + void + getTextareaEditorValue + ( + ) + + +
          + Returns ColumnEditor value +
          + +
          + + +
          +
          Returns: + + void +
          +
          String
          +
          + +
          + +
          +
          +

          + getTextboxEditorValue

          +
          + + + + + void + getTextboxEditorValue + ( + ) + + +
          + Returns ColumnEditor value +
          + +
          + + +
          +
          Returns: + + void +
          +
          String
          +
          + +
          + +
          +
          +

          + getValue

          +
          + + + + + void + getValue + ( + ) + + +
          + Returns ColumnEditor data value. +
          + +
          + + +
          +
          Returns: + + void +
          +
          Object
          +
          + +
          + +
          +
          +

          + hide

          +
          + + + + + void + hide + ( + ) + + +
          + Hides ColumnEditor +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + moveContainerTo

          +
          + + + + + void + moveContainerTo + ( + + + elCell + + + ) + + +
          + Positions container over given element, aligning upper-left corners. +
          + +
          + +
          +
          Parameters:
          +
          + elCell <HTMLElement> + The element. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + show

          +
          + + + + + void + show + ( + + + elCell + + + , + oRecord + + + , + oColumn + + + ) + + +
          + Shows ColumnEditor. +
          + +
          + +
          +
          Parameters:
          +
          + elCell <HTMLElement> + The cell to edit. +
          +
          + oRecord <YAHOO.widget.Record> + The DataTable Record of the cell. +
          +
          + oColumn <YAHOO.widget.Column> + The DataTable Column of the cell. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + showTextareaEditor

          +
          + + + + + void + showTextareaEditor + ( + + + elCell + + + , + oRecord + + + , + oColumn + + + ) + + +
          + Shows textarea. +
          + +
          + +
          +
          Parameters:
          +
          + elCell <HTMLElement> + The cell to edit. +
          +
          + oRecord <YAHOO.widget.Record> + The DataTable Record of the cell. +
          +
          + oColumn <YAHOO.widget.Column> + The DataTable Column of the cell. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + showTextboxEditor

          +
          + + + + + void + showTextboxEditor + ( + + + elCell + + + , + oRecord + + + , + oColumn + + + ) + + +
          + Shows textbox. +
          + +
          + +
          +
          Parameters:
          +
          + elCell <HTMLElement> + The cell to edit. +
          +
          + oRecord <YAHOO.widget.Record> + The DataTable Record of the cell. +
          +
          + oColumn <YAHOO.widget.Column> + The DataTable Column of the cell. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/ColumnSet.html b/www/extras/yui/docs/ColumnSet.html new file mode 100644 index 000000000..6b6aafe73 --- /dev/null +++ b/www/extras/yui/docs/ColumnSet.html @@ -0,0 +1,365 @@ + + + + API: datatable ColumnSet (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          DataTable Widget  2.2.2

          +

          + Yahoo! UI Library + > datatable + > ColumnSet + +

          +
          + +
          +
          +
          + + +

          + + + + + Class ColumnSet + + + + + - uses + + YAHOO.util.EventProvider + + + + +

          + + + + + +
          + The ColumnSet class defines and manages a DataTable's Columns, +including nested hierarchies and access to individual Column instances. +
          + +
          +

          Constructor

          +
          +
          + ColumnSet + + ( + + + + aHeaders + ) + +
          +
          +
          Parameters:
          +
          + aHeaders + <Object[]> + + Array of object literals that define header cells. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _nCount + - private static number +

          +
          +
          + Internal class variable to index multiple data table instances. +
          +
          + + + + +
          +

          _sName + - private String +

          +
          +
          + Unique instance name. +
          +
          + + + + +
          +

          flat + - YAHOO.widget.Column[] +

          +
          +
          + Flattened representation of all Columns. +
          +
          + + +
          + Default Value: [] +
          + + +
          +

          headers + - String[] +

          +
          +
          + ID index of nested parent heirarchies for HEADERS accessibility attribute. +
          +
          + + +
          + Default Value: [] +
          + + +
          +

          keys + - YAHOO.widget.Column[] +

          +
          +
          + Array of Columns that map one-to-one to a table column. +
          +
          + + +
          + Default Value: [] +
          + + +
          +

          tree + - YAHOO.widget.Column[] +

          +
          +
          + Top-down tree representation of Column hierarchy. +
          +
          + + + + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Methods

          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Public accessor to the unique name of the ColumnSet instance. +
          + +
          + + +
          +
          Returns: + + String +
          +
          Unique name of the ColumnSet instance.
          +
          + +
          + +
          +
          +
          +
          + +
          +

          Methods inherited from YAHOO.util.EventProvider:

          + +
          + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/ColumnSet.js.html b/www/extras/yui/docs/ColumnSet.js.html new file mode 100644 index 000000000..0184f0430 --- /dev/null +++ b/www/extras/yui/docs/ColumnSet.js.html @@ -0,0 +1,1565 @@ + + + + API: datatable ColumnSet.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          DataTable Widget  2.2.2

          +

          + Yahoo! UI Library + > datatable + + > ColumnSet.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /****************************************************************************/
          +/****************************************************************************/
          +/****************************************************************************/
          +
          +/**
          + * The ColumnSet class defines and manages a DataTable's Columns,
          + * including nested hierarchies and access to individual Column instances.
          + *
          + * @class ColumnSet
          + * @uses YAHOO.util.EventProvider
          + * @constructor
          + * @param aHeaders {Object[]} Array of object literals that define header cells.
          + */
          +YAHOO.widget.ColumnSet = function(aHeaders) {
          +//TODO: break out nested functions into private methods
          +    this._sName = "instance" + YAHOO.widget.ColumnSet._nCount;
          +
          +    // Top-down tree representation of all Columns
          +    var tree = [];
          +    // Flat representation of all Columns
          +    var flat = [];
          +    // Flat representation of only Columns that display data
          +    var keys = [];
          +    // ID index of nested parent heirarchies for HEADERS attribute
          +    var headers = [];
          +
          +    var nodelevel = -1;
          +
          +    // Internal recursive function to parse Columns out of object literal defs
          +    var parseColumns = function(nodeList, parent) {
          +        nodelevel++;
          +        // A node level is an array of Columns
          +        if(!tree[nodelevel]) {
          +            tree[nodelevel] = [];
          +        }
          +
          +        // Determine depth of descendants at this level for node's rowspan
          +        var nodeLevelMaxChildren = 0;
          +        var recurseChildren = function(nodeList) {
          +            var tmpMax = 0;
          +            for(var i=0; i<nodeList.length; i++) {
          +                if(nodeList[i].children) {
          +                    tmpMax++;
          +                    recurseChildren(nodeList[i].children);
          +                }
          +                if(tmpMax > nodeLevelMaxChildren) {
          +                    nodeLevelMaxChildren = tmpMax;
          +                }
          +            }
          +        };
          +        recurseChildren(nodeList);
          +
          +        // Parse each node for attributes and any children
          +        for(var j=0; j<nodeList.length; j++) {
          +            // Instantiate a Column for each node
          +            var oColumn = new YAHOO.widget.Column(nodeList[j]);
          +            flat.push(oColumn);
          +            
          +            // Assign parent, if applicable
          +            if(parent) {
          +                oColumn._parent = parent;
          +            }
          +
          +            // Start with default values
          +            oColumn._rowspan = 1;
          +            oColumn._colspan = 1;
          +
          +            // Column may have children
          +            if(nodeList[j].children) {
          +                var children = nodeList[j].children;
          +                var length = children.length;
          +                
          +                // Cascade certain properties to children if not defined on their own
          +                for(var k=0; k<length; k++) {
          +                    var child = children[k];
          +                    if(oColumn.className && (child.className === undefined)) {
          +                        child.className = oColumn.className;
          +                    }
          +                    if(oColumn.editor && (child.editor === undefined)) {
          +                        child.editor = oColumn.editor;
          +                    }
          +                    if(oColumn.formatter && (child.formatter === undefined)) {
          +                        child.formatter = oColumn.formatter;
          +                    }
          +                    if(oColumn.parser && (child.parser === undefined)) {
          +                        child.parser = oColumn.parser;
          +                    }
          +                    if(oColumn.resizeable && (child.resizeable === undefined)) {
          +                        child.resizeable = oColumn.resizeable;
          +                    }
          +                    if(oColumn.type && (child.type === undefined)) {
          +                        child.type = oColumn.type;
          +                    }
          +                    if(oColumn.width && (child.width === undefined)) {
          +                        child.width = oColumn.width;
          +                    }
          +                }
          +                
          +                // Children increase colspan of the Column
          +                oColumn._colspan = length;
          +
          +                // Children increase colspan of the Column's parent
          +                if (parent && parent._colspan) {
          +                    parent._colspan += length-1;
          +                    parent._children = [];
          +                    parent._children.push(oColumn);
          +                }
          +                
          +                // Children must also be parsed
          +                if(!tree[nodelevel+1]) {
          +                    tree[nodelevel+1] = [];
          +                }
          +               parseColumns(children, oColumn);
          +            }
          +            
          +            // This Column does not have children,
          +            // but other Columns at this level do
          +            else if(nodeLevelMaxChildren > 0) {
          +                // Children of siblings increase the rowspan of the Column
          +                oColumn._rowspan += nodeLevelMaxChildren;
          +                //if(oColumn.key) {
          +                    oColumn._index = keys.length;
          +                    keys.push(oColumn);
          +                //}
          +            }
          +            // This entire node level does not have any children
          +            else {
          +                //if(oColumn.key) {
          +                    oColumn._index = keys.length;
          +                    keys.push(oColumn);
          +                //}
          +            }
          +
          +            // Add the Column to the top-down tree
          +            tree[nodelevel].push(oColumn);
          +        }
          +        nodelevel--;
          +    };
          +
          +    // Do the parsing
          +    if(aHeaders.length > 0) {
          +        parseColumns(aHeaders);
          +    }
          +
          +    // Store header nesting in an array
          +    var recurseAncestors = function(i, oColumn) {
          +        headers[i].push(oColumn._id);
          +        if(oColumn._parent) {
          +            recurseAncestors(i, oColumn._parent);
          +        }
          +    };
          +    for(var i=0; i<keys.length; i++) {
          +        headers[i] = [];
          +        recurseAncestors(i, keys[i]);
          +        headers[i] = headers[i].reverse();
          +        headers[i] = headers[i].join(" ");
          +    }
          +
          +    this.tree = tree;
          +    this.flat = flat;
          +    this.keys = keys;
          +    this.headers = headers;
          +    
          +    YAHOO.widget.ColumnSet._nCount++;
          +    YAHOO.log("ColumnSet initialized", "info", this.toString());
          +};
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Public member variables
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Internal class variable to index multiple data table instances.
          + *
          + * @property _nCount
          + * @type number
          + * @private
          + * @static
          + */
          +YAHOO.widget.ColumnSet._nCount = 0;
          +
          +/**
          + * Unique instance name.
          + *
          + * @property _sName
          + * @type String
          + * @private
          + */
          +YAHOO.widget.ColumnSet.prototype._sName = null;
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Public member variables
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Top-down tree representation of Column hierarchy.
          + *
          + * @property tree
          + * @type YAHOO.widget.Column[]
          + */
          +YAHOO.widget.ColumnSet.prototype.tree = null;
          +
          +/**
          + * Flattened representation of all Columns.
          + *
          + * @property flat
          + * @type YAHOO.widget.Column[]
          + * @default []
          + */
          +YAHOO.widget.ColumnSet.prototype.flat = null;
          +
          +/**
          + * Array of Columns that map one-to-one to a table column.
          + *
          + * @property keys
          + * @type YAHOO.widget.Column[]
          + * @default []
          + */
          +YAHOO.widget.ColumnSet.prototype.keys = null;
          +
          +/**
          + * ID index of nested parent heirarchies for HEADERS accessibility attribute.
          + *
          + * @property headers
          + * @type String[]
          + * @default []
          + */
          +YAHOO.widget.ColumnSet.prototype.headers = null;
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Public methods
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Public accessor to the unique name of the ColumnSet instance.
          + *
          + * @method toString
          + * @return {String} Unique name of the ColumnSet instance.
          + */
          +
          +YAHOO.widget.ColumnSet.prototype.toString = function() {
          +    return "ColumnSet " + this._sName;
          +};
          +
          +/****************************************************************************/
          +/****************************************************************************/
          +/****************************************************************************/
          +
          +/**
          + * The Column class defines and manages attributes of DataTable Columns
          + *
          + *
          + * @class Column
          + * @constructor
          + * @param oConfigs {Object} Object literal of configuration values.
          + */
          +YAHOO.widget.Column = function(oConfigs) {
          +    // Internal variables
          +    this._id = "yui-dtcol"+YAHOO.widget.Column._nCount;
          +    
          +    // Object literal defines Column attributes
          +    if(oConfigs && (oConfigs.constructor == Object)) {
          +        for(var sConfig in oConfigs) {
          +            if(sConfig) {
          +                this[sConfig] = oConfigs[sConfig];
          +            }
          +        }
          +    }
          +    
          +    YAHOO.widget.Column._nCount++;
          +};
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Private member variables
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Internal instance counter.
          + *
          + * @property _nCount
          + * @type Number
          + * @static
          + * @default 0
          + */
          +YAHOO.widget.Column._nCount = 0;
          +
          +
          +/**
          + * Unique ID, also assigned as DOM ID.
          + *
          + * @property _id
          + * @type String
          + * @private
          + */
          +YAHOO.widget.Column.prototype._id = null;
          +
          +/**
          + * Reference to Column's index within its ColumnSet's key array, or null if not applicable.
          + *
          + * @property _index
          + * @type Number
          + * @private
          + */
          +YAHOO.widget.Column.prototype._index = null;
          +
          +/**
          + * Number of table cells the Column spans.
          + *
          + * @property _colspan
          + * @type Number
          + * @private
          + */
          +YAHOO.widget.Column.prototype._colspan = 1;
          +
          +/**
          + * Number of table rows the Column spans.
          + *
          + * @property _rowspan
          + * @type Number
          + * @private
          + */
          +YAHOO.widget.Column.prototype._rowspan = 1;
          +
          +/**
          + * Column's parent, or null.
          + *
          + * @property _parent
          + * @type YAHOO.widget.Column
          + * @private
          + */
          +YAHOO.widget.Column.prototype._parent = null;
          +
          +/**
          + * Array of Column's chilren, or null.
          + *
          + * @property _children
          + * @type YAHOO.widget.Column[]
          + * @private
          + */
          +YAHOO.widget.Column.prototype._children = null;
          +
          +//TODO: clean these up
          +
          +/**
          + * Current offsetWidth of the Column (in pixels).
          + *
          + * @property _width
          + * @type Number
          + * @private
          + */
          +YAHOO.widget.Column.prototype._width = null;
          +
          +/**
          + * Minimum width the Column can support (in pixels). Value is populated only if table
          + * is fixedWidth, null otherwise.
          + *
          + * @property _minWidth
          + * @type Number
          + * @private
          + */
          +YAHOO.widget.Column.prototype._minWidth = null;
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Public member variables
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Associated database field, or null.
          + *
          + * @property key
          + * @type String
          + */
          +YAHOO.widget.Column.prototype.key = null;
          +
          +/**
          + * Text or HTML for display in Column's assocated TH element.
          + *
          + * @property text
          + * @type String
          + */
          +YAHOO.widget.Column.prototype.text = null;
          +
          +/**
          + * Data types: "string", "number", "date", "currency", "checkbox", "select",
          + * "email", "link".
          + *
          + * @property type
          + * @type String
          + * @default "string"
          + */
          +YAHOO.widget.Column.prototype.type = "string";
          +
          +/**
          + * Column head cell ABBR for accessibility.
          + *
          + * @property abbr
          + * @type String
          + */
          +YAHOO.widget.Column.prototype.abbr = null;
          +
          +/**
          + * Array of object literals that define children (nested headers) of a Column.
          + *
          + * @property children
          + * @type Object[]
          + */
          +YAHOO.widget.Column.prototype.children = null;
          +
          +/**
          + * Column width.
          + *
          + * @property width
          + * @type String
          + */
          +YAHOO.widget.Column.prototype.width = null;
          +
          +/**
          + * Custom CSS class to be applied to every cell in the Column.
          + *
          + * @property className
          + * @type String
          + */
          +YAHOO.widget.Column.prototype.className = null;
          +
          +/**
          + * Defines a custom format function for Column, otherwise default is used,
          + * according to Column type.
          + *
          + * @property formatter
          + * @type HTMLFunction
          + */
          +YAHOO.widget.Column.prototype.formatter = null;
          +
          +/**
          + * Defines a custom parse function for Column, otherwise default is used,
          + * according to Column type.
          + *
          + * @property parser
          + * @type HTMLFunction
          + */
          +YAHOO.widget.Column.prototype.parser = null;
          +
          +/**
          + * Defines the type of editor for Column, otherwise Column is not editable.
          + *
          + * @property editor
          + * @type String
          + */
          +YAHOO.widget.Column.prototype.editor = null;
          +
          +/**
          + * True if Column is resizeable, false otherwise.
          + *
          + * @property resizeable
          + * @type Boolean
          + * @default false
          + */
          +YAHOO.widget.Column.prototype.resizeable = false;
          +
          +/**
          + * True if Column is sortable, false otherwise.
          + *
          + * @property sortable
          + * @type Boolean
          + * @default false
          + */
          +YAHOO.widget.Column.prototype.sortable = false;
          +
          +/**
          + * Custom sort handler to arrange Column in descending order.
          + *
          + * @property sortOptions.descFunction
          + * @type Function
          + * @default null
          + */
          +YAHOO.widget.Column.prototype.descFunction = null;
          +
          +/**
          + * Custom sort handler to arrange Column in ascending order.
          + *
          + * @property sortOptions.ascFunction
          + * @type Function
          + * @default null
          + */
          +YAHOO.widget.Column.prototype.ascFunction = null;
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Public methods
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Public accessor returns Column's ID string.
          + *
          + * @method getId
          + * @return {String} Column's ID string.
          + */
          +YAHOO.widget.Column.prototype.getId = function() {
          +    return this._id;
          +};
          +
          +/**
          + * Public accessor returns Column's index within its ColumnSet's key array, or
          + * null if not applicable.
          + *
          + * @property getIndex
          + * @return {Number} Column's index within its ColumnSet key array, if applicable.
          + */
          +YAHOO.widget.Column.prototype.getIndex = function() {
          +    return this._index;
          +};
          +
          +/**
          + * Public accessor returns Column's colspan number.
          + *
          + * @method getColSpan
          + * @return {Number} Column's colspan number.
          + */
          +YAHOO.widget.Column.prototype.getColSpan = function() {
          +    return this._colspan;
          +};
          +
          +/**
          + * Public accessor returns Column's rowspan number.
          + *
          + * @method getRowSpan
          + * @return {Number} Column's rowspan number.
          + */
          +YAHOO.widget.Column.prototype.getRowSpan = function() {
          +    return this._rowspan;
          +};
          +
          +
          +/**
          + * Outputs markup into the given TD based on given Record.
          + *
          + * @method format
          + * @param elCell {HTMLElement} TD to format for display.
          + * @param oRecord {YAHOO.widget.Record} Record that holds data for the row.
          + * @return {HTML} Markup.
          + */
          +YAHOO.widget.Column.prototype.format = function(elCell,oRecord) {
          +    var oData = (this.key) ? oRecord[this.key] : null;
          +    if(this.formatter) {
          +        this.formatter(elCell, oRecord, this, oData);
          +    }
          +    else {
          +        var type = this.type;
          +        var markup = "";
          +        var classname = "";
          +        switch(type) {
          +            case "checkbox":
          +                YAHOO.widget.Column.formatCheckbox(elCell, oRecord, this, oData);
          +                classname = YAHOO.widget.DataTable.CLASS_CHECKBOX;
          +                break;
          +            case "currency":
          +                YAHOO.widget.Column.formatCurrency(elCell, oRecord, this, oData);
          +                classname = YAHOO.widget.DataTable.CLASS_CURRENCY;
          +                break;
          +            case "date":
          +                YAHOO.widget.Column.formatDate(elCell, oRecord, this, oData);
          +                classname = YAHOO.widget.DataTable.CLASS_DATE;
          +                break;
          +            case "email":
          +                YAHOO.widget.Column.formatEmail(elCell, oRecord, this, oData);
          +                classname = YAHOO.widget.DataTable.CLASS_EMAIL;
          +                break;
          +            case "link":
          +                YAHOO.widget.Column.formatLink(elCell, oRecord, this, oData);
          +                classname = YAHOO.widget.DataTable.CLASS_LINK;
          +                break;
          +            case "number":
          +                YAHOO.widget.Column.formatNumber(elCell, oRecord, this, oData);
          +                classname = YAHOO.widget.DataTable.CLASS_NUMBER;
          +                break;
          +            case "select":
          +                YAHOO.widget.Column.formatSelect(elCell, oRecord, this, oData);
          +                classname = YAHOO.widget.DataTable.CLASS_SELECT;
          +                break;
          +           default:
          +                elCell.innerHTML = (oData) ? oData.toString() : "";
          +                //elCell.innerHTML = (oData) ? "<a href=\"#\">"+oData.toString()+"</a>" : "";
          +                classname = YAHOO.widget.DataTable.CLASS_STRING;
          +                break;
          +        }
          +
          +        YAHOO.util.Dom.addClass(elCell, classname);
          +        if(this.className) {
          +            YAHOO.util.Dom.addClass(elCell, this.className);
          +        }
          +    }
          +    
          +    if(this.editor) {
          +        YAHOO.util.Dom.addClass(elCell,YAHOO.widget.DataTable.CLASS_EDITABLE);
          +    }
          +};
          +
          +
          +/**
          + * Formats cells in Columns of type "checkbox".
          + *
          + * @method formatCheckbox
          + * @param elCell {HTMLElement} Table cell element.
          + * @param oRecord {YAHOO.widget.Record} Record instance.
          + * @param oColumn {YAHOO.widget.Column} Column instance.
          + * @param oData {Object} Data value for the cell, or null
          + * @static
          + */
          +YAHOO.widget.Column.formatCheckbox = function(elCell, oRecord, oColumn, oData) {
          +    var bChecked = oData;
          +    bChecked = (bChecked) ? " checked" : "";
          +    elCell.innerHTML = "<input type=\"checkbox\"" + bChecked +
          +            " class=\"" + YAHOO.widget.DataTable.CLASS_CHECKBOX + "\">";
          +};
          +
          +/**
          + * Formats cells in Columns of type "currency". Can be overridden for custom formatting.
          + *
          + * @method formatCurrency
          + * @param elCell {HTMLElement} Table cell element.
          + * @param oRecord {YAHOO.widget.Record} Record instance.
          + * @param oColumn {YAHOO.widget.Column} Column instance.
          + * @param oData {Object} Data value for the cell, or null
          + * @static
          + */
          +YAHOO.widget.Column.formatCurrency = function(elCell, oRecord, oColumn, oData) {
          +    // Make it dollars
          +    var nAmount = oData;
          +    var markup;
          +        if((nAmount !== undefined) && (nAmount !== null) && !isNaN(parseFloat(nAmount))) {
          +             // Round to the penny
          +             nAmount = Math.round(nAmount*100)/100;
          +             markup = "$"+nAmount;
          +
          +            // Normalize digits
          +            var dotIndex = markup.indexOf(".");
          +            if(dotIndex < 0) {
          +                markup += ".00";
          +            }
          +            else {
          +                while(dotIndex > markup.length-3) {
          +                    markup += "0";
          +                }
          +            }
          +        }
          +        else {
          +            markup = "";
          +        }
          +        elCell.innerHTML = markup;
          +};
          +
          +/**
          + * Formats cells in Columns of type "date".
          + *
          + * @method formatDate
          + * @param elCell {HTMLElement} Table cell element.
          + * @param oRecord {YAHOO.widget.Record} Record instance.
          + * @param oColumn {YAHOO.widget.Column} Column instance.
          + * @param oData {Object} Data value for the cell, or null
          + * @static
          + */
          +YAHOO.widget.Column.formatDate = function(elCell, oRecord, oColumn, oData) {
          +    var oDate = oData;
          +    if(oDate instanceof Date) {
          +        elCell.innerHTML = (oDate.getMonth()+1) + "/" + oDate.getDate()  + "/" + oDate.getFullYear();
          +    }
          +    else {
          +        elCell.innerHTML = "";
          +        YAHOO.log("Could not format date","warn",this.toString());
          +    }
          +};
          +
          +/**
          + * Formats cells in Columns of type "email".
          + *
          + * @method formatEmail
          + * @param elCell {HTMLElement} Table cell element.
          + * @param oRecord {YAHOO.widget.Record} Record instance.
          + * @param oColumn {YAHOO.widget.Column} Column instance.
          + * @param oData {Object} Data value for the cell, or null
          + * @static
          + */
          +YAHOO.widget.Column.formatEmail = function(elCell, oRecord, oColumn, oData) {
          +    var sEmail = oData;
          +    if(sEmail) {
          +        elCell.innerHTML = "<a href=\"mailto:" + sEmail + "\">" + sEmail + "</a>";
          +    }
          +    else {
          +        elCell.innerHTML = "";
          +    }
          +};
          +
          +/**
          + * Formats cells in Columns of type "link".
          + *
          + * @method formatLink
          + * @param elCell {HTMLElement} Table cell element.
          + * @param oRecord {YAHOO.widget.Record} Record instance.
          + * @param oColumn {YAHOO.widget.Column} Column instance.
          + * @param oData {Object} Data value for the cell, or null
          + * @static
          + */
          +YAHOO.widget.Column.formatLink = function(elCell, oRecord, oColumn, oData) {
          +    var sLink = oData;
          +    if(sLink) {
          +        elCell.innerHTML = "<a href=\"" + sLink + "\">" + sLink + "</a>";
          +    }
          +    else {
          +        elCell.innerHTML = "";
          +    }
          +};
          +
          +/**
          + * Formats cells in Columns of type "number".
          + *
          + * @method formatNumber
          + * @param elCell {HTMLElement} Table cell element.
          + * @param oRecord {YAHOO.widget.Record} Record instance.
          + * @param oColumn {YAHOO.widget.Column} Column instance.
          + * @param oData {Object} Data value for the cell, or null
          + * @static
          + */
          +YAHOO.widget.Column.formatNumber = function(elCell, oRecord, oColumn, oData) {
          +    var nNumber = oData;
          +    if((nNumber !== undefined) && (nNumber !== null)) {
          +        elCell.innerHTML = nNumber.toString();
          +    }
          +    else {
          +        elCell.innerHTML = "";
          +    }
          +};
          +
          +/**
          + * Formats cells in Columns of type "select".
          + *
          + * @method formatSelect
          + * @param elCell {HTMLElement} Table cell element.
          + * @param oRecord {YAHOO.widget.Record} Record instance.
          + * @param oColumn {YAHOO.widget.Column} Column instance.
          + * @param oData {Object} Data value for the cell, or null
          + * @static
          + */
          +YAHOO.widget.Column.formatSelect = function(elCell, oRecord, oColumn, oData) {
          +    var selectedValue = oData;
          +    var options = oColumn.selectOptions;
          +
          +    var markup = "<select>";
          +    if(options) {
          +        for(var i=0; i<options.length; i++) {
          +            var option = options[i];
          +            markup += "<option value=\"" + option + "\"";
          +            if(selectedValue === option) {
          +                markup += " selected";
          +            }
          +            markup += ">" + option + "</option>";
          +        }
          +    }
          +    else {
          +        if(selectedValue) {
          +            markup += "<option value=\"" + selectedValue + "\" selected>" + selectedValue + "</option>";
          +        }
          +    }
          +    markup += "</select>";
          +    elCell.innerHTML = markup;
          +};
          +
          +/**
          + * Takes innerHTML from TD and parses out data for storage in RecordSet.
          + *
          + * @method parse
          + * @param sMarkup {String} The TD's innerHTML value.
          + * @return {Object} Data.
          + */
          +YAHOO.widget.Column.prototype.parse = function(sMarkup) {
          +    if(this.parser) {
          +        return this.parser(sMarkup);
          +    }
          +    else {
          +        var data = null;
          +        switch(this.type) {
          +            case "checkbox":
          +                data = YAHOO.widget.Column.parseCheckbox(sMarkup);
          +                break;
          +            case "currency":
          +                data = YAHOO.widget.Column.parseCurrency(sMarkup);
          +                break;
          +            case "date":
          +                data = YAHOO.widget.Column.parseDate(sMarkup);
          +                break;
          +            case "number":
          +                data = YAHOO.widget.Column.parseNumber(sMarkup);
          +                break;
          +            case "select":
          +                data = YAHOO.widget.Column.parseSelect(sMarkup);
          +                break;
          +           default:
          +                if(sMarkup) {
          +                    data = sMarkup;
          +                }
          +                break;
          +        }
          +        return data;
          +    }
          +};
          +
          +/**
          + * Default parse function for Columns of type "checkbox" takes markup and
          + * extracts data. Can be overridden for custom parsing.
          + *
          + * @method parseCheckbox
          + * @param sMarkup
          + * @return {bChecked} True if checkbox is checked.
          + */
          +YAHOO.widget.Column.parseCheckbox = function(sMarkup) {
          +    return (sMarkup.indexOf("checked") < 0) ? false : true;
          +};
          +
          +/**
          + * Default parse function for Columns of type "currency" takes markup and
          + * extracts data. Can be overridden for custom parsing.
          + *
          + * @method parseCurrency
          + * @param sMarkup
          + * @return {nAmount} Floating point amount.
          + */
          +YAHOO.widget.Column.parseCurrency = function(sMarkup) {
          +    return parseFloat(sMarkup.substring(1));
          +};
          +
          +/**
          + * Default parse function for Columns of type "date" takes markup and extracts
          + * data. Can be overridden for custom parsing.
          + *
          + * @method parseDate
          + * @param sMarkup
          + * @return {oDate} Date instance.
          + */
          +YAHOO.widget.Column.parseDate = function(sMarkup) {
          +    var mm = sMarkup.substring(0,sMarkup.indexOf("/"));
          +    sMarkup = sMarkup.substring(sMarkup.indexOf("/")+1);
          +    var dd = sMarkup.substring(0,sMarkup.indexOf("/"));
          +    var yy = sMarkup.substring(sMarkup.indexOf("/")+1);
          +    return new Date(yy, mm, dd);
          +};
          +
          +/**
          + * Default parse function for Columns of type "number" takes markup and extracts
          + * data. Can be overridden for custom parsing.
          + *
          + * @method parseNumber
          + * @param sMarkup
          + * @return {nNumber} Number.
          + */
          +YAHOO.widget.Column.parseNumber = function(sMarkup) {
          +    return parseFloat(sMarkup);
          +};
          +
          +/**
          + * Default parse function for Columns of type "select" takes markup and extracts
          + * data. Can be overridden for custom parsing.
          + *
          + * @method parseSelect
          + * @param sMarkup
          + * @return {sValue} Value of selected option.
          + */
          +YAHOO.widget.Column.parseSelect = function(sMarkup) {
          +    //return (sMarkup.indexOf("checked") < 0) ? false : true;
          +};
          +
          +/**
          + * Outputs editor markup into the given TD based on given Record.
          + *
          + * @method showEditor
          + * @param elCell {HTMLElement} The cell to edit.
          + * @param oRecord {YAHOO.widget.Record} The DataTable Record of the cell.
          + * @return YAHOO.widget.ColumnEditor
          + */
          +YAHOO.widget.Column.prototype.getEditor = function(elCell, oRecord) {
          +//Sync up the arg signature for ColumnEditor constructor and show()
          +    var oEditor = this.editor;
          +    if(YAHOO.lang.isString(oEditor)) {
          +        oEditor = new YAHOO.widget.ColumnEditor(this.editor);
          +        oEditor.show(elCell, oRecord, this);
          +        this.editor = oEditor;
          +    }
          +    else if(oEditor instanceof YAHOO.widget.ColumnEditor) {
          +        oEditor.show(elCell, oRecord, this);
          +    }
          +    return oEditor;
          +};
          +
          +
          +/****************************************************************************/
          +/****************************************************************************/
          +/****************************************************************************/
          +
          +/**
          + * The ColumnEditor defines and manages inline editing functionality for a
          + * DataTable Column.
          + *
          + * @class ColumnEditor
          + * @constructor
          + * @param elCell {HTMLElement} The cell to edit.
          + * @param oRecord {YAHOO.widget.Record} The DataTable Record of the cell.
          + * @param oColumn {YAHOO.widget.Column} The DataTable Column of the cell.
          + * @parem sType {String} Type identifier
          + */
          +YAHOO.widget.ColumnEditor = function(sType) {
          +    this.type = sType;
          +
          +    //TODO: make sure ColumnEditors get destroyed if widget gets destroyed
          +    // Works better to attach ColumnEditor to document.body
          +    // rather than the DataTable container
          +    // elTable comes in as a cell. Traverse up DOM to find the table.
          +    // TODO: safety net in case table is never found.
          +    //while(elCell.nodeName.toLowerCase() != "table") {
          +    //    elCell = elCell.parentNode;
          +    //}
          +    //this.tableContainer = elCell.parentNode;
          +    
          +    var container = document.body.appendChild(document.createElement("div"));//this.tableContainer.appendChild(document.createElement("div"));
          +    container.style.position = "absolute";
          +    container.style.zIndex = 9000;
          +    container.id = "yui-dt-editor" + YAHOO.widget.ColumnEditor._nCount;
          +    container.className = YAHOO.widget.DataTable.CLASS_EDITOR;
          +    this.container = container;
          +
          +    switch(this.type) {
          +        case "textbox":
          +            this.createTextboxEditor();
          +            break;
          +        case "textarea":
          +            this.createTextareaEditor();
          +            break;
          +        default:
          +            break;
          +    }
          +
          +    YAHOO.widget.ColumnEditor._nCount++;
          +};
          +
          +
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Private member variables
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Internal instance counter.
          + *
          + * @property _nCount
          + * @type Number
          + * @static
          + * @default 0
          + */
          +YAHOO.widget.ColumnEditor._nCount =0;
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Public member variables
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Reference to the container DOM element for the ColumnEditor.
          + *
          + * @property container
          + * @type HTMLElement
          + */
          +YAHOO.widget.ColumnEditor.prototype.container = null;
          +
          +/**
          + * Reference to the ColumnEditor's Column instance.
          + *
          + * @property column
          + * @type YAHOO.widget.Column
          + */
          +YAHOO.widget.ColumnEditor.prototype.column = null;
          +
          +/**
          + * Type of editor: "textbox", etc.
          + *
          + * @property type
          + * @type String
          + */
          +YAHOO.widget.ColumnEditor.prototype.type = null;
          +
          +
          +
          +/**
          + * Reference to form element(s) of the ColumnEditor.
          + *
          + * @property input
          + * @type HTMLElement || HTMLElement[]
          + */
          +YAHOO.widget.ColumnEditor.prototype.input = null;
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Public methods
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Shows ColumnEditor.
          + *
          + * @method show
          + * @param elCell {HTMLElement} The cell to edit.
          + * @param oRecord {YAHOO.widget.Record} The DataTable Record of the cell.
          + * @param oColumn {YAHOO.widget.Column} The DataTable Column of the cell.
          + */
          +YAHOO.widget.ColumnEditor.prototype.show = function(elCell, oRecord, oColumn) {
          +    this.cell = elCell;
          +    this.record = oRecord;
          +    this.column = oColumn;
          +    switch(this.type) {
          +        case "textbox":
          +            this.showTextboxEditor(elCell, oRecord, oColumn);
          +            break;
          +        case "textarea":
          +            this.showTextareaEditor(elCell, oRecord, oColumn);
          +            break;
          +        default:
          +            break;
          +    }
          +};
          +
          +/**
          + * Positions container over given element, aligning upper-left corners.
          + *
          + * @method moveContainerTo
          + * @param elCell {HTMLElement} The element.
          + */
          +YAHOO.widget.ColumnEditor.prototype.moveContainerTo = function(el) {
          +    var x,y;
          +
          +    // Don't use getXY for Opera
          +    if(navigator.userAgent.toLowerCase().indexOf("opera") != -1) {
          +        x = el.offsetLeft;
          +        y = el.offsetTop;
          +        while(el.offsetParent) {
          +            x += el.offsetParent.offsetLeft;
          +            y += el.offsetParent.offsetTop;
          +            el = el.offsetParent;
          +        }
          +    }
          +    else {
          +        x = parseInt(YAHOO.util.Dom.getX(el),10);//xy[0] + 1;
          +        y = parseInt(YAHOO.util.Dom.getY(el),10);//xy[1] + 1;
          +            // Workaround getXY scroll bug for FF and SF
          +            if(window.scrollX !== undefined) {
          +                x += window.scrollX;
          +            }
          +            if(window.scrollY !== undefined) {
          +                y += window.scrollY;
          +            }
          +    }
          +    this.container.style.left = x + "px";
          +    this.container.style.top = y + "px";
          +};
          +
          +
          +/**
          + * Returns ColumnEditor data value.
          + *
          + * @method getValue
          + * @return Object
          + */
          +YAHOO.widget.ColumnEditor.prototype.getValue = function() {
          +    var value;
          +    switch(this.type) {
          +        case "textbox":
          +            value = this.getTextboxEditorValue();
          +            break;
          +        case "textarea":
          +            value = this.getTextareaEditorValue();
          +            break;
          +        default:
          +            break;
          +    }
          +    return value;
          +};
          +
          +/**
          + * Creates a textbox editor in the DOM.
          + *
          + * @method createTextboxEditor
          + * @return {HTML} ???
          + */
          +YAHOO.widget.ColumnEditor.prototype.createTextboxEditor = function() {
          +    var elTextbox = this.container.appendChild(document.createElement("input"));
          +    // For FF bug 236791
          +    elTextbox.setAttribute("autocomplete","off");
          +    this.input = elTextbox;
          +};
          +
          +/**
          + * Creates a textarea editor in the DOM.
          + *
          + * @method createTextareaEditor
          + * @return {HTML} ???
          + */
          +YAHOO.widget.ColumnEditor.prototype.createTextareaEditor = function() {
          +    var elTextarea = this.container.appendChild(document.createElement("textarea"));
          +    this.input = elTextarea;
          +};
          +
          +/**
          + * Shows textbox.
          + *
          + * @method showTextboxEditor
          + * @param elCell {HTMLElement} The cell to edit.
          + * @param oRecord {YAHOO.widget.Record} The DataTable Record of the cell.
          + * @param oColumn {YAHOO.widget.Column} The DataTable Column of the cell.
          + */
          +YAHOO.widget.ColumnEditor.prototype.showTextboxEditor = function(elCell, oRecord, oColumn) {
          +    // Position container
          +    this.moveContainerTo(elCell);
          +
          +    // Update form field
          +    this.input.style.width = (parseInt(elCell.offsetWidth,10)) + "px";
          +    this.input.style.height = (parseInt(elCell.offsetHeight,10)) + "px";
          +    this.input.value = elCell.innerHTML || "";
          +    this.input.tabIndex = 0;
          +
          +    // Display container
          +    this.container.style.display = "block";
          +
          +    // Highlight input
          +    this.input.focus();
          +    this.input.select();
          +};
          +
          +/**
          + * Shows textarea.
          + *
          + * @method showTextareaEditor
          + * @param elCell {HTMLElement} The cell to edit.
          + * @param oRecord {YAHOO.widget.Record} The DataTable Record of the cell.
          + * @param oColumn {YAHOO.widget.Column} The DataTable Column of the cell.
          + */
          +YAHOO.widget.ColumnEditor.prototype.showTextareaEditor = function(elCell, oRecord, oColumn) {
          +    // Position container
          +    this.moveContainerTo(elCell);
          +    
          +    // Update form field
          +    this.input.style.width = (parseInt(elCell.offsetWidth,10)) + "px";
          +    this.input.style.height = 4*(parseInt(elCell.offsetHeight,10)) + "px";
          +    this.input.value = elCell.innerHTML || "";
          +    this.input.tabIndex = 0;
          +
          +    // Display container
          +    this.container.style.display = "block";
          +    
          +    // Highlight input
          +    this.input.focus();
          +    this.input.select();
          +};
          +
          +/**
          + * Hides ColumnEditor
          + *
          + * @method hide
          + */
          +YAHOO.widget.ColumnEditor.prototype.hide = function() {
          +    this.input.tabIndex = -1;
          +    this.container.style.display = "none";
          +};
          +
          +/**
          + * Returns ColumnEditor value
          + *
          + * @method getTextboxEditorValue
          + * @return String
          + */
          +YAHOO.widget.ColumnEditor.prototype.getTextboxEditorValue = function() {
          +    return this.input.value;
          +};
          +
          +/**
          + * Returns ColumnEditor value
          + *
          + * @method getTextareaEditorValue
          + * @return String
          + */
          +YAHOO.widget.ColumnEditor.prototype.getTextareaEditorValue = function() {
          +    return this.input.value;
          +};
          +
          +/****************************************************************************/
          +/****************************************************************************/
          +/****************************************************************************/
          +
          +/**
          + * Sort static utility to support Column sorting.
          + *
          + * @class Sort
          + * @static
          + */
          +YAHOO.util.Sort = {
          +    /////////////////////////////////////////////////////////////////////////////
          +    //
          +    // Public methods
          +    //
          +    /////////////////////////////////////////////////////////////////////////////
          +
          +    /**
          +     * Comparator function for sort in ascending order. String sorting is case insensitive.
          +     *
          +     * @method compareAsc
          +     * @param a {object} First sort argument.
          +     * @param b {object} Second sort argument.
          +     */
          +    compareAsc: function(a, b) {
          +        if((a === null) || (typeof a == "undefined")) {
          +            if((b === null) || (typeof b == "undefined")) {
          +                return 0;
          +            }
          +            else {
          +                return 1;
          +            }
          +        }
          +        else if((b === null) || (typeof b == "undefined")) {
          +            return -1;
          +        }
          +    
          +        if(a.constructor == String) {
          +            a = a.toLowerCase();
          +        }
          +        if(b.constructor == String) {
          +            b = b.toLowerCase();
          +        }
          +        if(a < b) {
          +            return -1;
          +        }
          +        else if (a > b) {
          +            return 1;
          +        }
          +        else {
          +            return 0;
          +        }
          +    },
          +
          +    /**
          +     * Comparator function for sort in descending order. String sorting is case insensitive.
          +     *
          +     * @method compareDesc
          +     * @param a {object} First sort argument.
          +     * @param b {object} Second sort argument.
          +     */
          +    compareDesc: function(a, b) {
          +        if((a === null) || (typeof a == "undefined")) {
          +            if((b === null) || (typeof b == "undefined")) {
          +                return 0;
          +            }
          +            else {
          +                return -1;
          +            }
          +        }
          +        else if((b === null) || (typeof b == "undefined")) {
          +            return 1;
          +        }
          +
          +        if(a.constructor == String) {
          +            a = a.toLowerCase();
          +        }
          +        if(b.constructor == String) {
          +            b = b.toLowerCase();
          +        }
          +        if(a < b) {
          +            return 1;
          +        }
          +        else if (a > b) {
          +            return -1;
          +        }
          +        else {
          +            return 0;
          +        }
          +    }
          +};
          +
          +/****************************************************************************/
          +/****************************************************************************/
          +/****************************************************************************/
          +
          +/**
          + * WidthResizer subclasses DragDrop to support resizeable Columns.
          + *
          + * @class WidthResizer
          + * @extends YAHOO.util.DragDrop
          + * @constructor
          + * @param colElId {string} ID of the Column's TH element being resized
          + * @param handleElId {string} ID of the handle element that causes the resize
          + * @param sGroup {string} Group name of related DragDrop items
          + */
          +YAHOO.util.WidthResizer = function(oDataTable, colId, handleId, sGroup, config) {
          +    if (colId) {
          +        this.cell = YAHOO.util.Dom.get(colId);
          +        this.init(handleId, sGroup, config);
          +        //this.initFrame();
          +        this.datatable = oDataTable;
          +        this.setYConstraint(0,0);
          +    }
          +    else {
          +        YAHOO.log("Column resizer could not be created due to invalid colElId","warn");
          +    }
          +};
          +
          +if(YAHOO.util.DD) {
          +    YAHOO.extend(YAHOO.util.WidthResizer, YAHOO.util.DD);
          +}
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Public DOM event handlers
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Handles mousedown events on the Column resizer.
          + *
          + * @method onMouseDown
          + * @param e {string} The mousedown event
          + */
          +YAHOO.util.WidthResizer.prototype.onMouseDown = function(e) {
          +    this.startWidth = this.cell.offsetWidth;
          +    this.startPos = YAHOO.util.Dom.getX(this.getDragEl());
          +
          +    if(this.datatable.fixedWidth) {
          +        var cellText = YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.DataTable.CLASS_HEADTEXT,"span",this.cell)[0];
          +        this.minWidth = cellText.offsetWidth + 6;
          +        var sib = this.cell.nextSibling;
          +        var sibCellText = YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.DataTable.CLASS_HEADTEXT,"span",sib)[0];
          +        this.sibMinWidth = sibCellText.offsetWidth + 6;
          +//!!
          +        var left = ((this.startWidth - this.minWidth) < 0) ? 0 : (this.startWidth - this.minWidth);
          +        var right = ((sib.offsetWidth - this.sibMinWidth) < 0) ? 0 : (sib.offsetWidth - this.sibMinWidth);
          +        this.setXConstraint(left, right);
          +        YAHOO.log("cellstartwidth:" + this.startWidth,"time");
          +        YAHOO.log("cellminwidth:" + this.minWidth,"time");
          +        YAHOO.log("sibstartwidth:" + sib.offsetWidth,"time");
          +        YAHOO.log("sibminwidth:" + this.sibMinWidth,"time");
          +        YAHOO.log("l:" + left + " AND r:" + right,"time");
          +    }
          +
          +};
          +
          +/**
          + * Handles mouseup events on the Column resizer.
          + *
          + * @method onMouseUp
          + * @param e {string} The mouseup event
          + */
          +YAHOO.util.WidthResizer.prototype.onMouseUp = function(e) {
          +    //TODO: replace the resizer where it belongs:
          +    var resizeStyle = YAHOO.util.Dom.get(this.handleElId).style;
          +    resizeStyle.left = "auto";
          +    resizeStyle.right = 0;
          +    resizeStyle.marginRight = "-6px";
          +    resizeStyle.width = "6px";
          +    //.yui-dt-headresizer {position:absolute;margin-right:-6px;right:0;bottom:0;width:6px;height:100%;cursor:w-resize;cursor:col-resize;}
          +
          +
          +    //var cells = this.datatable._elTable.tHead.rows[this.datatable._elTable.tHead.rows.length-1].cells;
          +    //for(var i=0; i<cells.length; i++) {
          +        //cells[i].style.width = "5px";
          +    //}
          +
          +    //TODO: set new ColumnSet width values
          +    this.datatable.fireEvent("columnResizeEvent",{datatable:this.datatable,target:YAHOO.util.Dom.get(this.id)});
          +};
          +
          +/**
          + * Handles drag events on the Column resizer.
          + *
          + * @method onDrag
          + * @param e {string} The drag event
          + */
          +YAHOO.util.WidthResizer.prototype.onDrag = function(e) {
          +    var newPos = YAHOO.util.Dom.getX(this.getDragEl());
          +    //YAHOO.log("newpos:"+newPos,"warn");//YAHOO.util.Event.getPageX(e);
          +    var offsetX = newPos - this.startPos;
          +    //YAHOO.log("offset:"+offsetX,"warn");
          +    //YAHOO.log("startwidth:"+this.startWidth + " and offset:"+offsetX,"warn");
          +    var newWidth = this.startWidth + offsetX;
          +    //YAHOO.log("newwidth:"+newWidth,"warn");
          +
          +    if(newWidth < this.minWidth) {
          +        newWidth = this.minWidth;
          +    }
          +
          +    // Resize the Column
          +    var oDataTable = this.datatable;
          +    var elCell = this.cell;
          +
          +    //YAHOO.log("newwidth" + newWidth,"warn");
          +    //YAHOO.log(newWidth + " AND "+ elColumn.offsetWidth + " AND " + elColumn.id,"warn");
          +
          +    // Resize the other Columns
          +    if(oDataTable.fixedWidth) {
          +        // Moving right or left?
          +        var sib = elCell.nextSibling;
          +        //var sibIndex = elCell.index + 1;
          +        var sibnewwidth = sib.offsetWidth - offsetX;
          +        if(sibnewwidth < this.sibMinWidth) {
          +            sibnewwidth = this.sibMinWidth;
          +        }
          +
          +        //TODO: how else to cycle through all the Columns without having to use an index property?
          +        for(var i=0; i<oDataTable._oColumnSet.length; i++) {
          +            if((i != elCell.index) &&  (i!=sibIndex)) {
          +                YAHOO.util.Dom.get(oDataTable._oColumnSet.keys[i].id).style.width = oDataTable._oColumnSet.keys[i].width + "px";
          +            }
          +        }
          +        sib.style.width = sibnewwidth;
          +        elCell.style.width = newWidth + "px";
          +        //oDataTable._oColumnSet.flat[sibIndex].width = sibnewwidth;
          +        //oDataTable._oColumnSet.flat[elCell.index].width = newWidth;
          +
          +    }
          +    else {
          +        elCell.style.width = newWidth + "px";
          +    }
          +};
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Config.js.html b/www/extras/yui/docs/Config.js.html new file mode 100644 index 000000000..37ae8bbe5 --- /dev/null +++ b/www/extras/yui/docs/Config.js.html @@ -0,0 +1,596 @@ + + + + API: container Config.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + + > Config.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +* 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.
          +* @namespace YAHOO.util
          +* @class Config
          +* @constructor
          +* @param {Object}	owner	The owner Object to which this Config Object belongs
          +*/
          +YAHOO.util.Config = function(owner) {
          +	if (owner) {
          +		this.init(owner);
          +	}
          +	if (!owner) { YAHOO.log("No owner specified for Config object", "error"); }
          +};
          +
          +/**
          + * Constant representing the CustomEvent type for the config changed event.
          + * @property YAHOO.util.Config.CONFIG_CHANGED_EVENT
          + * @private
          + * @static
          + * @final
          + */
          +YAHOO.util.Config.CONFIG_CHANGED_EVENT = "configChanged";
          +
          +/**
          + * Constant representing the boolean type string
          + * @property YAHOO.util.Config.BOOLEAN_TYPE
          + * @private
          + * @static
          + * @final
          + */
          +YAHOO.util.Config.BOOLEAN_TYPE = "boolean";
          +
          +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,
          +
          +	/**
          +	* Maintains the local collection of configuration property objects and their specified values
          +	* @property config
          +	* @private
          +	* @type Object
          +	*/ 
          +	config : null,
          +
          +	/**
          +	* 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
          +	*/ 
          +	initialConfig : null,
          +
          +	/**
          +	* Maintains the local, normalized CustomEvent queue
          +	* @property eventQueue
          +	* @private
          +	* @type Object
          +	*/ 
          +	eventQueue : null,
          +
          +	/**
          +	* Custom Event, notifying subscribers when Config properties are set (setProperty is called without the silent flag
          +	* @event configChangedEvent
          +	*/
          +	configChangedEvent : null,
          +
          +	/**
          +	* 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) {
          +		return (typeof val == YAHOO.util.Config.BOOLEAN_TYPE);
          +	},
          +
          +	/**
          +	* 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) {
          +		return (!isNaN(val));
          +	},
          +
          +	/**
          +	* 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
          +	*/ 
          +	fireEvent : function( key, value ) {
          +		YAHOO.log("Firing Config event: " + key + "=" + value, "info");
          +		var property = this.config[key];
          +
          +		if (property && property.event) {
          +			property.event.fire(value);
          +		}	
          +	},
          +
          +	/**
          +	* 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
          +	*/
          +	addProperty : function( key, propertyObject ) {
          +		key = key.toLowerCase();
          +		YAHOO.log("Added property: " + key, "info");
          +
          +		this.config[key] = propertyObject;
          +
          +		propertyObject.event = new YAHOO.util.CustomEvent(key, this.owner);
          +		propertyObject.key = key;
          +
          +		if (propertyObject.handler) {
          +			propertyObject.event.subscribe(propertyObject.handler, this.owner);
          +		}
          +
          +		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
          +	*/
          +	getConfig : function() {
          +		var cfg = {};
          +			
          +		for (var prop in this.config) {
          +			var property = this.config[prop];
          +			if (property && 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
          +	*/
          +	getProperty : function(key) {
          +		var property = this.config[key.toLowerCase()];
          +		if (property && 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
          +	*/
          +	resetProperty : function(key) {
          +		key = key.toLowerCase();
          +
          +		var property = this.config[key];
          +		if (property && property.event) {
          +			if (this.initialConfig[key] && !YAHOO.lang.isUndefined(this.initialConfig[key]))	{
          +				this.setProperty(key, this.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.
          +	*/
          +	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 = this.config[key];
          +			if (property && property.event) {
          +				if (property.validator && ! property.validator(value)) { // validator
          +					return false;
          +				} else {
          +					property.value = value;
          +					if (! silent) {
          +						this.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.
          +	*/	
          +	queueProperty : function(key, value) {
          +		key = key.toLowerCase();
          +		YAHOO.log("queueProperty: " + key + "=" + value, "info");
          +
          +		var property = this.config[key];
          +							
          +		if (property && property.event) {
          +			if (!YAHOO.lang.isUndefined(value) && property.validator && ! property.validator(value)) { // validator
          +				return false;
          +			} else {
          +
          +				if (!YAHOO.lang.isUndefined(value)) {
          +					property.value = value;
          +				} else {
          +					value = property.value;
          +				}
          +
          +				var foundDuplicate = false;
          +				var iLen = this.eventQueue.length;
          +				for (var i=0; i < iLen; i++) {
          +					var queueItem = this.eventQueue[i];
          +
          +					if (queueItem) {
          +						var queueItemKey = queueItem[0];
          +						var queueItemValue = queueItem[1];
          +						
          +						if (queueItemKey == key) {
          +							// found a dupe... push to end of queue, null current item, and break
          +							this.eventQueue[i] = null;
          +							this.eventQueue.push([key, (!YAHOO.lang.isUndefined(value) ? value : queueItemValue)]);
          +							foundDuplicate = true;
          +							break;
          +						}
          +					}
          +				}
          +				
          +				if (! foundDuplicate && !YAHOO.lang.isUndefined(value)) { // this is a refire, or a new property in the queue
          +					this.eventQueue.push([key, value]);
          +				}
          +			}
          +
          +			if (property.supercedes) {
          +				var sLen = property.supercedes.length;
          +				for (var s=0; s < sLen; s++) {
          +					var supercedesCheck = property.supercedes[s];
          +					var qLen = this.eventQueue.length;
          +					for (var q=0; q < qLen; q++) {
          +						var queueItemCheck = this.eventQueue[q];
          +
          +						if (queueItemCheck) {
          +							var queueItemCheckKey = queueItemCheck[0];
          +							var queueItemCheckValue = queueItemCheck[1];
          +							
          +							if ( queueItemCheckKey == supercedesCheck.toLowerCase() ) {
          +								this.eventQueue.push([queueItemCheckKey, queueItemCheckValue]);
          +								this.eventQueue[q] = null;
          +								break;
          +							}
          +						}
          +					}
          +				}
          +			}
          +			YAHOO.log("Config event queue: " + this.outputEventQueue(), "info");
          +
          +			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
          +	*/
          +	refireEvent : function(key) {
          +		key = key.toLowerCase();
          +
          +		var property = this.config[key];
          +		if (property && property.event && !YAHOO.lang.isUndefined(property.value)) {
          +			if (this.queueInProgress) {
          +				this.queueProperty(key);
          +			} else {
          +				this.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.
          +	*/
          +	applyConfig : function(userConfig, init) {
          +		if (init) {
          +			this.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
          +	*/
          +	refresh : function() {
          +		for (var prop in this.config) {
          +			this.refireEvent(prop);
          +		}
          +	},
          +
          +	/**
          +	* Fires the normalized list of queued property change events
          +	* @method fireQueue
          +	*/
          +	fireQueue : function() {
          +		this.queueInProgress = true;
          +		for (var i=0;i<this.eventQueue.length;i++) {
          +			var queueItem = this.eventQueue[i];
          +			if (queueItem) {
          +				var key = queueItem[0];
          +				var value = queueItem[1];
          +				
          +				var property = this.config[key];
          +				property.value = value;
          +
          +				this.fireEvent(key,value);
          +			}
          +		}
          +		
          +		this.queueInProgress = false;
          +		this.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.
          +	*/	
          +	subscribeToConfigEvent : function(key, handler, obj, override) {
          +		var property = this.config[key.toLowerCase()];
          +		if (property && 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.
          +	*/
          +	unsubscribeFromConfigEvent : function(key, handler, obj) {
          +		var property = this.config[key.toLowerCase()];
          +		if (property && 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.
          +	*/
          +	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
          +	*/
          +	outputEventQueue : function() {
          +		var output = "";
          +		for (var q=0;q<this.eventQueue.length;q++) {
          +			var queueItem = this.eventQueue[q];
          +			if (queueItem) {
          +				output += queueItem[0] + "=" + queueItem[1] + ", ";
          +			}
          +		}
          +		return output;
          +	}
          +};
          +
          +
          +/**
          +* 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;
          +	this.configChangedEvent = new YAHOO.util.CustomEvent(YAHOO.util.CONFIG_CHANGED_EVENT, this);
          +	this.queueInProgress = false;
          +	this.config = {};
          +	this.initialConfig = {};
          +	this.eventQueue = [];
          +};
          +
          +/**
          +* 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;
          +};
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/ContainerEffect.js.html b/www/extras/yui/docs/ContainerEffect.js.html new file mode 100644 index 000000000..c701aa63d --- /dev/null +++ b/www/extras/yui/docs/ContainerEffect.js.html @@ -0,0 +1,429 @@ + + + + API: container ContainerEffect.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + + > ContainerEffect.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +* 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);
          +	this.beforeAnimateOutEvent = new YAHOO.util.CustomEvent("beforeAnimateOut", this);
          +
          +	this.animateInCompleteEvent = new YAHOO.util.CustomEvent("animateInComplete", this);
          +	this.animateOutCompleteEvent = new YAHOO.util.CustomEvent("animateOutComplete", this);
          +
          +	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}	overlay	The Overlay object to animate
          +* @param {Number}	dur	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}	overlay	The Overlay object to animate
          +* @param {Number}	dur	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 © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/CustomEvent.js.html b/www/extras/yui/docs/CustomEvent.js.html new file mode 100644 index 000000000..937c538f7 --- /dev/null +++ b/www/extras/yui/docs/CustomEvent.js.html @@ -0,0 +1,487 @@ + + + + API: event CustomEvent.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Event Utility  2.2.2

          +

          + Yahoo! UI Library + > event + + > CustomEvent.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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 debugsystem
          + * @param {int}     signature the signature that the custom event subscriber
          + *                  will receive. YAHOO.util.CustomEvent.LIST or 
          + *                  YAHOO.util.CustomEvent.FLAT.  The default is
          + *                  YAHOO.util.CustomEvent.LIST.
          + * @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 debug outpu 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) {
          +        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 (!fn) {
          +throw new Error("Invalid callback for subscriber to '" + this.type + "'");
          +        }
          +
          +        if (this.subscribeEvent) {
          +            this.subscribeEvent.fire(fn, obj, override);
          +        }
          +
          +        this.subscribers.push( new YAHOO.util.Subscriber(fn, obj, override) );
          +    },
          +
          +    /**
          +     * Unsubscribes subscribers.
          +     * @method unsubscribe
          +     * @param {Function} fn  The subscribed function to remove, if not supplied
          +     *                       all will be removed
          +     * @param {Object}   obj  The custom object passed to subscribe.  This is
          +     *                        optional, but if supplied will be used to
          +     *                        disambiguate multiple listeners that are the same
          +     *                        (e.g., you subscribe many object using a function
          +     *                        that lives on the prototype)
          +     * @return {boolean} True if the subscriber was found and detached.
          +     */
          +    unsubscribe: function(fn, obj) {
          +
          +        if (!fn) {
          +            return this.unsubscribeAll();
          +        }
          +
          +        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.
          +     * @return {boolean} false if one of the subscribers returned false, 
          +     *                   true otherwise
          +     */
          +    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) {
          +            YAHOO.log( "Firing "       + this  + ", " + 
          +                       "args: "        + args  + ", " +
          +                       "subscribers: " + len,                 
          +                       "info", "Event"                  );
          +        }
          +
          +        for (i=0; i<len; ++i) {
          +            var s = this.subscribers[i];
          +            if (s) {
          +                if (!this.silent) {
          +                    YAHOO.log( this.type + "->" + (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
          +     * @return {int} The number of listeners unsubscribed
          +     */
          +    unsubscribeAll: function() {
          +        for (var i=0, len=this.subscribers.length; i<len; ++i) {
          +            this._delete(len - 1 - i);
          +        }
          +
          +        return 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") + " }";
          +};
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/DD.js.html b/www/extras/yui/docs/DD.js.html new file mode 100644 index 000000000..2a0837887 --- /dev/null +++ b/www/extras/yui/docs/DD.js.html @@ -0,0 +1,387 @@ + + + + API: dragdrop DD.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Drag and Drop  2.2.2

          +

          + Yahoo! UI Library + > dragdrop + + > DD.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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);
          +            }
          +        }
          +    },
          +
          +    /*
          +     * 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.setStartPosition();
          +        // 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");
          +    }
          +
          +    */
          +
          +});
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/DDProxy.js.html b/www/extras/yui/docs/DDProxy.js.html new file mode 100644 index 000000000..cd99b5296 --- /dev/null +++ b/www/extras/yui/docs/DDProxy.js.html @@ -0,0 +1,330 @@ + + + + API: dragdrop DDProxy.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Drag and Drop  2.2.2

          +

          + Yahoo! UI Library + > dragdrop + + > DDProxy.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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) {
          +        this.setStartPosition();
          +        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);
          +    }
          +
          +});
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/DDTarget.js.html b/www/extras/yui/docs/DDTarget.js.html new file mode 100644 index 000000000..300512692 --- /dev/null +++ b/www/extras/yui/docs/DDTarget.js.html @@ -0,0 +1,141 @@ + + + + API: dragdrop DDTarget.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Drag and Drop  2.2.2

          +

          + Yahoo! UI Library + > dragdrop + + > DDTarget.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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 © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/DataSource.html b/www/extras/yui/docs/DataSource.html new file mode 100644 index 000000000..d0597ce1d --- /dev/null +++ b/www/extras/yui/docs/DataSource.html @@ -0,0 +1,1990 @@ + + + + API: datasource DataSource (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          DataSource Utility  2.2.2

          +

          + Yahoo! UI Library + > datasource + > DataSource + +

          +
          + +
          +
          +
          + + +

          + + + + + Class DataSource + + + + + - uses + + YAHOO.util.EventProvider + + + + +

          + + + + + +
          + The DataSource class defines and manages a live set of data for widgets to +interact with. Examples of live databases include in-memory +local data such as a JavaScript array, a JavaScript function, or JSON, or +remote data such as data retrieved through an XHR connection. +
          + +
          +

          Constructor

          +
          +
          + DataSource + + ( + + + + oLiveData + + , + oConfigs + ) + +
          +
          +
          Parameters:
          +
          + oLiveData + <Object> + + Pointer to live database +
          +
          + oConfigs + <Object> + + (optional) Object literal of configuration values +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _aCache + - private Object[] +

          +
          +
          + Local cache of data result objects indexed chronologically. +
          +
          + + + + +
          +

          _nIndex + - private Number +

          +
          +
          + Internal class variable to index multiple DataSource instances. +
          +
          + + + + +
          +

          _sName + - private String +

          +
          +
          + Name of DataSource instance. +
          +
          + + + + +
          +

          _xhrCallback + - private object +

          +
          +
          + Connection Manager callback object +
          +
          + + + + +
          +

          connMgr + - Object +

          +
          +
          + Alias to YUI Connection Manager. Allows implementers to specify their own +subclasses of the YUI Connection Manager utility. +
          +
          + + +
          + Default Value: YAHOO.util.Connect +
          + + +
          +

          connTimeout + - Number +

          +
          +
          + If data is accessed over XHR via Connection Manager, the connection timeout is +configurable in 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. +
          +
          + + +
          + Default Value: 0 +
          + + +
          +

          dataType + - Number +

          +
          +
          + Where the live data is held. +
          +
          + + +
          + Default Value: YAHOO.util.DataSource.TYPE_UNKNOWN +
          + + +
          +

          ERROR_DATAINVALID + - final String +

          +
          +
          + Error message for invalid data responses. +
          +
          + + +
          + Default Value: "Invalid data" +
          + + +
          +

          ERROR_DATANULL + - final String +

          +
          +
          + Error message for null data responses. +
          +
          + + +
          + Default Value: "Null data" +
          + + +
          +

          liveData + - Object +

          +
          +
          + Pointer to live database. +
          +
          + + + + +
          +

          maxCacheEntries + - Number +

          +
          +
          + 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. +
          +
          + + +
          + Default Value: 0 +
          + + +
          +

          responseSchema + - Object +

          +
          +
          + Response schema object literal takes a combination of the following properties: +
          +
          resultsList
          Pointer to array of tabular data
          +
          resultNode
          Pointer to node name of row data (XML data only)
          +
          recordDelim
          Record delimiter (text data only)
          +
          fieldDelim
          Field delimiter (text data only)
          +
          fields
          Array of field names (aka keys), or array of object literals +such as: {key:"fieldname",converter:YAHOO.util.DataSource.convertDate}
          +
          +
          +
          + + + + +
          +

          responseType + - Number +

          +
          +
          + Format of response. +
          +
          + + +
          + Default Value: YAHOO.util.DataSource.TYPE_UNKNOWN +
          + + +
          +

          TYPE_JSARRAY + - final Number +

          +
          +
          + Type is a JavaScript Array. +
          +
          + + +
          + Default Value: 0 +
          + + +
          +

          TYPE_JSFUNCTION + - final Number +

          +
          +
          + Type is a JavaScript Function. +
          +
          + + +
          + Default Value: 1 +
          + + +
          +

          TYPE_JSON + - final Number +

          +
          +
          + Type is JSON. +
          +
          + + +
          + Default Value: 3 +
          + + +
          +

          TYPE_TEXT + - final Number +

          +
          +
          + Type is plain text. +
          +
          + + +
          + Default Value: 5 +
          + + +
          +

          TYPE_UNKNOWN + - final Number +

          +
          +
          + Type is unknown. +
          +
          + + +
          + Default Value: -1 +
          + + +
          +

          TYPE_XHR + - final Number +

          +
          +
          + Type is hosted on a server via an XHR connection. +
          +
          + + +
          + Default Value: 2 +
          + + +
          +

          TYPE_XML + - final Number +

          +
          +
          + Type is XML. +
          +
          + + +
          + Default Value: 4 +
          + + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Methods

          +
          +

          + _xhrFailure

          +
          + + private + + + void + _xhrFailure + ( + + + oResponse + + + ) + + +
          + Connection Manager failure handler +
          + +
          + +
          +
          Parameters:
          +
          + oResponse <Object> + HTTPXMLRequest object +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _xhrSuccess

          +
          + + private + + + void + _xhrSuccess + ( + + + oResponse + + + ) + + +
          + Connection Manager success handler +
          + +
          + +
          +
          Parameters:
          +
          + oResponse <Object> + HTTPXMLRequest object +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + addToCache

          +
          + + + + + void + addToCache + ( + + + oRequest + + + , + oResponse + + + ) + + +
          + Adds a new item to the cache. If cache is full, evicts the stalest item +before adding the new item. +
          + +
          + +
          +
          Parameters:
          +
          + oRequest <Object> + Request object. +
          +
          + oResponse <Object> + Response object to cache. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + convertDate

          +
          + + + static + + Date + convertDate + ( + ) + + +
          + Converts data from String to Date objects. +
          + +
          + + +
          +
          Returns: + + Date +
          +
          Date object.
          +
          + +
          + +
          +
          +

          + convertNumber

          +
          + + + static + + Number + convertNumber + ( + ) + + +
          + Converts data from String to Number objects. +
          + +
          + + +
          +
          Returns: + + Number +
          +
          Number object.
          +
          + +
          + +
          +
          +

          + doBeforeCallback

          +
          + + + + + Object + doBeforeCallback + ( + + + oRequest + + + , + oRawResponse + + + , + oParsedResponse + + + ) + + +
          + Overridable method gives implementers access to the original raw response and +the parsed response (parsed against the given schema) before the data +is added to the cache (if applicable) and then sent back to callback function. +This is your chance to access the raw response and/or populate the parsed +response with any custom data. +
          + +
          + +
          +
          Parameters:
          +
          + oRequest <Object> + Request object. +
          +
          + oRawResponse <Object> + The raw response from the live database. +
          +
          + oParsedResponse <Object> + The parsed response to return to calling object. +
          +
          + +
          +
          Returns: + + Object +
          +
          Parsed response object
          +
          + +
          + +
          +
          +

          + flushCache

          +
          + + + + + void + flushCache + ( + ) + + +
          + Flushes cache. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getCachedResponse

          +
          + + + + + Object + getCachedResponse + ( + + + oRequest + + + , + oCallback + + + , + oCaller + + + ) + + +
          + Overridable method passes request to cache and returns cached response if any, +refreshing the hit in the cache as the newest item. Returns null if there is +no cache hit. +
          + +
          + +
          +
          Parameters:
          +
          + oRequest <Object> + Request object. +
          +
          + oCallback <Function> + Handler function to receive the response +
          +
          + oCaller <Object> + The Calling object that is making the request +
          +
          + +
          +
          Returns: + + Object +
          +
          Cached response object or null.
          +
          + +
          + +
          +
          +

          + handleResponse

          +
          + + + + + void + handleResponse + ( + + + oRequest + + + , + oRawResponse + + + , + oCallback + + + , + oCaller + + + ) + + +
          + Handles raw data response from live data source. +
          + +
          + +
          +
          Parameters:
          +
          + oRequest <Object> + Request object +
          +
          + oRawResponse <Object> + The raw response from the live database +
          +
          + oCallback <Function> + Handler function to receive the response +
          +
          + oCaller <Object> + The calling object that is making the request +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + isCacheHit

          +
          + + + + + Boolean + isCacheHit + ( + + + oRequest + + + , + oCachedRequest + + + ) + + +
          + Default overridable method matches given request to given cached request. +Returns true if is a hit, returns false otherwise. Implementers should +override this method to customize the cache-matching algorithm. +
          + +
          + +
          +
          Parameters:
          +
          + oRequest <Object> + Request object. +
          +
          + oCachedRequest <Object> + Cached request object. +
          +
          + +
          +
          Returns: + + Boolean +
          +
          True if given request matches cached request, false otherwise.
          +
          + +
          + +
          +
          +

          + makeConnection

          +
          + + + + + void + makeConnection + ( + + + oRequest + + + , + oCallback + + + , + oCaller + + + ) + + +
          + Overridable method provides default functionality to make a connection to +live data in order to send request. The response coming back is then +forwarded to the handleResponse function. This method should be customized +for more complex implementations. +
          + +
          + +
          +
          Parameters:
          +
          + oRequest <Object> + Request object. +
          +
          + oCallback <Function> + Handler function to receive the response +
          +
          + oCaller <Object> + The Calling object that is making the request +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + parseArrayData

          +
          + + + + + Object + parseArrayData + ( + + + oRequest + + + , + oRawResponse + + + ) + + +
          + Overridable method parses raw array data into a response object. +
          + +
          + +
          +
          Parameters:
          +
          + oRequest <Object> + Request object. +
          +
          + oRawResponse <Object> + The raw response from the live database. +
          +
          + +
          +
          Returns: + + Object +
          +
          Parsed response object.
          +
          + +
          + +
          +
          +

          + parseJSONData

          +
          + + + + + Object + parseJSONData + ( + + + oRequest + + + , + oRawResponse + + + ) + + +
          + Overridable method parses raw JSON data into a response object. +
          + +
          + +
          +
          Parameters:
          +
          + oRequest <Object> + Request object +
          +
          + oRawResponse <Object> + The raw response from the live database +
          +
          + +
          +
          Returns: + + Object +
          +
          Parsed response object
          +
          + +
          + +
          +
          +

          + parseTextData

          +
          + + + + + Object + parseTextData + ( + + + oRequest + + + , + oRawResponse + + + ) + + +
          + Overridable method parses raw plain text data into a response object. +
          + +
          + +
          +
          Parameters:
          +
          + oRequest <Object> + Request object +
          +
          + oRawResponse <Object> + The raw response from the live database +
          +
          + +
          +
          Returns: + + Object +
          +
          Parsed response object
          +
          + +
          + +
          +
          +

          + parseXMLData

          +
          + + + + + Object + parseXMLData + ( + + + oRequest + + + , + oRawResponse + + + ) + + +
          + Overridable method parses raw XML data into a response object. +
          + +
          + +
          +
          Parameters:
          +
          + oRequest <Object> + Request object +
          +
          + oRawResponse <Object> + The raw response from the live database +
          +
          + +
          +
          Returns: + + Object +
          +
          Parsed response object
          +
          + +
          + +
          +
          +

          + sendRequest

          +
          + + + + + void + sendRequest + ( + + + oRequest + + + , + oCallback + + + , + oCaller + + + ) + + +
          + First looks for cached response, then sends request to live data. +
          + +
          + +
          +
          Parameters:
          +
          + oRequest <Object> + Request object +
          +
          + oCallback <Function> + Handler function to receive the response +
          +
          + oCaller <Object> + The Calling object that is making the request +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Public accessor to the unique name of the DataSource instance. +
          + +
          + + +
          +
          Returns: + + String +
          +
          Unique name of the DataSource instance.
          +
          + +
          + +
          +
          +
          +
          + +
          +

          Methods inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Events

          +
          +

          + cacheFlushEvent

          +
          + + + + + cacheFlushEvent + + ( + ) + + + +
          + Fired when the local cache is flushed. +
          + +
          + + + + +
          + +
          +
          +

          + cacheRequestEvent

          +
          + + + + + cacheRequestEvent + + ( + + + oArgs.request + + + , + oArgs.callback + + + , + oArgs.caller + + + ) + + + +
          + Fired when a request is made to the local cache. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.request <Object> + The request object. +
          +
          + oArgs.callback <Function> + The callback function. +
          +
          + oArgs.caller <Object> + The parent object of the callback function. +
          +
          + + +
          + +
          +
          +

          + dataErrorEvent

          +
          + + + + + dataErrorEvent + + ( + + + oArgs.request + + + , + oArgs.callback + + + , + oArgs.caller + + + , + oArgs.message + + + ) + + + +
          + Fired when an error is encountered with the live data source. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.request <Object> + The request object. +
          +
          + oArgs.callback <Function> + The callback function. +
          +
          + oArgs.caller <Object> + The parent object of the callback function. +
          +
          + oArgs.message <String> + The error message. +
          +
          + + +
          + +
          +
          +

          + getCachedResponseEvent

          +
          + + + + + getCachedResponseEvent + + ( + + + oArgs.request + + + , + oArgs.response + + + , + oArgs.callback + + + , + oArgs.caller + + + ) + + + +
          + Fired when data is retrieved from the local cache. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.request <Object> + The request object. +
          +
          + oArgs.response <Object> + The response object. +
          +
          + oArgs.callback <Function> + The callback function. +
          +
          + oArgs.caller <Object> + The parent object of the callback function. +
          +
          + + +
          + +
          +
          +

          + requestEvent

          +
          + + + + + requestEvent + + ( + + + oArgs.request + + + , + oArgs.callback + + + , + oArgs.caller + + + ) + + + +
          + Fired when a request is sent to the live data source. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.request <Object> + The request object. +
          +
          + oArgs.callback <Function> + The callback function. +
          +
          + oArgs.caller <Object> + The parent object of the callback function. +
          +
          + + +
          + +
          +
          +

          + responseCacheEvent

          +
          + + + + + responseCacheEvent + + ( + + + oArgs.request + + + , + oArgs.response + + + , + oArgs.callback + + + , + oArgs.caller + + + ) + + + +
          + Fired when response is cached. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.request <Object> + The request object. +
          +
          + oArgs.response <Object> + The parsed response object. +
          +
          + oArgs.callback <Function> + The callback function. +
          +
          + oArgs.caller <Object> + The parent object of the callback function. +
          +
          + + +
          + +
          +
          +

          + responseEvent

          +
          + + + + + responseEvent + + ( + + + oArgs.request + + + , + oArgs.response + + + , + oArgs.callback + + + , + oArgs.caller + + + ) + + + +
          + Fired when live data source sends response. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.request <Object> + The request object. +
          +
          + oArgs.response <Object> + The raw response object. +
          +
          + oArgs.callback <Function> + The callback function. +
          +
          + oArgs.caller <Object> + The parent object of the callback function. +
          +
          + + +
          + +
          +
          +

          + responseParseEvent

          +
          + + + + + responseParseEvent + + ( + + + oArgs.request + + + , + oArgs.response + + + , + oArgs.callback + + + , + oArgs.caller + + + ) + + + +
          + Fired when response is parsed. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.request <Object> + The request object. +
          +
          + oArgs.response <Object> + The parsed response object. +
          +
          + oArgs.callback <Function> + The callback function. +
          +
          + oArgs.caller <Object> + The parent object of the callback function. +
          +
          + + +
          + +
          +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/DataSource.js.html b/www/extras/yui/docs/DataSource.js.html new file mode 100644 index 000000000..208e393cd --- /dev/null +++ b/www/extras/yui/docs/DataSource.js.html @@ -0,0 +1,1153 @@ + + + + API: datasource DataSource.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          DataSource Utility  2.2.2

          +

          + Yahoo! UI Library + > datasource + + > DataSource.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * The DataSource utility provides a common configurable interface for widgets
          + * to access a variety of data, from JavaScript arrays to online servers over
          + * XHR.
          + *
          + * @module datasource
          + * @requires yahoo, event
          + * @optional xhr
          + * @title DataSource Utility
          + * @beta
          + */
          +
          +/****************************************************************************/
          +/****************************************************************************/
          +/****************************************************************************/
          +
          +/**
          + * The DataSource class defines and manages a live set of data for widgets to
          + * interact with. Examples of live databases include in-memory
          + * local data such as a JavaScript array, a JavaScript function, or JSON, or
          + * remote data such as data retrieved through an XHR connection.
          + *
          + * @class DataSource
          + * @uses YAHOO.util.EventProvider
          + * @constructor
          + * @param oLiveData {Object} Pointer to live database
          + * @param oConfigs {Object} (optional) Object literal of configuration values
          + */
          +YAHOO.util.DataSource = function(oLiveData, oConfigs) {
          +    // Set any config params passed in to override defaults
          +    if(oConfigs && (oConfigs.constructor == Object)) {
          +        for(var sConfig in oConfigs) {
          +            if(sConfig) {
          +                this[sConfig] = oConfigs[sConfig];
          +            }
          +        }
          +    }
          +
          +    if(!oLiveData) {
          +        YAHOO.log("Could not instantiate DataSource due to invalid live database.","error",this.toString());
          +        return;
          +    }
          +    
          +    if(YAHOO.lang.isArray(oLiveData)) {
          +        this.dataType = YAHOO.util.DataSource.TYPE_JSARRAY;
          +    }
          +    else if(YAHOO.lang.isString(oLiveData)) {
          +        this.dataType = YAHOO.util.DataSource.TYPE_XHR;
          +    }
          +    else if(YAHOO.lang.isFunction(oLiveData)) {
          +        this.dataType = YAHOO.util.DataSource.TYPE_JSFUNCTION;
          +    }
          +    else if(YAHOO.lang.isObject(oLiveData)) {
          +        this.dataType = YAHOO.util.DataSource.TYPE_JSON;
          +    }
          +    else {
          +        this.dataType = YAHOO.util.DataSource.TYPE_UNKNOWN;
          +    }
          +
          +    this.liveData = oLiveData;
          +
          +    // Validate and initialize public configs
          +    var maxCacheEntries = this.maxCacheEntries;
          +    if(!YAHOO.lang.isNumber(maxCacheEntries) || (maxCacheEntries < 0)) {
          +        maxCacheEntries = 0;
          +    }
          +
          +    // Initialize local cache
          +    if(maxCacheEntries > 0 && !this._aCache) {
          +        this._aCache = [];
          +        YAHOO.log("Cache initialized","info",this.toString());
          +    }
          +
          +    this._sName = "instance" + YAHOO.util.DataSource._nIndex;
          +    YAHOO.util.DataSource._nIndex++;
          +    YAHOO.log("DataSource initialized", "info", this.toString());
          +
          +
          +    /////////////////////////////////////////////////////////////////////////////
          +    //
          +    // Custom Events
          +    //
          +    /////////////////////////////////////////////////////////////////////////////
          +
          +    /**
          +     * Fired when a request is made to the local cache.
          +     *
          +     * @event cacheRequestEvent
          +     * @param oArgs.request {Object} The request object.
          +     * @param oArgs.callback {Function} The callback function.
          +     * @param oArgs.caller {Object} The parent object of the callback function.
          +     */
          +    this.createEvent("cacheRequestEvent");
          +
          +    /**
          +     * Fired when data is retrieved from the local cache.
          +     *
          +     * @event getCachedResponseEvent
          +     * @param oArgs.request {Object} The request object.
          +     * @param oArgs.response {Object} The response object.
          +     * @param oArgs.callback {Function} The callback function.
          +     * @param oArgs.caller {Object} The parent object of the callback function.
          +     */
          +    this.createEvent("cacheResponseEvent");
          +
          +    /**
          +     * Fired when a request is sent to the live data source.
          +     *
          +     * @event requestEvent
          +     * @param oArgs.request {Object} The request object.
          +     * @param oArgs.callback {Function} The callback function.
          +     * @param oArgs.caller {Object} The parent object of the callback function.
          +     */
          +    this.createEvent("requestEvent");
          +
          +    /**
          +     * Fired when live data source sends response.
          +     *
          +     * @event responseEvent
          +     * @param oArgs.request {Object} The request object.
          +     * @param oArgs.response {Object} The raw response object.
          +     * @param oArgs.callback {Function} The callback function.
          +     * @param oArgs.caller {Object} The parent object of the callback function.
          +     */
          +    this.createEvent("responseEvent");
          +
          +    /**
          +     * Fired when response is parsed.
          +     *
          +     * @event responseParseEvent
          +     * @param oArgs.request {Object} The request object.
          +     * @param oArgs.response {Object} The parsed response object.
          +     * @param oArgs.callback {Function} The callback function.
          +     * @param oArgs.caller {Object} The parent object of the callback function.
          +     */
          +    this.createEvent("responseParseEvent");
          +
          +    /**
          +     * Fired when response is cached.
          +     *
          +     * @event responseCacheEvent
          +     * @param oArgs.request {Object} The request object.
          +     * @param oArgs.response {Object} The parsed response object.
          +     * @param oArgs.callback {Function} The callback function.
          +     * @param oArgs.caller {Object} The parent object of the callback function.
          +     */
          +    this.createEvent("responseCacheEvent");
          +    /**
          +     * Fired when an error is encountered with the live data source.
          +     *
          +     * @event dataErrorEvent
          +     * @param oArgs.request {Object} The request object.
          +     * @param oArgs.callback {Function} The callback function.
          +     * @param oArgs.caller {Object} The parent object of the callback function.
          +     * @param oArgs.message {String} The error message.
          +     */
          +    this.createEvent("dataErrorEvent");
          +
          +    /**
          +     * Fired when the local cache is flushed.
          +     *
          +     * @event cacheFlushEvent
          +     */
          +    this.createEvent("cacheFlushEvent");
          +};
          +
          +YAHOO.augment(YAHOO.util.DataSource, YAHOO.util.EventProvider);
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Public constants
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Type is unknown.
          + *
          + * @property TYPE_UNKNOWN
          + * @type Number
          + * @final
          + * @default -1
          + */
          +YAHOO.util.DataSource.TYPE_UNKNOWN = -1;
          +
          +/**
          + * Type is a JavaScript Array.
          + *
          + * @property TYPE_JSARRAY
          + * @type Number
          + * @final
          + * @default 0
          + */
          +YAHOO.util.DataSource.TYPE_JSARRAY = 0;
          +
          +/**
          + * Type is a JavaScript Function.
          + *
          + * @property TYPE_JSFUNCTION
          + * @type Number
          + * @final
          + * @default 1
          + */
          +YAHOO.util.DataSource.TYPE_JSFUNCTION = 1;
          +
          +/**
          + * Type is hosted on a server via an XHR connection.
          + *
          + * @property TYPE_XHR
          + * @type Number
          + * @final
          + * @default 2
          + */
          +YAHOO.util.DataSource.TYPE_XHR = 2;
          +
          +/**
          + * Type is JSON.
          + *
          + * @property TYPE_JSON
          + * @type Number
          + * @final
          + * @default 3
          + */
          +YAHOO.util.DataSource.TYPE_JSON = 3;
          +
          +/**
          + * Type is XML.
          + *
          + * @property TYPE_XML
          + * @type Number
          + * @final
          + * @default 4
          + */
          +YAHOO.util.DataSource.TYPE_XML = 4;
          +
          +/**
          + * Type is plain text.
          + *
          + * @property TYPE_TEXT
          + * @type Number
          + * @final
          + * @default 5
          + */
          +YAHOO.util.DataSource.TYPE_TEXT = 5;
          +/**
          + * Error message for invalid data responses.
          + *
          + * @property ERROR_DATAINVALID
          + * @type String
          + * @final
          + * @default "Invalid data"
          + */
          +YAHOO.util.DataSource.ERROR_DATAINVALID = "Invalid data";
          +
          +/**
          + * Error message for null data responses.
          + *
          + * @property ERROR_DATANULL
          + * @type String
          + * @final
          + * @default "Null data"
          + */
          +YAHOO.util.DataSource.ERROR_DATANULL = "Null data";
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Private member variables
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Internal class variable to index multiple DataSource instances.
          + *
          + * @property _nIndex
          + * @type Number
          + * @private
          + */
          +YAHOO.util.DataSource._nIndex = 0;
          +
          +/**
          + * Name of DataSource instance.
          + *
          + * @property _sName
          + * @type String
          + * @private
          + */
          +YAHOO.util.DataSource.prototype._sName = null;
          +
          +/**
          + * Local cache of data result objects indexed chronologically.
          + *
          + * @property _aCache
          + * @type Object[]
          + * @private
          + */
          +YAHOO.util.DataSource.prototype._aCache = null;
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Private methods
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// 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 0
          + */
          +YAHOO.util.DataSource.prototype.maxCacheEntries = 0;
          +
          + /**
          + * Pointer to live database.
          + *
          + * @property liveData
          + * @type Object
          + */
          +YAHOO.util.DataSource.prototype.liveData = null;
          +
          + /**
          + * If data is accessed over XHR via Connection Manager, the connection timeout is
          + * configurable in 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.util.DataSource.prototype.connTimeout = null;
          +
          + /**
          + * 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.util.DataSource.prototype.connMgr = YAHOO.util.Connect || null;
          +
          +/**
          + * Where the live data is held.
          + *
          + * @property dataType
          + * @type Number
          + * @default YAHOO.util.DataSource.TYPE_UNKNOWN
          + *
          + */
          +YAHOO.util.DataSource.prototype.dataType = YAHOO.util.DataSource.TYPE_UNKNOWN;
          +
          +/**
          + * Format of response.
          + *
          + * @property responseType
          + * @type Number
          + * @default YAHOO.util.DataSource.TYPE_UNKNOWN
          + */
          +YAHOO.util.DataSource.prototype.responseType = YAHOO.util.DataSource.TYPE_UNKNOWN;
          +
          +/**
          + * Response schema object literal takes a combination of the following properties:
          + *
          + * <dl>
          + * <dt>resultsList</dt> <dd>Pointer to array of tabular data</dd>
          + * <dt>resultNode</dt> <dd>Pointer to node name of row data (XML data only)</dd>
          + * <dt>recordDelim</dt> <dd>Record delimiter (text data only)</dd>
          + * <dt>fieldDelim</dt> <dd>Field delimiter (text data only)</dd>
          + * <dt>fields</dt> <dd>Array of field names (aka keys), or array of object literals
          + * such as: {key:"fieldname",converter:YAHOO.util.DataSource.convertDate}</dd>
          + * </dl>
          + *
          + * @property responseSchema
          + * @type Object
          + */
          +YAHOO.util.DataSource.prototype.responseSchema = null;
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Public static methods
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Converts data from String to Number objects.
          + *
          + * @method convertNumber
          + * @method sData {String} Number string.
          + * @return {Number} Number object.
          + * @static
          + */
          +YAHOO.util.DataSource.convertNumber = function(sData) {
          +    return sData * 1;
          +};
          +
          +/**
          + * Converts data from String to Date objects.
          + *
          + * @method convertDate
          + * @method sData {String} Date string.
          + * @return {Date} Date object.
          + * @static
          + */
          +YAHOO.util.DataSource.convertDate = function(sData) {
          +    var mm = sMarkup.substring(0,sMarkup.indexOf("/"));
          +    sMarkup = sMarkup.substring(sMarkup.indexOf("/")+1);
          +    var dd = sMarkup.substring(0,sMarkup.indexOf("/"));
          +    var yy = sMarkup.substring(sMarkup.indexOf("/")+1);
          +    return new Date(yy, mm, dd);
          +};
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Public methods
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Public accessor to the unique name of the DataSource instance.
          + *
          + * @method toString
          + * @return {String} Unique name of the DataSource instance.
          + */
          +YAHOO.util.DataSource.prototype.toString = function() {
          +    return "DataSource " + this._sName;
          +};
          +
          +/**
          + * Overridable method passes request to cache and returns cached response if any,
          + * refreshing the hit in the cache as the newest item. Returns null if there is
          + * no cache hit.
          + *
          + * @method getCachedResponse
          + * @param oRequest {Object} Request object.
          + * @param oCallback {Function} Handler function to receive the response
          + * @param oCaller {Object} The Calling object that is making the request
          + * @return {Object} Cached response object or null.
          + */
          +YAHOO.util.DataSource.prototype.getCachedResponse = function(oRequest, oCallback, oCaller) {
          +    var aCache = this._aCache;
          +    var nCacheLength = (aCache) ? aCache.length : 0;
          +    var oResponse = null;
          +
          +    // If cache is enabled...
          +    if((this.maxCacheEntries > 0) && aCache && (nCacheLength > 0)) {
          +        this.fireEvent("cacheRequestEvent", {request:oRequest,callback:oCallback,caller:oCaller});
          +
          +        // Loop through each cached element
          +        for(var i = nCacheLength-1; i >= 0; i--) {
          +            var oCacheElem = aCache[i];
          +
          +            // Defer cache hit logic to a public overridable method
          +            if(this.isCacheHit(oRequest,oCacheElem.request)) {
          +                // Grab the cached response
          +                oResponse = oCacheElem.response;
          +                // The cache returned a hit!
          +                // Remove element from its original location
          +                aCache.splice(i,1);
          +                // Add as newest
          +                this.addToCache(oRequest, oResponse);
          +                this.fireEvent("cacheResponseEvent", {request:oRequest,response:oResponse,callback:oCallback,caller:oCaller});
          +                break;
          +            }
          +        }
          +    }
          +    YAHOO.log("The cached response for \"" + oRequest + "\" is " + oResponse,"info",this.toString());
          +    return oResponse;
          +};
          +
          +/**
          + * Default overridable method matches given request to given cached request.
          + * Returns true if is a hit, returns false otherwise.  Implementers should
          + * override this method to customize the cache-matching algorithm.
          + *
          + * @method isCacheHit
          + * @param oRequest {Object} Request object.
          + * @param oCachedRequest {Object} Cached request object.
          + * @return {Boolean} True if given request matches cached request, false otherwise.
          + */
          +YAHOO.util.DataSource.prototype.isCacheHit = function(oRequest, oCachedRequest) {
          +    return (oRequest === oCachedRequest);
          +};
          +
          +/**
          + * Adds a new item to the cache. If cache is full, evicts the stalest item
          + * before adding the new item.
          + *
          + * @method addToCache
          + * @param oRequest {Object} Request object.
          + * @param oResponse {Object} Response object to cache.
          + */
          +YAHOO.util.DataSource.prototype.addToCache = function(oRequest, oResponse) {
          +    var aCache = this._aCache;
          +    if(!aCache) {
          +        return;
          +    }
          +
          +    //TODO: check for duplicate entries
          +
          +    // If the cache is full, make room by removing stalest element (index=0)
          +    while(aCache.length >= this.maxCacheEntries) {
          +        aCache.shift();
          +    }
          +
          +    // Add to cache in the newest position, at the end of the array
          +    var oCacheElem = {request:oRequest,response:oResponse};
          +    aCache.push(oCacheElem);
          +    this.fireEvent("responseCacheEvent",{request:oRequest,response:oResponse});
          +    YAHOO.log("Cached response for \"" +  oRequest + "\"","info",this.toString());
          +};
          +
          +/**
          + * Flushes cache.
          + *
          + * @method flushCache
          + */
          +YAHOO.util.DataSource.prototype.flushCache = function() {
          +    if(this._aCache) {
          +        this._aCache = [];
          +        this.fireEvent("cacheFlushEvent");
          +        YAHOO.log("Flushed cache","info",this.toString());
          +    }
          +};
          +
          +/**
          + * First looks for cached response, then sends request to live data.
          + *
          + * @method sendRequest
          + * @param oRequest {Object} Request object
          + * @param oCallback {Function} Handler function to receive the response
          + * @param oCaller {Object} The Calling object that is making the request
          + */
          +YAHOO.util.DataSource.prototype.sendRequest = function(oRequest, oCallback, oCaller) {
          +    // First look in cache
          +    var oCachedResponse = this.getCachedResponse(oRequest, oCallback, oCaller);
          +    if(oCachedResponse) {
          +        oCallback.call(oCaller, oRequest, oCachedResponse);
          +        return;
          +    }
          +
          +    // Not in cache, so forward request to live data
          +    YAHOO.log("Making connection to live data for \"" + oRequest + "\"","info",this.toString());
          +    this.makeConnection(oRequest, oCallback, oCaller);
          +};
          +
          +/**
          + * Overridable method provides default functionality to make a connection to
          + * live data in order to send request. The response coming back is then
          + * forwarded to the handleResponse function. This method should be customized
          + * for more complex implementations.
          + *
          + * @method makeConnection
          + * @param oRequest {Object} Request object.
          + * @param oCallback {Function} Handler function to receive the response
          + * @param oCaller {Object} The Calling object that is making the request
          + */
          +YAHOO.util.DataSource.prototype.makeConnection = function(oRequest, oCallback, oCaller) {
          +    this.fireEvent("requestEvent", {request:oRequest,callback:oCallback,caller:oCaller});
          +    var oRawResponse = null;
          +    
          +    // How to make the connection depends on the type of data
          +    switch(this.dataType) {
          +    
          +        // If the live data is a JavaScript Array
          +        // simply forward the entire array to the handler
          +        case YAHOO.util.DataSource.TYPE_JSARRAY:
          +        case YAHOO.util.DataSource.TYPE_JSON:
          +            oRawResponse = this.liveData;
          +            this.handleResponse(oRequest, oRawResponse, oCallback, oCaller);
          +            break;
          +            
          +        // If the live data is a JavaScript Function
          +        // pass the request in as a parameter and
          +        // forward the return value to the handler
          +        case YAHOO.util.DataSource.TYPE_JSFUNCTION:
          +            oRawResponse = this.liveData(oRequest);
          +            this.handleResponse(oRequest, oRawResponse, oCallback, oCaller);
          +            break;
          +            
          +        // If the live data is over Connection Manager
          +        // set up the callback object and
          +        // pass the request in as a URL query and
          +        // forward the response to the handler
          +        case YAHOO.util.DataSource.TYPE_XHR:
          +            /**
          +             * Connection Manager success handler
          +             *
          +             * @method _xhrSuccess
          +             * @param oResponse {Object} HTTPXMLRequest object
          +             * @private
          +             */
          +            var _xhrSuccess = function(oResponse) {
          +                // If response ID does not match last made request ID,
          +                // silently fail and wait for the next response
          +                if(oResponse && (!this._oConn || (oResponse.tId != this._oConn.tId))) {
          +                    this.fireEvent("dataErrorEvent", {request:oRequest,callback:oCallback,caller:oCaller,message:YAHOO.util.DataSource.ERROR_DATAINVALID});
          +                    YAHOO.log(YAHOO.util.DataSource.ERROR_DATAINVALID, "error", this.toString());
          +                    return null;
          +                }
          +                // Error if no response
          +                else if(!oResponse) {
          +                    this.fireEvent("dataErrorEvent", {request:oRequest,callback:oCallback,caller:oCaller,message:YAHOO.util.DataSource.ERROR_DATANULL});
          +                    YAHOO.log(YAHOO.util.DataSource.ERROR_DATANULL, "error", this.toString());
          +
          +                    // Send error response back to the caller with the error flag on
          +                    oCallback.call(oCaller, oRequest, oResponse, true);
          +
          +                    return null;
          +                }
          +                // Forward to handler
          +                else {
          +                    this.handleResponse(oRequest, oResponse, oCallback, oCaller);
          +                }
          +            };
          +
          +            /**
          +             * Connection Manager failure handler
          +             *
          +             * @method _xhrFailure
          +             * @param oResponse {Object} HTTPXMLRequest object
          +             * @private
          +             */
          +            var _xhrFailure = function(oResponse) {
          +                this.fireEvent("dataErrorEvent", {request:oRequest,callback:oCallback,caller:oCaller,message:YAHOO.util.DataSource.ERROR_DATAINVALID});
          +                YAHOO.log(YAHOO.util.DataSource.ERROR_DATAINVALID + ": " + oResponse.statusText, "error", this.toString());
          +
          +                // Send failure response back to the caller with the error flag on
          +                oCallback.call(oCaller, oRequest, oResponse, true);
          +                    
          +                return null;
          +            };
          +
          +            /**
          +             * Connection Manager callback object
          +             *
          +             * @property _xhrCallback
          +             * @param oResponse {Object} HTTPXMLRequest object
          +             * @private
          +             */
          +             var _xhrCallback = {
          +                success:_xhrSuccess,
          +                failure:_xhrFailure,
          +                scope: this
          +            };
          +
          +            //TODO: connTimeout config
          +            if(YAHOO.lang.isNumber(this.connTimeout) && (this.connTimeout > 0)) {
          +                _xhrCallback.timeout = this.connTimeout;
          +            }
          +
          +            //TODO: oConn config
          +            if(this._oConn && this.connMgr) {
          +                this.connMgr.abort(this._oConn);
          +            }
          +
          +            var sUri = this.liveData+"?"+oRequest;
          +            if(this.connMgr) {
          +                this._oConn = this.connMgr.asyncRequest("GET", sUri, _xhrCallback, null);
          +            }
          +            else {
          +                YAHOO.log("Could not find a valid Connection Manager","error",this.toString());
          +                // Send null response back to the caller with the error flag on
          +                oCallback.call(oCaller, oRequest, null, true);
          +            }
          +
          +            break;
          +        default:
          +            //TODO: any default?
          +            break;
          +    }
          +};
          +
          +/**
          + * Handles raw data response from live data source.
          + *
          + * @method handleResponse
          + * @param oRequest {Object} Request object
          + * @param oRawResponse {Object} The raw response from the live database
          + * @param oCallback {Function} Handler function to receive the response
          + * @param oCaller {Object} The calling object that is making the request
          + */
          +YAHOO.util.DataSource.prototype.handleResponse = function(oRequest, oRawResponse, oCallback, oCaller) {
          +    this.fireEvent("responseEvent", {request:oRequest,response:oRawResponse,callback:oCallback,caller:oCaller});
          +    YAHOO.log("The live data response for \"" + oRequest + "\" is " + oRawResponse,"info",this.toString());
          +    var xhr = (this.dataType == YAHOO.util.DataSource.TYPE_XHR) ? true : false;
          +    var oParsedResponse = null;
          +    var bError = false;
          +    //TODO: break out into overridable methods
          +    switch(this.responseType) {
          +        case YAHOO.util.DataSource.TYPE_JSARRAY:
          +            if(xhr && oRawResponse.responseText) {
          +                oRawResponse = oRawResponse.responseText;
          +            }
          +            oParsedResponse = this.parseArrayData(oRequest, oRawResponse);
          +            break;
          +        case YAHOO.util.DataSource.TYPE_JSON:
          +            if(xhr && oRawResponse.responseText) {
          +                oRawResponse = oRawResponse.responseText;
          +            }
          +            oParsedResponse = this.parseJSONData(oRequest, oRawResponse);
          +            break;
          +        case YAHOO.util.DataSource.TYPE_XML:
          +            if(xhr && oRawResponse.responseXML) {
          +                oRawResponse = oRawResponse.responseXML;
          +            }
          +            oParsedResponse = this.parseXMLData(oRequest, oRawResponse);
          +            break;
          +        case YAHOO.util.DataSource.TYPE_TEXT:
          +            if(xhr && oRawResponse.responseText) {
          +                oRawResponse = oRawResponse.responseText;
          +            }
          +            oParsedResponse = this.parseTextData(oRequest, oRawResponse);
          +            break;
          +        default:
          +            //TODO: pass off to custom function
          +            //var contentType = oRawResponse.getResponseHeader["Content-Type"];
          +            YAHOO.log("Unknown response type","warn",this.toString());
          +            break;
          +    }
          +
          +    // Last chance to touch the raw response or the parsed response
          +    oParsedResponse = this.doBeforeCallback(oRequest, oRawResponse, oParsedResponse);
          +
          +    if(oParsedResponse) {
          +        this.fireEvent("responseParseEvent", {request:oRequest,response:oParsedResponse,callback:oCallback,caller:oCaller});
          +        // Cache the response
          +        this.addToCache(oRequest, oParsedResponse);
          +    }
          +    else {
          +        this.fireEvent("dataErrorEvent", {request:oRequest,callback:oCallback,caller:oCaller,message:YAHOO.util.DataSource.ERROR_DATANULL});
          +        YAHOO.log(YAHOO.util.DataSource.ERROR_DATANULL, "error", this.toString());
          +        
          +        // Send response back to the caller with the error flag on
          +        oParsedResponse.error = true;
          +    }
          +    
          +    // Send the response back to the caller
          +    oCallback.call(oCaller, oRequest, oParsedResponse);
          +};
          +
          +/**
          + * Overridable method gives implementers access to the original raw response and
          + * the parsed response (parsed against the given schema) before the data
          + * is added to the cache (if applicable) and then sent back to callback function.
          + * This is your chance to access the raw response and/or populate the parsed
          + * response with any custom data.
          + *
          + * @method doBeforeCallback
          + * @param oRequest {Object} Request object.
          + * @param oRawResponse {Object} The raw response from the live database.
          + * @param oParsedResponse {Object} The parsed response to return to calling object.
          + * @return {Object} Parsed response object
          + */
          +YAHOO.util.DataSource.prototype.doBeforeCallback = function(oRequest, oRawResponse, oParsedResponse) {
          +    return oParsedResponse;
          +};
          +
          +/**
          + * Overridable method parses raw array data into a response object.
          + *
          + * @method parseArrayData
          + * @param oRequest {Object} Request object.
          + * @param oRawResponse {Object} The raw response from the live database.
          + * @return {Object} Parsed response object.
          + */
          +YAHOO.util.DataSource.prototype.parseArrayData = function(oRequest, oRawResponse) {
          +    if(YAHOO.lang.isArray(oRawResponse) && YAHOO.lang.isArray(this.responseSchema.fields)) {
          +        var oParsedResponse = {results:[]};
          +        var fields = this.responseSchema.fields;
          +        for(var i=oRawResponse.length-1; i>-1; i--) {
          +            var oResult = {};
          +            for(var j=fields.length-1; j>-1; j--) {
          +                var field = fields[j];
          +                var key = field.key || field;
          +                var data = oRawResponse[i][j] || oRawResponse[i][key];
          +                if(field.converter) {
          +                    data = field.converter(data);
          +                }
          +                oResult[key] = data;
          +            }
          +            oParsedResponse.results.unshift(oResult);
          +        }
          +        YAHOO.log("Parsed array data = " + oParsedResponse,"info",this.toString());
          +        return oParsedResponse;
          +    }
          +    else {
          +        YAHOO.log("Array data could not be parsed" + oRawResponse,"error",this.toString());
          +        return null;
          +    }
          +};
          +
          +/**
          + * Overridable method parses raw plain text data into a response object.
          + *
          + * @method parseTextData
          + * @param oRequest {Object} Request object
          + * @param oRawResponse {Object} The raw response from the live database
          + * @return {Object} Parsed response object
          + */
          +YAHOO.util.DataSource.prototype.parseTextData = function(oRequest, oRawResponse) {
          +    var oParsedResponse = {};
          +    if(YAHOO.lang.isString(oRawResponse) &&
          +            YAHOO.lang.isArray(this.responseSchema.fields) &&
          +            YAHOO.lang.isString(this.responseSchema.recordDelim) &&
          +            YAHOO.lang.isString(this.responseSchema.fieldDelim)) {
          +        oParsedResponse.results = [];
          +        var recDelim = this.responseSchema.recordDelim;
          +        var fieldDelim = this.responseSchema.fieldDelim;
          +        var fields = this.responseSchema.fields;
          +        if(oRawResponse.length > 0) {
          +            // Delete the last line delimiter at the end of the data if it exists
          +            var newLength = oRawResponse.length-recDelim.length;
          +            if(oRawResponse.substr(newLength) == recDelim) {
          +                oRawResponse = oRawResponse.substr(0, newLength);
          +            }
          +            // Split along record delimiter to get an array of strings
          +            var recordsarray = oRawResponse.split(recDelim);
          +            // Cycle through each record, except the first which contains header info
          +            for(var i = recordsarray.length-1; i>-1; i--) {
          +                var oResult = {};
          +                for(var j=fields.length-1; j>-1; j--) {
          +                    // Split along field delimter to get each data value
          +                    var fielddataarray = recordsarray[i].split(fieldDelim);
          +
          +                    // Remove quotation marks from edges, if applicable
          +                    var data = fielddataarray[j];
          +                    if(data.charAt(0) == "\"") {
          +                        data = data.substr(1);
          +                    }
          +                    if(data.charAt(data.length-1) == "\"") {
          +                        data = data.substr(0,data.length-1);
          +                    }
          +                    var field = fields[j];
          +                    var key = field.key || field;
          +                    if(field.converter) {
          +                        data = field.converter(data);
          +                    }
          +                    oResult[key] = data;
          +                }
          +                oParsedResponse.results.unshift(oResult);
          +            }
          +        }
          +        YAHOO.log("Parsed text data = " + oParsedResponse,"info",this.toString());
          +    }
          +    else {
          +        YAHOO.log("Text data could not be parsed" + oRawResponse,"error",this.toString());
          +        oParsedResponse.error = true;
          +    }
          +    return oParsedResponse;
          +};
          +
          +/**
          + * Overridable method parses raw XML data into a response object.
          + *
          + * @method parseXMLData
          + * @param oRequest {Object} Request object
          + * @param oRawResponse {Object} The raw response from the live database
          + * @return {Object} Parsed response object
          + */
          +YAHOO.util.DataSource.prototype.parseXMLData = function(oRequest, oRawResponse) {
          +        var bError = false;
          +        var oParsedResponse = {};
          +        var xmlList = (this.responseSchema.resultNode) ?
          +                oRawResponse.getElementsByTagName(this.responseSchema.resultNode) :
          +                null;
          +        if(!xmlList || !YAHOO.lang.isArray(this.responseSchema.fields)) {
          +            bError = true;
          +        }
          +        // Loop through each result
          +        else {
          +            oParsedResponse.results = [];
          +            for(var k = xmlList.length-1; k >= 0 ; k--) {
          +                var result = xmlList.item(k);
          +                var oResult = {};
          +                // Loop through each data field in each result using the schema
          +                for(var m = this.responseSchema.fields.length-1; m >= 0 ; m--) {
          +                    var field = this.responseSchema.fields[m];
          +                    var key = field.key || field;
          +                    var data = null;
          +                    // Values may be held in an attribute...
          +                    var xmlAttr = result.attributes.getNamedItem(key);
          +                    if(xmlAttr) {
          +                        data = xmlAttr.value;
          +                    }
          +                    // ...or in a node
          +                    else {
          +                        var xmlNode = result.getElementsByTagName(key);
          +                        if(xmlNode && xmlNode.item(0) && xmlNode.item(0).firstChild) {
          +                            data = xmlNode.item(0).firstChild.nodeValue;
          +                        }
          +                        else {
          +                               data = "";
          +                        }
          +                    }
          +                    if(field.converter) {
          +                        data = field.converter(data);
          +                    }
          +                    // Capture the schema-mapped data field values into an array
          +                    oResult[key] = data;
          +                }
          +                // Capture each array of values into an array of results
          +                oParsedResponse.results.unshift(oResult);
          +            }
          +        }
          +        if(bError) {
          +            YAHOO.log("JSON data could not be parsed" + oRawResponse,"error",this.toString());
          +            oParsedResponse.error = true;
          +        }
          +        else {
          +            YAHOO.log("Parsed XML data = " + oParsedResponse,"info",this.toString());
          +        }
          +        return oParsedResponse;
          +};
          +
          +/**
          + * Overridable method parses raw JSON data into a response object.
          + *
          + * @method parseJSONData
          + * @param oRequest {Object} Request object
          + * @param oRawResponse {Object} The raw response from the live database
          + * @return {Object} Parsed response object
          + */
          +YAHOO.util.DataSource.prototype.parseJSONData = function(oRequest, oRawResponse) {
          +    var oParsedResponse = {};
          +    if(oRawResponse && YAHOO.lang.isArray(this.responseSchema.fields)) {
          +        var fields = this.responseSchema.fields;
          +        var bError = false;
          +        oParsedResponse.results = [];
          +        var jsonObj,jsonList;
          +
          +        // Parse JSON object out if it's a string
          +        if(YAHOO.lang.isString(oRawResponse)) {
          +            // Check for latest JSON lib but divert KHTML clients
          +            var isNotMac = (navigator.userAgent.toLowerCase().indexOf('khtml')== -1);
          +            if(oRawResponse.parseJSON && isNotMac) {
          +                // Use the new JSON utility if available
          +                jsonObj = oRawResponse.parseJSON();
          +                if(!jsonObj) {
          +                    bError = true;
          +                }
          +            }
          +            // Check for older JSON lib but divert KHTML clients
          +            else if(window.JSON && JSON.parse && isNotMac) {
          +                // Use the JSON utility if available
          +                jsonObj = JSON.parse(oRawResponse);
          +                if(!jsonObj) {
          +                    bError = true;
          +                }
          +            }
          +            // No JSON lib found so parse the string
          +            else {
          +                try {
          +                    // Trim leading spaces
          +                    while (oRawResponse.length > 0 &&
          +                            (oRawResponse.charAt(0) != "{") &&
          +                            (oRawResponse.charAt(0) != "[")) {
          +                        oRawResponse = oRawResponse.substring(1, oResponse.length);
          +                    }
          +
          +                    if(oRawResponse.length > 0) {
          +                        // Strip extraneous stuff at the end
          +                        var objEnd = Math.max(oRawResponse.lastIndexOf("]"),oRawResponse.lastIndexOf("}"));
          +                        oRawResponse = oRawResponse.substring(0,objEnd+1);
          +
          +                        // Turn the string into an object literal...
          +                        // ...eval is necessary here
          +                        jsonObj = eval("(" + oRawResponse + ")");
          +                        if(!jsonObj) {
          +                            bError = true;
          +                        }
          +
          +                    }
          +                }
          +                catch(e) {
          +                    bError = true;
          +               }
          +            }
          +        }
          +        // Response must already be a JSON object
          +        else if(oRawResponse.constructor == Object) {
          +            jsonObj = oRawResponse;
          +        }
          +        // Not a string or an object
          +        else {
          +            bError = true;
          +        }
          +        // Now that we have a JSON object, parse a jsonList out of it
          +        if(jsonObj && jsonObj.constructor == Object) {
          +            try {
          +                // eval is necessary here since schema can be of unknown depth
          +                jsonList = eval("jsonObj." + this.responseSchema.resultsList);
          +            }
          +            catch(e) {
          +                bError = true;
          +            }
          +        }
          +
          +        if(bError || !jsonList) {
          +            YAHOO.log("JSON data could not be parsed" + oRawResponse,"error",this.toString());
          +            oParsedResponse.error = true;
          +        }
          +        else if(!YAHOO.lang.isArray(jsonList)) {
          +            jsonList = [jsonList];
          +        }
          +
          +        // Loop through the array of all responses...
          +        for(var i = jsonList.length-1; i >= 0 ; i--) {
          +            var oResult = {};
          +            var jsonResult = jsonList[i];
          +            // ...and loop through each data field value of each response
          +            for(var j = fields.length-1; j >= 0 ; j--) {
          +                var field = fields[j];
          +                var key = field.key || field;
          +                // ...and capture data into an array mapped according to the schema...
          +                // eval is necessary here since schema can be of unknown depth
          +                var data = eval("jsonResult." + key);
          +                if((typeof data == "undefined") || (data === null)) {
          +                    data = "";
          +                }
          +                //YAHOO.log("data: " + i + " value:" +j+" = "+dataFieldValue,"debug",this.toString());
          +                if(field.converter) {
          +                    data = field.converter(data);
          +                }
          +                oResult[key] = data;
          +            }
          +            // Capture the array of data field values in an array of results
          +            oParsedResponse.results.unshift(oResult);
          +        }
          +        YAHOO.log("Parsed JSON data = " + oParsedResponse,"info",this.toString());
          +    }
          +    else {
          +        YAHOO.log("JSON data could not be parsed" + oRawResponse,"error",this.toString());
          +        oParsedResponse.error = true;
          +    }
          +    return oParsedResponse;
          +};
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/DataTable.html b/www/extras/yui/docs/DataTable.html new file mode 100644 index 000000000..d21a1d57e --- /dev/null +++ b/www/extras/yui/docs/DataTable.html @@ -0,0 +1,7904 @@ + + + + API: datatable DataTable (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          DataTable Widget  2.2.2

          +

          + Yahoo! UI Library + > datatable + > DataTable + +

          +
          + +
          +
          +
          + + +

          + + + + + Class DataTable + + + + + - uses + + YAHOO.util.EventProvider + + + + +

          + + + + + +
          + DataTable class for the YUI DataTable widget. +
          + +
          +

          Constructor

          +
          +
          + DataTable + + ( + + + + elContainer + + , + oColumnSet + + , + oDataSource + + , + oConfigs + ) + +
          +
          +
          Parameters:
          +
          + elContainer + <HTMLElement> + + Container element for the TABLE. +
          +
          + oColumnSet + <YAHOO.widget.ColumnSet> + + ColumnSet instance. +
          +
          + oDataSource + <YAHOO.util.DataSource> + + DataSource instance. +
          +
          + oConfigs + <object> + + (optional) Object literal of configuration values. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _aSelectedRecords + - private YAHOO.widget.Record[] +

          +
          +
          + Array of Records that are in the selected state. +
          +
          + + + + +
          +

          _bFocused + - private Boolean +

          +
          +
          + Internal variable to track whether widget has focus. +
          +
          + + + + +
          +

          _elBody + - private HTMLElement +

          +
          +
          + TBODY element reference. +
          +
          + + + + +
          +

          _elContainer + - private HTMLElement +

          +
          +
          + Container element reference. Is null unless the TABLE is built from scratch into the +provided container. +
          +
          + + + + +
          +

          _elFirstRow + - private HTMLElement +

          +
          +
          + First TR element reference pointer. +
          +
          + + + + +
          +

          _elLastRow + - private HTMLElement +

          +
          +
          + Last TR element reference pointer. +
          +
          + + + + +
          +

          _elTable + - private HTMLElement +

          +
          +
          + TABLE element reference. +
          +
          + + + + +
          +

          _nCount + - private static Number +

          +
          +
          + Internal class variable to index multiple DataTable instances. +
          +
          + + + + +
          +

          _nIndex + - private Number +

          +
          +
          + Instance index. +
          +
          + + + + +
          +

          _oColumnSet + - private YAHOO.widget.ColumnSet +

          +
          +
          + ColumnSet instance. +
          +
          + + + + +
          +

          _oRecordSet + - private YAHOO.widget.RecordSet +

          +
          +
          + RecordSet instance. +
          +
          + + + + +
          +

          _paginator + - private Object[] +

          +
          +
          + Internal object literal to track built-in paginator values. +
          +
          + + + + +
          +

          _paginator.containers + - private HTMLElement +

          +
          +
          + Array of pagination container elements. +
          +
          + + + + +
          +

          _paginator.currentPage + - private Number +

          +
          +
          + Tracks current page. +
          +
          + + + + +
          +

          _paginator.dropdownOptions + - private Number[] | Object[] +

          +
          +
          + Internal variable to track paginator dropdown options. +
          +
          + + + + +
          +

          _paginator.dropdowns + - private HTMLElement +

          +
          +
          + Array of pagination SELECT elements. +
          +
          + + + + +
          +

          _paginator.links + - private HTMLElement +

          +
          +
          + Array of pagination link container elements. +
          +
          + + + + +
          +

          _paginator.pageLinks + - private Number +

          +
          +
          + Internal variable to track paginator page links. +
          +
          + + + + +
          +

          _paginator.rowsPerPage + - private Number +

          +
          +
          + Tracks rows per page. +
          +
          + + + + +
          +

          _paginator.totalPages + - private Number +

          +
          +
          + Tracks total number of pages, calculated on the fly. +
          +
          + + + + +
          +

          _selectRowAnchorId + - private String +

          +
          +
          + Id of anchor row for multiple selections. +
          +
          + + + + +
          +

          _sName + - private String +

          +
          +
          + Unique instance name. +
          +
          + + + + +
          +

          caption + - String +

          +
          +
          + Defines value of CAPTION attribute. +
          +
          + + + + +
          +

          CLASS_BODY + - static final String +

          +
          +
          + Class name assigned to TBODY element that holds data rows. +
          +
          + + +
          + Default Value: "yui-dt-body" +
          + + +
          +

          CLASS_CHECKBOX + - static final String +

          +
          +
          + Class name assigned to TD elements of type "checkbox". +
          +
          + + +
          + Default Value: "yui-dt-checkbox" +
          + + +
          +

          CLASS_CURRENCY + - static final String +

          +
          +
          + Class name assigned to TD elements of type "currency". +
          +
          + + +
          + Default Value: "yui-dt-currency" +
          + + +
          +

          CLASS_CURRENTPAGE + - static final String +

          +
          +
          + Class name assigned to pagination links for specific page numbers that are disabled. +
          +
          + + +
          + Default Value: "yui-dt-currentpage" +
          + + +
          +

          CLASS_DATE + - static final String +

          +
          +
          + Class name assigned to TD elements of type "date". +
          +
          + + +
          + Default Value: "yui-dt-date" +
          + + +
          +

          CLASS_EDITABLE + - static final String +

          +
          +
          + Class name assigned to editable TD elements. +
          +
          + + +
          + Default Value: "yui-dt-editable" +
          + + +
          +

          CLASS_EDITOR + - static final String +

          +
          +
          + Class name assigned to editor DIV elements. +
          +
          + + +
          + Default Value: "yui-dt-editor" +
          + + +
          +

          CLASS_EMAIL + - static final String +

          +
          +
          + Class name assigned to TD elements of type "email". +
          +
          + + +
          + Default Value: "yui-dt-email" +
          + + +
          +

          CLASS_EMPTY + - static final String +

          +
          +
          + Class name assigned to empty elements. +
          +
          + + +
          + Default Value: "yui-dt-empty" +
          + + +
          +

          CLASS_ERROR + - static final String +

          +
          +
          + Class name assigned to elements with error messaging. +
          +
          + + +
          + Default Value: "yui-dt-error" +
          + + +
          +

          CLASS_EVEN + - static final String +

          +
          +
          + Class name assigned to even TR elements. +
          +
          + + +
          + Default Value: "yui-dt-even" +
          + + +
          +

          CLASS_FIRST + - static final String +

          +
          +
          + Class name assigned to FIRST elements. +
          +
          + + +
          + Default Value: "yui-dt-first" +
          + + +
          +

          CLASS_FIRSTLINK + - static final String +

          +
          +
          + Class name assigned to the pagination link "<<". +
          +
          + + +
          + Default Value: "yui-dt-firstlink" +
          + + +
          +

          CLASS_FIRSTPAGE + - static final String +

          +
          +
          + Class name assigned to the pagination link "<<" when it is disabled. +
          +
          + + +
          + Default Value: "yui-dt-firstpage" +
          + + +
          +

          CLASS_HEADCONTAINER + - static final String +

          +
          +
          + Class name assigned to container element within THEAD. +
          +
          + + + + +
          +

          CLASS_HEADRESIZER + - static final String +

          +
          +
          + Class name assigned to resizer handle element within THEAD. +
          +
          + + +
          + Default Value: "yui-dt-headresizer" +
          + + +
          +

          CLASS_HEADTEXT + - static final String +

          +
          +
          + Class name assigned to text displayed within THEAD. +
          +
          + + +
          + Default Value: "yui-dt-headtext" +
          + + +
          +

          CLASS_HIGHLIGHT + - static final String +

          +
          +
          + Class name assigned to highlighted element. +
          +
          + + +
          + Default Value: "yui-dt-highlight" +
          + + +
          +

          CLASS_LAST + - static final String +

          +
          +
          + Class name assigned to LAST elements. +
          +
          + + +
          + Default Value: "yui-dt-last" +
          + + +
          +

          CLASS_LASTLINK + - static final String +

          +
          +
          + Class name assigned to the pagination link ">>". +
          +
          + + +
          + Default Value: "yui-dt-lastlink" +
          + + +
          +

          CLASS_LASTPAGE + - static final String +

          +
          +
          + Class name assigned to the pagination link ">>" when it is disabled. +
          +
          + + +
          + Default Value: "yui-dt-lastpage" +
          + + +
          +

          CLASS_LINK + - static final String +

          +
          +
          + Class name assigned to TD elements of type "link". +
          +
          + + +
          + Default Value: "yui-dt-link" +
          + + +
          +

          CLASS_LOADING + - static final String +

          +
          +
          + Class name assigned to loading message. +
          +
          + + +
          + Default Value: "yui-dt-loading" +
          + + +
          +

          CLASS_NEXTLINK + - static final String +

          +
          +
          + Class name assigned to the pagination link ">". +
          +
          + + +
          + Default Value: "yui-dt-nextlink" +
          + + +
          +

          CLASS_NEXTPAGE + - static final String +

          +
          +
          + Class name assigned to the pagination link ">" when it is disabled. +
          +
          + + +
          + Default Value: "yui-dt-nextpage" +
          + + +
          +

          CLASS_NUMBER + - static final String +

          +
          +
          + Class name assigned to TD elements of type "number". +
          +
          + + +
          + Default Value: "yui-dt-number" +
          + + +
          +

          CLASS_ODD + - static final String +

          +
          +
          + Class name assigned to odd TR elements. +
          +
          + + +
          + Default Value: "yui-dt-odd" +
          + + +
          +

          CLASS_PAGELINK + - static final String +

          +
          +
          + Class name assigned to pagination links to specific page numbers. +
          +
          + + +
          + Default Value: "yui-dt-pagelink" +
          + + +
          +

          CLASS_PAGELINKS + - static final String +

          +
          +
          + Class name assigned to the pagination links container element. +
          +
          + + +
          + Default Value: "yui-dt-pagelinks" +
          + + +
          +

          CLASS_PAGESELECT + - static final String +

          +
          +
          + Class name assigned to the pagination SELECT element. +
          +
          + + +
          + Default Value: "yui-dt-pageselect" +
          + + +
          +

          CLASS_PAGINATOR + - static final String +

          +
          +
          + Class name assigned to the paginator container element. +
          +
          + + +
          + Default Value: "yui-dt-paginator" +
          + + +
          +

          CLASS_PREVLINK + - static final String +

          +
          +
          + Class name assigned to the pagination link "<". +
          +
          + + +
          + Default Value: "yui-dt-prevlink" +
          + + +
          +

          CLASS_PREVPAGE + - static final String +

          +
          +
          + Class name assigned to the pagination link "<" when it is disabled. +
          +
          + + +
          + Default Value: "yui-dt-prevpage" +
          + + +
          +

          CLASS_SCROLLABLE + - static final String +

          +
          +
          + Class name assigned to container of a scrollable DataTable. +
          +
          + + +
          + Default Value: "yui-dt-scrollable" +
          + + +
          +

          CLASS_SCROLLBODY + - static final String +

          +
          +
          + Class name assigned to scrolling TBODY element of a scrollable DataTable. +
          +
          + + +
          + Default Value: "yui-dt-scrollbody" +
          + + +
          +

          CLASS_SELECTED + - static final String +

          +
          +
          + Class name assigned to selected elements. +
          +
          + + +
          + Default Value: "yui-dt-selected" +
          + + +
          +

          CLASS_SORTABLE + - static final String +

          +
          +
          + Class name assigned to column headers of sortable Columns. +
          +
          + + +
          + Default Value: "yui-dt-sortable" +
          + + +
          +

          CLASS_SORTEDBYASC + - static final String +

          +
          +
          + Class name assigned to column headers when sorted in ascending order. +
          +
          + + +
          + Default Value: "yui-dt-sortedbyasc" +
          + + +
          +

          CLASS_SORTEDBYDESC + - static final String +

          +
          +
          + Class name assigned to column headers when sorted in descending order. +
          +
          + + +
          + Default Value: "yui-dt-sortedbydesc" +
          + + +
          +

          CLASS_STRING + - static final String +

          +
          +
          + Class name assigned to TD elements of type "string". +
          +
          + + +
          + Default Value: "yui-dt-string" +
          + + +
          +

          CLASS_TABLE + - static final String +

          +
          +
          + Class name assigned to TABLE element. +
          +
          + + +
          + Default Value: "yui-dt" +
          + + +
          +

          contextMenu + - YAHOO.widget.ContextMenu +

          +
          +
          + ContextMenu instance. +
          +
          + + + + +
          +

          dataSource + - YAHOO.util.DataSource +

          +
          +
          + DataSource instance. +
          +
          + + + + +
          +

          fixedWidth + - Boolean +

          +
          +
          + True if DataTable's width is a fixed size. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          initialRequest + - String +

          +
          +
          + Initial request to send to DataSource. +
          +
          + + +
          + Default Value: "" +
          + + +
          +

          isEmpty + - object +

          +
          +
          + +
          +
          + + + +
          + Deprecated: No longer used. +
          + +
          +

          isLoading + - object +

          +
          +
          + +
          +
          + + + +
          + Deprecated: No longer used. +
          + +
          +

          MSG_EMPTY + - static final String +

          +
          +
          + Message to display if DataTable has no data. +
          +
          + + +
          + Default Value: "No records found." +
          + + +
          +

          MSG_ERROR + - static final String +

          +
          +
          + Message to display while DataTable has data error. +
          +
          + + +
          + Default Value: "Data error." +
          + + +
          +

          MSG_LOADING + - static final String +

          +
          +
          + Message to display while DataTable is loading data. +
          +
          + + +
          + Default Value: "Loading data..." +
          + + +
          +

          pageCurrent + - object +

          +
          +
          + +
          +
          + + + +
          + Deprecated: Deprecated. Please use paginatorOptions.currentPage +
          + +
          +

          pageLinksLength + - object +

          +
          +
          + +
          +
          + + + +
          + Deprecated: Deprecated. Please use paginatorOptions.pageLinks +
          + +
          +

          pageLinksStart + - object +

          +
          +
          + +
          +
          + + + +
          + Deprecated: Deprecated. Please use paginatorOptions.pageLinksStart. +
          + +
          +

          pagers + - object +

          +
          +
          + +
          +
          + + + +
          + Deprecated: Deprecated. Please use paginatorOptions.containers +
          + +
          +

          paginator + - Boolean +

          +
          +
          + True if built-in paginator is enabled. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          paginatorOptions + - Object +

          +
          +
          + Object literal of initial paginator key:value properties. +
          +
          + + +
          + Default Value: {} +
          + + +
          +

          paginatorOptions.containers + - HTMLElement[] +

          +
          +
          + Array of container elements to hold paginator UI, if enabled. If null, +2 containers will be created dynamically, one before and one after the +TABLE element. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          paginatorOptions.currentPage + - Number +

          +
          +
          + If built-in paginator is enabled, current page to display. +
          +
          + + +
          + Default Value: 1 +
          + + +
          +

          paginatorOptions.dropdownOptions + - Number[] | Object{} +

          +
          +
          + Values to show in the SELECT dropdown. Can be an array of numbers to populate +each OPTION's value and text with the same value, or an array of object +literals of syntax {value:myValue, text:myText} will populate OPTION with +corresponding value and text. A null value or empty array prevents the +dropdown from displayed altogether. +
          +
          + + + + +
          +

          paginatorOptions.pageLinks + - Number +

          +
          +
          + Maximum number of links to page numbers to show in paginator UI. Any pages +not linked would be available through the next/previous style links. A 0 +value displays all page links. A negative value disables all page links. +
          +
          + + +
          + Default Value: 0 +
          + + +
          +

          paginatorOptions.rowsPerPage + - Number +

          +
          +
          + If built-in paginator is enabled, each page will display up to the given +number of rows per page. A value less than 1 will display all available +rows. +
          +
          + + +
          + Default Value: 500 +
          + + +
          +

          rowSingleSelect + - Boolean +

          +
          +
          + True if only one row may be selected at a time. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          rowsPerPage + - object +

          +
          +
          + +
          +
          + + + +
          + Deprecated: Deprecated. Please use paginatorOptions.rowsPerPage +
          + +
          +

          rowsPerPageDropdown + - object +

          +
          +
          + +
          +
          + + + +
          + Deprecated: Deprecated. Please use paginatorOptions.dropdownOptions +
          + +
          +

          scrollable + - Boolean +

          +
          +
          + True if TBODY should scroll while THEAD remains fixed. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          sortedBy + - Object +

          +
          +
          + Object literal holds sort metadata: +sortedBy.colKey +sortedBy.dir +
          +
          + + + + +
          +

          startRecordIndex + - object +

          +
          +
          + +
          +
          + + + +
          + Deprecated: Deprecated. Please use paginatorOptions.startRecordIndex. +
          + +
          +

          summary + - String +

          +
          +
          + Defines value of SUMMARY attribute. +
          +
          + + + + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Methods

          +
          +

          + _addRecords

          +
          + + private + + + String + _addRecords + ( + + + oData + + + , + index + + + ) + + +
          + Creates a new Record to add to RecordSet at position i if given, or to the +end otherwise. +
          + +
          + +
          +
          Parameters:
          +
          + oData <YAHOO.widget.Record> + Array of object literals containing data. +
          +
          + index <Number> + Index position at which to add Record. +
          +
          + +
          +
          Returns: + + String +
          +
          Array of Records.
          +
          + +
          + +
          +
          +

          + _addRowEl

          +
          + + private + + + String + _addRowEl + ( + + + oRecord + + + , + index + + + ) + + +
          + Add a new TR element to table body at position i if given, or to the bottom +otherwise. Populates cells with data from given Record. +
          + +
          + +
          +
          Parameters:
          +
          + oRecord <YAHOO.widget.Record> + Record instance. +
          +
          + index <Number> + Index position at which to add TR. +
          +
          + +
          +
          Returns: + + String +
          +
          ID of the added TR element.
          +
          + +
          + +
          +
          +

          + _deleteRecord

          +
          + + private + + + void + _deleteRecord + ( + + + identifier + + + ) + + +
          + Deletes a given Record from the RecordSet. +
          + +
          + +
          +
          Parameters:
          +
          + identifier <Number | String> + Record identifier. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _deleteRowEl

          +
          + + private + + + void + _deleteRowEl + ( + + + row + + + ) + + +
          + Deletes a given TR element. +
          + +
          + +
          +
          Parameters:
          +
          + row <HTMLElement | Number> + HTML TR element reference or position index. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _initHead

          +
          + + private + + + void + _initHead + ( + ) + + +
          + Populates THEAD element with TH cells as defined by ColumnSet. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _initHeadCell

          +
          + + private + + + void + _initHeadCell + ( + + + elHeadCell + + + , + oColumn + + + , + row + + + , + col + + + ) + + +
          + Populates TH cell as defined by Column. +
          + +
          + +
          +
          Parameters:
          +
          + elHeadCell <HTMLElement> + TH cell element reference. +
          +
          + oColumn <YAHOO.widget.Column> + Column object. +
          +
          + row <number> + Row index. +
          +
          + col <number> + Column index. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _initPaginator

          +
          + + private + + + void + _initPaginator + ( + ) + + +
          + If pagination is enabled, initializes paginator container elements and sets +internal tracking variables. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _initTable

          +
          + + private + + + void + _initTable + ( + ) + + +
          + Creates HTML markup for TABLE, THEAD, TBODY. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onBlur

          +
          + + private + + + void + _onBlur + ( + + + e + + + , + oSelf + + + ) + + +
          + Handles blur events on the TABLE element. +
          + +
          + +
          +
          Parameters:
          +
          + e <HTMLEvent> + The blur event. +
          +
          + oSelf <YAHOO.widget.DataTable> + DataTable instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onClick

          +
          + + private + + + void + _onClick + ( + + + e + + + , + oSelf + + + ) + + +
          + Handles click events on the TABLE element. +
          + +
          + +
          +
          Parameters:
          +
          + e <HTMLEvent> + The click event. +
          +
          + oSelf <YAHOO.widget.DataTable> + DataTable instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onDocumentClick

          +
          + + private + + + void + _onDocumentClick + ( + + + e + + + , + oSelf + + + ) + + +
          + Handles click events on the DOCUMENT. Hides active editor. +
          + +
          + +
          +
          Parameters:
          +
          + e <HTMLEvent> + The click event. +
          +
          + oSelf <YAHOO.widget.DataTable> + DataTable instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onDocumentKeydown

          +
          + + private + + + void + _onDocumentKeydown + ( + + + e + + + , + oSelf + + + ) + + +
          + Handles keydown events on the DOCUMENT. Executes interaction with editor. +
          + +
          + +
          +
          Parameters:
          +
          + e <HTMLEvent> + The key event. +
          +
          + oSelf <YAHOO.widget.DataTable> + DataTable instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onDoubleclick

          +
          + + private + + + void + _onDoubleclick + ( + + + e + + + , + oSelf + + + ) + + +
          + Handles doubleclick events on the TABLE element. +
          + +
          + +
          +
          Parameters:
          +
          + e <HTMLEvent> + The doubleclick event. +
          +
          + oSelf <YAHOO.widget.DataTable> + DataTable instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onKeydown

          +
          + + private + + + void + _onKeydown + ( + + + e + + + , + oSelf + + + ) + + +
          + Handles keydown events on the TABLE. Executes arrow selection. +
          + +
          + +
          +
          Parameters:
          +
          + e <HTMLEvent> + The key event. +
          +
          + oSelf <YAHOO.widget.DataTable> + DataTable instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onKeypress

          +
          + + private + + + void + _onKeypress + ( + + + e + + + , + oSelf + + + ) + + +
          + Handles keypress events on the TABLE. Mainly to support stopEvent on Mac. +
          + +
          + +
          +
          Parameters:
          +
          + e <HTMLEvent> + The key event. +
          +
          + oSelf <YAHOO.widget.DataTable> + DataTable instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onKeyup

          +
          + + private + + + void + _onKeyup + ( + + + e + + + , + oSelf + + + ) + + +
          + Handles keyup events on the TABLE. Executes deletion +
          + +
          + +
          +
          Parameters:
          +
          + e <HTMLEvent> + The key event. +
          +
          + oSelf <YAHOO.widget.DataTable> + DataTable instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMousedown

          +
          + + private + + + void + _onMousedown + ( + + + e + + + , + oSelf + + + ) + + +
          + Handles mousedown events on the TABLE element. +
          + +
          + +
          +
          Parameters:
          +
          + e <HTMLEvent> + The mousedown event. +
          +
          + oSelf <YAHOO.widget.DataTable> + DataTable instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMouseout

          +
          + + private + + + void + _onMouseout + ( + + + e + + + , + oSelf + + + ) + + +
          + Handles mouseout events on the TABLE element. +
          + +
          + +
          +
          Parameters:
          +
          + e <HTMLEvent> + The mouseout event. +
          +
          + oSelf <YAHOO.widget.DataTable> + DataTable instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMouseover

          +
          + + private + + + void + _onMouseover + ( + + + e + + + , + oSelf + + + ) + + +
          + Handles mouseover events on the TABLE element. +
          + +
          + +
          +
          Parameters:
          +
          + e <HTMLEvent> + The mouseover event. +
          +
          + oSelf <YAHOO.widget.DataTable> + DataTable instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onPagerClick

          +
          + + private + + + void + _onPagerClick + ( + + + e + + + , + oSelf + + + ) + + +
          + Handles click events on paginator links. +
          + +
          + +
          +
          Parameters:
          +
          + e <HTMLEvent> + The click event. +
          +
          + oSelf <YAHOO.widget.DataTable> + DataTable instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onPagerSelect

          +
          + + private + + + void + _onPagerSelect + ( + + + e + + + , + oSelf + + + ) + + +
          + Handles change events on paginator SELECT. +
          + +
          + +
          +
          Parameters:
          +
          + e <HTMLEvent> + The change event. +
          +
          + oSelf <YAHOO.widget.DataTable> + DataTable instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onRowDelete

          +
          + + private + + + void + _onRowDelete + ( + + + oArgs.rowIndexes + + + ) + + +
          + Handles row delete events. +
          + +
          + +
          +
          Parameters:
          +
          + oArgs.rowIndexes <Number[]> + The indexes of the deleted rows. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _select

          +
          + + private + + + void + _select + ( + + + els + + + ) + + +
          + Sets elements to selected state. Does not fire any events. Does not affect +internal tracker. +
          + +
          + +
          +
          Parameters:
          +
          + els <HTMLElement | String | HTMLElement[] | String[]> + HTML element by +reference or ID string, or array of HTML elements by reference or ID string. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _setFirstRow

          +
          + + private + + + void + _setFirstRow + ( + ) + + +
          + Sets first row with class YAHOO.widget.DataTable.CLASS_FIRST. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _setLastRow

          +
          + + private + + + void + _setLastRow + ( + ) + + +
          + Sets last row with class YAHOO.widget.DataTable.CLASS_LAST. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _setRowStripes

          +
          + + private + + + void + _setRowStripes + ( + + + range + + + ) + + +
          + Stripes rows by applying class YAHOO.widget.DataTable.CLASS_EVEN or +YAHOO.widget.DataTable.CLASS_ODD. +
          + +
          + +
          +
          Parameters:
          +
          + range <Number> + (optional) Range defines a subset of rows to stripe. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _unselect

          +
          + + private + + + void + _unselect + ( + + + els + + + ) + + +
          + Sets elements to the unselected state. Does not fire any events. Does not +affect internal tracker. +
          + +
          + +
          +
          Parameters:
          +
          + els <HTMLElement | String | HTMLElement[] | String[]> + HTMLElement by +reference or ID string, or array of HTML elements by reference or ID string. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _unselectAllCells

          +
          + + private + + + void + _unselectAllCells + ( + ) + + +
          + Unselects all selected cells. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _unselectAllRows

          +
          + + private + + + void + _unselectAllRows + ( + ) + + +
          + Unselects all selected rows. Does not fire any events. Does not affect internal +tracker. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _updateRowEl

          +
          + + private + + + String + _updateRowEl + ( + + + oRecord + + + , + index + + + ) + + +
          + Updates all cells of existing TR element at given position with data from the +given Record. +
          + +
          + +
          +
          Parameters:
          +
          + oRecord <YAHOO.widget.Record> + Record instance. +
          +
          + index <Number> + Position at which to update row. +
          +
          + +
          +
          Returns: + + String +
          +
          ID of the updated TR element.
          +
          + +
          + +
          +
          +

          + addRow

          +
          + + + + + void + addRow + ( + + + oRecord + + + , + index + + + ) + + +
          + Convenience method to add a new row to table body at position index if given, +or to the bottom otherwise. +
          + +
          + +
          +
          Parameters:
          +
          + oRecord <YAHOO.widget.Record> + Record instance. +
          +
          + index <Number> + (optional) Position at which to add row. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + appendRows

          +
          + + + + + void + appendRows + ( + + + aRecords + + + ) + + +
          + Add rows to bottom of table body. +
          + +
          + +
          +
          Parameters:
          +
          + aRecords <YAHOO.widget.Record[]> + Array of Records. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + cancelEditorData

          +
          + + + + + void + cancelEditorData + ( + ) + + +
          + Hides active editor, not saving any data. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + deleteRow

          +
          + + + + + void + deleteRow + ( + + + elRow + + + ) + + +
          + Deletes a given row element as well its corresponding Record in the RecordSet. +
          + +
          + +
          +
          Parameters:
          +
          + elRow <HTMLElement> + HTML table row element reference. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + deleteRows

          +
          + + + + + void + deleteRows + ( + + + elRows + + + ) + + +
          + Calls delete on given rows. +
          + +
          + +
          +
          Parameters:
          +
          + elRows <HTMLElement[]> + Array of HTML table row element reference. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + doBeforeLoadData

          +
          + + + + + Boolean + doBeforeLoadData + ( + + + sRequest + + + , + oResponse + + + ) + + +
          + Overridable method gives implementers a hook to access data before +it gets added to RecordSet and rendered to the TBODY. +
          + +
          + +
          +
          Parameters:
          +
          + sRequest <String> + Original request. +
          +
          + oResponse <Object> + Response object. +
          +
          + +
          +
          Returns: + + Boolean +
          +
          Return true to continue loading data into RecordSet and +updating DataTable with new Records, false to cancel.
          +
          + +
          + +
          +
          +

          + editCell

          +
          + + + + + void + editCell + ( + + + elCell + + + ) + + +
          + Shows editor for given cell. +
          + +
          + +
          +
          Parameters:
          +
          + elCell <HTMLElement> + Cell element to edit. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + focusTable

          +
          + + + + + void + focusTable + ( + ) + + +
          + Sets focus on the TABLE element. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + formatCell

          +
          + + + + + void + formatCell + ( + + + elCell + + + ) + + +
          + Formats given cell. +
          + +
          + +
          +
          Parameters:
          +
          + elCell <HTMLElement> + Cell element to format. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + formatPaginatorDropdown

          +
          + + + + + void + formatPaginatorDropdown + ( + + + oElReferences + + + ) + + +
          + Updates Paginator dropdown. If dropdown doesn't exist, the markup is created. +Sets dropdown's "selected" value. +
          + +
          + +
          +
          Parameters:
          +
          + oElReferences <Object> + Object literal of pointers to Paginator UI +elements. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + formatPaginatorLinks

          +
          + + + + + void + formatPaginatorLinks + ( + ) + + +
          + Updates Paginator links container with markup. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + formatPaginators

          +
          + + + + + void + formatPaginators + ( + ) + + +
          + Updates Paginator containers with markup. Override this method to customize pagination UI. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getBody

          +
          + + + + + HTMLElement + getBody + ( + ) + + +
          + Returns element reference to TBODY. +
          + +
          + + +
          +
          Returns: + + HTMLElement +
          +
          Reference to TBODY element.
          +
          + +
          + +
          +
          +

          + getCell

          +
          + + + + + HTMLElement + getCell + ( + + + rowIndex + + + , + colIndex + + + ) + + +
          + Returns element reference to TD element at given row and column positions. +
          + +
          + +
          +
          Parameters:
          +
          + rowIndex <Number> + Row index. +
          +
          + colIndex <Number> + Column index. +
          +
          + +
          +
          Returns: + + HTMLElement +
          +
          Reference to TD element.
          +
          + +
          + +
          +
          +

          + getColumnSet

          +
          + + + + + YAHOO.widget.ColumnSet + getColumnSet + ( + ) + + +
          + Returns pointer to the DataTable instance's ColumnSet instance. +
          + +
          + + +
          +
          Returns: + + YAHOO.widget.ColumnSet +
          +
          ColumnSet instance.
          +
          + +
          + +
          +
          +

          + getFirstRow

          +
          + + + + + HTMLElement + getFirstRow + ( + ) + + +
          + Returns element reference to first TR element. +
          + +
          + + +
          +
          Returns: + + HTMLElement +
          +
          Reference to first TR element.
          +
          + +
          + +
          +
          +

          + getHead

          +
          + + + + + HTMLElement + getHead + ( + ) + + +
          + Returns element reference to THEAD. +
          + +
          + + +
          +
          Returns: + + HTMLElement +
          +
          Reference to THEAD element.
          +
          + +
          + +
          +
          +

          + getLastRow

          +
          + + + + + HTMLElement + getLastRow + ( + ) + + +
          + Returns element reference to last TR element. +
          + +
          + + +
          +
          Returns: + + HTMLElement +
          +
          Reference to last TR element.
          +
          + +
          + +
          +
          +

          + getPaginator

          +
          + + + + + Object + getPaginator + ( + ) + + +
          + Returns paginator object literal. +
          + +
          + + +
          +
          Returns: + + Object +
          +
          Paginator object literal with following properties: +
            +
          • currentPage: current page number
          • +
          • dropdownOptions: array of numbers to show in dropdown
          • +
          • elements: array of object literals that define where to show +paginator UI with following properties: +
              +
            • container: element reference to paginator container
            • +
            • links: element reference to page links container
            • +
            • select: element reference to dropdown
            • +
            +
          • +
          • pageLinks: number of page links displayed
          • +
          • pageLinkStart: page number of first link
          • +
          • rowsPerPage: number of rows displayed
          • +
          • totalPages: total number of pages
          • +
          +
          + +
          + +
          +
          +

          + getRecordSet

          +
          + + + + + YAHOO.widget.RecordSet + getRecordSet + ( + ) + + +
          + Returns pointer to the DataTable instance's RecordSet instance. +
          + +
          + + +
          +
          Returns: + + YAHOO.widget.RecordSet +
          +
          RecordSet instance.
          +
          + +
          + +
          +
          +

          + getRow

          +
          + + + + + HTMLElement + getRow + ( + + + index + + + ) + + +
          + Returns element reference to TR element at given index. +
          + +
          + +
          +
          Parameters:
          +
          + index <Number> + Row number. +
          +
          + +
          +
          Returns: + + HTMLElement +
          +
          Reference to TR element.
          +
          + +
          + +
          +
          +

          + getSelectedCells

          +
          + + + + + HTMLElement[] + getSelectedCells + ( + ) + + +
          + Returns array of selected TD cells. +
          + +
          + + +
          +
          Returns: + + HTMLElement[] +
          +
          Array of selected TD elements.
          +
          + +
          + +
          +
          +

          + getSelectedRecordIds

          +
          + + + + + HTMLElement[] + getSelectedRecordIds + ( + ) + + +
          + Returns array of selected Record IDs. +
          + +
          + + +
          +
          Returns: + + HTMLElement[] +
          +
          Array of selected TR elements.
          +
          + +
          + +
          +
          +

          + getSelectedRows

          +
          + + + + + HTMLElement[] + getSelectedRows + ( + ) + + +
          + Returns array of selected rows. +
          + +
          + + +
          +
          Returns: + + HTMLElement[] +
          +
          Array of selected TR elements.
          +
          + +
          + +
          +
          +

          + getTable

          +
          + + + + + HTMLElement + getTable + ( + ) + + +
          + Returns element reference to TABLE. +
          + +
          + + +
          +
          Returns: + + HTMLElement +
          +
          Reference to TABLE element.
          +
          + +
          + +
          +
          +

          + hideTableMessage

          +
          + + + + + void + hideTableMessage + ( + ) + + +
          + Hide placeholder message. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + hideTableMessages

          +
          + + + + + void + hideTableMessages + ( + ) + + +
          + +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + Deprecated Deprecated. Please use hideTableMessage(). +
          +
          + +
          +
          +

          + highlight

          +
          + + + + + void + highlight + ( + + + els + + + ) + + +
          + Sets one or more elements to the highlighted state. +
          + +
          + +
          +
          Parameters:
          +
          + els <HTMLElement | String | HTMLElement[] | String[]> + HTML TR element +reference, TR String ID, array of HTML TR element, or array of TR element IDs. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + insertRows

          +
          + + + + + void + insertRows + ( + + + aRecords + + + ) + + +
          + Add rows to top of table body. +
          + +
          + +
          +
          Parameters:
          +
          + aRecords <YAHOO.widget.Record[]> + Array of Records. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + isSelected

          +
          + + + + + Boolean + isSelected + ( + + + el + + + ) + + +
          + Returns true if given element is select, false otherwise. +
          + +
          + +
          +
          Parameters:
          +
          + el <HTMLElement> + HTML element reference or ID. +
          +
          + +
          +
          Returns: + + Boolean +
          +
          True if element is selected.
          +
          + +
          + +
          +
          +

          + onDataReturnAppendRows

          +
          + + + + + void + onDataReturnAppendRows + ( + + + sRequest + + + , + oResponse + + + , + bError + + + ) + + +
          + Add new data to end of table. +
          + +
          + +
          +
          Parameters:
          +
          + sRequest <String> + Original request. +
          +
          + oResponse <Object> + Response object. +
          +
          + bError <Boolean> + (optional) True if there was a data error. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onDataReturnInsertRows

          +
          + + + + + void + onDataReturnInsertRows + ( + + + sRequest + + + , + oResponse + + + , + bError + + + ) + + +
          + Handles data return for inserting new rows to top of table. +
          + +
          + +
          +
          Parameters:
          +
          + sRequest <String> + Original request. +
          +
          + oResponse <Object> + Response object. +
          +
          + bError <Boolean> + (optional) True if there was a data error. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onDataReturnPaginateRows

          +
          + + + + + void + onDataReturnPaginateRows + ( + ) + + +
          + +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + Deprecated Deprecated. Please use onDataReturnPopulateTable(). +
          +
          + +
          +
          +

          + onDataReturnPopulateTable

          +
          + + + + + void + onDataReturnPopulateTable + ( + + + sRequest + + + , + oResponse + + + , + bError + + + ) + + +
          + Calls populateTable() with new data. +
          + +
          + +
          +
          Parameters:
          +
          + sRequest <String> + Original request. +
          +
          + oResponse <Object> + Response object. +
          +
          + bError <Boolean> + (optional) True if there was a data error. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onDataReturnReplaceRows

          +
          + + + + + void + onDataReturnReplaceRows + ( + + + sRequest + + + , + oResponse + + + , + bError + + + ) + + +
          + Handles data return for replacing all existing of table with new rows. +
          + +
          + +
          +
          Parameters:
          +
          + sRequest <String> + Original request. +
          +
          + oResponse <Object> + Response object. +
          +
          + bError <Boolean> + (optional) True if there was a data error. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onEventEditCell

          +
          + + + + + void + onEventEditCell + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + +
          + Overridable custom event handler to edit cell. +
          + +
          + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + Event object. +
          +
          + oArgs.target <HTMLElement> + Target element. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onEventFormatCell

          +
          + + + + + void + onEventFormatCell + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + +
          + Overridable custom event handler to format cell. +
          + +
          + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + Event object. +
          +
          + oArgs.target <HTMLElement> + Target element. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onEventHighlightCell

          +
          + + + + + void + onEventHighlightCell + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + +
          + Overridable custom event handler to highlight cell. +
          + +
          + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + Event object. +
          +
          + oArgs.target <HTMLElement> + Target element. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onEventSelectCell

          +
          + + + + + void + onEventSelectCell + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + +
          + Overridable custom event handler to select cell. +
          + +
          + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + Event object. +
          +
          + oArgs.target <HTMLElement> + Target element. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onEventSelectRow

          +
          + + + + + void + onEventSelectRow + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + +
          + Overridable custom event handler to select row according to desktop paradigm. +
          + +
          + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + Event object. +
          +
          + oArgs.target <HTMLElement> + Target element. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onEventSortColumn

          +
          + + + + + void + onEventSortColumn + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + +
          + Overridable custom event handler to sort column. +
          + +
          + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + Event object. +
          +
          + oArgs.target <HTMLElement> + Target element. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onEventUnhighlightCell

          +
          + + + + + void + onEventUnhighlightCell + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + +
          + Overridable custom event handler to unhighlight cell. +
          + +
          + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + Event object. +
          +
          + oArgs.target <HTMLElement> + Target element. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + populateTable

          +
          + + + + + void + populateTable + ( + + + oData + + + ) + + +
          + Replaces all Records in RecordSet and populates TBODY rows with the +new data. Blows away old data. If pagination is enabled, displays only +current page, otherwise displays all rows. +
          + +
          + +
          +
          Parameters:
          +
          + oData <Object | Object[]> + An object literal of data or an array of +object literals containing data. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + Deprecated Deprecated in favor of populateTable(). +
          +
          + +
          +
          +

          + refreshTable

          +
          + + + + + void + refreshTable + ( + ) + + +
          + Refreshes table view into existing RecordSet. For performance, reuses +existing rows while deleting extraneous rows. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + saveEditorData

          +
          + + + + + void + saveEditorData + ( + ) + + +
          + Saves data in active editor. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + select

          +
          + + + + + void + select + ( + + + els + + + ) + + +
          + Sets one or more elements to the selected state. +
          + +
          + +
          +
          Parameters:
          +
          + els <HTMLElement | String | HTMLElement[] | String[]> + HTML TR element +reference, TR String ID, array of HTML TR element, or array of TR element IDs. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + selectRow

          +
          + + + + + void + selectRow + ( + + + row + + + ) + + +
          + Sets a row to the selected state. +
          + +
          + +
          +
          Parameters:
          +
          + row <HTMLElement | String> + HTML TR element reference or ID. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + showEmptyMessage

          +
          + + + + + void + showEmptyMessage + ( + ) + + +
          + +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + Deprecated Deprecated. Please use showTableMessage(). +
          +
          + +
          +
          +

          + showLoadingMessage

          +
          + + + + + void + showLoadingMessage + ( + ) + + +
          + +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + Deprecated Deprecated. Please use showTableMessage(). +
          +
          + +
          +
          +

          + showPage

          +
          + + + + + void + showPage + ( + + + nPage + + + ) + + +
          + Displays a specific page of a paginated DataTable. +
          + +
          + +
          +
          Parameters:
          +
          + nPage <Number> + Which page. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + showTableMessage

          +
          + + + + + void + showTableMessage + ( + + + sHTML + + + , + sClassName + + + ) + + +
          + Displays placeholder row with a message when there are no data rows. +
          + +
          + +
          +
          Parameters:
          +
          + sHTML <String> + (optional) Value for innerHTML. +
          +
          + sClassName <String> + (optional) Classname. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + sortColumn

          +
          + + + + + void + sortColumn + ( + + + oColumn + + + ) + + +
          + Sort given column. +
          + +
          + +
          +
          Parameters:
          +
          + oColumn <YAHOO.widget.Column> + Column instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Public accessor to the unique name of the DataSource instance. +
          + +
          + + +
          +
          Returns: + + String +
          +
          Unique name of the DataSource instance.
          +
          + +
          + +
          +
          +

          + unhighlight

          +
          + + + + + void + unhighlight + ( + + + els + + + ) + + +
          + Sets one or more elements to the unhighlighted state. +
          + +
          + +
          +
          Parameters:
          +
          + els <HTMLElement | String | HTMLElement[] | String[]> + HTML TR element +reference, TR String ID, array of HTML TR element, or array of TR element IDs. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + unselect

          +
          + + + + + void + unselect + ( + + + els + + + ) + + +
          + Sets one or more elements to the unselected state. +
          + +
          + +
          +
          Parameters:
          +
          + els <HTMLElement | String | HTMLElement[] | String[]> + HTML element +reference, element ID, array of HTML elements, or array of element IDs +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + unselectAllCells

          +
          + + + + + void + unselectAllCells + ( + ) + + +
          + Unselects all selected cells. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + unselectAllRows

          +
          + + + + + void + unselectAllRows + ( + ) + + +
          + Unselects all selected rows (across all pages, if applicable). +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + unselectRow

          +
          + + + + + void + unselectRow + ( + + + row + + + ) + + +
          + Sets a row to the unselected state. +
          + +
          + +
          +
          Parameters:
          +
          + row <HTMLElement | String> + HTML TR element reference or ID. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + updatePaginator

          +
          + + + + + void + updatePaginator + ( + ) + + +
          + Updates Paginator internal values and UI. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + updateRow

          +
          + + + + + void + updateRow + ( + + + oRecord + + + , + index + + + ) + + +
          + Updates existing Record and row at position index with given data. +
          + +
          + +
          +
          Parameters:
          +
          + oRecord <YAHOO.widget.Record> + Record instance. +
          +
          + index <Number> + Position at which to update row. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + +
          +

          Methods inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Events

          +
          +

          + _onRecordUpdate

          +
          + + private + + + _onRecordUpdate + + ( + + + oArgs.record + + + , + oArgs.key + + + , + oArgs.newData + + + , + oArgs.oldData + + + ) + + + +
          + Passes along recordSetUpdate Event when recordUpdateEvent is caught from RecordSet. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.record <YAHOO.widget.Record> + The Record instance. +
          +
          + oArgs.key <String> + The Record key. +
          +
          + oArgs.newData <Object> + New data. +
          +
          + oArgs.oldData <Object> + New data. +
          +
          + + +
          + +
          +
          +

          + cellClickEvent

          +
          + + + + + cellClickEvent + + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + + +
          + Fired when a TD element is clicked. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + The event object. +
          +
          + oArgs.target <HTMLElement> + The TD element. +
          +
          + + +
          + +
          +
          +

          + cellDoubleclickEvent

          +
          + + + + + cellDoubleclickEvent + + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + + +
          + Fired when a TD element is doubleclicked. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + The event object. +
          +
          + oArgs.target <HTMLElement> + The TD element. +
          +
          + + +
          + +
          +
          +

          + cellEditEvent

          +
          + + + + + cellEditEvent + + ( + + + oArgs.target + + + , + oArgs.newData + + + , + oArgs.oldData + + + ) + + + +
          + Fired when a cell is edited. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.target <HTMLElement> + The TD element. +
          +
          + oArgs.newData <Object> + New data value. +
          +
          + oArgs.oldData <Object> + Old data value. +
          +
          + + +
          + +
          +
          +

          + cellFormatEvent

          +
          + + + + + cellFormatEvent + + ( + + + oArgs.el + + + ) + + + +
          + Fired when a TD element is formatted. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.el <HTMLElement> + Reference to the TD element. +
          +
          + + +
          + +
          +
          +

          + cellMousedownEvent

          +
          + + + + + cellMousedownEvent + + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + + +
          + Fired when a mousedown occurs on a TD element. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + The event object. +
          +
          + oArgs.target <HTMLElement> + The TD element. +
          +
          + + +
          + +
          +
          +

          + cellMouseoutEvent

          +
          + + + + + cellMouseoutEvent + + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + + +
          + Fired when a mouseout occurs on a TD element. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + The event object. +
          +
          + oArgs.target <HTMLElement> + The TD element. +
          +
          + + +
          + +
          +
          +

          + cellMouseoverEvent

          +
          + + + + + cellMouseoverEvent + + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + + +
          + Fired when a mouseover occurs on a TD element. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + The event object. +
          +
          + oArgs.target <HTMLElement> + The TD element. +
          +
          + + +
          + +
          +
          +

          + checkboxClickEvent

          +
          + + + + + checkboxClickEvent + + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + + +
          + Fired when a CHECKBOX element is clicked. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + The event object. +
          +
          + oArgs.target <HTMLElement> + The CHECKBOX element. +
          +
          + + +
          + +
          +
          +

          + columnResizeEvent

          +
          + + + + + columnResizeEvent + + ( + + + oArgs.target + + + ) + + + +
          + Fired when a column is resized. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.target <HTMLElement> + The TH element. +
          +
          + + +
          + +
          +
          +

          + columnSortEvent

          +
          + + + + + columnSortEvent + + ( + + + oArgs.column + + + , + oArgs.dir + + + ) + + + +
          + Fired when a column is sorted. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.column <YAHOO.widget.Column> + The Column instance. +
          +
          + oArgs.dir <String> + Sort direction "asc" or "desc". +
          +
          + + +
          + +
          +
          +

          + dataReturnEvent

          +
          + + + + + dataReturnEvent + + ( + + + oArgs.request + + + , + oArgs.response + + + ) + + + +
          + Fired when data is returned from DataSource. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.request <String> + Original request. +
          +
          + oArgs.response <Object> + Response object. +
          +
          + + +
          + +
          +
          +

          + editorShowEvent

          +
          + + + + + editorShowEvent + + ( + + + oArgs.target + + + , + oArgs.column + + + ) + + + +
          + Fired when an editor is activated. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.target <HTMLElement> + The TD element. +
          +
          + oArgs.column <YAHOO.widget.Column> + The Column instance. +
          +
          + + +
          + +
          +
          +

          + headCellClickEvent

          +
          + + + + + headCellClickEvent + + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + + +
          + Fired when a TH cell element is clicked. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + The event object. +
          +
          + oArgs.target <HTMLElement> + The TH element. +
          +
          + + +
          + +
          +
          +

          + headCellDoubleclickEvent

          +
          + + + + + headCellDoubleclickEvent + + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + + +
          + Fired when a TH cell element is doubleclicked. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + The event object. +
          +
          + oArgs.target <HTMLElement> + The TH element. +
          +
          + + +
          + +
          +
          +

          + headCellMousedownEvent

          +
          + + + + + headCellMousedownEvent + + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + + +
          + Fired when a TH cell element is mousedown. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + The event object. +
          +
          + oArgs.target <HTMLElement> + The TH element. +
          +
          + + +
          + +
          +
          +

          + headCellMouseoutEvent

          +
          + + + + + headCellMouseoutEvent + + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + + +
          + Fired when a TH cell element is mouseout. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + The event object. +
          +
          + oArgs.target <HTMLElement> + The TH element. +
          +
          + + +
          + +
          +
          +

          + headCellMouseoverEvent

          +
          + + + + + headCellMouseoverEvent + + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + + +
          + Fired when a TH cell element is mouseover. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + The event object. +
          +
          + oArgs.target <HTMLElement> + The TH element. +
          +
          + + +
          + +
          +
          +

          + highlightEvent

          +
          + + + + + highlightEvent + + ( + + + oArgs.els + + + ) + + + +
          + Fired when an element is highlighted. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.els <Array> + An array of the highlighted element(s). +
          +
          + + +
          + +
          +
          +

          + paginateEvent

          +
          + + + + + paginateEvent + + ( + ) + + + +
          + Fired when DataTable is paginated. +
          + +
          + + + + +
          + +
          +
          +

          + radioClickEvent

          +
          + + + + + radioClickEvent + + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + + +
          + Fired when a RADIO element is clicked. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + The event object. +
          +
          + oArgs.target <HTMLElement> + The RADIO element. +
          +
          + + +
          + +
          +
          +

          + recordSetUpdateEvent

          +
          + + + + + recordSetUpdateEvent + + ( + + + oArgs.record + + + , + oArgs.key + + + , + oArgs.newData + + + , + oArgs.oldData + + + ) + + + +
          + Fired when a Record is updated in the RecordSet. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.record <YAHOO.widget.Record> + The Record instance. +
          +
          + oArgs.key <String> + The Record key. +
          +
          + oArgs.newData <Object> + New data. +
          +
          + oArgs.oldData <Object> + New data. +
          +
          + + +
          + +
          +
          +

          + rowAppendEvent

          +
          + + + + + rowAppendEvent + + ( + + + oArgs.rowIds + + + ) + + + +
          + Fired when one or more TR elements are appended. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.rowIds <Array> + The IDs of the appended rows. +
          +
          + + +
          + +
          +
          +

          + rowDeleteEvent

          +
          + + + + + rowDeleteEvent + + ( + + + oArgs.rowIndexes + + + ) + + + +
          + Fired when one or more TR elements are deleted. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.rowIndexes <Array> + The indexes of the deleted rows. +
          +
          + + +
          + +
          +
          +

          + rowSelectEvent

          +
          + + + + + rowSelectEvent + + ( + + + oArgs.el + + + , + oArgs.record + + + ) + + + +
          + Fired when a TR element is selected. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.el <HTMLElement> + The selected TR element. +
          +
          + oArgs.record <YAHOO.widget.Record> + The associated Record instance. +
          +
          + + +
          + +
          +
          +

          + rowUnselectEvent

          +
          + + + + + rowUnselectEvent + + ( + + + oArgs.el + + + , + oArgs.record + + + ) + + + +
          + Fired when a TR element is unselected. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.el <HTMLElement> + The unselected TR element. +
          +
          + oArgs.record <YAHOO.widget.Record> + The associated Record instance. +
          +
          + + +
          + +
          +
          +

          + rowUpdateEvent

          +
          + + + + + rowUpdateEvent + + ( + + + oArgs.rowIds + + + ) + + + +
          + Fired when one or more TR elements are updated. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.rowIds <Array> + The IDs of the updated rows. +
          +
          + + +
          + +
          +
          +

          + selectEvent

          +
          + + + + + selectEvent + + ( + + + oArgs.els + + + ) + + + +
          + Fired when an element is selected. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.els <Array> + An array of the selected element(s). +
          +
          + + +
          + +
          +
          +

          + tableClickEvent

          +
          + + + + + tableClickEvent + + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + + +
          + Fired when a TABLE element is clicked. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + The event object. +
          +
          + oArgs.target <HTMLElement> + The TABLE element. +
          +
          + + +
          + +
          +
          +

          + tableDoubleclickEvent

          +
          + + + + + tableDoubleclickEvent + + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + + +
          + Fired when a TABLE element is doubleclicked. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + The event object. +
          +
          + oArgs.target <HTMLElement> + The TABLE element. +
          +
          + + +
          + +
          +
          +

          + tableFocusEvent

          +
          + + + + + tableFocusEvent + + ( + ) + + + +
          + Fired when DataTable instance is focused. +
          + +
          + + + + +
          + +
          +
          +

          + tableInitEvent

          +
          + + + + + tableInitEvent + + ( + ) + + + +
          + Fired when DataTable instance is first initialized. +
          + +
          + + + + +
          + +
          +
          +

          + tableMousedownEvent

          +
          + + + + + tableMousedownEvent + + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + + +
          + Fired when a TABLE element is mousedown. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + The event object. +
          +
          + oArgs.target <HTMLElement> + The TABLE element. +
          +
          + + +
          + +
          +
          +

          + tableMouseoutEvent

          +
          + + + + + tableMouseoutEvent + + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + + +
          + Fired when a TABLE element is mouseout. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + The event object. +
          +
          + oArgs.target <HTMLElement> + The TABLE element. +
          +
          + + +
          + +
          +
          +

          + tableMouseoverEvent

          +
          + + + + + tableMouseoverEvent + + ( + + + oArgs.event + + + , + oArgs.target + + + ) + + + +
          + Fired when a TABLE element is mouseover. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.event <HTMLEvent> + The event object. +
          +
          + oArgs.target <HTMLElement> + The TABLE element. +
          +
          + + +
          + +
          +
          +

          + tableRefreshEvent

          +
          + + + + + tableRefreshEvent + + ( + ) + + + +
          + Fired when DataTable view is refreshed. +
          + +
          + + + + +
          + +
          +
          +

          + unhighlightEvent

          +
          + + + + + unhighlightEvent + + ( + + + oArgs.els + + + ) + + + +
          + Fired when an element is unhighlighted. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.els <Array> + An array of the unhighlighted element(s). +
          +
          + + +
          + +
          +
          +

          + unselectEvent

          +
          + + + + + unselectEvent + + ( + + + oArgs.els + + + ) + + + +
          + Fired when an element is unselected. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.els <Array> + An array of the unselected element(s). +
          +
          + + +
          + +
          +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/DataTable.js.html b/www/extras/yui/docs/DataTable.js.html new file mode 100644 index 000000000..15b109a55 --- /dev/null +++ b/www/extras/yui/docs/DataTable.js.html @@ -0,0 +1,4694 @@ + + + + API: datatable DataTable.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          DataTable Widget  2.2.2

          +

          + Yahoo! UI Library + > datatable + + > DataTable.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * The DataTable widget provides a progressively enhanced DHTML control for
          + * displaying tabular data across A-grade browsers.
          + *
          + * @module datatable
          + * @requires yahoo, dom, event, datasource
          + * @optional dragdrop
          + * @title DataTable Widget
          + * @beta
          + */
          +
          +/****************************************************************************/
          +/****************************************************************************/
          +/****************************************************************************/
          +
          +/**
          + * DataTable class for the YUI DataTable widget.
          + *
          + * @class DataTable
          + * @uses YAHOO.util.EventProvider
          + * @constructor
          + * @param elContainer {HTMLElement} Container element for the TABLE.
          + * @param oColumnSet {YAHOO.widget.ColumnSet} ColumnSet instance.
          + * @param oDataSource {YAHOO.util.DataSource} DataSource instance.
          + * @param oConfigs {object} (optional) Object literal of configuration values.
          + */
          +YAHOO.widget.DataTable = function(elContainer,oColumnSet,oDataSource,oConfigs) {
          +    // Internal vars
          +    var i, ok;
          +    this._nIndex = YAHOO.widget.DataTable._nCount;
          +    this._sName = "instance" + this._nIndex;
          +    this.id = "yui-dt"+this._nIndex;
          +
          +    // Validate configs
          +    if(oConfigs && (oConfigs.constructor == Object)) {
          +        for(var sConfig in oConfigs) {
          +            this[sConfig] = oConfigs[sConfig];
          +        }
          +    }
          +
          +    // Validate DataSource
          +    if(oDataSource) {
          +        if(oDataSource instanceof YAHOO.util.DataSource) {
          +            this.dataSource = oDataSource;
          +        }
          +        else {
          +            YAHOO.log("Invalid DataSource", "warn", this.toString());
          +        }
          +    }
          +
          +    // Validate ColumnSet
          +    if(oColumnSet && (oColumnSet instanceof YAHOO.widget.ColumnSet)) {
          +        this._oColumnSet = oColumnSet;
          +    }
          +    else {
          +        YAHOO.log("Could not instantiate DataTable due to an invalid ColumnSet", "error", this.toString());
          +        return;
          +    }
          +    
          +    // Create RecordSet
          +    this._oRecordSet = new YAHOO.widget.RecordSet();
          +
          +    // Validate HTML Element
          +    var elTable = null;
          +    elContainer = YAHOO.util.Dom.get(elContainer);
          +    if(elContainer && elContainer.tagName && (elContainer.tagName.toLowerCase() == "div")) {
          +        this._elContainer = elContainer;
          +        // Peek in container child nodes to see if TABLE already exists
          +        if(elContainer.hasChildNodes()) {
          +            var children = elContainer.childNodes;
          +            for(i=0; i<children.length; i++) {
          +                if(children[i].tagName && children[i].tagName.toLowerCase() == "table") {
          +                    elTable = children[i];
          +                    break;
          +                }
          +            }
          +        }
          +
          +        // Progressively enhance an existing table from markup...
          +        // while using the markup as the source of data
          +        if(elTable && !this.dataSource) {
          +            // Fill RecordSet with data parsed out of table
          +            var aRecords = [];
          +
          +            // Iterate through each TBODY
          +            for(i=0; i<elTable.tBodies.length; i++) {
          +                var elBody = elTable.tBodies[i];
          +
          +                // Iterate through each TR
          +                for(var j=0; j<elBody.rows.length; j++) {
          +                    var elRow = elBody.rows[j];
          +                    var oRecord = {};
          +
          +                    // Iterate through each TD
          +                    for(var k=0; k<elRow.cells.length; k++) {
          +
          +                        //var elCell = elRow.cells[l];
          +                        //elCell.id = this.id+"-bdrow"+k+"-cell"+l;
          +                        //TODO: can we parse a column with null key?
          +                        oRecord[oColumnSet.keys[k].key] = oColumnSet.keys[k].parse(elRow.cells[k].innerHTML);
          +                    }
          +                    aRecords.push(oRecord);
          +                }
          +            }
          +            
          +            this._initTable();
          +            
          +            ok = this.doBeforeLoadData(null,aRecords);
          +            if(ok) {
          +                this.populateTable(aRecords);
          +            }
          +            else {
          +                YAHOO.log("The function doBeforeLoadData returned false","error",this);
          +            }
          +        }
          +        // Create markup from scratch using the provided DataSource
          +        else if(this.dataSource) {
          +                this._initTable();
          +
          +                ok = this.doBeforeLoadData(this.initialRequest,aRecords);
          +                if(ok) {
          +                    // Send out for data in an asynchronous request
          +                    oDataSource.sendRequest(this.initialRequest, this.onDataReturnPopulateTable, this);
          +                }
          +                else {
          +                    YAHOO.log("The function doBeforeLoadData returned false","error",this);
          +                }
          +        }
          +        // Else there is no data
          +        else {
          +            this._initTable();
          +            this.showTableMessage();
          +        }
          +    }
          +    // Container element not found in document
          +    else {
          +        YAHOO.log("Could not instantiate DataTable due to an invalid container element", "error", this.toString());
          +        return;
          +    }
          +
          +    // Set up sort
          +    this.subscribe("headCellClickEvent",this.onEventSortColumn);
          +
          +    // Set up context menu
          +    //TODO: does trigger have to exist? can trigger be TBODY rather than rows?
          +    if(this.contextMenu && this.contextMenuOptions) {
          +        this.contextMenu = new YAHOO.widget.ContextMenu(this.id+"-cm", { trigger: this._elBody.rows } );
          +        this.contextMenu.addItem("delete item");
          +        this.contextMenu.render(document.body);
          +    }
          +
          +    // Set up event model
          +    elTable = this._elTable;
          +    elTable.className = YAHOO.widget.DataTable.CLASS_TABLE;
          +    /////////////////////////////////////////////////////////////////////////////
          +    //
          +    // DOM Events
          +    //
          +    /////////////////////////////////////////////////////////////////////////////
          +    //YAHOO.util.Event.addListener(this._elContainer, "focus", this._onFocus, this);
          +    YAHOO.util.Event.addListener(elTable, "click", this._onClick, this);
          +    YAHOO.util.Event.addListener(elTable, "dblclick", this._onDoubleclick, this);
          +    YAHOO.util.Event.addListener(elTable, "mouseout", this._onMouseout, this);
          +    YAHOO.util.Event.addListener(elTable, "mouseover", this._onMouseover, this);
          +    YAHOO.util.Event.addListener(elTable, "mousedown", this._onMousedown, this);
          +    //YAHOO.util.Event.addListener(elTable, "mouseup", this._onMouseup, this);
          +    //YAHOO.util.Event.addListener(elTable, "mousemove", this._onMousemove, this);
          +    YAHOO.util.Event.addListener(elTable, "keydown", this._onKeydown, this);
          +    YAHOO.util.Event.addListener(elTable, "keypress", this._onKeypress, this);
          +    YAHOO.util.Event.addListener(document, "keydown", this._onDocumentKeydown, this);
          +    YAHOO.util.Event.addListener(document, "click", this._onDocumentClick, this);
          +    YAHOO.util.Event.addListener(elTable, "keyup", this._onKeyup, this);
          +    //YAHOO.util.Event.addListener(elTable, "focus", this._onFocus, this);
          +    YAHOO.util.Event.addListener(elTable, "blur", this._onBlur, this);
          +
          +    /////////////////////////////////////////////////////////////////////////////
          +    //
          +    // Custom Events
          +    //
          +    /////////////////////////////////////////////////////////////////////////////
          +
          +    /**
          +     * Fired when a mouseover occurs on a TD element.
          +     *
          +     * @event cellMouseoverEvent
          +     * @param oArgs.event {HTMLEvent} The event object.
          +     * @param oArgs.target {HTMLElement} The TD element.
          +     */
          +    this.createEvent("cellMouseoverEvent");
          +
          +    /**
          +     * Fired when a mouseout occurs on a TD element.
          +     *
          +     * @event cellMouseoutEvent
          +     * @param oArgs.event {HTMLEvent} The event object.
          +     * @param oArgs.target {HTMLElement} The TD element.
          +     */
          +    this.createEvent("cellMouseoutEvent");
          +
          +    /**
          +     * Fired when a TH cell element is mouseover.
          +     *
          +     * @event headCellMouseoverEvent
          +     * @param oArgs.event {HTMLEvent} The event object.
          +     * @param oArgs.target {HTMLElement} The TH element.
          +     *
          +     */
          +    this.createEvent("headCellMouseoverEvent");
          +
          +    /**
          +     * Fired when a TH cell element is mouseout.
          +     *
          +     * @event headCellMouseoutEvent
          +     * @param oArgs.event {HTMLEvent} The event object.
          +     * @param oArgs.target {HTMLElement} The TH element.
          +     *
          +     */
          +    this.createEvent("headCellMouseoutEvent");
          +
          +    /**
          +     * Fired when a TABLE element is mouseover.
          +     *
          +     * @event tableMouseoverEvent
          +     * @param oArgs.event {HTMLEvent} The event object.
          +     * @param oArgs.target {HTMLElement} The TABLE element.
          +     *
          +     */
          +    this.createEvent("tableMouseoverEvent");
          +
          +    /**
          +     * Fired when a TABLE element is mouseout.
          +     *
          +     * @event tableMouseoutEvent
          +     * @param oArgs.event {HTMLEvent} The event object.
          +     * @param oArgs.target {HTMLElement} The TABLE element.
          +     *
          +     */
          +    this.createEvent("tableMouseoutEvent");
          +
          +    /**
          +     * Fired when a mousedown occurs on a TD element.
          +     *
          +     * @event cellMousedownEvent
          +     * @param oArgs.event {HTMLEvent} The event object.
          +     * @param oArgs.target {HTMLElement} The TD element.
          +     */
          +    this.createEvent("cellMousedownEvent");
          +
          +    /**
          +     * Fired when a TH cell element is mousedown.
          +     *
          +     * @event headCellMousedownEvent
          +     * @param oArgs.event {HTMLEvent} The event object.
          +     * @param oArgs.target {HTMLElement} The TH element.
          +     */
          +    this.createEvent("headCellMousedownEvent");
          +
          +    /**
          +     * Fired when a TABLE element is mousedown.
          +     *
          +     * @event tableMousedownEvent
          +     * @param oArgs.event {HTMLEvent} The event object.
          +     * @param oArgs.target {HTMLElement} The TABLE element.
          +     *
          +     */
          +    this.createEvent("tableMousedownEvent");
          +
          +    /**
          +     * Fired when a CHECKBOX element is clicked.
          +     *
          +     * @event checkboxClickEvent
          +     * @param oArgs.event {HTMLEvent} The event object.
          +     * @param oArgs.target {HTMLElement} The CHECKBOX element.
          +     */
          +    this.checkboxClickEvent = this.createEvent("checkboxClickEvent");
          +    //this.checkboxClickEvent.subscribeEvent.subscribe(this._registerEvent,{type:"checkboxClickEvent"},this);
          +
          +    /**
          +     * Fired when a RADIO element is clicked.
          +     *
          +     * @event radioClickEvent
          +     * @param oArgs.event {HTMLEvent} The event object.
          +     * @param oArgs.target {HTMLElement} The RADIO element.
          +     */
          +    this.createEvent("radioClickEvent");
          +    
          +    /**
          +     * Fired when a TD element is clicked.
          +     *
          +     * @event cellClickEvent
          +     * @param oArgs.event {HTMLEvent} The event object.
          +     * @param oArgs.target {HTMLElement} The TD element.
          +     */
          +    this.createEvent("cellClickEvent");
          +
          +    /**
          +     * Fired when a TH cell element is clicked.
          +     *
          +     * @event headCellClickEvent
          +     * @param oArgs.event {HTMLEvent} The event object.
          +     * @param oArgs.target {HTMLElement} The TH element.
          +     */
          +    this.createEvent("headCellClickEvent");
          +
          +    /**
          +     * Fired when a TABLE element is clicked.
          +     *
          +     * @event tableClickEvent
          +     * @param oArgs.event {HTMLEvent} The event object.
          +     * @param oArgs.target {HTMLElement} The TABLE element.
          +     *
          +     */
          +    this.createEvent("tableClickEvent");
          +
          +    /**
          +     * Fired when a TD element is doubleclicked.
          +     *
          +     * @event cellDoubleclickEvent
          +     * @param oArgs.event {HTMLEvent} The event object.
          +     * @param oArgs.target {HTMLElement} The TD element.
          +     */
          +    this.createEvent("cellDoubleclickEvent");
          +
          +    /**
          +     * Fired when a TH cell element is doubleclicked.
          +     *
          +     * @event headCellDoubleclickEvent
          +     * @param oArgs.event {HTMLEvent} The event object.
          +     * @param oArgs.target {HTMLElement} The TH element.
          +     */
          +    this.createEvent("headCellDoubleclickEvent");
          +
          +    /**
          +     * Fired when a TABLE element is doubleclicked.
          +     *
          +     * @event tableDoubleclickEvent
          +     * @param oArgs.event {HTMLEvent} The event object.
          +     * @param oArgs.target {HTMLElement} The TABLE element.
          +     *
          +     */
          +    this.createEvent("tableDoubleclickEvent");
          +
          +    /**
          +     * Fired when a column is sorted.
          +     *
          +     * @event columnSortEvent
          +     * @param oArgs.column {YAHOO.widget.Column} The Column instance.
          +     * @param oArgs.dir {String} Sort direction "asc" or "desc".
          +     */
          +    this.createEvent("columnSortEvent");
          +
          +    /**
          +     * Fired when an editor is activated.
          +     *
          +     * @event editorShowEvent
          +     * @param oArgs.target {HTMLElement} The TD element.
          +     * @param oArgs.column {YAHOO.widget.Column} The Column instance.
          +     */
          +    this.createEvent("editorShowEvent");
          +
          +
          +    /**
          +     * Fired when a cell is edited.
          +     *
          +     * @event cellEditEvent
          +     * @param oArgs.target {HTMLElement} The TD element.
          +     * @param oArgs.newData {Object} New data value.
          +     * @param oArgs.oldData {Object} Old data value.
          +     */
          +    this.createEvent("cellEditEvent");
          +
          +    /**
          +     * Fired when a column is resized.
          +     *
          +     * @event columnResizeEvent
          +     * @param oArgs.target {HTMLElement} The TH element.
          +     */
          +    this.createEvent("columnResizeEvent");
          +
          +    /**
          +     * Fired when DataTable instance is first initialized.
          +     *
          +     * @event tableInitEvent
          +     */
          +    this.createEvent("tableInitEvent");
          +
          +    /**
          +     * Fired when DataTable view is refreshed.
          +     *
          +     * @event tableRefreshEvent
          +     */
          +    this.createEvent("tableRefreshEvent");
          +
          +    /**
          +     * Fired when DataTable instance is focused.
          +     *
          +     * @event tableFocusEvent
          +     */
          +    this.createEvent("tableFocusEvent");
          +
          +    /**
          +     * Fired when data is returned from DataSource.
          +     *
          +     * @event dataReturnEvent
          +     * @param oArgs.request {String} Original request.
          +     * @param oArgs.response {Object} Response object.
          +     */
          +    this.createEvent("dataReturnEvent");
          +
          +    /**
          +     * Fired when DataTable is paginated.
          +     *
          +     * @event paginateEvent
          +     */
          +    this.createEvent("paginateEvent");
          +
          +    /**
          +     * Fired when a TD element is formatted.
          +     *
          +     * @event cellFormatEvent
          +     * @param oArgs.el {HTMLElement} Reference to the TD element.
          +     */
          +    this.createEvent("cellFormatEvent");
          +
          +    /**
          +     * Fired when an element is selected.
          +     *
          +     * @event selectEvent
          +     * @param oArgs.els {Array} An array of the selected element(s).
          +     */
          +    this.createEvent("selectEvent");
          +
          +    /**
          +     * Fired when an element is unselected.
          +     *
          +     * @event unselectEvent
          +     * @param oArgs.els {Array} An array of the unselected element(s).
          +     */
          +    this.createEvent("unselectEvent");
          +
          +    /**
          +     * Fired when an element is highlighted.
          +     *
          +     * @event highlightEvent
          +     * @param oArgs.els {Array} An array of the highlighted element(s).
          +     */
          +    this.createEvent("highlightEvent");
          +
          +    /**
          +     * Fired when an element is unhighlighted.
          +     *
          +     * @event unhighlightEvent
          +     * @param oArgs.els {Array} An array of the unhighlighted element(s).
          +     */
          +    this.createEvent("unhighlightEvent");
          +    
          +    /**
          +     * Fired when a TR element is selected.
          +     *
          +     * @event rowSelectEvent
          +     * @param oArgs.el {HTMLElement} The selected TR element.
          +     * @param oArgs.record {YAHOO.widget.Record} The associated Record instance.
          +     */
          +    this.createEvent("rowSelectEvent");
          +
          +    /**
          +     * Fired when a TR element is unselected.
          +     *
          +     * @event rowUnselectEvent
          +     * @param oArgs.el {HTMLElement} The unselected TR element.
          +     * @param oArgs.record {YAHOO.widget.Record} The associated Record instance.
          +     */
          +    this.createEvent("rowUnselectEvent");
          +
          +    /**
          +     * Fired when one or more TR elements are deleted.
          +     *
          +     * @event rowDeleteEvent
          +     * @param oArgs.rowIndexes {Array} The indexes of the deleted rows.
          +     */
          +    this.createEvent("rowDeleteEvent");
          +    this.subscribe("rowDeleteEvent", this._onRowDelete);
          +    
          +    /**
          +     * Fired when one or more TR elements are appended.
          +     *
          +     * @event rowAppendEvent
          +     * @param oArgs.rowIds {Array} The IDs of the appended rows.
          +     */
          +    this.createEvent("rowAppendEvent");
          +
          +    /**
          +     * Fired when one or more TR elements are updated.
          +     *
          +     * @event rowUpdateEvent
          +     * @param oArgs.rowIds {Array} The IDs of the updated rows.
          +     */
          +    this.createEvent("rowUpdateEvent");
          +
          +    /**
          +     * Fired when a Record is updated in the RecordSet.
          +     *
          +     * @event recordSetUpdateEvent
          +     * @param oArgs.record {YAHOO.widget.Record} The Record instance.
          +     * @param oArgs.key {String} The Record key.
          +     * @param oArgs.newData {Object} New data.
          +     * @param oArgs.oldData {Object} New data.
          +     */
          +    this.createEvent("recordSetUpdateEvent");
          +    this._oRecordSet.subscribe("recordUpdateEvent", this._onRecordUpdate, this, true);
          +    
          +    
          +    YAHOO.widget.DataTable._nCount++;
          +    YAHOO.log("DataTable initialized", "info", this.toString());
          +    this.fireEvent("tableInitEvent");
          +};
          +
          +if(YAHOO.util.EventProvider) {
          +    YAHOO.augment(YAHOO.widget.DataTable, YAHOO.util.EventProvider);
          +}
          +else {
          +    YAHOO.log("Missing dependency: YAHOO.util.EventProvider","error",this.toString());
          +}
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Public constants
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Class name assigned to TABLE element.
          + *
          + * @property CLASS_TABLE
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt"
          + */
          +YAHOO.widget.DataTable.CLASS_TABLE = "yui-dt-table";
          +
          +/**
          + * Class name assigned to TBODY element that holds data rows.
          + *
          + * @property CLASS_BODY
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-body"
          + */
          +YAHOO.widget.DataTable.CLASS_BODY = "yui-dt-body";
          +
          +/**
          + * Class name assigned to container element within THEAD.
          + *
          + * @property CLASS_HEADCONTAINER
          + * @type String
          + * @static
          + * @final
          + */
          +YAHOO.widget.DataTable.CLASS_HEADCONTAINER = "yui-dt-headcontainer";
          +
          +/**
          + * Class name assigned to resizer handle element within THEAD.
          + *
          + * @property CLASS_HEADRESIZER
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-headresizer"
          + */
          +YAHOO.widget.DataTable.CLASS_HEADRESIZER = "yui-dt-headresizer";
          +
          +/**
          + * Class name assigned to text displayed within THEAD.
          + *
          + * @property CLASS_HEADTEXT
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-headtext"
          + */
          +YAHOO.widget.DataTable.CLASS_HEADTEXT = "yui-dt-headtext";
          +
          +/**
          + * Class name assigned to FIRST elements.
          + *
          + * @property CLASS_FIRST
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-first"
          + */
          +YAHOO.widget.DataTable.CLASS_FIRST = "yui-dt-first";
          +
          +/**
          + * Class name assigned to LAST elements.
          + *
          + * @property CLASS_LAST
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-last"
          + */
          +YAHOO.widget.DataTable.CLASS_LAST = "yui-dt-last";
          +
          +/**
          + * Class name assigned to even TR elements.
          + *
          + * @property CLASS_EVEN
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-even"
          + */
          +YAHOO.widget.DataTable.CLASS_EVEN = "yui-dt-even";
          +
          +/**
          + * Class name assigned to odd TR elements.
          + *
          + * @property CLASS_ODD
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-odd"
          + */
          +YAHOO.widget.DataTable.CLASS_ODD = "yui-dt-odd";
          +
          +/**
          + * Class name assigned to empty elements.
          + *
          + * @property CLASS_EMPTY
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-empty"
          + */
          +YAHOO.widget.DataTable.CLASS_EMPTY = "yui-dt-empty";
          +
          +/**
          + * Class name assigned to loading message.
          + *
          + * @property CLASS_LOADING
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-loading"
          + */
          +YAHOO.widget.DataTable.CLASS_LOADING = "yui-dt-loading";
          +
          +/**
          + * Class name assigned to elements with error messaging.
          + *
          + * @property CLASS_ERROR
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-error"
          + */
          +YAHOO.widget.DataTable.CLASS_ERROR = "yui-dt-error";
          +
          +/**
          + * Class name assigned to selected elements.
          + *
          + * @property CLASS_SELECTED
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-selected"
          + */
          +YAHOO.widget.DataTable.CLASS_SELECTED = "yui-dt-selected";
          +
          +/**
          + * Class name assigned to highlighted element.
          + *
          + * @property CLASS_HIGHLIGHT
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-highlight"
          + */
          +YAHOO.widget.DataTable.CLASS_HIGHLIGHT = "yui-dt-highlight";
          +
          +/**
          + * Class name assigned to container of a scrollable DataTable.
          + *
          + * @property CLASS_SCROLLABLE
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-scrollable"
          + */
          +YAHOO.widget.DataTable.CLASS_SCROLLABLE = "yui-dt-scrollable";
          +
          +/**
          + * Class name assigned to scrolling TBODY element of a scrollable DataTable.
          + *
          + * @property CLASS_SCROLLBODY
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-scrollbody"
          + */
          +YAHOO.widget.DataTable.CLASS_SCROLLBODY = "yui-dt-scrollbody";
          +
          +/**
          + * Class name assigned to column headers of sortable Columns.
          + *
          + * @property CLASS_SORTABLE
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-sortable"
          + */
          +YAHOO.widget.DataTable.CLASS_SORTABLE = "yui-dt-sortable";
          +
          +/**
          + * Class name assigned to column headers when sorted in ascending order.
          + *
          + * @property CLASS_SORTEDBYASC
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-sortedbyasc"
          + */
          +YAHOO.widget.DataTable.CLASS_SORTEDBYASC = "yui-dt-sortedbyasc";
          +
          +/**
          + * Class name assigned to column headers when sorted in descending order.
          + *
          + * @property CLASS_SORTEDBYDESC
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-sortedbydesc"
          + */
          +YAHOO.widget.DataTable.CLASS_SORTEDBYDESC = "yui-dt-sortedbydesc";
          +
          +/**
          + * Class name assigned to the paginator container element.
          + *
          + * @property CLASS_PAGINATOR
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-paginator"
          + */
          +YAHOO.widget.DataTable.CLASS_PAGINATOR = "yui-dt-paginator";
          +
          +/**
          + * Class name assigned to the pagination link "&lt;&lt;".
          + *
          + * @property CLASS_FIRSTLINK
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-firstlink"
          + */
          +YAHOO.widget.DataTable.CLASS_FIRSTLINK = "yui-dt-firstlink";
          +
          +/**
          + * Class name assigned to the pagination link "&lt;&lt;" when it is disabled.
          + *
          + * @property CLASS_FIRSTPAGE
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-firstpage"
          + */
          +YAHOO.widget.DataTable.CLASS_FIRSTPAGE = "yui-dt-firstpage";
          +
          +/**
          + * Class name assigned to the pagination link "&gt;&gt;".
          + *
          + * @property CLASS_LASTLINK
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-lastlink"
          + */
          +YAHOO.widget.DataTable.CLASS_LASTLINK = "yui-dt-lastlink";
          +
          +/**
          + * Class name assigned to the pagination link "&gt;&gt;" when it is disabled.
          + *
          + * @property CLASS_LASTPAGE
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-lastpage"
          + */
          +YAHOO.widget.DataTable.CLASS_LASTPAGE = "yui-dt-lastpage";
          +
          +/**
          + * Class name assigned to the pagination link "&lt;".
          + *
          + * @property CLASS_PREVLINK
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-prevlink"
          + */
          +YAHOO.widget.DataTable.CLASS_PREVLINK = "yui-dt-prevlink";
          +
          +/**
          + * Class name assigned to the pagination link "&lt;" when it is disabled.
          + *
          + * @property CLASS_PREVPAGE
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-prevpage"
          + */
          +YAHOO.widget.DataTable.CLASS_PREVPAGE = "yui-dt-prevpage";
          +
          +/**
          + * Class name assigned to the pagination link "&gt;".
          + *
          + * @property CLASS_NEXTLINK
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-nextlink"
          + */
          +YAHOO.widget.DataTable.CLASS_NEXTLINK = "yui-dt-nextlink";
          +
          +/**
          + * Class name assigned to the pagination link "&gt;" when it is disabled.
          + *
          + * @property CLASS_NEXTPAGE
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-nextpage"
          + */
          +YAHOO.widget.DataTable.CLASS_NEXTPAGE = "yui-dt-nextpage";
          +
          +
          +/**
          + * Class name assigned to pagination links to specific page numbers.
          + *
          + * @property CLASS_PAGELINK
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-pagelink"
          + */
          +YAHOO.widget.DataTable.CLASS_PAGELINK = "yui-dt-pagelink";
          +
          +/**
          + * Class name assigned to pagination links for specific page numbers that are disabled.
          + *
          + * @property CLASS_CURRENTPAGE
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-currentpage"
          + */
          +YAHOO.widget.DataTable.CLASS_CURRENTPAGE = "yui-dt-currentpage";
          +
          +/**
          + * Class name assigned to the pagination SELECT element.
          + *
          + * @property CLASS_PAGESELECT
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-pageselect"
          + */
          +YAHOO.widget.DataTable.CLASS_PAGESELECT = "yui-dt-pageselect";
          +
          +/**
          + * Class name assigned to the pagination links container element.
          + *
          + * @property CLASS_PAGELINKS
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-pagelinks"
          + */
          +YAHOO.widget.DataTable.CLASS_PAGELINKS = "yui-dt-pagelinks";
          +
          +/**
          + * Class name assigned to editable TD elements.
          + *
          + * @property CLASS_EDITABLE
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-editable"
          + */
          +YAHOO.widget.DataTable.CLASS_EDITABLE = "yui-dt-editable";
          +
          +/**
          + * Class name assigned to editor DIV elements.
          + *
          + * @property CLASS_EDITOR
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-editor"
          + */
          +YAHOO.widget.DataTable.CLASS_EDITOR = "yui-dt-editor";
          +
          +/**
          + * Class name assigned to TD elements of type "checkbox".
          + *
          + * @property CLASS_CHECKBOX
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-checkbox"
          + */
          +YAHOO.widget.DataTable.CLASS_CHECKBOX = "yui-dt-checkbox";
          +
          +/**
          + * Class name assigned to TD elements of type "currency".
          + *
          + * @property CLASS_CURRENCY
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-currency"
          + */
          +YAHOO.widget.DataTable.CLASS_CURRENCY = "yui-dt-currency";
          +
          +/**
          + * Class name assigned to TD elements of type "date".
          + *
          + * @property CLASS_DATE
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-date"
          + */
          +YAHOO.widget.DataTable.CLASS_DATE = "yui-dt-date";
          +
          +/**
          + * Class name assigned to TD elements of type "email".
          + *
          + * @property CLASS_EMAIL
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-email"
          + */
          +YAHOO.widget.DataTable.CLASS_EMAIL = "yui-dt-email";
          +
          +/**
          + * Class name assigned to TD elements of type "link".
          + *
          + * @property CLASS_LINK
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-link"
          + */
          +YAHOO.widget.DataTable.CLASS_LINK = "yui-dt-link";
          +
          +/**
          + * Class name assigned to TD elements of type "number".
          + *
          + * @property CLASS_NUMBER
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-number"
          + */
          +YAHOO.widget.DataTable.CLASS_NUMBER = "yui-dt-number";
          +
          +/**
          + * Class name assigned to TD elements of type "string".
          + *
          + * @property CLASS_STRING
          + * @type String
          + * @static
          + * @final
          + * @default "yui-dt-string"
          + */
          +YAHOO.widget.DataTable.CLASS_STRING = "yui-dt-string";
          +
          +/**
          + * Message to display if DataTable has no data.
          + *
          + * @property MSG_EMPTY
          + * @type String
          + * @static
          + * @final
          + * @default "No records found."
          + */
          +YAHOO.widget.DataTable.MSG_EMPTY = "No records found.";
          +
          +/**
          + * Message to display while DataTable is loading data.
          + *
          + * @property MSG_LOADING
          + * @type String
          + * @static
          + * @final
          + * @default "Loading data..."
          + */
          +YAHOO.widget.DataTable.MSG_LOADING = "Loading data...";
          +
          +/**
          + * Message to display while DataTable has data error.
          + *
          + * @property MSG_ERROR
          + * @type String
          + * @static
          + * @final
          + * @default "Data error."
          + */
          +YAHOO.widget.DataTable.MSG_ERROR = "Data error.";
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Private member variables
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Internal class variable to index multiple DataTable instances.
          + *
          + * @property _nCount
          + * @type Number
          + * @private
          + * @static
          + */
          +YAHOO.widget.DataTable._nCount = 0;
          +
          +/**
          + * Instance index.
          + *
          + * @property _nIndex
          + * @type Number
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._nIndex = null;
          +
          +/**
          + * Unique instance name.
          + *
          + * @property _sName
          + * @type String
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._sName = null;
          +
          +//TODO: convert these to public members
          +
          +/**
          + * Container element reference. Is null unless the TABLE is built from scratch into the
          + * provided container.
          + *
          + * @property _elContainer
          + * @type HTMLElement
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._elContainer = null;
          +
          +/**
          + * TABLE element reference.
          + *
          + * @property _elTable
          + * @type HTMLElement
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._elTable = null;
          +
          +/**
          + * TBODY element reference.
          + *
          + * @property _elBody
          + * @type HTMLElement
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._elBody = null;
          +
          +/**
          + * First TR element reference pointer.
          + *
          + * @property _elFirstRow
          + * @type HTMLElement
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._elFirstRow = null;
          +
          +/**
          + * Last TR element reference pointer.
          + *
          + * @property _elLastRow
          + * @type HTMLElement
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._elLastRow = null;
          +
          +/**
          + * ColumnSet instance.
          + *
          + * @property _oColumnSet
          + * @type YAHOO.widget.ColumnSet
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._oColumnSet = null;
          +
          +/**
          + * RecordSet instance.
          + *
          + * @property _oRecordSet
          + * @type YAHOO.widget.RecordSet
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._oRecordSet = null;
          +
          +/**
          + * Id of anchor row for multiple selections.
          + *
          + * @property _selectRowAnchorId
          + * @type String
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._selectRowAnchorId = null;
          +
          +/**
          + * Array of Records that are in the selected state.
          + *
          + * @property _aSelectedRecords
          + * @type YAHOO.widget.Record[]
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._aSelectedRecords = null;
          +
          +/**
          + * Internal variable to track whether widget has focus.
          + *
          + * @property _bFocused
          + * @type Boolean
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._bFocused = false;
          +
          +/**
          + * Internal object literal to track built-in paginator values.
          + *
          + * @property _paginator
          + * @type Object[]
          + * @private
          + */
          +/**
          + * Internal variable to track paginator dropdown options.
          + *
          + * @property _paginator.dropdownOptions
          + * @type Number[] | Object[]
          + * @private
          + */
          +/**
          + * Internal variable to track paginator page links.
          + *
          + * @property _paginator.pageLinks
          + * @type Number
          + * @private
          + */
          +/**
          + * Tracks total number of pages, calculated on the fly.
          + *
          + * @property _paginator.totalPages
          + * @type Number
          + * @private
          + */
          +/**
          + * Tracks current page.
          + *
          + * @property _paginator.currentPage
          + * @type Number
          + * @private
          + */
          +/**
          + * Tracks rows per page.
          + *
          + * @property _paginator.rowsPerPage
          + * @type Number
          + * @private
          + */
          +/**
          + * Array of pagination container elements.
          + *
          + * @property _paginator.containers
          + * @type HTMLElement
          + * @private
          + */
          +/**
          + * Array of pagination SELECT elements.
          + *
          + * @property _paginator.dropdowns
          + * @type HTMLElement
          + * @private
          + */
          +/**
          + * Array of pagination link container elements.
          + *
          + * @property _paginator.links
          + * @type HTMLElement
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._paginator = null;
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Private methods
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +// INIT FUNCTIONS
          +
          +
          +
          +
          +
          +/**
          + * Creates HTML markup for TABLE, THEAD, TBODY.
          + *
          + * @method _initTable
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._initTable = function() {
          +    // Clear the container
          +    this._elContainer.innerHTML = "";
          +
          +    // Set up scrolling
          +    if(this.scrollable) {
          +        //TODO: conf height
          +        YAHOO.util.Dom.addClass(this._elContainer,YAHOO.widget.DataTable.CLASS_SCROLLABLE);
          +    }
          +
          +    // Create TABLE
          +    this._elTable = this._elContainer.appendChild(document.createElement("table"));
          +    var elTable = this._elTable;
          +    elTable.tabIndex = 0;
          +    elTable.id = "yui-dt-table"+this._nIndex;
          +
          +    // Create SUMMARY, if applicable
          +    if(this.summary) {
          +        elTable.summary = this.summary;
          +    }
          +
          +    // Create CAPTION, if applicable
          +    if(this.caption) {
          +        this._elCaption = elTable.appendChild(document.createElement("caption"));
          +        this._elCaption.innerHTML = this.caption;
          +    }
          +
          +    // Create THEAD
          +    this._initHead(elTable, this._oColumnSet);
          +
          +
          +    // Create TBODY for messages
          +    var elMsgBody = document.createElement("tbody");
          +    elMsgBody.tabIndex = -1;
          +    this._elMsgRow = elMsgBody.appendChild(document.createElement("tr"));
          +    var elMsgRow = this._elMsgRow;
          +    var elMsgCell = elMsgRow.appendChild(document.createElement("td"));
          +    elMsgCell.colSpan = this._oColumnSet.keys.length;
          +    this._elMsgCell = elMsgCell;
          +    this._elMsgBody = elTable.appendChild(elMsgBody);
          +    this.showTableMessage(YAHOO.widget.DataTable.MSG_LOADING, YAHOO.widget.DataTable.CLASS_LOADING);
          +
          +    // Create TBODY for data
          +    this._elBody = elTable.appendChild(document.createElement("tbody"));
          +    this._elBody.tabIndex = -1;
          +    YAHOO.util.Dom.addClass(this._elBody,YAHOO.widget.DataTable.CLASS_BODY);
          +    if(this.scrollable) {
          +        YAHOO.util.Dom.addClass(this._elBody,YAHOO.widget.DataTable.CLASS_SCROLLBODY);
          +    }
          +};
          +
          +/**
          + * Populates THEAD element with TH cells as defined by ColumnSet.
          + *
          + * @method _initHead
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._initHead = function() {
          +    var i,oColumn;
          +    
          +    // Create THEAD
          +    var elHead = document.createElement("thead");
          +    elHead.tabIndex = -1;
          +
          +    // Iterate through each row of Column headers...
          +    var colTree = this._oColumnSet.tree;
          +    for(i=0; i<colTree.length; i++) {
          +        var elHeadRow = elHead.appendChild(document.createElement("tr"));
          +        elHeadRow.id = this.id+"-hdrow"+i;
          +
          +        // ...and create THEAD cells
          +        for(var j=0; j<colTree[i].length; j++) {
          +            oColumn = colTree[i][j];
          +            var elHeadCell = elHeadRow.appendChild(document.createElement("th"));
          +            elHeadCell.id = oColumn.getId();
          +            this._initHeadCell(elHeadCell,oColumn,i,j);
          +        }
          +    }
          +
          +    this._elHead = this._elTable.appendChild(elHead);
          +    
          +    // Add Resizer only after DOM has been updated
          +    for(i=0; i<this._oColumnSet.keys.length; i++) {
          +        oColumn = this._oColumnSet.keys[i];
          +        if(oColumn.resizeable && YAHOO.util.DD) {
          +            //TODO: deal with fixed width tables
          +            // Skip the last column for fixed-width tables
          +            if(!this.fixedWidth ||
          +                    (this.fixedWidth &&
          +                    (oColumn.getIndex() != this._oColumnSet.keys.length-1)
          +                    )
          +            ) {
          +                // TODO: better way to get elHeadContainer
          +                var elHeadContainer = (YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.DataTable.CLASS_HEADCONTAINER,"div",YAHOO.util.Dom.get(oColumn.getId())))[0];
          +                var elHeadResizer = elHeadContainer.appendChild(document.createElement("span"));
          +                elHeadResizer.id = oColumn.getId() + "-resizer";
          +                YAHOO.util.Dom.addClass(elHeadResizer,YAHOO.widget.DataTable.CLASS_HEADRESIZER);
          +                oColumn.ddResizer = new YAHOO.util.WidthResizer(
          +                        this, oColumn.getId(), elHeadResizer.id, elHeadResizer.id);
          +                var cancelClick = function(e) {
          +                    YAHOO.util.Event.stopPropagation(e);
          +                };
          +                YAHOO.util.Event.addListener(elHeadResizer,"click",cancelClick);
          +            }
          +            if(this.fixedWidth) {
          +                //elHeadContainer.style.overflow = "hidden";
          +                // TODO: better way to get elHeadText
          +                var elHeadText = (YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.DataTable.CLASS_HEADTEXT,"span",YAHOO.util.Dom.get(oColumn.getId())))[0];
          +                elHeadText.style.overflow = "hidden";
          +            }
          +        }
          +    }
          +
          +    YAHOO.log("THEAD with " + this._oColumnSet.keys.length + " columns created","info",this.toString());
          +};
          +
          +/**
          + * Populates TH cell as defined by Column.
          + *
          + * @method _initHeadCell
          + * @param elHeadCell {HTMLElement} TH cell element reference.
          + * @param oColumn {YAHOO.widget.Column} Column object.
          + * @param row {number} Row index.
          + * @param col {number} Column index.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._initHeadCell = function(elHeadCell,oColumn,row,col) {
          +    // Clear out the cell of prior content
          +    // TODO: purgeListeners and other validation-related things
          +    var index = this._nIndex;
          +    elHeadCell.columnIndex = oColumn.getIndex();
          +    if(oColumn.abbr) {
          +        elHeadCell.abbr = oColumn.abbr;
          +    }
          +    if(oColumn.width) {
          +        elHeadCell.style.width = oColumn.width;
          +    }
          +    if(oColumn.className) {
          +        YAHOO.util.Dom.addClass(elHeadCell,oColumn.className);
          +    }
          +    // Apply CSS for sorted tables
          +    if(this.sortedBy && this.sortedBy.colKey) {
          +        if(this.sortedBy.colKey == oColumn.key) {
          +            var sortClass = (this.sortedBy.dir && (this.sortedBy.dir != "asc")) ?
          +                    YAHOO.widget.DataTable.CLASS_SORTEDBYDESC :
          +                    YAHOO.widget.DataTable.CLASS_SORTEDBYASC;
          +            YAHOO.util.Dom.addClass(elHeadCell,sortClass);
          +            this.sortedBy._id = elHeadCell.id;
          +        }
          +    }
          +
          +    elHeadCell.innerHTML = "";
          +    elHeadCell.rowSpan = oColumn.getRowSpan();
          +    elHeadCell.colSpan = oColumn.getColSpan();
          +
          +    var elHeadContainer = elHeadCell.appendChild(document.createElement("div"));
          +    elHeadContainer.id = this.id+"-hdrow"+row+"-container"+col;
          +    YAHOO.util.Dom.addClass(elHeadContainer,YAHOO.widget.DataTable.CLASS_HEADCONTAINER);
          +    var elHeadContent = elHeadContainer.appendChild(document.createElement("span"));
          +    elHeadContent.id = this.id+"-hdrow"+row+"-text"+col;
          +    YAHOO.util.Dom.addClass(elHeadContent,YAHOO.widget.DataTable.CLASS_HEADTEXT);
          +
          +    var contentText = oColumn.text || oColumn.key || "";
          +    if(oColumn.sortable) {
          +        YAHOO.util.Dom.addClass(elHeadContent,YAHOO.widget.DataTable.CLASS_SORTABLE);
          +        //TODO: Make hash configurable to be a server link
          +        //TODO: Make title configurable
          +        //TODO: Separate contentText from an accessibility link that says
          +        // Click to sort ascending and push it offscreen
          +        var sortLink = "?key=" + oColumn.key;
          +        elHeadContent.innerHTML = "<a href=\"" + sortLink + "\" title=\"Click to sort\" class=\"" + YAHOO.widget.DataTable.CLASS_SORTABLE + "\">" + contentText + "</a>";
          +         //elHeadContent.innerHTML = contentText;
          +
          +    }
          +    else {
          +        elHeadContent.innerHTML = contentText;
          +    }
          +};
          +
          +/**
          + * If pagination is enabled, initializes paginator container elements and sets
          + * internal tracking variables.
          + *
          + * @method _initPaginator
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._initPaginator = function() {
          +    var i,j;
          +
          +    // Set up default values
          +    var paginator = {
          +        containers:[], // UI container elements
          +        rowsPerPage:500, // 500 rows
          +        currentPage:1,  // page one
          +        pageLinks:0,    // show all links
          +        pageLinksStart:1, // first link is page 1
          +        dropdownOptions:null, // no dropdown
          +        links: [], // links elements
          +        dropdowns: [] //dropdown elements
          +    };
          +    var containers = paginator.containers;
          +
          +    // Pagination configuration options
          +    if(this.paginatorOptions) {
          +        // Validate container values
          +        if(YAHOO.util.Lang.isArray(this.paginatorOptions.containers)) {
          +            for(i=0; i<containers.length; i++) {
          +                if(YAHOO.util.Dom.inDocument(containers[i])) {
          +                    containers.push(containers[i]);
          +                }
          +            }
          +        }
          +
          +        // Validate rowsPerPage value
          +        if(YAHOO.util.Lang.isNumber(this.paginatorOptions.rowsPerPage)) {
          +            paginator.rowsPerPage = this.paginatorOptions.rowsPerPage;
          +        }
          +
          +        // Validate currentPage value
          +        if(YAHOO.util.Lang.isNumber(this.paginatorOptions.currentPage)) {
          +            paginator.currentPage = this.paginatorOptions.currentPage;
          +        }
          +
          +        // Validate pageLinks value
          +        if(YAHOO.util.Lang.isNumber(this.paginatorOptions.pageLinks)) {
          +            paginator.pageLinks = this.paginatorOptions.pageLinks;
          +        }
          +
          +        // Validate pageLinksStart value
          +        if(YAHOO.util.Lang.isNumber(this.paginatorOptions.pageLinksStart)) {
          +            paginator.pageLinksStart = this.paginatorOptions.pageLinksStart;
          +        }
          +
          +        // Validate dropdownOptions value
          +        if(YAHOO.util.Lang.isArray(this.paginatorOptions.dropdownOptions)) {
          +            paginator.dropdownOptions = this.paginatorOptions.dropdownOptions;
          +        }
          +    }
          +
          +    // No containers found, create from scratch
          +    if(containers.length === 0) {
          +        // One before TABLE
          +        var pag0 = document.createElement("span");
          +        pag0.id = "yui-dt-pagcontainer0";
          +        pag0.className = YAHOO.widget.DataTable.CLASS_PAGINATOR;
          +        pag0 = this._elContainer.insertBefore(pag0, this._elTable);
          +
          +        // One after TABLE
          +        var pag1 = document.createElement("span");
          +        pag1.id = "yui-dt-pagcontainer1";
          +        pag1.className = YAHOO.widget.DataTable.CLASS_PAGINATOR;
          +        pag1 = this._elContainer.insertBefore(pag1, this._elTable.nextSibling);
          +
          +        // Add to tracker
          +        containers = [pag0, pag1];
          +    }
          +
          +    // Page links are enabled
          +    if(paginator.pageLinks > -1) {
          +        for(i=0; i<containers.length; i++) {
          +            // Create one page links container per paginator
          +            var linkEl = document.createElement("span");
          +            linkEl.id = "yui-dt-pagselect"+i;
          +            linkEl.className = YAHOO.widget.DataTable.CLASS_PAGELINKS;
          +            linkEl = containers[i].appendChild(linkEl);
          +
          +            // Add event listener
          +            YAHOO.util.Event.addListener(linkEl,"click",this._onPagerClick,this);
          +
          +             // Add to tracker
          +            paginator.links.push(linkEl);
          +       }
          +    }
          +
          +    // Dropdown enabled
          +    if(paginator.dropdownOptions) {
          +        // Show these options in the dropdown
          +        var dropdownOptions = paginator.dropdownOptions;
          +
          +        for(i=0; i<containers.length; i++) {
          +            // Create one SELECT element per Paginator container
          +            var selectEl = document.createElement("select");
          +            selectEl.className = YAHOO.widget.DataTable.CLASS_PAGESELECT;
          +            selectEl = containers[i].appendChild(selectEl);
          +
          +            // Create OPTION elements
          +            for(j=0; j<dropdownOptions.length; j++) {
          +                var optionEl = document.createElement("option");
          +                optionEl.value = dropdownOptions[j].value || dropdownOptions[j];
          +                optionEl.innerHTML = dropdownOptions[j].text || dropdownOptions[j];
          +                optionEl = selectEl.appendChild(optionEl);
          +            }
          +            
          +            // Add event listener
          +            YAHOO.util.Event.addListener(selectEl,"change",this._onPagerSelect,this);
          +
          +            // Add DOM reference to tracker
          +           paginator.dropdowns.push(selectEl);
          +        }
          +    }
          +    else {
          +        YAHOO.log("Could not create Paginator dropdown due to invalid dropdownOptions","error",this.toString());
          +    }
          +
          +    this._paginator = paginator;
          +    this._paginator.containers = containers;
          +};
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +// RECORD FUNCTIONS
          +
          +
          +
          +
          +/**
          + * Creates a new Record to add to RecordSet at position i if given, or to the
          + * end otherwise.
          + *
          + * @method _addRecords
          + * @param oData {YAHOO.widget.Record} Array of object literals containing data.
          + * @param index {Number} Index position at which to add Record.
          + * @return {String} Array of Records.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._addRecords = function(aData, index) {
          +    return this._oRecordSet.addRecords(aData);
          +};
          +
          +/**
          + * Deletes a given Record from the RecordSet.
          + *
          + * @method _deleteRecord
          + * @param identifier {Number | String} Record identifier.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._deleteRecord = function(identifier) {
          +    this._oRecordSet.deleteRecord(identifier);
          +};
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +// ROW FUNCTIONS
          +
          +
          +
          +
          +/**
          + * Add a new TR element to table body at position i if given, or to the bottom
          + * otherwise. Populates cells with data from given Record.
          + *
          + * @method _addRowEl
          + * @param oRecord {YAHOO.widget.Record} Record instance.
          + * @param index {Number} Index position at which to add TR.
          + * @return {String} ID of the added TR element.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._addRowEl = function(oRecord, index) {
          +    this.hideTableMessage();
          +
          +    // Is this an insert or an append?
          +    var insert = (!YAHOO.lang.isNumber(index) || (index < 0)) ? false : true;
          +    if(!insert || !this._elBody.rows[index]) {
          +        index = this._elBody.rows.length;
          +        insert = false;
          +    }
          +
          +    var oColumnSet = this._oColumnSet;
          +    var oRecordSet = this._oRecordSet;
          +
          +    var elRow = (insert) ?
          +        this._elBody.insertBefore(document.createElement("tr"),this._elBody.rows[index]) :
          +        this._elBody.appendChild(document.createElement("tr"));
          +    var recId = oRecord.yuiRecordId;
          +    elRow.id = this.id+"-bdrow"+index;
          +    elRow.yuiRecordId = recId;
          +
          +    // Create TBODY cells
          +    for(var j=0; j<oColumnSet.keys.length; j++) {
          +        var oColumn = oColumnSet.keys[j];
          +        var elCell = elRow.appendChild(document.createElement("td"));
          +        elCell.id = this.id+"-bdrow"+index+"-cell"+j;
          +        elCell.headers = oColumn.id;
          +        elCell.columnIndex = j;
          +        elCell.headers = oColumnSet.headers[j];
          +
          +        this.formatCell(elCell, oRecord);
          +        /*p.abx {word-wrap:break-word;}
          +ought to solve the problem for Safari (the long words will wrap in your
          +tds, instead of overflowing to the next td.
          +(this is supported by IE win as well, so hide it if needed).
          +
          +One thing, though: it doesn't work in combination with
          +'white-space:nowrap'.*/
          +
          +// need a div wrapper for safari?
          +        if(this.fixedWidth) {
          +            elCell.style.overflow = "hidden";
          +            //elCell.style.width = "20px";
          +        }
          +    }
          +
          +    // Striping
          +    //TODO: move this to somewhere useful
          +    /*if(!insert) {
          +        if(index%2) {
          +            YAHOO.util.Dom.addClass(elRow, YAHOO.widget.DataTable.CLASS_ODD);
          +        }
          +        else {
          +            YAHOO.util.Dom.addClass(elRow, YAHOO.widget.DataTable.CLASS_EVEN);
          +        }
          +    }
          +    else {
          +        //TODO: pass in a subset for better performance
          +        this._setRowStripes();
          +    }*/
          +    
          +    return elRow.id;
          +};
          +
          +/**
          + * Updates all cells of existing TR element at given position with data from the
          + * given Record.
          + *
          + * @method _updateRowEl
          + * @param oRecord {YAHOO.widget.Record} Record instance.
          + * @param index {Number} Position at which to update row.
          + * @return {String} ID of the updated TR element.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._updateRowEl = function(oRecord, index) {
          +    this.hideTableMessage();
          +
          +    var elRow = this._elBody.rows[index];
          +    elRow.yuiRecordId = oRecord.yuiRecordId;
          +
          +    // ...Update TBODY cells with new data
          +    for(var j=0; j<elRow.cells.length; j++) {
          +        this.formatCell(elRow.cells[j]);
          +    }
          +    return elRow.id;
          +};
          +
          +
          +/**
          + * Deletes a given TR element.
          + *
          + * @method _deleteRowEl
          + * @param row {HTMLElement | Number} HTML TR element reference or position index.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._deleteRowEl = function(row) {
          +    if(YAHOO.util.Dom.inDocument(row)) {
          +        row = row.sectionRowIndex;
          +    }
          +    if(YAHOO.lang.isNumber(row)) {
          +        this._elBody.deleteRow(i);
          +
          +        if(this._elBody.rows.length === 0) {
          +            this.showTableMessage(YAHOO.widget.DataTable.MSG_EMPTY, YAHOO.widget.DataTable.CLASS_EMPTY);
          +        }
          +    }
          +    else {
          +        YAHOO.log("Could not delete row " + row, "warn", this.toString());
          +    }
          +};
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +// STATE FUNCTIONS
          +
          +
          +
          +
          +/**
          + * Sets first row with class YAHOO.widget.DataTable.CLASS_FIRST.
          + *
          + * @method _setFirstRow
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._setFirstRow = function() {
          +    // Table has rows
          +    if(this._elBody.rows.length > 0) {
          +        YAHOO.util.Dom.removeClass(this.getFirstRow(),YAHOO.widget.DataTable.CLASS_FIRST);
          +        var elFirstRow = this._elBody.rows[0];
          +        YAHOO.util.Dom.addClass(elFirstRow,YAHOO.widget.DataTable.CLASS_FIRST);
          +        this._elFirstRow = elFirstRow;
          +    }
          +    else {
          +        //TODO: is this necessary?
          +        this._elFirstRow = null;
          +    }
          +};
          +
          +/**
          + * Sets last row with class YAHOO.widget.DataTable.CLASS_LAST.
          + *
          + * @method _setLastRow
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._setLastRow = function() {
          +    // Table has rows
          +    if(this._elBody.rows.length > 0) {
          +        YAHOO.util.Dom.removeClass(this.getLastRow(),YAHOO.widget.DataTable.CLASS_LAST);
          +        var elLastRow = this._elBody.rows[this._elBody.rows.length-1];
          +        YAHOO.util.Dom.addClass(elLastRow,YAHOO.widget.DataTable.CLASS_LAST);
          +        this._elLastRow = elLastRow;
          +    }
          +    else {
          +        this._elLastRow = null;
          +    }
          +};
          +
          +/**
          + * Stripes rows by applying class YAHOO.widget.DataTable.CLASS_EVEN or
          + * YAHOO.widget.DataTable.CLASS_ODD.
          + *
          + * @method _setRowStripes
          + * @param range {Number} (optional) Range defines a subset of rows to stripe.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._setRowStripes = function(range) {
          +    if(!range) {
          +        var rows = this._elBody.rows;
          +        for(var i=0; i<rows.length; i++) {
          +            if(i%2) {
          +                YAHOO.util.Dom.removeClass(rows[i], YAHOO.widget.DataTable.CLASS_EVEN);
          +                YAHOO.util.Dom.addClass(rows[i], YAHOO.widget.DataTable.CLASS_ODD);
          +            }
          +            else {
          +                YAHOO.util.Dom.removeClass(rows[i], YAHOO.widget.DataTable.CLASS_ODD);
          +                YAHOO.util.Dom.addClass(rows[i], YAHOO.widget.DataTable.CLASS_EVEN);
          +            }
          +        }
          +    }
          +    else {
          +        //TODO: allow striping of a subset of rows for performance
          +    }
          +};
          +
          +/**
          + * Sets elements to selected state. Does not fire any events. Does not affect
          + * internal tracker.
          + *
          + * @method _select
          + * @param els {HTMLElement | String | HTMLElement[] | String[]} HTML element by
          + * reference or ID string, or array of HTML elements by reference or ID string.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._select = function(els) {
          +    if(!YAHOO.lang.isArray(els)) {
          +        els = [els];
          +    }
          +
          +    for(var i=0; i<els.length; i++) {
          +        // Set the style
          +        YAHOO.util.Dom.addClass(YAHOO.util.Dom.get(els[i]),YAHOO.widget.DataTable.CLASS_SELECTED);
          +    }
          +    this._lastSelectedId = els[els.length-1].id;
          +};
          +
          +/**
          + * Sets elements to the unselected state. Does not fire any events. Does not
          + * affect internal tracker.
          + *
          + * @method _unselect
          + * @param els {HTMLElement | String | HTMLElement[] | String[]} HTMLElement by
          + * reference or ID string, or array of HTML elements by reference or ID string.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._unselect = function(els) {
          +    if(!YAHOO.lang.isArray(els)) {
          +        els = [els];
          +    }
          +    
          +    for(var i=0; i<els.length; i++) {
          +        // Remove the style
          +        YAHOO.util.Dom.removeClass(YAHOO.util.Dom.get(els[i]),YAHOO.widget.DataTable.CLASS_SELECTED);
          +    }
          +};
          +
          +/**
          + * Unselects all selected rows. Does not fire any events. Does not affect internal
          + * tracker.
          + *
          + * @method _unselectAllRows
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._unselectAllRows = function() {
          +    var selectedRows = YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.DataTable.CLASS_SELECTED,"tr",this._elBody);
          +    this._unselect(selectedRows);
          +};
          +
          +/**
          + * Unselects all selected cells.
          + *
          + * @method _unselectAllCells
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._unselectAllCells = function() {
          +    var selectedCells = YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.DataTable.CLASS_SELECTED,"td",this._elBody);
          +    this._unselect(selectedCells);
          +};
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Private DOM Event Handlers
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Handles blur events on the TABLE element.
          + *
          + * @method _onBlur
          + * @param e {HTMLEvent} The blur event.
          + * @param oSelf {YAHOO.widget.DataTable} DataTable instance.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._onBlur = function(e, oSelf) {
          +    this._bFocused = false;
          +};
          +
          +/**
          + * Handles mouseover events on the TABLE element.
          + *
          + * @method _onMouseover
          + * @param e {HTMLEvent} The mouseover event.
          + * @param oSelf {YAHOO.widget.DataTable} DataTable instance.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._onMouseover = function(e, oSelf) {
          +        var elTarget = YAHOO.util.Event.getTarget(e);
          +        var elTag = elTarget.tagName.toLowerCase();
          +        var knownTag = false;
          +
          +        if (elTag != "table") {
          +            while(!knownTag) {
          +                switch(elTag) {
          +                    case "body":
          +                        knownTag = true;
          +                        break;
          +                    case "a":
          +                        knownTag = true;
          +                        break;
          +                    case "td":
          +                        oSelf.fireEvent("cellMouseoverEvent",{target:elTarget,event:e});
          +                        knownTag = true;
          +                        break;
          +                    case "th":
          +                        oSelf.fireEvent("headCellMouseoverEvent",{target:elTarget,event:e});
          +                        knownTag = true;
          +                        break;
          +                    default:
          +                        break;
          +                }
          +                elTarget = elTarget.parentNode;
          +                if(elTarget) {
          +                    elTag = elTarget.tagName.toLowerCase();
          +                }
          +                else {
          +                    break;
          +                }
          +            }
          +        }
          +        oSelf.fireEvent("tableMouseoverEvent",{target:elTarget,event:e});
          +};
          +
          +/**
          + * Handles mouseout events on the TABLE element.
          + *
          + * @method _onMouseout
          + * @param e {HTMLEvent} The mouseout event.
          + * @param oSelf {YAHOO.widget.DataTable} DataTable instance.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._onMouseout = function(e, oSelf) {
          +        var elTarget = YAHOO.util.Event.getTarget(e);
          +        var elTag = elTarget.tagName.toLowerCase();
          +        var knownTag = false;
          +
          +        if (elTag != "table") {
          +            while(!knownTag) {
          +                switch(elTag) {
          +                    case "body":
          +                        knownTag = true;
          +                        break;
          +                    case "a":
          +                        knownTag = true;
          +                        break;
          +                    case "td":
          +                        oSelf.fireEvent("cellMouseoutEvent",{target:elTarget,event:e});
          +                        knownTag = true;
          +                        break;
          +                    case "th":
          +                        oSelf.fireEvent("headCellMouseoutEvent",{target:elTarget,event:e});
          +                        knownTag = true;
          +                        break;
          +                    default:
          +                        break;
          +                }
          +                elTarget = elTarget.parentNode;
          +                if(elTarget) {
          +                    elTag = elTarget.tagName.toLowerCase();
          +                }
          +                else {
          +                    break;
          +                }
          +            }
          +        }
          +        oSelf.fireEvent("tableMouseoutEvent",{target:elTarget,event:e});
          +};
          +
          +/**
          + * Handles mousedown events on the TABLE element.
          + *
          + * @method _onMousedown
          + * @param e {HTMLEvent} The mousedown event.
          + * @param oSelf {YAHOO.widget.DataTable} DataTable instance.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._onMousedown = function(e, oSelf) {
          +        var elTarget = YAHOO.util.Event.getTarget(e);
          +        var elTag = elTarget.tagName.toLowerCase();
          +        var knownTag = false;
          +
          +        if (elTag != "table") {
          +            while(!knownTag) {
          +                switch(elTag) {
          +                    case "body":
          +                        knownTag = true;
          +                        break;
          +                    case "a":
          +                        knownTag = true;
          +                        break;
          +                    case "td":
          +                        YAHOO.util.Event.stopEvent(e);
          +                        oSelf.fireEvent("cellMousedownEvent",{target:elTarget,event:e});
          +                        knownTag = true;
          +                        break;
          +                    case "th":
          +                        YAHOO.util.Event.stopEvent(e);
          +                        oSelf.fireEvent("headCellMousedownEvent",{target:elTarget,event:e});
          +                        knownTag = true;
          +                        break;
          +                    default:
          +                        break;
          +                }
          +                elTarget = elTarget.parentNode;
          +                if(elTarget) {
          +                    elTag = elTarget.tagName.toLowerCase();
          +                }
          +                else {
          +                    break;
          +                }
          +            }
          +        }
          +        oSelf.fireEvent("tableMousedownEvent",{target:elTarget,event:e});
          +};
          +
          +/**
          + * Handles click events on the TABLE element.
          + *
          + * @method _onClick
          + * @param e {HTMLEvent} The click event.
          + * @param oSelf {YAHOO.widget.DataTable} DataTable instance.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._onClick = function(e, oSelf) {
          +    oSelf.cancelEditorData();
          +    
          +    var elTarget = YAHOO.util.Event.getTarget(e);
          +    var elTag = elTarget.tagName.toLowerCase();
          +    var knownTag = false; // True if event should stop propagating
          +
          +    if (elTag != "table") {
          +        while(!knownTag) {
          +            switch(elTag) {
          +                case "body":
          +                    knownTag = true;
          +                    break;
          +                case "input":
          +                    if(elTarget.type.toLowerCase() == "checkbox") {
          +                        oSelf.fireEvent("checkboxClickEvent",{target:elTarget,event:e});
          +                    }
          +                    else if(elTarget.type.toLowerCase() == "radio") {
          +                        oSelf.fireEvent("radioClickEvent",{target:elTarget,event:e});
          +                    }
          +                    knownTag = true;
          +                    break;
          +                case "a":
          +                    if(!YAHOO.util.Dom.hasClass(elTarget, YAHOO.widget.DataTable.CLASS_SORTABLE)) {
          +                        knownTag = true;
          +                    }
          +                    break;
          +                case "td":
          +                    YAHOO.util.Event.stopEvent(e);
          +                    oSelf.fireEvent("cellClickEvent",{target:elTarget,event:e});
          +                    knownTag = true;
          +                    break;
          +                case "th":
          +                    YAHOO.util.Event.stopEvent(e);
          +                    oSelf.fireEvent("headCellClickEvent",{target:elTarget,event:e});
          +                    knownTag = true;
          +                    break;
          +                default:
          +                    break;
          +            }
          +            elTarget = elTarget.parentNode;
          +            elTag = elTarget.tagName.toLowerCase();
          +        }
          +    }
          +    //oSelf.focusTable();
          +    oSelf.fireEvent("tableClickEvent",{target:elTarget,event:e});
          +};
          +
          +/**
          + * Handles doubleclick events on the TABLE element.
          + *
          + * @method _onDoubleclick
          + * @param e {HTMLEvent} The doubleclick event.
          + * @param oSelf {YAHOO.widget.DataTable} DataTable instance.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._onDoubleclick = function(e, oSelf) {
          +    var elTarget = YAHOO.util.Event.getTarget(e);
          +    var elTag = elTarget.tagName.toLowerCase();
          +    var knownTag = false;
          +
          +    if (elTag != "table") {
          +        while(!knownTag) {
          +            switch(elTag) {
          +                case "body":
          +                    knownTag = true;
          +                    break;
          +                case "a":
          +                    knownTag = true;
          +                    break;
          +                case "td":
          +                    YAHOO.util.Event.stopEvent(e);
          +                    oSelf.fireEvent("cellDoubleclickEvent",{target:elTarget,event:e});
          +                    knownTag = true;
          +                    break;
          +                case "th":
          +                    YAHOO.util.Event.stopEvent(e);
          +                    oSelf.fireEvent("headCellDoubleclickEvent",{target:elTarget,event:e});
          +                    knownTag = true;
          +                    break;
          +                default:
          +                    break;
          +            }
          +            elTarget = elTarget.parentNode;
          +            elTag = elTarget.tagName.toLowerCase();
          +        }
          +    }
          +    oSelf.fireEvent("tableDoubleclickEvent",{target:elTarget,event:e});
          +};
          +
          +/**
          + * Handles keypress events on the TABLE. Mainly to support stopEvent on Mac.
          + *
          + * @method _onKeypress
          + * @param e {HTMLEvent} The key event.
          + * @param oSelf {YAHOO.widget.DataTable} DataTable instance.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._onKeypress = function(e, oSelf) {
          +    var isMac = (navigator.userAgent.toLowerCase().indexOf("mac") != -1);
          +    if(isMac) {
          +        // arrow down
          +        if(e.keyCode == 40) {
          +            YAHOO.util.Event.stopEvent(e);
          +        }
          +        // arrow up
          +        else if(e.keyCode == 38) {
          +            YAHOO.util.Event.stopEvent(e);
          +        }
          +    }
          +};
          +
          +/**
          + * Handles keydown events on the TABLE. Executes arrow selection.
          + *
          + * @method _onKeydown
          + * @param e {HTMLEvent} The key event.
          + * @param oSelf {YAHOO.widget.DataTable} DataTable instance.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._onKeydown = function(e, oSelf) {
          +    var oldSelectedId = oSelf._lastSelectedId;
          +    // Only move selection if one is already selected
          +    // TODO: config to allow selection even if one is NOT already selected
          +    // TODO: if something isn't selected already, arrow key should select first or last one
          +    if(oldSelectedId && oSelf.isSelected(oldSelectedId)) {
          +        var oldSelected = YAHOO.util.Dom.get(oldSelectedId);
          +        var newSelected;
          +        // arrow down
          +        if(e.keyCode == 40) {
          +            YAHOO.util.Event.stopEvent(e);
          +            // row mode
          +            if(oldSelected.tagName.toLowerCase() == "tr") {
          +                // We have room to move down
          +                if(oldSelected.sectionRowIndex+1 < oSelf._elBody.rows.length) {
          +                            if(!e.shiftKey || oSelf.rowSingleSelect) {
          +                                oSelf.unselectAllRows();
          +                            }
          +                            newSelected = oSelf._elBody.rows[oldSelected.sectionRowIndex+1];
          +                            oSelf.selectRow(newSelected);
          +                            
          +                }
          +            }
          +            // cell mode
          +            else if(oldSelected.tagName.toLowerCase() == "td") {
          +                /*// We have room to move down
          +                if(oldSelected.sectionRowIndex+1 < oSelf._elBody.rows.length) {
          +                            if(!e.shiftKey) {
          +                                oSelf.unselectAllRows();
          +                            }
          +                            newSelected = oSelf._elBody.rows[oldSelected.sectionRowIndex+1];
          +                            oSelf.select(newSelected);
          +                }*/
          +            }
          +            // Arrows can cause widget to lose focus
          +            //oSelf._bFocused = false;
          +            //oSelf.focusTable();
          +        }
          +        // arrow up
          +        else if(e.keyCode == 38) {
          +            YAHOO.util.Event.stopEvent(e);
          +            // row mode
          +            if(oldSelected.tagName.toLowerCase() == "tr") {
          +                // We have room to move up
          +                if((oldSelected.sectionRowIndex > 0)) {
          +                            if(!e.shiftKey || oSelf.rowSingleSelect) {
          +                                oSelf.unselectAllRows();
          +                            }
          +                            newSelected = oSelf._elBody.rows[oldSelected.sectionRowIndex-1];
          +                            oSelf.selectRow(newSelected);
          +                }
          +            }
          +            // cell mode
          +            else if(oldSelected.tagName.toLowerCase() == "td") {
          +                // We have room to move up
          +                if((oldSelected.sectionRowIndex > 0)) {
          +                            if(!e.shiftKey) {
          +                                oSelf.unselectAllRows();
          +                            }
          +                            newSelected = oSelf._elBody.rows[oldSelected.sectionRowIndex-1];
          +                            oSelf.select(newSelected);
          +                }
          +            }
          +            // Arrows can cause widget to lose focus
          +            //oSelf._bFocused = false;
          +            //oSelf.focusTable();
          +        }
          +    }
          +};
          +
          +/**
          + * Handles keyup events on the TABLE. Executes deletion
          + *
          + * @method _onKeyup
          + * @param e {HTMLEvent} The key event.
          + * @param oSelf {YAHOO.widget.DataTable} DataTable instance.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._onKeyup = function(e, oSelf) {
          +    var key = YAHOO.util.Event.getCharCode(e);
          +    // delete
          +    if(key == 46) {//TODO: && this.isFocused
          +        //TODO: delete row
          +    }
          +};
          +
          +/**
          + * Handles keydown events on the DOCUMENT. Executes interaction with editor.
          + *
          + * @method _onDocumentKeydown
          + * @param e {HTMLEvent} The key event.
          + * @param oSelf {YAHOO.widget.DataTable} DataTable instance.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._onDocumentKeydown = function(e, oSelf) {
          +    // esc Clears active editor
          +    if((e.keyCode == 27)) {
          +        oSelf.cancelEditorData();
          +    }
          +    // enter Saves active editor data
          +    if(e.keyCode == 13) {
          +        YAHOO.util.Event.stopEvent(e);
          +        oSelf.saveEditorData();
          +    }
          +};
          +
          +/**
          + * Handles click events on the DOCUMENT. Hides active editor.
          + *
          + * @method _onDocumentClick
          + * @param e {HTMLEvent} The click event.
          + * @param oSelf {YAHOO.widget.DataTable} DataTable instance.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._onDocumentClick = function(e, oSelf) {
          +    oSelf.saveEditorData();
          +};
          +
          +/**
          + * Handles click events on paginator links.
          + *
          + * @method _onPagerClick
          + * @param e {HTMLEvent} The click event.
          + * @param oSelf {YAHOO.widget.DataTable} DataTable instance.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._onPagerClick = function(e, oSelf) {
          +    oSelf.saveEditorData();
          +    
          +    var elTarget = YAHOO.util.Event.getTarget(e);
          +    var elTag = elTarget.tagName.toLowerCase();
          +    var knownTag = false; // True if event should stop propagating
          +
          +    if (elTag != "table") {
          +        while(!knownTag) {
          +            switch(elTag) {
          +                case "body":
          +                    knownTag = true;
          +                    break;
          +                case "a":
          +                    YAHOO.util.Event.stopEvent(e);
          +                    switch(elTarget.className) {
          +                        case YAHOO.widget.DataTable.CLASS_PAGELINK:
          +                            oSelf.showPage(parseInt(elTarget.innerHTML,10));
          +                            break;
          +                        case YAHOO.widget.DataTable.CLASS_FIRSTLINK:
          +                            oSelf.showPage(1);
          +                            break;
          +                        case YAHOO.widget.DataTable.CLASS_LASTLINK:
          +                            oSelf.showPage(oSelf._paginator.totalPages);
          +                            break;
          +                        case YAHOO.widget.DataTable.CLASS_PREVLINK:
          +                            oSelf.showPage(oSelf._paginator.currentPage-1);
          +                            break;
          +                        case YAHOO.widget.DataTable.CLASS_NEXTLINK:
          +                            oSelf.showPage(oSelf._paginator.currentPage+1);
          +                            break;
          +                    }
          +                    knownTag = true;
          +                    break;
          +                default:
          +                    break;
          +            }
          +            elTarget = elTarget.parentNode;
          +            if(elTarget) {
          +                elTag = elTarget.tagName.toLowerCase();
          +            }
          +            else {
          +                break;
          +            }
          +        }
          +    }
          +};
          +
          +/**
          + * Handles change events on paginator SELECT.
          + *
          + * @method _onPagerSelect
          + * @param e {HTMLEvent} The change event.
          + * @param oSelf {YAHOO.widget.DataTable} DataTable instance.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._onPagerSelect = function(e, oSelf) {
          +    var elTarget = YAHOO.util.Event.getTarget(e);
          +    var value = elTarget[elTarget.selectedIndex].value;
          +
          +    // How many rows per page
          +    var oldRowsPerPage = oSelf._paginator.rowsPerPage;
          +    var rowsPerPage = parseInt(value,10) || null;
          +    if(rowsPerPage && (rowsPerPage != oldRowsPerPage)) {
          +        if(rowsPerPage > oldRowsPerPage) {
          +            oSelf._paginator.currentPage = 1;
          +        }
          +        oSelf._paginator.rowsPerPage = rowsPerPage;
          +        oSelf.refreshTable();
          +    }
          +};
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Private Custom Event Handlers
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Handles row delete events.
          + *
          + * @method _onRowDelete
          + * @param oArgs.rowIndexes {Number[]} The indexes of the deleted rows.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._onRowDelete = function(oArgs) {
          +    this._setRowStripes();
          +};
          +
          +/**
          + * Passes along recordSetUpdate Event when recordUpdateEvent is caught from RecordSet.
          + *
          + * @event _onRecordUpdate
          + * @param oArgs.record {YAHOO.widget.Record} The Record instance.
          + * @param oArgs.key {String} The Record key.
          + * @param oArgs.newData {Object} New data.
          + * @param oArgs.oldData {Object} New data.
          + * @private
          + */
          +YAHOO.widget.DataTable.prototype._onRecordUpdate = function(oArgs) {
          +    this.fireEvent("recordSetUpdateEvent",oArgs);
          +};
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Public member variables
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * DataSource instance.
          + *
          + * @property dataSource
          + * @type YAHOO.util.DataSource
          + */
          +YAHOO.widget.DataTable.prototype.dataSource = null;
          +
          +/**
          + * Initial request to send to DataSource.
          + *
          + * @property initialRequest
          + * @type String
          + * @default ""
          + */
          +YAHOO.widget.DataTable.prototype.initialRequest = "";
          +
          +/**
          + * Defines value of CAPTION attribute.
          + *
          + * @property caption
          + * @type String
          + */
          +YAHOO.widget.DataTable.prototype.caption = null;
          +
          +/**
          + * Defines value of SUMMARY attribute.
          + *
          + * @property summary
          + * @type String
          + */
          +YAHOO.widget.DataTable.prototype.summary = null;
          +
          +/**
          + * True if DataTable's width is a fixed size.
          + *
          + * @property fixedWidth
          + * @type Boolean
          + * @default false
          + */
          +YAHOO.widget.DataTable.prototype.fixedWidth = false;
          +
          +/**
          + * True if TBODY should scroll while THEAD remains fixed.
          + *
          + * @property scrollable
          + * @type Boolean
          + * @default false
          + */
          +YAHOO.widget.DataTable.prototype.scrollable = false;
          +
          +/**
          + * True if only one row may be selected at a time.
          + *
          + * @property rowSingleSelect
          + * @type Boolean
          + * @default false
          + */
          +YAHOO.widget.DataTable.prototype.rowSingleSelect = false;
          +
          +/**
          + * ContextMenu instance.
          + *
          + * @property contextMenu
          + * @type YAHOO.widget.ContextMenu
          + */
          +YAHOO.widget.DataTable.prototype.contextMenu = null;
          +
          +/**
          + * True if built-in paginator is enabled.
          + *
          + * @property paginator
          + * @type Boolean
          + * @default false
          + */
          +YAHOO.widget.DataTable.prototype.paginator = false;
          +
          +/**
          + * Object literal of initial paginator key:value properties.
          + *
          + * @property paginatorOptions
          + * @type Object
          + * @default {}
          + */
          +/**
          + * If built-in paginator is enabled, each page will display up to the given
          + * number of rows per page. A value less than 1 will display all available
          + * rows.
          + *
          + * @property paginatorOptions.rowsPerPage
          + * @type Number
          + * @default 500
          + */
          +/**
          + * If built-in paginator is enabled, current page to display.
          + *
          + * @property paginatorOptions.currentPage
          + * @type Number
          + * @default 1
          + */
          +/**
          + * Array of container elements to hold paginator UI, if enabled. If null,
          + * 2 containers will be created dynamically, one before and one after the
          + * TABLE element.
          + *
          + * @property paginatorOptions.containers
          + * @type HTMLElement[]
          + * @default null
          + */
          +/**
          + * Values to show in the SELECT dropdown. Can be an array of numbers to populate
          + * each OPTION's value and text with the same value, or an array of object
          + * literals of syntax {value:myValue, text:myText} will populate OPTION with
          + * corresponding value and text. A null value or empty array prevents the
          + * dropdown from displayed altogether.
          + *
          + * @property paginatorOptions.dropdownOptions
          + * @type Number[] | Object{}
          + */
          +/**
          + * Maximum number of links to page numbers to show in paginator UI. Any pages
          + * not linked would be available through the next/previous style links. A 0
          + * value displays all page links. A negative value disables all page links.
          + *
          + * @property paginatorOptions.pageLinks
          + * @type Number
          + * @default 0
          + */
          +YAHOO.widget.DataTable.prototype.paginatorOptions = null;
          +
          +/**
          + * Object literal holds sort metadata:
          + *  sortedBy.colKey
          + *  sortedBy.dir
          + *
          + *
          + * @property sortedBy
          + * @type Object
          + */
          +YAHOO.widget.DataTable.prototype.sortedBy = null;
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Public methods
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +// INTERNAL ACCESSORS
          +
          +/**
          + * Public accessor to the unique name of the DataSource instance.
          + *
          + * @method toString
          + * @return {String} Unique name of the DataSource instance.
          + */
          +
          +YAHOO.widget.DataTable.prototype.toString = function() {
          +    return "DataTable " + this._sName;
          +};
          +
          +/**
          + * Returns pointer to the DataTable instance's ColumnSet instance.
          + *
          + * @method getColumnSet
          + * @return {YAHOO.widget.ColumnSet} ColumnSet instance.
          + */
          +YAHOO.widget.DataTable.prototype.getColumnSet = function() {
          +    return this._oColumnSet;
          +};
          +
          +/**
          + * Returns pointer to the DataTable instance's RecordSet instance.
          + *
          + * @method getRecordSet
          + * @return {YAHOO.widget.RecordSet} RecordSet instance.
          + */
          +YAHOO.widget.DataTable.prototype.getRecordSet = function() {
          +    return this._oRecordSet;
          +};
          +
          +/**
          + * Returns paginator object literal.
          + *
          + * @method getPaginator
          + * @return {Object} Paginator object literal with following properties:
          + *     <ul>
          + *     <li>currentPage: current page number</li>
          + *     <li>dropdownOptions: array of numbers to show in dropdown</li>
          + *     <li>elements: array of object literals that define where to show
          + *     paginator UI with following properties:
          + *         <ul>
          + *         <li>container: element reference to paginator container</li>
          + *         <li>links: element reference to page links container</li>
          + *         <li>select: element reference to dropdown</li>
          + *         </ul>
          + *     </li>
          + *     <li>pageLinks: number of page links displayed</li>
          + *     <li>pageLinkStart: page number of first link</li>
          + *     <li>rowsPerPage: number of rows displayed</li>
          + *     <li>totalPages: total number of pages</li>
          + *     </ul>
          + */
          +YAHOO.widget.DataTable.prototype.getPaginator = function() {
          +    return this._paginator;
          +};
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +// DOM ACCESSORS
          +
          +
          +
          +/**
          + * Returns element reference to TABLE.
          + *
          + * @method getTable
          + * @return {HTMLElement} Reference to TABLE element.
          + */
          +YAHOO.widget.DataTable.prototype.getTable = function() {
          +    return(this._elTable);
          +};
          +
          +/**
          + * Returns element reference to THEAD.
          + *
          + * @method getHead
          + * @return {HTMLElement} Reference to THEAD element.
          + */
          +YAHOO.widget.DataTable.prototype.getHead = function() {
          +    return(this._elHead);
          +};
          +
          +/**
          + * Returns element reference to TBODY.
          + *
          + * @method getBody
          + * @return {HTMLElement} Reference to TBODY element.
          + */
          +YAHOO.widget.DataTable.prototype.getBody = function() {
          +    return(this._elBody);
          +};
          +
          +/**
          + * Returns element reference to TR element at given index.
          + *
          + * @method getRow
          + * @param index {Number} Row number.
          + * @return {HTMLElement} Reference to TR element.
          + */
          +YAHOO.widget.DataTable.prototype.getRow = function(index) {
          +    if(YAHOO.lang.isNumber(index) && (index > -1)) {
          +        return(this._elBody.rows[index]);
          +    }
          +    return null;
          +};
          +
          +/**
          + * Returns element reference to first TR element.
          + *
          + * @method getFirstRow
          + * @return {HTMLElement} Reference to first TR element.
          + */
          +YAHOO.widget.DataTable.prototype.getFirstRow = function() {
          +    return this._elFirstRow;
          +};
          +
          +/**
          + * Returns element reference to last TR element.
          + *
          + * @method getLastRow
          + * @return {HTMLElement} Reference to last TR element.
          + */
          +YAHOO.widget.DataTable.prototype.getLastRow = function() {
          +    return this._elLastRow;
          +};
          +
          +/**
          + * Returns element reference to TD element at given row and column positions.
          + *
          + * @method getCell
          + * @param rowIndex {Number} Row index.
          + * @param colIndex {Number} Column index.
          + * @return {HTMLElement} Reference to TD element.
          + */
          +YAHOO.widget.DataTable.prototype.getCell = function(rowIndex, colIndex) {
          +    if(YAHOO.lang.isNumber(rowIndex) && YAHOO.lang.isNumber(colIndex) &&
          +            (rowIndex > -1) && (colIndex > -1)) {
          +        return(this._elBody.rows[rowIndex].cells[colIndex]);
          +    }
          +    return null;
          +};
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +// ROW FUNCTIONS
          +
          +
          +/**
          + * Convenience method to add a new row to table body at position index if given,
          + * or to the bottom otherwise.
          + *
          + * @method addRow
          + * @param oRecord {YAHOO.widget.Record} Record instance.
          + * @param index {Number} (optional) Position at which to add row.
          + */
          +YAHOO.widget.DataTable.prototype.addRow = function(oRecord, index) {
          +    if(oRecord && (oRecord instanceof YAHOO.widget.Record)) {
          +        var rowId = this._addRowEl(oRecord, index);
          +        // TODO: row may be inserted into middle... so don't set first/last
          +        if(YAHOO.lang.isNumber(index)) {
          +            if(index === 0) {
          +                this._setFirstRow();
          +            }
          +            this.fireEvent("rowInsertEvent", {rowIds:[rowId]});
          +        }
          +        else {
          +            this._setLastRow();
          +            this.fireEvent("rowAppendEvent", {rowIds:[rowId]});
          +        }
          +    }
          +};
          +
          +/**
          + * Updates existing Record and row at position index with given data.
          + *
          + * @method updateRow
          + * @param oRecord {YAHOO.widget.Record} Record instance.
          + * @param index {Number} Position at which to update row.
          + */
          +YAHOO.widget.DataTable.prototype.updateRow = function(oData, index) {
          +
          +    if(oRecord && (oRecord instanceof YAHOO.widget.Record)) {
          +        var rowId = this._updateRowEl(oRecord, index);
          +        this.fireEvent("rowUpdateEvent", {rowIds:[rowId]});
          +    }
          +};
          +
          +/**
          + * Calls delete on given rows.
          + *
          + * @method deleteRows
          + * @param elRows {HTMLElement[]} Array of HTML table row element reference.
          + */
          +YAHOO.widget.DataTable.prototype.deleteRows = function(elRows) {
          +    var rowIndexes = [];
          +    for(var i=0; i<rows.length; i++) {
          +        var rowIndex = (rows[i].sectionRowIndex !== undefined) ? rows[i].sectionRowIndex : null;
          +        rowIndexes.push(rowIndex);
          +        this._deleteRecord(rows[i].yuiRecordId);
          +        this._deleteRowEl(rows[i]);
          +        this.fireEvent("rowDeleteEvent", {rowIndexes:rowIndexes});
          +    }
          +
          +    //TODO: can be optimized?
          +    // Set first-row and last-row trackers
          +    this._setFirstRow();
          +    this._setLastRow();
          +};
          +
          +/**
          + * Deletes a given row element as well its corresponding Record in the RecordSet.
          + *
          + * @method deleteRow
          + * @param elRow {HTMLElement} HTML table row element reference.
          + */
          +YAHOO.widget.DataTable.prototype.deleteRow = function(elRow) {
          +    if(elRow && YAHOO.util.Dom.inDocument(elRow)) {
          +        var rowIndex = (elRow.sectionRowIndex !== undefined) ? elRow.sectionRowIndex : null;
          +        this._deleteRecord(elRow.yuiRecordId);
          +        this._deleteRowEl(elRow);
          +        this.fireEvent("rowDeleteEvent", {rowIndexes:[rowIndex]});
          +
          +        //TODO: can be optimized?
          +        // Set first-row and last-row trackers
          +        this._setFirstRow();
          +        this._setLastRow();
          +    }
          +
          +};
          +
          +
          +
          +
          +
          +
          +/**
          + * Add rows to bottom of table body.
          + *
          + * @method appendRows
          + * @param aRecords {YAHOO.widget.Record[]} Array of Records.
          + */
          +YAHOO.widget.DataTable.prototype.appendRows = function(aRecords) {
          +    if(YAHOO.lang.isArray(aRecords) && (aRecords.length > 0)) {
          +        this.hideTableMessage();
          +
          +        var rowIds = [];
          +        for(var i=0; i<aRecords.length; i++) {
          +            var rowId = this._addRowEl(aRecords[i]);
          +            rowIds.push(rowId);
          +        }
          +
          +        // Set last-row tracker
          +        this._setLastRow();
          +
          +        this.fireEvent("rowAppendEvent", {rowIds:rowIds});
          +    }
          +};
          +
          +/**
          + * Add rows to top of table body.
          + *
          + * @method insertRows
          + * @param aRecords {YAHOO.widget.Record[]} Array of Records.
          + */
          +YAHOO.widget.DataTable.prototype.insertRows = function(aRecords) {
          +    if(YAHOO.lang.isArray(aRecords) && (aRecords.length > 0)) {
          +        this.hideTableMessage();
          +
          +        var rowIds = [];
          +        for(var i=0; i<aRecords.length; i++) {
          +            var rowId = this._addRowEl(aRecords[i],0);
          +            rowIds.push(rowId);
          +        }
          +
          +        // Set first-row tracker
          +        this._setFirstRow();
          +
          +        this.fireEvent("rowInsertEvent", {rowIds:rowIds});
          +    }
          +};
          +
          +/**
          + * Sets a row to the selected state.
          + *
          + * @method selectRow
          + * @param row {HTMLElement | String} HTML TR element reference or ID.
          + */
          +YAHOO.widget.DataTable.prototype.selectRow = function(row) {
          +    // Validate the row
          +    row = YAHOO.util.Dom.get(row);
          +    if(row && row.yuiRecordId) {
          +        var recordId = row.yuiRecordId;
          +
          +        // Update internal tracker
          +        var tracker = this._aSelectedRecords || [];
          +        // Remove Record ID if already there...
          +        if(tracker.length > 0) {
          +            // ...using Array.indexOf if available...
          +            if(tracker.indexOf && (tracker.indexOf(recordId) > -1)) {
          +                tracker.splice(tracker.indexOf(recordId), 1);
          +            }
          +            // ...or do it the old-fashioned way
          +            else {
          +                for(var i=0; i<tracker.length; i++) {
          +                   if(tracker[i] === recordId) {
          +                        tracker.splice(i, 1);
          +                    }
          +                }
          +            }
          +        }
          +
          +        // Update UI
          +        this._select(row);
          +
          +        // Add to the end of internal tracker
          +        tracker.push(recordId);
          +        this._aSelectedRecords = tracker;
          +
          +        this.fireEvent("rowSelectEvent",{el:row, record:this._oRecordSet.getRecord(recordId)});
          +        YAHOO.log("Row selected: ID=\"" + row.id + "\", " +
          +                "Record=" + this._oRecordSet.getRecord(recordId),
          +                "info",this.toString());
          +    }
          +};
          +
          +/**
          + * Sets a row to the unselected state.
          + *
          + * @method unselectRow
          + * @param row {HTMLElement | String} HTML TR element reference or ID.
          + */
          +YAHOO.widget.DataTable.prototype.unselectRow = function(row) {
          +    // Validate the row
          +    row = YAHOO.util.Dom.get(row);
          +    if(row && row.yuiRecordId) {
          +        var recordId = row.yuiRecordId;
          +
          +        // Update internal tracker
          +        var tracker = this._aSelectedRecords || [];
          +        // Remove Record ID if there...
          +        if(tracker.length > 0) {
          +            // ...using Array.indexOf if available...
          +            if(tracker.indexOf && (tracker.indexOf(recordId) > -1)) {
          +                tracker.splice(tracker.indexOf(recordId), 1);
          +            }
          +            // ...or do it the old-fashioned way
          +            else {
          +                for(var i=0; i<tracker.length; i++) {
          +                   if(tracker[i] === recordId) {
          +                        tracker.splice(i, 1);
          +                    }
          +                }
          +            }
          +        }
          +
          +        // Update UI
          +        this._unselect(row);
          +
          +        this.fireEvent("rowUnselectEvent",{el:row, record:this._oRecordSet.getRecord(recordId)});
          +        YAHOO.log("Row unselected: ID=\"" + row.id + "\", " +
          +                "Record=" + this._oRecordSet.getRecord(recordId),
          +                "info",this.toString());
          +    }
          +};
          +
          +
          +/**
          + * Unselects all selected rows (across all pages, if applicable).
          + *
          + * @method unselectAllRows
          + */
          +YAHOO.widget.DataTable.prototype.unselectAllRows = function() {
          +    var selectedRows = YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.DataTable.CLASS_SELECTED,"tr",this._elBody);
          +    this.unselect(selectedRows);
          +    this._aSelectedRecords = [];
          +    this.fireEvent("unselectEvent", {els:selectedRows});
          +};
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +// MESSAGING
          +
          +
          +/**
          + * Displays placeholder row with a message when there are no data rows.
          + *
          + * @method showTableMessage
          + * @param sHTML {String} (optional) Value for innerHTML.
          + * @param sClassName {String} (optional) Classname.
          + */
          +YAHOO.widget.DataTable.prototype.showTableMessage = function(sHTML, sClassName) {
          +    var elCell = this._elMsgCell;
          +    if(YAHOO.lang.isString(sHTML)) {
          +        elCell.innerHTML = sHTML;
          +    }
          +    if(YAHOO.lang.isString(sClassName)) {
          +        elCell.className = sClassName;
          +    }
          +    this._elMsgBody.style.display = "";
          +};
          +
          +/**
          + * Hide placeholder message.
          + *
          + * @method hideTableMessage
          + */
          +YAHOO.widget.DataTable.prototype.hideTableMessage = function() {
          +    this._elMsgBody.style.display = "none";
          +};
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +// PAGINATION
          +
          +
          +
          +
          +
          +
          +/**
          + * Displays a specific page of a paginated DataTable.
          + *
          + * @method showPage
          + * @param nPage {Number} Which page.
          + */
          +YAHOO.widget.DataTable.prototype.showPage = function(nPage) {
          +    // Validate input
          +    if(!YAHOO.lang.isNumber(nPage) || (nPage < 1) || (nPage > this._paginator.totalPages)) {
          +        nPage = 1;
          +    }
          +    this._paginator.currentPage = nPage;
          +    this.refreshTable();
          +};
          +
          +/**
          + * Updates Paginator containers with markup. Override this method to customize pagination UI.
          + *
          + * @method formatPaginators
          + */
          + YAHOO.widget.DataTable.prototype.formatPaginators = function() {
          +    var pag = this._paginator;
          +    var i;
          +
          +    // For Opera workaround
          +    var dropdownEnabled = false;
          +    
          +    // Links are enabled
          +    if(pag.pageLinks > -1) {
          +        for(i=0; i<pag.links.length; i++) {
          +            this.formatPaginatorLinks(pag.links[i], pag.currentPage, pag.pageLinksStart, pag.pageLinks, pag.totalPages);
          +        }
          +    }
          +
          +    // Dropdown is enabled
          +    if(pag.dropdownOptions) {
          +        dropdownEnabled = true;
          +        for(i=0; i<pag.dropdowns.length; i++) {
          +            this.formatPaginatorDropdown(pag.dropdowns[i]);
          +        }
          +    }
          +
          +    // For Opera artifacting in dropdowns
          +    if(dropdownEnabled && navigator.userAgent.toLowerCase().indexOf("opera") != -1) {
          +        document.body.style += '';
          +    }
          +};
          +
          +/**
          + * Updates Paginator dropdown. If dropdown doesn't exist, the markup is created.
          + * Sets dropdown's "selected" value.
          + *
          + * @method formatPaginatorDropdown
          + * @param oElReferences {Object} Object literal of pointers to Paginator UI
          + * elements.
          + */
          +YAHOO.widget.DataTable.prototype.formatPaginatorDropdown = function(elDropdown) {
          +    if(elDropdown.options) {
          +        var options = elDropdown.options;
          +        // Update dropdown's "selected" value
          +        for(var i=options.length-1; i>-1; i--) {
          +            if((this._paginator.rowsPerPage + "") === options[i].value) {
          +                options[i].selected = true;
          +            }
          +        }
          +    }
          +    else {
          +        YAHOO.log("Could not update Paginator dropdown","error",this.toString());
          +    }
          +};
          +
          +/**
          + * Updates Paginator links container with markup.
          + *
          + * @method formatPaginatorLinks
          + */
          +YAHOO.widget.DataTable.prototype.formatPaginatorLinks = function(elContainer, nCurrentPage, nPageLinksStart, nPageLinksLength, nTotalPages) {
          +    // Markup for page links
          +    var isFirstPage = (nCurrentPage == 1) ? true : false;
          +    var isLastPage = (nCurrentPage == nTotalPages) ? true : false;
          +    var firstPageLink = (isFirstPage) ?
          +            " <span class=\"" + YAHOO.widget.DataTable.CLASS_FIRSTPAGE + "\">&lt;&lt;</span> " :
          +            " <a href=\"#\" class=\"" + YAHOO.widget.DataTable.CLASS_FIRSTLINK + "\">&lt;&lt;</a> ";
          +    var prevPageLink = (isFirstPage) ?
          +            " <span class=\"" + YAHOO.widget.DataTable.CLASS_PREVPAGE + "\">&lt;</span> " :
          +            " <a href=\"#\" class=\"" + YAHOO.widget.DataTable.CLASS_PREVLINK + "\">&lt;</a> " ;
          +    var nextPageLink = (isLastPage) ?
          +            " <span class=\"" + YAHOO.widget.DataTable.CLASS_NEXTPAGE + "\">&gt;</span> " :
          +            " <a href=\"#\" class=\"" + YAHOO.widget.DataTable.CLASS_NEXTLINK + "\">&gt;</a> " ;
          +    var lastPageLink = (isLastPage) ?
          +            " <span class=\"" + YAHOO.widget.DataTable.CLASS_LASTPAGE + "\">&gt;&gt;</span> " :
          +            " <a href=\"#\" class=\"" + YAHOO.widget.DataTable.CLASS_LASTLINK + "\">&gt;&gt;</a> ";
          +    markup = firstPageLink + prevPageLink;
          +    var maxLinks = (nPageLinksStart+nPageLinksLength < nTotalPages) ?
          +        nPageLinksStart+nPageLinksLength-1 : nTotalPages;
          +    // Special case for pageLinksLength 0 => show all links
          +    if(nPageLinksLength === 0) {
          +        maxLinks = nTotalPages;
          +    }
          +    for(var i=nPageLinksStart; i<=maxLinks; i++) {
          +         if(i != nCurrentPage) {
          +            markup += " <a href=\"#\" class=\"" + YAHOO.widget.DataTable.CLASS_PAGELINK + "\">" + i + "</a> ";
          +        }
          +        else {
          +            markup += " <span class=\"" + YAHOO.widget.DataTable.CLASS_CURRENTPAGE + "\">" + i + "</span>";
          +        }
          +    }
          +    markup += nextPageLink + lastPageLink;
          +    elContainer.innerHTML = markup;
          +};
          +
          +/**
          + * Updates Paginator internal values and UI.
          + * @method updatePaginator
          + */
          +YAHOO.widget.DataTable.prototype.updatePaginator = function() {
          +    // Paginator values must be initialized
          +    if(this._paginator === null) {
          +        this._initPaginator();
          +    }
          +
          +    // How many total Records
          +    var recordsLength = this._oRecordSet.getLength();
          +
          +    // If rowsPerPage < 1, show all rows
          +    this._paginator.rowsPerPage = (this._paginator.rowsPerPage > 0) ?
          +        this._paginator.rowsPerPage : recordsLength;
          +    var rowsPerPage = this._paginator.rowsPerPage;
          +
          +
          +    // How many rows this page
          +    var maxRows = (rowsPerPage < recordsLength) ?
          +            rowsPerPage : recordsLength;
          +
          +    // How many total pages
          +    this._paginator.totalPages = Math.ceil(recordsLength / maxRows);
          +
          +    // What is current page
          +    var currentPage = this._paginator.currentPage;
          +
          +    // First row of this page
          +    this._paginator.startRecordIndex =  (currentPage-1) * rowsPerPage;
          +
          +    // How many page links to display
          +    var pageLinksLength = this._paginator.pageLinks;
          +    // Show all links
          +    if(pageLinksLength === 0) {
          +        pageLinksLength = this._paginator.totalPages;
          +    }
          +    // Page links are enabled
          +    if(pageLinksLength > -1) {
          +        // First page link for this page
          +        this._paginator.pageLinksStart = (pageLinksLength == 1) ? currentPage :
          +                (Math.ceil(currentPage/pageLinksLength-1) * pageLinksLength) + 1;
          +    }
          +
          +    this.formatPaginators();
          +
          +    this.fireEvent("paginateEvent", {paginator:this._paginator});
          +    YAHOO.log("Currently displaying page " + currentPage + " of " +
          +            this._paginator.totalPages + " with " + rowsPerPage +
          +            " rows per page", "info", this.toString());
          +};
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +// TABLE FUNCTIONS
          +
          +/**
          + * Sets focus on the TABLE element.
          + *
          + * @method focusTable
          + */
          +YAHOO.widget.DataTable.prototype.focusTable = function() {
          +    var elTable = this._elTable;
          +    if(!this._bFocused) {
          +        // http://developer.mozilla.org/en/docs/index.php?title=Key-navigable_custom_DHTML_widgets
          +        // The timeout is necessary in both IE and Firefox 1.5, to prevent scripts from doing
          +        // strange unexpected things as the user clicks on buttons and other controls.
          +        setTimeout(function() { elTable.focus(); },0);
          +        this._bFocused = true;
          +        this.fireEvent("tableFocusEvent");
          +    }
          +};
          +
          +
          +/**
          + * Replaces all Records in RecordSet and populates TBODY rows with the
          + * new data. Blows away old data. If pagination is enabled, displays only
          + * current page, otherwise displays all rows.
          + *
          + * @method populateTable
          + * @param oData {Object | Object[]} An object literal of data or an array of
          + * object literals containing data.
          + */
          +YAHOO.widget.DataTable.prototype.populateTable = function(oData) {
          +    // Add data to RecordSet
          +    var records = this._oRecordSet.append(oData);
          +    
          +    
          +    // Update table view
          +    this.refreshTable();
          +};
          +
          +/**
          + * Refreshes table view into existing RecordSet. For performance, reuses
          + * existing rows while deleting extraneous rows.
          + *
          + * @method refreshTable
          + */
          +YAHOO.widget.DataTable.prototype.refreshTable = function() {
          +    var aRecords;
          +    
          +    // Paginator is disabled
          +    if(!this.paginator) {
          +        // Paginator must be destroyed
          +        if(this._paginator !== null) {
          +            //TODO: this.destroyPaginator();
          +        }
          +    }
          +    // Paginator is enabled
          +    if(this.paginator) {
          +        this.updatePaginator();
          +        aRecords = this._oRecordSet.getRecords(this._paginator.startRecordIndex, this._paginator.rowsPerPage);
          +    }
          +    // Show all records
          +    else {
          +        aRecords = this._oRecordSet.getRecords();
          +    }
          +
          +    if(YAHOO.lang.isArray(aRecords) && (aRecords.length > 0)) {
          +        this.hideTableMessage();
          +
          +        var elBody = this._elBody;
          +        var elRows = this._elBody.rows;
          +
          +        // Remove extra rows from the bottom so as to preserve ID order
          +        while(elBody.hasChildNodes() && (elRows.length > aRecords.length)) {
          +            elBody.deleteRow(elRows.length-1);
          +        }
          +
          +        // Unselect rows in the UI but keep tracking selected rows
          +        var selectedRecords = this.getSelectedRecordIds();
          +        if(selectedRecords.length > 0) {
          +            this._unselectAllRows();
          +        }
          +
          +        var rowIds = [];
          +        // Format in-place existing rows
          +        for(i=0; i<elRows.length; i++) {
          +            if(aRecords[i]) {
          +                rowIds.push(this._updateRowEl(aRecords[i],i));
          +            }
          +        }
          +
          +        // Add rows as necessary
          +        for(i=elRows.length; i<aRecords.length; i++) {
          +            rowIds.push(this._addRowEl(aRecords[i]));
          +        }
          +
          +        // Select any rows as necessary
          +        for(i=0; i<selectedRecords.length; i++) {
          +            var allRows = elBody.rows;
          +            for(var j=0; j<allRows.length; j++) {
          +                if(selectedRecords[i] == allRows[j].yuiRecordId) {
          +                    this._select([allRows[j]]);
          +                }
          +            }
          +        }
          +
          +        // Set first-row and last-row trackers
          +        this._setFirstRow();
          +        this._setLastRow();
          +
          +        this.fireEvent("tableRefreshEvent", {records:aRecords});
          +
          +        YAHOO.log("Table refreshed with " + aRecords.length + " rows", "info", this.toString());
          +    }
          +    else {
          +        this.showTableMessage(YAHOO.widget.DataTable.MSG_EMPTY, YAHOO.widget.DataTable.CLASS_EMPTY);
          +    }
          +};
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +// COLUMN FUNCTIONS
          +
          +
          +
          +
          +/**
          + * Sort given column.
          + *
          + * @method sortColumn
          + * @param oColumn {YAHOO.widget.Column} Column instance.
          + */
          +YAHOO.widget.DataTable.prototype.sortColumn = function(oColumn) {
          +    if(!oColumn) {
          +        return;
          +    }
          +    if(!oColumn instanceof YAHOO.widget.Column) {
          +        //TODO: accept the TH or TH.key
          +        //TODO: Figure out the column based on TH ref or TH.key
          +        return;
          +    }
          +    if(oColumn.sortable) {
          +        // What is the default sort direction?
          +        var sortDir = (oColumn.sortOptions && oColumn.sortOptions.defaultOrder) ? oColumn.sortOptions.defaultOrder : "asc";
          +
          +        //TODO: what if column doesn't have key?
          +        // Is this column sorted already?
          +        if(oColumn.key && this.sortedBy && (this.sortedBy.colKey == oColumn.key)) {
          +            if(this.sortedBy.dir) {
          +                sortDir = (this.sortedBy.dir == "asc") ? "desc" : "asc";
          +            }
          +            else {
          +                sortDir = (sortDir == "asc") ? "desc" : "asc";
          +            }
          +        }
          +        else if(!this.sortedBy) {
          +            this.sortedBy = {};
          +        }
          +
          +        // Define the sort handler function based on the direction
          +        var sortFnc = null;
          +        if((sortDir == "desc") && oColumn.sortOptions && oColumn.sortOptions.descFunction) {
          +            sortFnc = oColumn.sortOptions.descFunction;
          +        }
          +        else if((sortDir == "asc") && oColumn.sortOptions && oColumn.sortOptions.ascFunction) {
          +            sortFnc = oColumn.sortOptions.ascFunction;
          +        }
          +
          +        // Custom function was not provided so use the built-in sorter
          +        // ONLY IF column key is defined
          +        // TODO: nested/cumulative/hierarchical sorting
          +        if(!sortFnc && oColumn.key) {
          +            var sorted;
          +            sortFnc = function(a, b) {
          +                if(sortDir == "desc") {
          +                    sorted = YAHOO.util.Sort.compareDesc(a[oColumn.key],b[oColumn.key]);
          +                    if(sorted === 0) {
          +                        return YAHOO.util.Sort.compareDesc(a.id,b.id);
          +                    }
          +                    else {
          +                        return sorted;
          +                    }
          +                }
          +                else {
          +                    sorted = YAHOO.util.Sort.compareAsc(a[oColumn.key],b[oColumn.key]);
          +                    if(sorted === 0) {
          +                        return YAHOO.util.Sort.compareAsc(a.id,b.id);
          +                    }
          +                    else {
          +                        return sorted;
          +                    }
          +                }
          +            };
          +        }
          +
          +        if(sortFnc) {
          +            // Do the actual sort
          +            this._oRecordSet.sort(sortFnc);
          +
          +            // Update the UI
          +            //TODO
          +            this.refreshTable();
          +
          +            // Update classes
          +            YAHOO.util.Dom.removeClass(this.sortedBy._id,YAHOO.widget.DataTable.CLASS_SORTEDBYASC);
          +            YAHOO.util.Dom.removeClass(this.sortedBy._id,YAHOO.widget.DataTable.CLASS_SORTEDBYDESC);
          +            var newClass = (sortDir == "asc") ? YAHOO.widget.DataTable.CLASS_SORTEDBYASC : YAHOO.widget.DataTable.CLASS_SORTEDBYDESC;
          +            YAHOO.util.Dom.addClass(oColumn.getId(), newClass);
          +
          +            // Keep track of currently sorted column
          +            this.sortedBy.colKey = oColumn.key;
          +            this.sortedBy.dir = sortDir;
          +            this.sortedBy._id = oColumn.getId();
          +
          +            this.fireEvent("columnSortEvent",{column:oColumn,dir:sortDir});
          +            YAHOO.log("Column \"" + oColumn.key + "\" sorted \"" + sortDir + "\"", "info", this.toString());
          +        }
          +    }
          +    else {
          +        //TODO
          +        YAHOO.log("Column is not sortable", "info", this.toString());
          +    }
          +};
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +// CSS
          +
          +
          +
          +/**
          + * Sets one or more elements to the highlighted state.
          + *
          + * @method highlight
          + * @param els {HTMLElement | String | HTMLElement[] | String[]} HTML TR element
          + * reference, TR String ID, array of HTML TR element, or array of TR element IDs.
          + */
          +YAHOO.widget.DataTable.prototype.highlight = function(els) {
          +    if(els) {
          +        if(!YAHOO.lang.isArray(els)) {
          +            els = [els];
          +        }
          +        YAHOO.util.Dom.addClass(els,YAHOO.widget.DataTable.CLASS_HIGHLIGHT);
          +        this.fireEvent("highlightEvent",{els:els});
          +    }
          +};
          +
          +/**
          + * Sets one or more elements to the unhighlighted state.
          + *
          + * @method unhighlight
          + * @param els {HTMLElement | String | HTMLElement[] | String[]} HTML TR element
          + * reference, TR String ID, array of HTML TR element, or array of TR element IDs.
          + */
          +YAHOO.widget.DataTable.prototype.unhighlight = function(els) {
          +    if(els) {
          +        if(!YAHOO.lang.isArray(els)) {
          +            els = [els];
          +        }
          +        YAHOO.util.Dom.removeClass(els,YAHOO.widget.DataTable.CLASS_HIGHLIGHT);
          +        this.fireEvent("unhighlightEvent",{els:els});
          +    }
          +};
          +
          +
          +/**
          + * Sets one or more elements to the selected state.
          + *
          + * @method select
          + * @param els {HTMLElement | String | HTMLElement[] | String[]} HTML TR element
          + * reference, TR String ID, array of HTML TR element, or array of TR element IDs.
          + */
          +YAHOO.widget.DataTable.prototype.select = function(els) {
          +    if(els) {
          +        if(!YAHOO.lang.isArray(els)) {
          +            els = [els];
          +        }
          +        this._select(els);
          +
          +        // Add Record ID to internal tracker
          +        var tracker = this._aSelectedRecords || [];
          +        for(var i=0; i<els.length; i++) {
          +            var id = els[i].yuiRecordId;
          +            // Remove if already there
          +            // Use Array.indexOf if available...
          +            if(tracker.indexOf && (tracker.indexOf(id) >  -1)) {
          +                tracker.splice(tracker.indexOf(id),1);
          +            }
          +            // ...or do it the old-fashioned way
          +            else {
          +                for(var j=0; j<tracker.length; j++) {
          +                   if(tracker[j] === id){
          +                        tracker.splice(j,1);
          +                    }
          +                }
          +            }
          +            // Add to the end
          +            tracker.push(id);
          +        }
          +        this._aSelectedRecords = tracker;
          +        this.fireEvent("selectEvent",{els:els});
          +        YAHOO.log(els.length + " element(s) selected", "info", this.toString());
          +    }
          +};
          +
          +/**
          + * Sets one or more elements to the unselected state.
          + *
          + * @method unselect
          + * @param els {HTMLElement | String | HTMLElement[] | String[]} HTML element
          + * reference, element ID, array of HTML elements, or array of element IDs
          + */
          +YAHOO.widget.DataTable.prototype.unselect = function(els) {
          +    if(els) {
          +        if(!YAHOO.lang.isArray(els)) {
          +            els = [els];
          +        }
          +        this._unselect(els);
          +        // Remove Record ID from internal tracker
          +        var tracker = this._aSelectedRecords || [];
          +        for(var i=0; i<els.length; i++) {
          +            var id = els[i].yuiRecordId;
          +        
          +            // Use Array.indexOf if available...
          +            if(tracker.indexOf && (tracker.indexOf(id) >  -1)) {
          +                tracker.splice(tracker.indexOf(id),1);
          +            }
          +            // ...or do it the old-fashioned way
          +            else {
          +                for(var j=0; j<tracker.length; j++) {
          +                    if(tracker[j] === id){
          +                        tracker.splice(j,1);
          +                    }
          +                }
          +            }
          +        }
          +        this._aSelectedRecords = tracker;
          +        this.fireEvent("unselectEvent",{els:els});
          +        YAHOO.log(els.length + " element(s) unselected", "info", this.toString());
          +    }
          +};
          +
          +/**
          + * Unselects all selected cells.
          + *
          + * @method unselectAllCells
          + */
          +YAHOO.widget.DataTable.prototype.unselectAllCells = function() {
          +    var selectedCells = YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.DataTable.CLASS_SELECTED,"td",this._elBody);
          +    this.unselect(selectedCells);
          +    this.fireEvent("unselectEvent", {els:selectedCells});
          +};
          +
          +
          +/**
          + * Returns true if given element is select, false otherwise.
          + *
          + * @method isSelected
          + * @param el {HTMLElement} HTML element reference or ID.
          + * @return {Boolean} True if element is selected.
          + */
          +YAHOO.widget.DataTable.prototype.isSelected = function(el) {
          +    return YAHOO.util.Dom.hasClass(el,YAHOO.widget.DataTable.CLASS_SELECTED);
          +};
          +
          +/**
          + * Returns array of selected Record IDs.
          + *
          + * @method getSelectedRecordIds
          + * @return {HTMLElement[]} Array of selected TR elements.
          + */
          +YAHOO.widget.DataTable.prototype.getSelectedRecordIds = function() {
          +    return this._aSelectedRecords || [];
          +};
          +
          +/**
          + * Returns array of selected rows.
          + *
          + * @method getSelectedRows
          + * @return {HTMLElement[]} Array of selected TR elements.
          + */
          +YAHOO.widget.DataTable.prototype.getSelectedRows = function() {
          +    //TODO: keep internal array if this is non performant
          +    return YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.DataTable.CLASS_SELECTED,"tr",this._elBody);
          +};
          +
          +/**
          + * Returns array of selected TD cells.
          + *
          + * @method getSelectedCells
          + * @return {HTMLElement[]} Array of selected TD elements.
          + */
          +YAHOO.widget.DataTable.prototype.getSelectedCells = function() {
          +    //TODO: keep internal array
          +    return YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.DataTable.CLASS_SELECTED,"td",this._elBody);
          +};
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +// ABSTRACT
          +
          +
          +
          +/**
          + * Overridable method gives implementers a hook to access data before
          + * it gets added to RecordSet and rendered to the TBODY.
          + *
          + * @method doBeforeLoadData
          + * @param sRequest {String} Original request.
          + * @param oResponse {Object} Response object.
          + * @return {Boolean} Return true to continue loading data into RecordSet and
          + * updating DataTable with new Records, false to cancel.
          + */
          +YAHOO.widget.DataTable.prototype.doBeforeLoadData = function(sRequest, oResponse) {
          +    return true;
          +};
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +// CELL FUNCTIONS
          +
          +/**
          + * Shows editor for given cell.
          + *
          + * @method editCell
          + * @param elCell {HTMLElement} Cell element to edit.
          + */
          +YAHOO.widget.DataTable.prototype.editCell = function(elCell) {
          +    if(elCell && YAHOO.lang.isNumber(elCell.columnIndex)) {
          +        var column = this._oColumnSet.keys[elCell.columnIndex];
          +        if(column && column.editor) {
          +            this.activeEditor = column.getEditor(elCell,this._oRecordSet.getRecord(elCell.parentNode.yuiRecordId));
          +            this._bFocused = true;
          +            if(this.activeEditor) {
          +                // Explicitly call unhighlight for SF2
          +                if(YAHOO.util.Dom.hasClass(elCell, YAHOO.widget.DataTable.CLASS_HIGHLIGHT)) {
          +                    this.unhighlight(elCell);
          +                }
          +                this.fireEvent("editorShowEvent",{target:elCell,column:column});
          +                YAHOO.log("Editor \"" + this.activeEditor.type + "\" activated for cell \"" + elCell.id + "\"", "info", this.toString());
          +            }
          +        }
          +    }
          +};
          +
          +/**
          + * Hides active editor, not saving any data.
          + *
          + * @method cancelEditorData
          + */
          +YAHOO.widget.DataTable.prototype.cancelEditorData = function() {
          +    if(this.activeEditor) {
          +        this.activeEditor.hide();
          +        this.activeEditor = null;
          +
          +        // Editor causes widget to lose focus
          +        //oSelf._bFocused = false;
          +        //oSelf.focusTable();
          +
          +        //TODO: need an event here
          +    }
          +};
          +
          +/**
          + * Saves data in active editor.
          + *
          + * @method saveEditorData
          + */
          +YAHOO.widget.DataTable.prototype.saveEditorData = function() {
          +    if(this.activeEditor) {
          +        var elCell = this.activeEditor.cell;
          +        var oColumn = this.activeEditor.column;
          +        var oRecord = this.activeEditor.record;
          +        var oldValue = oRecord[oColumn.key];
          +        var newValue = this.activeEditor.getValue();
          +
          +        if(YAHOO.util.Lang.isString(oColumn.key)) {
          +            // Update Record field
          +            this._oRecordSet.updateRecordField(oRecord,oColumn.key,newValue);
          +
          +            //Update cell
          +            this.formatCell(elCell);
          +        }
          +        else {
          +            YAHOO.log("Could not save edit due to invalid Column key", "warn", this.toString());
          +        }
          +
          +        // Hide editor
          +        this.activeEditor.hide();
          +        this.activeEditor = null;
          +
          +        // Editor causes widget to lose focus
          +        //this._bFocused = false;
          +        //this.focusTable();
          +        this.fireEvent("cellEditEvent",{target:elCell,oldData:oldValue,newData:newValue});
          +    }
          +};
          +
          +/**
          + * Formats given cell.
          + *
          + * @method formatCell
          + * @param elCell {HTMLElement} Cell element to format.
          + */
          +YAHOO.widget.DataTable.prototype.formatCell = function(elCell) {
          +    if(elCell && YAHOO.lang.isNumber(elCell.columnIndex)) {
          +        var index = elCell.columnIndex;
          +        var column = this._oColumnSet.keys[index];
          +        column.format(elCell,this._oRecordSet.getRecord(elCell.parentNode.yuiRecordId));
          +        if (index === 0) {
          +            YAHOO.util.Dom.addClass(elCell,YAHOO.widget.DataTable.CLASS_FIRST);
          +        }
          +        else if (index === this._oColumnSet.keys.length-1) {
          +            YAHOO.util.Dom.addClass(elCell,YAHOO.widget.DataTable.CLASS_LAST);
          +        }
          +        this.fireEvent("cellFormatEvent", {el:elCell});
          +    }
          +};
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Public Custom Event Handlers
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Overridable custom event handler to sort column.
          + *
          + * @method onEventSortColumn
          + * @param oArgs.event {HTMLEvent} Event object.
          + * @param oArgs.target {HTMLElement} Target element.
          + */
          +YAHOO.widget.DataTable.prototype.onEventSortColumn = function(oArgs) {
          +    var evt = oArgs.event;
          +    var target = oArgs.target;
          +    YAHOO.util.Event.stopEvent(evt);
          +    
          +    //TODO: traverse DOM to find a columnIndex, incl safety net if none exists
          +    if(YAHOO.lang.isNumber(target.columnIndex)) {
          +        this.sortColumn(this._oColumnSet.keys[target.columnIndex]);
          +    }
          +    else {
          +        //TODO: support sort on parent of nested header
          +        YAHOO.log("Could not sort due to invalid column","warn",this.toString());
          +    }
          +};
          +
          +/**
          + * Overridable custom event handler to select row according to desktop paradigm.
          + *
          + * @method onEventSelectRow
          + * @param oArgs.event {HTMLEvent} Event object.
          + * @param oArgs.target {HTMLElement} Target element.
          + */
          +YAHOO.widget.DataTable.prototype.onEventSelectRow = function(oArgs) {
          +    var evt = oArgs.event;
          +    var elTarget = oArgs.target;
          +    var elTag = elTarget.tagName.toLowerCase();
          +    var bSingleSelect = this.rowSingleSelect;
          +    var bSHIFT = evt.shiftKey;
          +    var bCTRL = evt.ctrlKey;
          +    var i;
          +
          +    // Traverse up the DOM to find the row
          +    while(elTag != "tr") {
          +        // Bail out
          +        if(elTag == "body") {
          +            return;
          +        }
          +        // Maybe it's the parent
          +        elTarget = elTarget.parentNode;
          +        elTag = elTarget.tagName.toLowerCase();
          +    }
          +    var sTargetId = elTarget.id;
          +    var rows = this._elBody.rows;
          +    var anchor = YAHOO.util.Dom.get(this._selectRowAnchorId);
          +    var anchorIndex;
          +    var targetIndex = elTarget.sectionRowIndex;
          +
          +    // Both SHIFT and CTRL
          +    if(!bSingleSelect && bSHIFT && bCTRL) {
          +        // Validate anchor
          +        if(anchor) {
          +            anchorIndex = anchor.sectionRowIndex;
          +            if(this.isSelected(YAHOO.util.Dom.get(this._selectRowAnchorId))) {
          +                // Select all rows between anchor row and target row, inclusive
          +                if(anchorIndex < targetIndex) {
          +                    for(i=anchorIndex+1; i<=targetIndex; i++) {
          +                        if(!this.isSelected(rows[i])) {
          +                            this.selectRow(rows[i]);
          +                        }
          +                    }
          +                }
          +                // Select from target to anchor
          +                else {
          +                    for(i=targetIndex; i<=anchorIndex-1; i++) {
          +                        if(!this.isSelected(rows[i])) {
          +                            this.selectRow(rows[i]);
          +                        }
          +                    }
          +                }
          +            }
          +            else {
          +                // Unselect all rows between anchor row and target row, exclusive
          +                if(anchorIndex < targetIndex) {
          +                    for(i=anchorIndex+1; i<=targetIndex-1; i++) {
          +                        if(this.isSelected(rows[i])) {
          +                            this.unselectRow(rows[i]);
          +                        }
          +                    }
          +                }
          +                // Select from target to anchor
          +                else {
          +                    for(i=targetIndex+1; i<=anchorIndex-1; i++) {
          +                        if(this.isSelected(rows[i])) {
          +                            this.unselectRow(rows[i]);
          +                        }
          +                    }
          +                }
          +                this.select(elTarget);
          +            }
          +        }
          +        // Invalid anchor
          +        else {
          +            // Set anchor
          +            this._selectRowAnchorId = sTargetId;
          +            
          +            // Toggle selection of target
          +            if(this.isSelected(elTarget)) {
          +                this.unselect(elTarget);
          +            }
          +            else {
          +                this.select(elTarget);
          +            }
          +        }
          +    }
          +    // Only SHIFT
          +    else if(!bSingleSelect && bSHIFT) {
          +        this.unselectAllRows();
          +
          +        // Validate anchor
          +        if(anchor) {
          +            anchorIndex = anchor.sectionRowIndex;
          +            
          +            // Select all rows between anchor row and target row inclusive
          +            if(anchorIndex < targetIndex) {
          +                for(i=anchorIndex; i<=targetIndex; i++) {
          +                    this.selectRow(rows[i]);
          +                }
          +            }
          +            // Select from target to anchor
          +            else {
          +                for(i=targetIndex; i<=anchorIndex; i++) {
          +                    this.selectRow(rows[i]);
          +                }
          +            }
          +        }
          +        // Invalid anchor
          +        else {
          +            // Set anchor
          +            this._selectRowAnchorId = sTargetId;
          +            
          +            // Select target only
          +            this.selectRow(elTarget);
          +        }
          +    }
          +    // Only CTRL
          +    else if(!bSingleSelect && bCTRL) {
          +        // Set anchor
          +        this._selectRowAnchorId = sTargetId;
          +        
          +        // Toggle selection of target
          +        if(this.isSelected(elTarget)) {
          +            this.unselect(elTarget);
          +        }
          +        else {
          +            this.select(elTarget);
          +        }
          +    }
          +    // Neither SHIFT nor CTRL
          +    else if(bSingleSelect) {
          +        this.unselect(this._lastSelectedId);
          +        this.select(elTarget);
          +    }
          +    // Neither SHIFT nor CTRL
          +    else {
          +        // Set anchor
          +        this._selectRowAnchorId = sTargetId;
          +        
          +        // Select only target
          +        this.unselectAllRows();
          +        this.selectRow(elTarget);
          +    }
          +};
          +
          +/**
          + * Overridable custom event handler to select cell.
          + *
          + * @method onEventSelectCell
          + * @param oArgs.event {HTMLEvent} Event object.
          + * @param oArgs.target {HTMLElement} Target element.
          + */
          +YAHOO.widget.DataTable.prototype.onEventSelectCell = function(oArgs) {
          +    var evt = oArgs.event;
          +    var target = oArgs.target;
          +    var elTag = target.tagName.toLowerCase();
          +
          +    // Walk up the DOM until we get to the TD
          +    while(elTag != "td") {
          +        // Bail out
          +        if(elTag == "body") {
          +            return;
          +        }
          +        
          +        target = target.parentNode;
          +        elTag = target.tagName.toLowerCase();
          +    }
          +
          +    if(this.isSelected(target)) {
          +        this.unselect(target);
          +    }
          +    else {
          +        if(this.rowSingleSelect && !evt.ctrlKey) {
          +            this.unselectAllCells();
          +        }
          +        this.select(target);
          +    }
          +};
          +
          +/**
          + * Overridable custom event handler to format cell.
          + *
          + * @method onEventFormatCell
          + * @param oArgs.event {HTMLEvent} Event object.
          + * @param oArgs.target {HTMLElement} Target element.
          + */
          +YAHOO.widget.DataTable.prototype.onEventFormatCell = function(oArgs) {
          +    var evt = oArgs.event;
          +    var target = oArgs.target;
          +    var elTag = target.tagName.toLowerCase();
          +
          +    // Walk up the DOM until we get to the TD
          +    while(elTag != "td") {
          +        // Bail out
          +        if(elTag == "body") {
          +            return;
          +        }
          +
          +        target = target.parentNode;
          +        elTag = target.tagName.toLowerCase();
          +    }
          +
          +    this.formatCell(target);
          +};
          +
          +/**
          + * Overridable custom event handler to highlight cell.
          + *
          + * @method onEventHighlightCell
          + * @param oArgs.event {HTMLEvent} Event object.
          + * @param oArgs.target {HTMLElement} Target element.
          + */
          +YAHOO.widget.DataTable.prototype.onEventHighlightCell = function(oArgs) {
          +    var evt = oArgs.event;
          +    var target = oArgs.target;
          +    var elTag = target.tagName.toLowerCase();
          +
          +    // Walk up the DOM until we get to the TD
          +    while(elTag != "td") {
          +        // Bail out
          +        if(elTag == "body") {
          +            return;
          +        }
          +
          +        target = target.parentNode;
          +        elTag = target.tagName.toLowerCase();
          +    }
          +
          +    this.highlight(target);
          +};
          +
          +/**
          + * Overridable custom event handler to unhighlight cell.
          + *
          + * @method onEventUnhighlightCell
          + * @param oArgs.event {HTMLEvent} Event object.
          + * @param oArgs.target {HTMLElement} Target element.
          + */
          +YAHOO.widget.DataTable.prototype.onEventUnhighlightCell = function(oArgs) {
          +    var evt = oArgs.event;
          +    var target = oArgs.target;
          +    var elTag = target.tagName.toLowerCase();
          +
          +    // Walk up the DOM until we get to the TD
          +    while(elTag != "td") {
          +        // Bail out
          +        if(elTag == "body") {
          +            return;
          +        }
          +
          +        target = target.parentNode;
          +        elTag = target.tagName.toLowerCase();
          +    }
          +
          +    this.unhighlight(target);
          +};
          +/**
          + * Overridable custom event handler to edit cell.
          + *
          + * @method onEventEditCell
          + * @param oArgs.event {HTMLEvent} Event object.
          + * @param oArgs.target {HTMLElement} Target element.
          + */
          +YAHOO.widget.DataTable.prototype.onEventEditCell = function(oArgs) {
          +    var evt = oArgs.event;
          +    var target = oArgs.target;
          +    var elTag = target.tagName.toLowerCase();
          +
          +    // Walk up the DOM until we get to the TD
          +    while(elTag != "td") {
          +        // Bail out
          +        if(elTag == "body") {
          +            return;
          +        }
          +
          +        target = target.parentNode;
          +        elTag = target.tagName.toLowerCase();
          +    }
          +
          +    this.editCell(target);
          +};
          +
          +/**
          + * Calls populateTable() with new data.
          + *
          + * @method onDataReturnPopulateTable
          + * @param sRequest {String} Original request.
          + * @param oResponse {Object} Response object.
          + * @param bError {Boolean} (optional) True if there was a data error.
          + */
          +YAHOO.widget.DataTable.prototype.onDataReturnPopulateTable = function(sRequest, oResponse) {
          +    this.fireEvent("dataReturnEvent", {request:sRequest,response:oResponse});
          +
          +    var ok = this.doBeforeLoadData(sRequest, oResponse);
          +    if(ok && oResponse && !oResponse.error && YAHOO.lang.isArray(oResponse.results)) {
          +        // Populate table with data
          +        this.populateTable(oResponse.results);
          +    }
          +    else if(oResponse.error) {
          +        this.showTableMessage(YAHOO.widget.DataTable.MSG_ERROR, YAHOO.widget.DataTable.CLASS_ERROR);
          +    }
          +    else {
          +        this.showTableMessage(YAHOO.widget.DataTable.MSG_EMPTY, YAHOO.widget.DataTable.CLASS_EMPTY);
          +    }
          +};
          +
          +/**
          + * Add new data to end of table.
          + *
          + * @method onDataReturnAppendRows
          + * @param sRequest {String} Original request.
          + * @param oResponse {Object} Response object.
          + * @param bError {Boolean} (optional) True if there was a data error.
          + */
          +YAHOO.widget.DataTable.prototype.onDataReturnAppendRows = function(sRequest, oResponse) {
          +    this.fireEvent("dataReturnEvent", {request:sRequest,response:oResponse});
          +    
          +    var ok = this.doBeforeLoadData(sRequest, oResponse);
          +    if(ok && oResponse && !oResponse.error && YAHOO.lang.isArray(oResponse.results)) {
          +        // Update the RecordSet from the response
          +        var newRecords = this._addRecords(oResponse.results);
          +        if(newRecords) {
          +            // Update markup
          +            this.appendRows(newRecords);
          +            YAHOO.log("Data returned for " + newRecords.length + " rows","info",this.toString());
          +        }
          +    }
          +    else {
          +        //TODO
          +    }
          +};
          +
          +/**
          + * Handles data return for inserting new rows to top of table.
          + *
          + * @method onDataReturnInsertRows
          + * @param sRequest {String} Original request.
          + * @param oResponse {Object} Response object.
          + * @param bError {Boolean} (optional) True if there was a data error.
          + */
          +YAHOO.widget.DataTable.prototype.onDataReturnInsertRows = function(sRequest, oResponse) {
          +    this.fireEvent("dataReturnEvent", {request:sRequest,response:oResponse});
          +    
          +    var ok = this.doBeforeLoadData(sRequest, oResponse, bError);
          +    if(ok && oResponse && !oResponse.error && YAHOO.lang.isArray(oResponse.results)) {
          +        // Update the RecordSet from the response
          +        var newRecords = this._oRecordSet.insert(oResponse.results);
          +        if(newRecords) {
          +            // Update markup
          +            this.insertRows(newRecords);
          +            YAHOO.log("Data returned for " + newRecords.length + " rows","info",this.toString());
          +        }
          +    }
          +    else {
          +        //TODO
          +    }
          +};
          +
          +/**
          + * Handles data return for replacing all existing of table with new rows.
          + *
          + * @method onDataReturnReplaceRows
          + * @param sRequest {String} Original request.
          + * @param oResponse {Object} Response object.
          + * @param bError {Boolean} (optional) True if there was a data error.
          + */
          +YAHOO.widget.DataTable.prototype.onDataReturnReplaceRows = function(sRequest, oResponse) {
          +    this.fireEvent("dataReturnEvent", {request:sRequest,response:oResponse});
          +    
          +    var ok = this.doBeforeLoadData(sRequest, oResponse, bError);
          +    if(ok && oResponse && !oResponse.error && YAHOO.lang.isArray(oResponse.results)) {
          +        // Update the RecordSet from the response
          +        var newRecords = this._oRecordSet.replace(oResponse.results);
          +        if(newRecords) {
          +            this.replaceRows(newRecords);
          +            YAHOO.log("Data returned for " + newRecords.length + " rows","info",this.toString());
          +        }
          +    }
          +    else {
          +    
          +    }
          +};
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Deprecated
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * @deprecated No longer used.
          + * @property isEmpty
          + */
          +/**
          + * @deprecated No longer used.
          + * @property isLoading
          + */
          + /**
          + * @deprecated Deprecated. Please use showTableMessage().
          + * @method showEmptyMessage
          + */
          +/**
          + * @deprecated Deprecated. Please use showTableMessage().
          + * @method showLoadingMessage
          + */
          +/**
          + * @deprecated Deprecated. Please use hideTableMessage().
          + * @method hideTableMessages
          + */
          +/**
          + * @deprecated Deprecated. Please use paginatorOptions.startRecordIndex.
          + * @property startRecordIndex
          + */
          +/**
          + * @deprecated Deprecated. Please use paginatorOptions.pageLinksStart.
          + * @property pageLinksStart
          + */
          +/**
          + * @deprecated Deprecated. Please use paginatorOptions.currentPage
          + * @property pageCurrent
          + */
          +/**
          + * @deprecated Deprecated. Please use paginatorOptions.rowsPerPage
          + * @property rowsPerPage
          + */
          +/**
          + * @deprecated Deprecated. Please use paginatorOptions.pageLinks
          + * @property pageLinksLength
          + */
          +/**
          + * @deprecated Deprecated. Please use paginatorOptions.dropdownOptions
          + * @property rowsPerPageDropdown
          + */
          +/**
          + * @deprecated Deprecated. Please use paginatorOptions.containers
          + * @property pagers
          + */
          +/**
          + * @deprecated Deprecated in favor of populateTable().
          + * @method populateTable
          + */
          + /**
          + * @deprecated Deprecated. Please use onDataReturnPopulateTable().
          + * @method onDataReturnPaginateRows
          + */
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/DateMath.js.html b/www/extras/yui/docs/DateMath.js.html new file mode 100644 index 000000000..b7540d47c --- /dev/null +++ b/www/extras/yui/docs/DateMath.js.html @@ -0,0 +1,383 @@ + + + + API: calendar DateMath.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Calendar  2.2.2

          +

          + Yahoo! UI Library + > calendar + + > DateMath.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +* YAHOO.widget.DateMath is used for simple date manipulation. The class is a static utility
          +* used for adding, subtracting, and comparing dates.
          +* @namespace YAHOO.widget
          +* @class 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 12 noon.
          +	* @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;
          +	}
          +};
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Dialog.js.html b/www/extras/yui/docs/Dialog.js.html new file mode 100644 index 000000000..52e531ffa --- /dev/null +++ b/www/extras/yui/docs/Dialog.js.html @@ -0,0 +1,937 @@ + + + + API: container Dialog.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + + > Dialog.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +* 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 = "yui-dialog";
          +
          +/**
          +* Constant representing the name of the Dialog's events
          +* @property YAHOO.widget.Dialog._EVENT_TYPES
          +* @private
          +* @final
          +* @type Object
          +*/
          +YAHOO.widget.Dialog._EVENT_TYPES = {
          +
          +	"BEFORE_SUBMIT": "beforeSubmit",
          +	"SUBMIT": "submit",
          +	"MANUAL_SUBMIT": "manualSubmit",
          +	"ASYNC_SUBMIT": "asyncSubmit",
          +	"FORM_SUBMIT": "formSubmit",
          +	"CANCEL": "cancel"
          +
          +};
          +
          +/**
          +* Constant representing the Dialog's configuration properties
          +* @property YAHOO.widget.Dialog._DEFAULT_CONFIG
          +* @private
          +* @final
          +* @type Object
          +*/
          +YAHOO.widget.Dialog._DEFAULT_CONFIG = {
          +
          +	"POST_METHOD": { 
          +	   key: "postmethod", 
          +	   value: "async" 
          +    },
          +
          +	"BUTTONS": { 
          +	   key: "buttons", 
          +	   value: "none" 
          +    }
          +
          +};
          +
          +/**
          +* 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 //
          +	
          +	var DEFAULT_CONFIG = YAHOO.widget.Dialog._DEFAULT_CONFIG;
          +	
          +	/**
          +	* 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(
          +	           DEFAULT_CONFIG.POST_METHOD.key, 
          +                {
          +                    handler: this.configPostMethod, 
          +                    value: DEFAULT_CONFIG.POST_METHOD.value, 
          +                    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(
          +	           DEFAULT_CONFIG.BUTTONS.key,
          +	           {
          +	               handler: this.configButtons,
          +	               value: DEFAULT_CONFIG.BUTTONS.value
          +               }
          +           );	
          +	
          +};
          +
          +/**
          +* 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);
          +
          +    var EVENT_TYPES = YAHOO.widget.Dialog._EVENT_TYPES;
          +
          +	/**
          +	* CustomEvent fired prior to submission
          +	* @event beforeSumitEvent
          +	*/	
          +	this.beforeSubmitEvent	= new YAHOO.util.CustomEvent(EVENT_TYPES.BEFORE_SUBMIT, this);
          +	
          +	/**
          +	* CustomEvent fired after submission
          +	* @event submitEvent
          +	*/
          +	this.submitEvent		= new YAHOO.util.CustomEvent(EVENT_TYPES.SUBMIT, this);
          +
          +	/**
          +	* CustomEvent fired prior to manual submission
          +	* @event manualSubmitEvent
          +	*/
          +	this.manualSubmitEvent	= new YAHOO.util.CustomEvent(EVENT_TYPES.MANUAL_SUBMIT, this);
          +
          +	/**
          +	* CustomEvent fired prior to asynchronous submission
          +	* @event asyncSubmitEvent
          +	*/	
          +	this.asyncSubmitEvent	= new YAHOO.util.CustomEvent(EVENT_TYPES.ASYNC_SUBMIT, this);
          +
          +	/**
          +	* CustomEvent fired prior to form-based submission
          +	* @event formSubmitEvent
          +	*/
          +	this.formSubmitEvent	= new YAHOO.util.CustomEvent(EVENT_TYPES.FORM_SUBMIT, this);
          +
          +	/**
          +	* CustomEvent fired after cancel
          +	* @event cancelEvent
          +	*/
          +	this.cancelEvent		= new YAHOO.util.CustomEvent(EVENT_TYPES.CANCEL, this);
          +};
          +
          +/**
          +* 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.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;
          +	}
          +};
          +
          +/**
          +* @method _onFormKeyDown
          +* @description "keydown" event handler for the dialog's form.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +YAHOO.widget.Dialog.prototype._onFormKeyDown = function(p_oEvent) {
          +
          +    var oTarget = YAHOO.util.Event.getTarget(p_oEvent),
          +        nCharCode = YAHOO.util.Event.getCharCode(p_oEvent);
          +
          +    if (
          +        nCharCode == 13 && 
          +        oTarget.tagName && 
          +        oTarget.tagName.toUpperCase() == "INPUT"
          +    ) {
          +
          +        var sType = oTarget.type;
          +
          +        if(
          +            sType == "text" || sType == "password" || sType == "checkbox" || 
          +            sType == "radio" || sType == "file"
          +        ) {
          +
          +            // Fire the "click" event on the dialog's default button
          +            this.defaultHtmlButton.click();
          +        
          +        }
          +
          +    }
          +
          +};
          +
          +/**
          +* 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 && ! el.disabled) {
          +				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 && ! el.disabled) {
          +				if (el.type && el.type != "hidden") {
          +					return el;
          +				}
          +			}
          +		}
          +		return null;
          +	}();
          +
          +	this.form = form;
          +
          +    if(this.form && (this.browser == "ie" || this.browser == "ie7" || this.browser == "gecko")) {
          +
          +        YAHOO.util.Event.addListener(this.form, "keydown", this._onFormKeyDown, null, this);
          +    
          +    }
          +
          +
          +	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 fired when the "close" property is changed. The method controls the appending or hiding of the close icon at the top right of the Dialog.
          +* @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.Dialog.prototype.configClose = function(type, args, obj) {
          +	var val = args[0];
          +
          +	var doCancel = function(e, obj) {
          +		obj.cancel();
          +	};
          +
          +	if (val) {
          +		if (! this.close) {
          +			this.close = document.createElement("div");
          +			YAHOO.util.Dom.addClass(this.close, "container-close");
          +
          +			this.close.innerHTML = "&#160;";
          +			this.innerElement.appendChild(this.close);
          +			YAHOO.util.Event.addListener(this.close, "click", doCancel, this);
          +		} else {
          +			this.close.style.display = "block";
          +		}
          +	} else {
          +		if (this.close) {
          +			this.close.style.display = "none";
          +		}
          +	}
          +};
          +
          +/**
          +* 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();
          +		}
          +	}
          +};
          +
          +/**
          +* The default event handler for the "postmethod" configuration property
          +* @method configPostMethod
          +* @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.configPostMethod = function(type, args, obj) {
          +	var postmethod = args[0];
          +
          +	this.registerForm();
          +	YAHOO.util.Event.addListener(this.form, "submit", function(e) {
          +														YAHOO.util.Event.stopEvent(e);
          +														this.submit();
          +														this.form.blur();
          +													  }, this, true);
          +};
          +
          +// 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 oForm = this.form;
          +
          +    if(oForm) {
          +
          +        var aElements = oForm.elements,
          +            nTotalElements = aElements.length,
          +            oData = {},
          +            sName,
          +            oElement,
          +            nElements;
          +
          +        for(var i=0; i<nTotalElements; i++) {
          +
          +            sName = aElements[i].name;
          +
          +            function isFormElement(p_oElement) {
          +            
          +                var sTagName = p_oElement.tagName.toUpperCase();
          +                
          +                return (
          +                    (
          +                        sTagName == "INPUT" || 
          +                        sTagName == "TEXTAREA" || 
          +                        sTagName == "SELECT"
          +                    ) && 
          +                    p_oElement.name == sName
          +                );
          +
          +            }
          +
          +            /*
          +                Using "YAHOO.util.Dom.getElementsBy" to safeguard
          +                user from JS errors that result from giving a form field (or 
          +                set of fields) the same name as a native method of a form 
          +                (like "submit") or a DOM collection (such as the "item" method).
          +                Originally tried accessing fields via the "namedItem" method of 
          +                the "element" collection, but discovered that it won't return
          +                a collection of fields in Gecko.
          +            */
          +
          +            oElement = YAHOO.util.Dom.getElementsBy(isFormElement, "*", oForm);
          +            nElements = oElement.length;
          +
          +            if(nElements > 0) {
          +
          +                if(nElements == 1) {
          +
          +                    oElement = oElement[0];
          +
          +                    var sType = oElement.type,
          +                        sTagName = oElement.tagName.toUpperCase();
          +
          +                    switch(sTagName) {
          +
          +                        case "INPUT":
          +
          +                            if(sType == "checkbox") {
          +
          +                                oData[sName] = oElement.checked;
          +
          +                            }
          +                            else if(sType != "radio") {
          +
          +                                oData[sName] = oElement.value;
          +
          +                            }
          +
          +                        break;
          +
          +                        case "TEXTAREA":
          +
          +                            oData[sName] = oElement.value;
          +
          +                        break;
          +
          +                        case "SELECT":
          +
          +                            var aOptions = oElement.options,
          +                                nOptions = aOptions.length,
          +                                aValues = [],
          +                                oOption,
          +                                sValue;
          +
          +
          +                            for(var n=0; n<nOptions; n++) {
          +
          +                                oOption = aOptions[n];
          +
          +                                if(oOption.selected) {
          +
          +                                    sValue = oOption.value;
          +
          +                                    if(!sValue || sValue === "") {
          +
          +                                        sValue = oOption.text;
          +
          +                                    }
          +
          +                                    aValues[aValues.length] = sValue;
          +
          +                                }
          +
          +                            }
          +
          +                            oData[sName] = aValues;
          +
          +                        break;
          +
          +                    }
          +
          +
          +                }
          +                else {
          +
          +                    var sType = oElement[0].type;
          +
          +                    switch(sType) {
          +
          +                        case "radio":
          +
          +                            var oRadio;
          +
          +                            for(var n=0; n<nElements; n++) {
          +
          +                                oRadio = oElement[n];
          +
          +                                if(oRadio.checked) {
          +
          +                                    oData[sName] = oRadio.value;
          +                                    break;
          +
          +                                }
          +
          +                            }
          +
          +                        break;
          +
          +                        case "checkbox":
          +
          +                            var aValues = [],
          +                                oCheckbox;
          +
          +                            for(var n=0; n<nElements; n++) {
          +
          +                                oCheckbox = oElement[n];
          +
          +                                if(oCheckbox.checked) {
          +
          +                                    aValues[aValues.length] = oCheckbox.value;
          +
          +                                }
          +
          +                            }
          +
          +                            oData[sName] = aValues;
          +
          +                        break;
          +
          +                    }
          +
          +                }
          +
          +            }
          +
          +        }
          +
          +    }
          +
          +
          +    return oData;
          +
          +};
          +
          +/**
          +* Removes the Panel element from the DOM and sets all child elements to null.
          +* @method destroy
          +*/
          +YAHOO.widget.Dialog.prototype.destroy = function() {
          +
          +    var Event = YAHOO.util.Event,
          +        oForm = this.form,
          +        oFooter = this.footer;
          +
          +    if(oFooter) {
          +
          +        var aButtons = oFooter.getElementsByTagName("button");
          +
          +        if(aButtons && aButtons.length > 0) {
          +
          +            var i = aButtons.length - 1;
          +            
          +            do {
          +            
          +                Event.purgeElement(aButtons[i], false, "click");
          +            
          +            }
          +            while(i--);
          +        
          +        }
          +
          +    }
          +    
          +
          +    if(oForm) {
          +       
          +        Event.purgeElement(oForm);
          +
          +        this.body.removeChild(oForm);
          +        
          +        this.form = null;
          +
          +    }
          +
          +    YAHOO.widget.Dialog.superclass.destroy.call(this);  
          +
          +};
          +
          +/**
          +* 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;
          +};
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Dom.js.html b/www/extras/yui/docs/Dom.js.html new file mode 100644 index 000000000..00bf32710 --- /dev/null +++ b/www/extras/yui/docs/Dom.js.html @@ -0,0 +1,870 @@ + + + + API: dom Dom.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          dom  2.2.2

          +

          + Yahoo! UI Library + > dom + + > Dom.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /*
          +Copyright (c) 2006, Yahoo! Inc. All rights reserved.
          +Code licensed under the BSD License:
          +http://developer.yahoo.net/yui/license.txt
          +*/
          +
          +/**
          + * 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, // to normalize get/setStyle
          +        ROOT_TAG: /body|html/i // body for quirks mode, html for standards
          +    };
          +
          +    var toCamel = function(property) {
          +        if ( !patterns.HYPHEN.test(property) ) {
          +            return property; // no hyphens
          +        }
          +        
          +        if (propertyCache[property]) { // already converted
          +            return propertyCache[property];
          +        }
          +       
          +        var converted = property;
          + 
          +        while( patterns.HYPHEN.exec(converted) ) {
          +            converted = converted.replace(RegExp.$1,
          +                    RegExp.$1.substr(1).toUpperCase());
          +        }
          +        
          +        propertyCache[property] = converted;
          +        return converted;
          +        //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;
          +            
          +            if (property == 'float') { // fix reserved word
          +                property = 'cssFloat';
          +            }
          +
          +            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) {
          +                            YAHOO.log('getStyle: IE filter failed',
          +                                    'error', 'Dom');
          +                        }
          +                    }
          +                    return val / 100;
          +                    break;
          +                case 'float': // fix reserved word
          +                    property = 'styleFloat'; // fall through
          +                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 ( YAHOO.lang.isString(el.style.filter) ) { // 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;
          +                case 'float':
          +                    property = 'styleFloat';
          +                default:
          +                el.style[property] = val;
          +            }
          +        };
          +    } else {
          +        setStyle = function(el, property, val) {
          +            if (property == 'float') {
          +                property = 'cssFloat';
          +            }
          +            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 ( YAHOO.lang.isString(el) ) { // ID 
          +                YAHOO.log('get(' + el + ') returning ' + document.getElementById(el), 'info', 'Dom');
          +                return document.getElementById(el);
          +            }
          +            
          +            if ( YAHOO.lang.isArray(el) ) { // Array of IDs and/or HTMLElements
          +                var c = [];
          +                for (var i = 0, len = el.length; i < len; ++i) {
          +                    c[c.length] = Y.Dom.get(el[i]);
          +                }
          +                
          +                YAHOO.log('get("' + el + '") returning ' + c, 'info', 'Dom');
          +                return c;
          +            }
          +
          +            if (el) { // assuming HTMLElement or HTMLCollection, just pass back 
          +                YAHOO.log('get("' + el + '") returning ' + el, 'info', 'Dom');
          +                return el;
          +            }
          +
          +            YAHOO.log('element ' + el + ' not found', 'error', 'Dom');
          +            return null; // el is likely null or undefined 
          +        },
          +    
          +        /**
          +         * 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);
          +                YAHOO.log('setStyle setting ' + property + ' to ' + val, 'info', 'Dom');
          +                
          +            };
          +            
          +            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') && el != document.body) {
          +                    YAHOO.log('getXY failed: element not available', 'error', 'Dom');
          +                    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) ) {
          +                            YAHOO.log('getXY failed: element not available', 'error', 'Dom');
          +                            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;
          +
          +                    // safari: if el is abs or any parent is abs, subtract body offsets
          +                    var hasAbs = this.getStyle(el, 'position') == 'absolute';
          +
          +                    if (parentNode != el) {
          +                        while (parentNode) {
          +                            pos[0] += parentNode.offsetLeft;
          +                            pos[1] += parentNode.offsetTop;
          +                            if (isSafari && !hasAbs && 
          +                                    this.getStyle(parentNode,'position') == 'absolute' ) {
          +                                hasAbs = true; // we need to offset if any parent is absolutely positioned
          +                            }
          +                            parentNode = parentNode.offsetParent;
          +                        }
          +                    }
          +
          +                    if (isSafari && hasAbs) { //safari doubles in this case
          +                        pos[0] -= document.body.offsetLeft;
          +                        pos[1] -= document.body.offsetTop;
          +                    } 
          +                }
          +                
          +                parentNode = el.parentNode;
          +
          +                // account for any scrolled ancestors
          +                while ( parentNode.tagName && !patterns.ROOT_TAG.test(parentNode.tagName) ) 
          +                {
          +                   // work around opera inline scrollLeft/Top bug
          +                   if (Y.Dom.getStyle(parentNode, 'display') != 'inline') { 
          +                        pos[0] -= parentNode.scrollLeft;
          +                        pos[1] -= parentNode.scrollTop;
          +                    }
          +                    
          +                    parentNode = parentNode.parentNode; 
          +                }
          +        
          +                YAHOO.log('getXY returning ' + pos, 'info', 'Dom');
          +                
          +                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
          +                    YAHOO.log('setXY failed: element not available', 'error', 'Dom');
          +                    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'; }
          +              
          +                if (!noRetry) {
          +                    var newXY = this.getXY(el);
          +
          +                    // if retry is true, try one more time if we miss 
          +                   if ( (pos[0] !== null && newXY[0] != pos[0]) || 
          +                        (pos[1] !== null && newXY[1] != pos[1]) ) {
          +                       this.setXY(el, pos, true);
          +                   }
          +                }        
          +        
          +                YAHOO.log('setXY setting position to ' + pos, 'info', 'Dom');
          +            };
          +            
          +            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);
          +                YAHOO.log('getRegion returning ' + region, 'info', 'Dom');
          +                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) {
          +                YAHOO.log('hasClass returning ' + re.test(el.className), 'info', 'Dom');
          +                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
          +                
          +                YAHOO.log('addClass adding ' + className, 'info', 'Dom');
          +                
          +                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
          +                }                 
          +
          +                YAHOO.log('removeClass removing ' + className, 'info', 'Dom');
          +                
          +                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) {
          +                YAHOO.log('replaceClass replacing ' + oldClassName + ' with ' + newClassName, 'info', 'Dom');
          +            
          +                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++; 
          +                    YAHOO.log('generateId generating ' + el.id, 'info', 'Dom');
          +                } // dont override existing
          +                
          +                YAHOO.log('generateId returning ' + el.id, 'info', 'Dom');
          +                
          +                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
          +                    YAHOO.log('isAncestor returning ' + haystack.contains(needle), 'info', 'Dom');
          +                    return haystack.contains(needle);
          +                }
          +                else if ( haystack.compareDocumentPosition ) {
          +                    YAHOO.log('isAncestor returning ' + !!(haystack.compareDocumentPosition(needle) & 16), 'info', 'Dom');
          +                    return !!(haystack.compareDocumentPosition(needle) & 16);
          +                }
          +                else { // loop up and test each parent
          +                    var parent = needle.parentNode;
          +                    
          +                    while (parent) {
          +                        if (parent == haystack) {
          +                            YAHOO.log('isAncestor returning true', 'info', 'Dom');
          +                            return true;
          +                        }
          +                        else if (!parent.tagName || parent.tagName.toUpperCase() == 'HTML') {
          +                            YAHOO.log('isAncestor returning false', 'info', 'Dom');
          +                            return false;
          +                        }
          +                        
          +                        parent = parent.parentNode;
          +                    }
          +                    YAHOO.log('isAncestor returning false', 'info', 'Dom');
          +                    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 
          +         * @return {Array} Array of HTMLElements
          +         */
          +        getElementsBy: function(method, tag, root) {
          +            tag = tag || '*';
          +            
          +            var nodes = [];
          +            
          +            if (root) {
          +                root = Y.Dom.get(root);
          +                if (!root) { // if no root node, then no children
          +                    return nodes;
          +                }
          +            } else {
          +                root = document;
          +            }
          +            
          +            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]; }
          +            }
          +
          +            YAHOO.log('getElementsBy returning ' + nodes, 'info', 'Dom');
          +            
          +            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) {
          +                    YAHOO.log(id + ' not available', 'error', 'Dom');
          +                    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];
          +                    YAHOO.log(id + ' not available', 'error', 'Dom');
          +                }
          +                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());
          +            YAHOO.log('getDocumentHeight returning ' + h, 'info', 'Dom');
          +            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());
          +            YAHOO.log('getDocumentWidth returning ' + w, 'info', 'Dom');
          +            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
          +            }
          +        
          +            YAHOO.log('getViewportHeight returning ' + height, 'info', 'Dom');
          +            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
          +            }
          +            YAHOO.log('getViewportWidth returning ' + width, 'info', 'Dom');
          +            return width;
          +        }
          +    };
          +})();
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/DragDrop.js.html b/www/extras/yui/docs/DragDrop.js.html new file mode 100644 index 000000000..3f2f93b94 --- /dev/null +++ b/www/extras/yui/docs/DragDrop.js.html @@ -0,0 +1,1309 @@ + + + + API: dragdrop DragDrop.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Drag and Drop  2.2.2

          +

          + Yahoo! UI Library + > dragdrop + + > DragDrop.js (source view) +

          +
          + +
          +
          +
          + +
          +
          (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,
          +
          +    /**
          +     * The difference between the click position and the source element's location
          +     * @property deltaX
          +     * @type int
          +     * @private
          +     */
          +    deltaX: 0,
          +
          +    /**
          +     * The difference between the click position and the source element's location
          +     * @property deltaY
          +     * @type int
          +     * @private
          +     */
          +    deltaY: 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 () { 
          +        this.logger.log("onAvailable (base)"); 
          +    },
          +
          +    /**
          +     * 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);
          +
          +        // create a logger instance
          +        this.logger = (YAHOO.widget.LogWriter) ? 
          +                new YAHOO.widget.LogWriter(this.toString()) : YAHOO;
          +
          +        // 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.logger.log("handleOnAvailable");
          +        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
          +     * @private
          +     */
          +    setInitPosition: function(diffX, diffY) {
          +        var el = this.getEl();
          +
          +        if (!this.DDM.verifyEl(el)) {
          +            this.logger.log(this.id + " element is broken");
          +            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.logger.log(this.id + " initial position: " + this.initPageX + 
          +                ", " + this.initPageY);
          +
          +
          +        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) {
          +        this.logger.log("Removing from group: " + 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);
          +        }
          +        this.logger.log("Adding outer handle event: " + 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() {
          +        this.logger.log("DragDrop obj cleanup " + this.id);
          +        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;
          +        this.logger.log("button: " + button);
          +
          +        if (this.primaryButtonOnly && button > 1) {
          +            this.logger.log("Mousedown was not produced by the primary button");
          +            return;
          +        }
          +
          +        if (this.isLocked()) {
          +            this.logger.log("Drag and drop is disabled, aborting");
          +            return;
          +        }
          +
          +        this.logger.log("mousedown " + this.id);
          +
          +        this.logger.log("firing onMouseDown events");
          +
          +        // firing the mousedown events prior to calculating positions
          +        this.b4MouseDown(e);
          +        this.onMouseDown(e);
          +
          +        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) )  {
          +                this.logger.log("Click was not over the element: " + this.id);
          +        } else {
          +            if (this.clickValidator(e)) {
          +
          +                this.logger.log("click was a valid handle");
          +
          +                // set the initial element position
          +                this.setStartPosition();
          +
          +                // start tracking mousemove distance and mousedown time to
          +                // determine when to start the actual drag
          +                this.DDM.handleMouseDown(e, this);
          +
          +                // this mousedown is mine
          +                this.DDM.stopEvent(e);
          +            } else {
          +
          +this.logger.log("clickValidator returned false, drag not initiated");
          +
          +            }
          +        }
          +    },
          +
          +    clickValidator: function(e) {
          +        var target = Event.getTarget(e);
          +        return ( this.isValidHandleChild(target) &&
          +                    (this.id == this.handleElId || 
          +                        this.DDM.handleWasClicked(target, this.id)) );
          +    },
          +
          +    /**
          +     * 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};
          +    },
          +
          +    /**
          +     * 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]);
          +        }
          +
          +        this.logger.log("Valid handle? ... " + valid);
          +
          +        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) ;
          +        this.logger.log("xTicks: " + this.xTicks.join());
          +    },
          +
          +    /**
          +     * Create the array of vertical tick marks if an interval was specified in 
          +     * setYConstraint().
          +     * @method setYTicks
          +     * @private
          +     */
          +    setYTicks: function(iStartY, iTickSize) {
          +        // this.logger.log("setYTicks: " + iStartY + ", " + iTickSize
          +               // + ", " + this.initPageY + ", " + this.minY + ", " + this.maxY );
          +        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) ;
          +        this.logger.log("yTicks: " + this.yTicks.join());
          +    },
          +
          +    /**
          +     * 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 = parseInt(iLeft, 10);
          +        this.rightConstraint = parseInt(iRight, 10);
          +
          +        this.minX = this.initPageX - this.leftConstraint;
          +        this.maxX = this.initPageX + this.rightConstraint;
          +        if (iTickSize) { this.setXTicks(this.initPageX, iTickSize); }
          +
          +        this.constrainX = true;
          +        this.logger.log("initPageX:" + this.initPageX + " minX:" + this.minX + 
          +                " maxX:" + this.maxX);
          +    },
          +
          +    /**
          +     * 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.logger.log("Clearing constraints");
          +        this.constrainX = false;
          +        this.constrainY = false;
          +        this.clearTicks();
          +    },
          +
          +    /**
          +     * Clears any tick interval defined for this instance
          +     * @method clearTicks
          +     */
          +    clearTicks: function() {
          +        this.logger.log("Clearing ticks");
          +        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.logger.log("setYConstraint: " + iUp + "," + iDown + "," + iTickSize);
          +        this.topConstraint = parseInt(iUp, 10);
          +        this.bottomConstraint = parseInt(iDown, 10);
          +
          +        this.minY = this.initPageY - this.topConstraint;
          +        this.maxY = this.initPageY + this.bottomConstraint;
          +        if (iTickSize) { this.setYTicks(this.initPageY, iTickSize); }
          +
          +        this.constrainY = true;
          +        
          +        this.logger.log("initPageY:" + this.initPageY + " minY:" + this.minY + 
          +                " maxY:" + this.maxY);
          +    },
          +
          +    /**
          +     * resetConstraints must be called if you manually reposition a dd element.
          +     * @method resetConstraints
          +     * @param {boolean} maintainOffset
          +     */
          +    resetConstraints: function() {
          +
          +        this.logger.log("resetConstraints");
          +
          +        // Maintain offsets if necessary
          +        if (this.initPageX || this.initPageX === 0) {
          +            this.logger.log("init pagexy: " + this.initPageX + ", " + 
          +                               this.initPageY);
          +            this.logger.log("last pagexy: " + this.lastPageX + ", " + 
          +                               this.lastPageY);
          +            // 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);
          +    }
          +
          +};
          +
          +})();
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/DragDropMgr.js.html b/www/extras/yui/docs/DragDropMgr.js.html new file mode 100644 index 000000000..14b9c1a7d --- /dev/null +++ b/www/extras/yui/docs/DragDropMgr.js.html @@ -0,0 +1,1521 @@ + + + + API: dragdrop DragDropMgr.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Drag and Drop  2.2.2

          +

          + Yahoo! UI Library + > dragdrop + + > DragDropMgr.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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,
          +
          +
          +        /**
          +         * Provides additional information about the the current set of
          +         * interactions.  Can be accessed from the event handlers. It
          +         * contains the following properties:
          +         *
          +         *       out:       onDragOut interactions
          +         *       enter:     onDragEnter interactions
          +         *       over:      onDragOver interactions
          +         *       drop:      onDragDrop interactions
          +         *       point:     The location of the cursor
          +         *       draggedRegion: The location of dragged element at the time
          +         *                      of the interaction
          +         *       sourceRegion: The location of the source elemtn at the time
          +         *                     of the interaction
          +         *       validDrop: boolean
          +         * @property interactionInfo
          +         * @type object
          +         * @static
          +         */
          +        interactionInfo: null,
          +
          +        /**
          +         * 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
          +         * @final
          +         */
          +        POINT: 0,
          +
          +        /**
          +         * In intersect mode, drag and drop interaction is defined by the 
          +         * cursor position or the amount of overlap of two or more drag and 
          +         * drop objects.
          +         * @property INTERSECT
          +         * @type int
          +         * @static
          +         * @final
          +         */
          +        INTERSECT: 1,
          +
          +        /**
          +         * In intersect mode, drag and drop interaction is defined only by the 
          +         * overlap of two or more drag and drop objects.
          +         * @property STRICT_INTERSECT
          +         * @type int
          +         * @static
          +         * @final
          +         */
          +        STRICT_INTERSECT: 2,
          +
          +        /**
          +         * 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();
          +
          +            YAHOO.log("DragDropMgr onload", "info", "DragDropMgr");
          +
          +            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) {
          +            YAHOO.log("window resize", "info", "DragDropMgr");
          +            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];
          +                    //YAHOO.log("NEW LEN " + this.ids.length, "warn");
          +                }
          +            }
          +            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) {
          +            YAHOO.log("firing drag start events", "info", "DragDropMgr");
          +            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) {
          +                YAHOO.log("mouseup detected - completing drag", "info", "DragDropMgr");
          +                this.fireEvents(e, true);
          +            } else {
          +                YAHOO.log("drag threshold not met", "info", "DragDropMgr");
          +            }
          +
          +            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) {
          +            // YAHOO.log("mouseup - removing event handlers");
          +
          +            // Fire the drag end event for the item that was dragged
          +            if (this.dragCurrent) {
          +                if (this.dragThreshMet) {
          +                    YAHOO.log("firing endDrag events", "info", "DragDropMgr");
          +                    this.dragCurrent.b4EndDrag(e);
          +                    this.dragCurrent.endDrag(e);
          +                }
          +
          +                YAHOO.log("firing dragdrop onMouseUp event", "info", "DragDropMgr");
          +                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) {
          +            //YAHOO.log("handlemousemove");
          +            if (! this.dragCurrent) {
          +                // YAHOO.log("no current drag obj");
          +                return true;
          +            }
          +
          +            // var button = e.which || e.button;
          +            // YAHOO.log("which: " + e.which + ", button: "+ e.button);
          +
          +            // check for IE mouseup outside of page boundary
          +            if (YAHOO.util.Event.isIE && !e.button) {
          +                YAHOO.log("button failure", "info", "DragDropMgr");
          +                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));
          +                // YAHOO.log("diffX: " + diffX + "diffY: " + diffY);
          +                if (diffX > this.clickPixelThresh || 
          +                            diffY > this.clickPixelThresh) {
          +                    YAHOO.log("pixel threshold met", "info", "DragDropMgr");
          +                    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);
          +            var pos = dc.getTargetCoord(pt.x, pt.y);
          +            var el = dc.getDragEl();
          +            curRegion = new YAHOO.util.Region( pos.y, 
          +                                               pos.x + el.offsetWidth,
          +                                               pos.y + el.offsetHeight, 
          +                                               pos.x );
          +            // 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, curRegion)) {
          +                    outEvts.push( ddo );
          +                }
          +
          +                oldOvers[i] = true;
          +                delete this.dragOvers[i];
          +            }
          +
          +            for (var sGroup in dc.groups) {
          +                // YAHOO.log("Processing group " + sGroup);
          +                
          +                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, curRegion)) {
          +                            // 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;
          +                            }
          +                        }
          +                    }
          +                }
          +            }
          +
          +            this.interactionInfo = {
          +                out:       outEvts,
          +                enter:     enterEvts,
          +                over:      overEvts,
          +                drop:      dropEvts,
          +                point:     pt,
          +                draggedRegion:    curRegion,
          +                sourceRegion: this.locationCache[dc.id],
          +                validDrop: isDrop
          +            };
          +
          +            // notify about a drop that did not find a target
          +            if (isDrop && !dropEvts.length) {
          +                YAHOO.log(dc.id + " dropped, but not on a target", "info", "DragDropMgr");
          +                this.interactionInfo.validDrop = false;
          +                dc.onInvalidDrop(e);
          +            }
          +
          +
          +            if (this.mode) {
          +                if (outEvts.length) {
          +                    YAHOO.log(dc.id+" onDragOut: " + outEvts, "info", "DragDropMgr");
          +                    dc.b4DragOut(e, outEvts);
          +                    dc.onDragOut(e, outEvts);
          +                }
          +
          +                if (enterEvts.length) {
          +                    YAHOO.log(dc.id+" onDragEnter: " + enterEvts, "info", "DragDropMgr");
          +                    dc.onDragEnter(e, enterEvts);
          +                }
          +
          +                if (overEvts.length) {
          +                    YAHOO.log(dc.id+" onDragOver: " + overEvts, "info", "DragDropMgr");
          +                    dc.b4DragOver(e, overEvts);
          +                    dc.onDragOver(e, overEvts);
          +                }
          +
          +                if (dropEvts.length) {
          +                    YAHOO.log(dc.id+" onDragDrop: " + dropEvts, "info", "DragDropMgr");
          +                    dc.b4DragDrop(e, dropEvts);
          +                    dc.onDragDrop(e, dropEvts);
          +                }
          +
          +            } else {
          +                // fire dragout events
          +                var len = 0;
          +                for (i=0, len=outEvts.length; i<len; ++i) {
          +                    YAHOO.log(dc.id+" onDragOut: " + outEvts[i].id, "info", "DragDropMgr");
          +                    dc.b4DragOut(e, outEvts[i].id);
          +                    dc.onDragOut(e, outEvts[i].id);
          +                }
          +                 
          +                // fire enter events
          +                for (i=0,len=enterEvts.length; i<len; ++i) {
          +                    YAHOO.log(dc.id + " onDragEnter " + enterEvts[i].id, "info", "DragDropMgr");
          +                    // dc.b4DragEnter(e, oDD.id);
          +                    dc.onDragEnter(e, enterEvts[i].id);
          +                }
          +         
          +                // fire over events
          +                for (i=0,len=overEvts.length; i<len; ++i) {
          +                    YAHOO.log(dc.id + " onDragOver " + overEvts[i].id, "info", "DragDropMgr");
          +                    dc.b4DragOver(e, overEvts[i].id);
          +                    dc.onDragOver(e, overEvts[i].id);
          +                }
          +
          +                // fire drop events
          +                for (i=0, len=dropEvts.length; i<len; ++i) {
          +                    YAHOO.log(dc.id + " dropped on " + dropEvts[i].id, "info", "DragDropMgr");
          +                    dc.b4DragDrop(e, dropEvts[i].id);
          +                    dc.onDragDrop(e, dropEvts[i].id);
          +                }
          +
          +            }
          +        },
          +
          +        /**
          +         * 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;
          +
          +            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 (this.mode == this.INTERSECT && dd.cursorIsOver) {
          +                        winner = dd;
          +                        break;
          +                    // Otherwise the object with the most overlap wins
          +                    } else {
          +                        if (!winner || !winner.overlap || (dd.overlap &&
          +                            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) {
          +            YAHOO.log("refreshing element location cache", "info", "DragDropMgr");
          +
          +            // refresh everything if group array is not provided
          +            var g = groups || this.ids;
          +
          +            for (var sGroup in g) {
          +                if ("string" != typeof sGroup) {
          +                    continue;
          +                }
          +                for (var i in this.ids[sGroup]) {
          +                    var oDD = this.ids[sGroup][i];
          +
          +                    if (this.isTypeOfDD(oDD)) {
          +                        var loc = this.getLocation(oDD);
          +                        if (loc) {
          +                            this.locationCache[oDD.id] = loc;
          +                        } else {
          +                            delete this.locationCache[oDD.id];
          +YAHOO.log("Could not get the loc for " + oDD.id, "warn", "DragDropMgr");
          +                        }
          +                    }
          +                }
          +            }
          +        },
          +
          +        /**
          +         * 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) {
          +                YAHOO.log("detected problem with an element", "info", "DragDropMgr");
          +            }
          +
          +            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)) {
          +                YAHOO.log(oDD + " is not a DD obj", "info", "DragDropMgr");
          +                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) {
          +                YAHOO.log("getXY failed", "info", "DragDropMgr");
          +                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
          +         * @param {boolean} intersect true if we are in intersect mode
          +         * @param {YAHOO.util.Region} pre-cached location of the dragged element
          +         * @return {boolean} true if the mouse is over the target
          +         * @private
          +         * @static
          +         */
          +        isOverTarget: function(pt, oTarget, intersect, curRegion) {
          +            // use cache if available
          +            var loc = this.locationCache[oTarget.id];
          +            if (!loc || !this.useCache) {
          +                YAHOO.log("cache not populated", "info", "DragDropMgr");
          +                loc = this.getLocation(oTarget);
          +                this.locationCache[oTarget.id] = loc;
          +
          +                YAHOO.log("cache: " + loc, "info", "DragDropMgr");
          +            }
          +
          +            if (!loc) {
          +                YAHOO.log("could not get the location of the element", "info", "DragDropMgr");
          +                return false;
          +            }
          +
          +            //YAHOO.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 done. Otherwise we need to evaluate the 
          +            // region the target as occupies to determine if the dragged element
          +            // overlaps with it.
          +            
          +            var dc = this.dragCurrent;
          +            if (!dc || (!intersect && !dc.constrainX && !dc.constrainY)) {
          +
          +                //if (oTarget.cursorIsOver) {
          +                    //YAHOO.log("over " + oTarget + ", " + loc + ", " + pt, "warn");
          +                //}
          +                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.
          +
          +            if (!curRegion) {
          +                var pos = dc.getTargetCoord(pt.x, pt.y);
          +                var el = dc.getDragEl();
          +                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() {
          +            YAHOO.log("unregister all", "info", "DragDropMgr");
          +
          +            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", "info", "DragDropMgr");
          +            }
          +            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.log("moveToEl: " + aCoord, "info", "DragDropMgr");
          +            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) {
          +                    YAHOO.log("DragDrop requires the Event Utility", "error", "DragDropMgr");
          +                } 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)) {
          +                YAHOO.log("clicked node is a handle", "info", "DragDropMgr");
          +                return true;
          +            } else {
          +                // check to see if this is a text node child of the one we want
          +                var p = node.parentNode;
          +                // YAHOO.log("p: " + p);
          +
          +                while (p) {
          +                    if (this.isHandle(id, p.id)) {
          +                        return true;
          +                    } else {
          +                        YAHOO.log(p.id + " is not a handle", "info", "DragDropMgr");
          +                        p = p.parentNode;
          +                    }
          +                }
          +            }
          +
          +            return false;
          +        }
          +
          +    };
          +
          +}();
          +
          +// shorter alias, save a few bytes
          +YAHOO.util.DDM = YAHOO.util.DragDropMgr;
          +YAHOO.util.DDM._addListeners();
          +
          +}
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Easing.js.html b/www/extras/yui/docs/Easing.js.html new file mode 100644 index 000000000..9b4c373e1 --- /dev/null +++ b/www/extras/yui/docs/Easing.js.html @@ -0,0 +1,451 @@ + + + + API: animation Easing.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          animation  2.2.2

          +

          + Yahoo! UI Library + > animation + + > Easing.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /*
          +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} a Amplitude (optional)
          +     * @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} a Amplitude (optional)
          +     * @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} a Amplitude (optional)
          +     * @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;
          +    	}
          +        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;
          +    }
          +};
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Element.js.html b/www/extras/yui/docs/Element.js.html new file mode 100644 index 000000000..69f3c488c --- /dev/null +++ b/www/extras/yui/docs/Element.js.html @@ -0,0 +1,592 @@ + + + + API: element Element.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          element  2.2.2

          +

          + Yahoo! UI Library + > element + + > Element.js (source view) +

          +
          + +
          +
          +
          + +
          +
          (function() {
          +// internal shorthand
          +var Dom = YAHOO.util.Dom,
          +    AttributeProvider = YAHOO.util.AttributeProvider;
          +
          +/**
          + * Element provides an wrapper object to simplify adding
          + * event listeners, using dom methods, and managing attributes. 
          + * @module element
          + * @namespace YAHOO.util
          + * @requires yahoo, dom, event
          + * @beta
          + */
          +
          +/**
          + * Element provides an wrapper object to simplify adding
          + * event listeners, using dom methods, and managing attributes. 
          + * @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) {
          +    },
          +
          +    /**
          +     * 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');
          +        scope = scope || this;
          +        
          +        el = this.get('id') || el;
          +        var self = this; 
          +        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;
          +                    }
          +                    self.fireEvent(type, e);
          +                }, obj, scope);
          +            }
          +            
          +            this.createEvent(type, this);
          +        }
          +        
          +        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) {
          +        var el = this.get('element');
          +        if (!el) {
          +            return this._queue[this._queue.length] = ['setStyle', arguments];
          +        }
          +
          +        return Dom.setStyle(el,  property, value); // TODO: always queuing?
          +    },
          +    
          +    /**
          +     * 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);
          +        
          +        this.fireEvent('beforeAppendTo', {
          +            type: 'beforeAppendTo',
          +            target: parent
          +        });
          +        
          +        
          +        before = (before && before.get) ? 
          +                before.get('element') : Dom.get(before);
          +        var element = this.get('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);
          +        
          +        this.fireEvent('appendTo', {
          +            type: 'appendTo',
          +            target: parent
          +        });
          +    },
          +    
          +    get: function(key) {
          +        var configs = this._configs || {};
          +        var el = configs.element; // avoid loop due to 'element'
          +        if (el && !configs[key] && !YAHOO.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[this._queue.length] = ['set', arguments];
          +            if (this._configs[key]) {
          +                this._configs[key].value = value; // so "get" works while queueing
          +            
          +            }
          +            return;
          +        }
          +        
          +        // set it on the element if not configured and is an HTML attribute
          +        if ( !this._configs[key] && !YAHOO.lang.isUndefined(el[key]) ) {
          +            _registerHTMLAttr.call(this, key);
          +        }
          +
          +        return AttributeProvider.prototype.set.apply(this, arguments);
          +    },
          +    
          +    setAttributeConfig: function(key, map, init) {
          +        var el = this.get('element');
          +
          +        if (el && !this._configs[key] && !YAHOO.lang.isUndefined(el[key]) ) {
          +            _registerHTMLAttr.call(this, key, map);
          +        } else {
          +            AttributeProvider.prototype.setAttributeConfig.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;
          +    },
          +
          +    createEvent: function(type, scope) {
          +        this._events[type] = true;
          +        AttributeProvider.prototype.createEvent.apply(this, arguments);
          +    },
          +    
          +    init: function(el, attr) {
          +        _initElement.apply(this, arguments); 
          +    }
          +};
          +
          +var _initElement = 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,
          +        'dblclick': true,
          +        'keydown': true,
          +        'keypress': true,
          +        'keyup': true,
          +        'mousedown': true,
          +        'mousemove': true,
          +        'mouseout': true, 
          +        'mouseover': true, 
          +        'mouseup': true,
          +        'focus': true,
          +        'blur': true,
          +        'submit': true
          +    };
          +
          +    var isReady = false;  // to determine when to init HTMLElement and content
          +
          +    if (YAHOO.lang.isString(el) ) { // defer until available/ready
          +        _registerHTMLAttr.call(this, 'id', { value: attr.element });
          +    }
          +
          +    if (Dom.get(el)) {
          +        isReady = true;
          +        _initHTMLElement.call(this, attr);
          +        _initContent.call(this, attr);
          +    } 
          +
          +    YAHOO.util.Event.onAvailable(attr.element, function() {
          +        if (!isReady) { // otherwise already done
          +            _initHTMLElement.call(this, attr);
          +        }
          +
          +        this.fireEvent('available', { type: 'available', target: attr.element });  
          +    }, this, true);
          +    
          +    YAHOO.util.Event.onContentReady(attr.element, function() {
          +        if (!isReady) { // otherwise already done
          +            _initContent.call(this, attr);
          +        }
          +        this.fireEvent('contentReady', { type: 'contentReady', target: attr.element });  
          +    }, this, true);
          +};
          +
          +var _initHTMLElement = function(attr) {
          +    /**
          +     * The HTMLElement the Element instance refers to.
          +     * @config element
          +     * @type HTMLElement
          +     */
          +    this.setAttributeConfig('element', {
          +        value: Dom.get(attr.element),
          +        readOnly: true
          +     });
          +};
          +
          +var _initContent = function(attr) {
          +    this.initAttributes(attr);
          +    this.setAttributes(attr, true);
          +    this.fireQueue();
          +
          +};
          +
          +/**
          + * 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(key, map) {
          +    var el = this.get('element');
          +    map = map || {};
          +    map.name = key;
          +    map.method = map.method || function(value) {
          +        el[key] = value;
          +    };
          +    map.value = map.value || el[key];
          +    this._configs[key] = new YAHOO.util.Attribute(map, this);
          +};
          +
          +/**
          + * 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
          + */
          + 
          +/**
          + * 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);
          +})();
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Event.js.html b/www/extras/yui/docs/Event.js.html new file mode 100644 index 000000000..6c42d151b --- /dev/null +++ b/www/extras/yui/docs/Event.js.html @@ -0,0 +1,1539 @@ + + + + API: event Event.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Event Utility  2.2.2

          +

          + Yahoo! UI Library + > event + + > Event.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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.
          +// @TODO this needs to be changed so that only the state data that needs to
          +// be preserved is kept, while methods are overwritten/added as needed.
          +// This means that the module pattern can't be used.
          +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;
          +
          +        /**
          +         * True when the document is initially usable
          +         * @property DOMReady
          +         * @type boolean
          +         * @static
          +         * @private
          +         */
          +        var DOMReady = 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;
          +        
          +        /**
          +         * addListener/removeListener can throw errors in unexpected scenarios.
          +         * These errors are suppressed, the method returns false, and this property
          +         * is set
          +         * @property lastError
          +         * @type Error
          +         */
          +        var lastError = null;
          +
          +        return {
          +
          +            /**
          +             * 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: 10,
          +
          +            /**
          +             * 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.  Since this function has been used outside of this
          +             * utility, it was changed to detect all KHTML browser to be more
          +             * friendly towards the non-Safari browsers that share the engine.
          +             * Internally, the preventDefault bug detection now uses the
          +             * webkit property.
          +             * @property isSafari
          +             * @private
          +             * @static
          +             * @deprecated
          +             */
          +            isSafari: (/KHTML/gi).test(navigator.userAgent),
          +            
          +            /**
          +             * If WebKit is detected, we keep track of the version number of
          +             * the engine.  The webkit property will contain a string with
          +             * the webkit version number if webkit is detected, null
          +             * otherwise.
          +             * Safari 1.3.2 (312.6): 312.8.1 <-- currently the latest
          +             *                       available on Mac OSX 10.3.
          +             * Safari 2.0.2: 416 <-- hasOwnProperty introduced
          +             * Safari 2.0.4: 418 <-- preventDefault fixed (I believe)
          +             * Safari 2.0.4 (419.3): 418.9.1 <-- current release
          +             *
          +             * http://developer.apple.com/internet/safari/uamatrix.html
          +             * @property webkit
          +             * @type string
          +             * @static
          +             */
          +            webkit: function() {
          +                var v=navigator.userAgent.match(/AppleWebKit\/([^ ]*)/);
          +                if (v&&v[1]) {
          +                    return v[1];
          +                }
          +                return null;
          +            }(),
          +            
          +            /**
          +             * 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.webkit && !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);
          +                }
          +            },
          +
          +            /**
          +             * 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();
          +            },
          +
          +            /**
          +             * Executes the supplied callback when the DOM is first usable.
          +             *
          +             * @method onDOMReady
          +             *
          +             * @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_scope If set to true, p_fn will execute
          +             *                   in the scope of p_obj, if set to an object it
          +             *                   will execute in the scope of that object
          +             *
          +             * @static
          +             */
          +            onDOMReady: function(p_fn, p_obj, p_override) {
          +                this.DOMReadyEvent.subscribe(p_fn, p_obj, p_override);
          +            },
          +
          +            /**
          +             * 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 listener attached,
          +             *                        or if the operation throws an exception.
          +             * @static
          +             */
          +            addListener: function(el, sType, fn, obj, override) {
          +
          +
          +                if (!fn || !fn.call) {
          +                    // this.logger.debug("Error, function is not valid " + fn);
          +                    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) {
          +                    // this.logger.debug("unable to attach event " + sType);
          +                    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;
          +                }
          +
          +                // this.logger.debug("Adding handler: " + el + ", " + sType);
          +
          +                // 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 {
          +                    try {
          +                        this._simpleAdd(el, sType, wrappedFn, false);
          +                    } catch(ex) {
          +                        // handle an error trying to attach an event.  If it fails
          +                        // we need to clean up the cache
          +                        this.lastError = ex;
          +                        this.removeListener(el, sType, fn);
          +                        return 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) {
          +                // this.logger.debug("fireLegacyEvent " + legacyIndex);
          +                var ok=true,le,lh,li,scope,ret;
          +                
          +                lh = legacyHandlers[legacyIndex];
          +                for (var i=0,len=lh.length; i<len; ++i) {
          +                    li = lh[i];
          +                    if ( li && li[this.WFN] ) {
          +                        scope = li[this.ADJ_SCOPE];
          +                        ret = li[this.WFN].call(scope, e);
          +                        ok = (ok && ret);
          +                    }
          +                }
          +
          +                // Fire the original handler if we replaced one.  We fire this
          +                // after the other events to keep stopPropagation/preventDefault
          +                // that happened in the DOM0 handler from touching our DOM2
          +                // substitute
          +                le = legacyEvents[legacyIndex];
          +                if (le && le[2]) {
          +                    le[2](e);
          +                }
          +                
          +                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.  Currently this is limited to old
          +             * Safari browsers with a broken preventDefault
          +             * @method useLegacyEvent
          +             * @static
          +             * @private
          +             */
          +            useLegacyEvent: function(el, sType) {
          +                if (this.webkit && ("click"==sType || "dblclick"==sType)) {
          +                    var v = parseInt(this.webkit, 10);
          +                    if (!isNaN(v) && v<418) {
          +                        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) {
          +                    // this.logger.debug("Error, function is not valid " + fn);
          +                    //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) {
          +                    // this.logger.debug("cached listener not found");
          +                    return false;
          +                }
          +
          +                // this.logger.debug("Removing handler: " + el + ", " + sType);
          +
          +                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 {
          +                    try {
          +                        this._simpleRemove(el, sType, cacheItem[this.WFN], false);
          +                    } catch(ex) {
          +                        this.lastError = ex;
          +                        return 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
          +             * @param {Event} ev the event
          +             * @return {[x, y]} the pageX and pageY properties of the event
          +             * @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(ex) { 
          +                        this.lastError = ex;
          +                        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) {
          +                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
          +             * @deprecated Elements are not cached any longer
          +             */
          +            elCache: {},
          +
          +            /**
          +             * We cache elements bound by id because when the unload event 
          +             * fires, we can no longer use document.getElementById
          +             * @method getEl
          +             * @static
          +             * @private
          +             * @deprecated Elements are not cached any longer
          +             */
          +            getEl: function(id) {
          +                return document.getElementById(id);
          +            },
          +
          +            /**
          +             * Clears the element cache
          +             * @deprecated Elements are not cached any longer
          +             * @method clearCache
          +             * @static
          +             * @private
          +             */
          +            clearCache: function() { },
          +
          +            /**
          +             * Custom event the fires when the dom is initially usable
          +             * @event DOMReadyEvent
          +             */
          +            DOMReadyEvent: new YAHOO.util.CustomEvent("DOMReady", this),
          +
          +            /**
          +             * hook up any deferred listeners
          +             * @method _load
          +             * @static
          +             * @private
          +             */
          +            _load: function(e) {
          +                loadComplete = true;
          +                var EU = YAHOO.util.Event;
          +
          +                // just in case DOMReady did not go off for some reason
          +                EU._ready();
          +
          +                // 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);
          +                }
          +            },
          +
          +            /**
          +             * Fires the DOMReady event listeners the first time the document is
          +             * usable.
          +             * @method _ready
          +             * @static
          +             * @private
          +             */
          +            _ready: function(e) {
          +                if (!DOMReady) {
          +                    DOMReady=true;
          +                    var EU = YAHOO.util.Event;
          +
          +                    // Fire the content ready custom event
          +                    EU.DOMReadyEvent.fire();
          +
          +                    // Remove the DOMContentLoaded (FF/Opera)
          +                    EU._simpleRemove(document, "DOMContentLoaded", EU._ready);
          +                }
          +            },
          +
          +            /**
          +             * 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;
          +                }
          +
          +
          +                if (this.isIE && !DOMReady) {
          +                    return false;
          +                }
          +
          +                this.locked = true;
          +
          +                // this.logger.debug("tryPreloadAttach");
          +
          +                // 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 = [];
          +
          +                var executeItem = function (el, item) {
          +                    var scope = el;
          +                    if (item.override) {
          +                        if (item.override === true) {
          +                            scope = item.obj;
          +                        } else {
          +                            scope = item.override;
          +                        }
          +                    }
          +                    item.fn.call(scope, item.obj);
          +                };
          +
          +                var i,len,item,el;
          +
          +                // onAvailable
          +                for (i=0,len=onAvailStack.length; i<len; ++i) {
          +                    item = onAvailStack[i];
          +                    if (item && !item.checkReady) {
          +                        el = this.getEl(item.id);
          +                        if (el) {
          +                            executeItem(el, item);
          +                            onAvailStack[i] = null;
          +                        } else {
          +                            notAvail.push(item);
          +                        }
          +                    }
          +                }
          +
          +                // onContentReady
          +                for (i=0,len=onAvailStack.length; i<len; ++i) {
          +                    item = onAvailStack[i];
          +                    if (item && item.checkReady) {
          +                        el = this.getEl(item.id);
          +
          +                        if (el) {
          +                            // The element is available, but not necessarily ready
          +                            // @todo should we test parentNode.nextSibling?
          +                            if (loadComplete || el.nextSibling) {
          +                                executeItem(el, item);
          +                                onAvailStack[i] = null;
          +                            }
          +                        } else {
          +                            notAvail.push(item);
          +                        }
          +                    }
          +                }
          +
          +                retryCount = (notAvail.length === 0) ? 0 : retryCount - 1;
          +
          +                if (tryAgain) {
          +                    // we may need to strip the nulled out items here
          +                    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 results=[], searchLists;
          +                if (!sType) {
          +                    searchLists = [listeners, unloadListeners];
          +                } else if (sType == "unload") {
          +                    searchLists = [unloadListeners];
          +                } else {
          +                    searchLists = [listeners];
          +                }
          +
          +                for (var j=0;j<searchLists.length; ++j) {
          +                    var searchList = searchLists[j];
          +                    if (searchList && searchList.length > 0) {
          +                        for (var i=0,len=searchList.length; i<len ; ++i) {
          +                            var l = searchList[i];
          +                            if ( l  && l[this.EL] === el && 
          +                                    (!sType || sType === l[this.TYPE]) ) {
          +                                results.push({
          +                                    type:   l[this.TYPE],
          +                                    fn:     l[this.FN],
          +                                    obj:    l[this.OBJ],
          +                                    adjust: l[this.ADJ_SCOPE],
          +                                    index:  i
          +                                });
          +                            }
          +                        }
          +                    }
          +                }
          +
          +                return (results.length) ? results : 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] );
          +                        unloadListeners[i] = null;
          +                        l=null;
          +                        scope=null;
          +                    }
          +                }
          +
          +                unloadListeners = 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];
          +                    legacyEvents[i][0] = null;
          +
          +                    // delete the array item
          +                    //delete legacyEvents[i];
          +                    legacyEvents[i] = null;
          +                }
          +
          +                legacyEvents = null;
          +
          +                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];
          +                }
          +            },
          +            
          +            /**
          +             * Used by old versions of CustomEvent, restored for backwards
          +             * compatibility
          +             * @method regCE
          +             * @private
          +             */
          +            regCE: function() {
          +                // does nothing
          +            },
          +
          +            /**
          +             * 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;
          +
          +        /////////////////////////////////////////////////////////////
          +        // DOMReady
          +        // based on work by: Dean Edwards/John Resig/Matthias Miller 
          +
          +        // Internet Explorer: use the readyState of a defered script.
          +        // This isolates what appears to be a safe moment to manipulate
          +        // the DOM prior to when the document's readyState suggests
          +        // it is safe to do so.
          +        if (EU.isIE) {
          +	
          +            document.write(
          +'<scr' + 'ipt id="_yui_eu_dr" defer="true" src="//:"></script>');
          +        
          +            var el = document.getElementById("_yui_eu_dr");
          +            el.onreadystatechange = function() {
          +                if ("complete" == this.readyState) {
          +                    this.parentNode.removeChild(this);
          +                    YAHOO.util.Event._ready();
          +                }
          +            };
          +
          +            el=null;
          +
          +            // Process onAvailable/onContentReady items when when the 
          +            // DOM is ready.
          +            YAHOO.util.Event.onDOMReady(
          +                    YAHOO.util.Event._tryPreloadAttach,
          +                    YAHOO.util.Event, true);
          +        
          +        // Safari: The document's readyState in Safari currently will
          +        // change to loaded/complete before images are loaded.
          +        } else if (EU.webkit) {
          +
          +            EU._drwatch = setInterval(function(){
          +                var rs=document.readyState;
          +                if ("loaded" == rs || "complete" == rs) {
          +                    clearInterval(EU._drwatch);
          +                    EU._drwatch = null;
          +                    EU._ready();
          +                }
          +            }, EU.POLL_INTERVAL); 
          +
          +        // FireFox and Opera: These browsers provide a event for this
          +        // moment.
          +        } else {
          +
          +            EU._simpleAdd(document, "DOMContentLoaded", EU._ready);
          +
          +        }
          +        /////////////////////////////////////////////////////////////
          +
          +        if (document && document.body) {
          +            EU._load();
          +        } else {
          +            EU._simpleAdd(window, "load", EU._load);
          +        }
          +        EU._simpleAdd(window, "unload", EU._unload);
          +        EU._tryPreloadAttach();
          +    })();
          +}
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/EventProvider.js.html b/www/extras/yui/docs/EventProvider.js.html new file mode 100644 index 000000000..13d57442b --- /dev/null +++ b/www/extras/yui/docs/EventProvider.js.html @@ -0,0 +1,315 @@ + + + + API: event EventProvider.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Event Utility  2.2.2

          +

          + Yahoo! UI Library + > event + + > EventProvider.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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 one or more listeners the from the specified event
          +     * @method unsubscribe
          +     * @param p_type {string}   The type, or name of the event
          +     * @param p_fn   {Function} The subscribed function to unsubscribe, if not
          +     *                          supplied, all subscribers will be removed.
          +     * @param p_obj  {Object}   The custom object passed to subscribe.  This is
          +     *                        optional, but if supplied will be used to
          +     *                        disambiguate multiple listeners that are the same
          +     *                        (e.g., you subscribe many object using a function
          +     *                        that lives on the prototype)
          +     * @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;
          +        }
          +    },
          +    
          +    /**
          +     * Removes all listeners from the specified event
          +     * @method unsubscribeAll
          +     * @param p_type {string}   The type, or name of the event
          +     */
          +    unsubscribeAll: function(p_type) {
          +        return this.unsubscribe(p_type);
          +    },
          +
          +    /**
          +     * 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]) {
          +            YAHOO.log("EventProvider: error, event already exists");
          +        } 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 {
          +            YAHOO.log("EventProvider.fire could not find event: " + p_type);
          +            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 © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/HTMLNode.js.html b/www/extras/yui/docs/HTMLNode.js.html new file mode 100644 index 000000000..2bb2dd44f --- /dev/null +++ b/www/extras/yui/docs/HTMLNode.js.html @@ -0,0 +1,245 @@ + + + + API: treeview HTMLNode.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + + > HTMLNode.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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;
          +
          +        this.logger = new YAHOO.widget.LogWriter(this.toString());
          +    },
          +
          +    /**
          +     * 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() { 
          +        this.logger.log("Generating html");
          +        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>';
          +            sb[sb.length] = '<td class="' + this.getDepthStyle(i) + '"><div class="ygtvspacer"></div></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] = '><div class="ygtvspacer"></div></td>';
          +        }
          +
          +        sb[sb.length] = '<td';
          +        sb[sb.length] = ' id="' + this.contentElId + '"';
          +        sb[sb.length] = ' class="' + this.contentStyle + '"';
          +        sb[sb.length] = (this.nowrap) ? ' nowrap="nowrap" ' : '';
          +        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 + ")";
          +    }
          +
          +});
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/LogMsg.js.html b/www/extras/yui/docs/LogMsg.js.html new file mode 100644 index 000000000..8fbdda24b --- /dev/null +++ b/www/extras/yui/docs/LogMsg.js.html @@ -0,0 +1,177 @@ + + + + API: logger LogMsg.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Logger Widget  2.2.2

          +

          + Yahoo! UI Library + > logger + + > LogMsg.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /****************************************************************************/
          +/****************************************************************************/
          +/****************************************************************************/
          +
          +/**
          + * The LogMsg class defines a single log message.
          + *
          + * @class LogMsg
          + * @constructor
          + * @param oConfigs {Object} Object literal of configuration params.
          + */
          + YAHOO.widget.LogMsg = function(oConfigs) {
          +    // Parse configs
          +    if (oConfigs && (oConfigs.constructor == 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;
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/LogReader.js.html b/www/extras/yui/docs/LogReader.js.html new file mode 100644 index 000000000..20b5faa62 --- /dev/null +++ b/www/extras/yui/docs/LogReader.js.html @@ -0,0 +1,1323 @@ + + + + API: logger LogReader.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Logger Widget  2.2.2

          +

          + Yahoo! UI Library + > logger + + > LogReader.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /****************************************************************************/
          +/****************************************************************************/
          +/****************************************************************************/
          +
          +/**
          + * The LogReader class provides UI to read messages logged to YAHOO.widget.Logger.
          + *
          + * @class 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 (oConfigs && (oConfigs.constructor == Object)) {
          +        for(var param in oConfigs) {
          +            this[param] = oConfigs[param];
          +        }
          +    }
          +
          +    // Validate container
          +    elContainer = YAHOO.util.Dom.get(elContainer);
          +    // Attach to existing container...
          +    if(elContainer && elContainer.tagName && (elContainer.tagName.toLowerCase() == "div")) {
          +        this._elContainer = elContainer;
          +        YAHOO.util.Dom.addClass(this._elContainer,"yui-log");
          +    }
          +    // ...or create container from scratch
          +    else {
          +        this._elContainer = document.body.appendChild(document.createElement("div"));
          +        //this._elContainer.id = "yui-log" + this._sName;
          +        YAHOO.util.Dom.addClass(this._elContainer,"yui-log");
          +        YAHOO.util.Dom.addClass(this._elContainer,"yui-log-container");
          +
          +        //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.right) {
          +            containerStyle.right = this.right;
          +        }
          +        if(this.top) {
          +            containerStyle.top = this.top;
          +        }
          +         if(this.left) {
          +            containerStyle.left = this.left;
          +            containerStyle.right = "auto";
          +        }
          +        if(this.bottom) {
          +            containerStyle.bottom = this.bottom;
          +            containerStyle.top = "auto";
          +        }
          +       if(this.fontSize) {
          +            containerStyle.fontSize = this.fontSize;
          +        }
          +        // For Opera
          +        if(navigator.userAgent.toLowerCase().indexOf("opera") != -1) {
          +            document.body.style += '';
          +        }
          +    }
          +
          +    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";
          +        }
          +        // 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";
          +        }
          +    }
          +
          +    // If Drag and Drop utility is available...
          +    // ...and draggable is true...
          +    // ...then make the header draggable
          +    if(YAHOO.util.DD && this.draggable) {
          +        var ylog_dd = new YAHOO.util.DD(this._elContainer);
          +        ylog_dd.setHandleElId(this._elHd.id);
          +        this._elHd.style.cursor = "move";
          +    }
          +
          +    // 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 filters
          +    this._filterCheckboxes = {};
          +    
          +    // 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 LogReader 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 LogReader container.
          + *
          + * @property width
          + * @type String
          + */
          +YAHOO.widget.LogReader.prototype.width = null;
          +
          +/**
          + * Public member to access CSS height of the LogReader container.
          + *
          + * @property height
          + * @type String
          + */
          +YAHOO.widget.LogReader.prototype.height = null;
          +
          +/**
          + * Public member to access CSS top position of the LogReader container.
          + *
          + * @property top
          + * @type String
          + */
          +YAHOO.widget.LogReader.prototype.top = null;
          +
          +/**
          + * Public member to access CSS left position of the LogReader container.
          + *
          + * @property left
          + * @type String
          + */
          +YAHOO.widget.LogReader.prototype.left = null;
          +
          +/**
          + * Public member to access CSS right position of the LogReader container.
          + *
          + * @property right
          + * @type String
          + */
          +YAHOO.widget.LogReader.prototype.right = null;
          +
          +/**
          + * Public member to access CSS bottom position of the LogReader container.
          + *
          + * @property bottom
          + * @type String
          + */
          +YAHOO.widget.LogReader.prototype.bottom = null;
          +
          +/**
          + * Public member to access CSS font size of the LogReader container.
          + *
          + * @property fontSize
          + * @type String
          + */
          +YAHOO.widget.LogReader.prototype.fontSize = null;
          +
          +/**
          + * Whether or not the footer UI is enabled for the LogReader.
          + *
          + * @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;
          +
          +/**
          + * Output timeout buffer in milliseconds.
          + *
          + * @property outputBuffer
          + * @type Number
          + * @default 100
          + */
          +YAHOO.widget.LogReader.prototype.outputBuffer = 100;
          +
          +/**
          + * 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;
          +
          +/**
          + * True when LogReader is in a collapsed state, false otherwise.
          + *
          + * @property isCollapsed
          + * @type Boolean
          + * @default false
          + */
          +YAHOO.widget.LogReader.prototype.isCollapsed = false;
          +
          +/**
          + * True when LogReader is in a paused state, false otherwise.
          + *
          + * @property isPaused
          + * @type Boolean
          + * @default false
          + */
          +YAHOO.widget.LogReader.prototype.isPaused = false;
          +
          +/**
          + * Enables draggable LogReader if DragDrop Utility is present.
          + *
          + * @property draggable
          + * @type Boolean
          + * @default true
          + */
          +YAHOO.widget.LogReader.prototype.draggable = true;
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// 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 LogReader.
          + *
          + * @method pause
          + */
          +YAHOO.widget.LogReader.prototype.pause = function() {
          +    this.isPaused = true;
          +    this._btnPause.value = "Resume";
          +    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.isPaused = false;
          +    this._btnPause.value = "Pause";
          +    this.logReaderEnabled = true;
          +    this._printBuffer();
          +};
          +
          +/**
          + * Hides UI of LogReader. Logging functionality is not disrupted.
          + *
          + * @method hide
          + */
          +YAHOO.widget.LogReader.prototype.hide = function() {
          +    this._elContainer.style.display = "none";
          +};
          +
          +/**
          + * Shows UI of LogReader. Logging functionality is not disrupted.
          + *
          + * @method show
          + */
          +YAHOO.widget.LogReader.prototype.show = function() {
          +    this._elContainer.style.display = "block";
          +};
          +
          +/**
          + * Collapses UI of LogReader. Logging functionality is not disrupted.
          + *
          + * @method collapse
          + */
          +YAHOO.widget.LogReader.prototype.collapse = function() {
          +    this._elConsole.style.display = "none";
          +    if(this._elFt) {
          +        this._elFt.style.display = "none";
          +    }
          +    this._btnCollapse.value = "Expand";
          +    this.isCollapsed = true;
          +};
          +
          +/**
          + * Expands UI of LogReader. Logging functionality is not disrupted.
          + *
          + * @method expand
          + */
          +YAHOO.widget.LogReader.prototype.expand = function() {
          +    this._elConsole.style.display = "block";
          +    if(this._elFt) {
          +        this._elFt.style.display = "block";
          +    }
          +    this._btnCollapse.value = "Collapse";
          +    this.isCollapsed = false;
          +};
          +
          +/**
          + * Returns related checkbox element for given filter (i.e., category or source).
          + *
          + * @method getCheckbox
          + * @param {String} Category or source name.
          + * @return {Array} Array of all filter checkboxes.
          + */
          +YAHOO.widget.LogReader.prototype.getCheckbox = function(filter) {
          +    return this._filterCheckboxes[filter];
          +};
          +
          +/**
          + * Returns array of enabled categories.
          + *
          + * @method getCategories
          + * @return {String[]} Array of enabled categories.
          + */
          +YAHOO.widget.LogReader.prototype.getCategories = function() {
          +    return this._categoryFilters;
          +};
          +
          +/**
          + * Shows log messages associated with given category.
          + *
          + * @method showCategory
          + * @param {String} Category name.
          + */
          +YAHOO.widget.LogReader.prototype.showCategory = function(sCategory) {
          +    var filtersArray = this._categoryFilters;
          +    // Don't do anything if category is already enabled
          +    // Use Array.indexOf if available...
          +    if(filtersArray.indexOf) {
          +         if(filtersArray.indexOf(sCategory) >  -1) {
          +            return;
          +        }
          +    }
          +    // ...or do it the old-fashioned way
          +    else {
          +        for(var i=0; i<filtersArray.length; i++) {
          +           if(filtersArray[i] === sCategory){
          +                return;
          +            }
          +        }
          +    }
          +
          +    this._categoryFilters.push(sCategory);
          +    this._filterLogs();
          +    this.getCheckbox(sCategory).checked = true;
          +};
          +
          +/**
          + * Hides log messages associated with given category.
          + *
          + * @method hideCategory
          + * @param {String} Category name.
          + */
          +YAHOO.widget.LogReader.prototype.hideCategory = function(sCategory) {
          +    var filtersArray = this._categoryFilters;
          +    for(var i=0; i<filtersArray.length; i++) {
          +        if(sCategory == filtersArray[i]) {
          +            filtersArray.splice(i, 1);
          +            break;
          +        }
          +    }
          +    this._filterLogs();
          +    this.getCheckbox(sCategory).checked = false;
          +};
          +
          +/**
          + * Returns array of enabled sources.
          + *
          + * @method getSources
          + * @return {Array} Array of enabled sources.
          + */
          +YAHOO.widget.LogReader.prototype.getSources = function() {
          +    return this._sourceFilters;
          +};
          +
          +/**
          + * Shows log messages associated with given source.
          + *
          + * @method showSource
          + * @param {String} Source name.
          + */
          +YAHOO.widget.LogReader.prototype.showSource = function(sSource) {
          +    var filtersArray = this._sourceFilters;
          +    // Don't do anything if category is already enabled
          +    // Use Array.indexOf if available...
          +    if(filtersArray.indexOf) {
          +         if(filtersArray.indexOf(sSource) >  -1) {
          +            return;
          +        }
          +    }
          +    // ...or do it the old-fashioned way
          +    else {
          +        for(var i=0; i<filtersArray.length; i++) {
          +           if(sSource == filtersArray[i]){
          +                return;
          +            }
          +        }
          +    }
          +    filtersArray.push(sSource);
          +    this._filterLogs();
          +    this.getCheckbox(sSource).checked = true;
          +};
          +
          +/**
          + * Hides log messages associated with given source.
          + *
          + * @method hideSource
          + * @param {String} Source name.
          + */
          +YAHOO.widget.LogReader.prototype.hideSource = function(sSource) {
          +    var filtersArray = this._sourceFilters;
          +    for(var i=0; i<filtersArray.length; i++) {
          +        if(sSource == filtersArray[i]) {
          +            filtersArray.splice(i, 1);
          +            break;
          +        }
          +    }
          +    this._filterLogs();
          +    this.getCheckbox(sSource).checked = false;
          +};
          +
          +/**
          + * Does not delete any log messages, but clears all printed log messages from
          + * the console. Log messages will be printed out again if user re-filters. The
          + * static method YAHOO.widget.Logger.reset() should be called in order to
          + * actually delete log messages.
          + *
          + * @method clearConsole
          + */
          +YAHOO.widget.LogReader.prototype.clearConsole = function() {
          +    // Clear the buffer of any pending messages
          +    this._timeout = null;
          +    this._buffer = [];
          +    this._consoleMsgCount = 0;
          +
          +    var elConsole = this._elConsole;
          +    while(elConsole.hasChildNodes()) {
          +        elConsole.removeChild(elConsole.firstChild);
          +    }
          +};
          +
          +/**
          + * 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) ?
          +        ["<pre class=\"yui-log-verbose\"><p><span class='", category, "'>", label, "</span> ",
          +        totalTime, "ms (+", elapsedTime, ") ",
          +        localTime, ": ",
          +        "</p><p>",
          +        sourceAndDetail,
          +        ": </p><p>",
          +        msg,
          +        "</p></pre>"] :
          +
          +        ["<pre><p><span class='", category, "'>", label, "</span> ",
          +        totalTime, "ms (+", elapsedTime, ") ",
          +        localTime, ": ",
          +        sourceAndDetail, ": ",
          +        msg, "</p></pre>"];
          +
          +    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 LogReader 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;
          +
          +//TODO: remove
          +/**
          + * A class member shared by all LogReaders 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;
          +
          +/**
          + * Hash of filters and their related checkbox elements.
          + *
          + * @property _filterCheckboxes
          + * @type Object
          + * @private
          + */
          +YAHOO.widget.LogReader.prototype._filterCheckboxes = 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;
          +
          +/**
          + * LogReader container element.
          + *
          + * @property _elContainer
          + * @type HTMLElement
          + * @private
          + */
          +YAHOO.widget.LogReader.prototype._elContainer = null;
          +
          +/**
          + * LogReader header element.
          + *
          + * @property _elHd
          + * @type HTMLElement
          + * @private
          + */
          +YAHOO.widget.LogReader.prototype._elHd = null;
          +
          +/**
          + * LogReader collapse element.
          + *
          + * @property _elCollapse
          + * @type HTMLElement
          + * @private
          + */
          +YAHOO.widget.LogReader.prototype._elCollapse = null;
          +
          +/**
          + * LogReader collapse button element.
          + *
          + * @property _btnCollapse
          + * @type HTMLElement
          + * @private
          + */
          +YAHOO.widget.LogReader.prototype._btnCollapse = null;
          +
          +/**
          + * LogReader title header element.
          + *
          + * @property _title
          + * @type HTMLElement
          + * @private
          + */
          +YAHOO.widget.LogReader.prototype._title = null;
          +
          +/**
          + * LogReader console element.
          + *
          + * @property _elConsole
          + * @type HTMLElement
          + * @private
          + */
          +YAHOO.widget.LogReader.prototype._elConsole = null;
          +
          +/**
          + * LogReader footer element.
          + *
          + * @property _elFt
          + * @type HTMLElement
          + * @private
          + */
          +YAHOO.widget.LogReader.prototype._elFt = null;
          +
          +/**
          + * LogReader buttons container element.
          + *
          + * @property _elBtns
          + * @type HTMLElement
          + * @private
          + */
          +YAHOO.widget.LogReader.prototype._elBtns = null;
          +
          +/**
          + * Container element for LogReader category filter checkboxes.
          + *
          + * @property _elCategoryFilters
          + * @type HTMLElement
          + * @private
          + */
          +YAHOO.widget.LogReader.prototype._elCategoryFilters = null;
          +
          +/**
          + * Container element for LogReader source filter checkboxes.
          + *
          + * @property _elSourceFilters
          + * @type HTMLElement
          + * @private
          + */
          +YAHOO.widget.LogReader.prototype._elSourceFilters = null;
          +
          +/**
          + * LogReader 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 LogReader 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;
          +        
          +        this._filterCheckboxes[sCategory] = chkCategory;
          +    }
          +};
          +
          +/**
          + * Creates a checkbox in the LogReader 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;
          +        
          +        this._filterCheckboxes[sSource] = chkSource;
          +    }
          +};
          +
          +/**
          + * 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());
          +    }
          +};
          +
          +/**
          + * 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);
          +            if(this.newestOnTop) {
          +                this._elConsole.innerHTML = output + this._elConsole.innerHTML;
          +            }
          +            else {
          +                this._elConsole.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 category = this.category;
          +    if(!this.checked) {
          +        oSelf.hideCategory(category);
          +    }
          +    else {
          +        oSelf.showCategory(category);
          +    }
          +};
          +
          +/**
          + * Handles check events on the category filter checkboxes.
          + *
          + * @method _onCheckSource
          + * @param v {HTMLEvent} The click event.
          + * @param oSelf {Object} The LogReader instance.
          + * @private
          + */
          +YAHOO.widget.LogReader.prototype._onCheckSource = function(v, oSelf) {
          +    var source = this.source;
          +    if(!this.checked) {
          +        oSelf.hideSource(source);
          +    }
          +    else {
          +        oSelf.showSource(source);
          +    }
          +};
          +
          +/**
          + * 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) {
          +    if(!oSelf.isCollapsed) {
          +        oSelf.collapse();
          +    }
          +    else {
          +        oSelf.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) {
          +    if(!oSelf.isPaused) {
          +        oSelf.pause();
          +    }
          +    else {
          +        oSelf.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();}, oSelf.outputBuffer);
          +    }
          +};
          +
          +/**
          + * 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();
          +};
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/LogWriter.js.html b/www/extras/yui/docs/LogWriter.js.html new file mode 100644 index 000000000..a169a3491 --- /dev/null +++ b/www/extras/yui/docs/LogWriter.js.html @@ -0,0 +1,199 @@ + + + + API: logger LogWriter.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Logger Widget  2.2.2

          +

          + Yahoo! UI Library + > logger + + > LogWriter.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /****************************************************************************/
          +/****************************************************************************/
          +/****************************************************************************/
          +
          +/**
          + * The LogWriter class provides a mechanism to log messages through
          + * YAHOO.widget.Logger from a named source.
          + *
          + * @class 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;
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Logger.js.html b/www/extras/yui/docs/Logger.js.html new file mode 100644 index 000000000..525bcb9fc --- /dev/null +++ b/www/extras/yui/docs/Logger.js.html @@ -0,0 +1,547 @@ + + + + API: logger Logger.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Logger Widget  2.2.2

          +

          + Yahoo! UI Library + > logger + + > Logger.js (source view) +

          +
          + +
          +
          +
          + +
          +
           /**
          + * 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
          + */
          +
          +/****************************************************************************/
          +/****************************************************************************/
          +/****************************************************************************/
          +
          +/**
          + * 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 Logger
          + * @static
          + */
          +YAHOO.widget.Logger = {
          +    // Initialize properties
          +    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 properties
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +/**
          + * True if Logger is enabled, false otherwise.
          + *
          + * @property loggerEnabled
          + * @type Boolean
          + * @static
          + * @default true
          + */
          +
          +/**
          + * Array of categories.
          + *
          + * @property categories
          + * @type String[]
          + * @static
          + * @default ["info","warn","error","time","window"]
          + */
          +
          +/**
          + * Array of sources.
          + *
          + * @property sources
          + * @type String[]
          + * @static
          + * @default ["global"]
          + */
          +
          +/**
          + * Upper limit on size of internal stack.
          + *
          + * @property maxStackEntries
          + * @type Number
          + * @static
          + * @default 2500
          + */
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Private properties
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +/**
          + * Internal property to track whether output to browser console is enabled.
          + *
          + * @property _browserConsoleEnabled
          + * @type Boolean
          + * @static
          + * @default false
          + * @private
          + */
          +
          +/**
          + * Array to hold all log messages.
          + *
          + * @property _stack
          + * @type Array
          + * @static
          + * @private
          + */
          +/**
          + * Static timestamp of Logger initialization.
          + *
          + * @property _startTime
          + * @type Date
          + * @static
          + * @private
          + */
          +/**
          + * Timestamp of last logged message.
          + *
          + * @property _lastTime
          + * @type Date
          + * @static
          + * @private
          + */
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// 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 © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/MenuNode.js.html b/www/extras/yui/docs/MenuNode.js.html new file mode 100644 index 000000000..bf906d312 --- /dev/null +++ b/www/extras/yui/docs/MenuNode.js.html @@ -0,0 +1,155 @@ + + + + API: treeview MenuNode.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + + > MenuNode.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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;
          +
          +    this.logger     = new YAHOO.widget.LogWriter(this.toString());
          +
          +};
          +
          +YAHOO.extend(YAHOO.widget.MenuNode, YAHOO.widget.TextNode, {
          +
          +    toString: function() { 
          +        return "MenuNode (" + this.index + ") " + this.label;
          +    }
          +
          +});
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Module.js.html b/www/extras/yui/docs/Module.js.html new file mode 100644 index 000000000..dbe0fcb1f --- /dev/null +++ b/www/extras/yui/docs/Module.js.html @@ -0,0 +1,968 @@ + + + + API: container Module.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + + > Module.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +*  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
          +* @title Container
          +* @requires yahoo,dom,event,dragdrop,animation
          +*/
          +
          +/**
          +* 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.
          +* @namespace YAHOO.widget
          +* @class Module
          +* @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);
          +	} else {
          +		YAHOO.log("No element or element ID specified for Module instantiation", "error");
          +	}
          +};
          +
          +/**
          +* 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 = null;
          +
          +/**
          +* 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 = null;
          +
          +/**
          +* 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 = "yui-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;";
          +
          +/**
          +* Singleton CustomEvent fired when the font size is changed in the browser.
          +* Opera's "zoom" functionality currently does not support text size detection.
          +* @event YAHOO.widget.Module.textResizeEvent
          +*/
          +YAHOO.widget.Module.textResizeEvent = new YAHOO.util.CustomEvent("textResize");
          +
          +/**
          +* Constant representing the name of the Module's events
          +* @property YAHOO.widget.Module._EVENT_TYPES
          +* @private
          +* @final
          +* @type Object
          +*/
          +YAHOO.widget.Module._EVENT_TYPES = {
          +
          +    "BEFORE_INIT": "beforeInit",
          +    "INIT": "init",
          +    "APPEND": "append",
          +    "BEFORE_RENDER": "beforeRender",
          +    "RENDER": "render",
          +    "CHANGE_HEADER": "changeHeader",
          +    "CHANGE_BODY": "changeBody",
          +    "CHANGE_FOOTER": "changeFooter",
          +    "CHANGE_CONTENT": "changeContent",
          +    "DESTORY": "destroy",
          +    "BEFORE_SHOW": "beforeShow",
          +    "SHOW": "show",
          +    "BEFORE_HIDE": "beforeHide",
          +    "HIDE": "hide"
          +
          +};
          +    
          +/**
          +* Constant representing the Module's configuration properties
          +* @property YAHOO.widget.Module._DEFAULT_CONFIG
          +* @private
          +* @final
          +* @type Object
          +*/
          +YAHOO.widget.Module._DEFAULT_CONFIG = {
          +
          +    "VISIBLE": { 
          +        key: "visible", 
          +        value: true, 
          +        validator: YAHOO.lang.isBoolean 
          +    },
          +
          +    "EFFECT": { 
          +        key: "effect", 
          +        suppressEvent:true, 
          +        supercedes:["visible"] 
          +    },
          +
          +    "MONITOR_RESIZE": { 
          +        key: "monitorresize", 
          +        value:true  
          +    }
          +
          +};
          +
          +
          +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() {
          +
          +        var EVENT_TYPES = YAHOO.widget.Module._EVENT_TYPES;
          +
          +		/**
          +		* 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(EVENT_TYPES.BEFORE_INIT, this);
          +
          +		/**
          +		* 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(EVENT_TYPES.INIT, this);
          +
          +		/**
          +		* CustomEvent fired when the Module is appended to the DOM
          +		* @event appendEvent
          +		*/
          +		this.appendEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.APPEND, this);
          +
          +		/**
          +		* CustomEvent fired before the Module is rendered
          +		* @event beforeRenderEvent
          +		*/
          +		this.beforeRenderEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.BEFORE_RENDER, this);
          +
          +		/**
          +		* CustomEvent fired after the Module is rendered
          +		* @event renderEvent
          +		*/
          +		this.renderEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.RENDER, this);
          +	
          +		/**
          +		* 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(EVENT_TYPES.CHANGE_HEADER, this);
          +		
          +		/**
          +		* 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(EVENT_TYPES.CHANGE_BODY, this);
          +		
          +		/**
          +		* 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(EVENT_TYPES.CHANGE_FOOTER, this);
          +
          +		/**
          +		* CustomEvent fired when the content of the Module is modified
          +		* @event changeContentEvent
          +		*/
          +		this.changeContentEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.CHANGE_CONTENT, this);
          +
          +		/**
          +		* CustomEvent fired when the Module is destroyed
          +		* @event destroyEvent
          +		*/
          +		this.destroyEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.DESTORY, this);
          +		
          +		/**
          +		* CustomEvent fired before the Module is shown
          +		* @event beforeShowEvent
          +		*/
          +		this.beforeShowEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.BEFORE_SHOW, this);
          +
          +		/**
          +		* CustomEvent fired after the Module is shown
          +		* @event showEvent
          +		*/
          +		this.showEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.SHOW, this);
          +
          +		/**
          +		* CustomEvent fired before the Module is hidden
          +		* @event beforeHideEvent
          +		*/
          +		this.beforeHideEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.BEFORE_HIDE, this);
          +
          +		/**
          +		* CustomEvent fired after the Module is hidden
          +		* @event hideEvent
          +		*/
          +		this.hideEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.HIDE, this);
          +	}, 
          +
          +	/**
          +	* 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 //
          +
          +    	var DEFAULT_CONFIG = YAHOO.widget.Module._DEFAULT_CONFIG;
          +
          +		/**
          +		* Specifies whether the Module is visible on the page.
          +		* @config visible
          +		* @type Boolean
          +		* @default true
          +		*/
          +		this.cfg.addProperty(
          +		          DEFAULT_CONFIG.VISIBLE.key, 
          +		          {
          +		              handler: this.configVisible, 
          +		              value: DEFAULT_CONFIG.VISIBLE.value, 
          +		              validator: DEFAULT_CONFIG.VISIBLE.validator
          +                  }
          +              );
          +
          +		/**
          +		* 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(
          +                    DEFAULT_CONFIG.EFFECT.key, 
          +                    {
          +                        suppressEvent: DEFAULT_CONFIG.EFFECT.suppressEvent, 
          +                        supercedes: DEFAULT_CONFIG.EFFECT.supercedes
          +                    }
          +                );
          +
          +		/**
          +		* 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(
          +		          DEFAULT_CONFIG.MONITOR_RESIZE.key,
          +		          {
          +		              handler: this.configMonitorResize,
          +		              value: DEFAULT_CONFIG.MONITOR_RESIZE.value
          +                  }
          +              );
          +		
          +	},
          +
          +	/**
          +	* 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;
          +                var 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();
          +
          +                }
          +            }
          +
          +			var fireTextResize = function() {
          +				YAHOO.widget.Module.textResizeEvent.fire();
          +			};
          +
          +            if(resizeMonitor && resizeMonitor.contentWindow) {
          +                this.resizeMonitor = resizeMonitor;
          +
          +				YAHOO.widget.Module.textResizeEvent.subscribe(this.onDomResize, this, true);
          +
          +				if (! YAHOO.widget.Module.textResizeInitialized) {
          +					if (! YAHOO.util.Event.addListener(this.resizeMonitor.contentWindow, "resize", fireTextResize)) {
          +						// This will fail in IE if document.domain has changed, so we must change the listener to
          +						// use the resizeMonitor element instead
          +						YAHOO.util.Event.addListener(this.resizeMonitor, "resize", fireTextResize);
          +					}
          +					YAHOO.widget.Module.textResizeInitialized = 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)) {
          +				YAHOO.log("Render failed. Must specify appendTo node if Module isn't already in the DOM.", "error");
          +				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() {
          +		var parent;
          +
          +		if (this.element) {
          +			YAHOO.util.Event.purgeElement(this.element, true);
          +			parent = this.element.parentNode;
          +		}
          +		if (parent) {
          +			parent.removeChild(this.element);
          +		}
          +
          +		this.element = null;
          +		this.header = null;
          +		this.body = null;
          +		this.footer = null;
          +
          +		for (var e in this) {
          +			if (e instanceof YAHOO.util.CustomEvent) {
          +				e.unsubscribeAll();
          +			}
          +		}
          +
          +		YAHOO.widget.Module.textResizeEvent.unsubscribe(this.onDomResize, this);
          +
          +		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.widget.Module.textResizeEvent.unsubscribe(this.onDomResize, this, true);
          +			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;
          +};
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Motion.js.html b/www/extras/yui/docs/Motion.js.html new file mode 100644 index 000000000..3b45abe95 --- /dev/null +++ b/www/extras/yui/docs/Motion.js.html @@ -0,0 +1,269 @@ + + + + API: animation Motion.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          animation  2.2.2

          +

          + Yahoo! UI Library + > animation + + > Motion.js (source view) +

          +
          + +
          +
          +
          + +
          +
          (function() {
          +/**
          + * 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)
          + */
          +    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');
          +    };
          +})();
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Node.js.html b/www/extras/yui/docs/Node.js.html new file mode 100644 index 000000000..ec15a33dd --- /dev/null +++ b/www/extras/yui/docs/Node.js.html @@ -0,0 +1,1119 @@ + + + + API: treeview Node.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + + > Node.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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
          + * @uses YAHOO.util.EventProvider
          + * @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,
          +
          +    /**
          +     * Specifies whether or not the content area of the node should be allowed
          +     * to wrap.
          +     * @property nowrap
          +     * @type boolean
          +     * @default false
          +     */
          +    nowrap: false,
          +
          +    /**
          +     * 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",
          +    */
          +
          +    /**
          +     * 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;
          +        this.logger     = new YAHOO.widget.LogWriter(this.toString());
          +
          +        /**
          +         * 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 tree 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();
          +        }
          +
          +        // @todo why was this put here.  This causes new nodes added at the
          +        // root level to lose the menu behavior.
          +        // 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) {
          +        this.logger.log("insertBefore: " + node);
          +        var p = node.parent;
          +        if (p) {
          +
          +            if (this.tree) {
          +                this.tree.popNode(this);
          +            }
          +
          +            var refIndex = node.isChildOf(p);
          +            //this.logger.log(refIndex);
          +            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) {
          +        this.logger.log("insertAfter: " + node);
          +        var p = node.parent;
          +        if (p) {
          +
          +            if (this.tree) {
          +                this.tree.popNode(this);
          +            }
          +
          +            var refIndex = node.isChildOf(p);
          +            this.logger.log(refIndex);
          +
          +            if (!node.nextSibling) {
          +                this.nextSibling = null;
          +                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() {
          +        this.logger.log("hiding " + this.index);
          +
          +        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;
          +    }, 
          +    */
          +
          +    /**
          +     * 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 "";
          +        }
          +    },
          +    */
          +
          +    /**
          +     * 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) {
          +            this.logger.log("Collapse was stopped by the abstract onCollapse");
          +            return;
          +        }
          +
          +        ret = this.tree.fireEvent("collapse", this);
          +
          +        if (false === ret) {
          +            this.logger.log("Collapse was stopped by a custom event handler");
          +            return;
          +        }
          +
          +
          +        if (!this.getEl()) {
          +            this.expanded = false;
          +        } else {
          +            // hide the child div
          +            this.hideChildren();
          +            this.expanded = false;
          +
          +            this.updateIcon();
          +        }
          +
          +        // this.getSpacer().title = this.getStateText();
          +
          +        ret = this.tree.fireEvent("collapseComplete", this);
          +
          +    },
          +
          +    /**
          +     * 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) {
          +            this.logger.log("Expand was stopped by the abstract onExpand");
          +            return;
          +        }
          +        
          +        ret = this.tree.fireEvent("expand", this);
          +
          +        if (false === ret) {
          +            this.logger.log("Expand was stopped by the custom event handler");
          +            return;
          +        }
          +
          +        if (!this.getEl()) {
          +            this.expanded = true;
          +            return;
          +        }
          +
          +        if (! this.childrenRendered) {
          +            this.logger.log("children not rendered yet");
          +            this.getChildrenEl().innerHTML = this.renderChildren();
          +        } else {
          +            this.logger.log("CHILDREN RENDERED");
          +        }
          +
          +        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();
          +
          +        ret = this.tree.fireEvent("expandComplete", this);
          +    },
          +
          +    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() {
          +        // this.logger.log("No children, " + " isDyanmic: " + this.isDynamic() + " expanded: " + this.expanded);
          +        if (this.isLoading) {
          +            this.logger.log("returning the loading icon");
          +            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";
          +            }
          +
          +            // this.logger.log("ygtv" + loc + type);
          +            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));
          +        // this.logger.log("isDynamic: " + lazy);
          +        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() {
          +
          +        this.logger.log("rendering children for " + this.index);
          +
          +        var node = this;
          +
          +        if (this.isDynamic() && !this.dynamicLoadComplete) {
          +            this.isLoading = true;
          +            this.tree.locked = true;
          +
          +            if (this.dataLoader) {
          +                this.logger.log("Using dynamic loader defined for this node");
          +
          +                setTimeout( 
          +                    function() {
          +                        node.dataLoader(node, 
          +                            function() { 
          +                                node.loadComplete(); 
          +                            });
          +                    }, 10);
          +                
          +            } else if (this.tree.root.dataLoader) {
          +                this.logger.log("Using the tree-level dynamic loader");
          +
          +                setTimeout( 
          +                    function() {
          +                        node.tree.root.dataLoader(node, 
          +                            function() { 
          +                                node.loadComplete(); 
          +                            });
          +                    }, 10);
          +
          +            } else {
          +                this.logger.log("no loader found");
          +                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() {
          +        this.logger.log("completeRender: " + this.index + ", # of children: " + this.children.length);
          +        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.logger.log("loadComplete: " + this.index);
          +        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)  {
          +            this.logger.log("illegal getAncestor depth: " + depth);
          +            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() { 
          +        this.logger.log("Generating html");
          +        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);
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Overlay.js.html b/www/extras/yui/docs/Overlay.js.html new file mode 100644 index 000000000..d0acc6653 --- /dev/null +++ b/www/extras/yui/docs/Overlay.js.html @@ -0,0 +1,1202 @@ + + + + API: container Overlay.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + + > Overlay.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +* 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.
          +* @namespace YAHOO.widget
          +* @class Overlay
          +* @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);
          +
          +/**
          +* Constant representing the name of the Overlay's events
          +* @property YAHOO.widget.Overlay._EVENT_TYPES
          +* @private
          +* @final
          +* @type Object
          +*/
          +YAHOO.widget.Overlay._EVENT_TYPES = {
          +
          +    "BEFORE_MOVE": "beforeMove",
          +    "MOVE": "move"
          +
          +};
          +
          +/**
          +* Constant representing the Overlay's configuration properties
          +* @property YAHOO.widget.Overlay._DEFAULT_CONFIG
          +* @private
          +* @final
          +* @type Object
          +*/
          +YAHOO.widget.Overlay._DEFAULT_CONFIG = {
          +
          +    "X": { 
          +        key: "x", 
          +        validator:YAHOO.lang.isNumber, 
          +        suppressEvent:true, supercedes:["iframe"] 
          +    },
          +
          +    "Y": { 
          +        key: "y", 
          +        validator:YAHOO.lang.isNumber, 
          +        suppressEvent:true, supercedes:["iframe"] 
          +    },
          +
          +    "XY": { 
          +        key: "xy", 
          +        suppressEvent:true, 
          +        supercedes:["iframe"] 
          +    },
          +
          +    "CONTEXT": { 
          +        key: "context", 
          +        suppressEvent:true, 
          +        supercedes:["iframe"] 
          +    },
          +
          +    "FIXED_CENTER": { 
          +        key: "fixedcenter", 
          +        value:false, 
          +        validator:YAHOO.lang.isBoolean, 
          +        supercedes:["iframe","visible"] 
          +    },
          +
          +    "WIDTH": { 
          +        key: "width", 
          +        suppressEvent:true, 
          +        supercedes:["iframe"] 
          +    }, 
          +
          +    "HEIGHT": { 
          +        key: "height", 
          +        suppressEvent:true, 
          +        supercedes:["iframe"] 
          +    }, 
          +
          +    "ZINDEX": { 
          +        key: "zindex", 
          +        value:null 
          +    }, 
          +
          +    "CONSTRAIN_TO_VIEWPORT": { 
          +        key: "constraintoviewport", 
          +        value:false, 
          +        validator:YAHOO.lang.isBoolean, 
          +        supercedes:["iframe","x","y","xy"] 
          +    }, 
          +
          +    "IFRAME": { 
          +        key: "iframe", 
          +        value:(YAHOO.widget.Module.prototype.browser == "ie" ? true : false), 
          +        validator:YAHOO.lang.isBoolean, 
          +        supercedes:["zIndex"] 
          +    }
          +
          +};
          +
          +/**
          +* 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 = "yui-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);
          +
          +    var EVENT_TYPES = YAHOO.widget.Overlay._EVENT_TYPES;
          +
          +	/**
          +	* 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(EVENT_TYPES.BEFORE_MOVE, 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(EVENT_TYPES.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 //
          +
          +    var DEFAULT_CONFIG = YAHOO.widget.Overlay._DEFAULT_CONFIG;
          +
          +	/**
          +	* The absolute x-coordinate position of the Overlay
          +	* @config x
          +	* @type Number
          +	* @default null
          +	*/
          +	this.cfg.addProperty(
          +	           DEFAULT_CONFIG.X.key, 
          +	           { 
          +	               handler: this.configX, 
          +	               validator: DEFAULT_CONFIG.X.validator, 
          +	               suppressEvent: DEFAULT_CONFIG.X.suppressEvent, 
          +	               supercedes: DEFAULT_CONFIG.X.supercedes
          +               }
          +           );
          +
          +	/**
          +	* The absolute y-coordinate position of the Overlay
          +	* @config y
          +	* @type Number
          +	* @default null
          +	*/
          +	this.cfg.addProperty(
          +	           DEFAULT_CONFIG.Y.key,
          +	           {
          +	               handler: this.configY, 
          +	               validator: DEFAULT_CONFIG.Y.validator, 
          +	               suppressEvent: DEFAULT_CONFIG.Y.suppressEvent, 
          +	               supercedes: DEFAULT_CONFIG.Y.supercedes
          +               }
          +           );
          +
          +	/**
          +	* An array with the absolute x and y positions of the Overlay
          +	* @config xy
          +	* @type Number[]
          +	* @default null
          +	*/
          +	this.cfg.addProperty(
          +	           DEFAULT_CONFIG.XY.key,
          +	           {
          +	               handler: this.configXY, 
          +	               suppressEvent: DEFAULT_CONFIG.XY.suppressEvent, 
          +	               supercedes: DEFAULT_CONFIG.XY.supercedes
          +               }
          +           );
          +
          +	/**
          +	* 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(
          +	           DEFAULT_CONFIG.CONTEXT.key,
          +	           {
          +	               handler: this.configContext, 
          +	               suppressEvent: DEFAULT_CONFIG.CONTEXT.suppressEvent, 
          +	               supercedes: DEFAULT_CONFIG.CONTEXT.supercedes
          +               }
          +           );
          +
          +	/**
          +	* True if the Overlay should be anchored to the center of the viewport.
          +	* @config fixedcenter
          +	* @type Boolean
          +	* @default false
          +	*/
          +	this.cfg.addProperty(
          +               DEFAULT_CONFIG.FIXED_CENTER.key, 
          +               {
          +                    handler: this.configFixedCenter,
          +                    value: DEFAULT_CONFIG.FIXED_CENTER.value, 
          +                    validator: DEFAULT_CONFIG.FIXED_CENTER.validator, 
          +                    supercedes: DEFAULT_CONFIG.FIXED_CENTER.supercedes
          +                }
          +            );
          +
          +	/**
          +	* CSS width of the Overlay.
          +	* @config width
          +	* @type String
          +	* @default null
          +	*/
          +	this.cfg.addProperty(
          +	           DEFAULT_CONFIG.WIDTH.key,
          +	           {
          +	               handler: this.configWidth, 
          +	               suppressEvent: DEFAULT_CONFIG.WIDTH.suppressEvent, 
          +	               supercedes: DEFAULT_CONFIG.WIDTH.supercedes
          +               }
          +           );
          +
          +	/**
          +	* CSS height of the Overlay.
          +	* @config height
          +	* @type String
          +	* @default null
          +	*/
          +	this.cfg.addProperty(
          +	           DEFAULT_CONFIG.HEIGHT.key, 
          +	           {
          +	               handler: this.configHeight, 
          +	               suppressEvent: DEFAULT_CONFIG.HEIGHT.suppressEvent, 
          +	               supercedes: DEFAULT_CONFIG.HEIGHT.supercedes
          +               }
          +           );
          +
          +	/**
          +	* CSS z-index of the Overlay.
          +	* @config zIndex
          +	* @type Number
          +	* @default null
          +	*/
          +	this.cfg.addProperty(
          +	           DEFAULT_CONFIG.ZINDEX.key, 
          +	           {
          +	               handler: this.configzIndex,
          +	               value: DEFAULT_CONFIG.ZINDEX.value
          +               }
          +           );
          +
          +	/**
          +	* True if the Overlay should be prevented from being positioned out of the viewport.
          +	* @config constraintoviewport
          +	* @type Boolean
          +	* @default false
          +	*/
          +	this.cfg.addProperty(
          +	           DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.key, 
          +	           {
          +	               handler: this.configConstrainToViewport, 
          +	               value: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.value, 
          +	               validator: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.validator, 
          +	               supercedes: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.supercedes
          +               }
          +           );
          +
          +	/**
          +	* 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(
          +	           DEFAULT_CONFIG.IFRAME.key, 
          +	           {
          +	               handler: this.configIframe, 
          +	               value: DEFAULT_CONFIG.IFRAME.value, 
          +	               validator: DEFAULT_CONFIG.IFRAME.validator, 
          +	               supercedes: DEFAULT_CONFIG.IFRAME.supercedes
          +	           }
          +           );
          +
          +};
          +
          +/**
          +* 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");
          +
          +	YAHOO.log("xy: " + [x,y], "iframe");
          +
          +	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");
          +		}
          +
          +		YAHOO.log("iframe positioning to: " + [x,y], "iframe");
          +
          +		if (! isNaN(x) && ! isNaN(y)) {
          +			if (! this.iframe) {
          +				this.iframe = document.createElement("iframe");
          +				if (this.isSecure) {
          +					this.iframe.src = 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 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.windowResizeEvent.unsubscribe(this.doCenterOnDOMEvent, this);
          +	YAHOO.widget.Overlay.windowScrollEvent.unsubscribe(this.doCenterOnDOMEvent, this);
          +
          +	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;
          +}
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/OverlayManager.js.html b/www/extras/yui/docs/OverlayManager.js.html new file mode 100644 index 000000000..ae6a397db --- /dev/null +++ b/www/extras/yui/docs/OverlayManager.js.html @@ -0,0 +1,510 @@ + + + + API: container OverlayManager.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + + > OverlayManager.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +* 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) {
          +
          +                if (activeOverlay != o) {
          +
          +                    if(activeOverlay) {
          +    
          +                        activeOverlay.blur();
          +    
          +                    }
          +    
          +                    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);
          +    
          +                    o.focusEvent.fire();
          +                
          +                }
          +
          +			}
          +
          +		};
          +
          +		/**
          +		* 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.hideEvent.unsubscribe(o.blur);
          +                o.destroyEvent.unsubscribe(this._onOverlayDestroy, o);
          +
          +                if (o.element) {
          +
          +        			YAHOO.util.Event.removeListener(o.element, this.cfg.getProperty("focusevent"), this._onOverlayElementFocus);
          +
          +                }
          +
          +				o.cfg.setProperty("zIndex", originalZ, true);
          +				o.cfg.setProperty("manager", null);
          +
          +                o.focusEvent.unsubscribeAll();
          +                o.blurEvent.unsubscribeAll();
          +
          +				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() {
          +			for (var o=0;o<this.overlays.length;o++) {
          +                this.overlays[o].blur();
          +			}
          +		};
          +
          +
          +        this._onOverlayBlur = function(p_sType, p_aArgs) {
          +            activeOverlay = null;
          +        };
          +
          +
          +		var overlays = this.cfg.getProperty("overlays");
          +
          +		if (! this.overlays) {
          +			this.overlays = [];
          +		}
          +
          +		if (overlays) {
          +			this.register(overlays);
          +			this.overlays.sort(this.compareZIndexDesc);
          +		}
          +	},
          +
          +
          +    /**
          +    * @method _onOverlayElementFocus
          +    * @description Event handler for the DOM event that is used to focus 
          +    * the Overlay instance as specified by the "focusevent" 
          +    * configuration property.
          +    * @private
          +    * @param {Event} p_oEvent Object representing the DOM event object passed 
          +    * back by the event utility (YAHOO.util.Event).
          +    */
          +    _onOverlayElementFocus: function(p_oEvent) {
          +    
          +        var oTarget = YAHOO.util.Event.getTarget(p_oEvent),
          +            oClose = this.close;
          +
          +        
          +        if (
          +            oClose && 
          +            (
          +                oTarget == oClose ||  
          +                YAHOO.util.Dom.isAncestor(oClose, oTarget)
          +            )
          +        ) {
          +        
          +            this.blur();
          +        
          +        }
          +        else {
          +        
          +            this.focus();
          +        
          +        }
          +    
          +    },
          +
          +
          +    /**
          +    * @method _onOverlayDestroy
          +    * @description "destroy" event handler for the Overlay.
          +    * @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.Overlay} p_oOverlay Object representing the menu that 
          +    * fired the event.
          +    */
          +    _onOverlayDestroy: function(p_sType, p_aArgs, p_oOverlay) {
          +
          +        this.remove(p_oOverlay);
          +    
          +    },
          +
          +	/**
          +	* 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);
          +			overlay.blurEvent = new YAHOO.util.CustomEvent("blur", overlay);
          +
          +			var mgr=this;
          +
          +			overlay.focus = function() {
          +				mgr.focus(this);
          +			};
          +
          +			overlay.blur = function() {
          +                if(mgr.getActive() == this) {
          +                    YAHOO.util.Dom.removeClass(this.element, YAHOO.widget.OverlayManager.CSS_FOCUSED);
          +                    this.blurEvent.fire();
          +				}
          +			};
          +
          +            overlay.blurEvent.subscribe(mgr._onOverlayBlur);
          +
          +            overlay.hideEvent.subscribe(overlay.blur);
          +            
          +            overlay.destroyEvent.subscribe(this._onOverlayDestroy, overlay, this);
          +
          +			YAHOO.util.Event.addListener(overlay.element, this.cfg.getProperty("focusevent"), this._onOverlayElementFocus, null, overlay);
          +
          +			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";
          +	}
          +
          +};
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Panel.js.html b/www/extras/yui/docs/Panel.js.html new file mode 100644 index 000000000..73a26ae67 --- /dev/null +++ b/www/extras/yui/docs/Panel.js.html @@ -0,0 +1,937 @@ + + + + API: container Panel.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + + > Panel.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +* 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 = "yui-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 = "yui-panel-container";
          +
          +/**
          +* Constant representing the name of the Panel's events
          +* @property YAHOO.widget.Panel._EVENT_TYPES
          +* @private
          +* @final
          +* @type Object
          +*/
          +YAHOO.widget.Panel._EVENT_TYPES = {
          +
          +	"SHOW_MASK": "showMask",
          +	"HIDE_MASK": "hideMask",
          +	"DRAG": "drag"
          +
          +};
          +
          +/**
          +* Constant representing the Panel's configuration properties
          +* @property YAHOO.widget.Panel._DEFAULT_CONFIG
          +* @private
          +* @final
          +* @type Object
          +*/
          +YAHOO.widget.Panel._DEFAULT_CONFIG = {
          +
          +    "CLOSE": { 
          +        key: "close", 
          +        value:true, 
          +        validator:YAHOO.lang.isBoolean, 
          +        supercedes:["visible"] 
          +    },
          +
          +    "DRAGGABLE": { 
          +        key: "draggable", 
          +        value:(YAHOO.util.DD ? true : false), 
          +        validator:YAHOO.lang.isBoolean, 
          +        supercedes:["visible"]  
          +    },
          +
          +    "UNDERLAY": { 
          +        key: "underlay", 
          +        value:"shadow", 
          +        supercedes:["visible"] 
          +    },
          +
          +    "MODAL": { 
          +        key: "modal", 
          +        value:false, 
          +        validator:YAHOO.lang.isBoolean, 
          +        supercedes:["visible"] 
          +    },
          +
          +    "KEY_LISTENERS": { 
          +        key: "keylisteners", 
          +        suppressEvent:true, 
          +        supercedes:["visible"] 
          +    }
          +
          +};
          +
          +/**
          +* 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("&#160;");
          +			}
          +		}
          +	}, this, true);
          +
          +
          +    this.renderEvent.subscribe(function() {
          +
          +        /*
          +            If no value for the "width" configuration property was specified, 
          +            set it to the offsetWidth. If the "width" is not set, then in IE 
          +            you can only drag the panel when you put the cursor on the
          +            header's text.
          +        */
          +
          +        var sWidth = this.cfg.getProperty("width");
          +        
          +        if(!sWidth) {
          +
          +            this.cfg.setProperty("width", (this.element.offsetWidth + "px"));
          +        
          +        }
          +    
          +    });
          +
          +
          +	var me = this;
          +
          +	var doBlur = function() {
          +		this.blur();
          +	};
          +
          +	this.showMaskEvent.subscribe(function() {
          +
          +		var checkFocusable = function(el) {
          +
          +            var sTagName = el.tagName.toUpperCase(),
          +                bFocusable = false;
          +            
          +            switch(sTagName) {
          +            
          +                case "A":
          +                case "BUTTON":
          +                case "SELECT":
          +                case "TEXTAREA":
          +
          +                    if (! YAHOO.util.Dom.isAncestor(me.element, el)) {
          +                        YAHOO.util.Event.addListener(el, "focus", doBlur, el, true);
          +                        bFocusable = true;
          +                    }
          +
          +                break;
          +
          +                case "INPUT":
          +
          +                    if (el.type != "hidden" && ! YAHOO.util.Dom.isAncestor(me.element, el)) {
          +
          +                        YAHOO.util.Event.addListener(el, "focus", doBlur, el, true);
          +                        bFocusable = true;
          +
          +                    }
          +
          +                break;
          +            
          +            }
          +
          +            return bFocusable;
          +
          +		};
          +
          +		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", doBlur);
          +		}
          +	}, 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);
          +
          +    var EVENT_TYPES = YAHOO.widget.Panel._EVENT_TYPES;
          +
          +	/**
          +	* CustomEvent fired after the modality mask is shown
          +	* @event showMaskEvent
          +	*/
          +	this.showMaskEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.SHOW_MASK, this);
          +
          +	/**
          +	* CustomEvent fired after the modality mask is hidden
          +	* @event hideMaskEvent
          +	*/
          +	this.hideMaskEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.HIDE_MASK, this);
          +
          +	/**
          +	* CustomEvent when the Panel is dragged
          +	* @event dragEvent
          +	*/
          +	this.dragEvent = new YAHOO.util.CustomEvent(EVENT_TYPES.DRAG, this);
          +};
          +
          +/**
          +* 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 //
          +
          +    var DEFAULT_CONFIG = YAHOO.widget.Panel._DEFAULT_CONFIG;
          +
          +	/**
          +	* True if the Panel should display a "close" button
          +	* @config close
          +	* @type Boolean
          +	* @default true
          +	*/
          +    this.cfg.addProperty(
          +                DEFAULT_CONFIG.CLOSE.key,
          +                { 
          +                    handler: this.configClose, 
          +                    value: DEFAULT_CONFIG.CLOSE.value, 
          +                    validator: DEFAULT_CONFIG.CLOSE.validator, 
          +                    supercedes: DEFAULT_CONFIG.CLOSE.supercedes
          +                } 
          +            );
          +
          +	/**
          +	* True if the Panel should be draggable.  Default value is "true" if the Drag and Drop utility is included, otherwise it is "false."
          +	* @config draggable
          +	* @type Boolean
          +	* @default true
          +	*/
          +    this.cfg.addProperty(
          +                DEFAULT_CONFIG.DRAGGABLE.key, 
          +                { 
          +                    handler: this.configDraggable, 
          +                    value: DEFAULT_CONFIG.DRAGGABLE.value, 
          +                    validator: DEFAULT_CONFIG.DRAGGABLE.validator, 
          +                    supercedes: DEFAULT_CONFIG.DRAGGABLE.supercedes 
          +                } 
          +            );
          +
          +	/**
          +	* 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(
          +                DEFAULT_CONFIG.UNDERLAY.key, 
          +                { 
          +                    handler: this.configUnderlay, 
          +                    value: DEFAULT_CONFIG.UNDERLAY.value, 
          +                    supercedes: DEFAULT_CONFIG.UNDERLAY.supercedes
          +                } 
          +            );
          +
          +	/**
          +	* 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(
          +                DEFAULT_CONFIG.MODAL.key,
          +                { 
          +                    handler: this.configModal, 
          +                    value: DEFAULT_CONFIG.MODAL.value,
          +                    validator: DEFAULT_CONFIG.MODAL.validator, 
          +                    supercedes: DEFAULT_CONFIG.MODAL.supercedes 
          +                } 
          +            );
          +
          +	/**
          +	* 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(
          +                DEFAULT_CONFIG.KEY_LISTENERS.key, 
          +                { 
          +                    handler: this.configKeyListeners, 
          +                    suppressEvent: DEFAULT_CONFIG.KEY_LISTENERS.suppressEvent, 
          +                    supercedes: DEFAULT_CONFIG.KEY_LISTENERS.supercedes
          +                } 
          +            );
          +
          +};
          +
          +// 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("span");
          +			YAHOO.util.Dom.addClass(this.close, "container-close");
          +			this.close.innerHTML = "&#160;";
          +			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 (!YAHOO.util.DD) {
          +    
          +            YAHOO.log("YAHOO.util.DD dependency not met.", "error");
          +
          +            this.cfg.setProperty("draggable", false);
          +    
          +            return;
          +        
          +        }
          +
          +		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 = "&#160;";
          +				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() {
          +
          +    var oMask = this.mask;
          +
          +    if(oMask) {
          +    
          +        /*
          +            Hide the mask before destroying it to ensure that DOM
          +            event handlers on focusable elements get removed.
          +        */
          +
          +        this.hideMask();
          +    
          +        var oParentNode = oMask.parentNode;
          +
          +        if(oParentNode) {
          +
          +            oParentNode.removeChild(oMask);
          +
          +        }
          +
          +        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) {
          +
          +        if(!YAHOO.util.DD) {
          +
          +            YAHOO.log("YAHOO.util.DD dependency not met.", "error");
          +
          +            return;
          +        
          +        }
          +
          +		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 = "&#160;";
          +
          +		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);
          +};
          +
          +/**
          +* Removes the Panel element from the DOM and sets all child elements to null.
          +* @method destroy
          +*/
          +YAHOO.widget.Panel.prototype.destroy = function() {
          +
          +    YAHOO.widget.Overlay.windowResizeEvent.unsubscribe(this.sizeMask, this);
          +
          +    if(this.close) {
          +    
          +        YAHOO.util.Event.purgeElement(this.close);
          +
          +    }
          +
          +    YAHOO.widget.Panel.superclass.destroy.call(this);  
          +
          +};
          +
          +/**
          +* 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;
          +};
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Record.html b/www/extras/yui/docs/Record.html new file mode 100644 index 000000000..232ebbc02 --- /dev/null +++ b/www/extras/yui/docs/Record.html @@ -0,0 +1,218 @@ + + + + API: datatable Record (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          DataTable Widget  2.2.2

          +

          + Yahoo! UI Library + > datatable + > Record + +

          +
          + +
          +
          +
          + + +

          + + + + + Class Record + + + + + + + +

          + + + + + +
          + The Record class defines a DataTable record. +
          + +
          +

          Constructor

          +
          +
          + Record + + ( + + + + oConfigs + ) + +
          +
          +
          Parameters:
          +
          + oConfigs + <Object> + + (optional) Object literal of key/value pairs. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _nCount + - private static number +

          +
          +
          + Internal class variable to index multiple data table instances. +
          +
          + + + + +
          +

          yuiRecordId + - string +

          +
          +
          + Unique name assigned at instantation, indicates original order. +
          +
          + + + + +
          + + +
          +
          + + + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/RecordSet.html b/www/extras/yui/docs/RecordSet.html new file mode 100644 index 000000000..dd321904e --- /dev/null +++ b/www/extras/yui/docs/RecordSet.html @@ -0,0 +1,1113 @@ + + + + API: datatable RecordSet (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          DataTable Widget  2.2.2

          +

          + Yahoo! UI Library + > datatable + > RecordSet + +

          +
          + +
          +
          +
          + + +

          + + + + + Class RecordSet + + + + + + + +

          + + + + + +
          + A RecordSet defines and manages a set of Records. +
          + +
          +

          Constructor

          +
          +
          + RecordSet + + ( + + + + data + ) + +
          +
          +
          Parameters:
          +
          + data + <Object || Object[]> + + An object literal or an array of data. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _length + - private object +

          +
          +
          + Internal counter of how many records are in the RecordSet +
          +
          + + + + +
          +

          _nCount + - private static number +

          +
          +
          + Internal class variable to index multiple data table instances. +
          +
          + + + + +
          +

          _nIndex + - private number +

          +
          +
          + Instance index. +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + addRecord

          +
          + + + + + YAHOO.widget.Record + addRecord + ( + + + oObjectLiteral + + + , + index + + + ) + + +
          + Adds one Record to the RecordSet at the given index. If index is null, +then adds the Record to the end of the RecordSet. +
          + +
          + +
          +
          Parameters:
          +
          + oObjectLiteral <Object> + An object literal of data. +
          +
          + index <Number> + (optional) Position index. +
          +
          + +
          +
          Returns: + + YAHOO.widget.Record +
          +
          A Record instance.
          +
          + +
          + +
          +
          +

          + addRecords

          +
          + + + + + YAHOO.widget.Record + addRecords + ( + + + data + + + , + index + + + ) + + +
          + Adds multiple Records to the RecordSet at the given index. If index is null, +then adds the Records to the end of the RecordSet. +
          + +
          + +
          +
          Parameters:
          +
          + data <Object[]> + An array of object literal data. +
          +
          + index <Number> + (optional) Position index. +
          +
          + +
          +
          Returns: + + YAHOO.widget.Record +
          +
          An array of Record instances.
          +
          + +
          + +
          +
          +

          + append

          +
          + + + + + YAHOO.widget.Record || YAHOO.widget.Record[] + append + ( + + + data + + + ) + + +
          + Convenience method to append the given data to the end of the RecordSet. +
          + +
          + +
          +
          Parameters:
          +
          + data <Object || Object[]> + An object literal or array of data. +
          +
          + +
          +
          Returns: + + YAHOO.widget.Record || YAHOO.widget.Record[] +
          +
          A Record or array of Records.
          +
          + +
          + +
          +
          +

          + deleteRecord

          +
          + + + + + void + deleteRecord + ( + + + i + + + , + range + + + ) + + +
          + Removes the record at the given index from the RecordSet. If a range is +given, starts at the given index and removes all records in the range. +
          + +
          + +
          +
          Parameters:
          +
          + i <Number> + Record index +
          +
          + range <Number> + (optional) Range of records to remove, or null. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getLength

          +
          + + + + + Number + getLength + ( + ) + + +
          + Returns the number of non-null records in the sparse RecordSet +
          + +
          + + +
          +
          Returns: + + Number +
          +
          Number records in the RecordSet
          +
          + +
          + +
          +
          +

          + getRecord

          +
          + + + + + Object + getRecord + ( + + + identifier + + + ) + + +
          + Returns record with given name, at the given index, or null. +
          + +
          + +
          +
          Parameters:
          +
          + identifier <String || Number> + Record ID or record index +
          +
          + +
          +
          Returns: + + Object +
          +
          Record object
          +
          + +
          + +
          +
          +

          + getRecordBy

          +
          + + + + + YAHOO.widget.Record || YAHOO.widget.Record[] + getRecordBy + ( + + + sKey + + + , + oValue + + + ) + + +
          + Returns the record(2) with the given value at the given key. +
          + +
          + +
          +
          Parameters:
          +
          + sKey <String> + Key to search. +
          +
          + oValue <Object> + to match against. +
          +
          + +
          +
          Returns: + + YAHOO.widget.Record || YAHOO.widget.Record[] +
          +
          Record or array of +Records with the given value at the given key, or null.
          +
          + +
          + +
          +
          +

          + getRecordIndex

          +
          + + + + + number + getRecordIndex + ( + + + oRecord + + + ) + + +
          + Returns index for the given record. +
          + +
          + +
          +
          Parameters:
          +
          + oRecord <object> + Record object +
          +
          + +
          +
          Returns: + + number +
          +
          index
          +
          + +
          + +
          +
          +

          + getRecords

          +
          + + + + + Array + getRecords + ( + + + i + + + , + range + + + ) + + +
          + Returns an array of Records from the RecordSet. +
          + +
          + +
          +
          Parameters:
          +
          + i <number> + (optional) Index of which record to start at +
          +
          + range <number> + (optional) Number of records to get +
          +
          + +
          +
          Returns: + + Array +
          +
          Array of records starting at given index and lenth equal to +given range. If i is null, entire RecordSet array is returned.
          +
          + +
          + +
          +
          +

          + insert

          +
          + + + + + YAHOO.widget.Record || YAHOO.widget.Record[] + insert + ( + + + data + + + ) + + +
          + Convenience method to insert the given data into the beginning of the RecordSet. +
          + +
          + +
          +
          Parameters:
          +
          + data <Object || Object[]> + An object literal or array of data. +
          +
          + +
          +
          Returns: + + YAHOO.widget.Record || YAHOO.widget.Record[] +
          +
          A Record or array of Records.
          +
          + +
          + +
          +
          +

          + replace

          +
          + + + + + YAHOO.widget.Record || YAHOO.widget.Record[] + replace + ( + + + data + + + ) + + +
          + Replaces all Records in RecordSet with new data. +
          + +
          + +
          +
          Parameters:
          +
          + data <Object || Object[]> + An object literal or array or data. +
          +
          + +
          +
          Returns: + + YAHOO.widget.Record || YAHOO.widget.Record[] +
          +
          A Record or array of Records.
          +
          + +
          + +
          +
          +

          + reset

          +
          + + + + + void + reset + ( + ) + + +
          + Removes all Records from the RecordSet. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + sort

          +
          + + + + + Array + sort + ( + + + fnSort + + + ) + + +
          + Sorts RecordSet by given function. +
          + +
          + +
          +
          Parameters:
          +
          + fnSort <Function> + Reference to a sort function. +
          +
          + +
          +
          Returns: + + Array +
          +
          Sorted array of Records
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + string + toString + ( + ) + + +
          + Public accessor to the unique name of the RecordSet instance. +
          + +
          + + +
          +
          Returns: + + string +
          +
          Unique name of the RecordSet instance
          +
          + +
          + +
          +
          +

          + updateRecord

          +
          + + + + + void + updateRecord + ( + + + oRecord + + + , + sKey + + + , + oData + + + ) + + +
          + Updates Record at given position with given data. +
          + +
          + +
          +
          Parameters:
          +
          + oRecord <YAHOO.widget.Record> + A Record instance. +
          +
          + sKey <String> + Key. +
          +
          + oData <object> + {Object) New data. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + updateRecordField

          +
          + + + + + void + updateRecordField + ( + + + oRecord + + + , + sKey + + + , + oData + + + ) + + +
          + Updates given key of given Record with given data. +
          + +
          + +
          +
          Parameters:
          +
          + oRecord <YAHOO.widget.Record> + A Record instance. +
          +
          + sKey <String> + Key. +
          +
          + oData <object> + {Object) New data. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + + +
          +

          Events

          +
          +

          + recordUpdateEvent

          +
          + + + + + recordUpdateEvent + + ( + + + oArgs.record + + + , + oArgs.key + + + , + oArgs.newData + + + , + oArgs.oldData + + + ) + + + +
          + Fired when a Record is updated with new data. +
          + +
          + + +
          +
          Parameters:
          +
          + oArgs.record <YAHOO.widget.Record> + The Record instance. +
          +
          + oArgs.key <String> + The Record key. +
          +
          + oArgs.newData <Object> + New data. +
          +
          + oArgs.oldData <Object> + Old data. +
          +
          + + +
          + +
          +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/RecordSet.js.html b/www/extras/yui/docs/RecordSet.js.html new file mode 100644 index 000000000..ff223be1c --- /dev/null +++ b/www/extras/yui/docs/RecordSet.js.html @@ -0,0 +1,547 @@ + + + + API: datatable RecordSet.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          DataTable Widget  2.2.2

          +

          + Yahoo! UI Library + > datatable + + > RecordSet.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /****************************************************************************/
          +/****************************************************************************/
          +/****************************************************************************/
          +
          +/**
          + * A RecordSet defines and manages a set of Records.
          + *
          + * @class RecordSet
          + * @param data {Object || Object[]} An object literal or an array of data.
          + * @constructor
          + */
          +YAHOO.widget.RecordSet = function(data) {
          +    // Internal variables
          +    this._nIndex = YAHOO.widget.RecordSet._nCount;
          +    this._records = [];
          +    
          +    if(data) {
          +        if(YAHOO.lang.isArray(data)) {
          +            this.addRecords(data);
          +        }
          +        else if(data.constructor == Object) {
          +            this.addRecord(data);
          +        }
          +    }
          +
          +    /**
          +     * Fired when a Record is updated with new data.
          +     *
          +     * @event recordUpdateEvent
          +     * @param oArgs.record {YAHOO.widget.Record} The Record instance.
          +     * @param oArgs.key {String} The Record key.
          +     * @param oArgs.newData {Object} New data.
          +     * @param oArgs.oldData {Object} Old data.
          +     *
          +     */
          +    this.createEvent("recordUpdateEvent");
          +    
          +    
          +    YAHOO.widget.RecordSet._nCount++;
          +    YAHOO.log("RecordSet initialized", "info", this.toString());
          +};
          +
          +if(YAHOO.util.EventProvider) {
          +    YAHOO.augment(YAHOO.widget.RecordSet, YAHOO.util.EventProvider);
          +}
          +else {
          +    YAHOO.log("Missing dependency: YAHOO.util.EventProvider","error",this.toString());
          +}
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Private member variables
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +/**
          + * Internal class variable to index multiple data table instances.
          + *
          + * @property _nCount
          + * @type number
          + * @private
          + * @static
          + */
          +YAHOO.widget.RecordSet._nCount = 0;
          +
          +/**
          + * Instance index.
          + *
          + * @property _nIndex
          + * @type number
          + * @private
          + */
          +YAHOO.widget.RecordSet.prototype._nIndex = null;
          +
          +/**
          + * Internal counter of how many records are in the RecordSet
          + *
          + * @property _length
          + * @private
          + */
          +YAHOO.widget.RecordSet.prototype._length = null;
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Private methods
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Public methods
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Public accessor to the unique name of the RecordSet instance.
          + *
          + * @method toString
          + * @return {string} Unique name of the RecordSet instance
          + */
          +YAHOO.widget.RecordSet.prototype.toString = function() {
          +    return "RecordSet instance " + this._nIndex;
          +};
          +
          +/**
          + * Returns the number of non-null records in the sparse RecordSet
          + *
          + * @method getLength
          + * @return {Number} Number records in the RecordSet
          + */
          +YAHOO.widget.RecordSet.prototype.getLength = function() {
          +        return this._length;
          +};
          +
          +/**
          + * Returns record with given name, at the given index, or null.
          + *
          + * @method getRecord
          + * @param identifier {String || Number} Record ID or record index
          + * @return {Object} Record object
          + */
          +YAHOO.widget.RecordSet.prototype.getRecord = function(identifier) {
          +    if(YAHOO.lang.isNumber(identifier)) {
          +        return this._records[identifier];
          +    }
          +    else if(YAHOO.lang.isString(identifier)) {
          +        for(var i=0; i<this._records.length; i++) {
          +            if(this._records[i].yuiRecordId == identifier) {
          +                return this._records[i];
          +            }
          +        }
          +    }
          +    return null;
          +
          +};
          +
          +/**
          + * Returns an array of Records from the RecordSet.
          + *
          + * @method getRecords
          + * @param i {number} (optional) Index of which record to start at
          + * @param range {number} (optional) Number of records to get
          + * @return {Array} Array of records starting at given index and lenth equal to
          + * given range. If i is null, entire RecordSet array is returned.
          + */
          +YAHOO.widget.RecordSet.prototype.getRecords = function(i, range) {
          +    if(!YAHOO.lang.isNumber(i)) {
          +        return this._records;
          +    }
          +    if(!YAHOO.lang.isNumber(range)) {
          +        return this._records.slice(i);
          +    }
          +    return this._records.slice(i, i+range);
          +};
          +
          +/**
          + * Returns index for the given record.
          + *
          + * @method getRecordIndex
          + * @param oRecord {object} Record object
          + * @return {number} index
          + */
          +
          +/*YAHOO.widget.RecordSet.prototype.getRecordIndex = function(oRecord) {
          +    //TODO: return i;
          +};*/
          +
          +/**
          + * Returns the record(2) with the given value at the given key.
          + *
          + * @method getRecordBy
          + * @param sKey {String} Key to search.
          + * @param oValue {Object} to match against.
          + * @return {YAHOO.widget.Record || YAHOO.widget.Record[]} Record or array of
          + * Records with the given value at the given key, or null.
          + */
          +/*YAHOO.widget.RecordSet.prototype.getRecordBy = function(sKey, oValue) {
          +     TODO: redo to match new algorithm
          +    var record = null;
          +    var length = this._records.length;
          +    for(var i=length-1; i>0; i--) {
          +        record = this._records[i];
          +        if(record && (record.extid == extId)) {
          +            return record;
          +        }
          +    }
          +    return null;
          +
          +};*/
          +
          +/**
          + * Updates Record at given position with given data.
          + *
          + * @method updateRecord
          + * @param oRecord {YAHOO.widget.Record} A Record instance.
          + * @param sKey {String} Key.
          + * @param oData {Object) New data.
          + */
          +YAHOO.widget.RecordSet.prototype.updateRecord = function(index, oData) {
          +    var oldData = this._records[index];
          +    this._records[index] = oData;
          +    this.fireEvent("recordUpdateEvent",{record:oRecord,index:index,newData:oData,oldData:oldData});
          +};
          +
          +/**
          + * Updates given key of given Record with given data.
          + *
          + * @method updateRecordField
          + * @param oRecord {YAHOO.widget.Record} A Record instance.
          + * @param sKey {String} Key.
          + * @param oData {Object) New data.
          + */
          +YAHOO.widget.RecordSet.prototype.updateRecordField = function(oRecord, sKey, oData) {
          +    var oldData = oRecord[sKey];
          +    oRecord[sKey] = oData;
          +    this.fireEvent("recordFieldUpdateEvent",{record:oRecord,key:sKey,newData:oData,oldData:oldData});
          +};
          +
          +/**
          + * Adds one Record to the RecordSet at the given index. If index is null,
          + * then adds the Record to the end of the RecordSet.
          + *
          + * @method addRecord
          + * @param oObjectLiteral {Object} An object literal of data.
          + * @param index {Number} (optional) Position index.
          + * @return {YAHOO.widget.Record} A Record instance.
          + */
          +YAHOO.widget.RecordSet.prototype.addRecord = function(oObjectLiteral, index) {
          +    if(oObjectLiteral && (oObjectLiteral.constructor == Object)) {
          +        var oRecord = new YAHOO.widget.Record(oObjectLiteral);
          +        if(YAHOO.lang.isNumber(index) && (index > -1)) {
          +            this._records.splice(index,0,oRecord);
          +        }
          +        else {
          +            this._records.push(oRecord);
          +        }
          +        this._length++;
          +        return oRecord;
          +    }
          +    else {
          +        return null;
          +    }
          +};
          +
          +/**
          + * Adds multiple Records to the RecordSet at the given index. If index is null,
          + * then adds the Records to the end of the RecordSet.
          + *
          + * @method addRecords
          + * @param data {Object[]} An array of object literal data.
          + * @param index {Number} (optional) Position index.
          + * @return {YAHOO.widget.Record} An array of Record instances.
          + */
          +YAHOO.widget.RecordSet.prototype.addRecords = function(data, index) {
          +    if(YAHOO.lang.isArray(data)) {
          +        var newRecords = [];
          +        // Can't go backwards bc we need to preserve order
          +        for(var i=0; i<data.length; i++) {
          +            var record = this.addRecord(data[i], index);
          +            newRecords.push(record);
          +       }
          +       return newRecords;
          +    }
          +    else if(data && (data.constructor == Object)) {
          +        return this.addRecord(data);
          +    }
          +    else {
          +        return null;
          +    }
          +};
          +
          +/**
          + * Convenience method to append the given data to the end of the RecordSet.
          + *
          + * @method append
          + * @param data {Object || Object[]} An object literal or array of data.
          + * @return {YAHOO.widget.Record || YAHOO.widget.Record[]} A Record or array of Records.
          + */
          +YAHOO.widget.RecordSet.prototype.append = function(data) {
          +    if(YAHOO.lang.isArray(data)) {
          +        var newRecords = [];
          +        // Cant't go backwards bc we need to preserve order
          +        for(var i=0; i<data.length; i++) {
          +            var record = this.addRecord(data[i]);
          +            newRecords.push(record);
          +            
          +       }
          +       YAHOO.log("RecordSet appended with " + newRecords.length + " Record(s)","info",this.toString());
          +       return newRecords;
          +    }
          +    else if(data && (data.constructor == Object)) {
          +        YAHOO.log("RecordSet appended with 1 Record","info",this.toString());
          +        return this.addRecord(data);
          +    }
          +    else {
          +        return null;
          +    }
          +    
          +};
          +
          +/**
          + * Convenience method to insert the given data into the beginning of the RecordSet.
          + *
          + * @method insert
          + * @param data {Object || Object[]} An object literal or array of data.
          + * @return {YAHOO.widget.Record || YAHOO.widget.Record[]} A Record or array of Records.
          + */
          +YAHOO.widget.RecordSet.prototype.insert = function(data) {
          +    if(YAHOO.lang.isArray(data)) {
          +        var newRecords = [];
          +        // Can't go backwards bc we need to preserve order
          +        for(var i=data.length-1; i>-1; i--) {
          +            var record = this.addRecord(data[i], 0);
          +            newRecords.push(record);
          +       }
          +       return newRecords;
          +    }
          +    else if(data && (data.constructor == Object)) {
          +        return this.addRecord(data, 0);
          +    }
          +    else {
          +        return null;
          +    }
          +};
          +
          +/**
          + * Replaces all Records in RecordSet with new data.
          + *
          + * @method replace
          + * @param data {Object || Object[]} An object literal or array or data.
          + * @return {YAHOO.widget.Record || YAHOO.widget.Record[]} A Record or array of Records.
          + */
          +YAHOO.widget.RecordSet.prototype.replace = function(data) {
          +    if(data) {
          +        this.reset();
          +        return this.append(data);
          +    }
          +    else {
          +        return null;
          +    }
          +};
          +
          +/**
          + * Sorts RecordSet by given function.
          + *
          + * @method sort
          + * @param fnSort {Function} Reference to a sort function.
          + * @return {Array} Sorted array of Records
          + */
          +YAHOO.widget.RecordSet.prototype.sort = function(fnSort) {
          +    return this._records.sort(fnSort);
          +};
          +
          +
          +/**
          + * Removes the record at the given index from the RecordSet. If a range is
          + * given, starts at the given index and removes all records in the range.
          + *
          + * @method deleteRecord
          + * @param i {Number} Record index
          + * @param range {Number} (optional) Range of records to remove, or null.
          + */
          +YAHOO.widget.RecordSet.prototype.deleteRecord = function(i, range) {
          +    if(!YAHOO.lang.isNumber(range)) {
          +        range = 1;
          +    }
          +    // TODO: validate for negative values
          +    if(!YAHOO.lang.isNumber(i)) {
          +        this._records.splice(i, range);
          +        this._length = this._length - range;
          +    }
          +};
          +
          +/**
          + * Removes all Records from the RecordSet.
          + *
          + * @method reset
          + */
          +YAHOO.widget.RecordSet.prototype.reset = function() {
          +    this._records = [];
          +    this._length = 0;
          +};
          +
          +
          +/****************************************************************************/
          +/****************************************************************************/
          +/****************************************************************************/
          +
          +/**
          + * The Record class defines a DataTable record.
          + *
          + * @class Record
          + * @constructor
          + * @param oConfigs {Object} (optional) Object literal of key/value pairs.
          + */
          +YAHOO.widget.Record = function(oLiteral) {
          +    if(oLiteral && (oLiteral.constructor == Object)) {
          +        for(var sKey in oLiteral) {
          +            this[sKey] = oLiteral[sKey];
          +        }
          +        this.yuiRecordId = "yui-dtrec"+YAHOO.widget.Record._nCount;
          +        YAHOO.widget.Record._nCount++;
          +    }
          +};
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Private member variables
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Internal class variable to index multiple data table instances.
          + *
          + * @property _nCount
          + * @type number
          + * @private
          + * @static
          + */
          +YAHOO.widget.Record._nCount = 0;
          +
          +/////////////////////////////////////////////////////////////////////////////
          +//
          +// Public member variables
          +//
          +/////////////////////////////////////////////////////////////////////////////
          +
          +/**
          + * Unique name assigned at instantation, indicates original order.
          + *
          + * @property yuiRecordId
          + * @type string
          + */
          +YAHOO.widget.Record.prototype.yuiRecordId = null;
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Region.js.html b/www/extras/yui/docs/Region.js.html new file mode 100644 index 000000000..fa887964b --- /dev/null +++ b/www/extras/yui/docs/Region.js.html @@ -0,0 +1,293 @@ + + + + API: dom Region.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          dom  2.2.2

          +

          + Yahoo! UI Library + > dom + + > Region.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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    );
          +
          +    // this.logger.debug("does " + this + " contain " + region + " ... " + ret);
          +};
          +
          +/**
          + * 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 © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/RootNode.js.html b/www/extras/yui/docs/RootNode.js.html new file mode 100644 index 000000000..83b59cb03 --- /dev/null +++ b/www/extras/yui/docs/RootNode.js.html @@ -0,0 +1,162 @@ + + + + API: treeview RootNode.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + + > RootNode.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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();
          +    },
          +
          +    collapse: function() {},
          +    expand: function() {}
          +
          +});
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Scroll.js.html b/www/extras/yui/docs/Scroll.js.html new file mode 100644 index 000000000..65333787b --- /dev/null +++ b/www/extras/yui/docs/Scroll.js.html @@ -0,0 +1,199 @@ + + + + API: animation Scroll.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          animation  2.2.2

          +

          + Yahoo! UI Library + > animation + + > Scroll.js (source view) +

          +
          + +
          +
          +
          + +
          +
          (function() {
          +/**
          + * 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)
          + */
          +    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 © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/SimpleDialog.js.html b/www/extras/yui/docs/SimpleDialog.js.html new file mode 100644 index 000000000..ca157f6bc --- /dev/null +++ b/www/extras/yui/docs/SimpleDialog.js.html @@ -0,0 +1,353 @@ + + + + API: container SimpleDialog.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + + > SimpleDialog.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +* 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 = "blckicon";
          +
          +/**
          +* Constant for the standard network icon for alarm
          +* @property YAHOO.widget.SimpleDialog.ICON_ALARM
          +* @static
          +* @final
          +* @type String
          +*/
          +YAHOO.widget.SimpleDialog.ICON_ALARM = "alrticon";
          +
          +/**
          +* Constant for the standard network icon for help
          +* @property YAHOO.widget.SimpleDialog.ICON_HELP
          +* @static
          +* @final
          +* @type String
          +*/
          +YAHOO.widget.SimpleDialog.ICON_HELP  = "hlpicon";
          +
          +/**
          +* Constant for the standard network icon for info
          +* @property YAHOO.widget.SimpleDialog.ICON_INFO
          +* @static
          +* @final
          +* @type String
          +*/
          +YAHOO.widget.SimpleDialog.ICON_INFO  = "infoicon";
          +
          +/**
          +* Constant for the standard network icon for warn
          +* @property YAHOO.widget.SimpleDialog.ICON_WARN
          +* @static
          +* @final
          +* @type String
          +*/
          +YAHOO.widget.SimpleDialog.ICON_WARN  = "warnicon";
          +
          +/**
          +* Constant for the standard network icon for a tip
          +* @property YAHOO.widget.SimpleDialog.ICON_TIP
          +* @static
          +* @final
          +* @type String
          +*/
          +YAHOO.widget.SimpleDialog.ICON_TIP   = "tipicon";
          +
          +/**
          +* 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 = "yui-simple-dialog";
          +
          +/**
          +* Constant representing the SimpleDialog's configuration properties
          +* @property YAHOO.widget.SimpleDialog._DEFAULT_CONFIG
          +* @private
          +* @final
          +* @type Object
          +*/
          +YAHOO.widget.SimpleDialog._DEFAULT_CONFIG = {
          +
          +    "ICON": { 
          +        key: "icon", 
          +        value:"none", 
          +        suppressEvent:true  
          +    },
          +
          +    "TEXT": { 
          +        key: "text", 
          +        value:"", 
          +        suppressEvent:true, 
          +        supercedes:["icon"] 
          +    }
          +
          +};
          +
          +/**
          +* 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 //
          +
          +    var DEFAULT_CONFIG = YAHOO.widget.SimpleDialog._DEFAULT_CONFIG;
          +
          +	/**
          +	* Sets the informational icon for the SimpleDialog
          +	* @config icon
          +	* @type String
          +	* @default "none"
          +	*/
          +	this.cfg.addProperty(
          +                DEFAULT_CONFIG.ICON.key,
          +                {
          +                    handler: this.configIcon,
          +                    value: DEFAULT_CONFIG.ICON.value,
          +                    suppressEvent: DEFAULT_CONFIG.ICON.suppressEvent
          +                }
          +            );
          +
          +	/**
          +	* Sets the text for the SimpleDialog
          +	* @config text
          +	* @type String
          +	* @default ""
          +	*/
          +    this.cfg.addProperty(
          +                DEFAULT_CONFIG.TEXT.key,	
          +                { 
          +                    handler: this.configText, 
          +                    value: DEFAULT_CONFIG.TEXT.value, 
          +                    suppressEvent: DEFAULT_CONFIG.TEXT.suppressEvent, 
          +                    supercedes: DEFAULT_CONFIG.TEXT.supercedes 
          +                } 
          +            );
          +
          +};
          +
          +
          +/**
          +* 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 = "";
          +		if (icon.indexOf(".") == -1) {
          +			iconHTML = "<span class=\"yui-icon " + icon +"\" >&#160;</span>";
          +		} else {
          +			iconHTML = "<img src=\"" + this.imageRoot + icon + "\" class=\"yui-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;
          +};
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Slider.js.html b/www/extras/yui/docs/Slider.js.html new file mode 100644 index 000000000..3efd4a8c3 --- /dev/null +++ b/www/extras/yui/docs/Slider.js.html @@ -0,0 +1,1099 @@ + + + + API: slider Slider.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Slider Widget  2.2.2

          +

          + Yahoo! UI Library + > slider + + > Slider.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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
          + */
          +
          +/**
          + * 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
          + * @uses YAHOO.util.EventProvider
          + * @constructor
          + * @param {String}      id     The id of the element linked to this instance
          + * @param {String}      sGroup The group of related DragDrop items
          + * @param {SliderThumb} oThumb The thumb for this slider
          + * @param {String}      sType  The type of slider (horiz, vert, region)
          + */
          +YAHOO.widget.Slider = function(sElementId, sGroup, oThumb, sType) {
          +    if (sElementId) {
          +        this.init(sElementId, sGroup, true);
          +        this.initSlider(sType);
          +        this.initThumb(oThumb);
          +    }
          +};
          +
          +/**
          + * 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, {
          +
          +    /**
          +     * Initializes the slider.  Executed in the constructor
          +     * @method initSlider
          +     * @param {string} sType the type of slider (horiz, vert, region)
          +     */
          +    initSlider: function(sType) {
          +
          +        /**
          +         * The type of the slider (horiz, vert, region)
          +         * @property type
          +         * @type string
          +         */
          +        this.type = sType;
          +
          +        //this.removeInvalidHandleType("A");
          +
          +        this.logger = new YAHOO.widget.LogWriter(this.toString());
          +
          +        /**
          +         * 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} newOffset|x the new offset for normal sliders, or the new
          +         *                          x offset for region sliders
          +         * @param {int} y the number of pixels the thumb has moved on the y axis
          +         *                (region sliders only)
          +         */
          +        this.createEvent("change", this);
          +
          +        /**
          +         * Event that fires at the beginning 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);
          +
          +        /**
          +         * 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.
          +         * Deprecated because this flag is only useful when the background is
          +         * clicked and the slider is animated.  If the user drags the thumb,
          +         * the flag is updated when the drag is over ... the final onDrag event
          +         * fires before the mouseup the ends the drag, so the implementer will
          +         * never see it.
          +         *
          +         * @property moveComplete
          +         * @type Boolean
          +         * @deprecated use the slideEnd event instead
          +         */
          +        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;
          +    },
          +
          +    /**
          +     * Initializes the slider's thumb. Executed in the constructor.
          +     * @method initThumb
          +     * @param {YAHOO.widget.SliderThumb} t the slider thumb
          +     */
          +    initThumb: function(t) {
          +
          +        var self = 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 = t;
          +        t.cacheBetweenDrags = true;
          +
          +        // add handler for the handle onchange event
          +        t.onChange = function() { 
          +            self.handleThumbChange(); 
          +        };
          +
          +        if (t._isHoriz && t.xTicks && t.xTicks.length) {
          +            this.tickPause = Math.round(360 / t.xTicks.length);
          +        } else if (t.yTicks && t.yTicks.length) {
          +            this.tickPause = Math.round(360 / t.yTicks.length);
          +        }
          +
          +        this.logger.log("tickPause: " + this.tickPause);
          +
          +        // delegate thumb methods
          +        t.onMouseDown = function () { return self.focus(); };
          +        t.onMouseUp = function() { self.thumbMouseUp(); };
          +        t.onDrag = function() { self.fireEvents(true); };
          +        t.onAvailable = function() { return self.setStartSliderState(); };
          +
          +    },
          +
          +    /**
          +     * Executed when the slider element is available
          +     * @method onAvailable
          +     */
          +    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);
          +    },
          + 
          +    /**
          +     * Executed when a keypress event happens with the control focused.
          +     * Prevents the default behavior for navigation keys.  The actual
          +     * logic for moving the slider thumb in response to a key event
          +     * happens in handleKeyDown.
          +     * @param {Event} e the keypress event
          +     */
          +    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:
          +            }
          +        }
          +    },
          +
          +    /**
          +     * Executed when a keydown event happens with the control focused.
          +     * Updates the slider value and display when the keypress is an
          +     * arrow key, home, or end as long as enableKeys is set to true.
          +     * @param {Event} e the keydown event
          +     */
          +    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 setStartSliderState
          +     */
          +    setStartSliderState: function() {
          +
          +        this.logger.log("Fixing state");
          +
          +        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, 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 
          +             * 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.logger.log("locking");
          +        this.thumb.lock();
          +        this.locked = true;
          +    },
          +
          +    /**
          +     * Unlocks the slider, overrides YAHOO.util.DragDrop
          +     * @method unlock
          +     */
          +    unlock: function() {
          +        this.logger.log("unlocking");
          +        this.thumb.unlock();
          +        this.locked = false;
          +    },
          +
          +    /**
          +     * Handles mouseup event on the slider background
          +     * @method thumbMouseUp
          +     * @private
          +     */
          +    thumbMouseUp: function() {
          +        this.logger.log("bg mouseup");
          +        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() {
          +        this.logger.log("focus");
          +
          +        // 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 */ 
          +        this.logger.log("onChange: " + firstOffset + ", " + secondOffset);
          +    },
          +
          +    /**
          +     * 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 */ 
          +        this.logger.log("onSlideStart");
          +    },
          +
          +    /**
          +     * Event that fires at the end of a slider thumb move
          +     * @method onSliderEnd
          +     * @deprecated use instance.subscribe("slideEnd") instead
          +     */
          +    onSlideEnd: function () { 
          +        /* override me */ 
          +        this.logger.log("onSlideEnd");
          +    },
          +
          +    /**
          +     * 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) {
          +        this.logger.log("setValue " + newOffset);
          +
          +        if (!this.thumb.available) {
          +            this.logger.log("defer setValue until after onAvailble");
          +            this.deferredSetValue = arguments;
          +            return false;
          +        }
          +
          +        if (this.isLocked() && !force) {
          +            this.logger.log("Can't set the value, the control is locked");
          +            return false;
          +        }
          +
          +        if ( isNaN(newOffset) ) {
          +            this.logger.log("setValue, Illegal argument: " + newOffset);
          +            return false;
          +        }
          +
          +        var t = this.thumb;
          +        var newX, newY;
          +        this.verifyOffset(true);
          +        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, force) {
          +
          +        if (!this.thumb.available) {
          +            this.logger.log("defer setRegionValue until after onAvailble");
          +            this.deferredSetRegionValue = arguments;
          +            return false;
          +        }
          +
          +        if (this.isLocked() && !force) {
          +            this.logger.log("Can't set the value, the control is locked");
          +            return false;
          +        }
          +
          +        if ( isNaN(newOffset) ) {
          +            this.logger.log("setRegionValue, Illegal argument: " + 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
          +     * @param checkPos {boolean} check the position instead of using cached value
          +     * @method verifyOffset
          +     * @return {boolean} True if the offset is the same as the baseline.
          +     */
          +    verifyOffset: function(checkPos) {
          +
          +        var newPos = YAHOO.util.Dom.getXY(this.getEl());
          +        //var newPos = [this.initPageX, this.initPageY];
          +
          +        this.logger.log("newPos: " + newPos, "warn");
          +
          +        if (newPos[0] != this.baselinePos[0] || newPos[1] != this.baselinePos[1]) {
          +            this.logger.log("background moved, resetting constraints");
          +            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) {
          +
          +        // this.logger.log("move thumb", "warn");
          +
          +        var t = this.thumb;
          +        var self = this;
          +
          +        if (!t.available) {
          +            this.logger.log("thumb is not available yet, aborting move");
          +            return;
          +        }
          +
          +        this.logger.log("move thumb, x: "  + x + ", y: " + y);
          +
          +        // 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.logger.log("graduated");
          +            // this.thumb._animating = true;
          +            this.lock();
          +
          +            // cache the current thumb pos
          +            this.curCoord = YAHOO.util.Dom.getXY(this.thumb.getEl());
          +
          +            setTimeout( function() { self.moveOneTick(p); }, this.tickPause );
          +
          +        } else if (this.animate && YAHOO.widget.Slider.ANIM_AVAIL && !skipAnim) {
          +            this.logger.log("animating to " + p);
          +
          +            // 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, tmp;
          +
          +
          +        // redundant call to getXY since we set the position most of time prior 
          +        // to getting here.  Moved to this.curCoord
          +        //var curCoord = YAHOO.util.Dom.getXY(t.getEl());
          +
          +        // alignElWithMouse caches position in lastPageX, lastPageY .. doesn't work
          +        //var curCoord = [this.lastPageX, this.lastPageY];
          +
          +        // 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(this.curCoord, finalCoord);
          +            var tmpX = (nextCoord) ? nextCoord[0] : this.curCoord[0];
          +            nextCoord = this._getNextY([tmpX, this.curCoord[1]], finalCoord);
          +
          +        } else if (t._isHoriz) {
          +            nextCoord = this._getNextX(this.curCoord, finalCoord);
          +        } else {
          +            nextCoord = this._getNextY(this.curCoord, finalCoord);
          +        }
          +
          +        this.logger.log("moveOneTick: " + 
          +                " finalCoord: " + finalCoord +
          +                " this.curCoord: " + this.curCoord +
          +                " nextCoord: " + nextCoord);
          +
          +        if (nextCoord) {
          +
          +            // cache the position
          +            this.curCoord = 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) {
          +        this.logger.log("getNextX: " + 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.logger.log("bg mousedown: " + x + "," + y);
          +
          +            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
          +     * @param {boolean} thumbEvent set to true if this event is fired from an event
          +     *                  that occurred on the thumb.  If it is, the state of the
          +     *                  thumb dd object should be correct.  Otherwise, the event
          +     *                  originated on the background, so the thumb state needs to
          +     *                  be refreshed before proceeding.
          +     * @private
          +     */
          +    fireEvents: function (thumbEvent) {
          +
          +        var t = this.thumb;
          +        // this.logger.log("FireEvents: " + t._isRegion);
          +
          +        if (!thumbEvent) {
          +            t.cachePosition();
          +        }
          +
          +        if (! this.isLocked()) {
          +            if (t._isRegion) {
          +                this.logger.log("region");
          +                var newX = t.getXValue();
          +                var newY = t.getYValue();
          +
          +                if (newX != this.previousX || newY != this.previousY) {
          +                    // this.logger.log("Firing onchange");
          +                    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.logger.log("Firing onchange: " + newVal);
          +                    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);
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/SliderThumb.js.html b/www/extras/yui/docs/SliderThumb.js.html new file mode 100644 index 000000000..2c3c803c1 --- /dev/null +++ b/www/extras/yui/docs/SliderThumb.js.html @@ -0,0 +1,365 @@ + + + + API: slider SliderThumb.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Slider Widget  2.2.2

          +

          + Yahoo! UI Library + > slider + + > SliderThumb.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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);
          +        YAHOO.widget.SliderThumb.superclass.constructor.call(this, id, sGroup);
          +
          +        /**
          +         * The id of the thumbs parent HTML element (the slider background 
          +         * element).
          +         * @property parentElId
          +         * @type string
          +         */
          +        this.parentElId = sGroup;
          +    }
          +
          +
          +    //this.removeInvalidHandleType("A");
          +
          +    this.logger = new YAHOO.widget.LogWriter(this.toString());
          +
          +    /**
          +     * 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]
          +     */
          +    getOffsetFromParent0: 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]) ];
          +    },
          +
          +    getOffsetFromParent: function(parentPos) {
          +
          +        var el = this.getEl();
          +
          +        if (!this.deltaOffset) {
          +
          +            var myPos = YAHOO.util.Dom.getXY(el);
          +            var ppos  = parentPos || YAHOO.util.Dom.getXY(this.parentElId);
          +
          +            var newOffset = [ (myPos[0] - ppos[0]), (myPos[1] - ppos[1]) ];
          +
          +            var l = parseInt( YAHOO.util.Dom.getStyle(el, "left"), 10 );
          +            var t = parseInt( YAHOO.util.Dom.getStyle(el, "top" ), 10 );
          +
          +            var deltaX = l - newOffset[0];
          +            var deltaY = t - newOffset[1];
          +
          +            if (isNaN(deltaX) || isNaN(deltaY)) {
          +                this.logger.log("element does not have a position style def yet");
          +            } else {
          +                this.deltaOffset = [deltaX, deltaY];
          +            }
          +
          +        } else {
          +            var newLeft = parseInt( YAHOO.util.Dom.getStyle(el, "left"), 10 );
          +            var newTop  = parseInt( YAHOO.util.Dom.getStyle(el, "top" ), 10 );
          +
          +            newOffset  = [newLeft + this.deltaOffset[0], newTop + this.deltaOffset[1]];
          +        }
          +
          +        return newOffset;
          +
          +        //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) {
          +
          +
          +        //document these.  new for 0.12.1
          +        this.initLeft = iLeft;
          +        this.initRight = iRight;
          +        this.initUp = iUp;
          +        this.initDown = iDown;
          +
          +        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.tickSize = 0;
          +        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();
          +        //this.logger.log("getVal: " + val);
          +        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 © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Sort.html b/www/extras/yui/docs/Sort.html new file mode 100644 index 000000000..458e1506d --- /dev/null +++ b/www/extras/yui/docs/Sort.html @@ -0,0 +1,265 @@ + + + + API: datatable Sort (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          DataTable Widget  2.2.2

          +

          + Yahoo! UI Library + > datatable + > Sort + +

          +
          + +
          +
          +
          + + +

          + + + static + + Class Sort + + + + + + + +

          + + + + + +
          + Sort static utility to support Column sorting. +
          + + + + +
          +

          Methods

          +
          +

          + compareAsc

          +
          + + + + + void + compareAsc + ( + + + a + + + , + b + + + ) + + +
          + Comparator function for sort in ascending order. String sorting is case insensitive. +
          + +
          + +
          +
          Parameters:
          +
          + a <object> + First sort argument. +
          +
          + b <object> + Second sort argument. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + compareDesc

          +
          + + + + + void + compareDesc + ( + + + a + + + , + b + + + ) + + +
          + Comparator function for sort in descending order. String sorting is case insensitive. +
          + +
          + +
          +
          Parameters:
          +
          + a <object> + First sort argument. +
          +
          + b <object> + Second sort argument. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/TVAnim.js.html b/www/extras/yui/docs/TVAnim.js.html new file mode 100644 index 000000000..2cc379995 --- /dev/null +++ b/www/extras/yui/docs/TVAnim.js.html @@ -0,0 +1,173 @@ + + + + API: treeview TVAnim.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + + > TVAnim.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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]);
          +        }
          +    };
          +} ();
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/TVFadeIn.js.html b/www/extras/yui/docs/TVFadeIn.js.html new file mode 100644 index 000000000..52f9d9074 --- /dev/null +++ b/www/extras/yui/docs/TVFadeIn.js.html @@ -0,0 +1,182 @@ + + + + API: treeview TVFadeIn.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + + > TVFadeIn.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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;
          +
          +    this.logger = new YAHOO.widget.LogWriter(this.toString());
          +};
          +
          +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";
          +    }
          +};
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/TVFadeOut.js.html b/www/extras/yui/docs/TVFadeOut.js.html new file mode 100644 index 000000000..720a023f1 --- /dev/null +++ b/www/extras/yui/docs/TVFadeOut.js.html @@ -0,0 +1,180 @@ + + + + API: treeview TVFadeOut.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + + > TVFadeOut.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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;
          +
          +    this.logger = new YAHOO.widget.LogWriter(this.toString());
          +};
          +
          +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 © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Tab.js.html b/www/extras/yui/docs/Tab.js.html new file mode 100644 index 000000000..d845bc30e --- /dev/null +++ b/www/extras/yui/docs/Tab.js.html @@ -0,0 +1,614 @@ + + + + API: tabview Tab.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          tabview  2.2.2

          +

          + Yahoo! UI Library + > tabview + + > Tab.js (source view) +

          +
          + +
          +
          +
          + +
          +
          (function() {
          +    var Dom = YAHOO.util.Dom,
          +        Event = YAHOO.util.Event;
          +    
          +    /**
          +     * 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
          +     */
          +    var Tab = function(el, attr) {
          +        attr = attr || {};
          +        if (arguments.length == 1 && !YAHOO.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; 
          +    };
          +    
          +    /**
          +     * setAttributeConfigs 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.setAttributeConfig('activationEvent', {
          +            value: attr.activationEvent || 'click'
          +        });        
          +
          +        /**
          +         * The element that contains the tab's label.
          +         * @config labelEl
          +         * @type HTMLElement
          +         */
          +        this.setAttributeConfig('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.setAttributeConfig('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.setAttributeConfig('contentEl', {
          +            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.setAttributeConfig('content', {
          +            value: attr.content,
          +            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.setAttributeConfig('dataSrc', {
          +            value: attr.dataSrc
          +        });
          +        
          +        /**
          +         * Whether or not content should be reloaded for every view.
          +         * @config cacheData
          +         * @type Boolean
          +         * @default false
          +         */
          +        this.setAttributeConfig('cacheData', {
          +            value: attr.cacheData || false,
          +            validator: YAHOO.lang.isBoolean
          +        });
          +        
          +        /**
          +         * The method to use for the data request.
          +         * @config loadMethod
          +         * @type String
          +         * @default "GET"
          +         */
          +        this.setAttributeConfig('loadMethod', {
          +            value: attr.loadMethod || 'GET',
          +            validator: YAHOO.lang.isString
          +        });
          +
          +        /**
          +         * Whether or not any data has been loaded from the server.
          +         * @config dataLoaded
          +         * @type Boolean
          +         */        
          +        this.setAttributeConfig('dataLoaded', {
          +            value: false,
          +            validator: YAHOO.lang.isBoolean,
          +            writeOnce: true
          +        });
          +        
          +        /**
          +         * Number if milliseconds before aborting and calling failure handler.
          +         * @config dataTimeout
          +         * @type Number
          +         * @default null
          +         */
          +        this.setAttributeConfig('dataTimeout', {
          +            value: attr.dataTimeout || null,
          +            validator: YAHOO.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.setAttributeConfig('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 YAHOO.lang.isBoolean(value) && !this.get('disabled') ;
          +            }
          +        });
          +        
          +        /**
          +         * Whether or not the tab is disabled.
          +         * @config disabled
          +         * @type Boolean
          +         */
          +        this.setAttributeConfig('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: YAHOO.lang.isBoolean
          +        });
          +        
          +        /**
          +         * The href of the tab's anchor element.
          +         * @config href
          +         * @type String
          +         * @default '#'
          +         */
          +        this.setAttributeConfig('href', {
          +            value: attr.href || '#',
          +            method: function(value) {
          +                this.getElementsByTagName('a')[0].href = value;
          +            },
          +            validator: YAHOO.lang.isString
          +        });
          +        
          +        /**
          +         * The Whether or not the tab's content is visible.
          +         * @config contentVisible
          +         * @type Boolean
          +         * @default false
          +         */
          +        this.setAttributeConfig('contentVisible', {
          +            value: attr.contentVisible,
          +            method: function(value) {
          +                if (value) {
          +                    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: YAHOO.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
          +     */
          +        
          +    /**
          +     * 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
          +     */
          +     
          +    /**
          +     * 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
          +     */
          +        
          +    /**
          +     * 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
          +     */
          +     
          +    /**
          +     * 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
          +     */
          +        
          +    /**
          +     * 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
          +     */
          +})();
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/TabView.js.html b/www/extras/yui/docs/TabView.js.html new file mode 100644 index 000000000..e3a615f0d --- /dev/null +++ b/www/extras/yui/docs/TabView.js.html @@ -0,0 +1,616 @@ + + + + API: tabview TabView.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          tabview  2.2.2

          +

          + Yahoo! UI Library + > tabview + + > TabView.js (source view) +

          +
          + +
          +
          +
          + +
          +
          (function() {
          +
          +    /**
          +     * The tabview module provides a widget for managing content bound to tabs.
          +     * @module tabview
          +     * @requires yahoo, dom, event, element
          +     *
          +     */
          +    /**
          +     * 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 && !YAHOO.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 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);
          +    };
          +    
          +    /**
          +     * setAttributeConfigs 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.setAttributeConfig('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.setAttributeConfig('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.setAttributeConfig('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.setAttributeConfig('activeTab', {
          +            value: attr.activeTab,
          +            method: function(tab) {
          +                var activeTab = this.get('activeTab');
          +                
          +                if (tab) {  
          +                    tab.set('active', true);
          +                    this._configs['activeIndex'].value = this.getTabIndex(tab); // keep in sync
          +                }
          +                
          +                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 ( YAHOO.lang.hasOwnProperty(this.DOM_EVENTS, 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
          + */
          +    
          +/**
          + * 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
          + */
          + 
          +/**
          + * 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
          + */
          +    
          +/**
          + * 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 © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/TextNode.js.html b/www/extras/yui/docs/TextNode.js.html new file mode 100644 index 000000000..0416e8f1f --- /dev/null +++ b/www/extras/yui/docs/TextNode.js.html @@ -0,0 +1,327 @@ + + + + API: treeview TextNode.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + + > TextNode.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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);
          +    }
          +
          +    this.logger     = new YAHOO.widget.LogWriter(this.toString());
          +};
          +
          +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;
          +        this.data.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() { 
          +        this.logger.log("Generating html");
          +        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><div class="' + this.getDepthStyle(i) + '">&#160;</div></td>';
          +            //sb[sb.length] = '<td><div class="' + this.getDepthStyle(i) + '"></div></td>';
          +            sb[sb.length] = '<td class="' + this.getDepthStyle(i) + '"><div class="ygtvspacer"></div></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] = '<div class="ygtvspacer">';
          +
          +        /*
          +        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] = '</div>';
          +        sb[sb.length] = '</td>';
          +        sb[sb.length] = '<td ';
          +        sb[sb.length] = (this.nowrap) ? ' nowrap="nowrap" ' : '';
          +        sb[sb.length] = ' >';
          +        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) { 
          +        me.logger.log("onLabelClick " + me.label);
          +        return me.tree.fireEvent("labelClick", me);
          +        //return true;
          +    },
          +
          +    toString: function() { 
          +        return "TextNode (" + this.index + ") " + this.label;
          +    }
          +
          +});
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/Tooltip.js.html b/www/extras/yui/docs/Tooltip.js.html new file mode 100644 index 000000000..196ad0f9b --- /dev/null +++ b/www/extras/yui/docs/Tooltip.js.html @@ -0,0 +1,637 @@ + + + + API: container Tooltip.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + + > Tooltip.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +* 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 = "yui-tt";
          +
          +/**
          +* Constant representing the Tooltip's configuration properties
          +* @property YAHOO.widget.Tooltip._DEFAULT_CONFIG
          +* @private
          +* @final
          +* @type Object
          +*/
          +YAHOO.widget.Tooltip._DEFAULT_CONFIG = {
          +
          +    "PREVENT_OVERLAP": { 
          +        key: "preventoverlap", 
          +        value:true, 
          +        validator:YAHOO.lang.isBoolean, 
          +        supercedes:["x","y","xy"] 
          +    },
          +
          +    "SHOW_DELAY": { 
          +        key: "showdelay", 
          +        value:200, 
          +        validator:YAHOO.lang.isNumber 
          +    }, 
          +
          +    "AUTO_DISMISS_DELAY": { 
          +        key: "autodismissdelay", 
          +        value:5000, 
          +        validator:YAHOO.lang.isNumber 
          +    }, 
          +
          +    "HIDE_DELAY": { 
          +        key: "hidedelay", 
          +        value:250, 
          +        validator:YAHOO.lang.isNumber 
          +    }, 
          +
          +    "TEXT": { 
          +        key: "text", 
          +        suppressEvent:true 
          +    }, 
          +
          +    "CONTAINER": { 
          +        key: "container"
          +    }
          +
          +};
          +
          +/**
          +* 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) {
          +	this.logger = YAHOO.widget.Tooltip.logger;
          +
          +	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);
          +
          +    var DEFAULT_CONFIG = YAHOO.widget.Tooltip._DEFAULT_CONFIG;
          +
          +	/**
          +	* Specifies whether the Tooltip should be kept from overlapping its context element.
          +	* @config preventoverlap
          +	* @type Boolean
          +	* @default true
          +	*/
          +	this.cfg.addProperty(
          +	           DEFAULT_CONFIG.PREVENT_OVERLAP.key,
          +	           {
          +	               value: DEFAULT_CONFIG.PREVENT_OVERLAP.value, 
          +	               validator: DEFAULT_CONFIG.PREVENT_OVERLAP.validator, 
          +	               supercedes: DEFAULT_CONFIG.PREVENT_OVERLAP.supercedes
          +               }
          +           );
          +
          +	/**
          +	* The number of milliseconds to wait before showing a Tooltip on mouseover.
          +	* @config showdelay
          +	* @type Number
          +	* @default 200
          +	*/
          +	this.cfg.addProperty(
          +                DEFAULT_CONFIG.SHOW_DELAY.key,
          +                {
          +                    handler: this.configShowDelay,
          +                    value: 200, 
          +                    validator: DEFAULT_CONFIG.SHOW_DELAY.validator
          +                }
          +          );
          +
          +	/**
          +	* 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(
          +                DEFAULT_CONFIG.AUTO_DISMISS_DELAY.key,	
          +                {
          +                    handler: this.configAutoDismissDelay,
          +                    value: DEFAULT_CONFIG.AUTO_DISMISS_DELAY.value,
          +                    validator: DEFAULT_CONFIG.AUTO_DISMISS_DELAY.validator
          +                }
          +            );
          +
          +	/**
          +	* The number of milliseconds to wait before hiding a Tooltip on mouseover.
          +	* @config hidedelay
          +	* @type Number
          +	* @default 250
          +	*/
          +	this.cfg.addProperty(
          +                DEFAULT_CONFIG.HIDE_DELAY.key,
          +                {
          +                    handler: this.configHideDelay,
          +                    value: DEFAULT_CONFIG.HIDE_DELAY.value, 
          +                    validator: DEFAULT_CONFIG.HIDE_DELAY.validator
          +                }
          +            );
          +
          +	/**
          +	* Specifies the Tooltip's text.
          +	* @config text
          +	* @type String
          +	* @default null
          +	*/
          +    this.cfg.addProperty(
          +                DEFAULT_CONFIG.TEXT.key,
          +                {
          +                    handler: this.configText,
          +                    suppressEvent: DEFAULT_CONFIG.TEXT.suppressEvent
          +                }
          +            );
          +
          +	/**
          +	* Specifies the container element that the Tooltip's markup should be rendered into.
          +	* @config container
          +	* @type HTMLElement/String
          +	* @default document.body
          +	*/
          +    this.cfg.addProperty(
          +                DEFAULT_CONFIG.CONTAINER.key,
          +                {
          +                    handler: this.configContainer,
          +                    value: document.body
          +                }
          +            );
          +
          +	/**
          +	* 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);
          +	}
          +};
          +
          +/**
          +* @method _removeEventListeners
          +* @description Removes all of the DOM event handlers from the HTML element(s) 
          +* that trigger the display of the tooltip.
          +* @protected
          +*/
          +YAHOO.widget.Tooltip.prototype._removeEventListeners = function() {
          +
          +    var aElements = this._context;
          +    
          +    if (aElements) {
          +
          +        var nElements = aElements.length;
          +        
          +        if (nElements > 0) {
          +        
          +            var i = nElements - 1,
          +                oElement;
          +            
          +            do {
          +
          +                oElement = aElements[i];
          +
          +                YAHOO.util.Event.removeListener(oElement, "mouseover", this.onContextMouseOver);
          +                YAHOO.util.Event.removeListener(oElement, "mousemove", this.onContextMouseMove);
          +                YAHOO.util.Event.removeListener(oElement, "mouseout", this.onContextMouseOut);
          +            
          +            }
          +            while(i--);
          +        
          +        }
          +
          +    }
          +
          +};
          +
          +/**
          +* 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
          +        this._removeEventListeners();
          +
          +		// Add mouseover/mouseout listeners to context elements
          +		this._context = context;
          +
          +        var aElements = this._context;
          +        
          +        if (aElements) {
          +    
          +            var nElements = aElements.length;
          +            
          +            if (nElements > 0) {
          +            
          +                var i = nElements - 1,
          +                    oElement;
          +                
          +                do {
          +    
          +                    oElement = aElements[i];
          +    
          +                    YAHOO.util.Event.addListener(oElement, "mouseover", this.onContextMouseOver, this);
          +                    YAHOO.util.Event.addListener(oElement, "mousemove", this.onContextMouseMove, this);
          +                    YAHOO.util.Event.addListener(oElement, "mouseout", this.onContextMouseOut, this);
          +                
          +                }
          +                while(i--);
          +            
          +            }
          +    
          +        }
          +
          +	}
          +};
          +
          +// 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.logger.log("Clearing hide timer: " + obj.hideProcId, "time");
          +		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);
          +	obj.logger.log("Setting show tooltip timeout: " + this.showProcId, "time");
          +};
          +
          +/**
          +* 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.logger.log("Clearing show timer: " + obj.showProcId, "time");
          +		obj.showProcId = null;
          +	}
          +
          +	if (obj.hideProcId) {
          +		clearTimeout(obj.hideProcId);
          +		obj.logger.log("Clearing hide timer: " + obj.hideProcId, "time");
          +		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 && context.tagName.toUpperCase() == "A") {
          +		yOffset += 12;
          +	}
          +
          +	var me = this;
          +	return setTimeout(
          +		function() {
          +			if (me._tempTitle) {
          +				me.setBody(me._tempTitle);
          +			} else {
          +				me.cfg.refireEvent("text");
          +			}
          +
          +			me.logger.log("Show tooltip", "time");
          +			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();
          +			me.logger.log("Hide tooltip time active: " + me.hideProcId, "time");
          +		},
          +	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;
          +	me.logger.log("Setting hide tooltip timeout", "time");
          +	return setTimeout(
          +		function() {
          +			me.logger.log("Hide tooltip", "time");
          +			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);
          +
          +	this.logger.log("context " + elementRegion, "ttip");
          +	this.logger.log("mouse " + mousePoint, "ttip");
          +
          +	if (elementRegion.contains(mousePoint)) {
          +		this.logger.log("OVERLAP", "warn");
          +		this.cfg.setProperty("y", (pageY-height-5));
          +	}
          +};
          +
          +/**
          +* Removes the Tooltip element from the DOM and sets all child elements to null.
          +* @method destroy
          +*/
          +YAHOO.widget.Tooltip.prototype.destroy = function() {
          +
          +    // Remove any existing mouseover/mouseout listeners
          +    this._removeEventListeners();
          +
          +    YAHOO.widget.Tooltip.superclass.destroy.call(this);  
          +
          +};
          +
          +/**
          +* 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;
          +};
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/TreeView.js.html b/www/extras/yui/docs/TreeView.js.html new file mode 100644 index 000000000..5f70b2bb9 --- /dev/null +++ b/www/extras/yui/docs/TreeView.js.html @@ -0,0 +1,821 @@ + + + + API: treeview TreeView.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + + > TreeView.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * The treeview widget is a generic tree building tool.
          + * @module treeview
          + * @title TreeView Widget
          + * @requires yahoo, event
          + * @optional animation
          + * @namespace YAHOO.widget
          + */
          +
          +/**
          + * Contains the tree view state data and the root node.
          + *
          + * @class TreeView
          + * @uses YAHOO.util.EventProvider
          + * @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.  This is a sparse
          +     * array, so the length property can't be relied upon for a
          +     * node count for the 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) {
          +        this.logger.log("animating expand");
          +
          +        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) {
          +        this.logger.log("animating collapse");
          +
          +        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.logger.log("expand complete: " + this.id);
          +        --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.logger.log("collapse complete: " + this.id);
          +        --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 collapsed.  Return false to stop
          +         * the collapse.
          +         * @event collapse
          +         * @type CustomEvent
          +         * @param {YAHOO.widget.Node} node the node that is collapsing
          +         */
          +        this.createEvent("collapse", this);
          +
          +        /**
          +         * Fires after a node is successfully collapsed.  This event will not fire
          +         * if the "collapse" event was cancelled.
          +         * @event collapseComplete
          +         * @type CustomEvent
          +         * @param {YAHOO.widget.Node} node the node that was collapsed
          +         */
          +        this.createEvent("collapseComplete", this);
          +
          +        /**
          +         * Fires when a node is going to be expanded.  Return false to stop
          +         * the collapse.
          +         * @event expand
          +         * @type CustomEvent
          +         * @param {YAHOO.widget.Node} node the node that is expanding
          +         */
          +        this.createEvent("expand", this);
          +
          +        /**
          +         * Fires after a node is successfully expanded.  This event will not fire
          +         * if the "expand" event was cancelled.
          +         * @event expandComplete
          +         * @type CustomEvent
          +         * @param {YAHOO.widget.Node} node the node that was expanded
          +         */
          +        this.createEvent("expandComplete", 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);
          +
          +        this.logger = new YAHOO.widget.LogWriter(this.toString());
          +
          +        this.logger.log("tree init: " + this.id);
          +
          +        //YAHOO.util.Event.onContentReady(this.id, this.handleAvailable, this, true);
          +        YAHOO.util.Event.on(this.id, "click", this.handleClick, this, true);
          +    },
          +
          +
          +    //handleAvailable: function() {
          +        //var Event = YAHOO.util.Event;
          +        //Event.on(this.id, 
          +    //},
          +
          +    /**
          +     * 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) { 
          +        this.logger.log("Removing children for " + 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);
          +
          +/**
          + * Running count of all nodes created in all trees.  This is 
          + * used to provide unique identifies for all nodes.  Deleting
          + * nodes does not change the nodeCount.
          + * @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);
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/WidthResizer.html b/www/extras/yui/docs/WidthResizer.html new file mode 100644 index 000000000..071a611f2 --- /dev/null +++ b/www/extras/yui/docs/WidthResizer.html @@ -0,0 +1,443 @@ + + + + API: datatable WidthResizer (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          DataTable Widget  2.2.2

          +

          + Yahoo! UI Library + > datatable + > WidthResizer + +

          +
          + +
          +
          +
          + + +

          + + + + + Class WidthResizer + + - extends YAHOO.util.DragDrop + + + + + + +

          + + + + + +
          + WidthResizer subclasses DragDrop to support resizeable Columns. +
          + +
          +

          Constructor

          +
          +
          + WidthResizer + + ( + + + + colElId + + , + handleElId + + , + sGroup + ) + +
          +
          +
          Parameters:
          +
          + colElId + <string> + + ID of the Column's TH element being resized +
          +
          + handleElId + <string> + + ID of the handle element that causes the resize +
          +
          + sGroup + <string> + + Group name of related DragDrop items +
          +
          + + +
          +
          +
          +
          + + + + +
          +

          Methods

          +
          +

          + onDrag

          +
          + + + + + void + onDrag + ( + + + e + + + ) + + +
          + Handles drag events on the Column resizer. +
          + +
          + +
          +
          Parameters:
          +
          + e <string> + The drag event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onMouseDown

          +
          + + + + + void + onMouseDown + ( + + + e + + + ) + + +
          + Handles mousedown events on the Column resizer. +
          + +
          + +
          +
          Parameters:
          +
          + e <string> + The mousedown event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onMouseUp

          +
          + + + + + void + onMouseUp + ( + + + e + + + ) + + +
          + Handles mouseup events on the Column resizer. +
          + +
          + +
          +
          Parameters:
          +
          + e <string> + The mouseup event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.env.html b/www/extras/yui/docs/YAHOO.env.html new file mode 100644 index 000000000..a7165c896 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.env.html @@ -0,0 +1,254 @@ + + + + API: yahoo YAHOO.env (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          YAHOO Global  2.2.2

          +

          + Yahoo! UI Library + > yahoo + > YAHOO.env + +

          +
          + +
          +
          +
          + + +

          + + + static + + Class YAHOO.env + + + + + + + +

          + + + + + +
          + YAHOO.env is used to keep track of what is known about the YUI library and +the browsing environment +
          + + +
          +

          Properties

          +
          +

          listeners + - Function[] +

          +
          +
          + List of functions that should be executed every time a YUI module +reports itself. +
          +
          + + + + +
          +

          modules + - Object[] +

          +
          +
          + Keeps the version info for all YUI modules that have reported themselves +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + getVersion

          +
          + + + static + + Object + getVersion + ( + + + name + + + ) + + +
          + Returns the version data for the specified module: +
          +
          name:
          The name of the module
          +
          version:
          The version in use
          +
          build:
          The build number in use
          +
          versions:
          All versions that were registered
          +
          builds:
          All builds that were registered.
          +
          mainClass:
          An object that was was stamped with the +current version and build. If +mainClass.VERSION != version or mainClass.BUILD != build, +multiple versions of pieces of the library have been +loaded, potentially causing issues.
          +
          +
          + +
          + +
          +
          Parameters:
          +
          + name <String> + the name of the module (event, slider, etc) +
          +
          + +
          +
          Returns: + + Object +
          +
          The version info
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.html b/www/extras/yui/docs/YAHOO.html new file mode 100644 index 000000000..55900f265 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.html @@ -0,0 +1,513 @@ + + + + API: yahoo YAHOO (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          YAHOO Global  2.2.2

          +

          + Yahoo! UI Library + > yahoo + > YAHOO + +

          +
          + +
          +
          +
          + + +

          + + + static + + Class YAHOO + + + + + + + +

          + + + + + +
          + The YAHOO global namespace object. If YAHOO is already defined, the +existing YAHOO object will not be overwritten so that defined +namespaces are preserved. +
          + + + + +
          +

          Methods

          +
          +

          + augment

          +
          + + + static + + void + augment + ( + + + r + + + , + s + + + , + arguments + + + ) + + +
          + An alias for YAHOO.lang.augment +
          + +
          + +
          +
          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 +
          +
          +
          + +
          + +
          +
          +

          + extend

          +
          + + + static + + void + extend + ( + + + subc + + + , + superc + + + , + overrides + + + ) + + +
          + An alias for YAHOO.lang.extend +
          + +
          + +
          +
          Parameters:
          +
          + subc <Function> + the object to modify +
          +
          + superc <Function> + the object to inherit +
          +
          + overrides <Object> + additional properties/methods to add to the +subclass prototype. These will override the +matching items obtained from the superclass +if present. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + init

          +
          + + + static + + void + init + ( + ) + + +
          + Initializes the global by creating the default namespaces and applying +any new configuration information that is detected. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + log

          +
          + + + static + + Boolean + log + ( + + + msg + + + , + cat + + + , + src + + + ) + + +
          + 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.
          +
          + +
          + +
          +
          +

          + namespace

          +
          + + + static + + Object + namespace + ( + + + arguments + + + ) + + +
          + 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
          +
          + +
          + +
          +
          +

          + register

          +
          + + + static + + void + register + ( + + + name + + + , + mainClass + + + , + data + + + ) + + +
          + Registers a module with the YAHOO object +
          + +
          + +
          +
          Parameters:
          +
          + name <String> + the name of the module (event, slider, etc) +
          +
          + mainClass <Function> + a reference to class in the module. This +class will be tagged with the version info +so that it will be possible to identify the +version that is in use when multiple versions +have loaded +
          +
          + data <Object> + metadata object for the module. Currently it +is expected to contain a "version" property +and a "build" property at minimum. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.js.html b/www/extras/yui/docs/YAHOO.js.html new file mode 100644 index 000000000..580582834 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.js.html @@ -0,0 +1,542 @@ + + + + API: yahoo YAHOO.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          YAHOO Global  2.2.2

          +

          + Yahoo! UI Library + > yahoo + + > YAHOO.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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
          + */
          +
          +/**
          + * YAHOO_config is not included part of the library.  Instead it is an object
          + * that can be defined by the implementer immediately before including the
          + * YUI library.  The properties included in this object will be used to
          + * configure global properties needed as soon as the library begins to load.
          + * @class YAHOO_config
          + * @static
          + */
          +
          +/**
          + * A reference to a function that will be executed every time a YAHOO module
          + * is loaded.  As parameter, this function will receive the version
          + * information for the module. See <a href="YAHOO.env.html#getVersion">
          + * YAHOO.env.getVersion</a> for the description of the version data structure.
          + * @property listener
          + * @static
          + */
          +if (typeof YAHOO == "undefined") {
          +    /**
          +     * The YAHOO global namespace object.  If YAHOO is already defined, the
          +     * existing YAHOO object will not be overwritten so that defined
          +     * namespaces are preserved.
          +     * @class YAHOO
          +     * @static
          +     */
          +    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=i+1) {
          +        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=j+1) {
          +            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;
          +    }
          +};
          +
          +
          +/**
          + * Initializes the global by creating the default namespaces and applying
          + * any new configuration information that is detected.
          + * @method init
          + * @static
          + */
          +YAHOO.init = function() {
          +    this.namespace("util", "widget", "example");
          +    if (typeof YAHOO_config != "undefined") {
          +        var l=YAHOO_config.listener,ls=YAHOO.env.listeners,unique=true,i;
          +        if (l) {
          +            // if YAHOO is loaded multiple times we need to check to see if
          +            // this is a new config object.  If it is, add the new component
          +            // load listener to the stack
          +            for (i=0;i<ls.length;i=i+1) {
          +                if (ls[i]==l) {
          +                    unique=false;
          +                    break;
          +                }
          +            }
          +            if (unique) {
          +                ls.push(l);
          +            }
          +        }
          +    }
          +};
          +
          +/**
          + * Registers a module with the YAHOO object
          + * @method register
          + * @static
          + * @param {String}   name    the name of the module (event, slider, etc)
          + * @param {Function} mainClass a reference to class in the module.  This
          + *                             class will be tagged with the version info
          + *                             so that it will be possible to identify the
          + *                             version that is in use when multiple versions
          + *                             have loaded
          + * @param {Object}   data      metadata object for the module.  Currently it
          + *                             is expected to contain a "version" property
          + *                             and a "build" property at minimum.
          + */
          +YAHOO.register = function(name, mainClass, data) {
          +    var mods = YAHOO.env.modules;
          +    if (!mods[name]) {
          +        mods[name] = { versions:[], builds:[] };
          +    }
          +    var m=mods[name],v=data.version,b=data.build,ls=YAHOO.env.listeners;
          +    m.name = name;
          +    m.version = v;
          +    m.build = b;
          +    m.versions.push(v);
          +    m.builds.push(b);
          +    m.mainClass = mainClass;
          +    // fire the module load listeners
          +    for (var i=0;i<ls.length;i=i+1) {
          +        ls[i](m);
          +    }
          +    // label the main class
          +    if (mainClass) {
          +        mainClass.VERSION = v;
          +        mainClass.BUILD = b;
          +    } else {
          +        YAHOO.log("mainClass is undefined for module " + name, "warn");
          +    }
          +};
          +
          +/**
          + * YAHOO.env is used to keep track of what is known about the YUI library and
          + * the browsing environment
          + * @class YAHOO.env
          + * @type Object
          + * @static
          + */
          +YAHOO.env = YAHOO.env || {
          +    /**
          +     * Keeps the version info for all YUI modules that have reported themselves
          +     * @property modules
          +     * @type Object[]
          +     */
          +    modules: [],
          +    
          +    /**
          +     * List of functions that should be executed every time a YUI module
          +     * reports itself.
          +     * @property listeners
          +     * @type Function[]
          +     */
          +    listeners: [],
          +    
          +    /**
          +     * Returns the version data for the specified module:
          +     *      <dl>
          +     *      <dt>name:</dt>      <dd>The name of the module</dd>
          +     *      <dt>version:</dt>   <dd>The version in use</dd>
          +     *      <dt>build:</dt>     <dd>The build number in use</dd>
          +     *      <dt>versions:</dt>  <dd>All versions that were registered</dd>
          +     *      <dt>builds:</dt>    <dd>All builds that were registered.</dd>
          +     *      <dt>mainClass:</dt> <dd>An object that was was stamped with the
          +     *                 current version and build. If 
          +     *                 mainClass.VERSION != version or mainClass.BUILD != build,
          +     *                 multiple versions of pieces of the library have been
          +     *                 loaded, potentially causing issues.</dd>
          +     *       </dl>
          +     *
          +     * @method getVersion
          +     * @static
          +     * @param {String}  name the name of the module (event, slider, etc)
          +     * @return {Object} The version info
          +     */
          +    getVersion: function(name) {
          +        return YAHOO.env.modules[name] || null;
          +    }
          +};
          +
          +/**
          + * Provides the language utilites and extensions used by the library
          + * @class YAHOO.lang
          + */
          +YAHOO.lang = {
          +    /**
          +     * Determines whether or not the provided object is an array
          +     * @method isArray
          +     * @param {any} obj The object being testing
          +     * @return Boolean
          +     */
          +    isArray: function(obj) { // frames lose type, so test constructor string
          +        if (obj && obj.constructor && 
          +                   obj.constructor.toString().indexOf('Array') > -1) {
          +            return true;
          +        } else {
          +            return YAHOO.lang.isObject(obj) && obj.constructor == Array;
          +        }
          +    },
          +
          +    /**
          +     * Determines whether or not the provided object is a boolean
          +     * @method isBoolean
          +     * @param {any} obj The object being testing
          +     * @return Boolean
          +     */
          +    isBoolean: function(obj) {
          +        return typeof obj == 'boolean';
          +    },
          +    
          +    /**
          +     * Determines whether or not the provided object is a function
          +     * @method isFunction
          +     * @param {any} obj The object being testing
          +     * @return Boolean
          +     */
          +    isFunction: function(obj) {
          +        return typeof obj == 'function';
          +    },
          +        
          +    /**
          +     * Determines whether or not the provided object is null
          +     * @method isNull
          +     * @param {any} obj The object being testing
          +     * @return Boolean
          +     */
          +    isNull: function(obj) {
          +        return obj === null;
          +    },
          +        
          +    /**
          +     * Determines whether or not the provided object is a legal number
          +     * @method isNumber
          +     * @param {any} obj The object being testing
          +     * @return Boolean
          +     */
          +    isNumber: function(obj) {
          +        return typeof obj == 'number' && isFinite(obj);
          +    },
          +      
          +    /**
          +     * Determines whether or not the provided object is of type object
          +     * or function
          +     * @method isObject
          +     * @param {any} obj The object being testing
          +     * @return Boolean
          +     */  
          +    isObject: function(obj) {
          +        return obj && (typeof obj == 'object' || YAHOO.lang.isFunction(obj));
          +    },
          +        
          +    /**
          +     * Determines whether or not the provided object is a string
          +     * @method isString
          +     * @param {any} obj The object being testing
          +     * @return Boolean
          +     */
          +    isString: function(obj) {
          +        return typeof obj == 'string';
          +    },
          +        
          +    /**
          +     * Determines whether or not the provided object is undefined
          +     * @method isUndefined
          +     * @param {any} obj The object being testing
          +     * @return Boolean
          +     */
          +    isUndefined: function(obj) {
          +        return typeof obj == 'undefined';
          +    },
          +    
          +    /**
          +     * Determines whether or not the property was added
          +     * to the object instance.  Returns false if the property is not present
          +     * in the object, or was inherited from the prototype.
          +     * This abstraction is provided to enable hasOwnProperty for Safari 1.3.x.
          +     * There is a discrepancy between YAHOO.lang.hasOwnProperty and
          +     * Object.prototype.hasOwnProperty when the property is a primitive added to
          +     * both the instance AND prototype with the same value:
          +     * <pre>
          +     * var A = function() {};
          +     * A.prototype.foo = 'foo';
          +     * var a = new A();
          +     * a.foo = 'foo';
          +     * alert(a.hasOwnProperty('foo')); // true
          +     * alert(YAHOO.lang.hasOwnProperty(a, 'foo')); // false when using fallback
          +     * </pre>
          +     * @method hasOwnProperty
          +     * @param {any} obj The object being testing
          +     * @return Boolean
          +     */
          +    hasOwnProperty: function(obj, prop) {
          +        if (Object.prototype.hasOwnProperty) {
          +            return obj.hasOwnProperty(prop);
          +        }
          +        
          +        return !YAHOO.lang.isUndefined(obj[prop]) && 
          +                obj.constructor.prototype[prop] !== obj[prop];
          +    },
          +        
          +    /**
          +     * 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 {Object} overrides  additional properties/methods to add to the
          +     *                              subclass prototype.  These will override the
          +     *                              matching items obtained from the superclass 
          +     *                              if present.
          +     */
          +    extend: function(subc, superc, overrides) {
          +        if (!superc||!subc) {
          +            throw new Error("YAHOO.lang.extend failed, please check that " +
          +                            "all dependencies are included.");
          +        }
          +        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
          +     */
          +    augment: function(r, s) {
          +        if (!s||!r) {
          +            throw new Error("YAHOO.lang.augment failed, please check that " +
          +                            "all dependencies are included.");
          +        }
          +        var rp=r.prototype, sp=s.prototype, a=arguments, i, p;
          +        if (a[2]) {
          +            for (i=2; i<a.length; i=i+1) {
          +                rp[a[i]] = sp[a[i]];
          +            }
          +        } else {
          +            for (p in sp) { 
          +                if (!rp[p]) {
          +                    rp[p] = sp[p];
          +                }
          +            }
          +        }
          +    }
          +};
          +
          +YAHOO.init();
          +
          +/*
          + * An alias for <a href="YAHOO.lang.html">YAHOO.lang</a>
          + * @class YAHOO.util.Lang
          + */
          +YAHOO.util.Lang = YAHOO.lang;
          +
          +/**
          + * An alias for <a href="YAHOO.lang.html#augment">YAHOO.lang.augment</a>
          + * @for YAHOO
          + * @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 = YAHOO.lang.augment;
          +       
          +/**
          + * An alias for <a href="YAHOO.lang.html#extend">YAHOO.lang.extend</a>
          + * @method extend
          + * @static
          + * @param {Function} subc   the object to modify
          + * @param {Function} superc the object to inherit
          + * @param {Object} overrides  additional properties/methods to add to the
          + *                              subclass prototype.  These will override the
          + *                              matching items obtained from the superclass 
          + *                              if present.
          + */
          +YAHOO.extend = YAHOO.lang.extend;
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.lang.html b/www/extras/yui/docs/YAHOO.lang.html new file mode 100644 index 000000000..4d26cfbf8 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.lang.html @@ -0,0 +1,723 @@ + + + + API: yahoo YAHOO.lang (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          YAHOO Global  2.2.2

          +

          + Yahoo! UI Library + > yahoo + > YAHOO.lang + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.lang + + + + + + + +

          + + + + + +
          + Provides the language utilites and extensions used by the library +
          + + + + +
          +

          Methods

          +
          +

          + augment

          +
          + + + static + + void + augment + ( + + + r + + + , + s + + + , + arguments + + + ) + + +
          + 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 +
          +
          +
          + +
          + +
          +
          +

          + extend

          +
          + + + static + + void + extend + ( + + + subc + + + , + superc + + + , + overrides + + + ) + + +
          + 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 <Object> + additional properties/methods to add to the +subclass prototype. These will override the +matching items obtained from the superclass +if present. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + hasOwnProperty

          +
          + + + + + void + hasOwnProperty + ( + + + obj + + + ) + + +
          + Determines whether or not the property was added +to the object instance. Returns false if the property is not present +in the object, or was inherited from the prototype. +This abstraction is provided to enable hasOwnProperty for Safari 1.3.x. +There is a discrepancy between YAHOO.lang.hasOwnProperty and +Object.prototype.hasOwnProperty when the property is a primitive added to +both the instance AND prototype with the same value: +
          +var A = function() {};
          +A.prototype.foo = 'foo';
          +var a = new A();
          +a.foo = 'foo';
          +alert(a.hasOwnProperty('foo')); // true
          +alert(YAHOO.lang.hasOwnProperty(a, 'foo')); // false when using fallback
          +
          +
          + +
          + +
          +
          Parameters:
          +
          + obj <any> + The object being testing +
          +
          + +
          +
          Returns: + + void +
          +
          Boolean
          +
          + +
          + +
          +
          +

          + isArray

          +
          + + + + + void + isArray + ( + + + obj + + + ) + + +
          + Determines whether or not the provided object is an array +
          + +
          + +
          +
          Parameters:
          +
          + obj <any> + The object being testing +
          +
          + +
          +
          Returns: + + void +
          +
          Boolean
          +
          + +
          + +
          +
          +

          + isBoolean

          +
          + + + + + void + isBoolean + ( + + + obj + + + ) + + +
          + Determines whether or not the provided object is a boolean +
          + +
          + +
          +
          Parameters:
          +
          + obj <any> + The object being testing +
          +
          + +
          +
          Returns: + + void +
          +
          Boolean
          +
          + +
          + +
          +
          +

          + isFunction

          +
          + + + + + void + isFunction + ( + + + obj + + + ) + + +
          + Determines whether or not the provided object is a function +
          + +
          + +
          +
          Parameters:
          +
          + obj <any> + The object being testing +
          +
          + +
          +
          Returns: + + void +
          +
          Boolean
          +
          + +
          + +
          +
          +

          + isNull

          +
          + + + + + void + isNull + ( + + + obj + + + ) + + +
          + Determines whether or not the provided object is null +
          + +
          + +
          +
          Parameters:
          +
          + obj <any> + The object being testing +
          +
          + +
          +
          Returns: + + void +
          +
          Boolean
          +
          + +
          + +
          +
          +

          + isNumber

          +
          + + + + + void + isNumber + ( + + + obj + + + ) + + +
          + Determines whether or not the provided object is a legal number +
          + +
          + +
          +
          Parameters:
          +
          + obj <any> + The object being testing +
          +
          + +
          +
          Returns: + + void +
          +
          Boolean
          +
          + +
          + +
          +
          +

          + isObject

          +
          + + + + + void + isObject + ( + + + obj + + + ) + + +
          + Determines whether or not the provided object is of type object +or function +
          + +
          + +
          +
          Parameters:
          +
          + obj <any> + The object being testing +
          +
          + +
          +
          Returns: + + void +
          +
          Boolean
          +
          + +
          + +
          +
          +

          + isString

          +
          + + + + + void + isString + ( + + + obj + + + ) + + +
          + Determines whether or not the provided object is a string +
          + +
          + +
          +
          Parameters:
          +
          + obj <any> + The object being testing +
          +
          + +
          +
          Returns: + + void +
          +
          Boolean
          +
          + +
          + +
          +
          +

          + isUndefined

          +
          + + + + + void + isUndefined + ( + + + obj + + + ) + + +
          + Determines whether or not the provided object is undefined +
          + +
          + +
          +
          Parameters:
          +
          + obj <any> + The object being testing +
          +
          + +
          +
          Returns: + + void +
          +
          Boolean
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.Anim.html b/www/extras/yui/docs/YAHOO.util.Anim.html new file mode 100644 index 000000000..f8ff3b27f --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.Anim.html @@ -0,0 +1,1156 @@ + + + + API: animation YAHOO.util.Anim (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          animation  2.2.2

          +

          + Yahoo! UI Library + > animation + > YAHOO.util.Anim + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.Anim + + + + + + + +

          + + +
          +
          Known Subclasses: +
          + YAHOO.util.Scroll + YAHOO.util.ColorAnim + YAHOO.util.Motion +
          +
          + + + +
          + 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);

          +
          + +
          +

          Constructor

          +
          +
          + YAHOO.util.Anim + + ( + + + + el + + , + attributes + + , + duration + + , + 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) +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _onComplete + - private object +

          +
          +
          + Custom event that fires after onComplete +
          +
          + + + + +
          +

          _onStart + - private object +

          +
          +
          + Custom event that fires after onStart, useful in subclassing +
          +
          + + + + +
          +

          _onTween + - private object +

          +
          +
          + Custom event that fires after onTween +
          +
          + + + + +
          +

          actualFrames + - private Int +

          +
          +
          + The number of frames this animation was able to execute. +
          +
          + + + + +
          +

          attributes + - Object +

          +
          +
          + 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). +
          +
          + + + + +
          +

          currentFrame + - Int +

          +
          +
          + 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. +
          +
          + + + + +
          +

          duration + - Number +

          +
          +
          + The length of the animation. Defaults to "1" (second). +
          +
          + + + + +
          +

          el + - private HTMLElement +

          +
          +
          + The element to be animated. +
          +
          + + + + +
          +

          isAnimated + - private Boolean +

          +
          +
          + Whether or not the animation is running. +
          +
          + + + + +
          +

          method + - Function +

          +
          +
          + The method that will provide values to the attribute(s) during the animation. +Defaults to "YAHOO.util.Easing.easeNone". +
          +
          + + + + +
          +

          startTime + - private Date +

          +
          +
          + A Date object that is created when the animation begins. +
          +
          + + + + +
          +

          totalFrames + - Int +

          +
          +
          + The total number of frames to be executed. +In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. +
          +
          + + + + +
          +

          useSeconds + - Boolean +

          +
          +
          + Whether or not the duration should be treated as seconds. +Defaults to true. +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + animate

          +
          + + + + + void + animate + ( + ) + + +
          + Starts the animation by registering it with the animation manager. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + doMethod

          +
          + + + + + Number + doMethod + ( + + + attr + + + , + start + + + , + 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.
          +
          + +
          + +
          +
          +

          + getAttribute

          +
          + + + + + Number + getAttribute + ( + + + attr + + + ) + + +
          + Returns current value of the attribute. +
          + +
          + +
          +
          Parameters:
          +
          + attr <String> + The name of the attribute. +
          +
          + +
          +
          Returns: + + Number +
          +
          val The current value of the attribute.
          +
          + +
          + +
          +
          +

          + getDefaultUnit

          +
          + + + + + String + getDefaultUnit + ( + + + 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.
          +
          + +
          + +
          +
          +

          + getEl

          +
          + + + + + HTMLElement + getEl + ( + ) + + +
          + Returns a reference to the animated element. +
          + +
          + + +
          +
          Returns: + + HTMLElement +
          +
          +
          + +
          + +
          +
          +

          + getStartTime

          +
          + + + + + Date + getStartTime + ( + ) + + +
          + Returns the animation start time. +
          + +
          + + +
          +
          Returns: + + Date +
          +
          current value of startTime.
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + el + + + , + attributes + + + , + duration + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + isAnimated

          +
          + + + + + Boolean + isAnimated + ( + ) + + +
          + Checks whether the element is currently animated. +
          + +
          + + +
          +
          Returns: + + Boolean +
          +
          current value of isAnimated.
          +
          + +
          + +
          +
          +

          + onTween

          +
          + + private + + + void + onTween + ( + ) + + +
          + Feeds the starting and ending values for each animated attribute to doMethod once per frame, then applies the resulting value to the attribute(s). +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setAttribute

          +
          + + + + + void + setAttribute + ( + + + attr + + + , + val + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + setRuntimeAttribute

          +
          + + private + + + void + setRuntimeAttribute + ( + + + attr + + + ) + + +
          + Sets the actual values to be used during the animation. Should only be needed for subclass use. +
          + +
          + +
          +
          Parameters:
          +
          + attr <Object> + The attribute object +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + stop

          +
          + + + + + void + stop + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Provides a readable name for the Anim instance. +
          + +
          + + +
          +
          Returns: + + String +
          +
          +
          + +
          + +
          +
          +
          +
          + + +
          +

          Events

          +
          +

          + onComplete

          +
          + + + + + onComplete + + ( + ) + + + +
          + Custom event that fires when animation ends +Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction) +
          + +
          + + + + +
          + +
          +
          +

          + onStart

          +
          + + + + + onStart + + ( + ) + + + +
          + Custom event that fires when animation begins +Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction) +
          + +
          + + + + +
          + +
          +
          +

          + onTween

          +
          + + + + + onTween + + ( + ) + + + +
          + Custom event that fires between each frame +Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction) +
          + +
          + + + + +
          + +
          +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.AnimMgr.html b/www/extras/yui/docs/YAHOO.util.AnimMgr.html new file mode 100644 index 000000000..7237690d0 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.AnimMgr.html @@ -0,0 +1,522 @@ + + + + API: animation YAHOO.util.AnimMgr (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          animation  2.2.2

          +

          + Yahoo! UI Library + > animation + > YAHOO.util.AnimMgr + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.AnimMgr + + + + + + + +

          + + + + + +
          + Handles animation queueing and threading. +Used by Anim and subclasses. +
          + + +
          +

          Properties

          +
          +

          delay + - Int +

          +
          +
          + Interval delay in milliseconds, defaults to fastest possible. +
          +
          + + + + +
          +

          fps + - Int +

          +
          +
          + Base frame rate (frames per second). +Arbitrarily high for better x-browser calibration (slower browsers drop more frames). +
          +
          + + + + +
          +

          queue + - private Array +

          +
          +
          + The current queue of registered animation objects. +
          +
          + + + + +
          +

          thread + - private Int +

          +
          +
          + Reference to the animation Interval. +
          +
          + + + + +
          +

          tweenCount + - private Int +

          +
          +
          + The number of active animations. +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + correctFrame

          +
          + + private + + + void + correctFrame + ( + + + tween + + + ) + + +
          + On the fly frame correction to keep animation on time. +
          + +
          + +
          +
          Parameters:
          +
          + tween <Object> + The Anim instance being corrected. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + registerElement

          +
          + + + + + void + registerElement + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + run

          +
          + + + + + void + run + ( + ) + + +
          + Called per Interval to handle each animation frame. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + start

          +
          + + + + + void + start + ( + ) + + +
          + Starts the animation thread. +Only one thread can run at a time. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + stop

          +
          + + + + + void + stop + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + unRegister

          +
          + + private + + + void + unRegister + ( + + + tween + + + , + index + + + ) + + +
          + removes an animation instance from the animation queue. +All animation instances must be registered in order to animate. +
          + +
          + +
          +
          Parameters:
          +
          + tween <object> + The Anim instance to be be registered +
          +
          + index <Int> + The index of the Anim instance +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.Attribute.html b/www/extras/yui/docs/YAHOO.util.Attribute.html new file mode 100644 index 000000000..eb853fda7 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.Attribute.html @@ -0,0 +1,596 @@ + + + + API: element YAHOO.util.Attribute (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          element  2.2.2

          +

          + Yahoo! UI Library + > element + > YAHOO.util.Attribute + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.Attribute + + + + + + + +

          + + + + + +
          + Provides Attribute configurations. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.util.Attribute + + ( + + + + hash + + , + The + ) + +
          +
          +
          Parameters:
          +
          + hash + <Object> + + The intial Attribute. +
          +
          + The + <YAHOO.util.AttributeProvider> + + owner of the Attribute instance. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _initialConfig + - private Object +

          +
          +
          + The attribute's initial configuration. +
          +
          + + + + +
          +

          _written + - private Boolean +

          +
          +
          + Whether or not the attribute's value has been set. +
          +
          + + + + +
          +

          method + - Function +

          +
          +
          + The method to use when setting the attribute's value. +The method recieves the new value as the only argument. +
          +
          + + + + +
          +

          name + - String +

          +
          +
          + The name of the attribute. +
          +
          + + + + +
          +

          owner + - YAHOO.util.AttributeProvider +

          +
          +
          + The owner of the attribute. +
          +
          + + + + +
          +

          readOnly + - Boolean +

          +
          +
          + Whether or not the attribute is read only. +
          +
          + + + + +
          +

          validator + - Function +

          +
          +
          + The validator to use when setting the attribute's value. +
          +
          + + + + +
          +

          value + - String +

          +
          +
          + The value of the attribute. +
          +
          + + + + +
          +

          writeOnce + - Boolean +

          +
          +
          + Whether or not the attribute can only be written once. +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + configure

          +
          + + + + + void + configure + ( + + + map + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + getValue

          +
          + + + + + any + getValue + ( + ) + + +
          + Retrieves the current value of the attribute. +
          + +
          + + +
          +
          Returns: + + any +
          +
          The current value of the attribute.
          +
          + +
          + +
          +
          +

          + refresh

          +
          + + + + + Boolean + refresh + ( + ) + + +
          + Resets the value to the current value. +Useful when values may have gotten out of sync with actual properties. +
          + +
          + + +
          +
          Returns: + + Boolean +
          +
          Whether or not the value was set.
          +
          + +
          + +
          +
          +

          + resetConfig

          +
          + + + + + void + resetConfig + ( + ) + + +
          + Resets the attribute config to the initial config state. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + resetValue

          +
          + + + + + Boolean + resetValue + ( + ) + + +
          + Resets the value to the initial config value. +
          + +
          + + +
          +
          Returns: + + Boolean +
          +
          Whether or not the value was set.
          +
          + +
          + +
          +
          +

          + setValue

          +
          + + + + + Boolean + setValue + ( + + + value + + + , + 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.
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.AttributeProvider.html b/www/extras/yui/docs/YAHOO.util.AttributeProvider.html new file mode 100644 index 000000000..2bbeeaba4 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.AttributeProvider.html @@ -0,0 +1,909 @@ + + + + API: element YAHOO.util.AttributeProvider (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          element  2.2.2

          +

          + Yahoo! UI Library + > element + > YAHOO.util.AttributeProvider + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.AttributeProvider + + + + + - uses + + YAHOO.util.EventProvider + + + + +

          + + + + + +
          + Provides and manages YAHOO.util.Attribute instances +
          + + +
          +

          Properties

          +
          +

          _configs + - private {Object} +

          +
          +
          + A key-value map of Attribute configurations +
          +
          + + + + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Methods

          +
          +

          + configureAttribute

          +
          + + + + + void + configureAttribute + ( + + + key + + + , + map + + + , + 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 +
          +
          +
          + +
          + Deprecated Use setAttributeConfig +
          +
          + +
          +
          +

          + fireBeforeChangeEvent

          +
          + + + + + void + fireBeforeChangeEvent + ( + + + key + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + fireChangeEvent

          +
          + + + + + void + fireChangeEvent + ( + + + key + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + get

          +
          + + + + + void + get + ( + + + key + + + ) + + +
          + Returns the current value of the attribute. +
          + +
          + +
          +
          Parameters:
          +
          + key <String> + The attribute whose value will be returned. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getAttributeConfig

          +
          + + private + + + object + getAttributeConfig + ( + + + key + + + ) + + +
          + Returns the attribute's properties. +
          + +
          + +
          +
          Parameters:
          +
          + key <String> + The attribute's name +
          +
          + +
          +
          Returns: + + object +
          +
          A key-value map containing all of the +attribute's properties.
          +
          + +
          + +
          +
          +

          + getAttributeKeys

          +
          + + + + + Array + getAttributeKeys + ( + ) + + +
          + Returns an array of attribute names. +
          + +
          + + +
          +
          Returns: + + Array +
          +
          An array of attribute names.
          +
          + +
          + +
          +
          +

          + refresh

          +
          + + + + + void + refresh + ( + + + key + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + register

          +
          + + + + + void + register + ( + + + key + + + , + 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 +
          +
          +
          + +
          + Deprecated Use setAttributeConfig +
          +
          + +
          +
          +

          + resetAttributeConfig

          +
          + + private + + + void + resetAttributeConfig + ( + + + key + + + ) + + +
          + Resets an attribute to its intial configuration. +
          + +
          + +
          +
          Parameters:
          +
          + key <String> + The attribute's name. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + resetValue

          +
          + + + + + Boolean + resetValue + ( + + + key + + + , + 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
          +
          + +
          + +
          +
          +

          + set

          +
          + + + + + Boolean + set + ( + + + key + + + , + value + + + , + 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.
          +
          + +
          + +
          +
          +

          + setAttributeConfig

          +
          + + + + + void + setAttributeConfig + ( + + + key + + + , + map + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + setAttributes

          +
          + + + + + void + setAttributes + ( + + + map + + + , + 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 +
          +
          +
          + +
          + +
          +
          +
          +
          + +
          +

          Methods inherited from YAHOO.util.EventProvider:

          + +
          + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.Bezier.html b/www/extras/yui/docs/YAHOO.util.Bezier.html new file mode 100644 index 000000000..be1147e03 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.Bezier.html @@ -0,0 +1,217 @@ + + + + API: animation YAHOO.util.Bezier (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          animation  2.2.2

          +

          + Yahoo! UI Library + > animation + > YAHOO.util.Bezier + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.Bezier + + + + + + + +

          + + + + + +
          + Used to calculate Bezier splines for any number of control points. +
          + + + + +
          +

          Methods

          +
          +

          + getPosition

          +
          + + + + + Array + getPosition + ( + + + points + + + , + 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
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.ColorAnim.html b/www/extras/yui/docs/YAHOO.util.ColorAnim.html new file mode 100644 index 000000000..d39a8332f --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.ColorAnim.html @@ -0,0 +1,320 @@ + + + + API: animation YAHOO.util.ColorAnim (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          animation  2.2.2

          +

          + Yahoo! UI Library + > animation + > YAHOO.util.ColorAnim + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.ColorAnim + + - extends YAHOO.util.Anim + + + + + + +

          + + + + + +
          + 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)

          +
          + +
          +

          Constructor

          +
          +
          + YAHOO.util.ColorAnim + + ( + + + + el + + , + attributes + + , + duration + + , + 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) +
          +
          + + +
          +
          +
          +
          + + +
          +

          Properties inherited from YAHOO.util.Anim:

          + +
          + +
          +

          Methods

          +
          +

          + parseColor

          +
          + + + + + Array + parseColor + ( + + + 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.
          +
          + +
          + +
          +
          +
          +
          + + + + + +
          +

          Events inherited from YAHOO.util.Anim:

          +
          + + + onComplete, + onStart, + onTween + +
          +
          + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.Config.html b/www/extras/yui/docs/YAHOO.util.Config.html new file mode 100644 index 000000000..f84766bec --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.Config.html @@ -0,0 +1,1295 @@ + + + + API: container YAHOO.util.Config (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + > YAHOO.util.Config + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.Config + + + + + + + +

          + + + + + +
          + 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. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.util.Config + + ( + + + + owner + ) + +
          +
          +
          Parameters:
          +
          + owner + <Object> + + The owner Object to which this Config Object belongs +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          config + - private Object +

          +
          +
          + Maintains the local collection of configuration property objects and their specified values +
          +
          + + + + +
          +

          eventQueue + - private Object +

          +
          +
          + Maintains the local, normalized CustomEvent queue +
          +
          + + + + +
          +

          initialConfig + - private Object +

          +
          +
          + Maintains the local collection of configuration property objects as they were initially applied. +This object is used when resetting a property. +
          +
          + + + + +
          +

          owner + - Object +

          +
          +
          + Object reference to the owner of this Config Object +
          +
          + + + + +
          +

          queueInProgress + - Boolean +

          +
          +
          + Boolean flag that specifies whether a queue is currently being executed +
          +
          + + + + +
          +

          YAHOO.util.Config.BOOLEAN_TYPE + - private static final object +

          +
          +
          + Constant representing the boolean type string +
          +
          + + + + +
          +

          YAHOO.util.Config.CONFIG_CHANGED_EVENT + - private static final object +

          +
          +
          + Constant representing the CustomEvent type for the config changed event. +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + addProperty

          +
          + + + + + void + addProperty + ( + + + key + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + applyConfig

          +
          + + + + + void + applyConfig + ( + + + userConfig + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + checkBoolean

          +
          + + + + + Boolean + checkBoolean + ( + + + 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
          +
          + +
          + +
          +
          +

          + checkNumber

          +
          + + + + + Boolean + checkNumber + ( + + + 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
          +
          + +
          + +
          +
          +

          + fireEvent

          +
          + + private + + + void + fireEvent + ( + + + key + + + , + Object + + + ) + + +
          + Fires a configuration property event using the specified value. +
          + +
          + +
          +
          Parameters:
          +
          + key <String> + The configuration property's name +
          +
          + Object <value> + The value of the correct type for the property +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + fireQueue

          +
          + + + + + void + fireQueue + ( + ) + + +
          + Fires the normalized list of queued property change events +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getConfig

          +
          + + + + + Object + getConfig + ( + ) + + +
          + Returns a key-value configuration map of the values currently set in the Config Object. +
          + +
          + + +
          +
          Returns: + + Object +
          +
          The current config, represented in a key-value map
          +
          + +
          + +
          +
          +

          + getProperty

          +
          + + + + + Object + getProperty + ( + + + key + + + ) + + +
          + Returns the value of specified property. +
          + +
          + +
          +
          Parameters:
          +
          + key <String> + The name of the property +
          +
          + +
          +
          Returns: + + Object +
          +
          The value of the specified property
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + outputEventQueue

          +
          + + + + + String + outputEventQueue + ( + ) + + +
          + Returns a string representation of the Config object's current CustomEvent queue +
          + +
          + + +
          +
          Returns: + + String +
          +
          The string list of CustomEvents currently queued for execution
          +
          + +
          + +
          +
          +

          + queueProperty

          +
          + + + + + Boolean + queueProperty + ( + + + key + + + , + 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.
          +
          + +
          + +
          +
          +

          + refireEvent

          +
          + + + + + void + refireEvent + ( + + + key + + + ) + + +
          + Fires the event for a property using the property's current value. +
          + +
          + +
          +
          Parameters:
          +
          + key <String> + The name of the property +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + refresh

          +
          + + + + + void + refresh + ( + ) + + +
          + Refires the events for all configuration properties using their current values. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + resetProperty

          +
          + + + + + Boolean + resetProperty + ( + + + 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
          +
          + +
          + +
          +
          +

          + setProperty

          +
          + + + + + Boolean + setProperty + ( + + + key + + + , + value + + + , + 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.
          +
          + +
          + +
          +
          +

          + subscribeToConfigEvent

          +
          + + + + + Boolean + subscribeToConfigEvent + ( + + + key + + + , + handler + + + , + obj + + + , + 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.
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a string representation of the Config object +
          + +
          + + +
          +
          Returns: + + String +
          +
          The Config object in string format.
          +
          + +
          + +
          +
          +

          + unsubscribeFromConfigEvent

          +
          + + + + + Boolean + unsubscribeFromConfigEvent + ( + + + key + + + , + handler + + + , + 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.
          +
          + +
          + +
          +
          +

          + YAHOO.util.Config.alreadySubscribed

          +
          + + + static + + Boolean + YAHOO.util.Config.alreadySubscribed + ( + + + evt + + + , + fn + + + , + obj + + + ) + + +
          + 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
          +
          + +
          + +
          +
          +
          +
          + + +
          +

          Events

          +
          +

          + configChangedEvent

          +
          + + + + + configChangedEvent + + ( + ) + + + +
          + Custom Event, notifying subscribers when Config properties are set (setProperty is called without the silent flag +
          + +
          + + + + +
          + +
          +
          +
          +
          + + + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.Connect.html b/www/extras/yui/docs/YAHOO.util.Connect.html new file mode 100644 index 000000000..e85a3a918 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.Connect.html @@ -0,0 +1,1626 @@ + + + + API: connection YAHOO.util.Connect (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          connection  2.2.2

          +

          + Yahoo! UI Library + > connection + > YAHOO.util.Connect + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.Connect + + + + + + + +

          + + + + + +
          + The Connection Manager singleton provides methods for creating and managing +asynchronous transactions. +
          + + +
          +

          Properties

          +
          +

          _default_post_header + - private static boolean +

          +
          +
          + Determines if a default header of +Content-Type of 'application/x-www-form-urlencoded' +will be added to client HTTP headers sent for POST +transactions. +
          +
          + + + + +
          +

          _default_xhr_header + - private static boolean +

          +
          +
          + The default header value for the label +"X-Requested-With". This is sent with each +transaction, by default, to identify the +request as being made by YUI Connection Manager. +
          +
          + + + + +
          +

          _formNode + - private static object +

          +
          +
          + Property modified by setForm() to set a reference to the HTML +form node if the desired action is file upload. +
          +
          + + + + +
          +

          _has_default_header + - private static boolean +

          +
          +
          + Determines if custom, default headers +are set for each transaction. +
          +
          + + + + +
          +

          _has_http_headers + - private static boolean +

          +
          +
          + Determines if HTTP headers are set. +
          +
          + + + + +
          +

          _hasSubmitListener + - private static boolean +

          +
          +
          + Determines whether YAHOO.util.Event is available and returns true or false. +If true, an event listener is bound at the document level to trap click events that +resolve to a target type of "Submit". This listener will enable setForm() to determine +the clicked "Submit" value in a multi-Submit button, HTML form. +
          +
          + + + + +
          +

          _http_header + - private static object +

          +
          +
          + Object literal of HTTP header(s) +
          +
          + + + + +
          +

          _isFileUpload + - private static boolean +

          +
          +
          + Property modified by setForm() to determine if a file(s) +upload is expected. +
          +
          + + + + +
          +

          _isFormSubmit + - private static boolean +

          +
          +
          + Property modified by setForm() to determine if the data +should be submitted as an HTML form. +
          +
          + + + + +
          +

          _msxml_progid + - private static array +

          +
          +
          + Array of MSFT ActiveX ids for XMLHttpRequest. +
          +
          + + + + +
          +

          _poll + - private static object +

          +
          +
          + Collection of polling references to the polling mechanism in handleReadyState. +
          +
          + + + + +
          +

          _polling_interval + - private static int +

          +
          +
          + The polling frequency, in milliseconds, for HandleReadyState. +when attempting to determine a transaction's XHR readyState. +The default is 50 milliseconds. +
          +
          + + + + +
          +

          _sFormData + - private static string +

          +
          +
          + Property modified by setForm() to set the HTML form data +for each transaction. +
          +
          + + + + +
          +

          _submitElementValue + - private static string +

          +
          +
          + Tracks the name-value pair of the "clicked" submit button if multiple submit +buttons are present in an HTML form; and, if YAHOO.util.Event is available. +
          +
          + + + + +
          +

          _timeOut + - private static object +

          +
          +
          + Queue of timeout values for each transaction callback with a defined timeout value. +
          +
          + + + + +
          +

          _transaction_id + - private static int +

          +
          +
          + A transaction counter that increments the transaction id for each transaction. +
          +
          + + + + +
          +

          _use_default_post_header + - private static boolean +

          +
          +
          + 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. +
          +
          + + + + +
          +

          _use_default_xhr_header + - private static boolean +

          +
          +
          + Determines if a default header of +'X-Requested-With: XMLHttpRequest' +will be added to each transaction. +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + abort

          +
          + + + static + + boolean + abort + ( + + + o + + + , + callback + + + , + isTimeout + + + ) + + +
          + 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 +
          +
          +
          + +
          + +
          +
          +

          + appendPostData

          +
          + + private + static + + array + appendPostData + ( + + + postData + + + ) + + +
          + Parses the POST data and creates hidden form elements +for each key-value, and appends them to the HTML form object. +
          + +
          + +
          +
          Parameters:
          +
          + postData <string> + The HTTP POST data +
          +
          + +
          +
          Returns: + + array +
          +
          formElements Collection of hidden fields.
          +
          + +
          + +
          +
          +

          + asyncRequest

          +
          + + + static + + object + asyncRequest + ( + + + method + + + , + uri + + + , + callback + + + , + postData + + + ) + + +
          + 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
          +
          + +
          + +
          +
          +

          + createExceptionObject

          +
          + + private + static + + object + createExceptionObject + ( + + + tId + + + , + callbackArg + + + , + isAbort + + + ) + + +
          + 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. +
          + +
          + +
          +
          Parameters:
          +
          + tId <int> + The Transaction Id +
          +
          + callbackArg <callbackArg> + The user-defined argument or arguments to be passed to the callback +
          +
          + isAbort <boolean> + Determines if the exception case is caused by a transaction abort +
          +
          + +
          +
          Returns: + + object +
          +
          +
          + +
          + +
          +
          +

          + createFrame

          +
          + + private + static + + void + createFrame + ( + + + optional + + + ) + + +
          + Creates an iframe to be used for form file uploads. It is remove from the +document upon completion of the upload transaction. +
          + +
          + +
          +
          Parameters:
          +
          + optional <string> + qualified path of iframe resource for SSL in IE. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + createResponseObject

          +
          + + private + static + + object + createResponseObject + ( + + + o + + + , + callbackArg + + + ) + + +
          + 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. +
          + +
          + +
          +
          Parameters:
          +
          + o <object> + The connection object +
          +
          + callbackArg <callbackArg> + The user-defined argument or arguments to be passed to the callback +
          +
          + +
          +
          Returns: + + object +
          +
          +
          + +
          + +
          +
          +

          + createXhrObject

          +
          + + private + static + + void + createXhrObject + ( + + + transactionId + + + ) + + +
          + Instantiates a XMLHttpRequest object and returns an object with two properties: +the XMLHttpRequest instance and the transaction id. +
          + +
          + +
          +
          Parameters:
          +
          + transactionId <int> + Property containing the transaction id for this transaction. +
          +
          + +
          +
          Returns: + + void +
          +
          object
          +
          + +
          + +
          +
          +

          + getConnectionObject

          +
          + + private + static + + object + getConnectionObject + ( + ) + + +
          + 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. +
          + +
          + + +
          +
          Returns: + + object +
          +
          +
          + +
          + +
          +
          +

          + handleReadyState

          +
          + + private + static + + void + handleReadyState + ( + + + o + + + , + callback + + + ) + + +
          + 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. +
          + +
          + +
          +
          Parameters:
          +
          + o <object> + The connection object +
          +
          + callback <callback> + The user-defined callback object +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + handleTransactionResponse

          +
          + + private + static + + void + handleTransactionResponse + ( + + + o + + + , + callback + + + , + isAbort + + + ) + + +
          + This method attempts to interpret the server response and +determine whether the transaction was successful, or if an error or +exception was encountered. +
          + +
          + +
          +
          Parameters:
          +
          + o <object> + The connection object +
          +
          + callback <object> + The sser-defined callback object +
          +
          + isAbort <boolean> + Determines if the transaction was aborted. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initHeader

          +
          + + + static + + void + initHeader + ( + + + label + + + , + value + + + , + isDefault + + + ) + + +
          + Method that initializes the custom HTTP headers for the each transaction. +
          + +
          + +
          +
          Parameters:
          +
          + label <string> + The HTTP header label +
          +
          + value <string> + The HTTP header value +
          +
          + isDefault <string> + Determines if the specific header is a default header +automatically sent with each transaction. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + isCallInProgress

          +
          + + + static + + boolean + isCallInProgress + ( + + + o + + + ) + + +
          + Public method to check if the transaction is still being processed. +
          + +
          + +
          +
          Parameters:
          +
          + o <object> + The connection object returned by asyncRequest +
          +
          + +
          +
          Returns: + + boolean +
          +
          +
          + +
          + +
          +
          +

          + releaseObject

          +
          + + private + static + + void + releaseObject + ( + + + o + + + ) + + +
          + Dereference the XHR instance and the connection object after the transaction is completed. +
          + +
          + +
          +
          Parameters:
          +
          + o <object> + The connection object +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + resetDefaultHeaders

          +
          + + + static + + void + resetDefaultHeaders + ( + ) + + +
          + Resets the default HTTP headers object +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + resetFormState

          +
          + + private + static + + void + resetFormState + ( + ) + + +
          + Resets HTML form properties when an HTML form or HTML form +with file upload transaction is sent. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setDefaultPostHeader

          +
          + + + static + + void + setDefaultPostHeader + ( + + + b + + + ) + + +
          + Member to enable or disable the default POST header. +
          + +
          + +
          +
          Parameters:
          +
          + b <boolean> + Set and use default header - true or false . +
          +
          + +
          +
          Returns: + + void +
          +
          void
          +
          + +
          + +
          +
          +

          + setDefaultXhrHeader

          +
          + + + static + + void + setDefaultXhrHeader + ( + + + b + + + ) + + +
          + Member to enable or disable the default POST header. +
          + +
          + +
          +
          Parameters:
          +
          + b <boolean> + Set and use default header - true or false . +
          +
          + +
          +
          Returns: + + void +
          +
          void
          +
          + +
          + +
          +
          +

          + setForm

          +
          + + + static + + string + setForm + ( + + + form + + + , + optional + + + + + ) + + +
          + 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:
          +
          + form <string || object> + id or name attribute, or form object. +
          +
          + optional <string> + boolean to indicate SSL environment. +
          +
          + optional <string || boolean> + qualified path of iframe resource for SSL in IE. +
          +
          + +
          +
          Returns: + + string +
          +
          string of the HTML form field name and value pairs..
          +
          + +
          + +
          +
          +

          + setHeader

          +
          + + private + static + + void + setHeader + ( + + + o + + + ) + + +
          + Accessor that sets the HTTP headers for each transaction. +
          + +
          + +
          +
          Parameters:
          +
          + o <object> + The connection object for the transaction. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setPollingInterval

          +
          + + + static + + void + setPollingInterval + ( + + + i + + + ) + + +
          + Member to modify the default polling interval. +
          + +
          + +
          +
          Parameters:
          +
          + i <int> + The polling interval in milliseconds. +
          +
          + +
          +
          Returns: + + void +
          +
          void
          +
          + +
          + +
          +
          +

          + setProgId

          +
          + + + static + + void + setProgId + ( + + + id + + + ) + + +
          + 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 +
          +
          void
          +
          + +
          + +
          +
          +

          + uploadFile

          +
          + + private + static + + void + uploadFile + ( + + + id + + + , + callback + + + , + uri + + + ) + + +
          + Uploads HTML form, including files/attachments, to the +iframe created in createFrame. +
          + +
          + +
          +
          Parameters:
          +
          + id <int> + The transaction id. +
          +
          + callback <object> + - User-defined callback object. +
          +
          + uri <string> + Fully qualified path of resource. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.CustomEvent.html b/www/extras/yui/docs/YAHOO.util.CustomEvent.html new file mode 100644 index 000000000..a08855e20 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.CustomEvent.html @@ -0,0 +1,726 @@ + + + + API: event YAHOO.util.CustomEvent (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Event Utility  2.2.2

          +

          + Yahoo! UI Library + > event + > YAHOO.util.CustomEvent + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.CustomEvent + + + + + + + +

          + + + + + +
          + The CustomEvent class lets you define events for your application +that can be subscribed to by one or more independent component. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.util.CustomEvent + + ( + + + + type + + , + oScope + + , + silent + + , + signature + ) + +
          +
          +
          Parameters:
          +
          + type + <String> + + The type of event, which is passed to the callback +when the event fires +
          +
          + oScope + <Object> + + 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. +
          +
          + silent + <boolean> + + pass true to prevent the event from writing to +the debugsystem +
          +
          + signature + <int> + + the signature that the custom event subscriber +will receive. YAHOO.util.CustomEvent.LIST or +YAHOO.util.CustomEvent.FLAT. The default is +YAHOO.util.CustomEvent.LIST. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          scope + - object +

          +
          +
          + The scope the the event will fire from by default. Defaults to the window +obj +
          +
          + + + + +
          +

          signature + - int +

          +
          +
          + 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
            • +
            +
          • +
          +
          +
          + + + + +
          +

          silent + - boolean +

          +
          +
          + By default all custom events are logged in the debug build, set silent +to true to disable debug outpu for this event. +
          +
          + + + + +
          +

          subscribers + - Subscriber[] +

          +
          +
          + The subscribers to this event +
          +
          + + + + +
          +

          type + - string +

          +
          +
          + The type of event, returned to subscribers when the event fires +
          +
          + + + + +
          +

          YAHOO.util.CustomEvent.FLAT + - static int +

          +
          +
          + Subscriber listener sigature constant. The FLAT type returns two +parameters: the first argument passed to fire and the optional +custom object +
          +
          + + + + +
          +

          YAHOO.util.CustomEvent.LIST + - static int +

          +
          +
          + 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 +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + _delete

          +
          + + private + + + void + _delete + ( + ) + + +
          + +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + fire

          +
          + + + + + boolean + fire + ( + + + 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: + + boolean +
          +
          false if one of the subscribers returned false, +true otherwise
          +
          + +
          + +
          +
          +

          + subscribe

          +
          + + + + + void + subscribe + ( + + + fn + + + , + obj + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + void + toString + ( + ) + + +
          + +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + unsubscribe

          +
          + + + + + boolean + unsubscribe + ( + + + fn + + + , + obj + + + ) + + +
          + Unsubscribes subscribers. +
          + +
          + +
          +
          Parameters:
          +
          + fn <Function> + The subscribed function to remove, if not supplied +all will be removed +
          +
          + obj <Object> + The custom object passed to subscribe. This is +optional, but if supplied will be used to +disambiguate multiple listeners that are the same +(e.g., you subscribe many object using a function +that lives on the prototype) +
          +
          + +
          +
          Returns: + + boolean +
          +
          True if the subscriber was found and detached.
          +
          + +
          + +
          +
          +

          + unsubscribeAll

          +
          + + + + + int + unsubscribeAll + ( + ) + + +
          + Removes all listeners +
          + +
          + + +
          +
          Returns: + + int +
          +
          The number of listeners unsubscribed
          +
          + +
          + +
          +
          +
          +
          + + +
          +

          Events

          +
          +

          + subscribeEvent

          +
          + + + + + subscribeEvent + + ( + + + fn + + + , + obj + + + , + override + + + ) + + + +
          + 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. +
          + +
          + + +
          +
          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. +
          +
          + + +
          + +
          +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.DD.html b/www/extras/yui/docs/YAHOO.util.DD.html new file mode 100644 index 000000000..9d6d659b5 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.DD.html @@ -0,0 +1,710 @@ + + + + API: dragdrop YAHOO.util.DD (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Drag and Drop  2.2.2

          +

          + Yahoo! UI Library + > dragdrop + > YAHOO.util.DD + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.DD + + - extends YAHOO.util.DragDrop + + + + + + +

          + + +
          +
          Known Subclasses: +
          + YAHOO.widget.SliderThumb + YAHOO.util.DDProxy +
          +
          + + + +
          + A DragDrop implementation where the linked element follows the +mouse cursor during a drag. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.util.DD + + ( + + + + id + + , + sGroup + + , + 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 +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          scroll + - boolean +

          +
          +
          + 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. +
          +
          + + + + +
          + + +
          +
          + + + +
          +

          Methods

          +
          +

          + alignElWithMouse

          +
          + + + + + void + 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. +
          + +
          + +
          +
          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 +
          +
          +
          + +
          + +
          +
          +

          + autoOffset

          +
          + + + + + void + autoOffset + ( + + + iPageX + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + autoScroll

          +
          + + private + + + void + autoScroll + ( + + + x + + + , + y + + + , + h + + + , + w + + + ) + + +
          + Auto-scroll the window if the dragged object has been moved beyond the +visible window boundary. +
          + +
          + +
          +
          Parameters:
          +
          + x <int> + the drag element's x position +
          +
          + y <int> + the drag element's y position +
          +
          + h <int> + the height of the drag element +
          +
          + w <int> + the width of the drag element +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + cachePosition

          +
          + + + + + void + cachePosition + ( + + + iPageX + + + , + iPageY + + + ) + + +
          + 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:
          +
          + iPageX <object> + the current x position (optional, this just makes it so we +don't have to look it up again) +
          +
          + iPageY <object> + the current y position (optional, this just makes it so we +don't have to look it up again) +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setDelta

          +
          + + + + + void + setDelta + ( + + + iDeltaX + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + setDragElPos

          +
          + + + + + void + setDragElPos + ( + + + iPageX + + + , + 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 +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.DDProxy.html b/www/extras/yui/docs/YAHOO.util.DDProxy.html new file mode 100644 index 000000000..44dc234f6 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.DDProxy.html @@ -0,0 +1,561 @@ + + + + API: dragdrop YAHOO.util.DDProxy (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Drag and Drop  2.2.2

          +

          + Yahoo! UI Library + > dragdrop + > YAHOO.util.DDProxy + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.DDProxy + + - extends YAHOO.util.DD + + + + + + +

          + + + + + +
          + 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. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.util.DDProxy + + ( + + + + id + + , + sGroup + + , + 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 +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          centerFrame + - boolean +

          +
          +
          + 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. +
          +
          + + + + +
          +

          resizeFrame + - boolean +

          +
          +
          + 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. +
          +
          + + + + +
          +

          YAHOO.util.DDProxy.dragElId + - static String +

          +
          +
          + The default drag frame div id +
          +
          + + + + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.util.DD:

          +
          + + + scroll + +
          +
          + + +
          +

          Methods

          +
          +

          + _resizeProxy

          +
          + + private + + + void + _resizeProxy + ( + ) + + +
          + The proxy is automatically resized to the dimensions of the linked +element when a drag is initiated, unless resizeFrame is set to false +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + createFrame

          +
          + + + + + void + createFrame + ( + ) + + +
          + Creates the proxy element if it does not yet exist +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initFrame

          +
          + + + + + void + initFrame + ( + ) + + +
          + Initialization for the drag frame element. Must be called in the +constructor of all subclasses +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + showFrame

          +
          + + private + + + void + showFrame + ( + + + iPageX + + + , + iPageY + + + ) + + +
          + Resizes the drag frame to the dimensions of the clicked object, positions +it over the object, and finally displays it +
          + +
          + +
          +
          Parameters:
          +
          + iPageX <int> + X click position +
          +
          + iPageY <int> + Y click position +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + +
          +

          Methods inherited from YAHOO.util.DD:

          + +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.DDTarget.html b/www/extras/yui/docs/YAHOO.util.DDTarget.html new file mode 100644 index 000000000..24cc8fc26 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.DDTarget.html @@ -0,0 +1,298 @@ + + + + API: dragdrop YAHOO.util.DDTarget (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Drag and Drop  2.2.2

          +

          + Yahoo! UI Library + > dragdrop + > YAHOO.util.DDTarget + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.DDTarget + + - extends YAHOO.util.DragDrop + + + + + + +

          + + + + + +
          + 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. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.util.DDTarget + + ( + + + + id + + , + sGroup + + , + 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 +
          +
          + + +
          +
          +
          +
          + + + + + + + + + + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.Dom.html b/www/extras/yui/docs/YAHOO.util.Dom.html new file mode 100644 index 000000000..fa5dd631c --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.Dom.html @@ -0,0 +1,1481 @@ + + + + API: dom YAHOO.util.Dom (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          dom  2.2.2

          +

          + Yahoo! UI Library + > dom + > YAHOO.util.Dom + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.Dom + + + + + + + +

          + + + + + +
          + Provides helper methods for DOM elements. +
          + + + + +
          +

          Methods

          +
          +

          + addClass

          +
          + + + + + void + addClass + ( + + + el + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + batch

          +
          + + + + + HTMLElement | Array + batch + ( + + + el + + + , + method + + + , + o + + + , + 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
          +
          + +
          + +
          +
          +

          + generateId

          +
          + + + + + String | Array + generateId + ( + + + el + + + , + 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)
          +
          + +
          + +
          +
          +

          + get

          +
          + + + + + HTMLElement | Array + get + ( + + + el + + + ) + + +
          + Returns an HTMLElement reference. +
          + +
          + +
          +
          Parameters:
          +
          + el <String | HTMLElement |Array> + 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.
          +
          + +
          + +
          +
          +

          + getClientHeight

          +
          + + + + + Int + getClientHeight + ( + ) + + +
          + Returns the height of the client (viewport). +
          + +
          + + +
          +
          Returns: + + Int +
          +
          The height of the viewable area of the page.
          +
          + +
          + Deprecated Now using getViewportHeight. This interface left intact for back compat. +
          +
          + +
          +
          +

          + getClientWidth

          +
          + + + + + Int + getClientWidth + ( + ) + + +
          + Returns the width of the client (viewport). +
          + +
          + + +
          +
          Returns: + + Int +
          +
          The width of the viewable area of the page.
          +
          + +
          + Deprecated Now using getViewportWidth. This interface left intact for back compat. +
          +
          + +
          +
          +

          + getDocumentHeight

          +
          + + + + + Int + getDocumentHeight + ( + ) + + +
          + Returns the height of the document. +
          + +
          + + +
          +
          Returns: + + Int +
          +
          The height of the actual document (which includes the body and its margin).
          +
          + +
          + +
          +
          +

          + getDocumentWidth

          +
          + + + + + Int + getDocumentWidth + ( + ) + + +
          + Returns the width of the document. +
          + +
          + + +
          +
          Returns: + + Int +
          +
          The width of the actual document (which includes the body and its margin).
          +
          + +
          + +
          +
          +

          + getElementsBy

          +
          + + + + + Array + getElementsBy + ( + + + method + + + , + tag + + + , + 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: + + Array +
          +
          Array of HTMLElements
          +
          + +
          + +
          +
          +

          + getElementsByClassName

          +
          + + + + + Array + getElementsByClassName + ( + + + className + + + , + tag + + + , + 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
          +
          + +
          + +
          +
          +

          + getRegion

          +
          + + + + + Region | Array + getRegion + ( + + + 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.
          +
          + +
          + +
          +
          +

          + getStyle

          +
          + + + + + String | Array + getStyle + ( + + + el + + + , + property + + + ) + + +
          + Normalizes currentStyle and ComputedStyle. +
          + +
          + +
          +
          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 whose value is returned. +
          +
          + +
          +
          Returns: + + String | Array +
          +
          The current value of the style property for the element(s).
          +
          + +
          + +
          +
          +

          + getViewportHeight

          +
          + + + + + Int + getViewportHeight + ( + ) + + +
          + Returns the current height of the viewport. +
          + +
          + + +
          +
          Returns: + + Int +
          +
          The height of the viewable area of the page (excludes scrollbars).
          +
          + +
          + +
          +
          +

          + getViewportWidth

          +
          + + + + + Int + getViewportWidth + ( + ) + + +
          + Returns the current width of the viewport. +
          + +
          + + +
          +
          Returns: + + Int +
          +
          The width of the viewable area of the page (excludes scrollbars).
          +
          + +
          + +
          +
          +

          + getX

          +
          + + + + + String | Array + getX + ( + + + 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)
          +
          + +
          + +
          +
          +

          + getXY

          +
          + + + + + Array + getXY + ( + + + 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)
          +
          + +
          + +
          +
          +

          + getY

          +
          + + + + + String | Array + getY + ( + + + 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)
          +
          + +
          + +
          +
          +

          + hasClass

          +
          + + + + + Boolean | Array + hasClass + ( + + + el + + + , + 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
          +
          + +
          + +
          +
          +

          + inDocument

          +
          + + + + + Boolean + inDocument + ( + + + 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
          +
          + +
          + +
          +
          +

          + isAncestor

          +
          + + + + + Boolean + isAncestor + ( + + + haystack + + + , + 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
          +
          + +
          + +
          +
          +

          + removeClass

          +
          + + + + + void + removeClass + ( + + + el + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + replaceClass

          +
          + + + + + void + replaceClass + ( + + + el + + + , + oldClassName + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + setStyle

          +
          + + + + + void + setStyle + ( + + + el + + + , + property + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + setX

          +
          + + + + + void + setX + ( + + + el + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + setXY

          +
          + + + + + void + setXY + ( + + + el + + + , + pos + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + setY

          +
          + + + + + void + setY + ( + + + el + + + , + 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 +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.DragDrop.html b/www/extras/yui/docs/YAHOO.util.DragDrop.html new file mode 100644 index 000000000..41599e7d4 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.DragDrop.html @@ -0,0 +1,3310 @@ + + + + API: dragdrop YAHOO.util.DragDrop (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Drag and Drop  2.2.2

          +

          + Yahoo! UI Library + > dragdrop + > YAHOO.util.DragDrop + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.DragDrop + + + + + + + +

          + + +
          +
          Known Subclasses: +
          + YAHOO.widget.Slider + YAHOO.util.DD + YAHOO.util.DDTarget + WidthResizer +
          +
          + + + +
          + 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);
          +}
          +
          +
          + +
          +

          Constructor

          +
          +
          + YAHOO.util.DragDrop + + ( + + + + id + + , + sGroup + + , + 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, +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          __ygDragDrop + - private object +

          +
          +
          + Internal typeof flag +
          +
          + + + + +
          +

          _domRef + - private object +

          +
          +
          + Cached reference to the linked element +
          +
          + + + + +
          +

          available + - boolean +

          +
          +
          + The availabe property is false until the linked dom element is accessible. +
          +
          + + + + +
          +

          config + - object +

          +
          +
          + Configuration attributes passed into the constructor +
          +
          + + + + +
          +

          constrainX + - private boolean +

          +
          +
          + Set to true when horizontal contraints are applied +
          +
          + + + + +
          +

          constrainY + - private boolean +

          +
          +
          + Set to true when vertical contraints are applied +
          +
          + + + + +
          +

          deltaX + - private int +

          +
          +
          + The difference between the click position and the source element's location +
          +
          + + + + +
          +

          deltaY + - private int +

          +
          +
          + The difference between the click position and the source element's location +
          +
          + + + + +
          +

          dragElId + - private String +

          +
          +
          + 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 +
          +
          + + + + +
          +

          groups + - {string: string} +

          +
          +
          + 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. +
          +
          + + + + +
          +

          handleElId + - private String +

          +
          +
          + 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. +
          +
          + + + + +
          +

          hasOuterHandles + - boolean +

          +
          +
          + 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. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          id + - String +

          +
          +
          + 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. +
          +
          + + + + +
          +

          invalidHandleClasses + - string[] +

          +
          +
          + An indexted array of css class names for elements that will be ignored +if clicked. +
          +
          + + + + +
          +

          invalidHandleIds + - {string: string} +

          +
          +
          + An associative array of ids for elements that will be ignored if clicked +
          +
          + + + + +
          +

          invalidHandleTypes + - {string: string} +

          +
          +
          + An associative array of HTML tags that will be ignored if clicked. +
          +
          + + + + +
          +

          locked + - private boolean +

          +
          +
          + Individual drag/drop instances can be locked. This will prevent +onmousedown start drag. +
          +
          + + + + +
          +

          maintainOffset + - boolean +

          +
          +
          + 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 +
          +
          + + + + +
          +

          maxX + - private int +

          +
          +
          + The right constraint +
          +
          + + + + +
          +

          maxY + - private int +

          +
          +
          + The down constraint +
          +
          + + + + +
          +

          minX + - private int +

          +
          +
          + The left constraint +
          +
          + + + + +
          +

          minY + - private int +

          +
          +
          + The up constraint +
          +
          + + + + +
          +

          primaryButtonOnly + - boolean +

          +
          +
          + 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 +
          +
          + + + + +
          +

          startPageX + - private int +

          +
          +
          + The linked element's absolute X position at the time the drag was +started +
          +
          + + + + +
          +

          startPageY + - private int +

          +
          +
          + The linked element's absolute X position at the time the drag was +started +
          +
          + + + + +
          +

          xTicks + - int[] +

          +
          +
          + 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. +
          +
          + + + + +
          +

          yTicks + - int[] +

          +
          +
          + 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. +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + addInvalidHandleClass

          +
          + + + + + void + addInvalidHandleClass + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + addInvalidHandleId

          +
          + + + + + void + addInvalidHandleId + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + addInvalidHandleType

          +
          + + + + + void + addInvalidHandleType + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + addToGroup

          +
          + + + + + void + addToGroup + ( + + + sGroup + + + ) + + +
          + 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:
          +
          + sGroup <string> + the name of the group +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + applyConfig

          +
          + + + + + void + 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. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + b4Drag

          +
          + + private + + + void + b4Drag + ( + ) + + +
          + Code that executes immediately before the onDrag event +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + b4DragDrop

          +
          + + private + + + void + b4DragDrop + ( + ) + + +
          + Code that executes immediately before the onDragDrop event +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + b4DragOut

          +
          + + private + + + void + b4DragOut + ( + ) + + +
          + Code that executes immediately before the onDragOut event +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + b4DragOver

          +
          + + private + + + void + b4DragOver + ( + ) + + +
          + Code that executes immediately before the onDragOver event +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + b4EndDrag

          +
          + + private + + + void + b4EndDrag + ( + ) + + +
          + Code that executes immediately before the endDrag event +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + b4MouseDown

          +
          + + private + + + void + b4MouseDown + ( + + + e + + + ) + + +
          + Code executed immediately before the onMouseDown event +
          + +
          + +
          +
          Parameters:
          +
          + e <Event> + the mousedown event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + b4StartDrag

          +
          + + private + + + void + b4StartDrag + ( + ) + + +
          + Code that executes immediately before the startDrag event +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + clearConstraints

          +
          + + + + + void + clearConstraints + ( + ) + + +
          + Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constraint at this time. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + clearTicks

          +
          + + + + + void + clearTicks + ( + ) + + +
          + Clears any tick interval defined for this instance +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + endDrag

          +
          + + + + + void + endDrag + ( + + + e + + + ) + + +
          + Fired when we are done dragging the object +
          + +
          + +
          +
          Parameters:
          +
          + e <Event> + the mouseup event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getDragEl

          +
          + + + + + HTMLElement + 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 +
          + +
          + + +
          +
          Returns: + + HTMLElement +
          +
          the html element
          +
          + +
          + +
          +
          +

          + getEl

          +
          + + + + + HTMLElement + getEl + ( + ) + + +
          + Returns a reference to the linked element +
          + +
          + + +
          +
          Returns: + + HTMLElement +
          +
          the html element
          +
          + +
          + +
          +
          +

          + getTargetCoord

          +
          + + private + + + void + getTargetCoord + ( + + + iPageX + + + , + iPageY + + + ) + + +
          + 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. +
          + +
          + +
          +
          Parameters:
          +
          + iPageX <int> + the X coordinate of the click +
          +
          + iPageY <int> + the Y coordinate of the click +
          +
          + +
          +
          Returns: + + void +
          +
          an object that contains the coordinates (Object.x and Object.y)
          +
          + +
          + +
          +
          +

          + getTick

          +
          + + private + + + int + getTick + ( + + + val + + + , + tickArray + + + ) + + +
          + 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. +
          + +
          + +
          +
          Parameters:
          +
          + val <int> + where we want to place the object +
          +
          + tickArray <int[]> + sorted array of valid points +
          +
          + +
          +
          Returns: + + int +
          +
          the closest tick
          +
          + +
          + +
          +
          +

          + handleMouseDown

          +
          + + private + + + void + handleMouseDown + ( + + + e + + + , + oDD + + + ) + + +
          + Fired when this object is clicked +
          + +
          + +
          +
          Parameters:
          +
          + e <Event> + +
          +
          + oDD <YAHOO.util.DragDrop> + the clicked dd object (this dd obj) +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + handleOnAvailable

          +
          + + private + + + void + handleOnAvailable + ( + ) + + +
          + Executed when the linked element is available +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + id + + + , + sGroup + + + , + config + + + ) + + +
          + Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass +
          + +
          + +
          +
          Parameters:
          +
          + id <object> + the id of the linked element +
          +
          + sGroup <String> + the group of related items +
          +
          + config <object> + configuration attributes +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initTarget

          +
          + + + + + void + initTarget + ( + + + id + + + , + sGroup + + + , + config + + + ) + + +
          + Initializes Targeting functionality only... the object does not +get a mousedown handler. +
          + +
          + +
          +
          Parameters:
          +
          + id <object> + the id of the linked element +
          +
          + sGroup <String> + the group of related items +
          +
          + config <object> + configuration attributes +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + isLocked

          +
          + + + + + boolean + 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.) +
          + +
          + + +
          +
          Returns: + + boolean +
          +
          true if this obj or all drag/drop is locked, else +false
          +
          + +
          + +
          +
          +

          + isTarget

          +
          + + + + + void + isTarget + ( + ) + + +
          + By default, all insances can be a drop target. This can be disabled by +setting isTarget to false. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + isValidHandleChild

          +
          + + + + + boolean + isValidHandleChild + ( + + + 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
          +
          + +
          + +
          +
          +

          + lock

          +
          + + + + + void + lock + ( + ) + + +
          + Lock this instance +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onAvailable

          +
          + + + + + void + onAvailable + ( + ) + + +
          + Override the onAvailable method to do what is needed after the initial +position was determined. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onDrag

          +
          + + + + + void + onDrag + ( + + + e + + + ) + + +
          + Abstract method called during the onMouseMove event while dragging an +object. +
          + +
          + +
          +
          Parameters:
          +
          + e <Event> + the mousemove event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onDragDrop

          +
          + + + + + void + onDragDrop + ( + + + e + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + onDragEnter

          +
          + + + + + void + onDragEnter + ( + + + e + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + onDragOut

          +
          + + + + + void + onDragOut + ( + + + e + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + onDragOver

          +
          + + + + + void + onDragOver + ( + + + e + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + onInvalidDrop

          +
          + + + + + void + onInvalidDrop + ( + + + e + + + ) + + +
          + Abstract method called when this item is dropped on an area with no +drop target +
          + +
          + +
          +
          Parameters:
          +
          + e <Event> + the mouseup event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onMouseDown

          +
          + + + + + void + onMouseDown + ( + + + e + + + ) + + +
          + Event handler that fires when a drag/drop obj gets a mousedown +
          + +
          + +
          +
          Parameters:
          +
          + e <Event> + the mousedown event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onMouseUp

          +
          + + + + + void + onMouseUp + ( + + + e + + + ) + + +
          + Event handler that fires when a drag/drop obj gets a mouseup +
          + +
          + +
          +
          Parameters:
          +
          + e <Event> + the mouseup event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + padding

          +
          + + + + + void + padding + ( + ) + + +
          + The padding configured for this drag and drop object for calculating +the drop zone intersection with this object. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + removeFromGroup

          +
          + + + + + void + removeFromGroup + ( + + + sGroup + + + ) + + +
          + Remove's this instance from the supplied interaction group +
          + +
          + +
          +
          Parameters:
          +
          + sGroup <string> + The group to drop +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + removeInvalidHandleClass

          +
          + + + + + void + removeInvalidHandleClass + ( + + + cssClass + + + ) + + +
          + Unsets an invalid css class +
          + +
          + +
          +
          Parameters:
          +
          + cssClass <string> + the class of the element(s) you wish to +re-enable +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + removeInvalidHandleId

          +
          + + + + + void + removeInvalidHandleId + ( + + + id + + + ) + + +
          + Unsets an invalid handle id +
          + +
          + +
          +
          Parameters:
          +
          + id <string> + the id of the element to re-enable +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + removeInvalidHandleType

          +
          + + + + + void + removeInvalidHandleType + ( + + + tagName + + + ) + + +
          + Unsets an excluded tag name set by addInvalidHandleType +
          + +
          + +
          +
          Parameters:
          +
          + tagName <string> + the type of element to unexclude +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + resetConstraints

          +
          + + + + + void + resetConstraints + ( + + + maintainOffset + + + ) + + +
          + resetConstraints must be called if you manually reposition a dd element. +
          + +
          + +
          +
          Parameters:
          +
          + maintainOffset <boolean> + +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setDragElId

          +
          + + + + + void + setDragElId + ( + + + id + + + ) + + +
          + Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag +
          + +
          + +
          +
          Parameters:
          +
          + id <string> + the id of the element that will be used to initiate the drag +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setHandleElId

          +
          + + + + + void + setHandleElId + ( + + + 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. +
          + +
          + +
          +
          Parameters:
          +
          + id <string> + the id of the element that will be used to +initiate the drag. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setInitialPosition

          +
          + + private + + + void + setInitialPosition + ( + + + diffX + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + setOuterHandleElId

          +
          + + + + + void + setOuterHandleElId + ( + + + id + + + ) + + +
          + Allows you to set an element outside of the linked element as a drag +handle +
          + +
          + +
          +
          Parameters:
          +
          + id <object> + the id of the element that will be used to initiate the drag +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setPadding

          +
          + + + + + void + setPadding + ( + + + iTop + + + , + iRight + + + , + iBot + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + setStartPosition

          +
          + + private + + + void + setStartPosition + ( + + + pos + + + ) + + +
          + Sets the start position of the element. This is set when the obj +is initialized, the reset when a drag is started. +
          + +
          + +
          +
          Parameters:
          +
          + pos <object> + current position (from previous lookup) +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setXConstraint

          +
          + + + + + void + setXConstraint + ( + + + iLeft + + + , + iRight + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + setXTicks

          +
          + + private + + + void + setXTicks + ( + ) + + +
          + Create the array of horizontal tick marks if an interval was specified +in setXConstraint(). +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setYConstraint

          +
          + + + + + void + setYConstraint + ( + + + iUp + + + , + iDown + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + setYTicks

          +
          + + private + + + void + setYTicks + ( + ) + + +
          + Create the array of vertical tick marks if an interval was specified in +setYConstraint(). +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + startDrag

          +
          + + + + + void + startDrag + ( + + + X + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + string + toString + ( + ) + + +
          + toString method +
          + +
          + + +
          +
          Returns: + + string +
          +
          string representation of the dd obj
          +
          + +
          + +
          +
          +

          + unlock

          +
          + + + + + void + unlock + ( + ) + + +
          + Unlock this instace +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + unreg

          +
          + + + + + void + unreg + ( + ) + + +
          + Remove all drag and drop hooks for this element +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.DragDropMgr.ElementWrapper.html b/www/extras/yui/docs/YAHOO.util.DragDropMgr.ElementWrapper.html new file mode 100644 index 000000000..d12163041 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.DragDropMgr.ElementWrapper.html @@ -0,0 +1,205 @@ + + + + API: dragdrop YAHOO.util.DragDropMgr.ElementWrapper (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Drag and Drop  2.2.2

          +

          + Yahoo! UI Library + > dragdrop + > YAHOO.util.DragDropMgr.ElementWrapper + +

          +
          + +
          +
          +
          + + +

          + private + + + + Class YAHOO.util.DragDropMgr.ElementWrapper + + + + + + + +

          + + + + + +
          + Inner class for cached elements +
          + + +
          +

          Properties

          +
          +

          css + - object +

          +
          +
          + A reference to the style property +
          +
          + + + + +
          +

          el + - object +

          +
          +
          + The element +
          +
          + + + + +
          +

          id + - object +

          +
          +
          + The element id +
          +
          + + + + +
          + + +
          +
          + + + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.DragDropMgr.html b/www/extras/yui/docs/YAHOO.util.DragDropMgr.html new file mode 100644 index 000000000..b53cce277 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.DragDropMgr.html @@ -0,0 +1,2773 @@ + + + + API: dragdrop YAHOO.util.DragDropMgr (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Drag and Drop  2.2.2

          +

          + Yahoo! UI Library + > dragdrop + > YAHOO.util.DragDropMgr + +

          +
          + +
          +
          +
          + + +

          + + + static + + Class 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. +
          + + +
          +

          Properties

          +
          +

          _timeoutCount + - private static object +

          +
          +
          + Internal counter +
          +
          + + + + +
          +

          clickPixelThresh + - static int +

          +
          +
          + The number of pixels that the mouse needs to move after the +mousedown before the drag is initiated. Default=3; +
          +
          + + + + +
          +

          clickTimeout + - private static Object +

          +
          +
          + Timeout used for the click time threshold +
          +
          + + + + +
          +

          clickTimeThresh + - static int +

          +
          +
          + The number of milliseconds after the mousedown event to initiate the +drag if we don't get a mouseup event. Default=1000 +
          +
          + + + + +
          +

          deltaX + - private static int +

          +
          +
          + the X distance between the cursor and the object being dragged +
          +
          + + + + +
          +

          deltaY + - private static int +

          +
          +
          + the Y distance between the cursor and the object being dragged +
          +
          + + + + +
          +

          dragCurrent + - private static DragDrop +

          +
          +
          + the DragDrop object that is currently being dragged +
          +
          + + + + +
          +

          dragOvers + - private static Array +

          +
          +
          + the DragDrop object(s) that are being hovered over +
          +
          + + + + +
          +

          dragThreshMet + - private static boolean +

          +
          +
          + Flag that indicates that either the drag pixel threshold or the +mousdown time threshold has been met +
          +
          + + + + +
          +

          elementCache + - private static object +

          +
          +
          + A cache of DOM elements +
          +
          + + + + +
          +

          handleIds + - private static {string: string} +

          +
          +
          + 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. +
          +
          + + + + +
          +

          ids + - private static {string: string} +

          +
          +
          + Two dimensional Array of registered DragDrop objects. The first +dimension is the DragDrop item group, the second the DragDrop +object. +
          +
          + + + + +
          +

          initialized + - private static object +

          +
          +
          + Internal flag that is set to true when drag and drop has been +intialized +
          +
          + + + + +
          +

          interactionInfo + - static object +

          +
          +
          + Provides additional information about the the current set of +interactions. Can be accessed from the event handlers. It +contains the following properties: +out: onDragOut interactions +enter: onDragEnter interactions +over: onDragOver interactions +drop: onDragDrop interactions +point: The location of the cursor +draggedRegion: The location of dragged element at the time +of the interaction +sourceRegion: The location of the source elemtn at the time +of the interaction +validDrop: boolean +
          +
          + + + + +
          +

          INTERSECT + - static final int +

          +
          +
          + In intersect mode, drag and drop interaction is defined by the +cursor position or the amount of overlap of two or more drag and +drop objects. +
          +
          + + + + +
          +

          locationCache + - private static object +

          +
          +
          + Location cache that is set for all drag drop objects when a drag is +initiated, cleared when the drag is finished. +
          +
          + + + + +
          +

          locked + - private static object +

          +
          +
          + All drag and drop can be disabled. +
          +
          + + + + +
          +

          mode + - static int +

          +
          +
          + The current drag and drop mode. Default: POINT +
          +
          + + + + +
          +

          POINT + - static final int +

          +
          +
          + In point mode, drag and drop interaction is defined by the +location of the cursor during the drag/drop +
          +
          + + + + +
          +

          preventDefault + - static boolean +

          +
          +
          + 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) +
          +
          + + + + +
          +

          startX + - private static int +

          +
          +
          + The X position of the mousedown event stored for later use when a +drag threshold is met. +
          +
          + + + + +
          +

          startY + - private static int +

          +
          +
          + The Y position of the mousedown event stored for later use when a +drag threshold is met. +
          +
          + + + + +
          +

          stopPropagation + - static boolean +

          +
          +
          + 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. +
          +
          + + + + +
          +

          STRICT_INTERSECT + - static final int +

          +
          +
          + In intersect mode, drag and drop interaction is defined only by the +overlap of two or more drag and drop objects. +
          +
          + + + + +
          +

          useCache + - static boolean +

          +
          +
          + Set useCache to false if you want to force object the lookup of each +drag and drop linked element constantly during a drag. +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + _addListeners

          +
          + + private + static + + void + _addListeners + ( + ) + + +
          + Trying to make the load order less important. Without this we get +an error if this file is loaded before the Event Utility. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _execOnAll

          +
          + + private + static + + void + _execOnAll + ( + ) + + +
          + Runs method on all drag and drop objects +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onLoad

          +
          + + private + static + + void + _onLoad + ( + ) + + +
          + Drag and drop initialization. Sets up the global event handlers +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onResize

          +
          + + private + static + + void + _onResize + ( + ) + + +
          + Reset constraints on all drag and drop objs +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onUnload

          +
          + + private + static + + void + _onUnload + ( + ) + + +
          + unload event handler +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _remove

          +
          + + private + static + + void + _remove + ( + ) + + +
          + Unregisters a drag and drop item. This is executed in +DragDrop.unreg, use that method instead of calling this directly. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + fireEvents

          +
          + + private + static + + void + fireEvents + ( + + + e + + + , + isDrop + + + ) + + +
          + Iterates over all of the DragDrop elements to find ones we are +hovering over or dropping on +
          + +
          + +
          +
          Parameters:
          +
          + e <Event> + the event +
          +
          + isDrop <boolean> + is this a drop op or a mouseover op? +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getBestMatch

          +
          + + + static + + DragDrop + getBestMatch + ( + + + dds + + + ) + + +
          + 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
          +
          + +
          + +
          +
          +

          + getClientHeight

          +
          + + + static + + int + getClientHeight + ( + ) + + +
          + Gets the client height +
          + +
          + + +
          +
          Returns: + + int +
          +
          client height in px
          +
          + +
          + Deprecated use YAHOO.util.Dom.getViewportHeight instead +
          +
          + +
          +
          +

          + getClientWidth

          +
          + + + static + + int + getClientWidth + ( + ) + + +
          + Gets the client width +
          + +
          + + +
          +
          Returns: + + int +
          +
          client width in px
          +
          + +
          + Deprecated use YAHOO.util.Dom.getViewportWidth instead +
          +
          + +
          +
          +

          + getCss

          +
          + + + static + + Object + getCss + ( + + + id + + + ) + + +
          + 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
          +
          + +
          + Deprecated use YAHOO.util.Dom instead +
          +
          + +
          +
          +

          + getDDById

          +
          + + + static + + DragDrop + getDDById + ( + + + id + + + ) + + +
          + 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
          +
          + +
          + +
          +
          +

          + getElement

          +
          + + + static + + Object + getElement + ( + + + id + + + ) + + +
          + Returns the actual DOM element +
          + +
          + +
          +
          Parameters:
          +
          + id <String> + the id of the elment to get +
          +
          + +
          +
          Returns: + + Object +
          +
          The element
          +
          + +
          + Deprecated use YAHOO.util.Dom.get instead +
          +
          + +
          +
          +

          + getElWrapper

          +
          + + private + static + + YAHOO.util.DDM.ElementWrapper + getElWrapper + ( + + + id + + + ) + + +
          + Get the wrapper for the DOM element specified +
          + +
          + +
          +
          Parameters:
          +
          + id <String> + the id of the element to get +
          +
          + +
          +
          Returns: + + YAHOO.util.DDM.ElementWrapper +
          +
          the wrapped element
          +
          + +
          + Deprecated This wrapper isn't that useful +
          +
          + +
          +
          +

          + getLocation

          +
          + + + static + + YAHOO.util.Region + getLocation + ( + + + oDD + + + ) + + +
          + 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.
          +
          + +
          + +
          +
          +

          + getPosX

          +
          + + + static + + int + getPosX + ( + + + el + + + ) + + +
          + Returns the X position of an html element +
          + +
          + +
          +
          Parameters:
          +
          + el <object> + the element for which to get the position +
          +
          + +
          +
          Returns: + + int +
          +
          the X coordinate
          +
          + +
          + Deprecated use YAHOO.util.Dom.getX instead +
          +
          + +
          +
          +

          + getPosY

          +
          + + + static + + int + getPosY + ( + + + el + + + ) + + +
          + Returns the Y position of an html element +
          + +
          + +
          +
          Parameters:
          +
          + el <object> + the element for which to get the position +
          +
          + +
          +
          Returns: + + int +
          +
          the Y coordinate
          +
          + +
          + Deprecated use YAHOO.util.Dom.getY instead +
          +
          + +
          +
          +

          + getRelated

          +
          + + + static + + DragDrop[] + getRelated + ( + + + p_oDD + + + , + bTargetsOnly + + + ) + + +
          + 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
          +
          + +
          + +
          +
          +

          + getScroll

          +
          + + private + static + + void + getScroll + ( + ) + + +
          + Returns the current scroll position +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getScrollLeft

          +
          + + + static + + int + getScrollLeft + ( + ) + + +
          + Gets the scrollLeft +
          + +
          + + +
          +
          Returns: + + int +
          +
          the document's scrollTop
          +
          + +
          + +
          +
          +

          + getScrollTop

          +
          + + + static + + int + getScrollTop + ( + ) + + +
          + Gets the scrollTop +
          + +
          + + +
          +
          Returns: + + int +
          +
          the document's scrollTop
          +
          + +
          + +
          +
          +

          + getStyle

          +
          + + + static + + string + getStyle + ( + + + el + + + , + styleProp + + + ) + + +
          + Returns the specified element style property +
          + +
          + +
          +
          Parameters:
          +
          + el <HTMLElement> + the element +
          +
          + styleProp <string> + the style property +
          +
          + +
          +
          Returns: + + string +
          +
          The value of the style property
          +
          + +
          + Deprecated use YAHOO.util.Dom.getStyle +
          +
          + +
          +
          +

          + handleMouseDown

          +
          + + private + static + + void + handleMouseDown + ( + + + e + + + , + oDD + + + ) + + +
          + Fired after a registered DragDrop object gets the mousedown event. +Sets up the events required to track the object being dragged +
          + +
          + +
          +
          Parameters:
          +
          + e <Event> + the event +
          +
          + oDD <object> + the DragDrop object being dragged +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + handleMouseMove

          +
          + + private + static + + void + handleMouseMove + ( + + + e + + + ) + + +
          + Internal function to handle the mousemove event. Will be invoked +from the context of the html element. +
          + +
          + +
          +
          Parameters:
          +
          + e <Event> + the event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + handleMouseUp

          +
          + + private + static + + void + handleMouseUp + ( + + + e + + + ) + + +
          + Internal function to handle the mouseup event. Will be invoked +from the context of the document. +
          + +
          + +
          +
          Parameters:
          +
          + e <Event> + the event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + handleWasClicked

          +
          + + + static + + void + handleWasClicked + ( + + + node + + + ) + + +
          + Recursively searches the immediate parent and all child nodes for +the handle element in order to determine wheter or not it was +clicked. +
          + +
          + +
          +
          Parameters:
          +
          + node <object> + the html element to inspect +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + init

          +
          + + private + static + + void + init + ( + ) + + +
          + Called the first time an element is registered. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + isDragDrop

          +
          + + + static + + boolean + isDragDrop + ( + + + id + + + ) + + +
          + 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
          +
          + +
          + +
          +
          +

          + isHandle

          +
          + + + static + + boolean + isHandle + ( + + + id + + + ) + + +
          + 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
          +
          + +
          + +
          +
          +

          + isLegalTarget

          +
          + + + static + + boolean + isLegalTarget + ( + + + the + + + + + ) + + +
          + 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
          +
          + +
          + +
          +
          +

          + isLocked

          +
          + + + static + + boolean + isLocked + ( + ) + + +
          + Is drag and drop locked? +
          + +
          + + +
          +
          Returns: + + boolean +
          +
          True if drag and drop is locked, false otherwise.
          +
          + +
          + +
          +
          +

          + isOverTarget

          +
          + + private + static + + boolean + isOverTarget + ( + + + pt + + + , + oTarget + + + , + intersect + + + , + pre-cached + + + ) + + +
          + Checks the cursor location to see if it over the target +
          + +
          + +
          +
          Parameters:
          +
          + pt <YAHOO.util.Point> + The point to evaluate +
          +
          + oTarget <DragDrop> + the DragDrop object we are inspecting +
          +
          + intersect <boolean> + true if we are in intersect mode +
          +
          + pre-cached <YAHOO.util.Region> + location of the dragged element +
          +
          + +
          +
          Returns: + + boolean +
          +
          true if the mouse is over the target
          +
          + +
          + +
          +
          +

          + isTypeOfDD

          +
          + + + static + + boolean + isTypeOfDD + ( + + + the + + + ) + + +
          + 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
          +
          + +
          + +
          +
          +

          + lock

          +
          + + + static + + void + lock + ( + ) + + +
          + Lock all drag and drop functionality +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + moveToEl

          +
          + + + static + + void + moveToEl + ( + + + moveEl + + + , + targetEl + + + ) + + +
          + 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 +
          +
          +
          + +
          + +
          +
          +

          + numericSort

          +
          + + + static + + void + numericSort + ( + ) + + +
          + Numeric array sort function +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + refreshCache

          +
          + + + static + + void + refreshCache + ( + + + groups + + + ) + + +
          + 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}); + +
          + +
          + +
          +
          Parameters:
          +
          + groups <Object> + an associative array of groups to refresh +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + regDragDrop

          +
          + + + static + + void + regDragDrop + ( + + + oDD + + + , + sGroup + + + ) + + +
          + 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 +
          +
          +
          + +
          + +
          +
          +

          + regHandle

          +
          + + + static + + void + regHandle + ( + + + sDDId + + + , + sHandleId + + + ) + + +
          + 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 +
          +
          +
          + +
          + +
          +
          +

          + removeDDFromGroup

          +
          + + private + static + + void + removeDDFromGroup + ( + ) + + +
          + Removes the supplied dd instance from the supplied group. Executed +by DragDrop.removeFromGroup, so don't call this function directly. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + startDrag

          +
          + + + static + + void + startDrag + ( + + + x + + + , + y + + + ) + + +
          + Fired when either the drag pixel threshol or the mousedown hold +time threshold has been met. +
          + +
          + +
          +
          Parameters:
          +
          + x <int> + the X position of the original mousedown +
          +
          + y <int> + the Y position of the original mousedown +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + stopDrag

          +
          + + private + static + + void + stopDrag + ( + + + e + + + ) + + +
          + Internal function to clean up event handlers after the drag +operation is complete +
          + +
          + +
          +
          Parameters:
          +
          + e <Event> + the event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + stopEvent

          +
          + + + static + + void + stopEvent + ( + + + e + + + ) + + +
          + 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 +
          +
          +
          + +
          + +
          +
          +

          + swapNode

          +
          + + + static + + void + swapNode + ( + + + n1 + + + , + n2 + + + ) + + +
          + Swap two nodes. In IE, we use the native method, for others we +emulate the IE behavior +
          + +
          + +
          +
          Parameters:
          +
          + n1 <object> + the first node to swap +
          +
          + n2 <object> + the other node to swap +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + unlock

          +
          + + + static + + void + unlock + ( + ) + + +
          + Unlock all drag and drop functionality +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + unregAll

          +
          + + private + static + + void + unregAll + ( + ) + + +
          + Cleans up the drag and drop events and objects. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + verifyEl

          +
          + + + static + + boolean + verifyEl + ( + + + el + + + ) + + +
          + 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
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.Easing.html b/www/extras/yui/docs/YAHOO.util.Easing.html new file mode 100644 index 000000000..ba93d273d --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.Easing.html @@ -0,0 +1,1367 @@ + + + + API: animation YAHOO.util.Easing (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          animation  2.2.2

          +

          + Yahoo! UI Library + > animation + > YAHOO.util.Easing + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.Easing + + + + + + + +

          + + + + + +
          + Singleton that determines how an animation proceeds from start to end. +
          + + + + +
          +

          Methods

          +
          +

          + backBoth

          +
          + + + + + Number + backBoth + ( + + + t + + + , + b + + + , + c + + + , + d + + + , + 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
          +
          + +
          + +
          +
          +

          + backIn

          +
          + + + + + Number + backIn + ( + + + t + + + , + b + + + , + c + + + , + d + + + , + 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
          +
          + +
          + +
          +
          +

          + backOut

          +
          + + + + + Number + backOut + ( + + + t + + + , + b + + + , + c + + + , + d + + + , + 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
          +
          + +
          + +
          +
          +

          + bounceBoth

          +
          + + + + + Number + bounceBoth + ( + + + t + + + , + b + + + , + c + + + , + 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
          +
          + +
          + +
          +
          +

          + bounceIn

          +
          + + + + + Number + bounceIn + ( + + + t + + + , + b + + + , + c + + + , + 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
          +
          + +
          + +
          +
          +

          + bounceOut

          +
          + + + + + Number + bounceOut + ( + + + t + + + , + b + + + , + c + + + , + 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
          +
          + +
          + +
          +
          +

          + easeBoth

          +
          + + + + + Number + easeBoth + ( + + + t + + + , + b + + + , + c + + + , + 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
          +
          + +
          + +
          +
          +

          + easeBothStrong

          +
          + + + + + Number + easeBothStrong + ( + + + t + + + , + b + + + , + c + + + , + 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
          +
          + +
          + +
          +
          +

          + easeIn

          +
          + + + + + Number + easeIn + ( + + + t + + + , + b + + + , + c + + + , + 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
          +
          + +
          + +
          +
          +

          + easeInStrong

          +
          + + + + + Number + easeInStrong + ( + + + t + + + , + b + + + , + c + + + , + 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
          +
          + +
          + +
          +
          +

          + easeNone

          +
          + + + + + Number + easeNone + ( + + + t + + + , + b + + + , + c + + + , + 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
          +
          + +
          + +
          +
          +

          + easeOut

          +
          + + + + + Number + easeOut + ( + + + t + + + , + b + + + , + c + + + , + 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
          +
          + +
          + +
          +
          +

          + easeOutStrong

          +
          + + + + + Number + easeOutStrong + ( + + + t + + + , + b + + + , + c + + + , + 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
          +
          + +
          + +
          +
          +

          + elasticBoth

          +
          + + + + + Number + elasticBoth + ( + + + t + + + , + b + + + , + c + + + , + d + + + , + a + + + , + 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 +
          +
          + a <Number> + Amplitude (optional) +
          +
          + p <Number> + Period (optional) +
          +
          + +
          +
          Returns: + + Number +
          +
          The computed value for the current animation frame
          +
          + +
          + +
          +
          +

          + elasticIn

          +
          + + + + + Number + elasticIn + ( + + + t + + + , + b + + + , + c + + + , + d + + + , + a + + + , + 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 +
          +
          + a <Number> + Amplitude (optional) +
          +
          + p <Number> + Period (optional) +
          +
          + +
          +
          Returns: + + Number +
          +
          The computed value for the current animation frame
          +
          + +
          + +
          +
          +

          + elasticOut

          +
          + + + + + Number + elasticOut + ( + + + t + + + , + b + + + , + c + + + , + d + + + , + a + + + , + 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 +
          +
          + a <Number> + Amplitude (optional) +
          +
          + p <Number> + Period (optional) +
          +
          + +
          +
          Returns: + + Number +
          +
          The computed value for the current animation frame
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.Element.html b/www/extras/yui/docs/YAHOO.util.Element.html new file mode 100644 index 000000000..dae64d792 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.Element.html @@ -0,0 +1,1438 @@ + + + + API: element YAHOO.util.Element (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          element  2.2.2

          +

          + Yahoo! UI Library + > element + > YAHOO.util.Element + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.Element + + + + + - uses + + YAHOO.util.AttributeProvider + + + + +

          + + +
          +
          Known Subclasses: +
          + YAHOO.widget.Tab + YAHOO.widget.Button + YAHOO.widget.TabView + YAHOO.widget.ButtonGroup +
          +
          + + + +
          + Element provides an wrapper object to simplify adding +event listeners, using dom methods, and managing attributes. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.util.Element + + ( + + + + el + + , + map + ) + +
          +
          +
          Parameters:
          +
          + el + <HTMLElement | String> + + The html element that +represents the Element. +
          +
          + map + <Object> + + A key-value map of initial config names and values +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          DOM_EVENTS + - Object +

          +
          +
          + Dom events supported by the Element instance. +
          +
          + + + + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.util.AttributeProvider:

          +
          + + + _configs + +
          +
          +
          +

          Properties inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Methods

          +
          +

          + _registerHTMLAttr

          +
          + + private + + + void + _registerHTMLAttr + ( + + + element + + + , + key + + + , + map + + + ) + + +
          + Sets the value of the property and fires beforeChange and change events. +
          + +
          + +
          +
          Parameters:
          +
          + element <YAHOO.util.Element> + The Element instance to +register the config to. +
          +
          + key <String> + The name of the config to register +
          +
          + map <Object> + A key-value map of the config's params +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + addClass

          +
          + + + + + void + addClass + ( + + + className + + + ) + + +
          + Wrapper for Dom method. +
          + +
          + +
          +
          Parameters:
          +
          + className <String> + The className to add +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + addListener

          +
          + + + + + void + addListener + ( + + + type + + + , + fn + + + , + obj + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + appendChild

          +
          + + + + + void + appendChild + ( + + + deep + + + ) + + +
          + Wrapper for HTMLElement method. +
          + +
          + +
          +
          Parameters:
          +
          + deep <Boolean> + Whether or not to do a deep clone +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + appendTo

          +
          + + + + + void + appendTo + ( + + + parentNode + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + fireQueue

          +
          + + + + + void + fireQueue + ( + ) + + +
          + Apply any queued set calls. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getElementsByClassName

          +
          + + + + + Array + getElementsByClassName + ( + + + className + + + , + 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
          +
          + +
          + +
          +
          +

          + getElementsByTagName

          +
          + + + + + void + getElementsByTagName + ( + + + tag + + + ) + + +
          + Wrapper for HTMLElement method. +
          + +
          + +
          +
          Parameters:
          +
          + tag <String> + The tagName to collect +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getStyle

          +
          + + + + + String + getStyle + ( + + + property + + + ) + + +
          + Wrapper for Dom method. +
          + +
          + +
          +
          Parameters:
          +
          + property <String> + The style property to retrieve +
          +
          + +
          +
          Returns: + + String +
          +
          The current value of the property
          +
          + +
          + +
          +
          +

          + hasChildNodes

          +
          + + + + + Boolean + hasChildNodes + ( + ) + + +
          + Wrapper for HTMLElement method. +
          + +
          + + +
          +
          Returns: + + Boolean +
          +
          Whether or not the element has childNodes
          +
          + +
          + +
          +
          +

          + hasClass

          +
          + + + + + Boolean + hasClass + ( + + + className + + + ) + + +
          + Wrapper for Dom method. +
          + +
          + +
          +
          Parameters:
          +
          + className <String> + The className to add +
          +
          + +
          +
          Returns: + + Boolean +
          +
          Whether or not the element has the class name
          +
          + +
          + +
          +
          +

          + initAttributes

          +
          + + + + + void + initAttributes + ( + + + map + + + ) + + +
          + Registers Element specific attributes. +
          + +
          + +
          +
          Parameters:
          +
          + map <Object> + A key-value map of initial attribute configs +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + insertBefore

          +
          + + + + + void + insertBefore + ( + + + element + + + , + before + + + ) + + +
          + Wrapper for HTMLElement method. +
          + +
          + +
          +
          Parameters:
          +
          + element <HTMLElement> + The HTMLElement to insert +
          +
          + before <HTMLElement> + The HTMLElement to insert +the element before. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + on

          +
          + + + + + void + on + ( + + + type + + + , + fn + + + , + obj + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + removeChild

          +
          + + + + + void + removeChild + ( + + + child + + + ) + + +
          + Wrapper for HTMLElement method. +
          + +
          + +
          +
          Parameters:
          +
          + child <HTMLElement> + The HTMLElement to remove +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + removeClass

          +
          + + + + + void + removeClass + ( + + + className + + + ) + + +
          + Wrapper for Dom method. +
          + +
          + +
          +
          Parameters:
          +
          + className <String> + The className to remove +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + removeListener

          +
          + + + + + void + removeListener + ( + + + type + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + replaceChild

          +
          + + + + + void + replaceChild + ( + + + newNode + + + , + oldNode + + + ) + + +
          + Wrapper for HTMLElement method. +
          + +
          + +
          +
          Parameters:
          +
          + newNode <HTMLElement> + The HTMLElement to insert +
          +
          + oldNode <HTMLElement> + The HTMLElement to replace +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + replaceClass

          +
          + + + + + void + replaceClass + ( + + + oldClassName + + + , + newClassName + + + ) + + +
          + Wrapper for Dom method. +
          + +
          + +
          +
          Parameters:
          +
          + oldClassName <String> + The className to replace +
          +
          + newClassName <String> + The className to add +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setStyle

          +
          + + + + + void + setStyle + ( + + + property + + + , + 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 +
          +
          +
          + +
          + +
          +
          +
          +
          + + +
          +

          Methods inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Events

          +
          +

          + available

          +
          + + + + + 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);

          +
          + +
          + + + + +
          + +
          +
          +

          + contentReady

          +
          + + + + + 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);

          +
          + +
          + + + + +
          + +
          +
          +
          +
          + + + +
          +

          Configuration Attributes

          +
          +

          element + - HTMLElement +

          +
          +
          + The HTMLElement the Element instance refers to. +
          +
          + + + +
          + +
          +
          + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.Event.html b/www/extras/yui/docs/YAHOO.util.Event.html new file mode 100644 index 000000000..ca7b41fe8 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.Event.html @@ -0,0 +1,2529 @@ + + + + API: event YAHOO.util.Event (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Event Utility  2.2.2

          +

          + Yahoo! UI Library + > event + > YAHOO.util.Event + +

          +
          + +
          +
          +
          + + +

          + + + static + + Class 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. +
          + + +
          +

          Properties

          +
          +

          _interval + - private object +

          +
          +
          + poll handle +
          +
          + + + + +
          +

          ADJ_SCOPE + - static final int +

          +
          +
          + Adjusted scope, either the element we are registering the event +on or the custom object passed in by the listener, int constant +
          +
          + + + + +
          +

          counter + - private static object +

          +
          +
          + Counter for auto id generation +
          +
          + + + + +
          +

          DOMReady + - private static boolean +

          +
          +
          + True when the document is initially usable +
          +
          + + + + +
          +

          EL + - static final int +

          +
          +
          + Element to bind, int constant +
          +
          + + + + +
          +

          elCache +DOM element cache + - private static object +

          +
          +
          + +
          +
          + + + +
          + Deprecated: Elements are not cached any longer +
          + +
          +

          FN + - static final int +

          +
          +
          + Function to execute, int constant +
          +
          + + + + +
          +

          isIE + - private static object +

          +
          +
          + 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. +
          +
          + + + + +
          +

          isSafari + - private static object +

          +
          +
          + Safari detection is necessary to work around the preventDefault +bug that makes it so you can't cancel a href click from the +handler. Since this function has been used outside of this +utility, it was changed to detect all KHTML browser to be more +friendly towards the non-Safari browsers that share the engine. +Internally, the preventDefault bug detection now uses the +webkit property. +
          +
          + + + +
          + Deprecated:   +
          + +
          +

          lastError + - Error +

          +
          +
          + addListener/removeListener can throw errors in unexpected scenarios. +These errors are suppressed, the method returns false, and this property +is set +
          +
          + + + + +
          +

          legacyEvents + - private static object +

          +
          +
          + Cache of DOM0 event handlers to work around issues with DOM2 events +in Safari +
          +
          + + + + +
          +

          legacyHandlers + - private static object +

          +
          +
          + Listener stack for DOM0 events +
          +
          + + + + +
          +

          legacyMap + - private static object +

          +
          +
          + Lookup table for legacy events +
          +
          + + + + +
          +

          listeners + - private static array +

          +
          +
          + Cache of wrapped listeners +
          +
          + + + + +
          +

          loadComplete + - private static boolean +

          +
          +
          + True after the onload event has fired +
          +
          + + + + +
          +

          OBJ + - static final int +

          +
          +
          + Object passed in by the user that will be returned as a +parameter to the callback, int constant +
          +
          + + + + +
          +

          onAvailStack + - private static object +

          +
          +
          + onAvailable listeners +
          +
          + + + + +
          +

          POLL_INTERVAL + - static final int +

          +
          +
          + The poll interval in milliseconds +
          +
          + + + + +
          +

          POLL_RETRYS + - static final int +

          +
          +
          + 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). +
          +
          + + + + +
          +

          retryCount + - private static object +

          +
          +
          + The number of times to poll after window.onload. This number is +increased if additional late-bound handlers are requested after +the page load. +
          +
          + + + + +
          +

          TYPE + - static final int +

          +
          +
          + Type of event, int constant +
          +
          + + + + +
          +

          unloadListeners + - private static array +

          +
          +
          + User-defined unload function that will be fired before all events +are detached +
          +
          + + + + +
          +

          webkit + - static string +

          +
          +
          + If WebKit is detected, we keep track of the version number of +the engine. The webkit property will contain a string with +the webkit version number if webkit is detected, null +otherwise. +Safari 1.3.2 (312.6): 312.8.1 <-- currently the latest +available on Mac OSX 10.3. +Safari 2.0.2: 416 <-- hasOwnProperty introduced +Safari 2.0.4: 418 <-- preventDefault fixed (I believe) +Safari 2.0.4 (419.3): 418.9.1 <-- current release +http://developer.apple.com/internet/safari/uamatrix.html +
          +
          + + + + +
          +

          WFN + - static final int +

          +
          +
          + Function wrapped for scope correction and cleanup, int constant +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + _getCacheIndex

          +
          + + private + static + + void + _getCacheIndex + ( + ) + + +
          + Locating the saved event handler data by function ref +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _getScroll

          +
          + + private + static + + void + _getScroll + ( + ) + + +
          + Returns the scrollTop and scrollLeft. Used to calculate the +pageX and pageY in Internet Explorer +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _getScrollLeft

          +
          + + private + static + + void + _getScrollLeft + ( + ) + + +
          + Returns scrollLeft +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _getScrollTop

          +
          + + private + static + + void + _getScrollTop + ( + ) + + +
          + Returns scrollTop +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _isValidCollection

          +
          + + private + static + + boolean + _isValidCollection + ( + + + o + + + ) + + +
          + 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. +
          + +
          + +
          +
          Parameters:
          +
          + o <object> + the object to test +
          +
          + +
          +
          Returns: + + boolean +
          +
          true if the object is array-like and populated
          +
          + +
          + +
          +
          +

          + _load

          +
          + + private + static + + void + _load + ( + ) + + +
          + hook up any deferred listeners +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _ready

          +
          + + private + static + + void + _ready + ( + ) + + +
          + Fires the DOMReady event listeners the first time the document is +usable. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _simpleAdd

          +
          + + private + static + + void + _simpleAdd + ( + + + el + + + , + sType + + + , + fn + + + , + capture + + + ) + + +
          + Adds a DOM event directly without the caching, cleanup, scope adj, etc +
          + +
          + +
          +
          Parameters:
          +
          + el <HTMLElement> + the element to bind the handler to +
          +
          + sType <string> + the type of event handler +
          +
          + fn <function> + the callback to invoke +
          +
          + capture <boolen> + capture or bubble phase +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _simpleRemove

          +
          + + private + static + + void + _simpleRemove + ( + + + el + + + , + sType + + + , + fn + + + , + capture + + + ) + + +
          + Basic remove listener +
          + +
          + +
          +
          Parameters:
          +
          + el <HTMLElement> + the element to bind the handler to +
          +
          + sType <string> + the type of event handler +
          +
          + fn <function> + the callback to invoke +
          +
          + capture <boolen> + capture or bubble phase +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _tryPreloadAttach

          +
          + + private + static + + void + _tryPreloadAttach + ( + ) + + +
          + Polling function that runs before the onload event fires, +attempting to attach to DOM Nodes as soon as they are +available +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _unload

          +
          + + private + static + + void + _unload + ( + ) + + +
          + Removes all listeners registered by pe.event. Called +automatically during the unload event. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + addListener

          +
          + + + static + + boolean + addListener + ( + + + el + + + , + sType + + + , + fn + + + , + obj + + + , + override + + + ) + + +
          + 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 listener attached, +or if the operation throws an exception.
          +
          + +
          + +
          +
          +

          + clearCache

          +
          + + private + static + + void + clearCache + ( + ) + + +
          + Clears the element cache +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + Deprecated Elements are not cached any longer +
          +
          + +
          +
          +

          + fireLegacyEvent

          +
          + + private + static + + void + fireLegacyEvent + ( + ) + + +
          + When using legacy events, the handler is routed to this object +so we can fire our custom listener stack. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + generateId

          +
          + + + static + + string + generateId + ( + + + el + + + ) + + +
          + Generates an unique ID for the element if it does not already +have one. +
          + +
          + +
          +
          Parameters:
          +
          + el <object> + the element to create the id for +
          +
          + +
          +
          Returns: + + string +
          +
          the resulting id of the element
          +
          + +
          + +
          +
          +

          + getCharCode

          +
          + + + static + + int + getCharCode + ( + + + ev + + + ) + + +
          + Returns the charcode for an event +
          + +
          + +
          +
          Parameters:
          +
          + ev <Event> + the event +
          +
          + +
          +
          Returns: + + int +
          +
          the event's charCode
          +
          + +
          + +
          +
          +

          + getEl

          +
          + + private + static + + void + getEl + ( + ) + + +
          + We cache elements bound by id because when the unload event +fires, we can no longer use document.getElementById +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + Deprecated Elements are not cached any longer +
          +
          + +
          +
          +

          + getEvent

          +
          + + + static + + Event + getEvent + ( + + + e + + + ) + + +
          + 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
          +
          + +
          + +
          +
          +

          + getLegacyIndex

          +
          + + private + static + + void + getLegacyIndex + ( + ) + + +
          + Returns the legacy event index that matches the supplied +signature +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getListeners

          +
          + + + static + + Object + getListeners + ( + + + el + + + , + sType + + + ) + + +
          + Returns all listeners attached to the given element via addListener. +Optionally, you can specify a specific type of event to return. +
          + +
          + +
          +
          Parameters:
          +
          + el <HTMLElement> + the element to inspect +
          +
          + sType <string> + 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
          +
          + +
          + +
          +
          +

          + getPageX

          +
          + + + static + + int + getPageX + ( + + + ev + + + ) + + +
          + Returns the event's pageX +
          + +
          + +
          +
          Parameters:
          +
          + ev <Event> + the event +
          +
          + +
          +
          Returns: + + int +
          +
          the event's pageX
          +
          + +
          + +
          +
          +

          + getPageY

          +
          + + + static + + int + getPageY + ( + + + ev + + + ) + + +
          + Returns the event's pageY +
          + +
          + +
          +
          Parameters:
          +
          + ev <Event> + the event +
          +
          + +
          +
          Returns: + + int +
          +
          the event's pageY
          +
          + +
          + +
          +
          +

          + getRelatedTarget

          +
          + + + static + + HTMLElement + getRelatedTarget + ( + + + ev + + + ) + + +
          + Returns the event's related target +
          + +
          + +
          +
          Parameters:
          +
          + ev <Event> + the event +
          +
          + +
          +
          Returns: + + HTMLElement +
          +
          the event's relatedTarget
          +
          + +
          + +
          +
          +

          + getTarget

          +
          + + + static + + HTMLElement + getTarget + ( + + + ev + + + , + resolveTextNode + + + ) + + +
          + 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. @deprecated, the text node is +now resolved automatically +
          +
          + +
          +
          Returns: + + HTMLElement +
          +
          the event's target
          +
          + +
          + +
          +
          +

          + getTime

          +
          + + + static + + Date + getTime + ( + + + ev + + + ) + + +
          + 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
          +
          + +
          + +
          +
          +

          + getXY

          +
          + + + static + + [x, y] + getXY + ( + + + ev + + + ) + + +
          + Returns the pageX and pageY properties as an indexed array. +
          + +
          + +
          +
          Parameters:
          +
          + ev <Event> + the event +
          +
          + +
          +
          Returns: + + [x, y] +
          +
          the pageX and pageY properties of the event
          +
          + +
          + +
          +
          +

          + on

          +
          + + + static + + void + on + ( + ) + + +
          + YAHOO.util.Event.on is an alias for addListener +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onAvailable

          +
          + + + static + + void + onAvailable + ( + + + p_id + + + , + p_fn + + + , + p_obj + + + , + p_override + + + ) + + +
          + 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 +
          +
          +
          + +
          + +
          +
          +

          + onContentReady

          +
          + + + static + + void + onContentReady + ( + + + p_id + + + , + p_fn + + + , + p_obj + + + , + p_override + + + ) + + +
          + 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 +
          +
          +
          + +
          + +
          +
          +

          + onDOMReady

          +
          + + + static + + void + onDOMReady + ( + + + p_fn + + + , + p_obj + + + , + p_scope + + + ) + + +
          + Executes the supplied callback when the DOM is first usable. +
          + +
          + +
          +
          Parameters:
          +
          + 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_scope <boolean> + If set to true, p_fn will execute +in the scope of p_obj, if set to an object it +will execute in the scope of that object +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + preventDefault

          +
          + + + static + + void + preventDefault + ( + + + ev + + + ) + + +
          + Prevents the default behavior of the event +
          + +
          + +
          +
          Parameters:
          +
          + ev <Event> + the event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + purgeElement

          +
          + + + static + + void + purgeElement + ( + + + el + + + , + recurse + + + , + sType + + + ) + + +
          + 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 +
          +
          +
          + +
          + +
          +
          +

          + regCE

          +
          + + private + + + void + regCE + ( + ) + + +
          + Used by old versions of CustomEvent, restored for backwards +compatibility +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + removeListener

          +
          + + + static + + boolean + removeListener + ( + + + el + + + , + sType + + + , + fn + + + ) + + +
          + 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.
          +
          + +
          + +
          +
          +

          + resolveTextNode

          +
          + + + static + + HTMLElement + resolveTextNode + ( + + + node + + + ) + + +
          + 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
          +
          + +
          + +
          +
          +

          + startInterval

          +
          + + private + static + + void + startInterval + ( + ) + + +
          + +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + stopEvent

          +
          + + + static + + void + stopEvent + ( + + + ev + + + ) + + +
          + Convenience method for stopPropagation + preventDefault +
          + +
          + +
          +
          Parameters:
          +
          + ev <Event> + the event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + stopPropagation

          +
          + + + static + + void + stopPropagation + ( + + + ev + + + ) + + +
          + Stops event propagation +
          + +
          + +
          +
          Parameters:
          +
          + ev <Event> + the event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + useLegacyEvent

          +
          + + private + static + + void + useLegacyEvent + ( + ) + + +
          + Logic that determines when we should automatically use legacy +events instead of DOM2 events. Currently this is limited to old +Safari browsers with a broken preventDefault +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + + +
          +

          Events

          +
          +

          + DOMReadyEvent

          +
          + + + + + DOMReadyEvent + + ( + ) + + + +
          + Custom event the fires when the dom is initially usable +
          + +
          + + + + +
          + +
          +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.EventProvider.html b/www/extras/yui/docs/YAHOO.util.EventProvider.html new file mode 100644 index 000000000..fafa562a3 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.EventProvider.html @@ -0,0 +1,578 @@ + + + + API: event YAHOO.util.EventProvider (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Event Utility  2.2.2

          +

          + Yahoo! UI Library + > event + > YAHOO.util.EventProvider + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.EventProvider + + + + + + + +

          + + + + + +
          + 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. +
          + + +
          +

          Properties

          +
          +

          __yui_events + - private Object[] +

          +
          +
          + Private storage of custom events +
          +
          + + + + +
          +

          __yui_subscribers + - private Object[] +

          +
          +
          + Private storage of custom event subscribers +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + createEvent

          +
          + + + + + CustomEvent + createEvent + ( + + + p_type + + + , + p_config + + + ) + + +
          + 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:
          +
          + p_type <string> + the type, or name of the event +
          +
          + p_config <object> + 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
          +
          + +
          + +
          +
          +

          + fireEvent

          +
          + + + + + boolean + fireEvent + ( + + + p_type + + + , + arguments + + + ) + + +
          + 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:
          +
          + p_type <string> + the type, or name of the event +
          +
          + arguments <Object*> + 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.
          +
          + +
          + +
          +
          +

          + hasEvent

          +
          + + + + + void + hasEvent + ( + + + type + + + ) + + +
          + Returns true if the custom event of the provided type has been created +with createEvent. +
          + +
          + +
          +
          Parameters:
          +
          + type <string> + the type, or name of the event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + subscribe

          +
          + + + + + void + subscribe + ( + + + p_type + + + , + p_fn + + + , + p_obj + + + + + , + p_override + + + ) + + +
          + Subscribe to a CustomEvent by event type +
          + +
          + +
          +
          Parameters:
          +
          + p_type <string> + the type, or name of the event +
          +
          + p_fn <function> + the function to exectute when the event fires +
          +
          + p_obj <object> + +
          +
          + p_obj <Object> + An object to be passed along when the event +fires +
          +
          + p_override <boolean> + If true, the obj passed in becomes the +execution scope of the listener +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + unsubscribe

          +
          + + + + + boolean + unsubscribe + ( + + + p_type + + + , + p_fn + + + , + p_obj + + + ) + + +
          + Unsubscribes one or more listeners the from the specified event +
          + +
          + +
          +
          Parameters:
          +
          + p_type <string> + The type, or name of the event +
          +
          + p_fn <Function> + The subscribed function to unsubscribe, if not +supplied, all subscribers will be removed. +
          +
          + p_obj <Object> + The custom object passed to subscribe. This is +optional, but if supplied will be used to +disambiguate multiple listeners that are the same +(e.g., you subscribe many object using a function +that lives on the prototype) +
          +
          + +
          +
          Returns: + + boolean +
          +
          true if the subscriber was found and detached.
          +
          + +
          + +
          +
          +

          + unsubscribeAll

          +
          + + + + + void + unsubscribeAll + ( + + + p_type + + + ) + + +
          + Removes all listeners from the specified event +
          + +
          + +
          +
          Parameters:
          +
          + p_type <string> + The type, or name of the event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.History.html b/www/extras/yui/docs/YAHOO.util.History.html new file mode 100644 index 000000000..baf448de8 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.History.html @@ -0,0 +1,978 @@ + + + + API: history YAHOO.util.History (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Browser History Manager  2.2.2

          +

          + Yahoo! UI Library + > history + > YAHOO.util.History + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.History + + + + + + + +

          + + + + + +
          + The History class provides the ability to use the back/forward navigation +buttons in a DHTML application. It also allows a DHTML application to +be bookmarked in a specific state. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.util.History + + ( + ) + +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _bhmReady + - private boolean +

          +
          +
          + Flag used to tell whether the Browser History Manager is ready. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          _browser + - private string +

          +
          +
          + String identifying which browser we are in. +Different code is run depending on which browser you are using. +
          +
          + + +
          + Default Value: "unknown" +
          + + +
          +

          _fqstates + - private array +

          +
          +
          + List of fully qualified states. This is used only by Safari. +
          +
          + + +
          + Default Value: [] +
          + + +
          +

          _iframe + - private HTMLIFrameElement +

          +
          +
          + Our hidden IFrame used to store the browsing history. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          _initialized + - private boolean +

          +
          +
          + Flag used to tell whether YAHOO.util.History.initialize has been called. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          _modules + - private array +

          +
          +
          + List of registered modules. +
          +
          + + +
          + Default Value: [] +
          + + +
          +

          _storageField + - private HTMLInputElement|HTMLTextAreaElement +

          +
          +
          + INPUT field (with type="hidden" or type="text") or TEXTAREA. +This field keeps the value of the initial state, current state +the list of all states across pages within a single browser session. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          _storageFieldReady + - private boolean +

          +
          +
          + Flag used to tell whether the storage field is ready to be used. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          _ua + - private string +

          +
          +
          + User agent string used for browser detection. +
          +
          + + +
          + Default Value: null +
          + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + _checkIframeLoaded

          +
          + + private + + + void + _checkIframeLoaded + ( + ) + + +
          + Periodically checks whether our internal IFrame is ready to be used. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _getHash

          +
          + + private + + + string + _getHash + ( + ) + + +
          + location.hash is a bit buggy on Opera. I have seen instances where +navigating the history using the back/forward buttons, and hence +changing the URL, would not change location.hash. That's ok, the +implementation of an equivalent is trivial. +
          + +
          + + +
          +
          Returns: + + string +
          +
          The hash portion of the document's location
          +
          + +
          + +
          +
          +

          + _handleFQStateChange

          +
          + + private + + + void + _handleFQStateChange + ( + + + fqstate + + + ) + + +
          + Sets the new currentState attribute of all modules depending on the new +fully qualified state. Also notifies the modules which current state has +changed. +
          + +
          + +
          +
          Parameters:
          +
          + fqstate <string> + Fully qualified state +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _initialize

          +
          + + private + + + void + _initialize + ( + ) + + +
          + Finish up the initialization of the Browser History Manager. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _storeStates

          +
          + + private + + + void + _storeStates + ( + ) + + +
          + Stores all the registered modules' initial state and current state. +On Safari, we also store all the fully qualified states visited by +the application within a single browser session. The storage takes +place in the form field specified during initialization. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _trim

          +
          + + private + + + string + _trim + ( + + + str + + + ) + + +
          + Trims a string. +
          + +
          + +
          +
          Parameters:
          +
          + str <string> + The string to be trimmed. +
          +
          + +
          +
          Returns: + + string +
          +
          The trimmed string
          +
          + +
          + +
          +
          +

          + getBookmarkedState

          +
          + + + + + string + getBookmarkedState + ( + + + module + + + ) + + +
          + Returns the state of a module according to the URL fragment +identifier. This method is useful to initialize your modules +if your application was bookmarked from a particular state. +
          + +
          + +
          +
          Parameters:
          +
          + module <string> + Non-empty string representing your module. +
          +
          + +
          +
          Returns: + + string +
          +
          The bookmarked state of the specified module.
          +
          + +
          + +
          +
          +

          + getCurrentState

          +
          + + + + + string + getCurrentState + ( + + + module + + + ) + + +
          + Returns the current state of the specified module. +
          + +
          + +
          +
          Parameters:
          +
          + module <string> + Non-empty string representing your module. +
          +
          + +
          +
          Returns: + + string +
          +
          The current state of the specified module.
          +
          + +
          + +
          +
          +

          + getQueryStringParameter

          +
          + + + + + string + getQueryStringParameter + ( + + + paramName + + + , + queryString + + + ) + + +
          + Returns the value of the specified query string parameter. +This method is not used internally by the Browser History Manager. +However, it is provided here as a helper since many applications +using the Browser History Manager will want to read the value of +url parameters to initialize themselves. +
          + +
          + +
          +
          Parameters:
          +
          + paramName <string> + Name of the parameter we want to look up. +
          +
          + queryString <string> + Optional URL to look at. If not specified, +this method uses the URL in the address bar. +
          +
          + +
          +
          Returns: + + string +
          +
          The value of the specified parameter, or null.
          +
          + +
          + +
          +
          +

          + initialize

          +
          + + + + + void + initialize + ( + + + iframeTarget + + + ) + + +
          + Initializes the Browser History Manager. Call this method +from a script block located right after the opening body tag. +
          + +
          + +
          +
          Parameters:
          +
          + iframeTarget <string> + Optional - Path to an existing +HTML document accessible from the same domain. If not +specified, defaults to "blank.html". This is only useful +if you use https. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + navigate

          +
          + + + + + boolean + navigate + ( + + + module + + + , + state + + + ) + + +
          + Call this method when you want to store a new entry in the browser's history. +
          + +
          + +
          +
          Parameters:
          +
          + module <string> + Non-empty string representing your module. +
          +
          + state <string> + String representing the new state of the specified module. +
          +
          + +
          +
          Returns: + + boolean +
          +
          Indicates whether the new state was successfully added to the history.
          +
          + +
          + +
          +
          +

          + register

          +
          + + + + + void + register + ( + + + module + + + , + initialState + + + , + onStateChange + + + , + obj + + + , + override + + + ) + + +
          + Registers a new module. +
          + +
          + +
          +
          Parameters:
          +
          + module <string> + Non-empty string uniquely identifying the +module you wish to register. +
          +
          + initialState <string> + The initial state of the specified +module corresponding to its earliest history entry. +
          +
          + onStateChange <function> + Callback called when the +state of the specified module has changed. +
          +
          + 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: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + + +
          +

          Events

          +
          +

          + onLoadEvent

          +
          + + + + + onLoadEvent + + ( + ) + + + +
          + Fired when the Browser History Manager is ready. +
          + +
          + + + + +
          + +
          +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.Motion.html b/www/extras/yui/docs/YAHOO.util.Motion.html new file mode 100644 index 000000000..e3606083d --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.Motion.html @@ -0,0 +1,263 @@ + + + + API: animation YAHOO.util.Motion (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          animation  2.2.2

          +

          + Yahoo! UI Library + > animation + > YAHOO.util.Motion + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.Motion + + - extends YAHOO.util.Anim + + + + + + +

          + + + + + +
          + 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);

          +
          + +
          +

          Constructor

          +
          +
          + YAHOO.util.Motion + + ( + + + + el + + , + attributes + + , + duration + + , + 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) +
          +
          + + +
          +
          +
          +
          + + +
          +

          Properties inherited from YAHOO.util.Anim:

          + +
          + + + + + + +
          +

          Events inherited from YAHOO.util.Anim:

          +
          + + + onComplete, + onStart, + onTween + +
          +
          + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.Point.html b/www/extras/yui/docs/YAHOO.util.Point.html new file mode 100644 index 000000000..0a2728269 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.Point.html @@ -0,0 +1,250 @@ + + + + API: dom YAHOO.util.Point (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          dom  2.2.2

          +

          + Yahoo! UI Library + > dom + > YAHOO.util.Point + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.Point + + - extends YAHOO.util.Region + + + + + + +

          + + + + + +
          + A point is a region that is special in that it represents a single point on +the grid. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.util.Point + + ( + + + + x + + , + y + ) + +
          +
          +
          Parameters:
          +
          + x + <Int> + + The X position of the point +
          +
          + y + <Int> + + The Y position of the point +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          x + - Int +

          +
          +
          + The X position of the point, which is also the right, left and index zero (for Dom.getXY symmetry) +
          +
          + + + + +
          +

          y + - Int +

          +
          +
          + The Y position of the point, which is also the top, bottom and index one (for Dom.getXY symmetry) +
          +
          + + + + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.util.Region:

          +
          + + + 0, + 1, + bottom, + left, + right, + top + +
          +
          + + +
          +

          Methods inherited from YAHOO.util.Region:

          +
          + + + contains, + getArea, + intersect, + toString, + union + +
          +
          + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.Region.html b/www/extras/yui/docs/YAHOO.util.Region.html new file mode 100644 index 000000000..e294951b7 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.Region.html @@ -0,0 +1,581 @@ + + + + API: dom YAHOO.util.Region (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          dom  2.2.2

          +

          + Yahoo! UI Library + > dom + > YAHOO.util.Region + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.Region + + + + + + + +

          + + +
          +
          Known Subclasses: +
          + YAHOO.util.Point +
          +
          + + + +
          + 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. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.util.Region + + ( + + + + t + + , + r + + , + b + + , + l + ) + +
          +
          +
          Parameters:
          +
          + t + <Int> + + the top extent +
          +
          + r + <Int> + + the right extent +
          +
          + b + <Int> + + the bottom extent +
          +
          + l + <Int> + + the left extent +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          0 + - Int +

          +
          +
          + The region's left extent as index, for symmetry with set/getXY +
          +
          + + + + +
          +

          1 + - Int +

          +
          +
          + The region's top extent as index, for symmetry with set/getXY +
          +
          + + + + +
          +

          bottom + - Int +

          +
          +
          + The region's bottom extent +
          +
          + + + + +
          +

          left + - Int +

          +
          +
          + The region's left extent +
          +
          + + + + +
          +

          right + - int +

          +
          +
          + The region's right extent +
          +
          + + + + +
          +

          top + - Int +

          +
          +
          + The region's top extent +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + contains

          +
          + + + + + Boolean + contains + ( + + + 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
          +
          + +
          + +
          +
          +

          + getArea

          +
          + + + + + Int + getArea + ( + ) + + +
          + Returns the area of the region +
          + +
          + + +
          +
          Returns: + + Int +
          +
          the region's area
          +
          + +
          + +
          +
          +

          + getRegion

          +
          + + + static + + Region + getRegion + ( + + + el + + + ) + + +
          + Returns a region that is occupied by the DOM element +
          + +
          + +
          +
          Parameters:
          +
          + el <HTMLElement> + The element +
          +
          + +
          +
          Returns: + + Region +
          +
          The region that the element occupies
          +
          + +
          + +
          +
          +

          + intersect

          +
          + + + + + Region + intersect + ( + + + 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
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + void + toString + ( + ) + + +
          + toString +
          + +
          + + +
          +
          Returns: + + void +
          +
          string the region properties
          +
          + +
          + +
          +
          +

          + union

          +
          + + + + + Region + union + ( + + + 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
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.Scroll.html b/www/extras/yui/docs/YAHOO.util.Scroll.html new file mode 100644 index 000000000..9ce99fbb2 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.Scroll.html @@ -0,0 +1,263 @@ + + + + API: animation YAHOO.util.Scroll (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          animation  2.2.2

          +

          + Yahoo! UI Library + > animation + > YAHOO.util.Scroll + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.Scroll + + - extends YAHOO.util.Anim + + + + + + +

          + + + + + +
          + 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);

          +
          + +
          +

          Constructor

          +
          +
          + YAHOO.util.Scroll + + ( + + + + el + + , + attributes + + , + duration + + , + method + ) + +
          +
          +
          Parameters:
          +
          + el + <String or 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) +
          +
          + + +
          +
          +
          +
          + + +
          +

          Properties inherited from YAHOO.util.Anim:

          + +
          + + + + + + +
          +

          Events inherited from YAHOO.util.Anim:

          +
          + + + onComplete, + onStart, + onTween + +
          +
          + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.util.Subscriber.html b/www/extras/yui/docs/YAHOO.util.Subscriber.html new file mode 100644 index 000000000..2bdaa80e9 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.util.Subscriber.html @@ -0,0 +1,406 @@ + + + + API: event YAHOO.util.Subscriber (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Event Utility  2.2.2

          +

          + Yahoo! UI Library + > event + > YAHOO.util.Subscriber + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.util.Subscriber + + + + + + + +

          + + + + + +
          + Stores the subscriber information to be used when the event fires. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.util.Subscriber + + ( + + + + fn + + , + obj + + , + override + ) + +
          +
          +
          Parameters:
          +
          + fn + <Function> + + The function to execute +
          +
          + obj + <Object> + + An object to be passed along when the event fires +
          +
          + override + <boolean> + + If true, the obj passed in becomes the execution +scope of the listener +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          fn + - function +

          +
          +
          + The callback that will be execute when the event fires +
          +
          + + + + +
          +

          obj + - object +

          +
          +
          + An optional custom object that will passed to the callback when +the event fires +
          +
          + + + + +
          +

          override + - boolean|object +

          +
          +
          + 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. +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + contains

          +
          + + + + + boolean + contains + ( + + + fn + + + , + 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.
          +
          + +
          + +
          +
          +

          + getScope

          +
          + + + + + void + getScope + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + void + toString + ( + ) + + +
          + +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.AutoComplete.html b/www/extras/yui/docs/YAHOO.widget.AutoComplete.html new file mode 100644 index 000000000..cdc2d77b8 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.AutoComplete.html @@ -0,0 +1,3938 @@ + + + + API: autocomplete YAHOO.widget.AutoComplete (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          AutoComplete Widget  2.2.2

          +

          + Yahoo! UI Library + > autocomplete + > YAHOO.widget.AutoComplete + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.AutoComplete + + + + + + + +

          + + + + + +
          + 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
          • +
          +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.AutoComplete + + ( + + + + elInput + + + , + elContainer + + + , + oDataSource + + , + oConfigs + ) + +
          +
          +
          Parameters:
          +
          + elInput + <HTMLElement> + + DOM element reference of an input field. +
          +
          + elInput + <String> + + String ID of an input field. +
          +
          + elContainer + <HTMLElement> + + DOM element reference of an existing DIV. +
          +
          + elContainer + <String> + + String ID of an existing DIV. +
          +
          + oDataSource + <YAHOO.widget.DataSource> + + DataSource instance. +
          +
          + oConfigs + <Object> + + (optional) Object literal of configuration params. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _aListItems + - private HTMLElement[] +

          +
          +
          + Array of <li> elements references that contain query results within the +results container. +
          +
          + + + + +
          +

          _bContainerOpen + - private Boolean +

          +
          +
          + Whether or not the results container is currently open. +
          +
          + + + + +
          +

          _bFocused + - private Boolean +

          +
          +
          + 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. +
          +
          + + + + +
          +

          _bItemSelected + - private Boolean +

          +
          +
          + 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. +
          +
          + + + + +
          +

          _bOverContainer + - private Boolean +

          +
          +
          + 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. +
          +
          + + + + +
          +

          _iFrameSrc + - private String +

          +
          +
          + Src to iFrame used when useIFrame = true. Supports implementations over SSL +as well. +
          +
          + + + + +
          +

          _maxResultsDisplayed + - private Number +

          +
          +
          + Internal count of <li> elements displayed and hidden in results container. +
          +
          + + + + +
          +

          _nDelayID + - private Number +

          +
          +
          + Delay timeout ID. +
          +
          + + + + +
          +

          _nDisplayedItems + - private Number +

          +
          +
          + Number of <li> elements currently displayed in results container. +
          +
          + + + + +
          +

          _nIndex + - private Number +

          +
          +
          + Internal class variable to index multiple AutoComplete instances. +
          +
          + + +
          + Default Value: 0 +
          + + +
          +

          _nKeyCode + - private Number +

          +
          +
          + Key code of the last key pressed in textbox. +
          +
          + + + + +
          +

          _oAnim + - private Boolean +

          +
          +
          + Animation instance for container expand/collapse. +
          +
          + + + + +
          +

          _oContainer + - private HTMLElement +

          +
          +
          + Container DOM element. +
          +
          + + + + +
          +

          _oCurItem + - private HTMLElement +

          +
          +
          + Pointer to the currently highlighted <li> element in the container. +
          +
          + + + + +
          +

          _oTextbox + - private HTMLElement +

          +
          +
          + Text input field DOM element. +
          +
          + + + + +
          +

          _queryInterval + - private Object +

          +
          +
          + For users typing via certain IMEs, queries must be triggered by intervals, +since key events yet supported across all browsers for all IMEs. +
          +
          + + + + +
          +

          _sCurQuery + - private String +

          +
          +
          + Current query string +
          +
          + + + + +
          +

          _sName + - private String +

          +
          +
          + Name of AutoComplete instance. +
          +
          + + + + +
          +

          _sSavedQuery + - private String +

          +
          +
          + Past queries this session (for saving delimited queries). +
          +
          + + + + +
          +

          allowBrowserAutocomplete + - Boolean +

          +
          +
          + 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. +
          +
          + + +
          + Default Value: true +
          + + +
          +

          alwaysShowContainer + - Boolean +

          +
          +
          + 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. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          animHoriz + - Boolean +

          +
          +
          + Whether or not to animate the expansion/collapse of the results container in the +horizontal direction. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          animSpeed + - Number +

          +
          +
          + Speed of container expand/collapse animation, in seconds.. +
          +
          + + +
          + Default Value: 0.3 +
          + + +
          +

          animVert + - Boolean +

          +
          +
          + Whether or not to animate the expansion/collapse of the results container in the +vertical direction. +
          +
          + + +
          + Default Value: true +
          + + +
          +

          autoHighlight + - Boolean +

          +
          +
          + Whether or not the first item in results container should be automatically highlighted +on expand. +
          +
          + + +
          + Default Value: true +
          + + +
          +

          dataSource + - YAHOO.widget.DataSource +

          +
          +
          + The DataSource object that encapsulates the data used for auto completion. +This object should be an inherited object from YAHOO.widget.DataSource. +
          +
          + + + + +
          +

          delimChar + - String | String[] +

          +
          +
          + 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. +
          +
          + + + + +
          +

          forceSelection + - Boolean +

          +
          +
          + 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. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          highlightClassName + - String +

          +
          +
          + Class name of a highlighted item within results container. +
          +
          + + +
          + Default Value: "yui-ac-highlight" +
          + + +
          +

          maxResultsDisplayed + - Number +

          +
          +
          + Maximum number of results to display in results container. +
          +
          + + +
          + Default Value: 10 +
          + + +
          +

          minQueryLength + - Number +

          +
          +
          + 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. +
          +
          + + +
          + Default Value: 1 +
          + + +
          +

          prehighlightClassName + - String +

          +
          +
          + Class name of a pre-highlighted item within results container. +
          +
          + + + + +
          +

          queryDelay + - Number +

          +
          +
          + 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. +
          +
          + + +
          + Default Value: 0.5 +
          + + +
          +

          typeAhead + - Boolean +

          +
          +
          + 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. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          useIFrame + - Boolean +

          +
          +
          + 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). +
          +
          + + +
          + Default Value: false +
          + + +
          +

          useShadow + - Boolean +

          +
          +
          + Whether or not the results container should have a shadow. +
          +
          + + +
          + Default Value: false +
          + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + __initProps

          +
          + + private + + + void + __initProps + ( + ) + + +
          + Updates and validates latest public config properties. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _cancelIntervalDetection

          +
          + + private + + + void + _cancelIntervalDetection + ( + + + oSelf + + + ) + + +
          + Cancels text input detection by intervals. +
          + +
          + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _clearSelection

          +
          + + private + + + void + _clearSelection + ( + ) + + +
          + 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. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _enableIntervalDetection

          +
          + + private + + + void + _enableIntervalDetection + ( + ) + + +
          + Enables query triggers based on text input detection by intervals (rather +than by key events). +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _initContainer

          +
          + + private + + + void + _initContainer + ( + ) + + +
          + Initializes the results container once at object creation +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _initContainerHelpers

          +
          + + private + + + void + _initContainerHelpers + ( + ) + + +
          + Initializes the results container helpers if they are enabled and do +not exist +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _initList

          +
          + + private + + + void + _initList + ( + ) + + +
          + Clears out contents of container body and creates up to +YAHOO.widget.AutoComplete#maxResultsDisplayed <li> elements in an +<ul> element. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _initListItem

          +
          + + private + + + void + _initListItem + ( + + + oItem + + + , + nItemIndex + + + ) + + +
          + Initializes each <li> element in the container list. +
          + +
          + +
          +
          Parameters:
          +
          + oItem <HTMLElement> + The <li> DOM element. +
          +
          + nItemIndex <Number> + The index of the element. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _isIgnoreKey

          +
          + + private + + + Boolean + _isIgnoreKey + ( + + + nKeycode + + + ) + + +
          + 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. +
          + +
          + +
          +
          Parameters:
          +
          + nKeycode <Number> + Code of key pressed. +
          +
          + +
          +
          Returns: + + Boolean +
          +
          True if key should be ignored, false otherwise.
          +
          + +
          + +
          +
          +

          + _jumpSelection

          +
          + + private + + + void + _jumpSelection + ( + ) + + +
          + For values updated by type-ahead, the right arrow key jumps to the end +of the textbox, otherwise the container is closed. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _moveSelection

          +
          + + private + + + void + _moveSelection + ( + + + nKeyCode + + + ) + + +
          + Triggered by up and down arrow keys, changes the current highlighted +<li> element item. Scrolls container if necessary. +
          + +
          + +
          +
          Parameters:
          +
          + nKeyCode <Number> + Code of key pressed. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onContainerMouseout

          +
          + + private + + + void + _onContainerMouseout + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles container mouseout events. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The mouseout event. +
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onContainerMouseover

          +
          + + private + + + void + _onContainerMouseover + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles container mouseover events. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The mouseover event. +
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onContainerResize

          +
          + + private + + + void + _onContainerResize + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles container resize events. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The resize event. +
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onContainerScroll

          +
          + + private + + + void + _onContainerScroll + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles container scroll events. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The scroll event. +
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onFormSubmit

          +
          + + private + + + void + _onFormSubmit + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles form submission event. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The submit event. +
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onIMEDetected

          +
          + + private + + + void + _onIMEDetected + ( + + + oSelf + + + ) + + +
          + Enables interval detection for Korean IME support. +
          + +
          + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onItemMouseclick

          +
          + + private + + + void + _onItemMouseclick + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles <li> element click events in the container. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The click event. +
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onItemMouseout

          +
          + + private + + + void + _onItemMouseout + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles <li> element mouseout events in the container. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The mouseout event. +
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onItemMouseover

          +
          + + private + + + void + _onItemMouseover + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles <li> element mouseover events in the container. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The mouseover event. +
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onTextboxBlur

          +
          + + private + + + void + _onTextboxBlur + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles text input box losing focus. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The focus event. +
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onTextboxFocus

          +
          + + private + + + void + _onTextboxFocus + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles text input box receiving focus. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The focus event. +
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onTextboxKeyDown

          +
          + + private + + + void + _onTextboxKeyDown + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles textbox keydown events of functional keys, mainly for UI behavior. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The keydown event. +
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onTextboxKeyPress

          +
          + + private + + + void + _onTextboxKeyPress + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles textbox keypress events. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The keypress event. +
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onTextboxKeyUp

          +
          + + private + + + void + _onTextboxKeyUp + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles textbox keyup events that trigger queries. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The keyup event. +
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _populateList

          +
          + + private + + + void + _populateList + ( + + + sQuery + + + , + aResults + + + , + oSelf + + + ) + + +
          + 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. +
          + +
          + +
          +
          Parameters:
          +
          + sQuery <String> + The query string. +
          +
          + aResults <Object[]> + An array of query result objects from the DataSource. +
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _selectItem

          +
          + + private + + + void + _selectItem + ( + + + oItem + + + ) + + +
          + Selects a result item from the container +
          + +
          + +
          +
          Parameters:
          +
          + oItem <HTMLElement> + The selected <li> element item. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _selectText

          +
          + + private + + + void + _selectText + ( + + + oTextbox + + + , + nStart + + + , + nEnd + + + ) + + +
          + Selects text in the input field. +
          + +
          + +
          +
          Parameters:
          +
          + oTextbox <HTMLElement> + Text input box element in which to select text. +
          +
          + nStart <Number> + Starting index of text string to select. +
          +
          + nEnd <Number> + Ending index of text selection. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _sendQuery

          +
          + + private + + + void + _sendQuery + ( + + + sQuery + + + ) + + +
          + Makes query request to the DataSource. +
          + +
          + +
          +
          Parameters:
          +
          + sQuery <String> + Query string. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _textMatchesOption

          +
          + + private + + + Boolean + _textMatchesOption + ( + ) + + +
          + Whether or not user-typed value in the text input box matches any of the +query results. +
          + +
          + + +
          +
          Returns: + + Boolean +
          +
          True if user-input text matches a result, false otherwise.
          +
          + +
          + +
          +
          +

          + _toggleContainer

          +
          + + private + + + void + _toggleContainer + ( + + + bShow + + + ) + + +
          + Animates expansion or collapse of the container. +
          + +
          + +
          +
          Parameters:
          +
          + bShow <Boolean> + True if container should be expanded, false if container should be collapsed +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _toggleContainerHelpers

          +
          + + private + + + void + _toggleContainerHelpers + ( + + + bShow + + + ) + + +
          + Syncs results container with its helpers. +
          + +
          + +
          +
          Parameters:
          +
          + bShow <Boolean> + True if container is expanded, false if collapsed +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _toggleHighlight

          +
          + + private + + + void + _toggleHighlight + ( + + + oNewItem + + + , + sType + + + ) + + +
          + Toggles the highlight on or off for an item in the container, and also cleans +up highlighting of any previous item. +
          + +
          + +
          +
          Parameters:
          +
          + oNewItem <HTMLElement> + The <li> element item to receive highlight behavior. +
          +
          + sType <String> + Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _togglePrehighlight

          +
          + + private + + + void + _togglePrehighlight + ( + + + oNewItem + + + , + sType + + + ) + + +
          + Toggles the pre-highlight on or off for an item in the container. +
          + +
          + +
          +
          Parameters:
          +
          + oNewItem <HTMLElement> + The <li> element item to receive highlight behavior. +
          +
          + sType <String> + Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _typeAhead

          +
          + + private + + + void + _typeAhead + ( + + + oItem + + + , + sQuery + + + ) + + +
          + Updates in the text input box with the first query result as the user types, +selecting the substring that the user has not typed. +
          + +
          + +
          +
          Parameters:
          +
          + oItem <HTMLElement> + The <li> element item whose data populates the input field. +
          +
          + sQuery <String> + Query string. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _updateValue

          +
          + + private + + + void + _updateValue + ( + + + oItem + + + ) + + +
          + Updates the text input box value with selected query result. If a delimiter +has been defined, then the value gets appended with the delimiter. +
          + +
          + +
          +
          Parameters:
          +
          + oItem <HTMLElement> + The <li> element item with which to update the value. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + doBeforeExpandContainer

          +
          + + + + + Boolean + doBeforeExpandContainer + ( + ) + + +
          + Overridable method called before container expands allows implementers to access data +and DOM elements. +
          + +
          + + +
          +
          Returns: + + Boolean +
          +
          Return true to continue expanding container, false to cancel the expand.
          +
          + +
          + +
          +
          +

          + formatResult

          +
          + + + + + String + formatResult + ( + + + oResultItem + + + , + sQuery + + + ) + + +
          + 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:
          +
          + oResultItem <Object> + Result item representing one query result. Data is held in an array. +
          +
          + sQuery <String> + The current query string. +
          +
          + +
          +
          Returns: + + String +
          +
          HTML markup of formatted result data.
          +
          + +
          + +
          +
          +

          + getListItemData

          +
          + + + + + Object | Object[] + getListItemData + ( + ) + + +
          + Public accessor to the data held in an <li> element of the +results container. +
          + +
          + + +
          +
          Returns: + + Object | Object[] +
          +
          Object or array of result data or null
          +
          + +
          + +
          +
          +

          + getListItems

          +
          + + + + + HTMLElement[] + getListItems + ( + ) + + +
          + Public accessor to the internal array of DOM <li> elements that +display query results within the results container. +
          + +
          + + +
          +
          Returns: + + HTMLElement[] +
          +
          Array of <li> elements within the results container.
          +
          + +
          + +
          +
          +

          + isContainerOpen

          +
          + + + + + Boolean + isContainerOpen + ( + ) + + +
          + Returns true if container is in an expanded state, false otherwise. +
          + +
          + + +
          +
          Returns: + + Boolean +
          +
          Returns true if container is in an expanded state, false otherwise.
          +
          + +
          + +
          +
          +

          + sendQuery

          +
          + + + + + void + sendQuery + ( + + + sQuery + + + ) + + +
          + Makes query request to the DataSource. +
          + +
          + +
          +
          Parameters:
          +
          + sQuery <String> + Query string. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setBody

          +
          + + + + + void + setBody + ( + + + sBody + + + ) + + +
          + Sets HTML markup for the results container body. This markup will be +inserted within a <div> tag with a class of "yui-ac-bd". +
          + +
          + +
          +
          Parameters:
          +
          + sBody <String> + HTML markup for results container body. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setFooter

          +
          + + + + + void + setFooter + ( + + + sFooter + + + ) + + +
          + Sets HTML markup for the results container footer. This markup will be +inserted within a <div> tag with a class of "yui-ac-ft". +
          + +
          + +
          +
          Parameters:
          +
          + sFooter <String> + HTML markup for results container footer. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setHeader

          +
          + + + + + void + setHeader + ( + + + sHeader + + + ) + + +
          + Sets HTML markup for the results container header. This markup will be +inserted within a <div> tag with a class of "yui-ac-hd". +
          + +
          + +
          +
          Parameters:
          +
          + sHeader <String> + HTML markup for results container header. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Public accessor to the unique name of the AutoComplete instance. +
          + +
          + + +
          +
          Returns: + + String +
          +
          Unique name of the AutoComplete instance.
          +
          + +
          + +
          +
          +
          +
          + + +
          +

          Events

          +
          +

          + _sLastTextboxValue

          +
          + + private + + + _sLastTextboxValue + + ( + ) + + + +
          + Internal tracker to last known textbox value, used to determine whether or not +to trigger a query via interval for certain IME users. +
          + +
          + + + + +
          + +
          +
          +

          + containerCollapseEvent

          +
          + + + + + containerCollapseEvent + + ( + + + oSelf + + + ) + + + +
          + Fired when the results container is collapsed. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + + +
          + +
          +
          +

          + containerExpandEvent

          +
          + + + + + containerExpandEvent + + ( + + + oSelf + + + ) + + + +
          + Fired when the results container is expanded. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + + +
          + +
          +
          +

          + dataErrorEvent

          +
          + + + + + dataErrorEvent + + ( + + + oSelf + + + , + sQuery + + + ) + + + +
          + Fired when the AutoComplete instance does not receive query results from the +DataSource due to an error. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + sQuery <String> + The query string. +
          +
          + + +
          + +
          +
          +

          + dataRequestEvent

          +
          + + + + + dataRequestEvent + + ( + + + oSelf + + + , + sQuery + + + ) + + + +
          + Fired when the AutoComplete instance makes a query to the DataSource. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + sQuery <String> + The query string. +
          +
          + + +
          + +
          +
          +

          + dataReturnEvent

          +
          + + + + + dataReturnEvent + + ( + + + oSelf + + + , + sQuery + + + , + aResults + + + ) + + + +
          + Fired when the AutoComplete instance receives query results from the data +source. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + sQuery <String> + The query string. +
          +
          + aResults <Object[]> + Results array. +
          +
          + + +
          + +
          +
          +

          + itemArrowFromEvent

          +
          + + + + + itemArrowFromEvent + + ( + + + oSelf + + + , + elItem + + + ) + + + +
          + Fired when result item has been arrowed away from. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + elItem <HTMLElement> + The <li> element item arrowed from. +
          +
          + + +
          + +
          +
          +

          + itemArrowToEvent

          +
          + + + + + itemArrowToEvent + + ( + + + oSelf + + + , + elItem + + + ) + + + +
          + Fired when result item has been arrowed to. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + elItem <HTMLElement> + The <li> element item arrowed to. +
          +
          + + +
          + +
          +
          +

          + itemMouseOutEvent

          +
          + + + + + itemMouseOutEvent + + ( + + + oSelf + + + , + elItem + + + ) + + + +
          + Fired when result item has been moused out. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + elItem <HTMLElement> + The <li> element item moused from. +
          +
          + + +
          + +
          +
          +

          + itemMouseOverEvent

          +
          + + + + + itemMouseOverEvent + + ( + + + oSelf + + + , + elItem + + + ) + + + +
          + Fired when result item has been moused over. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + elItem <HTMLElement> + The <li> element item moused to. +
          +
          + + +
          + +
          +
          +

          + itemSelectEvent

          +
          + + + + + itemSelectEvent + + ( + + + oSelf + + + , + elItem + + + , + oData + + + ) + + + +
          + Fired when an item is selected via mouse click, ENTER key, or TAB key. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + elItem <HTMLElement> + The selected <li> element item. +
          +
          + oData <Object> + The data returned for the item, either as an object, +or mapped from the schema into an array. +
          +
          + + +
          + +
          +
          +

          + selectionEnforceEvent

          +
          + + + + + selectionEnforceEvent + + ( + + + oSelf + + + ) + + + +
          + Fired if forceSelection is enabled and the user's input has been cleared +because it did not match one of the returned query results. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + + +
          + +
          +
          +

          + textboxBlurEvent

          +
          + + + + + textboxBlurEvent + + ( + + + oSelf + + + ) + + + +
          + Fired when the input field loses focus. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + + +
          + +
          +
          +

          + textboxFocusEvent

          +
          + + + + + textboxFocusEvent + + ( + + + oSelf + + + ) + + + +
          + Fired when the input field receives focus. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + + +
          + +
          +
          +

          + textboxKeyEvent

          +
          + + + + + textboxKeyEvent + + ( + + + oSelf + + + , + nKeycode + + + ) + + + +
          + Fired when the input field receives key input. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + nKeycode <Number> + The keycode number. +
          +
          + + +
          + +
          +
          +

          + typeAheadEvent

          +
          + + + + + typeAheadEvent + + ( + + + oSelf + + + , + sQuery + + + , + sPrefill + + + ) + + + +
          + Fired when the input field has been prefilled by the type-ahead +feature. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + sQuery <String> + The query string. +
          +
          + sPrefill <String> + The prefill string. +
          +
          + + +
          + +
          +
          +

          + unmatchedItemSelectEvent

          +
          + + + + + unmatchedItemSelectEvent + + ( + + + oSelf + + + , + sQuery + + + ) + + + +
          + 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. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <YAHOO.widget.AutoComplete> + The AutoComplete instance. +
          +
          + sQuery <String> + The user-typed query string. +
          +
          + + +
          + +
          +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.Button.html b/www/extras/yui/docs/YAHOO.widget.Button.html new file mode 100644 index 000000000..b8320cc21 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.Button.html @@ -0,0 +1,4125 @@ + + + + API: button YAHOO.widget.Button (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Button  2.2.2

          +

          + Yahoo! UI Library + > button + > YAHOO.widget.Button + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.Button + + - extends YAHOO.util.Element + + + + + + +

          + + + + + +
          + The Button class creates a rich, graphical button. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.Button + + ( + + + + p_oElement + + + + , + p_oAttributes + ) + +
          +
          +
          Parameters:
          +
          + p_oElement + <String> + + String specifying the id attribute of the +<input>, <a> or +<span> element to be used to create the button. +
          +
          + p_oElement + <HTMLInputElement|HTMLElement> + + Object reference for the +<input>, <a> or +<span> element to be used to create the button. +
          +
          + p_oElement + <Object> + + Object literal specifying a set of configuration +attributes used to create the button. +
          +
          + p_oAttributes + <Object> + + Optional. Object literal specifying a set of +configuration attributes used to create the button. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _activationButtonPressed + - protected Boolean +

          +
          +
          + Boolean indicating if the mouse button that toggles the button's +"active" state has been pressed. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          _activationKeyPressed + - protected Boolean +

          +
          +
          + Boolean indicating if the key(s) that toggle the button's +"active" state have been pressed. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          _button + - protected HTMLAnchorElement|HTMLButtonElement +

          +
          +
          + Object reference to the button's internal +<a> or <button> element. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          _hasKeyEventHandlers + - protected Boolean +

          +
          +
          + Boolean indicating if the button's "blur", "keydown" and +"keyup" event handlers are assigned +
          +
          + + +
          + Default Value: false +
          + + +
          +

          _hasMouseEventHandlers + - protected Boolean +

          +
          +
          + Boolean indicating if the button's "mouseout" and "mousedown" +and "mouseup" event handlers are assigned +
          +
          + + +
          + Default Value: false +
          + + +
          +

          _hiddenField + - protected HTMLInputElement +

          +
          +
          + Object reference to the <input> element +used when the button's parent form is submitted. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          _menu + - protected YAHOO.widget.Menu +

          +
          +
          + Object reference to the button's menu. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          _onclickAttributeValue + - protected Object +

          +
          +
          + Object reference to the button's current value for the "onclick" +configuration attribute. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          ACTIVATION_KEYS + - final Array +

          +
          +
          + Array of numbers representing keys that (when presed) toggle +the button's "active" state. +
          +
          + + +
          + Default Value: [13, 32] +
          + + +
          +

          CHECK_ACTIVATION_KEYS + - final Array +

          +
          +
          + Array of numbers representing keys that (when pressed) toggle +the button's "checked" attribute. +
          +
          + + +
          + Default Value: [32] +
          + + +
          +

          CHECKBOX_CHECKED_TITLE + - final String +

          +
          +
          + String representing the title applied to buttons of type +"checkbox" when checked. +
          +
          + + +
          + Default Value: "Checked. Click to uncheck." +
          + + +
          +

          CHECKBOX_DEFAULT_TITLE + - final String +

          +
          +
          + String representing the default title applied to buttons of +type "checkbox." +
          +
          + + +
          + Default Value: "Unchecked. Click to check." +
          + + +
          +

          CSS_CLASS_NAME + - final String +

          +
          +
          + String representing the CSS class(es) to be applied to the +button's root element. +
          +
          + + +
          + Default Value: "yuibutton" +
          + + +
          +

          MENUBUTTON_DEFAULT_TITLE + - final String +

          +
          +
          + String representing the default title applied to buttons of +type "menubutton." +
          +
          + + +
          + Default Value: "Menu collapsed. Click to expand." +
          + + +
          +

          MENUBUTTON_MENU_VISIBLE_TITLE + - final String +

          +
          +
          + String representing the title applied to buttons of type +"menubutton" when the button's menu is visible. +
          +
          + + +
          + Default Value: "Menu expanded. Click or press Esc to collapse." +
          + + +
          +

          OPTION_AREA_WIDTH + - final Number +

          +
          +
          + Width (in pixels) of the area of a split button that when +pressed will display a menu. +
          +
          + + +
          + Default Value: 20 +
          + + +
          +

          RADIO_CHECKED_TITLE + - final String +

          +
          +
          + String representing the title applied to buttons of type "radio" +when checked. +
          +
          + + +
          + Default Value: "Checked. Click to uncheck." +
          + + +
          +

          RADIO_DEFAULT_TITLE + - final String +

          +
          +
          + String representing the default title applied to buttons of +type "radio." +
          +
          + + +
          + Default Value: "Unchecked. Click to check." +
          + + +
          +

          SPLITBUTTON_DEFAULT_TITLE + - final String +

          +
          +
          + String representing the default title applied to buttons of +type "splitebutton." +
          +
          + + +
          + Default Value: "Menu collapsed. Click inside option region or press +Ctrl + Shift + M to show the menu." +
          + + +
          +

          SPLITBUTTON_OPTION_VISIBLE_TITLE + - final String +

          +
          +
          + String representing the title applied to buttons of type +"splitbutton" when the button's menu is visible. +
          +
          + + +
          + Default Value: "Menu expanded. Press Esc or Ctrl + Shift + M to hide the menu." +
          + + +
          +

          SUBMIT_TITLE + - final String +

          +
          +
          + String representing the title applied to buttons of +type "submit." +
          +
          + + +
          + Default Value: "Click to submit form." +
          + + +
          +

          TAG_NAME + - final String +

          +
          +
          + The name of the tag to be used for the button's root element. +
          +
          + + +
          + Default Value: "SPAN" +
          + + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.util.Element:

          +
          + + + DOM_EVENTS + +
          +
          +
          +

          Properties inherited from YAHOO.util.AttributeProvider:

          +
          + + + _configs + +
          +
          +
          +

          Properties inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Methods

          +
          +

          + _addListenersToForm

          +
          + + protected + + + void + _addListenersToForm + ( + ) + + +
          + Adds event handlers to the button's form. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _createButtonElement

          +
          + + protected + + + HTMLElement + _createButtonElement + ( + + + p_sType + + + ) + + +
          + Creates the button's element. +
          + +
          + +
          +
          Parameters:
          +
          + p_sType <String> + String indicating the type of element to create. +
          +
          + +
          +
          Returns: + + HTMLElement +
          +
          +
          + +
          + +
          +
          +

          + _hideMenu

          +
          + + protected + + + void + _hideMenu + ( + ) + + +
          + Hides the button's menu. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _isActivationKey

          +
          + + protected + + + Boolean + _isActivationKey + ( + + + p_nKeyCode + + + ) + + +
          + Determines if the specified keycode is one that toggles the +button's "active" state. +
          + +
          + +
          +
          Parameters:
          +
          + p_nKeyCode <Number> + Number representing the keycode to be evaluated. +
          +
          + +
          +
          Returns: + + Boolean +
          +
          +
          + +
          + +
          +
          +

          + _isSplitButtonOptionKey

          +
          + + protected + + + Boolean + _isSplitButtonOptionKey + ( + + + p_oEvent + + + ) + + +
          + Determines if the specified keycode is one that toggles the +display of the split button's menu. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + Boolean +
          +
          +
          + +
          + +
          +
          +

          + _onAppendTo

          +
          + + protected + + + void + _onAppendTo + ( + + + p_oEvent + + + ) + + +
          + "appendTo" event handler for the button. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onBlur

          +
          + + protected + + + void + _onBlur + ( + + + p_oEvent + + + ) + + +
          + "blur" event handler for the button. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onClick

          +
          + + protected + + + void + _onClick + ( + + + p_oEvent + + + ) + + +
          + "click" event handler for the button. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onDocumentKeyUp

          +
          + + protected + + + void + _onDocumentKeyUp + ( + + + p_oEvent + + + ) + + +
          + "keyup" event handler for the document. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onDocumentMouseDown

          +
          + + protected + + + void + _onDocumentMouseDown + ( + + + p_oEvent + + + ) + + +
          + "mousedown" event handler for the document. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onDocumentMouseUp

          +
          + + protected + + + void + _onDocumentMouseUp + ( + + + p_oEvent + + + ) + + +
          + "mouseup" event handler for the button. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onFocus

          +
          + + protected + + + void + _onFocus + ( + + + p_oEvent + + + ) + + +
          + "focus" event handler for the button. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onFormReset

          +
          + + protected + + + void + _onFormReset + ( + + + p_oEvent + + + ) + + +
          + "reset" event handler for the button's form. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onFormSubmit

          +
          + + protected + + + void + _onFormSubmit + ( + + + p_oEvent + + + ) + + +
          + "submit" event handler for the button's form. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onKeyDown

          +
          + + protected + + + void + _onKeyDown + ( + + + p_oEvent + + + ) + + +
          + "keydown" event handler for the button. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onKeyUp

          +
          + + protected + + + void + _onKeyUp + ( + + + p_oEvent + + + ) + + +
          + "keyup" event handler for the button. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMenuClick

          +
          + + private + + + void + _onMenuClick + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + "click" event handler for the button's menu. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMenuHide

          +
          + + private + + + void + _onMenuHide + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + "hide" event handler for the button's menu. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMenuItemAdded

          +
          + + private + + + void + _onMenuItemAdded + ( + + + p_sType + + + , + p_aArgs + + + , + p_oItem + + + ) + + +
          + "itemadded" event handler for the button's menu. +
          + +
          + +
          +
          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 subscribed to the event. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMenuItemSelected

          +
          + + private + + + void + _onMenuItemSelected + ( + + + p_sType + + + , + p_aArgs + + + , + p_oItem + + + ) + + +
          + "selectedchange" event handler for each item in the +button's menu. +
          + +
          + +
          +
          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 subscribed to the event. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMenuKeyDown

          +
          + + private + + + void + _onMenuKeyDown + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + "keydown" event handler for the button's menu. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMenuRender

          +
          + + private + + + void + _onMenuRender + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + "render" event handler for the button's menu. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMenuShow

          +
          + + private + + + void + _onMenuShow + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + "show" event handler for the button's menu. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMouseDown

          +
          + + protected + + + void + _onMouseDown + ( + + + p_oEvent + + + ) + + +
          + "mousedown" event handler for the button. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMouseOut

          +
          + + protected + + + void + _onMouseOut + ( + + + p_oEvent + + + ) + + +
          + "mouseout" event handler for the button. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMouseOver

          +
          + + protected + + + void + _onMouseOver + ( + + + p_oEvent + + + ) + + +
          + "mouseover" event handler for the button. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMouseUp

          +
          + + protected + + + void + _onMouseUp + ( + + + p_oEvent + + + ) + + +
          + "mouseup" event handler for the button. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onOption

          +
          + + protected + + + void + _onOption + ( + + + p_oEvent + + + ) + + +
          + "option" event handler for the button. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _setAccessKey

          +
          + + protected + + + void + _setAccessKey + ( + + + p_sAccessKey + + + ) + + +
          + Sets the value of the button's "accesskey" attribute. +
          + +
          + +
          +
          Parameters:
          +
          + p_sAccessKey <String> + String indicating the value for the button's +"accesskey" attribute. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _setChecked

          +
          + + protected + + + void + _setChecked + ( + + + p_bChecked + + + ) + + +
          + Sets the value of the button's "target" attribute. +
          + +
          + +
          +
          Parameters:
          +
          + p_bChecked <Boolean> + Boolean indicating the value for the button's +"checked" attribute. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _setDisabled

          +
          + + protected + + + void + _setDisabled + ( + + + p_bDisabled + + + ) + + +
          + Sets the value of the button's "disabled" attribute. +
          + +
          + +
          +
          Parameters:
          +
          + p_bDisabled <Boolean> + Boolean indicating the value for the button's +"disabled" attribute. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _setHref

          +
          + + protected + + + void + _setHref + ( + + + p_sHref + + + ) + + +
          + Sets the value of the button's "href" attribute. +
          + +
          + +
          +
          Parameters:
          +
          + p_sHref <String> + String indicating the value for the button's +"href" attribute. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _setLabel

          +
          + + protected + + + void + _setLabel + ( + + + p_sLabel + + + ) + + +
          + Sets the value of the button's "label" attribute. +
          + +
          + +
          +
          Parameters:
          +
          + p_sLabel <String> + String indicating the value for the button's +"label" attribute. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _setMenu

          +
          + + protected + + + void + _setMenu + ( + + + p_oMenu + + + ) + + +
          + Sets the value of the button's "menu" attribute. +
          + +
          + +
          +
          Parameters:
          +
          + p_oMenu <Object> + Object indicating the value for the button's +"menu" attribute. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _setOnClick

          +
          + + protected + + + void + _setOnClick + ( + + + p_oObject + + + ) + + +
          + Sets the value of the button's "onclick" attribute. +
          + +
          + +
          +
          Parameters:
          +
          + p_oObject <Object> + Object indicating the value for the button's +"onclick" attribute. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _setTabIndex

          +
          + + protected + + + void + _setTabIndex + ( + + + p_nTabIndex + + + ) + + +
          + Sets the value of the button's "tabindex" attribute. +
          + +
          + +
          +
          Parameters:
          +
          + p_nTabIndex <Number> + Number indicating the value for the button's +"tabindex" attribute. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _setTarget

          +
          + + protected + + + void + _setTarget + ( + + + p_sTarget + + + ) + + +
          + Sets the value of the button's "target" attribute. +
          + +
          + +
          +
          Parameters:
          +
          + p_sTarget <String> + String indicating the value for the button's +"target" attribute. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _setTitle

          +
          + + protected + + + void + _setTitle + ( + + + p_nTabIndex + + + ) + + +
          + Sets the value of the button's "title" attribute. +
          + +
          + +
          +
          Parameters:
          +
          + p_nTabIndex <String> + Number indicating the value for the button's +"title" attribute. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _setType

          +
          + + protected + + + void + _setType + ( + + + p_sType + + + ) + + +
          + Sets the value of the button's "type" attribute. +
          + +
          + +
          +
          Parameters:
          +
          + p_sType <String> + String indicating the value for the button's +"type" attribute. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _showMenu

          +
          + + protected + + + void + _showMenu + ( + + + p_oEvent + + + ) + + +
          + Shows the button's menu. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event) that triggered the display of +the menu. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + addHiddenFieldsToForm

          +
          + + + + + void + addHiddenFieldsToForm + ( + + + p_oForm + + + ) + + +
          + Searches the specified form and adds hidden fields for instances +of YAHOO.widget.Button that are of type "radio," "checkbox," "menubutton," +and "splitbutton." +
          + +
          + +
          +
          Parameters:
          +
          + p_oForm <HTMLFormElement> + Object reference +for the form to search. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + blur

          +
          + + + + + void + blur + ( + ) + + +
          + Causes the button to lose focus and fires the button's +"blur" event. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + createHiddenField

          +
          + + + + + HTMLInputElement + createHiddenField + ( + ) + + +
          + Creates the button's hidden form field and appends it to its +parent form. +
          + +
          + + +
          +
          Returns: + + HTMLInputElement +
          +
          +
          + +
          + +
          +
          +

          + createInputElement

          +
          + + private + + + HTMLInputElement + createInputElement + ( + + + p_sType + + + , + p_sName + + + , + p_sValue + + + , + p_bChecked + + + ) + + +
          + Creates an <input> element of the +specified type. +
          + +
          + +
          +
          Parameters:
          +
          + p_sType <String> + String specifying the type of +<input> element to create. +
          +
          + p_sName <String> + String specifying the name of +<input> element to create. +
          +
          + p_sValue <String> + String specifying the value of +<input> element to create. +
          +
          + p_bChecked <String> + Boolean specifying if the +<input> element is to be checked. +
          +
          + +
          +
          Returns: + + HTMLInputElement +
          +
          +
          + +
          + +
          +
          +

          + destroy

          +
          + + + + + void + destroy + ( + ) + + +
          + Removes the button's element from its parent element and +removes all event handlers. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + focus

          +
          + + + + + void + focus + ( + ) + + +
          + Causes the button to receive the focus and fires the button's +"focus" event. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getFirstElement

          +
          + + private + + + HTMLElement + getFirstElement + ( + + + p_oElement + + + ) + + +
          + Returns an HTML element's first HTML element node. +
          + +
          + +
          +
          Parameters:
          +
          + p_oElement <HTMLElement> + Object +reference specifying the element to be evaluated. +
          +
          + +
          +
          Returns: + + HTMLElement +
          +
          +
          + +
          + +
          +
          +

          + getForm

          +
          + + + + + HTMLFormElement + getForm + ( + ) + + +
          + Returns a reference to the button's parent form. +
          + +
          + + +
          +
          Returns: + + HTMLFormElement +
          +
          +
          + +
          + +
          +
          +

          + getHiddenField

          +
          + + + + + HTMLInputElement + getHiddenField + ( + ) + + +
          + Returns a reference to the <input> element +used when the button's parent form is submitted. +
          + +
          + + +
          +
          Returns: + + HTMLInputElement +
          +
          +
          + +
          + +
          +
          +

          + getMenu

          +
          + + + + + YAHOO.widget.Menu + getMenu + ( + ) + + +
          + Returns a reference to the button's menu. +
          + +
          + + +
          +
          Returns: + + YAHOO.widget.Menu +
          +
          +
          + +
          + +
          +
          +

          + hasFocus

          +
          + + + + + Boolean + hasFocus + ( + ) + + +
          + Returns a boolean indicating whether or not the button has focus. +
          + +
          + + +
          +
          Returns: + + Boolean +
          +
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + p_oElement + + + + + + + , + p_oAttributes + + + ) + + +
          + The Button class's initialization method. +
          + +
          + +
          +
          Parameters:
          +
          + p_oElement <String> + String specifying the id attribute of the +<input>, <a> or +<span> element to be used to create the button. +
          +
          + p_oElement <HTMLInputElement|HTMLElement> + Object reference for the +<input>, <a> or +<span> element to be used to create the button. +
          +
          + p_oElement <Object> + Object literal specifying a set of configuration +attributes used to create the button. +
          +
          + p_oAttributes <Object> + Optional. Object literal specifying a set of +configuration attributes used to create the button. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initAttributes

          +
          + + + + + void + initAttributes + ( + + + p_oAttributes + + + ) + + +
          + Initializes all of the configuration attributes used to create +the button. +
          + +
          + +
          +
          Parameters:
          +
          + p_oAttributes <Object> + Object literal specifying a set of +configuration attributes used to create the button. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initConfig

          +
          + + private + + + void + initConfig + ( + + + Object + + + ) + + +
          + Initializes the set of configuration attributes that are used to +instantiate the button. +
          + +
          + +
          +
          Parameters:
          +
          + Object <Object> + representing the button's set of +configuration attributes. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + isActive

          +
          + + + + + Boolean + isActive + ( + ) + + +
          + Returns a boolean indicating whether or not the button is active. +
          + +
          + + +
          +
          Returns: + + Boolean +
          +
          +
          + +
          + +
          +
          +

          + onFormKeyDown

          +
          + + + + + void + onFormKeyDown + ( + + + p_oEvent + + + ) + + +
          + "keydown" event handler for the button's form. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setAttributeFromDOMAttribute

          +
          + + private + + + void + setAttributeFromDOMAttribute + ( + + + p_sAttribute + + + ) + + +
          + Gets the value of the specified DOM attribute and sets it +into the collection of configuration attributes used to configure +the button. +
          + +
          + +
          +
          Parameters:
          +
          + p_sAttribute <String> + String representing the name of the +attribute to retrieve from the DOM element. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setAttributesFromSrcElement

          +
          + + private + + + void + setAttributesFromSrcElement + ( + + + p_oElement + + + , + p_oAttributes + + + ) + + +
          + Gets the values for all the attributes of the source element +(either <input> or <a>) that map to +Button configuration attributes and sets them into a collection that is +passed to the Button constructor. +
          + +
          + +
          +
          Parameters:
          +
          + p_oElement <HTMLInputElement|HTMLAnchorElement> + Object reference to the HTML +element (either <input> or <span>) +used to create the button. +
          +
          + p_oAttributes <Object> + Object reference for the collection of +configuration attributes used to create the button. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setFormElementProperties

          +
          + + private + + + void + setFormElementProperties + ( + ) + + +
          + Gets the value of the attributes from the form element and +sets them into the collection of configuration attributes used to +configure the button. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + submitForm

          +
          + + protected + + + void + submitForm + ( + ) + + +
          + Submits the form to which the button belongs. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a string representing the button. +
          + +
          + + +
          +
          Returns: + + String +
          +
          +
          + +
          + +
          +
          +
          +
          + + + +
          +

          Methods inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Events

          +
          +

          + blur

          +
          + + + + + blur + + ( + ) + + + +
          + Fires when the menu item loses the input focus. Passes back a +single object representing the original DOM event object passed back by the +event utility (YAHOO.util.Event) when the event was fired. See Element.addListener for more +information on listening for this event. +
          + +
          + + + + +
          + +
          +
          +

          + focus

          +
          + + + + + focus + + ( + ) + + + +
          + Fires when the menu item receives focus. Passes back a single +object representing the original DOM event object passed back by the event +utility (YAHOO.util.Event) when the event was fired. See Element.addListener for more +information on listening for this event. +
          + +
          + + + + +
          + +
          +
          +

          + option

          +
          + + + + + option + + ( + ) + + + +
          + Fires when the user invokes the button's option. Passes back a +single object representing the original DOM event (either "mousedown" or +"keydown") that caused the "option" event to fire. See Element.addListener for more +information on listening for this event. +
          + +
          + + + + +
          + +
          +
          +
          +
          + + +
          +

          Events inherited from YAHOO.util.Element:

          +
          + + + available, + contentReady + +
          +
          + +
          +

          Configuration Attributes

          +
          +

          checked + - Boolean +

          +
          +
          + Boolean indicating if the button is checked. Applies only +to buttons of type "radio" and "checkbox." +
          +
          + + +
          + Default Value: false +
          + +
          +

          container + - HTMLElement|String +

          +
          +
          + HTML element reference or string specifying the id +attribute of the HTML element that the button's markup should be +rendered into. +
          +
          + + +
          + Default Value: null +
          + +
          +

          disabled + - Boolean +

          +
          +
          + Boolean indicating if the button should be disabled. +(Disabled buttons are dimmed and will not respond to user input +or fire events. Does not apply to button's of type "link.") +
          +
          + + +
          + Default Value: false +
          + +
          +

          href + - String +

          +
          +
          + String specifying the href for the button. Applies only to +buttons of type "link." +
          +
          + + + +
          +

          label + - String +

          +
          +
          + String specifying the button's text label or innerHTML. +
          +
          + + +
          + Default Value: null +
          + +
          +

          menu + - HTMLElement|String|Array +

          +
          +
          + Object specifying the menu for the button. The value can be +one of the following: +
            +
          • Object specifying a +YAHOO.widget.Menu instance.
          • +
          • String specifying the id attribute of the <div> +element used to create the menu.
          • +
          • String specifying the id attribute of the +<select> element used to create the menu.
          • +
          • Object specifying the <div> element used to +create the menu.
          • +
          • Object specifying the <select> element used to +create the menu.
          • +
          • Array of object literals, each representing a set of +YAHOO.widget.MenuItem +configuration attributes.
          • +
          • Array of strings representing the text labels for each menu item in +the menu.
          • +
          +
          +
          + + +
          + Default Value: null +
          + +
          +

          name + - String +

          +
          +
          + String specifying the name for the button. +
          +
          + + +
          + Default Value: null +
          + +
          +

          onclick + - Object +

          +
          +
          + Object literal representing the code to be executed when +the button is clicked. Format:
          {
          +fn: Function, // The handler to call when the +event fires.
          obj: Object, // An object to +pass back to the handler.
          scope: Object // +The object to use for the scope of the handler.
          }
          +
          +
          + + +
          + Default Value: null +
          + +
          +

          selectedMenuItem + - YAHOO.widget.MenuItem +

          +
          +
          + Reference to the item in the button's menu that is +currently selected. +
          +
          + + +
          + Default Value: null +
          + +
          +

          srcelement + - HTMLElement|String +

          +
          +
          + Object reference to the HTML element (either +<input> or <span>) used to +create the button. +
          +
          + + +
          + Default Value: null +
          + +
          +

          tabindex + - Number +

          +
          +
          + Number specifying the tabindex for the button. +
          +
          + + +
          + Default Value: null +
          + +
          +

          target + - String +

          +
          +
          + String specifying the target for the button. Applies only +to buttons of type "link." +
          +
          + + + +
          +

          title + - String +

          +
          +
          + String specifying the title for the button. +
          +
          + + +
          + Default Value: null +
          + +
          +

          type + - String +

          +
          +
          + String specifying the button's type. Possible values are: +"button," "link," "submit," "reset," "checkbox," "radio," "menubutton," +and "splitbutton." +
          +
          + + +
          + Default Value: "button" +
          + +
          +

          value + - Object +

          +
          +
          + Object specifying the value for the button. +
          +
          + + +
          + Default Value: null +
          + +
          + +
          +
          + +
          +

          Configuration attributes inherited from YAHOO.util.Element:

          +
          + + + element + +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.ButtonGroup.html b/www/extras/yui/docs/YAHOO.widget.ButtonGroup.html new file mode 100644 index 000000000..a967d9a9d --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.ButtonGroup.html @@ -0,0 +1,1335 @@ + + + + API: button YAHOO.widget.ButtonGroup (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Button  2.2.2

          +

          + Yahoo! UI Library + > button + > YAHOO.widget.ButtonGroup + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.ButtonGroup + + - extends YAHOO.util.Element + + + + + + +

          + + + + + +
          + The ButtonGroup class creates a set of buttons that are mutually exclusive; +checking one button in the set will uncheck all others in the button group. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.ButtonGroup + + ( + + + + p_oElement + + + + , + p_oAttributes + ) + +
          +
          +
          Parameters:
          +
          + p_oElement + <String> + + String specifying the id attribute of the +<div> element of the button group. +
          +
          + p_oElement + <HTMLDivElement> + + Object +specifying the <div> element of the button group. +
          +
          + p_oElement + <Object> + + Object literal specifying a set of +configuration attributes used to create the button group. +
          +
          + p_oAttributes + <Object> + + Optional. Object literal specifying a set of +configuration attributes used to create the button group. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _buttons + - protected Array +

          +
          +
          + Array of buttons in the button group. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          CSS_CLASS_NAME + - final String +

          +
          +
          + String representing the CSS class(es) to be applied to the +button group's element. +
          +
          + + +
          + Default Value: "yuibuttongroup" +
          + + +
          +

          TAG_NAME + - final String +

          +
          +
          + The name of the tag to be used for the button group's element. +
          +
          + + +
          + Default Value: "DIV" +
          + + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.util.Element:

          +
          + + + DOM_EVENTS + +
          +
          +
          +

          Properties inherited from YAHOO.util.AttributeProvider:

          +
          + + + _configs + +
          +
          +
          +

          Properties inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Methods

          +
          +

          + _createGroupElement

          +
          + + protected + + + HTMLDivElement + _createGroupElement + ( + ) + + +
          + Creates the button group's element. +
          + +
          + + +
          +
          Returns: + + HTMLDivElement +
          +
          +
          + +
          + +
          +
          +

          + _onAppendTo

          +
          + + protected + + + void + _onAppendTo + ( + + + p_oEvent + + + ) + + +
          + "appendTo" event handler for the button group. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the event that was fired. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onButtonCheckedChange

          +
          + + protected + + + void + _onButtonCheckedChange + ( + + + p_oEvent + + + , + p_oButton + + + ) + + +
          + "checkedChange" event handler for each button in the +button group. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the event that was fired. +
          +
          + p_oButton <YAHOO.widget.Button> + +Object representing the button that fired the event. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onKeyDown

          +
          + + protected + + + void + _onKeyDown + ( + + + p_oEvent + + + ) + + +
          + "keydown" event handler for the button group. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _setDisabled

          +
          + + protected + + + void + _setDisabled + ( + + + p_bDisabled + + + ) + + +
          + Sets the value of the button groups's "disabled" attribute. +
          + +
          + +
          +
          Parameters:
          +
          + p_bDisabled <Boolean> + Boolean indicating the value for the button +group's "disabled" attribute. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + addButton

          +
          + + + + + YAHOO.widget.Button + addButton + ( + + + p_oButton + + + + + + + + + ) + + +
          + Adds the button to the button group. +
          + +
          + +
          +
          Parameters:
          +
          + p_oButton <YAHOO.widget.Button> + +Object reference for the +YAHOO.widget.Button instance to be added to the button group. +
          +
          + p_oButton <String> + String specifying the id attribute of the +<input> or <span> element to be +used to create the button to be added to the button group. +
          +
          + p_oButton <HTMLInputElement|HTMLElement> + Object reference for the +<input> or <span> element to be +used to create the button to be added to the button group. +
          +
          + p_oButton <Object> + Object literal specifying a set of +YAHOO.widget.Button configuration +attributes used to configure the button to be added to the button group. +
          +
          + +
          +
          Returns: + + YAHOO.widget.Button +
          +
          +
          + +
          + +
          +
          +

          + addButtons

          +
          + + + + + Array + addButtons + ( + + + p_aButtons + + + + + + + + + ) + + +
          + Adds the array of buttons to the button group. +
          + +
          + +
          +
          Parameters:
          +
          + p_aButtons <Array> + Array of +YAHOO.widget.Button instances to be added +to the button group. +
          +
          + p_aButtons <Array> + Array of strings specifying the id attribute of +the <input> or <span> elements to +be used to create the buttons to be added to the button group. +
          +
          + p_aButtons <Array> + Array of object references for the +<input> or <span> elements to be +used to create the buttons to be added to the button group. +
          +
          + p_aButtons <Array> + Array of object literals, each containing a set of +YAHOO.widget.Button configuration +attributes used to configure each button to be added to the button group. +
          +
          + +
          +
          Returns: + + Array +
          +
          +
          + +
          + +
          +
          +

          + check

          +
          + + + + + void + check + ( + + + p_nIndex + + + ) + + +
          + Checks the button at the specified index. +
          + +
          + +
          +
          Parameters:
          +
          + p_nIndex <Number> + Number indicating the index of the button to check. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + destroy

          +
          + + + + + void + destroy + ( + ) + + +
          + Removes the button group's element from its parent element and +removes all event handlers. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + focus

          +
          + + + + + void + focus + ( + + + p_nIndex + + + ) + + +
          + Sets focus to the button at the specified index. +
          + +
          + +
          +
          Parameters:
          +
          + p_nIndex <Number> + Number indicating the index of the button to focus. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getButton

          +
          + + + + + YAHOO.widget.Button + getButton + ( + + + p_nIndex + + + ) + + +
          + Returns the button at the specified index. +
          + +
          + +
          +
          Parameters:
          +
          + p_nIndex <Number> + The index of the button to retrieve from the +button group. +
          +
          + +
          +
          Returns: + + YAHOO.widget.Button +
          +
          +
          + +
          + +
          +
          +

          + getButtons

          +
          + + + + + Array + getButtons + ( + ) + + +
          + Returns an array of the buttons in the button group. +
          + +
          + + +
          +
          Returns: + + Array +
          +
          +
          + +
          + +
          +
          +

          + getCount

          +
          + + + + + Number + getCount + ( + ) + + +
          + Returns the number of buttons in the button group. +
          + +
          + + +
          +
          Returns: + + Number +
          +
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + p_oElement + + + + + + + , + p_oAttributes + + + ) + + +
          + The ButtonGroup class's initialization method. +
          + +
          + +
          +
          Parameters:
          +
          + p_oElement <String> + String specifying the id attribute of the +<div> element of the button group. +
          +
          + p_oElement <HTMLDivElement> + Object +specifying the <div> element of the button group. +
          +
          + p_oElement <Object> + Object literal specifying a set of configuration +attributes used to create the button group. +
          +
          + p_oAttributes <Object> + Optional. Object literal specifying a set of +configuration attributes used to create the button group. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initAttributes

          +
          + + + + + void + initAttributes + ( + + + p_oAttributes + + + ) + + +
          + Initializes all of the configuration attributes used to create +the button group. +
          + +
          + +
          +
          Parameters:
          +
          + p_oAttributes <Object> + Object literal specifying a set of +configuration attributes used to create the button group. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + removeButton

          +
          + + + + + void + removeButton + ( + + + p_nIndex + + + ) + + +
          + Removes the button at the specified index from the button group. +
          + +
          + +
          +
          Parameters:
          +
          + p_nIndex <Number> + Number specifying the index of the button to be +removed from the button group. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a string representing the button group. +
          + +
          + + +
          +
          Returns: + + String +
          +
          +
          + +
          + +
          +
          +
          +
          + + + +
          +

          Methods inherited from YAHOO.util.EventProvider:

          + +
          + + + +
          +

          Events inherited from YAHOO.util.Element:

          +
          + + + available, + contentReady + +
          +
          + +
          +

          Configuration Attributes

          +
          +

          checkedButton + - {YAHOO.widget.Button} +

          +
          +
          + Reference for the button in the button group that +is checked. +
          +
          + + +
          + Default Value: null +
          + +
          +

          container + - HTMLElement|String +

          +
          +
          + HTML element reference or string specifying the id +attribute of the HTML element that the button group's markup should be +rendered into. +
          +
          + + +
          + Default Value: null +
          + +
          +

          disabled + - Boolean +

          +
          +
          + Boolean indicating if the button group should be disabled. +Disabling the button group will disable each button in the button group. +Disabled buttons are dimmed and will not respond to user input +or fire events. +
          +
          + + +
          + Default Value: false +
          + +
          +

          name + - String +

          +
          +
          + String specifying the name for the button group. This +name will be applied to each button in the button group. +
          +
          + + +
          + Default Value: null +
          + +
          +

          value + - Object +

          +
          +
          + Object specifying the value for the button group. +
          +
          + + +
          + Default Value: null +
          + +
          + +
          +
          + +
          +

          Configuration attributes inherited from YAHOO.util.Element:

          +
          + + + element + +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.Calendar.html b/www/extras/yui/docs/YAHOO.widget.Calendar.html new file mode 100644 index 000000000..05d57e165 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.Calendar.html @@ -0,0 +1,6049 @@ + + + + API: calendar YAHOO.widget.Calendar (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Calendar  2.2.2

          +

          + Yahoo! UI Library + > calendar + > YAHOO.widget.Calendar + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.Calendar + + + + + + + +

          + + +
          +
          Known Subclasses: +
          + YAHOO.widget.Calendar_Core +
          +
          + + + +
          + 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. +

          +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.Calendar + + ( + + + + id + + , + containerId + + , + 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 +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _renderStack + - private Array +

          +
          +
          + A copy of the initial render functions created before rendering. +
          +
          + + + + +
          +

          _selectedDates + - private Array +

          +
          +
          + The private list of initially selected dates. +
          +
          + + + + +
          +

          browser + - String +

          +
          +
          + Returns a string representing the current browser. +
          +
          + + + + +
          +

          cellDates + - Array[](Number[]) +

          +
          +
          + 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]. +
          +
          + + + + +
          +

          cells + - HTMLTableCellElement[] +

          +
          +
          + The collection of calendar table cells +
          +
          + + + + +
          +

          cfg + - YAHOO.util.Config +

          +
          +
          + The Config object used to hold the configuration variables for the Calendar +
          +
          + + + + +
          +

          Config + - private Object +

          +
          +
          + The configuration object used to set up the calendars various locale and style options. +
          +
          + + + +
          + Deprecated: Configuration properties should be set by calling Calendar.cfg.setProperty. +
          + +
          +

          domEventMap + - Object +

          +
          +
          + A map of DOM event handlers to attach to cells associated with specific CSS class names +
          +
          + + + + +
          +

          id + - String +

          +
          +
          + The id that uniquely identifies this calendar. This id should match the id of the placeholder element on the page. +
          +
          + + + + +
          +

          index + - Number +

          +
          +
          + The index of this item in the parent group +
          +
          + + + + +
          +

          Locale + - Object +

          +
          +
          + The local object which contains the Calendar's locale settings +
          +
          + + + + +
          +

          oDomContainer + - HTMLElement +

          +
          +
          + 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. +
          +
          + + + + +
          +

          Options + - Object +

          +
          +
          + The local object which contains the Calendar's options +
          +
          + + + + +
          +

          parent + - CalendarGroup +

          +
          +
          + The parent CalendarGroup, only to be set explicitly by the parent group +
          +
          + + + + +
          +

          renderStack + - Array[] +

          +
          +
          + The list of render functions, along with required parameters, used to render cells. +
          +
          + + + + +
          +

          Style.CSS_BODY + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CALENDAR + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CELL + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CELL_BOTTOM + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CELL_HIGHLIGHT1 + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CELL_HIGHLIGHT2 + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CELL_HIGHLIGHT3 + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CELL_HIGHLIGHT4 + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CELL_HOVER + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CELL_LEFT + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CELL_OOB + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CELL_OOM + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CELL_RESTRICTED + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CELL_RIGHT + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CELL_SELECTABLE + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CELL_SELECTED + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CELL_SELECTOR + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CELL_TODAY + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CELL_TOP + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CLOSE + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_CONTAINER + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_FOOTER + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_HEADER + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_HEADER_TEXT + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_NAV_LEFT + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_NAV_RIGHT + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_ROW_FOOTER + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_ROW_HEADER + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_SINGLE + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_WEEKDAY_CELL + - object +

          +
          +
          + +
          +
          + + + + +
          +

          Style.CSS_WEEKDAY_ROW + - object +

          +
          +
          + +
          +
          + + + + +
          +

          today + - Date +

          +
          +
          + A Date object representing today's date. +
          +
          + + + + +
          +

          YAHOO.widget.Calendar._DEFAULT_CONFIG + - private static final Object +

          +
          +
          + The set of default Config property keys and values for the Calendar +
          +
          + + + + +
          +

          YAHOO.widget.Calendar._EVENT_TYPES + - private static final Object +

          +
          +
          + The set of Custom Event types supported by the Calendar +
          +
          + + + + +
          +

          YAHOO.widget.Calendar._STYLES + - private static final Object +

          +
          +
          + The set of default style constants for the Calendar +
          +
          + + + + +
          +

          YAHOO.widget.Calendar.DATE + - static final String +

          +
          +
          + Type constant used for renderers to represent an individual date (M/D/Y) +
          +
          + + + + +
          +

          YAHOO.widget.Calendar.DISPLAY_DAYS + - static final Number +

          +
          +
          + Constant that represents the total number of date cells that are displayed in a given month +
          +
          + + + + +
          +

          YAHOO.widget.Calendar.IMG_ROOT + - static String +

          +
          +
          + The path to be used for images loaded for the Calendar +
          +
          + + + +
          + Deprecated: You can now customize images by overriding the calclose, calnavleft and calnavright default CSS classes for the close icon, left arrow and right arrow respectively +
          + +
          +

          YAHOO.widget.Calendar.LONG + - static final String +

          +
          +
          + Constant used to represent long date field string formats (e.g. Monday or February) +
          +
          + + + + +
          +

          YAHOO.widget.Calendar.MEDIUM + - static final String +

          +
          +
          + Constant used to represent medium date field string formats (e.g. Mon) +
          +
          + + + + +
          +

          YAHOO.widget.Calendar.MONTH + - static final String +

          +
          +
          + Type constant used for renderers to represent a month across any year +
          +
          + + + + +
          +

          YAHOO.widget.Calendar.MONTH_DAY + - static final String +

          +
          +
          + Type constant used for renderers to represent an individual date across any year (M/D) +
          +
          + + + + +
          +

          YAHOO.widget.Calendar.ONE_CHAR + - static final String +

          +
          +
          + Constant used to represent single character date field string formats (e.g. M, T, W) +
          +
          + + + + +
          +

          YAHOO.widget.Calendar.RANGE + - static final String +

          +
          +
          + Type constant used for renderers to represent a range of individual dates (M/D/Y-M/D/Y) +
          +
          + + + + +
          +

          YAHOO.widget.Calendar.SHORT + - static final String +

          +
          +
          + Constant used to represent short date field string formats (e.g. Tu or Feb) +
          +
          + + + + +
          +

          YAHOO.widget.Calendar.STOP_RENDER + - static final String +

          +
          +
          + Constant used for halting the execution of the remainder of the render stack +
          +
          + + + + +
          +

          YAHOO.widget.Calendar.WEEKDAY + - static final String +

          +
          +
          + Type constant used for renderers to represent a weekday +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + _addRenderer

          +
          + + private + + + void + _addRenderer + ( + + + type + + + , + aDates + + + , + 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. +
          + +
          + +
          +
          Parameters:
          +
          + type <String> + 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 +
          +
          + aDates <Array> + An array of dates used to construct the renderer. The format varies based +on the renderer type +
          +
          + fnRender <Function> + The function executed to render cells that match the render rules for this renderer. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _fieldArraysAreEqual

          +
          + + private + + + Boolean + _fieldArraysAreEqual + ( + + + array1 + + + , + array2 + + + ) + + +
          + Converts a date field array [yyyy,mm,dd] to a JavaScript Date object. +
          + +
          + +
          +
          Parameters:
          +
          + array1 <Number[]> + The first date field array to compare +
          +
          + array2 <Number[]> + The first date field array to compare +
          +
          + +
          +
          Returns: + + Boolean +
          +
          The boolean that represents the equality of the two arrays
          +
          + +
          + +
          +
          +

          + _indexOfSelectedFieldArray

          +
          + + private + + + Number + _indexOfSelectedFieldArray + ( + + + find + + + ) + + +
          + Gets the index of a date field array [yyyy,mm,dd] in the current list of selected dates. +
          + +
          + +
          +
          Parameters:
          +
          + find <Number[]> + The date field array to search for +
          +
          + +
          +
          Returns: + + Number +
          +
          The index of the date field array within the collection of selected dates. +-1 will be returned if the date is not found.
          +
          + +
          + +
          +
          +

          + _parseDate

          +
          + + private + + + void + _parseDate + ( + + + sDate + + + ) + + +
          + Converts a date string to a date field array +
          + +
          + +
          +
          Parameters:
          +
          + sDate <String> + Date string. Valid formats are mm/dd and mm/dd/yyyy. +
          +
          + +
          +
          Returns: + + void +
          +
          A date field array representing the string passed to the method
          +
          + +
          + +
          +
          +

          + _parseDates

          +
          + + private + + + void + _parseDates + ( + + + sDates + + + ) + + +
          + Converts a multi or single-date string to an array of date field arrays +
          + +
          + +
          +
          Parameters:
          +
          + sDates <String> + Date string with one or more comma-delimited dates. Valid formats are mm/dd, mm/dd/yyyy, mm/dd/yyyy-mm/dd/yyyy +
          +
          + +
          +
          Returns: + + void +
          +
          An array of date field arrays
          +
          + +
          + +
          +
          +

          + _parsePageDate

          +
          + + private + + + Date + _parsePageDate + ( + + + date + + + ) + + +
          + Parses a pagedate configuration property value. The value can either be specified as a string of form "mm/yyyy" or a Date object +and is parsed into a Date object normalized to the first day of the month. If no value is passed in, the month and year from today's date are used to create the Date object +
          + +
          + +
          +
          Parameters:
          +
          + date <Date|String> + Pagedate value which needs to be parsed +
          +
          + +
          +
          Returns: + + Date +
          +
          The Date object representing the pagedate
          +
          + +
          + +
          +
          +

          + _parseRange

          +
          + + private + + + void + _parseRange + ( + + + startDate + + + , + endDate + + + ) + + +
          + Converts a date range to the full list of included dates +
          + +
          + +
          +
          Parameters:
          +
          + startDate <Number[]> + Date field array representing the first date in the range +
          +
          + endDate <Number[]> + Date field array representing the last date in the range +
          +
          + +
          +
          Returns: + + void +
          +
          An array of date field arrays
          +
          + +
          + +
          +
          +

          + _toDate

          +
          + + private + + + Date + _toDate + ( + + + dateFieldArray + + + ) + + +
          + Converts a date field array [yyyy,mm,dd] to a JavaScript Date object. +
          + +
          + +
          +
          Parameters:
          +
          + dateFieldArray <Number[]> + The date field array to convert to a JavaScript Date. +
          +
          + +
          +
          Returns: + + Date +
          +
          JavaScript Date object representing the date field array
          +
          + +
          + +
          +
          +

          + _toFieldArray

          +
          + + private + + + Array[](Number[]) + _toFieldArray + ( + + + date + + + ) + + +
          + 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]]. +
          + +
          + +
          +
          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: + + Array[](Number[]) +
          +
          Array of date field arrays
          +
          + +
          + +
          +
          +

          + addMonthRenderer

          +
          + + + + + void + addMonthRenderer + ( + + + month + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + addMonths

          +
          + + + + + void + addMonths + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + addRenderer

          +
          + + + + + void + addRenderer + ( + + + sDates + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + addWeekdayRenderer

          +
          + + + + + void + addWeekdayRenderer + ( + + + weekday + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + addYears

          +
          + + + + + void + addYears + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + applyListeners

          +
          + + + + + void + applyListeners + ( + ) + + +
          + Applies the Calendar's DOM listeners to applicable elements. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + buildDayLabel

          +
          + + + + + String + buildDayLabel + ( + + + 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
          +
          + +
          + +
          +
          +

          + buildMonthLabel

          +
          + + + + + String + buildMonthLabel + ( + ) + + +
          + Builds the date label that will be displayed in the calendar header or +footer, depending on configuration. +
          + +
          + + +
          +
          Returns: + + String +
          +
          The formatted calendar month label
          +
          + +
          + +
          +
          +

          + buildWeekdays

          +
          + + + + + Array + buildWeekdays + ( + + + html + + + ) + + +
          + Renders the Calendar's weekday headers. +
          + +
          + +
          +
          Parameters:
          +
          + html <Array> + The current working HTML array +
          +
          + +
          +
          Returns: + + Array +
          +
          The current working HTML array
          +
          + +
          + +
          +
          +

          + clear

          +
          + + + + + void + clear + ( + ) + + +
          + Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + clearAllBodyCellStyles

          +
          + + + + + void + clearAllBodyCellStyles + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + clearElement

          +
          + + + + + void + clearElement + ( + + + The + + + ) + + +
          + Clears the inner HTML, CSS class and style information from the specified cell. +
          + +
          + +
          +
          Parameters:
          +
          + The <HTMLTableCellElement> + cell to clear +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configClose

          +
          + + + + + void + configClose + ( + ) + + +
          + Default handler for the "close" property +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configIframe

          +
          + + + + + void + configIframe + ( + ) + + +
          + Renders the built-in IFRAME shim for the IE6 and below +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configLocale

          +
          + + + + + void + configLocale + ( + ) + + +
          + The default handler for all configuration locale properties +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configLocaleValues

          +
          + + + + + void + configLocaleValues + ( + ) + + +
          + The default handler for all configuration locale field length properties +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configMaxDate

          +
          + + + + + void + configMaxDate + ( + ) + + +
          + The default handler for the "maxdate" property +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configMinDate

          +
          + + + + + void + configMinDate + ( + ) + + +
          + The default handler for the "mindate" property +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configOptions

          +
          + + + + + void + configOptions + ( + ) + + +
          + The default handler for all configuration options properties +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configPageDate

          +
          + + + + + void + configPageDate + ( + ) + + +
          + The default handler for the "pagedate" property +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configSelected

          +
          + + + + + void + configSelected + ( + ) + + +
          + The default handler for the "selected" property +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configTitle

          +
          + + + + + void + configTitle + ( + ) + + +
          + Default handler for the "title" property +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + deselect

          +
          + + + + + Date[] + deselect + ( + + + 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.
          +
          + +
          + +
          +
          +

          + deselectAll

          +
          + + + + + Date[] + deselectAll + ( + ) + + +
          + Deselects all dates on the current calendar. +
          + +
          + + +
          +
          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.
          +
          + +
          + +
          +
          +

          + deselectCell

          +
          + + + + + Date[] + deselectCell + ( + + + 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.
          +
          + +
          + +
          +
          +

          + doCellMouseOut

          +
          + + + + + void + doCellMouseOut + ( + + + e + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + doCellMouseOver

          +
          + + + + + void + doCellMouseOver + ( + + + e + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + doSelectCell

          +
          + + + + + void + doSelectCell + ( + + + e + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + getDateByCellId

          +
          + + + + + Date + getDateByCellId + ( + + + 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
          +
          + +
          + +
          +
          +

          + getDateFieldsByCellId

          +
          + + + + + Array + getDateFieldsByCellId + ( + + + 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
          +
          + +
          + +
          +
          +

          + getSelectedDates

          +
          + + + + + Date[] + getSelectedDates + ( + ) + + +
          + Gets the list of currently selected dates from the calendar. +
          + +
          + + +
          +
          Returns: + + Date[] +
          +
          An array of currently selected JavaScript Date objects.
          +
          + +
          + +
          +
          +

          + hide

          +
          + + + + + void + hide + ( + ) + + +
          + Hides the Calendar's outer container from view. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + id + + + , + containerId + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + initEvents

          +
          + + + + + void + initEvents + ( + ) + + +
          + Initializes Calendar's built-in CustomEvents +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initStyles

          +
          + + + + + void + initStyles + ( + ) + + +
          + Defines the style constants for the Calendar +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + isDateOOM

          +
          + + + + + Boolean + isDateOOM + ( + + + 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
          +
          + +
          + +
          +
          +

          + nextMonth

          +
          + + + + + void + nextMonth + ( + ) + + +
          + Navigates to the next month page in the calendar widget. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + nextYear

          +
          + + + + + void + nextYear + ( + ) + + +
          + Navigates to the next year in the currently selected month in the calendar widget. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onBeforeDeselect

          +
          + + + + + void + onBeforeDeselect + ( + ) + + +
          + Event executed before a date is deselected in the calendar widget. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + Deprecated Event handlers for this event should be susbcribed to beforeDeselectEvent. +
          +
          + +
          +
          +

          + onBeforeSelect

          +
          + + + + + void + onBeforeSelect + ( + ) + + +
          + Event executed before a date is selected in the calendar widget. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + Deprecated Event handlers for this event should be susbcribed to beforeSelectEvent. +
          +
          + +
          +
          +

          + onChangePage

          +
          + + + + + void + onChangePage + ( + ) + + +
          + Event executed when the user navigates to a different calendar page. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + Deprecated Event handlers for this event should be susbcribed to changePageEvent. +
          +
          + +
          +
          +

          + onClear

          +
          + + + + + void + onClear + ( + ) + + +
          + Event executed when the calendar widget is completely cleared to the current month with no selections. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + Deprecated Event handlers for this event should be susbcribed to clearEvent. +
          +
          + +
          +
          +

          + onDeselect

          +
          + + + + + void + onDeselect + ( + + + selected + + + ) + + +
          + 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 +
          +
          +
          + +
          + Deprecated Event handlers for this event should be susbcribed to deselectEvent. +
          +
          + +
          +
          +

          + onRender

          +
          + + + + + void + onRender + ( + ) + + +
          + Event executed when the calendar widget is rendered. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + Deprecated Event handlers for this event should be susbcribed to renderEvent. +
          +
          + +
          +
          +

          + onReset

          +
          + + + + + void + onReset + ( + ) + + +
          + Event executed when the calendar widget is reset to its original state. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + Deprecated Event handlers for this event should be susbcribed to resetEvemt. +
          +
          + +
          +
          +

          + onSelect

          +
          + + + + + void + onSelect + ( + + + selected + + + ) + + +
          + 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 +
          +
          +
          + +
          + Deprecated Event handlers for this event should be susbcribed to selectEvent. +
          +
          + +
          +
          +

          + previousMonth

          +
          + + + + + void + previousMonth + ( + ) + + +
          + Navigates to the previous month page in the calendar widget. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + previousYear

          +
          + + + + + void + previousYear + ( + ) + + +
          + Navigates to the previous year in the currently selected month in the calendar widget. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + refreshLocale

          +
          + + private + + + void + refreshLocale + ( + ) + + +
          + Refreshes the locale values used to build the Calendar. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + render

          +
          + + + + + void + render + ( + ) + + +
          + 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. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + renderBody

          +
          + + + + + Array + renderBody + ( + + + workingDate + + + , + 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
          +
          + +
          + +
          +
          +

          + renderBodyCellRestricted

          +
          + + + + + String + renderBodyCellRestricted + ( + + + workingDate + + + , + 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
          +
          + +
          + +
          +
          +

          + renderCellDefault

          +
          + + + + + void + renderCellDefault + ( + + + workingDate + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + renderCellNotThisMonth

          +
          + + + + + String + renderCellNotThisMonth + ( + + + workingDate + + + , + 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
          +
          + +
          + +
          +
          +

          + renderCellStyleHighlight1

          +
          + + + + + void + renderCellStyleHighlight1 + ( + + + workingDate + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + renderCellStyleHighlight2

          +
          + + + + + void + renderCellStyleHighlight2 + ( + + + workingDate + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + renderCellStyleHighlight3

          +
          + + + + + void + renderCellStyleHighlight3 + ( + + + workingDate + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + renderCellStyleHighlight4

          +
          + + + + + void + renderCellStyleHighlight4 + ( + + + workingDate + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + renderCellStyleSelected

          +
          + + + + + String + renderCellStyleSelected + ( + + + workingDate + + + , + 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
          +
          + +
          + +
          +
          +

          + renderCellStyleToday

          +
          + + + + + void + renderCellStyleToday + ( + + + workingDate + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + renderFooter

          +
          + + + + + Array + renderFooter + ( + + + 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
          +
          + +
          + +
          +
          +

          + renderHeader

          +
          + + + + + Array + renderHeader + ( + + + html + + + ) + + +
          + Renders the calendar header. +
          + +
          + +
          +
          Parameters:
          +
          + html <Array> + The current working HTML array +
          +
          + +
          +
          Returns: + + Array +
          +
          The current working HTML array
          +
          + +
          + +
          +
          +

          + renderOutOfBoundsDate

          +
          + + + + + String + renderOutOfBoundsDate + ( + + + workingDate + + + , + 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
          +
          + +
          + +
          +
          +

          + renderRowFooter

          +
          + + + + + void + renderRowFooter + ( + + + weekNum + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + renderRowHeader

          +
          + + + + + void + renderRowHeader + ( + + + weekNum + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + reset

          +
          + + + + + void + reset + ( + ) + + +
          + Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s). +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + resetRenderers

          +
          + + + + + void + resetRenderers + ( + ) + + +
          + Resets the render stack of the current calendar to its original pre-render value. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + select

          +
          + + + + + Date[] + select + ( + + + 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.
          +
          + +
          + +
          +
          +

          + selectCell

          +
          + + + + + Date[] + selectCell + ( + + + 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.
          +
          + +
          + +
          +
          +

          + setMonth

          +
          + + + + + void + setMonth + ( + + + month + + + ) + + +
          + Sets the calendar's month explicitly +
          + +
          + +
          +
          Parameters:
          +
          + month <Number> + The numeric month, from 0 (January) to 11 (December) +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setYear

          +
          + + + + + void + setYear + ( + + + year + + + ) + + +
          + Sets the calendar's year explicitly. +
          + +
          + +
          +
          Parameters:
          +
          + year <Number> + The numeric 4-digit year +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + show

          +
          + + + + + void + show + ( + ) + + +
          + Shows the Calendar's outer container. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + styleCellDefault

          +
          + + + + + void + styleCellDefault + ( + + + workingDate + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + subtractMonths

          +
          + + + + + void + subtractMonths + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + subtractYears

          +
          + + + + + void + subtractYears + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a string representation of the object. +
          + +
          + + +
          +
          Returns: + + String +
          +
          A string representation of the Calendar object.
          +
          + +
          + +
          +
          +

          + validate

          +
          + + + + + void + validate + ( + ) + + +
          + Validates the calendar widget. This method has no default implementation +and must be extended by subclassing the widget. +
          + +
          + + +
          +
          Returns: + + void +
          +
          Should return true if the widget validates, and false if +it doesn't.
          +
          + +
          + +
          +
          +
          +
          + + +
          +

          Events

          +
          +

          + beforeDeselectEvent

          +
          + + + + + beforeDeselectEvent + + ( + ) + + + +
          + Fired before a selection is made +
          + +
          + + + + +
          + +
          +
          +

          + beforeRenderEvent

          +
          + + + + + beforeRenderEvent + + ( + ) + + + +
          + Fired before the Calendar is rendered +
          + +
          + + + + +
          + +
          +
          +

          + beforeSelectEvent

          +
          + + + + + beforeSelectEvent + + ( + ) + + + +
          + Fired before a selection is made +
          + +
          + + + + +
          + +
          +
          +

          + changePageEvent

          +
          + + + + + changePageEvent + + ( + ) + + + +
          + Fired when the Calendar page is changed +
          + +
          + + + + +
          + +
          +
          +

          + clearEvent

          +
          + + + + + clearEvent + + ( + ) + + + +
          + Fired when the Calendar is cleared +
          + +
          + + + + +
          + +
          +
          +

          + deselectEvent

          +
          + + + + + deselectEvent + + ( + + + Array + + + ) + + + +
          + Fired when a selection is made +
          + +
          + + +
          +
          Parameters:
          +
          + Array <Array> + of Date field arrays in the format [YYYY, MM, DD]. +
          +
          + + +
          + +
          +
          +

          + renderEvent

          +
          + + + + + renderEvent + + ( + ) + + + +
          + Fired when the Calendar is rendered +
          + +
          + + + + +
          + +
          +
          +

          + resetEvent

          +
          + + + + + resetEvent + + ( + ) + + + +
          + Fired when the Calendar is reset +
          + +
          + + + + +
          + +
          +
          +

          + selectEvent

          +
          + + + + + selectEvent + + ( + + + Array + + + ) + + + +
          + Fired when a selection is made +
          + +
          + + +
          +
          Parameters:
          +
          + Array <Array> + of Date field arrays in the format [YYYY, MM, DD]. +
          +
          + + +
          + +
          +
          +
          +
          + + + +
          +

          Configuration Attributes

          +
          +

          close + - Boolean +

          +
          +
          + Whether or not a close button should be displayed for this Calendar +
          +
          + + +
          + Default Value: false +
          + +
          +

          DATE_DELIMITER + - String +

          +
          +
          + The value used to delimit individual dates in a date string passed to various Calendar functions. +
          +
          + + +
          + Default Value: "," +
          + +
          +

          DATE_FIELD_DELIMITER + - String +

          +
          +
          + The value used to delimit date fields in a date string passed to various Calendar functions. +
          +
          + + +
          + Default Value: "/" +
          + +
          +

          DATE_RANGE_DELIMITER + - String +

          +
          +
          + The value used to delimit date ranges in a date string passed to various Calendar functions. +
          +
          + + +
          + Default Value: "-" +
          + +
          +

          HIDE_BLANK_WEEKS + - Boolean +

          +
          +
          + True if the Calendar should suppress weeks that are not a part of the current month. False by default. +
          +
          + + +
          + Default Value: false +
          + +
          +

          iframe + - Boolean +

          +
          +
          + 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. +
          +
          + + +
          + Default Value: true +
          + +
          +

          LOCALE_MONTHS + - String +

          +
          +
          + The setting that determines which length of month labels should be used. Possible values are "short" and "long". +
          +
          + + +
          + Default Value: "long" +
          + +
          +

          LOCALE_WEEKDAYS + - String +

          +
          +
          + The setting that determines which length of weekday labels should be used. Possible values are "1char", "short", "medium", and "long". +
          +
          + + +
          + Default Value: "short" +
          + +
          +

          maxdate + - String +

          +
          +
          + The maximum selectable date in the current Calendar (mm/dd/yyyy) +
          +
          + + +
          + Default Value: null +
          + +
          +

          MD_DAY_POSITION + - Number +

          +
          +
          + The position of the day in a month/year date string +
          +
          + + +
          + Default Value: 2 +
          + +
          +

          MD_MONTH_POSITION + - Number +

          +
          +
          + The position of the month in a month/day date string +
          +
          + + +
          + Default Value: 1 +
          + +
          +

          MDY_DAY_POSITION + - Number +

          +
          +
          + The position of the day in a month/day/year date string +
          +
          + + +
          + Default Value: 2 +
          + +
          +

          MDY_MONTH_POSITION + - Number +

          +
          +
          + The position of the month in a month/day/year date string +
          +
          + + +
          + Default Value: 1 +
          + +
          +

          MDY_YEAR_POSITION + - Number +

          +
          +
          + The position of the year in a month/day/year date string +
          +
          + + +
          + Default Value: 3 +
          + +
          +

          mindate + - String +

          +
          +
          + The minimum selectable date in the current Calendar (mm/dd/yyyy) +
          +
          + + +
          + Default Value: null +
          + +
          +

          MONTHS_LONG + - String[] +

          +
          +
          + The long month labels for the current locale. +
          +
          + + +
          + Default Value: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" +
          + +
          +

          MONTHS_SHORT + - String[] +

          +
          +
          + The short month labels for the current locale. +
          +
          + + +
          + Default Value: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] +
          + +
          +

          MULTI_SELECT + - Boolean +

          +
          +
          + True if the Calendar should allow multiple selections. False by default. +
          +
          + + +
          + Default Value: false +
          + +
          +

          MY_MONTH_POSITION + - Number +

          +
          +
          + The position of the month in a month/year date string +
          +
          + + +
          + Default Value: 1 +
          + +
          +

          MY_YEAR_POSITION + - Number +

          +
          +
          + The position of the year in a month/year date string +
          +
          + + +
          + Default Value: 2 +
          + +
          +

          NAV_ARROW_LEFT + - String +

          +
          +
          + The image that should be used for the left navigation arrow. +
          +
          + +
          + DeprecatedYou can customize the image by overriding the default CSS class for the left arrow - "calnavleft" +
          + +
          + Default Value: null +
          + +
          +

          NAV_ARROW_RIGHT + - String +

          +
          +
          + The image that should be used for the right navigation arrow. +
          +
          + +
          + DeprecatedYou can customize the image by overriding the default CSS class for the right arrow - "calnavright" +
          + +
          + Default Value: null +
          + +
          +

          pagedate + - String +

          +
          +
          + The month/year representing the current visible Calendar date (mm/yyyy) +
          +
          + + +
          + Default Value: today's date +
          + +
          +

          selected + - String +

          +
          +
          + The date or range of dates representing the current Calendar selection +
          +
          + + +
          + Default Value: [] +
          + +
          +

          SHOW_WEEK_FOOTER + - Boolean +

          +
          +
          + True if the Calendar should show week row footers. False by default. +
          +
          + + +
          + Default Value: false +
          + +
          +

          SHOW_WEEK_HEADER + - Boolean +

          +
          +
          + True if the Calendar should show week row headers. False by default. +
          +
          + + +
          + Default Value: false +
          + +
          +

          SHOW_WEEKDAYS + - Boolean +

          +
          +
          + True if the Calendar should show weekday labels. True by default. +
          +
          + + +
          + Default Value: true +
          + +
          +

          START_WEEKDAY + - number +

          +
          +
          + The weekday the week begins on. Default is 0 (Sunday). +
          +
          + + +
          + Default Value: 0 +
          + +
          +

          title + - String +

          +
          +
          + The title to display above the Calendar's month header +
          +
          + + +
          + Default Value: "" +
          + +
          +

          WEEKDAYS_1CHAR + - String[] +

          +
          +
          + The 1-character weekday labels for the current locale. +
          +
          + + +
          + Default Value: ["S", "M", "T", "W", "T", "F", "S"] +
          + +
          +

          WEEKDAYS_LONG + - String[] +

          +
          +
          + The long weekday labels for the current locale. +
          +
          + + +
          + Default Value: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] +
          + +
          +

          WEEKDAYS_MEDIUM + - String[] +

          +
          +
          + The medium weekday labels for the current locale. +
          +
          + + +
          + Default Value: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] +
          + +
          +

          WEEKDAYS_SHORT + - String[] +

          +
          +
          + The short weekday labels for the current locale. +
          +
          + + +
          + Default Value: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"] +
          + +
          + +
          +
          + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.Calendar2up.html b/www/extras/yui/docs/YAHOO.widget.Calendar2up.html new file mode 100644 index 000000000..8b95a3e88 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.Calendar2up.html @@ -0,0 +1,294 @@ + + + + API: calendar YAHOO.widget.Calendar2up (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Calendar  2.2.2

          +

          + Yahoo! UI Library + > calendar + > YAHOO.widget.Calendar2up + +

          +
          + +
          +
          +
          + + +

          + + + + + 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.
          + + +
          + +
          + + +
          +

          Properties

          +
          +

          Cal2up + - object +

          +
          +
          + +
          +
          + + + +
          + Deprecated: The old Calendar2up class is no longer necessary, since CalendarGroup renders in a 2up view by default. +
          + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.widget.CalendarGroup:

          +
          + + + cfg, + containerId, + id, + Locale, + oDomContainer, + Options, + pages + +
          +
          + + + + + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.CalendarGroup.html b/www/extras/yui/docs/YAHOO.widget.CalendarGroup.html new file mode 100644 index 000000000..2876150fb --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.CalendarGroup.html @@ -0,0 +1,3142 @@ + + + + API: calendar YAHOO.widget.CalendarGroup (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Calendar  2.2.2

          +

          + Yahoo! UI Library + > calendar + > YAHOO.widget.CalendarGroup + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.CalendarGroup + + + + + + + +

          + + +
          +
          Known Subclasses: +
          + YAHOO.widget.Calendar2up +
          +
          + + + +
          + 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. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.CalendarGroup + + ( + + + + id + + , + containerId + + , + 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 +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          cfg + - YAHOO.util.Config +

          +
          +
          + The Config object used to hold the configuration variables for the CalendarGroup +
          +
          + + + + +
          +

          containerId + - String +

          +
          +
          + The unique id associated with the CalendarGroup container +
          +
          + + + + +
          +

          id + - String +

          +
          +
          + The unique id associated with the CalendarGroup +
          +
          + + + + +
          +

          Locale + - Object +

          +
          +
          + The local object which contains the CalendarGroup's locale settings +
          +
          + + + + +
          +

          oDomContainer + - HTMLElement +

          +
          +
          + The outer containing element for the CalendarGroup +
          +
          + + + + +
          +

          Options + - Object +

          +
          +
          + The local object which contains the CalendarGroup's options +
          +
          + + + + +
          +

          pages + - YAHOO.widget.Calendar[] +

          +
          +
          + The collection of Calendar pages contained within the CalendarGroup +
          +
          + + + + +
          +

          YAHOO.widget.CalendarGroup._DEFAULT_CONFIG + - private static final Object +

          +
          +
          + The set of default Config property keys and values for the CalendarGroup +
          +
          + + + + +
          +

          YAHOO.widget.CalendarGroup.CSS_2UPCLOSE + - static final String +

          +
          +
          + CSS class representing the close icon for the 2-up calendar +
          +
          + + + +
          + Deprecated: Along with Calendar.IMG_ROOT and NAV_ARROW_LEFT, NAV_ARROW_RIGHT configuration properties. +Calendar's Style.CSS_CLOSE property now represents the CSS class used to render the close icon +
          + +
          +

          YAHOO.widget.CalendarGroup.CSS_2UPTITLE + - static final String +

          +
          +
          + CSS class representing the title for the 2-up calendar +
          +
          + + + + +
          +

          YAHOO.widget.CalendarGroup.CSS_CONTAINER + - static final String +

          +
          +
          + CSS class representing the container for the calendar +
          +
          + + + + +
          +

          YAHOO.widget.CalendarGroup.CSS_MULTI_UP + - static final String +

          +
          +
          + CSS class representing the container for the calendar +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + _setMonthOnDate

          +
          + + private + + + void + _setMonthOnDate + ( + + + date + + + , + iMonth + + + ) + + +
          + Sets the month on a Date object, taking into account year rollover if the month is less than 0 or greater than 11. +The Date object passed in is modified. It should be cloned before passing it into this method if the original value needs to be maintained +
          + +
          + +
          +
          Parameters:
          +
          + date <Date> + The Date object on which to set the month index +
          +
          + iMonth <Number> + The month index to set +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + addMonthRenderer

          +
          + + + + + void + addMonthRenderer + ( + + + month + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + addMonths

          +
          + + + + + void + addMonths + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + addRenderer

          +
          + + + + + void + addRenderer + ( + + + sDates + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + addWeekdayRenderer

          +
          + + + + + void + addWeekdayRenderer + ( + + + weekday + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + addYears

          +
          + + + + + void + addYears + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + callChildFunction

          +
          + + + + + void + callChildFunction + ( + + + fnName + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + clear

          +
          + + + + + void + clear + ( + ) + + +
          + Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configPageDate

          +
          + + + + + void + configPageDate + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configPages

          +
          + + + + + void + configPages + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configSelected

          +
          + + + + + void + configSelected + ( + + + type + + + , + args + + + , + obj + + + ) + + +
          + The default Config handler for the CalendarGroup "selected" 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 +
          +
          +
          + +
          + +
          +
          +

          + constructChild

          +
          + + + + + YAHOO.widget.Calendar + constructChild + ( + + + id + + + , + containerId + + + , + 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
          +
          + +
          + +
          +
          +

          + delegateConfig

          +
          + + + + + void + delegateConfig + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + deselect

          +
          + + + + + Date[] + deselect + ( + + + 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.
          +
          + +
          + +
          +
          +

          + deselectAll

          +
          + + + + + Date[] + deselectAll + ( + ) + + +
          + Deselects all dates on the current calendar. +
          + +
          + + +
          +
          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.
          +
          + +
          + +
          +
          +

          + deselectCell

          +
          + + + + + Date[] + deselectCell + ( + + + cellIndex + + + ) + + +
          + Deselects dates in the CalendarGroup based on the cell index provided. This method is used to select cells without having to do a full render. The selected style is applied to the cells directly. +deselectCell will deselect the cell at the specified index on each displayed Calendar page. +
          + +
          + +
          +
          Parameters:
          +
          + cellIndex <Number> + The index of the cell to deselect. +
          +
          + +
          +
          Returns: + + Date[] +
          +
          Array of JavaScript Date objects representing all individual dates that are currently selected.
          +
          + +
          + +
          +
          +

          + getSelectedDates

          +
          + + + + + void + getSelectedDates + ( + ) + + +
          + Gets the list of currently selected dates from the calendar. +
          + +
          + + +
          +
          Returns: + + void +
          +
          An array of currently selected JavaScript Date objects.
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + id + + + , + containerId + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + initEvents

          +
          + + + + + void + initEvents + ( + ) + + +
          + Initializes CalendarGroup's built-in CustomEvents +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + nextMonth

          +
          + + + + + void + nextMonth + ( + ) + + +
          + Navigates to the next month page in the calendar widget. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + nextYear

          +
          + + + + + void + nextYear + ( + ) + + +
          + Navigates to the next year in the currently selected month in the calendar widget. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + previousMonth

          +
          + + + + + void + previousMonth + ( + ) + + +
          + Navigates to the previous month page in the calendar widget. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + previousYear

          +
          + + + + + void + previousYear + ( + ) + + +
          + Navigates to the previous year in the currently selected month in the calendar widget. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + render

          +
          + + + + + void + render + ( + ) + + +
          + Calls the render function of all child calendars within the group. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + renderFooter

          +
          + + + + + void + renderFooter + ( + ) + + +
          + Renders a footer for the 2-up calendar container. By default, this method is +unimplemented. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + renderHeader

          +
          + + + + + void + renderHeader + ( + ) + + +
          + Renders the header for the CalendarGroup. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + reset

          +
          + + + + + void + reset + ( + ) + + +
          + Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s). +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + select

          +
          + + + + + Date[] + select + ( + + + 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.
          +
          + +
          + +
          +
          +

          + selectCell

          +
          + + + + + Date[] + selectCell + ( + + + cellIndex + + + ) + + +
          + Selects dates in the CalendarGroup based on the cell index provided. This method is used to select cells without having to do a full render. The selected style is applied to the cells directly. +The value of the MULTI_SELECT Configuration attribute will determine the set of dates which get selected. +
            +
          • If MULTI_SELECT is false, selectCell will select the cell at the specified index for only the last displayed Calendar page.
          • +
          • If MULTI_SELECT is true, selectCell will select the cell at the specified index, on each displayed Calendar page.
          • +
          +
          + +
          + +
          +
          Parameters:
          +
          + cellIndex <Number> + The index of the cell to be selected. +
          +
          + +
          +
          Returns: + + Date[] +
          +
          Array of JavaScript Date objects representing all individual dates that are currently selected.
          +
          + +
          + +
          +
          +

          + setChildFunction

          +
          + + + + + void + setChildFunction + ( + + + fnName + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + setMonth

          +
          + + + + + void + setMonth + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + setYear

          +
          + + + + + void + setYear + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + sub

          +
          + + private + + + void + sub + ( + + + fn + + + , + obj + + + , + bOverride + + + ) + + +
          + Proxy subscriber to subscribe to the CalendarGroup's child Calendars' CustomEvents +
          + +
          + +
          +
          Parameters:
          +
          + fn <Function> + The function to subscribe to this CustomEvent +
          +
          + obj <Object> + The CustomEvent's scope object +
          +
          + bOverride <Boolean> + Whether or not to apply scope correction +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + subtractMonths

          +
          + + + + + void + subtractMonths + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + subtractYears

          +
          + + + + + void + subtractYears + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a string representation of the object. +
          + +
          + + +
          +
          Returns: + + String +
          +
          A string representation of the CalendarGroup object.
          +
          + +
          + +
          +
          +

          + unsub

          +
          + + private + + + void + unsub + ( + + + fn + + + , + obj + + + ) + + +
          + Proxy unsubscriber to unsubscribe from the CalendarGroup's child Calendars' CustomEvents +
          + +
          + +
          +
          Parameters:
          +
          + fn <Function> + The function to subscribe to this CustomEvent +
          +
          + obj <Object> + The CustomEvent's scope object +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + + +
          +

          Events

          +
          +

          + beforeDeselectEvent

          +
          + + + + + beforeDeselectEvent + + ( + ) + + + +
          + Fired before a selection is made +
          + +
          + + + + +
          + +
          +
          +

          + beforeRenderEvent

          +
          + + + + + beforeRenderEvent + + ( + ) + + + +
          + Fired before the Calendar is rendered +
          + +
          + + + + +
          + +
          +
          +

          + beforeSelectEvent

          +
          + + + + + beforeSelectEvent + + ( + ) + + + +
          + Fired before a selection is made +
          + +
          + + + + +
          + +
          +
          +

          + changePageEvent

          +
          + + + + + changePageEvent + + ( + ) + + + +
          + Fired when the Calendar page is changed +
          + +
          + + + + +
          + +
          +
          +

          + clearEvent

          +
          + + + + + clearEvent + + ( + ) + + + +
          + Fired when the Calendar is cleared +
          + +
          + + + + +
          + +
          +
          +

          + deselectEvent

          +
          + + + + + deselectEvent + + ( + + + Array + + + ) + + + +
          + Fired when a selection is made +
          + +
          + + +
          +
          Parameters:
          +
          + Array <Array> + of Date field arrays in the format [YYYY, MM, DD]. +
          +
          + + +
          + +
          +
          +

          + renderEvent

          +
          + + + + + renderEvent + + ( + ) + + + +
          + Fired when the Calendar is rendered +
          + +
          + + + + +
          + +
          +
          +

          + resetEvent

          +
          + + + + + resetEvent + + ( + ) + + + +
          + Fired when the Calendar is reset +
          + +
          + + + + +
          + +
          +
          +

          + selectEvent

          +
          + + + + + selectEvent + + ( + + + Array + + + ) + + + +
          + Fired when a selection is made +
          + +
          + + +
          +
          Parameters:
          +
          + Array <Array> + of Date field arrays in the format [YYYY, MM, DD]. +
          +
          + + +
          + +
          +
          +
          +
          + + + +
          +

          Configuration Attributes

          +
          +

          close + - Boolean +

          +
          +
          + Whether or not a close button should be displayed for this CalendarGroup +
          +
          + + +
          + Default Value: false +
          + +
          +

          DATE_DELIMITER + - String +

          +
          +
          + The value used to delimit individual dates in a date string passed to various Calendar functions. +
          +
          + + +
          + Default Value: "," +
          + +
          +

          DATE_FIELD_DELIMITER + - String +

          +
          +
          + The value used to delimit date fields in a date string passed to various Calendar functions. +
          +
          + + +
          + Default Value: "/" +
          + +
          +

          DATE_RANGE_DELIMITER + - String +

          +
          +
          + The value used to delimit date ranges in a date string passed to various Calendar functions. +
          +
          + + +
          + Default Value: "-" +
          + +
          +

          HIDE_BLANK_WEEKS + - Boolean +

          +
          +
          + True if the Calendar should suppress weeks that are not a part of the current month. False by default. +
          +
          + + +
          + Default Value: false +
          + +
          +

          iframe + - Boolean +

          +
          +
          + 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. +
          +
          + + +
          + Default Value: true +
          + +
          +

          LOCALE_MONTHS + - String +

          +
          +
          + The setting that determines which length of month labels should be used. Possible values are "short" and "long". +
          +
          + + +
          + Default Value: "long" +
          + +
          +

          LOCALE_WEEKDAYS + - String +

          +
          +
          + The setting that determines which length of weekday labels should be used. Possible values are "1char", "short", "medium", and "long". +
          +
          + + +
          + Default Value: "short" +
          + +
          +

          maxdate + - String +

          +
          +
          + The maximum selectable date in the current Calendar (mm/dd/yyyy) +
          +
          + + +
          + Default Value: null +
          + +
          +

          MD_DAY_POSITION + - Number +

          +
          +
          + The position of the day in a month/year date string +
          +
          + + +
          + Default Value: 2 +
          + +
          +

          MD_MONTH_POSITION + - Number +

          +
          +
          + The position of the month in a month/day date string +
          +
          + + +
          + Default Value: 1 +
          + +
          +

          MDY_DAY_POSITION + - Number +

          +
          +
          + The position of the day in a month/day/year date string +
          +
          + + +
          + Default Value: 2 +
          + +
          +

          MDY_MONTH_POSITION + - Number +

          +
          +
          + The position of the month in a month/day/year date string +
          +
          + + +
          + Default Value: 1 +
          + +
          +

          MDY_YEAR_POSITION + - Number +

          +
          +
          + The position of the year in a month/day/year date string +
          +
          + + +
          + Default Value: 3 +
          + +
          +

          mindate + - String +

          +
          +
          + The minimum selectable date in the current Calendar (mm/dd/yyyy) +
          +
          + + +
          + Default Value: null +
          + +
          +

          MONTHS_LONG + - String[] +

          +
          +
          + The long month labels for the current locale. +
          +
          + + +
          + Default Value: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" +
          + +
          +

          MONTHS_SHORT + - String[] +

          +
          +
          + The short month labels for the current locale. +
          +
          + + +
          + Default Value: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] +
          + +
          +

          MULTI_SELECT + - Boolean +

          +
          +
          + True if the Calendar should allow multiple selections. False by default. +
          +
          + + +
          + Default Value: false +
          + +
          +

          MY_MONTH_POSITION + - Number +

          +
          +
          + The position of the month in a month/year date string +
          +
          + + +
          + Default Value: 1 +
          + +
          +

          MY_YEAR_POSITION + - Number +

          +
          +
          + The position of the year in a month/year date string +
          +
          + + +
          + Default Value: 2 +
          + +
          +

          NAV_ARROW_LEFT + - String +

          +
          +
          + The image that should be used for the left navigation arrow. +
          +
          + +
          + DeprecatedYou can customize the image by overriding the default CSS class for the left arrow - "calnavleft" +
          + +
          + Default Value: null +
          + +
          +

          NAV_ARROW_RIGHT + - String +

          +
          +
          + The image that should be used for the right navigation arrow. +
          +
          + +
          + DeprecatedYou can customize the image by overriding the default CSS class for the right arrow - "calnavright" +
          + +
          + Default Value: null +
          + +
          +

          pagedate + - String +

          +
          +
          + The month/year representing the current visible Calendar date (mm/yyyy) +
          +
          + + +
          + Default Value: today's date +
          + +
          +

          pages + - Number +

          +
          +
          + The number of pages to include in the CalendarGroup. This value can only be set once, in the CalendarGroup's constructor arguments. +
          +
          + + +
          + Default Value: 2 +
          + +
          +

          selected + - String +

          +
          +
          + The date or range of dates representing the current Calendar selection +
          +
          + + +
          + Default Value: [] +
          + +
          +

          SHOW_WEEK_FOOTER + - Boolean +

          +
          +
          + True if the Calendar should show week row footers. False by default. +
          +
          + + +
          + Default Value: false +
          + +
          +

          SHOW_WEEK_HEADER + - Boolean +

          +
          +
          + True if the Calendar should show week row headers. False by default. +
          +
          + + +
          + Default Value: false +
          + +
          +

          SHOW_WEEKDAYS + - Boolean +

          +
          +
          + True if the Calendar should show weekday labels. True by default. +
          +
          + + +
          + Default Value: true +
          + +
          +

          START_WEEKDAY + - number +

          +
          +
          + The weekday the week begins on. Default is 0 (Sunday). +
          +
          + + +
          + Default Value: 0 +
          + +
          +

          title + - String +

          +
          +
          + The title to display above the CalendarGroup's month header +
          +
          + + +
          + Default Value: "" +
          + +
          +

          WEEKDAYS_1CHAR + - String[] +

          +
          +
          + The 1-character weekday labels for the current locale. +
          +
          + + +
          + Default Value: ["S", "M", "T", "W", "T", "F", "S"] +
          + +
          +

          WEEKDAYS_LONG + - String[] +

          +
          +
          + The long weekday labels for the current locale. +
          +
          + + +
          + Default Value: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] +
          + +
          +

          WEEKDAYS_MEDIUM + - String[] +

          +
          +
          + The medium weekday labels for the current locale. +
          +
          + + +
          + Default Value: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] +
          + +
          +

          WEEKDAYS_SHORT + - String[] +

          +
          +
          + The short weekday labels for the current locale. +
          +
          + + +
          + Default Value: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"] +
          + +
          + +
          +
          + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.Calendar_Core.html b/www/extras/yui/docs/YAHOO.widget.Calendar_Core.html new file mode 100644 index 000000000..e8d737686 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.Calendar_Core.html @@ -0,0 +1,351 @@ + + + + API: calendar YAHOO.widget.Calendar_Core (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Calendar  2.2.2

          +

          + Yahoo! UI Library + > calendar + > YAHOO.widget.Calendar_Core + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.Calendar_Core + + - extends YAHOO.widget.Calendar + + + + + + +

          + + + +
          Deprecated:The old Calendar_Core class is no longer necessary.
          + + +
          + +
          + + + + + + +
          +

          Methods inherited from YAHOO.widget.Calendar:

          + +
          + + + + + + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.ContainerEffect.html b/www/extras/yui/docs/YAHOO.widget.ContainerEffect.html new file mode 100644 index 000000000..deea0e731 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.ContainerEffect.html @@ -0,0 +1,947 @@ + + + + API: container YAHOO.widget.ContainerEffect (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + > YAHOO.widget.ContainerEffect + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.ContainerEffect + + + + + + + +

          + + + + + +
          + ContainerEffect encapsulates animation transitions that are executed when an Overlay is shown or hidden. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.ContainerEffect + + ( + + + + overlay + + , + attrIn + + , + attrOut + + , + targetElement + + , + 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. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          animClass + - class +

          +
          +
          + The animation class to use for animating the overlay +
          +
          + + + + +
          +

          attrIn + - Object +

          +
          +
          + The animation attributes to use when transitioning into view +
          +
          + + + + +
          +

          attrOut + - Object +

          +
          +
          + The animation attributes to use when transitioning out of view +
          +
          + + + + +
          +

          overlay + - YAHOO.widget.Overlay +

          +
          +
          + The overlay to animate +
          +
          + + + + +
          +

          targetElement + - HTMLElement +

          +
          +
          + The target element to be animated +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + animateIn

          +
          + + + + + void + animateIn + ( + ) + + +
          + Triggers the in-animation. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + animateOut

          +
          + + + + + void + animateOut + ( + ) + + +
          + Triggers the out-animation. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + FADE

          +
          + + + static + + ContainerEffect + FADE + ( + + + overlay + + + , + dur + + + ) + + +
          + A pre-configured ContainerEffect instance that can be used for fading an overlay in and out. +
          + +
          + +
          +
          Parameters:
          +
          + overlay <Overlay> + The Overlay object to animate +
          +
          + dur <Number> + The duration of the animation +
          +
          + +
          +
          Returns: + + ContainerEffect +
          +
          The configured ContainerEffect object
          +
          + +
          + +
          +
          +

          + handleCompleteAnimateIn

          +
          + + + + + void + handleCompleteAnimateIn + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + handleCompleteAnimateOut

          +
          + + + + + void + handleCompleteAnimateOut + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + handleStartAnimateIn

          +
          + + + + + void + handleStartAnimateIn + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + handleStartAnimateOut

          +
          + + + + + void + handleStartAnimateOut + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + handleTweenAnimateIn

          +
          + + + + + void + handleTweenAnimateIn + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + handleTweenAnimateOut

          +
          + + + + + void + handleTweenAnimateOut + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + ) + + +
          + Initializes the animation classes and events. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + SLIDE

          +
          + + + static + + ContainerEffect + SLIDE + ( + + + overlay + + + , + dur + + + ) + + +
          + A pre-configured ContainerEffect instance that can be used for sliding an overlay in and out. +
          + +
          + +
          +
          Parameters:
          +
          + overlay <Overlay> + The Overlay object to animate +
          +
          + dur <Number> + The duration of the animation +
          +
          + +
          +
          Returns: + + ContainerEffect +
          +
          The configured ContainerEffect object
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a string representation of the object. +
          + +
          + + +
          +
          Returns: + + String +
          +
          The string representation of the ContainerEffect
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.ContextMenu.html b/www/extras/yui/docs/YAHOO.widget.ContextMenu.html new file mode 100644 index 000000000..b002c528a --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.ContextMenu.html @@ -0,0 +1,1205 @@ + + + + API: menu YAHOO.widget.ContextMenu (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Menu  2.2.2

          +

          + Yahoo! UI Library + > menu + > YAHOO.widget.ContextMenu + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.ContextMenu + + - extends YAHOO.widget.Menu + + + + + + +

          + + + + + +
          + Creates a list of options or commands which are made visible in response to +an HTML element's "contextmenu" event ("mousedown" for Opera). +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.ContextMenu + + ( + + + + p_oElement + + + + + , + p_oConfig + ) + +
          +
          +
          Parameters:
          +
          + p_oElement + <String> + + String specifying the id attribute of the +<div> element of the context menu. +
          +
          + p_oElement + <String> + + String specifying the id attribute of the +<select> element to be used as the data source for the +context menu. +
          +
          + p_oElement + <HTMLDivElement> + + Object specifying the +<div> element of the context menu. +
          +
          + p_oElement + <HTMLSelectElement> + + Object specifying +the <select> element to be used as the data source for +the context menu. +
          +
          + p_oConfig + <Object> + + Optional. Object literal specifying the +configuration for the context menu. See configuration class documentation +for more details. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _bCancelled + - private Boolean +

          +
          +
          + Boolean indicating if the display of the context menu should +be cancelled. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          _oTrigger + - private String|HTMLElement|Array +

          +
          +
          + Object reference to the current value of the "trigger" +configuration property. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          contextEventTarget + - HTMLElement +

          +
          +
          + 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 Value: null +
          + + +
          +

          YAHOO.widget.ContextMenu._DEFAULT_CONFIG + - private final Object +

          +
          +
          + Constant representing the ContextMenu's configuration properties +
          +
          + + + + +
          +

          YAHOO.widget.ContextMenu._EVENT_TYPES + - private final Object +

          +
          +
          + Constant representing the name of the ContextMenu's events +
          +
          + + + + +
          + + +
          +
          + + + + + +
          +

          Methods

          +
          +

          + _onTriggerClick

          +
          + + private + + + void + _onTriggerClick + ( + + + p_oEvent + + + , + p_oMenu + + + ) + + +
          + "click" event handler for the HTML element(s) identified as the +"trigger" for the context menu. Used to cancel default behaviors in Opera. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed back +by the event utility (YAHOO.util.Event). +
          +
          + p_oMenu <YAHOO.widget.ContextMenu> + Object representing the context +menu that is handling the event. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onTriggerContextMenu

          +
          + + private + + + void + _onTriggerContextMenu + ( + + + p_oEvent + + + , + p_oMenu + + + ) + + +
          + "contextmenu" event handler ("mousedown" for Opera) for the HTML +element(s) that trigger the display of the context menu. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed back +by the event utility (YAHOO.util.Event). +
          +
          + p_oMenu <YAHOO.widget.ContextMenu> + Object representing the context +menu that is handling the event. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _removeEventHandlers

          +
          + + private + + + void + _removeEventHandlers + ( + ) + + +
          + 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. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + cancel

          +
          + + + + + void + cancel + ( + ) + + +
          + Cancels the display of the context menu. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configTrigger

          +
          + + + + + void + configTrigger + ( + + + p_sType + + + , + p_aArgs + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + destroy

          +
          + + + + + void + destroy + ( + ) + + +
          + Removes the context menu's <div> element +(and accompanying child nodes) from the document. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + p_oElement + + + + + + + + + , + p_oConfig + + + ) + + +
          + 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. +
          + +
          + +
          +
          Parameters:
          +
          + p_oElement <String> + String specifying the id attribute of the +<div> element of the context menu. +
          +
          + p_oElement <String> + String specifying the id attribute of the +<select> element to be used as the data source for +the context menu. +
          +
          + p_oElement <HTMLDivElement> + Object specifying the +<div> element of the context menu. +
          +
          + p_oElement <HTMLSelectElement> + Object specifying +the <select> element to be used as the data source for +the context menu. +
          +
          + p_oConfig <Object> + Optional. Object literal specifying the +configuration for the context menu. See configuration class documentation +for more details. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initDefaultConfig

          +
          + + + + + void + initDefaultConfig + ( + ) + + +
          + Initializes the class's configurable properties which can be +changed using the context menu's Config object ("cfg"). +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initEvents

          +
          + + + + + void + initEvents + ( + ) + + +
          + Initializes the custom events for the context menu. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a string representing the context menu. +
          + +
          + + +
          +
          Returns: + + String +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + +
          +

          Events

          +
          +

          + triggerContextMenuEvent

          +
          + + + + + triggerContextMenuEvent + + ( + ) + + + +
          + Custom Event wrapper for the "contextmenu" DOM event +("mousedown" for Opera) fired by the element(s) that trigger the display of +the context menu. +
          + +
          + + + + +
          + +
          +
          +
          +
          + + + + + + +
          +

          Configuration Attributes

          +
          +

          trigger + - String|HTMLElement|Array +

          +
          +
          + 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 Value: null +
          + +
          + +
          +
          + +
          +

          Configuration attributes inherited from YAHOO.widget.Overlay:

          +
          + + + constraintoviewport, + context, + fixedcenter, + height, + iframe, + width, + x, + xy, + y, + zIndex + +
          +
          +
          +

          Configuration attributes inherited from YAHOO.widget.Module:

          +
          + + + effect, + monitorresize, + visible + +
          +
          + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.ContextMenuItem.html b/www/extras/yui/docs/YAHOO.widget.ContextMenuItem.html new file mode 100644 index 000000000..e8afe1137 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.ContextMenuItem.html @@ -0,0 +1,453 @@ + + + + API: menu YAHOO.widget.ContextMenuItem (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Menu  2.2.2

          +

          + Yahoo! UI Library + > menu + > YAHOO.widget.ContextMenuItem + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.ContextMenuItem + + - extends YAHOO.widget.MenuItem + + + + + + +

          + + + + + +
          + Creates an item for a context menu. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.ContextMenuItem + + ( + + + + p_oObject + + + + + , + p_oConfig + ) + +
          +
          +
          Parameters:
          +
          + p_oObject + <String> + + String specifying the text of the context menu item. +
          +
          + p_oObject + <HTMLLIElement> + + Object specifying the +<li> element of the context menu item. +
          +
          + p_oObject + <HTMLOptGroupElement> + + Object +specifying the <optgroup> element of the context +menu item. +
          +
          + p_oObject + <HTMLOptionElement> + + 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. +
          +
          + + +
          +
          +
          +
          + + + + +
          +

          Methods

          +
          +

          + init

          +
          + + + + + void + init + ( + + + p_oObject + + + + + + + + + , + p_oConfig + + + ) + + +
          + 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. +
          + +
          + +
          +
          Parameters:
          +
          + p_oObject <String> + String specifying the text of the context menu item. +
          +
          + p_oObject <HTMLLIElement> + Object specifying the +<li> element of the context menu item. +
          +
          + p_oObject <HTMLOptGroupElement> + Object +specifying the <optgroup> element of the context +menu item. +
          +
          + p_oObject <HTMLOptionElement> + 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 +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a string representing the context menu item. +
          + +
          + + +
          +
          Returns: + + String +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + + + + +
          +

          Configuration attributes inherited from YAHOO.widget.MenuItem:

          + +
          + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.DS_JSArray.html b/www/extras/yui/docs/YAHOO.widget.DS_JSArray.html new file mode 100644 index 000000000..d70df302b --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.DS_JSArray.html @@ -0,0 +1,326 @@ + + + + API: autocomplete YAHOO.widget.DS_JSArray (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          AutoComplete Widget  2.2.2

          +

          + Yahoo! UI Library + > autocomplete + > YAHOO.widget.DS_JSArray + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.DS_JSArray + + - extends YAHOO.widget.DataSource + + + + + + +

          + + + + + +
          + Implementation of YAHOO.widget.DataSource using a native Javascript array as +its live data source. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.DS_JSArray + + ( + + + + aData + + , + oConfigs + ) + +
          +
          +
          Parameters:
          +
          + aData + <String[]> + + In-memory Javascript array of simple string data. +
          +
          + oConfigs + <Object> + + (optional) Object literal of config params. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          data + - Array +

          +
          +
          + In-memory Javascript array of strings. +
          +
          + + + + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.widget.DataSource:

          + +
          + +
          +

          Methods

          +
          +

          + doQuery

          +
          + + + + + void + doQuery + ( + + + oCallbackFn + + + , + sQuery + + + , + oParent + + + ) + + +
          + Queries the live data source defined by data for results. Results are passed +back to a callback function. +
          + +
          + +
          +
          Parameters:
          +
          + oCallbackFn <HTMLFunction> + Callback function defined by oParent object to which to return results. +
          +
          + sQuery <String> + Query string. +
          +
          + oParent <Object> + The object instance that has requested data. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + +
          +

          Methods inherited from YAHOO.widget.DataSource:

          + +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.DS_JSFunction.html b/www/extras/yui/docs/YAHOO.widget.DS_JSFunction.html new file mode 100644 index 000000000..52778c67a --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.DS_JSFunction.html @@ -0,0 +1,326 @@ + + + + API: autocomplete YAHOO.widget.DS_JSFunction (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          AutoComplete Widget  2.2.2

          +

          + Yahoo! UI Library + > autocomplete + > YAHOO.widget.DS_JSFunction + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.DS_JSFunction + + - extends YAHOO.widget.DataSource + + + + + + +

          + + + + + +
          + Implementation of YAHOO.widget.DataSource using a native Javascript function as +its live data source. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.DS_JSFunction + + ( + + + + oFunction + + , + oConfigs + ) + +
          +
          +
          Parameters:
          +
          + oFunction + <HTMLFunction> + + In-memory Javascript function that returns query results as an array of objects. +
          +
          + oConfigs + <Object> + + (optional) Object literal of config params. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          dataFunction + - HTMLFunction +

          +
          +
          + In-memory Javascript function that returns query results. +
          +
          + + + + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.widget.DataSource:

          + +
          + +
          +

          Methods

          +
          +

          + doQuery

          +
          + + + + + void + doQuery + ( + + + oCallbackFn + + + , + sQuery + + + , + oParent + + + ) + + +
          + Queries the live data source defined by function for results. Results are +passed back to a callback function. +
          + +
          + +
          +
          Parameters:
          +
          + oCallbackFn <HTMLFunction> + Callback function defined by oParent object to which to return results. +
          +
          + sQuery <String> + Query string. +
          +
          + oParent <Object> + The object instance that has requested data. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + +
          +

          Methods inherited from YAHOO.widget.DataSource:

          + +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.DS_XHR.html b/www/extras/yui/docs/YAHOO.widget.DS_XHR.html new file mode 100644 index 000000000..394450492 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.DS_XHR.html @@ -0,0 +1,605 @@ + + + + API: autocomplete YAHOO.widget.DS_XHR (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          AutoComplete Widget  2.2.2

          +

          + Yahoo! UI Library + > autocomplete + > YAHOO.widget.DS_XHR + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.DS_XHR + + - extends YAHOO.widget.DataSource + + + + + + +

          + + + + + +
          + Implementation of YAHOO.widget.DataSource using XML HTTP requests that return +query results. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.DS_XHR + + ( + + + + sScriptURI + + , + aSchema + + , + oConfigs + ) + +
          +
          +
          Parameters:
          +
          + sScriptURI + <String> + + Absolute or relative URI to script that returns query +results as JSON, XML, or delimited flat-file data. +
          +
          + aSchema + <String[]> + + Data schema definition of results. +
          +
          + oConfigs + <Object> + + (optional) Object literal of config params. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _oConn + - private Object +

          +
          +
          + XHR connection object. +
          +
          + + + + +
          +

          connMgr + - Object +

          +
          +
          + Alias to YUI Connection Manager. Allows implementers to specify their own +subclasses of the YUI Connection Manager utility. +
          +
          + + +
          + Default Value: YAHOO.util.Connect +
          + + +
          +

          connTimeout + - Number +

          +
          +
          + 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. +
          +
          + + +
          + Default Value: 0 +
          + + +
          +

          ERROR_DATAXHR + - static final String +

          +
          +
          + Error message for XHR failure. +
          +
          + + + + +
          +

          responseStripAfter + - String +

          +
          +
          + 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. +
          +
          + + +
          + Default Value: "\n<!-" +
          + + +
          +

          responseType + - String +

          +
          +
          + XHR response data type. Other types that may be defined are YAHOO.widget.DS_XHR.TYPE_XML +and YAHOO.widget.DS_XHR.TYPE_FLAT. +
          +
          + + +
          + Default Value: YAHOO.widget.DS_XHR.TYPE_JSON +
          + + +
          +

          scriptQueryAppend + - String +

          +
          +
          + 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> +
          +
          + + +
          + Default Value: "" +
          + + +
          +

          scriptQueryParam + - String +

          +
          +
          + Query string parameter name sent to scriptURI. For instance, queries will be +sent to <scriptURI>?<scriptQueryParam>=userinput +
          +
          + + +
          + Default Value: "query" +
          + + +
          +

          scriptURI + - String +

          +
          +
          + Absolute or relative URI to script that returns query results. For instance, +queries will be sent to <scriptURI>?<scriptQueryParam>=userinput +
          +
          + + + + +
          +

          TYPE_FLAT + - static final Number +

          +
          +
          + Flat-file data type. +
          +
          + + + + +
          +

          TYPE_JSON + - static final Number +

          +
          +
          + JSON data type. +
          +
          + + + + +
          +

          TYPE_XML + - static final Number +

          +
          +
          + XML data type. +
          +
          + + + + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.widget.DataSource:

          + +
          + +
          +

          Methods

          +
          +

          + doQuery

          +
          + + + + + void + doQuery + ( + + + oCallbackFn + + + , + sQuery + + + , + oParent + + + ) + + +
          + Queries the live data source defined by scriptURI for results. Results are +passed back to a callback function. +
          + +
          + +
          +
          Parameters:
          +
          + oCallbackFn <HTMLFunction> + Callback function defined by oParent object to which to return results. +
          +
          + sQuery <String> + Query string. +
          +
          + oParent <Object> + The object instance that has requested data. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + parseResponse

          +
          + + + + + void + parseResponse + ( + + + sQuery + + + , + oResponse + + + , + oParent + + + ) + + +
          + 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:
          +
          + sQuery <String> + Query string. +
          +
          + oResponse <Object> + The raw response data to parse. +
          +
          + oParent <Object> + The object instance that has requested data. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + +
          +

          Methods inherited from YAHOO.widget.DataSource:

          + +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.DataSource.html b/www/extras/yui/docs/YAHOO.widget.DataSource.html new file mode 100644 index 000000000..a004779d6 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.DataSource.html @@ -0,0 +1,1074 @@ + + + + API: autocomplete YAHOO.widget.DataSource (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          AutoComplete Widget  2.2.2

          +

          + Yahoo! UI Library + > autocomplete + > YAHOO.widget.DataSource + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.DataSource + + + + + + + +

          + + +
          +
          Known Subclasses: +
          + YAHOO.widget.DS_JSFunction + YAHOO.widget.DS_XHR + YAHOO.widget.DS_JSArray +
          +
          + + + +
          + 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. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.DataSource + + ( + ) + +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _aCache + - private Object[] +

          +
          +
          + Local cache of data result objects indexed chronologically. +
          +
          + + + + +
          +

          _nIndex + - private static Number +

          +
          +
          + Internal class variable to index multiple DataSource instances. +
          +
          + + + + +
          +

          _sName + - private String +

          +
          +
          + Name of DataSource instance. +
          +
          + + + + +
          +

          ERROR_DATANULL + - static final String +

          +
          +
          + Error message for null data responses. +
          +
          + + + + +
          +

          ERROR_DATAPARSE + - static final String +

          +
          +
          + Error message for data responses with parsing errors. +
          +
          + + + + +
          +

          maxCacheEntries + - Number +

          +
          +
          + 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. +
          +
          + + +
          + Default Value: 15 +
          + + +
          +

          queryMatchCase + - Boolean +

          +
          +
          + Enables case-sensitivity in the matching algorithm used against JS Array +types of DataSources and DataSource caches. If queryMatchCase is true, only +case-sensitive matches will return. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          queryMatchContains + - Boolean +

          +
          +
          + Use this to fine-tune the matching algorithm used against JS Array types of +DataSource and DataSource caches. If queryMatchContains is true, then the JS +Array or cache returns results that "contain" the query string. By default, +queryMatchContains is set to false, so that only results that "start with" +the query string are returned. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          queryMatchSubset + - Boolean +

          +
          +
          + 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. +
          +
          + + +
          + Default Value: false +
          + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + _addCacheElem

          +
          + + private + + + void + _addCacheElem + ( + + + oResult + + + ) + + +
          + 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. +
          + +
          + +
          +
          Parameters:
          +
          + oResult <Object> + Data result object, including array of results. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _doQueryCache

          +
          + + private + + + Object[] + _doQueryCache + ( + + + oCallbackFn + + + , + sQuery + + + , + oParent + + + ) + + +
          + 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. +
          + +
          + +
          +
          Parameters:
          +
          + oCallbackFn <HTMLFunction> + Callback function defined by oParent object to which to return results. +
          +
          + sQuery <String> + Query string. +
          +
          + oParent <Object> + The object instance that has requested data. +
          +
          + +
          +
          Returns: + + Object[] +
          +
          aResults Array of results from local cache if found, otherwise null.
          +
          + +
          + +
          +
          +

          + _init

          +
          + + private + + + void + _init + ( + ) + + +
          + Initializes DataSource instance. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + doQuery

          +
          + + + + + void + 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). +
          + +
          + +
          +
          Parameters:
          +
          + oCallbackFn <HTMLFunction> + Callback function implemented by oParent to which to return results. +
          +
          + sQuery <String> + Query string. +
          +
          + oParent <Object> + The object instance that has requested data. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + flushCache

          +
          + + + + + void + flushCache + ( + ) + + +
          + Flushes cache. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getResults

          +
          + + + + + void + getResults + ( + + + oCallbackFn + + + , + sQuery + + + , + oParent + + + ) + + +
          + 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:
          +
          + oCallbackFn <HTMLFunction> + Callback function defined by oParent object to which to return results. +
          +
          + sQuery <String> + Query string. +
          +
          + oParent <Object> + The object instance that has requested data. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Public accessor to the unique name of the DataSource instance. +
          + +
          + + +
          +
          Returns: + + String +
          +
          Unique name of the DataSource instance
          +
          + +
          + +
          +
          +
          +
          + + +
          +

          Events

          +
          +

          + cacheFlushEvent

          +
          + + + + + cacheFlushEvent + + ( + + + oSelf + + + ) + + + +
          + Fired when the local cache is flushed. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <Object> + The DataSource instance +
          +
          + + +
          + +
          +
          +

          + cacheQueryEvent

          +
          + + + + + cacheQueryEvent + + ( + + + oSelf + + + , + oParent + + + , + sQuery + + + ) + + + +
          + Fired when a query is made to the local cache. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <Object> + The DataSource instance. +
          +
          + oParent <Object> + The requesting object. +
          +
          + sQuery <String> + The query string. +
          +
          + + +
          + +
          +
          +

          + dataErrorEvent

          +
          + + + + + dataErrorEvent + + ( + + + oSelf + + + , + oParent + + + , + sQuery + + + , + sMsg + + + ) + + + +
          + Fired when an error is encountered with the live data source. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <Object> + The DataSource instance. +
          +
          + oParent <Object> + The requesting object. +
          +
          + sQuery <String> + The query string. +
          +
          + sMsg <String> + Error message string +
          +
          + + +
          + +
          +
          +

          + getCachedResultsEvent

          +
          + + + + + getCachedResultsEvent + + ( + + + oSelf + + + , + oParent + + + , + sQuery + + + , + aResults + + + ) + + + +
          + Fired when data is retrieved from the local cache. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <Object> + The DataSource instance. +
          +
          + oParent <Object> + The requesting object. +
          +
          + sQuery <String> + The query string. +
          +
          + aResults <Object[]> + Array of result objects. +
          +
          + + +
          + +
          +
          +

          + getResultsEvent

          +
          + + + + + getResultsEvent + + ( + + + oSelf + + + , + oParent + + + , + sQuery + + + , + aResults + + + ) + + + +
          + Fired when data is retrieved from the live data source. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <Object> + The DataSource instance. +
          +
          + oParent <Object> + The requesting object. +
          +
          + sQuery <String> + The query string. +
          +
          + aResults <Object[]> + Array of result objects. +
          +
          + + +
          + +
          +
          +

          + queryEvent

          +
          + + + + + queryEvent + + ( + + + oSelf + + + , + oParent + + + , + sQuery + + + ) + + + +
          + Fired when a query is made to the live data source. +
          + +
          + + +
          +
          Parameters:
          +
          + oSelf <Object> + The DataSource instance. +
          +
          + oParent <Object> + The requesting object. +
          +
          + sQuery <String> + The query string. +
          +
          + + +
          + +
          +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.DateMath.html b/www/extras/yui/docs/YAHOO.widget.DateMath.html new file mode 100644 index 000000000..841c53722 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.DateMath.html @@ -0,0 +1,951 @@ + + + + API: calendar YAHOO.widget.DateMath (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Calendar  2.2.2

          +

          + Yahoo! UI Library + > calendar + > YAHOO.widget.DateMath + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.DateMath + + + + + + + +

          + + + + + +
          + YAHOO.widget.DateMath is used for simple date manipulation. The class is a static utility +used for adding, subtracting, and comparing dates. +
          + + +
          +

          Properties

          +
          +

          DAY + - static final String +

          +
          +
          + Constant field representing Day +
          +
          + + + + +
          +

          MONTH + - static final String +

          +
          +
          + Constant field representing Month +
          +
          + + + + +
          +

          ONE_DAY_MS + - static final Number +

          +
          +
          + Constant field representing one day, in milliseconds +
          +
          + + + + +
          +

          WEEK + - static final String +

          +
          +
          + Constant field representing Week +
          +
          + + + + +
          +

          YEAR + - static final String +

          +
          +
          + Constant field representing Year +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + add

          +
          + + + + + Date + add + ( + + + date + + + , + field + + + , + 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
          +
          + +
          + +
          +
          +

          + after

          +
          + + + + + Boolean + after + ( + + + 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.
          +
          + +
          + +
          +
          +

          + before

          +
          + + + + + Boolean + before + ( + + + 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.
          +
          + +
          + +
          +
          +

          + between

          +
          + + + + + Boolean + between + ( + + + date + + + , + dateBegin + + + , + 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.
          +
          + +
          + +
          +
          +

          + clearTime

          +
          + + + + + Date + clearTime + ( + + + date + + + ) + + +
          + Clears the time fields from a given date, effectively setting the time to 12 noon. +
          + +
          + +
          +
          Parameters:
          +
          + date <Date> + The JavaScript Date for which the time fields will be cleared +
          +
          + +
          +
          Returns: + + Date +
          +
          The JavaScript Date cleared of all time fields
          +
          + +
          + +
          +
          +

          + findMonthEnd

          +
          + + + + + Date + findMonthEnd + ( + + + 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
          +
          + +
          + +
          +
          +

          + findMonthStart

          +
          + + + + + Date + findMonthStart + ( + + + 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
          +
          + +
          + +
          +
          +

          + getDayOffset

          +
          + + + + + Number + getDayOffset + ( + + + date + + + , + 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
          +
          + +
          + +
          +
          +

          + getJan1

          +
          + + + + + Date + getJan1 + ( + + + 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.
          +
          + +
          + +
          +
          +

          + getWeekNumber

          +
          + + + + + Number + getWeekNumber + ( + + + date + + + , + calendarYear + + + , + 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.
          +
          + +
          + +
          +
          +

          + isMonthOverlapWeek

          +
          + + + + + Boolean + isMonthOverlapWeek + ( + + + 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.
          +
          + +
          + +
          +
          +

          + isYearOverlapWeek

          +
          + + + + + Boolean + isYearOverlapWeek + ( + + + 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.
          +
          + +
          + +
          +
          +

          + subtract

          +
          + + + + + Date + subtract + ( + + + date + + + , + field + + + , + 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
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.Dialog.html b/www/extras/yui/docs/YAHOO.widget.Dialog.html new file mode 100644 index 000000000..31165ae9a --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.Dialog.html @@ -0,0 +1,1655 @@ + + + + API: container YAHOO.widget.Dialog (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + > YAHOO.widget.Dialog + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.Dialog + + - extends YAHOO.widget.Panel + + + + + + +

          + + +
          +
          Known Subclasses: +
          + YAHOO.widget.SimpleDialog +
          +
          + + + +
          + 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. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.Dialog + + ( + + + + el + + + , + 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. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          callback + - Object +

          +
          +
          + The internally maintained callback object for use with the Connection utility +
          +
          + + + + +
          +

          callback.argument + - Object +

          +
          +
          + The arbitraty argument or arguments to pass to the Connection callback functions +
          +
          + + + + +
          +

          callback.failure + - Function +

          +
          +
          + The function to execute upon failure of the Connection submission +
          +
          + + + + +
          +

          callback.success + - Function +

          +
          +
          + The function to execute upon success of the Connection submission +
          +
          + + + + +
          +

          YAHOO.widget.Dialog._DEFAULT_CONFIG + - private final Object +

          +
          +
          + Constant representing the Dialog's configuration properties +
          +
          + + + + +
          +

          YAHOO.widget.Dialog._EVENT_TYPES + - private final Object +

          +
          +
          + Constant representing the name of the Dialog's events +
          +
          + + + + +
          +

          YAHOO.widget.Dialog.CSS_DIALOG + - static final String +

          +
          +
          + Constant representing the default CSS class used for a Dialog +
          +
          + + + + +
          + + +
          +
          + + + + + +
          +

          Methods

          +
          +

          + _onFormKeyDown

          +
          + + protected + + + void + _onFormKeyDown + ( + + + p_oEvent + + + ) + + +
          + "keydown" event handler for the dialog's form. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + blurButtons

          +
          + + + + + void + blurButtons + ( + ) + + +
          + Blurs all the html buttons +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + cancel

          +
          + + + + + void + cancel + ( + ) + + +
          + Executes the cancel of the Dialog followed by a hide. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configButtons

          +
          + + + + + void + configButtons + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configClose

          +
          + + + + + void + configClose + ( + + + type + + + , + args + + + , + 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 Dialog. +
          + +
          + +
          +
          Parameters:
          +
          + type <String> + The CustomEvent type (usually the property name) +
          +
          + args <Object[]> + The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property. +
          +
          + obj <Object> + The scope object. For configuration handlers, this will usually equal the owner. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configPostMethod

          +
          + + + + + void + configPostMethod + ( + + + type + + + , + args + + + , + obj + + + ) + + +
          + The default event handler for the "postmethod" 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 +
          +
          +
          + +
          + +
          +
          +

          + destroy

          +
          + + + + + void + destroy + ( + ) + + +
          + Removes the Panel element from the DOM and sets all child elements to null. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + doSubmit

          +
          + + + + + void + doSubmit + ( + ) + + +
          + Performs the submission of the Dialog form depending on the value of "postmethod" property. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + focusDefaultButton

          +
          + + + + + void + 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. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + focusFirst

          +
          + + + + + void + focusFirst + ( + ) + + +
          + The default event handler used to focus the first field of the form when the Dialog is shown. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + focusFirstButton

          +
          + + + + + void + focusFirstButton + ( + ) + + +
          + Sets the focus to the first button in the button list +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + focusLast

          +
          + + + + + void + focusLast + ( + ) + + +
          + Sets the focus to the last button in the button or form element in the Dialog +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + focusLastButton

          +
          + + + + + void + focusLastButton + ( + ) + + +
          + Sets the focus to the first button in the button list +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getData

          +
          + + + + + Object + getData + ( + ) + + +
          + Returns a JSON-compatible data structure representing the data currently contained in the form. +
          + +
          + + +
          +
          Returns: + + Object +
          +
          A JSON object reprsenting the data of the current form.
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + el + + + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + initDefaultConfig

          +
          + + + + + void + initDefaultConfig + ( + ) + + +
          + Initializes the class's configurable properties which can be changed using the Dialog's Config object (cfg). +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initEvents

          +
          + + + + + void + initEvents + ( + ) + + +
          + Initializes the custom events for Dialog which are fired automatically at appropriate times by the Dialog class. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + registerForm

          +
          + + + + + void + registerForm + ( + ) + + +
          + Prepares the Dialog's internal FORM object, creating one if one is not currently present. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + submit

          +
          + + + + + void + submit + ( + ) + + +
          + Executes a submit of the Dialog followed by a hide, if validation is successful. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a string representation of the object. +
          + +
          + + +
          +
          Returns: + + String +
          +
          The string representation of the Dialog
          +
          + +
          + +
          +
          +

          + validate

          +
          + + + + + void + 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. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + +
          +

          Events

          +
          +

          + asyncSubmitEvent

          +
          + + + + + asyncSubmitEvent + + ( + ) + + + +
          + CustomEvent fired prior to asynchronous submission +
          + +
          + + + + +
          + +
          +
          +

          + beforeSumitEvent

          +
          + + + + + beforeSumitEvent + + ( + ) + + + +
          + CustomEvent fired prior to submission +
          + +
          + + + + +
          + +
          +
          +

          + cancelEvent

          +
          + + + + + cancelEvent + + ( + ) + + + +
          + CustomEvent fired after cancel +
          + +
          + + + + +
          + +
          +
          +

          + formSubmitEvent

          +
          + + + + + formSubmitEvent + + ( + ) + + + +
          + CustomEvent fired prior to form-based submission +
          + +
          + + + + +
          + +
          +
          +

          + manualSubmitEvent

          +
          + + + + + manualSubmitEvent + + ( + ) + + + +
          + CustomEvent fired prior to manual submission +
          + +
          + + + + +
          + +
          +
          +

          + submitEvent

          +
          + + + + + submitEvent + + ( + ) + + + +
          + CustomEvent fired after submission +
          + +
          + + + + +
          + +
          +
          +
          +
          + + +
          +

          Events inherited from YAHOO.widget.Panel:

          + +
          + + + +
          +

          Configuration Attributes

          +
          +

          buttons + - Object[] +

          +
          +
          + Object literal(s) defining the buttons for the Dialog's footer. +
          +
          + + +
          + Default Value: "none" +
          + +
          +

          postmethod + - String +

          +
          +
          + The method to use for posting the Dialog's form. Possible values are "async", "form", and "manual". +
          +
          + + +
          + Default Value: async +
          + +
          + +
          +
          + +
          +

          Configuration attributes inherited from YAHOO.widget.Panel:

          +
          + + + close, + draggable, + keylisteners, + modal, + underlay + +
          +
          +
          +

          Configuration attributes inherited from YAHOO.widget.Module:

          +
          + + + effect, + monitorresize, + visible + +
          +
          +
          +

          Configuration attributes inherited from YAHOO.widget.Overlay:

          +
          + + + constraintoviewport, + context, + fixedcenter, + height, + iframe, + width, + x, + xy, + y, + zIndex + +
          +
          + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.HTMLNode.html b/www/extras/yui/docs/YAHOO.widget.HTMLNode.html new file mode 100644 index 000000000..04f7f052c --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.HTMLNode.html @@ -0,0 +1,449 @@ + + + + API: treeview YAHOO.widget.HTMLNode (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + > YAHOO.widget.HTMLNode + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.HTMLNode + + - extends YAHOO.widget.Node + + + + + + +

          + + + + + +
          + 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. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.HTMLNode + + ( + + + + oData + + , + oParent + + , + expanded + + , + hasIcon + ) + +
          +
          +
          Parameters:
          +
          + oData + <object> + + a string or object containing the data that will +be used to render this node +
          +
          + oParent + <YAHOO.widget.Node> + + this node's parent node +
          +
          + expanded + <boolean> + + the initial expanded/collapsed state +
          +
          + hasIcon + <boolean> + + specifies whether or not leaf nodes should +have an icon +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          content + - string +

          +
          +
          + The HTML content to use for this node's display +
          +
          + + + + +
          +

          contentElId + - string +

          +
          +
          + The generated id that will contain the data passed in by the implementer. +
          +
          + + + + +
          +

          contentStyle + - string +

          +
          +
          + The CSS class for the html content container. Defaults to ygtvhtml, but +can be overridden to provide a custom presentation for a specific node. +
          +
          + + + + +
          +

          initContent + - object +

          +
          +
          + Sets up the node label +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Properties inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Methods

          +
          +

          + getContentEl

          +
          + + + + + HTMLElement + getContentEl + ( + ) + + +
          + Returns the outer html element for this node's content +
          + +
          + + +
          +
          Returns: + + HTMLElement +
          +
          the element
          +
          + +
          + +
          +
          +
          +
          + + +
          +

          Methods inherited from YAHOO.util.EventProvider:

          + +
          + + + +
          +

          Events inherited from YAHOO.widget.Node:

          +
          + + + parentChange + +
          +
          + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.LogMsg.html b/www/extras/yui/docs/YAHOO.widget.LogMsg.html new file mode 100644 index 000000000..a4817f89d --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.LogMsg.html @@ -0,0 +1,264 @@ + + + + API: logger YAHOO.widget.LogMsg (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Logger Widget  2.2.2

          +

          + Yahoo! UI Library + > logger + > YAHOO.widget.LogMsg + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.LogMsg + + + + + + + +

          + + + + + +
          + The LogMsg class defines a single log message. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.LogMsg + + ( + + + + oConfigs + ) + +
          +
          +
          Parameters:
          +
          + oConfigs + <Object> + + Object literal of configuration params. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          category + - String +

          +
          +
          + Log category. +
          +
          + + + + +
          +

          msg + - String +

          +
          +
          + Log message. +
          +
          + + + + +
          +

          source + - String +

          +
          +
          + Log source. The first word passed in as the source argument. +
          +
          + + + + +
          +

          sourceDetail + - String +

          +
          +
          + Log source detail. The remainder of the string passed in as the source argument, not +including the first word (if any). +
          +
          + + + + +
          +

          time + - Date +

          +
          +
          + Log timestamp. +
          +
          + + + + +
          + + +
          +
          + + + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.LogReader.html b/www/extras/yui/docs/YAHOO.widget.LogReader.html new file mode 100644 index 000000000..9a7b22998 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.LogReader.html @@ -0,0 +1,2375 @@ + + + + API: logger YAHOO.widget.LogReader (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Logger Widget  2.2.2

          +

          + Yahoo! UI Library + > logger + > YAHOO.widget.LogReader + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.LogReader + + + + + + + +

          + + + + + +
          + The LogReader class provides UI to read messages logged to YAHOO.widget.Logger. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.LogReader + + ( + + + + elContainer + + + , + oConfigs + ) + +
          +
          +
          Parameters:
          +
          + elContainer + <HTMLElement> + + (optional) DOM element reference of an existing DIV. +
          +
          + elContainer + <String> + + (optional) String ID of an existing DIV. +
          +
          + oConfigs + <Object> + + (optional) Object literal of configuration params. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _btnClear + - private HTMLElement +

          +
          +
          + Clear button element. +
          +
          + + + + +
          +

          _btnCollapse + - private HTMLElement +

          +
          +
          + LogReader collapse button element. +
          +
          + + + + +
          +

          _btnPause + - private HTMLElement +

          +
          +
          + LogReader pause button element. +
          +
          + + + + +
          +

          _buffer + - private Object[] +

          +
          +
          + Buffer of log message objects for batch output. +
          +
          + + + + +
          +

          _categoryFilters + - private String[] +

          +
          +
          + Array of filters for log message categories. +
          +
          + + + + +
          +

          _consoleMsgCount + - private Number +

          +
          +
          + Number of log messages output to console. +
          +
          + + +
          + Default Value: 0 +
          + + +
          +

          _elBtns + - private HTMLElement +

          +
          +
          + LogReader buttons container element. +
          +
          + + + + +
          +

          _elCategoryFilters + - private HTMLElement +

          +
          +
          + Container element for LogReader category filter checkboxes. +
          +
          + + + + +
          +

          _elCollapse + - private HTMLElement +

          +
          +
          + LogReader collapse element. +
          +
          + + + + +
          +

          _elConsole + - private HTMLElement +

          +
          +
          + LogReader console element. +
          +
          + + + + +
          +

          _elContainer + - private HTMLElement +

          +
          +
          + LogReader container element. +
          +
          + + + + +
          +

          _elDefaultContainer + - private HTMLElement +

          +
          +
          + A class member shared by all LogReaders 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. +
          +
          + + + + +
          +

          _elFt + - private HTMLElement +

          +
          +
          + LogReader footer element. +
          +
          + + + + +
          +

          _elHd + - private HTMLElement +

          +
          +
          + LogReader header element. +
          +
          + + + + +
          +

          _elSourceFilters + - private HTMLElement +

          +
          +
          + Container element for LogReader source filter checkboxes. +
          +
          + + + + +
          +

          _filterCheckboxes + - private Object +

          +
          +
          + Hash of filters and their related checkbox elements. +
          +
          + + + + +
          +

          _lastTime + - private Date +

          +
          +
          + Date of last output log message. +
          +
          + + + + +
          +

          _memberName + - private static Number +

          +
          +
          + Internal class member to index multiple LogReader instances. +
          +
          + + +
          + Default Value: 0 +
          + + +
          +

          _sName + - private String +

          +
          +
          + Name of LogReader instance. +
          +
          + + + + +
          +

          _sourceFilters + - private String[] +

          +
          +
          + Array of filters for log message sources. +
          +
          + + + + +
          +

          _timeout + - private Number +

          +
          +
          + Batched output timeout ID. +
          +
          + + + + +
          +

          _title + - private HTMLElement +

          +
          +
          + LogReader title header element. +
          +
          + + + + +
          +

          bottom + - String +

          +
          +
          + Public member to access CSS bottom position of the LogReader container. +
          +
          + + + + +
          +

          draggable + - Boolean +

          +
          +
          + Enables draggable LogReader if DragDrop Utility is present. +
          +
          + + +
          + Default Value: true +
          + + +
          +

          fontSize + - String +

          +
          +
          + Public member to access CSS font size of the LogReader container. +
          +
          + + + + +
          +

          footerEnabled + - Boolean +

          +
          +
          + Whether or not the footer UI is enabled for the LogReader. +
          +
          + + +
          + Default Value: true +
          + + +
          +

          height + - String +

          +
          +
          + Public member to access CSS height of the LogReader container. +
          +
          + + + + +
          +

          isCollapsed + - Boolean +

          +
          +
          + True when LogReader is in a collapsed state, false otherwise. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          isPaused + - Boolean +

          +
          +
          + True when LogReader is in a paused state, false otherwise. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          left + - String +

          +
          +
          + Public member to access CSS left position of the LogReader container. +
          +
          + + + + +
          +

          logReaderEnabled + - Boolean +

          +
          +
          + Whether or not LogReader is enabled to output log messages. +
          +
          + + +
          + Default Value: true +
          + + +
          +

          newestOnTop + - Boolean +

          +
          +
          + Whether or not newest message is printed on top. +
          +
          + + + + +
          +

          outputBuffer + - Number +

          +
          +
          + Output timeout buffer in milliseconds. +
          +
          + + +
          + Default Value: 100 +
          + + +
          +

          right + - String +

          +
          +
          + Public member to access CSS right position of the LogReader container. +
          +
          + + + + +
          +

          thresholdMax + - Number +

          +
          +
          + Maximum number of messages a LogReader console will display. +
          +
          + + +
          + Default Value: 500 +
          + + +
          +

          thresholdMin + - Number +

          +
          +
          + When a LogReader console reaches its thresholdMax, it will clear out messages +and print out the latest thresholdMin number of messages. +
          +
          + + +
          + Default Value: 100 +
          + + +
          +

          top + - String +

          +
          +
          + Public member to access CSS top position of the LogReader container. +
          +
          + + + + +
          +

          verboseOutput + - Boolean +

          +
          +
          + Whether or not output is verbose (more readable). Setting to true will make +output more compact (less readable). +
          +
          + + +
          + Default Value: true +
          + + +
          +

          width + - String +

          +
          +
          + Public member to access CSS width of the LogReader container. +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + _createCategoryCheckbox

          +
          + + private + + + void + _createCategoryCheckbox + ( + + + sCategory + + + ) + + +
          + Creates the UI for a category filter in the LogReader footer element. +
          + +
          + +
          +
          Parameters:
          +
          + sCategory <String> + Category name. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _createSourceCheckbox

          +
          + + private + + + void + _createSourceCheckbox + ( + + + sSource + + + ) + + +
          + Creates a checkbox in the LogReader footer element to filter by source. +
          + +
          + +
          +
          Parameters:
          +
          + sSource <String> + Source name. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _filterLogs

          +
          + + private + + + void + _filterLogs + ( + ) + + +
          + Reprints all log messages in the stack through filters. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onCategoryCreate

          +
          + + private + + + void + _onCategoryCreate + ( + + + sType + + + , + aArgs + + + , + oSelf + + + ) + + +
          + Handles Logger's categoryCreateEvent. +
          + +
          + +
          +
          Parameters:
          +
          + sType <String> + The event. +
          +
          + aArgs <Object[]> + Data passed from event firer. +
          +
          + oSelf <Object> + The LogReader instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onCheckCategory

          +
          + + private + + + void + _onCheckCategory + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles check events on the category filter checkboxes. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The click event. +
          +
          + oSelf <Object> + The LogReader instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onCheckSource

          +
          + + private + + + void + _onCheckSource + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles check events on the category filter checkboxes. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The click event. +
          +
          + oSelf <Object> + The LogReader instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onClickClearBtn

          +
          + + private + + + void + _onClickClearBtn + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles click events on the clear button. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The click event. +
          +
          + oSelf <Object> + The LogReader instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onClickCollapseBtn

          +
          + + private + + + void + _onClickCollapseBtn + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles click events on the collapse button. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The click event. +
          +
          + oSelf <Object> + The LogReader instance +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onClickPauseBtn

          +
          + + private + + + void + _onClickPauseBtn + ( + + + v + + + , + oSelf + + + ) + + +
          + Handles click events on the pause button. +
          + +
          + +
          +
          Parameters:
          +
          + v <HTMLEvent> + The click event. +
          +
          + oSelf <Object> + The LogReader instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onNewLog

          +
          + + private + + + void + _onNewLog + ( + + + sType + + + , + aArgs + + + , + oSelf + + + ) + + +
          + Handles Logger's newLogEvent. +
          + +
          + +
          +
          Parameters:
          +
          + sType <String> + The event. +
          +
          + aArgs <Object[]> + Data passed from event firer. +
          +
          + oSelf <Object> + The LogReader instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onReset

          +
          + + private + + + void + _onReset + ( + + + sType + + + , + aArgs + + + , + oSelf + + + ) + + +
          + Handles Logger's resetEvent. +
          + +
          + +
          +
          Parameters:
          +
          + sType <String> + The event. +
          +
          + aArgs <Object[]> + Data passed from event firer. +
          +
          + oSelf <Object> + The LogReader instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onSourceCreate

          +
          + + private + + + void + _onSourceCreate + ( + + + sType + + + , + aArgs + + + , + oSelf + + + ) + + +
          + Handles Logger's sourceCreateEvent. +
          + +
          + +
          +
          Parameters:
          +
          + sType <String> + The event. +
          +
          + aArgs <Object[]> + Data passed from event firer. +
          +
          + oSelf <Object> + The LogReader instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _printBuffer

          +
          + + private + + + void + _printBuffer + ( + ) + + +
          + Sends buffer of log messages to output and clears buffer. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _printToConsole

          +
          + + private + + + void + _printToConsole + ( + + + aEntries + + + ) + + +
          + Cycles through an array of log messages, and outputs each one to the console +if its category has not been filtered out. +
          + +
          + +
          +
          Parameters:
          +
          + aEntries <Object[]> + Array of LogMsg objects to output to console. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + clearConsole

          +
          + + + + + void + clearConsole + ( + ) + + +
          + Does not delete any log messages, but clears all printed log messages from +the console. Log messages will be printed out again if user re-filters. The +static method YAHOO.widget.Logger.reset() should be called in order to +actually delete log messages. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + collapse

          +
          + + + + + void + collapse + ( + ) + + +
          + Collapses UI of LogReader. Logging functionality is not disrupted. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + expand

          +
          + + + + + void + expand + ( + ) + + +
          + Expands UI of LogReader. Logging functionality is not disrupted. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + formatMsg

          +
          + + + + + String + formatMsg + ( + + + oLogMsg + + + ) + + +
          + Formats message string to HTML for output to console. +
          + +
          + +
          +
          Parameters:
          +
          + oLogMsg <Object> + Log message object. +
          +
          + +
          +
          Returns: + + String +
          +
          HTML-formatted message for output to console.
          +
          + +
          + +
          +
          +

          + getCategories

          +
          + + + + + String[] + getCategories + ( + ) + + +
          + Returns array of enabled categories. +
          + +
          + + +
          +
          Returns: + + String[] +
          +
          Array of enabled categories.
          +
          + +
          + +
          +
          +

          + getCheckbox

          +
          + + + + + Array + getCheckbox + ( + + + Category + + + ) + + +
          + Returns related checkbox element for given filter (i.e., category or source). +
          + +
          + +
          +
          Parameters:
          +
          + Category <String> + or source name. +
          +
          + +
          +
          Returns: + + Array +
          +
          Array of all filter checkboxes.
          +
          + +
          + +
          +
          +

          + getLastTime

          +
          + + + + + Date + getLastTime + ( + ) + + +
          + Gets timestamp of the last log. +
          + +
          + + +
          +
          Returns: + + Date +
          +
          Timestamp of the last log.
          +
          + +
          + +
          +
          +

          + getSources

          +
          + + + + + Array + getSources + ( + ) + + +
          + Returns array of enabled sources. +
          + +
          + + +
          +
          Returns: + + Array +
          +
          Array of enabled sources.
          +
          + +
          + +
          +
          +

          + hide

          +
          + + + + + void + hide + ( + ) + + +
          + Hides UI of LogReader. Logging functionality is not disrupted. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + hideCategory

          +
          + + + + + void + hideCategory + ( + + + Category + + + ) + + +
          + Hides log messages associated with given category. +
          + +
          + +
          +
          Parameters:
          +
          + Category <String> + name. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + hideSource

          +
          + + + + + void + hideSource + ( + + + Source + + + ) + + +
          + Hides log messages associated with given source. +
          + +
          + +
          +
          Parameters:
          +
          + Source <String> + name. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + html2Text

          +
          + + private + + + void + html2Text + ( + + + sHtml + + + ) + + +
          + Converts input chars "<", ">", and "&" to HTML entities. +
          + +
          + +
          +
          Parameters:
          +
          + sHtml <String> + String to convert. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + pause

          +
          + + + + + void + 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 LogReader. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + resume

          +
          + + + + + void + resume + ( + ) + + +
          + Resumes output of log messages, including outputting any log messages that +have been saved to buffer while paused. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setTitle

          +
          + + + + + void + setTitle + ( + + + sTitle + + + ) + + +
          + Updates title to given string. +
          + +
          + +
          +
          Parameters:
          +
          + sTitle <String> + New title. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + show

          +
          + + + + + void + show + ( + ) + + +
          + Shows UI of LogReader. Logging functionality is not disrupted. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + showCategory

          +
          + + + + + void + showCategory + ( + + + Category + + + ) + + +
          + Shows log messages associated with given category. +
          + +
          + +
          +
          Parameters:
          +
          + Category <String> + name. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + showSource

          +
          + + + + + void + showSource + ( + + + Source + + + ) + + +
          + Shows log messages associated with given source. +
          + +
          + +
          +
          Parameters:
          +
          + Source <String> + name. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Public accessor to the unique name of the LogReader instance. +
          + +
          + + +
          +
          Returns: + + String +
          +
          Unique name of the LogReader instance.
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.LogWriter.html b/www/extras/yui/docs/YAHOO.widget.LogWriter.html new file mode 100644 index 000000000..92b4db369 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.LogWriter.html @@ -0,0 +1,382 @@ + + + + API: logger YAHOO.widget.LogWriter (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Logger Widget  2.2.2

          +

          + Yahoo! UI Library + > logger + > YAHOO.widget.LogWriter + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.LogWriter + + + + + + + +

          + + + + + +
          + The LogWriter class provides a mechanism to log messages through +YAHOO.widget.Logger from a named source. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.LogWriter + + ( + + + + sSource + ) + +
          +
          +
          Parameters:
          +
          + sSource + <String> + + Source of LogWriter instance. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _source + - private String +

          +
          +
          + Source of the LogWriter instance. +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + getSource

          +
          + + + + + String + getSource + ( + ) + + +
          + Public accessor to get the source name. +
          + +
          + + +
          +
          Returns: + + String +
          +
          The LogWriter source.
          +
          + +
          + +
          +
          +

          + log

          +
          + + + + + void + log + ( + + + sMsg + + + , + sCategory + + + ) + + +
          + Logs a message attached to the source of the LogWriter. +
          + +
          + +
          +
          Parameters:
          +
          + sMsg <String> + The log message. +
          +
          + sCategory <String> + Category name. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setSource

          +
          + + + + + void + setSource + ( + + + sSource + + + ) + + +
          + Public accessor to set the source name. +
          + +
          + +
          +
          Parameters:
          +
          + sSource <String> + Source of LogWriter instance. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Public accessor to the unique name of the LogWriter instance. +
          + +
          + + +
          +
          Returns: + + String +
          +
          Unique name of the LogWriter instance.
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.Logger.html b/www/extras/yui/docs/YAHOO.widget.Logger.html new file mode 100644 index 000000000..2c968c1b3 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.Logger.html @@ -0,0 +1,1018 @@ + + + + API: logger YAHOO.widget.Logger (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Logger Widget  2.2.2

          +

          + Yahoo! UI Library + > logger + > YAHOO.widget.Logger + +

          +
          + +
          +
          +
          + + +

          + + + static + + Class YAHOO.widget.Logger + + + + + + + +

          + + + + + +
          + 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. +
          + + +
          +

          Properties

          +
          +

          _browserConsoleEnabled + - private static Boolean +

          +
          +
          + Internal property to track whether output to browser console is enabled. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          _lastTime + - private static Date +

          +
          +
          + Timestamp of last logged message. +
          +
          + + + + +
          +

          _stack + - private static Array +

          +
          +
          + Array to hold all log messages. +
          +
          + + + + +
          +

          _startTime + - private static Date +

          +
          +
          + Static timestamp of Logger initialization. +
          +
          + + + + +
          +

          categories + - static String[] +

          +
          +
          + Array of categories. +
          +
          + + +
          + Default Value: ["info","warn","error","time","window"] +
          + + +
          +

          loggerEnabled + - static Boolean +

          +
          +
          + True if Logger is enabled, false otherwise. +
          +
          + + +
          + Default Value: true +
          + + +
          +

          maxStackEntries + - static Number +

          +
          +
          + Upper limit on size of internal stack. +
          +
          + + +
          + Default Value: 2500 +
          + + +
          +

          sources + - static String[] +

          +
          +
          + Array of sources. +
          +
          + + +
          + Default Value: ["global"] +
          + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + _createNewCategory

          +
          + + private + + + void + _createNewCategory + ( + + + sCategory + + + ) + + +
          + Creates a new category of log messages and fires categoryCreateEvent. +
          + +
          + +
          +
          Parameters:
          +
          + sCategory <String> + Category name. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _createNewSource

          +
          + + private + + + void + _createNewSource + ( + + + sSource + + + ) + + +
          + Creates a new source of log messages and fires sourceCreateEvent. +
          + +
          + +
          +
          Parameters:
          +
          + sSource <String> + Source name. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _isNewCategory

          +
          + + private + + + Boolean + _isNewCategory + ( + + + sCategory + + + ) + + +
          + Checks to see if a category has already been created. +
          + +
          + +
          +
          Parameters:
          +
          + sCategory <String> + Category name. +
          +
          + +
          +
          Returns: + + Boolean +
          +
          Returns true if category is unknown, else returns false.
          +
          + +
          + +
          +
          +

          + _isNewSource

          +
          + + private + + + Boolean + _isNewSource + ( + + + sSource + + + ) + + +
          + Checks to see if a source already exists. +
          + +
          + +
          +
          Parameters:
          +
          + sSource <String> + Source name. +
          +
          + +
          +
          Returns: + + Boolean +
          +
          Returns true if source is unknown, else returns false.
          +
          + +
          + +
          +
          +

          + _onWindowError

          +
          + + private + + + void + _onWindowError + ( + + + sMsg + + + , + sUrl + + + , + sLine + + + ) + + +
          + Handles logging of messages due to window error events. +
          + +
          + +
          +
          Parameters:
          +
          + sMsg <String> + The error message. +
          +
          + sUrl <String> + URL of the error. +
          +
          + sLine <String> + Line number of the error. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _printToBrowserConsole

          +
          + + private + + + void + _printToBrowserConsole + ( + + + oEntry + + + ) + + +
          + Outputs a log message to global console.log() function. +
          + +
          + +
          +
          Parameters:
          +
          + oEntry <Object> + Log entry object. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + disableBrowserConsole

          +
          + + + + + void + disableBrowserConsole + ( + ) + + +
          + Disables output to the browser's global console.log() function, which is used +by the Firebug extension to Firefox as well as Safari. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + enableBrowserConsole

          +
          + + + + + void + enableBrowserConsole + ( + ) + + +
          + Enables output to the browser's global console.log() function, which is used +by the Firebug extension to Firefox as well as Safari. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getStack

          +
          + + + + + Object[] + getStack + ( + ) + + +
          + Public accessor to internal stack of log message objects. +
          + +
          + + +
          +
          Returns: + + Object[] +
          +
          Array of log message objects.
          +
          + +
          + +
          +
          +

          + getStartTime

          +
          + + + + + Date + getStartTime + ( + ) + + +
          + Public accessor to internal start time. +
          + +
          + + +
          +
          Returns: + + Date +
          +
          Internal date of when Logger singleton was initialized.
          +
          + +
          + +
          +
          +

          + log

          +
          + + + + + void + log + ( + + + sMsg + + + , + sCategory + + + , + sSource + + + ) + + +
          + 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:
          +
          + sMsg <String> + The log message. +
          +
          + sCategory <String> + Category of log message, or null. +
          +
          + sSource <String> + Source of LogWriter, or null if global. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + reset

          +
          + + + + + void + reset + ( + ) + + +
          + Resets internal stack and startTime, enables Logger, and fires logResetEvent. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + + +
          +

          Events

          +
          +

          + categoryCreateEvent

          +
          + + + + + categoryCreateEvent + + ( + + + sCategory + + + ) + + + +
          + Fired when a new category has been created. +
          + +
          + + +
          +
          Parameters:
          +
          + sCategory <String> + Category name. +
          +
          + + +
          + +
          +
          +

          + logResetEvent

          +
          + + + + + logResetEvent + + ( + ) + + + +
          + Fired when the Logger has been reset has been created. +
          + +
          + + + + +
          + +
          +
          +

          + newLogEvent

          +
          + + + + + newLogEvent + + ( + + + sMsg + + + ) + + + +
          + Fired when a new log message has been created. +
          + +
          + + +
          +
          Parameters:
          +
          + sMsg <String> + Log message. +
          +
          + + +
          + +
          +
          +

          + sourceCreateEvent

          +
          + + + + + sourceCreateEvent + + ( + + + sSource + + + ) + + + +
          + Fired when a new source has been named. +
          + +
          + + +
          +
          Parameters:
          +
          + sSource <String> + Source name. +
          +
          + + +
          + +
          +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.Menu.html b/www/extras/yui/docs/YAHOO.widget.Menu.html new file mode 100644 index 000000000..eb6c7fd83 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.Menu.html @@ -0,0 +1,5640 @@ + + + + API: menu YAHOO.widget.Menu (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Menu  2.2.2

          +

          + Yahoo! UI Library + > menu + > YAHOO.widget.Menu + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.Menu + + - extends YAHOO.widget.Overlay + + + + + + +

          + + +
          +
          Known Subclasses: +
          + YAHOO.widget.ContextMenu + YAHOO.widget.Menubar +
          +
          + + + +
          + 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. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.Menu + + ( + + + + p_oElement + + + + + , + p_oConfig + ) + +
          +
          +
          Parameters:
          +
          + p_oElement + <String> + + String specifying the id attribute of the +<div> element of the menu. +
          +
          + p_oElement + <String> + + String specifying the id attribute of the +<select> element to be used as the data source +for the menu. +
          +
          + p_oElement + <HTMLDivElement> + + Object +specifying the <div> element of the menu. +
          +
          + p_oElement + <HTMLSelectElement> + + +Object specifying the <select> element to be used as +the data source for the menu. +
          +
          + p_oConfig + <Object> + + Optional. Object literal specifying the +configuration for the menu. See configuration class documentation for +more details. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _aGroupTitleElements + - private Array +

          +
          +
          + Array of HTML element used to title groups of menu items. +
          +
          + + +
          + Default Value: [] +
          + + +
          +

          _aItemGroups + - private Array +

          +
          +
          + Multi-dimensional Array representing the menu items as they +are grouped in the menu. +
          +
          + + +
          + Default Value: [] +
          + + +
          +

          _aListElements + - private Array +

          +
          +
          + Array of <ul> elements, each of which is +the parent node for each item's <li> element. +
          +
          + + +
          + Default Value: [] +
          + + +
          +

          _bHandledMouseOutEvent + - private Boolean +

          +
          +
          + Boolean indicating the current state of the menu's +"mouseout" event. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          _bHandledMouseOverEvent + - private Boolean +

          +
          +
          + Boolean indicating the current state of the menu's +"mouseover" event. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          _bHideDelayEventHandlersAssigned + - private Boolean +

          +
          +
          + 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 Value: false +
          + + +
          +

          _bStopMouseEventHandlers + - private Boolean +

          +
          +
          + Stops "mouseover," "mouseout," and "mousemove" event handlers +from executing. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          _nBodyScrollId + - private Number +

          +
          +
          + Number representing the time-out setting used to cancel the +scrolling of the menu's body element. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          _nCurrentMouseX + - private Number +

          +
          +
          + The current x coordinate of the mouse inside the area of +the menu. +
          +
          + + +
          + Default Value: 0 +
          + + +
          +

          _nHideDelayId + - private Number +

          +
          +
          + Number representing the time-out setting used to cancel the +hiding of a menu. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          _nMaxHeight + - private Number +

          +
          +
          + The original value of the "maxheight" configuration property +as set by the user. +
          +
          + + +
          + Default Value: -1 +
          + + +
          +

          _nShowDelayId + - private Number +

          +
          +
          + Number representing the time-out setting used to cancel the +showing of a menu. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          _nSubmenuHideDelayId + - private Number +

          +
          +
          + Number representing the time-out setting used to cancel the +hiding of a submenu. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          _sClassName + - private String +

          +
          +
          + The current value of the "classname" configuration attribute. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          activeItem + - YAHOO.widget.MenuItem +

          +
          +
          + Object reference to the item in the menu that has is selected. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          CSS_CLASS_NAME + - final String +

          +
          +
          + String representing the CSS class(es) to be applied to the +menu's <div> element. +
          +
          + + +
          + Default Value: "yuimenu" +
          + + +
          +

          GROUP_TITLE_TAG_NAME + - final String +

          +
          +
          + String representing the tagname of the HTML element used to +title the menu's item groups. +
          +
          + + +
          + Default Value: H6 +
          + + +
          +

          ITEM_TYPE + - final YAHOO.widget.MenuItem +

          +
          +
          + 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 Value: YAHOO.widget.MenuItem +
          + + +
          +

          itemData + - Array +

          +
          +
          + 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 Value: null +
          + + +
          +

          lazyLoad + - Boolean +

          +
          +
          + 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 Value: false +
          + + +
          +

          parent + - YAHOO.widget.MenuItem +

          +
          +
          + 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 Value: null +
          + + +
          +

          srcElement + - HTMLSelectElement|HTMLDivElement +

          +
          +
          + Object reference to the HTML element (either +<select> or <div>) used to +create the menu. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          YAHOO.widget.Menu._DEFAULT_CONFIG + - private final Object +

          +
          +
          + Constant representing the Menu's configuration properties +
          +
          + + + + +
          +

          YAHOO.widget.Menu._EVENT_TYPES + - private final Object +

          +
          +
          + Constant representing the name of the Menu's events +
          +
          + + + + +
          + + +
          +
          + + + + +
          +

          Methods

          +
          +

          + _addItemToGroup

          +
          + + private + + + YAHOO.widget.MenuItem + _addItemToGroup + ( + + + p_nGroupIndex + + + , + p_oItem + + + + + + + , + p_nItemIndex + + + ) + + +
          + Adds a menu item to a group. +
          + +
          + +
          +
          Parameters:
          +
          + p_nGroupIndex <Number> + Number indicating the group to which the +item belongs. +
          +
          + 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> + Optional. Number indicating the index at +which the menu item should be added. +
          +
          + +
          +
          Returns: + + YAHOO.widget.MenuItem +
          +
          +
          + +
          + +
          +
          +

          + _cancelHideDelay

          +
          + + private + + + void + _cancelHideDelay + ( + ) + + +
          + Cancels the call to "hideMenu." +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _cancelShowDelay

          +
          + + private + + + void + _cancelShowDelay + ( + ) + + +
          + Cancels the call to the "showMenu." +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _checkPosition

          +
          + + private + + + Boolean + _checkPosition + ( + + + p_sPosition + + + ) + + +
          + Checks to make sure that the value of the "position" property +is one of the supported strings. Returns true if the position is supported. +
          + +
          + +
          +
          Parameters:
          +
          + p_sPosition <Object> + String specifying the position of the menu. +
          +
          + +
          +
          Returns: + + Boolean +
          +
          +
          + +
          + +
          +
          +

          + _configureSubmenu

          +
          + + private + + + void + _configureSubmenu + ( + + + p_oItem + + + ) + + +
          + Subscribes the menu item's submenu to its parent menu's events. +
          + +
          + +
          +
          Parameters:
          +
          + p_oItem <YAHOO.widget.MenuItem> + Object reference for the MenuItem +instance with the submenu to be configured. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _createItemGroup

          +
          + + private + + + Array + _createItemGroup + ( + + + p_nIndex + + + ) + + +
          + Creates a new menu item group (array) and its associated +<ul> element. Returns an aray of menu item groups. +
          + +
          + +
          +
          Parameters:
          +
          + p_nIndex <Number> + Number indicating the group to create. +
          +
          + +
          +
          Returns: + + Array +
          +
          +
          + +
          + +
          +
          +

          + _disableScrollFooter

          +
          + + protected + + + void + _disableScrollFooter + ( + ) + + +
          + Disables the footer used for scrolling the body of the menu. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _disableScrollHeader

          +
          + + protected + + + void + _disableScrollHeader + ( + ) + + +
          + Disables the header used for scrolling the body of the menu. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _enableScrollFooter

          +
          + + protected + + + void + _enableScrollFooter + ( + ) + + +
          + Enables the footer used for scrolling the body of the menu. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _enableScrollHeader

          +
          + + protected + + + void + _enableScrollHeader + ( + ) + + +
          + Enables the header used for scrolling the body of the menu. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _execHideDelay

          +
          + + private + + + void + _execHideDelay + ( + ) + + +
          + Hides the menu after the number of milliseconds specified by +the "hidedelay" configuration property. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _execShowDelay

          +
          + + private + + + void + _execShowDelay + ( + + + p_oMenu + + + ) + + +
          + Shows the menu after the number of milliseconds specified by +the "showdelay" configuration property have ellapsed. +
          + +
          + +
          +
          Parameters:
          +
          + p_oMenu <YAHOO.widget.Menu> + Object specifying the menu that should +be made visible. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _execSubmenuHideDelay

          +
          + + private + + + void + _execSubmenuHideDelay + ( + + + p_oSubmenu + + + , + p_nMouseX + + + , + p_nHideDelay + + + ) + + +
          + Hides a submenu after the number of milliseconds specified by +the "submenuhidedelay" configuration property have ellapsed. +
          + +
          + +
          +
          Parameters:
          +
          + p_oSubmenu <YAHOO.widget.Menu> + Object specifying the submenu that +should be hidden. +
          +
          + p_nMouseX <Number> + The x coordinate of the mouse when it left +the specified submenu's parent menu item. +
          +
          + p_nHideDelay <Number> + The number of milliseconds that should ellapse +before the submenu is hidden. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _getFirstEnabledItem

          +
          + + private + + + YAHOO.widget.MenuItem + _getFirstEnabledItem + ( + ) + + +
          + Returns the first enabled item in the menu. +
          + +
          + + +
          +
          Returns: + + YAHOO.widget.MenuItem +
          +
          +
          + +
          + +
          +
          +

          + _getItemGroup

          +
          + + private + + + Array + _getItemGroup + ( + + + p_nIndex + + + ) + + +
          + Returns the menu item group at the specified index. +
          + +
          + +
          +
          Parameters:
          +
          + p_nIndex <Number> + Number indicating the index of the menu item group +to be retrieved. +
          +
          + +
          +
          Returns: + + Array +
          +
          +
          + +
          + +
          +
          +

          + _getOffsetWidth

          +
          + + private + + + void + _getOffsetWidth + ( + ) + + +
          + Returns the offset width of the menu's +<div> element. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _initSubTree

          +
          + + private + + + void + _initSubTree + ( + ) + + +
          + Iterates the childNodes of the source element to find nodes +used to instantiate menu and menu items. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onBeforeHide

          +
          + + private + + + void + _onBeforeHide + ( + + + p_sType + + + , + p_aArgs + + + , + p_oMenu + + + ) + + +
          + "beforehide" event handler for the menu. +
          + +
          + +
          +
          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 +
          +
          +
          + +
          + +
          +
          +

          + _onBeforeRender

          +
          + + private + + + void + _onBeforeRender + ( + + + p_sType + + + , + p_aArgs + + + , + p_oMenu + + + ) + + +
          + "beforerender" event handler for the menu. Appends all of the +<ul>, <li> and their accompanying +title elements to the body element of the menu. +
          + +
          + +
          +
          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 +
          +
          +
          + +
          + +
          +
          +

          + _onBeforeShow

          +
          + + private + + + void + _onBeforeShow + ( + + + p_sType + + + , + p_aArgs + + + , + p_oMenu + + + ) + + +
          + "beforeshow" event handler for the menu. +
          + +
          + +
          +
          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 +
          +
          +
          + +
          + +
          +
          +

          + _onClick

          +
          + + protected + + + void + _onClick + ( + + + p_sType + + + , + p_aArgs + + + , + p_oMenu + + + ) + + +
          + "click" event handler for the menu. +
          + +
          + +
          +
          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 +
          +
          +
          + +
          + +
          +
          +

          + _onHide

          +
          + + private + + + void + _onHide + ( + + + p_sType + + + , + p_aArgs + + + , + p_oMenu + + + ) + + +
          + "hide" event handler for the menu. +
          + +
          + +
          +
          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 +
          +
          +
          + +
          + +
          +
          +

          + _onInit

          +
          + + private + + + void + _onInit + ( + + + p_sType + + + , + p_aArgs + + + , + p_oMenu + + + ) + + +
          + "init" event handler for the menu. +
          + +
          + +
          +
          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 +
          +
          +
          + +
          + +
          +
          +

          + _onKeyDown

          +
          + + protected + + + void + _onKeyDown + ( + + + p_sType + + + , + p_aArgs + + + , + p_oMenu + + + ) + + +
          + "keydown" event handler for the menu. +
          + +
          + +
          +
          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 +
          +
          +
          + +
          + +
          +
          +

          + _onKeyPress

          +
          + + protected + + + void + _onKeyPress + ( + + + p_sType + + + , + p_aArgs + + + , + p_oMenu + + + ) + + +
          + "keypress" event handler for a Menu instance. +
          + +
          + +
          +
          Parameters:
          +
          + p_sType <String> + The name of the event that was fired. +
          +
          + p_aArgs <Array> + Collection of arguments sent when the event +was fired. +
          +
          + p_oMenu <YAHOO.widget.Menu> + The Menu instance that fired the event. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMenuItemBlur

          +
          + + private + + + void + _onMenuItemBlur + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + "blur" event handler for the menu's items. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMenuItemConfigChange

          +
          + + private + + + void + _onMenuItemConfigChange + ( + + + p_sType + + + , + p_aArgs + + + , + p_oItem + + + ) + + +
          + "configchange" event handler for the menu's items. +
          + +
          + +
          +
          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 +
          +
          +
          + +
          + +
          +
          +

          + _onMenuItemFocus

          +
          + + private + + + void + _onMenuItemFocus + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + "focus" event handler for the menu's items. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMouseMove

          +
          + + protected + + + void + _onMouseMove + ( + + + p_oEvent + + + , + p_oMenu + + + ) + + +
          + "click" event handler for the menu. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + p_oMenu <YAHOO.widget.Menu> + Object representing the menu that +fired the event. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onMouseOut

          +
          + + protected + + + void + _onMouseOut + ( + + + p_sType + + + , + p_aArgs + + + , + p_oMenu + + + ) + + +
          + "mouseout" event handler for the menu. +
          + +
          + +
          +
          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 +
          +
          +
          + +
          + +
          +
          +

          + _onMouseOver

          +
          + + protected + + + void + _onMouseOver + ( + + + p_sType + + + , + p_aArgs + + + , + p_oMenu + + + ) + + +
          + "mouseover" event handler for the menu. +
          + +
          + +
          +
          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 +
          +
          +
          + +
          + +
          +
          +

          + _onParentMenuConfigChange

          +
          + + private + + + void + _onParentMenuConfigChange + ( + + + p_sType + + + , + p_aArgs + + + , + p_oSubmenu + + + ) + + +
          + "configchange" event handler for a submenu. +
          + +
          + +
          +
          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_oSubmenu <YAHOO.widget.Menu> + Object representing the submenu that +subscribed to the event. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onParentMenuRender

          +
          + + private + + + void + _onParentMenuRender + ( + + + p_sType + + + , + p_aArgs + + + , + p_oSubmenu + + + ) + + +
          + "render" event handler for a submenu. Renders a +submenu in response to the firing of its parent's "render" event. +
          + +
          + +
          +
          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_oSubmenu <YAHOO.widget.Menu> + Object representing the submenu that +subscribed to the event. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onRender

          +
          + + private + + + void + _onRender + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + "render" event handler for the menu. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onScrollTargetMouseOut

          +
          + + protected + + + void + _onScrollTargetMouseOut + ( + + + p_oEvent + + + , + p_oMenu + + + ) + + +
          + "mouseout" event handler for the menu's "header" and "footer" +elements. Used to stop scrolling the body of the menu up and down when the +menu's "maxheight" configuration property is set to a value greater than 0. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + p_oMenu <YAHOO.widget.Menu> + Object representing the menu that +fired the event. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onScrollTargetMouseOver

          +
          + + protected + + + void + _onScrollTargetMouseOver + ( + + + p_oEvent + + + , + p_oMenu + + + ) + + +
          + "mouseover" event handler for the menu's "header" and "footer" +elements. Used to scroll the body of the menu up and down when the +menu's "maxheight" configuration property is set to a value greater than 0. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + p_oMenu <YAHOO.widget.Menu> + Object representing the menu that +fired the event. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onShow

          +
          + + private + + + void + _onShow + ( + + + p_sType + + + , + p_aArgs + + + , + p_oMenu + + + ) + + +
          + "show" event handler for the menu. +
          + +
          + +
          +
          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 +
          +
          +
          + +
          + +
          +
          +

          + _onSubmenuBeforeShow

          +
          + + private + + + void + _onSubmenuBeforeShow + ( + + + p_sType + + + , + p_aArgs + + + , + p_oSubmenu + + + ) + + +
          + "beforeshow" event handler for a submenu. +
          + +
          + +
          +
          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_oSubmenu <YAHOO.widget.Menu> + Object representing the submenu that +subscribed to the event. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onSubmenuHide

          +
          + + private + + + void + _onSubmenuHide + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + "hide" Custom Event handler for a submenu. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onSubmenuShow

          +
          + + private + + + void + _onSubmenuShow + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + "show" event handler for a submenu. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onTextResize

          +
          + + protected + + + void + _onTextResize + ( + + + p_sType + + + , + p_aArgs + + + , + p_oMenu + + + ) + + +
          + "textresize" event handler for the menu. +
          + +
          + +
          +
          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 +
          +
          +
          + +
          + +
          +
          +

          + _onVisibleChange

          +
          + + private + + + void + _onVisibleChange + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + Change event handler for the the menu's "visible" configuration +property. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onWidthChange

          +
          + + private + + + void + _onWidthChange + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + Change event handler for the the menu's "width" configuration +property. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _removeItemFromGroupByIndex

          +
          + + private + + + YAHOO.widget.MenuItem + _removeItemFromGroupByIndex + ( + + + p_nGroupIndex + + + , + p_nItemIndex + + + ) + + +
          + Removes a menu item from a group by index. Returns the menu +item that was removed. +
          + +
          + +
          +
          Parameters:
          +
          + p_nGroupIndex <Number> + Number indicating the group to which the menu +item belongs. +
          +
          + p_nItemIndex <Number> + Number indicating the index of the menu item +to be removed. +
          +
          + +
          +
          Returns: + + YAHOO.widget.MenuItem +
          +
          +
          + +
          + +
          +
          +

          + _removeItemFromGroupByValue

          +
          + + private + + + YAHOO.widget.MenuItem + _removeItemFromGroupByValue + ( + + + p_nGroupIndex + + + , + p_oItem + + + ) + + +
          + Removes a menu item from a group by reference. Returns the +menu item that was removed. +
          + +
          + +
          +
          Parameters:
          +
          + p_nGroupIndex <Number> + Number indicating the group to which the +menu item belongs. +
          +
          + p_oItem <YAHOO.widget.MenuItem> + Object reference for the MenuItem +instance to be removed. +
          +
          + +
          +
          Returns: + + YAHOO.widget.MenuItem +
          +
          +
          + +
          + +
          +
          +

          + _setMaxHeight

          +
          + + private + + + void + _setMaxHeight + ( + + + p_sType + + + , + p_aArgs + + + , + p_nMaxHeight + + + ) + + +
          + "renderEvent" handler used to defer the setting of the +"maxheight" configuration property until the menu is rendered in lazy +load scenarios. +
          + +
          + +
          +
          Parameters:
          +
          + p_sType <String> + The name of the event that was fired. +
          +
          + p_aArgs <Array> + Collection of arguments sent when the event +was fired. +
          +
          + p_nMaxHeight <Number> + Number representing the value to set for the +"maxheight" configuration property. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _setWidth

          +
          + + private + + + void + _setWidth + ( + ) + + +
          + Sets the width of the menu's root <div> +element to its offsetWidth. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _subscribeToItemEvents

          +
          + + private + + + void + _subscribeToItemEvents + ( + + + p_oItem + + + ) + + +
          + Subscribes a menu to a menu item's event. +
          + +
          + +
          +
          Parameters:
          +
          + p_oItem <YAHOO.widget.MenuItem> + Object reference for the MenuItem +instance whose events should be subscribed to. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _updateItemProperties

          +
          + + private + + + void + _updateItemProperties + ( + + + p_nGroupIndex + + + ) + + +
          + Updates the "index," "groupindex," and "className" properties +of the menu items in the specified group. +
          + +
          + +
          +
          Parameters:
          +
          + p_nGroupIndex <Number> + Number indicating the group of items to update. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + addItem

          +
          + + + + + YAHOO.widget.MenuItem + addItem + ( + + + p_oItem + + + + + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + addItems

          +
          + + + + + Array + addItems + ( + + + p_aItems + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + blur

          +
          + + + + + void + blur + ( + ) + + +
          + Causes the menu to lose focus and fires the "blur" event. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + clearActiveItem

          +
          + + + + + void + clearActiveItem + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + clearContent

          +
          + + + + + void + clearContent + ( + ) + + +
          + Removes all of the content from the menu, including the menu +items, group titles, header and footer. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configClassName

          +
          + + + + + void + configClassName + ( + + + p_sType + + + , + p_aArgs + + + , + p_oMenu + + + ) + + +
          + Event handler for when the "classname" configuration property of +a menu changes. +
          + +
          + +
          +
          Parameters:
          +
          + p_sType <String> + The name of the event that was fired. +
          +
          + p_aArgs <Array> + Collection of arguments sent when the event was fired. +
          +
          + p_oMenu <YAHOO.widget.Menu> + The Menu instance fired the event. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configContainer

          +
          + + + + + void + configContainer + ( + + + p_sType + + + , + p_aArgs + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configHideDelay

          +
          + + + + + void + configHideDelay + ( + + + p_sType + + + , + p_aArgs + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configIframe

          +
          + + + + + void + configIframe + ( + + + p_sType + + + , + p_aArgs + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configMaxHeight

          +
          + + + + + void + configMaxHeight + ( + + + p_sType + + + , + p_aArgs + + + , + p_oMenu + + + ) + + +
          + Event handler for when the "maxheight" configuration property of +a Menu changes. +
          + +
          + +
          +
          Parameters:
          +
          + p_sType <String> + The name of the event that was fired. +
          +
          + p_aArgs <Array> + Collection of arguments sent when the event +was fired. +
          +
          + p_oMenu <YAHOO.widget.Menu> + The Menu instance fired +the event. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configPosition

          +
          + + + + + void + configPosition + ( + + + p_sType + + + , + p_aArgs + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configVisible

          +
          + + + + + void + configVisible + ( + + + p_sType + + + , + p_aArgs + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + destroy

          +
          + + + + + void + destroy + ( + ) + + +
          + Removes the menu's <div> element +(and accompanying child nodes) from the document. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + enforceConstraints

          +
          + + + + + void + enforceConstraints + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + focus

          +
          + + + + + void + focus + ( + ) + + +
          + Causes the menu to receive focus and fires the "focus" event. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getItem

          +
          + + + + + YAHOO.widget.MenuItem + getItem + ( + + + p_nItemIndex + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + getItemGroups

          +
          + + + + + Array + getItemGroups + ( + ) + + +
          + Multi-dimensional Array representing the menu items as they +are grouped in the menu. +
          + +
          + + +
          +
          Returns: + + Array +
          +
          +
          + +
          + +
          +
          +

          + getItems

          +
          + + + + + Array + getItems + ( + ) + + +
          + Returns an array of all of the items in the menu. +
          + +
          + + +
          +
          Returns: + + Array +
          +
          +
          + +
          + +
          +
          +

          + getRoot

          +
          + + + + + void + getRoot + ( + ) + + +
          + Finds the menu's root menu. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + hasFocus

          +
          + + + + + Boolean + hasFocus + ( + ) + + +
          + Returns a boolean indicating whether or not the menu has focus. +
          + +
          + + +
          +
          Returns: + + Boolean +
          +
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + p_oElement + + + + + + + + + , + p_oConfig + + + ) + + +
          + 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. +
          + +
          + +
          +
          Parameters:
          +
          + p_oElement <String> + String specifying the id attribute of the +<div> element of the menu. +
          +
          + p_oElement <String> + String specifying the id attribute of the +<select> element to be used as the data source +for the menu. +
          +
          + p_oElement <HTMLDivElement> + Object +specifying the <div> element of the menu. +
          +
          + p_oElement <HTMLSelectElement> + +Object specifying the <select> element to be used as +the data source for the menu. +
          +
          + p_oConfig <Object> + Optional. Object literal specifying the +configuration for the menu. See configuration class documentation for +more details. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initDefaultConfig

          +
          + + + + + void + initDefaultConfig + ( + ) + + +
          + Initializes the class's configurable properties which can be +changed using the menu's Config object ("cfg"). +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initEvents

          +
          + + + + + void + initEvents + ( + ) + + +
          + Initializes the custom events for the menu. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + insertItem

          +
          + + + + + YAHOO.widget.MenuItem + insertItem + ( + + + p_oItem + + + + + + + , + p_nItemIndex + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + removeItem

          +
          + + + + + YAHOO.widget.MenuItem + removeItem + ( + + + p_oObject + + + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + setInitialFocus

          +
          + + + + + void + setInitialFocus + ( + ) + + +
          + Sets focus to the menu's first enabled item. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setInitialSelection

          +
          + + + + + void + setInitialSelection + ( + ) + + +
          + Sets the "selected" configuration property of the menu's first +enabled item to "true." +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setItemGroupTitle

          +
          + + + + + void + setItemGroupTitle + ( + + + p_sGroupTitle + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a string representing the menu. +
          + +
          + + +
          +
          Returns: + + String +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + +
          +

          Events

          +
          +

          + clickEvent

          +
          + + + + + clickEvent + + ( + ) + + + +
          + Fires when the user clicks the on the menu. Passes back the +DOM Event object as an argument. +
          + +
          + + + + +
          + +
          +
          +

          + itemAddedEvent

          +
          + + + + + itemAddedEvent + + ( + ) + + + +
          + Fires when an item is added to the menu. +
          + +
          + + + + +
          + +
          +
          +

          + itemRemovedEvent

          +
          + + + + + itemRemovedEvent + + ( + ) + + + +
          + Fires when an item is removed to the menu. +
          + +
          + + + + +
          + +
          +
          +

          + keyDownEvent

          +
          + + + + + 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. +
          + +
          + + + + +
          + +
          +
          +

          + keyPressEvent

          +
          + + + + + 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. +
          + +
          + + + + +
          + +
          +
          +

          + keyUpEvent

          +
          + + + + + 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. +
          + +
          + + + + +
          + +
          +
          +

          + mouseDownEvent

          +
          + + + + + mouseDownEvent + + ( + ) + + + +
          + Fires when the user mouses down on the menu. Passes back the +DOM Event object as an argument. +
          + +
          + + + + +
          + +
          +
          +

          + mouseOutEvent

          +
          + + + + + mouseOutEvent + + ( + ) + + + +
          + Fires when the mouse has left the menu. Passes back the DOM +Event object as an argument. +
          + +
          + + + + +
          + +
          +
          +

          + mouseOverEvent

          +
          + + + + + mouseOverEvent + + ( + ) + + + +
          + Fires when the mouse has entered the menu. Passes back +the DOM Event object as an argument. +
          + +
          + + + + +
          + +
          +
          +

          + mouseUpEvent

          +
          + + + + + 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. +
          + +
          + + + + +
          + +
          +
          +
          +
          + + + + + +
          +

          Configuration Attributes

          +
          +

          autosubmenudisplay + - Boolean +

          +
          +
          + Boolean indicating if submenus are automatically made +visible when the user mouses over the menu's items. +
          +
          + + +
          + Default Value: true +
          + +
          +

          classname + - String +

          +
          +
          + CSS class to be applied to the menu's root +<div> element. The specified class(es) are +appended in addition to the default class as specified by the menu's +CSS_CLASS_NAME constant. +
          +
          + + +
          + Default Value: null +
          + +
          +

          clicktohide + - Boolean +

          +
          +
          + Boolean indicating if the menu will automatically be +hidden if the user clicks outside of it. +
          +
          + + +
          + Default Value: true +
          + +
          +

          constraintoviewport + - Boolean +

          +
          +
          + Boolean indicating if the menu will try to remain inside +the boundaries of the size of viewport. +
          +
          + + +
          + Default Value: true +
          + +
          +

          container + - HTMLElement|String +

          +
          +
          + HTML element reference or string specifying the id +attribute of the HTML element that the menu's markup should be +rendered into. +
          +
          + + +
          + Default Value: document.body +
          + +
          +

          hidedelay + - Number +

          +
          +
          + Number indicating the time (in milliseconds) that should +expire before the menu is hidden. +
          +
          + + +
          + Default Value: 0 +
          + +
          +

          maxheight + - Number +

          +
          +
          + Defines the maximum height (in pixels) for a menu before the +contents of the body are scrolled. +
          +
          + + +
          + Default Value: 0 +
          + +
          +

          position + - String +

          +
          +
          + 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 Value: dynamic +
          + +
          +

          showdelay + - Number +

          +
          +
          + 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 Value: 250 +
          + +
          +

          submenualignment + - Array +

          +
          +
          + 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 Value: ["tl","tr"] +
          + +
          +

          submenuhidedelay + - Number +

          +
          +
          + Number indicating the time (in milliseconds) that should +expire before a submenu is hidden when the user mouses out of a menu item +heading in the direction of a submenu. The value must be greater than or +equal to the value specified for the "showdelay" configuration property. +
          +
          + + +
          + Default Value: 250 +
          + +
          +

          visible + - Boolean +

          +
          +
          + 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 <div> +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 +<div> element's "display" style property +between "block" (true) or "none" (false). +
          +
          + + +
          + Default Value: false +
          + +
          + +
          +
          + +
          +

          Configuration attributes inherited from YAHOO.widget.Module:

          +
          + + + effect, + monitorresize, + visible + +
          +
          +
          +

          Configuration attributes inherited from YAHOO.widget.Overlay:

          +
          + + + constraintoviewport, + context, + fixedcenter, + height, + iframe, + width, + x, + xy, + y, + zIndex + +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.MenuBarItem.html b/www/extras/yui/docs/YAHOO.widget.MenuBarItem.html new file mode 100644 index 000000000..120b3dc4e --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.MenuBarItem.html @@ -0,0 +1,482 @@ + + + + API: menu YAHOO.widget.MenuBarItem (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Menu  2.2.2

          +

          + Yahoo! UI Library + > menu + > YAHOO.widget.MenuBarItem + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.MenuBarItem + + - extends YAHOO.widget.MenuItem + + + + + + +

          + + + + + +
          + Creates an item for a menu bar. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.MenuBarItem + + ( + + + + p_oObject + + + + + , + p_oConfig + ) + +
          +
          +
          Parameters:
          +
          + p_oObject + <String> + + String specifying the text of the menu bar item. +
          +
          + p_oObject + <HTMLLIElement> + + Object specifying the +<li> element of the menu bar item. +
          +
          + p_oObject + <HTMLOptGroupElement> + + Object +specifying the <optgroup> element of the menu bar item. +
          +
          + p_oObject + <HTMLOptionElement> + + 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. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          CSS_CLASS_NAME + - final String +

          +
          +
          + String representing the CSS class(es) to be applied to the +<li> element of the menu bar item. +
          +
          + + +
          + Default Value: "yuimenubaritem" +
          + + +
          + + +
          +
          + + + +
          +

          Methods

          +
          +

          + init

          +
          + + + + + void + init + ( + + + p_oObject + + + + + + + + + , + p_oConfig + + + ) + + +
          + 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. +
          + +
          + +
          +
          Parameters:
          +
          + p_oObject <String> + String specifying the text of the menu bar item. +
          +
          + p_oObject <HTMLLIElement> + Object specifying the +<li> element of the menu bar item. +
          +
          + p_oObject <HTMLOptGroupElement> + Object +specifying the <optgroup> element of the menu bar item. +
          +
          + p_oObject <HTMLOptionElement> + 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 +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a string representing the menu bar item. +
          + +
          + + +
          +
          Returns: + + String +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + + + + +
          +

          Configuration attributes inherited from YAHOO.widget.MenuItem:

          + +
          + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.MenuItem.html b/www/extras/yui/docs/YAHOO.widget.MenuItem.html new file mode 100644 index 000000000..f7a76812b --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.MenuItem.html @@ -0,0 +1,2717 @@ + + + + API: menu YAHOO.widget.MenuItem (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Menu  2.2.2

          +

          + Yahoo! UI Library + > menu + > YAHOO.widget.MenuItem + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.MenuItem + + + + + + + +

          + + +
          +
          Known Subclasses: +
          + YAHOO.widget.ContextMenuItem + YAHOO.widget.MenuBarItem +
          +
          + + + +
          + Creates an item for a menu. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.MenuItem + + ( + + + + p_oObject + + + + + , + p_oConfig + ) + +
          +
          +
          Parameters:
          +
          + p_oObject + <String> + + String specifying the text of the menu item. +
          +
          + p_oObject + <HTMLLIElement> + + Object specifying +the <li> element of the menu item. +
          +
          + p_oObject + <HTMLOptGroupElement> + + Object +specifying the <optgroup> element of the menu item. +
          +
          + p_oObject + <HTMLOptionElement> + + 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. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _oAnchor + - private HTMLAnchorElement +

          +
          +
          + Object reference to the menu item's +<a> element. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          _oCheckedIndicator + - private HTMLElement +

          +
          +
          + Object reference to the menu item's checkmark image. +
          +
          + + +
          + Default Value: HTMLElement +
          + + +
          +

          _oHelpTextEM + - private HTMLElement +

          +
          +
          + Object reference to the menu item's help text +<em> element. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          _oOnclickAttributeValue + - private Object +

          +
          +
          + Object reference to the menu item's current value for the +"onclick" configuration attribute. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          _oSubmenu + - private YAHOO.widget.Menu +

          +
          +
          + Object reference to the menu item's submenu. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          _oText + - private TextNode +

          +
          +
          + Object reference to the menu item's text node. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          _sClassName + - private String +

          +
          +
          + The current value of the "classname" configuration attribute. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          browser + - String +

          +
          +
          + String representing the browser. +
          +
          + + + + +
          +

          CHECKED_TEXT + - final String +

          +
          +
          + String representing the text to be used for the checked +indicator element (<em>). +
          +
          + + +
          + Default Value: "Checked." +
          + + +
          +

          COLLAPSED_SUBMENU_INDICATOR_TEXT + - final String +

          +
          +
          + String representing the text for the <em> +element used for the submenu arrow indicator. +
          +
          + + +
          + Default Value: "Submenu collapsed. Click to expand submenu." +
          + + +
          +

          constructor + - YAHOO.widget.MenuItem +

          +
          +
          + Object reference to the menu item's constructor function. +
          +
          + + +
          + Default Value: YAHOO.widget.MenuItem +
          + + +
          +

          CSS_CLASS_NAME + - final String +

          +
          +
          + String representing the CSS class(es) to be applied to the +<li> element of the menu item. +
          +
          + + +
          + Default Value: "yuimenuitem" +
          + + +
          +

          DISABLED_CHECKED_TEXT + - final String +

          +
          +
          + String representing the text to be used for the checked +indicator element (<em>) when the menu item +is disabled. +
          +
          + + +
          + Default Value: "Checked. (Item disabled.)" +
          + + +
          +

          DISABLED_SUBMENU_INDICATOR_TEXT + - final String +

          +
          +
          + String representing the text for the submenu arrow indicator +element (<em>) when the menu item is disabled. +
          +
          + + +
          + Default Value: "Submenu collapsed. (Item disabled.)." +
          + + +
          +

          element + - HTMLLIElement +

          +
          +
          + Object reference to the menu item's +<li> element. +
          +
          + + +
          + Default Value: HTMLLIElement +
          + + +
          +

          EXPANDED_SUBMENU_INDICATOR_TEXT + - final String +

          +
          +
          + String representing the text for the submenu arrow indicator +element (<em>) when the submenu is visible. +
          +
          + + +
          + Default Value: "Submenu expanded. Click to collapse submenu." +
          + + +
          +

          groupIndex + - Number +

          +
          +
          + Number indicating the index of the group to which the menu +item belongs. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          id + - String +

          +
          +
          + Id of the menu item's root <li> +element. This property should be set via the constructor using the +configuration object literal. If an id is not specified, then one will +be created using the "generateId" method of the Dom utility. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          index + - Number +

          +
          +
          + Number indicating the ordinal position of the menu item in +its group. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          parent + - YAHOO.widget.Menu +

          +
          +
          + Object reference to the menu item's parent menu. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          srcElement + - HTMLLIElement| +HTMLOptGroupElement|HTMLOptionElement +

          +
          +
          + Object reference to the HTML element (either +<li>, <optgroup> or +<option>) used create the menu item. +
          +
          + + + + + +
          +

          SUBMENU_TYPE + - final YAHOO.widget.Menu +

          +
          +
          + Object representing the type of menu to instantiate and +add when parsing the child nodes of the menu item's source HTML element. +
          +
          + + + + +
          +

          submenuIndicator + - HTMLElement +

          +
          +
          + Object reference to the <em> element +used to create the submenu indicator for the menu item. +
          +
          + + +
          + Default Value: HTMLElement +
          + + +
          +

          value + - Object +

          +
          +
          + Object reference to the menu item's value. +
          +
          + + +
          + Default Value: null +
          + + +
          +

          YAHOO.widget.MenuItem._DEFAULT_CONFIG + - private final Object +

          +
          +
          + Constant representing the MenuItem's configuration properties +
          +
          + + + + +
          +

          YAHOO.widget.MenuItem._EVENT_TYPES + - private final Object +

          +
          +
          + Constant representing the name of the MenuItem's events +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + _checkDOMNode

          +
          + + private + + + Boolean + _checkDOMNode + ( + + + p_oObject + + + ) + + +
          + Determines if an object is an HTML element. +
          + +
          + +
          +
          Parameters:
          +
          + p_oObject <Object> + Object to be evaluated. +
          +
          + +
          +
          Returns: + + Boolean +
          +
          +
          + +
          + +
          +
          +

          + _createRootNodeStructure

          +
          + + private + + + void + _createRootNodeStructure + ( + ) + + +
          + Creates the core DOM structure for the menu item. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _getFirstElement

          +
          + + private + + + HTMLElement + _getFirstElement + ( + + + p_oElement + + + , + p_sTagName + + + ) + + +
          + Returns an HTML element's first HTML element node. +
          + +
          + +
          +
          Parameters:
          +
          + p_oElement <HTMLElement> + Object +reference specifying the element to be evaluated. +
          +
          + p_sTagName <String> + Optional. String specifying the tagname of +the element to be retrieved. +
          +
          + +
          +
          Returns: + + HTMLElement +
          +
          +
          + +
          + +
          +
          +

          + _initSubTree

          +
          + + private + + + void + _initSubTree + ( + ) + + +
          + Iterates the source element's childNodes collection and uses +the child nodes to instantiate other menus. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + blur

          +
          + + + + + void + blur + ( + ) + + +
          + Causes the menu item to lose focus and fires the +blur event. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configChecked

          +
          + + + + + void + configChecked + ( + + + p_sType + + + , + p_aArgs + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configClassName

          +
          + + + + + void + configClassName + ( + + + p_sType + + + , + p_aArgs + + + , + p_oItem + + + ) + + +
          + Event handler for when the "classname" configuration +property of a 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 +
          +
          +
          + +
          + +
          +
          +

          + configDisabled

          +
          + + + + + void + configDisabled + ( + + + p_sType + + + , + p_aArgs + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configEmphasis

          +
          + + + + + void + configEmphasis + ( + + + p_sType + + + , + p_aArgs + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configHelpText

          +
          + + + + + void + configHelpText + ( + + + p_sType + + + , + p_aArgs + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configOnClick

          +
          + + + + + void + configOnClick + ( + + + p_sType + + + , + p_aArgs + + + , + p_oItem + + + ) + + +
          + Event handler for when the "onclick" 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 +
          +
          +
          + +
          + +
          +
          +

          + configSelected

          +
          + + + + + void + configSelected + ( + + + p_sType + + + , + p_aArgs + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configStrongEmphasis

          +
          + + + + + void + configStrongEmphasis + ( + + + p_sType + + + , + p_aArgs + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configSubmenu

          +
          + + + + + void + configSubmenu + ( + + + p_sType + + + , + p_aArgs + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configTarget

          +
          + + + + + void + configTarget + ( + + + p_sType + + + , + p_aArgs + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configText

          +
          + + + + + void + configText + ( + + + p_sType + + + , + p_aArgs + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configURL

          +
          + + + + + void + configURL + ( + + + p_sType + + + , + p_aArgs + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + destroy

          +
          + + + + + void + destroy + ( + ) + + +
          + Removes the menu item's <li> element +from its parent <ul> element. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + focus

          +
          + + + + + void + focus + ( + ) + + +
          + Causes the menu item to receive the focus and fires the +focus event. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getNextEnabledSibling

          +
          + + + + + void + getNextEnabledSibling + ( + ) + + +
          + Finds the menu item's next enabled sibling. +
          + +
          + + +
          +
          Returns: + + void +
          +
          YAHOO.widget.MenuItem
          +
          + +
          + +
          +
          +

          + getPreviousEnabledSibling

          +
          + + + + + YAHOO.widget.MenuItem + getPreviousEnabledSibling + ( + ) + + +
          + Finds the menu item's previous enabled sibling. +
          + +
          + + +
          +
          Returns: + + YAHOO.widget.MenuItem +
          +
          +
          + +
          + +
          +
          +

          + hasFocus

          +
          + + + + + Boolean + hasFocus + ( + ) + + +
          + Returns a boolean indicating whether or not the menu item +has focus. +
          + +
          + + +
          +
          Returns: + + Boolean +
          +
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + p_oObject + + + + + + + + + , + p_oConfig + + + ) + + +
          + 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. +
          + +
          + +
          +
          Parameters:
          +
          + p_oObject <String> + String specifying the text of the menu item. +
          +
          + p_oObject <HTMLLIElement> + Object specifying +the <li> element of the menu item. +
          +
          + p_oObject <HTMLOptGroupElement> + Object +specifying the <optgroup> element of the menu item. +
          +
          + p_oObject <HTMLOptionElement> + 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 +
          +
          +
          + +
          + +
          +
          +

          + initDefaultConfig

          +
          + + + + + void + initDefaultConfig + ( + ) + + +
          + Initializes an item's configurable properties. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a string representing the menu item. +
          + +
          + + +
          +
          Returns: + + String +
          +
          +
          + +
          + +
          +
          +
          +
          + + +
          +

          Events

          +
          +

          + blurEvent

          +
          + + + + + blurEvent + + ( + ) + + + +
          + Fires when the menu item loses the input focus. +
          + +
          + + + + +
          + +
          +
          +

          + clickEvent

          +
          + + + + + clickEvent + + ( + ) + + + +
          + Fires when the user clicks the on the menu item. Passes +back the DOM Event object as an argument. +
          + +
          + + + + +
          + +
          +
          +

          + destroyEvent

          +
          + + + + + destroyEvent + + ( + ) + + + +
          + Fires when the menu item's <li> +element is removed from its parent <ul> element. +
          + +
          + + + + +
          + +
          +
          +

          + focusEvent

          +
          + + + + + focusEvent + + ( + ) + + + +
          + Fires when the menu item receives focus. +
          + +
          + + + + +
          + +
          +
          +

          + keyDownEvent

          +
          + + + + + keyDownEvent + + ( + ) + + + +
          + Fires when the user presses a key when the menu item has +focus. Passes back the DOM Event object as an argument. +
          + +
          + + + + +
          + +
          +
          +

          + keyPressEvent

          +
          + + + + + keyPressEvent + + ( + ) + + + +
          + Fires when the user presses an alphanumeric key when the +menu item has focus. Passes back the DOM Event object as an argument. +
          + +
          + + + + +
          + +
          +
          +

          + keyUpEvent

          +
          + + + + + keyUpEvent + + ( + ) + + + +
          + Fires when the user releases a key when the menu item has +focus. Passes back the DOM Event object as an argument. +
          + +
          + + + + +
          + +
          +
          +

          + mouseDownEvent

          +
          + + + + + mouseDownEvent + + ( + ) + + + +
          + Fires when the user mouses down on the menu item. Passes +back the DOM Event object as an argument. +
          + +
          + + + + +
          + +
          +
          +

          + mouseOutEvent

          +
          + + + + + mouseOutEvent + + ( + ) + + + +
          + Fires when the mouse has left the menu item. Passes back +the DOM Event object as an argument. +
          + +
          + + + + +
          + +
          +
          +

          + mouseOverEvent

          +
          + + + + + mouseOverEvent + + ( + ) + + + +
          + Fires when the mouse has entered the menu item. Passes +back the DOM Event object as an argument. +
          + +
          + + + + +
          + +
          +
          +

          + mouseUpEvent

          +
          + + + + + 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. +
          + +
          + + + + +
          + +
          +
          +
          +
          + + + +
          +

          Configuration Attributes

          +
          +

          checked + - Boolean +

          +
          +
          + Boolean indicating if the menu item should be rendered +with a checkmark. +
          +
          + + +
          + Default Value: false +
          + +
          +

          classname + - String +

          +
          +
          + CSS class to be applied to the menu item's root +<li> element. The specified class(es) are +appended in addition to the default class as specified by the menu +item's CSS_CLASS_NAME constant. +
          +
          + + +
          + Default Value: null +
          + +
          +

          disabled + - Boolean +

          +
          +
          + 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 Value: false +
          + +
          +

          emphasis + - Boolean +

          +
          +
          + 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 Value: false +
          + +
          +

          helptext + - String| +HTMLElement +

          +
          +
          + String specifying additional instructional text to +accompany the text for the nenu item. +
          +
          + + +
          + Default Value: null +
          + +
          +

          onclick + - Object +

          +
          +
          + Object literal representing the code to be executed when +the button is clicked. Format:
          {
          +fn: Function, // The handler to call when +the event fires.
          obj: Object, // An +object to pass back to the handler.
          scope: +Object // The object to use for the scope of the handler. +
          }
          +
          +
          + + +
          + Default Value: null +
          + +
          +

          selected + - Boolean +

          +
          +
          + Boolean indicating if the menu item should +be highlighted. +
          +
          + + +
          + Default Value: false +
          + +
          +

          strongemphasis + - Boolean +

          +
          +
          + 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 Value: false +
          + +
          +

          submenu + - Menu|String|Object| +HTMLElement +

          +
          +
          + Object specifying the submenu to be appended to the +menu item. The value can be one of the following:
          • Object +specifying a Menu instance.
          • Object literal specifying the +menu to be created. Format: { id: [menu id], itemdata: +[array of values for +items] }.
          • String specifying the id attribute +of the <div> element of the menu.
          • +Object specifying the <div> element of the +menu.
          +
          +
          + + +
          + Default Value: null +
          + +
          +

          target + - String +

          +
          +
          + String specifying the value for the "target" attribute +of the menu item's anchor element. 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. +When building a menu from existing HTML the value of this property +will be interpreted from the menu's markup. +
          +
          + + +
          + Default Value: null +
          + +
          +

          text + - String +

          +
          +
          + 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 Value: "" +
          + +
          +

          url + - String +

          +
          +
          + 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 Value: "#" +
          + +
          + +
          +
          + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.MenuManager.html b/www/extras/yui/docs/YAHOO.widget.MenuManager.html new file mode 100644 index 000000000..d42228bb0 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.MenuManager.html @@ -0,0 +1,1071 @@ + + + + API: menu YAHOO.widget.MenuManager (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Menu  2.2.2

          +

          + Yahoo! UI Library + > menu + > YAHOO.widget.MenuManager + +

          +
          + +
          +
          +
          + + +

          + + + static + + Class YAHOO.widget.MenuManager + + + + + + + +

          + + + + + +
          + 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. +
          + + + + +
          +

          Methods

          +
          +

          + addItem

          +
          + + private + + + void + addItem + ( + + + p_oItem + + + ) + + +
          + Adds an item to the collection of known menu items. +
          + +
          + +
          +
          Parameters:
          +
          + p_oItem <YAHOO.widget.MenuItem> + Object specifying the MenuItem +instance to be added. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + addMenu

          +
          + + + + + void + addMenu + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + getFocusedMenu

          +
          + + + + + YAHOO.widget.Menu + getFocusedMenu + ( + ) + + +
          + Returns a reference to the menu that currently has focus. +
          + +
          + + +
          +
          Returns: + + YAHOO.widget.Menu +
          +
          +
          + +
          + +
          +
          +

          + getFocusedMenuItem

          +
          + + + + + YAHOO.widget.MenuItem + getFocusedMenuItem + ( + ) + + +
          + Returns a reference to the menu item that currently +has focus. +
          + +
          + + +
          +
          Returns: + + YAHOO.widget.MenuItem +
          +
          +
          + +
          + +
          +
          +

          + getMenu

          +
          + + + + + YAHOO.widget.Menu + getMenu + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + getMenuRootElement

          +
          + + private + + + void + getMenuRootElement + ( + + + p_oElement + + + ) + + +
          + Finds the root DIV node of a menu or the root LI node of a +menu item. +
          + +
          + +
          +
          Parameters:
          +
          + p_oElement <HTMLElement> + Object specifying +an HTML element. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getMenus

          +
          + + + + + Array + getMenus + ( + ) + + +
          + Returns an array of all menus registered with the +menu manger. +
          + +
          + + +
          +
          Returns: + + Array +
          +
          +
          + +
          + +
          +
          +

          + hideVisible

          +
          + + + + + void + hideVisible + ( + ) + + +
          + Hides all visible, dynamically positioned menus. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onDOMEvent

          +
          + + private + + + void + onDOMEvent + ( + + + p_oEvent + + + ) + + +
          + 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. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onItemAdded

          +
          + + private + + + void + onItemAdded + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + "itemadded" event handler for a Menu instance. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onItemDestroy

          +
          + + private + + + void + onItemDestroy + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + "destroy" event handler for a MenuItem instance. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onItemRemoved

          +
          + + private + + + void + onItemRemoved + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + "itemremoved" event handler for a Menu instance. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onMenuBlur

          +
          + + private + + + void + onMenuBlur + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + "blur" event handler for a MenuItem instance. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onMenuDestroy

          +
          + + private + + + void + onMenuDestroy + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + "destroy" event handler for a menu. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onMenuFocus

          +
          + + private + + + void + onMenuFocus + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + "focus" event handler for a MenuItem instance. +
          + +
          + +
          +
          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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onMenuVisibleConfigChange

          +
          + + private + + + void + onMenuVisibleConfigChange + ( + + + p_sType + + + , + p_aArgs + + + ) + + +
          + Event handler for when the "visible" configuration property +of a Menu instance 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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + removeItem

          +
          + + private + + + void + removeItem + ( + + + p_oItem + + + ) + + +
          + Removes an item from the collection of known menu items. +
          + +
          + +
          +
          Parameters:
          +
          + p_oItem <YAHOO.widget.MenuItem> + Object specifying the MenuItem +instance to be removed. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + removeMenu

          +
          + + + + + void + removeMenu + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a string representing the menu manager. +
          + +
          + + +
          +
          Returns: + + String +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.MenuNode.html b/www/extras/yui/docs/YAHOO.widget.MenuNode.html new file mode 100644 index 000000000..3f0cf2dc9 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.MenuNode.html @@ -0,0 +1,335 @@ + + + + API: treeview YAHOO.widget.MenuNode (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + > YAHOO.widget.MenuNode + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.MenuNode + + - extends YAHOO.widget.TextNode + + + + + + +

          + + + + + +
          + A menu-specific implementation that differs from TextNode in that only +one sibling can be expanded at a time. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.MenuNode + + ( + + + + oData + + , + oParent + + , + expanded + ) + +
          +
          +
          Parameters:
          +
          + oData + <object> + + a string or object containing the data that will +be used to render this node +
          +
          + oParent + <YAHOO.widget.Node> + + this node's parent node +
          +
          + expanded + <boolean> + + the initial expanded/collapsed state +
          +
          + + +
          +
          +
          +
          + + +
          +

          Properties inherited from YAHOO.widget.TextNode:

          +
          + + + label, + labelElId, + labelStyle + +
          +
          + +
          +

          Properties inherited from YAHOO.util.EventProvider:

          + +
          + + +
          +

          Methods inherited from YAHOO.widget.TextNode:

          +
          + + + getLabelEl, + onLabelClick + +
          +
          + +
          +

          Methods inherited from YAHOO.util.EventProvider:

          + +
          + + + +
          +

          Events inherited from YAHOO.widget.Node:

          +
          + + + parentChange + +
          +
          + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.Menubar.html b/www/extras/yui/docs/YAHOO.widget.Menubar.html new file mode 100644 index 000000000..25e3c29a7 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.Menubar.html @@ -0,0 +1,947 @@ + + + + API: menu YAHOO.widget.Menubar (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Menu  2.2.2

          +

          + Yahoo! UI Library + > menu + > YAHOO.widget.Menubar + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.Menubar + + - extends YAHOO.widget.Menu + + + + + + +

          + + + + + +
          + Horizontal collection of items, each of which can contain a submenu. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.Menubar + + ( + + + + p_oElement + + + + + , + p_oConfig + ) + +
          +
          +
          Parameters:
          +
          + p_oElement + <String> + + String specifying the id attribute of the +<div> element of the menu bar. +
          +
          + p_oElement + <String> + + String specifying the id attribute of the +<select> element to be used as the data source for the +menu bar. +
          +
          + p_oElement + <HTMLDivElement> + + Object specifying +the <div> element of the menu bar. +
          +
          + p_oElement + <HTMLSelectElement> + + Object +specifying the <select> element to be used as the data +source for the menu bar. +
          +
          + p_oConfig + <Object> + + Optional. Object literal specifying the +configuration for the menu bar. See configuration class documentation for +more details. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          CSS_CLASS_NAME + - final String +

          +
          +
          + String representing the CSS class(es) to be applied to the menu +bar's <div> element. +
          +
          + + +
          + Default Value: "yuimenubar" +
          + + +
          +

          YAHOO.widget.MenuBar._DEFAULT_CONFIG + - private final Object +

          +
          +
          + Constant representing the MenuBar's configuration properties +
          +
          + + + + +
          + + +
          +
          + + + + + +
          +

          Methods

          +
          +

          + _onClick

          +
          + + protected + + + void + _onClick + ( + + + p_sType + + + , + p_aArgs + + + , + p_oMenuBar + + + ) + + +
          + "click" event handler for the menu bar. +
          + +
          + +
          +
          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 +
          +
          +
          + +
          + +
          +
          +

          + _onKeyDown

          +
          + + private + + + void + _onKeyDown + ( + + + p_sType + + + , + p_aArgs + + + , + p_oMenuBar + + + ) + + +
          + "keydown" Custom Event handler for the menu bar. +
          + +
          + +
          +
          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 +
          +
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + p_oElement + + + + + + + + + , + p_oConfig + + + ) + + +
          + 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. +
          + +
          + +
          +
          Parameters:
          +
          + p_oElement <String> + String specifying the id attribute of the +<div> element of the menu bar. +
          +
          + p_oElement <String> + String specifying the id attribute of the +<select> element to be used as the data source for the +menu bar. +
          +
          + p_oElement <HTMLDivElement> + Object specifying +the <div> element of the menu bar. +
          +
          + p_oElement <HTMLSelectElement> + Object +specifying the <select> element to be used as the data +source for the menu bar. +
          +
          + p_oConfig <Object> + Optional. Object literal specifying the +configuration for the menu bar. See configuration class documentation for +more details. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initDefaultConfig

          +
          + + + + + void + initDefaultConfig + ( + ) + + +
          + Initializes the class's configurable properties which can be +changed using the menu bar's Config object ("cfg"). +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a string representing the menu bar. +
          + +
          + + +
          +
          Returns: + + String +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + + + + + + + +
          +

          Configuration Attributes

          +
          +

          autosubmenudisplay + - Boolean +

          +
          +
          + Boolean indicating if submenus are automatically made +visible when the user mouses over the menu bar's items. +
          +
          + + +
          + Default Value: false +
          + +
          +

          position + - String +

          +
          +
          + 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 Value: static +
          + +
          +

          submenualignment + - Array +

          +
          +
          + Array defining how submenus should be aligned to their +parent menu bar item. The format is: [itemCorner, submenuCorner]. +
          +
          + + +
          + Default Value: ["tl","bl"] +
          + +
          + +
          +
          + +
          +

          Configuration attributes inherited from YAHOO.widget.Overlay:

          +
          + + + constraintoviewport, + context, + fixedcenter, + height, + iframe, + width, + x, + xy, + y, + zIndex + +
          +
          +
          +

          Configuration attributes inherited from YAHOO.widget.Module:

          +
          + + + effect, + monitorresize, + visible + +
          +
          + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.Module.html b/www/extras/yui/docs/YAHOO.widget.Module.html new file mode 100644 index 000000000..b6458db82 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.Module.html @@ -0,0 +1,1980 @@ + + + + API: container YAHOO.widget.Module (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + > YAHOO.widget.Module + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.Module + + + + + + + +

          + + +
          +
          Known Subclasses: +
          + YAHOO.widget.Overlay +
          +
          + + + +
          + 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. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.Module + + ( + + + + el + + + , + 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. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          body + - HTMLElement +

          +
          +
          + The body element, denoted with CSS class "bd" +
          +
          + + + + +
          +

          browser + - String +

          +
          +
          + String representing the current user-agent browser +
          +
          + + + + +
          +

          cfg + - YAHOO.util.Config +

          +
          +
          + The Module's Config object used for monitoring configuration properties. +
          +
          + + + + +
          +

          contructor + - Function +

          +
          +
          + The class's constructor function +
          +
          + + + + +
          +

          element + - HTMLElement +

          +
          +
          + The main module element that contains the header, body, and footer +
          +
          + + + + +
          +

          footer + - HTMLElement +

          +
          +
          + The footer element, denoted with CSS class "ft" +
          +
          + + + + +
          +

          header + - HTMLElement +

          +
          +
          + The header element, denoted with CSS class "hd" +
          +
          + + + + +
          +

          id + - String +

          +
          +
          + The id of the element +
          +
          + + + + +
          +

          imageRoot + - String +

          +
          +
          + The String representing the image root +
          +
          + + + + +
          +

          isSecure + - Boolean +

          +
          +
          + Boolean representing whether or not the current browsing context is secure (https) +
          +
          + + + + +
          +

          platform + - String +

          +
          +
          + String representing the current user-agent platform +
          +
          + + + + +
          +

          YAHOO.widget.Module._DEFAULT_CONFIG + - private final Object +

          +
          +
          + Constant representing the Module's configuration properties +
          +
          + + + + +
          +

          YAHOO.widget.Module._EVENT_TYPES + - private final Object +

          +
          +
          + Constant representing the name of the Module's events +
          +
          + + + + +
          +

          YAHOO.widget.Module.CSS_BODY + - static final String +

          +
          +
          + Constant representing the module body +
          +
          + + + + +
          +

          YAHOO.widget.Module.CSS_FOOTER + - static final String +

          +
          +
          + Constant representing the module footer +
          +
          + + + + +
          +

          YAHOO.widget.Module.CSS_HEADER + - static final String +

          +
          +
          + Constant representing the module header +
          +
          + + + + +
          +

          YAHOO.widget.Module.CSS_MODULE + - static final String +

          +
          +
          + Constant for the default CSS class name that represents a Module +
          +
          + + + + +
          +

          YAHOO.widget.Module.IMG_ROOT + - static final String +

          +
          +
          + Constant representing the prefix path to use for non-secure images +
          +
          + + + + +
          +

          YAHOO.widget.Module.IMG_ROOT_SSL + - static final String +

          +
          +
          + Constant representing the prefix path to use for securely served images +
          +
          + + + + +
          +

          YAHOO.widget.Module.RESIZE_MONITOR_SECURE_URL + - static final String +

          +
          +
          + Constant representing the url for the "src" attribute of the iframe used to monitor changes to the browser's base font size +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + appendToBody

          +
          + + + + + void + appendToBody + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + appendToFooter

          +
          + + + + + void + appendToFooter + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + appendToHeader

          +
          + + + + + void + appendToHeader + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + configMonitorResize

          +
          + + + + + void + configMonitorResize + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configVisible

          +
          + + + + + void + configVisible + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + destroy

          +
          + + + + + void + destroy + ( + ) + + +
          + Removes the Module element from the DOM and sets all child elements to null. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + hide

          +
          + + + + + void + 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. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + el + + + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + initDefaultConfig

          +
          + + + + + void + initDefaultConfig + ( + ) + + +
          + Initializes the custom events for Module which are fired automatically at appropriate times by the Module class. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initEvents

          +
          + + + + + void + initEvents + ( + ) + + +
          + Initializes the custom events for Module which are fired automatically at appropriate times by the Module class. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initResizeMonitor

          +
          + + + + + void + initResizeMonitor + ( + ) + + +
          + Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onDomResize

          +
          + + + + + void + onDomResize + ( + + + e + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + render

          +
          + + + + + Boolean + render + ( + + + appendToNode + + + + + , + 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
          +
          + +
          + +
          +
          +

          + setBody

          +
          + + + + + void + setBody + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + setFooter

          +
          + + + + + void + setFooter + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + setHeader

          +
          + + + + + void + setHeader + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + show

          +
          + + + + + void + 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. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a String representation of the Object. +
          + +
          + + +
          +
          Returns: + + String +
          +
          The string representation of the Module
          +
          + +
          + +
          +
          +
          +
          + + +
          +

          Events

          +
          +

          + appendEvent

          +
          + + + + + appendEvent + + ( + ) + + + +
          + CustomEvent fired when the Module is appended to the DOM +
          + +
          + + + + +
          + +
          +
          +

          + beforeHideEvent

          +
          + + + + + beforeHideEvent + + ( + ) + + + +
          + CustomEvent fired before the Module is hidden +
          + +
          + + + + +
          + +
          +
          +

          + beforeInitEvent

          +
          + + + + + beforeInitEvent + + ( + + + classRef + + + ) + + + +
          + CustomEvent fired prior to class initalization. +
          + +
          + + +
          +
          Parameters:
          +
          + classRef <class> + class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module) +
          +
          + + +
          + +
          +
          +

          + beforeRenderEvent

          +
          + + + + + beforeRenderEvent + + ( + ) + + + +
          + CustomEvent fired before the Module is rendered +
          + +
          + + + + +
          + +
          +
          +

          + beforeShowEvent

          +
          + + + + + beforeShowEvent + + ( + ) + + + +
          + CustomEvent fired before the Module is shown +
          + +
          + + + + +
          + +
          +
          +

          + changeBodyEvent

          +
          + + + + + changeBodyEvent + + ( + + + content + + + ) + + + +
          + CustomEvent fired when the body content of the Module is modified +
          + +
          + + +
          +
          Parameters:
          +
          + content <String/HTMLElement> + String/element representing the new body content +
          +
          + + +
          + +
          +
          +

          + changeContentEvent

          +
          + + + + + changeContentEvent + + ( + ) + + + +
          + CustomEvent fired when the content of the Module is modified +
          + +
          + + + + +
          + +
          +
          +

          + changeFooterEvent

          +
          + + + + + changeFooterEvent + + ( + + + content + + + ) + + + +
          + CustomEvent fired when the footer content of the Module is modified +
          + +
          + + +
          +
          Parameters:
          +
          + content <String/HTMLElement> + String/element representing the new footer content +
          +
          + + +
          + +
          +
          +

          + changeHeaderEvent

          +
          + + + + + changeHeaderEvent + + ( + + + content + + + ) + + + +
          + CustomEvent fired when the header content of the Module is modified +
          + +
          + + +
          +
          Parameters:
          +
          + content <String/HTMLElement> + String/element representing the new header content +
          +
          + + +
          + +
          +
          +

          + destroyEvent

          +
          + + + + + destroyEvent + + ( + ) + + + +
          + CustomEvent fired when the Module is destroyed +
          + +
          + + + + +
          + +
          +
          +

          + hideEvent

          +
          + + + + + hideEvent + + ( + ) + + + +
          + CustomEvent fired after the Module is hidden +
          + +
          + + + + +
          + +
          +
          +

          + initEvent

          +
          + + + + + initEvent + + ( + + + classRef + + + ) + + + +
          + CustomEvent fired after class initalization. +
          + +
          + + +
          +
          Parameters:
          +
          + classRef <class> + class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module) +
          +
          + + +
          + +
          +
          +

          + renderEvent

          +
          + + + + + renderEvent + + ( + ) + + + +
          + CustomEvent fired after the Module is rendered +
          + +
          + + + + +
          + +
          +
          +

          + showEvent

          +
          + + + + + showEvent + + ( + ) + + + +
          + CustomEvent fired after the Module is shown +
          + +
          + + + + +
          + +
          +
          +

          + YAHOO.widget.Module.textResizeEvent

          +
          + + + + + YAHOO.widget.Module.textResizeEvent + + ( + ) + + + +
          + Singleton CustomEvent fired when the font size is changed in the browser. +Opera's "zoom" functionality currently does not support text size detection. +
          + +
          + + + + +
          + +
          +
          +
          +
          + + + +
          +

          Configuration Attributes

          +
          +

          effect + - Object +

          +
          +
          + Object or array of objects representing the ContainerEffect classes that are active for animating the container. +
          +
          + + +
          + Default Value: null +
          + +
          +

          monitorresize + - Boolean +

          +
          +
          + Specifies whether to create a special proxy iframe to monitor for user font resizing in the document +
          +
          + + +
          + Default Value: true +
          + +
          +

          visible + - Boolean +

          +
          +
          + Specifies whether the Module is visible on the page. +
          +
          + + +
          + Default Value: true +
          + +
          + +
          +
          + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.Node.html b/www/extras/yui/docs/YAHOO.widget.Node.html new file mode 100644 index 000000000..d1bd43999 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.Node.html @@ -0,0 +1,2227 @@ + + + + API: treeview YAHOO.widget.Node (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + > YAHOO.widget.Node + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.Node + + + + + - uses + + YAHOO.util.EventProvider + + + + +

          + + +
          +
          Known Subclasses: +
          + YAHOO.widget.HTMLNode + YAHOO.widget.RootNode + YAHOO.widget.TextNode +
          +
          + + + +
          + The base class for all tree nodes. The node's presentation and behavior in +response to mouse events is handled in Node subclasses. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.Node + + ( + + + + oData + + , + oParent + + , + expanded + ) + +
          +
          +
          Parameters:
          +
          + oData + <object> + + a string or object containing the data that will +be used to render this node +
          +
          + oParent + <Node> + + this node's parent node +
          +
          + expanded + <boolean> + + the initial expanded/collapsed state +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _dynLoad + - private boolean +

          +
          +
          + We can set the node up to call an external method to get the child +data dynamically. +
          +
          + + + + +
          +

          _type + - private object +

          +
          +
          + The node type +
          +
          + + + + +
          +

          children + - Node[] +

          +
          +
          + This node's child node collection. +
          +
          + + + + +
          +

          childrenRendered + - boolean +

          +
          +
          + 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. +
          +
          + + + + +
          +

          data + - object +

          +
          +
          + The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml(). +
          +
          + + + + +
          +

          dataLoader + - function +

          +
          +
          + Function to execute when we need to get this node's child data. +
          +
          + + + + +
          +

          depth + - int +

          +
          +
          + The depth of this node. We start at -1 for the root node. +
          +
          + + + + +
          +

          dynamicLoadComplete + - boolean +

          +
          +
          + 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. +
          +
          + + + + +
          +

          expanded + - boolean +

          +
          +
          + The node's expanded/collapsed state +
          +
          + + + + +
          +

          hasIcon + - boolean +

          +
          +
          + 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. +
          +
          + + + + +
          +

          href + - string +

          +
          +
          + The href for the node's label. If one is not specified, the href will +be set so that it toggles the node. +
          +
          + + + + +
          +

          iconMode + - int +

          +
          +
          + 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. +
          +
          + + + + +
          +

          index + - int +

          +
          +
          + The index for this instance obtained from global counter in YAHOO.widget.TreeView. +
          +
          + + + + +
          +

          isLoading + - boolean +

          +
          +
          + This is true for dynamically loading nodes while waiting for the +callback to return. +
          +
          + + + + +
          +

          multiExpand + - boolean +

          +
          +
          + Can multiple children be expanded at once? +
          +
          + + + + +
          +

          nextSibling + - Node +

          +
          +
          + This node's next sibling +
          +
          + + + + +
          +

          nowrap + - boolean +

          +
          +
          + Specifies whether or not the content area of the node should be allowed +to wrap. +
          +
          + + +
          + Default Value: false +
          + + +
          +

          parent + - Node +

          +
          +
          + Parent node +
          +
          + + + + +
          +

          previousSibling + - Node +

          +
          +
          + This node's previous sibling +
          +
          + + + + +
          +

          renderHidden + - boolean +

          +
          +
          + 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. +
          +
          + + + + +
          +

          target + - string +

          +
          +
          + The label href target, defaults to current window +
          +
          + + + + +
          +

          tree + - TreeView +

          +
          +
          + Tree instance this node is part of +
          +
          + + + + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Methods

          +
          +

          + appendChild

          +
          + + private + + + Node + appendChild + ( + + + childNode + + + ) + + +
          + Appends a node to the child collection. +
          + +
          + +
          +
          Parameters:
          +
          + childNode <Node> + the new node +
          +
          + +
          +
          Returns: + + Node +
          +
          the child node
          +
          + +
          + +
          +
          +

          + appendTo

          +
          + + + + + Node + appendTo + ( + + + parentNode + + + ) + + +
          + Appends this node to the supplied node's child collection +
          + +
          + +
          +
          Parameters:
          +
          + parentNode <Node> + the node to append to. +
          +
          + +
          +
          Returns: + + Node +
          +
          The appended node
          +
          + +
          + +
          +
          +

          + applyParent

          +
          + + + + + boolean + applyParent + ( + + + 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
          +
          + +
          + +
          +
          +

          + collapse +toggle style.

          +
          + + + + + void + collapse +toggle style. + ( + ) + + +
          + Hides this nodes children (creating them if necessary), changes the +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + collapseAll

          +
          + + + + + void + collapseAll + ( + ) + + +
          + Recursively collapses all of this node's children. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + completeRender

          +
          + + + + + string + completeRender + ( + ) + + +
          + Called when we know we have all the child data. +
          + +
          + + +
          +
          Returns: + + string +
          +
          children html
          +
          + +
          + +
          +
          +

          + expand

          +
          + + + + + void + expand + ( + ) + + +
          + Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multiExpand is not set. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + expandAll

          +
          + + + + + void + expandAll + ( + ) + + +
          + Recursively expands all of this node's children. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getAncestor

          +
          + + + + + Node + getAncestor + ( + + + depth + + + ) + + +
          + Returns this node's ancestor at the specified depth. +
          + +
          + +
          +
          Parameters:
          +
          + depth <int> + the depth of the ancestor. +
          +
          + +
          +
          Returns: + + Node +
          +
          the ancestor
          +
          + +
          + +
          +
          +

          + getChildrenEl

          +
          + + + + + HTMLElement + getChildrenEl + ( + ) + + +
          + Returns the div that was generated for this node's children +
          + +
          + + +
          +
          Returns: + + HTMLElement +
          +
          this node's children div
          +
          + +
          + +
          +
          +

          + getChildrenElId

          +
          + + + + + string + getChildrenElId + ( + ) + + +
          + Returns the id for this node's children div +
          + +
          + + +
          +
          Returns: + + string +
          +
          the element id for this node's children div
          +
          + +
          + +
          +
          +

          + getChildrenHtml

          +
          + + private + + + string + getChildrenHtml + ( + ) + + +
          + 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. +
          + +
          + + +
          +
          Returns: + + string +
          +
          the children container div html and any expanded children
          +
          + +
          + +
          +
          +

          + getDepthStyle

          +
          + + + + + string + getDepthStyle + ( + + + 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
          +
          + +
          + +
          +
          +

          + getEl

          +
          + + + + + HTMLElement + getEl + ( + ) + + +
          + Returns this node's container html element +
          + +
          + + +
          +
          Returns: + + HTMLElement +
          +
          the container html element
          +
          + +
          + +
          +
          +

          + getElId

          +
          + + + + + string + getElId + ( + ) + + +
          + Returns the id for this node's container div +
          + +
          + + +
          +
          Returns: + + string +
          +
          the element id
          +
          + +
          + +
          +
          +

          + getHoverStyle

          +
          + + + + + string + getHoverStyle + ( + ) + + +
          + Returns the hover style for the icon +
          + +
          + + +
          +
          Returns: + + string +
          +
          the css class hover state
          +
          + +
          + +
          +
          +

          + getHtml

          +
          + + + + + string + getHtml + ( + ) + + +
          + Returns the markup for this node and its children. +
          + +
          + + +
          +
          Returns: + + string +
          +
          the markup for this node and its expanded children.
          +
          + +
          + +
          +
          +

          + getIconMode

          +
          + + + + + int + getIconMode + ( + ) + + +
          + Returns the current icon mode. This refers to the way childless dynamic +load nodes appear. +
          + +
          + + +
          +
          Returns: + + int +
          +
          0 for collapse style, 1 for leaf node style
          +
          + +
          + +
          +
          +

          + getNodeHtml

          +
          + + + + + string + getNodeHtml + ( + ) + + +
          + Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes. +
          + +
          + + +
          +
          Returns: + + string +
          +
          The HTML that will render this node.
          +
          + +
          + +
          +
          +

          + getSiblings

          +
          + + + + + void + getSiblings + ( + ) + + +
          + Returns a node array of this node's siblings, null if none. +
          + +
          + + +
          +
          Returns: + + void +
          +
          Node[]
          +
          + +
          + +
          +
          +

          + getStyle

          +
          + + + + + string + getStyle + ( + ) + + +
          + Returns the css style name for the toggle +
          + +
          + + +
          +
          Returns: + + string +
          +
          the css class for this node's toggle
          +
          + +
          + +
          +
          +

          + getToggleEl

          +
          + + + + + HTMLElement + getToggleEl + ( + ) + + +
          + Returns the element that is being used for this node's toggle. +
          + +
          + + +
          +
          Returns: + + HTMLElement +
          +
          this node's toggle html element
          +
          + +
          + +
          +
          +

          + getToggleElId

          +
          + + + + + string + getToggleElId + ( + ) + + +
          + Returns the id for this node's toggle element +
          + +
          + + +
          +
          Returns: + + string +
          +
          the toggel element id
          +
          + +
          + +
          +
          +

          + getToggleLink

          +
          + + + + + string + getToggleLink + ( + ) + + +
          + Generates the link that will invoke this node's toggle method +
          + +
          + + +
          +
          Returns: + + string +
          +
          the javascript url for toggling this node
          +
          + +
          + +
          +
          +

          + hasChildren

          +
          + + + + + boolean + hasChildren + ( + + + checkForLazyLoad + + + ) + + +
          + 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:
          +
          + checkForLazyLoad <boolean> + should we check for unloaded children? +
          +
          + +
          +
          Returns: + + boolean +
          +
          true if this has children or if it might and we are +checking for this condition.
          +
          + +
          + +
          +
          +

          + hideChildren

          +
          + + + + + void + hideChildren + ( + ) + + +
          + Hides this node's children +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + oData + + + , + oParent + + + , + expanded + + + ) + + +
          + Initializes this node, gets some of the properties from the parent +
          + +
          + +
          +
          Parameters:
          +
          + oData <object> + a string or object containing the data that will +be used to render this node +
          +
          + oParent <Node> + this node's parent node +
          +
          + expanded <boolean> + the initial expanded/collapsed state +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + insertAfter

          +
          + + + + + Node + insertAfter + ( + + + node + + + ) + + +
          + Inserts this node after the supplied node +
          + +
          + +
          +
          Parameters:
          +
          + node <Node> + the node to insert after +
          +
          + +
          +
          Returns: + + Node +
          +
          the inserted node
          +
          + +
          + +
          +
          +

          + insertBefore

          +
          + + + + + Node + insertBefore + ( + + + node + + + ) + + +
          + Inserts this node before this supplied node +
          + +
          + +
          +
          Parameters:
          +
          + node <Node> + the node to insert this node before +
          +
          + +
          +
          Returns: + + Node +
          +
          the inserted node
          +
          + +
          + +
          +
          +

          + isChildOf

          +
          + + private + + + boolean + isChildOf + ( + + + parentNode + + + ) + + +
          + Returns true if the Node is a child of supplied Node +
          + +
          + +
          +
          Parameters:
          +
          + parentNode <Node> + the Node to check +
          +
          + +
          +
          Returns: + + boolean +
          +
          The node index if this Node is a child of +supplied Node, else -1.
          +
          + +
          + +
          +
          +

          + isDynamic

          +
          + + + + + boolean + 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 +
          + +
          + + +
          +
          Returns: + + boolean +
          +
          true if this node's children are to be loaded dynamically
          +
          + +
          + +
          +
          +

          + isRoot

          +
          + + + + + boolean + isRoot + ( + ) + + +
          + Evaluates if this node is the root node of the tree +
          + +
          + + +
          +
          Returns: + + boolean +
          +
          true if this is the root node
          +
          + +
          + +
          +
          +

          + loadComplete

          +
          + + + + + void + loadComplete + ( + ) + + +
          + Load complete is the callback function we pass to the data provider +in dynamic load situations. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + refresh

          +
          + + + + + void + refresh + ( + ) + + +
          + Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been added. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + renderChildren

          +
          + + private + + + string + renderChildren + ( + ) + + +
          + Generates the markup for the child nodes. This is not done until the node +is expanded. +
          + +
          + + +
          +
          Returns: + + string +
          +
          the html for this node's children
          +
          + +
          + +
          +
          +

          + setDynamicLoad

          +
          + + + + + void + setDynamicLoad + ( + + + fmDataLoader + + + , + iconMode + + + ) + + +
          + 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:
          +
          + fmDataLoader <function> + the function that will be used to get the data. +
          +
          + 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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + showChildren

          +
          + + + + + void + showChildren + ( + ) + + +
          + Shows this node's children +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toggle

          +
          + + + + + void + toggle + ( + ) + + +
          + Expands if node is collapsed, collapses otherwise. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + string + toString + ( + ) + + +
          + Node toString +
          + +
          + + +
          +
          Returns: + + string +
          +
          string representation of the node
          +
          + +
          + +
          +
          +
          +
          + +
          +

          Methods inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Events

          +
          +

          + parentChange

          +
          + + + + + 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 tree to another. +
          + +
          + + + + +
          + +
          +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.Overlay.html b/www/extras/yui/docs/YAHOO.widget.Overlay.html new file mode 100644 index 000000000..539b72757 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.Overlay.html @@ -0,0 +1,2277 @@ + + + + API: container YAHOO.widget.Overlay (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + > YAHOO.widget.Overlay + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.Overlay + + - extends YAHOO.widget.Module + + + + + + +

          + + +
          +
          Known Subclasses: +
          + YAHOO.widget.Panel + YAHOO.widget.Menu + YAHOO.widget.Tooltip +
          +
          + + + +
          + 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. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.Overlay + + ( + + + + el + + + , + userConfig + ) + +
          +
          +
          Parameters:
          +
          + el + <String> + + The element ID representing the Overlay OR +
          +
          + el + <HTMLElement> + + The element representing the Overlay +
          +
          + userConfig + <Object> + + The configuration object literal containing 10/23/2006the configuration that should be set for this Overlay. See configuration documentation for more details. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          YAHOO.widget.Overlay._DEFAULT_CONFIG + - private final Object +

          +
          +
          + Constant representing the Overlay's configuration properties +
          +
          + + + + +
          +

          YAHOO.widget.Overlay._EVENT_TYPES + - private final Object +

          +
          +
          + Constant representing the name of the Overlay's events +
          +
          + + + + +
          +

          YAHOO.widget.Overlay._initialized + - private Boolean +

          +
          +
          + A boolean that indicated whether the window resize and scroll events have already been subscribed to. +
          +
          + + + + +
          +

          YAHOO.widget.Overlay.BOTTOM_LEFT + - static final String +

          +
          +
          + Constant representing the top bottom left corner of an element, used for configuring the context element alignment +
          +
          + + + + +
          +

          YAHOO.widget.Overlay.BOTTOM_RIGHT + - static final String +

          +
          +
          + Constant representing the bottom right corner of an element, used for configuring the context element alignment +
          +
          + + + + +
          +

          YAHOO.widget.Overlay.CSS_OVERLAY + - static final String +

          +
          +
          + Constant representing the default CSS class used for an Overlay +
          +
          + + + + +
          +

          YAHOO.widget.Overlay.IFRAME_SRC + - static final String +

          +
          +
          + The URL that will be placed in the iframe +
          +
          + + + + +
          +

          YAHOO.widget.Overlay.TOP_LEFT + - static final String +

          +
          +
          + Constant representing the top left corner of an element, used for configuring the context element alignment +
          +
          + + + + +
          +

          YAHOO.widget.Overlay.TOP_RIGHT + - static final String +

          +
          +
          + Constant representing the top right corner of an element, used for configuring the context element alignment +
          +
          + + + + +
          + + +
          +
          + + + +
          +

          Methods

          +
          +

          + align

          +
          + + + + + void + align + ( + + + elementAlign + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + center

          +
          + + + + + void + center + ( + ) + + +
          + Centers the container in the viewport. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configConstrainToViewport

          +
          + + + + + void + configConstrainToViewport + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configContext

          +
          + + + + + void + configContext + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configFixedCenter

          +
          + + + + + void + configFixedCenter + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configHeight

          +
          + + + + + void + configHeight + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configIframe

          +
          + + + + + void + configIframe + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configVisible

          +
          + + + + + void + configVisible + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configWidth

          +
          + + + + + void + configWidth + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configX

          +
          + + + + + void + configX + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configXY

          +
          + + + + + void + configXY + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configY

          +
          + + + + + void + configY + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configzIndex

          +
          + + + + + void + configzIndex + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + destroy

          +
          + + + + + void + destroy + ( + ) + + +
          + Removes the Overlay element from the DOM and sets all child elements to null. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + doCenterOnDOMEvent

          +
          + + + + + void + doCenterOnDOMEvent + ( + ) + + +
          + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + enforceConstraints

          +
          + + + + + void + enforceConstraints + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + hideIframe

          +
          + + + + + void + hideIframe + ( + ) + + +
          + Hides the iframe shim, if it has been enabled +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + hideMacGeckoScrollbars

          +
          + + + + + void + 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 +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + el + + + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + initDefaultConfig

          +
          + + + + + void + initDefaultConfig + ( + ) + + +
          + Initializes the class's configurable properties which can be changed using the Overlay's Config object (cfg). +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initEvents

          +
          + + + + + void + initEvents + ( + ) + + +
          + Initializes the custom events for Overlay which are fired automatically at appropriate times by the Overlay class. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + moveTo

          +
          + + + + + void + moveTo + ( + + + x + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + onDomResize

          +
          + + + + + void + onDomResize + ( + + + e + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + showIframe

          +
          + + + + + void + showIframe + ( + ) + + +
          + Shows the iframe shim, if it has been enabled +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + showMacGeckoScrollbars

          +
          + + + + + void + 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 +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + syncPosition

          +
          + + + + + void + 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. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a String representation of the object. +
          + +
          + + +
          +
          Returns: + + String +
          +
          The string representation of the Overlay.
          +
          + +
          + +
          +
          +

          + YAHOO.widget.Overlay.windowResizeHandler

          +
          + + + static + + void + YAHOO.widget.Overlay.windowResizeHandler + ( + + + e + + + ) + + +
          + The DOM event handler used to fire the CustomEvent for window resize +
          + +
          + +
          +
          Parameters:
          +
          + e <DOMEvent> + The DOM resize event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + YAHOO.widget.Overlay.windowScrollHandler

          +
          + + + static + + void + YAHOO.widget.Overlay.windowScrollHandler + ( + + + e + + + ) + + +
          + The DOM event handler used to fire the CustomEvent for window scroll +
          + +
          + +
          +
          Parameters:
          +
          + e <DOMEvent> + The DOM scroll event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + + + +
          +

          Events

          +
          +

          + beforeMoveEvent

          +
          + + + + + beforeMoveEvent + + ( + + + x + + + , + y + + + ) + + + +
          + CustomEvent fired before the Overlay is moved. +
          + +
          + + +
          +
          Parameters:
          +
          + x <Number> + x coordinate +
          +
          + y <Number> + y coordinate +
          +
          + + +
          + +
          +
          +

          + moveEvent

          +
          + + + + + moveEvent + + ( + + + x + + + , + y + + + ) + + + +
          + CustomEvent fired after the Overlay is moved. +
          + +
          + + +
          +
          Parameters:
          +
          + x <Number> + x coordinate +
          +
          + y <Number> + y coordinate +
          +
          + + +
          + +
          +
          +

          + YAHOO.widget.Overlay.windowResizeEvent

          +
          + + + + + YAHOO.widget.Overlay.windowResizeEvent + + ( + ) + + + +
          + A singleton CustomEvent used for reacting to the DOM event for window resize +
          + +
          + + + + +
          + +
          +
          +

          + YAHOO.widget.Overlay.windowScrollEvent

          +
          + + + + + YAHOO.widget.Overlay.windowScrollEvent + + ( + ) + + + +
          + A singleton CustomEvent used for reacting to the DOM event for window scroll +
          + +
          + + + + +
          + +
          +
          +
          +
          + + + + +
          +

          Configuration Attributes

          +
          +

          constraintoviewport + - Boolean +

          +
          +
          + True if the Overlay should be prevented from being positioned out of the viewport. +
          +
          + + +
          + Default Value: false +
          + +
          +

          context + - Array +

          +
          +
          + 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. +
          +
          + + +
          + Default Value: null +
          + +
          +

          fixedcenter + - Boolean +

          +
          +
          + True if the Overlay should be anchored to the center of the viewport. +
          +
          + + +
          + Default Value: false +
          + +
          +

          height + - String +

          +
          +
          + CSS height of the Overlay. +
          +
          + + +
          + Default Value: null +
          + +
          +

          iframe + - Boolean +

          +
          +
          + True if the Overlay should have an IFRAME shim (for correcting the select z-index bug in IE6 and below). +
          +
          + + +
          + Default Value: true for IE6 and below, false for all others +
          + +
          +

          width + - String +

          +
          +
          + CSS width of the Overlay. +
          +
          + + +
          + Default Value: null +
          + +
          +

          x + - Number +

          +
          +
          + The absolute x-coordinate position of the Overlay +
          +
          + + +
          + Default Value: null +
          + +
          +

          xy + - Number[] +

          +
          +
          + An array with the absolute x and y positions of the Overlay +
          +
          + + +
          + Default Value: null +
          + +
          +

          y + - Number +

          +
          +
          + The absolute y-coordinate position of the Overlay +
          +
          + + +
          + Default Value: null +
          + +
          +

          zIndex + - Number +

          +
          +
          + CSS z-index of the Overlay. +
          +
          + + +
          + Default Value: null +
          + +
          + +
          +
          + +
          +

          Configuration attributes inherited from YAHOO.widget.Module:

          +
          + + + effect, + monitorresize, + visible + +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.OverlayManager.html b/www/extras/yui/docs/YAHOO.widget.OverlayManager.html new file mode 100644 index 000000000..f53376a3e --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.OverlayManager.html @@ -0,0 +1,966 @@ + + + + API: container YAHOO.widget.OverlayManager (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + > YAHOO.widget.OverlayManager + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.OverlayManager + + + + + + + +

          + + + + + +
          + OverlayManager is used for maintaining the focus status of multiple Overlays.* @namespace YAHOO.widget +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.OverlayManager + + ( + + + + overlays + + , + 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 +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          activeOverlay + - private YAHOO.widget.Overlay +

          +
          +
          + The currently activated Overlay +
          +
          + + + + +
          +

          cfg + - YAHOO.util.Config +

          +
          +
          + The OverlayManager's Config object used for monitoring configuration properties. +
          +
          + + + + +
          +

          contructor + - Function +

          +
          +
          + The class's constructor function +
          +
          + + + + +
          +

          overlays + - YAHOO.widget.Overlay[] +

          +
          +
          + The array of Overlays that are currently registered +
          +
          + + + + +
          +

          YAHOO.widget.OverlayManager.CSS_FOCUSED + - static final String +

          +
          +
          + The CSS class representing a focused Overlay +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + _onOverlayDestroy

          +
          + + private + + + void + _onOverlayDestroy + ( + + + p_sType + + + , + p_aArgs + + + , + p_oOverlay + + + ) + + +
          + "destroy" event handler for the Overlay. +
          + +
          + +
          +
          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_oOverlay <YAHOO.widget.Overlay> + Object representing the menu that +fired the event. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _onOverlayElementFocus

          +
          + + private + + + void + _onOverlayElementFocus + ( + + + p_oEvent + + + ) + + +
          + Event handler for the DOM event that is used to focus +the Overlay instance as specified by the "focusevent" +configuration property. +
          + +
          + +
          +
          Parameters:
          +
          + p_oEvent <Event> + Object representing the DOM event object passed +back by the event utility (YAHOO.util.Event). +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + blurAll

          +
          + + + + + void + blurAll + ( + ) + + +
          + Removes focus from all registered Overlays in the manager +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + compareZIndexDesc

          +
          + + private + + + Number + compareZIndexDesc + ( + ) + + +
          + Used for sorting the manager's Overlays by z-index. +
          + +
          + + +
          +
          Returns: + + Number +
          +
          0, 1, or -1, depending on where the Overlay should fall in the stacking order.
          +
          + +
          + +
          +
          +

          + find

          +
          + + + + + YAHOO.widget.Overlay + find + ( + + + 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.
          +
          + +
          + +
          +
          +

          + focus

          +
          + + + + + void + focus + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + getActive

          +
          + + + + + YAHOO.widget.Overlay + getActive + ( + ) + + +
          + Returns the currently focused Overlay +
          + +
          + + +
          +
          Returns: + + YAHOO.widget.Overlay +
          +
          The currently focused Overlay
          +
          + +
          + +
          +
          +

          + hideAll

          +
          + + + + + void + hideAll + ( + ) + + +
          + Hides all Overlays in the manager. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + overlays + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + initDefaultConfig

          +
          + + + + + void + initDefaultConfig + ( + ) + + +
          + Initializes the default configuration of the OverlayManager +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + register

          +
          + + + + + Boolean + register + ( + + + 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.
          +
          + +
          + +
          +
          +

          + remove

          +
          + + + + + void + remove + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + showAll

          +
          + + + + + void + showAll + ( + ) + + +
          + Shows all Overlays in the manager. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a string representation of the object. +
          + +
          + + +
          +
          Returns: + + String +
          +
          The string representation of the OverlayManager
          +
          + +
          + +
          +
          +
          +
          + + + + + +
          +

          Configuration Attributes

          +
          +

          focusevent + - String +

          +
          +
          + The default DOM event that should be used to focus an Overlay +
          +
          + + +
          + Default Value: "mousedown" +
          + +
          +

          overlays + - YAHOO.widget.Overlay[] +

          +
          +
          + The collection of registered Overlays in use by the OverlayManager +
          +
          + + +
          + Default Value: null +
          + +
          + +
          +
          + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.Panel.html b/www/extras/yui/docs/YAHOO.widget.Panel.html new file mode 100644 index 000000000..790297dea --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.Panel.html @@ -0,0 +1,1741 @@ + + + + API: container YAHOO.widget.Panel (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + > YAHOO.widget.Panel + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.Panel + + - extends YAHOO.widget.Overlay + + + + + + +

          + + +
          +
          Known Subclasses: +
          + YAHOO.widget.Dialog +
          +
          + + + +
          + 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. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.Panel + + ( + + + + el + + + , + 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. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          YAHOO.widget.Panel._DEFAULT_CONFIG + - private final Object +

          +
          +
          + Constant representing the Panel's configuration properties +
          +
          + + + + +
          +

          YAHOO.widget.Panel._EVENT_TYPES + - private final Object +

          +
          +
          + Constant representing the name of the Panel's events +
          +
          + + + + +
          +

          YAHOO.widget.Panel.CSS_PANEL + - static final String +

          +
          +
          + Constant representing the default CSS class used for a Panel +
          +
          + + + + +
          +

          YAHOO.widget.Panel.CSS_PANEL_CONTAINER + - static final String +

          +
          +
          + Constant representing the default CSS class used for a Panel's wrapping container +
          +
          + + + + +
          + + +
          +
          + + + + +
          +

          Methods

          +
          +

          + buildMask

          +
          + + + + + void + buildMask + ( + ) + + +
          + Builds the mask that is laid over the document when the Panel is configured to be modal. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + buildWrapper

          +
          + + + + + void + 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. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configClose

          +
          + + + + + void + configClose + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configDraggable

          +
          + + + + + void + configDraggable + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configHeight

          +
          + + + + + void + configHeight + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configKeyListeners

          +
          + + + + + void + configKeyListeners + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configModal

          +
          + + + + + void + configModal + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configUnderlay

          +
          + + + + + void + configUnderlay + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configWidth

          +
          + + + + + void + configWidth + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configzIndex

          +
          + + + + + void + configzIndex + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + destroy

          +
          + + + + + void + destroy + ( + ) + + +
          + Removes the Panel element from the DOM and sets all child elements to null. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + hideMask

          +
          + + + + + void + hideMask + ( + ) + + +
          + Hides the modality mask. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + el + + + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + initDefaultConfig

          +
          + + + + + void + initDefaultConfig + ( + ) + + +
          + Initializes the class's configurable properties which can be changed using the Panel's Config object (cfg). +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initEvents

          +
          + + + + + void + initEvents + ( + ) + + +
          + Initializes the custom events for Module which are fired automatically at appropriate times by the Module class. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onDomResize

          +
          + + + + + void + onDomResize + ( + + + e + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + registerDragDrop

          +
          + + + + + void + registerDragDrop + ( + ) + + +
          + Registers the Panel's header for drag & drop capability. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + removeMask

          +
          + + + + + void + removeMask + ( + ) + + +
          + Removes the modality mask. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + render

          +
          + + + + + boolean + render + ( + + + 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
          +
          + +
          + +
          +
          +

          + showMask

          +
          + + + + + void + showMask + ( + ) + + +
          + Shows the modality mask. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + sizeMask

          +
          + + + + + void + sizeMask + ( + ) + + +
          + Sets the size of the modality mask to cover the entire scrollable area of the document +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + sizeUnderlay

          +
          + + + + + void + sizeUnderlay + ( + ) + + +
          + Adjusts the size of the shadow based on the size of the element. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a String representation of the object. +
          + +
          + + +
          +
          Returns: + + String +
          +
          The string representation of the Panel.
          +
          + +
          + +
          +
          +
          +
          + + + + +
          +

          Events

          +
          +

          + dragEvent

          +
          + + + + + dragEvent + + ( + ) + + + +
          + CustomEvent when the Panel is dragged +
          + +
          + + + + +
          + +
          +
          +

          + hideMaskEvent

          +
          + + + + + hideMaskEvent + + ( + ) + + + +
          + CustomEvent fired after the modality mask is hidden +
          + +
          + + + + +
          + +
          +
          +

          + showMaskEvent

          +
          + + + + + showMaskEvent + + ( + ) + + + +
          + CustomEvent fired after the modality mask is shown +
          + +
          + + + + +
          + +
          +
          +
          +
          + + + + + +
          +

          Configuration Attributes

          +
          +

          close + - Boolean +

          +
          +
          + True if the Panel should display a "close" button +
          +
          + + +
          + Default Value: true +
          + +
          +

          draggable + - Boolean +

          +
          +
          + True if the Panel should be draggable. Default value is "true" if the Drag and Drop utility is included, otherwise it is "false." +
          +
          + + +
          + Default Value: true +
          + +
          +

          keylisteners + - YAHOO.util.KeyListener[] +

          +
          +
          + A KeyListener (or array of KeyListeners) that will be enabled when the Panel is shown, and disabled when the Panel is hidden. +
          +
          + + +
          + Default Value: null +
          + +
          +

          modal + - Boolean +

          +
          +
          + 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. +
          +
          + + +
          + Default Value: false +
          + +
          +

          underlay + - String +

          +
          +
          + Sets the type of underlay to display for the Panel. Valid values are "shadow", "matte", and "none". +
          +
          + + +
          + Default Value: shadow +
          + +
          + +
          +
          + +
          +

          Configuration attributes inherited from YAHOO.widget.Module:

          +
          + + + effect, + monitorresize, + visible + +
          +
          +
          +

          Configuration attributes inherited from YAHOO.widget.Overlay:

          +
          + + + constraintoviewport, + context, + fixedcenter, + height, + iframe, + width, + x, + xy, + y, + zIndex + +
          +
          + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.RootNode.html b/www/extras/yui/docs/YAHOO.widget.RootNode.html new file mode 100644 index 000000000..cef2a1978 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.RootNode.html @@ -0,0 +1,295 @@ + + + + API: treeview YAHOO.widget.RootNode (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + > YAHOO.widget.RootNode + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.RootNode + + - extends YAHOO.widget.Node + + + + + + +

          + + + + + +
          + A custom YAHOO.widget.Node that handles the unique nature of +the virtual, presentationless root node. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.RootNode + + ( + + + + oTree + ) + +
          +
          +
          Parameters:
          +
          + oTree + <YAHOO.widget.TreeView> + + The tree instance this node belongs to +
          +
          + + +
          +
          +
          +
          + + + +
          +

          Properties inherited from YAHOO.util.EventProvider:

          + +
          + + + +
          +

          Methods inherited from YAHOO.util.EventProvider:

          + +
          + + + +
          +

          Events inherited from YAHOO.widget.Node:

          +
          + + + parentChange + +
          +
          + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.SimpleDialog.html b/www/extras/yui/docs/YAHOO.widget.SimpleDialog.html new file mode 100644 index 000000000..cfc60c66f --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.SimpleDialog.html @@ -0,0 +1,976 @@ + + + + API: container YAHOO.widget.SimpleDialog (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + > YAHOO.widget.SimpleDialog + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.SimpleDialog + + - extends YAHOO.widget.Dialog + + + + + + +

          + + + + + +
          + 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. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.SimpleDialog + + ( + + + + el + + + , + 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. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          YAHOO.widget.SimpleDialog._DEFAULT_CONFIG + - private final Object +

          +
          +
          + Constant representing the SimpleDialog's configuration properties +
          +
          + + + + +
          +

          YAHOO.widget.SimpleDialog.CSS_SIMPLEDIALOG + - static final String +

          +
          +
          + Constant representing the default CSS class used for a SimpleDialog +
          +
          + + + + +
          +

          YAHOO.widget.SimpleDialog.ICON_ALARM + - static final String +

          +
          +
          + Constant for the standard network icon for alarm +
          +
          + + + + +
          +

          YAHOO.widget.SimpleDialog.ICON_BLOCK + - static final String +

          +
          +
          + Constant for the standard network icon for a blocking action +
          +
          + + + + +
          +

          YAHOO.widget.SimpleDialog.ICON_HELP + - static final String +

          +
          +
          + Constant for the standard network icon for help +
          +
          + + + + +
          +

          YAHOO.widget.SimpleDialog.ICON_INFO + - static final String +

          +
          +
          + Constant for the standard network icon for info +
          +
          + + + + +
          +

          YAHOO.widget.SimpleDialog.ICON_TIP + - static final String +

          +
          +
          + Constant for the standard network icon for a tip +
          +
          + + + + +
          +

          YAHOO.widget.SimpleDialog.ICON_WARN + - static final String +

          +
          +
          + Constant for the standard network icon for warn +
          +
          + + + + +
          + + +
          +
          + + + + + + +
          +

          Methods

          +
          +

          + configIcon

          +
          + + + + + void + configIcon + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configText

          +
          + + + + + void + configText + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + el + + + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + initDefaultConfig

          +
          + + + + + void + initDefaultConfig + ( + ) + + +
          + Initializes the class's configurable properties which can be changed using the SimpleDialog's Config object (cfg). +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + registerForm

          +
          + + + + + void + registerForm + ( + ) + + +
          + Prepares the SimpleDialog's internal FORM object, creating one if one is not currently present, and adding the value hidden field. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a string representation of the object. +
          + +
          + + +
          +
          Returns: + + String +
          +
          The string representation of the SimpleDialog
          +
          + +
          + +
          +
          +
          +
          + + + + + + + + +
          +

          Events inherited from YAHOO.widget.Panel:

          + +
          + + + + +
          +

          Configuration Attributes

          +
          +

          icon + - String +

          +
          +
          + Sets the informational icon for the SimpleDialog +
          +
          + + +
          + Default Value: "none" +
          + +
          +

          text + - String +

          +
          +
          + Sets the text for the SimpleDialog +
          +
          + + +
          + Default Value: "" +
          + +
          + +
          +
          + +
          +

          Configuration attributes inherited from YAHOO.widget.Panel:

          +
          + + + close, + draggable, + keylisteners, + modal, + underlay + +
          +
          +
          +

          Configuration attributes inherited from YAHOO.widget.Module:

          +
          + + + effect, + monitorresize, + visible + +
          +
          +
          +

          Configuration attributes inherited from YAHOO.widget.Dialog:

          +
          + + + buttons, + postmethod + +
          +
          +
          +

          Configuration attributes inherited from YAHOO.widget.Overlay:

          +
          + + + constraintoviewport, + context, + fixedcenter, + height, + iframe, + width, + x, + xy, + y, + zIndex + +
          +
          + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.Slider.html b/www/extras/yui/docs/YAHOO.widget.Slider.html new file mode 100644 index 000000000..dea9351d6 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.Slider.html @@ -0,0 +1,2308 @@ + + + + API: slider YAHOO.widget.Slider (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Slider Widget  2.2.2

          +

          + Yahoo! UI Library + > slider + > YAHOO.widget.Slider + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.Slider + + - extends YAHOO.util.DragDrop + + + + - uses + + YAHOO.util.EventProvider + + + + +

          + + + + + +
          + 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. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.Slider + + ( + + + + id + + , + sGroup + + , + oThumb + + , + sType + ) + +
          +
          +
          Parameters:
          +
          + id + <String> + + The id of the element linked to this instance +
          +
          + sGroup + <String> + + The group of related DragDrop items +
          +
          + oThumb + <SliderThumb> + + The thumb for this slider +
          +
          + sType + <String> + + The type of slider (horiz, vert, region) +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          animate + - boolean +

          +
          +
          + Flag that determines if the thumb will animate when moved +
          +
          + + + + +
          +

          animationDuration + - int +

          +
          +
          + If animation is configured, specifies the length of the animation +in seconds. +
          +
          + + +
          + Default Value: 0.2 +
          + + +
          +

          backgroundEnabled + - boolean +

          +
          +
          + Set to false to disable a background click thumb move +
          +
          + + + + +
          +

          baselinePos + - [int, int] +

          +
          +
          + The basline position of the background element, used +to determine if the background has moved since the last +operation. +
          +
          + + + + +
          +

          enableKeys + - boolean +

          +
          +
          + Enables the arrow, home and end keys, defaults to true. +
          +
          + + + + +
          +

          isTarget + - private object +

          +
          +
          + Overrides the isTarget property in YAHOO.util.DragDrop +
          +
          + + + + +
          +

          keyIncrement + - int +

          +
          +
          + Specifies the number of pixels the arrow keys will move the slider. +Default is 25. +
          +
          + + + + +
          +

          moveComplete + - Boolean +

          +
          +
          + 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. +Deprecated because this flag is only useful when the background is +clicked and the slider is animated. If the user drags the thumb, +the flag is updated when the drag is over ... the final onDrag event +fires before the mouseup the ends the drag, so the implementer will +never see it. +
          +
          + + + +
          + Deprecated: use the slideEnd event instead +
          + +
          +

          thumb + - YAHOO.widget.SliderThumb +

          +
          +
          + A YAHOO.widget.SliderThumb instance that we will use to +reposition the thumb when the background is clicked +
          +
          + + + + +
          +

          thumbCenterPoint + - {"x": int, "y": int} +

          +
          +
          + The center of the slider element is stored so we can +place it in the correct position when the background is clicked. +
          +
          + + + + +
          +

          tickPause + - int +

          +
          +
          + Adjustment factor for tick animation, the more ticks, the +faster the animation (by default) +
          +
          + + + + +
          +

          type + - string +

          +
          +
          + The type of the slider (horiz, vert, region) +
          +
          + + + + +
          +

          YAHOO.widget.Slider.ANIM_AVAIL + - static boolean +

          +
          +
          + By default, animation is available if the animation library is detected. +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Properties inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Methods

          +
          +

          + _getNextX

          +
          + + private + + + void + _getNextX + ( + ) + + +
          + Returns the next X tick value based on the current coord and the target coord. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + _getNextY

          +
          + + private + + + void + _getNextY + ( + ) + + +
          + Returns the next Y tick value based on the current coord and the target coord. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + b4MouseDown

          +
          + + private + + + void + b4MouseDown + ( + ) + + +
          + Resets the constraints before moving the thumb. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + endMove

          +
          + + private + + + void + endMove + ( + ) + + +
          + Fired when the slider movement ends +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + fireEvents

          +
          + + private + + + void + fireEvents + ( + + + thumbEvent + + + ) + + +
          + 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 +
          + +
          + +
          +
          Parameters:
          +
          + thumbEvent <boolean> + set to true if this event is fired from an event +that occurred on the thumb. If it is, the state of the +thumb dd object should be correct. Otherwise, the event +originated on the background, so the thumb state needs to +be refreshed before proceeding. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + focus

          +
          + + private + + + void + focus + ( + ) + + +
          + Try to focus the element when clicked so we can add +accessibility features +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getThumb

          +
          + + + + + SliderThumb + getThumb + ( + ) + + +
          + Returns a reference to this slider's thumb +
          + +
          + + +
          +
          Returns: + + SliderThumb +
          +
          this slider's thumb
          +
          + +
          + +
          +
          +

          + getValue

          +
          + + + + + int + getValue + ( + ) + + +
          + Returns the slider's thumb offset from the start position +
          + +
          + + +
          +
          Returns: + + int +
          +
          the current value
          +
          + +
          + +
          +
          +

          + getXValue

          +
          + + + + + int + getXValue + ( + ) + + +
          + Returns the slider's thumb X offset from the start position +
          + +
          + + +
          +
          Returns: + + int +
          +
          the current horizontal offset
          +
          + +
          + +
          +
          +

          + getYValue

          +
          + + + + + int + getYValue + ( + ) + + +
          + Returns the slider's thumb Y offset from the start position +
          + +
          + + +
          +
          Returns: + + int +
          +
          the current vertical offset
          +
          + +
          + +
          +
          +

          + handleKeyDown

          +
          + + + + + void + handleKeyDown + ( + + + e + + + ) + + +
          + Executed when a keydown event happens with the control focused. +Updates the slider value and display when the keypress is an +arrow key, home, or end as long as enableKeys is set to true. +
          + +
          + +
          +
          Parameters:
          +
          + e <Event> + the keydown event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + handleKeyPress

          +
          + + + + + void + handleKeyPress + ( + + + e + + + ) + + +
          + Executed when a keypress event happens with the control focused. +Prevents the default behavior for navigation keys. The actual +logic for moving the slider thumb in response to a key event +happens in handleKeyDown. +
          + +
          + +
          +
          Parameters:
          +
          + e <Event> + the keypress event +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + handleThumbChange

          +
          + + private + + + void + handleThumbChange + ( + ) + + +
          + Internal handler for the slider thumb's onChange event +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initSlider

          +
          + + + + + void + initSlider + ( + + + sType + + + ) + + +
          + Initializes the slider. Executed in the constructor +
          + +
          + +
          +
          Parameters:
          +
          + sType <string> + the type of slider (horiz, vert, region) +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + initThumb

          +
          + + + + + void + initThumb + ( + + + t + + + ) + + +
          + Initializes the slider's thumb. Executed in the constructor. +
          + +
          + +
          +
          Parameters:
          +
          + t <YAHOO.widget.SliderThumb> + the slider thumb +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + lock

          +
          + + + + + void + lock + ( + ) + + +
          + Locks the slider, overrides YAHOO.util.DragDrop +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + moveOneTick

          +
          + + private + + + void + moveOneTick + ( + + + the + + + ) + + +
          + Move the slider one tick mark towards its final coordinate. Used +for the animation when tick marks are defined +
          + +
          + +
          +
          Parameters:
          +
          + the <int[]> + destination coordinate +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + moveThumb

          +
          + + private + + + void + moveThumb + ( + + + x + + + , + y + + + , + skipAnim + + + ) + + +
          + 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 +
          + +
          + +
          +
          Parameters:
          +
          + x <int> + the X coordinate of the click +
          +
          + y <int> + the Y coordinate of the click +
          +
          + skipAnim <boolean> + don't animate if the move happend onDrag +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onAvailable

          +
          + + + + + void + onAvailable + ( + ) + + +
          + Executed when the slider element is available +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onChange

          +
          + + + + + void + onChange + ( + + + firstOffset + + + , + secondOffset + + + ) + + +
          + 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 +
          +
          +
          + +
          + Deprecated use instance.subscribe("change") instead +
          +
          + +
          +
          +

          + onDrag

          +
          + + private + + + void + onDrag + ( + ) + + +
          + Handles the onDrag event for the slider background +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onMouseDown

          +
          + + private + + + void + onMouseDown + ( + ) + + +
          + Handles the mousedown event for the slider background +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onSliderEnd

          +
          + + + + + void + onSliderEnd + ( + ) + + +
          + Event that fires at the end of a slider thumb move +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + Deprecated use instance.subscribe("slideEnd") instead +
          +
          + +
          +
          +

          + onSlideStart

          +
          + + + + + void + onSlideStart + ( + ) + + +
          + Event that fires when the at the beginning of the slider thumb move +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + Deprecated use instance.subscribe("slideStart") instead +
          +
          + +
          +
          +

          + setRegionValue

          +
          + + + + + boolean + setRegionValue + ( + + + newOffset + + + , + newOffset2 + + + , + skipAnim + + + , + 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
          +
          + +
          + +
          +
          +

          + setStartSliderState

          +
          + + + + + void + setStartSliderState + ( + ) + + +
          + Initialization that sets up the value offsets once the elements are ready +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setThumbCenterPoint

          +
          + + + + + void + 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 +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setValue

          +
          + + + + + boolean + setValue + ( + + + newOffset + + + , + skipAnim + + + , + 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
          +
          + +
          + +
          +
          +

          + thumbMouseUp

          +
          + + private + + + void + thumbMouseUp + ( + ) + + +
          + Handles mouseup event on the slider background +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + string + toString + ( + ) + + +
          + Slider toString +
          + +
          + + +
          +
          Returns: + + string +
          +
          string representation of the instance
          +
          + +
          + +
          +
          +

          + unlock

          +
          + + + + + void + unlock + ( + ) + + +
          + Unlocks the slider, overrides YAHOO.util.DragDrop +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + verifyOffset

          +
          + + + + + boolean + verifyOffset + ( + + + checkPos + + + ) + + +
          + Checks the background position element position. If it has moved from the +baseline position, the constraints for the thumb are reset +
          + +
          + +
          +
          Parameters:
          +
          + checkPos <boolean> + check the position instead of using cached value +
          +
          + +
          +
          Returns: + + boolean +
          +
          True if the offset is the same as the baseline.
          +
          + +
          + +
          +
          +

          + YAHOO.widget.Slider.getHorizSlider

          +
          + + + static + + Slider + YAHOO.widget.Slider.getHorizSlider + ( + + + sBGElId + + + , + sHandleElId + + + , + iLeft + + + , + iRight + + + , + iTickSize + + + ) + + +
          + 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
          +
          + +
          + +
          +
          +

          + YAHOO.widget.Slider.getSliderRegion

          +
          + + + static + + Slider + YAHOO.widget.Slider.getSliderRegion + ( + + + sBGElId + + + , + sHandleElId + + + , + iLeft + + + , + iRight + + + , + iUp + + + , + iDown + + + , + iTickSize + + + ) + + +
          + 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
          +
          + +
          + +
          +
          +

          + YAHOO.widget.Slider.getVertSlider

          +
          + + + static + + Slider + YAHOO.widget.Slider.getVertSlider + ( + + + sBGElId + + + , + sHandleElId + + + , + iUp + + + , + iDown + + + , + iTickSize + + + ) + + +
          + 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
          +
          + +
          + +
          +
          +
          +
          + + +
          +

          Methods inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Events

          +
          +

          + change

          +
          + + + + + change + + ( + + + newOffset|x + + + , + y + + + ) + + + +
          + Event the fires when the value of the control changes. If +the control is animated the event will fire every point +along the way. +
          + +
          + + +
          +
          Parameters:
          +
          + newOffset|x <int> + the new offset for normal sliders, or the new +x offset for region sliders +
          +
          + y <int> + the number of pixels the thumb has moved on the y axis +(region sliders only) +
          +
          + + +
          + +
          +
          +

          + slideEnd

          +
          + + + + + slideEnd + + ( + ) + + + +
          + Event that fires at the end of a slider thumb move +
          + +
          + + + + +
          + +
          +
          +

          + slideStart

          +
          + + + + + slideStart + + ( + ) + + + +
          + Event that fires at the beginning of a slider thumb move. +
          + +
          + + + + +
          + +
          +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.SliderThumb.html b/www/extras/yui/docs/YAHOO.widget.SliderThumb.html new file mode 100644 index 000000000..0f6874659 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.SliderThumb.html @@ -0,0 +1,858 @@ + + + + API: slider YAHOO.widget.SliderThumb (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Slider Widget  2.2.2

          +

          + Yahoo! UI Library + > slider + > YAHOO.widget.SliderThumb + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.SliderThumb + + - extends YAHOO.util.DD + + + + + + +

          + + + + + +
          + A drag and drop implementation to be used as the thumb of a slider. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.SliderThumb + + ( + + + + id + + , + sGroup + + , + iLeft + + , + iRight + + , + iUp + + , + iDown + + , + 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. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _graduated + - private boolean +

          +
          +
          + The slider is _graduated if there is a tick interval defined +
          +
          + + + + +
          +

          _isHoriz + - private boolean +

          +
          +
          + Flag used to figure out if this is a horizontal or vertical slider +
          +
          + + + + +
          +

          _prevVal + - private int +

          +
          +
          + Cache the last value so we can check for change +
          +
          + + + + +
          +

          isTarget + - private object +

          +
          +
          + Overrides the isTarget property in YAHOO.util.DragDrop +
          +
          + + + + +
          +

          maintainOffset + - private boolean +

          +
          +
          + 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 +
          +
          + + + + +
          +

          parentElId + - string +

          +
          +
          + The id of the thumbs parent HTML element (the slider background +element). +
          +
          + + + + +
          +

          scroll + - private object +

          +
          +
          + Turns off the autoscroll feature in drag and drop +
          +
          + + + + +
          +

          startOffset + - [int, int] +

          +
          +
          + The (X and Y) difference between the thumb location and its parent +(the slider background) when the control is instantiated. +
          +
          + + + + +
          +

          tickSize + - private int +

          +
          +
          + The tick size for this slider +
          +
          + + + + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.util.DD:

          +
          + + + scroll + +
          +
          + + +
          +

          Methods

          +
          +

          + clearTicks

          +
          + + + + + void + clearTicks + ( + ) + + +
          + Clear's the slider's ticks +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getOffsetFromParent

          +
          + + + + + void + getOffsetFromParent + ( + + + parentPos + + + ) + + +
          + Returns the difference between the location of the thumb and its parent. +
          + +
          + +
          +
          Parameters:
          +
          + parentPos <[int, int]> + Optionally accepts the position of the parent +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getValue

          +
          + + + + + int + getValue + ( + ) + + +
          + Gets the current offset from the element's start position in +pixels. +
          + +
          + + +
          +
          Returns: + + int +
          +
          the number of pixels (positive or negative) the +slider has moved from the start position.
          +
          + +
          + +
          +
          +

          + getXValue

          +
          + + + + + int + getXValue + ( + ) + + +
          + Gets the current X offset from the element's start position in +pixels. +
          + +
          + + +
          +
          Returns: + + int +
          +
          the number of pixels (positive or negative) the +slider has moved horizontally from the start position.
          +
          + +
          + +
          +
          +

          + getYValue

          +
          + + + + + int + getYValue + ( + ) + + +
          + Gets the current Y offset from the element's start position in +pixels. +
          + +
          + + +
          +
          Returns: + + int +
          +
          the number of pixels (positive or negative) the +slider has moved vertically from the start position.
          +
          + +
          + +
          +
          +

          + initSlider

          +
          + + + + + void + initSlider + ( + + + iLeft + + + , + iRight + + + , + iUp + + + , + iDown + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + onChange

          +
          + + private + + + void + onChange + ( + ) + + +
          + The onchange event for the handle/thumb is delegated to the YAHOO.widget.Slider +instance it belongs to. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + string + toString + ( + ) + + +
          + Thumb toString +
          + +
          + + +
          +
          Returns: + + string +
          +
          string representation of the instance
          +
          + +
          + +
          +
          +
          +
          + +
          +

          Methods inherited from YAHOO.util.DD:

          + +
          + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.TVAnim.html b/www/extras/yui/docs/YAHOO.widget.TVAnim.html new file mode 100644 index 000000000..8a1387aa0 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.TVAnim.html @@ -0,0 +1,316 @@ + + + + API: treeview YAHOO.widget.TVAnim (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + > YAHOO.widget.TVAnim + +

          +
          + +
          +
          +
          + + +

          + + + static + + Class YAHOO.widget.TVAnim + + + + + + + +

          + + + + + +
          + A static factory class for tree view expand/collapse animations +
          + + +
          +

          Properties

          +
          +

          FADE_IN + - static string +

          +
          +
          + Constant for the fade in animation +
          +
          + + + + +
          +

          FADE_OUT + - static string +

          +
          +
          + Constant for the fade out animation +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + getAnim

          +
          + + + static + + YAHOO.util.Animation + getAnim + ( + + + type + + + , + el + + + , + callback + + + ) + + +
          + Returns a ygAnim instance of the given type +
          + +
          + +
          +
          Parameters:
          +
          + type <string> + the type of animation +
          +
          + el <HTMLElement> + the element to element (probably the children div) +
          +
          + callback <function> + function to invoke when the animation is done. +
          +
          + +
          +
          Returns: + + YAHOO.util.Animation +
          +
          the animation instance
          +
          + +
          + +
          +
          +

          + isValid

          +
          + + + static + + boolean + isValid + ( + + + type + + + ) + + +
          + Returns true if the specified animation class is available +
          + +
          + +
          +
          Parameters:
          +
          + type <string> + the type of animation +
          +
          + +
          +
          Returns: + + boolean +
          +
          true if valid, false if not
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.TVFadeIn.html b/www/extras/yui/docs/YAHOO.widget.TVFadeIn.html new file mode 100644 index 000000000..adb9c0a05 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.TVFadeIn.html @@ -0,0 +1,349 @@ + + + + API: treeview YAHOO.widget.TVFadeIn (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + > YAHOO.widget.TVFadeIn + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.TVFadeIn + + + + + + + +

          + + + + + +
          + A 1/2 second fade-in animation. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.TVFadeIn + + ( + + + + el + + , + callback + ) + +
          +
          +
          Parameters:
          +
          + el + <HTMLElement> + + the element to animate +
          +
          + callback + <function> + + function to invoke when the animation is finished +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          callback + - function +

          +
          +
          + the callback to invoke when the animation is complete +
          +
          + + + + +
          +

          el + - HTMLElement +

          +
          +
          + The element to animate +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + animate

          +
          + + + + + void + animate + ( + ) + + +
          + Performs the animation +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onComplete

          +
          + + + + + void + onComplete + ( + ) + + +
          + Clean up and invoke callback +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + string + toString + ( + ) + + +
          + toString +
          + +
          + + +
          +
          Returns: + + string +
          +
          the string representation of the instance
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.TVFadeOut.html b/www/extras/yui/docs/YAHOO.widget.TVFadeOut.html new file mode 100644 index 000000000..3b66ac63c --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.TVFadeOut.html @@ -0,0 +1,349 @@ + + + + API: treeview YAHOO.widget.TVFadeOut (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + > YAHOO.widget.TVFadeOut + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.TVFadeOut + + + + + + + +

          + + + + + +
          + A 1/2 second fade out animation. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.TVFadeOut + + ( + + + + el + + , + callback + ) + +
          +
          +
          Parameters:
          +
          + el + <HTMLElement> + + the element to animate +
          +
          + callback + <Function> + + function to invoke when the animation is finished +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          callback + - function +

          +
          +
          + the callback to invoke when the animation is complete +
          +
          + + + + +
          +

          el + - HTMLElement +

          +
          +
          + The element to animate +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Methods

          +
          +

          + animate

          +
          + + + + + void + animate + ( + ) + + +
          + Performs the animation +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onComplete

          +
          + + + + + void + onComplete + ( + ) + + +
          + Clean up and invoke callback +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + string + toString + ( + ) + + +
          + toString +
          + +
          + + +
          +
          Returns: + + string +
          +
          the string representation of the instance
          +
          + +
          + +
          +
          +
          +
          + + + + + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.Tab.html b/www/extras/yui/docs/YAHOO.widget.Tab.html new file mode 100644 index 000000000..f46cc38ae --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.Tab.html @@ -0,0 +1,995 @@ + + + + API: tabview YAHOO.widget.Tab (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          tabview  2.2.2

          +

          + Yahoo! UI Library + > tabview + > YAHOO.widget.Tab + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.Tab + + - extends YAHOO.util.Element + + + + + + +

          + + + + + +
          + A representation of a Tab's label and content. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.Tab + + ( + + + + element + + , + properties + ) + +
          +
          +
          Parameters:
          +
          + element + <HTMLElement | 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 +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          ACTIVE_CLASSNAME + - String +

          +
          +
          + The class name applied to active tabs. +
          +
          + + +
          + Default Value: "on" +
          + + +
          +

          dataConnection + - Object +

          +
          +
          + Provides a reference to the connection request object when data is +loaded dynamically. +
          +
          + + + + +
          +

          DISABLED_CLASSNAME + - String +

          +
          +
          + The class name applied to disabled tabs. +
          +
          + + +
          + Default Value: "disabled" +
          + + +
          +

          LABEL_INNER_TAGNAME + - String +

          +
          +
          + The default tag name for a Tab's inner element. +
          +
          + + +
          + Default Value: "em" +
          + + +
          +

          loadHandler + - object +

          +
          +
          + Object containing success and failure callbacks for loading data. +
          +
          + + + + +
          +

          LOADING_CLASSNAME + - String +

          +
          +
          + The class name applied to dynamic tabs while loading. +
          +
          + + +
          + Default Value: "disabled" +
          + + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.util.Element:

          +
          + + + DOM_EVENTS + +
          +
          +
          +

          Properties inherited from YAHOO.util.AttributeProvider:

          +
          + + + _configs + +
          +
          +
          +

          Properties inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Methods

          +
          +

          + initAttributes

          +
          + + + + + void + initAttributes + ( + + + attr + + + ) + + +
          + setAttributeConfigs TabView specific properties. +
          + +
          + +
          +
          Parameters:
          +
          + attr <Object> + Hash of initial attributes +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + void + toString + ( + ) + + +
          + Provides a readable name for the tab. +
          + +
          + + +
          +
          Returns: + + void +
          +
          String
          +
          + +
          + +
          +
          +
          +
          + + + +
          +

          Methods inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Events

          +
          +

          + activeChange

          +
          + + + + + 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);

          +
          + +
          + + + + +
          + +
          +
          +

          + beforeActiveChange

          +
          + + + + + 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);

          +
          + +
          + + + + +
          + +
          +
          +

          + beforeContentChange

          +
          + + + + + 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);

          +
          + +
          + + + + +
          + +
          +
          +

          + beforeLabelChange

          +
          + + + + + 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);

          +
          + +
          + + + + +
          + +
          +
          +

          + contentChange

          +
          + + + + + 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);

          +
          + +
          + + + + +
          + +
          +
          +

          + labelChange

          +
          + + + + + 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);

          +
          + +
          + + + + +
          + +
          +
          +
          +
          + + +
          +

          Events inherited from YAHOO.util.Element:

          +
          + + + available, + contentReady + +
          +
          + +
          +

          Configuration Attributes

          +
          +

          activationEvent + - String +

          +
          +
          + The event that triggers the tab's activation. +
          +
          + + + +
          +

          active + - Boolean +

          +
          +
          + 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. +
          +
          + + + +
          +

          cacheData + - Boolean +

          +
          +
          + Whether or not content should be reloaded for every view. +
          +
          + + +
          + Default Value: false +
          + +
          +

          content + - String +

          +
          +
          + The tab's content. +
          +
          + + + +
          +

          contentEl + - HTMLElement +

          +
          +
          + The HTMLElement that contains the tab's content. +
          +
          + + + +
          +

          contentVisible + - Boolean +

          +
          +
          + The Whether or not the tab's content is visible. +
          +
          + + +
          + Default Value: false +
          + +
          +

          dataLoaded + - Boolean +

          +
          +
          + Whether or not any data has been loaded from the server. +
          +
          + + + +
          +

          dataSrc + - String +

          +
          +
          + The tab's data source, used for loading content dynamically. +
          +
          + + + +
          +

          dataTimeout + - Number +

          +
          +
          + Number if milliseconds before aborting and calling failure handler. +
          +
          + + +
          + Default Value: null +
          + +
          +

          disabled + - Boolean +

          +
          +
          + Whether or not the tab is disabled. +
          +
          + + + +
          +

          href + - String +

          +
          +
          + The href of the tab's anchor element. +
          +
          + + +
          + Default Value: '#' +
          + +
          +

          label + - String +

          +
          +
          + The tab's label text (or innerHTML). +
          +
          + + + +
          +

          labelEl + - HTMLElement +

          +
          +
          + The element that contains the tab's label. +
          +
          + + + +
          +

          loadMethod + - String +

          +
          +
          + The method to use for the data request. +
          +
          + + +
          + Default Value: "GET" +
          + +
          + +
          +
          + +
          +

          Configuration attributes inherited from YAHOO.util.Element:

          +
          + + + element + +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.TabView.html b/www/extras/yui/docs/YAHOO.widget.TabView.html new file mode 100644 index 000000000..5cd3e7c88 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.TabView.html @@ -0,0 +1,1065 @@ + + + + API: tabview YAHOO.widget.TabView (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          tabview  2.2.2

          +

          + Yahoo! UI Library + > tabview + > YAHOO.widget.TabView + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.TabView + + - extends YAHOO.util.Element + + + + + + +

          + + + + + +
          + A widget to control tabbed views. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.TabView + + ( + + + + el(optional) + + , + 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. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _contentParent + - private HTMLElement +

          +
          +
          + The container of the tabView's content elements. +
          +
          + + + + +
          +

          _tabParent + - private HTMLElement +

          +
          +
          + The container of the tabView's label elements. +
          +
          + + + + +
          +

          CLASSNAME + - object +

          +
          +
          + The className to add when building from scratch. +
          +
          + + +
          + Default Value: "navset" +
          + + +
          +

          CONTENT_PARENT_CLASSNAME + - object +

          +
          +
          + 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 Value: "nav-content" +
          + + +
          +

          TAB_PARENT_CLASSNAME + - object +

          +
          +
          + 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 Value: "nav" +
          + + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.util.Element:

          +
          + + + DOM_EVENTS + +
          +
          +
          +

          Properties inherited from YAHOO.util.AttributeProvider:

          +
          + + + _configs + +
          +
          +
          +

          Properties inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Methods

          +
          +

          + addTab

          +
          + + + + + void + addTab + ( + + + tab + + + , + 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 +
          +
          void
          +
          + +
          + +
          +
          +

          + contentTransition

          +
          + + + + + void + contentTransition + ( + ) + + +
          + The transiton to use when switching between tabs. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + createTabs

          +
          + + private + + + void + createTabs + ( + + + elements + + + ) + + +
          + Creates Tab instances from a collection of HTMLElements. +
          + +
          + +
          +
          Parameters:
          +
          + elements <Array|HTMLCollection> + The elements to use for Tabs. +
          +
          + +
          +
          Returns: + + void +
          +
          void
          +
          + +
          + +
          +
          +

          + DOMEventHandler

          +
          + + + + + void + DOMEventHandler + ( + + + e + + + ) + + +
          + Routes childNode events. +
          + +
          + +
          +
          Parameters:
          +
          + e <event> + The Dom event that is being handled. +
          +
          + +
          +
          Returns: + + void +
          +
          void
          +
          + +
          + +
          +
          +

          + getTab

          +
          + + + + + void + getTab + ( + + + index + + + ) + + +
          + Returns the Tab instance at the specified index. +
          + +
          + +
          +
          Parameters:
          +
          + index <Integer> + The position of the Tab. +
          +
          + +
          +
          Returns: + + void +
          +
          YAHOO.widget.Tab
          +
          + +
          + +
          +
          +

          + getTabIndex

          +
          + + + + + void + getTabIndex + ( + + + tab + + + ) + + +
          + Returns the index of given tab. +
          + +
          + +
          +
          Parameters:
          +
          + tab <YAHOO.widget.Tab> + The tab whose index will be returned. +
          +
          + +
          +
          Returns: + + void +
          +
          int
          +
          + +
          + +
          +
          +

          + initAttributes

          +
          + + + + + void + initAttributes + ( + + + attr + + + ) + + +
          + setAttributeConfigs TabView specific properties. +
          + +
          + +
          +
          Parameters:
          +
          + attr <Object> + Hash of initial attributes +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + removeTab

          +
          + + + + + void + removeTab + ( + + + item + + + ) + + +
          + Removes the specified Tab from the TabView. +
          + +
          + +
          +
          Parameters:
          +
          + item <YAHOO.widget.Tab> + The Tab instance to be removed. +
          +
          + +
          +
          Returns: + + void +
          +
          void
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + void + toString + ( + ) + + +
          + Provides a readable name for the TabView instance. +
          + +
          + + +
          +
          Returns: + + void +
          +
          String
          +
          + +
          + +
          +
          +
          +
          + + + +
          +

          Methods inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Events

          +
          +

          + activeTabChange

          +
          + + + + + 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);

          +
          + +
          + + + + +
          + +
          +
          +

          + beforeActiveTabChange

          +
          + + + + + 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);

          +
          + +
          + + + + +
          + +
          +
          +

          + beforeOrientationChange

          +
          + + + + + 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);

          +
          + +
          + + + + +
          + +
          +
          +

          + orientationChange

          +
          + + + + + 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);

          +
          + +
          + + + + +
          + +
          +
          +
          +
          + + +
          +

          Events inherited from YAHOO.util.Element:

          +
          + + + available, + contentReady + +
          +
          + +
          +

          Configuration Attributes

          +
          +

          activeIndex + - Int +

          +
          +
          + The index of the tab currently active. +
          +
          + + + +
          +

          activeTab + - YAHOO.widget.Tab +

          +
          +
          + The tab currently active. +
          +
          + + + +
          +

          orientation + - String +

          +
          +
          + How the Tabs should be oriented relative to the TabView. +
          +
          + + +
          + Default Value: "top" +
          + +
          +

          tabs + - Array +

          +
          +
          + The Tabs belonging to the TabView instance. +
          +
          + + + +
          + +
          +
          + +
          +

          Configuration attributes inherited from YAHOO.util.Element:

          +
          + + + element + +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.TextNode.html b/www/extras/yui/docs/YAHOO.widget.TextNode.html new file mode 100644 index 000000000..468602dd4 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.TextNode.html @@ -0,0 +1,479 @@ + + + + API: treeview YAHOO.widget.TextNode (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + > YAHOO.widget.TextNode + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.TextNode + + - extends YAHOO.widget.Node + + + + + + +

          + + +
          +
          Known Subclasses: +
          + YAHOO.widget.MenuNode +
          +
          + + + +
          + 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. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.TextNode + + ( + + + + oData + + , + oParent + + , + expanded + ) + +
          +
          +
          Parameters:
          +
          + oData + <object> + + a string or object containing the data that will +be used to render this node +
          +
          + oParent + <YAHOO.widget.Node> + + this node's parent node +
          +
          + expanded + <boolean> + + the initial expanded/collapsed state +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          label + - string +

          +
          +
          + 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. +
          +
          + + + + +
          +

          labelElId + - string +

          +
          +
          + The derived element id of the label for this node +
          +
          + + + + +
          +

          labelStyle + - string +

          +
          +
          + The CSS class for the label href. Defaults to ygtvlabel, but can be +overridden to provide a custom presentation for a specific node. +
          +
          + + + + +
          + + +
          +
          + + +
          +

          Properties inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Methods

          +
          +

          + getLabelEl

          +
          + + + + + object + getLabelEl + ( + ) + + +
          + Returns the label element +
          + +
          + + +
          +
          Returns: + + object +
          +
          the element
          +
          + +
          + +
          +
          +

          + onLabelClick

          +
          + + + + + void + onLabelClick + ( + + + me + + + ) + + +
          + Executed when the label is clicked. Fires the labelClick custom event. +
          + +
          + +
          +
          Parameters:
          +
          + me <Node> + this node +
          +
          + +
          +
          Returns: + + void +
          +
          false to cancel the anchor click
          +
          + +
          + +
          +
          +
          +
          + + +
          +

          Methods inherited from YAHOO.util.EventProvider:

          + +
          + + + +
          +

          Events inherited from YAHOO.widget.Node:

          +
          + + + parentChange + +
          +
          + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.Tooltip.html b/www/extras/yui/docs/YAHOO.widget.Tooltip.html new file mode 100644 index 000000000..0a3378e17 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.Tooltip.html @@ -0,0 +1,1255 @@ + + + + API: container YAHOO.widget.Tooltip (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + > YAHOO.widget.Tooltip + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.Tooltip + + - extends YAHOO.widget.Overlay + + + + + + +

          + + + + + +
          + 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. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.Tooltip + + ( + + + + el + + + , + 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. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          showProcId + - int +

          +
          +
          + The unique process ID associated with the thread responsible for showing the Tooltip. +
          +
          + + + + +
          +

          YAHOO.widget.Tooltip._DEFAULT_CONFIG + - private final Object +

          +
          +
          + Constant representing the Tooltip's configuration properties +
          +
          + + + + +
          +

          YAHOO.widget.Tooltip.CSS_TOOLTIP + - static final String +

          +
          +
          + Constant representing the Tooltip CSS class +
          +
          + + + + +
          + + +
          +
          + + + + +
          +

          Methods

          +
          +

          + _removeEventListeners

          +
          + + protected + + + void + _removeEventListeners + ( + ) + + +
          + Removes all of the DOM event handlers from the HTML element(s) +that trigger the display of the tooltip. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + configContainer

          +
          + + + + + void + configContainer + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configContext

          +
          + + + + + void + configContext + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + configText

          +
          + + + + + void + configText + ( + + + type + + + , + args + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + destroy

          +
          + + + + + void + destroy + ( + ) + + +
          + Removes the Tooltip element from the DOM and sets all child elements to null. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + doHide

          +
          + + + + + void + 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. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + doShow

          +
          + + + + + Number + doShow + ( + + + 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
          +
          + +
          + +
          +
          +

          + init

          +
          + + + + + void + init + ( + + + el + + + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + initDefaultConfig

          +
          + + + + + void + initDefaultConfig + ( + ) + + +
          + Initializes the class's configurable properties which can be changed using the Overlay's Config object (cfg). +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onContextMouseMove

          +
          + + + + + void + onContextMouseMove + ( + + + e + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + onContextMouseOut

          +
          + + + + + void + onContextMouseOut + ( + + + e + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + onContextMouseOver

          +
          + + + + + void + onContextMouseOver + ( + + + e + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + preventOverlay

          +
          + + + + + void + preventOverlay + ( + + + pageX + + + , + 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 +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + String + toString + ( + ) + + +
          + Returns a string representation of the object. +
          + +
          + + +
          +
          Returns: + + String +
          +
          The string representation of the Tooltip
          +
          + +
          + +
          +
          +
          +
          + + + + + + + + + +
          +

          Configuration Attributes

          +
          +

          autodismissdelay + - Number +

          +
          +
          + The number of milliseconds to wait before automatically dismissing a Tooltip after the mouse has been resting on the context element. +
          +
          + + +
          + Default Value: 5000 +
          + +
          +

          container + - HTMLElement/String +

          +
          +
          + Specifies the container element that the Tooltip's markup should be rendered into. +
          +
          + + +
          + Default Value: document.body +
          + +
          +

          context + - HTMLElement[]/String[] +

          +
          +
          + Specifies the element or elements that the Tooltip should be anchored to on mouseover. +
          +
          + + +
          + Default Value: null +
          + +
          +

          hidedelay + - Number +

          +
          +
          + The number of milliseconds to wait before hiding a Tooltip on mouseover. +
          +
          + + +
          + Default Value: 250 +
          + +
          +

          preventoverlap + - Boolean +

          +
          +
          + Specifies whether the Tooltip should be kept from overlapping its context element. +
          +
          + + +
          + Default Value: true +
          + +
          +

          showdelay + - Number +

          +
          +
          + The number of milliseconds to wait before showing a Tooltip on mouseover. +
          +
          + + +
          + Default Value: 200 +
          + +
          +

          text + - String +

          +
          +
          + Specifies the Tooltip's text. +
          +
          + + +
          + Default Value: null +
          + +
          + +
          +
          + +
          +

          Configuration attributes inherited from YAHOO.widget.Module:

          +
          + + + effect, + monitorresize, + visible + +
          +
          +
          +

          Configuration attributes inherited from YAHOO.widget.Overlay:

          +
          + + + constraintoviewport, + context, + fixedcenter, + height, + iframe, + width, + x, + xy, + y, + zIndex + +
          +
          + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO.widget.TreeView.html b/www/extras/yui/docs/YAHOO.widget.TreeView.html new file mode 100644 index 000000000..85e883523 --- /dev/null +++ b/www/extras/yui/docs/YAHOO.widget.TreeView.html @@ -0,0 +1,2168 @@ + + + + API: treeview YAHOO.widget.TreeView (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + > YAHOO.widget.TreeView + +

          +
          + +
          +
          +
          + + +

          + + + + + Class YAHOO.widget.TreeView + + + + + - uses + + YAHOO.util.EventProvider + + + + +

          + + + + + +
          + Contains the tree view state data and the root node. +
          + +
          +

          Constructor

          +
          +
          + YAHOO.widget.TreeView + + ( + + + + id + ) + +
          +
          +
          Parameters:
          +
          + id + <string|HTMLElement> + + The id of the element, or the element +itself that the tree will be inserted into. +
          +
          + + +
          +
          +
          +
          + +
          +

          Properties

          +
          +

          _animCount + - private int +

          +
          +
          + The current number of animations that are executing +
          +
          + + + + +
          +

          _collapseAnim + - private string +

          +
          +
          + The animation to use for collapsing children, if any +
          +
          + + + + +
          +

          _el + - private object +

          +
          +
          + The host element for this tree +
          +
          + + + + +
          +

          _expandAnim + - private string +

          +
          +
          + The animation to use for expanding children, if any +
          +
          + + + + +
          +

          _nodes + - private Node[] +

          +
          +
          + Flat collection of all nodes in this tree. This is a sparse +array, so the length property can't be relied upon for a +node count for the tree. +
          +
          + + + + +
          +

          id + - String +

          +
          +
          + The id of tree container element +
          +
          + + + + +
          +

          locked + - boolean +

          +
          +
          + We lock the tree control while waiting for the dynamic loader to return +
          +
          + + + + +
          +

          maxAnim + - int +

          +
          +
          + The maximum number of animations to run at one time. +
          +
          + + + + +
          +

          YAHOO.widget.TreeView.counter + - private static object +

          +
          +
          + Counter for generating a new unique element id +
          +
          + + + + +
          +

          YAHOO.widget.TreeView.nodeCount + - static int +

          +
          +
          + Running count of all nodes created in all trees. This is +used to provide unique identifies for all nodes. Deleting +nodes does not change the nodeCount. +
          +
          + + + + +
          +

          YAHOO.widget.TreeView.trees + - private static Array +

          +
          +
          + Global cache of tree instances +
          +
          + + + + +
          + + +
          +
          + +
          +

          Properties inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Methods

          +
          +

          + _deleteNode

          +
          + + private + + + void + _deleteNode + ( + ) + + +
          + Deletes the node and recurses children +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + animateCollapse

          +
          + + + + + boolean + animateCollapse + ( + + + el + + + , + node + + + ) + + +
          + Perform the collapse animation if configured, or just show the +element if not configured or too many animations are in progress +
          + +
          + +
          +
          Parameters:
          +
          + el <HTMLElement> + the element to animate +
          +
          + node <YAHOO.util.Node> + the node that was expanded +
          +
          + +
          +
          Returns: + + boolean +
          +
          true if animation could be invoked, false otherwise
          +
          + +
          + +
          +
          +

          + animateExpand

          +
          + + + + + boolean + animateExpand + ( + + + el + + + , + node + + + ) + + +
          + Perform the expand animation if configured, or just show the +element if not configured or too many animations are in progress +
          + +
          + +
          +
          Parameters:
          +
          + el <HTMLElement> + the element to animate +
          +
          + node <YAHOO.util.Node> + the node that was expanded +
          +
          + +
          +
          Returns: + + boolean +
          +
          true if animation could be invoked, false otherwise
          +
          + +
          + +
          +
          +

          + collapseAll

          +
          + + + + + void + collapseAll + ( + ) + + +
          + Collapses all expanded child nodes in the entire tree. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + collapseComplete

          +
          + + + + + void + collapseComplete + ( + ) + + +
          + Function executed when the collapse animation completes +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + draw

          +
          + + + + + void + draw + ( + ) + + +
          + Renders the tree boilerplate and visible nodes +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + expandAll

          +
          + + + + + void + 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. +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + expandComplete

          +
          + + + + + void + expandComplete + ( + ) + + +
          + Function executed when the expand animation completes +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + generateId

          +
          + + private + + + void + generateId + ( + ) + + +
          + Generates an unique id for an element if it doesn't yet have one +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + getEl

          +
          + + + + + HTMLElement + getEl + ( + ) + + +
          + Returns the tree's host element +
          + +
          + + +
          +
          Returns: + + HTMLElement +
          +
          the host element
          +
          + +
          + +
          +
          +

          + getNodeByIndex

          +
          + + + + + Node + getNodeByIndex + ( + + + 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
          +
          + +
          + +
          +
          +

          + getNodeByProperty

          +
          + + + + + Node + getNodeByProperty + ( + + + property + + + , + 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
          +
          + +
          + +
          +
          +

          + getNodesByProperty

          +
          + + + + + Array + getNodesByProperty + ( + + + property + + + , + 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
          +
          + +
          + +
          +
          +

          + getRoot

          +
          + + + + + Node + getRoot + ( + ) + + +
          + Returns the root node of this tree +
          + +
          + + +
          +
          Returns: + + Node +
          +
          the root node
          +
          + +
          + +
          +
          +

          + init

          +
          + + private + + + void + init + ( + ) + + +
          + Initializes the tree +
          + +
          + + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + onCollapse

          +
          + + + + + void + onCollapse + ( + + + node + + + ) + + +
          + Abstract method that is executed when a node is collapsed. +
          + +
          + +
          +
          Parameters:
          +
          + node <Node> + the node that was collapsed. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + Deprecated use treeobj.subscribe("collapse") instead +
          +
          + +
          +
          +

          + onExpand

          +
          + + + + + void + onExpand + ( + + + node + + + ) + + +
          + Abstract method that is executed when a node is expanded +
          + +
          + +
          +
          Parameters:
          +
          + node <Node> + the node that was expanded +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + Deprecated use treeobj.subscribe("expand") instead +
          +
          + +
          +
          +

          + popNode

          +
          + + + + + void + popNode + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + regNode

          +
          + + private + + + void + regNode + ( + + + node + + + ) + + +
          + Nodes register themselves with the tree instance when they are created. +
          + +
          + +
          +
          Parameters:
          +
          + node <Node> + the node to register +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + removeChildren

          +
          + + + + + void + removeChildren + ( + + + 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 +
          +
          +
          + +
          + +
          +
          +

          + removeNode

          +
          + + + + + boolean + removeNode + ( + + + The + + + , + 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.
          +
          + +
          + +
          +
          +

          + setCollapseAnim

          +
          + + + + + void + setCollapseAnim + ( + + + the + + + ) + + +
          + Sets up the animation for collapsing children +
          + +
          + +
          +
          Parameters:
          +
          + the <string> + type of animation (acceptable values defined in +YAHOO.widget.TVAnim) +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setDynamicLoad

          +
          + + + + + void + setDynamicLoad + ( + + + fnDataLoader + + + , + iconMode + + + ) + + +
          + Configures this tree to dynamically load all child data +
          + +
          + +
          +
          Parameters:
          +
          + fnDataLoader <function> + the function that will be called to get the data +
          +
          + 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. +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setExpandAnim

          +
          + + + + + void + setExpandAnim + ( + + + type + + + ) + + +
          + Sets up the animation for expanding children +
          + +
          + +
          +
          Parameters:
          +
          + type <string> + the type of animation (acceptable values defined +in YAHOO.widget.TVAnim) +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + setUpLabel

          +
          + + + + + void + setUpLabel + ( + + + oData + + + ) + + +
          + Sets up the node label +
          + +
          + +
          +
          Parameters:
          +
          + oData <object> + string containing the label, or an object with a label property +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + toString

          +
          + + + + + string + toString + ( + ) + + +
          + TreeView instance toString +
          + +
          + + +
          +
          Returns: + + string +
          +
          string representation of the tree
          +
          + +
          + +
          +
          +

          + YAHOO.widget.TreeView.addHandler

          +
          + + + static + + void + YAHOO.widget.TreeView.addHandler + ( + + + el + + + , + sType + + + , + fn + + + ) + + +
          + Add a DOM event +
          + +
          + +
          +
          Parameters:
          +
          + el <object> + the elment to bind the handler to +
          +
          + sType <string> + the type of event handler +
          +
          + fn <function> + the callback to invoke +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +

          + YAHOO.widget.TreeView.getNode

          +
          + + + static + + Node + YAHOO.widget.TreeView.getNode + ( + + + treeId + + + , + nodeIndex + + + ) + + +
          + Global method for getting a node by its id. Used in the generated +tree html. +
          + +
          + +
          +
          Parameters:
          +
          + treeId <String> + the id of the tree instance +
          +
          + nodeIndex <String> + the index of the node to return +
          +
          + +
          +
          Returns: + + Node +
          +
          the node instance requested, null if not found
          +
          + +
          + +
          +
          +

          + YAHOO.widget.TreeView.getTree

          +
          + + + static + + TreeView + YAHOO.widget.TreeView.getTree + ( + + + treeId + + + ) + + +
          + Global method for getting a tree by its id. Used in the generated +tree html. +
          + +
          + +
          +
          Parameters:
          +
          + treeId <String> + the id of the tree instance +
          +
          + +
          +
          Returns: + + TreeView +
          +
          the tree instance requested, null if not found.
          +
          + +
          + +
          +
          +

          + YAHOO.widget.TreeView.preload

          +
          + + + static + + void + YAHOO.widget.TreeView.preload + ( + + + prefix + + + ) + + +
          + 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 +
          +
          +
          + +
          + +
          +
          +

          + YAHOO.widget.TreeView.removeHandler

          +
          + + + static + + void + YAHOO.widget.TreeView.removeHandler + ( + + + el + + + , + sType + + + , + fn + + + ) + + +
          + Remove a DOM event +
          + +
          + +
          +
          Parameters:
          +
          + el <object> + the elment to bind the handler to +
          +
          + sType <string> + the type of event handler +
          +
          + fn <function> + the callback to invoke +
          +
          + +
          +
          Returns: + + void +
          +
          +
          + +
          + +
          +
          +
          +
          + +
          +

          Methods inherited from YAHOO.util.EventProvider:

          + +
          + +
          +

          Events

          +
          +

          + animComplete

          +
          + + + + + animComplete + + ( + + + node + + + ) + + + +
          + When animation is enabled, this event fires when the animation +completes +
          + +
          + + +
          +
          Parameters:
          +
          + node <YAHOO.widget.Node> + the node that is expanding/collapsing +
          +
          + + +
          + +
          +
          +

          + animStart

          +
          + + + + + animStart + + ( + + + node + + + ) + + + +
          + When animation is enabled, this event fires when the animation +starts +
          + +
          + + +
          +
          Parameters:
          +
          + node <YAHOO.widget.Node> + the node that is expanding/collapsing +
          +
          + + +
          + +
          +
          +

          + collapse

          +
          + + + + + collapse + + ( + + + node + + + ) + + + +
          + Fires when a node is going to be collapsed. Return false to stop +the collapse. +
          + +
          + + +
          +
          Parameters:
          +
          + node <YAHOO.widget.Node> + the node that is collapsing +
          +
          + + +
          + +
          +
          +

          + collapseComplete

          +
          + + + + + collapseComplete + + ( + + + node + + + ) + + + +
          + Fires after a node is successfully collapsed. This event will not fire +if the "collapse" event was cancelled. +
          + +
          + + +
          +
          Parameters:
          +
          + node <YAHOO.widget.Node> + the node that was collapsed +
          +
          + + +
          + +
          +
          +

          + expand

          +
          + + + + + expand + + ( + + + node + + + ) + + + +
          + Fires when a node is going to be expanded. Return false to stop +the collapse. +
          + +
          + + +
          +
          Parameters:
          +
          + node <YAHOO.widget.Node> + the node that is expanding +
          +
          + + +
          + +
          +
          +

          + expandComplete

          +
          + + + + + expandComplete + + ( + + + node + + + ) + + + +
          + Fires after a node is successfully expanded. This event will not fire +if the "expand" event was cancelled. +
          + +
          + + +
          +
          Parameters:
          +
          + node <YAHOO.widget.Node> + the node that was expanded +
          +
          + + +
          + +
          +
          +

          + labelClick

          +
          + + + + + labelClick + + ( + + + node + + + ) + + + +
          + 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 +
          + +
          + + +
          +
          Parameters:
          +
          + node <YAHOO.widget.Node> + the node clicked +
          +
          + + +
          + +
          +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/YAHOO_config.html b/www/extras/yui/docs/YAHOO_config.html new file mode 100644 index 000000000..880e548f2 --- /dev/null +++ b/www/extras/yui/docs/YAHOO_config.html @@ -0,0 +1,173 @@ + + + + API: yahoo YAHOO_config (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          YAHOO Global  2.2.2

          +

          + Yahoo! UI Library + > yahoo + > YAHOO_config + +

          +
          + +
          +
          +
          + + +

          + + + static + + Class YAHOO_config + + + + + + + +

          + + + + + +
          + YAHOO_config is not included part of the library. Instead it is an object +that can be defined by the implementer immediately before including the +YUI library. The properties included in this object will be used to +configure global properties needed as soon as the library begins to load. +
          + + +
          +

          Properties

          +
          +

          listener + - static object +

          +
          +
          + A reference to a function that will be executed every time a YAHOO module +is loaded. As parameter, this function will receive the version +information for the module. See +YAHOO.env.getVersion for the description of the version data structure. +
          +
          + + + + +
          + + +
          +
          + + + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/assets/ac-js b/www/extras/yui/docs/assets/ac-js new file mode 100644 index 000000000..4ae671a38 --- /dev/null +++ b/www/extras/yui/docs/assets/ac-js @@ -0,0 +1,89 @@ +(function() { + var oACDS; + var oAutoComp; + + var propsort = function(a, b) { + //return (a.url > b.url) ? 1 : ((a.url < b.url) ? -1 : 0); + return (a.name.toLowerCase() > b.name.toLowerCase()) ? 1 : ((a.name.toLowerCase() < b.name.toLowerCase()) ? -1 : 0); + } + + var allprops = ALL_YUI_PROPS; + + // allprops.sort(propsort); + + var getResults = function(query) { + var results = []; + if(query && query.length > 0) { + for (var i=0, len=allprops.length; i -1) { + results.push([query,prop]); + } + } + } + + return results; + }; + + // Define Custom Event handlers + var myOnDataReturn = function(sType, aArgs) { + var oAutoComp = aArgs[0]; + var query = aArgs[1]; + var aResults = aArgs[2]; + + if(aResults.length == 0) { + if (query.length > 0) { + oAutoComp.setBody("
          Not found
          "); + } else { + oAutoComp.setBody("
          Start typing to find a property/method/event/config " + + " or browse a module by clicking a link on the left.
          "); + } + } + }; + + var myOnContainerCollapse = function(sType, aArgs) { + var oAutoComp = aArgs[0]; + oAutoComp.setBody("
          Start typing to find a property/method/event/config
          "); + }; + + var myOnItemSelect = function(sType, aArgs) { + var ac = aArgs[0]; + var item = aArgs[2]; + location.href = item[1].url; + }; + + + var init = function() { + + // Instantiate JS Function DataSource + oACDS = new YAHOO.widget.DS_JSFunction(getResults); + oACDS.maxCacheEntries = 30; + + // Instantiate AutoComplete + oAutoComp = new YAHOO.widget.AutoComplete('searchinput','searchresults', oACDS); + oAutoComp.alwaysShowContainer = true; + oAutoComp.queryDelay = 0.2; + oAutoComp.maxResultsDisplayed = 200; + oAutoComp.formatResult = function(oResultItem, query) { + var sMarkup = "" + oResultItem[1].host + ' ' + oResultItem[1].name + ''; + return sMarkup; + }; + + // Subscribe to Custom Events + oAutoComp.dataReturnEvent.subscribe(myOnDataReturn); + oAutoComp.containerCollapseEvent.subscribe(myOnContainerCollapse); + oAutoComp.itemSelectEvent.subscribe(myOnItemSelect); + + // Set initial content in the container + oAutoComp.sendQuery(document.getElementById("searchinput").value); + }; + + var validateForm = function() { + return false; + }; + + init(); + +})(); diff --git a/www/extras/yui/docs/assets/api-js b/www/extras/yui/docs/assets/api-js new file mode 100644 index 000000000..2dc5e3b47 --- /dev/null +++ b/www/extras/yui/docs/assets/api-js @@ -0,0 +1,317 @@ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +if(typeof YAHOO=="undefined"){var YAHOO={};} +YAHOO.namespace=function(){var a=arguments,o=null,i,j,d;for(i=0;i-1){return true;}else{return YAHOO.lang.isObject(obj)&&obj.constructor==Array;}},isBoolean:function(obj){return typeof obj=='boolean';},isFunction:function(obj){return typeof obj=='function';},isNull:function(obj){return obj===null;},isNumber:function(obj){return!isNaN(obj);},isObject:function(obj){return typeof obj=='object'||YAHOO.lang.isFunction(obj);},isString:function(obj){return typeof obj=='string';},isUndefined:function(obj){return typeof obj=='undefined';},hasOwnProperty:function(obj,prop){if(Object.prototype.hasOwnProperty){return obj.hasOwnProperty(prop);} +return!YAHOO.lang.isUndefined(obj[prop])&&obj.constructor.prototype[prop]!==obj[prop];},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];}}},augment:function(r,s){var rp=r.prototype,sp=s.prototype,a=arguments,i,p;if(a[2]){for(i=2;i-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=this.left&®ion.right<=this.right&®ion.top>=this.top&®ion.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.register("dom",YAHOO.util.Dom,{version:"2.2.0",build:"build.77"}); +if(!YAHOO.util.Event){YAHOO.util.Event=function(){var loadComplete=false;var listeners=[];var unloadListeners=[];var legacyEvents=[];var legacyHandlers=[];var retryCount=0;var onAvailStack=[];var legacyMap=[];var counter=0;var lastError=null;return{POLL_RETRYS:200,POLL_INTERVAL:20,EL:0,TYPE:1,FN:2,WFN:3,OBJ:3,ADJ_SCOPE:4,isSafari:(/KHTML/gi).test(navigator.userAgent),webkit:function(){var v=navigator.userAgent.match(/AppleWebKit\/([^ ]*)/);if(v&&v[1]){return v[1];} +return null;}(),isIE:(!this.webkit&&!navigator.userAgent.match(/opera/gi)&&navigator.userAgent.match(/msie/gi)),_interval:null,startInterval:function(){if(!this._interval){var self=this;var callback=function(){self._tryPreloadAttach();};this._interval=setInterval(callback,this.POLL_INTERVAL);}},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();},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();},addListener:function(el,sType,fn,obj,override){if(!fn||!fn.call){return false;} +if(this._isValidCollection(el)){var ok=true;for(var i=0,len=el.length;i=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;i0);} +var notAvail=[];for(var i=0,len=onAvailStack.length;i0){for(var i=0,len=listeners.length;i0){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;i0){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){} +return false;}}} +return true;},unsubscribeAll:function(){for(var i=0,len=this.subscribers.length;i=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||(this._nKeyCode==8)){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);}; diff --git a/www/extras/yui/docs/assets/api.css b/www/extras/yui/docs/assets/api.css new file mode 100644 index 000000000..1b88e2409 --- /dev/null +++ b/www/extras/yui/docs/assets/api.css @@ -0,0 +1,134 @@ +/*2.2.0*/ +/*reset.css*/body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing: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%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym {border:0;} +/*fonts.css*/body{font:13px arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}table {font-size:inherit;font:100%;}select, input, textarea {font:99% arial,helvetica,clean,sans-serif;}pre, code {font:115% monospace;*font-size:100%;}body * {line-height:1.22em;} +/*grids.css*/body{text-align:center;}#ft{clear:both;}#doc,#doc2,#doc3,.yui-t1,.yui-t2,.yui-t3,.yui-t4,.yui-t5,.yui-t6,.yui-t7{margin:auto;text-align:left;width:57.69em;*width:56.3em;min-width:750px;}#doc2{width:73.074em;*width:71.313em;min-width:950px;}#doc3{margin:auto 10px;width:auto;}.yui-b{position:relative;}.yui-b{_position:static;}#yui-main .yui-b{position:static;}#yui-main{width:100%;}.yui-t1 #yui-main,.yui-t2 #yui-main,.yui-t3 #yui-main{float:right;margin-left:-25em;}.yui-t4 #yui-main,.yui-t5 #yui-main,.yui-t6 #yui-main{float:left;margin-right:-25em;}.yui-t1 .yui-b{float:left;width:12.3207em;*width:12.0106em;}.yui-t1 #yui-main .yui-b{margin-left:13.3207em;*margin-left:13.0106em;}.yui-t2 .yui-b{float:left;width:13.8456em;*width:13.512em;}.yui-t2 #yui-main .yui-b{margin-left:14.8456em;*margin-left:14.512em;}.yui-t3 .yui-b{float:left;width:23.0759em;*width:22.52em;}.yui-t3 #yui-main .yui-b{margin-left:24.0759em;*margin-left:23.52em;}.yui-t4 .yui-b{float:right;width:13.8456em;*width:13.512em;}.yui-t4 #yui-main .yui-b{margin-right:14.8456em;*margin-right:14.512em;}.yui-t5 .yui-b{float:right;width:18.4608em;*width:18.016em;}.yui-t5 #yui-main .yui-b{margin-right:19.4608em;*margin-right:19.016em;}.yui-t6 .yui-b{float:right;width:23.0759em;*width:22.52em;}.yui-t6 #yui-main .yui-b{margin-right:24.0759em;*margin-right:23.52em;}.yui-t7 #yui-main .yui-b{display:block;margin:0 0 1em 0;}#yui-main .yui-b{float:none;width:auto;}.yui-g .yui-u,.yui-g .yui-g,.yui-gc .yui-u,.yui-gc .yui-g .yui-u,.yui-ge .yui-u,.yui-gf .yui-u{float:right;display:inline;}.yui-g div.first,.yui-gc div.first,.yui-gc div.first div.first,.yui-gd div.first,.yui-ge div.first,.yui-gf div.first{float:left;}.yui-g .yui-u,.yui-g .yui-g{width:49.1%;}.yui-g .yui-g .yui-u,.yui-gc .yui-g .yui-u{width:48.1%;}.yui-gb .yui-u,.yui-gc .yui-u,.yui-gd .yui-u{float:left;margin-left:2%;*margin-left:1.895%;width:32%;}.yui-gb div.first,.yui-gc div.first,.yui-gd div.first{margin-left:0;}.yui-gc div.first,.yui-gd .yui-u{width:66%;}.yui-gd div.first{width:32%;}.yui-ge .yui-u{width:24%;}.yui-ge div.first,.yui-gf .yui-u{width:74.2%;}.yui-gf div.first{width:24%;}.yui-ge div.first{width:74.2%;}#bd:after,.yui-g:after,.yui-gb:after,.yui-gc:after,.yui-gd:after,.yui-ge:after,.yui-gf:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#bd,.yui-g,.yui-gb,.yui-gc,.yui-gd,.yui-ge,.yui-gf{zoom:1;} + +/* main page */ +a:link { color: #00F; } +a:visited { color: #003399;} + +#hd {margin-bottom:1em} +#hd h1 { color: #545454; font:170%/50px arial Bold; padding: 8px 0 8px 70px; background: url(logo.gif) left center no-repeat; } +#hd h3 { background: #947DB2; color: #FFF; font: 110%/1.22em arial; padding: 5px 10px; margin: 0 0 7px 0; } +#hd h3 A { color: #FFF; text-decoration: none; } +#hd .breadcrumbs { font-size: 85%; margin-bottom:10px;} +#hd .subtitle {position: absolute; right:1em; padding: 0px;margin:0px} + +#doc3 dl { margin: 2px 0; } +#doc3 dd { margin-left: 20px; } +#doc3 .requires dt { font-style: italic; } +#doc3 .default { margin-top:6px; } +#doc3 .deprecated { margin-top:4px; padding:4px; background-color: #EFECCA } +#doc3 .deprecated strong { color:#441054; } +#doc3 code, pre {font-size:85%} + +/* undo reset.css styles for description block formatting */ +#doc3 .description ul { padding: 10px 0 10px 28px; font-size: 90%; list-style: disc} +#doc3 .description p { padding-bottom: 10px} +#doc3 .description strong { font-weight: bold;} +#doc3 .description em {padding: 2px; background-color: #EFECCA} +#doc3 pre { padding: 10px;} + +#doc3 .summary { margin: 0px 0 10px 0; padding:10px; border: 1px solid #cccccc; background-color: #eeeeee; } +#doc3 .extends {font-weight: normal; font-size: 90%} + +#doc3 .nav {min-height: 400px;} +#doc3 .nav .module {width:100%; background:#EEEEEE; margin: 0 0 15px 0; padding: 0; overflow:hidden} +#doc3 .nav .module h4 { padding: 3px 5px; border-bottom: #947DB2 1px solid; } +#doc3 .nav .module h4 A { color: #000; text-decoration: none; } +#doc3 .nav .module .content { padding: 2px; } +#doc3 .nav .module UL.content LI { font-size: 90%; } +#doc3 .nav .module UL.content A { text-decoration: none; } +#doc3 .nav .module LI { padding: 2px 4px 2px 4px; } +#doc3 .nav .module LI.selected { background: #CDC6D5; } + +#doc3 .section { margin: 0 0 16px 0; } +#doc3 .section strong { font-weight: bold;} +#doc3 .section hr { border: none 0; border-top: 1px solid #cccccc; } +#doc3 .section h4 { font-size:110%;} +#doc3 .section h3 { background: #947DB2; width: 100%; color: #FFF; padding: 3px; margin: 0 0 7px 0; } +#doc3 .section h3 .top { font-size: 60%; font-weight: normal; width: 100%; font-family: verdana; padding-left: 20px; } +#doc3 .section h3 .top A { color: #FFF; text-decoration: none; } + +#doc3 .section.details .content { padding: 0 0 0 10px; } +#doc3 .section.details .description { padding: 10px 0 0 20px; } +#doc3 .section.details .description dt { font-weight: bold; } +#doc3 .section.details .description td { border:1px solid #ccc; margin:2px;padding:2px;} + +#doc3 .inheritance { padding:10px; background-color:#eeeeee } +#doc3 .inheritance h4 { font-size: 100%;} + +/* index page autocomplete */ +#propertysearch {;position:absolute;margin:1em;width:35em;}/* set width of widget here*/ +#searchinput {position:absolute;width:100%;height:1.4em;} +#searchresults {position:absolute;top:1.7em;width:100%;} +#searchresults .yui-ac-content {position:absolute;top:4px; left:0px; width:100%;height:20em;border:1px solid #404040;background:#fff;overflow:auto;overflow-x:hidden;z-index:9050;} +/*#searchresults .yui-ac-shadow {position:absolute;margin:.3em;width:100%;background:#a0a0a0;z-index:9049;}*/ +#searchresults ul {padding:5px 0;width:100%;} +#searchresults li {padding:0 5px;cursor:default;white-space:nowrap;} +#searchresults li.yui-ac-highlight {background:#D1C6DA;} +#searchresults li em { position:absolute; width:44%; overflow:hidden; color:#654D6C;} +#searchresults li span { position:relative; left:46% } + +/* source code view */ +#srcout {min-width: 580px; } +*html #srcout { width: 100%; padding-bottom:1em; overflow-x:auto } + +.highlight .c { color: #60a0b0; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .cm { color: #60a0b0; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .c1 { color: #60a0b0; font-style: italic } /* Comment.Single */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #808080 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0040D0 } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #007020; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #40a070 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .mf { color: #40a070 } /* Literal.Number.Float */ +.highlight .mh { color: #40a070 } /* Literal.Number.Hex */ +.highlight .mi { color: #40a070 } /* Literal.Number.Integer */ +.highlight .mo { color: #40a070 } /* Literal.Number.Oct */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .il { color: #40a070 } /* Literal.Number.Integer.Long */ + diff --git a/www/extras/yui/docs/assets/logo.gif b/www/extras/yui/docs/assets/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..7b00575606c147b260183f61ea2a0f6820080512 GIT binary patch literal 705 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

          X|CDWzfAq!4YNBnR$>tDB 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≧y|{0R>QvkUf?e@ z^vyRsnBrn%=}0KssYCu+-Q{Th)!UxW>tIS=-S{6qYPzrA3fs+cWsQweJ*+}{8~=5T z(K!t!b!3B~nz~HA^EHWNG5@94^+;@KV7uK6+#PWT*Y;jZx7@2}0*+n%8HYNY=H;gA zG@6gg0>^}mv?&3MP5%#R*9ddrS1qJm{13e^IQGrijn{~WoQC;Fk)2%VIqe(QrPw%? z51UXW%p8)lsq6~+D^7izJ&dzssb|D&Y;5IiIxYYF$A>4zISh^e=l?!w8xC z@dUU&GaJO&Fh5Hr^m`39STX^%IGg$9epw=l=98$?rNc%F@=1{-v-lFE9 zgB60O;Dvr)v|t)!Nec7Vk+EOCgjyGgyPEAZqOioUYjL?0mfHe(K zy3+hpb2v{R@0Vief9G_!(%=bg1bDcCecC7b9U)wDWrwM|rGH}rT>@zEwf?!%MCfIG zx$2sqUb{hWJ@+yMkBZ^ZqoPni^&bH3l)3@yVV8U2X7JF{2@n?E&e7_7&(M&S5A95w zj^;D}PHxl*-a8IYBjp1F1NXZ~m3aWBLVUw>aTg!)+G`JVug0=MiDVDZAh6iGccB5f z;~G1Clsp7=BXev=pq#De&O3;o17M!CxSF zvBEHM(vO<){@qGww10Vnyy1Guv6;S^CRlgtn%ST4*zfJ_Jvus)X~>sUO;Pf!;ySQ+ zWNcTOF^5wt%AeOjFShU)tWOHX)x`&-&v)4@w!wCzx=}B|`H}sEU{s+MWI^u;s^cqr zfGD9O6dSMxw)9$wQ?gj^V-u3cz7!5UMT}_uMi|*vj@RoVR(LpN*5_bn>2UZ?;z!O8 zrsBg@9$BM-e^?!u*%l27|5S++8n4T}#~d;qPqR}%7Qv*tFd zIt88qW`MMAoU}gy)21<;yZuNE0Snv5hSkk3+fC~UX$K|6Grs3 z&g0|T{eNR_>v`inN&d`CD`wEP7ChGVFXP38W{i#5uTz7L-8n#>x9RB-D=`|!Tzml1 zxA$~q?M?G_E{{1}q}lhR(C6@`~p8@X&`jp51(M zevZ1Kp`i`YWFmvZ)x_pOFZQf?5O>Mq3VgjDxU>H!KCOEFuX7w*TSWnY#6tiwKkr{2 z+(nysB5`mcd@i~d8mR!hI6~oV*9&G#98nlCtly@?#4=6HdBJZ?j(h^kTkr%2Sl&G{ zc z+6JFU0oB)_)$P&F1d)rL$0Gb>OU>+cIf1-&d>{ldBt!^%3S_|wumt{3xK1L+0u#i- zP^$DgGx`WPZIm=LYGUOtuMcwliMbu}Vt(2>_{6-wm4=89vh=?<_qYxUYrHYjZEpx%;N?v7^jc`nIX#@OlZk~Yc`Vf$M&W*~j+Kvl ze187qqrXu$B0JW&Bi+)ag`lESTHJMZu?cgvneHSX;V8o-O$Vv>Xs9)SwC^BtpxP6^ z$L-cLzPdvJ$SZ3)N&{J(Xk47A3Y^UVD9`-V(%+#f!A$cS)oP~2 zNt8S{#Tn!l=Tyy_VmrIL?53kwFiuWRUjRTXG&CiW%)F31VgaxD^50aL4KH8pZNp%; z?4-T~qy;rysc%f7O}j~%fc`stI4tl82)vC;SF*)3*HbPowOZlewMt8P$$ZbdH3n6d&{%XKTI;!rOJ;Ho z_v_W;?$5Pj&jr+9zFZm_`u4eH;ll%uj}7zlr{i*Yq(b@#w5Xr73$dW(rt`(EiEI3; zE*pr2yQ&n9aAB5>m6h(ntSPT0i|gG@*97edEv;#u7SXT(KS030bju~I=QgT(#Q)G) zk%g!$J)qX#24#QKizD>Uz&rc2oL?{w~+)>H{FNMxVVaceogsh`te187*^)w>GaVO;Xv>(nP^e*~m-8P`S}ov#7Kb?#q|&nQ1%(I=7&9pvRe6 zOO^4@PWHINJ#r)&QDTU6Wf<5qh3sa2uj@WYKxg(#to@3g&s#5M zCwR;F3*sN+CPvrSU-{x(ftp+J{AD6a_U`cpoWqI}^IKNGT;wW--mUDh-#efw-J_0< zD1!JsX(CkURF<-8#hZrvi*R87k^hvCWm@0OhRe2@p34&<>3N;#>S^S98T*kyOTZLO zY&i{`x1ju;RCm#?XQMk69|+{-<4d)U7fr!Wt$6p-_CZ-1kha6$0UtASgjeYUjjCVx zSJg`}#V~W(rIKlKf+t3rhJ&STrN4g%V(mPco}h4?R#P2&sLZDuP#%*<)fY_i$EE)@ zc{Ig0m}p;bQpkW*v#_?V95wEygmmPoWR?&cLdb23E8dn{SDGHB;=d`dM!d2p9K_rQ zC3)>cB$V+i_X8-kyreo(Qwn)y>x{TR# zq#@(|bwy9hs4gm2o@pQQe?4N7QCC-2Rh{qjevqRyvb02Ko>chnSKj|HL=-f0O2=S; zmvI>xB_-55%GmU(`^id*D%|F_S!T7x8pq5G=d3;0)XGkl#iqH!Q|i+K;_X#N?y}eV z_fl$~7x{l-JCpJ9^77EcJ1nfJf?g=OIZzSj=5AU(k>9=wrRA zUwIbZ-sLU*LGAu8Ju=+et1PF{yWuIm2+zjAexO0dAxMy7A}dQ$_`QBEZ5$_O2uS|0R@kH1E$in~0)rTC9;ZVQRTF7Q?<^ z1Wf8XU0(mL_`vOCu%V%R>%ks^8A9+=s9aiys^^t1j;E(*dV2Z@#>mKsAw!}~ani_G z+|!M$s8|U4)6FVap$XfT`uk zx+W7cweQ<>FHtI@_0GIcHKlL^Zfo%JV6fbT08*V%Htg}Hfd zp(K&rTJ7g(ZjOzLVtDuz@M#_Ypk(VnE|;XuXuNiW&BwD9*h6)Coiav7GK56fyrD1m z$y>9CY%-eZLdFs+^W};_u6ulr(e1xgV;Bf1D3im(28iKwU}_mkcJ_ME-jUX9QA9%* z0dE6XLqmbzaQ9CFm25DpCAo5v)Ly-FX;2V!!*&P~?iLL-71i%-Bx<=Nsm}s0U(LzZ zy`GUARX0`@rngvX`JGx$=OgCqd~bg|h%@RaX#Fbm?y~bl^l!+HCKAWvrsg%7X$Rx|wX-)ox0nF)e~Lo`{aP+L&3H8L`4wp%wcHa2h!wIdYz+*otSV}1>_4&X;j;CJ zfr7iy{vNJLYrl2(`>*Yw(zm9^2CbuXm3tz+?M37e(Cg-AwcER803*OO3JrjZFH!KW ztNwcjo49{L@6jT}CjPl`S{~K!2U}i5d%O3-Nr&U^pD+@?PqrpjU7Ak{o8HnsX>q!D zODZcnF5YeYA5Pvns;%&87Yzi01-Ia|XwgulIKiQ~6^DctcXtR{tOZJoJ4K4S76?$> zi)$%T+=~AUIbME@qz5kq(wg1>F+vc5_cjkHCy=Uq)B7PbP7)dB8^)ykoT&x@b zVZk`I>`mB{n#WGNFDx%jwmXca8M-xfKT8hf1mF9vp+fAw*sZjBKJt`Y;N--_#L45| zd7trVgi5}AnTdVWHAesT&W~Ut1Kqdt#U8?Irot7nUpqhiw0Pg14k1iEtLdJ>?zc4 z@Pxt=BHdz@CMUjglD|z^)&|JS?`0tctG7z$(l%_Hjh~YFUZ4D&Dbt@Ts4Jl`2J={a(Rw5J9m>J+@;cqzsj6BVPf#?g7uq)j=* z$wzvplJAe^C<%CEpBTe`H|*HiZk=xQ3!iRozVYe*Cg&u=&RMp3+&SFx#W*w|5nJj0 za!HAeje#LY%=^f|&@e4E6-J&d>WRBpz5GdA;HsDY;n%Q4qe--gFB?uux^&y$pH=@$ z#OmMc0sPq@3|d{?aGT}{Ms&07pp0e;PVqiF3?0`;wNc`qvV}gMG2_B+_i%qP<%L>3E_w6F)kYxOga{ z0Y^OPRh>NaFDiGkym34KJ`esDb>MY~6c{9se+<6GmG^61Kru0~R`*|Va*yOV?%g}R z&RABqPIk5=N6ILL#R8-Q^(&{8hB#l^=L7K6QuanaZ$9Ow8=|n$nuO%>0 zr>A6QQj&j~YWGhLkv0klsO^*@vbQ8}4elJ*kP_iFwD8{Odvt|&adE#dE)efS!>W}k zDk>Hv3J<#u$+&CM6{W0)a-!Xtx3a z0{?|;-{UT*K<8DUsk%1ATpS#GkDgUTQuCA%R@{b_B<=pb zO)KpLBODp{NZLZ_F|f37N-cPm-aKyFTF=^!Ppg%rU;X!beX4GHv?c<|`g3++ejc?Z?z$e{D5w6FU6DE8jP-vk&8O}>M? zK$Aa#I;!*O;H15$uOBmpwl>L%5GfavM<@PsMj9qYCdMRcPso!666Ihm_75!~{~JuI z?zMT`2QUG9IHS8Mb8zpa$cR4O{eS!5{-?q1zn$mLp(6ipD_s8npH{d6{|Bvbg@j-H z?^d`1&xQYID_nv9`&PII?bf=w3$w>}TdRb}cW0}7NBlOEk{d0rzix|4+d@?5#-$0q)-$lL66 z44CB&?Ek(6dLJ$}l-bRibPCRyxO-mye%zwJk&t_S-ml=fp`xbK^`&zIK6qOvgy@9=-$^k^6`DM}~)wo?wr~N{1fOu z2N3bH8j}UT-i*fA^^fsy`y6BWXWnC!JQVluy52mQ*x=~*FE+JSjE@hWs|SwnB{y?GA(EQkzRZ_tM*1cc>Dvm0zP*r@d z$SMI@F;_u{UqLsmY3qN?>IbvRzw4o96P%=)0Tl-r|2a2<8tK?G)J-*swnfM)EX{tg zs5b%LGp;f^PE~RLxTJwpEbL~$>m4-82tXxy--YB=b?LyGq=koJVQ2zYcBpzaVvYT~ zwU+U)kMszsi~4#sOVWzqDZX;WLe`f{WZ`I432%;X$ITnC6{2u7A-Rq(eT}Ma$GdEv zfhUA|)joCu9H#&v7q%!+-_-h#X{2pNXm(>#LluRf?qbo$Xx!Eaj=lvL)~k9oM~Kbw z-j=8yF0ft;lKZZaFT(~a0&P)J07B$}qlg0Ry|yjr;aRkyAp}o^kUKKag1EYxTo6X-$#r&7+2<~o9}gRP|F!=`$t;-L6ro6J{JmG3P-_A z-TfWi#U3A2lv^ynkqOqwF#Y|sY^Qfu#k<@zROq1I)Y(Q%<0{tz)jKN+r16;^62Tth z`clGOR^Fq3yicP^d`EBnF?v?u3-$J!9#j=pX0TAZi^KTkhX3!t%AH%2nYpEE*Wnwr zbBOGU_usvH(#mmd+@$X@B}~PR1`wZxd62?zR`}zPm*OJO7(+(7?RM6=c|nyci1VH* z>rMki5yYhilQ4vf2ctWUca_M0Y?=*IE~+w<0( z4mj8|{?DiO{z`F`XG*HvpWkOT62oD1pb1;_MXRV{M>}Exp(cigmOrz2-BQ-bo=l?Za+2VGgW5I>`{`o_~opsN;WzX7`?F)$;2ZJr2kuXIG^}X&iVWK6c zb!^GBZUDYnJ0+xfxAiW$tV8ZQ>nGgLbl#uor1`E0<=--bckCaA*9wBEC*sf-1;Rs& z`fSMksW`nN|LK7x(aY72p*>f%@y`o6!1A^RfKoO4ow+AacJ{s37V+xeslc$Urt3H`!kKZ~!gb!tO}|im)@g*9Hmw z>khe4sl9wzdx<|S_C?8{L)xGth|v<~3{Y}>s#%UoiY5tY2?cjNCB-X9ie(3DLVV_+ z2`z-Gln59H52mu{l=NM1@C9YodAq{cA2$}hNki3g*pGRfY!!Z7c5n#_a4%s5F=)B? zcE;UL@etsr8(JKfi#TuU&lSm`9{uyJ@Z1xNpnHdXlwz zYMBvVXwKAv2Bh+rPxCKC5B|akKgusAA)Hz$mm%Za$%aiM2o!^2_8 z_ca>9^Ks~ja!(UqE{XY}tS>L{Q9pF26!ze`?=9@4) z)Vd68D&u`}qk5vj(`?~}-%(_K3$w+V2w6gQ;k->V8NQ)=r^vgkIM4pOIr{UA3tn01 z*|)f}O)klsHzT|G>IY$$^){IYgXp6Y+(mfLebI#=q&ro0$H80d5A^EG;PUO>lA#q_+`JJcUs;SEG!a^h<`m zazP@GINyfozYp}3lfd+n_~UiNrf)7*^HOo{;~+aD-%S2l`eTR@jZD9s!qB^L){XP} z3q=lB{;2m3xl=v3Yr0Zi+$`OPXqJ3d#%|5grTAbF;|3mcYffo6l0z+S-2YP=7!SCg zCXN<|ldy^MWBbx9$HDWd2L`RZ-`) zN${k|xRn004`$G!mk4-YHz0XJPNVG4Jufy8tK6Bk{<52B3M6an()bueA1ClPk{Jl* zZOZ}E=t_Q()8z20C+uwQDVY1El6a%bW7q&=6Tu9{j0 zw+2FtudfcoZyIid^$H6z7^snf$s`s^h$unfUoT<=QbRr#g1?c}B$-+9Ly2-yQ&Npe z3^-Iek9I}XPD(8YY|NVo4vmC`Ai_S2`xCajjA%s3PAc%{x{7!}UZV(J2xOr2IIwhi zu2T<&ezFHc&%OAM0p{LAFEEys4WF1YqCtq13lFuwz;k~-jV4Uc+!Ni|4?+9-b;a4I zh4OP+&kqhLKru*47Tm%3NjzrUBA{G505C`ScVzm}M$p&r+}9i^7~-p{9ej;jnK$^> z1IuSDeESa>$chzQ%?GcCBKbnzuZF1S4Ty;{L~eJcoBr+n-Tj#77|XxqABh%@c7JEh zYdyUmIE#LUarm&Y*g;x(MG_O1^GW>65qb@RaYuT6W#V)92TDfOXy2uAJe$1YWOL)5 zs%O@^Q{M^Kvvqo_D%R(6?G|sP(;vd+t77Hw<#~cv+I)_VTJT(RQ|`V~Pp;)wBQy<; zJ^9x9Fdy7sxR0+4?I*sBAOjin@J!om*O^TVwU^i~*N!_((I*{Mk0Xef$(xi|96yYK z6Y6&reIt=+P4O8iO-o;StH$sC-dxaZ9^YR+fuIz(gIw>1$2a2}yIlFHNZ9+a*7Sby zB~>?tv?Dd$dbt^b8{{;NUkKcPa>yt@f=J`ukqH{H`uD@-nNk(nic_F`O~A->ndn zeU@8P>^3Um7ZUG~B1u1yf$&xH@}4A4^K#lHo;DWHrk3xdQflDX&w2oKx@v9 zMY8=DhKXHR1+oO|0m-x=T|7(1u3s+j+;Ax?2&8t;tp&lUYq+GX42Qe8!E-0JssL=p zQewxnE_qxK3@{`+u*r>NBN6- zQ)~GCE~Wp9loO2kl>r_rhSiG%Wwg&G`E~K>P(e~+u$3y^C>E>kZy)*BArqm@~4g5G5K;9@S>qq)5m65 z+@xBD&NWt6wXKMsX8vFY0(rp8_$nO?iK1K`b{N2wZ>4j*Qh2WG6QQYp_X_2Qc+`p|Ixz878Sr($V}i5f11qELWiay}z3#}K}5 z)QT!Pa3oFmmcfMQt3GSJTSvh>U~J_@Uk~p;5EDCCkgeiiYJDcVFXEH#A zdm>%4LJ;vXTV&VFeLZUducH1W{7iT_)C&Xp@N^$On@Vm%tt>mB$0lr zk{2}+64=jkEa7GO29oNKRB%Yw0~_{_2=Npfdx}%y(6Q?kT22kuXI|?D`~qW0y`+)? zmz(-gm-{6z+laVtb_BBp1*-qPrp;-tnQHF)#56`?st{KO&`-sFCxSq4=u3 z%@3$>6ms&Zy=;VaHX;2yN3JU5+i}YC8s1KcV&`K}BW>-Tn$uQ>#P!Q;!)e03gFQ4H z`7p*pR`QV6wg^+VE}g-;2=XwQj)NI*1sf{)M&-|0(^IwL+|+FTwJ=iIUdJE*fW2D| z8!=u826I+gxkE@E0iCFKLiIcBhuObcUUz8WXf72eF~ctyOj`%V#hpsP#A46zI!^O= z1I1b2W-iR&*zNCOz59!U*LEWfPi0c+nUX8;wf#f)J1p{#r^`=6c95-;ctJ-J&hyDL z(MQN(4n?MwIW@h8lX>m0k|y*lXr^1n2Lqwoojv`eB)>U;VZAB^^57VJn=0C68)zVz^Ojqno z*o!atwz2=5%9xeYg6Qpc!P4YM{uC zz=QM}0sut_)-4A4`2fX9!6OMl^Z8V$`cv3Mri3R2{uf%UGRRN*Cj|%S`+WT1HsgYu zNrh$nU<^3UHAxEsb&Y(JISF?gTw(fyIcT;Lg@TDighYp+t@HD*bcU`PKHUY5qedxG z*%1Mc=J?GmcCEHXBMABs;%Lumx>Ex`l2bjX4xJPSjy5|ziSH_NEnLhL!PRV z!c}~fMJ)}b?qjeOP8qS9-d@hpj~IKp91Q_qjfKqeNDJ5VS`A^j%EO+10Y`dvrkaK) z(y>?O11ppMlwy6$l1v3a;E}c_<9|QB9-LFRTp2a&PA-q9c55^W25Xe)QW4IbFz0u5AgQz(ZL0~@ zHqPHa+;8@VX`j*bFQR|y8jb>fZE`@LsrqV-hOK~D3nF*bPhf@SCJypBw-#>tx+|X@ z;TL;X(A0`f?7c?(U?AM~Rw`>%BE)&w?0#&!w(=OE@6DW&OR|z{6kfUV4&Z{`sq4Hk zduFz16Q1&__VUDZyBp}direbBztJnJ?-dj1%hwS(Dx{~8U$$OAb_JOGYjxG&?A4Y= z>&-85)VOc*ou{|TN^^rydRKkjD=XHYB;`av^5->u)9bbs^x?L!Yl-i!r=@U%cu`+y z^#g`-&Z`${$kk)Rmk0|xgf=VT#}jde&0jPdUSc3Nm+b&M?Dhv3Fij8!LD`~@Pyw1m z`fSlzAk8I$KSYWZKmK5&BEsvnKwO)v=Luc9Q;?|K4+!5gO%b3vpt0KlxRtlldI{O;N8;K4`oZ zi;hWuBFJ6;wY&cHAo$L%&xfrhva#m0MkD8&gy4_B!;(aMn4veLb0&1+^gRM~9lnnZ zb=iJ$8uW;qANd#d!{zVz^OM+K2Fx2}Vl2>vNtdI#+#BR3=*?9Wo-!MO?Ad+PIc2xw z;dZVbO}~8_dlw+C7!@&QRD^5SR6?d_cXRb~3vX0@hw!VQcq# ziA~8}gEK4yz3u*KoAehsG$5v;87 zSRDok&{>P9I5@oTv()=>4)#h=QdvbXuoQvu5E1qyUMG~H*ybVQS{XqH1a=LxdZhy@ zjQl&=X9I4<7826K{#iCR z>ksZ@QsLqX{BB6n-!aCJtrhIoD@OF@fR8U7TQm7!{0@+^WP}op4AweyC?Mmd&+j{3VC*T7WoeZl6 z4MR3fn1#&1Q0US~^6B5UVO9`G0NRp$hVkV13zt)M9~N1fF;$j1`H?U8a*v+SZ^`r$ z%WPfZeRH~PHnG}1(oKd$Vn`YliO&n>wXr!oQ;%O_q>w1WlDRd3$2$eu8dAp1zQ3y4 z#(h3fCx`(_XcuH4s?spRfhN$cCKuMvf|O7bd?SP1y@TCUqOQMiWjoVdS8!Bx7(hsj zTz9E}zS~Fkd`XSw2|bBY){#zcMJTULkxVws`d-Oz_-|7pJg=+N@@yfES_oAABzS-_kA=0E_qp&n<~~- z1oN&!(-T4?le4{pvxZh+6NrIddfZ*wh8ra6nCrcz`S#{J8@wEY;tenLUuQcQ`+w5_ zK*7<{Y%d4sNv&haXDAJDo)cX)Q(GEmcPpA|D^(t`>7Pcb@_tSeF8uRtb~UbyjtYmB03=@j%m3!_cl#$FubcSWSEepeMcIS+ zMS$o~t4}zZ@{cumu(X9tS6wmX*osGOn{E9PVw>k}6@@_%i?`$%4(9zy8HgQh^UD^m zY!9z=&t5=iIuU_-Aw2tnS+XGad0p;VZw9@lzPGctca_bz*_9UnzroBLLj%ll%NR)8 zm#`4yE2Z7MrY_WuD$mlnc4cv__^P@|Wz8SYq}OxaPIZeddi2~6PjvU+R*$@$bC;3W zvR*_AW!yT5cufs5{R&ldkW-g^b7bF~R$5K-i8>RMEh#Aa(JI%zuD(761$R`;>OIoWuvhh zx%#}w2{t7v<*f%{|Ctni_{s`Tgsjq8zW(~U&a_9JRMln-017Ubmd%3*`#hK4*R^1R z^i0t551#U>`hj?UubVfaB91IfcINOZ$ap+98lG4GRn<5v3?A{gIae>*%N*J{q$Fkf z*&C7wPJ+$%x8`KUcQve^F4O3{iD#aQavq+0(&23xXiLuPafD&@2`3r%PQjn$i$d7T zod5+DTX5877oZXwKmzqrRU2Yn6WA zziJCb(>NKqzYhvQ3p)6t<}xh$>xypF5smH>9QLxPC*}hQE@_Tgb=&TneV~rGQP#9Ix&5_j%0WRmQ34;fi(#O#=>wV!|#M!Tt~oU9_>q!m62Py+7KgrdFC^ zU-Wf*l9-X7w+~(Z5KoQLJnwf0)39GqO|d*EvIT92CIn;oVS+pAwGg8cQ-)=A)8eKA z=;gI%^FuB!SWc1!3cXFrO3LBSEgD1RjMsC0FfwqznvY4!3BhakdEczb)E9vc-eK>7 zMfO|Dvq>J0d(g#>1QAm!f3=yP!FW^&4$wfR4$1ecrVHR73QNSme%_W~wf7NJ9D-|p zMIm_E;lqTX*SU+yVs%2oKjix7=d)tKBO%%qG^O%fVR_fi!aNGY?k>foSY;{x8l%zG zxyqtZ+V(a}IMo0$;AqQkS;~_#>$~Z<&N^LL$l6%t``OKpaCmH0a`umn&CHUInb#Qk z1`1d7=P(J0iuQI#*Q;)e<4AfzZwa?)&l$p3tx^V~MoOR6A{}N=-;pRgXXu7aWjC^W zE--a^IP>C+9b5EvZO)GIRKxx{7QsFg(1XHRw7S;^noubA@y^_J+0xZl?H$Xi{Lk<}hXMSu)M zL-BfZB`86!geiB;c(MQx)IKA)x|qC35WK11K`q1zResC|1~D6c;bRHD*6qoN(C z@g&@pQ4O_#KeUC}gzN%gl-a$6^={z$>bW8))b&5^TD@t%5@A00d-%nVkb9FBP1(Dl z%+4s^BjsNM*9e$_q+}e)VrAZ ztw^qbf$NozgG5ThRWErx;UiQT99113um9duyKJY-1SDOz zCC{*X_BlH5-a>8OnpPhcQRIZejIfC9(`Koocht39FmF@OM{vP7FcAa z6P7n0j%>9(68em*bab5G)55s>v@CRAVCc zR+f2+h_%3O06~?Hw-VXM(~?~Wh_LAG!(CvqD#HCf$ED@v!}tS4I^MvV9+54^1!m_U zTF-YLg~N1`{F5kWl6e`phHs^p0I#HWex6@cD$x}T6d&=7i)ZG=&NW2EsXlwB&aL*| zFM-zA+_)vBU+a&t1`|{>cUL8z0br)>u`uL4Zm_8{caF*wd zbIPc{vTAPC7|sa!>qnzR=3nVg4&L3cT@DQq*CCMpcWxliM>kNaZK!f7f5Pe$tMYV* z&is!maM}t>5;0mZ5#~YgC?9ebF0)?qw&#i z-|p(m@H=OKa-)0EK15YA zzR)r;gbdN+{=@OB>K9>WI)GTk8#%hl&i#eI`q}G!d|54s!zD|;}R3ClS z!&f;lVbLT~73MH)+l#t^z3?b*`wF3oCtF;pgMplXf%Rt&rIl(%h;Vb|&p8e&zq_9d z(%NcH=6I{zFn=Fne|U+nP6MGOQ!acuYDP`@yB!}?NrGzuM+SUy+4?xYx6Q}emU(sT zu{y%cN6*)YHpt3lpn_+)9lx#4iUv{;t6pzBZlpDD9TdM?)K7B~{cs7WZKGIt`5Guj zfcmuBahGugIYwOeac~72YHPi%S{n0_+NSxbPM;@5y-@L@KI{Ao@dtpCrrag#z{RxI zLW4_a5zatL#wtg0U`yEd?6dIf?`-EO2Kxi1Tcs+0ewcIbePQA8xFWH4$y?;2EbTE$ zXgF0^uwn@6#IBqft$Y(@{<|ErymX~p-JA|QpiRMmNg28N$EQZH*nwDCS~+MXXZ2}z zrTp7@DAG3k(fgM9#FDAA4ImJa*fqK?6k4+NWhKV=vUv`t-2h$D$K`<5^fd{>w)r-S zOY+4F$}Cw33O8JF`|o3fS?fbHdbNify59&UpkaVP2E)2vGT`)YnnN%k#aonp8L;9%!Ns z9VY=_5Ca=XGtCFU0}Z?f`coxwS`Cm^MM7P=lKv7^6Y=>eiGUL>utn&TFo2b^P}H(2 z!$Vral?Pfk(&24rz{+q$dsP(PR;6@mzgr$Q5NL6-De>|XxFsJ7WraYDe}BRULS<6$ zzqiM1lntcP^&c-IrP}rttD?&4=Pkmz26RBnT%n$9=zRph5gGkQB9Uy|&^lW2nFI%W zJfv=uZ76%`JBN)g)6QNJ@>_YC>o}S6=lnbww!QZ{5J*FDZzYA^MQzRAmVJ95YsS^V zG5$mT@#!|OiWUv@&G7bHn*TXLSCmr_p(4jOsQX3PxP@*<-8lh{E|jpUx)-K`jn!dA=;e!03Ta9utDupzdAUFtqRd>) z6a(}RKL&Fni))T{4|yvR8|r>ECrp2Cw>k`-`F{K>EG~nPpCqT4wdnI=+TtPy9CaO? zJUGP@tt-su{rpsHW#~zMBTnlY z_pK^oVw&b&#A6B@_`#vJBX{j;0h%BDyXisDp%DoN8d&sW&8Gnu=Aw8ltC&*TzHgo% zs~%QKAb&y1nAe=NT|m!Y*;u*RQ4fr%l7m_opinCB=a_H+scCg?0xJ}%pEAviL2_~u+p8bv zmtIi9h9t*B139(qy)F!0nj6>)3j+OHcaU)d^%Y24J)n=8vLEr!&$58t?b8%OQC&z{ zGe@DSSMCs~mlB`r%Z5&sWPGdX#5;_I6@fNVYYo!sSa`1Uo3eM$>_;eQ2%Dh^e@ZFk z)`5HtszVk-w-IQItbL32#rf$PU`4Q*F*+nwvXWC@B4wB?>T{=I>hr0g z^8>kAa|!fWQc7lTzeA z>7#sOk3{JPR%jbajL6*?RG82&Q~gybV0wz+WLu;A>jZ!>xO)L0TeG$o$(hpa{Kr2%&>vq3E8qA`poo`aUb6 z3&19sF#ZM)%uHCpgmMUJ5R0-ePs-o!FGwkr(E4HjGiqP=`c)CpQsw_;z<`$ z6b$LT=T%K(3`eUfK|kIJP5AtssAzMoI>y(mJpXh3Q*zgFEpNe`R2lLve54B>Q$&a@ z2)MwtL0eJW8^ekJ&M_AsBm{+zyFGC9%NFM-vmS8P1IcN#fq{PKLwQ5O-~(1XtM6IVJH-4hvzer(L_>*d9-BikK!Tb-C^8`g~B>51>cPvTzPtjn04Cu zna=6n<)ekOP=;IJ*uY&};Q8iy0x$8KhP~=yT?^IsX0Fg8cClmBd9;a-szxcUXg&3NDswn-fn=b_i%MY*#n4_f%5DIzJwg2r!MmFUKD5U9 z(~wYE<{!DCdY(jY^_LycE=AFCfzHS25fZt{bKIl&+=317a{Y=n(c8qb{h$-iL!fJ$ z(wB~iV?|^y_h2%{Db4GnBsHO?0~UL%4g+Zm^d+@{qe@6*sjs{jTV|O*;Js9b%Gk%K zm!H?ahk!sJA1MxsuhqSyQ~(H(CL|RBMP?_PKPWsIEyf9&N1Oxe1{rO#x=xJhSNsh4 zZe7~t0Zj!YRwH9KlsH}pPp8Y=xYh+iG7!pQ;Sy(Pc7E#e0w0+G$|)pc7U#Wo!lQCQ z1OSS`H@FVcsZy}+dpBwCs;8F)-PIZqKXYmxv1jPo$E42Q2mqJBM=i}yh6dcj6!4=r z4mr`krf{cVIuEj%SU~nhMLKS9ZX&V^36-pNIG-%ccn?54f9i_lrP`$tb9&+W4M67c z<4L?uc45MknKTveimWi9L%xOUj8m8~QjUmy(-8v%Uk8+ebJ2m17Q+SdV}LY8{)*Nw z)${=PRRn7(oa&6AnQObwpDdP+v~UoN;zBx>nhLiIgcP7vRctVGVWJNitjI##zeYkneep!qh5 zaQEC}5F+4{X}jh!J^LXx$ypG!5H*Uz+xAIB2o*Lk=7HmLG@5>gkLhXtlgCJv+7;$R zi6Q$$^JIfe?LtWhQ$mSWdYQlHH9su1LGR*2`S#u(YuAg#@t|BN>Y_fKhC}Se$oQeC z=w3}%8}Y`X%P*{M-z)P}xMlHtljA3ob};OEho7j92gVAyE{nQjPXO%P{4zn^nT!)q9S zJM8S!_gaRcMqm(RcgVP(>{5f6L#iM8jYOdo?(mDaIJ9Px%k6hkdle71gBou*-%adz z&?-!3hNJ<2dr+7=uy1Q=yiWOTENOu-nT$e~!Ou@K(f+Kfgxvt1qrML0WgR~)Xpefp z!*1k!eP{FOGCL{Tn+VlAG_pC3+TK92If8&e)fEd>)Qin$*l%qe&I=yZ4%dCmu*nb& z3R068gj>l(U0zjB=i~?!5CKI-9=dOB8&}@6Tkij$CIx^&{Id_c{iFLqMy-hsg~U9= zeia3YA+~tHxXGvB>UWJ_D-EBF7F0pJ<<0fAwXitYgQRtz<8aVxW%8c}ovfZn+Rn}j zAkhTW8(Zv-Y$pK|{h@lgGXfU(sAKD|1UVgfP2&d6$3gK@N`XiR?=0GQUk-3C(Jv5O z0KOE-(ByP|YEAk!XG^C^)rAYE*olu7$=UGb&u9XzexvLAS-F`s&M`hcK84t9{8rni zzmBO{=OearRqvY{ujW5-`>P2Z3sSIl(gC^D8nc(19LLx|b@!Ghb9xqiCv5;=rSHsB zvP=7@DqS7(_a^nB4Fa%l+6fmmVb&g5%E9fv&HJY@gX0(=&j`cyUEEdPl$mf> zj8-U@_XiayIv7ae|T{t9Gr)fDAAlOMo@--b7dLrKTR3x^l?uICJzeZvy1gkbRg5RO$5p?;8^(s6&Ad&@x3Ge6jo5BWL|+}Vz1+kLDYL%CRymVB+P5dynTepRgS zTRr(iw8x&1{U0SNn=&wrFjq%r)y!;QZ|U{JHy+O?p; z=Ps?|bOOvj`2|`nL*Zygj5MV9)PdoyX7SvpWtgO9vrRO;uzedGg60WA$hp_VADgtGqR>S2Kj< zYQ0)4k_5BU9BO6*UhvvS+-GksdFg1izYgi`n3<}5YdWp@WwkBZ;v~i~^B{y=P-|35 zuT=TdcL6jSpn^$9y94K)SIKII0E3s7Y@y#VYx+2!y3oI3ob(tdBh&m(1WdZ|WFmyW zNwvaRTdSQiq_^~uOwacU8QGQS9J4_SM5BF9mB_0)N+I#$dw zL0|e`DN@ExHJ%xnLWZ7MlA)Qb+DE$>8pn|I1)jf4+tRp_i7|VD(GmyRDN_HbTjB_o z+xWIIE%!wdyI_=~%2Iz?7o&NtIc9=?YJ=hTDdEwtw}R>>Y9|SkK#o%H!mXtsYLM%F?K^eu-@waq%+^#!?#>bbi(rT7xbS}^$CiEYl{oXO>O++<=@V?wYw~Q zN@sV}DcvFB;T~ZR{PPO@2ovNVU3roH(K}uv0HcryXhOQ7ocu*lL{Uk#>ZiYGd$zXz z$I!LFhnDfMZIg}9Mbp!rYJUyC-2vmYLb-7B@jconH^(b0KC=_*BGA(DD z@$_8=KPnQW%RB$t7~@zFmE995yPF#X4Q1<~8z@mZOi)YR9}xvEuQ+`*c3e%JU2 z8kvC>nmQ`}uibC8GBP@IF8*BCnYv5zrMI1-Oia^^7DbmZRssWojM2I;FP`kJ^uRQn z&Al~pyeE?O?_JgD^Ki4gT3#QLY|?yK^OnkMXvb5oG`Tv%WJJ50wb2PdBX`LPC9PeM=dFz~ zgV1{1&m63qtc1CH5;{B#!*6}Vj4_>>@K$&!=+FaeKA>QHRYmpr1erog%*mR8QQA%Q z3Hw_8R{8U4bAt7=vz-g|w^bLBjqZ|y>34(bfv@{>)OZa{umJ#Ah1Ac^qvnVF!(z%^ zEl+&$+DSAl5VRM9~wl zY6Fhpzrw9O^O1iASvM9DR30}=4~sQ-e+hnAcz2QzrhMobV|m*#T?mCT!Qp?)a5kYQ zAUM1|ZEx<{$@W$E2hUe@ z>1F=#gkt$|@m%Y6-Rt%}S+RuXT#|1{I%k;G$C;h*u$h3ne?B4c*Gi(RtXT1O zn*N3;n6!9;nx{pDNZ$pdlb$jgTMP14FpLDw(O;eWWco8bKXy_kWUrC_@Y_gxdfs?> z-oL8;%1OCOU$^VsKtOD4NO2~5va?8|N0LZnajBUQx;mrpC1I4b_LnF-tCxXefE@cK z4o}c3H@JK_)VI!Se)!|A5p_0)|bPa!ik zoTSQ{wh2=n0jKT(%nA3u&WEALZ`4iH2ML3qYlMOA-X2};&!4b=(Mn%t=e8vYl^Gf& zK2DYKnI77DztsyvYD4A08tovbCg^FZ%5Rn144HkG2b}vH`aCa^SzNj7R9pH-B=g za$7QtK!r9t=oM7mdPD{;hR`+BLRY80o=hUeHE~1*Ss)q-;kyz?*kCxS zFvY{ZpNqY}%Ug&d!E^DDtJvWN>6g%8zewSGdGq!~fCo4Hf3ko?YOheCsJG2MF-{q% z7`a8#OBrV3fVwhGL$mneKO=s~76dPJxGVkwk}-t>nQ)#b`vT8=1~3B!d1$yKaKO50 zKV&iJgOIvEkGyx=in+YYJitYbE)D7~645>L7v8}FDr%q%GCL0jfx}>zCdNhP62+M6wk8QbV2__%t-b^*Y_b{ zy7BuTV4QgEahx~nt;n$W4+};-%Oo69`(J69^^EA?7s>Qg8~FwR4vGi=?M<|3Z7B5m zmmwI0o+Tzo?d6XaQ#Ar4fUiR!=E{^1^N%$Ot)G50kE+?V{R z+}Xl~d&3hKs{iT@=%-9?QQrUIg!EEQVNZ>x zXTjjz5x?#nvbf>>}3j)3!AZP#F0hwJE@^<7_%?W2R}K z%sbgDl(eaR@Z=nuLMEO<27eyALjMYQ(mCGWCSf8$gz?9h4mc|Nj)UqTp$n%!*x@Uh zPk)yCM(XrfCtF0dwgt-fBEre(DO@!%^wIz4%)jKf2=E8uUhDXp+*jb!Te?sh0SE>& zIMi?MhmcuylxZWLS;#|r@*QV?f*=Qnqp{FE>RP-lT?8@o%IbKhz75>19TSM26iL)Og3+HSS(A{e*y4=)C+p zknr&z5J>Tn^?Ey?kKSv@)qBYGAMvkPSNfn+s1Ygnl(>hKH2#Gr1{h@n=EVJBK=?h0 zN{TVG01Tb&LLekao}WjHrG@igAn^o+O5tV8x_J{WErY6t+UsLLJ0K4E@L5B#ue%uV zkrp|Gh5U`U{{>N%d@#F!9lu2&_K3j0xF7{*Mb_U5A~d9`q&u*gc7xa`%}{19aOE%{ zUwH_jPFqN%Itj#>t<9A|w0u2hz=M$SAn*vaLp=zH`Cq2nHkw3)HQ~V8BqvV>&>jJw z`Atr)9%#A+cAGi~=Lj&Hj|G65a=e?64I@phXl;QKgDWc`g2VpXuq%Yf*dCEf#!n(n z-B4<3R4{>DF~Aj5j_CU;KQO8~`@5ft^leswKLRbX8=vE_glxZLv7xsg?pDvMcVg8Cu6iyyO-y3xTpaP3bw6)T?N)5r_$zJZz`rU81<$A3yw|#Wi}L((?QNb5cLi zf-Fai3j6NSi@#M$Z;D>wUa0kIv0=%>l>|4FH$6VyY`he^&;4QP;(Hc)e&(URz@VY= z@6XD`%LkP{S9v8`@AXR(&_wQ)(IDG5Haj;<=O?ZH15fK+l?sRqQzOHuvJcmELk?vg zsyeQZtDCNt$sTiE2ZArJ=-B?+__d#iIP`clq9u8vpZGEex#OC^?K9TH5yU<{$@aV} zR3%ogiev?EWs`jFlNX+_ofGQNlwVcQqvwpPgu2w8G@G-OV6|1wX zFfv8l9+wKWz^P&*u4Tp+f(HLbzUyz7!?#BWqDCAAidOwg=Blqgc2_6AHvjltZfTMm zj_BoHE~nHaB<#v*{%ex_>@D}LD$%6Za;@AhA|$R`Mc-4&(ZvTHdvR2y0rJ7KP}RXs zyg{~Kq(VRa8cwN)opc4z|C&na{)2}kt)>2!34ixd2}$V@O#)tSdhPv)0gC?pb7CuB z;H?WN1^#464>cC_M1vq#un3?*2!2vb_$+?#um=H^H51(j3_n(C#ODRZUBjkVju(<9 z7dfgNw@Gc{+(_h*La6AlJPfu%j0#f)!<-fc7e9hQvXo7NWO}g_4hrvGT%8lf^q4z% zlBif!g~!yctP4uLq35;VT%i0{>6s<*LoCw*Z$RPFQayAbh&!#A*Cdzo`+HDN4TLsy#8FjyXZQUQ=~m#2*8}>-8USx9D^X^PKrpgZqut+L zL?$_<`6zC`&poZ+2=byj1EbJ1$MTB>3Vo}G$WGMhdzZ^_qmf@*+HZFus?Zc(7%W3} zh@2P#eMR%b%S<+b6&XW!ULF-Y6(t_j*3 z2AmgDgQon<3mrsl!)D+!mQrCz-7AYVx?~ENOBeRX^LWU8aYi{m!it-MEjLQ|II?^k zcp37<_hB~9Cw2W^+~tKh3dTs!UK|SwLp*?Jr$)5h&fh!0)?4CM+C09E_$R`08rYpQ z%OfPZZXj1!Z(-@bFqyERi@uSBO8j-Mq^kA~NJ)QueB33j6J4MDq}Z!+y+B~M8Xi0C z6-;TNExn-?^2Z3<-IE^urH&1i!nkPG;?f8D{lZGlMjMm0b&svoyQR)>TvJJ^PN-we ze3?~*mBY!~iAG(@E$4@ba7J?QWhTzNqifHY(DSOx4`B3*q038C{(kn>Nl z6qwy#CA?M@J$f>t(`*|z-$9GI1R1PjaOygCNeUr`82|sy*3*xB0zrf|)p*((uOTcK zcRgxPt>itDFUveDwpY8pOX)Bp>w2Xs^vZvwqpv?Sb)PSGS2LEiOW1$!_Hdra8>f9n zq)kHf*2b@|9_Q?aF3DG(_RH6;?kG?JkXlo2||YKxS_j8t3ult7It-yX{_)MeWQYvpvbUpflAxciZQ8LIF@OO?7Ou zv+n9>2*j^QhZY%z2!C;Aygy?Yw;y5{TEb!YM=<3pW}q^-~q+bYk-w!%^js=;jFqs5oBq*)<(dFlK*Lbz~<8 zJMn}t_ll29;~9&4Y$=jRXIDQ{bkMuHa2U0Id(Q2pm>X1Q?dppD@rf$t%7h0_egGE^`T|h*tpQpL)vcGvwgVG21~Gw1qkbgP>yqJF zq59bEIh3I(Nj2=<01)jKWc39~eaz~+4eV?kQV41??k1?*1h5WJF}i#+{el`|T!UcK z>ICc&2JrDhS7(yArbA&!2b`&zi=W$A-bBx+h|6L1-?tCgsG2_wHu42b08|rbv?(XP zO8YHovk&ZMmxz>Bo`lnzI|&S8DBFNn?b#q z|I*S*l@j~aFX!G8XQt5D-%huvCUU|2Vu~1wjPSuNkB=}Ua$^4R=gjz@7~ts6EbqYf z^x0dH%eNvl9J+cs^THZIDa~=^pEZ37e(R&IwIg3L4~oBSAWjXPDmm!Hn9?HOWi(0UFC#VGC0y;XW3zOVR0T!1$ew-?jKYC~<5v!YpXn0ffXolXW&Uu99Ry)P zkk=HArzhBDQ8Q8XN|k7+LAUsYucB%-ms&rNvXBSwku~n7)$g*E(-4EBBx|DD*A8z) zFfS8D`UmF&YmoBcZZ!dVXAgy4<76nHWEbI#x#ok%A6ec1vcmLBAQv0W2mghaIiYXl z<=-g!`LrGWN-V*RgXhMJAmPJ!kYfOt4y0K;g-U1kx=cmz-WH`9gSENWBceL-6+1am zl1mZc#>dv5V+R~C>ehV<)@Grm7auH=p$gP3?(ywJA;85KlqSY+L7-0++CXDAppZNq z2Cs}P50T{{gFC}VwByK7pg5y^9`g=sZbJWy*>7*q;ME(cUWBy6n~u>i-~U&V=TXmU zXB34;3S9_#nZY0qmHR|J2gibz8yf>ch%u(x#49XefElX}xVbbGP8mpIW&i-~5P>Zz zA=WL`am`+M*l6p|y*kRid4l*Vi%#R$*DFGQs%ATB!H_o^kxV!^fN4_*L7me46|A>M zC}FQe&(toPS`s;)!r3JsgdIfIpD9s-^PaHY6;Z(SUL*ChKfQ8HVCVS&`4SUvgZ7tY zbNL0%7Trz&GAMVl(c7xZ{gX?lB1{z%TzhT1b0eZW93kHqp+fz|!tICy_bbS;AU zTS~U-w7e}YyP}cc>eF&aR%>YR(_7y;ZeY7Oqfy>=+jIv{*4&XJdV(l8HDvk6~XjkMYH3yU-3rEOgEIDJ&X!B+s~=osvyR zte`z!Rl);}JCO|=x&t>G{gu&IH z2`j;9m~GZF6c+a_GdtU8vX{lO%@)+5bP{)T$cF;z{4=ii+%Z#(z8Ec9_T3i(R&_>w zRABHQRD(4A`Gql;uiATihc7)Yg5S3o_|uZz@GoN<>LyC4YkMY#MK;QwwD7Mn;3;cl z0(oF@bm2fXE?7|CnM(8@l=k`Hri?pkwXZo$1*J@coo<`&?T0M>tGt>dX;TLJwRGtC z_p)}LzoFtKI1&FVz96ZW`0qmarx3%2xgYZ5Nj$SzZ-ar;KmHfy=s*Gz7pQK8`2=~c z-mk?S%AQKm+}t2$PC*+J=RTr2qYy(c60y;K4%HS9<4KrtXBcq$#Kgq7bKx1BE-hA= zAyJH0fGV_d2jn5cq-g116nK3!;2>mKv{HKG>n_G*lfQqP@)5zRix}ni?VCS@V&x9t^-ea%We)^4w z&%Yh=bSwMoNXLQLPeYN$J%8=*)elf65(u~w3Ar47mzy@d&(fFTjgG$f>>i#f#^9XA zgzct;=WSU2+OpEy(bsjT(f9&6*TBIdCdTMH`9WFHQ`&hg@qOFQ&+)#Fn6!Z(o8>)5n1zJj`by0}*^MB-B-cM+6OkddWf_ zD)ghw>h@z_kBhZRJ(W=y71I$`4)CT2v#^8p1kj1k>=c-H4c7@IE$L_Ke}N}2s>qPy zQo~iZ`>2bvlD~h2SZrKreYmHzA!Y^^XJ#*TkKFFz=DYS#Y?be76pNDFJe(A~q`2TQ zxCm^{;|!}dk7OS&23%2-RY_w;Lp62?(HiOMMED z1bj1sgzNccQc%mrQ*2OJT*qc+#QcVe>e`T(dHH+;`Ixh?(YQp6q|38Yu0awesifL| z8Wfh2CIz)T9nVqOBvzsOfX$4#yd{r{#^J6m4j#qF**#_3l&>D(6W`s+?B)yGFNZ|@ zS942o`3TP$R-rQy*OqoS99Gk);x)r_1-lJ9ntA5W@eA2afOn5|^io!(oUzpJhBI_W znqJ;`zzSQ*^0bf03wtUT4j)ThafQnk>zyyajf0U^@6Mw4Nq9MHzW$0*-N|b*kYs9x zcrY!`;3}A>ufM6D;3Qer{-&x%J8n&lG*CkF%#Tfzs)hkME!h=Bf6jWsORBeXQ{WJA zVLeRsQVY8J(s>O8p@ae8uvL~wUPSSQ~qkNWn0xoT6AH@*&;?{!I)S3iKx=Xp$c= zvo++f{9Oz9H*2y=s+0Ceus75{?7Ep9+cus9D$xi-oQ1O`k}>ddgwipw>HF+ zG0gJ<>n?G9?Djr^QB0uK16wts~%uLPJu1w7Uh(^B& zU}a`EREz0oU{xb(%|DvaO58xvxEcl!VLxwG%nu}uho@5W_YUqDd6U|GB(z)n>bR_t zGs+Q~Lfwj8MI5iFV}R!hz#~?bR|oGhzF6fgf5Wl7;1x$bKg`kp?k_~7`kya}`+Ip` zi`uX2&Tki%bRTgNY-+4n6MphGShV9BF_i?6=w{+oSd>it;`wQcEDo)dxvheh2&Wg? zB{CEY>=cj8HN@%CmLugATH>CHZk~;eVbhSPUj%B4qjN$}jkKqB6Epu4ZT;kYxvpKu z!kkR_WII4Nn0k+gyRrE&>o<=QtoGDlzt$pq?iuSbK!R3JcFVeXsX-RNC*yM?>Q(~J zC$$m1Ak=TBzftKDK1=W{H6<@?4uGC~e?P5o^dRY!Rq*Ng$piWs7EKYkkAA`SRbop5 zcZr#YEgV^o&OtE_-3cl7QC+GfO|KGfHUF3gx zX)#CQd{3MN8dy{Q{@vpLNh0@jJSBy%WXRO&o!L_|_H_R28Yb=WopYOXtZGxz!; z>gx?ja-%^LS>v>{xEd9KMK)4dXvcLe%`A0@eB5G5aC9~MUrt-(yhT{n%V^xW1O8{b z=$`<{ojr9P<(nrNbFkAsRbM}0!E0D~whRiVJ4X$wbGOl`S12tCcpr))cGV(3Gcx>2 z{F_xc62DlAKLCp4@!hYfQ=6Xeil?G5e~r*#0oK%E&97kSp&I0rieh49y$&Qe=ibOj z(vlb;N9=$2hheB2@NaZ)tzR_t_9u1x=Ym!h6oN|y37Ro#+G*!^pzm!!KWlL;g2=WV zh_#Ea4)9{h*TB69b2dxM6*{`0Vhr%HANTKZ0NXd_HXi&b9i9suOpL?<4}c!A&B1zS8MYic|m1A06Qh3#je9I*RmvDt-8kxNOC7 z?%*FJg$B}dut5s+mEwBzHvgRZEz5@o0pmlUA7n8<*ZiBL*QD-i=5RZ0s@f6cC3ULQ zc`T$s04AAt(VOi#Sh_2(xnP{gZorT$xE#;Ig+c6XV*c5~-)9Wlth@Z?_9ZvDRiB~S zoD=;pDM9JWf%^Ne0G}I^ct9xmtM$~#zzW?0N0GgiFsg?MYBml&jv73WmRvrWG}y`f zz|Q)wXaDp_`}D|t%D@NLJeOh&knRlomKT5Epqu&si4@;CLkEjR<2=81Y9&^j5mdV1 z_Ev5R<=KP28LR;<4@Eo9tj z3FynuJPplPQw$z9uiF76H1Bq}^fBV!w50~-XjEbmC!*+lPQd}0z9rQ(A<>cqy?tLD z^`3tbdimQF#dNyW6HXOi1Vav6Ou4@S)V*WshxC&$78VN(nPfuf00C-)9^3|*)VT#z zKgUdGNwGj?zqzQ3m{Zi_GrDGU{kPAK6tNf3iE;yqQg}lUzGNNn1w2R`CQ1n6x>Fbq zEcOodb@>2IQG=DAWp==u_`C5S1Q|rvN*d z0J=hfgW8>FVb{emG1`M!Vg6=Fcq^+2m%f0M+4rAA6eE_l{=rmw9wOsUYw6S{h=^# z1)WDW1LK2Vf1dLc=PToA&Uwp~D@v35=uDYtQ!a4tiUz*#q<-ctvMPc2PaXB|Qy5g| zNAxHl^+bDyY~TEC2G=_Ajg9jZS`IfQIeNyvE;_T1IdSYi^NW@#Z{2y^KL)Jks+=EN zFDI~XyJN_eugjijsmn@Q3liyYO#P5*Sz>S)QU)blLoEwqWbSw?)148eT8ty@f?cX{ zpl!>5icXjv04?yIQqzC>Rir<=G?8D6lB)^?{rvgfBi5_;Ps)LMLlNdzV`Kvci_$cL zDRfkJS6m-VhjnJ`IhSUj1bg#I#p`(cz0>T;`bn+jg=ql%8;Y3~({a9*; zf@JFr#{R4a*u~y$)x}?n!3oDgGfK+U5$-baZ$!b7gbyKPR;yE$_hUdzC zWJk6ENPWNlEfQn2WfE4F&TND}r(Qgb zET?zLxF6iL;QE#|k2K(3?YmN{atmCEX83znU0RhuiEJj#=^4lxXN?n!KX1!xadYq% zyoYGy=ET3l$0L`<-_i8hA&+l4T3~u}%ar!L;JYgNeOsf!#UtVu1p zEj}V-GN%jgujWcS6s-QOM{#tTK{f>|54odj{-mFH!I}{}0*GOt2COzF>R%Fa0k&E9d*6=us!SY)|6HGJ8?K|ta0qjp z^8{wzBr2?uCL`fUUtFps*B0VKH|BeY_eP^aiyT$>(}L{Zr+O+M9+0n)2Fqt z?6}%Ed~^+HFROhYyVa%o$9knYMe%z!^Z+mGE3;MHT@MSQV_@sez?EsaS171@wimUzTdt~@L)~#D03mgxgFlI zwUT5J-u|&ZY$IGeAfc2@#dmm1@3J-WH+JOFsLkrh<{&U2x-k1GaS}b3R8!NPhv&j8 zytwaea7!^wv~`eQVdOkCUPnzR4X&Tm%N*HL>QMjdrZb6v=fKlQV?y;we6rdezu;Gm z%KO<<-DgZ(+sr7{de~Ohgpa(?JKY+7%Z{x#>KLE?Dm|U3If=6^27M?uja#Fy;*7E; zfsyWKu6)1-t&v8bk!4qYQ;boOzh~vtwlB%YsiD551FFtV5yjps&y$P%B||eMTI^j8 zwe^&r?s_rgY2y*`+xKN5M8g<|wYTK>i(=2U!#!5wK+sB|6(}a|MC(e5Q`Ipd5pArA z79aPG$?6zsvMeI@kao;LCTHEMm)0wNoz>*2knG%%=P{&;;CDOjOG5BvCS*47i;jmz z-!d!i?<$sxM&Y)MO2LRfJgwK2t9Et4OHJDPX6&192*BnYWUnjCuXoo!_T)5$Tz~Dn zCK5_txGQO*y73XyYDa!*D`&P#757CTuSX?i^fRfAbHY2M91r(uvmPgm0_xMm&Fj;M z!5Xr7m>&Zs%lEcEQzW-%Wjr{lj68Pu5HeRnA!l@YpJ%o_JxWbdflR;(F2=+QDJYlIws|UG!8Kt||Wo0@FB# z3-WM0l1;r8(xgdv&G;Y z_oA}y>0e?2DJO5lok!iax9ZvRxrg!rDw|up=PD%`Vu8qO z;hd>SZgC`Xg7DlJ-5(}?Y}=7itxK02-?#CN^eBSqcFFtch~h!}!=uwwTZkq)A@QfG zH?coP5O{W_u+izUnfbPe_e@dBOr2+dhCB!zr#lS$PK$@LG5#@NXSnX={biu1?MhvK zr)fJ{>z_ZA?)ivVDq%mjmD_ETBF7i@!nWb(e~D?NKh!MX6I_yvh5;x02)U{gcMo=y zDil|Xhtrk58JrddzwIFSt;$do;j2YK9wCG$>>Esr-uJdYPIy?uq&4M@Bc9=oii;#ZGZybznnC(-Zxc#At#_*%b}=@8@qCbc)#Gz>|EWKc zEBfzK$=iF}XCXW3OAYjUYJIeQ%)Si$rl=VPJemAyZaePuMPZ5)VVQ;SX!v|FL6V%9 zroK|2$JgZd;U$#}MG!F!W5?OuFL{mJORxzb{Y2X=PqsQQM2+I0;FhOwc}FHuj!AuU z&CG(a#)82w_gg#wcaE4gK`_3FZESQ28@=;SwoK1U>VDWSnUr3#{FZm_Tlt=wzg{iN ztd#93*%#T3Y1OUGZW!cGFegaGSpOizv1)L0N;+UX1%cfX6MzZlOR`?m%m$QQ*y$@%e4U)x?8!+)cLxdYxhVnKdlk#jHq{Agykw6<57B|P{7 zE9cksM8HM2T_uXgw>b6Co|Td-Qhh4eOBAr=qa^_R**}`R+Z+SDp$CJ@t!|(N($B4B z#=jLBX6au~Apr~iL7#8DHB zZBYK6DfMf=d7UX9PslkD^+z8Q~V8m;g@2|O=Jk~;x{7b5B3N&M?^1UPceEq@vE*Z4=*m((Ks60L!XnpTp7#ge3n2vRDjxg!Yql(e0{&j z#p>vnOA5F!C$$~3`!QE+C%bz#PB~gL-Bu2U$q%_$NGQRj=2u2Tq$vanZglVQE@<-@ zW`5C4z4(&%k){i1ve>TUAW?1l=EJ92xpw4t;TP_y;`*+kz$TUjK3LS`lu$?ry0tJO z_KL9cw2A5{fKQnUvPvH&_7K`Dc%84J{QB=UNLWF9NIM4y^xd1CFm6Fhp=(=~Na5GH z{Fjgs*;d*FFBhT+Av)FfED|*aytFc5QQR^CkhTJOng}8rJ%)4!HI>hF1Y@64IhF$w zzI1s~Pio6VBM`t+fMz=m|A=^Rpd;2(ehB#!LEyU4Zsp~a6&2ovm-6K@3+}9rhvS3# z6Rpa9>upivgErqj)yfUl!yTschFo7W&i2GL`4iV+cWX$-T~D0r6Q1wGQ_S5%;OxPC zvtv)P)kl;OL+`~gk8fal*?Blp zaX611&jAvRL07o9!~k_E%conou-VDRt&VeY+PU>W)e<<)sR zQue1T0tGDh|0!W2102D3%8fMO4t!xyU6`0LrqaJzAfZH>O}f6s<)0gR_WL^&Jncw( z1_^oOJ2%XBS`W<0ZQ^xRF_>QdZ5V4)t3B0$LwqF$IT0h;54S&Yywo)ga zO%os<7;3z_GZ!fSBraI*d-a%U^e7$Z)xC+21R#;c-$+KF&@f=bGRW5`knp~ii=7!??-Mm0qMRV=^zqF;-w{0D6 zu6Ao9j@np$MWMHb)SW+2PTsUO=C>BV~m^em~(r7fw*)6ep<_NIX~ zeS%d6DX=nqbX%G`G0?3DZ@m!kYVR3OvV6}_MbAK@CZIiWN2J0P+v8njfpYLgP#c;v z+(VYc0dwNxKUkhPf60y=-_p2obs)1M7AQYRfCo6HTEXK2Z@1DhSt9{m@xBNjvr$Qf zl|ev_3mMgM5aWTEz;5l%=K*@($m|2LPZ)PrsGzmKuOf2FnVihJf^j=uJqc{wQ}wnz z7?lT&;Ijc$Mt;i-gYh8nkS)~bE03?Q2gO>RdRj{#aqqsQP5R5>X1^oiz^%=qz5HV8ru znT-yW%i(k7qCrG-26o6giAvdK0oA`z@*Uk6I}o`uVrQ!%j2cwODrH_ZeD>diEe$A} zjae0CG80@j-ibyzb7uU0MHsOSdg^c!Tl3TAVxIB$7`{8mI7t=NL}?|twv1YeSh%BTn$a)1vhz?navj*uep+uLg$#;~z->%c1LSUl zN25|UXnwXD{W)8b5o=OlS)NQ0bd1yQS8W4K#go6AvS6~$1`Y*iJ~(C|MvpmxlwZYe znd4cH6CQ4j_Ge6>aTupR+Y<`I$;a*jwr|7=md`6R)?1WqvLi&$0boT(b5Rv0$eVx4 z$$j%AHRHA;ZNtRicfQIom-qfne(PRy?<_aMqcB3d37`Bkpf#A$$pqQE6RH;`bPtR= zG)hgK$+vvpW>eGgp~iH0FIw?V%@o0)HHU`!z5Jnbs!!Hfj)=3ep;xYqbe!Kh!agp> zx^2n+$>yv+o-jL<^HLW78xSaLId!75%T_VoXR<@b&c#Mc%e!BB`7JlvdUTVOt+bq&!PY;jsP z3{@6+-8Fe{jE(m^Xok=NzLz+7XB!MqB@{YdS;lf@TLj&7z&YN90wc_^E}m|UbE=ax zwPp+_Mh(?h3=KvkX|}MiM)R+-ezmgM^s(C8&}9-hYb3uvlY=kEMD1utUy&m9p=QuG zr$$BrM^cuP|E8_dr6T6wfu_<9w*IwwZ|}3y+n>bWtl^$)oJ!0!F7$)5EyB7t+%5~$aoda?()fB>awT3Q4^hbKr9E=YzX-twfmVKax)Oj{ zQseia_*fs%9fWiC2+_djSzITlD+MnzFhTd$i5=NB{=jwek?OAo*9OgN+!oz$DP;|9|5cl;fl>e}8X zhaU&(WTD*HkVQ92Jt97f{_jL|~kW6hES-;I0XfX@f($yyUa>tNk5RhQ&rEb$*= z1X(yp*yt;XL1JSQqoC8fz0p*i+kZF(Ps^WfB8F~DRI)5Wq+3y-04Pkn{Mi8Pr|^wF zeu5LvsfnXrH3u|tY{gq-^!(BBq<|Si2%xdRK@1+3RVT?Nz}Uo`i8*zy$&Y`|U4Ib` zQsaIt-Jf--_SIkh6y7qgo%^l*<>O(Hhd{QwGvm?+Qm(ZROvg;wGbn$`%k+D9m`bdf z-Z~Z*n-EAoiQ8_=j&CJ@Kij5I|If|_|_1qYU+g#&}fP#wV_^J_y!Wz60!yvO_Y!=sR;mCFRe>nOP;Ib&g{ zwHZJw@Nenk_a!OK@VK-y720@Tn(Kr)T=~s2(%-jC8yPM|O4T^LUqVlhzBjhU9(=RL z5!hd}+MntF$Y%aaqHL?H?z@8FJ7K9xx{1oa%+E*)=IY*R4P%=yaRJfhmh&3wkl#I8 zzI4_9v(&|i&W>huhSeCrwLi*sYa40?is#MsSDUAw=AUc3nRA}6N)IrpJH%t8T70iw z>Msnd!m>{J${Ps;6Ty(Xbhnyq82Cjp?k~7mj@x`0e_$>be=*HQ{1Ee|64<;L;D|Ij z5cBehIVSnsdeR!l&!K(0Ug~ToRqy_~WJJvJoqc!Vz@mEk4gJ|1$+@F6_U6^JNV6;K zdN{X!<%tmp+Il?JNF*!=yxLnMN zjSc#l4Y=gC&fSkN#)7^{cGX~SHm2#AuubG^2#^#Lw3`_FNMdnB zw7E(CB}93-?3`4bPP`pn>|G%_kPL$0Jutmk1VeQqV6Y=$(5w~UNc;MXgC-5YPO|Fh zr(A3oxOkC!Tb>(sT>CPx?GRP&Lf3b%^0HR+3FD#h6cNhw1aRjC7y~|qjleljBR9{A zk1wm*KmMS=AT~y3OB0-$h2BFUpjqO$+@4fba?Il#M=0Q{a&S7HhZwz1?wY{!|QisH+*xMc*P8 z`!YZFQn0Bl_>T*H76v(XSbngFzwGfw?EOpI;ySd!#$*a@M_)RgDSf_Q4l zMviux%InFPPM?hoq-2%+?_`Y{XJ5HI&Sj-gA?5H~4sk<&;3W{__WUYuCI!1Py}%gL${{dq2guxSDQ;T2`z zi%>W^AJ|W5raw~qfC~hn+uO{O?tWfk+IiNvM+oN-}j1jcRs|5W+Wq9i^lgLd&Nu-2j0=0 zb2wabINwO`M_8WQZHmvWx5l!V?G8RsLZ~%Y89`K>oa8c?G!^W>?c3?$Tv2cE79=yt7`$ zSLW-up*5pzckU1cLBYr>2N@Yc>%sb88p9bD^vw2AV*{vOd6Qxr$2Z02$k0E0TAvG@vbM{$;bZhHcKMoWMa5%ewb|jvQ~qdi7|&i`1mpG zd?9|gj>a+=@t-DB=oR!>0krjgB)s@w4A2&Snf*rNWZGWjA;0w=Zc8@)nCW|Ubbo4f zhl`K9O-KWD8_pIJkonbCZFF%Y3j`zGI^Zqx3aNx%Tu{{z(&-0IRo~wX?y^e#G5oQ( z_?Q~>fgip#1?zi%)^{&xwSGz9uER$O@Zp;53x&p0ancZ#pCDqA4wh3k&h`qjDnR&lnc7J&DCCbd9UM4X>?q0L@bl^p4+*D}bWF!<)I>E%`c-(|7FD(S71{lmleBhQ!qpG!V(BfJKp zCY%0L-}^uS{4YsLk^HyB+BPgudLUTiTaq9nOblAjt?HZ0@NG60&?a8oNCN^~-tOWuIax(E$)R zWTalrce0@!?&OBjCXO3EGelX)*o=`-#hg&t-+V}TQ}GPVe%+h#wa3%Y>y>&v6bO81 zm&@2od3DIxxV{YD)5oqTs4n-(-0$tpPTt}4_ruzR_`lone_u{s2QBs_l~L*bi=(MT z)u3u$z==w9ygkXZp*I{fEwgpe?p)(;U8@#4qrykB_HS^O zfO0+Z3|>J;GnlC%zFJW+5phmOSeT(&r6Yh%dWA;WOgrMP`1}-B=P5~z(WwCo_siE) zym5`jsv4RGMw$lUniEJ#+2hgJWRTM^vmb?@(r3p|uUS%9jtKelCiZSQpW;D?@L^@DQMBH(-Q#mCt|QEC&}{&`4ODv}jJUQp{lW`paiGsQ}JY z$n4QGBEyc|#!SQ)3PgC3fNRM1zV?`Gz)*Da?ZEZ2MNmzEBpPvQc=U&MT z^+LdPjk*h%ySy>b(ZkTuZ}^u3%|p02+usROZ^+_mQjr#lh9u*H-?ImeIhZ>2bchgx z>pP>`{*E0w#@niSuGWA}Esd`Q{tWkG;0sZ&M#l9LNp;Em_QZpnyLqJ1;d9I;gd%QQ zJrIagr*2K55%F>@#kP+o;#97t(FyIrjcPxbKDe5y0|C?J;#@PeazV}ZPRhmsF!7Do z8!l)c4>3ezuDCnTKvFzLxvwcZ0LdAINXJ`#?OX;(fmjzMhCEdDNI|aI(U}a1#0o;> zKMSNn|I0{%$_GndLMU&OD^N2HmP3LB^wPm#*}@BH?4pMpT;#1k{HRN<{HIx$_%!ex1!9uB&(rCSu5B^SYt+bb>C0&Y!IB-*2z3 zQcF-XIMbr)2R%!;HyDYu%p@H>CQXse0>a9>7<7UKs<#rYjIFJudB}6H!JqFz*AJPx zip3X+*yvxHAz`*K2p%O`U#v$wY&9}w-BnM)A@}ULw>j~6;72cD$HN^+^=Gq}hYI@D z&jkS2&Y~7E?u_0`VdIdyE6@s?C$^ws;Z)1wl+)Zrw(hgfXG#iEVWEDS%Aec>Ko7N9 zAWci7k}y~%yKdMSB*iur0QrP(47e(I-k|4Y{A{wDZ}k7gTRmUrU^)oeBu$Au;g{Ai zRcK57cc1-LB8Y2!qQVhyp9TO4oMen#-d@aMAbwYGBDMQU35|qG715-Rk<6J*oI0tN(i1ptOe>;nQoIiRwSJfNpB#k zOsqAY{#C3|TXmns&FQF@u>JLIBT3!q{~K{8a6v}#lIjA7C-FcO6xK@Bu8CAD@gJV_ zPY>(gj1yO0qWYNGgp=6bL7H%&)J-T~ChjBE9(w5{^M1`oLH9F5fc8Nm{+n;B9Yz-p zv@bN3A)x#+Nn$kCJo%z;ucYo)>RwWS%kkd^3ko{7pg@6bmPo+ihZ=SBRrx&%O?b$y zIiB^&g^tSjYuh{=<=@hhA~2$t);k({9q+@JNg(HHrZ~o^sOf|d}- zJLFU|b7m>Wf(i$>uFWwm>+{+FfDkzAlyy+3HHy=#|2}Uo_7wB{u7e44x+@XH3qlO_ zA>x=0x={EZyL)o+{<&vVzBwL#705`nYfs6ixyhlqIVnhG41gE|Vx(RJ=l~EFT&Rxp z>@!H{SH1{o^Ld5w_gXl%Y+Ev?c!2%ddFV~B00rNEPQ7@~O25+I>vqZ+6nGw?5&+CQ zVvWKtI%xMNDn35DM$$jl7mP~ zhjdAYf^-i8(k0y;(jX<>-Q8S#p7;IkcYoY{e#}}kCw9l|vkoQ(NSo4pC^Q`98IQLx zHO+T8NF~Vear}M~5p*mNYOp=cYryF=7!wrY`ys~dE(E4W@|KJD)*&g7L2nr0a@&m&D zK{*jJNMHmo8A1Jzv;Sa!AqZFqqIoWD-NAro2k;Nx(LyYY0c`;2KbXPr2YN#RFu;Eg zK{5t-VykUoP^bLQdWvA+0b$n!O#1&Efd-m=1pOZza)>5h?Y)sN27%km|GVT9Lwj3C z(2HNBb1}PQjnQCP$D9q*`;5z#!^@nc;>59J|Mr3$$LR5azdJFjTE#G*JnNevcXv6-DPRNkMwlo#vg7%b!L)5uqPc|;nNfKlUY^XDWV zYbkI#4xmt+5FJt2F z&0&kVr||LKGjnW6+FwEcd;AM3()QC0Ccf;(r**df&c<_Dz~uf@iEu57|m ztG(AljDm)=>@YwVLwqhf@3kzGwa~!PRmRJUQHegb=xE^CMRzEijUSqCQO0V1^3!wx z4g7+>%D#$ZCt`>rb8d9#wR=2pfA9CtBfAH9S`R`9?#&hOM%1p2jbAA3)-!j=>tw62ygxqyJUDcED z)u&in#Nl!L&hiD{2;e>G+@~GAc%qqX&GITA`7bbB&jp^@p@sRB>&;stKTQF8)?_9K zp?M9Fsm`pMj!yj+M$XLuGFZxDIv`zNn~aTiI>)e<@BxOquR**X1(k4lZ0WVR`=ayD z4!z6}l|>;oX+TI4IhcL`1Ds%%XbXWPu~n&c$vBqh&atwVtLC-Re0j4DOZB%->N06(;aT??bdV#Wy2go7!=EGuX=Be&Bg%To@M zGJ4={Cv|7|RX8P%b-eO6OKQ1mSTUv?ML7{F2-#$5(W%?I@hs(F%xum?H!nAzMvY9R zCo0v__HY{W+E!NT1er3dsYbV6J4z|k=Zn4-InnFDAMb7X1)1@}BCi$YjO?91DGFFk zuxxG51ll`$VKa!m7TJtp=eQfAe%mhpC6o&WzrT{)p!Qf>#jhRcX1gbdQ&nW$8h0Uk z!a6CV=3Ui>EtZ35_^Rw_jQy@rzG)aE!u|YnM@mDHPrVn0Y$oU?rj~xx3UvqeZpe0R zp}2`cjv+eA?#X<@$u_RLlOk}xf;90HCS!?rOoqF%feO?^zvG2$0u+{W?0O=uEk zG(s$x4$=ym2$uxY^D)5|HO@?|SWs9chAh%^#DW5#I)*ScA&&QQ|M8-B7Atc>z>{eG zL1hex?+xtJU8(h)tKnQ-n60H!t;osfsmyZ3ul6L2(l>ijla`!CZwYXy>RpeItE*GD ztw(Q!MPtZIb17RhbcNYUGbb}`^5uq0YG!4Y;3e0?=Gk*2y{>PRa_|cvsc}`8>*bd@ zxK3oBd04OPe3S%t<2uL_tC=nRG;UH1Vw`UE%BWP_Z0FsF-WH7bLgp?_bgbrdJnjS@ zZyh)cxp;A$HV&f2#2xO=2*mg`JnRY*W{H3DF79g+T@i*ho-NJEXvDNdiImC%RoNsN zve|z8R@wR3%d9th^=^0%XTGBR%=fr~le#SPmfc zes~4o(+u}nhZqgZ z=VQvya?Dd-%C94G|2gpa%981D;oST5@dfcD3a5yjhLPIXm}w;|ck9e*fT8)+_pRc; zD;2@pA5Xs;jZnQ%3hL*nkN^9HD0xaxpUsA7$v*1ffUiajeaM6}d9CsdaqPFSrKIN= zC)_OjWU6hrdY3x6IH67Cyxqgu|IfDRc(PZ~6bFT(tKTDnlPGLP)%8Wvod zt1E-zD}$r~<7dCxw;d@usYvfwH1PMa>kn$33}msjUd%1T>>Ft8FTAx1?slo{l&DVA z3o0zKvN`nnlxO0V==%F}UhwDKz?3;RYN)`iUibq9n%`%f*m}DX*!vpw>cXf__mj58 zUV&Op+*Ac`0uuOxWyY8aX$HC;MN^DOtY`CEUU=Jj?#WMBH0R;4o=H&#RFZyKt84lt ztwXK;{6#kV1APEc*cSz|Zq*?nyK3)_bRnd96Nho%|6J@R+zz%q*XL0Cq+}jQ6>;c$ z_ai&T7b()DJ#zM-_pIl3^HTwej@yHf)arN;_%c@s}Z)o zmZXT_bqX!q#PeQ*Kt!%PK4K-9 z>&zA|P!1M1#e5(Q41;9D;k_>s{~A+sR?|%7cMidwbM|@<2tV5=nI+oIIy(x*V zP!m~={n$9LGGB(g)N=SuL~&hhu|ZxClrEfgAgQncvWeH9>h4q}KM25uOoW-;1P48= z;wwWD4+k8N=uKW<@(ISaGOM$U+CRd|1>C`lxL~xcX89!pbP-7-X`$S*w@*65W>bO3 z+*M9;RP04miDBhj$}>sf>EkCio~^CbM>(}YeCk*4^!~hi|7Q>$OVISW~ovZm+8GbP)U%ewnNg{Sw_wt=lpPo0@6PC7NTiXjv za6_YK^y1w94+79;!<#mCcP<^mi^ol5o+9MKI1hS0vq!JiyS;}D_Y2X^A#xwB)j$2$ zh^to%a@l&_p~z7(+!YcWn~CvNiG&s4;9k_5wI5?NV=wv72jiDDhOIdXQw(0ddn0XO zsBwgHr?`=}`qUicW`8x|S~ke>cwMK)YnX|vA2K{253do;^3_#5hj|k@s{DOgbX*wh zzi>ZO;FVr^HI;tR#LBb#po}wAjFi&DU;}2HVTLU$Vbjh=$_(qU7`{DxQ3>k5%j=e^ z(7E2tQoRHnRo8T_n$*hlB(Sy!iv1Cd---WCiiZ)D-I35Vu{j^NH^#=#JE3x>)g9EY zsHIOMKCbRi(xMg^t|TQET%M;tV_>FyYv03XXJ7X{FtQ^^Vk zx^(G=WNEMwiw56o8XoyRx9XuOo1*x=cfz0Jr`FuF@ZN9a>rZHK?v^&Hcy4bJE)#0* z5o+d2C%k=AFZQD`G?H7g zIn5~VJlR>+K*p<;H-EId&+%Qy2J;A1wH4T<}uZX!>InE5r7K0kheh zM%|yD4nOQ8zHxRED$eECnkTkce|KDxne(1D-N)O#LG@k*Nev>=frfE}CbgS<7Y5~m zmy&0gPgkyt*<~zA357kmzkkxJOC!ab>r{N3HAHTz4YQc`Z6$RaXP+1o>>Fe5`@K^W zOR(EAuZH9I_89*m zJYaam<{evQ?BDH>Otr_TPdP7kob+b%QlweRL|p6G3nypW{YU54~ z)lodh%T-gr5FJz+^{qB7X&%E+?XX+rk6lM}WahO|S2eQYVV-z|cWXUS?eLkl}`J0sm0=rLwIHUNTM#xHElb5OswMCDqdgK2^3=<&P6oO63yKzvW?L*2bD5}1(Kmj@b({>cYVg5vy(Bk32XR7GwL zC2l_WvV~5nx4=g_WDqoo6H;CofYsJUs@IRkFpdJEU63XV_U8(VL;{7eK-*$hG@<#2 z6cbn=$1gC63zB>?Sr}r00S3XYb~6L`o(aiLX_V}Eut1`_gN&EmwWwH1@whljWwaca zAK!hnNcI!5=a;|EZ^`QMu5QVClVd(g%uWem^UCm7Z%uLNoG#8&aj^D`i8&f`%`r!D zxsHu#c{nh2Kgg~B+Pg4J%!*`I(;onww?90nUzMk)z~Gvrybb4y9$EeR<_)^6MyK~eXIiN_M+=_HBEQn_ z;wFM;SMuRqCV7mW{Lcm%{1vs@=sBWYN70$zE(en1^&TFK5Con)6~saSmvPE7mzVFI zHvhDyfw<&nCwoJu=p=<+%+Q(YqX%~9_@b4WI34-~cw$pz{=sgR}3vHXAQ=a{Ker-{A*M#-;(fTy|DDunZhKwu1RL1W0$0I>r>rqK1Xl_c{Sy<6i(Z%Izc{=!I4qtIht(+n zLDQed7ivcE$$@{-+5zB2Y{+2E8#ol~^E4&P1bNwf#SDX)@j~8^0zrdm?~M^I`X6w? zijy#0Z(l};{Uoe>$^wc=m~r&???z{L9@=plILJ(4RLo#m$roZ>gSj-%3AGL0((v&S zu(GGclm67VWjqBeO~@zCIhG0I|Q}q_0d9KXVLfc>CX9T0%lz7O-x}l$ zFA#l`RIdetke>OL@Djqd{Gw;Qr|X-~2}a#=OOKp&#gR^Evb2Q{RkE!7M>a^`b%~?c zSsptFQ%Twov-aI)Q{w~5=d-myrt%n=M6>#59}jKYe&W=y`2NXty^*q3cLBlr)FXwA z70~Z~#ZLoo-0TRvH`mBRc`GBV@JZ)=-M>TapK7|h4bKLwbC~Itc&&eAPBo)-42LV? zmG+$sneed za_EWm1_OV~#2BI8(nHK@7yN16{BVC`IM*2j3IcgWUD!IRN+?<}zO!;m?T=3%1gX7Z zls2H#d&UPOD_exPfI*D43|5S=9? zsP>Bvy#(x-MLc1daZQ7OjgW(yrd1W;0b~Dgw`pegK}fq8CFP%C>tZ*@O})Rpdp&^r|Dm0 z?;nb#t!=cmeJm=mjE=&Ez?T>N{r7Wf(Ll5A*j$jLxj`&&es?Yw$eKAu?I!I7GAPp; zYaR+dUkQH&vA8deKmuVB>*kYhPLRzMoQbdoc`rN^$~{>3=1L{#&&YY7bY;$_*SQ{d zRrAG}ZZ!K3-BEJc@3!8;ml_arU95S0SW6oLb{*ZqVf>c0c0!)4@-M!SpfJB$ytis% zPSsT%MHw>pGLJ&Bb*z=-#*}gDTG+Jj?s{ag#-TS~GOrRIsj>TESD9Nf?kYf7p(dJl zco3R7O%v)MQm4f|USpq|^%BFeXo&MwqnCK^+ha)W!dcY`3iDkdY zoNka4+wXlHZdF>!nAhAstrM$4^)P zX0Erea(31i5aPfeko`H+5y=Uq*u+$JjBVa}O z@LMV_+09XkjdTk$u*-zhr@DO(78OM{Bk=or75|%Z=-9}|t{VAkvL6G(k66TmFT_Ux zL|};0iaKnTgUZyh$!(R~1H1H&Lcidz_m!yGKF)^^Gez10p>Od8?z)6;8QlbzE*;-u z`SzF*PF#{FDetoK%P(rQ1LRtkyndv4Ws6lNCnM{jgOJbPZmANM4SplJ+}^<@W!JHM z86FS_G*v(nY&S)Aay-qbbjq%(*9{^6K1BZZ`fY_8$Lm%f_95l^X`1A0iD_KbK}}@J zpQ!nlqJf_R;Q-LjKw#DmTtWZ@E~NF=gds+>ecO#Ccy0I9B0hu2`5>U47sRwc6XUjP zyX$wxZO&OiJWK9adp_)f*2T|FXl%YU<^XK{?hOodTIn$RDaq)XF$a#Nz^WtKaKL#eIWP&U4D zAQzcx-ds6+_i@@Ok2Lt_$s+Qvl~?q6(p3Yl{WrL))}u8UIDdDcr$eq=*>gm_-bKit zt%9!I&%C@Hy_>YHaSq2(*sx^Pqs3#n=~t#8oHCuV6Wa09+VP&BP?ay#G`*eZ_VVRj z=klv49t!Et(q?4Df6ix~O!E$JM2Zz;JXe^J=FK~W$*6WbdvhB|mXj~(sgXc>w6FXT z3rh)y<{M3NMF%08XLO{2qq>Q|*lja_3r9^J#(uw2I1jB~IHi<6xeXn}VXIy*b&#fa zr1tQgYT}aI7%rl}Ima5kXi#hlqr(r)Um<&v>A19_DcZgLMroTjuf69FltKF1QkD|j zJyiIBi*n#77U7z7_%Uw<);h`MyceW)$7yjnN3U1UcjAsDc8i3Bhrjq&O^O+7_iWXU13!}1Ap~vZ zjJS$7pSTRIRgZGl&X&T`jHo+C0d>6xtFbP$FQfyfXf%oNbuZnvyO+22&v!V<<< z!$k|)#*9?KVl`nftH-Qg=N)9K>dVcFbcvFJAvm)UTsTG13LJqbKCtq5WKglIpZ{mz zzs?EnC&8qAQKgBDn?=Ty`lz#b&EZMs=Dq9xwyIblZ14GQ(9hrBzl0a6b1d@TUi32z5P;vj&_(;7cATa$JmwVg zZ`w1k^Fv`S8UO8&!O9shKm)8J|Lw0qXK331fiD97Gp$4i>L>C)oihL^`hOc{rX7HF z5&-Bw@c&L=B>+?Z?)32K6ZqT1S`ypTUj-+1L_^>&OA245rwei(43 zi-1Ng{UiV&YFvxg?QK#aFT#K3va}yzBC+Q;czQH6Huk>O8_lAc!ra3?e3l|Lz zKt^I0hQhQgvJ}{41B`Hybw749(RX$C*2cVgox+?5{trg22ApOYz-?X$YCj+@TGc+h zt;!t?r^Q3|V8!?r3cQU|>phnOOsXQPO5aK6+ zV88@L#QuMYvH8DH?Mg&{Av6MTCZ)!01E3-6%E16xK}zyrlAQRIqK)e(`#*Yl%sV|a zH}3NrKELgGHCCe0X_ylza`$`ZuVtS3@AOz^0}bip2mnN)@s)bxSDeU(ZORQdx?TQG zjN*It@4ucwGj#}q5xwj}*XF5h*98$4Q^_&^MJo%MXVnS@>NPaRpINb* zSNT3V0AVoBDv+3)1X4zBa&iN$0a(w-{9Oy43Kx ztWRAumF_XK4awa`U>(r?h_IJE{cU~4y8W`in!UuD{o^S{a;J1GW24J5&UpwE5$xEr zpp63lECP#ZM*P^ZA&VUr3-}g)xe|+`V!x4hP4Xj`|3kRzfzgE4Vq2jFJih!|f$`Hc zwZ(L_IsETu(hZrslQ4EH7t*3WmCiDRlU$y0ho1N?-ha0QfDrN6&jtp6ZSj2+cM6KR zW34xfhXg)MdVgbnl2eAfO-GW&TyIrQxm<-^u2*Jo?&5U*zVUbWe8Sg@-#1CB6edO& zp+=Pqqy`$@d)}!Am$T#3FI7CR3rv=cK3Vuy$nihd>bI=F_h#y*xhgVkTyHep#iq0m z-Hklg`M)`ktm&8iG0YHmD;0MhSsiWODp|EikU3e9n~m{#Or4fRJ>MaSkZ!Nne-Fg* zvGDUJDn4;t6xiE-kw}LOxz2V?Z;xM(?5qBp`e}M_kJ!5`Yanf`3WmmqN>5&K~7OU)(w-q^x(d<$-wUFz}~!1lg~xY z9;uhtoJpmP!0#IQ9_P_yLA)~*T5~Ub<7~U)1t}aGgIZY;FwlUPrxDH_iSP z?w}b7YC7@py6*%@Qjw!68Y^*w)wuBYO0Fzh9uu3ztLVO(JDCcK{I4W^t8-&v63(Q5 zJGmz;kI$V+ZNJuHRWU0=`)bfal>C28Z`qK;6{e z3R6L^EnYy?aIQ9=1OCt32`E%e1VIUfjtBTxi6yH*`}Px`jW@%8qa^0tBANy|XwmH5 z;@>ah$<-;-;ekR4Wj2=i@p!TKcSlJS$KuXyH?S2f1vk#rxkbL(=0stIrtdh;S`g=W zJ=>pUwDOnVh6A4^*JUg`WGuW=olm;Q1*y{Ns$luBG$+F(1u347@i_^>(y$ZvStieEMoC33UKwb~JT={Gl8A(*}G629wN3YpziyFTRTD*iiZ10nd$iXjS~< zL>=z8)wM&iOS>FcXRSgaC$W9%@3o#r^;kQG=yR5<&-6Kpm zLO&g2=S5@VVdVpv6?YsOK#=w5ud&AA1+2TJr6=#8R2cSpwtX;b-4c{YI=BXS}Yilbv^ZiiHGv=VddLj54g_)Ti zvVG6n7#s6v=zcc;t2K8f{{>+u!2RBAq3Sazz@MCQZ<18+;(~Jv&1aw+re0 zKCd#j_D`q3Yp3BDO#IUPeuFahPs;RCLIl|(%U-_L)JO{B$4F-P36#XXGhPV#xwbS% zSxEgd2?`7VLj?LydcYCfjCHg^+s(={UvAI-7UK*zzlBU`5HuB>MR@~daR}#Je#`gXbEB8Pu#T3bKJ;~Qe|k;s6T%Ct9X2|!R_T7==j+=%)6kN=^HzyG%*?z`DjR2_Fk#cxs_Fx(x5ZvuHb3{BrV8&fcC#{nP!sKFTC zM-8cpQqo#;+|FHc>G1oo&PNI+?A<~FdDs=AfEM^HRq!<1p|xDp8hfDB@Tf+TU& z8hyTzzy22FlI<$$S5Hy9SB{!*V4^v*F&#-tUG$xsBh%Z)m7~mDUkJu z{hL?yHAYSHL{G~2a{0YJfj`p!HWsMS%X}(#7x7E5ni%4h3gYtO8>!W}52(__V3)V1Ra~d@U)eEO+0B=d73; z3|7n(mpag`cyp|@f|?lN*)w?{v^hIOtUW*doo=TT_02?Sff(po;VCeZ9|Z2(0N6kg z!;rzcGA@3;JON6z5YGcW4RLnw7Z%IFYy;8BE84uW2{VmdWdi z&jfYYNDx0wn1s#rEOy{T#apAspI_rA9FiN`43so#szYTUhWGy_oe!VtTvkk5=1 znoxwHm!h||cjj>Q+Nz2oq)kG1UD^-W$5Z|TPHm%>l63>->MAAOEvYKc@`mSzGCr<* z&E$PGCMFl<6!KV2^x!Gd+qTn~`CjGo-q+m0*Boy#1$U>Yh|8$4CqwMean|3~R+MK% zVv+6*_Ily`?<5?R?qGQ)xgL5SE2TRbcWxrE8`2Ba(aU)DgK{&EAH7%vswqtEF1T<2 zF9>`*DB;-pQLb^*q0oJwWq_T7>SgMHG`?%%k4jvcMa6y=T1E^tg}!0J3{haeM0id zi+hACerftU&*%?4vuloeY^e-jG#3mu{fci?i+fb7*orU2;Kw)pu$vX=0jg&d{38S8 zdf5^gAN&IkC$L!|G*ks)MmOOH=OE_u9(^S9P^9>-(BW1&H)Hac+Rcm}BoiB^;ZYmFFPI}5dOtgA5m1WnoR$g`y z^M=@vz8=KRtan;3enOqf`SaELw$P;i+;qMBPqXMBTjtcWM}bPvNhJDvvNxCjh@bN{ zB$~txY^r;ZqULD>ED}1}M>2`muxem@vO zA?9-n_j6pba~tS;pxr%%}9edISIz1DQdPVt%qy)~jbZvK$kqj@zR zZxW^O<;5Ibl=(nNPow*qLI1KvhreL4i;z@2A;m1;I*D5zTw=k}B2#esl~!VUenpEJ zRiKQiW2+((__lEuwPE+M=8G7e_{vJ;b-XwnK(+Rj??O35*=1U=l9T5>H4 zfc!7yp@W`Hfd_0#XDqQJVSx-mTLOS7^Mwc~{&m<8qhDQnWl?ZCVQnb?9N1A^D6tJk zjEb6&LU@BlRxqQf!u8;xBoIHACp_nx)e)zQWD5sFKIYhxJch8~8=-lC+EWg>C0sFh zf}cj#>WHAq3HhM&Eq!SyZp$@7;Z=U5_=hv_Oq0*Zn)5f4@Rq%qO3D!8W`U`HxOtd3 z1k3*wF}`aPu!eiZ*!AnirE+XGBMhW7{Nt%75Rq0IYikO1cItvBq-xWMa%+hhKH4Kv zE_-Wy@XH%?ii|7DZ)Vcuz&3zI%!gumaid$Y@LSOHPNpG?VwirdzP)GopQTs8mu6{Z3@7y;|3v!iUKoQ+&MyHeBprMyz* z>OX^;)_+a>GW>LVJ)Qcybx~2pSUIOAB8~<^?dOl8ZDcNGB>&0D-$dh4P(_)Noy-N9*& zT|a)SnPxmsVUZhd4^n_@^RF`q6cr>~q~ZE(3y43@3b?#sGzkOzE8{&(w@B3L&}tH| z%KPi)@#xQu;)AVPNDIa0Q>%0Nop`djQ`AX#xI2Dk_;szVp9#2M+htJ(0Kf^@5VbXw zd{RqMt`3peq-%BQ`-H;jF|D#S^0lduFv$T9;!WPVTB+^yWytvorBSfG=wzMJiYa-|pTrXs+{ zSMn+S#Ifk)S5zo+G=|Zm=J6?$0du|I|fWV4ElbXHi%Q|6oV^MY6-@j)Ehv)SlPm6wa zmB|MmA=WzZR@2(Csp91&iL-$#fi?2L3t<-oHJ24UjlU=MY~$b8V@oa0yf zmB;0;gN+MoAu*=x#y5RRe7Pr%heK`ZQKr;duQK}M(fP**I-!j7W&71;x_}iOX9{2@ z|5|^fqc}1&au*|122e6M+F^wc5edVtpxGl)uk#pVZa4uzx%H69P?s_)I~l1bS=uKXlB0T#VH1O5;j9*^Re_ba z3LZqXG*Z+w{zsyD|Y2|1_Sh#I|mNE^O4lu}hB0|!a zGkdT$chF7-my`T8F7_iEc~jr;Y{&5YJmuroWx2Q(YO(Y#=VH_`Vw2|f3bo=~yl3txLW~HwU#hKy*iln_=dFN-u!e@l@lEltp4ywH2;!|Pl zSdJ4O5Ls6}D`)@}j3(|20X@ieAx79P-`;?u2_Ba$+W>-fMR34_o-C3Tv`;e{fbY^H z(Z{rj3f>KUkLJZGgY;X~_i$%Ba6gFJ52(>0p(?)WzZnpL_MFkR$VdxjpV!Rt!;in) zA0si{(eXhGG6sfI%b-kR&twd*9bjDp7#T`%nU~$NAw`ZX^{`Bg41({CnA1yPXPd z+uyFPVZ+`AO4mYx$ZKIwVlmf8&mVFxB}>px1$Y7kP$iM@#i)!zj%leW(4*f{9w_=$ z73KcS&#n20wn!lX0AU6r?-#3%QGd;QK>ZV%<%RgjPk9yd!Qc@S>ni>V9SRMr#qH61 z)Ag_?GyjyOs6csy_C(MTtaD2>xy92L^yM__dR4(;eNvZ2$=Dx&{LEW?a6`jbqr2~k zAwKw3;Rob=81B{yjmMRFH0VKQwUs0q1FX5l3P-#-F!A$7hgL_|;v&P!^^E~{_;607 zXXn$_#*M|EgVBgtliNT{U*M;OS(e?^=1`Ub5Kt-A* zHd!&^PpLyF)g?Ku>4SRQMdp`vdU4886o-ZoA2w(16*=gWud`412>{asU?`w~bHgCI z&aLtmSqlyMU-9&;`~Z*=3K#=@#6OIURt^p?h2dVw!P>}>pnzv7VU{Pw)V=y8; zoH`(kjK_C667yoEIT*y7HIr5~;&zo92tBx1j9@I;sI#=u92n?!}$U^Lc1(a_j`|Q*`eP$NnsFAaQwqW zPmC))Rc%OZ8CdhgRO@GpC2MxV@BG(_11gF`iv1i?ET72OtjNeEMle$%s)VsBWUN@Q zIA=!7D5OFcP{;_xZ9|vvm9#lAA~j$DoQIxJA#FcmY#10GA|0f(5-PNAzmkHlKB-rz zF6x{7{f4^;7hUT@Dt{LtShH9E{k}2ITmlEO&TQ=0N0RjB_J%n3mS$!COJqNko|YNN z`YS|B?js?6@M+UZ`{q9i3j!5M;w!Fkv{+Oczm$gA20q6lj+tQ;MW_XQ5Dbd^W!1CV z0oc2oM6K07)aF2gOi19=pBwwtUc)3d2|}}m$iOepKorJS(9kI$s1p+cQk#@iA_OP+ zSkUwUM6S7uR-sxIL(kzJbNGAb1G~t!i7^DO_7zek`vG6#?FWfi3_yM=!3rG|7N;Pw z0;KI$LvO(jqpA%f3@v_X)lWwt!d4d0%PI~xt)9kDUIPzc5=mK3*7XQ-l9yy=R?b^k z)*FA>hzg*&`tUfKgO2*3yQnY(+~d5|wH+Xj`*^l49lo~F6!U9@-}cV=!JOpFcecqB zcl4}bi@-m`D~Yx5v$iVc%P+`0bDA^XA3l5no%kvZG(X0B9!)}2Iz(1d-!OfRib|gH zw_kxHT6qlPZ57(8sEjEo*dE?)aLh=8@vS&fUxGbysSqk*zn=1)5&(2SS}gjsq|jym zcFZpni=czr#^j$^F#1BF!Y$+0PYdNf%|SukOunMwRpxuQqM5qUsBD+>1@mi0LqUbu z+_uRQj07XEkK{6d%24XXzo};<`Ii)kLIGt_CWId_;T42;1OqhaQE~&s$58;Z!In#s zY+ziFxHC7?J2v(!9i8G@0dr#qLozTfx`?nzh5x>U4=1!i{i7~4e24{IU=ywM`kx;?hgOf-9nzl``HUjkK4(7#(%88d4=WgRGxC;Anx)?F2f(x;A17PLkXU_=+0P?KsQpVJ6(V1=JaEWg`Sz=I& z0yci*Vc@g9nIeOf#H(;|s-fW9xgWQ4v?o#$7~Pi7b!6oCu%K#Vi2`AT2^17Ft-;8w zObmbyJJHxSnu_8lUFb70j^DbMGJEFH!klX7x9fern9l`Pc`IgYIl)Hm+NLt?yiP0c zRxb8%^mOLgNE&hj{cp8#_I`nii;LMNFH>`KHO#IwU+ER^dm%S5``kY$y<4Yk?s)WB zI=%Bt84GK0z^e~<63nPtYItg!0=Z^-9|oQ`)UtfjXih`|{k>8(UlP8!^2}XYWS!n_ zcdHgL97;YA&v?9_82DO{!%-pjX`2IQo1@XrvVN)K!%~s)?>#)_Hi_x9I0xClxS&6w z=Vy|$-5?bdFUy$zF!j4@G=i|r!BfF4eiXgA66<54?2JO=Lj1g=8*f zm(5ha?pvRxS~V*(rjOkw^S?hG?_7mZXmBpMilRbwe!GJSVG?E(UDj7!n=;6ddv0OK zIW!n3)(fk<$&OV=xhu`*jJs>0QQ`oVt)*Vm=bsghg&Q2Q_rOZE!RVHM;?iz*g?Q#{)_Mkl=EJ_PydH*gnwK+i z35cw`)>(0ub zBN~F=&w<^Z-eYTDWc^Xu#4+`scCx>sTPFI4P!w)rX?fdNy3cfUjGxYcl|qUhjZ3dO zGR@;fM>wYO-oJh^Y@RSDRy`VNF)H>|Tkn;wPqoj3_H=gZt!PbXH?!r@fcuHw@R<=i zKc!yliq0b}LmGDZhCt+>4#KGGI0@$|EJc4hQWG*3Yv)48Q9-vb2{Lg08EB##35#FK z5kyCT3jI!3;COSCAJna$D4eBz-A zZxkbZFc#qlqSe4fGlt*?0{jO-(r7fl4Mr-zA9qFLQp1s!j`q&Jh>5uW%3!kgp1ym( z*Vtmcr0VYCjbzqZ&drq1P3CeHGWt0SL%#%;8c^lUnCTL`lqQ#F$Ficj#5Z}C>0MNI zh-kgzv01xlL8rhG+Kxv7l_r_D;e+#Ukn`W8u*s^R4uZgJy{IsVnmm*+oCY5}fgR${ zvI4ITd;+EW1j`9)dmZV&zS+v4qR6ITJFsn<`*V+;{uNF=1pwUyWQd5+B_HQ-Rs{2N za}Y!hgmc~yF;JYJ-}}qmwF5v`osFzM2+xed*urECES2|a_evh>ECE1@03c;;z_iBK zW@WJFu`5|?b|$V-`)X=0BuNAuwOJ{Vw~|8XxN?OFgKhEp-}fs8_}2pdlkcUuThgd- zeH`S4iVxOPTL^|t$OdBLk9|?7ma%OMZ26V_VEQO<1~@D(_$A5+4?}i4L7;%4GuZ^b zcLY*Mm#?L|^0@oD!we#jK#FOL(i_ejbuD`;(7fxx1{Y@>Rn>3Dq~ECakPBZ`G+^;t ziEyj=?m^EI#23zJqg*RK>(ANgr_(3!hiyd7?WER@Eq3oA-z95@t|+SBqAnTC__ENH zTbiB^}_%^vNHlsYfhAyo6;X|XvFYO

          d@UAE|-*=vRzsfbLmQCk1_YB#v{26djZ&F}p*C#e|?x(5Mr^GUd^ zxa^fY5;EZ8DE1ETUUh2nX)aDgX&dprc5%xj71=Br(LVLD9r;$in+oOglT7~Cmmn6% z`0?5N%9i_&6*EnhG+fK9+WqfZ3(0$eZGPF`vFjBxfEW-cHx`Dj3YsobqXGoh(e|e5 znfr+l@Q0T$__eFF4iXoZ1Ex8PJvjuo{eB^LWr1PaAR}$zuHx$@fkwVnY!eztKAHd9 zs3_+ji^L(s0%$a`b|HIl_N7dCdeWJjD zgB{!s8X!o3V8LC31_|!&8r+@W?(QBmxVr~QaCdii7|8QJ-#2&7{Bh^b-J7*`(^B32 z+tuCGXIFJCRAi!nbY`mVzT5k9)6qO7(wG(}qQOJE?{5f{6E-X}_U)#yfrul2tJ~>P zr3Fm54v;r#CyI%-q%lO{G%!xTRa#5JC{&y6~UGsXI zJUO?U5!P8+Z$w3f^~1jF6qA5MWK^Ln8an6{x+PBDzOSBnjF4}lPWwbY+FvL;E0gFt z{l_Mf_^ms9`|VCv&W`}NqMzi~QK5}1TlRP#v4`&p;ho3WpO!S2N{yuLO%b!tT)MoUCZH#|{R6_o#C0J|T;oEA{15{C!4Rg56VP;OQ|XNv08nY& zzn=nW7>xLhV1OaWF%10bM&J*yf6bY`rE>$=${mJm9(rB&>8z$mT7e}NTk@Po5+{f>i;gs@ho)_l*&>2@5F-3(TdVJJjcTv(Gb@{zk zzANyKJFjr>q1NhL6^kCo^IlxurieT=iDZ|(t2V#Z7}uuV^+InjUphMq@HQ)P@kBqk zGhNKh9xPd-+L)q}U26ta<5u6kr+r>oAsmz7R*2r-HTjEJnOH zbmK8Z4@FKMVEJ%fZK<8C=rAa!bQPc-$teFi7e`K*^dH2jZL`}CNl%uuxIVSi#GHd< zXK)5YV}b^}SgU?!wJ-8Rk%3SzZVO&WlY1Y>06kfQu+OEI(FEFdlpGoMiPU5=as_&VxW1eToNd zFW;5?Q`Idjq5p`_?(7DU5n$KpeX5?%@NK;qXa8rW`k`9GxP4EZAZ*p`mNnX1C>i=k z@joQg;13F7+=CxTxLDyyQ?mJ|X?_#aT5HDiTjumz<#|N?T6U^MqJUG{XZHEAiCc*b z5FKykfCpS2t9z|4G6&7uY#=YCysq3=X~8*svh=s4pn;!>5J2n`Gm&W5=o{35+kse> z3x=4lylWB6+y_J=#JHc=X_(#BpF<7_aE_QY281{_Jrkwtt(I)pOra#fSqAvuPDMW3 zb$El{_A@Nq-gZ{HU!+7o?zYmdF7LYvemr)w_gL!A+;fTc8VXN>0UioKJuqfHY=dl9 zxBQ)<^s-Lwx^U2&+QL-Bf@VKgE0}(3M`dEj)aizCEt!3GNt^3D%ST%K5!$c^*!%l$*u=P*aBK4Cyo%?% zxMVAH9Q8(`P!F9Q=zvO*k{3?73pSexqP)=(`ltcsfinU}!az-#2gDJrSx+>eb+0a}gBASCmcj*wAlzFNP|5kDO$2V!C7-NbDqxab`<(yS<};kqT~V2 zw%MUEK$qHXZ$UcQ0j0=^Z_f`7jY*K)0y;>*TOjzBFT&r)-5c`lR@PE8xn^Yy&Wqck zHsk;UPY?O}B_6%W(O0EcSRue0(96O}ouq}pxE7glC$wz8KNiUrf)w)6sW>u%nlJ*t zI@X1Z2WubY@=3Le2juNB%n?p`VVn&*uH$?xzw#NX2=EWG6@fX*F`++fHA=W-e4$Pd zC$}xejE644Fp2N*rlF(Fi$G86^d8aa>h0`MrvP_^BG~K_2Sb_#T55ry%GS97lT?8G z9Mm)K_2hSu0E2;*3-SO+Uub`yApY^2bq8qV*#tOfTNd!QvMFeV=w@igFt*Zn#^v3b zj-H#D=cFJ!`kJZUh4%!^>`F2afCzE$b`Qu-FIZS8Bzub6AI=uOa81w!Sk%>wE6shC zVUmS-g0AUE*C+#tOr;?E3FVivvl#>|k~BlGxc@a26cD;~2d33VvOWzJ+Bg5ZBnZ&M zDnbStX9TUr!>B~~LUOw@yvkg&x}z?}>e6sfjjkC!b2>Ua`=u~spjAQ;Aqap30U-8< zOw>?gAO0kCEiNEQ{3C9FGYRL;7#hO)_dDc^ZW1qpbz-4Q7GE{u1Yvdn)pj!to#++*s`y!a`YW3pnMW6QXsm$ zl?sK_$bdRtKPQh|8!B`tuExXVZ#;R(H`#&%QqMAAB-Y^NJq4!~Nu^|QIc$iF$Y+4d zPqA5-FYDhr&o6q;I)B!GJF$*YZ6I#SdL#|RT~U0uA}ef>t`RTuk(x}-QRp+2Kn7%@ zj}JBc3!^XOgh(HN=L(=vuyyY%I)g;U-vz;_=iQHRn#vo&_=>_LQgBA}0xnx@E-H&~ zQ#SM~SQFA1vid*`1mFO-zrl-$#opD4j_mj6d3~K4FS|J zHzmm+-nBBcoxNg5$(AL?LNIi0Z5QlR{t$qQ^1*O!ecNMwo5%T{f3`t%vc@=0)c&}k zxvF>znV!mjMY3LsmSwGqOGrqx4LWOfr8t}lUF~AokCqKM_G?%zx=!+;?gzx?tZozlr_w6y{c@JMxdmrh`VKr@d> zuiV5?`SSvlwY&liF`YoLPS@O=0A8l-M*!`G_Lh1SJRzJsKF+M0d&ML5=Wg7l89P+% zKJKs6TS6nOTlf2_A=sWLL5|c+e^twX5HyGPI*k!pG<2H6=zcIL?{eo3CNA=N=kSDq z)I%otd&}c{;x&~)&$Hhx0WuS0y0+uSgIjw>j4C{4&C?Mv>gGR&?u}NzylFbU-L1ey zbYYNhABOoeARjak(D?X48+<44IqkE<2=>{;I$FtBmkElOSmiG2W3+?f;cV}`_bU2k zyj8LPX$AXW-8PHc(g%YH26&^r8eHBB5Uz5fg!nJuLk>S%D zB=b@7(Dhu=cq*~)voCgNFogrX>DKCpn6Pd}an5Wu@f;-*@kRnulzVyl7=>cdl$-hw zn?<)S&BmDNwCqHaQ3Urn`i#f@}fujoo9%Cl^oc5Ef>B-D&$b1UXvn_ zB-ZOh6Cz1-emq0W=w^V#Q+-W=*nW^7iu)}XLJ;-~VN5KXv#Q=i?qY$c%V^E*%xrmc zQ)Ow5`6VUYAE<>|Re8%@6a5^=6!mXAjshI$W+h??Qd0_pKazi~|2fZzIbRGhBP$5U z(^4NSb%|5G-F58Dy{kKDS}ShKH<{5)3t&aIQ*tR z@S%bx6DZhK`@9Wp@W8-%_Bs}P(CmS(#)|3dDwCgS-|#~tBnk4L)z8}}KE=4>D;kV} zv#z_cByFJPj{?fu 1?@cP3tJQlA}^A|+nQ_Fk|;m+8=3mB>76#oU#P>EBI-5^jdmTc~SWP$@Fec=K+h8NA>P=>skMg@fD9tG-?mZUzLhCw2|6@0+hk@d zt8=7Hww6!-5yMp)z$Me1adQ`XYV-;cjE;8@LQ!j~f_w@;1zL$y&Pb5qm*CQjZ*cEk zbPqS!qJO0WuPXfE3eW5z8KT1WSw<4>h~wc4X~G!3{m#s|r5c&&9@^738gCoQ>w+-j zYAp2N<|%qN>l3$BHkv+c`luYeJ0kd-=KJ~zW{70`{ilA8@CK>N+3@KTU)LFg1mWNA z-qI_gxvE?q+ImZEWE4}1bf@Ksv!aHYta4iQ`JVW9}o@ z|+eq*Uq>Rbi;{VN-qL(_part$eUyiq#^C9I4M$c^JQtj zl>|c|0H5s->wOYiAc|>?UjxUfN-;OKKB2FkzC7HBvpr`uH6KUT>d;I8aJ>qnSfhxg zRo<&1;@Jn*QhhSll2K9P*l(v5rOwUOD);xYjM<`RG0N%SVS5AC~TTghPs?{{twwTG3n|HVnoM(xQ?=o+b zwwy0Y&loJHYr$5rziOz0#AsDXmX*A;H;PYV_q-f_-`~dhNq(?iJIAu!LL9ls)jG87 z_`t2_z^lejdh*mVID8={#j^gu!=U+@HeZv=?0IXRWZ~$Z3-3sQaISpE<5}+*?;O;C z0Fs@?D`hS0v>sy(gnTDxwCEP)4@nCTxVU7X={EhfM@hI#4GH|`$5rAnhyh4xzoNB} zyfI98uXj(+C%J{s<+}uqpF*x|ALFx->L^P-KlqK*9&P)pUV zR<$I(VL#WAjLZLjx$@$$D$C6J8qE81~!V(6@H zafbhne2E=@<1eVNm(a;~#a~7AnWX)q&WB%$A0PSpc`2AHAo7e+^qNmZ<#VBOsJ}DH zkOfH4?MQ6$>^QnU*ATj(+Xui#G%mH-O+99L>^TBbdRzH5 zVEkF;0iPas@{3&QNR%b3qsr_@shv>#l*HhD+&z8v^E~;(;}I4~Ra1FmZ`01$VutoQ zS1@Ebr3o}U3O8qqo7-rh|1$d z=8yjIs!gD%l%zZ4b2eG=@x$lgUhb?0^?DdfIQL--2vhbQ<@BTDPzoMiTi(ppFEKQO zV0O`yulsoB~58ZG+!!zi?B= z!@uB7z=mH$jlRq7$D5&fvV6I=d~izYo$>z^yuiT19Z|7J|M`CO>M>Rv3T7_RlJAs zY@k~8jy&rNPL2)~w9Gev+@W7DR~F8AT|%*rnSbecU%;e${;CtvJ0l?2dYv+|Gy!ivff~LRg4}^)zIQ&{XdmvY`3cXHV2~sA>9?6Be2l$` z3g-aZK%0F*B>kNt1z}z}2lbly3BoTt(~&XHDP@#DXB?RZdV#;94LP?vKX`B zS!$oR?Qs)19$EFp9ac>Cxzk?8NlT@~uxSbElqvtOjuNw(3(J!C2+2o(mm%gOHSU#* z^q-pa#u@+050Gzmf)Ico*uc}X5(;m~LJeOs^Mrw4OsH}R#8mC~D?{{$qn4x1^m`Sv zH4#=J;WuNuoGEu(y>^Rye0ET)t5?uDxCc5#HO zUOv~VP$Z|oEX1R=iz3C0kIARM#XFJI^HHj&e?=rC^a*kg@GjB=XhCe|OsLvTZYElH z(7u>x)k^=gyB6lihbz=|H2(}CI9ViBUwJZoa_!-;|4W9C_^VZCrEH4f>vYYfy}r(n zl{?#Y{>nF{7KH*`{NM9dE(0XNq(1s{8p8}5cdp>G5Ia1j$Gi=VEjccve_zW0)9QM6 z@b;j%TJ*0ppnAClJ_{Ko{C)0v+;3Cn!T68(;(-cmfR;b)tfMH0GC4=>vyA0ODQUEL zUUEKh82C|y`m@0u0FQ{-hGD-)?&x~Hl1kcw2EPF&hCQ9avygm=c(K;J2{CFM$^_ie zu;ZD&^HNSE&oM$znKM}XvDTtTh4=3%SLVF#)1QowuZxCUr*5%tHJxrXmBtENUr^?+ zE11*`=Z+BkW%P_o1QVLEyO@0@>JM0RG`-BKHD3r}vFEL3dhT3od>X6zd5p#DBv%E# z*ce;D_sb4)kQZf~6uOPJef@o1QO$+fsF{mgw2Xb^iXBhwrN3OR-FuW`T&-y*DLYZ; zhFa^NdG5YqZ|h1n7>DH+%CHu*{8!*qWn$!fk4jJ=7ZWe*lH}6dMs`mJ*i`HPs#?7(PDJ&mdws$$t0L3_Ly>zs9ZkW5c^l8V(adhzDkAE=-i~ z%qaZkqcAqbERZ;!#iL6hBdes+-(}g8Nu- z(M>R)$V4GKY(waAKks7=L^-2l#T+#kWUSD9y&83By9j&J-;uAaE^bmH&#X=#t=C+z zdp7fiR8fP2Dg$>iL&DXZL%RU^|FP(PGc9@ze!+ONmLIPE&iEGjCPfHjDIx($U-eU@$h^-*W?2%JIcxV?-=x5|*Ca3*i&+fE}jZ{L)*@Z2QBr&nIdNrC)H}sOipHrq$g%t z+Y}Oy??)fh9&G)39Y26Kczm)nn^8d@d;bVpIK%jR*BIy3%7?)KfpzTNQo)ib{x#%X z5GFG^I-ykwcVI2Spl+D6NpJmyE8A_{EKVd6Q=U8r*-{t~$ik*>@=e46&kmW-3@00V zo5^G17tVsgvl2CDi3Z3hI2tO=Kmfq*+_5#y<*he9kZ%V^G!lT=9ZgAQyDToYM|gR8 zD_YKntUWLA!$kln2KgyUg-q~QKQ7{?p68C4aQ@tJ-TUh3=+O5kFpWWgJO2KGlMp*Q zV*ZkD|HgW$DLy)ykwuY@M>8_AXv$$? z;!E0h2od;gL&Q{y%2wjv=U*0n^8V0oFZFyO-40E#v=y%=-JEUqY&0@Zn%r0a`~cBIi_q|v)U$Kp7+xWN%7wMYdv0B(s&&nMSQ8-A!nZzMuabDN*n zN7tEm=$2>oCm`EHO|AucC?prfPKZrh=f(grotxt&c61$9FtG_SH8sK+1S#YvN)p{$ zxB$rg4?cHAP~d-?Gn@0bIb%s3larYH&BH@O$4kvO%`0ftFYK~W^V#O&Ob6y5(V(xs zrhigW@bK|7b0XW%hiIZQ2FPFEf9}j-6y>d!_CQ3v+_smTq{k{lqUv$I%ZE@m({VP0e0^Cq&AO|m3JM0o!qES|G4MYX&=sy( zJuSDoZEbB$ZVFy^Ks>X3LH&Dr4ej4G;y>;n{%LJ@G(byBDsDpTGLHQ@%Z~K$Q*6mN&qL?br_$Nki|0Hjtg1z&< zk8<#OBd1(b@Qb3t8yFiK8yW@+lU|;9J@0slkY&jgACmc)$_*P~+STD?9NaB|~(0JnX$g zE#HB~fsvh|82!O^ldaqmn{boM=RAjqrOmJd0-Mg!k9`C)H5<`&a4Z(TFZYXdBo%Qr z7{~q|wt>;rksgM?rORLR`ycfg2v7qwh<)cz*M43SW$@Q_FQ!EgA!h>-O?xAcyY7?_ zQI^5qi7~l!ZD&SB%}yry8V?2v*2)};>8^_X_w{yr%Z)!x(`}`}A6i)zY_G!G6H4dQ zI9bcyHxpixZ1vVlQ(D2PHa8oLWXL6BYX`D>K9@}};tP&W509~asEu&_Ha)~WU;OT9 z_DO4Pv>g*XTn7?~5?`)2wv`TOTk}}<5L&!yE{*${aLz@JoP>N0O9^ns`Cd&Vqh z>+V8@%wrWD@8iu0R+BZYu;=7tvQj4B1sTO6HOx3{sdU7C40Lsh@3y0!njHoNTIEXrds2p43KWqAkYZ>1ig>9+!l zIj*R!*X8>o0K}KG;k7!=-A@|s5@dCWr@5HtY1mt|h>lIbN%_Ahz$(*i0p31~vDtGz zoyP}b%`WN2i{|3A#w+wxt=e+yjU>qiNZ{^DL~_`Lh#@Q_kL(VgW!L$1KnTY%h0LyXY=t+e~x+N=cZ!M)`FLH`ZDq2 zvgTl`zptj#U6~*1m<{+h`jM#tUk1FR*GmhHf#6w((grE z6XL8f?VP^&X>gSbx6an{ZKr{pv?KR*gLX2iFI$cGD2I0`hrD^{b-@D~JVMnRBxXPU`!~n8aX%U^{D{{A%yrj0LbDU}I z;#=cM^COII`Wx`cAM~-X4wdf8qI-<=rmM&3<B1l~%O<#r* zr(!cpMKYIrT+}SwM_n41sJEICwmm2Akz^Kr|8-`mwEWM)3zBxSf{yD$aBBMO*Dt&kN>@rpymvars{oFzz`pKy z%Afa8vi&@rQ$HGZIiO*-F*mU>w{a|7E=nVnXRnM5%@!=WlQuCsrt5P(T1fZ%3-MV3 zGS#n{<>#ZSrn$ODXoSd4qVT-3iU#sb-ZwYh84|Nd+FNY2I>j3~CK%}41UYb*@esFm zukHpJ4}3;p*xe2HFUo^Hm=S2Vl`(`&7yfi8=p;OS5~ep)YiD;tU0*OcDFS?7C6Xko zpLA>9r{Qf_OsAwKmU!lZ!c9BC2#A#|agZ zGlTq<=_ny}U+sQlD{(^A48p#i@Xwj_HNgZ$T=%kMtj_%CxaTYliSjzb1*3%^o znDzr68fprE_BfdjNXxsp$433x|IUW5<%}5}=>Fcfdo_+9t1Ey9e+5%Y4Fxm@*MErEqof zClD$YXKP4$p!t|r$ns*0e>Q8lI1Vhv>z*-GPPzb5;XiQH20_QrATdP64N2=%9{KqM z;w}5tF855z<*TTZr*182GnEL-nO#bZq&-J@`=rGhR|C3F<@4_X&=6Wg5kFQV0M?Cq z0OqY5<1`HWx3iew+1Gsy88o0^!~TRlW#%q`(K2@k4p8^R1P=&;hN^>>KlpW1&mo|? z1O}ESBtrq}9`NuD8SI%U?SiElB6p$LEa61cbr9U_r=?M&y+hQEuKA5zG_rST{$vze z*)oD=r=mxUpjti2dbpSeXl{3Tvb{KbeUhoa(#}ld2Ktpc6yVu9L%o)Ka6YN8)8S_t zO?N@YW?&fp0J~Sp>L%I>2MAZS>+TS(A8+NuGX3`}$g509P*)?nT%3s8B>i#_{~Xr; zJ5VU+$#({N*$L5|p>zt~^0AF0(e-D{qReCi%(V0ZBiP`ukS+%~g=(64C<;+jOD>^? zjk$A%!MX^E;~8Y+yFM zV-a`k3m=*%6T`J&5fvX4SQxc-w*xfiXDhQp=<(Vbz2?$XJxb@}+Jl zL5}Qb@v9sLRWpzQsKOOg`wc=xK6A5!?4xU+! zr17B|AD^335}XPJR>VLmiiT;vYhNOYn);gRP)kRH`;Nmo`&pJ-zP!3iVKM{J?VMJZ zqP2~8ZiEKcqXDhzN0B1E9=>S%`|(I3>|_F>c#FJdE-TNXnbf%bDU@=pW-s!&fxw>R z{_amuT}%>g6eqS*A$4+wsa0R07qej!CYhNIRDNNo3k}R5=*iW(3%hCODc6jpnI1;M zVVOTB>tJ<3IFx3UG(L&jJ*;cM-Pc&Tx_)zYU7b}gd}8w_ z7%}BZnep6EF`54zwQ@phx1w%E3oP9;Q`m@yyD7r1|4>)8LUNyy$;WPIX}x=b#B_)= zJARaCQ@RD&wlhA-&o0@Ey7TM>Lb9_F;GNZ59Qb+{;} zBLhKF*R)$*8?D=1?doV~mr2pjLY^tQ%o0`%9%$!GN^E&B8Y@p-Oo%I*jvH{Q;9GER zg-x8!IA3K-l?cU?MBrP-*{Y`uX=5RPkCg3Y8^lnRIP#DGv;iN=1H-r$k)S5jpU+MGQC;+5iZ^sYY{}J zQ;IpJgl#vi-?=;x`>5huXjn>O(bkBh;=*yg>KK=0rT6VjT3r)7dYuVgL|7{(eg)|> zjc&ZVe;B|Q_zFClM-_}?IPX318!@{P6g&aKY@E#^rk_Jc{3O4FdKhx?t7z*GQ0$#g zi>}%sb-(KL-W2i~e9l8A91-Z^!C_UEY>ZPhnx?UA^qCal5UtpoGH(blzhAPupvk=- zESN+L2k93-#zaR1GC_6WHa~x2l8)FoDDt?87*0!9ZnF7dDb?D+ss(v7AQMZ^jCXSR zu)aq8-nt!?|CYITxuVXdvk?GCtJBfX)vbRmi$(Ck*V0IJmt30nhyNM<>Gxtb|`SWmbL7cCXc!wWjDQMF84;A4x& zW=+7njgD0%3aE!iV2%9&Z$wp1=rNM!;h&vb)r`@@z#nN%siTvSBH-ggfdHEQn8%Z@ z@Kwx&=BSlV6-Jyp%q;5AUbM zq$Zo=e~<1VL^eW`6X0GF4kmg$Zt$=#EN-sIFFY}2f(@R!OPe}tQDz9v!zX{*C+e!0 zM*;i^(12%hJ6evLaVoq$iQuYxaBoymCz(39f4BQ^GI3Kd?pO$Yh|E{Tb!Z#7FOjJB zBex@LgIwk_+g>dzQvN++G-z|&wUhEDGh z!TAaCs@UAw-N#|gn&G8MGom1Od(n*e5Odqyu-Ve8xY~^6BcW14Gd^}H)6w;(jC;EgqK-k z1YnF*;$T@gzwxCi#j}@S@(gIO~ibSTwBs{BQR)lZrydf8!qt1UCc?H!Tnr76H z7#|S@q|$E$S*Nw1+#$d-rdDk5OkNO;-{g(E zKB3oWk?VMSeiv%~WL{|cgQ*q?panl^3iYr4*c37#K^_6t?Dmkmgqw~rktSYN8*J()g|t@)1hfi8x_xg!d+gxZB(c_D%KOyt1*=`4*SP!& z+35nIdxIAJ{Ap>4Yt+(1W6K*s7nlK|eC`_0ZG|DTG$4NfLWIaQ(TZkSFLs?|E1Gnj z((sg$XAAy)ny)VnbP?xUWv8{F1Dg;-$8qZiYTs6&qRJgQN?9^2}hL=*oyk_qv z9MC?a9bDz)wPpu5`$b}2L@wecC;UX~S%tlIHrNj~ah2$s7`PvM;bGqXcG}#~sJi!U z$Ja;fT?HHkd6|FmoXttM%%^R-c0vY*9TX`A&)sv&FED)~GoMA<+_J4UzTb<7E9FjA zVR#u(`ZotEHh-TADyS)%Q@v82%rN)JTeu%sEm|O9toI_rLXQcsulG79x`$`xZY_98 zt(VC>70K`?_Bnd@`SA9`x_V`14`Y=WX( zhP>MIotqJ)Kfuw;LA!Vgk?3LA9SRP~Cce6UC_5ziyp$uYdV6D0g5qLuA|UqUdm4l1 z@D;M+>s)7L*w=H;X}75SS*?8!zh3L}P|5K?@zKYod%NFL=5FX*j+Bn98o^9H<1=h3 z{S#_UsXsERh)%ANNiZgVeZgRUI=7P_n!*Tc;urC->t|9jmU-U#ahDitGw4yYJSbuK z4HGmw%CrgxCSE>v%CwxvUCyKM`v62hyT5@3A~+w}RXT9p{t{QQcEBP;*&+lOXL@;V zQy&L_00Bdv9!WuBXAfMB&>5WDSp=2-kha_c+=|AOps2mdFpM51pR5M|+t1EO9IA_~ z#Rro~k(9F^BO!sKtWDq9bSZUweS}27m1;&@_jqVbGmg01NPx{0Cyf@N8FggFSp_gZ znJgG zL(#?5??F8tuAKAq&J$aspF282f55-eo~qxWYyShu$K27OVI%O>;VW9|`hmxKvO#@? zwG{Vo1d1I>g$-gw{2bBenjqX;-cRp8P`^)8kR3jAeX5L=ommwDM$- zO)=YVUUIi4He99}rlaC&ngRiVROtmr7030S0xz`4evoZ*xdVuXzo3J8P(gcr}?;SN%QuOLB2k~oPYYuM2_W%DmNltEVVz%}aC|SjD7l=F0iPekb@e8*JK(!6{!GA@KKI6eAEnr;4U z>oKAYj=bC7M++yx>>0Y6Qwn%0>jUMX`uS9M_*sF9nK}2R4g4Q~62#gNRgP1))#wL8 zUOc!dcqR#R@bn6cHf3&t=TFzrfv=jXPrlBv0y&j$m;FYui+2si1BrITp6GdTL1#F))!?Gy4Z=PBx2lRG%^SA(Cg~d?T zk#B_oD`-F2mX*5y?$ymNoO%lk zIxbTGssil<`sAys?GiJ{hQD8nC$?jj30Hevc=e752!e`!?uR&d% z;){QsM>Ku_v5)-`{MUJeFQoDy6U2YKO#EV4{UwRm`H$mv0=T#19R6_{0kRN(`>gjL zzY=QyTfY(x|Fd6-B&IQMq-;qaeo4xODHLcZAO6s|r@v}2aL`a?)Zj`UC5V3IO&e#p zZv;e81oe&tL|tZF$TEP(7YQ!p9>jRa2mq+Vh8?+Ixn(Etn24K?05%e`pU{;c1ITRo z8ofr+VRH)p@#yS9`Ir1(!mp3 z^~?}hnTZ*Q{|PX&u>KqSiQ_-9+}yEB{Sb-;nqd`#*%l zt?UhLzgb)8+8Ywv+d90Km6y`BGbd(a`6pe_)ZR|k&{oLW@|(4lp_M%XJ2Ab8sl{ud z*XLU)VMBdu14Ck7UWEVj$$9>$lMxaE0-`JHO2!fiB@5#J=JIv|+(kh^{;!z*MdB^M z&hl>*Gwc5f7&F`d31Cc2|K9;)`@aFq=dG{ZS$Fd9)}Rz2|IZ-mhiFOs-y!t3>u&)z zhJT}282(p;SQ!5g5MtwC`7eZ6*jfG`2(fYe?-3yWe}TYZI;;w2|3kkQg-GmdY|>+{ zh!kU0y$U*()L}|d6^)#*E7n(j%&$~X5?}fGQ4ysSP_ZznNI%Ds`VzOY{hoCTW_-C( z(b(BWaOx+4Z8^E{a6ff)ax`)@S{a*sI^kpf|Np8wqQLvVywrr0LIb9OhrqXgQY=(x zfYcN|Q&?;zL$V(*5xxs%=Y7-x^?7ru*-$EakeZ(c=l+e4Y4c`ObGpIoRbWxP9sl|_ ztGGNrj%BtR0_^iYMOm(NwAFVrx_tQl5|U+~4Fq`oL-bpv%r@|Os0y6*H>+8XjHI?$z0s`%9rocC3lUH2<0rz4ZZS>{jFCOV~>LGKHaDt_q)V5ek zDXp?RJ^jWFTRk%xX$Jvm#ui1fEkm3TtggEvcK!DlN>PE6@Te3nT~+Tp%POX8hB|o< zGt9C9UTcM<^Yzv%(sKBx-QMTx)NuX1bK#(!daCweF{pa$+8lIt+n%C7T?izJ8j|hH zW$I4nF*1BlmwJy|eJ!B|tX^ajiyU6=w`+kGwm=j-QY*M)tBgrIDw+~Z+qQW;hx5%$ z(MVkcE%TV6ERDNKdl4Y#4Gr?6QprTqv&sv^Gjy_yKeWvG#(aP40QxmgimfUvb}1=^ zv0ERC;6{-9JL%-d)G#vC9M};p>UoQPJZ&oK5Ar+K%yW|iIL&W(r!cwECG!DbkQWDwWgF?L%W+7N~e3Tq_7Q|4l27{?vm_YK}n@5 zffTBKpDDPGrSVcK!CBEAZ*E~we#!BXQ1s&#(6*+9ia$iYo+6eCuB26Dfl_3mA?5xl z6o_n4!}s!N=d66ebGMlMVSiHq0E@E~&-@7)P61Bg6O=;Kg@@~nt`)RHyGyJ^>ypU$ z!%iyi3LHK9Tly=XV%O)F#F=LKDwXu`Uv=N`4e-heyjND24-9FHSvPB=eEIaOe9r8= zkjaTQeQWdy3JWU!BZT7o)@3B`ebC3{k<`un(8OqQqSI~&ua)=Xp5kpu6hj)K(A3b> z1c&CK0I#3-A0V+hqR)mbBe@jkLeC{#Wc1Th!T>_A48`m`xCtSW!G-ZT8oec}==#&G zO)Yx5>T(To+jG^wO3-xNXgpn)GSwo`(@Q6I!)W_~nP>Pb6$k(;^C%^v( zk7gOxMi+K#++B+mXwguhxO;I6kU;SkcXxLv?k>SYaCdFdLMd9@-CYWWllS}1IX`Ev zoy;|BKYOkF*|URsivgWZfy_^R8-ap}A*J=EL&@Ke4v@&@@)2H1Jy%t!5Mk}EFAzCd zLMQ>0;djY5mmO1g&+AW+RPbHDSiIw<+llaM?uQM z310ZT7(p$v_=WC@O*@I=_L!5{3T2OklG2o`Ljt=s0e7= zfM8kNcbM%-K8NrS`Vp11W6CG6>~f|;;tDN+e_|j_=MAo5`$&A`Hq^7a{8UsQ-TFaqO2L7>Pqs;X)26lAG1RuO9yCPA|@k)|Jd4#vRa5$V00Db*E^8y!tK1sUsf4Ew9>^0R!;W_r$ zOn@6sQ@?6hUwPoneh$9Gb7B`kmHr=xAY3A5zq!Y_;#>1cPKrOsq>WnTYCDDS z8rsO&(PAF3n8^J%B~M%LY>FH3_^_Rj!LFO1mo!uIsHOM0-u!x=7X4YFrooaU(s(G2 zhI#Cn7y~8fBJwR-eB6@q8W*N&{4Cf0+&_ByvWtvlyx#$%6Q$ zFUu@>^E{qL0?k-XZowsok600A)L7X6*u@o=jX^OW;!OmIfn+NPIYVkCd+Au_b`t(Q z1ukzqt3(H@N95*n*)xGHK8OBobGzh*dWPf^0%saZ*&d9R+g&Yj-K#4r{)CanLWtpJ zLYRu5{1x0dUKpZhYSxzD`UZzeIM(wA0m?_2d^Aq7werXP74KOpm!;XmfdZ2AY&wl- z+^&?kIF%9Oo|ldc2y;)sD%zDwyP^yCLU~-MzrEQ;?WN>y+fRxE>EFwmQbtLRml2(B z4k)k+nDIrCtF1?~sWy_Kzd@;gF4VA)(6c>+^6trgD;+HqnuhiutaTq&WbN!ukI@3J z2Akl)K=>9hsstVk^qd4!$eW#(8P#!OS=3hN0-Qi8hT(*#(*Av<0F(y9-*=S23lwj} zAq%yF(N?NR7vbMHuRAH~P}_-#7T&i|x+}BHAk8j)KOmunt94Fz>BX%5Qk(7y&R3fv zr%5lT*RQaOf!LN9RFD+n@TXc&zsRT8^Vc4-0CtGrIspF>QfvGBOaF$w%qSgD%KGtN zYek4AV#4U)qH05fsyOQ!@xvZJ*yR%|Kk$=Q@-);Ev1CHP6%CL2Q$CvG7hS5eAN@To zJQsfyAR)qx&!i~wGNJ01w>d?2+ZWqGv{~X`G0|R_o`sWaxTLo8Ix4zPIo6guxn8(~ z(xZ-P3x!l7=&GOFlar?)wqIm|(%-LpVhHAO`UbF?(ESGN;Pwwc(Pf$DOpND{Lo@9q zWEBbPgxAe;F2u>}H!g=#T!g#uF}Biu4wXVx5uAfQswG9E6C-(2zeHXxt4rprX$Y zqm5=#rDOc(zR3AZK~NNRo5keaEix*LeZO`^gX=T82*2y}s$T^Gf34y1fOogqXN-*s z80zpi6b@WNLiZg$)vspysahES>&aA{R6%7Y{O)u)W&c^!2j_Qu{@L?;4bA&oY>7_3w{=Ug!wL_*- zOVRoE!MWG%M8VU$pDp8R`(k~)>{$(cx_Nnay?hRRV1~30hu!(K#rf*PW6#p*!E~%- zS`JuJ4$Wu~;VnEl8fuIp=PTi*cQlpwkKeApSW|3ozh06Kc+te`2AxKlj2XinJ4~c8 z8K+IG)Xb8RMImB+ zW+R1s@jbf@p)S_ES+p!jQb&J#^P66#!b(!+`-&Yl%G2$iZm7c1aW&%%(xc=VcmED@ zS5lYgos2jT75Pf4N<4873E*XVU~?>W)^8hWV|dl`kMhHEZ|p0WAng9Rs63>r2*P~( zxL=T>u9Rx>{SyunLnUUDu~!a&DmHf1)r+h1v9sK!&KHJ@`^@(ix=~FP06>BvqX(8OnIcLZ}Dh^Kgs9r zi!5guATPij$ts?!!nEkWa=$%ORqg?-K0B{=XGF7mY4)MDrDGzly-NJ!P23W;alt^5 zj)O|mQCRDmpd$T>cWZ+a@&pD*9yuW;vc<09i%XjKd?IwCxDW^Gc{q(q{jTe-;!G7b zfsI<*R3{DWM=n>lzZpAr3nI3wva2mI+cEfwzO>SNE=i0?N_VqZr?9se9DSu6iBBt~ zN?=lB{?_4YkatX9O1tk|1%t>ELzmcF?EOweb)3JC4bx6U%6Eqm+`V|Zu|njI?{S$j z@8(4wIKk&54Or^IAE3X(gghADC{d;uI&oSNYox_zc}@t>ZkPdR>BOb6B5;uA?$`bC z9Rd89<3UXB@vY?v7Y(@TDXh!mGiC)Oi`6JX-#-}96_Ctry)Q^*8H}iyO&neAbUm%1 zrSyw7fx+1@g_-(N0+18xzaYk#7ut|&0HgUa zdXrmeDf6db9f^atKkHZas{NjQ@0G#y!zfIyqcE6oopnqC?;!~X%P3QGoR(nMUoQ5I zB0b|L%r%YK6=X?5`rue&9X8yYtwts6=Ea5N(3{(xj*+8!GBb{oim3;?K8dkAY}4K1@F^+~3^b1{Si zs2dj4t5NKEM;BHQ>^WBsXRa%1CqFx0FR|jpT2W-=L`$Eu+pW``ujv#a5{A7F$a7Rf z2j#SZ?~v&W#OH+C`$sZ8ohfF7Fga;4EMK}%fx}rcUkfdvA^n}waey}$E9TTtKm5O1 z`;rlXPp6(cLar8*q?#?^AFzw^NzRK));caq7GU(+^%|N6s`;3z3|FPN>WP#g85N6K z8~>8ZN>&uXGh@LpIHPyD=5Dxux{XV$bb;VXM_l{~3Ge!X%opxP7DL97?zK5|_}ghs z4TdOzlX$|$llZw;261-zY4+Pk);;{L3Kn^9QI@dUa(;ep`g7EgPin};NSHz%$&PeP zRQ#GNvgUk3Inuv9{lZ38CmOjV`Fv(4?fimLz52Zl5(}5Ig)e}V20(n&gf0RDzMcu%pnNR2< zGtz@ngphXOgB~V1CxRfo$1-aU16`ak^;d0(crrz|cIF)6?{uc7wSF1l2I5i+Mme%K z);E;y?J0KK@u!zO934&W1+3EA)^r?1qp5y*8Fgw2MJ&B_v*D32V`e2Bkdra0w=5veNq(xctIze( zi+1)8UnZ|c4IJOPw6f_3;MHjJ)+>X<@S&#H)Wei+@?^Gxm}(?|Qob) z)wH}UNIzpE$CiK?3mR6-4b(7_$rlY+;WQ&BI5&G^VMA?+9E?ZPKlM4&Q8h}n3Q$S! zwr$_f1MzzYS8=GtL0G<&uAIm30b_Kmq)l?Lm89RaNQtoBD~=Wj26`j$C54ot@q|@< zOSPotGAT(^0w4mpZq?M~je*^!RNQbwuV|MEF+%mTMO+C1ya6#?u)l$4WZ(V_BrBXW?5p0-{S@8;k5Jt**3K0ruAO_a}HO~0T&x_z>>Z?p-Qe@GuA-IbAUtq8+ zZETQfz}uhqyf!#_esh!Xh}``uv0*ujRXk+JzO{8Cw?+t5CCLu?1Bp-PXhbJzd`y6t zf7tO^8`__|tJXHd2t~&wO!cr@)ZpM_rOy&-a{uYUO+YV_D?@h!tHf5^!PE*Y7*exH zL4bM*)Q~rA)4qo{IXj~%%&JT&fx^7Gl*K#PI=!#_e8TS{wj#X)e{JWXF9Z9Z)G&Y( zdDoFJKGi$+{!>d2R#KLUbi5mQ3XWEspF8&Zd3U1gN*PNk%8KjGPFRpi z2eGLm(g>}-2>2qhS%Hbb-SiLMCh{Hj8M{}a!bV-R9`fbbkLZnWi{;|U?r%{G`SyHo zYC7*VCFeF6;oTVudks2Sk@ml!j0}?(Ah8`C3Oy&54GkG@X_k`;zugX&*|Zt`x6)@9 zr{9=Y2Uq574`*NKis*O&%#V1(bwy-L>IM9v9fy|?f}Ve%t~!u_Z*}x;q((6VtCtxq z`7ZX3PL+>@B;&!Q#xBqRVq>OC!Y1$u1<*+&B3tXZS^h4wvZ_T_tGLfZ49~`=cLY_& zBUnjCKf&>C&w>=l_0^NEJjiD7Ds7+`MLk-tg8f+$6A6aKHZ?bEYu0!f!`bsC*}|bE z9B0@ir};z$f|QUD>aQvy(%oS1|5F{~<9M!kis)>ye1drQ6UH9_|DIr-eqUq&gb=om z-iB&q0#9w^e<4>5*u!x&!}o(6Y0u6pyDAa?5hrT56Zdoj)T`kMqWP8riIBTaniRq2 z=O>RSkG)u3q6_2)yfIl#u`j7m#>B2r^2EN7TodNV)x=gBVK;)U+l}hC{v7Gui2$$F z&igOQ83d#|B$zJxHny{jzL7E5Aj!0?^miIT(XC8alUQ;mvE=nGG9-{9{$Y!wJb3x< zxiZK;mTnKlF(=4{$#avxy%7I&+DbRSoyqSm4F33O6n(1vO?Mz9L>qG*rZgcP){3rw z!2&7LZo^p5eO^uB=Ke2P^Ji;&RUrBBA|Wazn#ddi1GDf&lO_fcKzSGe^rrX!U>-QLn zbQfhrypcz4R)XG4O{*xlO;U6rYy4fxxlp7p-K!CbNm~F$%(p0A2P}}QOL3N+IRU=~ zrztN(ij93UK~&NGzi8Y;bzj)d3JnES(l-evmcb>z;bo-;lmiYmF-cJ6{N`K zomtf9Q9?EWN)!OpbB8!=$8oVMjgqG9$Z%)TYVW@78WUuKit80#Ao>$q8q~jGNWY)} z7bTlF>2+TR8Yho{jf!h&3$u+`KrvlQoXt?I@Som*R}er0Ksf8%Aj~qtW~8RVxDJps z_@6ycdtxZ`Pz-zTbx^-h32UrWkdA{4*xu=#40eBPAnlrZdg(lWY)LImmVjF}w8za$ z&JPm>BeIM9F&j>0N~l|#EeVcvV=HSYNQEx>|A3sgNife3!b3^9v&WCU!(H* z)!Jh~0VCJmK{g#$r3Xsp)_nR1UPpYmARzH5@sH|nMY|DDN!hth(w{o~pU)RmMd^}B z)MP5d1n?@g0Zp}y0ssC^=86;d<+HyrsC<6eX&kHNaxA%r;}ApG9}Gu9xrpP@8F+uC zK>$3oI>d^`5f!mhUF=# za@>XxMBq_$T-3_K<1XY5*9r>~(#ql8kdD?(LZ1CSb;dHoQJFDNa+d!P-i!b2WbS)} z3fi0zKbEpjAs3bnYZVkByN!1E(h+a{(L@W48-R&nX_yT^+heZl0?MgK+tOA3j}-nmT5Sinj8uA z*T=TqUn=g4Ghqf00wY8K@x4PPWloH3`T$^#xr(lM$i6D0q#3|PQ zy~ZN~YG~^v(&I;`4LX)LiTLBtln>`JsJM)4t9sBfT%j6yL{g`C$Otf|Y*SGqfheDZ zj|^X3slnu$BiJT;_V1@F$5CFhaTQJ%5tumZG7bHq!Z(l`Hi=^J^WAFfe)=zRw1&`EjSwH zSrGUl1U`p^Ve1=YR`#wKeZ=G?rM7W-?|?UTe9Ifl;iW+#_=1RZbz?;iQlppbqH zbBI*^leEI!A%zPsZZh(>qO$l#p6Nj(07kkfaXyJqG~hsyj|f`y{ug#O0Fxy?)ZgAy zA9e&+bew5&R`tIPjEHE9?p2F5+UpA3zTUrAY&JnXiowysS-Od~rtR;aK|eS|ip0Aw%soj|ewT(H7piSr+g)FR_O}8Boyx1f?M9tZmxv!ErtSVHS*;uDM^IUrP7eLV>ycgXgH}EQ3yBkPB#Xna z0~iU-XPgR-j>ehEhFdBS{ptQS{XE5n0eE>PEb9PZ(F*m)0NHzQ)anLdy;zWMr*xBb z`HBT=3GQq^iSGk<&B--st-g2)m>?H!wNII)xLrqDYh206{Qjl9LGz$?G1B4FZM+`v z4$Z`(Bde7P2#_3%Wk(wLwyO#WyI`^jO{zbj|6S0;vi}9`R#iX>4R!J!Qg9&zLJCqE zNrep|gK;UUE;K*6AJn(NeaH+)c9OuxB-t$(i=echCJyR@&e)=KF#H>pqG`!%-39KA zQTg~L?wP%T5WNnstc%1#8mUut4q;$_%F&NEteTzHjdD!78b+ zpn0%emK?k(U;(fQT$~*})UOu?4RJ=0dM<~}6mE8@>diw2J%7BiEao%bcPDATeAIV9 z>cf~U>RG=DA8Jl)iXy_0%z)_HOd|m-EKvEt;6(S+={fs^PKZj9re8?ht9f3!U!{^q}3 zhNIQG!tV$6h+7(g<7G?oScWkUp88#VB@4s{XE#`qR3DyzDD{?Q*5dH;n8fXKLtG8oEz$%*VLckGPfH_*P{7jYPU{`-%f_gTK zylTyh@hUoSzDm10HxrOH_KpK61uAU*DH8I#+>;jFSAK+6Fj&v&M?g6^`tiG2((7j5 zV<5){YM0|*zv7~7KmPpnYXF7@j!D6|D8m_ z+wYz+$Y`Z|llpxkjG2ENxqp&*$pj^ma~im?a%JH!6D$zBoRq+^$tVFC6<<{OsFcl5 z{ut#UgtAc5z1Z3Zih=;9AV=}>J~?0OM(0EObPKGfWempI)F-B&OQi2&{B$HaD5`5i zMy;ikN9}QKc!0jsx2)Otaeb)O)MIvJ3YbHgdG5(e5*6dvA9Tb2ncEy4N~e$XFC^gM z1-+(xy}EOW(!EEk4Q@PpimGrTzQ=7}o(dNVrhJO|*7aKfvenrds44Bz=qM2$>d(z} zp+iqBiCRi%v{&*&*f`ObluN}zpztJ?8v4ZX%Yk3JWi4Nva5HIRt90RvKp@WUM_&R8 zDs^M)D(b}b&8*5pcy-r>00o`Ut`S_;A(XyDvk_}g0re;qIHg-vaXp!Q%SX1O3;Iof z0jX*WR?raob48DIQH2O>)%`rs`_zpWQ6S1jRvm1t(3R-Mdm+d>MB^#+oi>9=%S!-# z0~_Qh5dTYp(hH|6tvZh86Wx&=4wt@qUlWV?3F!S*qH)~sOR4_N)EF(hfm&G>XE;3f$mDyQ5kW<^Xlgkq!-fbDCp-jW9C(k)kM14T(PqDFSDHJE-^%(z5 zeeyk6f`a-X1+~VMpM>ZJamFI{O=m&*iJ8VV+Pl@AkI5(PJUY%9xs+4ESTE2I;n?&@ zU{OLVLP^GH4_rsr3cZK3&)i_*QcWeQ6oM@O_lgGc*({{zr~X7#H0p7;$Y)z$XtQzf zo(qB1vRjDY?lD-lkO+EXGD8i(+x5x%%zlfnKb?;%HB>I$x!9 z;R-X04g7GM8OcFxgbiX6xSYD7#6x@@?jn_Q;Qe|?gpEMKH0?%Wyv7Va$eU_h_ zg^Sj#87pTyMnQ7qUrAT~SzpVt|G77S;`MlTy_^-ma$eU`%K2b{n-s z*zEuB*1{KK#%YrO=D?ns{-exC86eC5%=`a8t-v(Z0{VZa4e;&?`D#**nuz`E0K1F3SZQ9h{}R!~bvS=Kma;_*)BJmUw;E0)xRCmV@o2^}iUW?*8{+M7BY_ z8Y823Ec%|)T%Z;E%3CoX(B*ssN2>g}owIpEraXIV0H3n78PC1hPJK(+boe)W)LSG* z>~I4c^Y_Qn6vu(aU0%VG(^yq4EiEtK(sc|(KT|fQI99Nc6`JvX9*-W(K$$CKeaCbg zma6c+UNtFrP&I|>{FOp+H<>859cLDMQAJPDwTnpE>{e_=b1VV`h<7t_zm#NE*1A7m zmnX5NLHlB$t2-(>Uvx~$6+cKs8t}i8;<63ZmmK&AZF|_-*sOJVhq6rDoUC>GegIg? zrOBTEKuY)@^-?gNKODOjNCd_cOlP002fm^z)X?6uRVrL?5Q_fa=}?kp^hyKG-m8IE z+Fj8xOKulu%GDQxdk4m^tk6IFuTqNO&S>n~xor>_JlFgB67w(xIK4YvwqxFzYb+JK zUjgF>F zMq$(n$%&?_d}kf@7+~`9wn*dIsAx)az%E_dC@ft5u86)7Y{dWl$H4d3Ft3EIhE`Gc z<9YUy_?AX?aDb2Zc+D2e(>pm8Z@O0q!$FwUEzdDa9BEgXwJHajPs$ zEsLM}@39k_^7WKiMb8V}WcgGNZK5-ODg>uabTHN9M>~AVR84Nm8+<%8Kl!qL{HK;s zNUwXf%R9v!##WvgEWz44&rqW^6}R1S4?JAkKi(3HWUZe`-7+jH*~!isTorf;r)CUr zz-Vvr##W!%l{1BP#fmnU1r?Bic5}iN)}Q&N8;1Ivui^2eY|265$SGfd$-p8 zX{CtmnTBJGk*M?Ay{jVVJqMvcXHhm&B;!S6QCCRzUyh=6=?{=(rA*aL)K4GkO?DGv zN%G}-)hq5pN2NvewbC+@2HqRCy7yPNRh8tI+1T19@h-)$_68Q99(Iw`1ox&Z zb5E%n9~NZ~G4spfDHD{TSZDk-WU&3FOnp7{@abEB*&^-D6I`2eBVN8hrOGh@)X?S? z0O$K~`3?s*&fV1^El%T}Pvcf1cY7059{PZ~CW2pm#-Nl(!v85ny-H1)k=k)l$ssG- zyXVKB4O@|=;rNoWi}*z+FXD~2WTlPzjxpu-xCi6fT;`XpPI=93GDqX-%eW)b2CJk+ z7wn#4G5g8B1EhFgvA_%IA|(T@E4G^9S+1-r&jH9we(E2>?YA@^_MTD)et;hKBBkAy zPQ**=RPn=(=o8*zP93V^Q%%1=JW8d=P|Fc>P)G=4v70e{D@HFH?qRe2p6m8go0@~4 z3Sjnzknt!iC09A@@MfsIL@i64ux5s;;9IFynflu2)ka+E49SKNrZ8nZQ_UtUQTpZCPz`ch7_p?1Ut0@$g)o&m{~{R@b_l6CTr#@lvjnO=WM=tR#`E z{Y)akq}QEDXU*-asLWcVsY2;Be)Gcz-RIv?CHbU22X>c4d3+(iFzhU zXFi{~B&0PB*c~MM;^uEmvJ;;9sw>n5|HVf-e)V_yvGFyrzZlY-kWk}4&_Oi+&FLu| z%>oal_m^0xFigfhd=lDCJ08Zsgf;N zo6R)-^^i=#xzbW*|2j_Ydj^K^=0MVL)qPd9bvwyLSpOR|>md6ery$oiVUf%6ap^h2VabE8ENBum$_U!a~MZ*`cPpI>Wp zE-ou8>-YuJtJ*cw8O*QL0V$-lsvU~oCZp{#Cf$8wUF-_a_|)H15Y-K49nmkg>y>*9 zn21K!1EV+FZlD_ND>;1k&7aW|@bW^*-v6D7CSO+*un}7O6H5C>U*`|4`2$G}mftZa z9WTZ;!LZb9pW%j)lYHB``0cc?BD<^EHBqfa$0v)J^(Xe7t-Ya6rOj&H&0?^-WM^5; z>Xc+D#-6qL$D$)t2+2$jg2FX1kTX+IA(t$RUDUqX$HzJ&sMajk!oUrzYyI=~6^zq| zFp4mVFo&>=u!*pbaEfqUXU2%A%~hV%tw}Ij9Ep$p?)~K9G5W};H~yQArRK`(NZJ-| zA^*N=4`_N7o*{Lo|MA1EU^#uI=j5fkzW=IWbDvB#21aBs8=mgr%fA-;m#AC1=T&(_ z3I&*hbme(~RaK_*gqS{^o2P7THD{t|=}X}mVRtov$5o)+9R9o&B}tJnI& zRy%X&s-Lo5sJBs}y>r{5=`^Br?}%0zPtXmv(@9gfmA zrl~+|saGNtRq5F`X)nH$dgXs>AD1#(_SEk?SK~yC!61;P_RwM>2|-LS8(k$j{@ahA zW$(24MnIt9*+$FBv-O@lEBn*S+dtGhR)2n72EMw&?LF!!+E!%PgI3V*s(t&Q`B$Z; z0jTEOFa_Og7d6gpLTMmW6r#6lMwNS#8N%a#W261X@woof)+y$+YU$tPQQ-NyP!W)5 z>?jauwXEy^+x?jQdYd__fk zs`Db=to!E*3kyq0Nw8qLqN1YR`Vnbc`*(`dr>b{at07B>KiBHM<<)e9cYIk>bNJvT3 zGBS|0S3BH~;mifM1d|R}P$~)+smS#3@7WY)brV$;k5DIDI(VHC~j$UXWfeAc(8QbFd+-yAwuIX2EzPN$izSk=AE*&Mm35)eIc5ZaeJ|`)F zqKi6|G>$8MbG`teB$K+`d0eQsTRm|{#GhC}$0<3c<}NNua&l;);Bol^xE(!RY|128 zcn!ZScx&OP<{7l$h?D`V-KgvG>cwzlY{nN9{KF*WUyFxxjAlo^->!r4~ht$;6 z@$vEJ=jVoo1}XsuI6X$113bh@`4)!9b3$C<8YIFW?dy;>mk{%TEL@*6VYU6}%3*iB z8}?{KS$e)QtoJK+g-+(zndXJSb3>n*zX%)ko=mgFKUm|4$)zrRTF6(JPd2QQoFArs zQ|E{^2it8c{wOT`cWW@_@bIv`y}h)wl#h?^gBI6y#YnJ3nQwGfcs|XWgPYCB16Pge zo`SJw%kQdzc?||+_M8PfRk?^~q1MSyhpRQlq7D~Pi&Xti|28dj)5E2^*B_5g_t+@y zjlA@LrBGWd(aqSPTJt?sv8o)ucyaQ%vGOY4Hlz5csHlVlb!FwBqoasrCVwm7Y4BrQ z!&0PT;jDt3(`cpFf4MR+&|oam2D{<5UvnEs^VE)J(vudz*dJ(ygN|E9Xz^NZZz1s|sAWu5x=H*C+ZTJ9Y00P<@+BKj5b-+*ec_tEL8>&ZerTzfc&SXfw) zk&<$yRJ@f4z(E;w)2v_BLQP5%B&V61FA-4Eu`K%&;VnfLGr3fw;->w}NoV3-lXKTE zO{Q{boQ`C_sCX&+~jEs!T%;jBO&wCR&X3V5KzE}juxjo|X_k~N@vA*iSr`5$Tzxv|>^Xd%9 zx|Qh%OV333j3~`Fq%0_Gx4dX!)z-hWzu9QrC#DU68HcsH7vw9iAleg%r`gq&=f|vc zz`~_;72K5jv(@ACb6PSoGFsY#q$CXx2xMsJe}87^!9>clc7L(?9YIJaH$L9Rc4?`( zwrB;fn&R#8E6z&815VR0P1^M8{Eiol^h}GBqRkp9Ko@Opes-p=cG^s&LGvTqOQz#Y zkV@*?V?d7_evFM4H;B{S$?4+mPCVe*3j`urR{XEMqGPd`J)f)8fj4g5fv-LHL5K%N z8uqH%G@Z4%Ukb+#ON0?lohx_u3&naYZ~0pJyw6~$ua=i$9XcR=E#{dsHfD$SY~jTw z*)e18>dhu!0Gzj)GU3cV7$9g%*<7H$zJ6y%$KS`t@bGX(CMKg!kLtFzww4w$3@kw` ztE1hY840u!J-+ufwts5==fNTp4_23g#Jj9_!aVo(ndD8)4(RU8rIo(gmhG?|zlLt? z|DHS(sV|`?x`qP?=htFQms@gfDIIgunz#qDAstrxlvQ5n;p;pWE+yZj8fE6>h`>1dwFiki)Ud}vEW?@)~;Tliy99Sz$SOj+bdAG+0 z;_8jlcA#E^x-X}c zB)AvG#KiRWzGm@QCMPF1G&cSm8(XjjP3DXFUTjF&+gGe6)fP2}qB~^f_;on1TP;czy8(${xA%g@(4h8Wn=V`Gi!{ZX|ggh}lTY4~4Kik&H z4(BOI!GQr7jI7G8QeCqNW4c(^c#>0GMfPYqg%TCHlpc&N+FF*rIbkSJyllS&^MP|g zvuVC+m%SPVi6PNQF$ytvB1^4E5Uh4eX>q1q0`m%lIl6l(@eF@DnI-lxrx%rhTU~8>t-xoamfjij4-dDrW z@Fz7YDd{|ARgFZGE1SPUs$gn*PbUh>W=g9}A!TCEOPOj8H8nLnGo)o?wzsx2Cx{_9 z$nuD)V*Y<`;Lvn|L`Vglo^gz_z7+9j`T$W{XvQ8Xd|QO_<_mZ_Uu;5_2j+9BwI|{bW_k2RfwvZ;tcMEyvEcH&7$*a zFYkCqsW3q<;x2waV^6*HSv@rUo3@L=!#a%Q455D_`XmzbMzi%`}s6`re*!uvn!v0JXaT7@G~6`SS{L;jHBIVFW86}9IdJMm6GDiPb65@ zd)@`5`T!%y;8r8N1U&%^A^;;q>sr4L9KcggZ>4FH=RD`#bJy~71U^QDZ64W`25Cn;ZaL+U zIwOGaqOIejtsR4vVkf36&MFp0d?Nsk2o?y5Ncf^&f!5v>r44z_diHTFv)6)wI@KNRzAR*Uz%dM8X(-m5{0$Qc$XlG}?gGJG;j`|={ zgdH7(K0dK{ag@8$?bp`kyCB*E?By2Jmpdv0={3fS`}N7ABO^Dralru5(~bU5=#fr* ze3NV4;h)AEb!va7u}wNIBJCTC`P?*g`c{R@ZltpQ+7k4S!Uz5$B${j(3=KVXkD~o*eYNY@QmRL&&6a---Rjvi&q)SYNtc^zKt@ z)~v;}jfDaR-)drN(Bt2(u963wbe7kiSsT_e)KU)6my(zA?2ikIhMMsAl?=+0<>d3- z_UxQy99a^Y(+8>qv<*A0jX1_E$q{ZOHN7`H?Uc@?n7GR`)G(CFhfo%c#YAm)4Oc|M zmIs$m4KbHe>g3N;*FLQ4u6lZut5G$0VlafM(hxH~5N=GopZdPvfKSc1Ep+>PHja>r z9{=8WsdsZcf|I(J&Jox0DDsdhjN)U+E7Ium$?f%0U9;2Z*~6+*ztSutWaH)ww~(z` z)uz8Bg6!Y&TY3}-=Q@e;zM!RoA?LnPR}}XB1m`3(vYVn)Fh<|`s)q;h+bXSG;`J}< zJiz+2fdloxYuT^!Y#h93&<5_;J<95+_D&CXfAl{-&4G=zt7D@*?tG``KgrMg=xfE) zsZd}OXtl`xZ&BYu|7`jvRERj}J|*-{Zf8dMV(y=#p^G;01hP^ByPaFS-)>w#oK!qz z5TE@h=*13vIP+~#eC0bo@!>{l$uX|cdA)}Wr?ee(GAD>RwFLBNqv}YtNJF^!`Pb@A zBO@b+>rID?ii@?hv{)e>uKV#Ql7pQj@o2Chgtd=C+g7`~d}(R1zm5(NSiw3Vr@dAk zaGHgA@NjK`m6#LVK7p&tYOd2>?$MYMUDn9$v3KNxN8rtruKj64Zm!K0(H<;1`uWGF z+JJwbRMhUWc+Boe41N^~hFAtwa0rVSCqzZH)(h2p)!%!rYxH@TJYH?xxT#IIy~k%& zTI$X@`h}(67%`qs{4<>74QY9$TwwT}Uiwerhmte@2h z<7Ic;c`GY(Aa^@^L+M?AbTJ#ZGWY1=?zr_ujB=6kpFG3S%-jiKWi*VF*_nD~MY@Yt z*RJaDzYJXkqhKOwl@2SWk@I()j zDg%@kY&Y>oat|ZR18wdr92+?2+&#K?{(i2lx3h}wk7gKyB;-)HSsEhB+yhyI1aqisqtm*stS3`grL0AA(Y>+k^$3krfj^r*R za|{s%<{U(VwPkkB8nDtq>k`p@J;ivY0w(UbDS}d8iJkGl?rD9Bhi~K6V`AF(3UqYV zFfjc-_s?NKg2%>gz*mFI=jpVB8Q=Ah9{7WvDDBo{@N+$3AP&o(cx?jH6cK!AH5Ci>qB^ znaGCy$jXYOZ{byy0M30L#I}a3zC`+QM%{9C>@4<4M3~3v!Ag7rGv~L}j!_cAW7A|_T+`qo@+c7eLn0vz7am&b~rfpaj-(swTZaq&klY89s z4HYrWb5~)BaE&*lHu7TAcrB^w>)CfY6#B+R`Xxz|lgG;V+IPe*T<7oB7s#|p=H`N|Bks;JK^3OEn5ikec=+8yi*T zM|JMB`?oc^Ul;#4B)y7x-_YYRwTN5W*lMf^~HlKS&PFVS~WCx2LT^ zh&6_tNRNq;n)uX$^={U=X<%J#vTuxpfB$|Mb;=Bb;+qQzS-QKav9g#^OT2JEh09!C zuaq~fonN=GVF1RnCC0xewTZGZuy$LE!`tJ>Z{PS?u4H%XJslN zfZQDJkJ0!0LVw16+Y|=rVnX!uGvpsviW@Ds+E*!q#}bi2TAsCezEP-voU}_KWYPzz zX^o}frO?(i2_|))yRfb>d{4iJw?Q_#zqyZq9*Q2)4oGv&q**kJYY~lz((1$cP3!G- z%2ocACaxx>O^MjJYVhC?5N1X8IpbD>+1l_!&`TP$5Pt3z0uKmkRlu!UxQ zwrYOYf(O-vcUACr`#a{yF|=y$^vzi1hnR<4N0?;k^PbI;Jt4VPon*7r_WCn*&EX|^ z(V4fPI5G!-W5=YiFZ7m51SmNuJ1{5E@}_5A9%2(G+5Gi88X2^xsOSv@DI^&a(&1cO z1Z6P*-#$D)egyz<06#LblJ*U7v6g1)-=m-!J^da@VyH|tw>&>vNXn`P_2VK0^ga(9 ziiA{(|7DpQjx>YuP*M&E*b0mK@Pei2l-?nwDVM92qTD)LU@t73Jl@Q#(g>r#S1uWO zN)%G+$d522fSRc&AD@BN^>dkOn!B$-7Zpsle2q2MDopVg{h#I@2QUyEPnt znuu$SZ83X(dHAl6~*^)c#8Oi z9bE{oVaRE+C8&?Sk~V#v6~<>W3M{B5X40X`)iaQfeiv5xezVnEfXy%nZ4 zG@ohiz)BskCdAHHhj?~uSU*?w@KG691$emEpM32*Z%l6cg6 zz-JU~%}eL8KOuG_tlr3U6q_fSXJModQ=3cM%rDbgN1}adcb#cS?q-KpQAGMGNDoRW zLUxxnqhk&>U_8>#aHN22xu}45jfDe74P4;i${mp?Yv?i0$vh6&v}w00nBBt$IVqm6 zc4w^|^fdY^nqzv;^>rhMBhOXDYVDjWhomQdQyo_>$&ZPueExx@eHLWUh@7^2bsdKS zAovnddReJ8OuJ*$%NSPiPHi>g4OBF*O%VOUZZ$hFOJ78{8$u9;3fn0W*`asLC}$uv zH+LE&8`#7KA&MttVSZ82vPXw%YHFHcK}DZ#3jfCRNok1?rJ7kZ6j>Q>RtSOB>BJxV(OU?rw5v za&>SUg|Wwi3WA5}i4`5`7Y7v_3dn^$@xu=P{j3kc4n8I*QZ9i>hNaCbsq6V*Jd4^- z7D5EbKp{_NLHLNk;3Is8VlUkK?MLX!^h$gS4HYs7*CD4)*o#kR(mtBD9dp0veN0=; zgfO~%=h=x;T3{^$=bG6|(|tL7A=T}C2Q&(%sBBwJPBADLjBf)p8vQK$HNv;CW?yhl z9@D4N&8(Pf^1p1;CQ?col?Lh+a02^jMhoW-POJb(1HsWp>ugmlWy4!(|5ddVBK`~V-#xz0?f{$A?YnXVC-U5thFv#}==s${u-7s758VG!4ysM)* zKIaYA)5At=_&`jOr8&69&B z_2HbFRq&e?t_QY#Fe|_W4!%w!TeCJOvSA|k6ASK6UJue_>W&X$4xMl^LH2KJ{MU34 z`A%i<;9y!pXrSoV;Jx6v+Z=`o)ky}^U=nr01K2U6l44{?@MlgP_P6XyN7cnDV>zb| zK(haB8r%A3a|0Fwt*jzmhhJW`jIocS52Y6ct{K&!(T25bmqBHt%~yG%1KxD!IGw*1 zra2f2d}+0Hao#JGcZ7d1bnix@B+P^aU{4x?lc@kFiqNpafP@=ffaM*Li@{Y`u%N%F zt~N_6xTrwW)~Yj}F6Ua$^YhCwvkNT!s=;SDJN#M>&9{wv)T(R8qn>6PqMx#Gz#d55 zK(_;>4PNp_5Ch{LH1NCSM?#<{Dj^#YD@rAH|Ab?Bliv2g2?B}|r=Pl+Av znedpHAc z6Z;^m-;Ckxmk)D&YO*ZPBS&Sgwchu1Fuw?FhN-CbziEVL9CF6D$7MO7@_gDiJM?7d z0Hkx739$mcP?AEdISDCd_gjVQ`mowBg%+VD;Y$+KKdRNx6>X+PU8Z&r%|Zi?-7-;@ z>^x+1HV+gp&RUFS<^6GM{3G~xcSahrE`P0&;DQwD&FvlQ%P;a7SoWXaUR%8K#n53b zn#P@e=8cSYP;c)S(7}LdpcpJ6%6!q(We^ZK*-cGv;quoqgRdu!OPN^yy*wR2v10VR zyu=VlP{UVKI3KA#qCbidU?L3U@d20rRD7!K|rH{4=jj^ zewxT1A$PU-f(Cp-MASWZ9LA&&?dNU6A|V+LqWZ?yzDgS4WvcBW1uMAM$R2u}H6Edv zne2cGF+W^JYeo3_i{JsN`QJoGx>Z%GBdY6#{K}%Cbg1&FFyxPX@@N=vZ~*e~AK52a z-4`+bhho>HUU@biUKmK6hQQXt7yRzP&EB1E zsoi2#O!ybl081MZz}e4-(2ISk5~kF_IUh29kJMka&7vkI&k~pf{Pyv_ZhJ<2K3l!=}Hq)y8>Pzec+g=+j7l&-;Y> z&pc1w{){zDr)f%Xn}tXYY`LrZn5G8Q44(1Q{ENEohA)1W`cS4i6X05oe?rBoKHf_$+lxv$ zRI%cJVNwM-M15Z1Q8wE~l%4aotwrTDCt937&E4q&Qo*k4W)l6bSs=Kq z>@!sD^ZI%pUhfsHk!=`0#F&5D!%xSVwKyTPgrE1^a|a(Gfy9X9G~y_8bxvyV#k9Lw z+fqQWx;%j?qSigY@_FlsN(5pxO)9MdRYzdej>l=@Qz)qtbw|4D$?YLU<8=y%p1d5S zuG}g&YC2?n>3w@eBFDH@y@xZcl!V!jVEj@2?b{z7lLvpOuB&}Yyh3j#At+6eAx4k? z`&*hyR?qz+A{4`>`feJ=%;0lmb`*gW`&x5@6YSmm!k$jVcG}y3%`ahY1ld^t| z;VS{tKxZ(mBDG}jsrZxiqM57*WwM`WXFjP!u)^B5)u++*`=v37cmWA|BoqjcLjd&b z{Q0q)tdR`Oq+*5AqcD*XM<8>>U?t>wXAnrO>~8?s>Kfj8Ctv!DOA$6pI$o9|Tvk7m)ob%rXoETB7%x3yWK<+S>yFq3!T+C`z=(N6xIFeyBr;AdHfgzSDEw z?$uqT>Ck%7_QM}?d25R|C}wk4Qp&^cql5Dy=j(4!gM%Iwz1bY9FYt zvt1l*!Q&>%Vt0VnLBZ-o9HGPW9IOcprV&cNgO3zcqE8h~forw0PsC z5YV*eBH`zK{aLMDkx6<_KIchE-f-`aC4UwBRYcXN_ zBF(ZZ#o9>ue#*1KkCl3D3svypxuW^7%{w3>o!^gn$8Kv{!0S3-D}&eDO-}khy1G}M zL~y(s^F8|1j^I?*SuRyAkGsR^O;}`i+7t=Ed)K=sHF+MmKB*OaIFjscWwpsQ%`0eD z0C@zp(&Bneb+OWyV70hyW6k%*BlxCgkJmIQ9J$;apWXcPq6Gu3{AYm*>KCj+2GutJI|iIWtLrvQ3nQ$qPFj}tcX=!2!I+9i9pAr7M=qibY{oCO zG7t=_$%wxo=aT}}Ksg0xDyvVP5|)JgOA|}kr@KYXS$vLELyzU`?v{}<$YP@XOw5Am z4hfXGe=MYzub9X~Z3WuWv$*r&){#b#p;V!}`;o6#$j%h~OnKsPs(C>(&Rn9h^8+Dl9W&B~!6y6U}L^D4Z3pAq|zLBdi#wqTB&QGQXLT zG8{;im};E|atbzY&-pU2pf|I0{tbQ-_yVut%k7;e0 zC_i(B-~9{8F+rl=E$w1nM7GzzmbFGmczU@BeO3OR*Q-3qwchl~r!ZghmA;elh)>5p z@xb|z+?rBteek-y^DU*0@iB@30#R5ZUeATSvt2AHd`Hg^OuZed9g&< zr|}XBKbhHhp}}g9`%lhBTDE+NQmAySFo(^`7Q2z4=bfW(rs@G))gD@C;tU!|d)EhP z?RocRkJmSs-};Zn4VpcT{;^-H41Gc=%vNC#1CWU6;?U{ElAxHV4iyk!yv@6W-e{f_ zj(65dIuze19#aK#k1?Qn)Hhna1$xY&suz@PMO|3|5i`uER@|?>~-1QW+dzaMLw6ezu}L#ovfEXL*^BIQ9}uB~$vWfrl>_ zjfe^y6kBn}WO{zaPRS7^mu7>zKR4EW{Qf=M)Jx2gW5Kneo?33G%fN96%yS+Pgq0+l1*J>}v8AncWGMnpG8`K;}^x2nr!^ zxAKAm?b1R5&Ul_@7rm$HPjC+080>{(PC;qly6b?LUdC|Vd&zw50%x3DcF_i-K{QOz z_03H{p8p@2yzAHVw#H3S6*|>bkz*9m27|G018(InJ5$BM`6;861bN3TMXaqFFyO{w zWrbDxW@g4c0NmR8JoR|>Ka(Sw!e{(e&Byvi(fAuGydU?4d)FY6Ylp_`@C`fS=yRL^ za7Ah6zf?|XkVKItwOJ|qy2+cMUu6Fl4M zp`k%hQSt2b^!{uWkC@o|{q>1aqY@h%8$yg-^zQa(*6ZPXer_%cpknd$k02d3WA-H6 z1ZjS!{VQDX@Q(~mz3BZXo1fkzmQqpK-oM|#k&afWO?8%`q__cK#Ur98u{vo>CgLW; zc32B1!2$c&bro*pMBrXOiuYPpr1DN$AUnbKyRh_2Yje>`Hv^gIt4<6B! zjMkKdF;;f8ExlH?{QOB9O-k#04t%|yYmWEk$_UKdnk1uNZT7QNv;p)cpaW7-$nX7it1q<4cAbHdQNYGL?2j*~@ej99 zs3KYM^}*!xC{0?`yHD!BthZu6l8wgGtcqU+fsPTg$6SwYjR8C{&-p7c&#a`vK97XO zsvrfIsoaw~2g9)Wh(o=I)GYPN*2-Z=_3@RC=VQ}gRUz1{q!>%ibu}buE-tR9s3<08 zW<6cq*SELHEdIo#q@?U@)KeH3SYlYNyY2o+=~&YBPM@}d0?Lz-@hcQ^oi~9;sZ!;wKUB#?-Kj-ber;vwu(X!_|G3B zOG`^DtCOuQj8C8w5Ts{iWo2d}|L+^T-Wwf^CF4YXLqbBLw6>{9M4HE~Z(n>Yl}Or; znb8vb2Xwebt03_DM82IC@kF|J+c%dc%aBNI+}9IO0z*~Ho8OXbuqE`f#Xyx>Cn5W&rBx4Mjw;Hju~pRWamZh#Ru?ych^K&)e1fJFhRL!v3P^+owl&SbzJgV z@~^I=f}Iq`Kd$t&7b>I9i(?OSEZ1`kzeQZjOwLsmcv4uW)xDLI|W+G;#k*1zd5aVw8<0w_7Cj5;n3Jxnnzm8BmP z{oA;c5>iO>Y-vF$7Zs~mvm-+Ioq18KnMbl$ys~r32xOr#p)6A>@_I4IGI zV9RJ9H4!DkdR>_!dzCi0Gi1AL4zhKmxF#j~S3KV!37u4F!pfmOUk2bwVubf0SRLv3 z_!tfjE|bTmwytiq&8@1d%TH5N)7x9H&JarAAN+r?eZD(MWz`q{gh@{zJg?n9<8P%9 z9R(BFH{2YK@28y3J)j?)$Ua(CS6!$-*?s;J#_ZsC83wQYNVY)x<|Metiom8%I8gt0 zea=a+A>#fdaZ>_D@`T)1+n1ITbkxGjtVf+(_5LFLnx-Fr!OxpH8(dC|L+;pjI$gl zODI>U-%v478P5+Je(5SAqU8c^=W}y&5Y8s1ra#-=uN2(fr}8CiBXRjhPTdk!=%(*8 zwP&4{<^tqP(9|>dRo`OSJ*QCM2Wvc!St^##PxfDIwJ|N}$vQrDrG&at{jfr3;EK?t zvrngq*tgUwNC zHJDA3l9A;a4aP`GNvQ5fuC&}2_2)$@dB;`y`1fbVD{p-jXVcPujJ3!#>p%V$%JX)x zzR;l%->r^qgwQJyRZ@Bu@fibl+U`@jwrsw9kTRx1A<5VsV_flPDMHRzJH7Tvi4xSE1Lou(aepn!?=J*vP`dBC7VO2C$S+ zEKuK|zC)=({iJLw`8P)}E89O-*y?ui)5gX|OH0ev)>d0vTUVDj2m03FwQTtV%P5EeiMn%66H-_#I*nV- zXu_P?ff2Tz^%eC327ev8hwM_n=dKs)x9a1#>r-Jxq#w5qn{QuxO^B1m$`n7J%=@xVCGouJq>c|QeJokq#T_}}d`g!;3TD3`L*($aYD-}T9w;SL8rn`>=t z?UTEEdJO;DhX9=v1_=rm>i_Zlf0-$>ud98$J&>)+-kmPj{U_EfP6q?gL`6kK{QUg( z%$J&yl9DnqVO?EaO-)T@Wo3Wa-!i0?U{bmK{kuLaIsf8)AixLKE-L+q6zMmxorxVn+%2Pq< z`5XEh`gww0>G|syW#TXjIyyQM()GgwyzkBR_4Vy-5L|OxTU&lT z@Rw#Y!O2Zw#U|xL@(wJOti0`@$s=J`^Q@L{3G(ahkCn61+C>eY51caz!)NJV3bC{t zN=2*L0nLIW=D%wIgAZ`|3kTpryVgwU%P`Ky7; zXbqmqMRI(&a{i8aTyI~e0USwHwTtjWNR~+(N8S$bL$c>(qleDq9oW468jp%KMgf`I zFurP8Uu`4gnuoRyp!bT?{+f?i^UR-Outb$^Dj5>Q^w>osWRspYg@D~3`juWgmjccs zxiOZoXF8WwDZJX8p==>NAwwV&AafwWkd2VNkQ0zAko%C=knfQHcgIkQm-r`z4GV+4 zB8(YCnSO1@8Z#JF2LuF6Oib+W@2{+Ach|kXdeae`M~|CAH`Zt}fv~@@aBy%?Qc@Bt z8`3dnh>Q0UpY;-3yUz$IIcM#N&#T)lNYV2hMZnozunE5n^@k~!(XL>jmW{fg{{^wtTm^7leIXKL=s z6Fu#W>%WLJVz);xc==TUyAV{*RH-zy#FC9*{(pXwl-_DEit+N)0E-9+hTo;1x-Z5t z|C#+h)7I1!Kv`M&GZU(*VPWg2sHo`bW~HX4CMG5(Cnu+;Bi{Y&@Wc^iK~*MBN|7tq zjOoHt{x?B9n|L+Afqc@8uiZm2nmne8=@B+GnQ#^ckXMMI_1}cAJqo9K6y_C4xAcfG za(M=yEuWy_IcBl$@6f65RjJ|?{v$44$0%AQvSO2*0Y)sNnDUL0K?An@YRGo*)d-9N znrogV;>co4xIA5LH*ZMgStF8$H6OG8Y0v9^h8^G$>d-2tu7vq zSsc@&iBKITb_o5TFKr{Rk}|ic_KM?12LTc7^!1mS;`)ch-4>rnT9VR8vu(mM7X>TFCX~K;*2~EV`7bNU*w`Xf z38o&R1ETN$yA%}S3E~3+77`f}0}?Nu3$|Typx{G|4Fk&$SnT;}e#gefc6WCV4-Ypt z$ph4xnVIkI?zp+R)z#Ja_Vzxh9botQ@C^+OA#<)(FuxX2?G6UrU>oFGxt+rm*YUcO zfiPPft~w&gYN0BWnK9LHhu*y#`<^l{eSDw9D-(5dBE17L#cN7_wM-TXTn3}-zvOG5 zVYIGKd%o3#^j!@Y0sDFy-C=0Hj$b31@-dOB*ud`wz1m|FBU2mfOBA7v+yWUwuk&$1 z$d>;RtU2^Feksvbs;HTM4B@10iUe*aeNu{>T9}tUNN&4RGji7X$2Yqmh|twS#bFs~ zo*(6sqR3OoY$$OkmnZ<#YSb@i_GnXR0jk|1qGH|RqLSTGz>EUL`*33h%ADinIy2=Q z!Su{bXsXP#G=HdospseC*4EZ<-@a+<=;VL%Zwd*41GS0_1T4fYtGlot~m?z#=7D?gz)k0>HX@8>}8cVsP+v)i-GmFM;ayFgl^iV-qj z29s5;2M6b!pbi*L-bPas8YU9DkDXaF2rmz^`zeIkywlASXFl#MqwNg4|Eb~Y!zg|? zD73X}R>HFt)`prRd}FHx2eh^)F$yJ({HHvZYI?fEYV~UplIPTfqKUoj*!>HR=qj4) z6!LPv$2AWs!dM$IST|^6S|9u`ohFIYdq>m$qTef^$p-L~5ihCei6wd(v|Go6u zfRvnUlPr(ifP$Qo5-B_FNGGV++{q6{4Wp6)v&?^LU~sTSmt~HFjSXTRvfahaO=3R# z=IDK2ndGLFMA_!1)J1qbQ4(C)>?RalQs0a#a!0724C@?DiE~w-Ap!hZERnK-A<}92 zrhWkjn%7gYLjc+#!6nUDBhR*?Z``Z2cCbG~*TD5Tgsi#$xq{gVmrR8J+vl@%<73JR zG$c|iPK+wSj3zUPR3nJ)Q?a*>dN)Y2C1X=hyMOyK-bfzp6>vOmAoi+$vUSjsJEFHC z-*BTnO`tW5u!#A4#p8DhXkkmS7e+=ll|jmK+rkHJInK1)VbPsdyogi=4)201p4N8! zocld^D^?%fKEHPl36EK~)gH3X1O<;%cSe2s#NO)c$MLAAp@dfckCgU^pp2*t%|9O={CBj}I zo{QSC*p8yOpcUNtv`++8Mk?gVB_M#jr>v-mVb9IO1NS=6KRdLq+~@wghxjiRinX7g zNR+*uo!zAO@qk(?m8z_-#)L~w!mBp)JW*8`ATaMT+VVyfPv=%5XhfIpgTvB7vvp~H zfzlR76p+T%ZCno%I6q~MJb#L?*h!W@i&MIaRk4Uyu|a0UhHu43Z1&fLAf`5IpquiG ztEA>%mLX_;qw`-=T+L71ZeQqUjG(TrMpM zfW@$Q^!_TWQ`Kq9U^Qr31SKrj+PMs|0Lvu;-M3_WsS2^6>MVde)+VZh2gF&BWdjyh za7Vjp6Z(IuSEDh8kF;Mn|d*uYp02`$9@ghFw z&!io;BG+)5!djw^oSIHN^?fB?KwZx&9-&N{P>e0i0Jn$lcQ}+cEkJA<+Ll-)ca2UAm1Z8o8`APXdAbW%b8 zo~*Pqaxsj`IH}Eu2u((rGn@6Mx>lzuqgIy+fnMUyy$p9M|9VQ;>B4E^@@dQh#Ku5) z98qC|b^G$;n3bDD;0e0$JC|AI=8mXj^b zWEl3p^BglWM5>H*tPnc37^+bJX_#3=xTNaB%-+M^_GcQ_E-5*$M4E*)6I5|*yv z%MT3WyX}5t%*vdtBl?`qfAvR*IWm$#D#7_7$bsDq38i85O23P#4hvhoLN5wOqPoaH zE!|b}g?o%&Zq&FF3fb+XL8L@%)Fgb4Yk2y9DeRe!EW69|P37Zg&NHE?20+d1fFKbY zRH-=x^+`^3MpA|ajQm-G@L+<6ZPJzi&AxoTKNu+(sU}>6u}@?JlAfe-RFuDh3_*t7 zhD(N*TiBbMVg~AFd;`EU`&xty?NG+hcBL?RSQhPOXNgDqhThEWq7K$V9RpSltZ%Z& zGc&b~=ky7sG8vQrq_NL>vtgtz!MzAhTk_Hscc) z1r`h&CkzJ~&xSr4>CRd)I#HzCU{(|?|6S@O?*m}j!v>Q55jpf|{r=$-vpv~2(SGK4 z>eAG=;qZ@+_OwApyvGUKSDu1tq*aij{A7J+zQu86 z-L4nw&L2FQZ{|MM_?PBImB|$1$ByDagKugO6Kg{Kh`E`$g~gGhzDsDrt>Qg~l~}hd zD?)=LS1{GOqadA?+j~fzcW0<$dakx!^+JdJdL@1zWUq3vwQ%w;_H0XjWH!-QfrNG$ z!u$f{uP`7T(qxM+g-aNP*@V? zMxVp-@0O!R@$6a{lb=iH;j9`Y4-FOiIreF`6_PF410iuHmusto5C`Qjwb7D`wvvmP zr8VEV&7`0}rm9TE31c*C#$dn{cEYVyW?8P3wXLnKmezmo%DlV;*l@N=KFvG(RRQj9 zVS?xXY+7JOrWBn0hRV?(qw{Oq?jSZgR$3=p(XBmgr&9O0#FrO8^X0^p5Pcvsh9+G^ zrY1|tB%=< zfYMJN3E6stO>+c2#1&pCXp^1W{@blVoAhG8!HMXMcSO^PV=w+r+LM$`KCvsD!)={8Ni`Kbljy`3Y zS-{w_CJ*g{EM{P2v@$n8JUt~QB+U4qw>4jB-s2MGBG%P5yl=*Lq+|bM4+5>iimy%C zb{1r494RJRxuf7Ehws3B!0v6uEMD`AaX=v48w#EE^+_m*4>zrg=rM zBSRzf;hXgeJ^7Fs8^<@sD7Ehql92qj+%Yp#M@wsYZEbCKRsu#%$m1FYg~d@-w#f@z z_spa1h-6VF>lPa`G0irc819N!*+!4^Qo0y&SpS{y)#z;TAq0pWO(Y0`I*}$Rg_n`&<(y?|$@CmQvoe{fZ9792-brD)vWRDxi~5s6eUV zDIFq(4Bo!+F=C54_=hODk7F?!tkSWwdwfhtO#JDj(z3JlR8*#CW@c7b1%!ps;PA#+ z@bzJUGkBtRyTge`M;0G_BL8z)f6;~e*_stq*?QQB7EF$wPHN6j|e7VEuFdjYS|^s;*Rp&~Qwn%iX*yWt6#q8*B`9qrmumAFNh#lzwRq*(Sb@>8$M$ntzp8QrssoFPwjWyeqAt z`V;Tj>XXFzb7I!az`(%BXy@c))R=>llT%(^KD-}mlj`^Ke;5^&65QtHwRPtryec;$5FX!~qg`(QOhjE`q zZ#jN+OrW+oo(?`?@JRURP5G}_FRVb#??ukB=)1I&$Nxh22C=-f4EL|6a-+j%ne|34XB?&MYZDYut^YRDAI$g16kr zOHfsx5Q<-BdXRwz)cDAK4{0%qr0E9Vc5`Ix*sd4euf~-Rfv2CG415f-{lT}|UtPX< zvvd@S7L}Bk+1Q-z?ctD+DE=+t<>GR7bL$HWSf(bul@O&?6urA!)K^wkc52aO4>)$M zeiG-&&hT8#?4GN%E&{*+8ALyl&qG#LQF2E8ZYATASq9q0G}J0My_^*SL;jL=hrFssEhO!z7*PJQEV6%HS=8 z0IjhULNY~%r&5kN@%&YGsVa_KL4g6@S^!8$-~zXfjtB?{JnoL?3koQY1APs=F#xj5 zlt36jbW~IrG|=$iePc=#{Z5XQ;IwK|k@?p*UfjZ)*Xf%hS5W_mC<0`%dtZ(!{!S2j zTV6k+k^6Jv0DgCDBc4NlBFZ&h9@cYf1D;mtVVTZ+ zv0BeD*vLL*OFCwoX!M|iA|<9-irGoCuIV6dqo3Fd=SrRCDnX3t!%jzSEQwz|D=`nY zCnmi_s_AoE7T)FCPR}0Xi%GQ34Az=(&Di0~+2=^v@7?3WNDn5o;2dZ4?u?)NapiV( zGkM92sV-4ct=(*)v_l*^3`@khA#E-T?t?)DZbb={!86Rj&n$8~zoNQP#*X*EoDb14 z2RcK{FE{y|^WGu(=ErcWuPNKJG#9uCG1gidOB(1a4?=A2jY0rVI8V9quGKp39do2@ zY-~PpkB%N278dqDb5Omlt*sLiN^H$kfczp*BNJe~g;e5goAC53YW8`|?7<2`(B3`c z%;J2At);1}ZvJ9ZXAW>|JPQC-K&rnDi_wTv3TfbBRrjlGrVr^4NrK}2taxDx44857 z-`3L5K3uwnK5E%S7*mW>+j%|n*tHWQIf) z*Ld+iQ>~PciV$;>vo-eb!%7DOEEeJK*JW z@2l}@7(4&CtFnOYtL#XvL zBPdLE^^^Xq+RA+;UhyCfM z)>AO;+{G0BKo{c_{Qj&;x%7tSojV>EFaw^EFkEtiLP=Caha>he%l1EpR!>((Wj%EU z2ppO*5t(^W%<6r8h>*pIgSZs!-HX9aC2h3w%Xs->j}}civ;KW%4PH!?Fl%(@ubFB! z><;eM8H5PWt2uR4w)@i{MCFW72+Va`bhS-M5G34J-kx6$(?r8HUNX30@vBhO)fFB~ z12x(EcJ)380O>NybrtU4I7J74 zIzXop6XNHaUM@D%2u^&@m3*->F80Lf+ad_q>w(j<-y~2ugw4XWOj8WAe-xEkc-j7g z-*laL@h=P%g!UPz@iqcnbD;UX&e2s@?U@TH#}F8|#$u}(xIXZ4E#nk%%N~4pOPksa zxNK`I{ZW|R`iI-km23j9%-E+;8kG^V@~nDrC_=P&LNUV%cvt~inwrgRZK0u|B}GLz z*w||wUU-nn^-%Lo8@|W~w_AOozo67N-n`~UAAk5`BolQ1O{IOAHyzx2BpNvJ7Aq>% z9FKijA(9?m8u7p|oF{4McOWE7ya|ki#yLGZF{g>hV1;3X*F1L(3&x{16Dxf4j$S)Y zSs`D}ZAdargzw#m-|A6llAmMw3+mWd25^tWI_;s|ufeC}HHIPqM~@fJ3~r|54GV+< zee^6`&6>YTNHR;j327Mn)=pKUJG%iw--@e9nI$|TMEr@ZV`rbSA!7F>!3OXVSv1W~ z%n?Y;{)ST+!j*iVKCZlb56RnNql)n>dcY*IqG(|n*}yZ=FLoXg+bOY48;-t91N}{h zpMDfh%2plr6cD?mxY7%dpJZN6b(6mJlzk5aSf(#-Ir)ds9S~u$7zCN@#ES;xW9Exh z)e3_FbMcbaBkaV{of7uf)dL|11H#Nk9`fspvc;?h>MY6G7Mgy6V~7?BN-^Pa2yOY(F6#Df z^NnK+R-s@#)ur)%r-{BeB}1v(pIGqF^POc-m`mM_;VmKddm!}JT?+D!hp$5qVom?f ziqC782%2{NfyPaMHcr96$scZh$H>L`FywtBSt(SD;etsDj;_Mc!meM~7ws*EW8mfGWdN*q`H}rE|7GwS17M?=*Xnpm z0)|G)Y)*Y4`;4>eRR&Pte1P0xx<2Zi8!M^S@-k2nYKc-*{mUL3!xEgff$LAYz>M@L z0VtMZ>vBvqiQgfxxzA6pYEL3iKrHq0P33;`(B!*FB>Zm2x9o=@SyhPX;Qb@>S<5uB zo;Q(SO2c=Jyv#Gghjx#zvW1Z9I_fz?5)o+=pEmUHLKJT!6p(VLc#F5>b+!4Wwv`(O zth{R?JUbXLviRtnlx>NL4r00(NOP-U3Q4e$US{!DDEKA&Ejd-UC5SP6hmC#+*!QUW z4+ZdrtVy?-D)BNP!hkjuG3E^AoTR|ojga;RIq8Du_c-&4a8MV}{VP!mLtgI+KT@__ z@PL5e7jr7Vm3V#O+a#mdafV_|5nJ*w~bn3X`7P<=3&8=SL*XA3@)w8?xPA~y* zRS}jUlB7oBtuIoNyf;84N(WecY)eM|;M#DnzE>ZHVm1;{P8nMuQ|QORH*H zYPfYacJmUsi+i2>wpHykrhdn;UyaG4c+g=FQ7F}lVvj)e{fq+#lsB5pE9J&70QT$` zod+z4*{Eju2*-Z=hkSBDs$Jf&HZ7U@dmI6%t*s3M2o4T*;3I|s>cD_PLPJww7>b`m z|NMSO>IxM3!kG8%Z-OO!S!D<{!C7?YZECHtKEqZu!5{*P4gzSqUYLY{l(MNQX)SE_ zok`43+J+~R2_9|Cd5=FEB-$X;x=*FNI~iMDv=FIW>4JE`8s)01)dlhwlmE2r+U6Dr z_^#TfSE*j$i7@P2)?|&MU=&1G@H>wV6@Zz`xufFlv#{C`KzF=nqN3N5c#6)wZ8Y@t z;V4`B(PFrr9)v*)-`W9EhJK^mqig?T@w99?N;F_U#dF2db z6au=E2R3d=eaBeU^N50hkGKRNdRAUuw|F;A3f@38UFwKOSJ$Rv*zSV;k*uh?ypM0m zL_|!)6HhH7=DAR`3ykm})YDAvjsuR@VtwE}Ll695P;*}cQg_0!XEe=VQeSj2QGq3X zhwGjin;MhjX#%MxYML=mdKFMpn5J2ZP;fXPT;(aYaOnBq+-C<^i9%H$xtMSgC*N%^ zQhydGiqyWf=b8I|FVOWH;XLqIl2ACEUioAdMr?(Q&)Msw z87P?upt13B*}Rd-Nm_p-6c#8jGaB%d@j&}1W4V(#i+|ZQduTttD&45X%!f1CRkQ=( z2m}+&nS(5*f z_i=8r^y%WC0>o0EyE3+DZ$J~2V%R$-bI|KtUt-k5b*r_nCOK{sn^AP&jCzcZr9b4n zAsJQ+01EVaJ0fwn`Y39`&HTlIYf{NO&v6eaNGg7Fmt8@U0HYUb=%55a3M$!tN`Sin z5gOkMiCixy?}r?EWNmgabn*^#E%i184hA$0VfTIs`BSvpjuQW0XZw!pJCygry=V%c4wLNiL&9G6r$%jy1xS+BGBN?E=Z##$4Jer zJgo3VgOpG93kXFxssK{G-lg(U6vxzCjl8y|RO8K!0egi~D-#wr_(djn`WgQl!DK(~K zz-yO1g#zL$Y+Cy4n4uVwcmx3b7QW(pFfsD zy;V6)(m6+&Jj~^)dx2o&yGS^EDq1G~(|T5}4~Y-TiGal{?4XYCK?#cJNMpM0R*2B* zc3xQg9xKZLv2ilz?Tx=4BX+~@swH0y*FbG6;G3t}TA%e37@%~!yJ(Tqx_-$wNxOd% z{b>p{Ii{;3GB@P3bH#^ZM-#tA_j-%?JWQqdJS3r#4NPCB`F*3ltwIh`NWXjMUP1?I zeqDzpY{|&GtsjLt=Xk_hJq!r9;Z?lJhm=TQKmIR;Uo9lSfbAppqJQo3{P;)9N%zKJ zPm$NF;lG=@<4O@NGTAWR@N+8BsFO1$OzpE;5oYmYR_6fnI7CzzYcy&ZV$htQauxM( z1;9J6cgQJ#8kXgCF1E262PIo3kJ1YGmTR!`fbL=w)Sr8e1qWu-UbNVqdKqr6h)~;$Je{B*f6;FQNULti*|Ux7u@7% z)+^>yH5U2HpD-Y(*pDFGo?uqY2`n352Dz(P2qmsOxv32?Hr1r-+)@&H`RicMK;?H@ zx1g^0)S9>^$usU2NT&T#erOh9x-oEZD6nWQMb<8Ob|#qI${=d=t^aqu+US zw)7x(d9i5EK(%67KZ~qrxZxs+%&~%G3xD#9h!QF$~1b2ooI0O$KBxr!(?oQCb2M8J@xVyW% zB)GfX$@l%|o^$TQorigv*}J=HtyNXMyLu<@<$v9r5(S@YA;5ui@!(my)$$rI=Nfla z85@bksk~-=s3CbswAZfKZVlIoWVi+I)OxS(^AY`qJ}`v$qb(bp3SiusAH^^zP(W2* zCo+)1i|U$PK%|x3@BUvm*Ps5LYum#c7L~K(bjz&T)^UEK11-K)pd(+LU6Nb1@DgOIa#WmDkPS5!w6?*FJ>2Ji=e@HFkc6$H1oeR@VN@=fxx;eyoqhbn{Dn z;fSLzCtvO3cOTF1LG}^*A6TGl*kFL%T2Z=}prc2X12s$!QQYzXgc`>PlpyA31rq2J zc8kKQP9otj3d=7k8h=HX_AYy?XO`&O9Ry@oL&e9hTWMY-ZZ?7f{6`;(YE6p!zPa+v z8~4=N>VJtNy=E#}dc^3pSjDa;KrU^{lm@iu@_{BF4u9Q7$D6#kd#sk5AFMqrGbb&E znwTayMf=%s`VNhgBd~Ny73%lif^dN{x)XkwM0p!MX;wJNtnQ?gEH+iQPk5TOib8%m zd0pFsPqkqTA8?W({eucKNjaETK_@yjmo#X zwbE8z(13BYfxx(1Ul$Ps2w`uW`VAyW9#rWPlSE)iJmxM)cBmlYI=|^pK`zaX@!v%* zyhZ1bo6vDG5@Zsad*SC!{PbfQ4&$VL+vUKNqO8M71Apg|n1#(ZI4f zvWd|x+ROB~kb_gwJXe68h^U~XE&H{NF0>963R*e>2CL-BEPTYW_0`tT>|^Yyfphf0 zo&I5SdNQBvdD<87^V`X6;`fZ)mo>q1HJ=+}C2bj_he)^uHgxda0pR$_FSP#Kx{rg$ zsi$UvG;$#)Hn^4)x>hfnBUXvu$`R4XR%O>E3JPDWgawGjE59_N_IFb;-`+(@W$qPA z8yPPs>73LiV})t_FmF*a{xq%>$aWS|90D9D+nr1XXm(7xLw6@2VaVXFXZ!LN70{=n;x!*AE+JW+ef1|snU*}~dnIAPg9Xos z1VK>U+A+}yGds;&J*8H?|5C324k|hRcFteI$o-1- zqP?*qqS6?Op-+)F!%D`I_5g??*8=^C;=ZLXAJ2jshKfV8hE8h6%Cw%E{_JLYB0RT& zw)smkS=su!=V|({yw`XtK+2W6Xtb2is=wg7ayY1;5E3Pvoo$%<{klgM=M&B=hy)t+ zh*2EHe@I+%_od+J^u$~m)IdB^sZp(^@jYjN>X8D0Wj3&_?+-01j;5c2I@F1FKUdL} zlw!Q`oXazo}rjYT!})Dap{a7oX> zA>C^D6-b?C%_(Og>Fhz9S!;T*KEJ01%_IS#)VP&x)ABwXDIJyxZk1tykt6HJdh>G6 zcDZG&GRg)ZE>3U^>*1pr^+tE|T0B9~W zu4CS~eax7v|}(VZ99joE>7ti ztpO&INwqqiM?~%s#t9KLugkrz2$@f>Cz+JIA@IBOb1~tMEbY}te{GyqC%i4$uK7d9 z&r>g>B_aVWxkBC_Ta}3P_&+E^O7RRtbNSmx)sFS@Y;)xyOW;Wn~ewk&qDy z7ncaeO__E00RTdHmh>7?zL3xd;>Kq3i-o(U_2s)5RP{(QSY3WoJ9kdiH2xXaUdP;I zoM1YzJJ2T*Y$&cK2dm;hC6MW;TXv^Fp@r!W2rL7bRMM3*GjqUWVp82&GDug*s!}4E z3ti@cLos@LMKHgi{3Qobe-m5n$EGx(Cc#%-j~+oSMwp{U{&?QZ(-3Q9{pl8&96Bw3 zF0)MX7m{%I^ksuT%{XE}ru8{|9SM7~9Zu3EF@7$nF3v} zGzIiTKh}8RZcgZ+LSx!bKBX+m(8%s21wRg`_=!FhiqoQjmcZWZve%Wh8#jb-ga-WXJo#3C;Jq|*J%GXO z1E-_<+EI@p`bfF8=WbO(_Gr^}*oxXnkc8;El;*usy$uH)%D&%$fZ5#`^P^c_1d2cE zqOw*Y*x(kDQg!}5QC?|eaS%I!)NTwfCI`<(M4%X+AcE&z)sFZ;n`mdz6an)xb3JdW zqGE?U1!n8#y~~j}&8oKygN~d>KE50VBfaJV^l)IE*w0+TG-X5=Al#N9gxT(UDMvs^ zybdZ#6DGr=JqGyQ(j!PdTNf2t<(QvyzfOqBig)u=<)akSzDey|=)&!87_q`h+zFU&>rtpDw$kIb2Ip`V>wnSZphniGKDnRgdjR>=jMBb_FIb6m*XN{%rpQ=`1m5Q#Q57t4 zWRZHk$BC%R(rsEGv`M!@!_=lRqZ#w28~RNgqOSb?4GI+gJ&ywU=x)rXyKqk2(pFTE zzv@c|?~-uCy=rRJDKyUTlqpf!E946jQ0AxWB52IrV%^~&y7o8yWxB{s(KaD~@SGwu zXQ{4cM0V+ym(D$V>-iW`O~9!YgXk+RATQBPQz&q0zH_=nW_rJ2%A9vz;un1SN1l@N{Yu8M(QX^NKQmy0deA zUVfOE9IA^lG0HzDp3P3pjk8d@FL?tjbQ>7AqJ(<$*>XX6PLNpO_~9gVcu{eYz!?T* zC@fV~{hz)v(x1VL#4k6X*%9A_<2tlyJj@aX;?R`e)O2i>wUayV$$eTlJPYFK?h97L zU)q%|#8@bMIs{I0{)lKtjq@ChPLnFA^F(?PHg#f&c9+Us>^C2>RMAaBhm;is0JVCY!;kG>UA@mVk~p7Rmz7LlX!N-z1AvL$7B&1M&OkC5SDQe- za6g-SARn3(3Ib|3lhh9tDaj?4Z=>OGEbi{^EFf1mw}4KhUl@JF%3Sa)C5WYQUtfbq zSf{iSpNSm+ph54?9ww=QOVqyGiB9#zysO}dHz0*KP}TOge*bI&}s}L>wHoYRuZs(8>9=m}hD2%-$ zEWFN}G8C)Z=TcPI`ZIOzu3~5pNG=;pyy);U$2{^#iJv(8&p}<1Ih7KT55$d^YwMFGg_?0V}=W_thyNFAK9u^ zspA(QR;-B%3|_lf?&H{o4F+8RNQ?kSJPvW4Q0zrOB%a%-UXn^{@cdDCmjhbJ2GP3{u zmD*=sT}EaWX8g6awe|I!UQ-JTi{#W)*e!0aul->#iu6-_@H@zGX!E@KJGry7)6vlp z&HCAD4#)aX{yzWqrmfQD3V-#N$j>AkkH2qYt3>aK{2Q7Be)LC)3N&WW6%M! zQXdo$CFk-+ddob1yIEZL4LK9QMuLm1@tR2R{xGyQc<*sdU}k3KJs%$ozu5m?bEY^n zI9O6zYGZGYq=E7OZm~iH`@TM|=ScXz+?{Wil$7M==FaUEu`<3OEb11Nzw760Yq%V@ zJPUJ?@*YJrl3KJn#MtK;@@z|=?ff@QIBOI}~nVTpB!_3+?;hXfM`C-&^jkv}5~1`G|2>B&hz5z+sC@B_ny&*O1} zTDB-P@Fkj7=qVZWp z^Y4fAQYo89v7>_PCH1gE*}&=2Ho9NX>LV3JA&RwRk-tcy_>a-}?5^i4xEDu-qLkUE zh$en;^3Bf7L`6j%9UVPAJ*6o#;Kr-^^x*uDg&GKEr;F7rEiJ3LO4rs>_V%Pjkb1!K zQ|!q&zK^qBe{Ri`z8&N&TYue$6rY?sMt&WPQ4|oH9j^F06HH#;pLSi%7K&fqmuOGP zhK0AaJz?XautmR65%#->34qKV&plQ{62pBQ*cn894Pw=J{z_L z95yyK14F~Wz(9O_{9nI*v9hq}>FIS01e72JDv54|66GfFK=MM=v9Pi08yeP2Dq<$q z!tFQ`Y877-U!S(rEdN1j2R}>0D1G?UbxIJ=*qdce@1!(Ru`TwqX54p;pmU$1d!T4w zhPhZL3d^~P0*#&zJAVSJ`474OK78!rk|kNinX3N>LCocCw_`{g4BwSMB z`K8#X)%`oCss>{{dCs~;nRkcOqfXVJb;@Wj=9C!WmzmD@hy8yZ`x43-aY5ynP~*SG za3&-sT>pEk`>X^;q9;D=di${JT^1H4`|}r^5Gu^%A4`I2q>~oC;}nRJCZ%0Sp)wdOO92_&?X9WYo&1#4H$@!rw(m4;ie7 zOlE@rJE0RB8Lo{K;*VHrvao38ylHle-|i^-K-=HF-t2ux$Y`D)|H-Cx&*jSKDE4*a zVTNiH7A~~Z)n_Lr;F5TFcxtMusu~(@&(2WM(c#m#90iSmolybYNQvkngd?oZYWBE{ zgt!WPyu7^P;^JIf6O)tb+S=NBdg!T$#%?e}$;($&#x|5i{>m!H>YnNvndupr=l~k2 zscFk;%jwJME9omGCZ!aG{9XzxC@FE>{5jXiEBf|D(&7|l$ZNg$FT#h`c7DB@6vFpr z*A^9O>+_IbkK(_j(a)@3LrYP_!6J9@eVeg$G2ctQp1yV`8l`6~Thq4BE9}NK+*BLq zYbZmQy@JWVlm@ry&3^b6y(xP)5%Fi998$`A>Dvi8Jrwbog;)QjHXQJ+52OZ`Qy1Jk zX?pT4ZLqqXOY&Ed+CH&6Sv8~I`>?uyvYn>4SA_STnw_1Up62D^f{Wqd%Cdyv4PCIxwrrv;6v73m(GpSw1$yx=Bl-;Nkdkb z_#Y({F}@hYzgegPLZdZJ9ZsMT`0bN?O+x7Uo6kWiH@)dNupqo~QW8$^a_OV-bW4ok zotFM5j@h8=hm3!O-@u4Q62c!P{UH04AgXYYx|DHaK@AlKz1Ut}SyOi8eC6u!c3>+q z)hNqS^L8$=>Qz)#8YlkwC%oi=@>=ZCJ8we= z`fzWDj)t-enXea*b3F^DmkeD~{(}hJD0?_j@6sgySC<>26xtqM6hoRS7sOb$Gc7;? zsT+NdFpBNJ(B(eA{X0oZlZMWL06c^#<^Li5RSGGr=I}loNRY zaIfnY*XxIORSP1|`K*_zRv$n9`)ATNjJRc*SPa>yS*GbYRV3YTa0>kRgY}8b^*DD6 zv>i$`%(gGTvfg2{1K2U(X1C-Sa8YK^hYa?p3lbv)&Mn1(h#H-K-BsNi-ON>uX(mn_ zi+A9ku%HXmJDX4+m`X66xW}*madCZ`tNR)%gxU_W8HnZJjLEHwH+%gvmxxt*t zQt>kw=MhRtvlAWpbQE|jd^9>wUCOlhH;0+jqyJ+hUa|6dMzx<-qLFgB6mO3>Vh7qZ zuF-Y(cQQHn4%x#2L|8QB5+${F7RI(~s9VuQ>188M7FD~(lgLVc*Ck-F)LZ-4QWu-v zxccw*;L|K#5Oh%W%@3k37V&o~qko8*@fM)sthsnW77faa5xKKeG<1Gb<{9C18Rv+s z9Fg3JftXTQ2-w{x#b5h1@)1=LGqDdN_koQJmRlR|_p?w#HINyxRjD$ifoxBi4;QCl z-2nmtJC!y$G7eG)Z;z#{qb80OST&^UHQmkkIiq`Rb$8x4gj3|XF3qo{-|`)rQxTDo z)qCQbYy@%LVqn)u)7e*49+D&=*rF!`&TT1Z;UIW#lk#!;EN-E3R;NF@suAK^3h(OaEX+xZHATtp32WZV%N z5;?ATW2R1nfd6!M5{xh@Xc&J&OP2)J$uPV?m9JsRJgne>S?E7P`2oHR7O@Ww4{dF1 zN=r+JhKH4ulr|+{g^*`e|BP}FkoqR+KER;;f?Pjsmz&87A!>M-ikPMJ7m%9Gp0 z*6_p24Fgi|#Wa z8oR%;TNz=FqobB`{T^SS-NIDsuTQyt>f7bN&!gf6hp9<+NG?B-oH=gCfVxwRpZnml z^aS5#9~3&;__=bjuDXC)0L7T96q(|J;f^e%&USIT!Qe?@&H{|GxrZdr?>|VjKt<9` z^;1$Cae)w>gqZ=I%;ok|9_b|xoES&P@JpNZ~%^mvhB%p{T&DBu2Qt#_5{=A?T(HLmbX#t$O3*m_|;|L9e;Ix6;Fikdf9V>pc z%@IDESzE)FK=C`=Fh#BnG(vGSNpz8WLrmB}q|o57su2B$nIAf(KtHdbE1#-WzME3g z@*%V(bM(z0Chz>q76b5?X6R01=?;QoV;P};HFEmJ@lmF9aMgzGcE(Ezx5fHBDiDSU-Tc9~3-jSR3?j(G(? z*-9+kxECp}d(j#$9T3$0{xFjJ5NV*3d~lw|P~Q$nw5Alr4igpEG!CjSWy^Y;0_3KPHnowTX`pi;V z_HUJfy6RvuUk+Aw0=53N5F12CM|aZq^iB^f6`P25x{3%2%F_$O3H>fbYs0(A2;UZN z{(jBD7+(zfpOY^Ug~1-g^Cfz65Qe)k~&Q9MldN zU>Sg*ZJ-mFF3{)(ldT~DegR~H$QxwRT%^;-M0(gB0Crq|l4nsT#-?=WUl4QND8^GD zB}>juz*!-`M@~n?3f#jzPV%@dp^+sCAtQHu4grn`xDu-d<*3%hx)ElQIgC0Bs!$&E zp4bHYb$%&Ds$fZ*xNg};T+iDPI2b*2FMJn2hZu!1K|n%QB^YE@+TNZ6VdjdIo*rNd6ws^u`g%xcmJnZ52yrgp%p3OnrwBqz6uUU1aHm_T_ZgdemVgX0{pG1b)0 zudc}$S$aDOG3Jj4xCD5G`yUE2CMmtTSB;tMvD_D_snG_r(bfCl)CJ|r#T3Ki?!UYD z|58{>-+dA0)4n?J`x&+SCFcI*ZK=fs%Id_+pF90cSTc4VPSAoHW?`?wJ6xQAnab8AS`AI=8QN(G;Ks9 z-2GlM#&lmyj`;(9_qSt@0V;@(VL`QV%JQ3td^qZ&F?woAcoW}oLN6)QqCZlV55cW2 zy?d7JU|G?h4HUBuYc9n*>y=5YVgzs(De6+>?Y&BV7DUAEA!2OUs`(j`r=}Y6bS87g zFAb8H$D6J9m41E{Xb^1*gIvK1kC&J4#-%XFZx-Uc(a5F4HZ7N;VTy^`gNHN`xea@_ zV_4(I$MwwgZA`DHSjM$m{)#debv;x8drOb#{KF`r-7?j*Dw9O zBgmJ*@&PqH;ui(_s~xgXeq7ufm?Ah=#NB4%LW9Yk$b(kf>0hJycILv~qroSZVc2ZD zNIPf&H|PSHnwO${ir%g#h-B}B$jof(`*kkTBBF}(?(;t~QQhS*+a@5W1V5j1J1bLD zmj~*I^eZV%!tXQL!>8x9S#t4;&f8J(^vF-qPUrjcUueJOTy@cAy_l^)pQ*&*`$C__ zGG@cn`T6~%8%4(5FR!YwQ1tZ}l^c3^72ViA?vSpA@ptKxl6nI4na8q~XHwQ0zl*~( zWl#46ew@m+G1FNmRx2|}#n@MRbZhdh>zC1h+Bs%W(@J^g@+7jkldMKnYO>_3vy=gj zG(nxS2rnqjC?z)@@0yN1@~{LbBQw&0?}LMC#}s+m6EiaOwY0RfwdY~dt}Ju+?~U!s zY^ULwV5U~glafE`iK?K{cS2EJ4>vFF_>=@=M85sd}>({unxMFm-0rM z%}5c>=V-(E%@o}3q44gK$0X*T)3HKc{w^C62*YmLhWbw8HZL#lzqQJLUC`)-Sng{7j)!$KMXPC%pJHk4{uEM-R@Agv^yzPz z##{3Rk}pe?W|QQWd})3{C4H%IEU+}3oWne3;rb0y9xb(f7|qz6vmk|WDJ(^RRb?=M z!RlmK64%%$WV(eTR03Mkxt$SM_rCl)Y1Th2K5#^%P^Nq%Y)yf|CHl5I&P;@5{c3{k ze7+ouuZh@tiPTo8qlR)%sN{%2A?}&lP$+ANnk}e(p|ZX@2pt z)&7UFj9L>_mOkSEtd}0D%>o+GPz*X)^cK7$!x51!DY*nhA}j3w?>Wr`1T%AU^$iU; z*x0Jd%J2SN9phhLwV%&YGMl+$e1U#?^IOihH&e-2yb?L)l`h?e`3pvs{5??mp_WKu z1q%_`YY_c7>);n2Kx}q^T`rYc{=GPC8cDC(b^qro-+vbQ#SA#yzkN%ODv$&QPYE*) zd9UXKyGf>7RsStsR=c<_51%&wbQ)Rz`+izad{p6GBjmhc06c7djr;A6|_Wxs{Q+&T5Ju?$gUv}()8b5YQ7-2S&m@`}4M_5GU zu#_YWlOw@J$+zLT(Qs}kRMf>nYIK}Yh{e*=CI#{DY{-vVS$&s&J*=K(NBrZy#A8OM zb1`tZ8~!cH#`e$dRL&<%Z}MuzW;QibBl;H=jG+WK-kdW?(I!sN2>FF zD|&FCC%^Uu0RESdW@pz6?fJuQoy3`4wXA-_ihuvCO2z}|voy6Qc4VvY2oZ#`Z{>YwvkUshl!93PJzH2(~9Au;j% ze;y~r|N71p1;abwfA>eD|7(vXr2DnH@kFVgOuL3$OjFL`oT=$>Z>5b$$}gSn+5`Ih zyq5(|gI@aJetyeD^A^pzyVsaYR8+L9yL-{j?bD}EFwe=!^-oN^S>UO%GM;|}%B_9* zKYO7ev^mx}i-REHzeTL%pPi@|&!<$>%BNV7T}_JYCsSIT=A_W-^SgjZqD#kQdWDmHm&%BRBNxU!(Hp*hHq&ZUBbc3)d&@T3X|fR z@~B!LcyN63oGw^3f}h9q`U6MC7#CRA9p~AwC)&v)g4M5$S-m+B!CHZFfSPhRC=d2` zja@$dU3SUcv9G~JvA@Q|qwn1(dBcD7=S*UoykutcZod&zTk$>D8e*yQp{rSwae3bP z6=(k%^)k3#CMt8(+H^|3pj6&Ea8&JhdU2H#w^%VOUT6{avZz?3B4i|9oT9NWME=0? zYC!k0iB#She%cD5{Itn0x0+GEEmZwnKZkEqeKejkEzHEM`E5k=aV#O?^;oGoT{n9S z-==I~ImZDV@^4wRq2c!S*0NehS66p;cNeA?K0ZFi!yS44hA@6ig}}`o9UUz!ETH=x zXi07|xhJKs5Cpyyb5oKT$y6A(-m} zK!iUeDBpIfLaSsOFUd%owsCIM~2FNLrO>SzT=5Q zbIDm^`TJ4?#{vTzIXStJkr6{8tSr~n(^F*2hBL}Ep8OBO|5qpVoDDrNSx1oH;VFEl zg2XOH3&pVL;-lhk+LdY<{7eYE>b|VXFg#@0U*dNZ*^>C8N$~p=T)1LH_9crm=TF+&|P4!f96bnk{A3bXZd!4*0^+Nr}}z zT~M&6a)FX{#PW7c99~l(0c|0J)fPpH?iA3MKMwh{+g)CvC$XVzV^scSk8QX=%Gon; zz{!+fYfmaMp)_j`5+`v$Ljgxivg!sg_XsT|xlV+L#52;mEFdV};j+b?U7PA7PK)cl zEep3I9`pe*z5o7T7Y=5XG~lfO5@>&aUsqq>%hOXvP7dE`9}5d>b#?WO4~Zz+V*&?2 zsCbA8hLt7PS6A;-hh>0u)Dd4zBOUfDLd+fHX-^wm)H85Dk1e$T>rT6sc$Tp^j;b|8 z4s2aQtn(d{A0SkTlkIOnog4#ji*s+FXEXW&xHqf5Eww--=G{OC1uE6X?aYCSawL$y z@I?`HH)%9-fPX*)ka!nHiMljtXjsq_r4+H7X$hOiN3P3Y{~m zXKeW<{B1u4noBFfA<@f;{}nwNHR=?23b~g3`Gr~qSa&P6Yqoqnep;<5wq@oa+^4r$ z8mX5ZtEw5Nj*kXTDui-%w$p(=@Q1@`N4M^7Vj`ls+1Y38h;C)esQz=6eWee4Q=iP zXuEY_jS*(2rD|AJ(q7G>4x^4Ux9b`@mnR(iuIjU6@_*tE+XKZor(nFP;8>s|y7*I= zGD9?{z0#7HYLI!9>~x=*ANxd#T@!8+pJG0uMlocvy1mLGNV#)$XL)5Vu?3> zX;AkU)v?ZNK2^-x=t@42MV61SB5B!+7rr$6?DwxU{-yjLAyzhOqjYsx0=xHLpyZ4> zdxsJX$?vI#vY+N1Ffb{JNiLGkUKd4he%FtEeVun(qO+e~E@)8j5^-Mka&X9aR9h;r z-cs(b-fp$0P~+-5vbZ5Yr4FaRdGoG^fV{fr)8};ijG0{zs-Wdp#+T=QMR?7w2RWU%mj3dTokPAC0gUL=hz2pt`-amn#7W=plJC)yo_3|2 z5k9tklYh}VJ5Ac~W%_Yf3g=}5*WAa0y~1dT+bVU?hFkY20h;g$E@r-2?WfmrC(C!} zz-5|f$FPv3&28U--+UuR`>&_jvC%+0CnqThtfQl&tsUxzzIclYj-`?a!8m=mK2*X4 ztA@7v2^7%ce^`*dx`w*cmX$M3h$i&Oa1=l3m+BXO{Ajvw<)e##7$%^Osw1V#JBeY8 z=VUxLFfkyF#S{37PEzg1{qZB4kDs+*qcF7WWd*4uX{CPfi1wosh^U-1t9(_O>mGRO z*RIfWw!x)to#)VpiGoO`yvJ&kBvi&^+%po=7;^#JvJ|q=Zy|NmnKIU8DR3#*g(?~xm6jbgBB4`D z!-{oo-2RHEXR_ohAWb+BQbygdpA88rx*Rhe2&-E=4laQm71UdqqsNCZzLp>v`x@?b zd+q{EzFN$$ns28sTe-h+0m^7hD5+Uvcy64dT~J3NgEdbY3K8&qac&JloZqP&#FTUt zr2Azc5EH+JR)IWO-k`rCn1!r;>t)SAAaN4I^0^jaOV2W&^z~GJ4~L;hrT#`bsn|0X zv#GTSffLu3Z(% zYBAXL{hFPWnRC~GHm5DyX2@w^xH3EmwCcpD$jvt~;Dk6MRzpjEUL2`~ zs_+FEhi$evoJMe@_OLbi3xP1Sn;Jn=P7dXc=gewjzM~l?)%9EcLn^dY?e2~)4{>-K ziAPWx)094E^5SF3X86w}y;}VPyYIDXb(C*tri9c@3Ix0t=2jFq*eBj+LWfU(I$Ak; zgg6pM2?W#(;HQ>TAvrsp5i1A^;KHC!#nFZh~DF>6#-x-O7_K(#)8wkpTV?!OWe)B<&n zqDU;JuQzn(({ekAKoNgVZvk5{KNd9Iv{DI$(4ZEGG2vIjTog+ctw@M%d!;r2r2qEF z-Dk`jB}$tL$Urdv3(xlc`u=P;F2`5Sj^e}cY`Rl4RMPoQe78^3!&em;?CLA;bZho< zing!VR$TQs6+bLCb9oU3EG#dNM$iO-K&GZN@GR!TDF0~$Muz^ZcjB0+(_9n)aDB6(2&Y?OJIk;jXH{%6>ZO+m z^G@PXssa}wDby;3%J)l1{*d6t2c;ZVmh9;^%?mj^@!YoxfBDvF6sbX@T;G&v(D$&w zNel{wszzR;C3XIvH7*k)5y2t~KnovHCwOQSSu#9JeqS$K=}t6`Tp@vK$5zrD3o?s^ z9k*Wu#eDR*l1qweIYP+mNyf__Ya}*U;!fL)fS#=M?~z9vw#Dds`+06s|=5&Wi3GKU`n^9}e<~9w)ruVlgIuTiApzJ!<@4Z_02)Zvfr zO$sw=86q^nn^(3_!?Q``+o~#xj-84A=|)PScD$0U!vWWN0AGn}Jt?jyJly~d-byVS zoB}uKo-A0QFzK|W>oN=53!n$rqJje6rxx0Y82dA?|HYzP`(4Ad|IU2{47J1dNBe%I zJjDzHG%RDZ$zP`&Lh?6D@Rf(thQ_sCHi{ADnbZZ2TMaZNyd^8&w1*kksp~P#94pYhRHr;1l_uT{(>ozkf;LA>O?&uWJgpHTXg5_`5Wu7R4_$d z#&f2%F)^%BPwXEC(W1Ye$sMNCBd&SHFl ze}}t!%V(mlxvHsAfTB{4Rlr4JAFrwlNpR)W-d+>R5UEYB>>D8WNcr6^QS^2Vc{6&U zU2II`YvpNIGHh}KN$`>r!B7d4ui_s##mg~TWvqdtn!lg!I3?a5Fl3R<^|6Zu8+ESSIk#=q%n*kZ>KQF;mYLnnnV4Mr-x z^t?8=0uZYyUkg&~L}RLV(PqZpcl=oeo1#^Rcb54@)hgh?Lpx#?$%hyX`l9IG1IIOt1se>G+Jn=6$L>+0#&FW_z)xh5uDMhBc_oMLWZbDI zr#hUQJ4!8D?qyz=A4Dd}HT#>Qe&|EgpS=$51en|5FBth-h6Lqxn~>nqbVQu$=zLzR zgdsMn>28cnot*8-ALj?pbxtm`H6XLmWz zd%khr<6`M;(J~5~{cT_`a_Q2N9wK-^ix4!awdJALX?_L?UPsiG*0bN9XgxkJxy>Hf zOCo^N)Z?PnqpCf|4AKR1rummda>hJ972G2Y3lJj=H6<%3y)~C@1-Tq>D=(ocP#HWpY1Ap`; zHS=8e_Pd-Oub6=xDPE{07J!fk5sZNhCemN%mP*Re&%{rXsV*vw+;Qk8ae`x)LP%nx z)bpnCS$Ypl-cUhnE*&YS{$}}0gBzrKx-r&dC`2DMWR&*?y5(U#)K2@k$|0@^K{M2w zES!r9hr{NlmFmTCkM_`p{M6Rq`J$-g=xq6p1JX_P1yECC0a!pR+`~x#!n(m3%()e+ z;~$~^a_)C9e5-nLCx3e;d#JH&h{fPPWZ2NvqOdCrL5zf@>nI35@7BQ+@NSF6Efn+x8Zd$wKM4jvDHl=J0mg=T_yIW3;CbhK| zNotS@xnCS-c^Ww?G>#gg*FsuKRC;*DjY(U4S~O2brqFPR$&25lL zTACkX%Mzv3?tu4;O0~utyoV+CY4&^9%=~xwH*TLlULxz2kc+omON%4EU3M_J@WZS( zJ4IGp73Y(4XFepmpXvCKg#yA|W*dP6!+9k^0@j9mvR_L?CK9M%!2OC)x|MWs1eFY~ zS^vY~=gi#OVSCFffzlb+sro7CQ8=YER!#`wj6M374Z>Ss@LgP2IZ(A8}GW6Rh z-DypUk#2;#qAoX!Xh@t;N>e)gQUPPEdVvQwsY0GDm>cXp%(RR1PAyVxoxj-OOh zS3AsZje<&)M?k?kZ`B-O)~?V$v7PA+qMnM7yAM@HZ4C4QejN$El%med ziAq%UWy>Vyq4h-Zfl`sUSEJ2K7eKf%1Y#8X-8AGw^Zk=2q!gn`x3jezlw0{-fYo-A z;$h~_jJu8z&l4>Quf$_(Z400|^(S@!heQ#j_-|p4v$rrr_*5oblyTga-sdKaXn+7F zCZ?yLV4Mj6_ZHxIr^A)Ufcc)I-4hO$T<F!Jjuem{CH2g7HyZA}i%=#PQ52=CjUWUppjFu}& zLdwDYo7|6hP!4eYgyfu=fkxPyZ)BiJ_$5nwcKdHE0!3-R35b0M9ZW;eQCPhH^YumX z%b-K&XXt0Hvp`&j@4rBm*}6KAE;shDHibisYKs(D2n-B<{cI}zk(fLfJ(Mr^M zDQ%LT*6>%(0pQQ_S5D2EQw4f?ehXZHH_grWS#34%69n9OLLzDn-lb7jxiZ5 zdx#))0D;|hqy!^TNY~bEpaY9%9xjMl3V0m_L{h{WD!SLQD|R~IF_2R##@aWeb82}X z+$`@33j8q$>;<0}u=C>L8+6Yc)1yIZR)&f^9pyc9^9q~G-Ag@dTm>#(kjGKMZeA-^ zxp&i~exZ@+5<;95gSubq1l*U7oPA^=ED8GQJ)>VLGZKJ>-nQYri-ia*(JK~6V4>2a z)JqNlNZ#>&P^;hFH5#HG4+QVP@Q?6CiKp;{VvaKT2`MdQvpyzl{9#uo zEQ=Z!ec207vv#4-;s={EHRjDLpuxp^)s|X$aULUK!8(k;Gyu(o%C=)R4PdN~N>V8I zWIfuz8xT7j$lmmW4E@%RqS%g%<{UJdP`B=N+@C=orj$M+KOk>=TGI${lhzIZk!sdY zKj}}&Gc<(Md@iQ_)cV#3-5-6qY4c5NjEVE{NF@7@FU41$aD=EaBO{NNTS;A_Y`1zH zqc!2b_sa{5W;Mn9td3j!hx$Pf$AmXHqcC_R*&UmnCULay$idBiI6WA8_YQjrvQ>5ccbt`@Gl^DeciWqa%?MXF=)yY zqV>k@?6_j)r}z#uI#k##`pi4jEl{Sq*@3&1!oMN_d9>@~Tk|PhIkzP-kfT0?Vr4!0 z>`GDy{|1_#G1ye_%y~R<2aPw{6;M99XtDwP-V_4^6cG8Po{?D~HyAuN-KvV0A7X}p z01Q1d1?3|Pkn3X$tvD~qCD)8~>p}EJXX^Eql}_D?sM{f6sqAaM_;YzY6a3D3Z%SRE zf8hvMAsk}BfDfU*8t3W+IEeRgTvF?>&kHS}sAmp*VJ|C@rC6UrB#)PVh`KnRYJRkZ z&iKTq&@`+46%31xEHCpj#!JUb06a7!x5ij)CjG9q6^e%f^Rg@I}h>qAR** z#ndQ<37XJfH=l;+z>;7!L-Ohp{QDzmH3Li;Ru_>lUZ2J?+y~brk}n+5&x;7aW5f38 zJQenj4(mkkYqHPo+xrSGx!`woCA|q?TWMY~iIc743$GNUlRUadEd3&Cq9C~iS_RLx z0dr2hI=#S{nq`Zu)G+~hThCU7C21L1I`4)XaKS(Ko*IOu^Pa6}0!7MzRBzpMcf-OB z6;4y&9&1E2G;rTO!14eB_?h<}Va_T?p?(7;Wr6`kf2@$qKI)TWFQ?<=4{8c76x++n zyc+fDXP3-(GJOtR90L`<1iDG;q5`ctho__^I-5nfhJvQGyX3dC zpu6trmR-H1-LIl~$rBu6L7|F=sG3-@)tfnoK-9W&z{-fTB+CK*%Pg-&M*@dRFeO_M>Nufx6|x& zN59lq3!e(!6w`6?)%?^aSiGN*tA6BA3zffmTlcnPxSG4UM@p-4`9z{cZ@Xa7U_xCqd`v+zg;v;L?Qms^^8(EaW&O2|NCvs96&EGFOP%sZF_rr zZ*TAW_wP?nKK~5M_vtSk7*MTjUY*Cwn_p~Yz%!O(SRX(QrK|ou3w)B?V#BVW?tA$1 zHLNw4%nir5;zh;T)8O`rqDP5mJ3(34O16TBaPmQc;gRPZIGY64K&v2|1Qo^$j&N9w z83z!@FVHvUWgnT6l2V*5i#Toyn`McB8YH4AislMLD-5m)IPF7Zyj+xoP z%Ifg=7~D__fc3z;cbLdT^>MP^`~GAWfHH9%vSD(39)xw zdp}ECY(H_YoCmDsO+1k{SH9z9Rb0P2b}4rcjM) zIuV;)k&uw=?d`n+|=^-286VDI+#+1xSy&!0aLp$Ept8Q9s` zIXD{r=X`5FJTJ}<(BkC#JY4SN2zXW-bn&yYq8?C4)dn}JxgSd8#9rhqcN;u!b?*BsrKt286YTAqArh9qhan zdb3(UfjfFm80xsv(fKI7Gh&ZVPb*WRn_F6H{d4+w2oA*m@_4}W*$?UXpTom7`W@Vy zob$ij5}jutybTIdXUo;n6>!c85SFAfk8VmR-Km`7ENqS(gp@K4z{uBMAu!F)%RT;NS@7 zA$z5*!r$$w1HvFgBw1ig2n+%|6WJcgZ2QA zF3K*0sIAAtRUk`GSxA-ESF(wZzwDFO)zwu}QldgTNbzel{vlWzq9-Bi)Ycj`th~Lwv9YnCM;HFH!363B$BXUK{DC6C3gaK}?y;8l_4PG3HyINkF5B(hwPeU9s0t&)Kq(`WVHstNL(!-pu?w zCp&w6Qr$2;5YYRk z(gIr{WJTdzc)$hkf8bjp>@RJ;>q`?<>=9^FT0i@=$KAY7>`0NyI`%ikT0Y9W#I8$O z41mS-l^#*|_9Tq)ff5T7TyiAN_AyQ+h8 zun@);NC=hk$-T?s|64F+c|o{&c|HpQkiBkA(}6lgei?>t&h+UWCoiUnGh>=Fy?%3^ zWoq7NIO&Z%_zAH|m!nR8rrvGnU;-4oxCbrdmwH}&+g4?(n{O^PBpZ^%sBqQ=cUkpb zJO*dWcpw(k*Vo6uz|hsz&8IUoG%Qd_Pf1D1%0dW$@5Fjwywuz7>5Tz-1GY55{~{Tv zRbxPej}MZ1J3Bi@28QveDWxc7)Ub#)0k72@m*(YZ&W#Ef=oI10a!K|M}DE*r;}87FVDNXgTTU+2!K6 z`vho+X;4z8%PnN@fL$p-rGx+5IpLGB}W^*3cVj5XgS0X-3zFuPT`GG4lDaw zoA7?vUd-e^@E-<5P6nb73*wTH^aK$3)|dwd2I}e(=+#{^kn-?oF=EGjA`cebzPPwJ zI)dxL{LGjZ8XB6DlM@?@q<53X-td{Y_=mZ(j=i|_UG~Of9kFaX@Q5zy{A;Fk8q_TM zd@HWLZYg`o^jkDBEUe9aNrbO3$7)O8-Zl<)B+m-r+V9f#oT|Dt3D2IMS>xa#=fn-V z{4zqVF4tVCg|}jy5Ju*39ZxuWUy4(h@3`|$ZiwHdtiO09h=0&LDTP_2cs?yH>X-2T z0{Bwc@=&<~8>`+O7W)FWXJMX=n+!Hi6#VEG4>9G}8}G&35&~m~72^rApCtNB2xfBl z=bw7Bf|S9g!QY@d5g+g`dAB`#pMy}ql_B3?JJBDgFIBcndUb=R!KXnC@E@o>^lyR0 z{L+ZNRWtaVfPes`aR>+qROqrUE-nfRUsY)LZXN>y0t^fcE-U&#?69za#q7)cZCsmp z|8#ghp(Xf z-7{W!SUPcRJ%2{8in8b8nCk)q6y!CBeabA*GW}~YIi7?nGDWZaHL4^GeIy#lCjG3% z$6+9&;HjsI@2EflAs57oRJb?+nP9QO)M5kq-ZL^*^qjakO{w&__C^zZFeJF)MvUUc zg~2djBH){le(+w{mn_@ny-PvEU_B6_l^I>2^J0x4jFlWoYBfVy+k@8 z^en7$8oKntg|7+1n#zWT`ZlM!#Iw!%^bQa)yL$4YW6SWJbnCDdAW?>K(s`VPW&oG@Tf!>DY6ge3-`tc@qp!l=R&<8c;Q`gZ9Df~1l@y?K<2`} zpm|YUDn6`ZDycu1kYwhHH!B3eTb9!(=b|dO@BWOftE($0D9Fvt1u1lKF?DM?13kT* zoZR)zO+!Ni2M5R8uV33X%CfS-c_^~%@_O9Zhu;qWaFa!-rUc8?_K_8)(n+MEQlzQ? z(i;pB6yrW+62&wNqFMgPG^@#l4jWixc3Kb^=BWHDtb5?NIM|Z?y$tqQEW0=brhGKK zM=Yc)Uz8RbK9WA4ycw|~-^L2S34srx7!o0Nlb<*PbnDhEH_9gaNr)SmKquI=yd>7e4x{K(n1!6BIIVg2Ki5d7y?y>bGy-($e}D z4D|H$fIuK^Lx{O4-wIU!b_lC*@l24PZxv+)#+3|%A`OPeuMx!#H8Dz4Ecy4?!4&4y$#ojLaN9?n~-!UELLKhO;`#R4KB1zCui z=F85oS`l-iXMSnH%jv+P#x)j)pn)dD^)`ADEAHGmhj@YY!nmZ{*6!^I`UYkQK@9VP z9H+J&-AfXz1-=DI{6#_Cst#r4+KgT>_qZ<<#`9vc%m11C1+~@X54_&b%Z~hi+sQyt zVp9_qv&+Ni%4lyXs&o(D4E^UBF<;RA5K#>UDPskJu4KtpenN9G}JY-~97c`E4) zvp4jw$5qb5g|{uV;ia@4eN(Eb9}R>gtM?uPa>kzKkS|^uswhJ zbNF_+!_lM1LYp1Er1(~zy^eF>f0GamR%bwbWX%f zm?*AUo!4vcoO`IYO}T?q^P{ykQhnX;7QM^jUpZL!NwX@@h#@=S9xyK%w+(y8gKEIy zAp&4JQG(ST1~J9dt%^`q*e&U=feQnXD9)Abt_M?9x-Hw~-5zK7$Xef63?mGY)G}fj zx&AAcNl;d zeJ6}4 z@mwVBfBn{{3jcy;ZvsDyS$}|Bv5f;Jrn$Sj>*PHU57j#5xY_9)YP0k$0|`Z+O`DTBNv&8#Jc?mSL9{~Tgu{oP{K18r)0awys}Y3;EkyvrRwm5OOm0Z`8CgB^e6iGH<9|0TQ2{*+^QBe)mhwxr4aS?7@j%jIBPV*Jx2fOg47G7k=;A z^;dLGQ(@^JQOxIzZk)EtsXEQc0{Azgm3(=g-}v&l+8`y}^~$#~Y%*7BV!hq$;gFX? z*5zD#Ml8G9FU5U+OeaUC1jfdFSH;F-H>>FHe%v?o_a8jGFD%*(v6Rg*d6#rmcD*%h z5a9IzA2Rhqll%)Q$vN5^dWw_Mm$Z`Emvd`1@#;iZYE>;QQ7~8No|cv`gH|%>#i?gO z)zy~AbzUiLde=a`^;J7Q!jA(JQ~d0x($fBX@^es(UbF=N30Ea*p=GDn9x_hK+_vh= zp2;w#;_aOY1tPoINJ15Qhil|Z%(aiIdX8lp{J^-2^g;2s@1opd2x@zyO0eLZGA!=ufU( z;Tk>H>#(X*RkxuRCRNL3oeaqYdDA(I`?NgVBdM^|IF4DYw0V%os@6Skw_-NO&}+9@0gvjQuxbvax%;(d3^kHMv;=- z(K=xhu6ebQ(C!Ysdy`8XY<5)le`DL$K9(SjXKje0dzL+(}W z#p@ItTLyv^@F^;9gc`N&O@PQ4G1USIn?wnnI#VCGs0`=04DEf&kIT8it`ilx_B33t z%^NhJ>fvaM!b)n=3NX1Nce5cHp(mhEf&CMV78auJDs&*Z@6}CGw#vxyaf_b1wMyx* z)T=3@lKOfwIeEA+Fp@x~j$Q;C7xIkkAliyiqu=3id%OS&#>T&~#K*=B zSu{3Hqh08)#M4-T7MKNV|B zmFPzI(tsZT&H#6qiY6L-0v#ba>Tq8NCo4SYN{i=!V6nwP-Sm8ISf{5h9-4Fv4N)1? z7VXdir+@gmC(Yk}Mn9Uulr+gOXjV4Gneo;5O7YbO)DD_B2b}KQ=7GJS{6?Q=sQB&c z;|t2TBO)RIbxy6|_3faTDo$f>g?;$Ck{?}R7TM%$Xfec+tXr4K;YZ|5F!D^Z(x+wUTof3b$7tQt0Hk2l z8qTiM5Sq?6f70Pq=mTv`zT_Zj!)J`5O{m-L+p=qQMC|+xE%J<$k-5S2XsZSj-fMql zr&>5Qu~pa7(lRt8Nmw{MJWOTKf~^FX7R@Rb??%UCr?NgCO{RGm1g?i8IQn>3nb#%Q zO6h?4ECiby{l>GOh!Enw4Oh_XRKS;YxQ5x4Yl0G*=I!psaPbX|@m;5lD!ldzy~yo*F! znGg-H`MbmE&dQAZvD91c$&?+!DHP@tz$W$biNiQk!!6DJ1yjAQ;j&4DU1jHERF51Y zlDRn6MPn>R64ut%_V)I!uCA7r2fe+$f5yMn81^W!VxcLAzfiNA%`x5WIIBC2f8O7( zmUO_emOL46P!K^{LM6J88R+#&t_8+eMJxJs`^(jt>XfNdHquQBNpko{Xb@Qne{$Lh7>1g zwlA_~40GXa9uszRv-FdaZhlIz;p0>OlM**vih&S#8TqxC66BUB(4)bNumemkuCC)_ zW5*{aYpbh4WtZONS69x0QbdYsAT}NNJO4vEzIvnmHg9utWR1KE`gLL|(R+RK1XDl; z!Lq!TbNtY*BMcnIIa>YaV1J&%CCp1pLdJx%4}`aF;Q}emlKIFvQ{7%#p#QqaoiIA1mclCNKEW~ zKcXvKpw2CE{`4vAGb1x2V`Wv9y{#<)Az>#d@5(F`k5C{}*_lr3FjPa^JT2@)%lqEgb(;9z2+{*?Z@!TYEsEh_}ME=yc=~!^7^w{nR0Sz zHrg$+jPVyFmm1K|-^JC`uh<0!zNe?-Mt@TKpDTH}xuKaM2w_@LAVG*pgeW}+0ciJU zY@T!5NEdk(cbCz$%KLTttP)d4XfZPlZgA##A~cw+MZbcrYPCN(D;DjraPZLs`^P&R zBaS0MP|VHE6)#X>#Qv6&0!rcC+}+VCJ{n5#*x6NteEwSb`Ms<**;bF?~R0tX|%TRTY5s%O)i?H8my%A#Yk)MrLGs zx~8nm+R>2&A0PZ1SRBMU3^={nNK}-YV9@dLLIrGTf@VovfQQNngNC}@!t~flifd`L z=jloUaGW+;Q7=y4q}o4ZkQ*5c>(_BgSs7i-(Dls?Ms%&ea7B5!j;<~!Z5=TNer)+0 z2>wXl|1ItLdgSwyqPJn;bR-XsOzL+yW#7S&kZ7sxAbWe;eq(^_Cc=F%oKNR`{7I3d z%`8CUSFij!Zu(Q8376i2*hb-0TVyxiEauY9Ry9qZkamFDf>;!bxUH#lu&Q)W-@qHH z5;3}rR%s~pz9Mzcug#&x!XiUs=~I&d{qcFVqs>%xCHf#uj!}IeZ=Qcb_7XOB2fbj> zrMG6BqFlL>%1C6~6btF8wjdq>0S7K33ro$&$jHRR#P#*{{{DV%I-5Ouh(aOje()=Zgbv>I~)-aF^z?h z!^7fBr)zG^6A5vvSZT@zg~IDAgQi$%L{F<#VoqnFBhdNDoos1M@Prnny%X$JX_z1@WVkALGXct z7yFZ0tb#%m*?!chdYWd;l9C8q@qdkFU=i~_jedK2HgxhZ5Ds|k@%M)qACHuhx}-J{ zl{|j%Y5VXLHUGn`!vah9;#Re>>vrWhoK#S;ZlSU0ckR!aAi<5L9gs?~!Qx`cug9gz zxjI7paS{V%(EWa^*P-wDE`oyWk@(ETyR7);sO#H?aqy=N9P9FzIhCE687r6mR$_RX zIgY{8(-TNy92^|Lg8}jKj{j7~BTldhVczmdK9K8_-|l&_3DVF)wIdGj)IjZw{<>;Y zqwQhBsSw`o`-c|W`bu-tBuS zsfZ|H=*a3w6dZ_BCwUo7cQ=C=R4e16iV9nE^FPPO_~__KNl9vYdI|wEDF05kH?B4~ zEaZ>w$7yh2jZ>R`Xy_c0oA0OZP%EKC@WE0^O_eX#6QWHM1U;Ee?*lnB+@*&O>MiSz zBYX}Ao)AQ4M_z4YgwpU7V$jIoiOiK`KI5FNcHAHa0)t z@{bRBr_FYqT8kShG7pVD{f)DPEI-dh7&`F6N`2W+TSq%WC6enn{+x}22F_IZakMHE zlfIr_NN8wsa&pXfk{w^M22Nry6B@XT_R8iZMDmW8uWBW(zbt-BI z`sk>2J}D`Phjem33ihV5^6>aL|JtSNuiNVUV&J9MQ?j-wJ{=uoNf`|dMxMmz<)gga zop9m^n}|qr^;BE!rKsJhG7Zn_Q)* zJ$qY$*!nWAmezrxrUy3%h8$^$ASMpXZ8HjDg72BGj!k+ZSl;{k5Y(?1sp>0uhF4PF z&+3dGOw3B9HN*1D#8|hE_2{%L3UKi3VBW)yJ>=elB8xR)InghL!=at%%5tv!;X-B<{Ni1WN>j9VjYj%8#@5 zrY4mmnW5vp1Q-OXFFe*3rl=De^w10k$NbiSkI|Ccqy8*cJVG!%J##=rmMb z;(pKXk*lAqn37J>f-WgOd4%eMAb~~@mK~p=IljFNP=B1l#%x0sg$lfs5DDQPrXi+y zf{pA?y?@G%QY9`uCP+#@CE@3<39s>cd0$`E`D9xDFt|HNsi8J@^jCpG?>DFZ110TV z=!^K`<8f3WraMZ_mg>NfVdy}5j;Xr40W1t_O%R;q<2W*c;;4z@_vI8I(?i(qosGhJ z@OSk4)%N8|!it32>HWdjagtI-M#fe>W{{T1$R2XA+CmHK8CGA%N3TmCBmlu7MANvfp zGKwKs{Hv8qAKPv}RN4A(WHhd4X-7wL+MIQnRj|jZl9JkTcx4IKL8h**pv=8Nfc_pN zARw!MV04(!5impdo2n>SZqg+$7_qdKJs)1F4pzA#PO0UKTpgkzZa#UHckq^@l>(U< ztOeMM=ar*CM|pJbZE&!X@!tN^U&tr*+!Rf6MeBQ_a)=ym_mn^9Vc~OT%X2PdOZ7RUu-2D6sermwq zY)iMilA@`wBAk8bp~>Dw|mY6i1vPRZrLLBBCr|sKY)kZ`xd%veHhL^t*_bZ z<=x#egDtPG--09y8XEQ59+4R=uFzoUks~Fb%j4pZ{}rzw3^9Z*;Nc{Z(5K(=F zbsf)8mIoupHuV*(GRh@YPfdyYt~$?8^;ua(U%-{b=^5bWGstMW#O~%t2Wfc(^|m&c z46*<!?lLi8XO?JDKReSnVV}c)7$E$507pWkk0yHI!LLq&WF4PGG0Jd5DVM&&(i# z@oXPtBfu9!lrOKY7N9}RQqRPQj8oSnSj=>zcy5cD*D2@uPgqz7!Qbr4(pU+iGOfnY z93EHa@JA24=IC=l`hZcldA*>k&~U%8GIjJ9`1od70~yDuCdcXw@c!Qxy%7tj@|~R>Z-`V44{mQ!X9i~I z3Es4Hnf=J?I}aUzH-USw9klP{q`i_Tmq<)i1x1|bXp#J04ZN_tTqDNR>w$ zC+c9iCYXq!0^;+`P+^&c5#EfYi1&J}@8@6cn#Y@VMv) zs`^2((27fzAL|{<#)fsW-~|lKGyq7UM%Pn+?d0d@qmE(k_pYmgO1x1esDdP0WN5b+l!L@fUJ(yuMkB zhAV=*xmy<&F7NIARl#{9uc%N3bh3*Ub!klc<#pe%5#$wt)A#hYSof-^4CWx0mfL>s zC+}9kw)J^@<>B?DnUWthiOm*#uD=d?ib#p63a^hUi|+4eKN<0U1%F4W;Q_V=ck`wm zZ0|qX8tCZ|++uZxCvZE&ni4-(ap*dJE zEOs;4(v+nGV`B=+8j!J~D5nd*CxT=WQ50$moF0(j$b{x?xDK&*v+8Q42WgUnF zn~zl9TtB%cW+N-R_seGoRv|5d=CiyH;YHxf3otne{rFg_G^JHzv6+j#wovF#3!k80 z)hR>xvr1D^5Pey0y`3{XU&aG`t6NZe+C9vQ9}ZF}fOISUYcdKW3k^y4OAOApg?;pC zIF(06FqKD`*Hmak??;7j(S@xo*K2)Pl(+Vg*1RihIzUy}mwxXNc#o5)s9!W6X$ixR+ZV>}icb zEPy4#PG6T-FxYoOfe$ux5@3F!Zs|)zyXG#iHB`@u^X85_UPueJuOskf^buCe!)=6u5UEs7rbDNUiYA$X-o{>1laNAG?I``3t9eq z)LfXa>I&sa*CI_DL|y<0Vm0O-a6;lHq#CVe-FZ+72ZJuj*U`x?_)7#O-^NOTYH4{^ zH8ssxW-|aD;;kU}DZ=bGUBY>;lsPt7Dp)y!;?cZJ?an9>!J()I@VC-Tudfq=lM;aR4D3K}Z}Q(@E2eR4b!c#8rIFi36a8}q0H&{~(kUf=PV17ZOs zC&#+M;GNEwK0#$uatsha%k5D`s6w@{lzi_bDtfCop#oyD8EOv`j5rY1o!fH-Kaiur z&Gjj=wE6DW<|a11iv92j)O-PXSQI2sBnL+2Narhd(;MB+5yj5v9Th!*BJwv463Ha9^sF z`bgTz^3~KDM{ZUidSnUIW`m9gwznn0=~uyjUsyntFRiaL-`ytOWZT-#$;vhvH8R)&_>@Zc(eq#?B#kbt zdex7)%I`_oV5Necfi%ABxk*6>H`K!J5)kFBVLv$Yf4BE6#&~<6OE=|UlpOgyy`k~$ ziK|0DGJuzUH@#0rbMR{Y<`tW7w-uTQ%8wF=+j{G-dq&yZo8pa|MacOU}T! z9P`Jf>Wa{g+Sm<$i_QkobHCNDYoZ8@!r|i&?Kxs3E2}PEOd()_Yb1RR<&|^Fr0q+X zME|c5jzn=>!OD%x{_-Rfs4?m0s}=p!)bMcY9NekQ(Tgh-@|K1!2dUgxy{TPglIS1z zbHbsDv=oIdGB(Dq*|swD{<6(>UxI8@ElaWCO3{-wLdD<6V7C&|D;F0vrGAt}`~;HM zM?nL(pRDa5Bonp2|M-zK&sUqGzQR+ zE2nP51BEu(`UYfa6yBST1~vlH1dsrkZPE#pQXS@fXy_gi#s}ETn%2S4MI+u-GUGgS z`(iK+uX%2r$Mf8t0w$a>8OO;z0D(Y$zY`N^cdkVsnF>hLcH$ubnFdy4*~ViC|I(?2 z7Y=KzMmr45+SBvsal#rwA1wt$WU@H|Fl}C+bVO{UG6Wo7I4PJu>**7j8Bkft0tb5v z9!SvNKaz{{X0d-DVHrp}Fa4?>T!g(HVKdiPqdp>LUnhk}CZC04F9)=IfT zw#}YY)3^EokKuOLg2YIrVTp#LT4GsaCx@k9u+NaN{d6?ZWMaWi{wSUku=Lo2v)U|p z7rZRyM~{~LXHu7)mDJZ;o%p}+o;-u!y1TQ~t#B68+d3MybOzhx$$YAYdKxq1DC=m?;bX<-0scq7_`;tFX1L*1m}&j(740iu7{CkbdB^ac1lZY8 zabNB;#`7>#nmmEOU={K5UH){D^-Q;QQc+jXtuMPmpPW_}2mzy-6-6Tu!BWMm%NI=}K9=Mbi05D8EqkQ_qX#A!Wb`jvYCTdIku5_}MgepVbVGYJn=I>pgt-XBezpcP)xP?uk6 z6r|F~%Fa1?L%7y;B-K)H7#ujc_n%Lop~|}kg^eIQ3%im;M)<}|Uq$Ip7W|~0-SlRB zRBXs-Yiu1H7~0*kUP%R`*VcQ5;b8q02%UE>t!Cy0nZc{EXSLR?SnpWsx$!|o>Cp}?YqR;{5%PtKuyM*egJG~?&|^vD0&<- z5Tbx6cOooJV#2{KeR^KY%4`@PgGf^2{Jfqw;yPX_O0@^B^sDTo_DUQdX*oz^-K!@K`z-qF%AYY`qWF#P_TQ0Z^7nq`D%{2YMvrTD2aeR3 z8rU&`lR95LPyu&NujL$aAxPzPiWAwXK(V0Ok&~}9NVDw%$i`VNiNby5XyJg!m0Wg9 zf#YL!=NCPn?ESRdV@KBB1Fgg7g5Z(!Dc5X3#Ah_LpQg7J)S@}j@iJ3knLws%mk)k` z{2;dIcEJNytD5dYbnD8_G}A+lhVba>5^6~stNDzmpT9FXt*-}Y7e+y#xJVJMFfeI& z$Hx2{uJYiZf@-G6q38}De}}Iv9WZF|{w*Gb^hEdVO=QPqX|x$PwWQ`qPM70VONOJ9 zP@BMa48@o4S{w|k6-fOIHI!sO6zw?9M)jZg&XIeR!H>a73$rTPngnQ-; zdgrNLW5FzTzJH0mhEnncnCJAz7YsDQM7khao+EhFXD_w2zLT>)bQ$&0RCgM((KO2! z9jGYNPoTWwDn<6|9sU^^NvQJ5_qpDKTSwz@SP$yhO&xt8q%2(c;eLlm zSnAfCOAeutEi3cI9I_cD)!prjdFzi|d4^uTcArkA+?zxp?E5x~7qgx2>YC$5)Y~LjkgUuBCOHpuc@m%pd5n$=+;uE zd(N{**m5hdOU{`Ofi=Dpo4P~Z(QZ=;CPP7#qY)aK)2MRS3BLG6yHQ+}%Tar+3tZIP z+WP4CZ*)S!?Ck819czY$@j>u-?3qITPbmQUGGKe|wDdWab<+`7Xv6c;h2T~AmvayI z3J9re3=aTsCnDggxWHswhOl%n4UPHhyFMN>JL7Np)vUL@sy3?e=vQ(R8b~1aqT}K5 zv5vNOTYGy%SXg0UAtnwE&p!+9!Q-Ss@Op69B_pUReO*rPZ?9QAj&X5uxpDD^p@NLR z=;uh3a`_%+nHN})PwYkP{d=Q)`=<=&sQPDE`WQJE=*b7D`8T+A?1*;kZ&E| pL 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

          AXtGW1|J~o3 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�n1>$v_Q)nAY*8|eSy zA~6|35h%xSVpE`ca7d38BXk8fGmg3S`zs!YJARjQ ztnCk$`t2_dLppAA&B*4(w3L18kylw}ElRz)b2y{XSm-gj6Y9U*A2;^NrSy267Ha)= zDHw@x7@!q?LJS-18$m+K6e|sWEfeK!C}l^PbG27?*DFkQpI0X?HpdZS^!3ZK~i zBV16(q78U+n%Bs;&VNi&ZR*|4Q{}JMi<6$Ffcv4aV=E2@ptL`^eQNE29w26fJo73t z;gp)V8&mfgL%O6*px$Yv)uv=3mUHfOXU-inHc)_pc_gyK<%KWH^-&40ri7;`G(j|G zG?aYL{>p2^+4_{_OOC^1+;88bj}rs$Bap4f^pD;}nf;s=;q%@5`OF#TUv=O&G4Lt5 zk>T5EGX!p=ML$YeaD>irZ#MB-t2kd6Hq$gqAMC>@>B*sFqbm52t9O{7G(PZ_kb$tH zgPU(-H69`~nb@|%c;kDSiUhu%Kz;^OkYE+x>obv&gRpN~yU~UGYsQqO_xg|cyb>+e zHi6+GufB*&3kM-&eYMWLXwU0^pw$d!JsyXZ=HtC4yHES(sk)pTxwhp@&dm;v)l=G5 zlw*ci6EJD+r-+bcQlhJirK(^lDLus-^6I8jokayoP4vHhnQ0XKp!eN$R99=+dbhtz zfP0j-h)8PNZ9gJ6+Y>hZ6$L2cI}?lT_r+77rofMS4W}l-ZiJ^&zxK>q4?OnwAS`um zYVAb-FOmf-(I%^Ctwt`~=U#;b)D$`8m?@CE+3s&uGMuO0KOohN8a9!>$0y@p`S2kE zi}{&ksqwinD+W86+VfbqMu4kIji2Kosm@WIRYZv9RGV44&*JZ8SS)5+-Q>o<@{Umh zbMKjh7r(`Bf#iVm>(vv%m?H~kbkpa#k<12bn1`JnirW-|Tl;S_k6nHP>P?Uu*(llF zNr_IrmD9p%lSQrX{-h$x=S#b068V$WHusBvvefyHVAjWnxYzT57vH`Sr#Eu;za9K0 zTK2e9oTU9vIF^A>&itEUB+A~_1PXUOnpq1(>w=5rxPsj6$MS$p4g_7&SZc&}h!|qE z-6;_Jz|}63?Yv3^#jjpu$>6x}3%Gj?xJ~wQRP`cmSg+HfTyES8coBJJ3)o-rR6G3P zFYRV^zaDNi^~9exU_rz-E%T} zb$O-P4U7F=f3Z}fH|P8M{EM;S$i6(SER_>H^*xH}zRc@74)3tuorDHS(blnMSi=mnC+fK(0 z+0n$I-{$Y4ASGnhuQhEc%bCji;$t~x=)E#plRiOt_`0zqtDtnO+qTsa@Yz90FkiA-Hw=YSIIfR7QTkej{i+Jiv*(Bm%+ac%G(IC+mrKUzq;AAvQ?j|G< znde&(V4}L;yDxl_^wTl%wsaIx#=Pu2$fF5qt8RAL|4Va;GSj2br%{QlB5d67jMQ&G|8(KWMyRMuL)=FjJwR9NU&7i?Ne!mWdD@=xV zD;HVNfFs}}LST$oEL3|;6XYk8>IYM$5SV3M^qQ>>lFIyxM821+CG{+v@{M)S^0D^N zkiXVHLoJh!7t0Dz;;@m*i|2*Xox5AZbu&`oz-dQ`m*<%uuEc;ZN2|Pnui4rod>tq~ zVsaX`J8T zrx!?L2o|I;3Wc`o<9JS>}wa`knV6>5U10SEC%!sGm*B%eTs<>1&$TGir1m z;bbdnixc=WF&I+%gjv}Rix(A+6M7mtAdPhW7G+oT84h7@%T^r7KX{lopSfIb-+e=e zE16A#U$x*z&KmIiNJ-I5Lme)x(*cU#pLr~M7Hs;FPH|@s`->#)*iv6Nqm#jASPQDr zQpnb(J+&!sbur!j71Qz=ofMygK2v~p*})w<8Hd@ZYK5Cgk&5z3#f&b2;WR9f(qE(H z)M6&AMRsg+kXW$FRQH#G-7Wu|K(5R1<{iox{Nzh%^0XNbm;V+6-Ulg-;seom1v``5 zWeVp{epW94VZx;efFxyZC>O6`%_K8lU2?hJEa>lgq(x->dROxw?aNI8tx{cw+HUji z=DH}}BabVk+)K$Vi3*y4$EnPhhX(FLUQ$vAy|eBkaulUJ{JE$`q4N6VondH;<@TgT zORUIMjB~rkQ73)PMZJ=7@fVI0`NyHhxXfXvz4ui<6xwObx~=vl=O@oT;0o%@N4tEDc5T{9*-eR8qK6ka`}=8^LmXOsSzUl* zwR{tv%KZEY$%J+O=232Wb;-9n4a_M)$I|LUa&%RgyZ1gdrqpfVnTh)TtPg$3X>KFU z+>hMB+b!WLT~_GIZBMD!B@wf3`?0paIBTaw*Qt+*8IRQp`etZJL#Yt1vTgPZzJXw? z-N1zgt?-%cv(kwzEtwnHI=oeqBW*%bnPJMb^dIoPTg##mmB1*LFpsg?#*r(D$2>rW} z%-9-;S)u_Rj7Y^|PQk!pP5|wH&Is+#L~Q+y%W+VYvFM6{8Pzt9G4b`uV6s`s~Q7$$e;gc>=a3*ly-N zM+$?8MZ3Mi!~0Y{y|aV{S)j`Nw2AHoaCrH{pH5!6|^@!(m(w-|AFCfN`Uu-Uq!+pIGrM?no{@o zeB%^#Nqt^U(bYWMCW01OwcJ5^I-R4|h~|@fk+cj&`po6@%cRKjP{0XK8*WC5!Osj& z$G)`CLmbP*2KcrznH$5)?gk=qKks`!rLq|rL^55{7(jxpbY0N*(MlrCORH!1Td&16 z<5P{2*^~B%X!;oq1Y+`EJNHd2_s=+*^(S*9%1o=qxJh$?7caz$Gjq{%P7D66vAyI| zNuMOEZ-cpqv<$#lN4v_;Cu({kr=r>uQz^K%I6g8W1yd4$xPu3!$uViShPO}K^10Ub zRQF5q!CcoIt)ogg&PtiB;_|(r!U6LK36i*cSOJzLF*|Kr>}Pn zHCm@M+X+boTfbMDy?ctGhM&;zTuCdOfrKAZ=9Sw&Wb1YUzR;>?+KDzn7j=BqsLKf%g8YlHr zTEU}7W|rVgp?afgk4wb{#HRL>@ZaJA?zb1EFw#G2cG7(&Fm>V%@bjQw@=>t>@`@XM z<$-3Hn{~F2sTWFc1*5$Xd7?qzgOa9RUyYKqbHjstY`(SAtSz(Yz*rk9klz5LRuD?U z%rjp;0a1_qWf$bN}%@0mb z>s*F<{RmmT8-eM3)I}?Qet_;qJp}W7@Ak4FCU+B8&90q@^w7xQ+f0 zlaZt@C`+_Josed?A#m z572}v$`xRhOR}t`V$|1udWQZ%7OMDx(1`PFLKN`W>*kZyi%#kHi~{WBcI|3r>Kyp! zcHKdAQ0qhY>W&DGtQF^i-_e+Fi*-&w*vW8y*Yw}7SoAartz4v+5Dcq;Cey==kiU_C zuPQZ2c_L{@k(I3-1M_5$H^6z8| zG%3r~q1HoXR7#vSc{ip!DSHWd)N&Af8eD!J-^mMiYE%>0hncVvF=;zoe?A)6mhU}` z{YS)e>(O9kl?QhdDZ|gcE-bB8s(mq1KW~qo)3CoWKrRo?7%Bf#G(GsI_GjMe7<ust0mhyI+PX=R4o%GV{a3);NsGQ5QhwSU(>=kGvsxW`D)g1 z-<{;h@`k7MUn5>2mW4!Yx(cnB2f&3^U>Rh3)7= z1SMD^N?wMqAT*H z)f)xgSMayoW{AJXwas zC)Tkj9pLSd$kTp>9gqD&`|`Z?Vv>bCA(MXncBm7>xGbd3M+~n-{hf1)ac^Tk2`O`RjGu@khXC&_(c%45bsj zrU5SYnze~*v!S_D^q7dYfF98PtT_Fa_o>~^TkiJ~sn}eb9}X4FR_G$_>DBvAXuaNN ziuejh0a!EH`AzqiMhSxpQYc>RZ(1c;KBb!aAz7v1aNqIUx*L6qfSnLXJMnv5xU=Mm zjk`Zy#BV>2$m?N^62&oiUP)x4ENTwFI^MJf?^XbI68jSdGj0YqA7gk^^qHKbTT;^q z)ecsg++tH*`~4(6IO_{Avf;+pX zO)iJ|-C)7TI}QoJl&?YZh@RCYm2UXFDi#xV@~wk@^QO9RB0mECIM+4wDxzp{SE5RB zJ0oT%HDqwaRqB{z25c5l0||LAHa;*GrIc1`MEP6$!IC~>!dq>lInPa#nDPcY_FaP@ zKRtWrW8xvkX%K_0$r9t{%wp@GsO<+!?cXfP8aWtrmR!>Q?Ekpp#@Z%sQgrRsT7A+I`V|0sGu#7LzKQ^Z z<#5lek&Wq-89k4c>c(2%m7vA3FZY8V5H=b2>~0$U9QRB4QAQ0h6b25>Eh^QXa!~)djr>_pV4^N!w)SLS|T^GKIRtn_A|6`^PiVTH}_D>7ehijpazU4@(=_E2 z(Lg#)*6ZJM3V2uzT>6g;^^`kq>*NJ^$YK;(FX}shw}-I4u_biW80P*V7e1S6lMK}* zKB%CHUk3!>RiRFoMlBM*g4#gS*ss8W7dX)5>J(v3yR z>gCLkRyyqdY#SJ${k4GKh#v^v&X}&Ic*bHwpjdf&af-?e-Ifchy)?k zBT$A1S+;GVx^*4{TSO8$KgWWVV(BDP;aD)*pG>0$J}~MDwD{Z}9ogSH8oVBZF&u`NhO6_VvZ}~vv)Z$;7&T1@<*Ou@y%|zNs8zGq@l7}HH;Ac1ed(gdWZ2{orGUV` zZJqT!VREN0v_~t#?Xyv7T1)5BXnGE@ztE+5+FmYLVcFj*QXF_{`g`qb$dg=Gq1*p& z`z(_j`db^82-jVgW#`IV9^c z#=~snIsByhP5zk_^lR0|ZT2pFCSClJ!CX$#%w%bFyC&I@XOx;qx>$w*=U>Mt0LNNL92$mZ$7BP9}pZ>HbRJst@BIxxsiknni!jRI3^9 z)56Is$S+ZW_p(z1SkhC20zif-?9$A~mVoDH$_{PgT?$70%GL@4MBv8{nI_0KB<3@u{V}rGJ4CkADCyL3xqvhUY`16DhZSETnSY0FX8KsK&L_qCo zRsL*D*^Jq<`UzM?2rR+zZ;$sTl7fG;6dxk|(fs|wk5hC4aUv>YqtD<^cxr8sU z)4vi-fPcLgdz&ZN_&{TUrNC?%wgMI7YAz%gw?4i5+R17JR(YB*C7yg}g~OcjeEfm) zFzv=)Eok>I>+4xx$0)my+x5zFy1?wHVY`Q(u^JjUt9x`KWCCV~F9anc$MqD*cs+;` zset)i-H=E5=_S7&I=#+4#YpLF6QsVByS-lZNI@VsN=kFXv7-+g9WQfE{vC_Mv<0nC z6KzqXienmPZE@1vWqA=TbFXJO9rvs0N=vr8B!u-EsM;^LPS5A7{t`53-{YZ7)rm}ydJ~u z2azy{%7pQargLX#&QS55Df}O|^@j@B|771bL@VP#r>~(3rpvN;8PPM>l|D95v zQt~GRxq`HHpdYI(PI%u2VQcv`j~_i{=mj&MYNgS8+L+AL%Y3{IxIbQ^(JR-3!Is$c zo|cVfi7Azt?QCqQC}A}_VI^~c8A=?a7&wjw9-}X^(oQX>oFxP;*aST8YY4&)dHX(u zV=vDguP$Zh8D{x?y;R;$YWf};jCn^3CXk8_ZENp`<{8CHjVMAELpQqoKn^-0>Q+}n z;NhZ033#QxUZB?MQEQc@5i}Mxn%qG#bHkksU9NH*+3C(jei#P97ep!b&K?KMul??6 ziKhmBtY|g>KGez||NedYzen6Y?QQLf0_xJTFVu|+T0HKz9mK<~QKYaH%j|hMLkcCMUx-$L2os%`mJ->~zVzU*BIa2fX6HJKhRCKlY}X z#a080Ggn)xhUTqHCT@m!9bx=SH9mKR*(J*T2RF`5HGcoScA|j-2)+(27=z01#-*;t zGME0qxUCL2f%Uwc+b8@Gtr2Ornmw|3lc@)2J!Bec{!+PP=fRKQlZ7U?xs;>%s>k|~ zl3DE7ggylbYsb8m|S#eLn?UNwlTJGe|k@+NuA$*{q3IZRP{Z28AX@vmag zJ-=-e8$h`8sCT)v_~tfMmDd1t;UDAhd5A;DnM=(wqrhwYW#Lo!JoJfcKUe?Xl`FVy z{q9e7Fjkblg~!$m1`$Q;k3UiPwxN98tBbSiUb6B5R%ZLlhgNTHpw=t>yy%c8gMzi< zH@}JFuCDsG!^4*|Nf{WzG>d_D7t6ZYji z+{@h+HkTCe)1(F}2yG33wb(`Gycu+x-2=~kHy@oAEB&YLhj_fU716KR!j*h3`dO&x^|%UiWd6QbYDvpi^i%UB zC#I9xZeHXzWrn6##tYjv1@~+(x113#H(A}L&PM}bS);;0efGs_|L0~b(zuK^3Wx@c zCU)>-6zn;o-4Wn%ia69{(YNBGjG*hyPcmMpij~uL^Sy1v?^Y#W=Gt3okc+lOIE&BX zth^UPF^7ORQkt@^gdFdOxz_*5Y%zd4cC`NR?m0oR?9IAyX9BKCfEG$!#KH=!8&5`c zpe0)rDQ;}{((`JCMVr{?5vBLVSN#h?6yoReGtat7)saex&g0{glY@huvpcbP87h2u zvmkI1s+R$I?JSS(>N{y#E!0N)-golwvH9wl6{LsZ9L3~njEi>YBOat5kNNec$2kWS zZMo5lh%IAZ!q^)1C&qsw`5Kyg=E_R<4%OO*&A?-qwAFipaS>{QnV+E{6Sxr}WbHC@%-CFV z^qa1HV(|*AGh&R%KfHY7aUDUPKl)7SrxvVhv1yZWK*1Ph1MBqa!KT??>EdmA**S_o ze!%cthC&@`V}+41y7W0YsBzCiaEqiw_5+C`wEOWQSNBY~fW?}F{7mG*#%sp>og~3C zXIZ}#PwgD?>uc+9obL`yux=ta;c2KE=4vCk0T6nHaJijF;9&efjTSDeplSoPQu9ZhKOzFC|8|?WYfJF+oPZ30>CD z+9jiAm%K^1s5BLxrJtvTe5XNbT9JK44<49Pf=LaWGOnLB%p|=W5;Y%x>=APPv+ii2T!&9X`|;J4406=vy1*RftH2VEb6W%}-|PMCXe* z3V{5+-@gGO7eH$HSYNBiNrdlTelI#cuYYtsP^NYB_L;n(qb^PSavcZPWUf0NJ~Xb! za+m5TmM0or^&Zy%o{eW0r=uEJK^$T#V6()5<~LKG8pHaQPatGn2LJAOKx79$s+pXy zY-jxBO3LgNswGKH64Qfs>hFQ;rXp1rAbhlqGr>rQ!&^67>Eu_8QY6@Vn0jZ8S4vWQAYWMja-HS&BdB^^;&DD}J zc3jQ>d)>M;w~JTtyw!3u!gMXS(R=W@g?&}|!K@?QN0((#eO!)DM=nqO?|=xK(oU?> z*8mit&|1k;mC=13eHOz;0Ai?Oeobe$*KU*nBXO(%-peZw{=M%_qwYw=k=`nZufMxZm>!~@B!PO^C_+8JA-1`6?+*j{=da~cN;`Jx0lzWeY#+41G? zj8Gw9n`>Wc@*LXTo4Rv!{oWEdk|WQ%6B}4}G(k!{yrpPS(d=lB=({n&4%#+sMSV^i zA-X>*Sn6N9d@_npeLB9!0s2oxdJp}9mi-}`BekURxhi+T1r%mD3#Xy`a*;e+o)hQz zhiTJ6k96^Ww-z%)6OZ-mZvJK}rSHXHQ4mdE&8Cf*WAO90(?Q&BDXc!xP!zaTG>}|nxOi5u+4@k`-j@#Hkd)^20k1>b!x?@w6o8w>Qqa~ISr56r=<#?E*F(g z$NHz1EzjdkTHAaer&Bg82V4QexE0pgz~Xw0#NKk?^6?!he3l~cFSi>pa>{~%qafo0 z<$P$~v$sN=XXl*n-{YG{B}qTj=Ur<{<1gdr0xdUdrXIlD^Fpowop zbUwk1VEj0Mpke0JCQh%~{*wGq5ePY9dH?1?oPE5aeRR|X2#E^GVQJ{|T6gvOO_3== zrriElroCI4`kSy(=OzYVvgvQs0BCUc*5@hPnj?L*gEMgeIY_jD^*!A5#o$w*?fK)= zsQkT4qu`oH0Nd6%N>G(KgHKK*yau{+&+)k-*WNi&4lg(S@1HV!<{Wz#u6g=J+zW#1 zo;#q{7E$CCW+gE|%ML=Qx)Mr&c+|3i5bb`3Ns_z^ASx7M#f@P*U{Vv5mOwupE|rc` z8~hZUmCn=SxpaKq)CxzHNR)=;DwD6~FJgTu96%jENYS>UPD_d%`dy4X+2U}(?#P`# z0`N&731tERR#bH-1Zz`*GC86(n`@N$Cgl zTF4SbBnLoYpP_OENP(#>4Se3%!Wao^u1-@#=f6|V;ao(>;-*~IuW6FuLQnfML>isX zVa4TxD2PQ#T+nHaueg${7&J?X9#TGKPj^!s24%74$v6w5eIE(PwByN;c{dVN3XN@5 zDevqjefPyl5ZYEB-LyN~+Rn(adGjt4KDvq}fa=2c&i@$66=!^4yPa>e*-&636D%3z zpLufj-deM0LeJnu8(kOhb71Ald+xhfZll+0@W7f?^wuV{fV&yf!?vysA6%UvR}=yX zu>LK0DagF*l0rn=H{gj$_Fdw$sxxBb(mZnEW|&f#0~vQ^+Dz*E1ihDgMmV?wiS5pshugQZGcmm?MDHQX8z&X zo^N)B5h`_(3Wlu!w)X!+#al+j88lm?xJz({kl-$ZYk=SuAh^rm?(PtR1t$0m?(Xgc z8G^gJySv=H=l#xE>;8Ry)ze+QYwxaIz2P43)I*%DjuIi5A&&JS96k1!Jo5w9lK7;< zl|_du_~rM>UH~vY7b!H+b}N)`ZHfq znl?>twvJRM_Lsf>Xlk_uvggT>TafcaBwY9~@=|)bFR_mdgBW8PXK8pWzJ$_owd^s> z8}Wlxq#WnW>fDl0W&LAa6_fE?G5&4STwV@&_LoA#9pvy{fafij)n|JHgA5nREuebX zrM9^*FeK!wBrwyKaN!RwSz~`>6(8ILf08O%BR_&7iZjz&bUqncj3{*KE(K@|@G(dn%3CP|_`2a@dI3v9Q`>>) zr;i0dXhWHwh48cdD3D9KpgOO!(bjG3B#sckyze-dh@vFoRR z!s;AOY!3#S)l`SI%`Iw2`&H@yGP(Yw&o8~IUb^z7<@psw8<6B;N2#rZyl-k8c;c1( zTrIkdz=-Qu`qm5mABxe*&hHKW5!pmUH-SRjSsB|=-P+Lbh3rgHQ%l3-_+DdfC%nK- zi?s~iAxxq=Bv|ZitL%K})Qm9j1)rYV`f|*4Hcx2X?>gJecn%R}&#hwKIRNMI5Zh8F z+5A)ChpPb@8KlTa!Q~95VanA&wbi9XA%1|cu=MiAUkRxGUB3a5X3kFFg@95X#cllG zgfa>Htpl1Q`5#UDCh_NffnAA>L)TxY)3)*Qe(OaBWpv$s7omus!-cPP?NMQGf7AlMy;*Dodb%pV_@Vy-n)BL%IUh{!Gr1>kxX$)f^|F z*D?qHK{sZxBoVqe^g4-5G7GsQ@hPcaX!ya8>enwj)F#aHGpI*4*5JAyg?U zVH(Z*`wy|Bw558NLuj}FGiz$^51X&_NyTwz0kU=5F$Pg|2_gdQQ+2H5FTY&Vc|>l* zTo9tlxafm{c;D8Bck-w@TeKo}?4l&2Sc0T>*SK&{%TDvj^b?2(4cUx+(+a?SfF+dY`Z+b_=@}*vZy4rWM>x(81$vT#Qg_U zXHpyLx>uWf>WRFez$C)9WHrWr#J-~kx*|7ZOLFQUoolP*{ZkcVN%qWHckckcnu*v~ z0Y8Qo;*l|VG(7G@POHvX)aOvm-`hR-7cwaK2gKg_a>SX~tGQ=cI5WiaO#rhcnLZpEOFwXKh9}~TBr;kDm-t_d}BG$F~x)~!xd&H7hjv0FzOL|^wnS|4t#-* z-Wn^Gz3OEp!i-s)NJ8xVEtGtn=tVncpPnMgO2}EGM3$aUQ~qk)w7B zd53wj-941Y&A$6%9Wn%~H(!yhN=p9hVPL|BV%PGub6zMFoNCs|((GJ*W$K_!O?gN6 zWJ{AL0+3y_@y7)Jv>{KbJHA5fVGhXh^^E&TkF%&JoFw0Z-OgSzyoXv~$SFjE${u^4 zfZAZ|SHSL7x+rc~mmoXi(3Do;5xvNeRC1E(bkytjA%8LE#hBvz_gMjeh0{ZK3SxSy zeDk#YK%(w5exo?ACw}x-r3gvbtZ|_aLp(^H9La)4ednTQG}1xfyA{YqAb|AQ;}D@h zFu1NMLtf?*ADupj(JNYcN=>pmL5S8z=1ZLiC}L?AX7E>2z92`p4t3hYcABujfZ2u? zs1KdBNFWL73ik6m|I6O>sXn&2{0;8lkv!rJIE=j>aNW0R!xWh@B9ViAs)?uJ!KOkp z-wHQre)kXp%&Tb!O2RS*Qp6TJoSKo@bs8JiWy1q9MtD6xW*S}MMoY5*qx+qiHba1+ z4#!fCuXw~ByW$k%BlTEAiXfVx$9RQb?+@@O_=4YNT;ITJKgVT~;=&;www7*#A+!NzH((IB-Gb=ZV z1febrRG=YG3-*h5;@X(HZ<_7?wL@Ep;dZqMD(Yr+N_ERPwsq+kJ+5U}io@b6x?Lka z_}Uk6FBrMRJv`%`%dS5Sr)>Id_MTGMM_*IUNB~9L^@ofDsI-Vu>lZ132;pC2Y4b z^G~(>lSbcT)AjKXaydJ|ViRjWBtDtQ(vYg;C^>4kCurO~^um%Z+SyoI)RvNp3@>3y zWtV_8xTqJ?sk6&)ygo$*h4vX|OHoKFCiQ2C3I-r5t2zDVNuWy*f>MaF>M!OML5m%u zB<&sStsTlGvl(6WTsE}y|3K}eKQBsa{GNA@DN%ITpbqlIyDZinSzi+2@C`B|!Z|6g z=bg*`#sGMrisKjGwyIb&Un65AR5pFwb$hx13W&Fyay z5E`8o@?%5g;nGL*D+F(so+1XeTy!v}>w|Nkh?W>jCwOklK}LKWoVG}nquyYtZYD}$ zKMlj!%(aAYbr`+46G3NqEKQy72Hzq`vnvquP$7yOGm9Z(?Bt<&)vJ9Vmk#cLHHw)8c5sHV16FAfTiJo@Kjd7?0Uam{D_KiMd8~PYD|{ z6~l6K*^do7Y$ODCgy40>9ep%v9#* z4_yD;(T*5c4$LP`H@ z%Mj~p!#(t_FiI(g`CMLCKAGG&H-LnOrq@M1K|6+W+5();g@l*Z*51J;k0H6MXER5K zOS*_UX3!(J<6+bC3 zSr(HZ-m)4mP>L6Qmk5nN!@g<4MO==zCx^~N`QPGv%)4sM<}+EedhaG30nRDO44p>g z?KGlvr7#a7D+?8-!)X0LVT*6*q?a7z1xWFde0OT@YuXEDl*bN1+ef^#PgVe$6&)ML zawz*>nZ%=|J>IZPr>jJuiYd-HenS)5x4P;QMFK*xF#im7$)xWDznob}r&!SVh7D_w zx3tDtf$_bfd_`3qjh&LF9-%$~)Y=?(k0-5iOU4SmdS(=;3P&5zQK&-tsD(ONUH$M? zspt`Skz%aujfVUp>fWOfn`X_5ZpYJ+MR_*iV&W(OfF@IF7Ual8^|yq9pCsO$E3B*g zhl$-d(e}T^kMVDLsMiITOS-x=DI_2=jyH@! z7|BNr|2b{l!Te@UUGVw)7z%NVgv0WTICo=>5)j+4TMmv=q1+zXpQXV5WCBONU_19z z2Y|c2#;2xGd`JqOJqF~RHgFIFfAb6y{Uqea0ALudb9%JSZuzCW;nFjHP$t9zVhF~X z*-N>M|5zeWgs&R0%ya)0HA-P>MWklZhf3@@!26e_r z9x){HB~MOBCZ);AEaM=aO^g#{Ay+URt2{Y#z`k$P)Sxaw_sx_&T2Z})qc0oV%y+Xz zQhz)M5HPhe^|19dD=sUkMeEVt?B}9iTxsBsswj0hrh-6>bhY)K|nfErJ&9BU*_k$vv@!Es;kK>fesB)vUV3tqH zNd9Aomzn>ldFh9RvCJ=HC%8tr09}J%*-vR>t+Ay!nrcexsk9hO7YmN_>cNVFk@XXw zvq5$IQ9Z`CWI~JxcCPRFP&`C}ZoSMP>I(`HNhu7AUyZj zLuO9MQ+DajT3062wtPI=;KkqQkx&$)zjEO3_Y-uX4i0<43j&>N4&Db8 z_s(+eC(q9(FCC+NXXs6y`PD36SH!=#9wCv9TwESr&<-RbB${jdPS-Tea&FVR-gY0P zJ}31b%AETf9` zfSKH1KT3~|n20eZh8g}b6pV)xBx%P!9k4kzV4HM#S8Ic&vm#@R^z2JEl*|+|Z@-V> zZp=_I&CEQ?bGr&}w>F1{q&X|v%PYRE$#&w&^}PIzc$n14|B^WE*x98$R_c(%KNxhQ zj8@a~ilHnq&iy%H@J3q(F{HMY-Y|=Da7*^um#hEHM}%@&CL`(ZL#&jB(sSyt@tQ$; zIaAqz$w&!?W@I0mz`{opW0=T>JMm59tobb(LRj0AtlEdXiOTT~0yx6ie*HW8xJp6q z4Sf1d?DM4WJvIEoSglUY>C#JA!OQk}*u39!P`ULaP_VdL%2ZfoX&bmi-K#S&Mk9NB zQV>J)j&yxeJf+s0de6D4SjO4yPmdJ|>!AGHf?*{RN-U>HptRgAbCS_Ziq(5i=S7kF zpo-M^@V}h?+7Eppwabtb5|XnmFZj4|VIy1TMBWl$8Zf9SN~=$(QM|F88DR* zu;tpsLX5T|NuAMSu?5#$(I-is5X3_F+!pTn_JfdMu`)UmZepDhv8qCDIg$-Fr9M#- zIw*d|slF@-RlSlQ&D=7d?RzHR_~SZi>fFEz%HWEJ-!P{jH)`|AMuDSZb-g`mllnxr ze;#w=j(e%ikCFa0gnBZT0-o%#4Lm1_qS7Lf*Iz0&Q~lIB>9n#EhvN4=&6L$6Dc}dL zMvcDFw_spi7es(D1^ipZj_)^+J~|RK5v9loQtl~?pG*9~4p1nzPd5;Adg^TyR&JcK z9NRMQL;355N^c^&#o+Ey+>tpmLCe`JJlEHWWU92!;TxeOK0i^&I|n=r${(=gGsy8` z0@aZG7K!BvOUJs{8wod-oZrYd=#O-AF> z?{KMA^z)i57Y?Qi5%H`Ojjw`-&%ydE|Dx{O#TNp&aAqsQ=>FLT_ABgDI&VvE)UVcS z35U7R5%=_1>5xxnPsW~Pl+nT8CDX(6s#!(y^lNw%W%V$ITf!el;Y<2$rkO0ZPg$+- zt(A(E2?*#pw~iRc_su%9ZU#lO0(Gg!G^YNyXLxVvfxFZQ<3mz4ZdsFRp$2_Ax>|4& z!-@90$p6XNWywp<_3RJ^@?xp<^#VHj!$yk7jFv0(BUd#1*@I0McbhQOTb~uG5#)mv z+>Ijm!jLcu*Tf51+MJNp?uFAL^)>@zeBnRrBBh62q+n5@E;SAcFLe1 z4>h!g{FrNCPKG;MhKIXL#Eoam_{x4cVRC`q^j-9Ri5e+}M3e$~$SM(*;9=O-ssxVN6(6E{y^b@#7`KNs3*ry~1cFW-3m{p!o|@=97z z;j7q~%Ydw|(a|970K{o$&))aCoCC3O%0Bb)(!GBRxUvY9Vj@6`3+w$PGA#H?d>a>1F!Nc{U0Vsno*Un2oH#b zgFDK8SgHgSfA7V_AQa(hL-u<=c5<<9$BrDBEJ{HXuMn>@t&uI{;+G64awsm!Y4nvc z@OpBaJq_wHi$cIZ>^>Bpv3YoIC*dvYXz8qNCs$vlRbB3b#SZj@2nw!DPOdFz$CsCu zmrINj5z*%~gPa=og(BYf`)aBPl|TH%TbS`Mv-YU{Q3sN_H0L75@@+Q^HDt%XNFlUD zeir<8F)WX75zfrb5N6;Wz6d?Bb;4CP9y=+o9=zbcdWlo5Z;F%2li@ED%1|&@#7t@# zDZI}`xjlxXz)wS8N1B4pow5TAQQ8b{3<1X66j*C=GJqb) zH?^xspE^6T1h_@RzM2*B_G4w3RCnx+b;$gA+N*2_k{!!gs0`~OrxFI<(DAo$@}TtL z&RHZ&ozY~-$v2}r0f44Tur{a@}(_QA*I^NyQMwqLMT}W z8wTx!9f0y48P3>v%4$aVj4k7l9$BvS1`g` zgj~;Ovkh5t)L7~L$O0~M?ZcQt$(D-*R|1lEj^Vi7TSjg*5l-wQyy1pBd zYk>Xy5oVD?^#Z{LO}Iq9BTDW>k!37tfIaJB1HW8Pf)*Bjf;nB%7+p^i6gEIH%-|*` zx%KQzIBVd-NzylsMAQN&N7KYSfFw1NT8ScnuuktreWvrs24L@@$F^c!(UW(%bN03= zH+Ev>DTEYf%1Y$z@qdm0VbWKRL*lZ42z?gFiLM5Cgk*M#1S^AnUV55jA}seZZ2Wl1 z01~04;TAi>V7`^Z%T=)N<}qb983)*wg-HG*GH86gOH+&wtUS#TmEVpIP{`x-cA!a# z9Y_+V-9tAoJ0Hju443BrTu<)8D6>r>%XtlFY?)7^{N0F!8}(5dUek3mnC}(NqSIR>0k0J?cH_{F0}ek6nc8(1cU=~t%LSOMYYzhm~LaEP>}y=gS&mNq>z)fp%pLYDRRQC+nnbVf1@gw zYbOoh23@M z_jUuv$TYjg9HAZDz&q~TAS`LqREtW6_c_(4-R@d5)#5_I%PtQg30CIOeIIw6xikRa zu(+)r^bPgO;lmBb!x~>(dh=IqMaDC8XJ@Xm6@$v2k9v{XK3XVCA_$!;ZfcARQd(N@ zV2xoZNqZVa*RDAbjIJpDIZrlI6h)}k*3QMB@TKi{EkR z{HP-HE@>JSG=PbdJ{N$m0fxSec%bj!@}t_w^?-YkPIvqnNx(^l*^O9KfxhN#gHEaN+;W*X$dalpc@B|CPBA%WR0eoow%rE`I;4}iYujE zc*9^B1pP$WGS_*=iHl1ITs2#!V_@;g#p)W*QNuz5&bj=F<3pUdGy!08ME)o|)BSc8 ze(}1f$P9Y?K2(oJe1?3hI#7!lgUtX_WRQf%^d3deKNddlRS12SV770BfVLZ|i(ims zaRcus$KZYZXILgS06##$zfWtM#?^4cJ>yU$mcYV7yzY19rDUW^K((}lx)sRQ6(s3| z;9--LC3eYg$;Z@6I`pTNEo~Cg0jmr*x-^SCYOb+;@q3aC)~M9Vp3vy~9KZ>do_fEh zc%f>rHyB8zwKLKF;bunsc){j2;a_*|1Rfc zmbdLnwk6KuuMVc^L{x5!#uyu!yj)b3K?I-Vx}H1|i)bP3#>l+ji724}OsrL4A>tW< zAw*7kI(-xtNq>@7;RjUdk(6}y2bl_4{m~!CMaI5;lQ;83kOr zo4toE5~)~DkxsIapv%m9usBf3{^>2LF~o-x;BDK+qG#XUx#KF!g%jYaxyGgE??Ks2ry@gsozL=@#eLV)*%x~E9x4^< zf)!nI@1WM)-zQBUCW+OyN0_uKHAc81IZ>qcQ3iLS4Bg9R=JE;VHaHtt0ngVUgU^Q7 zs?0SQaa37`duI-q^|Pzbo4#t#U%`r!IkS+N%!u=@$JU<{^+k=6X!1pFi5)&}{V7I) z>q?Nt~+N2oY$$T4nd>N9A-~ z<5IrJB8Cp?sn}lgFY5O~KW);u)!HJ(h<0G^$P@eg;H<-TU!96gdYmKmqYbI9W^Oo0 zlC;mKN7?$bH83`33jURinA;8CC=W_f8!Z~#ffX32Is_8wps1)@^?;@Syhbvoik;+r(2g)~8K)L6Bk@dz zuGC1d-9etArU>^Wva9v$HMGS32IJlVJjrI+G9Yxd9_6y1-@Q$1VJHK;zdZb+s_kA z94u&|pA&~}V=;e|%JU@^ct*07JF3uaFQc=3BAn+LW|TS`GIte?OyF689sEV)v1`Kc zGU3d>p|dvuMG!tHm6d`cjHUvP9h1NH&TM*vV;otPzS%7A@$J^o{N9ujW?BQ=A0I6I zBKbHE$e1j9V6|sex6M6{+k#DMf#!I6+@ROb?X-w)((LfmWjBB24!WM2|3d=1s!X%7 zs%t#2{zEof2QERpJFjM;b*_@Oa)Bt0O8(wg_egwP0j|T=K+;x^3@83`1Lm2n0XwB! zhcEaK+9dZHGALN3__EEGUg{L}r+PYsg;II1s3p(ju}4|O_A`DPJTgE5#(*zVO{}Hf z{#H77a^h`?1t(hC*1`W>hT8Z7fh#SnZ&N7p0Jno;N#48vXGo0PXB+EcDhqp` z9ChWK1L{jzC)>=gJ!ah;=z!&k1@X!p4COH$cp{=xsn5Z?j7(Ue=ay_OIeo1kM_Wgi zYR;r-a-0paVW@a)!3l3a$a=QjTRq;sa%90XWD;skzA!aWlHA2T=s`ePY$S@d7# z<7NFC3A1~NvO%s1MoW{`95i!lPowOKgIlD~Ib*DTZg$PK;7o4(8w$#!7!OBb%<_I# zx=?x712mZXeST6*vRfq3ES}1~>Ew?$)sD8hhStuSy21H$3X^V3t#GTb2}VL5(i_qa zp2WZiosAN0fM2oZ>6f%k<_4c3Zw{T138va@^d{tX$_Cv6ZlO;TK1ticFoj^=Xo-@> zFJJ$%2SF*n_EN{HHFh*~bheD*$yTt5G4v9su+#~N6U*P`^pnVfBa+7u{Tv{Mj*$_Y z?Ip6RMUhO@jxVL+)ZIV+7ET|o23sAyjF<@~)$1q;*0Cb!*PXamGMW?4LdUR&RewnOucsx|bR)h9}Rjht-FiiOqXWuXsD z*sP>QEm*4p-RN)HFB8 z*W#D3cJvcm2@&m_X}|VIl%9$>(NkBe=1Ld1Z6sf=aEJ@{-!c zDO_T)>9;uX=T9?uHZ}zTQ?%y4@Pt%WP1wR3O%~5Pd3y3SwtQ+CuxltuLd#LKxF7t< zD}>q)k#bq_qYH%?AGse4+svr23#l|16G zX4%(YU2}qr7*pUzuO3Vr#t`I9s#|iQ+~f9BBvs2LQwR2$s)AzGq;9&mIXGxW2|{Q{ zev!H&R!|s_#Fs94>eZDc{pE!%R9fja`s885+duG$;xyzi1~rpNm=i@=Nl?UB!vg(* z-K*?I8;(N^pS)4;7Dy=JiN}HlQv-DK@4fJ^AGlHc#1Z(ap7=tuc67)0t-H9Bdvy6a z6JwA7tJ@cgS(ve!qJ%BnQFGKN}my0wFX^xeV^q z#??}#R1lz7kzE<)61zW=Tj(hw#P~w18IykL_xB=@Km8%#luIk$*FdTUq_W;!mg7fUxg>5sGW%QLw%Tf(yrl;8@ue&mn3E> z?yjSGZdURI6>&JIMWsOR%`W*<8fJv0*g*`?NViizw=T<8P>C`LT`m5mN z(mnSt_>gZb>8akx=Pkn4!ng5UFu=m0D&_QA5FrH7-;OE6_tG8TE;D)e5yAH8Ww7J8 z1EiY$>&P$rSJs_OAfK-qwP;D|e|;=m%9-;lfU!=ipNFpLB7$X$H%aNEne!*#1AWj( zGrgr=)ar`hFPCla+;Xgs3V>A?pT;m7_-0QoZFw>}JAk0Wc3^zvl-=3mh5xs@b6!74YHHp6!5~pS3j3<9&OnYT~F+GDXbM|Ho;7rTq3c4BqtY5FFH-oVE$bUxJNR6e*4EB{wIRxV9=#G(+3o!Y<$1t zzvuUDtC_+m2#&6ges6y9`&|%7(EPEhukc5$CMNuc+92vc7`Kju13e?>4Vy2(mmWRh z;FGW*iY#_wjMX(|Ktk9Uzt2B?$rxt@bz3oe3=}1Q-ET2#e$lzrw>~%Lbh_eCmVJT` z*0Uj;(#=G4C|L}d^LtyiA+#EWx4uiJz&S9!PLCaM{EU~4^D9fwmX#1AyyMq9VM`K3 zmW4Pji2W6^y(2?R9di1Zx%vJmds5bqm%oL;+p?;?B&34?j_JqyQcUv4aS<$jj3puR zP;v5beT5yK*Hi<~1smpZe95UvJTIQS_H`F#G{UiDQJmv<6==+v5U866vDh^l!G~UzZ9)fjo$SSrOenhw zo(KNQRYB+@{YSATMlEW1)%#=Y9Z&VWwL8I|v}%Y{8-&t^3zyQSm&=P#*d}&Tm3BQa z%O6NNP=HDWF+hay)!~r1$U8z8Urjz(;%5+O87Hdvj(XvXpky_|rNsp@nqa}bgvf8W61wt&1?+2ZWp6&co)PX#NU3ESo z^O@O&3Nn}Yu=K8j*_dH@O?JvHvMigIUU^OAaJ2#ljFIzX3N(&p^a*1U+Gw%yY0C>y z^wVq0@$rj!R>G(N^wgW=Z99Ha`1B5o-5^2O^jOJw`*r8+Uq*W>9v$2`54T=hZv*NQ zhvxJDy}{w*M|B}+HSh@r87p?hLPDa^-#Q8)aEL3l`rhCheEsPgX3yiUrxEfE`H)R6 z{J8dpgb;`qm%5XZqc!qFL5=AK%@-I;NoV>%h4^(nA?o8S6D@gu9q^)D5U9y^Iok(4 zoz;uz->$N(7}|C#=a{jmZt9US3d3C?OB`xJs-Kq7tynQ%?qmTTWEEdFuW{w7#3s)F)_ zS8~I8LLRD!5HgV%(nZxy!drbN&~&z1~fQF0l9GZdT(id1lB8e1yxKSuV*73)xTwCZ#s(f34$ z?;-Fg49&QY9)9Of6QGEXLyr~qbXzs4=Ie)ste_Rebs;K;kbRjCblYo{rmO0M`n5RZ zE*?A8s&dN=5>=gi|E?hne)+}F!}_o-YSdZ`Nk||P4A`n(sPTk#lg%uXu}sO-0=RO+RcvP8oy<))T)$-Q zpd3pJ=BclN|M1=?dm~A{Kq7}Loz>82BmDE>b#u&<`w+BiL|I$G}A-QJapgh%~UxK zGL1B#JT#02ss6f=)y+Yza1wEC%k;OOAsaQcERy|)n}#rE0$J7YSuum1Mxq1O*U<(F zzVy*CAXQgH%-KW!nPTeE(iy^x&#GQ;xHoNJtm`!MhQ;8Jf9WF}{dlTbCtZL**{tSz z;N)xc20gD!$3SaQ`~;#RRqTF753lN%>l(M^A^R>Lj?u1T>Ei2;I2%ei?kB2KuF03b z63wskt9g8zm&6UNn**(2&D=Y|b)z@Luk?%P?v-T6l$b~#Ke>Cl{|RlQIfGm zlxZRiajBO8)&<_mqvWSyBq;535p$>O21MVPO+1}7?8OTnjL;BZ6)QSE@b|^)1S)%! zTk>g>rrwjQYvJ|`VZ!dJXHPwsE|iJYgZ01FG91*ca-HEmJljt~dhu3b+)iPptaSZH z-tpss`{LL3Qz+_y*PDtPoh^vDT0jJG@LX8=KQje}v}tMSFmzWQ14TeWf=Idzcp;XE z)!Y7df2Jg92so3d%xxSp?aGhJ@~Gb!TJfC_eg+{{P`QAcj<*>ux(|Nsu$Ht@bB_dI zvxaZ);cQ@EEn(>PfUArY>M>1y0~GZ7jJfjzy5;n!Ry61-7>tXiiBOb=Bg=iqbFiA{XFSf566VESr5DUI8WNzwrtx?SD0~G&MyUE-vv!|% zoo=H4)%q=xayNXH1ZP}axo%5Ug%sf8_RM9775zfpr`;T?dc(G;wi=kING#fm_mh^d z4N%?GDWPbPxAb)htsho2>LTng6;+lFTzV}+2zA#yBhnJ`Q*gepbb-nVxh#dlL_Yf# z%>#iOzQh?_wA?r|ReM@XZHs07LOmMJfyl=SLbXmZ6Xn`_3!9;o_8?GBcAwpXjuBkT z7?DlPfU*4q0(G>+_T|pj z8Ml}&ZK#}OS@b2@XyU}kZ|E6Oq7O%=@9^*B!oS0`(cNN~Pzaoj7lThdPdS&Z#{dihmrf2!nn(~sKjkOo!MR&i9Ugf>M z-*nVFFPULmOgjdH1TH9cvAo7qsL(u`{SE_Qp?Uwqyj16?ng zvO=QQhum6nkl6?M{y_a=hQP-2uae;p?{5gD;I0R+_j#|?S|-ZB`Z`taT_4{P4?JvZ2{i7Jh-r+He za)=Qmxo=ir?t<9f-d2T)z_EfY1{2$rkhejQBG4DHyZ@#)U6p3fp<)uYMw$JPr7|Si z7mGeLpu#PSlXt{?{0u$J^i9+^L{K_oA;ntXA=1gy-ObC~$K>lre1|HwSd93QinCOT zGdPvZe`q*QyP}g57hAiZ@)eiS(K7T4MP6N@MdaQ`sdS_$r$Fmu?uq&F%;nkzqj*p_ z?2t+PD2vc9n*J=m>esG7+N_lR#5BGh=nEQO2DLUK(Q8K5>AF4l6yZsjPk+|?JS0oQ z*7F8B^LQ~lzexko1lF#6KMs6zx_1ox#anZd2in8#5`368I^!Gn^1EcNt|#VC!^U?} zmHsE`uKy$H7@r@a4s>)F&&+F_x$s?dFpkl|ISG@yu?A5ZwQV(uWE4OrLTn|Ej4vHS zzzO<=3?WrG2c&p*fRH|s6Iaz@_G)ovMsB=XT1K02lvI68zcT%W&My9`XzULFwfUw0hFnvAuz( z>w1nplEZVdg1WGulH!5;PPjMlhACc-|1j1Ch+~!9)ierJlPSUTOPh0J$jUH-&a^ z=w8Zw>cO=KzTDk;Kr z%;dfG{Yp{hn^WxvPh8q!U`uE2Q@|2cFkJW#<>9mfaq2Faf8~N6L=sEKFKqJo(s>d1 z^bC0q;Vu?QJEr5T>XEZT*>I(x@@u^>GLm!BV74FdY0|xMd>1==Wh2)x2MXU;9m8J}3NEI#IDL6hv6nIzlTnRM>PV~vb@i^smFs!uD_ zG~mcyG&=F0Hk(GSC-u&-eYwk?(zV{%1JffZPWB&Y!lptiZ-+>Tm3g zMcYuY4pp-r^$TAYZtQ8~_ToQ!#+5)yHuJVC6Y^vo&zy*u&;ND$waCb|Oq$|O_U=9s zlp0#={5-F5j=Z`VuOoAhI8K@5RC~bxukxB_pQ?svb`Yh#?> z`W$=J2Rl4gtKOnMmKRSbKHk1T$D^D`a%7g?}@1EhPx>P4W}``y;AJzoT6JfDB6zWfPF z6%oYq+P-larV&vc2j|)94^zmXGo)$~w6H?k$RK;sHK}FB3r{=xXOH35o9P5`no@a} z-?i)QOLiuco9Q6Ld<_!0WPTVefm_#mX(tOCaKCfSuD8^J4}PCNE333Qi}1HY`)QW7GQReWlAL-c?2k$pUyz_^ z?Qa)z-t_C`vA)9(;=-tT<+y8@M0^w%7$M&7okbbe*;O zW}nU&%zNG6QTG=P{p}Keuu(WS0q6dSj=v;I9GirFvnC8D%f=zfsZjCyx1cOY`n^&f z0o*1s2B%{Rp1<%;>%E!-sx9dVJQ4Df_AMd<2mKx7aPFEhgSJqOOGOEq21wtGkJG3J;MDLXa z_F=yySYlO^f&e-V@kA-_QowPBOmR+3j*uuAdDN#vHGY|Jq*tHCv+MU=G6bn{k-n+& zAI-OQROsA^e~KQln3S<9m6a_$vXGZ@axw96L5>q=+eZoOihI(ORO zHHk@(ytSpbifdI97udw`+pO0sR9aK}&GF;`#=w2J2N=)7ALONf(hb;6^vKs;NDPiz&XQB>n5WRz!u!R%iTMK<0R7DS2QSd1&1uEwe&55c z%=BB?$Mn@43)#M)69~tk2~{~?B|G_QhVZC3Uh)hqz8lB#{;YyU4&TT;>L@kHOw?Tv+$wbOTb7V5f|<~hq*W{dpO z2lDQ=RyUU8GzsqDP-%8%7SG9^P~YLhs!7DMY`APFPNoSZL@LDW3-sjr&bdKdEn%(A zsp!-Y}nmFs)wBXb<|#a3Ub)Jc~)VQj4@PYN3xYm1UhagW-RM#jEiNk;q@ z8I}y@G;Xt(dBM=#kWV2k6{k1q~}A4?=;dB}U1uvUJ<_y?s>M%3Hf)7n&{ zbuF@7!W`^StK3^Sua-cVpgQ@NAV_a%X5RhobS-y#Iy{`)-iMK>-a2R0RFRuVQG%X( zZ27a7*V(QE!7(*|F8@RMX*LZWvvKqpC#I?QTDpf+|D<781-NJ%$@$=x&M|Rkwfw2F zVe0u(a>C5(Z@GAk7-=dVtXJj2c#qrBQelN98+ED{`uZ9Uh=$IDK!aBF-fm9a-B^n1 z$)#rSqrxPvMnN#7jJK|yUqtVbi4^Xrqc^Vi?nfuwl}=`r66jBT*k}UjgnI`&~MPTm)9Q zEGA*aB477Ms?;T-f0f|MKh+0gHy=CW%5BZx%BV5rMT6n**;xRye6Dxbb$kmXYpp(y zdl?Xd8D3jA$0p;jrEJsbhct?#aO_i}By|EZN)9N>d45oD7MUXYwtQZ;>MR=6CLJFt?^5MuZ3~poDAUF1qJFvm>o};OZsHVmo8x~>-6<2e;9`b3nF+G9T(+QaE5U-s+_*C zXf116lve2;*L&RhAA#N7Ka(KU-`L+dl#F28tuvdS9uVEi{SY?&s&Ky+s8Yoy@h5Tu zj`c~UG=2u$_9MI|H+~v@%{bVVtGad#ElglGe0sYOFL&LVLTkt9r2w*%)FWh>4iC+l zzg*d?xx}S zC=CJl625z0hw^WUvpTbdF0})Cu?o+0YjltsgiI{Dk4v;dEt^I50sBGqqgiQXEKx=X zvhfha-zdt7CghYbdjia#yeccHXZOd7au^aqQDz;krOz3W>x#EIT0Z?*U!y~ykWvI3 zfA#svc0q2XS&TQ$Gi4rI1BG++Fg+P)WEkVm6adw1pwH-b*nNLB76o@~842p;$d8wT z3HOatjKYt;@U-4C053)>+wZz24B#j2=YYYH4k8x1sQ6~CL zXTdR3ZJl7==c4a%t;6BrM>;Jo#K)Sj-do@ei`GKWUQK-bWyw*rUX5x2QsF?@kXbz9 z$g1l`ZDDTiEsLCQ+t*3C9ZB7psjdq3b4l$sq#A8@;#z8NW>nm!avRT2h1c1w&^6~g z6L+`E&tM0#xIUT~sQO^pjHR>GyEj&RWOG=|ze?+yikk}34PWa&P;48|8V;YBjbCl( z%KF+dTy=g_i|LGFGF5Cj1q7mQTHH{Ft(#rZs!M+=zfn~m6w{J@xC~7xyX@&Y>=}Yt z?raGnj=0ZGUF%Mb*O4iKGZ9eI=p|fo0o1WHH5K*G=EqFoCIpeHwOY;AvU2abwdB&-jeX)v3 zLA@5;40VeolZxEzH+DtES)4FhtE@!A(A3?KFuJHmn^F1z4gpslc}!}4QICQl!IbLjec(}dXbkK(yWNOmZ^vnI9uS9{%2##+n5M$|k^Rx>hdUs7SAN5|P zU4TnBRku0y9%nO+y12fQzRKXT_A>vZH$QMSCAZkx1$yI zwcze%ilgI%+Z9b<4)z^dzBb-)xmyCv#XNCQEE)?_4jn`$XNjL1egJ?OH2+#h^{M;j)&vXhv)6*Yg>| zV*+#5YdR;IYFiUWUydPrYK^*m$B=DYI}k)vAyqd3djR12`ist2zby7Q$S7YFxtmvG zA-CB9O4?cj#~MLr6(lXxd`gGS$zq_UZQ-*H9mQ4o&E;~FoD^(0Axzf1Ll1r4 znV*;va}?-LZEW7NvE*G9G&uZnXY*t%C?)zEC0qX1Ndu-GT-9CzQ(BPEiDQw&I@b15 zMZ+e|T+2Q4QPPMs4NH*v8Wq_IE`o5tt&!n_+$le6qR$UH!8X>%A2t1iV7-}6;%Iks zBZ2(;(BzDyq&PS^>+8INVxY1c!M``(%5#r>bsZeEtjsE9a=CP}4~TQrIc$sB%8Oe$7gAvdhw|wO za;)sX7a)cbwHw0yVEE&w#5Bv2;o;JjP~K))Y)K-a7Ho?~);@SkxQh6fba6B9Z%nSd z5JQV5HgUd!mftw$LQ!K22e=14?~6w8$Q}gK!sS?sDIHX+KC`y!OTRBIBVw+f@rM@A zn`f9o9P}o#%bwNszPKGwnRC&lWDG52pqw=xQIc?A-s)>yT?d$(BW0O>tNJN;6`K<9 zXp(jW+2e7fU`JSS!Qh_mpQCqn{XWAafO<0Bjn*5Ier{w`@+Iir{JVGo!SsaD0R5L~ zHJAP1497W>|Ml7Ai=Q}G^sUs*2Ju&QUDe`@u3d+kBHgwR5f^{>_EvphcCOq{yhV3e z?FT+~K!m5zE=HulJt+n7Ej$ie(YS5KID6<-xMZihHPgb-SJ<;=XOpxmAO7; zobzTDr|Yw9x~r?{272pXNvb!}a01y?@n5a_e}Y#(gDhaq;-@ntP0t^);`MEnG+)Qg zDZWqgX^I6M|47IQF2V&S@6R}~&WM0QnGadS}dEIFI$ zSFspnT|I5J1^NYuqno2;s_vtVS=&*Moo9zIeF?n5@k0g?SeGDb;uI4#9@|xt1}XKM z5dKV-j%^QTaGAcBJE?JTKdLh0yJc#wg%;k>DQ#iZ5JFhQ-P_nTxy2 z&*u;x<{H78tp?(R{b_6W|9#i6&dY};q+C_HcAETtP54(j&)3(ra^TdMSj`e08N_OvPBC*Qi5);f`agMf%5}Y?CHa+Q&}@tT41ismTJq^e?(Kb`mGB}foZPHtH~?2{=b zoer<{#0REDwQe)jL?V);g!zxWeDia}B*aPY$WvbbLgkJC@xJo!EBND5Ur$ufCt2_* zdJtzRW9Jx>7R9Eb;ekmiZ({V-i9Ls4Qo-d*sZ60OPUd7CYr*f~OM*J3P+vz7CK=@j zK9AlShxwi&Inal?sYaa7$aSK_Tfy6f=q6)sw(+yRWQLc-Vy}x=(3UZGYwrA;lo9GR z*jzqY#LMkm5F1x-q$qluy+e4m&I#(e0IjN3g+o}JTUl}7@}eT0K#;xwtxCI!jJ9UY)92F6E;0Zfm}> zW1W=+jfRHstMbzPm#H+`Qt-;kysA1R`-+ioKqiec2#OaKsjv7RadUgpy&c~bA^zvh z!vSSjid#ptlBTMv+SiTQStU%4s^2BayXAcEbMY<%b2%(;6&)L zVoUQ;dl=O}R4S1>Ce?QwNmrI#xG&zPh!)ZDFm z>#%F6+jG48+e0<^OoQY5olG;MtIiKkoysq*vI7?qFS9(sr?L-ImUnd{@SeAH%xdd= z+>dE_@nx5&upJ@o9tP4*WKdo`o4c}9i)ip*v`yA34%tHNjqvzOaPy3@PSuccWni` z3rSPH7WLZR&|gAi;UKn5r~SWnV?dv(#QIH){kA{(F>dy!x63x|L&mOs)90=(#bV#U zTHaEHl6ihRe-N@8rvRhR)W_}_9$%RglsDI=AI?GeihV)NtH1;e>JFiKs zQBN;v{sAUwjR#p@#w*&=(Y4R@c)BHL5WDFUJZ5cWV`mmurizrhH z_j>(L@cvz4^W(h9L~>+LDGy4>GA-19gp!ApK5X=DDAG=VMxQrc5b8Wq9s?3Y5cY{i zfNdEhK$s)(J%CO2SBf~?#s&#n*~v?qMDvTYd1xgA7*?k#e3#~;p+g%?l*$Hq@Ik^_ zb9~VFGj+`1qV7@9|DHE;;)0Z)2;V(@?5K64MCc*N+(*>!(PAr3r$p-K3>>Rp5S~;h zPPaPxu8u*iAGdE3u2Yfdf{dPmtmVEowDB6)HLFsRv0&-q=4Jf>TM@9H;oQ85zSjTF z01};&w8Wp#(V#usV9e7hRaBsNTv4oi)=K*=Yhc4(Jwc=Rbk-&S1CU+TC5j8cC0o46_f&{JrkLl{3&Mu}IH z_M%ciWInZhhTQ&c6p@;L;&SpoPbH5Y$SDgfR*!WlMh(Hk@7K(!sgbeRnCi#_jjWNU ze?n!MBA|sJ{WJs$7-ac=vN*Y@#6Zb^VUEa^5%itvDMv5_zIyHQNOh3|xYi?oi27m{N_TFDCtyw|O+eQMB`tuztnAY0J z7&r!tPg-K=fp&w9SOBxWq|WV0ZhS^{SO6wV{mfz?>pFObk5pG zbi6=(N-u4u5a<^s?)DZ&**+f4*506$GT&?lQ}oxny;E_R_5=#>9o)2Xu2`ckxRJ0x z7%W zP4JST8Y{S$=-uPOWR}#>i{r{O>2v%NqDOjv})v{r7x6)&J zU4qC$ZlbKx@EYzJsAZ1n6i9pkwSQJOt z_}gI~!Qk<~;&fq2_#r%*M^Pn00&y^Rxvwf9fw*yq(tBe9%XADN@({DH-~{9~ET5*F z+lD2$y?IA(h08ug#J(7-Qs{nV)7T(TKtMSsHeX@r2PhR53*I#DZqC2}0`nN&?HI>9 z66^rDFOK5Y*M?A=%ixw*Ed=J{RA)c;LZmeZ<7yhR&J8sFmnY%_izfSbc4xJ%VKDEA zASl!dyuFK(#H+kEG&BVEheG3_6$T65%W<+jwt+6+1FVdkcAL(XA@4H7%>?ZovDoKN zcM1PQb`3F)kOe`%zKaJyAhYkbcJp@u{X_X)`K?Yu9x!<};0Fjq+zi+~1o-oEA;62Ar**G3WCVnXGZ!cS{ZTsk0@;o&} z{QDH}pKC-5KxE}YsVfFca#ft17pHJi5Ca)VD})5A%Yoo!DoB7NnWp<6wcON}lan8A zoyCM#Vs_R4|K7yP4xmbb$y(+YZ)uuh>BAJJg#yj-vxR4!~hpNTjJWw*T zgO<#PN?gi*ou8fgx+@2~bQ2OtAR~!9GB1r97EhOP!>b4sCbjUHX>(qrKJ;2{Ng=~d zUOd?)(W4MY^89?OAi?ybF(mDnLu*TZ^j4tqx!*KsXvps8t-8>>YBxH9+Lu-O7^3(8 zlZ&T4&|y$li&?D@oY}c_4(%JrU=JRhum}~7iYr&s7 znZA?aiO%2HQphAEgh;kpsL=2DQ1835SN^pKqTlMOkfWO0Y+fWxZ4WJPaNgX#oVlh9 z+%hP)QTt`4f#?)C%=@R_k1D))1Ku%y(*u?_J7GQ|Cs&S5s|X-N{l{UQ%%hg^@w_*8cj{MV&DI`FE%Y9Cl>}sO6>GYh!a9EgK}4?u0j{g08*mI!YEwGw?IncH zF^G0~6i&%eWSk}yYNKe`AgXHYp)t4uE)1fmsq zLfMPQ3w@nBE3aP$EEn=f%h*6Usi-MuxuZGoa90lBeY@=2?*_d1$xjLNyE4!agFAZ| z01^zXQ~C^DKq4|+1@1(R1Nf)-nm>?#4OL4AdHj>Xa-@Iygpooxxnp9ZAeaKwlq}|8 zXT8du;`|C1?Z}d$-(Y<|X53#vdZ*W~*irk%q^|EVC7v5pG z-h7V5EqnC~0|_sYRiUfm9=?h;5{-2nZ@4iY9da+ei{k70zbN6b6TJB*Pz^uzy~X!c z>hQlxupj<+A6@9CxTDuU!{n8tdk%k=y#gY?40VU{G1=8CoFCnN@W)ZwW%%$XEJyJ; zB*7ppCC&V)qujpimsPcyT=)lWEPA5UY^xE>xD#z<^JVw_-BcV}zW^n0CIBibHo0Uj z(9G-xFMitzwhMRUg8j&io=FIPWmqEwQ!mB+WP#UKNDMW-)Q^L|uv0Zo<8IxXu90<4mu1&q zbLJ?IhUbY1`oD+?4}{56oI2yxR@2cQSpd|b-d8o|QIf%d`{|k*0~ZHCiX%)8gsQDv z2r)6(bC26#qF1k~2L)j&FcT@7pXYM*#Q*`{S*U4|bd;rih!IBi=NjohTc9swcx}Em zq{XkxdW43@g;w)IR2Kb1?#pStb+GqDiq22jg@AZ>htTwJbn^js#wZc?ouX|_TmhU9 zL;}L5AHuT2fzhyHUF2JXYo(WW$jF}uTLq121~y8Ye!2f_%O>r>dzdc1VYdkuPcdHu z2U@5h@g66cx$N|?2|5-xod91N!ut8oo!zf7(D&>QZ>oE{-n9Dj2noP?iS>$vvUwj& zJU8qcK|$vL2X0IMQDV*v+VhiPPO@)1acHRVhEG6w5;nl)7203B5g_-glM)4-Z7DgsJZhd`!_8vkM{ z-X>qFbmG#L7oxlK%Y+cNV53ZsL) z^m%P{p{f{xDw=_zmp}DQI5iVAdDLHUkXWh%``>i{NYQS48z30mnU6b61fgFOH(n_~ z6EmGMbTVOsNw}e9;B{yo^vUjkz~~{INeT+nGEQcojcavQdPQ9e|1r7fp0hX} z-&CHd#B0p20P-l0{16G%U%xK1c5liGF#i8!FuMaF_9HklpYd)ExV-=1P`OG2P1)W8 zJj7FQ{7M+t6n}X1-p(S9ooo+vEbKQ99w2@V`2j7C!-{XcVRfC-A3X3v4Na5&=B+1{ zfbia-<)DWA?0#E-qwN!W5hBnlHp=kyUG!mN!*A`b)gwPKnNUTCD}@r0`-2qYqG_^y z2S&30PJfj4$%Er!rtP0fZVy%Hhm=K77@21l|Kv=0dVTQiKyxqIRhXZa#G1P#BNqb~ z@hubw@_K7m^h-Zef6j_$5G!GCujR+_D>00xmXz!6*V|bg4+EHvmA`yol`TY*%4nS0&wrUW zB{1JeY;(wMNOMYeuAtn*8oYgD3~1M!!-weUvUdc9iOOPeo9~UGr%sG9wkLe{bfvbK zr~CeH;3VR6f`bFWH_`KMa`L&&bx|Jtxg{~qLh9c|$)A)_LIFW9ia)(nm{FhU&@yU# z@gq+;kcL6nCG$Oz+XxkiF>ff$zl zg)5K_invDYf+6RcMh}RIk9`Nt&XuHh#5F&+K#Z^%`@sg^`@GEu-i}`i|C$V~FzBS! zmd`xqM+6|hs<;Sl_L*SMwMIzx@uTIIkh}v1RK$7SkWn0>`^{0T(#<;4(@~H7wxyw3 zEg&I@&CHm&8=}@z#&7bQqU&4FK>1mmmi^C>;aC>gn5KK>^910HwcU(&OEmX>WMpAL zUd+$w2B9I%l#$_IA1XPKUfACK`8ywlfc8)H*8lBst%1nGU%5emjW)}Yj{|N(8|$3# zxQEx!UT{&L)1lXC#0c|B$C;R$oagP&>rr+O)|Er?_yI7lN?&%(*|MCU%?Fp~k7^dR z-|rlVt2z)^*Oq4XzoVkVpq+&}krhIHm+-Sbf#hC+(IG>P9t$*^tx0zDMNii}6iQuk_Xuv$vCeKgJ~Z0xA$7%|oTSQi zFYLeNfq*T@{b(~l&1_k|`O{S)20EIX>x+~E9Nq~tkqa6BaP0~H)zCLsEJ=sL}p`re^TJMx4yvn01&=Dl8o{os4|@k6Q18HPmQ5FBEd zjxANrbH}!y>anY!L5Pam^2KA7#PqJ>pL$MJNPHid7X2RJMNi*gyC5RWQ<{yJEWm_KBaj)F=mUig59`C+vx)5<@RT8kWx9qE{;9 z7=CAoX7L9fD@Py}0^8*nHleKKIV-L+CH8En!-EmxQTBYjkf(qcPT)v-n~za1*G3de zpIV&Gnm3qMXCl(vtCZ|+`xZ4L!=MKpk1}4+qsP(qJ2ywp1S>zbc)zyj%Vkf<+qpw2 zLxaQjFqFONy))W0j(_y`&SV!^`;)$w)h&}|F>fQf5`E%DjHoTkej z#C5ZSOo8(nQ*k5Z_vfdp^@*BZVdQYAuU&TY=Zo>&_Kwr-%*x3}?Ly7wjE8-J-7A!; zhaUsm0Mbmc!EH@H4i&aF2%-qz%k^LGOsf*BA%BbFey#o>Z8<{Sv-PvzUd=(GK$|`l z(H--@00$7JZN?1Jof4baKbG|7w10NB%p@ga4c`?8BAdQp*sOvd2ku(hg*kFc|5@~c z*@zTPMG+Drbp@+wTDvRjPh1-QlmlNcHve04W1z4M!dKRAhb8BK1lpb_M%NqhA;iFd zT9OZ?umQ)#E60aa?ZqAJ*PM%on4X)HfN@A*97-V7Scw}?Sh}AIwgN^K$WYYzpU%ah zEOa`P4I+gpbIt4ed8pJ zls8yw3%Ol_*j8fUF-1Xr^|RZhE{-Ut`)TH6S+}oHQ&oF%qjpmV3XDHereFZqTsJD+ z`m*e3#dul~XX_{H_dMayEt%djXX_P7FB{w|y_mIA?9{pnDrwTnauecf!QaJJaTTK# zBao?D%>JPI+dqt%C*^T7@zOvYdl<|XhLRc3wJGS3gy>!ndFHCUtA!Gb0~`nj7r@r7 zcU(#Os;{K+=CnAsFH!Qa0s&-jEN5aV7CA;ccBYe#Jm{ALI~fLw81IE=pP;@2JjO8S z;*-~4z>)Q&y%z?n0lDnny+q)+l zs{5GQmZvkt2S+TW7l10={xZTJyRp*GIH}9wr^!@Tu_Wi`#@d*4_;cnbG{^-=k?k}0 z$*iqa5N%u*-SPNbobH9a4myzO42y1e=JEy1jJdrA&!j`~>-5i@-q<=ND!>{9b=8+U4MUPi|cOshb0{PX(3OBvfsd=0@IuTkf&KrbgPslq!4itu?Xnm1+`}bK z-IcdIq9FRT7w}>>?4I^LUPc~GMKp=6LiL-N+q6oJSbcWzL>RllpX&9Bo^RE*oXBS1 z^^uE5+^RR1)Xfbhc;en>b8@As3V)%}v<&HU0wq5V3+_ch(tBtaWIn!Vy0VR!Z~Vm` z_XGY7amLWXbjiKp$9p@(y|WLk2kg4#F~G7bMZhVaA> z5N6Nkf?-J`ZH^7XM+?`D)6X!RnZy1GlD8cK(~26%K%ZBm9TW?}G$tzJiRrl%@Bi=M zktZSzYa?^~e>qenw%8U(zy}ltVF7;AruA`QHW?G>8W6JJxdKq0yjUT^ZKp9Z9gC~l z`;9z7*48zHH^+|wp#3VtZNQ{f%$U~};a!1A-Bsf9Fw;pCH&M<^cM?K=JeCGCCUyN? z{x;dPR^D*+&6}Na8<9A}vaQeO%88Nw zeTp!o1-`Cdf&J`)cQWkr3ezAM-zsswZ)Kmn*|+aPCL>UnOEU0R%s@sJou;9g{}Xt z@!Ndw0QkDDaA~)oI(r-IP(S&dm>6yNDMXM~-y_HQS@OD>mw*i8XCS^H@7eg_n)~M| z{HTE;F1YjwL!xcF_m}gKr8c1o%e+=76ST1fvLI3S<@8Ne4!3BXF~iN6?kZCpNi-4s z$N~Mq1VX!iu63KWr_7;_yAAMUnL*V^92ETq*71X!_t`#-LT3V?sYL?!W0ULT18K5< zl{R|p{>b<$tjy_v{_l8G6o@RC*0Iue$aQ&jXBzLP#R;Y8gHKN}<(fEPef6pBogGOS9Yjm;H=J^yK~ywO50L;5qHH_g?AxMD34y z`9^HWEqwRA>NQ%L)t@sCdYjgqL@gsARNfydYUi(1?(X4x_AFF-m*J8i<~MUySsRLe zdPJumiLoxx3Y`mI*dyS7EK}BeYkxJU+tNJp@KhD3Chl}Eb%xR>EEHClED@++Q$oTW z+FEG{BExgJJzO6La0ukRF{ohXYW?9g%}Ek}6@fzxcb927f@Bu%XSYHdh#1#(ZQ^RD zr9H~s*M=;5hm=U=N21loU^lagBt+$ap1?1Wsm%n@w%lgGfN}b+cF~goIj`qCphzVL zprhIU?|_yF4SZ{^CaJG6q(E~qQdo*7`4Tl$@}RczX#^XC~wB&hLN( zbU|cmReVi~J|oZj9WElRv47`Trk|hcjuj(F??R&;oS1#9SS@L$_VFi-l`2;o#WQ1j zPAggB+y6=4mE}D;j~Sq5VU9yyKRSAKw01qyTq(nxkzhC|73)MDRiU2M%LJ(JTl-vY z0f?)_$aqm8Wq5ixI=7%Yjmhttiw_XIv?_zD-+E7;Xci*{e?bD?$}*v2+}`bR4}D5i ztet8x{0HYKUD{iYsKv%Rdu`WZqjXtJDeQWLZ39^u5>=#O{pjIhW^dg7{n$31b$&qh zw||Q^;{8{sOPW>Y8DZC!?yD|WCc`zp1f~TNV*FF3eUR%nf?eOoow|+%mS6Xo?NT|< zO!q{l0vVl&DBHq$w|46t{h{!GOy(MiJ|@l2pYD3D2mmpYw><4a|BDV1wv9FEs!gbj z{Hil_WSz-p=j#W^Xei%8uz*v2l$c?ly)PaxoBjM7LZMWP$0y)asgvivu^j2ax)y*L zh7-&#rEzO}FOuAV-~ez&M#4E;tLuy&OmW@5;<@+F z)BW+U=WE}68jV`k1CD12P#8{2;f{TLG2)ne`a#Z;j4*QBcuwSSG&tcm@6K+G_wtnN zW4qu?jqJ z;o)^RttEM<>#6LSjSI8UQ(Xu3E`F3)`xjF;yU1@c^>o^Esu+W1*Qg^nw3i_;O6C;W z>N{0DfLg5R4^0`Dy`MZ{Pw1d}(-6_dP?O12FNFD2sv)45vH!FW&%AT9Pujoi&{Xu; zD{Xh#U}YpWb~FPX7OGJUR&wOpw!Ig4YIDDpy?nmc8(>}edxuI5O5lae$Mg&_?zS~v zYqRmb?E!!29HOyAIw^b$4M&UKF#{GkxDgygrkE```af0b z-}%J#>3G8K*0H8(_G4?XZ#>y5wd2iz-^Hev%AQub+wbOU@xH}Ti30!G(_NfxoID(* z{79vQ7=o{UZ$x*33A0bbGWEe7)7E{NkA|Ssk$apzu(U7?#V!cvR&B?gpv%6d%vJ^T z>)Cn+0~RU8iz-e~{kX3)J)r@8uJQkUOp@4%fiAU>@nVAl`sb%WWa3Njeg-)wF&_(U zl_}KuA$}u9@^bO2-Mp)gjWU9#T0cZW54!9#P41BT%XEcbj}@qCCsXG8`HG8wMa+al z&8w`akBx&&bb?(Rs_o1MdW7j5UyJ?UYIfcRXx42Rd?~ojXcpltGd%4m1l>aa-X!*J zuou`oOD@qldr2c4!|VyL^OcKNOU%h43^bXmPnM;3*6R*IVH)pIt|;Cz^?7ds?na_!wRFg^?>^}3 z%p$t^eDgYmK35&vgDyZYIQ`N35P(A{PXc*=5^&TN-WtzIta2HFtEBC~9phRo-&p%P z&2ON-LDVrJ$jmiE{RPgpwuN#v%Tdy$1*tRYmUF2<5HU7p?; z{(JMs5B}4XtsgGHN9v|r)dxc~=F-LN0r9g~gBnm+wj_G&t@@2L>mUscp=*Q)+Mr@V z3g20QNaGJ>8Hf9R(<%9crMY9wYiDv-N|TAzPmh)q3{GNK_mS&vwGwOGezcgdUT0!v znkeYUF|66K_FQE{+lB??=LhKDtG>FC!_^G7vVAsT@Wd}Z8+K&D{ut z3}V_({lMe&K%Ds%Bk~=3E8gCB>KBiGns44uf7C}FF(wuYEmEuz)9+(rU|h|J42A}P zU)(jB6)(i_LKvg^ONS%RN#A|G7P`B}k%Hqp^#%q!NbYOt&3wEbaQ2KK6yK3&F#YD?^>E{yX(^{(PV5xu5FdHqblql(Ro}UzJ;`OWg?=A6B`1e?GGg56v~j8I zJsyCC@S3>l#*PT8Tdixp9_u(>TfO882{KOJ0sVi;2Ee6{N{sa@iiA5NAC|QrCX%{$m`Oh8jniv zf#)6X;V5bfe=UDv(?p{yyyely!1fnw>H0L1@0KAr;=u@YEn3-%`MSmWpYti@<-`0M zN_)Pg;d_ZLLXVAh5zoBo&Na($`IoQb#7&J9rJs}961pb<>hB#LPgSnUq&p&md>pv);-^xDx$q5;?C=~*auuLKG@E`wl0=pP<61WzI?80pG&CY0~l4T(uJ3 zJb>s4@s3p+#)K@+tanA;Fh)Q-KRaly4n$X*v6&@IXM7szJOh4D*RU=$fgSA2lLM!I zkcK#tR&tsVklKQx$6tKnD?v4sL#GI4R^KVXx4blEGkeX>sn0YUN*s+#t6c#vhCWiK z^6Fa2nztPabimp@J#{^S5%nf+u>4>G{1T_zao{Fkayt}F-)MZVG5it5e_XJ9ef4Vf zZoc~T8pIVMtl$D{P6Zx>OtnBKllj+1j?r#;(C{{0fJJYC8Lk_O3#go&g_!_Ne|9{> z`;ZuuT0PzFVpAjpD3%an=&DZV=B8xrOee_R=cvK{`KgOw`^n4Grc8Gn(_xwnBSgF_ z&GA0u3LIj4>~He98`%@J?w+Ipye6czp?jkoRce_M#l1`7s@hd2k3 zdIjTolU@RBJ=@52{BBn)zg!2SI>G3zo@@46al2!vyHR4lj7=ApELVIm^xv2v!FV(F#_Od$qr4*zyd@;J0TA5`z4PDvrI6T zJPoFM0>EgkuQBuWPWD;Bb~gJ2q>#a|P?Y(g0WCl6Pp!+}??Sp|9J?xzK#MD7_m*@P zBPNN1q+ACg{C1&w6M%h!Q6@WgOAzMz9#;$gKG)OlSkJ<40RMv*_$TLlyx1bp{GCVj z!^mL|n5A=QtRRUK2}02AMHX{A$34E?3Y`gt8fXhrR`vTIu^sqGoM;IBqM;^O-*2I8 z-~5|j_Mhi;AaR_QA9wHX$3`cS5+?Z%?UujrC_>>Zp2xiE_-{sZQ>v~{KyK?}*Us^8^_X~=?6$Cr#UG>$MiHFbde9wtZX@zo;8_=4PkyHRXYJ+tkjtA`RR*nCUi?0leW9hnu z;I0W0+y-~T;O;QEySuwva0rmW86-fE;O_3h-Q8V+6X0^r`+ncO&;2t$rn`4lt=hF~ zt=hZ$c|%KD?VL}(DuD+Ns=}44mU5)&hBo7a$Mn#(H*ZA@0147gor(bQ% z(}0Mvz>4)PZ2pcS3Mhpw-1&MWGg}=E1A{do^ymM`%l>rz2w$Md^wK<$rN5KbEamMW zszgi#SnJwpW?#Q9l|3@%+hrrkPC#AcO%MAM%bAAV5s0~#LBmPB(uHW;q7#@3^yRi3 zVLNY?i@G@9#RU_wfolfFPNU&QIp-MGb>t21vZfEw2Cw7*KtAi)7Us9EK!1Y`-IMec z5E4h@RL%$)lK`MM@8P=;AAv?xxfBM6LAI1Z3gxO>(w}n*lYKTeb+q0cqM#;V6zu1f z*$Ec1^S=_M-N&F0juq_^0={sMKjn{WLRS^%6LNIL`P7YLKh4Wig7&A-lTSR=gk3M1 z=4Yk8ZFX18#DXc^zu>0GFcKgTSXnF#7i^1EsY=utyhO((rLqr?)IMg$JFO3sy_0x- z@#sWB2IaM3B`x|Yhm8p@XF=;%=<^i2aocqN9Aezr8a)RfKON+zX{$!%DE6^Hzw!19 zaDCp40wNwl9=96s#ChLe=_|B6zMc(8YmIucgSS3WPsSAuk=dald>W~@TM_X$CpW)! z-g*i><;KJ04q&i6*%Xcym=Om)4mKCql_?=Ucyw|L7bgWae7#v#dHU76>X`yIFc^OL z(QR_~by~-h{STEu>vG*s)C}K+c61DnEC-1A8D)<3dUgC&s^il>(Wbr7@UscmW4c5V z&Yq-cS>!pe6>QZ*;8Nr;?y}uldZ>FXA$QMeI7&v`kqJb#yA_4X@bZxQ#cuXT}sr|5qJtN?HJAGs=(ifRz1ZZ43VU7jasK_SVQ>`fCn z2LksB7lXRmE7!0w+{%Uz;Z4_Vv3ZxK6T>)LyR|5^2T1W8ttKcaDb6~khCT^`f2cCB zDB>&u)kX_p-enNNKjGL`=K>d!jElFlB&X5;5(~o*fGIQ-N1595K}qmvNFP<@B9I_1 z>ksTA<4AwbGxveh0`b;)8(H&=F;^=<)zigFQ+eL;?Xkgag-va|;-aA5t!NHM7vu*K z-wDxT9PtdZ`7np1@z90)K4|zaV&yI$Q%XG`yXC7B2H@U__M)FdZ98x@{CrVxFs`{A zsp2Q!oaW8{)C6jHTnD3k?zN7O0C#=-BzRhW;O_$kv3}t)f+?|e1tccRvZN|}x zPUCq?;TC<=CjmXVbi4Eyhg;o^N2d!NDK7BK$Ik$0$7gQlCEv;{Sp4j_mv)M3Z4oh&#j0Dj>9Kc$cnZil~`ttc6j4bGDXc_;*VgP1!el zyZ03y5^$2<`djvU@BUy1E>a2ZH^X!3caNGU+AbT}%3+wA`Y1ShD!IKyl{PEj_UFj= z7{RZRkF~hA7ybPaCcDXXtKeC&G{}G``Qs@VZF1gaC68j`n+NB|31|L~82>4zi3R8H z9QH6fPHy!h4^YQ}dsEQ6Qr8G33H|9qCydaVUVeDN;^6`EF(bYbGmBgH>@I#V0N$-{ zze}6;*Mv2k>#i->R0!>&`;a8eg|Oo_L!CkLl%x9(q*2qt_P7XeFZZBLMEA#F2M@BH z5i6P=8Tk;>RRhJzJ&bP3$|*cfu`1b%nGEA17S2;hLH)Ve7aiKZj=aU%9g*GG-KpVE zME`s{Lke1l?DPh{TQMFqqU9JF0j4aXp48_0WgBT3>GJ{HEn|mIzLIbrdK4G_vwyoA z2_?+S|Bz}>Fk9GuXJ>bkcmIZrHy`7$Yyfeks;VvxAOHT;%&pF8$OP{9p8DsP1dhXa zbs=hIkjWZC#OZl13OX7K&0@)1?(nweksmMZJEWl|Guoat(94?khRWM(Yiv#$ya~Dy zc*yC35F))4w&&t0-|jlt5w5CQHf?rj5PbN&A8TNePtE}B%Bl$PZuMIzIL*WBFL^Gm z@<=3VW&pPd>vIqto5_hV8E#g!vlIIhmf_?%+M}c`Lx_SeD{Il)Rh?oGxT}JPzjy&l zp#jDegjiKO8HxVN($WXF1KWyzMEIbxFvKE3jO3=Qa@=ME-q=U#jweOv?-@SC{@Q{j z!cBx88|qed*DT4>U_E;3laaMxwx(`wsC>M#@N!uOJ50U#Uv*>%1CToRk^cl3^yAM? zKyqeJfFwk5w9=3pi$dgITd;S`uDJmuAoy)R*6dNv?OkghP~4SMyT3xSr{X~u+++UV zF9UEyfIvzJsyt^t_U3NEEE5}uhR$-k1uS!T+6PQO^?DZxR7;sScmP02gEfi=+`m<@ zu4N^cq=()QfR~&}3)F>@Qp2ldm3xNC=-QAU-SF zavCog5ddJl$v2e61Ep|qOgLR<{%Gg=#+7_YzWx6nY`HKWA}dt zqXG~H9v+g31rLw>Q)Yc+jp{LGUv*mAP)>V$c0>e>xB$IM{$uw2j{En4AnC`%|5J?( z1ppM)UOBs{xNL9jQsLFrZSHaffs1$^6);=)wD&hQ{#>@f4pY{>#9sWDF?|Fc^`j%A z%9m6A2ria@0!DpBP)Xd0%8+xz0?DA`BSnK*Lkh@Xo0`6~!ZZ~+*>De%BC0RUVk6FN z4GEiVZq4#)9i}sC7%Q`dgG<)TNMm`Z6n#9|b36)EIxCl3nw&0AcdKcL05joWTKGav zv^GIudCWT_ayXtX=qjJwchy}$flww*3tEN(g(u9qp&?fD5CzXVe4B_j0v;*IfF8&v zxljRHYVe^ZbWezfQ9D!sj?{p>@wV3AElr35eCZ5*6QDvYK(!P%hH7m*s|D!`-Lc?P z(?=inJ1k7du49Wun&`n4l;{$RMV50QKlJk0SJy)slE$ytBD9wB;|Gm1}ubQ(0F zviiqC$d|SMeS-r5^kg&(UCVdsagfBP6~MO8^TDr2Z5L`mu96!{E;Wy+w*SL`sRWDd zv1pK{4QINr;?;god}>mX!&1%O>5}Wgcvg;%P~cWiwtz27z%vso8hQ~!*cFg0li1ZR zoAX~vcjS>I_Q!!wQ;MT?ekWZ&haVK)b4VjN3G}6(nTGar%(eAFf&Ize7)(?PH~krP z(Mx3-3#WlK&qM_u^`U7Be{Ly>8M#dOFvLRUc3*2UY$}r3s$`AGNxzHFf7%kjgQ7U? ziug_ry**b?GU01@V5ELsj#gN|2eOHgjAOSDvfNra5P)pZ?8DuZm4d#df`!_G-8WqK zd8nj$JCM31`DZ5*#*|sdnvd@-Iih0*1;62ppSF;B($=2nUlgW9@YwBI5q$d(Vx0n@ zkdGK%3c0$4>*Zaa4&8#_0xOUk`g;NWOK-x40^t`^iry1!) z&1LB=Jva%W@o2rXod4vD=|l9h9O8vAQOSPLd2kjHp{6KB%m}!Xrx7&{#*hSFKB**` zdNz>_Au}_5I6GU%x_X#DA~A|ZeW z3J|YGxPT{C>(HVxi$-MhucTyW0v_ExK&JAW=tg00c(4g4j^vclJv^{Q&rFeBs$742 zFbWH#eXn?gv5NiLo1Qlw0*8i4-IDt=&sG}$ul%Rdxf8iLZzxLdYj?m1{(BSH@}($0 zv>W+LKa*OpCH`MoCsE>+@HKq~`xfh+S23Hp(P!iCp%!h+NDMjAXTQS~YgBe7dzIIv z4{d?xg-iEaMssbLf4SS`%aJo)JBGU*OE1v2^>cOMF-t-Nj~vzj$u4LjS*pB>&e? z_R3|X8h^>*dzVP4B(jKQ`@tC%XocG{!`{-W^du}Av{doQsxk1bKaOKh^6_N-&Ii)EkW9AX}8!7IW9LdWLJ~_^8 z77_Qul^8K2Oe$IJNp8Z`4#8T4<2WX0pc!nsE1t&<;AF)l@^=k)cIh#s8ZZ()V!{2c zD5PV(C|AWqFRXe6!4>44k9{933+P)m{8rZ{?6*GU9Az7P?pj;5@g^ZjcP3l{e6SYK z!9w$tlI;z@$IWBc2;0mQ*dOI+*3-`riXKOqxP0+NL7 zXZ{(hbKZDO?R1KEWa0KO4jNHuzcYI~FgE2Nc(7=UZo^W zq~GgCg-v8$iSurUJ<${wfIs)7Y%6^_T7mfVGm&k;tpJC8oF@vr^l>$v94=m4-zOFc zWV$x2`d`vX!T3?J1M`31Bi*LbYEP_MItAPMPksNL|69HZD{MKx5x#1BEy@Y|*;lFb zo*pg0(dd!|n)4JPkxn1?TYbDe&aZZl%a1=EfKg1dBp7*gc+Sfu2AtXq&R@?QX`w_G2eFDi^$Tduo?c zlk$z*rVMX82rNspK6LtT`znb}+&Mu~BK9=@)c}Na+k@W%G?tU3`Z(J=R1ZmG$El_5 z2@H`m38>$Ekn~cOwoezHs(Vfnn}A51oS5wCelA%UR-SIGn=A>$8u;OE;t|J@Fo%K- zlKp)$H`qZgM{UA0`M)^52LEoxlMoIrD>Po?8psbBmE5NRqmF9;K^1wEx#KNC$e&+o zu#iy#q%QGLbYca+(?A%Be(^PT4s_JumVfjGeM!)bf9J)_kiOG=^xF7r@~{s$i)LYa zl!eq*EDS1ts$+r39cuBgSik;ly*Vwewl1yJSu^#Lw~( zNN$Keq!r$bWT{nTk$aRdvR*QTlTycZ%Z!?Y-$=6P8l9L6%SWwjBIdoq+ywv{c&Fgd z8%FKj$O3k+C`%H7QK;)4;^luPn;QgE&}e~Qt@o;Gv7k^Yr%(du@ERHlhyjYVe=^Ej zk?xYGM9EdCDhVt9CojB3b*IFJOW>r{wqbx(EZ+VMn(Hp}&V9Fx}R z+wapa+BriE+fu(LsL&D0QfCNcI|bbJ<<6=g|3mb{ zCL>l%D@q%jYkcFekd#;h+0V6Kd70u}ciDJ%(6-L0!od=84b+W(aOEs_zxf!>`<+}4 zoohw}!wW=hhtUJpk&;)p2j@{kkI{Yiw(c%crz9(dBle2T>*~%Z!U;vWpPzQ9el3Au z?_i#rn!c*4TlUn22mc^$an|PrMBLqqUZ)-vlsvAYOfbQFrVfAW8om^Ve%>6sPnLl@ z(^P)O|Ii_~2GgHJv|RjCzxTTJXI-^i@fG#if{X_SHXNWg!(FF+P%$c1EjlOvj_t4e zWUth(uoHq@w$1c}F~-iqj|7;fEBTvdi{6I`%d(zVF6h4{B&phtFdz{q3)DNQ%Hb@z zv3l|ft3#a<@NbO#OgH^9ZhHvcck=CJ2|O-X-hHCe#niKN5qq#v3oyrQO^R7qgXOv3 z^yHz1468MlsVAANvr0)(jH@-~)p2CvcW zE-A>*TM64{Xq4W7*6SZUo!uP;pXdiV7Xf1QpR=#S5wHw}hoVM!Y zG$-*70cPkI1RF5!OhuG>9cMP7HpV1py##$VwmzY@P!RDGq+(vZMiQGpBRr&iSQd_8 znNh^5Yyghr)@RMGzhEh}ev9gm>xtJJXdZD2b5^Nz zNlNCB`l-t9d5Lm|G=G6*$4}!w>JhF#BM6N0&(b-o@GWCl?|$J#=Pp+o;tt|f!qcRw zD$|xCPL$Pl6>m8BZs+i2Z^mso%A%B5Qvc=sshXl3mb#6m(($FfCn2ztH(<_23hJTI zB+>nVTm+=;3!=v0Fa1&*m^Sy+%_yoJ$9xJx#R6H_71@`};Bo2TtvXeD6E4#QXx{-n z7TqJAu~(ARO7-t`Q8PWS1Tz&Ls+FYGg^eL@JjOH&K35GcAezTo@!!Fc;4y9}P@e5+ zK-8@B%Qs$2$`gzkq(AqxV+QgM=!W)jX5tjDgZ!XJ>i&k%kSn@}%9JVxOk(EI#FJ2P zaPA5m2XOum*Y7&6*$oijtc-gps4i3lysWGw{zjkPW|nF-q5e318*9vgRQk;$QbAe` zQm5k&{PoypzVuaX8*nsQ3VddOh)dvFS>kWwVFhrP*dHaLH}epJ;3pZg!Ks;PAb(0A#P79+mYsFrBo3pQ6b>m+9m##IiIv!&7!`srI2m7Vo~yae1H#24ffXT1%? z&zn>YbWuxE-aRhYo&Bou0u8`TBdDv!?K%ndHVCqtR>k^yhY{D=OipG5OP(R+aywQl zc=2oKveb9$4VkOM=C73;&7Mlnkq+x@R!_~gv^kcO^EpWuyp$jZB^OI>i z76|Ni5{kUspW>WRN=uRiqNWNhh!k;(@F;Hu_DP%PvDpRyJ7CnpQGkJEeVkY@BCT3+ zyay722!SP$UU5}lRhd2z-YnW{9gp7OkjW`fYFuZBI;l`@z2H6?x%<r6_ zn0#PZl`A%h`1Ciz{_08t9Jl|8uHh**<(~Tls1Ln$K(?&U>G}n!KXmK!tG3i%`s+>w z`D(P z=mYAi;V?rSDMaEAu~3~F#2Z~abW4H8S}eSp4nGzit`)*=Sxww zy+rB_6d<^08ZdQbKR^MMskWPO9i6;nsU36Mmp;7JeGFQ z8B;{;8wNhauAbUl_AP#40qX|*an*H6Zu2LDe0_2I?h(KY=QbYr{Nt$f=P5Jf2H~Tq ztpk>8KyqwlXt_rxoIhqNi{E}ZDd;I7!gE)sU@MTX`thQ}F{K+rtBTN{Ft)@S`!tnwA z4iCfnj|D&bHb6FyET*~xAESGKNZ~&<92hqGpJ<`)?{_j@S!3Edr})W0AI4g8WAMTZ zN9|#HkKR5NopqQ@kI(UI`SqV5Cyd0 zNK?(%yP~G~H^IWAi9gUFULPmyhiIL8(-ri)3jpU^JYAEy6hhB1CMx*@&0OqWUtrei zwPAqOt6)*P`f3nm?`cpL!lN+~7i|YeGEE2E7MdIO%f3-7c{IPN3{EnEYlD`cp#{dv)b;1FI`3v$lt8!!7}q z)?zC^7T1Q!2V^Q?Y>KhsWqaR7`u5-WE8L&vnIT`vg&xywBx%YE28^m6dwZvkZz2>m zq_)jick6xcNw(4D?4FB|#@?*?1zBR>F&*1nuFbra3bIoS`iRf;{j2mT6o3KKNdUozJK)dmV_hyf9mw z1`*YARvVrZbubK)ob6+weoGo@U9q91`w^!#3S2Sc;(_rAGc|{{7pFPlo!Szi05d?$ zzi^(mzRwa`79e4!@(Cj=TudMZVh|u{{4z_QN6A$&eNnfUYI4bAd1hw z@0`QO$W!$F*UqV&Fu4fvvQ2n>wI96c*&IsMOg;b!>hSpw6p+U%XeFfX_1!AE zy2biO8K=2NTAi@*RcRDb+fuSs$br6M&bu{j`_0O$?ybLsKzXH=KINI>90o1SgaV}c z{(C3gr4gg_2Nh$dY%xcc+4$!IGX~ab8{L`B#0IsW;|$i{su&K5(pN?D@X;aLf%p*< ze8JmPK2{BUAq^rM)$u-_wlTpIJRie!Te&3p; zThGBp`r|>@;-s?2?~|bEB2V*$a`8xYW6tJEYUc81YCW%}5Cj${>@&RKa`=M7djH=u z`RVbM!_+4j=&;p*eaS(}jNa{QzBTC+oZH#QuS@0>8OYHsd`M=4``Rlyb0yxp@$6}u zD=i*?Dc4^<6I)_`m17P|F%W4iRa4RG_@efRSqTNy3Y!~1PctUlOmGsBDW5}it$J(^Av?NrMKishC2Ecd^Ie_g0^&zPDSa|&NPQkk_#|4<0 zO+ZLu8)QNHo#{gyi(fP9k*6p2Wr~&w;5!;0hU=Rt&5s)we1KRx7sF0Eo`q`Rr|XBkly|4pkvn{jx-E#<>2c0G=HD0U0;- zZkUCQlsH3CT~9rq{fyHGv^~mS>Kpzz1#fFIh}WT8v*AmF8)Fo^Su=S$DDc$sGuILY z4+=e*W8u2@a|`Fz8QLBt&@K->z3kUjr8tXH9p&{3U`@$4eLrpxyiYoIpJK1IB_r9- zi=-)DvQrE5q~40IUG}DVsrV$0TAAKd*MGu7ppW9~j;M-B*jM^n+N5tUQeK8Xv12N1 z^9Xq4kL9U>)vVin?=00~f|!}iT>tyDD|IMfgc4H54)0t+7KqY?roLkT*h zAyoY8dnqoZ&WGIqVQ-2Kwt$c3cIeNS3jL#;COXYu^Tj4@KOnm7ml^4?Hy;;vpGLLu z9l3}$R>&ZGB4s`}+`a-SCk;)JE&dI;H9E3q9ll3wTNLRL*qp+)-=|h`NP|2lG|nz z)O0Lit*B@S!K6=^uMaypq ztD)dS;~(<}#|4ZwlF6q?GC3)V3QIgtpu1z({N)xi%CnV^`VsoUFsswESNepnhK1W5 z(li0-L2q8nY(GVB=xSC@6UxtmP94)-R^a%k7#TVA{WSM%Mu089gyA^T#6}7zLkm^@t{!GY{*XKsL!;q0q{j`FBe1I0~TgnI`WY3Z=6q z{{sia08&Nt9W&rf+~A2Pkeouf^93sK_``JIC`Iz>q%|bC7`UV!Kaq_S0Sl}ZhL#`s@i z8QQBka@Mt#a7Orec7aRwq@iXt`w{Xk82`Mr=86aVX6bX%Io1;|O^zNj7?>hS$6usk zHzKL{^9a|LQ2twrWt0VatlW#<@w_>PoqBD7a_LIJMOVbKi zbkMbQw?RGa<5V+9&00)sZeHfdp`D6!s4rosC5h1wb6kCBAHzK(Rdy(N8VzekF_M86 zD+KC&sS8P|i@rV}us1ZXv9$&T(tbt7j7E@uw4ZhI7u46iIz7&Xm&z^_3#bsxuNKxn5u!+B^Z#f) z&AY|dHLS`_Fl;^==N=xWIXW}mg17ElogI#=AOAlG6+)0cbQK$ffnkRF?JdV3uoiPO zRB!>wS}0h+K>K~`1+wTTQ!^I%rAUwR(jHjlvU*GO%WOW+-SiJT9YW<`bnn!M?Lm-A zz6NG3rXaU<#`=R}^_YbjL5RX~0M6O*y9c(<$B{xoQijOvnR=rEoAfE^ANUK07T zl28SCxEHEdSnm^>&E-=qg|tSqGp4&7Rt!gzc$}TagYi=+8lQHkmWKnrNaSS5WYkND zp9lH;B*E`l8;+}g8a*i_IDnvBxP4;hMKNs!Umydz(*U>qGDUN`uKKt+y|ny4%Df%; zUG)>IAUDeFdp8`JFz40riNK>jqTHXU1ErC7%n;q=TuYx?%~l;PFtI(O71tI>I~ZTs z&~mAF;MdQ4OeWu5rE;Y9P5#|oQA7-Ohhg>>aYg6ZIL(yqu?K^I*7HlB9DTyT!c&aD z0=jjMNp~(eT$WI-33?Ce(B$%oz0J^BFwwq(%Q}EZRbDJvpT1>;Wi}@o2GpC51ayBj z`z!R#eps;ZeJT!nyvVF-pE9y-|Hv)nj14FtD}V*M1b{g zA3{In7gZ>yr-(f>CMHy?uF~IqRiI~;HwgkST_6IcdMnIF72L!7HG?hI)TH^^x|;~Vy62$8WzfR*%E&lE z#65Za0!WFRnl{nnBE)Bz3=|%DlYRE9sfi@nZSpWlyN1DQK%|JS&Q2%Ls-CCj(618kD;C&$8qvBShSsk~T9`v+5j=00uem(k*>q1=`L0g`WgS z@u`)i@c{&DKx-%(URto0t4oRDXnywKN-)du?bAy3uR`ig&GY0KdFepN>H1ORH?RZ1 z@8s7*Ca20BoB~iBz&{Jr7GWxxs;J-s=(#XAe_kF6XucBk*L;r=NT42=O|yyf-68Ik ztee|jnNwLj!a^>}Om;h(fNjFN>Q;Dl#i#hnNlxFPL zJx>~azqi>F8r(rq^l)2*QFeC8U6bLwh??`=O48=AWl^kFzp zbY62^IT~F}^-%$DUw~0Iu%Z)+F4WBBXjkMSMZKD?s_cI70WWm!UN}NJc?k*J*Z>%D zh=mJ$GHWZwU_#fM#>>?W|03#u`r=M4Cdj z!v#b#1vVFd{-+SHcVECSmYX*{$zN?a!FN~oeLknJhWna7_nUAayG`MQkwIG+LSTia zhKQxUU3SV)`=!a_CyJ1;SHQTRj}0Etf1(1 z0#G}o+im5f|b;spSKZOtTv^I{* z%^ScycRatKJEg=QFSZwws!KXR(fVo_58mXSd@44zU^kvs893){S3(G$I>InQScm`3 zM-U8F!o2HIB%#AoyL9+IX+(AyMptyd>2N+#GOOC<8Mc87(El`10R!0@{yMS$VeGq5 zX6W&L0qMHB7W)Ecoy%=B~3s&=O$34(Fqi;z00^-goykgY#d} zS3S44J?5G?F3L*o8845kR^kujfYdFui5I4Kxh}UCf0Q)ZJu=<%rjS~(G=JP{g&0kxLJQX;!rd|F>782!TnG4xDQ34SSdWgOfc>^j zFz0mzf(73!3$7w-@r9G!@(>YEW>c}OOAg#55#KK?R2PEq0yoiX4K^_t&V{3hO|ka{ z^K%A$y_X_cg2Y2Yvy-E?xOZo`8Nhca%ZX%hv2^jyL{_x-?#Fl<%Ssm7n-y3ZP!jAL zO@Raq)!4nmZv@ix2US(JxUL{u+}HiZ+`KHc5gLi@Yi#j2~lC~Yf4v(0UiH2CDDvnay>@8 zC>5WcxAjR!YS7}JTj<{yz?siE;!XK80F2TA*{LY%i_4ZJA)+3#{qhV2XP(?rdrl@D zHcyDQQn8HW^j(8q4ZnfAb0sY{)a2h-quOp;QfQzu-19TeF7Zzh8`QCUa3D8g(x#!O zF+2~+2)JeFIWuQ?tg#Fls-1?TZQJ4#d5yLWGKX2f664~_#YPE${+de1KTx?~tH%tT-&%eXt6 zT^s9aw;dRjhc@5=-Hc2hGc=P~Y0CFjfADoVY090omI6t~sWj#?89O#V@0dwb)_(k` zB*koEU{ym%6sfUC%VZjmB`a`6<>v!<*asffJu_!x$I4PWwitJf7s78~1H`_Rwwkb5 ziX%7g)<{~16Qd)hT^tegHHijK?gpwtP{ZU27dnW~z_mPasHrnJm@Z7s{jrXBZkdQN-)+o`6WHw@foY8fF-EBqECvC3N+NXdEqB*2aoO*Pls4X#p3IJ(2E0~k zX^FMko$5C5e}u82GrKpFdEf6lK$|qAO^x!^=8N+Rb=Iqb)A!=10CMYrPf_?Wr}Vp- zpUSD;9PDO136h!_thWH>)GuD`f~O*AL0~2K_J_bRDqMrfFq|;jpAEOvHyD}4*E=3>Vev?)zUQ_%#2>3<$dfC6un z_yvH?RcTLWDtG!m3+KCF-)L)suPpmuj?%A7A6H4iNQNwVIROs0WK&{SU!A{$7UcCL zAq@syGp62vEvQTztu%>8ieN}Xa;pCLi!ljFS~ENi8G_xdI~1htUhVOb$nSir3J}{~ zg7B+@o-jvT&r{a^8W!`dwQD$*xQ^-e3C+_k#+LsigZF;OKtnKQYnQK2rXt`;_PWWB zTzef4fYo&D^~^1^`x1287KjG$AIb+@PaI&WdeFwYp%6iQc+UhLCtRZK{dd32%?^zVfH46pu~3GK{Y z1bG!9+;J%-9@{;<_^BP3ATvW{rkX;eCfizJfe{JD{y}bx=Iw{xDDic>U}USbla4qi z_RR;&evf49x5_vM(nI1%nmcOI0;vElM(kRaor7vXrmXZDjr!tb8<=&sXuFPsBhs)) z>66A~Z9{dZOphWx7XQ9)&n@a#@Lb$9#?GZKb6#z+5afB{T);o%UZ0}mre%HS;&iVO zW6yX&)~DZJ)i~eZIj%DIw%@?pa<3g9)FB3;Dj8&^P~1Qb2ej~6v$ae>HUrrICscQ3E~wT_V?{i)J0d)SL42;UAl$Lay=99tXQ2ADR5gsUHL32r?vgkEH?~f*3U*AXlTElHw zpQUv4tX3327=`Jw%XYkNm{+>vkaJCVVhy0v!JOI@ zL2oYqdEWU#SNgWaoohJw=+kJ4@~;i6C*mYu8CM^DSqw@l-m6P5NqUsm&0hVU`OvoWPsd$nGw)Jhy&QU(V*Pm?Aw*sJ52 zsdMqFPXGiElkFC(^8GzXOrLZHrit?;f358!xk+WlhJb^n)A?P8*@pXR81~ma&kh7_ z=TmaNZ~WwGcgooq!rb2VSWe;fSI+0!3AY@Z87Iz5HIFxq(BB{i*>HaI*W6vPy}{-P zx#^MFbPqM|+$#7>GD9%V%S{F{F^=Z(`%|boO^Gp9EO&$2%Lb| z;wPo;)R3=mdh4+Ju>)6vgQrM2YbGsV+ltEKLkyA04p^{@KUOZ4yG+D zO!r6e`YDMUb~yJxDxa(9Io62 zP5e;MlgMmL^epZs`_f|^Cq5_>C_H6c+CsbHE>~1%9ATFj1lnoyP)Moy#^#Mi`6I3M zB|4)rtR;W+wqJ$?b~Z_U+;HA<8{4k4V9VAxW=YjwE>XKDBSkDHd1BpJp;x_k%k~Er z(3-7zd@Z4z@!&oSDlEeBBu)z-ffeQGX1q7mY;TU2vrojx%J~|%YxwLm`rov5tj)&L zJf1p5K^wEjBG-TNNz|aHYFtgFA-Eq5#r{Tpq&MUusVs}1Rp19?HmSq)Iubq~N8KX- zt;_AjdGz|Bly;Q2Np<(InLC4b)79QH5b~)7i?yiKjien8IZ#5;_n)g?TbRXzF|f}* zw)$@;;i4qPnkI?Gz$kb02i{2}!2-=iEviE|av!j!>5X<)0O@q8>(h?e{c+t2!V^y( zK^Nr5McDifvT(ZrJu=AT4K_rKndJ~7n2seJ-`uME;NZmG{=H=@ez=EM#%PeM?LN$q5MmXk%|2&w z4>68v`yi~8+zWRSYfwLKT18e2Y0V!K9~^e7kVLd1eW+MFJ92%6_BXfNjo4f`1%*8I zX6>Met|c4wKnHLwlaxRck{J^c-$D@y)CxGgllK?oblHwcFY=e7*(Cxx!&l zRl;XfEv6HyX&X+I4K-_@xK;em>1!`dZlffW)e><6eCgoP3GosgA*f^8ZfHf*R`~VY zpy!bR_$X^zNkakat7-&Q?-Q?b!nSOLG5bdaX3Na;;K9He?Tl#1vF>5kC%zlG^{GwG zjFyBYjr(a#=MXhWI}j0h@iam5VouwLd$t|~_xwza+-)EvE6{Ecbot!k`+^;DUBw{K z98!N)VXYoVz4y!WwieI)O!}xCAM~Fi8vj0-#SPn)@r`(?r>lP$kMYs# z4t8=8ZiZ`Vzv1bgS@0>sike7?f-AS3SQ$N ze7Pa?oi|<}0}x0+KhBMp4l3b$hC2lrpEHJnov^)QjCsgF9rNPhEg7>YFbF*|54Rpd zn8#>CFV5JHrHZ)|NYp?=(CgfiW3C4}IVgpLn;Sn>pJSrqQ2X_=pN6KU`f2G(YyH3b zUMlcWW5U+y+Wv&V$`d<)3F^)j3!!hg(PmT__^7#pv%~|lxvSg0@Xsw9wvkTk`4AN^ zvD)o$>n8#!8-3RJJNC|CgO9z#o{?b3+ctQ>#y>D_$o>ODqqji>*l{L%VQW`+?hhfv zFViye8sq{6awwi-X}8Gm7)W1VOjo>MEVkyu{Er3mWrI+#qx!^q;~qMn@c|o!0+qe* zhDxL%f6Z}}1K)oqF!!?f!}hXPwJf!~`Z>?ae7D;1POPP;ZY>8*{woddVF0bn2rqdE zlr;ESut8wyDp%Iqre5IDEm}o3C<3Qf25}5@9rGE+cprO{inDn9=*E4k-~>+-y8;1- zC0PrHU(!7Xqo;@HDji@Bk!L8vU7Ix9;Ox(GFIb2`CSXB1pDZ(R>GbZbh|`OWJBH9%LSi?p99ITvlTycT>ApPw?6pT{5m1 zpjVUULkt~z40tV3sFK`&(XGaFUu3-zUCP!heD4USgu1ipO`uL@Oh(SXs*K> zcvcux72B?#usSe~T+-#ivavL^rcNwj3RXUw>gXWbTrjauDAr$|p>YweldIRKME#LN zUBb9h2k5buRH0MGJr9Rpj(qsN!#}!YxPLW?*r3V33fG2KBH&XR$=Ze1$1{_0l6{G= zoy_3E5BmGw=P#N0wxX_RE~2$3agvjRp{GQ-+T8H3oi2F^$QnobGtoA#+aDF@!Fakn zL;H(s|6MA0z$1bcXzkq(l$83y|}wuDemqL!JQx-&|g%$hSZ=j?g*-p?~9VnQV6`=5^C zH~|Mn2z%OZ%}+MW8pw-$VHIPO!~wA&H>Kwt$_k9C5GZ8Fx zR0DgzH|O_wyiHBQxqc!Ue!CF{#{=QwXM@Ox{6U!sv?h!gJyiBDF&+=+7G5Ubx4PEHaiQGnPsIb1VrF(48Rg zEjGKiWKbAOrB;iG7+HYH2fCfjjUiD=T4#PERpx?RuI(y5jipn2kgIX8by*qn-^@#? zgZ93`-5yWp!e`Nj)wutw7lrgz=>I)+_42F27WY5gMtNaQ5wvqJ!oI~Wq%d^pX2NDLw=HkxvJg*^HMt{Jk&qjlr8E){-+hVcRHV4qa zfZz7v>f>oSttnCF`MRRvI{gMWXr)+pP&#SBXtBy{|3Rk!ek)i&D-nD2_{cWe+V@8j zkq`AZ$>;ws5rBOP;zuTq8hkzeu?5$6J&@z6Kb>jt89%;L06+dl;p+wF$D#w~w+}V! zgT(IeEwSDZOy#wq|Fz6z|DR=!-Q1bjpeBqeGT@Kwbfe1@t1ANFV=KLUI(neV@ywkI zS?%?1RT4z7dfzU<*M!DQHfQqf5@cVb`3_=R$K1TjXz5q2xu#A0wljN&c(MCAC$1WD zJdwRy#4qkQ#H`*A7-MMJoqvLUA&DBibAM}@S^6HfMO>VD$BU2MHAEuy4|MAu2)?m}{9a8QmXa~;>F!xV0j1zaIz6X_Z__)Lbg1MQ(hitiT zt*-^`A|gsczktN$7dTcxsx@A3)A=C&&uoSQdE2I0*eC|vw6f2YZ+qi0`KW@8LmaBK z`5#xZ+>(oIGvMYi2A*)=9IlbB?ydM50apHvBw@+3g!)hlTHLFv+ zUUjCbnDDn^k_+k1UVTHo^o^8)3`NR+yy)ypL_+yDSrAaSUiSf z{-*>q@WgL3@LuusYAj=GtVZB%oHIm#4|a&54e-k~o? zRZw1LiD)Q);M`Bmn>#P$7$^xU)WdkKh%CBTzMA^~VaI~XvIt&${xN4ejYoWfv zyFUj%>V5THABz9k>}`zy!o zCSz&Hu|CEK$D)a=CV9+n-#+eI^A<~FUw#F2nUS};V=DQh#$o}sOIj% zIi2wKihXag!UNH}+Mkl&w(>$75uEsyo zdhXg*vJ^bQ1t^}Xq#7B9cm)7lXZNln!z-poik9ZEVc(bB8ky;n^@b@!WtR=?{YBTwG5W769C67pX|o1Uo3qayB`GUevuAyPR4CF% z@V&F|QG8xzMc@In?A5tVw&f@m#nGKpU$3&(p!OTn@Xs``0CdkZy4pE*J;0lH1O-su2;&ae;S zO$c9(-q8mAiVo@4Ri|?zY>WC)U!QF@r48O{K3QiHtvtRF(?8z2{CnAL?(=lL7Z)|q z>xM<3AVy=!P)pSY)Vww3J<}XJ-`p%52L2lVHogWa4Q^aw6wSf=19p-}`~x$Ib=u8kZM`+-aBOCJd~vW1 zYU`e-^757*=hHIVrSahsvZr`BICUrOevPjkj%)iJ zK(v>6^BeA!L#_H>LVh%MQ|LNJv}=>F0W8ub>J3Ops#>Y@sR-SQJBXQw>ctXBJO-+m zZeh_+EZk);EX&T#P-1Bls}nHX2>Rj~+)-TPr$K19<$MHngH8=w#}T5l65Vyn)MW;$ z*)BT;X4Rz$Tk*MB^O%epX@fsFT2EMC>$ZN*>WpJ&PUra&Ufm?FB-gOqrWc*%=ZJeu z2Cv*{B<=IW@YpAR1QEQJBW5s2=Ecxw{s2{4D7|fDU1YXOdBc>&-+gzGb9f7r)` z_jMOOGMINTb$neX7#85W21Z(!*G`vtkPCfTbT0f_9MbDg^syP6;!iDabx~Qi!e}ll zGm*YSy-vH{npFSZkFmhOWF!W=kowpv|@8fAM z6h!hq^GHY1{4<`V-KDIzH~lMAwRV#HV9vJqt9fPd)>%h|s?PJI6Ru60>>y% z64Qtw{}r&DYL3sq86P&0A1&FB^(yteyg{7gme_t_O7ia)DE33hKL3!EuM*ip!n41wiBQ~<__l4UIU+10oL$ucX(60qjPp4}FCfGLNEO#}8@ z2L?O4r5q1nhL4?C9J{gv@v^2xPD*oV_*+AOv&RH9o33g(Z+__&MY6*JT&Y(7bph*7y! z2BJQ2zCT^jGvw5)C}_ntcISYo;Q`9!NIM)e!ejkh0?g6BTs|yFW2fAA z!7jB5-zP#+7iTCr>0K`QV5FEw74EnFGOpEs6{(MSPc5@*(cLJ__p2M;!4@{nE}3as zJ&7M6F~O%rKf&7nM4lJ&U6808af`?8!%s!j$`?mYGbfhrcn-`oL=FUUx>{aS*u37G zY@zE2R&^4oxk8hHu3iAeIkw-!sp-eDa+RqT296fOzSX}XZOh_z|F>EV3k7c`x&xSg z^Es#u4-|cns@xOW_L)#XrxwjS+S^kKD^PO2jgtGbG)S`%pfgtSS)g|~%+Had4Q3wl zk?i=T_lb2I?ZS*>CJXV?cIc7Au+(^O{6ABC@(;}P=KdVfKWo1JV-F0#iRu~>WuqfX zO|B^L#aGl-VxbeDf;0r4YoiyG=~PyW-;wN?m~Rg-nc<%hvHUCW<4IR@)Mu{$WMp|# zD}V-DPE+Gd{wbWLsO=)ETLTs_XL(8QADJF6*9W4KX}PzaOrUMfPdnA}${mth%H?iR zi$c?9e>>owuU8t{3(^j){-Y4a;1zCcm)XF%lxM`Sq#U8mPsV7Vz#Y+-eN+{!zKi$rq0FpKU)3oOBU8uE7#2o09Jx5qeHMblQo=qJ`6^IH;n1 zlD8?WAtQ7}_-hkoO-5<%OYCRvbn&;&dP40CZ!8uIMs@Tw?C5hkim_C~-Q1`8tPYp6 zmVj+#rL1Tm^JDe}c8gT@4dzfG9l{yHo?X>Fn$r7Ap8&IQ@B zp-N5GGvN=PfnA3ab@AFmDOs=dR1lc z_vH6`)e9u+h~AgTelKEC%|n4-SeEabD6ytdt|@?!GWWQVKaU{NRCLc5dv1nYeqW5p z^|I`_azId~^JhA|9^736wZCLM zd3Nq4DRdWXR$+DO3D|hwQU!jb-(3`$et1dww&pQz8?N;0c0gtVO{2Zmlk_Si^}g@@ zi5Z~Js+9h1eWv7RmYPlW>d_+UA*7vA^_vmE*3gFsSKTK<9Octv;mAo0z;m~I(q|Lq zn_fg?sUO);HlCc(yo6Pblol*KL_4Xw$-Fj^mj#Xv(Fy8HalO{YuYuszH{UsPl&s6C zAh0cO1J#v2);0LgVahrnntzT?VxF-8jCI<{seffEFE@rep;Nxsj9mR^JT9M+q=%DUO)jn2W87z>op`@8VRzK*Ty?xp!M$M-YQdhP>9UE zBm)hNo4&_IO=(UGXGR$`8+1>9aTI|_7>ZPAbNis7VfN3$`bqyZnf$)^lFX(kQrlvb za8|`yL*QWa^fH*V!$7QwaW^P)UG;O?{H^nkCDsUt{MX|R`-{u`k82XzR$Oj~|^Ue_y>ar^c z9P2yYNeUCtw^96GaY`B($?qmC^5P{uz;L-gt@CPRJA6*Iriuw@r^vreI|xVGfx4t& zrLWtbXNs_VOc$ds(otXXuEPbNAH0n@2#w@KeR4X|XZ&5~ZbclJZeI~ZPQfBo#x z%xMt2vnhy-j-Zsce;)N<<}`=~Genj*Mcn$))+S*A0q>qR5Kxw01w*v7^IE;sIao64 zprI<}k`R`U^SP0VU&j7zSJ!p%-}K7_h>CLNv(on25jI2!WmC)?mFM}VN{MKcuGIu_ z(}p-jL#uq?rDAEpxsjyTk zZ1rR9_IRAq`OANKGMAq|S6}h@8Uv0Uf3PB$*|I+QlU|s*Pe%N{n`&S!1msWhK^vdChcCTW<~x}%BbI8CxlU1q`4bX%ibim z(h?AM;qw|WQuObx>J$5w42`CnGv}6L*WJ;siKG;dBc+wv>OW?kGs&J9N+9KqDdA0Mz64$#p;|! z6Y|f7e2h2H`n*eu!$srG3PDUW+vak*ax4)jz;7NuM8b<>x1)K0?LuANr#*4kWz_=j zQdq)y4VCzLldFaGWIM&3Jl|l7Cid-wW>e8Bf2G#C8V)(*>gkuWGl`W(+vzV|mZzJ4qai{N3&Fjfg*w zADgWMwrUmsc=Gq{UTmk&s!m6!M%`~|eZU-;E}lsWgkoSCk#{htys(uT(v9n(NP&_OrC?u@+7qC)!``MLB)zQ}~H zCc77f@KsfCX_&6Q2tiS#f%v190?egj+4x5+;Wc}T?>*t@%#TnsQY1sF%g^1Y5Z6UN zqPU9z3niY_2`gLw^jVK05D#r+iVnR^zZJM9!VuZ#?_JVF(e8ylL;K#h`Jx-hXpJ!kg5XDEvFOK8jpLV;Is!n+BWtL{`N~ zPi=t^H?^VT^C8nXJ=l^oYc90K;qrPpqmL=WfT?cH7FxVA{>=94LnA@2Oh8rpYQk^H zj8wq8J=Tx#Gia+#G>@uO)z^h

          {hr12RfOwE|IQq(E-!Rt#i3{fJ%;`BCclVFwY7 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

          #s0 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≈>YEOO@KY+aUb{92`z_ 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 $1vz7SL`qIBQcs%oTv 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 z z940ePtRWBkqBUJcx=bX8cyU{65~Yxfy2RP_odOi^pSAGy7JqJZ7x1{2qrELm(6-&p zY!^Dv!LOAx0{-nk#Rz)vSa$?m=FL(w!HS8-`a^wweuDH_>|%y@9KDh7p*T+T3yF|N zLWS4mJoOwHE;?9eUAEF1K=)?hSz2k~$DaCVq=9Xi#k;0k4`;!6VAj zX|=-q3)ikfBNwBW6s2pWe+l}K)?&7B+5MMP9U*hAks^}`y;f6V>kjjB61ZJ3zCn%w zFN;e6(mbeu5ffV)-W7ysz9(JuKX zd~`!|^V7@Skv*MU78k`F)zj5hx7ie7XF9N07Mtjuhz=~f)rtj5VHRkF&qVf2g8e&F zOxq(8l@fgmo~TSZg+VBBImZRjVh`CLm^@X*VQ<0`0j)3;Bx3&se(z%kO$3jZULi+} zkUt1c(GrfG-+)?5B1H=r8k?7Ej;$j82{cki?G$RC{>2)lic}^1G%awCY%M}%Q8F#Z zqs8$f1g#U4R?D1Z^QYXJj+4jMSM0iTZs3Y+a? zE8!mQ7kAWjhR|nGuUfA^&3Nq=1X6Ga-|LF_`Ai{Erie3Ti|nh8;oy@_emKZtdy{ zLhWYTl{%BXp{P3IsolYdqsc68qapZ{f&p71ZWlU4p6vHn5@ARLT=I>??)O_bA3nq{ zIsOlF-Xv)B=`y8~XvCB0JmI$^)m705r&e4s%wL687sKEyGQ&jzIZ8+cN=HV4;$t~3 zN}An6aFNAJa&8m%A2@a_&yVO32q-FoX4CizBu+311tlng*@3Hsuv zgVJnv-ST$bABlrmC*$Ds{q#y%Z5g0oaA(d;)H{cuvdonX@kM^q7;LdY2W7EW0tlqrd;y+L%BRmUApro=>vW%cCY zM8J18973F#ogtNL{u`B@%aYFnNj^iXuE<3(^Sc3YLm2G8?dI&CpKn(n`theQn@AUR z{7Khpxj^HDEi0B|f*9aL7N>KHu zz+<<19*Frbe;Ex$enrKF|5r=dZ6adjqy5Tz%;g&HY_;8OK9V0_4RZ}jcZU-Nd2;&v ziy$k;px0#ePlNdH{o3*00J|Nd#1yoE%?@`o@z>SHKih?ouAr3znbPg`bK7&pCrI?uwg2T$MrB$oe zt~W*CIzL=ybo~1KsH2OoJb?w|zc6IJpG|5NR^V&z{#Q-ziNiQ$XP{RD6fu30C%K6y z2||foU0rT7e0+SHo10jSx__xBAQQ8*v+Lr(eV&VDGl+o;6>5xHO)``UlOSLjio}@% z9c4Cw&3BCzT~6S@cXF#AG>A*jAv#OP}Nu4h0la{-f+Lomd5(askzGBz25TEGzm?-gv)4 zcso%rD!FXBh?e{`W)oB$QKOl)D7@eK{pQTCUf0`#8hZaVi+Q^hO2DTQoXtiXMLnf~ zWE#iMH_kS@S&IK%ThNK~yxmUgT_Ll2$}IOoP5IY2Y-mMY5xL(qSl>yp701xC9_PR$ z+x>XIzq$VGZu}*sUJBb%g7r}Mf!2R&&CcfDvf4#+KC8i2Y`b3;I2BuhgGFVcr`ap1 zVe%s%oXU2yBaG4e0GI@FnH`-mH?{W*P!C;!WD3;!&pXV4im%ir^^h#5Ds4ZhWYbyg zcSZ2uKtKttynBs=#|~eO&*OGY9O4HCmS6PcNSiCG7XeL%Hyeq?grEsr6{+KitF$|7 z(5#&6;{)st!~mp^M_N<`RHzkI1=!xrFAmXa1GI=jMo`Njx3crGc?Hcx+^0#?$bJ%s zMMn|x;wFonP4luM^NQfjNUAHcmua**6#d&joX9X);<037Zv6`0+O0iaG7Q6!%VTmz$n-kupxc&!TGrn7P3a~{+j3o zCD+ST@vPmb0C-pH{UC$!G9F3nh7JG%HIeXt05(AxV6jT8Wey}|on9|>bR&+Sw%Z$y zA>wo}2G#oI<)!E2`3gwVKy}G(wM?8qT@<4z)(Ou54Uq}mTKuQ`d{2_gpTid^kc?S9WD|@}uGo|DGL~}X@RTE*e z4~_rw+P{A)hhGj1z2>3+-rxY0$==7u2P9LDQHIW=Sz6`3o+{nXff-Amzf7PJWDkKkMBJ<>AC|uZApH~go8=*tmchPYSb|+0&6_p(WFKtufQ7a0Z9$)S z2j|Wr2HHm$lPeYt>_g;HEO)QAAi8mComf)yICx7oM{EminP5%g$hOvD(N2Du$Z=#X`vhEM2#qtLKK{Xo8I2wz?hM%54J_a-uzGPN-*z z*Az%dF^pZ$hUd$*Uwacu|3X0CC6Ppfp>hRk!Y?uO)cY8|S7_<%9$s~;@E;YQ;FLkd z{)t9wwRa6M`v(f`1)pW|=%8gRX?5Qn&*t@ftZLrOUx;|3Y9CKy`E5B*{k^VOP%fRd z>>Tbq-b~}iWkp0u(iZ(gkKDyt^?Gx;R;?axkMltXU$A+tvtGV6UV$4>~;(w6H?C|(S(@TYT z%o{B8B44;^rgAOpypy=vs4#rVs+!!qw|7A;tmk~#0(?}xo-Ol-G_rjw74~$(xm+uT zTLJE=F_uc3IZ-h-$2r(6*K0sP4Xi8uYES1S-Cmbesjz#FcAlCBsKacN7sG^T*v(E& z$%X!hW}xuywqzQnwi0-Iz0=RJ1JV~{il!werQPa1F)6u&z92Y%DVeq%;C~hE9Et-K z@lHsOmTiW^@AJ+PGVK*(AF6*V5%PYB?9WVVBxPHiTjZqYaxyz;(T_r_LrG_<7vF># zH_hd84&4k)6b6f7-jYvMP&6NkfGv|W%NZ9&cRxL#D`)mBZn>(c7{jwc{5Rkp<4{j#4z zKa4Y_u-_d3<-PY5_N=WgZ%>fHA>nhx_V7{xGIOc@%BXT5ZV$%hvVoYf=oX+ZAY%L6 zk%MSpR4GR%SqGs(m_4&(JbA;$&Am1_RDXP;%MZ$E%rDU7N^~4mGR-vXh>|De`Oy^! zy3}-hqH|3LLYlN#4 zRT`_xEwRGaTLG@CD`ZI_8I}ryN$*nPz^`msp{Xo8!bs0YHy#ccp2@UaTyL}_eNZ$D z;vLyCK$|?pKEqPu#YIa2e$~>X=*r^Y&QYDYYCTv~rNk_ns0%w+mDoFs&WAuoX{jlg z;G2w`ovAXOhk7c{m&B9?7pZI*X2R?7iZ_;)hI-KoCBmq)LCvPk6&cZ2Z<|!_ork%&~=bOyl(FI39&<8O<&?BfxVP%|j6&A4+7*E8D zY_vJEaGZ!F!Uz|&4qJ>#XaH30W-E2}SkI>6G1>M+AxK7pFn0g$W!rG#S)&{XMi>_n zfW@1d)3${`0!gbYRI7wo3?x@f6qC2?U0qWav?p{EKq=}te6rx>n7>iLPLUFzC=L&h zdT>v+kDuS2^zQ*2N!FhuWHABaxg7{x|D2Q#k@95z2wS`9{ZOPtZ$|?-F#GeC9h6j2 zF`0KEhGjtVv0AUr!%!V0@zPK`7!zcT;aDP&v^b-78YkewvE9my zJq$*`E5y_vmbW-VP=u0I<6G#JJR&N&)CyW-ieJ3+>{_f)yXr^c2f4FrUzQ)GlHvp5 z!l0OC)+rrK@Kxo5W^!>e)kb-7rj`a@=(x-FP)MMzclbh*K@Ga~Q1`t#2@w(zXgB}(S~ z<0GaHsZw?C*Hm#PM=5TKN|~O#ibLsy^ujdJf*PX;;FJgj6MrFYslK&5P0w1R*mIa` zUim~9k-t{2dwk67AyBUqWalw0j&m*-@wof~2X0XN@Ep!emgO7O2$m?Gh5#4N{d;S~kzb>~Ri@*jFxv{rz5c zt(Hq^YfV8D$?{ps#h87$;+V{djnJp)&EW>dJXTqiu> zs7`Ixw|ppjn+AQCGY|2GA`Zl(u)OJ6CR{f~RASpvw(GSo^@%jP4uoTm2X4QM8$ z0<;@8g55i__|Re;68t_c4gJ%QiUV9A+p)8@2<6PYvn zD~HGyA^*5fkt~mEHQT&AKaa$!X(SBGDAR8Eqh&{s6!I8mPXyVL$qr|6jlmK;Gr^f^HSZ8_` zEdpVadxN?s`9v|f>Cy-wi>tSMmcZhbRMPKWD4v`|94xZ$PdthPxdxi0CnmT9I;ioc zDOjc2$V{{=6(|e*yX6o%^aIaBNr_t7IlTVZTi-hj0Dy zvi+*-<8e(i0<*}jK>-1}R6b7#)abbERwM2<#CGAzQhpBo2z&5Hj)&tK#WHCz{GaM} z@u=atH$O?trde9^pBED{;FJ4TSL@M_mG$My&$n*p~Mbfi;u{ z7Ds{`4d`mzP;;o81l5lqxaJ%u8(f1b76)IP@!x2FujHCVj5_~gaIksDsVWsF0Fp=Eov)#}>Xqp^&$N1*c%eS%mCtq{ ztzV&=W23tw`cloNVxi65@&!KWQiZMBRXN5?;$NG$5?e(sWHS_DBEBJwm$&j;y8OZi zJuO+a_B5FUqemHyJDY8`T})asbAAdinbqy2p_?hic)^Q>_ERq41MxgE5nPX>N~&08kgqxC zW`59ZOAh0GfbU-x|1Z>tBf?y6hp9GXNyTW_bAC22WZX(Uw1f4MC}29P`3#YQ1azuW zFgLzQi$^p=e;j|=^)|NMrKVny`waW(5i&u5Y!LXz#zIs!tOBWNM+GRk`S)2T^GRv4 zu1mjLt^}jXX+0wJJ`D-Yx}@4jrAf8AUg@?tfP&8RMXCqRXLzMnGh&UR2mQ^R1za+h zahNcshVjlF-5mjGhn1+Q#*wPT9M|+xn^2raHgsuXqwYj@Qk`{C(k~(k(<_O3j8Nw* ziF6E{F`7FB`)z;mliP$1R&eZ~dH7~u=#u-zTy z+>l_>8M${f0Yxqfd*^8b*0e`l-#rkP_Qn4uFx2rEf2AlIW!L&E@!-zxdjc__>+@pr ze3qi;Qw9`R=5qnVRcD>U0|Jde}%`wz%nZnXc_bJyr0CZxQAkb^PH z_#MF6*Gk&hk}{Fb*8k?wOR_J)u+y8VCAmznHjF5=-+R*^7NwHn?3Bk3%FqWa!9PIos-v#>M>Dob}Pv2>S|$d^VM1f-W{>6Gq} z4(VPxr5jXQy5Yb6{>%U~%rJ27eb4iJp7-2yZqfAJQT=2@#!$9A6jj}r=|2+5_I{A{ z2-$&GwQ;KzyAU|-(W>F|ZwM8>bMPkLJADowQn9N6jQCbbrFuh91gx%Iz)czJ%RRa_m^yB!@G!aV%Cb$>p}TbsTp zvpjx-(93=(X=i7rDDHMLk4XksAIypx(oc~vJ}L2%MfBZXG&F(Hdr^g5FpG29y4tm* z@$L6gv|)$0;C5!sUNL>43;~HW`L!ro%=>kCf^i2Rp3e)zyB?ddwLY(C!8-zfQwmfvBlaBpTu=2;jvkVzTTCx!b zmEEWNzY8awP%aJ`7*!V9wxNy=x>m@;TEyRuyn|FtojMWTU?Ph0u$SHF#G8}S{BJ9Q zyphyY&X2j}DV&cDCBM?ck=vA$B05K_GxXFOamp&41~&^&4g*RJb#$5AgfBK@D#~@p z*T8ygp(nuP;QrrUBCZPuR1vSQ>p9Xn>~HS7z5^yU>90zsjZ!WBH-k9UybrK*d_INL z92hHD`{>kEDFt;+mejSM>4UuQvi?&y1h)JIzQO*r6vWOX_C6e2H&wA{RaaI_T6S~y zq%i~g!Cm`KTvw3SP##3{`>b>wz9}i@pT=LAqysGTFgFQf{xP&!_^i?Kb>v|y+vfZ4 zGq|(n`&_qPut6dwC&!nhg=&*TYww9{k#Ok6`FZc)cH&ODuaA$CAd4zh6_P9zmAB6f zont`+ZNqiGT!)jEi8fU_RX#<$*`h`NV>A;6cPOWIZjJp2JL=x53UPEniINrt@-ci|kWjc$ zAT=0!FSD9odi*$v*{m#{(;F{3hi#)_!1dWM8 z=%j3Wz|mBuES^f|UR~PYbCf%dg;j8>D87{3n}Mlxw{b0A3<8=6x{*kpI3Z7d9>{yg z)ifMPW6}FF^61`94fId1cFS-nc>)0pCDA9p{(HDSZVl;hFV9Rfm{_RLQyWabpfBCR z8%$yAPI2mb`U%a!gGm3^z_0x_zmKL!HIw3j>pG+|;bRM|qQm!wRg$CeQhNpuIT!+h zPGiV<%VPYrxc|;^UXkQ}0(ei9c?}1CQ*W%rAmcrL<;Ggii~YBG!++HXXPoMHJB8Sf5<=mWT3Nxw2| z{7(+{2?rf$&B2!HJl_(dcT{dY$qH$@SHj(J61H;Z&LzSIH+KgF7?O{F zhnfF1+(dPs(b5^EB!t91El~r%RF_h0lxdoUs?d=L*+s)FpHKgr06mC}_LDi+xi&?R zKD_j{4Ou>v^|CV)+T%8Uk2YmgpddJ3EvW0Fovv}eZMEc>GNWDG*B|=z#u=9Nle283 z7&qt52wmbP^uI0oYfR64AKRz^+l_WmwV2+pZrFF8(CL}0%_YX6NmD~Uj9zaWXR=I1-_!eGq^ zk{z&2AgTYs9Q#=15na$;zs8Ws5Yn@6b8=Pxa@M{-Iw&R9w)@fhzT!KDHPaDfY%+q2+9HE2o6+sJU*IAt83zPZIjHjl8 z@VA?t*(PLz}Ac(MX{?^ljws@yz6Xg}c+ zei1IWbDnAItZ*k(s^^N6EFxlwrSUMmXRG~K#~*h@$AoHTJ)kF0GPAa3BHw-D8W9~V z=lrQz*h<-c>2WoZdWkdGcR^SdX^G3-j!J7VHUnQcPkBkv8j)6s%)W_#v6>~~Q@^M9 zA*=jbA*yxAO#w&lc{l#w(W=^fLvD5_NYE&VaJv(ebD5#g zV044y#9`gD?igCf7Un4$xMTiX=rzi)U9uoaK?6)Xn1j=KZS`l`77AxQ5)s<0$qEws zcSctEDV7tpAl`SSV4v3;r*&vpf?ezJSJ@o1U;5L)G|?M|F)}G1SRhoO;c2F ziyJIRG*lnq)NMI_wMUa{zZKx^daUaK8~1y8ib*;*w4~!`wz^uorA-yup$7RYS1|QE8|Z>2hOmR6dqBy06^ik%2wx+i=OeZ)2wf~|eQN{(Ve{;b zB;)@0Z-NMmaK`nC9b&<0bw)2J*t}rsi=V?pVK>id*zl*(ZUMo}h84Qp^%Hp5w+MsF za)wO;)p8!6A5Ou$3iMw9^<3fjuftknqY|YfG~3CN$WHYL61G*TfVLU+Hj|DfkQ9r4 z$jk%|%fhW-3NQPPE zc~=9OLZ#ZZoph--?EEv=d%wFZjzm*lfYGIZ&e7+N{Ma72U8>Frp`wn}(&e=ueFX~q zonXSSrWrcgYBR3owXMweYmzdiE^tYW>*R=S8-=}5LFagRT~|^0@1LWC6pylIPwx|j zzwm{9)|=ETGsDWhUNO`6p%t0ysO9-8N?-cw&h5Oe!@35>e7OlxjRq3hZjN920Ek^s zq44J>o>G3>$D&!HDbDyHg}DV@A(T6HO1UYq@umvOQm2{2H`VVhDvI|m>sQs8yMzPg zJg!5^H6$f8FJ~j>>t$kn%g@ubGbnZT=ge31LYM8!bv4BJQ<8SoK2F|Mi`_i%_fxZ0$yX}&@w&+P(pw`ucv(Y~AvPq^baX2Fo|E#|mlNK~ zfeyQZSWdf{K(S2eZyDEvgJ57j!mV#->PU;YMwtstt*i9X71+Nd@h8tzPJZrZZXb{{F!jda>)+JNzL7Z%PQ8&{*}7lc>g=-YcDE{Ne8@MZO?hrX zN}PIwoEU%~LLo!w0P7#%W#)+F2sD7TjQoDk+tF_$6VWppz(=-Cp2!lCizK^!zngT?zSq)`h>A&|0t3Knx}G_L*NK%d){x53fY$HufLTfF z;8}rEnul!gsg=6AdYNX?y7zC|iNF{#T2nU1-JMN9O<4c#So+1RnuHv;l$>z^3OWu_ zuQoj=1jgLXMYP!B++K#@mGpJEN;*IFX=STmv|1~}*dGZWQs7ttOFP2}*<7)Z%Oo%<7j&P3!AfDO{dl6Vh(* zes*+JV!J_xy<`g_tlypQF=vlw3Sw$-YL}`PDiXgDfxHgwk4n@(|0jR?wHB;aBq|S( z{Z{AmyKe9g!yk%`Rn>8MCPAole@x!*9+uK+X#M>dt5H>Pzzw`_(0*uI40zEoqx~s{ z0X*H%;jSp{tdi!*iJgBf*rukf{?l^12Em>MZVYc_y=irQ1`g;evCliblguOo`Kw;rH3fKm73X0EvoBlM z;_>5t0msTpxlqU7*GO_vegb55?mV*jYhQNOp&GLCnT1!PVTkCyMS8`(VDBHD9Q||5JSc$`F zERDf4X`QiI=O3;%O%8Ql)4DG1_kkjPVhq@2dW}UEI^E^8sn$5vG4m%O95YRh}r~jE!Eqo(I6T6F);}nXosVv$=O$OE~Y`lr4we(fC5C{d>Es0 zsK$xqNQ&w-3$@}3xi&aBBCGRjKho+643e*I8s1?3TSHs@cU)Qv#kREM zh$ID-VypFVJfqWk`^+@bJH1MMVl^32p5Vk%*^wmn(G+gZ!|NTptK${Q66^h$B1B;( z*^H&V@p3_A_e6IK=<-;0p{O^GpyoCU(JCWNAtLv`utQu0G&s<>k7O_Y+21vTaZ#8YodSz9k4rOZx>{0bD*IAFIn)y@L^Mb(l@ETGG3{R;T;hg*#C_7pu z5L(CLnD_r%n^@u)*aTpx|N1skSBlb}m1mGt*y4jB+PbH zGl=Y)X~V8&pnl_mU|(*nVwG=x=g@Q{(@sBco`m<5kmpo1%_tRT|19oa?+?E%FapB|Ubwmfu8u_^)Z*#8_lo2XqJ9tMQzfM-*Pm+TaARWK+bdM^8%S85OH_*9 z7MR+)6=rH)6D3S2Q9t`2A|H)cx&iy>6-{i441o}p5do-w$D4wBH7X6FU(Z1tXd8Au z!oyLQ5b4Y!-b(#|qrHu^+20#DQ~T+-?Cp7h+!#1G{wD++bTD5*$#pl%+ZC87E9)km zP!|`5XVW+#4Cs-L?R7->$l;>s8VLo9%M6XPWE+Fr7{ACLx>sy=%_CE~h|E{5R8q** zPU;z5VKA zZ?`7@S_LtA&Ug^m7rLIiGW9%Z1T|uD*v=G|X_a)kAL^oju>X*=sRx$)4N@0%^u3zb zLkF^V%oHhq-hVjl8anGEX2R#~xYXS04fQs_-T|P;ipbt8C$aT#?wD-qp1sqnHs;5f z*aSF*`(T1d*`N7vzP)!atoN%h?tR0$u=@v*ZunA(44gtP6V3btqy-QznTW8to?y8s z4xREOW`$VbBK<52kGEfsA*-bm!zWyj{Atrv6ufl z9K~u)Z-1b`8^uqvSOv^4DN&XT0YR@)@S%KWZ?n@-;&FC@9fod4rOQI1-2h8Kw7=`N z0e^AT5c$?O4aHC;(lD|afyHTGa#)1xeo!5yGuTO;{vl9EhWKYmW)B(6}Xc&G6wC#B);YNf*&Lu{H$OEZav3Im&09M4VV5E|<47z^!@a*3Tp01TQr9A~VYfJj z(l-1_l+{TrP^-uymFkcq=TYkcI>T#hQr4;AYqto=J+*0zHri|=e$)83*|1(%gF?XL z*-*Y*)CVy2veIX+3nnlO&nmgLVCD(<^yTM%_{_$Qo1FFl+oVQ#ggi88ph!_eQ9xBw zlB7eMM1uZ#Or6JLFPNV6hSA` z*8bN$1IfxQR{hH5hC(^12B4-Ebj&&;h8~=g59wdK^_lgaavL>O z9*MMCk5aHDM__gN-JOF>R>y*k<%~dmdNh22hS#}CeApq&J>KV|_y%=W2}P{L~^cM9UO)JTQz$FTOg*fOj;NC-X*1^NQbkq{08m2O5hLd)2MtLT4m(Ys|vK zV_w7eN?Q{qrDasE%?^`#V%bR|w*ke8IjuBt+wg%l>E^(s>@7p{RYuK0eVXms&XLXk z&6mr{&PuxAQ}G2VBWjfuH;_?M^`b|sfgfRO0tSxj?X9~SO{=u;?bE1O_NXwGKh4lW z=l66hG>UNNTRHnb+AV%JAB?7EVLK#(Ac%gN_#~R8P>7 zlTaM^5UMfVoR;SXmYhbs$|B2uE5Md5-;rVMJ@zq)|3K%LhQ+MaQ3WF1@1cihxnnte zBh`zfiDMqhv3V0{Nx@7~oy4R3hs#log$Bs{;Vj-7N*CdZAkM{?PDFG*nCIlt@K967 zgWxC{KCqmnJX{?L`agOx@jnR6IFGjIF6+)R+e*UvjTB-csXTlQN%S0|`>A9pN!4IvaQ!0z0)rl7Rno~){03b#L#z^UcebcbL&soJ;P$bc*c+FV z*3Z8Q7)AZxw`z5ZI;I&jnU3iC$#sfztaq)6E-9j(PG{JYeRzJnYyaYH$A)^s0;wd& z^IrQD1kQW6S3O^}u@_R^;qQg}LN5HIw)%7Lw}IbLRT^QBvIZx=oGA zTiGQ1tl7d**s#cGo$v@;N*)^CFQcX(0ex_N7IiYnz@Zhk^&@;^lHYtLx9jEk;cUYF zNzg5<`PY5NC<~7Ze6|;S2pDO(V6)~Z+AnVZO*F=?+RYu_zo#UnEP!?G*N_#JQa`Z|G`c(P;_jBx@ziQYB-AFK0-sxjF522fysI$!oyp&X`azFjVNr`_KI#w*7=C zPf_-xQY8Niz3*>iiXoS4mm885SMe1ncXP|lx}EV3iIK}Gi*BB0Jds==V2;IylmRV* z)#o(-hBX8Uo2cW)f5>HZ&HrWX>+}Huk!F^@^+tI3Z;z76i3yRe>~zmRg@7e4a7wGv zuaHj4B$i3sEV2*}x36EnrW(7#e}4<0qot*#r+<06*)a25bN6CKgOJI_e^wvXsNemh zTv{Fx5kbzWYy5fqog3`Lk2pH&-iDIacu?~|vq`1Uh<9noN;3(?Z;@&a{@LIVt>D8_>@4jJ!(vo=M*OO6#SDsG+hDSasw2V}TIf%dXzIQDt9X}yW9#Ln!D+IfG~Ns=9vuSLbtf;n z6g?n@+5Q2Ikn%Xh@4eKh(6O}mzwyP9yN&)i$m7h*j9{t0sK!#K@9XPxBd%cx!eSZ@ z#ZN9bF7u&c*;wU7+&&63Y&`-zyvxth(=aURnOUeZN0J~fQeL6T!VO9fmLbacpJ#Q8 zhH$O`^pU+^zk=A{x=NDP_V)I&vLO`}oK()tz!0|mUcHfIKmT3aH7>;M696La-oK~$ zV`)W@sy={SeV8?YgN6z8^VDErO7O&7F0R6U{{}rL85MMjT~QbpJbo090WM|+%j|vQ zf@6aJ^Rmf%f+aDb$CJqtAqIr_;@>q5`rIB_#ucv$P0Lp)&U>|U9@?Ix^LRdhlCyp_ zmMFuX5evt7NNd-Y3rPJN!b_2#bP+P4t@K;gwipJ{J+Hcq=RU9!c$KHjg!;MnTYurq zXQ_w-4l`GOoJJ+tYdskG_kIgPhSZiVYHC##ce*}67EIZBo~H?A z+AjobskaT1*SR15JYH!&U2P>zNPJfv!UBH}4g@UGf@7_XhsijWycGB1s+|2v^Jill zil&nH%y9Ij)bB)b7&mJ^1N;s2PjPL z8Wfk}tRkVfA8FnzzAB&GtQ;h5j4mLzbb$j14m{u1irjhYYdgdA9P2{seu{5M1S)d-EQe7U5%P*9S zjErbhG@O8zslxQjmoLbHRu;tCip8(0euoey>xybD^9u1o!Vr42yBq%mQ_SFUmh&Gj z1h`_w1F-N?c7p-$Ld(%y0+Ob#`<%4>A`3?i?#5vms~XGfLZ^j=fr*GZjrd=&zDOc{ z`c;v>;CSdD%oE@(R4*5ou4}Nd_H(%1_4P$Jix!koSMRKhC(qnNZ3rw^trQ17Gv26w~LuSx4M z;(v%x9rLCu)L7)ScwC=uaZ)J=K;3xENG-=OX@X=Q3xoPA~XlqjM+=jcXwD;E?Pg3l@70a5SQZYOHT#txlN!`G} z031ukNSd^3KQcErx4XNWo6C^s`pZSsTYv!f%AJ_!^d zYahV7;W;ykF)QjK@2!|%e+xKTo;0La;xvD33kr#glKAgVDxL#b%KrZQG&pbfN_C*k zTBtHgP0tw~rhEv5_RpollyH~l$094zuu3Q|f`89(?AW7bJ|E!Y>VBHFGfDuBcK zo)LSU;I<`4L)_XGoes-avU_Y_q5)>I;`LvblgZXyY;+8LO~sI}hPL+N+ES;iz(Z+8 zZ1u@D47Qq;)wc7_Vj51WGgT<;dmlUhldeWYd}_mY#0796#JJdBsCd;V9l(^GL*kam z@c8RsXXj$@wG-k(lBUcEDTr8m5_bT{31Y_4ty?jUMc-!Ym-kHNNqy^ zQcV;rsL8C=7ohzmHoE}7bbq6PnU?xou81pfw~j<7;S;pfWm(ylb@v#$|ERrJ&@*F6 z)H=7J!9;mYVHP1PbgII#rYiKMT)n!Gi6RQ<&7a5Qx2~N$ePO`HI&0l=iABz@1wJD9 z$_9VS!VsIKi(ScVqh%qftlJ?kE4#R~gp7(D>^9G7a;p@|gix3f7@8cy56i%xGy?(x z_<6z6Et)BXDIR~eq8}}(_XlOf%bpnXmp>+bO5lAgRxDlJL0S!gNGSQVnbQLbKT zS2Zya6B0jY02%1I(}-7b#XR`@kky)fHlJ>Z#=c5$4afPNoO1Z8W+0n-dWz{xaZklr zpRC=X-XuW&&i>?Nqrv@0PBo-&x_8!Ry#+s1^Wxm~#RT*Bd2d~x-8k3fmD}Iqv`Ukb z>P}X`BB6bYSNHRlh903B+0x+h$jGw1s>#~4qm7x~>nx;_lLx<_r4>f?6_}Oa5GJ19 z1eXIVa8^+8mn}ew%0t*-=_GLPu2&L5wElxNSr`O*+<1ASzeI1_^F8g*labl+tK~!= z$SW$k+DkQ)?s`1c3a|6sOV-1~!=pHb=OOD=>gQEd_{ukq5Tfg#aQj`13(|}ETm~3O zx(@DrdwI0MWAv{9AzYNVbr<&M&!?^VhmB!mn?cW1E5DGl^??vy&H#5PuKBb7f=WE@ z#l(|MV4_yy*mQnkszleM-#MCqIOu_*ALEVFDx)es>1Q(lRkl-F@+o^;#!?}RR&)XW z#XhN)j@*&WM)icjwbmdxBV^RGWkC-V3ts`|Pd!X5+g9YVJ*ZMtEe6dn0+v zndt#yLw*ZQ#ohHSqOx9e+#p?<4EpeiI*EuvTy zl>o(@DYye(sBdTE>F27X;?`j7!yln28d?&!U?hG6c3}qziNAq*qVPs$+3bGrY@GdX zmSS`Fj2RtBo+$mMrz-#3_8zHDmo4W2Jdx1iKc80)WHoC``Zyob@)9(ZR~!x(sD}nZ zZrpBm$y4k%tP#amekXfu(f7WUi5qB!pMK`%B&@OFoIgF#C!=KqoLV4vU~6tsF;O1v zn=jk)ayUKIYWjYlI@t`B?~bk*+_+nf&q!Z9s7Fb>JYIy;`(v5(JrpuCo7@C^ zdM4}9&?rxsnrLrpyKh`D-Pr*+lE`)Q@-|#NoOZn&)^z2+N{(zA=HkP?8s+U`AnSpz zIR3zAXM%=uSe;>&F>uZCh*mV=!@Py(MR+0kw_drUjk>6KEeOPadN&%5D)0fMKt6^vzi3Vah2Va&umt_{9B z(UCJ-IpQRu?e=>LN~-iESLLTT7`rzkv!s!Tl#4ESSI{9nGh6(af`7@sZ1yJet@Tb{ zi5qRc3kLSq6^R-jfAXVJN%|MxvJ7zse!}c)z#GuQo>STy^aaxq;e2^gTFPH zG$`@pqHXaxJ{kleX2ue37 z8Gt9aXn0vAWp{|dn(9|}wzoBPdi*)6BwQ?3s>OWnF)}h~(z6=cwx3MW!g+%jeYOHm1RLspw2cZJAn566Wm%KCDd|158#(F1BxDqhrS&tSi z*5=niuP3{w95HQ7vfrV~^sQvCa*eA%Xe36eOf1foI4@%sO$7w4=Z4`HJ^D zorQk0BQ29&sH&Ci)xms3;_BBNY3JTB#kH9kl2$oqtHsGlHFD0)e=o0o+~W=KKJB>4 zwR6VgIBnkWe~2fI|LEay-L8|6mWJgtm9|STLa-Vc(S{DiSPraXWq_R zCT{K+7{u6^X5@#(0M730+}veeI2{uR3X+kLxtsU>GsPGZ6zhMp=IPYBN3nac;?%_= zi*3^Cx~H_QWn}dFK+_u*N{Iu{JID=nYCjvqfBimJ2^^aHi~S&fS+B}aj%jXYro6)F zZz8c$IMwr6TtIg{6pGD}uC3_hb-Q2|plTs0u3^P5ikR(@r1bQ0IA5F9B%a6`L-MeC z^c$$7F{g%@Tw9+1_7SG1rvu~~SOE9zKrg0G*knLrMiOaPMY6njN44j2+S`9bcV(O8WK=a_z=9D8V0R)@LRA%}=o7IL&OsT$Z^$RR}(& z_Zh^VV^!Ihu4-8SL4?`*dSx;$@m+Yj&5P*qDVvZMN3_JSs6Y3PqZo5G1>N}o$gK6Y za_^Ev*0l#ZBgH{f2M);@1q*7EPRq?D4-IQC@fDlp0n6fnY%)9F0CK5RgZfY@4jsSL5NA~)7zYx)y z5u+C0Xrf~oE4tgl+v1RZelY29IVmS=F?*P=|iA&Pf2S!*xQyaeMHoFHqa#_G~L`&?}3SY zetyI0lSNWa4*$a1n=)#I;lC|c`b<%q&XWPV4VOp1^NooknD7@odA(|TT3B@T+LTTP zw?fiP?X17j=j4cfeSg#5!FFzT0kZ^Yqk}1DmIsp(G@d0aqQ0+hV3n$G+3it4tzUzvGdB*ku#CqvB7 zc8W6{ne0aiLpzrT2GAi>#=8(nNhBUp5|Uig9_t9A)Zxd^lVagn1+KX=#MpreyJ-7N zE4MCpd#R|vgo@HqHsgGse;c_&nC6XibkK|N0PW`^oHeb#GBD}9kd%l354SsUeZTt% zC8GZenM4RmO-N{&j~7k}Ka%eRkoW1~ahBw|&po2}z>$_=0!P`Xk1~=YEWT&}IlPfSb_y zJheF;E~Jx~&PNY{+jRMZ)RZkdJ=92KUX+)WW5I{__k~u@R+s@_P zL&FK*5CJ=DnwU7uvW`~AHa)^{zA#(XNxAwMN?$`Vs^?GkPyU>|UTptN$kVZU6po4c z_h7aou^WD!3;aL^~bU*6j*;AbtyDc$unt)2Fw&`6FgbOFByNmpj=!$Qc>=C zv>tqIkd+xSGQrLx@ZO}Rpej3?E^aJo;ipsGnuTMhI3o{ApXJ7;x+=HBYtDklub{UyGlJ6XGyngc0QaiBZc~7*Wk%tCmtEG{`n=bJwZsDJ-kNOxp0zOrBsuU)Rgi>6CRY zoh(*)?-vF-eY^%LBVBgt;HoJ_J+Fc;!-6aemdkmD1=e~B3NGb>fXV&y{uU5cYMR(cN#?JU5WvCx}I>Y+}aMl}4CI24Uhyu!5isl0QF8=H@cw zvjqnSZ|$C*#<^`FcS+@9v3=hSkYVym59hHt=?d`&CO9Hj z!n26&W+U!xY-$2v`S8c8&+ler49aoss?=})?xSu1-|Tw#`OYwrWmCqR+yC0SF37U7 zQuyLbEBNkQe147DP`!>5km%^M*CxdVdAmTgcpAt&))5mEdf7|zoW%J;MlP%XKE5Ct z6-DIu+AAd&k`5OsDJfG^y8DB*AD*Zfce1TmkQu1*?UFFiFH6>*LCMC(h7Da<1ndH{ zPem+l-1TYe3jWxr$DL7&An;mtA+o0 zhAi&2h-p=|!a)WNq!<7!DJr7Q$Y4xfTXFDdGu$%w(+pWCuWAIhHN1P(~V8~<$Xa9%1TvW!o7eRX;DG{|pBwZ3Y785nRX8N2O!3x3pv?i`4YQ5xYGNc*)!ZG;HbUnV`pi9nAZFH>)PW zSYf65YsQ7-J6>Q>g5UL$O$0R#0gLp0?r?;bvGFRRYE?f16T~z-z+iALhZS~?OSsCr z{3dJ&lOfVRDxoOSJ!+~H?~VZj?01eY#Jk0R8x1QXE>UpR8I@5AE2o#%a}`;~)X-3g zsh^gFQBxs=0c7nL5rOoTiLT9#WEg{MKr66Q-r&=(e|yiY#93J}CKI*+bUcpFhh{G$ zh>xuhqUz>m!8u`P5-!4i))@RNa2jy|!JNc7*hUd?0rrmok2{!QY=4{*i2l+*{sy|i zk9Ir1JcOj)bOGGwqenl6X0!Nu6rQP#6)dndh^KlsbFtg20qgI-jVTKXW0$gd9;Yh8`WZC! zk3*Yc*^>5!qSi41!Lg&2cODdb93vL%UnIN1QV@-Ra{!<&GZ3Jm{UnP$kw9J#J!LV@?r1^ zllk`$xV9e%2m-Mic%VZds*{B_dk!m|G8^52PCjlfSy`|Nn&`;+xu1E@s?jl7G{@l& zi|Z=>w#1Y2 z7_Z!iCdV@JRVH@HDV#PMjf{+ZE2_rNGMFu z0rkfDciz$itGMt)+Jv{rC~18n6D1D&&5qivJ(02mxZvWBXcM=2V z77#@Ite+H-LEf4eN75r?2n$6skkdbKCo3yU(hmVI-71!rmVB?K3fi->(J*a;F#kPD z0}?~94#H__>+3HNWxk9IKmo}~|NVPD%8P2H4J^L}VMm78ATref<||TOe#e=Pbme|{ zocMhN4@Icv?LRxfb`5<|&v@(KX}!?f+soVaNOC88g_5gyRlW^yj%x|(qVwKOK*Y(* zYeWb;svC9oHq1hMudAm=st3S~56{3TFBnW>LVLe0#3ASPcT>uXS?jA3B+wY_sa^IVyRJ*h1-C|A+R!VoeOLeu#Ja{ zDEVg>00|? ze+ODpAFr;$!6C$?KKS#A{_mBelO1@Rdu~=RjS`4Uu<+;gE5_n()Ca>113UO_T*~VD zPp*WB{Rl%B;mBRIAajCH&ITN$#+;Z z2W4Bk7hYM(h4ymt<8)XFfE7vjQficB$CxGSI-1J+TZ<8nk;RuI_0VJa@2CW#fG=M< z5JdJ0djM`dnu3mriOYK$VAMnbeZC3C>wsFVjzBT#X0uc z^LvFk?O1V%>|=8r7|&YVKkM#cZA|2bEy#FyYO_!!`i)t~*yH1Mw?W!RmdrQwZGNmk zjVaHdN4@w9KeA^(&NU^lUI)rJMK9Qugyj;%sC0S9Fp{6obh#KC8~elKSQs}8FlxL{ z%;@GZlarX6n;RJ!d2sL_Le=SkP+~g7_cbnf^M}s_;^CxsYg`}jUflH@-*t|!FOdmBhwH*3VK74@dhsX8h zb8&U2-Ly=e)a-mr1hM5{5>&tYStVo``%K`Z>?)sSCzI7em8kX_3mO`q_~n$0)nQg@DrLGdib|d`CRV(1Jmmv^$jTJvWv+rHLn~)ZJ3l+S zt!Y+exkbqYd|8{H5DU_JSp5UbAbyT`1)=5DXoYA%DV8apDgNeFSKRoN{xEygCCPpS zF$tUGD7nlmE#3X=0r*d^tHrr#P`|s>Q@gCizG8@!|U9<82y!%m5Zp@h80!lMW?edAW>#e)g|hZ!9PX&XL8g3%+M&HHGIfQem{TwV|MvNzp|n`sMH9 zx@UXVRv-vQpG1Z@nkBb4Uf0BAjl>36Ht<@Qm;L)nD_5~iXrcx5Er=tb@u9qG|Fqfc z4f6yq_d;f7HWv@CSpgiv<>TEF7ABWwV9#)gMVFE!Px_ivl$W;8D@F1Esz)Rd6`DcZV+)UR59fC@{B23Y{hi;j&;AAZix zhY1#64rgf{R3^SVe5+hH1&27EwE48n=9}l?n~eoIQeU2J1`|52wULwM78IaH^i9!9 zOfgPIB_g=x@88Q=HD52UK!OO{?D-14g4Z@Jjg<`StBgN&zrJ2D{)}(H2=@AKzFeoJ zp{Xe>v8(GvnYY7jzbI8&C!0T+A$fUmF`hexLE+J?$)36g9vO*~JAx>yh<0lm8<{K7 z=i8kYZ4{YOa#dB;z>>T?#)8G07~!qP}GtLz#%hId7GEV%^Ta8kr)lT zI{^Q#^AXO6>*JNK0EzFfQW5D)QQ62Svs*)7pDKx={Qr15%c!=RFWlo=w77fl7I)Vm z!J&9@cZcHcUJ3*)uEo8$ySqzqhZeu#{oi|&FIhS3%$b#$z4!B*>^+kL#pTMH@KF}N zF!C5);O(y3KlEcOOo?rC)t4HWelZ4R*da!60t$QNoLE}{Q7RdsD?M_kOc=i*5jvsp^sm3I!hze?mfpOqQgS6d^Hj@+7*W zc!(t~g|>@}OIKTHD7?1N)63t@zqhwYybMFyvOQu4{knT>zpv}~xpXkaSij{L@D6WE z@{J(7k_g2l+2+vjY8x8*pDxv8WDt29%ZiBwHZ?)as|^{%nC_W{&xoIqQBWL$3BJ9$ z>Q;ucqEz`sGxt%Qa+w!6iAbrI+y{ffckshD9p}q+J7zg)Mc_h8h^4f!gyYQE+}4+I zqcDNJp7^?^kK|4PI|YU5ehx~-B<*Tmb3-BhLMGG_4|A3({aC$jC)!|~_z!V0yl3m9 zippgt$JT8vybc>GyO)6*c_CeN3^z685C5qtd%m5Sre-gBXgVF<&|fh#h3aL!Mt0$<4FKB^nv&fvOfZ z$P89tYefiK(W&^7QT>TwjIP+)2~<QjiyRHPgYyR}BNW-^GDP$(#KW+i58@q< z$K`u)XnG3^3%{SQM=yaqe*@Vu=OOO>wF?#l^GjWAt?JpIz}T-S%?1#E3YkNHF+`pN z>f=cGU`P?!dmPqegdw_0rwf=K=i^NXT1HT~&GDpTpYeo!(S8=LZZz^z4&FJ7K# z^blDFS~rlF@}FJPdRRDWfRqNczOvvqV_s;ClDDBD+3o!oa(NF#lhW=(KcTnHm7L-z zj{ZNk2OS;^jmJvyACMkFm|_QmKP9baYZ+rY9>Mb{5(yXZx-2a6wK%1@n?^Ep{Ox&OQU@QEh_yFoOxs zt1VFxtC@m^u0J&RfBr3%Seu(VKMWmOdSDOr?Ogy{|TpJ@|s?=iNr#1mVxQUMmacuuO0s1FE;h#?5fNMVm#akaJVmT>iW z^?V8FB`9bJv2dN!fS*j#qk|_B{HBLQhggSkU@(d6#Tt{~U-S{v!__?dp`+voxU|Fj zBLn%q0FRGz$r%|a1cBDd{JX*45~8(tWL^Ooq6i5elZ*~)nL%=LatRituGuCF06IF5 zqqw*j<-*)tm&h_ggn=1lf7IXdvN9AP^{OoX6}41QGP&PBN=E|R&|2z0uEVUoqzQpf z%0*L^rc#*N&ym03TQTNQ4|){UKfNX&n>D8v4k@^}a2yFG041Ykw+QnNDhd7QCB?17 z7NE*V(@cwgkW;$8P+^IGRu`R6S*1`*3H`CJO@AYcZZ_ybsYIBK1;-T@(v^1`nah4f zdD?OdyV)OS9mK1j=6xkE7rvBqEY? zOd`P-cXZxB9x2?SVe2<>aJbmn31aKDQoK?I(?shJ4*;P7@GY`5eATW`jSsY20pZFb zK}gr((Pa!||I6uwYguxv?dTw-m#MgdI*%h2kakRBc8`sYhDE@(5scm~m@(FR_0}p3 z77s{<==+G4va+ZjJ6MjYm}2T?a{RqjiaAO&YCSTZkmlaM{IAhh0x-?VU(poPGc-P5 zY+h|GEkv-O^B$7+h0d2RKeDqyPDz;iJF5T<06l)sa6|->=*i9>5Vo2i93aw6D#!k5Oq62yWpulnMLzm|A>LIXBY4PrMJQb zMpzK|APy=LSF)qif)`vY-iE@^h#MUm_@=wEL%67uvFgIXp|A&zZlro17i$sFyHtro zghjvVVT3z`PK#6HLiE&4^_&w5J*BH6&|)`zy2c`kY3xX|%*@OR3u#|E^yM_O@ITO| zqiW=n$WdikU7T9mLf+Qk?-36cNQx~&(;9?FKL;?3!Hw$Cad5M(wwu(^2bsc#b9az{r>YG-3}(r}_MKfmbd z(-IdS3l>fprz1V{62C)_TjFc8v9i+9)jlF7(D_kaUB#?2q#dl2baeFV#}e1^@rmN1 z-LG14`cI!0Yif*AEapq`R=D_JuP+0(Tc!%&A50>#>!s-EA9(qMg@r$X8k?GKoURY2 zf5HKxqoX0>rrWoZ8ibt>2MT&us}H=9wh3p+zP`Su9ZcQ8+Ktp58Wh@hdH;ViS&kPW8=|{UFT<} zafygBl5m)?$65EjGyQNnM}6b8Y0;{21>-0wqG4bd!7=WR@9g8?RH$?V)Aa%a$yLGI z>1LYXJ|M9$NY27En1DVmW@x{*j*yWf=8Q~+TH+-a_Gwi|Cu)@Oo|m`0yqcAD%z#A4 z?hM?lELkeUGbe8uJ+HL0+TK>Y`>_}n=3J+Cc7F!qSKEV^%VXUB|8OQn92UYNe&MJF-d9$V2h|N zLZJY|_rNVv0|Ns`$6weWM!Ot66p%P3GS@i@*wx(~VrylkrO>@WrkN1RURfD}qvi8X z+M;2v2uXfk22w#xX0Hb?(X*_uupuwcFF|Nd^(rSETfXS&=?MV=@t;KWa#gUA_oMfp zI6alAPwIOd=!ONSU80^(tUKnzq^<;5SZvkhMMZS2FD_;=LPBVoF0fB)9h z)a}!S+!+379IdlOmjr2U1e{7e}6v#0%d3W$VWRD&L&+S^T(jKsAbN#3kqG| zpm)1C^>6z=`LYSSy19u7|2m(me815*+aFVA{nI)uzQHN~E(wq3s4%0H zA>J-8X}4!U(wK|I4)JMS0#+!*o%*91C)d1O)Xmnk*IQu207Btc4OT5KG{vx!1@cQL zEJd($Yr3h%RD z5cyG>`>Tk@(83X(1bn;|xW7-hK@W}ehtM&G`>c%>>U6H$6V|L;TcU5+Cc``pCj zr0m!j$F`u23k?3On>3&HFwOeeguN^)qhLrPOXH%mPTthaJTlT{p+}juwWf_VnOxNO zab^PLkOA4_|%hKH_4!eK}{=5oPG1pDCxt}x`4JUYFPa~D@WHJ zvz(mJbTLCi9+6k-I~M*{enbg$*+T3*AyjA9EgDL>OZ@c3;E~K9KXQ4Izrd8u4?Y$(($lIQWFlzrIgo;Bgo*jV4*UVC`zr0-$ociAFKYC@t+$GfX=O}QxaF9rJ) zIDDC57lVVFhKl;@D=R^Uc`Vy0gn|F~MYdi&u6B;d_y zr6I*W=i_odK^T5+VS%yZ8g+Y*%7G;PRrC6Naas6oPR+t72F9omJcTrEQ&3by#_uZI z5UeWqw_ckT0$&d^@}B}-x01JLhKMqvX@nfIhr_365B&4=5`Wgd-dM;CAbfkGRBlew zb4EtkmQxC})b;yPV*5`$)wSP|GQ4>FE<=XIY%wGi9a1%o$0x4ITr9FIAOim5R=x;L|Kl{bE>i zTYH;X9!|Z^4bCU!T3Jrqtc0Hay4K=i8!Rvh3E}E~Z5p-adSc>s*ui%e0gvS++nD%U ze5J`gS{j$S25yySS!BYm zUsrq0LgmS8DCP`U)upV&%p{nU1t{++-0Upvxjxqo$wedPycSiR@1AuJnIl4RIMdOw z&5x;fRyUpO0a6m#U`n(@!r*bKhgv8g>=qKAOfZ6-Ps59BO3k~xybPQ`p*+z~ zb!2B@K|7Q|e}clzW&m9`DJ9j=cLQZ)2H)3?3ZjySa5tNoAoup1?s-vqiUTrqu#=Oh zsHpSv^JivNPfp^nxD_UccwOl`3LoHFNQlTlgS;2YEC2p2709N1PmSFiR~#qQUS?nb zQU|Yd-Q6K2<>ahRO%V|1INmy9MW_nWGE`SYMaJIT{Ed%{92p%yzBr*YX&h_+Ch2jy zRMY+(bQv*pc{w#VSI`}3(2hENg{+y`D0;!WY{$gR{B>`n)m)sJfte8{KIQ{DdR$bD zg1q9{ku?P9NQ5*y-Jaa<+o~c}+!ykyK<>fc9umt!`U-yi`t{@Ra4uypzeg~|Qjb&P ziw?p#DtN8KM#jK?V6TrC!Ct1!CeiB+7Lkg&*QJ&N_~8^$wY2`xQ{T$!=rXsqCAicI z;!KhXA6kpTbjmVqZJUS)ts#S0LR(y9A#R-1qRa)5uv-pOrZzFjMif_wxwVN)$&2s$ zOhH{OE3-)<#P;Enx>G+E7t0x}U$&|2)Y`OFn@L(#9MO^v@(sq~T)MW7*O}Y*tjJot zJwa^I{JJ_94Gr90mIDP@ShLa5FQS)c3|&7#E3k54dGQo^7##DV_A)vL%10c`QRfB*i8GKooS z4;~&46Z)qhg-X%*`S}eIk3=M0b4+b)*xTBETh#Y>U(C6L6@mx1pEa(EOGqrovotnF z;1R_>h8s&UxuhW7h0P_}?V+e#%}UYc8e<_-$?Qi+QVHVE(HMud z(p-i<4e`|rvL?z&!ma*gES0rXEeHZretkTl|8z{AnhpUkXPC(n zsyX6bMMVgSb^Vbc_YKKZ9*-b*jCI8#&HzzBuD=$}{-oZhdW0#G@sSL=16C@YLP|>N zuqF}wzSW;TMSpWM?{#QGd@?=5^H&0i)qu7(0Xv_eu;^%1J|g0VkUco?-tOLnU1M;E zZB|49M>&2MP;f9Jg;@{b)FX?8yr>95uW>Q)g%;)m{eyG>fSBRM&7GDm4Co#MZS~wK z2tt?#-CMc!xAiG=DZ7K#bOTEs{u4Npaxn@{%X2Hv^h^Tm>>sX*iwYe!TQVV$Nnm3G zSkziGzBVE)A>n(1mswFUR#9PlQd!}?VQaGSW%8WB?&z?rvh?Wu_zM*-dVDNC4z7vq z*W7A+>|YL+xgHF8(w=!iEy@~z6}Nh>d@7g}M|M^!Wh$%}V&0?u?lFZcCskb=MGFgo z`O4QktVe{$mULhcI`*DkFYtE0j2Br-!W{7Q`1l!t;zVD=30q>Vr$@Ym%yl<U+5Oi)O1w6L%Mp>+KV#;v^;=J0r)72DeVWk$8S##+m*M!||5%{iJu8LW(Q zAwTdeL;32euJ_}Uo8q!p$9Se4oA|1w*~Z2fQXJCa(w{%e%WX{RuwJPo+NTpF@;@$Q zR2A2p99v$vc^qDx;6)aH;Q3M~@5;<`cyu&9rw?|&yZc*tU^cWeqRPr=wnUxE5m_33 zi}v9k_X5e8``x{J%NfR2VPST9VoFk$N$p0=#jL0yfQe&YQl>igjN5y5NVMZ;2QB~p zl(&n#x0NAW6jKB z{z|afCCcT-HQdLbxq}rszHk=j(};HGfqM2VjvMp*sqK`V0+)X&Ffj0a=?@OtwTCvP zU)Q0d!MHyP@`8NAJxhO)++2B_RTAl*oYyk+J!@F(dBfGx6LXpw8#^t^v~PXB9(DRC z_MXQuNaj<~+)My^eSM7=exwJ#UZ-`wmtFfmt#0Nr=Z3w${_QmE8D?o(gSi(pJLM6K zp%{YdxOv}(|7w7EkK?Gi^EGPeyyNf2szWDfcjwE!ZY}$tlj_djZ?8{@9G$DF{A0G&z6sd8BH+nHdKEOv!ph!s^ zs95zOYe+V#9_;V?J{}co>ATIx@@)M3Bl1R=^0I7^Q#!HJ%~2cWEpc3cj`dzs4vJHe zRaEqSd-;pS7euYav-$1Dq4Na+U}IxrnmT8yqeGN{mxnZLZfZ*5fPjGTT(A7iQ-YEH zscur(=cq6(|GQ{&0M{G`!?f?;bwpQ1Akb?o5K$R#4>7&-y!GS*8d_c&7K@zRXxxf&R{@xOyuO>i zedTx~gL09LY(EQ}aq&iY2dGkLgiA*Rlo+V9=l9pyTUuf|ChZiI*THi1Ch;ODb+W`H z=S7A)9(k0RX$2+2N=Rfsz1TL{Q=@AB+2iD8NF7e%aH)5_12IZUz~TeK8;f+L`)h49 z>?+$9f1_zGShvHeJ0>-p>Zoe8EsOpR1%xwLn8FT;Cp zx@M_JS#2K(*`QgKv{Mhdxz+EONI)Ee2orqpRVp*6mC3xXcmi~McQ;`@ zbDpQNdM2Qt;A%F*AclzS%(`13OG72uf(c5xtD2vm{{|i#8QCHBSmy@ZU>9P8%7{Gn zcMIz3I1p%HKn4Nh@kY1WjOvSX>Pm{B53y0y9lm;|pLOyXK~)*O!yAEO)bcj@GOn(! zrydulC)OzPvUHEKYHGb*U7v;6@_#xgXSUV(gr99+JM$=!AL5pz9QR65)eQBSbDU^P zPz(MO)%GexZ)5&=UOt_F9VHjDnCWuj)yT<{^%bYMBF6gYe6@BoF4q0ez(iG5*OX&{ zac;F%O6J9W_7M>4AC6RpxHWAbQX)jnP{W;e~U9&GIZ@Hbe&Oqx4@M z(i>uQc%0M~h{oO04v{IviGNU~duR6xNV%aWj{W66eJ}=}Eo5 zc7_Uyj6}YL_cs3uBYmW)si{nrnwq*5{eEIuHG%-t=G5Np?QH)QWoOl;|s_r&haBEZK|&q z>_e^(p0UO6{x6Yg1KI~04EGlrSLFFpB7Z`(xj7~_mX;UUHJ=w5<>u~AYR|yHU<*GN z6O4Hb0fj&{Nl7@Ik2vJNaNr?LZ(Bg6Vv>=){@aazyB_^C#7%_=>RC-Q^wZYWMLk2d z@1dF`(U6wY3gwx6BWE$)_Y{rL%MFUuJF=BD;x659P5`(W?RM5ZQ zHOH2iI>j8laj);8w=$)d0tJ`k;qfs_4-D?LTK8ut6-pf*9v;(ALPDhQh#OQ=lF`3J zUjI?MvfVOgQ*1$K6hnzT{Q=^6A}s>Dp+>S35}f?NOFDt3{@hdCPt?G*3!}v@ohYVOZirg7deH_Wjuv*+HR+* zriLwnd@`-VRaH$*B6PPiAQ|8^Gb~1_&j@-f-!k?0ckmV?M0FrKeiB><&5@4|jTqFy zfhB27c6ZSf$A_)LD=K()^r7Cmi$hxyu|aXsv`@jkb9{mdQStUxR@e8-)s0XfvQit) zx_WVQ5>ofM#rfSrn-Yt{D@h@tU6V-a-mrzZh7*N`dd}ITokwqEqW0O3l9>ZXfe<@wG*{xvHM}QuLVzUx~iimdDAO@I5ewHo?MqjYa=Lj$0dv*UNrnCb13wXyN5Qd+t`PA)D@buzXs z3O2{i(aRys?qQ0~j{IRZ&bam@RpZ!irlyXj;(JHrG0`!7!DUfDpDkmNdBQEttTYXD zzExCJ71S5x{RRnkTho*Kzj2*z0A2EFXE`|XO^jz}v9A{97P!9XXuI(8*<|-UY zq&&?}TN^Q1LsV~=3WioxRCK$$lRh9$h-!Muu9+572T5tT8Q4#3^(6Z`!_Uqvkm2Em z(=fA)wegkj%0C3HL@7_xq-bl&$SWC=4`5$S8@b9vN`^VZTUu9<<$#gmmAKeu`29`` zydFwYIPHX9Oj5mWK|T&5WCj5_O}08T^*5+r9v>e?d6a}7Xk5jwrIcXrma$;!$qT@}EXo}R8uTgGc;XQzlaxbyaR(;p)w zao7|QgAA@=d1(m~FtpNO(@h7N`GJ1l9`@6^d0j7P2naKxo5g3L-C|4D`vc$up7kwa@a5Zf_5Xo#SQg@3i!I`4#Gs{WCv?j=|N`F)lT%M z-!~Hi$|)rZg4BWxx#Y&WoqjLZ`=fc|sj6b;%2Fj3A!oxHAkfPUu9Jk>>gVeexp!_XMa|qs$>X<))^?c46EXkhX$6!FL@Bj(y z8K;&-HzfzHOuf9VT~j>-)EG@XX;Qn`dw={*2DyK z10iz7%Pq2{3S^$2)fIimmktAR1K{}5oUk7gCqOV$0m;hb5UEqc>MCPr$I=g^H)~Jb z-rj}-P|7zANJJ!Uy{|poSJ+u-LL444h)UlyKtUNB+~*m#MZ@Qd&8TY?lw_ZSL-x0Y zuF}_}0-hW8tS3l8LyHz%k&XcMBMegDrmWvpU~wRI~X6eJ+QCUg^ zn$45(ff+jwN5wg;9k;5M?&i%Mr%({)X{ZY8&{?BZ$)Z$yjY&Xt$ybz0v zSPPPY!WqI&7#ST!eH6z9bX&UO(nmpVuUX zhdD}!)WNxg#AQk*pKjNio&VAm7?>$3p$QQ}p~r_-7T?Q46Sv-AF$4o-e?J~Gv9BT} zNp%}~Zo}VlL=YArkMv@=_LL;6N%yd8D=TBBJ4?}0NYU@-=ToVNVuSJnrnVwTrjy)$ z-R#hiQTc6p{mCi_NU+HELhuk25_)j=qZp!8g=>-Me0q8^^nbY{_<#xUL}(071GY>c z0oYu0x?m~AT|2R}Wq#|K z=OrK^z{aaFx396$lDVPcU0xOW6}bAC_wy&=M_fWOLNoi}m9d)Dmc;FetUdM4*1F#8 z(=~+)SW0lJR^?oZsRa*4LrZ^^DNAf-6A$+M;^NKb#q!eHp$o;AbV1|5Y5uLD!C_u$b23vLJJQ6qRwgJJQO%a#}D? zht1My{i3?C^!(`Pdvfx}oRpB7@V4@oONzFhKa#p>ziT3Uv$M1bkF>Ry1x`s8t2wGF zg%$G84oR1`w~XzqB;AuxsD?sAlK1!byWSV0fBYa25NMNfblx~iM%|_f*)er>z1`uB z{D#8owE@)k5s_vO69lKoS_}*h7S5`9>XchJu@mtQXD_R}=qbVj;=kjU>=YP#H)f*A zEByKGSoZYrSm2a23^X{WlscFyk8YoA2Yy6yRGN^zy-8-aY5hK*K4QqK|m0?e>yon zx>##`xZHMbO|o!0GLsANlE5DCtYb1i+#jSFKy|+Kg+ZTDIJa$4G<^j`dN)Y7$`7QPt=7{592HeP;jbk zZGD8$@Czhl{X>ED_Mtknu#mPJ*e(VYs8O!j(%Q=JvU6~7u)VFKqvP$)3;YF7Vqs=> z2Z=5);n2nrYPbL~PMkFe3^5!Pkj4xR4MAAjje$3^EEnSJXqTY~$jHzaU@v}!pF0I5 zQHhkSdO0~iT<@3hMxsC)zwMI0IXXFQ%ZOiF+1tm_JU>5+?#sf{#DTkT>qFnlGCA2k zh~967uoA^%@Auc0mzHkt(xjZ)RCk0)c6Ua6gzrwyzy~BJCtnfYT?hh(Xs8D1#gDp; z<{-1!1!57!#l;ZDK6x*f7$E+@gBE20N5RF$=H%faWAt7RUbss`##0+b`S{gttdHlPv_2m#GlT4xEg94K`|Vd_6#Q=gA+OpA{F6oi zlejnWEY{^@3A8pk-n(;h&fT9kd=mcV+Rc(2z_222?T3Uf~X{-Anv+2D=TCyIvGYK+lHM!V|wden+6~` zYBmE*99o!whHY;i60NaZ>&vJs`AGDcCHqH`!c&-J$z*VHs4H6;BZzMQd(WhfNykVO zc74dz@bJt?85j&ck29~o?01@p?H#@i!JMz-Mv;@V<+iJ>sUagdJU%~Xps)P3Rq=Sb zTt`}s(+{j~ihDI$J!`Ay@`EM{7r$`L ze79Tj_~XKNZ2?@`@OXkM4#g<+q+v5DGu&gM<8XP4Cda5k=TC6%V5#n01Z?W6i{@s;kT=P+u$_0ZhJUDAohC@ z+zG4|B{McQ?xKU5gz#kHmg(286n>)1SZZ4I=+eGW8=;Ofb91gv?^#07D^tb=0cU4t z&648sgTUG)+*}!q;h@^r?Qrt^pFg)*n3zt^+b#xN#8QLilqdhi!oW=Z(^F7;fb>aB z_b?)XHYErL)9T6z8~$N7=QV`pvmnI*K16_}I3|rzz!F~(_nIW}cn*AgKFD-PU@Alm zAKlveS`Q~kk#GS)TA*MqcY;w0yiT@4l7Uk{F2rMV^}~Kc2!R2xB|%&MR5bo7%81C< z?OQ_ph`EnH%j$rG+c392FZEj^E+*E^&23wwaMq4At0IBn^HI!)PBsMa_g^P07Ure| zo=)dk&dV{ff}!NT9qV8g-~OpfSsPtlc^gz|OHclFp$`eOa*VlvZ-y0hjx&s3fr&UUfO#Q&% zAIv6;vb`2sTE!8g?VfTo8`INkGb?j*OViV!mKeJ(*x<{^5InRy*bvD>}Leh>s6mT~Lib+lot(t71Dk^uImgDJkZ)Q%x`?QUrm6d4b+q z&U#1<1HFU5_B>@mPy7I9W!2c&SU5mDnUIc(3iQ0Px_U}R2E-OXO-iqSc&#ifWE`GV zl&J!)C1Gl6{;_mcQ&U?~#h;YoZCP1LSh6&@nwp-O#W}SYAC1l=qElzJ3PM}3jJI=h z8)x;AIp-+NC@y9~Df!V4?5m>$aF{vTIcgY{-K1p zHpdGC{||lo4j~Ddwnc}wjL&$U1VgN1T@X173jojR1|U($6dq(g$t3h)CPt88YHjX| zzK?BFa(QB&pU(+0oSyOm@qwT2UAgQ1<_KAYX*zcm|g|I1A3;ef{QNtl&?ag@uJKLJc)R%#zAQ z1D|*J4C675vM>O{3Ffy)1d>ceI_H5LOHCQwoxqY}8@_+_L&PVrkU6j4^XJ#y786}~ zaxve9>VHY=8Kfv!snQB7NwAVBMMw^9XWYO1ZEcya!%Co@hWN7KyMdzojL@Kx0gnwY z#KK-!DXt#mujkv_fqO$O$>o}rK_6W?<)Q$G`}?8%e6EL>wJ7KE^73kSDrjhEq9P$u z2g8J%1=m+Gp9MvyFFD^HCjFDlItUUjoo1${Fhk0Vi^GkO5oj=k|52Yz8IYL%)fM_H985jh=CrNvM&MzRze#bdt?o3Gm=twWiA^uPr}_iBNBh7`Ajc?$*5-AwXg;Yw zJwH9o#m21=7ykph4wp&obN{}~f(u1OuTHSmYKIFk7e6480j#%vcgq>cMI*+F;N<4k zuS|X_{rJUoonQm@C(^a3@0#~XB@q$PzgYX{-FOiM+YJbs1W-&-@zIBTWf=HM!MoLU z2Z>XVcm+!t7)9{Vi^~rKintF%B!j|Pg9J1X2t;%DzDX@}LJ0OZN^ut#ms&AwEGm}E z_d~dm&7g&XB%z6vgzj+c4SetBKXpE{;}CWOX}TRxI0DrJ0|U!^08Riw!Dk5ONgpJB zH2tsy^D8PoUaO2S0sS(THGq^YQgMrhFC&E=)=elBOgdS9QUnR+yNAbMf4|UG z-$!~1GA6n3Kk)h@7r&(n?9I$VD|$rcSG2XYW#MVXr>8!M9_H%rkq5)6pVpd<#>DV4 z<+ij;io89WrRgJxcvb{xaso_DOw7*{h_(_sZtG?dN^v|BDxw*M1 zNg4eo(oBH~WQ^*@D&d^e_MIK753l9 zkqHr&)~)S3pKD{qKp=N_KLZ1Qhec*3#YuIND#@;%p7yG$`|iY={2k+hIE0wRq61HT zKR+>TD>m(C4sOZ=lplubDdEm}iH(gO2M0ARX2t3wa!1>m*u$>CexrZtLi~i4LY*bN zhEj|eX{<8`#YHsH;m2p>L!TIjN5&)xQEl)6M!FpRs^5;pTcD%%ErpdP4nW46aJ->#S5SB_$;_eNOyRb$@?vZfaUkRMd0T*w}dC zHR&^Cd0L8xHz5ZCu`)6Sl?ST@JSimKZDk<GL6mLr*y5=*#sfONkUC3xzbm}dI9Kkd;p$X6<0^2n0A$f^enVFgC z>4A&F^`oYbH0=X*epcYipnNQ?>1Kmrmv+n9NxhtYs(cp#F%`r6g|E=f;0>U_CF@qV{ICx!lky)bg>)vE8L#5Bo;d5HTQR&8Q2J&)fv%XrvN z%bO1Tk(c-Fs4#8g^}eZ>y!z$}KXIErs*JYDqkuZuaXBHAa=lu94in&yhW2XO3TY9BBFGvj|@UbM~BP_JbZlE zmvvN7w!ZH*3^*n>wz8r^Fgn@vu|S!=z$po@vM#BV^I1TaQY3dYe4+PeYHF&3|I_M) z=b!)-B}8I`{{8*8gZz05F*zxTtfxXec*wkN^I^in@4halp}zjP4hi8NR+;_+#)s9G6!QKpc0y zc4*_|=;%p5zF|nk`#x~D_xHjlQ(<`TlVRFh9*edcD4qft`iQN)?r!KU8j4kIFkCY% zn1r01oRE<6y*>`Z7wRJ@s7jUJ%+h0F=}r$E6A|$l%S=-fPxJ(0rZY3x>B227Ex;lr z>_1haDF?h(*8>u}H1AL7V1TQ(VJnPAVOy`3kN)AhpAZNi@3{K0 zYwGRo4Vm>cP0h`+|9jZ<`_HhMRL}1#A@k`LA=5rBV}boQJ`lGoschA8=c`ArKE?)K zM3U-kwM>XZm4e8x-<;yzSc^Za!tEWH*Y3VT4eyQF8j6TuU|@K7c=-Eoem~$(7Py@r zX6Wn^H6*X-5`8l#ab5By&Ef|j^}tO0O~mZ_Gt1;Y?M>i>y@W;)$Lj%KK|Ko*YUpTa z5L0(^bzO6-OnB-Y-rF<%s?i1P`oivu-SvH`4F+_6c9u8~pqvy<`QP~cHz4{HFDEyz zAulvJdd*Q|pV8D#v%!-+({n#TNex%fZs~QdbW}4S%@2 zS<}hvIJt64Z?VO@@m^{ezN#6?;K%3jK-g9FHw3^{IyVuJ*jNAt!&Z*Fx7m2wo0rNv zgw7n-&BZj##q6X_Z~3fF@d*Ob=G~p^_pcfco|O!?6%ZfU((YznA-Fb8hOGKbSBl$A||%+ z5OOwTJ~}-~df{J$3on7;7;k=UYrFh9)_XC#%xrTf4t<@Tx|Je;pJrSX`6rGes+CL1*X+1 zTjl3xEVqe{ipn4&mX--0w$U`{`kjb~_*h(AEYR8}FDHNEuoxGQHd=a++fja^rrK>x;GPAZm4_%4i;K9>bu+}}C-fND#zpkgN9hRljQPWXZ*Lu&r*O>Rasix6p1RjJAQzZPgBnIRQbVe)Fa|tz);0 z=Q3|y8+RG`j_KTBY8i_IzD9R5c%FGiFF&^qH1sk76rHW5l{E1LRllIayT_4MZvkD9 zj7ue`Jg=O;GMogEww+qjjKs^w#lc(A7Ci9URYQN2N1)+1eh2bL%@cz^5MY? zVlvmFr}~jDS`>0MUu=o83Y@MLDPOY>t!3$hRkhTPGFji)E!o<)z|mCGP>j(urSsBOuz~{RXksLDa6IW&BP>*b!~3>R9R+g zS;F^c!7?#CZE^gT7+*$XeyOLiCNa83YU`QeicY$#<+quEVKYDLe`~M3PCO=N zEyxXt(^qbNU0p01Ebss98rgwspj?vi7O4Fy49MmCBy<_q- zR!6XIV1AT?hUSv_)+)B7z0BI&`EsY^Kyv{lI-1kkRzpKu%_Y>y%EJTkbz|q^yQb#( zHTNfBUw5nJg?ZnSrWcmzWXE;sj^%mcQpJ~a*xNsje8}u)BBZ!n46;KKb-k8Gr(i#l z_UWd@sWHrzA2MNx$1XvW9hY@u2*%GOLN`u%vYtCdlQH=@zJzankF@G3^gb-1p03*i zz2(9hVa>ue$|)G$&o8wH&iyv6cn#Q*p{{BYCm{=-;s7n4o`A~n@$BDzI1+4`L^go$ zJS18AV@|b=b(?ref_~2u*E9e*pac1{xdtQv2oK zu8aK3T92`_H{P?InHjYH+`xjn0Kj6Yos6iyzWFQX@pV)*3p0zIZN+LP@grjR3yfo9 zaL~7Y#H5O6@x}(U%>J=a(4RBghP(UK6#-Fu>K^gO$H$J68As=O(nA~SEK_2PPfN33 zbe$MQC?XZe()?zZhs~Y*%JLlc$YcOoiwhy*fkz*0%=DAtgQr)QZ8?vt9eGQKuMoz! zO{x|MqnK3t$Q2ef zhzBe}@E3Y>=oSbG-TVOpJF$q4&W?`1ARfD+fs36z>5?LV@@mmr3(WaH9aZee&cowj zX=&;1?rvlRon&BW2)M6;D7+0%ipc~QA^^GHmAeO%J&#Hy0jH=PO1fm8dauy>N0bns zC$&14=;)hf^1?+2d%M_JrMRz)ztxogrpTxe$ zB}|9T{{EJojfb>yHRRn|jOS(&l4UdV^r^Lg;I29b`Z22OS4s|Kl|{Y`4H54`emYgU=Crg6_^!*85eJp>$*q;GFc)~cV7)kJ#QfTp zYR8bSZ?fTwi#j3m7CX;M z&gdu?@54nc`uCi(2u5Hnz$4S@(o}m{+bW3|4J~E*sbx^$2LpIJXUMm)4*A~br@3@F-wh({dE)4)Z4)V-w+A9atlgRRdmA&GY!nIhA`UA|2mxfv=EhdORcFACd)eG>L zWqD~)&R6zi#9Ieg57$muLVoLK$6w0IIR`}(r`OdOegA<^Np<#HvT$EyVRVLYu`5HX zbhx|;BQ4+4vd{*&IY>d6UYGSnRwi0k?@wk%IvE*BT53k%+Ht!Cd1eNNC>aLL&PK*t zdtgq^(jRtBYH3CM3+nkUVN6 zso&91A0SQruh$^2kQ#fLuVdO-BT%)r6s-$y6-y67PiK^iJ3C$ zPFjBHtRsnSjFhrCAO_sXcj3Ny%r1SmBsdUAUjE%NVUI=4p{1o!Wq4OljtL&yu&|kM zATtw_cST#n1BkMxjs%1EN)`XiE#{p+^nA|j6yZ3=mQr_q?0jHq_yNaKejoN$!t*xe;B}~5ns3n({qDPHVBI~pr z`B8Caz%mo%7aeCqXCz!BbW(k%*Z~43OWXu&r~S?KwhJ!qu9sJr^?ZDnTJfy**0yPX zp(ehv7FEhr>W7~=wbg^*mj5Vf8!))geLm2VvNE!ez>Vq)TmahKEhw>CW>cg6uv1P& z?CC~b^7x6&oi@8VS*Bv}Z}U>Kk(BI|gTuZ%BpwHhlM_6HEMqZbeMFpXY+!BN6X>j= zwo0Z@sAZTl70S(um6E^swTAwqj4_Vt2Ex0QG15*?_h1m4Pq}c{H8guZE-Wv4dU%LA zeVyE7WQ^LsEM{UxcZXlFX-G;k74y#N`vfYfd)m5^mBU{i8;cz@5-k;+SgufJ+|iQo z#Ol0qYFuAiTG&CS$}!$_QCC+V2+a-Bm9}n+&4H_o4-al4DJXDu^6i@p;9y^|?v^>b zyPK^-!A>i!9qnE4_q_YetjK!)0(mcxHQA}AJ@hOLW=>_Bkxb0xaIXU2mUWk>#;WTH z&>PT7kK;b%FrnMg#K?n|o10icaU!WG_mUBZMDqB{qqB&7VoJqMHB%dH?=Bm!u7%)r z_vvP^@lb0xhL2gcHB{&x^XBNDOTaA_Q!L&DY7_FgIczFhG?9hhRx5(8afPvTGnh;gWy9lAFvl?j{eWcnyKayoiMfAgQ) zn;c@=vic#!XEVaQ~+E~$oa_%PZ z#*g~@Py6?>tSRx$Mmf6%5zk^%DBSvLIR&#ga(ZVtvC(Wx>+9=_vsvj|LvD`HBORR; zT~fQgfuh0T!R)E6StV=B)2>!!aaS@wm4&CjjSAA27dbgO*4J+);_lkoSNwXdR2i|D zp&xae8VsoKSuO~~9tna0P!8g-HW}3l>S(EeX?JMGn|aAHoyf?V12UKtM3+ zi0x1bh4M2q$81m!ycZD(Pgqcf>zP&eU|wEcY%FG{jL~^ZLxa@zPMX$gn-A*X4wvt) znc36cQ};%1*&-)$R9RYa=`s{oOUuKvWo~{pL`p(S>+7m+dgHvA$1`%kOskysN_R;}{_!BlAI9THz~Ofczh@?nJKV7iWD!3_s!H zPp!|>q{waC?X>`T6Y=&HL7)a#7lcqfthS>@$<%ExI1ssJU10xy@~KT~5WFreBykus z^l$$uDVczP&a)Tv?jFJ1VTzIKk?#!C5YnsryWoj}1sH=fK9xg@LK9^E=xy0Y)p2 z=cyZ7|6>vDb1@25C*SVL1!~#PO_?4nVMfE34{QqU+mU zN0-}5zoOdj?E62*%KC8b32;ScJma=pQQgj!2yw#*-s$<61&98YJH9QdK)^};tB))D zC|P-*s(h2OKN+O3^~gRc!j2b;Rd z9vEKt4b|(B-djzoXm6!UDHWmZ<;J>GW@72f)Ae-`?OzdwPcD+DZ~k9M@d}a|mI&Ie zIK2*`bpHA4dVHr`2fht>*^!EW)hT#A=Q2$_xQd%}|A*uA+(Q>% zD;@ZmlCCisJ47pFs&c!v?Ml#PG{bIgja2rVTw_&TEB=nX5=E@PT(PDYam=5MJgzWL zXv;&@lX9+ap+il6dn92N#dhBMR}hja@bGX`Sy@d>S65eCTU%Y-{rT>6cGt65OK~*4 z&dRQY_O|N6?OJdvPpvRhQ-guI5(O25$GBH+Wp+^&NUvI=TI&c!J>4FSPAur}?<`ek z9_x`Q|3tH)&etiW(G&ZN<3#zkxGf*F(@N5I5-%~QZdo4kAY@k zU!qpZ!Y;di9?|pVOSbK(yxiG&P)3g=h~+*tT}#)1`?fMWzg zN)nCV7+9z;x9^;rZ2k<0sMxG~iv-H3O~YJGDZ!DdG9>*^h7jPo#>OyHg_>JhWD69> zMn--+)Kpetd096%H{XYY&CQkmIAA0E3RZ=KM90R)MnqWJ*@f<)fW(mAUF_ZVKho^P z_Yd;?+VGWUD(hZeSd4&AcWz>(g^Y~K>S=0zLPLx?*0v-{b#$!OCW%4{YHumVyBMAA zb9D8sE3RE$S_|l_V;CEbCk=Oh@K(1!R|O8%)eMZv1U<1e*V#n~^J?wvnGNP8^v!Zb z3Np9w|H(e9y=+C5Qj<#X@KewJ{zJKz_xA{+&e_r@ke;PY*;LUF=V9x!H_<9x{a^4z zYdh#Ybe$&_bX4sV*)+_Il>_6$X@3X>2mpctkO)LtJ;oz1m#mI)a(i3-f-4M^;Ll*Z z<9_@%+*H3~+9_)oKsqT|!QZEF(-Z6z_GXY1$np-+)61)}cD*|b&2z`FL_l#M(wbC>HY%nvvGz$XFe^ z!7l>utp{xg4~xtFiaj;VDH=Qggw{DR0-RI)9uS+#OOLUGszoq#rhuqhwmJGf@UIWo zCCO+vw^+pBz&hgD%hLr7QAOVwjgNpzdXe>~s%oYmrmbs{iOep6j|$ZCuJ? zimtz5&8S9E;yzTfp$gv1BoakF`|8FV0Q7tJ>NCAbyl!-1Iv(yv0P@aBMR5kVMNIIo zXUhZ6v)7Zi?T+ko=n)U!YQn-E{XNBPb_`8-t@@r(?-%;89~W=g}>ao zsMFUbc-hbddmv?r_4Tv6NlD!`PFn%yhB@=W;NFEF9-pDVexs#1P6n{2N*J@nQ+{)X za1udjmHR8+e1#Yeg?7}6r*H3WZ}0CNdDLX4;C>N4rJC#hvOkTmwzejwSs?Kjzk}>9*T^V`xuTvA3BJFCrxYysJ!4yb}92)H5*_&cVtTbgwPp zs^$~txQ#AW9MDpGFb|&DwA*Ic3W7hCj9=OlK)*ZJ)vC4{y&MUv&F4|@=W`%*CHzt5 zX4yV>ZCUzOBJz+`Py^)Ez{i|H{MZ|YVT;G`koE$SDety?)bZ^EqV~Sm1qWsC`;H4v z6=#S<;-Zz$JCewZUd=>&cwEk@>{w@83B@m%=%x;p{hRX9(*ov()9Skd5p*oZYOwxy zsOVOuSY*qIMW5jSc|eB0C|AxI?agW&<+1)y{#H-0E^D@8n=Zw1d0?%>=E28Hk;HopC@;r=78i$d9;l5~ z$kWzVH*|ZLZDQx9{(0&Td}(v%-eYC)j#z@>ZT>`5-Con=TBZ;}I&Pb)rDa~dxJX35 z;=0i{nm0mfjro&MG4d;j*_ITs+`(~znUr%u?vHSQ1{#8`xiw|dRB}Zfxf=u*EkuAE z%K^LOZE1Z2v9wzr)CY6Q#1UvOhQ^BqaXh z#!h!PTps9u%T0k` zk>M>}dm1g@eH0dKn z=I`IXArMGH0^Gl=Ml}==-%>3;LDjbAukRW0sm@oX{(9G9lIe~Hz?0oA#Rb`+N$9n|adShWZ*Yzdt%PTf205j8-0y=Qjtc~d z%PVT#KMM*{F+7Em?ar|5Nj+r56NorWMUP3DC6|>kwX`gaQt51*!Es>Tb3^(Dxz;kk zQKh-LtHnAoAMS`S_?#iZ8J23kU#Eu{=q7}jxwxpPIKEuwB^mtC)%Mm z#>S4jP^6Vpv?@G`Z+_}upyeyF03SW~wI3Fp3kR{!W2QvVX$ghTCvEkik=BjU#DQgO z!Mn9p=+@2%;nVH*Um)tu{nS0CV}gYrfq8DJlxHE~XJ-AqpudA6$&Pg-DdO5(U6@j!@RG(1Mg2)p1!3FG&f!;ukJ|(X?&}g$g1L{bkIoZ3 zYk-y2xip6>ZHg8C`DS%H?5CxUY#;@1R{m<#fgi<>lS@l;cYE61q(qHnvdSSt+fh5K zA{vapN)3OPc@UBQKq~ zG`BqV`((nC8t^keGl+JPhfw+7L1KN(X)}6=jg1|Wv_utFI;BCi=Ewrcd^WUXlBDD) zEh00x6Gk{hUPp7@#Mt_$2cDfBxt?CKnpy_A-7-m(Q@s!^W$MTQ6aB#C@eIxGu3Id~ z3_XPH*owh5u~?Av29zi>)tsR_I=jF_d~jah=1Tz4Sr#;a6lUBZwZ=!vXC$~r+1mC5 z9PemoYdfRanUX3YefyZ`74~^zXC*KQs&47qqLy1w%2OT&3&?(!2*1JwMM~s2J7RBO zIye~_8JU>mb#!zzHa6DR;~kv8IV5;&H{*cJOig2AW3lZ8-1}tMMPwWjKGMX1?a?4E zjz*Vmn9=}rxyya&&jrPUUt_dpxdaT)cjO&vO4_?3M-6K=MlpUUh0OAa+gSC}8_)mj zk}0~y#|0%5><{N7D>))Oe<>PQRo%WoSfK*lHL9mcwM!T=)oXd419>~ToUgA2<)e6o zH1drW`Bz#}3+Cz0g2BkL<$fDK?Cl$S3g->{m)54%V0nc@)EU|a7jBhqnVEB`#F26x z^_k8{NM&WmjjEZvy!he7#ROJ#zhCu8kzy9vomMv*E9*y1(MAB%L zKxJE`GLz?28_3Ph3VWE88RNhsL z20z5to$LOPuWh`~+8r=7OzZ)a8#`D+^?od%q5K2&^hnta>(kSgPMdj?BxzchTwGsU>S{3kM&uO?7~OKK ztqneM^YF}lqd|hv(bEkQ+|C6+vPIWR{T!OA|2z1%y|~)ZqAHGQAO2x+a&d8Xwo6zm z)G`E$Q8+#hIx32QP6Qku9)}4|fF;bO;60&%V`pbip`iu+1^uC+6=QDGN0A?AW>+x) zn3x}6?jxwD*52NbfHlRIURF+Kb`|AqZMnHV;3x$Rf@F2=<)w{{-9FE)1Rn#By5i>4 zod#%WkGJI)r$LfqMuLugp2zO40HM!|QF3o0*>=2&t+p)mQ-Z&ma-ogwz~LX1uqWML zMgzf;xbJ+rWMf}eW@}@}nk8S5R*K{9Y2@oOJWSz78!|CbHDOJeO&WXavq4?wm?28J zkTW}*U*2qJ=lgZz=!d(zI~G>qsqI-Gu(=ix8?Ml6rz;NU*3cA81XfY0L_(aI!(HbG z$yr7m(enVK7`C}KOu z)$0nS>K`-!pMD&k{7TCw_GO8tYHnh2+(_^6)N;JEb#${zF3LHgLo-`qbLR*jhp46T zrxBu5gv#mG-r4DHLv@QtyX3PDI;As!Qhkh^T#vkh5j_k&g4^wGacOaGPA#Kbrh3W3 zc2q_og2ocHmt9(&2Y@_wfFh-C{x9pZAH^BN+Y}V=V~M{R(kDZu=bo^UcXqo?{cf~F zEOFMc;4jq+OS6LXcP$=R6t%2E;gLP=-iCkr2XSOSbd70@jH<#yTbW=Lsh^>Qi5rE} zpP?y}&T$8Wc>~LR9<5gcNJN*7agI*TWY5W-hcfAha(;GSp0<7}g}3QZa$&j~_qr6iuY8l`B}Z+;0m=5xIPBLuTez5#bFi8mHm*;M$B^EG zQ}!nq$8$e#1yxv>$GMc_c!uZ$lx_^zfUpOBARxW#a9D@&Ov;)~I$~z7oCfrpAhrBYA8O5BS^PkA#f;{QS(%&(FcmerD`) zRRJWz!GXWT*{|5k1^)+xDs;GFw5TAlF-wSd?M7ZLj=87hSTNX*h4k&$_HloM8}}|> zQlF8gGY|v<$J6~PrzhJJxbik)HT-ve5X8gkF282ip-Wbn(BUm8wM z&!Wv{4sSQNK*dKKK16BJERKye6t*c>PJe{BxS6mrk9~y5kFt>B6d+V!<~ccn8BGSf@)9B7;0wQ;(SJaTq^PC$`qVQznJV6UsH>c!n1TH(w8 z6Pd(%Eat$1hld9l8QCiPqt4PaW7@m#eMG=&Necs{^~l7A4O|Lxx%a`pT3S8g$pM*w zz?sQO*sW>GWOh05{A<*$^0~dtUSzc*lmF<9yJj>IlQO&FL8>7B2XdBEuMhMuX zNytziF{<@x6|n2=T@uUo^w3yd5UDOQd3Kg#yt5;>cYLSde&bjXnM_~)jGOzIdpY&J zTQMQCobeaI20Nc4W28l)jKAjpt~N6$yk(F7P6=J3ygkdEEB}3xfj_-C8CGn^czuyu z`UU#H));kBH)P+sesGg>iM0;P{dMUD$#!HrgIppBJ2EBBd#eY@kMSmG+yE2Jh~z%* zob3;xgrX0r^h0-JogB_z32H%+ib|t|r!nb^;L*Rr{;3CY=U;oD$$xjA4#vSE6J`GF zMfryQ_1~lB>&WMVj+Bf5s_I_=O>G=83ZKTVT|DZ7P?WbD0SCGa476RC{L9<>&2MPf z(FMw}A@n!3m0L`&2emE5?c$K&K%_>g^uG@j^Br5fE_F#V%KqD_e!v4`*6+iXIArd z&<_4-33-#vRqcis#N@n%d1_x-^Fx*>23)tM6{tslFHl}lZpC@SWUOV+3=ydRFQSpf zZNT$cHW1wDf&eHiD3Axfcj%;)6zTS!6&_IFfEFbJfQpJLfX;rUNfZJd8y$rmgag^x z*x1H?r0bZdPJ3alOWwB2iS?^UC02fSphU%#P zqj;{)^}Z`3^-{biqd9+9yV8p()TLQOc%_^6}9%akeyO#LG;A^Bf;) zp~t@(XFhUWBTwtGYSIO9XCv70)YBH`Q5$0I%SeVi@~4I6HM@Tv9vBME@wYL_E5yKX zS>I%=sIK)3r%umE<`w|{{*%GS%`G96ImT4++v!JqCg2lU#a8z8VZzjOl_4Gti{dw3 zC$yE#rIMP{Q?e%3Ma^O{N(v_p-F1Xt{xvmIo0{W;!)qG)fwd*Xf6_>fWdfMW>_s=% zhX!>t_1MPAzx!_`BxL)xejMpN5xXnbDSujctIBF>Dna8H`jZ#PIm4hUR-KnqLQ6%} zR-SL?{Xg9>W)rz* zQUa{wd+rYeTY3C!+GtYcz3{dTex0HX9ny!JUXNXae-(n}9~?YTcYBX80AXWl`^s4u zdQ?48hD-`Pq0OIDgh@)B<4XUY&^dV!WupJV0U?nh+J(|i?L#Kc z_)MGx5q>8VM&~M^%%nv>P#YyWoL(5%Gahc?a*NZXDdaaTYpOcrcnq=*;G=RoiYI%* z^S*v+*6*KOdWAJ_YJ2MKv*IEg8Qg7pL&T${s=hb?N8#d8Z#z{z3)cLDkG$qVD^>=z zVFJ7u`UokQ<4T3`u6cw^yl*{kh5kW?#&xr?eHPi)tR*-V{udI^CIJKt!vF?hcHiFG zQ31_5ER?d>lY`mW*#QBtTPs{&zQ7rh&dRk+QOhcoiwl+=WDg){~4S|)?9E8!o zi`Y_s`(>gkTkpQ$6_P74c8ZbLRiY|xFr|b18p1(074=J13&FijbP*3tsuj69_FdDC zd}2c}sSllh!7LK=^YmaQ(WW%DBlK0B>!_E`N|I7xOv$L$}{}&r* zA$%W@d{h7;9Bj2a*XB-lclXH12cmRp;NtSKwyG-pfqNX#bFTRq5ty2psklwe{L$TA z7-oFlcws>!3_<_;?$VfD^Fu$L0Kxb-_vi7+g`2XN+|>yKEM46HzFxST>GNLYWR&9O zF2C?SrpZ13Yd_p--v4&}m-BB?Z~W#3!Ii!9{eMG?(8RI1v$0{IudlDGtLyFk@($ex zxS+rhM|Li*q<$GK34XE5AFWj(jRZ9I_UA)2aH}E1$Q?=f(TGQ*DkeZvCfbU(NgG2m3jW{_!x3{u_ zJLC8}hz@}wrO(t;eXf1jTVRbNa5_7Ba z6P65{n8UQUb3@}B!eTI%tv7SC(;Ha#3SwC?keJ||TdgJdT&~B89~B~&O*$U~j@^p+ zmaigCq3vuIFzg%@E$!_n8=j%6u)QO=VPb84JetO%Fs94eKj>iOb0;)JSk+3qlT8o4z!8%0mUDBq#6f@0-70Jpcd;2n!2C{@;o1S65ds@Bzs0kFd3t z*AyvW(1~*Izm$$J7nh`ild0*h&VLE7-w@~&Q0D(qC6hUbXfcXN33Yo86=BHN9?SME zFO{}7N~J!!8JU^Q_qF}|$*(@EDFn2PY5eb+SkEx{x{(K)G(Q6cR=Yj&V;wood3I-2 z9mo7=wwKT>cWQhI5@#li&X^m5lD9Us?-JmSn0>|BHom$-CnHV&EkC@qMT-6B$M+AH z4<4RygFn5zltmY*=|}>Zn8%Uw*IGS89GQxol9Q7^gi2ECeNLNOX9pe8r4}d#hC8cI zYf*|M!q{nRYX{Q>9Li4vq@|?;=wJa*C^TCN76u!F@CicAhn_?b4a(>qB;m13OimWl z>Z~$(qSj_RP=hRi`iOwQ%`AwjBY&c+Fbz0de#K9bUX@_ zwt_JMH`3WuXpaCXpPym@YCml#N|j37ieZVvJq=@i&VB&kq2+fbRw!jDQ!K?Y{ICkA z;H!r_Vc5xFay3Q!VWwA2qvxJBIj`nAzdc>+?2o2R!tgCK70T%3;ue8|K37Ve23K7e zXRqX6slycfIY44_>+F*gvl8uEo467Tf~bJ(Y_;3{9T@~776k9sIDZg!Ssny7@t>+w z8_cN53e*Ea`@5d(hRsdR_t;`04KYjWnl869sc5@^(>Ch!7x_xHz;&Dn@M_~0nXv1{LihymCh+eXaIY!5_@Fb;D zp}$b17q_2a;E7j^dDpSRJ{`T%1|B8#Aki=EnD<$Ft*vajzbLBa+=BxsH_f&sQwRw5 z)f+-S2psJ=GE+wn8tFsv=@!=I#zu^)dH19nIA_0D<*c73WB!x|)XeuUg^uoNuo2Ez zAd1AqTPr(gAWRPpP4~nY8_UIBI=GLGHJe7XRT?8AJ=i&_e=bRiDZePvP=#YE_#tK0 zs?-^jB^ZKv2ju5_ct-wRvw6PV%qhIc(`=B;D0T6}9q8-f#7F&QYIGIPa<`C0)0*w> z2J5@pEF16KS_XM)YAR@qg_|3)7rOkCew#l#+d1Jt3qIW0={2bd4DxQa_6XQ!CTC^m zUW*)badq6(&|Y40uqu_!cDIQIU;I8pxii8}@Si6oC1oPSpQj3(SKo_4dL66i?3!l$ zO4-HA7T#whDlit?aLU|RKhr9<`Q|$`%7p*-&tP3mZGA{=MOzR~mrU21ub37exX;Pa zt)Zd1y1^_3f0qHzsqIs}%dIXJ`WPeKmIF{(dH&q=$xzZKw-yZVlD_G?iU*)em`y})a^5jb4&#kWNG!3h|3r>yo@v^h;)Q=sql(g%r=orkDzTa`917o2C zKmq5{73L1>uKFK+e9Whr$@t~-`C~{o`F=Ar2&4j?z*|1*pFWqceln8ZoUc^zHx?)| z#Vdsxg?WQBUVdMi1z!djBz_C`E{m_kyE4mqf}15Vyk+AE^5joB~bSF|BZhK3r|X%;hg(zHOR zXipKxq86(wp}^VRolC_-<}FzBKtvFS)!eDJe_g*fIHu~G0f z*pj7F8gAl853@%MkOCx;6OJ7t?%d`cADiJ{Up+%4F~=$lyWYP1`sgsVhLa+%C2J(- ztSX}!0#1WwHs&gI&Re*e0-aD~E$pnASeTvf??R|x0T?LtuJ@uXi<(5aR8(ZTtCL@= z11*Lm3Y zcDB?YnKHtm_J~E)ou;v17*krv%KAD0i28t(g#RA|gm`SHW@M04PymKQZfqtPs{R6rywCubk=OlE@_$Ux@+F)M z-q7-`LeJXE&XoLjFMm6-Mm z(5Y+VD>C8!3-y)Zf&1Lqdfd$soRjxp6T9mcVt#zKuuzomU4Hs6p_>I{r8(Cd5eJpl zFmGl`-d3p{uGo{9-}}`K;T22SfH(Npt>Hjqf3Vm0#8C2|=c0<>EBAHD4j)qbUKdGU z_$8e-N+35Z806F{8ymF{434P&g|nSYLUIgG)kA5RO=KC7BN!lCKFY{Y-w7O?Ai=mT zCky@vkbX90U!3TzYt)C?rUt>W_e+Gq6pb-e@~a+rZA($d&+K82FZCmF56hwL%{7fx zoT;hd6Ioue7n|7YpAdOq1WtjC@{GDZf%FDPN8@F%8Xn=!t+T6ie}nVB59|>nv#93r za`Bq6ZR|Vxn%=7UifUP*P0^3F9YyYe{DkfEb$+XV-`VI?8K{0#HUF0t6QsIX{+$XB zRp)T_0>#`M8Gg$39&2xZHBknu)WA;p6HJzi{W2+FUyX;kj0qk6I;&7Vy<&`!0ZDCD zC!GpN|d_x-zkR4{*`2YU|KLiS=jERK>4{~#J zGcz;8-mj>{`7bOV{0@vbI5=r(X$rvRhKBz9_VM4_)Fw$~LY@GKz}0v8!v?&PibIe+%ZhK|w)jX~X?TE6sE%4%celCm4CE#L*T`zI~tm zo_tuWs;$-ilLm|mE*JD+A|Gu!- z&%k>kQV_1F(CF^a`E_|&EpczSI22VQWf(_7LaL`;Wa=xAornS;7u+PT)}-ef;F{EU za3p$c-%>6r%NvN9t{0YvjPgYAW%JOO)2bCGaHCKK;?D|HX5r5(T2{0_&|^FZE7m)10m`dA;jbG??L1G z0!N`(geK9S#=0Fd`l5s|3Yc@lhPc>bW{Hk}$xfECBn07a7kOyoS-H1JbP(dz;W2qh zz9dut*~uaprzh+ODEqgr##l=ddU;}cx?tL9ffRs9CFBcpBjMZKwcGd7#5~C;MUW5| z-=L8e9)a1GN8P~mGV*6SM#dO#vHI%9u<7B*t0$?yr)24y_Sz)Y7XG@rt7UZ78axEc zkBg{*;Mlv9>;TZpiIr>fZao6vhwP%Jx3-Zm?wa)rdtb(jU z4A%a&`wgG1tsptgiUuEdh>CI)@n@?oYIo~WXeBHEK0X^s6a#F8!!#)%%slxky|i9s zd2zb}{S#8d>Mn~S4y3G-o`)E-_WSaLLx`iNwY9Oa^EGx)PJ4U*4W5r_6vanuP_!)Wa09~P3zhsu5Ap-(VMjUGz8yibYhgX`9k9%dNVN6|I zTy%7F6ck1^AuEfEydmItb7y;j-td(E!LWSci1?8Dn6y%B8An6YAFki!A>|m*=IVmB zQhqw7z#cPwEG%*o@`{ zzZNCmsr7jKM|@_c=XF68w6G9*ymB+Jm=|QURT&mWSRd)SmJ!w%R|r)#mGpFUjDV&z zrl+Ty{JSZveYyiRq`$sRI<2CSp`o-8laL|!rKrtoXlVBR?c!!@;-?g8hUpB(&e)1nbJOEcfhzKhBURaJQp-npNQ-R$cCKY1aw4w;ZzzM%Lu~8m3T==VAbf zf3h103y__TMi{jt__8-Xi6s=1@dm8%gLR!Dub645kJT#qn0I^g_k)b+(-SsAN7vmp zZ$zhQ1TtOIUTw^3$O8;l&*R^{HWg{KycW`;&H=~#6RSYTTEfNdq zwPfIuzBeMGQ@k)q#aR_W$@He2!3%=mKYDNfVMdFh?VBklG~SxmS6<-Yx)@LHWYl^e z;O)WrpoLNEcPCNko0%#vOJ*-jB6gtfi|5U>v~nI)ugbaZi$AQwhpo@^!kaI+`B|C5 zp}uc4?Wp$0QJc z!-Cb-DIWD41LP(9HIisB5x`-pZ_vxm4NjR>{I>k`1KQckt9MrM)$J`+E*QI6fVU9l z?q~CI2^}POh&VIB2@Q~{mfXxMg8*p5bYxGb9u?{xd}+uK(*B7oCl?wPW-Tv25<|kX zMMp!^S60FF5mHxgcz4@?0~ui{Z-)V#Q&-DtD(M+Z(;S^19v&UVa-1K2!Y8g7*RSjX zT2_zh@^MvtQ7^H>OVVIZeQOs&MZJ`fi4gLA6EQDzs3|rlWEovw=lQy+5fKp)nC=<~ z#;C^|_yAy~*xV`o5Y^w$ry5B+USSo}(AqGTFnD!$6&)27;sPI3A;vBL-*!^?5a%0e z@`^qO*@?;g2i!DLp1JveEwG9PskNVe+*qty#6ixjg8#D=tr=l*^2DjEOk`ofFY@+S ze??{{=GlbpX@X{`Tf@oR-X9l+Z>HpR&FF%BD15ExDw-NP3DDAX`s=#4JxT9OIOk9Q z?N1omb*j-B5Tf~SW#?Ur%J9S>P;3Y(5fLopeU8x9j|7zD6>?7sFmpn z2?>XXmRm8%>{S7oplEPsb3D%g<$tmML@$KOvcx=uHhdnLFA)Na0CNiqn76Z39S3Ju zEnPyIFi9zCo|zvB?!+#vESj46w16*d{T>!4#7LsV@K;!vu8xjcS`eDcd#pHJBMsa= zbE@1k5O8r}*4+3!KEo;fgd#0KnTz*XwIh8Cv1%^N=XubCqZvehl#;p$LCO4PV0q$R$gCBwTx}>iyW+sFBUtDei?}f5_Bk&~hb?dmQ&gaFRzj*!T7K$xQEvv!e>V^oV{o>sxNu8KSt@M{W(Dm!Jdp^%-W6 z=yBYU+~jzBG!C3>%#}oRrf7gQI(A)e<-Q2=(*BJu^r<( zC1=Ge^;`E3wq_3!Ap;1whf7+i)fHlN%4}@LMn-I$=0EU_3U2QhMpaH8VN$Ccyrn;3 zmvRsWKj%b41n|Q+g!z9c|1dWHdvtoHp{*@0CAhI;iezk7x9s9=uI_$%y0m+XVQ$|+ z@+({JdKzhHQ%XjX#$c5mLfVxJRwpL0BZ-^KUS3(Vw6y&t(?_sP?E+#LzH(jaVP#gr z1)XL1gC~ACTz3%TlL9$-#hL@Sxa;dRYcyyfE=~r_tcLeNRlHw0Qv5QswEwu>2b<2; zA08eO5fP=Prp^b7m;Gik2Rzp#bPK-qBjV+nd-SeN($jVRH1SY!pXyRG6-Qt0Zzycr zdwA9`ObtuB9@#N4-6jj9MH<-K!#qa=|4{LeD^;6Nq=*5Fn1A^dzCj)LmkK`d`1shw z|B4B;<@oQwg5Bq;0%(buv=7Rp9uAR^loW+DH#fhdv$M0ae|0?HPC%JZGZZT4sk@fz zc(qATwO}eI2apac8VDbXWM3OA(8=~+4wiB78Vm+6I1|SqcT84a4wW1=Jv=ZbI>St% zERk*IN!VVXqqw-bl9Le=_7I<*lK4}hJJn7QrSQ{2NYl05+??IroW99`j%=)XKSpJh zfFlUsZ9Kj)r^e|U4d;WEmex@3L%773P{JFenH5183=7Zy$JALzMftpcU!?>IC8d>G z1PN)DMgf;tLPEM*LfEAn5s_wTSURMYZlqbdJ4Cu+>3(+oe4lfE_gVH2&ceB8<~`T- zdS5ep59p=3I-A7G)Eh8QN84V18&Xn&X#c8L)znh4A<5kMD=aC9`HYYdd*Y!!$m*8B z)|2*Wm({Ipk`eV>@_K&8fzLSiwAU)Jp+AR$CHBb8^8mm>#ewW(i>&;2uCt5HAi&5_ z%a7#Ev8O!Vmy~9wANJOfFS#BHwzgOP3QM~ndaJc}H2nOjygchwzr+t`6ZPwcZ#5w} zedurY3QNkU^kv8~idmHtafD@tW1Vc!oAkt~94B7RS^dPwmCZPi$Qn`}Ze2P|p%kvv zq~2@)c9lR+b66|uX8BNfy(9D9J>|`$f+Y_FJpG--HQv>-r9q%G>;qq7P>^dkqMAzan?MT;@0YW@V#1Nu z=dTX3f6kwNlC8~l@R1z(h^POMPtf1MhYE`)lfq%1;zfei$i~vEp^y&>GSlk(9FK+u zZe}Ph<@6u(&4#i>^d9yqzj2^DjC5$-Wo7!3cBQ;fB2@C;k02&Lc&LUT?{umSR3I($ zT1OvVVorQCJzkuWKw-XX^Dt7&){=tXA^J1_FxQ)xFJEwfdmhlNnL58f(ctN!t*woX zb%9TGc78&nPe6Edc2-)-I$5xG{uM@U-igJ7>yzgZEEm978vNz!^YM*h7I$93rNy+| zkuCOn3D1Lvi<(Y!HXAM05eH4acR~oIUoauT&$@G;XE~#hPi^pf!0Zo2Pl23PEc%)p@;zKe0NoB078fF&`yjjH_tf%ri6ZZb; z?DsNMkORy9JzCyMF@tzaio9TD=uf}fZT!iGhmU)F<^tE%aXC5RWbapFSANV}qV6<7 zWB9)LJPKU;O~7DndVWw*SOCB-9K((b?bFkPcbbe~0beaF97lfp$|Y>u*Izk7lFL?> z6J~1r1o$d`U+D5;&72t#nK-i|;(7fU^a^rT90#US$|-3OU_@1Ep%d|{sWmPJkxo~ zK}6q@m@);mxs2C{w(1)@ulz=5?5NhW+&DV#MYQB`zz5GU-Q=SpdY(jV5U_qx8XO#K z6#K_k6IfSSX;uJ3*=as1WfPOET(DYpCC#_S9PsEvc}>9a@p16iubW<4RP%9pPmH0& zvmwCC8{QW5F`#EhM@J_oPR`Du-|wG2s5)vrHq_tHE8`s&kbu;phPfv}hNuEA^uqQkVn{S#*rJ-nQIDR2YMLly`xl;7Q z<@|)tI^u{dpfOx{p3%@-Vyjrx+cTi7=|W3(-}`#U*0`(h?)0FiMqIJ^_R(bzeIgW@ z=u`8OV`4SPm6FY2M=~0_p{M)4VI7<`x=ljc(Jc>XMG^;uj76$@&S9TL8{W~!c;2d8 zOp^Dscz-6+?0&g9qC$ft0R0_?l1F7*Mz>&V zN(rog7DP}4OQR#K2*6$U&J>)iIrn3lopqWYsIBFGNI}(2qzadnn7I)V739E!e-uxc9@e;fCm^FS|2-`0u zd>h!557btI@{mA?n-6E|>yrqkme)^TtWyxvEsZR!%=eT6sJzv5EbO!g2N$I_Pp1Ve zMzWUghU&URI+-2w{2xC2Rbww)S1-*aE+NLWAXXcfjH^`d&H-d*9-vun?Ot45_JGua z^ReM4$Dd>N-p5ke$>>)U6&0nI5qa^So}C6e@IW<~sj31%q{O5qlc1&`aPuP|?vm8? z#al2ZXK5*?yKoI-c3EA0{mk54jbJPtoK?+!$={<)RwgIklIQg5Lh|^=TZ{lmwwY6t zzw%vMI;kejK)L0wjtSv&6R{O<>km}K&pHnZeETiSr7@{!%|fY7)9T9J#!8NZg zajHG)^6*IBW=bE*?*ojDjg@2_Jy0cbc87A{6llaoKd^0{i7 zfUO72DeN6;fPrWURlt&&y3TFe4b90Dyf_ah8x{`6_Q8g6CUM-lhS)CoiriPHOz?><`jAsne3K}BO6uQ}}$218zUZRfmWgQuhf zX|>-if0lDqHn9OhLbWN6Hg;Ce3c&XCJ%MlAr2wt6g4G=&YH!r*elZs`X;D0-`DANb z!>(<&zrEpT08f5yIyUy{pvS@z3onlC++GRt?$3JH_U(SZ2ZU!z6c_>wY21S%*$)J( zv{EA$_vGm}nY^g4<_)9hZ!4NvB6q)sxW(Q4Wha8fe2!;E_LV&wbS35awJgyr?Q>1g zq;A$UXz#m00}mr&k+@Fvuw6UpTRkJcJRgFk+J=F*p&fe?J(l@T== z%yMB|_n|&69Xfy%cEl53qpKMTNOQ|ex_iWp`~7#f+fjAT?hde6F3?@%3U}Qj+zBBl zt~lCW6%VxLOT+GZ7T3d3PlZ4N5i>{OM0)Z7g^C`zCG)GHgcI==al4U9BK7r5djrQgEmrlap6C9rN(; z43?72hyV+UOXlK=4`^x3Ha5UYVx+1M4gQ`}C1(&g<{d8Wo+Kh@Fx`#a`2qJ4mv}jR z{Nr{Z%;scqmzVCq0mSg;J9F*jkkm`jN7IUKgd((DP6I z<`#Gp9TQ*KGK3$-lWC3ZhFEVZ=i#NIrjl3aThB|fI?Lkt>|^|t~8Lv^*OIlIIw70?|>p zzy_3|@k3YF#~$|H+}u=T!*(C6WwSJ>(dEJ(9H;GV`fU$xuMQ3lq8xn@Z1|Iv=)-FbDk@4!Sl7lrnt;$=_IWYA z^8+H%?=BIdO^q?c4j+lcATDzawGl@R1-BCdRsPEX;5JJKgU{M}pJJsyU-8$}X7x@k zN;R_lAq>}Bp5~j-8jG^R=|(nY5i4`K#_6aoOxEujm&Jrf241V3+wR1T6vsE($bKttowYs&M>j(gDwP+W}AeXQ4gHV$NqY55p@$!dJ8OXTfwi#R)$27kM`J+}T?Q^7oyp5y`Zs<=?S59V6 zlv<^~KjvH*U7=X@0ds zn!;#La*$`Ku#AgKh)YONRu213QHa~Br@{&oc(ZQNF*aesgX5n=`!^*BVPc=J(at$2 z(q+I}OPVl)Y-}1VnX>ZmX2{^=;F?+#Nl)4Wxy+wE`n|S{0G^w1u}Z4|xUymF?CgBC zMY&+4TVr{7IZB@tuhT_~V1BvauFg(>FbfNd06#x2WTKSF^P|l&yt(txVziCPfiT;vC#Ot`R6GaB~YNvVRIMi^0^6myxlaLd~+jm=P$K> z@nG@8ikDke{nbTnL&E~cV1m7a3qeGi!BiHbf`UA9pA<7#CXulr?bw;72!>($fzCj@ z#@@iz!ES$d`%SPqboo?3+ir*!esXy91n+R54i1lo&dqh>%tpo0VU*>JewTM_@94NN z7H=u6pPX7sH}#as7oLgjE$wCw;Ig#H(NI_K>H^f()+LaeQHFo*oH)%md~Zl!w%cF1 z9zPj1tkTz0s>2wf+|^UsGnX2!@%NsMWNcl_a0EG9mGL}7n(OA}ughwen0$)rG~ z{>}OOc1*Stq-A1KlHtXZzbEAu)@LVkgKhYiTNM4vCgN66-|4)tl2e#mBv=UVWqod; z>wXf~jU)SVd0H(B>;1S-tKY3o9Po~*v>ZRWTn|nZu5`pKg#Ga@m9SLPn7!@UJhnw1 zbG^yCj9vl=EWP1d6r-h0rDCDK5?kp@pF}mBeTi}D?(whdG=oYbKWyLgbX3v{6T10k z_Ac6weU*ai4Ha}^riU=Agd@iHnlE*Hk;H3`FKSeAU1;h0Iqy8K7QW8ukt@kHJr5`L z==qL=BqKC}i@M1NUcYY#9&>sw1S7P}dF>p@#>Tdfw9Lz;hOIYQai0@f$ zXEA>q>Wh^SYi0;AXfcVnDUf&x^2g3iRi}t5yJaNlVV#x163|JNHMkN%uANiD-l`wQ z(Gy;`qVD^a_17hxo^BWO{j#ehm|xJF)RACWh3h6W;us_Qz@cZTMe*+Po|*ni-)U{` zYdr&j-b10Fd$$m;L)Y*ncd7Gj*Q5ncYQBV)7dB+>YjcOONj}Ir41UfUFWBZX!E9n+ zv$R}lRMa2(r;ls)c6YzP0^L5R`A!N702>A~v$IWo?Bg?V861ki0agAD{;J~gfGw}7 z`uh4%C^F!plmf*g0slS805?cFncd9W8=jYzbF5E9NVthaz+fcfh>iGyIvHhpdSBoB z-@hg4>C-F6-QwI6mF@W4uddn{7xo5p!r6FRes@#68(10|a`;(RRFQxqqi+|^5?C54 zh*!hd_9!R-6gV<1$cJ5ulX7`=g^hz#!i76@>&;cPX>S4KZMNoqo&xkVUU}eq@8>63 zJECT2Ep$v>VBlc2wNLaIA8CGQZ)e|3POYmGi!0MD50$qdSEuSI-Z?oxI(jJZu`%BSSSJNL;jccAs+1htUy2=uG;D{trx=ut+!I!!t*fmT) z#C>m7xur+Z@fNuhrPX3?Q)DEa=(E){JN}JC)3V$&F}vxcrayhDEYXh_LXh#XqyKTx zq|fO=(n8CzsuLiBriac4x&VtnbiXk0jtV~$Tr!iV zH57lzV!=xJCEB2U$)|l>O}6+uu6H5fAP{B5o>_qD56l<-pIZS?0# zgL_^()LvMVJI7}s zX?!=%Hqki)4QDY~{0%WUFAV;mQZ%vJUrgrKxm7vqTtYr;om&bF{FRe6I@Nu==}2Tq z-6L{mOGLu58Xze4DZ{7m6%3p97-w;OPO;8A&TKTSg0^4>)I}M3}eMhW6iuC-v`@g0Rw`ytS#INj; z6+`rY8&=#U9k{Kkr~)5Wj50oUibmHq1ZvrfU`93>pI+D-#b&@5q8~$?tgUe&YA>Gp zfde)PP}jfn3Rsw#M;`WC7Quvtg^h|;vg5#`m!%o7KaD?NJ-VT5P*ulwX1dNLQjsl9 zj6FL6Iw1S*sOR)7;Vb9&AzrKJ6R>%~&1>$*uQza3*OYB@7{Y9>_~!9Ukow5EqwSZE z0~$4;#EoGSh=m1xpk!U=s+rgXC{x8M7v}BlJu@?76p%0uQpgsio}W+yjE# z0k1wiT|HgBh{6Tdx4b3oc7Uwnx;eky^WYH2eH`$jM??W&Z8Kg0#QkfL3zN=#O6uU{ zMFVlNvii}|(o$ZIq}*OD(XE;OQwoJbKYaMWr}cPq_3ElV7d*NK(*%OTiJ`<&Pci?! zR>Q|ZQ9KIpoIZdyJf{HlMng+WOGk$d|72zL4P}j6^$S$RN6fTPZWswtfWPM8fTyNb zj)Sc5pEGYW1-y9t@70r13VSd>COsDPvrhW=)aC=`&AF~F>>o6!-)%GmfFr`g{lSFz z_?4BF!&ahG1F0gC*017Fp})Z^W*rYPFaS?X^rK3MkN?f8jRv5v)vE9u)PG_{`QK1g zz%$JM-LHWI+ze#|0)AnjGzamEnE;_CqeZ%&o*v4&zwNJGF57S{(Jz$B@ilt@lg#S5V+`W>v8U!Ww`85-zs#9#Wh}C zx!3n)s@e_t_VL}7E=Y@Z%lZX-8{ncCyCj9~Wm9<0F&*U=vn8xnUf{hehVyEYah9fb z0_Q-?zQ?+Q@%N7`VH!OkUuw#Iv0Lixmn5QDs$wcD<)4rxM6a;2>zBNOZ*F9okeiw9 zqxg~N0YeV@Z!b@WLV1z_n3lzRBE zlQ9WUJzIdD_=T_s{~C~j#;@sy@uVrjG7lKVqD(|JJt^%zNy-5%vN^QzVrn%=;>G=? z`GVt6Zj7y;!em0!{V~xh$$g;L9(|AHU96t-R4)@zrK5AW+g*&;VM}!6{j*_sH&59D2dm%G4iqU&}M6 z-@)3K=}!9$G2u+T?ZH&lqH;WCF>nH}S(J97Tr0t8si`X2m>)0JF@!dkI%)Z!L7 zY}neewn0hh_V$*apFe)Yjk5r@k(U-05|W7#tByY681qppYI=`1l$T3G)n1cV06_`L zI@>vGn@p*UwBI}PsZly0kZlAvA12IpnaF@xF2_CjJWc~6O=bk@khE%PpbPz+(&xKF zPd^nk_P=pu>Nwp%@gfzq0^&VA?$4L>zBSEdt-rxyO=LYEZLA9m3Q}*Trh2rN%7C$A zALR~ic#)kg3>w0#1}`rsgAqe5Ka4_?*%1o9MK+v_9Ar7UF*k=FR`b(&_Y}bALH0Rp z={JWY-!DOSQM8w9T9w!fZwcl;GIROHPv1%gCHbLsJB|p260b%~fW*@!xVcpf4T-kT zJvPmZjhE|ybrlt+l;OeHtCDzbvWn&CQLCiW?0&TV@Ih3N|){x!^SZ-p~)q<+6xvrU9~;q$FJEFW@WU5EXQs zStRx|rrmqSEi&A7yXP#R@(QslWX;MPG@S26P~utH>6VTY31qaWm$vCg5Qq3>C{zmwFQX@G@irED!N^y-N z_PRG$*QuPNo~Eqi3uSAyC^sKHZ2uTZp00;Z8c?JjTu)nD`{PF=sFRzUo1v8zOcVGxAM8>}@VX8)X$t&&KwvJqu5Gn#Qlc=Qe zt1@2&oxZSmf87n1q~9gEpnRed4xW^?1)&L$0mbF$b&uPSb%9Z8((bIPantylTkOlt z1|?_4ulYg=jqi}BzGm^Ef5*O~l4fHzBt~BxrNPHk&)4qm#KXH7$wRIA=!QYV^)oZt z+`R<_1<}#Z#M6gXjtYy4R#sMqIMW;5ATdZ*bh>6|W6J;zBXV<@ix8#50t)aiT}A!B z>;51?XgrDEQz~aI1XyvAEzG){QnTvC{*KJ_OH3fi=bco*pdD+5UIFf30 z%U8kRrf9)?W=!!Tfr}*k9V)b_0Jug$$=<{__7)b{VZ>-8c?>BpD0ubi6|UJ~0hAb( z195S2gMxzolt^a|s{xpaL)6*CicoX51QJ8VEWUyg(Gc#PK*yGO485Gq6DuKF*nsQA z^=LQIV@|xDNQt+1N3K0wEuZ=$URta6JDQn3BY7E2Oy8ym9|(U_sTq^*9qn}-NF|{9 z_yohgAuM7+B{fNvDr) zb2a{(&~2>OiGCMXOQhH70e(2MM_{MF)_T$(2~>W|8@i*s+<$Tv;vdY$PxT(eQd?5q zaA!>}!3OTxxQ{{QbU5<)+kba{@B)oXR%al`H{3kKh?Nyn$I8G!3=|x3renrs&j2`} zF`VhUJ3D>-{g@<;pI5M|Z1mvM1qhuYEanaD%8ytIZ<#Dp%p z{x5)RY(o0mx-LOHBJ$*U-xQr@BCX0|(@hb*DN}z$~0C7``U?CwPadB}ZBqSiV zq22WCY!(poum69*P$TGIjf6?|_LMby+%55IO*qdXv%Psb1viIT{sByys*dbRT@H9~ zXlU%R)X1HWifGeJSC{&6MjTk2t#+pl2nuXa%dXTD*H%}@)Q}8U2TV;)3J41R8%LK* zrXma~UnW-rT1V#2q zDJd8&7;qYDYHCW#+ov3_r5T?x#Ay6})iwIYoku4iay z33alu=~Y8BW*QhUgzZ{2j_Bypw&> zV8kY|KA`>MC}iA9#}h%3F z5x=!Er#RSNI~U&M-Byz5Ty>)Q+D^Vqza=^?xwfJTIUVl#m8Gq%t+4M28Pc+j^g{vv z>cXqXc<6pSKR$j!h_}6G<@IUGbg}4A)f1OotIVK~)V3|Vc{Yp?%wD?-nmVk_4+?D2zi05`ZkIX%!gHM$nsx0xGr?^J z>q}4gSwfXhN9xEdwQ3HBe-BJ(_k}~(!2>p*N*fDEXf9nmZjSu>|C%ZF8&7QKU+<|} z@{uQKO*;y`5iEORnMa+hBkJuXR9*dKEHGhaXPv;Jtjl7$kK!y@@Sut%I!I36+10tU z;PnatAy%;5?Ck7-^09Jg7CmXuyHs*o_6ZGW_!P%u!Y4JZjwi>bvESB@n8VSN&_@;o z4~+n;!PQwwGb~J z(^D6_PsMGFaQy`@@kn?Z5cme`3=^lI!L=;A32NpRmDs(&ISIPke7>upX+S7aT~)0Z z7AeU~k&xhwCr?8|+a$KY-uJzxGvzQtEq9-Ob*ZSRsI=7nN7>HyCqsir={!ervi2Q- zK(K5O4!^*-wFba3xhN|p#$30;o+e31@+pXnTPvvvtT%@3@I)Yr|;&e9z?Sdzt6bVd-S=5_V{O$Lf| zaAM7-K1YCcWoo{U9I7c42(9`U`Dk`r0<>r`?ANTz9Rh>JS zvy_}@?n@B%YYwh2va&jK#=f2evBC^&v&hH8gW(fco7AT)qvMNfTU(T#jIp%AVidnV z-CLO0*twVP-!Y64%os~LT767BfbEk#C#Is>F5-`g`EEnFQ4@^QkgtsMGE;RV^Q9D3 zII_}eDT@^dWD@$eNndXTtB_v$oiVqC%Yu>DjtkybX9HcOkm}=VyZ8`z$4U`$;Syt|xO&j+0RJNc3{ilZy5g-e#XW7Z;byOW_93 zhF3FnE@x+HboQrJadN?)vL^K=4n!JEfO%p(i+%p;Wd5Ux)>i-1aHXXv?&E-AKmR+r zx*Jv&VcPxKS*Kaul;k;}-5>H`XEEU8D@l0txIk6w=SR2tocrPskHAl^%06E2OU8_N z$TZbwg@s60S@ccHFibqG%0z@g*G}f!dpDB4f^{;EX|=^P!-xg_E$fk^z^sd1nqd%3 zc2L~OEvvtW>+kfP%V%S9!+x|lcS>M6*ZqsVUd< zef^>l#1jZI;Gw+GV}AKUG@F!^l%Qg=qgK6_lc#5jzBsN@t}F^D%D1F{{Ez;Ez*m<- zs0^y>P5CDB8(Cb!9QP9@`cV+o_xuycUJkohY#dmis%mn4(#3_Zth8i+qx1p`Q(P0k zk4;QM;XoIC^2x4H*Fa}?<0zhjyrX|ylc%b2>+d=_C0%9HFUfvh@dHw_$;nB4f+N)X z*Y5m*z(_4@oH`YqIYf|%YdK6g;w)knsWnijt#43UUEf$=ZJ_xnZzmm2 z*RU!xMjdt>+Lu&w+`p3fGOt^vT+E@&DBHmMg;w6eU@*JGRv5?~%cps94EDBiGx68d zhnQo$Oe<%Z-!3~CjHX6i3wz-#frS6-%J4YwBO^1sphsab1LCh>2qt1&+6>H;>^=b2 zBmZ2mQ{BAh`TmHN=H%%We^`#vGDhq_ycp61 z)MzSG5XZ+R7`lG}FA{aG_}H6G70k?h-}dyEY9;@mNS_Up)bP#@3}kEwEQ@qiT3e_S zmd)rQpVZS^V35WToC42H&djBI<_{ldB7WrqwP$7tT%CA`BZ$mJf}N@fA|fKd5kwKb zFZ6v!*;!^|_^K=Cgn^e=ZswNx2MDHwIopO`RTyW;BcGoMW(V8?%#6cJolX#92oIBx z3X_g7M>)6BFo<>Zm9mz7A%F7kA3MvLcYTq%r~io0As$>>T>No+wWp`&&!0cPe@mL0 zntFNNU;!_u*I<#Oh_*KALbTje8gl>J1ev+^ujOUIVEfYkW^(v^0()6kSL^3SQL$e6 zP!#+%CPHH)r$BXT3lhKk2DlE7PEDEl_%Gwte2j8ox(#wPI5@0?L{AD@v=(M3UDif` z)|`KHm;q876DWvBsbz6-adxs$lSX`GO-GNUlPS*+W|6}@pr~A^{#{|8EG5xqk$uFe z>}?Q`v1Yit?`XP>vaAd65L7ml)5Eh%Yf*x9IYb`v$QwY9aeVS^uB zy#s>&&A>mUlCrYc)9m9`xiGbY6FoTQYbbGoGPcHc+CVL1Bo4q7B9@7Qe_4l-U?DXPtfXN%!ZfGo<3z9sDfE7&X`6YWWJ zb9l7LC!5pjVc_+p^xdoP+5pd4YN!tX2{}VZPD@LA_YQBq)XSd_Pdsq0MJNo5NUF}j z) zc*8+T^|?Ze@Q->p@XDGBCG;sqGNw;@9=@@&1g1WEZo?PzI>@lRYOgrmn)L>;HvZ+knvyJH;}2d0*0wkA+*nW(CQ z@;aJ&dL9Qf;-{VS7Yz>bfPi^1PJO$sQJ z6uY*W_^AKY#gaD7qFO@b3qI=To4<16jQ)k4jYZV63y8L_|qWg{wr7<9zChc;+%b#H~5+H-)7fcc+Q zZACj>oo%L%)bIm5HaYa_5+3HGVZ_nV=V6d|`p}w_f`Wn+Mk|gs95W4N?_>*91JK)S zMs{HX0|P3w>h+C{_ykWw-VHyuBAx&VXg%gj8FbAB;%5BIbI%U7>zJd@PEW(b38gn2 zy|Vs9hPCPE-artG$XW=RaUmN zq}ZLC8xvzsw8(drR!yfYFndz1|IDr}USD4y<(bt&+^o#-zjt+i<+I5%eNIW8Pi?Ew zZ_*AI%RBn{Sxydz#^r6LY=T!?%V{{ral}n%S==YrvdF$Yk@lPU6B*AvF$=En#oyF4 zpKKij)8E(JSfwwV2QZYhVtOBqj|(+_Mb{VvRRPx9peUX?J#d2ZsNPF;fJ{Gr%IU;} z#y`rHm6Hqp`V|%9G&IPj>3d#$d}$k-Fb)#9UabRa>+7S!p|y1gp^Cko-9OWMeSHn_ zBc4SU-ep&$(Ddsb0Xemn2XP5E7*>qJ;|o}3a3I> z6jFDXes41o?Bo5#zN-H9OA6}b7x7=TD6yP)wgv_Uii-W_D0UkG zvBSe6BbAkv9c*pi{-65D9W+LE#Tcr_0@L1J9UUFLxoK2kO-)XIgkIRig75C^u)lis zkN}h3OAT%o9)swNxvDxIYcnG#_^Ax*g2l$F zYikRmvO*jR3Zmbe<-+{pz@t{8pGu#4)&J99C5#!fo_RATA~G@~yXhuk*a6)+HBUs6 z6^Tv_v0+<1sm~Si$8`40Ma#aOA@hP;#h;;@OadiVCq&=8vAsPZse_Y~lb2WOwwbfD zvxy1AX{$31D}64^QVxK|Gb&{e2zUGuKk6P-W(Nk8sG{UpU{c2!(R@@yCpo)bT7|Ix zpNJHAxrIKe>CDd0U*w3`@6*J_$GcSW_eHvJEfRY~Ficlgn%UW{@mIUte;k<}jgL-> zi%N`2OVdW~<{nYsS>hA8U*^-K(@9CA2kkv=43`9xDD>lY&bStYoAu*|OeZPKp z-Lym|bob7)HfNzLu$IhmktkWC3+2B);uGTl>&nZ^YiorhB)FbF&dbYVVPTO3;9z54 zU0w0;@}idm*6JwV4pK4iN{7cxpn8E{M1-1(}@ z)}35zN-``YB_}P;&G9Eb7G;>5@h>$q*XMilrfWBM3}oIwGB&2ap#S7pdS|eQ=klkAZPBKtIHUu0#2FtM!Sa3;c)XmEn(cbR4jsvzh7 z0*j5$uov8*rpIq(#E8D*uOB`p-6VE59ZOqmMu6UQd|6;Xhva_l`QQmq(Ksv~h)ah9 z1mUovl3M{dA}q`gZH3y}+EN4^nqAPL!1@d{jHs-vjEEo{204EG;bCXDR}7Z^Py!is zg2ep)Rr5zVJlakc@$f(lksLDGXXT<299o4Hq3r#px@Yp8xS#467DH<3Ol|v~flsXQ zb22Jv+})j}Lq-gy}H8;@e^BTwJs; zGduifTApe}`R9P2w`F&G*<5pcxVN`3W7x5FZ+V?nBG#XHQlNTNsi|qcu(0rLTcVn) z;8a`?;x6;opD2~uovp1!$1-^)53AYj@{j8jPf>tJ?YiUPDQD^Ujw#rbnvSaW7h7s- z8ew?7O=%}T7r;}ld_+vtx^z|ELe}Q3DXgLaXZ}^clCGXU$E%_oB_*)Dm2F8Jdu-BW z&`EU6-?o$fPagd8c)W?W<}YN-H5|`%Vp}H6$G1+6)@2dItNOp8|an#mg&vpFgFdBBrUW0SxqVA;rY&7j>BXCHnm) z67*Ae7&HvjL|3`}{ryous0rW*Y)C7DS*|pw!7=~5cw_Mc{AglgVr*;-T@WjN&y=+# zEs5S@H4FlxSF$7n8&D}~9KDv?U0zW`?{$jJ%g@)LRnH+V6u&`E)~>HR$L^FHvz?P3 znXTrIWQ9XqT()hBf;pu>JGE__wUz9^NU|0B6kK<72Hpm1Szy7a!mCsIoSn|U$mIn$ za6ph6BUg{S`~+Rk8$3Mf>V>%QE)J#A(%^RO%U^=AwxK%6!(exP&jeU#Q4`#5aSzgo zI4ZZQs46L`$+z{@!l%DpX#ZfrNVue9=+^*mjJ~MV<)1K@!{G^Ref})vL9Q_6k)x}t z!#$ZZ#?^IwIQH%2Sv9b8LpsvNmynlPhn%U9C z$e5vxW4Ffr{e8eFXp(j7!5TmBE)qnw#4j#R2PvvFC#lq$T_z!DtD(e=bwB4&HaH+gmv|uq5xn5-?P=hrA z(xM3VzXR76P1=m%$rl)TxVxe9U_)J9U_skLPOYORfKgg(bDv#T5DtnBIOIqQ?1{8^C7>-Wj#+NDRJs*s?eR}H>8;TfD}+hg~` zgN4|Sy4?F5Ua2RJo7c6yIyo7i3kIVw6^vfaRfX>!9N?UqCMcKVG8;Ca zSJK17!iLvieSLky*oClRHlQS8J4XY(8xp1bzU|fZyzoHAiY~{>^zEEQqham}&GBL| z_GQB`q7-(l;PcX06PV=4o+?H)0U~nke(6&-v%+_jq?n=VDFT+3_Oh|D(b3WQnuKg{ zNB!BA@W=v%V0B_gQd%vqhM%E5`*sCDB^imlQ%@& z%tcev$f_e7;^gBUTAJKQMV1s3^N0Y|p5V#6+7HMm@Bbc-7w1Ph z$ZijGL%JO`u$(#V?dkUIYbr()*0D~sjZ7*n*0C?@K1P7M^31<{#YC9JtiI0MyjW)F zLzH^T0m>Xd;UOy^R9MYDXda$Y1`I?mJnT^f&yfhjbnpLN|;fZFH zq=SQ23=IIS-#DN#`r;wVf~X9UJx!{xJ5Zsl@Ps#0kUP0&dR$RT%2-OOStq~flNEpW zkI&ffFGORL`*b350CsreXO3ZcfWH2&o1TR_ID2A&vm{IIse}FR{FBAj<(oDJ2m{{b z9c(j)Kd`-hjf`x9e?mGlqoDy%^RuJ%S>a ziq|?9;}H@Jz4r_QM}P+|E^sh$uJDPDPG@nRa6n~0Sj)r(ifuT$rif=vrnF^cNlQQa zW1S^~(?A@WWyQ*HPNG>&7*;DJQdu+Kt|f%V7VJ$XBeHOuFee8GWwtnZCSva1(^F_6 zj8CiQhmi4<_qIcR?$WOS5`qmi4!^lx{BA5pmIJN1lk43W*Q;P>TLrjT z&=L6GhSm(RhY!_8+DxG_T~?>3N92Qwn^3Agi~Nms17kKP8~b97S8)p%?chO93;1jQ z(L01N%h$+YTLse+wOk1Aj+u+a?9p=TpUs>U00|YVgvi#a710&Z@hm7s#J%R+r9*9| zROkxlZJSUdQ6 z$Yh`#ARn0(_Jp&!_1(UvM!PULobc(f;_L?r{-qy<4nKcY480HM9|~r!QsRgh95k0n zqM%THl$FKU{?=tc0KItmVyFbYRbv>viaY#!Dhu{o8?N~Ny_KC^(DwTJ`fE8rCTN(O z`@f7fH8?z-7@D77Qc{BI=RjfoZwU$cRzbMiJfh;utLqk;?{xtHfUBz@4vyR~;u6G( z)>iXe)JqZp43>g=o_uZTQ4c7;F=&yPo}<0$klNvb&WGdgyW zU{3OPax%~PyYa%s*#Si0hY?$d;=h&0r>CRIfU>k#<(8ojs{Ai5uDZGm04x~IjsL6B zNX=B&)JQG;Kv&_1$6@`A=?Fx0^s{=ea+HPVJ6s<~QO<<@+mA$r-t%s2Vi#% zWYyKxgaKQ9>FKq)ZIg=X}p|_=B}rYxceOzTy|xy*IPFTPlo_UHtM@+9BZY)JrcAyUEJt zhQ>72$X(Xd^x`1%bMH1^vOHZ>dR%I1T%6_`bv_;*JxvEL5fKmVl3c;)8#M8$ogH(d zsI0-1x#+=#`vVi10halc$!~agN_lwZ<|qn#j==}--_fQ}B_;Z9Q*Cyx$CtD$hHfN_ zxE#!%4G-+ZYd2z63F(xUBDAdIcW6vZ&3NUE2~ym^61H+Bl3^L^BTftcO)*y!6EE4EMAE@%g9@(%d=vxcU^vAt9c={S*p67myPZHTbtzeI1|Pi0)nRa z9(+x+;`xD)k`)7eciBLR_kTMJ!9gB!vgm!*BGY6hl*yh)5IeAUgF3uQ+~ zN)C$7piHc17i)|Ge_p@Ro9b7M;IjJfbMjqtMSS`X3lQ{n8TRy!e8->>)WCq6@a(Ug zoPdb-mPmm&m@Zziu=~Se>vwYm-~-BJ>Uw&j{QMZg*vG!zfE<7KGjRiy!iG+g7||}x zg!|<`BgZ+#qY8+C(kAbYOZRiNh;}nk15<8rU3IryotxzKV`Q?BP-&Xz{C&^5nS0mY zny8K96Sbr4<=WZ$vc7$@zapk!SUxX-Ku+!&h$;e$dV6l}1v3JgqYkg= z=~31KOYWfGM|(|s_u%jB%uHHZnoX7GfzJBU_GCqqE{79wGTPlx=kFAOzK@qazBH`B zt8TS%dso*`w^7mmPDRx@#So~z*;x8Jlya>90C+$cte1BH+NciJP*-p7==dvzK3A|X zJD8_BG==%y9i{0}amlUW)@{y5>0HlNfT*ddS>0IL+S>a2(ggVk3Q%5|nVCRUQZB!D zBF<>iFN{}VW@bJ)J@u>OWM^mR;sTTxRe5>&ny0ooEgy0CAkQ)AACtMm37XasCb6&IO0-m^tsM_=H+Xk(ytXy3ayOss`_&{LrkRF3oHIZUg z*->Z5hOw0udjUd5M&|pSb?YYvPV>WyxBrbf?+A479fYiF7;)yv1hgxjrwuJNHK3(X zJ*=WLkFMz%`kmIwDA%4vMn-+vb=_EO%o)nl?E7Kuad`;_ADDS}_A^NBKGa`AVD1Lo z#GVwIx$sS`PSw$B{!J>!-=wZD&CJji{C$%L__MdS7Y2j*ssa8U4-c=byd3a@uQ}5_ z)$iUC>Dw@Nc0K|4^WoOQ0^_T?>S`R0@u?|)<^es1e)+ERB1+y@;Gay=MCfkp9pF%a zV92xu2|AdcKi}aarvFD6qrXIC$cExIS2i^pR6+c;u& zPEIzq-tkac!=Dvhy)ds_MhoJQr_*&_ahfA>q@)k7>!>pMhn~iizo-y?N>pC<3rM}z zt5`y~$Gl?GbvnHxZdXB}wKYc}2hFy1SJ>g3hz%>X8kvFIS9d#72i(#vEek!G-A;E2 z`!fQyjC}?E1peF5{ixC={q#3?+u?U3T^=zpnrbR7@E0_)O%VC>>qn$8oWJ`pKf`hT zi^OlJ2|BulvPv?KI7V-l3sXM_n`@J;wo%+HpKef5I-Q1yRRO<=XjAFr%pvy_MyQ{l< z<;qk&4GD4kydD%5DkM54m^^2~yGuv1wXqPJ8n?Z&PBXX5E7ZwLalDcl;1EXXeufPC z`TTZPHOaO)|8DSYs~o<9-v1ZBtcr-Vz)y*>$*EnZHa4C?rkk7ZuPqG^lZ-%Vqee$Z zwN+J(C?bLs7OI3TEMi{?jq5S|EyxUng@pwi{zdg+oUa-u(2^sA=S5n=*iSr*VDGq{ zfv(4$I|zcDoa_~PBWH1Q;kR#B5E@_p{9cx0etcMigxQYGN_NwoE({{{c`2Rrs=TJU+_GpHsbU)eYv72ZrQIog z%oV^!_36tzCnu~K^+_>}hq|KV#K1iGbYOqJuJ>k=0t%L^v0` z6V(QD?YPg;x8urT8j58h%r?E?oC&{$)JF#K``~JCIT6<%%qr@uNJWb(3IY;2Ed#A= z`$jsr_{MC_f2eq~8|vvOcJ*Rp>FFm1dJA%IBqszZs%TRkHF$~Ehb6ceC*DTBs`YVw z8CKmRbM5y;M$Y~d2H-PBZJydgio2B}<|c`NlHn*s+$%sli^Fjw9^O(D#+Je|#q!1y z76N_*1TckBfA_9zr>kY;$R+V~Qbh&PmfM6;y)HTV;K_-JMuXMWRSVBihr12wS1cr} z8z9p&DI#>CgxoYqGBPsZS4%rP@u{f;D4M;!Zpr(mYQ%K}wChQwp+z(v>Lkv|@Z zY`!#NV*1NLCG$U@n+Xbvh=}OwMivxw)os|n>u=_C=`46mynt0DW)@-LZu7I)XKo{c z+~bl>Z|7s!*VA8ldpBvYI0XjnZ{IdkGMeh^>-T)#Np0Z>>S)H8nXoIooGz zRhbTZ@@p6x_hx8#1S_RUz`($OB7a{_&ZBIw=9JP``aV{r-;DQ-D*9wB>FgiN;cySi zh%8=*yyBh_7{dJ0~tY?gTfG_#{T|bHtKIIx^DK4 zO{H5@6sd7(nc_mJc(rAm_6H~1n^p|6*BBllIfL2|fzut$(t}B{MnI0vJM*)Lf~a+2 z)=pKD#qYf>xyd(^b%m%?e#KQSE3=Y}AX(q&r+JL|V!IgMPg~oGG|iF>+I@LPnxFpr zLgB;&#a&q$Yyy6{2EiEm1obHH4-?gKoG7J81zdPQs=bXOU-wS>i zSxB>H{POkhIuCxaD+Vy3%Ckg(GBJemhj0~(Y<7&$(a^j@LPB=Z3{+!Dd=|}B?#unI z)0J7}2t>yU3Y6)m2p2$V2S_!ANXj7%paz^y2)2+9q_ z#5!^QmDDY~PSIJGol_r3Ua0w$lY@gtcp~t9i&9P%#pc$M>tXw^va&M$Bv3`!U{ll1 z%JEutb#?6UFdMb$OO>yhPJ}8#!osanm2Y%)5r(Qn)w&AU;#A}a_i&WNB<$PscU0Om9k^vlIxuCY>BNxZPksb~R z%iPKKWRgyWzMlTPy;>?YGTFi5w9=cuMS;dkP_A4nUsAB5E!!g$M}P91x3#1!kd@O40D%h~<&v2WLy4=N7R*I?Re*B7=92n!K+g=o=W)t(KfUEdJ;AA9$z~d}W zqO6$EXC7cPS7WpHX(OoN*2L-5?en-_Kl02gsc31f_$Y#yF~n~^0WyT?0gd~0zG&_$ z*-U5z4dvQX=1nxn8s5dZG%anUqGIz-bpG1!A9dD`M7{Hd$HpcM8lEuBya}pNh*)_e zWv@Qe5z8=yo}2d_BEj&OMx$H&NV(kI4j!xJfX`@OvcxDLFnqE9R93vu<5HjFh~c6$=3 zCUpzS3~stJ!@@K)yeLMXfT132MlMR5-g}h~&R<{soSe*9*HF`LWNB_$MVfxEo^EcH zfh64U#_4{Yg@c@n`ODb!s2W#?Uw(o+D;tg5AIt>jA|gaQ+zF2>$_c~MSd)!HFW!uY z^w9sLa0{pxPeZ)-JEOhZ?NV%EZ|9ayP`N{dbI@3lkc}ws3v6N5Ct*6NdIkoVRVis{ zxx%Q`LrE}znHm}zT#@Y#HupPAAH+U4ZDd(oTx?>&#lgv7toDq-bO|s8^y!NNV;&0f zr)7u{XdK1g8d2mC=767^pot)MZJPAIAplr8RH9pKT2JU1d4u}IH{NMDVuB=zB6w}uP>r0!^Fx~oF^>pc0MhZbXKO$L_tBt#?I*#*J9^nXJwsd{QjpwcV{3( zjJK<;M-0-R(6>Ek!5>lQNoH0vlXlxRkC`(pRc4 zR9}+B;t`wtCe|N~BSjAk=a!GB7wV&@2&4`|w%|#sqA*u{s?5ZE#=Uk^ySV)xu6odV z1x`-KZ4SHDd@IOxhug1TQ6Nk?L_OA1@@bJvF$+s2{yq2-=ELWQDppAaC}SS|ZxHMR zNwZH*JZ6Fh@(K#~!KYi}4?0k*2r2=q*QKWTOe+V=T^L}qp5&2IGnFQ2?1GKxTe$jY z4G!#Nch+Zrp=~aEYjs~)YOit_*9X4E~{=`+dyr=Bt+V*hD21k*l0i zW;I@-Q)(JPDRXXT-`xu3w;ZuiZ7|sUQ>gpPvH(#)uD|Uzh5y4$nZ;tU93e5%iiFf@ zW%!nEQ|IYNL=7SJ%^E`GYb4E@>{s3W@3YkfPALM}hgP*cDRTTadNt1YZ79M_%2c7_ z+jOPQdNkU7CTaS`#gNAxh~+iZkVMgJZH~!hl&*knVx_Ii*@Ce5!I5@WJD>R&_qPEo zFLxOqpQX=Rsz=A+Likj*57uG*MP@y{AU2&()KhTM~0r&K~ ztlB`T99CguU=xSYvoqIoPxU?=s4jAA=xg6pl>-J?&}J$RQe`_U-UL1UPSgTLpo|rm zkXLlyJSXxWZ~gghv50YKnlA42Zg49g6hYe00r zQ;`D=3LZ*Trc#CB!_RZY0pE_ct`cwSA6}KDqhg$5w$GGG7PwUaN9;(NY)M67mSy9OX=SC-j zys%VJk<<$3Oa=e%uK^27wYrzXZq_}{~Z`Nl0E?h2e zV{e5;+%6J$(_KPr#xi=#SRcdg`H!vk zYh+sNqLeqDe8>Tr$WW&-Pf{-pc>hcU9e&V2BYr+#(^7M?b;(|hCFruXSN!0zJpJZr zl|feNEUesO(i&(>3kgJx~H_M!cM|=AXZVB z%~;iGi!)u_t@k$Tq8w5z7?jbJ)j-Q<-oK%#cr8-Xt5cr)J}8Qid52om-D;6JBBt+( zQ0Q^gm1>>rF=x8V+0Nd$v~<0QbIG#Y?aoY2OQcxMWZ7+A%hzr64p`caP_?ZRPy?n) zRI3Y13z{FO1Z~e{iu?M|<9l!HncWt`ldRwPRKDGg;f6pNJP&63Hbx6l$>;bLJUq7q z54M+n()p~9Rek7sLMLDQ)%)tat628&XyU+wYlz#{*QGq>2;Ga}O1t66o|J;&Z`Z|9 z6FXBk4SvinThNO&37QG-F&0)kmBhfG9}Lx(OJ@t5MIE_OPSm}O^EcO;A4Ycu*M}Zl z_7!C-i=J5r_0^PFoix?g)#NR!CM=z=m#)?uHZ%!p$mxvoCMhwuKnY=yv|`ooJ0e&8 z5Wm}?)YxzyVPW@!C6uHc4|e+dTkpOB#D5S`3lbviylGG;8*y>G>2$T#uzh=MS2$rN zVR7|CX1JPPu}awbkLP&C@sda=^ zL;e0Q%aOIog3XGc6E+yFgxdxpGSzbA+qul_%ww?98Xa$j&Gkj0xRw1@5WEy|_1xx- z-n9Gi&Ef9J`+8b2$FaTYhMg_H+M{UB7uOMQDcd{oCs|sw zICLGuB6olWI{kR|ezvFw3q+W?}$lOvk6w$nB z+}~Ejx?r5Zsox$+qo{|CjSX-k5fa_1Nf$s?0T)svX!&oFNvgD-TA7dUWaZ`My`N1@ zjnn;M<#zbTno7_H>3NYiwKx6qy|Qiv0g`!q4G}fjo5Y)*LM0fPeAweizkj46QT!UQ zSM1}{90fo}s)X$)Z;=ooo1uALZ^LqPn}Z}n0vhpy^xo;S)v3ymhO4Wg(+(8^TA@In z-X!tB*W4qM&fA;)`-id(&sM_H4(tq@R|>5qZU|j&h#<-6_>=;8!kc6JkK2D5_JX3) zxbvYyxl`OXo6+_=#x;?t=d0c8h%2lBKFa~C=E_I2sb|lt<%)YY<0}&ge0&_&eix%W zhDt4YPBx2SNJ#tcgli=H{+p|AEpo>j@@6Q&Gq9kC6`}p}{R3->! z!zk)=$;G@Tze@)T?ZGbs)_Gwp_pg=~ovDb4Hv}yPGi3mRGK);2oGjO`S)z-QQE%&j zAt}YYOB`%W5h05jGeKsk31zjWGOwX={Ah28xBYKzrsc|R*$8oRVb_n;A&d!u-u#_a zBv}ctThEnEY(!S(2CcZ~@9MPwh$6RzR_yU9(ieU#gmmKHA*?AiQn4w5w$66;fZ_>z z!Vwx4_TV0a$CW2(d?j3_4zv121z(ois;4J?}T zrI&Ij-RHn_7qgSYp!#Ub#$xjiwS@CgN4j?!`Khu|Zb|3G@dpj60j{qq=>)CE9+BZ` z$TV#DY@fs}(*B~)#>FAo?ik5DlWa&f63G zO|hSU2*-$F!BWMq7uV_hOa;21BJOUB0D>Kh4WkvZM@K3tD8vkbP3qVnNuNJAa-+jI z@z03omTKJ&s~y)F(^YagU<8zW!7NKh&?e|0Jp|e;no>gvOIBhY!g$xsi^5M4!2PaZ z&Ar!^7@gIDelnjwv)*tk{JCtjbCq%QBK4Bo01Ir;e&TQDZpV+RkGc1qdz?WrmL8& zH@T)riLYKeKIAfk`S(YCRna+5RANT35+g}iVVyb*cu&*Dq42@fRR48)5uM#?t8pHk zU7Y>4)>c7$8uN6pu_oA?rF@&mh=SpIo~V zxDv1x;Pz*G^A^4U6QI`C)+#G2M+&qb{0K$Vxa?wr0Z1al0SB<)g8@kZWCMr_VqI!s zX@9Y!h0A%m(k|;efFuCypqc}4f$O9af?bf+R70Tjp$PqI$0Sj=gKwGzjVR?5fq-VH z`Ui-`-zEO8L`Dmao&((nAAkQW9Yla~*WR-pEz%cp-uj&NH^)^#G=l91GG#Qr!bp+B zJ^C2nI2Mgos1RFg6ykk*xX#aa7)OA7Uqxi2*J>hT`@p1t=n-CSLdgr{^ZxH?n1_Vs zv&{r)lQPi3Cceb4MO^pjhXKgknyTW3Lk@EBsRTYERMV7HfqbNjxH$LW?9XLmJ@Z@0 z_7)$1PTz!@ZwY!(I0qtU+th~!dWy4}1$>rog9^E;2dg_TO8&*r{{#kgRI|8rvOP%( z)-KY+R%>>jTN0f09Lka-Y=e>r!7#H5WY;M%?n&lEMm zXa5_UYHniW%jmhKBK;Z?@MB_P5-{M1@4QTdj}IZtT|8Zh26nPB61Io&H%`!Z^a?;s z{+7UhZ<>=B>EGplhXS5!{S2R#1zh6#z=F0j>^1w}-~7VK)T{SA2M}SkJBinI&xj0s zU9*qg1_fwez8B|FCOWvrdAr)E=|0^4`r^1`hV(ABP0-X-(68+Cv7hh%dCQK^7eVj} z_hZX86d>LssfBoY?9|26kwOl+VTkNcv0F2Blc}kWcEsy8qW?TDmeyV(9lZ&-a(8t* z^*=TDZ9GnQ0_H>^RRB|yvT5B#=;rEtu_FrW-tza)Wo;+`E*@)3N!{PKnJ5Dq2*mWS z!q^&nmsM?2Fs9&nyvbQ2KdeB3M@`wo`m|3-7} zu0VhyPD%x0`me6KKL=vR1TKF$nn_L+g56;~S#I4G&tWv3%>O|T86Fn4IrLR!13uVL zRj^^#2w~b-e z)YPk+%iX53mLS5e0fev!wwf>?n@3i~rA!D<^HIC~g@Oh~< zP3J`hXE^Z>QY5;Q7=-mDYr4u`VE&&Tl?g)ta1<34W%$FWDfki7()Z6KWHo7Qu-;^T zMYug+i9-?D;OEaDAw^yHG8RA~g2;d51~&xpIf2MT6^TAY-#K05Vmn(;lQ~uE#tX+< zC^V>h1Gk@V4geqn?VgG60m2XioEwagw;L2=^Y1sV+l*z^c%iMcOX=;b4k!ML%d)Zm z2u3(%%IL4wTf5`MbP zR=U?GE4V;oU!;Rx&1G9nFQ$=ZLZCl@G?5{J*dCT!PyVNUV;rBsV!Z!ZDHr;8fut37 zG{3#M{x~^P=Yau6s|JwvH~KQb2k2lj_SgLYnl(YEBfxmD3qcqB07RX~sX>`JfP1;h zDI|ByWA;zBXuyTx0Hw{?1Z7Yl0~1n1<~mTvo1?fePW@^Uq+TU_ey+(+;&Q8$uLG4P z=FyubrYqor0S2h@8zd<)QGNpNpV>Hlsz9{0ghEKgh9YLYFAKlB94{J6Ni}bb6#TvY zj|e8&@I53cqnygdI)atcIW7xeK_|g9ptJiDpZf(jq9UjSeGwodfU*Dx_{4I$JG2j zU*b;Pax03L6m)bFb_=b&sUkII0WTwg%a*h&`7m1KeguM4nRGn~1}fCfE+!jjd?bkM zUn?=#9SrAdfFIcR;Y9b{eXXaQBJ_j1KH>Q@Q2;7UJq{H9!`;w?x7XjE%XfL zp25>L4h0~xpt$}GK(a4cA?r!0AUAHVm-(fLY(r)iRP0}M_}}E{`$MXnx8J<59S7Qj zj0=dqGZ6Np??iW`mzw$tNiFQi()tWi<#uS=x0O8yTEChPqBC|rXbpM%uWNk^Ck7xo zza8avxN^KT&TDN){0Z>@i$Jf;{1K$;Z3|`_l(^Jo*WmxKoi|zDE9CGv3UIWNW<)ta zt?pEt_0iH3#QLo-9YW#u08j!|YY3Q6iCy)N%64-PPz&1}6sK-Ef0AnSX!FRCX8EUx#}+CWynjw%uWC|m$0 znp`+xkyL^(Kt$fr9kCk#Qn>3gb(dupL&3lO5TN$|nd|WV6Gp@E|1(Inp04I+fx(h^ zo{j)eO+j*}2ZY@Yj0s_#Hlmj&+lO-?izmpJoUqP%X|3u1IhwoKHdY7wCVhhy+pf@B zy~S~S0rb+DkDi=^1O{;SfATQ5lqnNdf4-7()QAGgIf_bY340I2*)aMaer! z%tK%%i;C&CRg>v;5vN|Is*hp4r(1vQoLG$Ol%lUwOH)sZh)a>|21;99Jw`OrVXcq9 z85<-Em30LI-|IzW=rWwAHZU*%`Dq{T9z`p*C$;~XNlq=)>-T2{eIN*9Kbc_c40|e4 z&bGRxruaDt?+z9g7pK1xKYpCEGyr%54I288c~jPTRmLk4N%GNTQ|R#{`eCEAljU$k z$!Y#hyEL8u??@UEW(an^WGof|^~Y&+aE0|G^QQi2v0($Cqu};H7m=eUKRp6NLexJY z4$iXy7y?=lI?9YwEh0o5c4>>^e*t&sapN?G0p2_ zTp{k6aw0d{svO<y=4Bmi#CAhx3|+Z}`0|mwrcQ^J?TO`CJs*)NGf#A8%ASQY)OL z(}UD*&-;9wrRUO%>o1-qsatxl=Oowz+UDIsn)ii;;MHBP{*IRBT<%Kfy;rVJhA(cS*UK8Lm z{Ks6j#?W9fw8Vg4Apb9_SHB{C{P^%|>`|1@)%%O1^^LvSn~P0W@q>0M+c{OS^Cg5& z=nK+kuNrqPrz(Hm*aHGwFj^0TjqiCf@gB(Y_o#sfM|PG&0L0%NyZ(XC)NA@bn?*H| zicw-GV=+$^f!Ni^Z$&TV0SY5VUT>)3dfWDkP0htd!915MuP4oXlPSO+ujqZQHw{Hx zcGz8-7o$OhF(W*!DRukpRQfNshrUM1;=9NZ&v8^tNqtNec2d{}^6ao+6x6v6^nZy- zm-C3Gc2$%fkXpc{*P6+W7(?T0lhi5^jB|gjT9t&$A1`rP>2Og8ZnZZ&%7V7 zcz>txJK9Zbja7LZ@fc(kstjf6u?U&@GynfY%Z?ztxo@ekg5zQ%2pmD2` zT2&X*wc^6sv$=)I1f{05$ zT+RN?3j|mt*XJn+)c;)LJH5J$dCh~tpC5@oFM1P6xNH5`3x36N`*kr)XU-e@Wi5uV zb|^*kb-V?`6uaHNiq8oByXZ_rGhy;09LcZ*Z)<%n<)!%A$@@9D{U1aXd(DL;MQU`{ zMddG}vIBz68Tf=MKDZJ?Da~^R{eRF-&^qr-tw-tKWO!5~c;4l&JtThUb2eG)Xk8R@ z@Vo1o`H7esug#z?V4$S?a&8x9com3WEv2j4fh`OGnAjRGZ8%?{@@=N%zN)H&ipaa# zMb*Gm@LW~9+=|d*l$)`KM5i_s)m~L^c^IYg#lCn(Mzwpc32!Z|nE95lw>NUY29uH& zy-z>2tpW6Feg}}VPKhe8Vmx~&w&+=(&y5D%ckNos!me#%=uQtLwsAyNRn zX;*mP+mRPH*W#1k`J2Ejxv2VuP_`+NFcQ|xcChVCZ8Z8>>tmHl2=pT#ZSv=axAy|S z!0iG0IGy!rU^E6$p5<+FD6z2Dtnd~9k9V4exI$GHO9IAeSWk^aO89syDRsLoWE16J zfdPtCnZx_;jWliqtn4*}RZfMm1yx3hpJCMGt0HlIR4V>fS|Of&9AM!6#f};RCE$vG zp!x#;XsC#d6zU2l8!om-oL`PVeA%;*4do#>U+GQVgqi^$FTcv$C#v!76)R=b)!CFo z9|nGUEUz=4?TjY?Tsw1>0CED(?(stv&2O(l%2#D25iLB2u6HnW>U;lDPh!FRp%fWI8l|$WoiAb~ zt~g&#FpQ7oHVRSvNY^ZZf;?c%5i@H1xEB|U13(BsUcwfqJJYxruQFd^U%hRZmB&0> z?gFc*NlIEo8*n|339qb#Y`R-ydS746JDrKl;d0e}JbWP%9vPX7@vSL4zn{NZTQ~wN zAW#l)=24}*FxUK$3;Dyn*fVgH#};p|HDF1B`rWkjXmmO{rJ;Vtey@iL%VK>nXF_DH z@HK6W9Hi{Ia3mGRdukh62DsB)<0r{=)7IceG0l799WU2naij^4V|mn_XH?rPlY?^TnMRf1H|pF(}VgdQwI{9(Dj~{g~K^2Kw}d0nAnrrm#6O$!L6N-ROl&X~}_elwC^d8hCrP zDslWwYcw@5<6Pfk`x00gmk7_TtU3e;0(nQBgFF$oWAL3i| z=?o6!y6%@Iw4mpBQw9eMuS@Ebn#L&_Ro0qlx-gpcB4Y)__+rARd~UA+Dt>^LokuZ% ziBGu%Wk?Ek+I^Ln+!MVW*AR+ndw9 z)5Xt#wSHBkH(t8O8VhH(u-|Za$0>S})Fk79=JQ*#J%L2J7Xc>hjhj+oR}tO!H}F-N z){)m!_NwX4Sma`J7yd{Mb+%vn%`k)?JkQ=8!;6CxXhMRkA$Pbp)UBQ}vB?PS-rW`UOS{z`&@JL+&mS9M+{ZzS`i zupl=W@hbl7htrJ_#o~=*r8ek=FOO-c@3AARDbQvklzBt0;t(AGepEgl@mufVQS&gZ zbU*`nz1EW%VHbw5Z!{if^FdrUdGbz4nM6xkRkRYh}Hs((RH9gc=Yu92nDe%}T!+Ipf4`;DK?NADm>yO{7r zHRK14;fc4wK@ZDfe`iQl)c^Sa2)M~|>wF%spSCajBBXFDe<~1$SnA(nP<+)8@2h<+@ zwMyHN>!T}%iE4l)ob2#`N zPQg1Y{jh}$P{XZuq=aB%WGh|4tNcNsc@U=|=+ls1+c;ofZobv{f3)L}L2d!i4tj3d z6%T~QLX^j(ljO9NwLeO+b-|{yDGI>ghrenCgnnEt7W-Tm;QFbE9mlS+{m?e_B9&f( z5&0L>oYwGqzB%2fJDn+reZ-LdjsXjg{4@1y=a_{auKKfgp}G#->Y{s%4=#dzs8lpU zAtB7l$=TXYL*#8xig%3R!82d{9!A^^zAb_g#kB{a>R)_Gx^9RV3`NYU0<nSyTuscb$Ux66b*X+y6HkUbw7C3m}KlNWMWA~r{h1(CI`aNDHCz7|yY%9Xo}FC?rY5#RhM5 z;@5}KGtdb)D=XCJOOd{y)zR9(Rc1ovxhMQ!{cHNnkGFogo`6CTMt;Gf^X!j8@J#)7 zdGct%*xpFj7Rp-{84CHh4chg4cVQJ_f~`1A)Y&*8tEoP z-+!hQ&did2&eLf|R_Sb8cN`D<^`6SFD1z+m6F#CqiHqXb_jm%XhZXO>W!13a2_>I- z#?yN*`@bxmI&J=0&lLGyu^LAyZU6|C9Dgx1!1t=!vgww8mw3?z-BJQ{z^_n!HOVjR zq_pC}l60rv*ZGm*=-?oHs`5qc0Sv%~ecLSHHU6F9`2_+^`J!QVTS%_4#&nZFwH}JV zGr)bq-rqVjzE6FGc;OyOeFc1o(IV5=;xmb#{lo&O$Dl5NU8lrmYtGi z8p9v0O4`{EW<$9%JdU!7OhWG_4>(|n+bai8i+0KJ2rvt5(8Zs{Zz0=DJP8JYVz?Fg zI&DzZULADNB0ZPmw9O@=JC=7aR&{6{(jYo@?oQ(lvH@J6c-34jF$nAKpH{^1Xmj*j zHrt!r$kHg$gW%QooP&VHpfxE=6Z3Ev?>EXD#1I1U591E*LENlg*gI{F{fu7BW|Jk- z=S5jp52}!2f-UahjaQra;{{Ls$x$S0LE(lYXl>CRzxfKINoD#>YRCz@xbz@Lqo<5k znyC_2K_Z2nzJXu3;IHPXW$7UuCu_Z#DS(E~{Z?`FkAQ$X z49bP9SC~cz^Ej@)ZJ7f#e0JdpPKxlfO;@A>+csREOf`hke%ob`eDGSOBa+0$*+g%T zYg$PgNn$zFTB92$4#3mIXA9|@l)kwDOW}QADVc1y z(=bcRp+@wh6SReG0JEOK2d_ob-J?;- z4ge{WHRhSfbVN~u*Vok(=^X-aNcm*38Ljp>?GKm>o0A-orJPmjNcxdI~?kNaDy|7<*`3KGv@3*&u~xV_ziG0Ssd zmNTGZR3t?MU7x>9WKMP|&?+?ER|i@>1n-xCh!iq=&3q8xvsZb9sCD*gH<&*pgsot= z#HMQbiB3(VNq?~sd8b&~NI)wThltK#)a7j@09f=I-7&vVXm3@Tx3=F`d%}r3q~S4` zD+^0NKuN*x-@m7j9eM!nh@??uFQFoQA2FA0WutQ0>KQHH1dXwVxHZ8`0BWKA{N)YC zcm_6J1{T;Z6EH?6?Y74gABw#Ir6ZYIaMS|z6zJOm^?vIuh|);hN$9?Fg}~C}&Q3B2 zv$*JaWB0{uvrIFfVI~&MH%fF6VF*Ams3h^2h+Zc+lb1PjE^UFFXT0cnLN$$Ai;**GQLnHT|D_wwMxC`xqfC(l&_5-F~MnTc>K6IJnH8y3_l>dmzoC1w!bDMc8g+$>mTXb?kV%2Z5T)gpv$I zG{76$N=K;Y30;Z!?UCJy&zT7BRO5TE(4}G8%8ZvG#5-&vNb1{hmE5k!U<;|r3`c_| zXfoiyO?+dXaQ@w%%~4Ef@8}q!uW{PU-PG3zLIj%yu#ke~A}F6ipy8D`N6dp6kabRH zQsm3DEHGd{9)N8t=L3Bs;m=}6Kax%N_e~qDgc`kTJm^-+5ri#hE?8Q2+SY6fU`Tt) zOrIFq#XLewz}%G=pmJMDGOGkz+Yw`_hb(}`83OLcC<1`M*{O0^&ERN49wm6zui>g-(evw2d=10R)Srlek$cZvMELf}`W{olB7ve7M@T zt0O`qyXucf+f^kdCU#6!QAK*r2au7A@$Y9VG#q?ZCSH0(2s`Kks0%%VJfOIG;~7O* z9~~GKX~Wm?G2oVh4_yq39^H{~Iv1&~1wkFz2=-VyZ?efGdK0bp-RDRro~=qBefI+)vS?-Lenzwu`-q_c?dANXJtVrKwxMBt8d z#+)hxkD>jf^N|Z3ykAGrHb?|^au{Wh4*dT5r<4GiDiZWm((G>TI=_U`h~l=Fpi!_h z)5iRsk%Ib42Mdg@38`4fMrOTaB1x7$i^t0X2xoh;f(&W=@`1kee0KNeTz6;U)!P;jC0un!F`J&0uv|e{;2>LZZRU=7 zs7Q_a02wV<8k=2RMa3@0z_7vF3p28V&PUJ2V>Q)LqbxNQ@7O;4q`1^-&N%TJ zW*3!zU(c>Ddbw!RwJ1!VjN{FccMGRRA5iUo_|OW`{OOYwYNht|mP)6pMY+v9r{T^vp6G&z#gUUZ8Dx_G@b9c2R?)!w`;iNg1#1_I<*zz&~vbJ@;jj7ePJVbB&+6 z61WIM5g=3>bkGXo_IwV+x7q<6&)k*}pRYg{BZEjG{hN&s@wIOpz)Y>sDJc_OLRfWd zGLswux!eOKX{7&|lvlQZ)5fduCSr-lE@C5)BH=h)NFj&WdM{FnK|=6)xp3M7 z!yKQ&>?^L|qsmov3fPSSBuUWLKrE!a4Fyo~z^vQPksC~S8U*!Qy%IkEYRm{~`C!oaH@ zI0AtFrqDy_aF*tI{U)w;Yj6?{5(HN&Q2l85rSowI)y^M;AGwwk%~wU;ql%)l666WcwLuK4-l-XvZyGjn^?-PZkExOyK>be60?3kLY|c=Icy z%5Jf}P`4uHo_dMPuEBUj5J?QI2|8Ur2Ir}>J4khzNjfihA#mz{G-=zQZ}71OqEqW? zm$;zBjS;~ng=`%?uo4ZX7=1wJw*bm|(5|dOAiW-RSgCu{RuqaT6Fe@$*7-`oV6v13&wp@FAbLow2W!~f*XLX+WZAYv-e-7so5YS37R7C=gWm2K@D=hWR z_t(!)Go;;UmO7vpzV)!%4vCvDg_~D)#AXIH&gE9)EJ{8PD_e#AC{`w+Dqhd?p7-*U zzuTF@$vmuPW)y`HI{~W8@h7!gLeXjw)m?Y#fzOeEYb^n!!EgMUdE@E@(D7ymG>|*^ zAjv2*47H>AXaSU2J$;M~pa^mMC$+?sX%&oVE}B7fu-z)0XZrM+g)idjv8{%o)jNuZ zmF=iI4Sb~yQp=O01dW$M40Lm^m@T6EU z_7Bs?0KXM;KdN;*#3Z05CjrN?v@B*5<+9NonGa;D zLZECwdxiUy%w5^V1Qz0|9xivS8YcQ<6-6QL!OuM5>RYuQC1yb6Q04&NhL$Q;G7881 zgYu1la=U!U8X5S$7Jre*Lsm z0Lo68X1O6D1sN&>dB)v1p@?_F-?R#o%OR|y1SB<^31=zugI<%UJrWw4Z8=`j1o@~Z zzMiYWQ${~&Z??0g=0WSN6si(IHVbY%JS*Ap#aL@$-tu$=yo_V2I?S$M-=9~J2MSG0Qj~~l3~Z-v7}we>!0uV zQVe}r&A0tKpm1pm7L_znoNwr)WMnRVVy9&129-g~Y4 z{@i=7?_%Wiz1Hu@>3@NO4q^4C$pEvI;Hw%j#!j7$1Ha<3Q=FCYk!-n@%!EV*YC3AH zf{67U5H(7}hhNuqY$hr3YCf}oY)4OLo%Ti&wB3Nl3Df-4GX?+s?!X!AQ5IL3U0=$V z-1+Sv_tQ}JeC)l1Yek2#g-F@oK|OhQU2+q^7PQJ$0l1|TejyjPggs#>VsdKp5Isg) zRHPg)nsHUY9`4dkPr&%`&yy7Au^dH6q~11Ad3rRGNSnxaEtemo2d#eJWt-t z>9^B|1be;!df+fmJEOlEuE+# zq@YDB>g@?xcJqJV^UEN3Un6>BG0>_r-){hC2g|4JY2af*nh3ts##&o zJ_Mz+lfG#xr+~Hcd8w!IkgZh!fU~bIwO}(m0OidTz8f7(rYaNbLEc`S+_=N{sT-+F z*rk{?d;lstHSAymiUhEZGK!y{UrkkfV5a=1s@<7H3c^$06b)PD?EN^F1mppr=58$YgB+keVEtJ3xH4Ilbz0g7TNSz3#xBe`O zAE}w{zZT5{K8UMRrkPzxR1A0k^C1)q28W}gbsY8*+&{h%WI;mn*dIb-7|M)x_|+{7 z$~bc{UD6$EKf5k7_6*sNdziRMQF`^D3 zzc9MQjw1~clI!d1r6z#*5cL^IiJdq5ZM2KR3{Y#!;h2n&XVqB^wH9q7$+R7X2fC|k zYiIIbG}4U69~t;efyD^}4s;e0{YW182Y7T6ifd(~t~)0@p@5YzTq#$%EK30zwfSY(0U$?68YgA$>mqRrvf$njuYIZY$1|TFV6F{iL&=Uqott7p5 zsUWTZn?WJcMLeEbfcL-^NCFnZnnt-(9DOMde<*@}Qe>mBrw5G&q=+1i2NSu&=PuUl zXumlBo><$B7(%Wu?Kg1)tHxpd ziA;?20%w2oHC(WR&^?9K8rP%e_S+AsLyah{Bns(*17! zHI=?o4nthx1?5Jx^e&e?G6f>d?GUC0x}5%RDW&(Vt9Ae+NI`b|-23^o!LU_IU&bn+ zt}tW(-4fH#t+ry=VXPQx;}~sP3IYsb_dCmIRwqt?X2^@x!=< zn;m(f_QNp0syM{6JN&5|cU=pek)gHU?6vqX_%e`%mTk8Mapn(}F5rSSTnMmU8PGOC zgx85xE9<_d{@%*DIH0TY+Evsz)JDaAb93|5N=X~56b}qe+Zqsxjup1wq&e;QBlmZn zn7cb5Rr_XSY{Uc59Co6K$wifVvTB>!H9gXqoNs91D`URK zz|adtsHaI)DBHl^#xBd z*r93a5HUSF{W4?ee>6Z-5OnSITd2|JXqAf35H&zPw9`9~K5k=UBNhE`B123tpK7+G zK20@z5 zd-pI3gIx9X)B3{@LKljKx&%N89M8~W8FvQwHo-_(WabOyF|GzaufW^e2ZYkA-|bEv z@uw;DMG+w$p>!iXWwL3}PhPk(fW(=aqR*qQ-)diaLsUqNu^-T9v&?9g;x{R-9#J#KIY1IIAXG#f#W zv?PMh<8}W{loFV$cx|_wE&-%S&1aZU-dp2-hWmC%IL?I6y!jBJEt4%99HhYaya>~t z>U4nKwAHgRBc$zEUQ!gl_1oz6*r7wjf`>hz~% z4|4;RdgUXfyarXxj(Gpgnk7df4(Tx%y_oCFWC}31?Y!Wj25#iZeiJ3ogp!8E>2QR+ zYysgjNigI$8*2|#Eb!XX#-zjViO97(ym93b0@jE8rZ*)-6k-_KrL;DsIQuZpgox^R zRtP-ylrI`D$WoD%`am2|*VOF)G#N~1FGV2wQ22DN^&Ovd=6##PXwDQ<^WgHpqbBP< z?B61+Q~PHBjUe8UxqHmiT7)4IJeSw2464^_QjiGLU(Do#v4{4nxru(?<7Bt{Ujyy4 zZsd222kf+wYm~QZxZsaHc8VjvYC{Ztd($X0I|0BJTq3W`zq04z` zzlm_fpC;F(Mkfj-Fa+Fo^c?^%K+;nSsL1h9!;-dx2><}#v2r!s`~q4H%7*%}&j{e^ z$cz5h=;bM5mGgF^2Q`%`sF0hGnD}qH+K7I&#AW~4t0|ryWJCn!>H-k*SwN{jVEGXD z-v2cNDhxxnsq8}n3L+DDT_OM*@tdjZyjFLIt6_nl*gL>2H}6P zPgSI!8*yNFf&?mXH0Q}*07(v6q`^vb*r0_`i;ZFpHuVAI2gT@C)co$|n?GN{u-!e* z%5*$+8W1v*v~;@Rf383_!>#+UbG~V{S>jT*+3}hqm{BGmi{;4oa0w2F_p*587_w*d z_xIZlC7C=ajXiwf{#8$klHY@jo@fodgi(Sa`j&jwbjkA`5{n7?`E;cumrB(Cd@tzk zx)it|n;H3VY^(vO?&=TN$WKHNYM#~$-u12^OG7 z@5^QHDs2Yha7dWbtlUCTIVh+f$^dZUuNo6TSF>Tzxt6zE&F*WQyI2I&q(*=l{}Zbg zBXfD%8E|!5{ooA$`hcR1M!VePZo$YpVh^36Bt3>d$TJ; zsHtV^{s~(z_zSH6CV8#`Tej5Ze(v%N^9mn8+ zB)#@x{+ZU>M8+e`np_rI-h#lPZbTrV5^{2Kph3N6EW9n;2dIKQ`gzU)$yRjpfP?3w z-;LzJnF9`cOg=k6hovCEjsBkf*bxbj)OhN#Uby?jlKzpnp1D-O`hg41w^p^MxPS`C0qG~7Ugn8F0-Mit0=;)y<#tY z^8N8K<&nd13L7tP+>MizJWE=}3*sxTWYnqcr+)DBz5iKY;WF2VmuvpnA#r&f0Dh5| zk63AWr2cznApJk%+w~UXnDstxD0TechC0`jt7-Q9Ea9b*Rp1v^P9@~!KunoVHc)x) zYlGGxdoV1nbuCG9Fqx&!;UQ6C(XB26tf!*dczNkFSfkd{jxeSLdb<1ow_^cn5min{{S=V;oyL&F7aK1@?!wPJ zw{=R?$TY86N~P#_+$L!6Z!?7hNu&HwF>^K&*S3k5l`aU!6kZyEfaxg)U(ueg|u)9Zt z{Wq0Vd~Tigahs#n0pJG!SwN=07u$W`nm{~(u{h#}*km2mId?|KMY4lBoHJ6Lybtj zM4iM_W40D8qv6qc@v}%djC{&ry2>Dy2Z&qdAC2mmW!}q%PnKyF&ny!T>oqlddm)Hl+uI5}QmlGX%GmD2~!HAZK%5-!QN_|8Bry=lF(tNkx*xEInr% z;KnTyCDj|wna{5mB^BcsZzM;35A>(U7eMZsb8cZrK>$&aNS~7Klz(qYd+Z3?a|C#= z)CcUiY(btZWLm63GqD2V!O^h_qXSQJrPwAapNe#m+Q#Ma6`$fP!JV z)>+RMLppJ=V!kA6Ff&#C8-1U*j_Dd71JJOW%(0%{0IuL)Cd3|w^Oq8Zw z(BC(-6fd<7NZ2uMXLTAm%yw-samFCG32rysN*Q3+qY8dhfRs}PvXuWyUaJg zB`P4ta9a<@QhBRuS#2orw~NPhvE5S>OgCtLEjn6f`sI~APABO;9iwL-kwgd{L~6N& zpRRXBNU!XB;Kjm_>`)R@Jckm?mPwf3zb`X#;@eRg345ofLS47;u7~5yE=sWO`oE^7 zjPk(*y0sr7M-p9+49)#kV?l1~n4l|1!2L!t1irZyfc3Zs&CONkAN!n)1>ZmBkkRbF zyS>|d?|L0=k%Lc-`sTk{_47NBMX;!m)$d=|wqQ$P$_+z|iPn}eZF*k)szF{RG4;Vo zg}~8;);#S>`CQQ30yn9;Cp?Pyhz9mAL=56-k-<%fx;b;nThA z(Yu^5HtK;k2-}ZP=JZ>5FFbLc6_!vj7lMy`UMCK-1nM841MrFeeoOT6hZL;DuKVlP z4|?lqVuzH5Np|LeXVdy3C7RX6|5C9VSpEIsWYDLCu#uM2MgN1}#IQ_p*vLJvAZ+4| zG$i(FuECxF0&SwoMIFQ~QjY(GJ#Lk=#`)&`AqVQ*LBE@5UIY=PO5YR@b`g`L*ZNq2 z)m2jPMBMoU?|0&Jt(7Fxvd(q#;O$e@gT)SMi0?+a(FE^0_N&9;R1SJ>MM6VU7uyte z{G3p8IG*YNv_`_gysj0FBtz_Ykm@TO6oXzBOn0`wn&!PC`<&n(f|0C;PrNLTBv6S8 zFPu!v`mNKZy6P2&MeIlA!EfFyOe|cSu*~_>`j0)E$+&P|Kh=j}tWX>+c)JqOH6`?T zhz}CGq%01lWvl*{XeIIb7r%R!)C^qt41shmU5VoW3M!tpMQ4_Dfq!}iA zQ87oBN{hY+(6h&jeW91)8|^!V)dxNi&kYC!JaXGlen^5~xjaaM))zt*bB#`KAMP%` zE%%1NMvfe$C39?=`uLU77FGm1?g?bZ)DWZIHJ>q%8CKn4|4Mp~r>|h16TVlen2y#}+K_O8Q z5G1ygU9JIx>qz^SV!vNv6MT>4SQ|GMyCyzjc!()&2;lfSRt~|~~9A=*om71*_bZ2l5S}j;NDkKIOZ!jwo-vVmm6^AAtPZVuuOLaoF!yUk z`XC`=LOA_vs|(MS07tix%8~LF4Ha`;l;VMXbzQm#*ec~XbaJ4ay~}4WK`)DPSWT1E zzL(2fYd_OY4jR;^RBJzSxf0E?iR}@mp$XOPP2(gntkhL*3MlEsCZdm+89hj2crJ_^ z)eFVf*^Qslooiio1GFCqD_m}s{1@cPs@Tw10E>XdaE-k5-P}dl*wD18KJR3kV1p`k z=*>1p(zzxE6B+pQ#b1txq`VtR|B5<3HM#z13%C|}b}W3#n53k#b?8$rImwby9eXi- zT?Icis{1ZtB7H$HC^8M(UF21Xjm;@LP0}waBlA!VZTE$@W736s9?S35c@kEr4*phE z*A|hkFN8VrF{eaOb6I2sB_gz~7??@-sf)#RLXuTqN<9H$w{M*A$vU!6@7{>?{-e*! zAPgckPr+5`sv*Sy*1?6IVQHlqZ)@Gcp1yd?>GnbP zS>ZD0(X~Hj*ElyAEszCfeoF+`-$f5Zx@)V6*D7--~OnxH1Tyj0QP z4_vsd_>*s*eDXn6;j$HyK|9mcG_n18=a~W!q;xBv5LMjW2M-Y~&TwW`4Auk4_jMYn zl6kj;9UV?8hKhrs7_x@4$xuYof)~S}p%oui`YI=t`X@Vip%v3_eh%Lww?M zofx1{s2KTJwMUhlrEn30OY=%~UFUIhLTW$nh%^w#2k>{C%LK;=!V&jEom8Ncjc?Ju zQtODDJV@{wnTWA%W2nua{b|pgSY{N9f14Ay#|v5JOQL(cxl>*cv=T{kiDjnVRZK7* zj|BoK*sqYpl|mL@7EQvETk`O3zwJQAhs}F`9^mpvFWwC?d6V*U(^$nw`r>bK0ulOl z^mEp0ZO5(MCo|@Xmk`)2(fkWPmPITWK~SNLvN;6SKfsk3pOpM(6Ul@@tv|db3Jy8E zz>SuqYd>_2B}k_KEQecSE^Un;+6|C7vB?^XO=O{wh>28h-g>0X(JW>Uv|E*26Sp6W z$h{H}fe1x3Q4ja zE)JHGC6ZbO2}(y(Oa((%5?89Et-Wee68jTzHa0jhU! zX`a;}02xzMtR~O99M+nW&0)?uho^;JVxtqqw_%Svt4ues-Z=DM4h#!(#KXZKW+o*{ z@F*U~1o^77rIpi~Ibq);?PXzM57%*JL3h`^hNtrPthakzaY@=V@r)n@#<%15;&0T$ zDg$#U+(T1niAR;V0(Q*#ov)CX|jq~zcLnEO6fNo!DX#MPr8;u}VxR_Z2tFUu< z^*~q2bJMV>#DZEw0H?(J*z|e^mQm%`KscWY&NWlh5>+TKk38kn453uz z0ZgUR)=*Yy#{ z5cD_ecG6NDnqct#?Xy(*lc0+Q?+u4Ry*}t5KWBu~ zC(E^mrhS1&ze5v-fC#L9S&j5~Y@sOQ+nv`ZLM!Q2(;hY$UW9tPW9X*4*&9R5Lb!#a zJ$Nu1Uk)gZfk{xT>!6;`2OGg<(fqi?#B`F>7!8>}Y+wHUX~Owp+T_AS3EG*9Lqy=k zE>FT~meFybf-7%U{|IjjTZUvedtDAHsf!Bh-BLVcPmm%at%iiRByhtJFOq7Wy_fbE zS2p_eLjHd6-_#hdeLdekoo%(xa`WBo=%Lc3T*{L4Nw6feY*MYpxlyvyU(nTA~1)^Au4b0 zyx`)o<$hz*7o>IV3~VCikzgLWp0~TFv-P%(&)`F&pSnw@f}M)$I?n0;QB+vdrel14 zsj=}bv;099Od@kxcxw2tS2D#9iCt5|Z47P)OJlpZ%TZQ3dL8GwO-S=7xxqJi36xr{ z+N_kr%LT5wu&8qx#htU3If<|pIpZxvWE$B6o=<3=6bjigc9YU4@Jmd09}%KnFLx1# zBi1uB6zO)=VL?6I{HBe#@uBHD*qOhf{O|W%)_=gRWiP06`#I7hje!cC(0`s_mwmd{ zunN-KTaU4ue0k(+r)o|DTMT}<%c9I%3wLCbZ_v&`N_ONskDPxhtY79-fha~1_E&4C z>Z5ed&8OjDbku?@=8PB2a5*g#q4vFO{di~HUZP-r*pN~^Q zROJOKtGK?@zw-HD*i_;sOY4&krj0K{`}%YuSH8rFTfldhx?~q|gPsQjNI}3F)YcLK zk5U}R3+2tJE>zseGohBGKUwVU6?ApUEl1uoEoAT+2?k(DL8Ta_pt*6kS0@Cp)mc8S zmDrWiX3%{MEhOK6|0xY0<*N~YFtuMl=^b>usgg)KC(Hi zgeaKG2r(;SKTCIvYqjQ20l7k79j58Rg&kiuI!%UUlq{FjR&b(L*3kY9W%F>?ZCZVv z%Wv5Z;b7Y5D+cvtFD;y{*?oC6-LLyxC?Ua|%gxyAyrEkomqG`4rk4Xo^(@w(^ubOoqmQZm5)3 zhx$2^?4!mp6*kBnn-a9}(T7K5zsG5YhX*sL$BK(l>aDS*(JFMMxm?VWzAhZIkhHX1 zsSL4f|1E=RONtP-D)jT9!EsDbW8B_;4WTV#QmRgM+cE5}+nJZPNQMt`;+10weqn8= zh*5*%5P_|7aDo{l@*#S{amOzL&?J`Z*PHTD4!cHO2ZQM2A|iVIeBaa~-G?Q;;pB`1 z!Vqv>i4Q3WB8CTZB(7PF^JCr;;GhCa7f2a}V-bf42$Dn0;eNT`xPg8qG6|Z|8O? z#(=?7fNvEo#e9xL+&YSiiXsB--n6t)B}<`3hkKwtI6^U92c0)AS?D;il6CFJ>ds-y zoNQ}9ka`h)(zGX(?h}Fd&g)CTdpsLK$7B!$`!(WzE~{~Q1|6sNjI zl}icf*vK&BiStKiKe%1}9Vl|uWOfvD*oSl;%a^7TL~fpp$tHKHJ3tw{@nK(IO{;?_ zERaozSIT?_Rh0N3up1U)-AW=W{Wn5?nKMbu;2{4pL^gzvKyd}3b1Bq$S(Gm+chhp} zrrTOYDfy+2LbF-X$uYKqQak1zykmBPVMiQamP!xF&i-{{e`x911@jPT^be@Y2k z#U3xlLo?>nDB9Kk}Bag^ZR(iuztME#ZM6orW>@3^f#>1641TKSdVo8K}?^yIXUe1sah!`IUV zEpjL~N8cMQ{z<{U#tL2nRM=DdmEPC)AnVvO6V(-t)^7vpj(zG%!x3VDYT(A0&OBz{EOwpS$V0+JbgCAmlz-B(k@kYG9PPo+S7^CzQGUM~Jasha-l!y!%`7 zJM1Z7Va0PP3K{gqwS4CyC^|s*E5`UeT z)e=qp=}J9SJsAIG>-~Uj7-C`b!anQ0=<5hXagTjYtxV?;XL`05 zc`qxj|Dm?hwG_xG>`@Yrn(1MQtpt(c5`A%+EVIMJJ3T5km3nYH5#bE z51Hf;PL~=^_W0rO*Qa z$UvasLprKJ(qXTBpQm3$7>-bqmmSz3%`JJ4NC4V_7G^07)KW}6hl~t!inj)wJ2X7v zgc~#Z8~sz5?#JVMfrL*5`Ax>DYj)!YLt16ubbzb34af|7UTgmJuES;^?$|aQo2VZH zFC6hLL!i(9!z3D07{>hVl%Dn%*QI-N_XglGthke}b+dR{yUWMMYhdA1c8i>2szIK- z{?-3HH8F~|svlj>Ed@7edpMP2<1E$rYw)yz5gGSAn@f3f3?^|}$K`7LLDxekzt_NC z2_DQw7|Oh%SE8005rNsl@}i$s^w8HibD8rLq#>`cf~w{^E2~@0K}i)TZBJK)a@cZ9{tLBh--x6g zBv#kAO+>!3;TA8lAy@+MDu$edcVL3GoVDdaytjX0nyX=|@IBTQOyFHxTkRYnyG@{j$5<6Yf4&5O55=dL`tMi$|`BL}aLs>>G@UBDRB< zOwXZIO7qo5b;lduzTwy}Ynz+TTX-*=ola`^y}VthwU7+K4Iy}>)^+Qy!+BlSf8bmiHW#;l3<+Q!RK~Vh1d)jKzpsmKHXW0rZ_RiwPy8!&OQT3wU=0Hf@V`HcRUgl762_#q20z@} zkEErRRuMJ;3U?c{k#4kWhD!soztPDd;`&_zr2so#bv}Bp$v*|ov?F_0rkQQ$k*K?> zTdJN;`*&j=+3tIC{&$9CjPbDR-`77cNgCEz{vpm zC!-#-ICh+R;w5zSaD&XCP~M0#RXJYRF4u3BcY_IZ$5gbl%Gtv*4(pVZV(2I{o7!+Ml7D|*KO_1iR_8u%_BEF?Jmz7YbVOwg~TkCVg1J&xp_YafVQuJZ2ktLr{+D35F3bP#nmaW6N zMp>NY5Fw@DmLPOXJhlse8dQ#{koQw%?yKw4{{GuxHO_MD5w4zR_hZSJ8VQudCfvTW znsBzyuJ<6d!!0AETa2U8!Wy^nfwkCSB1Gf#;YO&1%z!xLkb?U^((`J$N7# z9w5>hbm#Xp7A~t6?6Hg?BC2d%Yx*V5CUbY0?3MZq8hMf!Xsk$PH%87Uw*f0CmK_X6 zj&g(^a8O=FeB6qWMNA#4;y;N-d=2MNb%z z8_E7>6Cw$W8RFLMb{rOKDDrmm`~BTb6TlGGa-%s<)(YI+-S1CIl*H1l(GuyOj7T58 zJl+1;7i2L0#JRBvkAi!c2NQ;@_VgNi?8qgNcZfG^az2Ou=-P zJBF9<|L=U7SPwM2aK6L8i3Q|7JV^qg5j5w4Ks}dH>!_(fP%1a~!)1BEN9G-P){D`u zy#M^qu0u~~oP3vgiw6<$GW~wc`Gfc(ZIG*1pxvou10uCX3~<>!lfTzQ4V~BA`Z{^?cfm`Vf^w zEAoGb;dXSXT&$6RA*AuR!?ahp7QL4OJNz$T#QbmBBWg@O=WB~Dn=H6r-@aSzkEMU| zO2680G}yAFx>B#4d?(W?$QKs6Ce?NJ%j}@zBES2fP(B>jZX^x7qc6`S>6Nx-f8~F? zj%->Ax(PwUm`JwNLe1C%Y=R3TW|5f>M|}FQ%vs?h1EFJKas7Wc^Bq$X6Ygg}K(f}m zooQsW#}@*9c_~%hV$0{H<2WeMe!Q2^9*d(wioCVX;6=%k@ z@r7Xy>YQ5{t7sk|VcOFl!d!~WJ_$K@xb7ZvjZR9>fDG)*`SRUmWS4pnz*T&Q-_|hE zw|&*qZP>mS+ViASm5JR#TI`VI1JKLN!wp8c;7d{8oVbh^qNP+YZca{I*n~?D@_)WS zkT?Ig*VBU2#Jm?ff@)W>0ukFn)l*w zPAdq=iU-YHJD$88XFU?;GpxB>^gl>skoZ9%qez&!J5whMu=FX9?yY9~??RUFas;)I zrDm+ir!u`ufN8H~&-bO~s&_|d0@={TXGvK}v8br}$7fmd)HuY^lrS0eb;zDm>L(DP zPsDo9ySt9W6;}M5W#yHQE9BuV42z4=a^}rZ5%^+r$}M6b)N-~TShp{E@Hpu0r@b`~e#y>3&Mj%;@MC zMQkFb+WmjqXQJu11bpDP(EVl7$&r`+*s)=n!L^;tG4`)qp=hoFxi8?q78{)LBDrq8 zcti~1d$aW%pFmirRlX;ix_Wz)+Oi8vHI-5q^KaFe(Q7lxa9; zSQ+Z9NtHo$7(GS-iPT{?YIUKSf&B&0hSUP46+5U6`rZeEsf!){d@7vZGCd>}qX<(s zo88w|Pc6ZyU8J=DY+#Lk(@-|7v$Vi)#94k9I=gkKDtk?KhMl+GoMwXmO4_-Qi~nA|%T9W+YH|{dJM`DSOR-9# zCuT?Z8|{3lrxmMcIE>4NK&zNv6a#F@FMN@$OfqoUYdVY?#FWOuD}5EAmSj*$(eGBe z;Pof*xXp8?$oXc!&Gl+R;nEGbX%peQ)72m$CqE6}v^NFt%LRa|3q52XuEt8s9;$?> z%dB{ySBLiF&;xO&3C=1-4L93)16b)?@WY+&BYaQq@k04fAEEX`g;NR(G^ol>lrPJ%L)NEOUE^DiaU>4bS7^ zWEtLVJGMwl-C;vK$6+qR(}*X{sz2E-s1N*>0x$5;S}57?=FA$zx|}Gn_-KrE7IhRhhka(Jynxs@j$`^Kw5!MT0X-D8 zr|D~_Dxv1^;f9IX2vlk z=H0?g`-Mp(NHzqmI;EbNw-714T_-&opt0gljl)oJ-`1T+jZwZ>E<{Yzsf@niU2;x+ z6=XaRnzHxeFZGvty7S&(d!Vch&x{*3> zKJsTz9lmD)#PvZR-g`U}YcLLdmyoQFn$R-+7dK&8f@sf8IJ`ie5Z?PdwrO1@uI-ih z1=0SpKqk-*v{W^Li8s=3Ak=kxT!_d&wV^$^JX&*~0GxHo`SHeU(9c)OiRiB-Ki2UD z9wR~FI3(wilolf@p}4ifgbEVlcK?Biu9_Ku*&0s&3aPAQG^M6Y`Rs@$0@ z_m8YnZc@sTqFyoZ=TZ@Bbz-W+t;>0Fv^vo8QxWaC#>&B~(7{*5g@~MV_0qE0ZQ~r? z%KfY|QvN5ex`2T3GK+o#y;MUf#Ih?WP+iuWK%Dp)^f90dNv8nbW#Puhbrb3)#Z~xV zzMRPvFjL7!op#!7KN@5(C`}zwQyRFdXugTN7G28{;0J%Q5_zfExmUGnqAy91XUFNp zSRi%s{c#QD&I?oeoT7^O37&w91@9Rw+N{o4`9l320dYo8cq)s>Fk3W}7j01M2TuCA zkM*`gn;AsAS*D~vF)Bj%ZYlra8)t2oxRjcpb_@*`3TqOS#+f}$&AZPpMQG)SLA_Id zm1(_~IiIy9R4D^Wa{=JxhDuz5bw0tCb$FbosQ=tqcPK^+S=}egM)$MbY4Yci7AloN zmwhavB>)PKTb}EDDoEqpUKbf+q+m%p9ElUB@Pt<(-X88V`|pLa{gMOqU2#6kUWikz zTQBB@pzLX=bVb`0&&a=YaRPcf!E=jMw3c?Ss zWX$<;Jx0LF{ru|(%Am-g!xyUKP_&{#1R!i`Y=8L8Szi1GIP>oO&%tsyNv&Cv;CQ5D z#6$Go2iJdWE|9Lwm-6N|VX7Fxz%4w-HaP&QO zC%~=3nxDkChx@imX3V}igMVA7d+gN@^&$;QpCsSiTx3e-as+PFG*4CM!s5`2V)>OQ zR#-`yJTr?C&Cn#+*Ox!hJ<1})md=3qS#8zTIWygOJK51>E_*!8VGGNl3=v}#sF1j& zOF#222t0S1s`$B%M1Vg5&i(Mo(-~Zv*-EW~__j-Qp;8V@PVz|XGYrD>1#hd<=!yB=`IfhPj77PZ z1ZqN7Gfsb~a*P}XFh1U;Jimf#@JV1*-Dq&B}h;!Di2@#uN~NvJ;iE+_SvLk+gB6@bS~p9_z!YRVGY%2_JnF z+(ZVwfck&KkQcC-?Rfj+hwt){-^KpNU#+p{qpkb~dIW)vuXpU62PnKzXOcb1%QxTN z?vH;^tjH;Kx60Kf6C=3t{|QY(KlnrDsVl_ue{5BpV1|g3kX~%N<6?15swaz8r#+BR zQ!X5}j2nl6rS|4@2cx@RLE*)d#W<#8)P@gP_`%J&!CCdiTxnP7pq6`oFFwln7S zC+jTtaG}B9i#dh;!Pdr8!pUR?^x&VU$E)KcMaIjUqdL?=c`3QDvhO&d?x?Wn*Gj1DQyvU>v9;uYzZu_6roRaRu9EP zDP>`fryIg_0=Xy8#+Zu!4W^x1tYTEm!{DD$Q?|sO*YD-j*Eexw3sl@RR|m76Za8ev zj8I5psS_Y$W68>!H9s|;NsD$L_m)x2yzk7EMM9qix$}w<&&VWer1La=>+Kdk0%>04 zS$1AQ*Qlqc$$=oRu)(DzH^%|EMnFgre5zen+|84Io>Qb z>v>B2;%iM8iY-dqb$JuMO>pSwLhZ}&TwnMfKXqg^XE<1 z_9GRyq(2eLKiS>Ty(R)5$u@J9Q5vR4?aBdu+0w)ue0y|im;^(Ya_Z6>-KswslMRk9 zMQ=PDYVB;5(r(EaH2@sjK(U!-Q}O#8Tp2QhM!^i-RUyu|9*Y^BR+{# zj;D5)?~5WLz<801YlQlsWU2HtFU|Ipa`1QSyVo6NN5)S^IVXm&=N0;W@MN@ba-Y3> zl_hOdra$2bbK=Vf5VGQnQA5pR4bV^`1C1UH&j}zL_(5@hoxpjf`1KzJe^_GVO%?aC zi8;^eJQ%>oSKwS4ZYz(+q&_=5tIV0QtY^T^OBld?GL8iL50*&>aeJ|hY5z+lU}o?4 z=lDXCVe#Q$7wS9-7;#lLER32Z;1KN@5*`kVJNSOQCHvs}&Qo-Vt0@k)YclYoc8Moj z)LuOtn<&CZ{E!Mko>1GoivQu`s!hc%X3pw9I++NeTKLL8epPM}m=3;_;8M~bfvocs zMdF`7Z>fKF56|g6-4qDmH~Y%p%gD&b%FW+IRCMt2FQ5q-(Nk|Iw4z#^$!1W;h#n!u z8IMrBC41CQadgv1A{)UKCq0IE(|z6z>g?{e@nzlXM-D|a**O&61Id|MpQi(B(Q%2l z9HFMQ+bcKs^(VAZq`F!p* zh40MJkr1PKuzuCvINY<_A%W^`of;^WUuG0zqnr6qZ)z=B_Wxn&ECZtIzAlbPcY|~f zT}n78DKW$-NVk-fl%${_-8Hlfol1vvNOyNg;{XHF(!6(`|N8~Lz`)Esd#&HPcb|RQ z9;}b?z})BokyTAK8hMHhMal-MVAM7`5L^70@d24eb77AV8)oj`i(=p>bc71m5#L3V z#CkO+U|OV!udWuf#|JJBmii10LcrUZIi{!z5booo?3=*7eB zsiYu0>fOI^a?pkmYD_6YNLnHYt@{0ELVOFfXI-Dp*}S4wP)B&#quj2nH^&@{8(hL- zbjCXQ(&=~0&ENJc!w&sJz(!A&ML9ZYPNk=IpNB&SIrvl-E`J+3wQB#`h*Wp%;>}&< z{>FGcZxJh-1f5_?)|smWir1g`FM1Y2`^({|sv<%UaC^mr|6_@fObWE2u^H-(Oi{S|N zf1{s<>T<}#Z4!qoue^_i+w^7?&rF41$~cTeG&Fr5c-+Y34rj~05w*1<*l*+73UonL zVZEzm>P+Plzyi?nOXb;d6NAI|mE_S9GYJXmFry|FH!@S@ws`#D4*}4P&EL7b zUXlDghLpROB3cjtpd6NdexOxL0shg{_M+I;WKsm_+Q4Vo?+ui(GR{}qDXJ>qnKC%v zYD6ejoVm8ma)a<2Y$|i-EZ>uGwI6vfk}qrX^zf}hE|5=z)i|VptcGV2@={mTN;g6y zKD+d$n{V9Ev616P1cz#Jx9#8T50}sjFPN>^2gHHm_071<( zA|Z5KE&GrSTd)8FbigiCy7!*9^LGo4TY`QsFD)-8{~v<2wD*|uX!M*X}^9qnlzB)UIhdWF~gR~(D{ zyck?JiD+b^`hKR+C6lNjNor^7l}YA=v+dG)Hf+NC*e#kPC7It)1cZ5nYRS!&-=^gX zOZZKpB(PUQok)qAy*PZ5?u=W9_p zRVS~jPonwXSuCEmc%M$XRcFJ5FY#s1_vc>wXoyCPkU0WjwLKf8p&#@_L* z2OdZ=^uB~$7UTkfGOL0B%2`1TcktX?^1ft{1?iUR#Ut|j1E7Q8i2)$=%PpME20*{O zBpbqL7{C0PEKi{|;)Rfo_AD~w8|iX@Jhe@qrlN)7_qJEDwNlsRfh>BJ%h4Fa)PJJp zt&CyAEqPA1hdGjX6DT^MB?HAFY-FzWxitEGAgkU&yT(3CYC1;iBHV%qE=@;9r*Vka z>y}e0W)&9w4-Ff}R8n3?YhNE@_wJRAe^^!!-@u3Lb;Na+1j5)?6_$dvf3X2G* zT-db}kb1|5EknoisPtRBsywu`M&jGhO#SZ8U7*+QbH;r;#uH4aGjL8BJKkMUHP_|C zBB}Uui^u)WVw8mtmh=?WBW{{ksD8fK@SPIYjr%ZCHgjx^wTH?sBGr*k(;7;@dI!*2 z4k2c2e+=>at4mdKKONU@$OK#^@$USUp@5s zc4CB^rbKe}nP@cnTL+J0Wj%#!-J(L)?>Y`iizfDlcvl{~GyUu&4_F-YHJ(&tIAuT0+4S(l<|{h&%eJb-*q|X6BL@Ze^ItUYT{I(ddX#{1ln(1`@eqeQMv)V zUp6)~5htq2dA-w!{vD0&Ur{v>f;|zPAA3OiJ4$N}OVPU{x<;JQ17qysYl60?1 zLI~-wIxvV8O3aiwV&R~_&41gD>YKXyhia(Ki$0DZrkG$RuQpZ#c9w z+Sv&)XxhtUXx50i^znYTHlX86)I&Gc03b3ZDSGV}Y}by?F#97TKCFk01`Nq><(`WpYlrlqX`*yfN}Vs0S<;*9rOKDq@# zRVV&oG4bQLaE+U0M)Zu{wU>aY+hk z=%lQ%9#QdGLj+b~+m1sh1c?&3{2~dbL!fq|W4cD+k?xsI+;4HK z!Ng0q@XAVY4Yv0WvY;xV4|l$h@%PTWiiK`lWd*Pew!=*-Vzv(Lq|xA21Mt8F4g34f z)38)DAj*qkt}!a@lx=mA#>BVp;2fHCETX%>kHTyksU{yKx zrRnS_ovHC@!h+u#Ljs_3=FTNY)NUu|bEep)PL12i5pLDKOqpf5F#p^$eDIYzi9fke zAllcLB+4xzcmeof`c*^E63`F&2yRo~$eL^71$i%hs7Ia1)S2ODu}%iYRYoZm@*|OA zr*br{sN5shA)fUr2{7SC0>CL|daloJkTooZ4Tw-Doa#gU`p-V!Ymn7JLDbt(TCETjQ#q{!% z8{Q-8T>37%zrFJ z!f=hwI1U-$p#V)lvcL3Ic>48+`wyD-xKfN9rQjmFSOyL{S;PGqL#^0J+Boro}_ezSs0N3JXC07AI>}*u>Zxoyy zDtS9+ zhP>cy>%n0;b%SC&oyDGNkV%HJx@nFwrllm^-`(`lKYv0(yq%_x6{a4I{HpY0DUi+Us+(CI0B<6S08SxP2Dc4Ot`0ZLC@n!U<^SwI0 z@RNQ2@8dso1sy}_G)Nx`yY^v6Si4mFlO}tbP*9zqJ9in<%RqFJ(89%N9Fi&4+9TLA zr#u=ht?Q-18C~=T!4A^bPG3jIa!4_-6bm%0Xx(!g3Bi-R?Tbaybk9uNWh!K5arja^k+!+dqxC)5)>@9p)AP_ z0+$?Vd{((BWiNihMTx)lPWKaP=+;Lz8y@|`>bfk0&rDQE+~oWep+VzolpY} z$yc;ieAUfxXQCg)4e7YOA->E@<7Ho>N&Vx`^Z`YSF}Iw9+NlfCkp1A{ulj1>okWuw zgJHn~B%;^39q*bl^n?nX^dAalQe|=<_Gp{FF?qEbOx5f(7qKHr_8-k{S}3?X*={#} z{1Z}8g{KZv5dEZ%^gX#*efV;;_N&RVhjq86_{r8-)>DuyI|rGupm6-ZRlh7sTs)PH zs|ZQHs#@>Uot2yV+*{jut@KZE={s#*2+zzY%qYALS77}%HWUOl6#Na+fb9LkW{SG9 zZKSYaE2}cUpc8Y*9_SBC8cYe*@)8@{o6M}GAt7`Y+(?h%K7Qt^GNAPtP`r|cm^4oD zz5DcV9tAF-`sJxs7Kq25*9a-m~h-`S=cpdb$8*^kUIX`<+#lS#csptFaKP?;kqoBy`{ zV`LV7*BJzRE%lse&02NaE#V0U=9FGlPDbBPWl-81H5se*W2#esVmfihmN^rjDsd!Q zfLvi^0`lY`eV3g)qD6~P!932a3<@{}?{@&5Y*xlp$cEC*QnO)sO0fb=o~mw|Y2*=+ z1p&3`1+b$8j6i6w8S8y;Zl?RJ{!ohG90zI;$QCkfw4!k*oew@O6G83i{$yF2EQsCW z(4NN^$%oBrJw*V1GDZ4!-KuIxpt(bA5&HfWs6?TTcohw3JWL2WQ+I5^w+wz?m+TQ)ae1hLffyIk{Iy~VfpuWYn_?LB|*`fe#yfI zHiTuC)Mw3i0U>@#{84RHWRB9JF1M**cb;!wb-Uz6GOy3~`{ENtTeMY4MHlOx1S1c~ z)+lVhy{5Ph;qv?8K@j;^l85Jo6ne^P#PidIo?TOoKMMtelB^**y733*XiK_uex`2! zw4bTr_R#3C1XEN4f6+h?;tI&RIu`sD`I>kl;UcjBZh_zBdgya-u#{ z9^7Mu2T4-{$kFolhr7Q(azOPDF?9Bo@=|3o4(?j22xSZdX56Cs7|5Fnx9h}yUS|_Z zdG6^Fhn*drTz3Y*@EeR8>d} zkAf|3%=SjpwU@b7=c49j;oO_}9Q24`5z&XKik!Q7b?Z`;-|YRU5XgAX^54VFV5E`J ziL`wpvRBfUcP@1&eLJDbnM}Q7ZX+x%8+O@=&E$)w)&^L@ZX$^pvCLgjLOu{5@ZlH| zE;Fw{t3H2QfqH7)3ZZk9d94`B*lIJ8%fT_R+~JF4^c&zvk;yUOVVq@kL1;S66AfF$ z^Xin2%cQf-Z^snEgj-KbYeqZG?={H^1M;)eD0jE+{;e{(iC~?WSKHGEqnn5fZaOw zKmHI2L}hLHiqbS_xlyA?vP@wos+OYIhH7wuHPs92MXXP%3a)&pU(uop?w+$Tv9;n? z-+DPQz#<=#zhDJMmg?7>84*qZ!RN_SYcuaMgE~7@lUFJ|{FO86R^`@mV)UZ%L;!$; zv`?+oG&$Y1l|cH&NQZD}@46|stUBcD$DLtrgr&A^^A5gXi?a=+_U~kYD!!+#^8Y^k zRrAq?9{tkoDgB46k(2hP31M3ge2}XKc11Lk&NQ>E zgR)g=@Q`=YZ(rN;NuzGK2=VkY>EnRI|6yW=QOc)lf~&5Eb#qXAK7OP@@2}_Dd)bJj zF4yMQWhqn1sh)bDY#9Z-mb%*d*Y@uvhlbqBR(bQGrkNX=k7k}c@ylm$iYR5)x21P= zb0(3-0)YWNSe4Oq;&+|C<@ zrn{3NL4cN5^C2+$3BdNharKh2&>CoHhzV{a>_({?3wpRsA1*5c@6^_5Ac5mkhM(W< zCR3lmL~YHF{KD5+P#Eg5$JNPzp5$|&Xt@|^y{0vk-i;ePQdj{1#fEc7tdGV8$h_P| z8DvxI;{$G99PT+)u2F_s6XnK|w!N;60YK5trr$NPQ^rQ28s9w14}JR>Jcl!$f0Qi5 z{iL2M#NyM@E&gh43|I_WFH+dC>Cm&LrM7{W_gHRl5v9+m4t#~A^5zvFxliBzx#YOC zaYn}ZOUU)+8|6t^4(vHq8b`tdFPkmX95P`*f}TC*N{QaTP$g>x%>Y zy@#Vv=~shb_dSe^B7UluOgF!pf_;sFiz1)v@ zsU_HUx$$&Vf{n&8<0Lr=utKgEA^}Wrw@HYNaz2yclgqN6#}d7qL6Del?_ViU(i$NC2WK~L<%;u#RahcVxL*HNZFsO%ylkF8a9 zchh`7L2|f}so_OWNIF!48biDs=q%2Lq@^-r4mwK=8QcH^!QQJS$YkN;2yM&kq4htd%CRg!1_Q5`hMFI^t*~Q z>!x$+d*<>35FfwaE#9lOgQMx9s_H`^hV56WB-@)X2mbBr{R*e?>|b+!Z3KFCe=>b~ z-yiM0%7}PkDp||EA-JXU)HMWqEmSXqwSjkrYAH9)i4R`t{Ypf12`=`X@J=$vZ2SLX>JA*xbxT?z$c43UHp3b=fr^C&n)P3 zLBy7BJT5sWz2EI|BV782iXj8h6A_HJc^^Yu4jccVKlIUmBrw?WhI0ON(fi*7tfhLV zSl!OkAG#HaCIP;-j+dsVwnn;ddY(zS0*nVK^Hq{km$n|JG3xqnBUb&+SXS0=xz{a} zOV90&fkntfX*XBSU^0u^^;3o;KmUStHw|!2IV)kMX*RL%=F#P-ae)Ex%^&}a5<*Az z92?fL>e05j-H|qHy&fZ^HBRPYRt<6DOFjOhmtjgDrn0mCUqd2%GXs&n6 zE9}Zp0Vu3u$^-`YvNHM0EU>$s14;f-zZcJo&&k;8JTw1Ff-~z%cI01Jj3s}cq?nZr z#B%4tb!_%HSUleB8!||pLI8*)eKBuQqPh`gNdK+8i!~>Fv>k{B1`*#sX1#Ow=5xP1 zS|6}}0lRp7)g$%1nc9FQRdNTBT>r+l`|ZYk>&;>F=CF-5v*`J``Nedns$i=d za=vO8Y5k=)5?P5jM|EL{D@klcEK&6&s}IQQBoP^sQW@6SC4J_rG+&s9iw=w%&8z62mHIrH zqfsLtY3&&7`@x}VV>hlYZPcLaa`S-?MiWCog{v3vvEv2K^-&k`()F-?c<;v2ojO2u{YbeY1*? zT;rqM%`fi@{tk6S-L*H3-K`Eqb!ScmCDdurPsZO;lFumGb_gtP|Jc%_OJVFJ)5BRR zzM|xa8YthcH+t^?ysXxfdUg{R=93?h=%BoFLoO|>g&F!n`-(I!-w&Lph_~s2x}W)J zo^Iv6I2lp=&Ab_2_#x0H((mD)pP*o7;t%_h(%#&lh1KI81?s z1Ux-G^;ffiqVtf!RZb}5iPKfXgZNv<&j39!dT%XFtI=8=EY`(J-+Pg6ww1kdUGEHj z`hN7b&+k?V1H|9vd>0PNbl#pdbZP|%V@;f>F$4MuSyGgF;@@}Jv@dY?>{C_y{%o0i zcQ)VLN)m;0(uw=O_tH0MhWJ!`sV{vzYOF^BpuPHL#}N&G&FP65a2@9>A6dhUulknG z_vcP28P^0Hn-9c}$S!^F&gZrRC{ahnG(U*xuzr5?W_IDj#;snhjRpl0Aj@w;@8oh} zzS964Ooc9^8is+wik9zobtB6^Yf{rrBjWX-uk%{_ip?4XiC8^q(RpJfQ1xOIH9xXL zh>Z4+K+i<+{r42=R*qn#KEI1tTtvsbTMsuTX<)B$>{l)If&Ixq-`#hcz0rvTrafc{ zq-=`a1Cn^B012unDU#)f;(Roj^KdN5+jl7+FUtDzJ!3L4JJ&k)LPx!+fE)s#&tAi3 z%n~bHOSS|8Q$aQ37BtHVZs(7|FC2Tg{ZeO8LxC)3ioyMVWn{51#57cBIxlu zDmT~Abb*`j8W12(W1r!!gWS!3+iot5n>A3%J%XCSkC*F{F*LGH((4@qn_R)q(UOx$MP@r?)pVej~s0Zva9Gdy%dbi0VeInv)fJk6u z0#aJ06wBzEuUS_ppIvKoFjc62di~e$!H0_$WCvgij8nbXV5Z6QuSuH$iMq}X@RxO} zzKJ^tq@Zr5#LImhdFV2g}eND)q>fYhi6EaUMv4&PZtzmp5)o|BxI+~}c&a9-M-FdW^ zm^T&dxN@G`Y?u#=`f4yfBjNiZAHV`5tM)Ho3`QsoCi;b{{FOIwyQUv`O-(u1z4nkGTEfXk1w|{ zJR($3&3pi7$W));KKKcGpU>#BKwO?q3`i^?mfm@x;fi6fQ-2mx9t7k^g)TeAF^syK z(^`U!^JF7ZFjtImf4(Zu1ozx(mpx<5QG=`^Pq#_vhM+{L9ZWg4qCGe9eQOZ63o${g*_KJKXPwqGpT zR~|w@@Sw=!+B4@N{`$3cAb>u+pgMkIizrBgXo36sy1?dc0z6~N)SpRhcw#VT8Mzg$mc zO=>zc2!FZt>Ul%`J?<}R-p3iD0;b^TqG9R5Cn8Rg#u584XMOcAf!QeP&HHIWYCgR< zx|m_8Ga>5}qlC}bzg`_TAYEV$mcwqwb#~g0OqmZl341!~I{C1wK@la;!p|>#MD8CK zIKU-;o!{1D0^vWsp$*CueZ;o@%baao4irprLP$FCbrs8Nw!(C*ZF|SiDOA=%nE7d&+ML~kBGD;+oObfWK8*&{_-G>=`VFfT|m_ff* z6=t>Gn+!5tm$XhTJL=PU1^OI3v%ti}2p+S1Ed%K5^{Ey|7R@WR^qZU`o?_PTahTR3 zNuvIHkGQ*U<)d?L&7IzBAF(p@67-gadCE3qdq(6cx{*ozGd%z5{8h?h5<04HJdNX@ zXzQV`1JzP56!JhK7!78!c~T3j@tZXRmU{PDaY8fZTf9#t>@Fnl8N9l~NNLCqlcQPym6E_b4IDAgEs^SBmUQ0> zdM;A)3Y5cKtVV58YcuhO<6Wz)+!MWV2($EgHXwt{B9YXBSU4_^qPTnUtWZ<)Hg&2a z)9Qs^Yx6#~zPmn`PiK|I+7~Z9P7`h^y|Tuah{g*j z4E+!FdWurOaSatf-ZdeFbl<%)iVrIWKb2-Ma)L|bkG+bUjA;0SpXw$X#X~c_chZjE zsl!T;xS)(|(^ramIar!x?e2PMoC=Vi>fgkkg9jQLbJ@H!SWjk}ji)iHJVZvD3|c?c ztu{q*hH+*}eQx6A)h#CgKQUa_P7*uP@IPE>{)n!@{<8JM($DhlLqDIx#v()8sBAHq zF*&?+u|?f{xG9$5N->skq`ikKc-dXJyK*ztqG!dOXVivYdX24~OJu}+5jZiKPgC{5)#)E>_-$W;<*sFq%K$CHaxpYiInHXY z<~p&3XA<(cC<7XCU*%l=|DErop9-OHyjKT+^QxymD>1AWAWGFSv%+i%_2}?V4R)V| zfPiI9eSWy|ZIeO7QhC^B5y-=6;g^IDI2d0`vZ?cBKSUw_l#&J)%aaS!CYj8%3# z*`UF@=_;qyHfJ*haESwhq{mtLG6zvcmvOv=LL(XM_=S-DEZ=sJQ_gHrYPF_T7_sn~-(&QdEoBg&4<;Nb};roD>M%KTQzch`0fhN%8 zzMZ72L$9KP8MkDyD0c{uC;5i<*7qOf0R`k|l&b|H4!zdXpRdot$@8X_d70d&HGmZ9 zNYL&7i}q~MzCt@5K!hbzLh7O^6(t74pAO+GuXvkPs}czD2_E6{9NJ#2ke&s7A=@0n z+ZdDLK0xHf&azG?<-vxze}d--u?cD23?MJ$XB;>YTVJsmQ>o6X^gJ!-6rFl9=1JN& zb+m17B-9>mPsdUm<~@?3B1wB~y3BkFZ2sP47s)@(H)Tk={$%-O-XYo-axTPIecuXP z78(vq`ruzJ@_@ZJqs2wU=D3r^jEWv@$9i{C0*=OQkHu$yOH>mQF(i&l0QNo|5fAMF zAm&-qx1VwG)!yQ_WXzud5zO-12#07GoslZh$LGNg<%Xi^#FKHVy|1=Y9&fE<)wq%6 zL}H`P&r_#=YN64R4Z~wn<$e-n(9l!m6LoKq`BbqaodB{>Z82E45K+VmC!humzHuOs zS#_IIM|>b;s>Zw8bF1EfmWhtp5Q5VTDbf_#>!?jf?kCE{e|rVa*dE^ei0|f@>Xi&v z{jE)wDUH~=;eh-J?9MC~Y`?7rSukauu*rSjOsLC&O`_aBKeiSNo+zsF4Z;3iZ+t)w zg$ew4#N36OwBu_D9I9wM4<;W+M7NjT{d$2z*6f!C{!2YjZ$u($yEF*9xXEqzYSP3DGK@)ZWS+wHhKvG*PDC3;gO z5Q>FGg@chT5yX|v=SoYz2V6@ppmJEa{B@YgaqU0#^XC^(-n-Y_>BA1H2K!>@f? zfwwb{F&dmFYCnrid<)GHK8S>V!dHxD&@DCyIHuzN{BW}xsx_nBYX0uVea<-LEq-dm zu03fEJz1vEy8v(}Ocqr0o^C>j4dNyuB^7p4+l{ti$>g7W=cNd?`=0g;?*nhDd7n4A z0f@E}X0SkPIYm6YU0O4m>-~%g?J`E`C>yrRp7(w7VvU4o#D5<#Q2DM44HO+ii%8N3 zhl6@E`SX-w@14GJNX_+$T_V^&sxwO~fi?pnG0 zh}#ZK@cclvjvSTz>&D=H`zHZ4rMt7h@B9$3rU8YP$eaNLH{}?1$sNLyowaTWh^Rmg z?w=S)Rlb@~VoI7Ckl+Y1sCE*qNa-R=i}${Dl9PaX7SBqHql}t0;b)-UG8| zrpfMf5#od!|5beL!b^2PSigR9Le9W+-Bzl3z*2iRjDtCO(%eCT;nyf&BJ#9AZc*bk z;6bpuy$8MNC|0f*we3xCJ?4y*`rIrY;0W@i=0Oj1ofM0)QDgUkOf*%yC7~edKZ$%fx{CJm08gM8qT2bz{=#*-#Sm>)5lYl4V+U5$K9lnbkXLs zNmXee3H0l(LTcWp{b<%dY5w4rz|kF3%A$uWQt-lMKS|dFQh!vptn>LQlb3O-3A2#2ChTlvJntdf<{HJHRpdIdz&KdBlqPyy36`Y}zbR%VfeX{!|D zUbaV7MH#LtKsubQ&(nakjc1~!-oHH3`hx-B)j_V_Boh42uNIij*1fAV2)_z!+QGSoMKSpILR|5 zJsrK@ug^;C$%x23W}=ZabNW^p1cQQ0TonC(h<#WL3)%I__AeG{9JtN$yT8JuHe%)! z;TNcXoh3!z?4KDKTje{`{K3MBbeU+XETPX9wi1~7N&ER)?%nDul`QZ`It#AZ|VT}KB z=6VbnJj%dxZ+cg}{fe-<@I~hFKY%{=0r={BWqGvJTm<)6O!|h2pDgiR;F-M68y5;n zQGck#_xIxify7c0zq}*}JC&?I*7+CL$t6QS@v5VDPf$E=dQ4#MT1{4%@XTSpQZ+@O zk#uYT2J%rGR@X&`Ik>oyeO9gyfNEOP9&25iF~z$(8)}CDuQ&>q1RYg8G`RziaZQ*@ z;U;pfB2Z<~7b8SN`Dp99ViscYdMFbW zc9mCo8y2|HWmEB>SbjaH^Q#C#q>A!&;`^huU;RLV$QbOTfuazD)wk(RX0OoXvsQLT$z`)pF}(IfWW@^N+$j3v%h<6w6l-1@jlj z8^P2jG^Ts=kH=QCWgiPfGQnbcH5apCb^w!76!0^_2POw3JQJ|kV>faPeX0)-0{icpN8Bp*XuLghg3jz+O9LiFMOvMJKHoAKf%H*%YHXKITY8MNRcnLS!g(T-{CpuRIt0sQvjm z2P{O)^Vah``ZK?Iw5E#6uS@zzk?#Xb-^`UJTXu_L!V_K5jjNu5aGDgrX)6ov+k;8R zR3IvRv#VMMNcO@q!g74znV3f170DI<BHR2Pqj^S+mJax z<(?>jIP_L5=Y|BD)xhD>M08?&svwI5vG+Zf6^%Qz+Hbe@c9CUAaxRf%6a!tpVd&k4 z6TE3Jse^*KbF%$YdcImYWXiD$zIjSC8Wsq>?Vul0{YHex0@U=mBqwEmVsg;^i9kt4 zwd%?n>_pp);@pn@^jX}oz}`$ibgL}&SY9%J{@hpQ_67%A!gi9~^Z83b*EItS{VC70 z()sE-`?>N((n3u!04@C}V?`PggXS-NYXE;p&%~K1b)F16fduNT?Za+4Y^Gzp74oy zb||IKsZ54h4%=+cvj_x1|E;Ilr?#iVnjdtkE#hroiG*1?4=mKY_i@sNIVGwil?!`tuW_J+tJO3VP~9ALTlcso*3lHTwci~$k;5t4&s;{oiUn0J|13X) z3}C{SNvAn+e0rMQOpYDrTbS%;OG}hNb+n!%2i;M8^HGvk<%0?1;a0A3Fwp9H;?9f1LtZstsMY9KFG3jF!^F;!H=Q&dV3%I}D;{&IId zciemeV|}E>0a+>t(43s!fB6?opA?agwg=^p2!hI~gl7y=69sMk;-CL#$6 z>SVDC|0BWX@i>MPoMx3S3p$Rx)XfiZcz%(14&-2g?zf~#vudE-Wb?>TIwGTI1c|}w z-7(GY9^bd_7JgeMGfV@M25u z$BntY?0ci0;KX3a{%YW$Y1~LYseE?Tgc&yIi5hfJD!?<4eo)Z7sQXLP2JQ5g&LSlj z>lT-{TBcQzX&8&5PKVkv?HF}J=x;p5CqK|9noRHZbjKYs&^osmKOu4`a@-WF6j?JZ z9Vk;?Jt8)Vy)2GNM{Ar?N1H?4X`xT%>dJWjkqh)~5r728wyT}psiGg4{_t7%$>&bU z2v_t;de!~eG7G&d#%bQnGXhWHMs|vFg-%{q(^% zpGgSFY&Hi zMALza(X^Q7!F_8%8jX$|If~l&Ost8#30(47<2%zOZxyKOPE+%FVi>5@g|T1`5F zZBfIRun1{00KV_kpD_G531n41$_Ve&ZF|td3)djco?1JT#04ixxKWcE_ss;}F)nLi znF>bo&;%shhb%xvHTldXx<6X^I~cqx-X*_`5s&Z`)>@xkZv1FrCQKjv9Z>F=Cn-*5 zLjz`0;>*tR*;2+3Jfn!w0!<*`sLIEEs&8YC%!UC1J|q8@IO2}uMYb2sCpBF*7aUaw zOZJ6YIoOIF=2r+>l7^ZAezlMXa-LH?y(8BUa3{$@S_C`)L}~)gKNtMKj_I?hj7J#q^ENpXZ}JBNu+06A0r zkDFIUAG@~g*6U+BSn@w;oqu)_y5Sc5SMpOVE5_cGZG>8ZM>m^y8ys5oi{|c={goMk zOk9AnqaaxS+ivL$!v*Q7!KMWNk*0q?ky0}8tJw}Fzl(a!cm?Zl%dls`?Q<&Cwo{xM z1oK|kyG5;JMj{gf{Ei5N(;S%Xdj7IP7Cqee;qG6~EJ}#LV2C@a`75_7TjI#6JB*Y; z(gOpRx$E+Tm?QUbB~=uLdCucvqtaKY!WLNOI5cLj;~*agYlU{nbzW^6bqb+IolB_pm3D z3zV-}1Y6G%5-q+!>A`=?P=}DJ_=FnOd zLW?``e@x^*&uzLvK?6ejQo+9VEScI~Yp&e*$Ljh}RUHEn4bAmzX{)HXk9sYyXiCI7VFOazK-pGu*l2R1MPi)vY5UZmZ zKWloEP-9Y7imA^B9z)kR&V{wAbgtSh>>={SXrI}{{Tz30dcm6{xS66lJ}|%dEXduP zc@+7E{q-mDke-{fU6`?CS^+G~5SdT=@o1wN*2ZlgLaM`Wk2MfC=vko+73_V-%G3X~ zl68guWX3)*!&->5O?g9wERQZAo-tqb#P(6Xg}g#5B`<}G^=QVEqOaXbbS`*3ZyAkW zV_H!M2@eVZNY%8hO`)y$y^96$O%`O!rUV+IPKXStsw(=@r#~=c_#FJi3Dp-v3l)7% zKW%crLv%afa)y||D;14bQOISAEh))H^4Gh4*vXlx&V%vsD1n~5R-xigiuq~wlr}~M zGe(d102`bpMQgch$w&AW%YdKCkn-e!{5K!eF@Op~1+E%8!sve!P4=6>cQHhPE7*Y_ zemkb3=~6W7%Bt@Y3s0TkQGVp5yc|KvyV2jj7ZYCEfFUx(^tV)TP~S3H`L_XCIDU1% z!>~)w2_WnBHWRr>eHg;halkTJ`gg6q9R#GU5<^n07JNbvzrEay#Rp%V;|Dnpau;C` znAL}A(*E@)W8o+yslt_x1e{p#Abtz1 zo~L6k$n$X1X_C7v_2ci!B5yW)o0j9ZWkDS1+MPlq#-`Gij?xS=)1MA$%|HP_It)m_5&8I89*edTYl41Ps#N$s@}HT_9X>tvy>wpaNt@QA zBl)4Yu8j_ty4r$;Lnr0OAxCO$Chu zH=UeKy;glQkYhg%eL@D`iZK^3_2tO+9l;wp!9Ds}?eb<~!YgV1pFFvj|B1!fdaU0q z8)JGNj74}swAn+`i;(B*%9Jl(PXaT3{&2_ey(T6JF-1KCtCxWG%vg= zsZyNWND6;oTTxpNULW@{{fh#PNo+>BZ1(o7$8PO>b4u1tPebiW@w^VD{eQ@`Uyf~J?JLP3Oua72(e?#s-aIE_3-D^Rzq6b_uVr_4<=-yj2s3~rq@ z!I-@mXa#r-doK4qfeG?q`grmxtm@#g7(qm*hG)~pow;@j5B@KTR22bq6YuRLThm$O zWdM~%rtMUrw=Tv%oxyAB_Dh8e{%PU^ZGxnTR@NVME2&bSKb1NsR(r$}aa8W5R$aU9 zO_!j$^7TXtu-oECrwpFI<_YPv9O70BQV|`Qud=YXS@=F_@I3f++3>ce*|5OcyAVRU zLIR^VvLO7ci}1G7sjPdg(1`3pT~15Q{`zl1vz3zeSBz!)cxe{#jk~2=tKzC2ioAaW z!*JC6jbfyAjBxa&K8iNqS7iw8*jOaLNYMXgWev$Em~O4rpRF(@_E1spCPvpA<*0Ex zDU8y}K&Decv7RR(H+mv1*4dYN`63qeqG%}OVcD4GtY>eup2PG1tR=W?SjvLxQydm+ zZ2{+%kowlWE5unVpcpU?!C)^deIys~v|O(WT@;N*)5)OP65{Sg#y30(xeW;KH4efN zUUxzz3xZtWV!SO>`&Bl-etUHq`+SGyjHkK8D;H(pJ*J&}7WbBcScK4*=hMs*vY@*W zq7pWv>i$W{^p0-(H6>B;AORB4dZ(qI{OCW>Rv+&F4eheyPpdOuxbM%FaF?Q*VtS+L zYAkn=fX+rFh8Uxj1rmXA;FeVchAIC9%6Oh~(){tS`9lv6!qu2~V@vs^u-;TQQVJ zH(-=Tfv3HWun($`UC|%@e@uO4SX6D-Hr?IbFqAY%cMZsp(jX-%Dbh%HGn7a-H{FeN zOSh}$nr{ib8{uhsNnXr0k-lJA1ks@`MgT_3iLuZld?%m+s-f?=fPeE1z~?2nH`;jh`p&ASN+ve;EQHLC7ILFq#(LdYu?|u zy!YYt`U5_zj&h+Y&k$7|&y_i#M3kn*V=GhVz({95-~NrI8RJ==iUQ?CRw3PEh(=Xd zOQFJU26;^r_qP+iUNMTJjf&o_hX71G9?r|nVo04GYJJ_oWzxRxuW$AIaJ@s|PC$I^ z`*3xzl8B_ zl=OcnQfLBvYKAu%O)C(NGN1~Tn3t#cXLXBB_y0E<^?&6*jmB9UqId zY*uybVx_=faA~}lX|P@Ok&lCs|Lyo2^7{kz0Cw#&$yO%s%_xvK)P#?`f@Qq4O;-u@ z8EV29CJ!Pev&0r{1MtXAG|IgYnj7!}(6AirY0UK5!oR>KsY>0Cs>4?NNIf5@e=>`4 zCji4gTH4em3Ol!mibmlN&{_V=!*eJ2AqNr^6NUS6rsOlpb@Vj6lhL_aqP{ z8J2G1cRu*O=}$ChpD9?o6p}6Mf+W&MUQq~z&0FHs&g8d=Cs5gg4R=k00Qyg`D>#?N zW7&Ma2*j(g7DuBmhJCcow+fsi(!vb5rj#G4!ClK!yYm;X@zNeA1(0L%%lKz=y&IC15=md)#OUUCKdSl;b5H>tBVr*B5P5$ z4)4p|{Ayl-dw{O{D>RN^ynIK}iK-C-DVZ6~g92FTu>ph2!rBEu`I`6~6z9Kt1;UCH z9-Ty+IvY4lQdpVa*XIZ1kZHw2rG)Arh&3)oc|1e~+o31lA`rJFuHjdPyhyhE+u404 znK$_F*oLdOj1)lEe|4)22P5evlp91v%fHXpe30_sE@wa4kCgM)T1aUILs^Dt1N>^O z7sUXpqc6r5L-NKj&zF}vKVo8~aH|JXhc_c^6XE5YW5CNrz1S<5f3IJe3A zDfGi3T5zEBpb$VuG6fynrh1sT*sZ(;xb?SntK#1kCbqRz65~FO#3>*ou4j25-OMH> z88CeNK4a)g$LGrmXu#cYYL0jzlz@TNp5Ihqooy88qN850`p34FQWRT@ zmW%(d+6KrhmS&9XzT!Gu^=a_Ul-#Z&2vf98E-dG0zI?9P(Fl8>U{dU~bJ-g(FiYZP!MB#MC!_kg%$PX!!!H)LqA6xz^mz4%=O;CaTak-~yUk`$R7ne&;z` z1dcNOcu<7o$~upt7uTTR@%xKjsDP033cF}Ims{+`5!(A=>|pj;a0#W-?O_p?k;jX| z*p*6g`@i<1CtpCF@_1DOs2VNQ%_x{fd)Gy{Gv3wV8@fi?*c>z8DvvV1WopCNd@i*pll zTGJ1Dy&IPLZ$|R*SPp%5gSBit^_VS<-X_a6+`}A>@~u;45X3E{E}+sQo%BV&#fC=D|Cfwbpi~$LS$vb$xU|g6v?a*VMk7%Q78`gO1%mWHcr@43 zy5CuN+K<5ihhTeDVK-@#Aus=D7;v*<({a*lbibnYEBi0{T-}egCAvU0;4?^-7qH6e zykc8Mc*xpB)!!BNAVOFXkEGBD+GQZeECXpT#gKBY4V23NYGyqsIdb0r@g`Nd#p$;N zh6c%Yqr(yo0+pb>&Wzmn!S) z8v)bpS0)1cR-dA#);FF^JXXTCqUA){XGa@VaShtsc2=7l@FRerwLaL6#Aj@5H72v4 zD^W{|@4Efd0iX&RTwf8hs zYdIWG%@_t7c8?ACjVnN<#T3W-v2CM+vUuFKm0xMxr)9*$kE^>M?3wqX50I1ykFGzo z(DZh-kX)+3U48@WY8MQc>d<`*L4tRb3;I)D5@u%D0SB73_`Q85-Q-CiPwfm8s z2Sv;CIiTyrdyXU;ql+=^^69!+b=Ww%E7n+gxIRLR9tc*Fa6Mb^^`c$eJuNTIq4@Q5 z7#K^B!;IfhG-^4}g3PX!EzHr2yIMikx)QQ~@Z}{)JNc_9lzCT#4q|J*!!re1u6ZQD3hAKFISiVLqNR0W||db zhV=$HE$|Pr48Hew{yxbbGIWHKRd)d0zPcaGDqM9Q{#Rk~F|iCgmyQ%*JT*LcpF9T*Z;E*ZvA8D5Q(0l*_*{oU%iMW`;04>fcU-etre zU297uRu8Roy3D$;t5|`g_5>tS7@-;^rj9dzqW!g`!z7 z8QMZ1OV2pbd2~AFTCGN(vXo!TpgEg=kJJ29rd}*<6vjOD`t4+<97^0dKz|;z!JFEF z)@li0CP`9xZ69f^A8hE+n%y0i7iF(EEy-#P|25jg$B0~x>=K8mQ;I8=&*~<=R5_ih zC=@Wa%WhgoaDU#x*#5@=weI0nr-b&2)-?+|D|hjfCrCahkGV=0VGIS$RLfUt77Z{L zniOeEjy70R4+$mErXZR8bh0=|oyV&i{HU^a^hugl=RafedDarVffzRJg;0BWMU-{V z!O8u5m(+6+<+_FhHff6J>%f29q|w(#-6{nA+2&FNX>uC*SEbCM1n-vhb81|C2lRe-XlCXa}Ec*SqYM_`c`Y~xp^{#8hTwf@isJh^`H zl3rI1v1tF10&h16@g3Qd-`j*2N|jIi2?@bp-=>Mk80T%zw}91508*Dy(y!IW(UsC% zP>Xv|mq0MCy^JxeLqU}xucLkvBI5BDMV<(*ilY>IRql$4OY=@uD>9C4dK5Nk6cMaZ z*C19fu1PFAm0TqZ5}Fz1guA<%Q-{6oBZLUkm*AmhzoVo{n**~A-(2tpvELIi4_ukZ zgXXMH|GHl2_b-YPqcY6RjtFE6){U%zX%9w}t@C_`l9G1#4dupK7Qu)~0GO%~@rhkz zd~cw*!ZYaKWl_rvl{HPrcPFTNJS9hm-2NSt$GCVOru+tflrw!|c9cA|NXT95;jqJP zXAF?oT~8O|RHP@a)DIQdl6($;HZ%p*C#rspoxOA-Dkf(o|L{~ z@K)$nQHZ*i<#DQzjInK>GSn%ZlhAIt!Rigk9`7D@hA5qn0cgEH=HAg{ugm+-y_T)a z<9b2QdDss*#i6E42rlD_Qs`4gyu_*@{uQi+e~{Samx9H-+`1z?L@mV$u1@+Dv**eURe$ zo+p)90p8+spfJvR;=F19+uwQ^S0&*-6k!cDGW7_&6V7>`*DF8S-e#;D*_}>JVZCdgf;vYKv**X`9xZ*sHP~{x|n-xIh zHah*zq-hpLeH2p#aS)8I2~`o7Hdw!1zTYoQ*sM*szubeZk`#2FGyH8%+qRGd{B*a~ zDzi3Ie|virTJr-q>M?mgcj^WXoA{k%vJW>Z@yd(h0^clCcHH@Xy6;R|V6I?O3hj3? zaI3M1g6mqXj{CKzM`b+}&A+Lpb2%>j_ug-bcu5}H*;3UWi~ zzj4?;c(N7gd(3MprK&F*b^EnxAyX^f=5h9X65Hh{iKTptlj5_N?KyA@n;qe6c%&P( zT-6XDK^q?oc^Uulr1~Z|fw~ltW{J)M&{c#Y)fqe8CZV!r3YmBirv*5sJRM$g_5BFD znX)R0wu@gfAY75{M3@Di0aJYEF-O4LXHcenM;PgbX(iijp^08p`U^J7T6wWA3{xQ& z8IzZJ$&w?GVxK8AD$H8}!=P^`9{wHL;d67u!33GWnG$w%v54OFJyXRnTlHpbhK2%jVulMqC-BN z{nnW#7_f6&fJ)iPQCe$vKL~baCo>f>>w&A`Hti$}yk+?3_i#|k5p_uQd4hKg(VqS0 zy`IVcdaBm{jQRf@iI%tM2n2l2Oi1@you$$%LY55Zxg=V8om$lW?37l8@6&RvncosPzsZvh}M2q`}(q7$g--=D{$p*}y#4E=zK9wc$rB;cGjIW5) zUd0#WcFv@2j|4Z37sxH8Mg$qOfb-n5J%DC0r<26wE^Q<4 zs9*pGV2@vq(vTi4r+hS=dM!^3tl}ZMo|{E|6%;=}!TV~kL7+!9KWNywBV-qqZx-5RwaQB1t56l0^}u7Xyu$x>Q+=l^KR=g&q~tB&a+nL3lHg zGue~Zdfh5}5Aafnf-YRc+-`&;94doIpOMFZy2R7b{6%>tkpT=wD}GT_SU*D_?$@&r z%|gXNBC(l#@s5md9}u11A>-(*gOddIi(+8S*B&U@d6zrsA5>~B6muqUic{yn2TI$k zo17h$8kYCgy5%CWCV~Jp)CL{NsXNx=?ggEnjC~L(N7qK}a60_RE;H44Uq~b|)B$xi5w_#lfRexvaSk zGmDbHqn%c901;+eK{FU3Ntx%h*&3)x^xqS2X5>WW|1~7Ke)<$K==? z7|ny$xoF+S=8pnlS3lQQ&NCxR9Oj4J$KlpY2d}cv?LO8NZ7lULlVHJ+#t}oxy(=YR zbqB8$^7ko2&><}*5LFsssHZ{}%Vzx9)OC=U<}3rLw`eU*m;O(fTLXHuZ4hP9c09Eh zhEWI#Hi9RmpuPKcl2VDb#g_QoY3lX>q5APmp^`{8m6%861#4=36w8mt->2IMp4b0= z|1x^~*HMEshXnbynFF_X`{UIg+39chGhiz?2+Wt!GovdXuaA~s%XOf^IQ!M2?~B3B zfIf4Z-Gj|{=&+4;|D(l5TBwEhg|lU17W}1DqWHJ-kLNOE&0wBEZrin^ucgS74CNe& z-wUcuy9~ial^8rs#`tnyXyh1BaHv?t$^ku6rB`E0d{D&mUop|UZW_tc&P&#lZ#Fqe z)^t;_A-W5jyrf&aUX((+HTw-RAt;p}fp}JY*Ha46ibfIv`>YHqH4;?Ec(m9)MZMyu zs@qvF>Kuyx^+p8kEZFKzI;Whx(dHtJ?{Pl58JwXkMxw#aQmd9_-Au5lahqH5aLP9n z0C;X;L-5WEdnZ*vbNjU=HfQXUX7%oT9mMJdP#TmpQ{NLo9@s^dA-}b1yFwh`PSAAa zY>^F-VIw8gBqSL0(jX5ptwFuD%%+Q$(NlSJ4mO5n0K23WK+)!k9TV`B+&|Qp#A-EM)mQK0TjK z43ntcP8@S0lt|*@P93{@ehJeqofLcjCAtExzM_j0lFYXnxp_{f97Z`2V;rQYcD7bV z>DTw5i~3roXj-&o$qXhwpK3x= zPKZUT2XYvV{K5>EyQyfr3qdnAKxSMKE=Ey#`dQof?`WNi7N%L*r5slqmzf>8?%r-$ zweD1o4lTPn#tm%$TdoT^kMzi=Tve!|H<;Zlx~;`s@}~V`DJjckL#%9}pU2;xuiF@& z6_&ELm4qgYe&ve(rU}=conL|T8z)5cEkuh%Md{Xt3KewF5Zguqg3+ntuV#a+qSx?# z@H55wRuOFcMvV66=H?ld3mvWhl_nK|I8q)Wf5i#^otMtCf2A72J;G+|xGkCrSc)W|`w6s3$9Xc#%{MJ;T1CqEFQHW~{^jp!<_|sj z7p85ExF>ba74qnQ>i8%%{vRnlKa*crLw z83ud573qE#uq$ATdVRV5aVNwiTOnvaADNW-9bTF`O@4)5h7Q5BXKB!6Pd)1$dt1Qk zOCxerV!cCVls&wDD^kL`o`z+kZ~zXaP^?>&pPezrPLc0yLR8cS!P~9nb*FQNXYgf` zx!e0zmyIc@*Q|#uej6O0_nls@T=~|ki>Rwl{E7kG5K+%I#RTY`vR5)IC_41Nync*p za&pjl#JT1{ls;T*tkn!vHsA38xKWvR^ni11;&#@L6gD0+(-iLF?PoMm6z{O_*#f=y z?gCJO8A5uV|Ms8Xpk?>QYYNOKySe@XWEDUS@24Hdg9QTU>N)HaP6~dQeQJw)`Nuh4)$->M1E0k0lu1It z0706lLMpQh+Q|1d1Y|oIjEs3FeQCb@dM->Z@~(oE9-mvbeX(ivKzT?-fXd58K11Yl zNqj68dC7txBRK(m|49syGL9NSN7+JK!F%lp{aqIa1388w?fs(tWK6hx<@FT!nQLL; zgTa0@I`U-JF5&X*j6N{C&H3gahhFvk{B}4tW#eqBjImNEPv(9k-UIhmwr=|@g9SLO zveDe+1Q)HF@?hM%g@<11adZ5G!C5!awoCvY%El{4WANuwCK@(d>!rS4TOkS*2pi2~ z3Y)gTXQbAR_VJKDG|!_&?4{sSlheUwXr9EOPhTjyRY=g#CX-}xCrh~5OQ^QT$?7$L zrgokgx?lL#H#5VHkE1)3tMkyAm8-|n-c+zbh7i_h*60bW0!PxhX;bQ~e^N+{EJqtD z%ouN|2T>Sv4zX1shxwh`nFxdJw+W{V@OegxJkrk$groM#tv95O!DYBTCaNdVVQhu*5&qe5~TVFJ|Xbf6i=(%WV_|&AC&xEl? zY*v$ab>t8Fz>4Z;@EC}OYG?9HZZX=uJnbLHNjf}}lZd9_+?w+6-=?P6t>H>NCF&Il z36#Zqz$!Hwtbay#6nva$gbYR#J1qRSBfg`At`!8>$KSE!{8#+kLT%#dVr2P>CTUhchEsD}qZz_Ko#y*jPyN}Y=^ zI?7=>m1)Yc3_Soi?+{bDOejL+Xp8P`vjgBDisX5MV>^`?Ra2sWP9Q~Cm9b%hZ{zs`q2{i6Dt{qEhu zL2K8C3l&>4y!sht)08fX!cko368b@m(GH?^vqeL3lv@&f5buBmkj$qJf^B?1P2>+B zbp}yGl8=9yVT#uS&keQ+6XHt4f>|9t05&}t0PCaIOqepeA_o<9=6wX{VE?yeaNl%@ z(O}u0_^F~3C0AKoN~GR&i5ev-#DdwSY_>#g{MP^RX6MA}{bZ5LEO`)#7`O{wW^%CF zjOZ&T&Ko)LZ=CwIbn33?k3)eYHugsIqc&qBW)XYgjAQy(;+uq83&i#LPm3t}Hkk~g`vh#KrT65|Y%X_ywy8OU_itDM zAvE(@P3eL}lrOUeyDAXHvS0#@w#=m>bhYbfO$&m!Z4e4`ERH!Uoa8BV`;= zl&1qz8cArrnx&;B?|}#KpZ!jngsZ~$P!gSbbeU8Dhpq zGwSS4PR9I>QB8v8ViGeHY60G0B33}1zo&CpswRdw{pkcyl6MB59+EZx%^#x=$aY&P zLjw*I|Ex~DV1z9J`^JZ-%PD^AiMt8@DdQ}?Ej$b80VC;0BjNX;N6QLA=mRK*1W&PFf{$k^V z->dDYg~=3QVS+G zeAHWQ`kRHxk!ljqPPAMKk<#PcU2a`$X($xyy^suC#27v9? zs`+3TBH`!t$65q3{ZvBTR)2{&>IEAbn2fSv#HgT{$+^Fban#6*GzA9H{4{F(L?e~P z5}4ycFpcEHOc7%N+ZYtL$*(6PTmRPQ%2t%oKsG6lk^oiVgr0~iYv5q;oAXjNHKNl> z{l~}K(}bvXewIFD4Xdc2@1%luvq&H1Q14==q-%;gk{nIPV(7HX=1^|(*YOCw3lsQD zrUSgoZ>1T^paZ;gL?pt+LuC@5=vI0-1EDEPVbFOH@~|_=Ra7h<2?Ly_RSLmY@iO`* z4yBX8$qdAF-;KcpErgXTQc&=}FIFMW%y3itF7z{%!qhbahkBoGb>I!X+A^MRbup>e zwa(Yj&!BR=7$^(bR=WLwy`49rJ(%}A?1fyI{C;G_h1bv|#xR@LgMFv!9{Fr?0VyPxBsIpotj#^i`EaCJ7Mo2r1t|k z4ow*@$%^w+{`6A_h4g(hv}#)vnDaLMU75|+8J}M$$_Jpus$HxrTb&=@-Q@;P|2W$W zg_i9kGplYJ@sXHW3!?DmY__jswngLpQ>ZRp!Z09rDoGV{3{}*7cqqQ58e`4UVbIBJ zaR{9tV8OAupxVs?N6gE5^q{3zQiOJ>eBReXj)Asn{l`l&+0iQDCh=N<)S)s}oOTuy z$e99PgB}8i;7Zo$xXVC;7r_47V!o@x1nso&_^m6#_JZfMVLeL6S8ol1Ya!X9USebz z%y%R9Gw=*^OZV`Pw=G2R}VB_|4#554hx^P!Yo zgZ+q{ueI^h%52B-mxce{YhZcUZS;k;{QWA1EW^)>)(0*vMsPl_%N7O`qItWJ5$&eH zC;5=zt{T8~;=GhXh!WBZ^#Q^Z_nGnK~Px4YZ<6xYie2sE9Dj>`$JROoSIdN%5u{^`=h zny`y@nf2C)90ac+Cd=B4q*A0`HO(I6)@_8bgbV86!ZuRjbZ$z5HKg7&E;3)s5ap!F zemU@2)r|Zc<})`9@M+lHfH453#jY}{|7?o3k_{J;S?-+0wSIhkM!}}II$nW_E){>{ zw}CB){8DVmUT~oH_V+-xUlc`PTv4UBhvX%*KNRb150K5Ze|p&7{&gFFllkC|ekfnF z^gv4#Yh!1j5nl?R&klwayNp6PJX)lmmNbaiW_N?Cndw|G-6gn=O_?*HKKY_G$&WAEJzmofQ!bKWt5M#7eD zsi9R`)H`%yYt)D^?lG?Zx9c#qo6vsLJY3*qOZae#RuLvmwirV;uOYb%Ptg?%H95JP zf2SavzDf8BIa*mZ%t;&!>cmt3W-TG%PI`}_ zAX=pOJQ7h?Oox2R+%8_OxiOz#Z6V$@KjDZqpd}~iL@d?+hAvPzn)MF$( zaViR(>vy`ZVWqiZ$dF2%^5h*%Wq7N+ueJ!(LAgJU<2fNh08{tkPKZg(#!&yFu4D>&rwzShp!?bkxwM< z#H$z)P%`HGEPNLN!rqRNd_jaO2ir*cWd*8}UoA>|_og+b?e1((M}6Q2%$+{5ruMkP z@7y0G%~XWJFR7d=s!Jj22el-i^Nmsd_^b!XU0Da5lhNZVnSVNX^XP;uBcJ;MXXY7>H{%+G?`HUnep~m=_tIZH)TW z3r7joqK1VIfLD=c@ioTv2Er=z>lm_6sL}V?MGf>HRCC4gp%}MOLj?2f;mQf z+u%X$fLdg-b*(pUbK@EJ{Oe!(1{ck=kuO2RFBVZH5_7DkwNfdIXF7DL-l>$#_DQM zMY&^D!NGDJY%YY{CezO(K~_IHHkCJU+b8oPQwZaonHByISNX#-Ndk2$(VBh4r~(3B z=D{P1K=8jmad%wB!7HJ(V0C}tD`(R!`uZ-?1-(#3P3uh&xIxRssh_<)I?zD3RmS9u{2r{`()24=lItp3uJfGR&YU13;A-W%Nj{0^qfmMj1<(= zyISd7CMk3$s=;557K;NEdcf@olLvwN-gs)5E9Ryu&^)3iVwWM80?fJ@AcH>O7CXP(8ys>wDl@(Ty}Se4P= z0sT(xBsOn@gSC@pbDeq3yQ z7NFys*m{b1m(0*>G2Q#>t(5*iAOTTCYYsWD<4>+86T_%Q9AB@Bqm}wP5Q$$+T-8ra zaIvm@3Z_l6Vd|no*E0V~tWK;-h&Mp^>0|wquW+4jgCA$i+LmD_&s6-yMl=cXh+>e7xr-*FBIrHe^6hkI zCwxnzMAT6y#rphkT}aGBWcm{o1b$jHat`Yo0sWJZ}`jjhrhoCYl0YOt`Mbl zu6%q)+1#c7Z9v?K7y2mjaBmI)OIL^JgF(HkUJR!35|j%V`Flgksh{_Y)erziQIF&0 za_!P=F;BjK8md^EnOgJtpjEu+5hQd_lT^}hTkk)e0vujsGLm*g-J~&{0}ab|kw~?O zdiua=eKbf6*~upywzHJr35|$l=^#pUzVKv(GUdm<>mqQPaYJYZaywazYZT7-tDp6D zG4AZjIqh9IM$x00{fLNjKAOH;7S#*WrF%8AYFb(6<=#~3jpW@rB8{fGw;&7iwjUve zoDiM0RZZx`So9l{oLNEC^&(#EUn_r#7dey)he}wZ0-hFUjFINN zI%H7&Y_sUIeX`-lbwEm#>nA5c#*LfO2x#G!(;cvVMzB4o--0U@)<+A8+e7(r&6{jzf^miU@dzJ&d^yrJOcV-ZhDS0aM+mk!=3_U*lS1PDIGH7~ zHu~(RAt1DLK?#EN@dcu1qPJY29oD&SDW2lNiA|@sMJwi83acijn^fB&D~?urlMEX*;L?7*qi?kbEtQeuWu)lUn5unFOi$4xj zfbayH&4Q_l)jSjou6|k0aMdn-QT(pApU^3KQ7_7s-?cAo((2efFfL}K zY_1rqt28! zUP&!hfwm~&`nbIobQ)ACV&8GV`JWG_yFioa6A~H;ll~M}RsT-X&j5}T{`O0MICg{0 z)ME7Fet%=ThmsG7p=-~-RrY9^krAF_FDZ!)8LX#4-O+O`zF9=dK1xIWl@(0m5$Vv) zM+NaIWhrM^HXlu99#7|vU?!ehh=O`m-31Adzp!&94uaz{Bq1*c!syvE@$I1zb6vik z85V#oz{tZcny)f?%ff=vz75H`AB-VIl${qFDW812AnU{k&FLZ_n?gMclk#2nOS^BVXtOHyiJuQZzOAq0OB3*1CKd0C|MT_jBXCb{HlP0)Jr($O4Wy( z15W^u3%~NlSLutfWwgQ5{NUGyw;6Yw$pAlLGno~I-e(1yf%nxPHnX+c_+6Gemt&K# zonGVS=4Sk67$k$o9AIe@CT(|*A_tR-&z?od;H9FXqgvcE`}Lk6! zwi2ZN4TAq%pt`y}-khvH2n^8^nFHUl4gG^5zKZ-Q8fs9iLhM^QrrMNOz0QPZ55mh9 zM*p`GW%iRO??zmqmtJhC0sw@QXV*VrP^p(Y#xi8cWRAr5A$F~zNDkF`9%t9hB6P0d zVr!@Fduy_9&A@Ndq|Vh@4maA((FnT)3Ty~o#2z%1!+&ob?(jUt@r(*a0}=a*7YiHI zn#uU4>XJY#zS#MAebZa^G=FlmW&GfG@36Uj`#0ckv!l_;jO3m?tnuc9pKHBUs9-e% z+8%=5Nq&Pb)A<-&VjSgL*(89J$p!6GpbTAT2ja*5l;sN@)eHY(8qw@Xn^xPDk(YaG z!hbMu+Q+$QSy_eZ%u}NadpoGe&v^YqW8^Axhb5jILGkC)A`UcM7wq||Tq#;qtqztG z1L$`l$NIgHNM_HI)g5ssf=@G1&?HyB2RMW7A~cYUR261iAk>A56V`Ru6xKZ7OJ^J$ z=%q4Dm|-Tb;R44Vq&EL^14qCB9@M|Vbi37X9#o>lt5G{&uI=!cPncfab+fwr^ZV<= zQOzud&)=Q&5C5{WLleyKC^>vzU!GSQY!YZdxHRHu=_cMgsfObbRFZzJ{*O1ElQB@H z9C|qvIvn5P@8uJUaTGG5_%6v#eXv(9GZ?%ozk!2(xIU8eCT7>kLpVTF!7g!_DL{@R zAOL~?Dl$B5L)GE9>TiF({j0%+mi~zYUzA#5XcHY|r$SkcbTq8JN;ck6c6lWe^kNn9 zrH_yGzamx^HE^0Oa<=h$yFB8Iw{|qtegH7x&F4dG*#e2LY|a4C$)V`n4yIqSmOZrm z{pveuGk3QBr^~l4qS`T``)S<7;UNfD>);}o;Ed(H1cV=oB>y- zz6!^&?mIVLHol9XW4_iSPH752;nNr)Dt?XqdzD?987-rde6*0U#OHoCE_-bDLC#e zbx&VWtdeS2Z-tH#j;{=5!4{5!wBHcNQ;8(2E>!3#(T~2Nj>D2qfU=P7Ue%9t9sO$I zzW)FSjDj{ThU#{gWM{Y@z?B}Hr2sstkwQsyBSZx$SO!qN^lq7CELd&p5rIX8Bkeb~`xspTaJ* ziRC<{LS!P!a(7^+=e3lpr*70pQgD1XGcGzLJq1Y7fHR=V9TWX^0R; z@@^nmpH}LbPm22;%~7d+;RAL4(*et&zd7<7LrVCEENea?4%m)~Z~TC-2T1kih3|Dn ziI$hM-jYi(-R0kiHLg5_@gIL+y!@g7Iw|fsZ%z++T@V!Ss(;hoGk+9 zJz|4;D|mei3k#ysI*Y;R>9l5s@P4q{xHRlyiJGVnwHBhJKKs1EwwE+F{S*7`TB4An zVIIL1qc6b8Ms|HlHz3;>=mlz-oPAWiG$aq+Q}TDKF2EudY-C6l7N40d;1@km)&;8ToLa#4wpUzm~{Jj6Ev0@ zLg})fqw^9e?6ja)MjUlCk8fHdPR?YWuOxQK~p*M=JH?RvZ0P@+> z(!^sgR~rBW-(9>VK*<9X!G@Ybx8u{@`Ssy~_8rUGo8uxy-f#kx6(HD^B&%KL%QUeV zU@y>fJKPU~mG&gs&)1M5;K#**zj>RC?jZMw@)SGD)KB>6aX_Pm`u_Lvirv>WOGtQT z>GR26&qD6)x6n({AvXG6Dv2yCT;0)+?eh?EkDH0hdT;A9IR1Up7j-oqfY)mU4K3{L5ZX5TchL9Xicq2CpTja(6ltzL2u$ zQd2lqLr7;96IZl*wF9w&tX3XLj${4ImrgozzIKSRTjP`Mpw@=SdXYAR3-d?s^&r%j zbSC;+O~AnqCS&YJYs3KxCLt!qsL?hFd;dQ)aZxJyabxpQAb9NU-ERN=wg6YTe?i%p zQPF$#ON?QGt-t|b3O2lZa2n%EIPtYH8~vY+@sF=v4CJ%#>gwtY$#_1F5tYfu$@ZVm z1JWaFbavVn`8RYDvo3s%cc6ll%NQUPkJwDicArieXs0zTR@7p#Tl=B|Oae=2c)iX2P-I}Td+My}HQX{BHWqZBji>9}F)9Z&Zh0CQR6 zZtmg&7KOW_u3ADOV^tlU@#YfSvbx>#Q;%5jqnk`+eC~Po>f=2>Mx8-JxypV8uLn|l z@t6~ZCx3k()L(x8S$(R%js4!@dHYRu+?s_eZ!5l!nv#khfWH6yZL(=1sX>pV zCYC?pd02d!dSBJ+CTB~tJ3hGcDxeheWmnsJOXbq#$6UZ9xidtB=l%r_l9_v3R4Huv zhsWPp)Q8?$l^X%#bE~@Q4Hm`!n!-vj6&laO$LgWQw|1y|>JI2%hwV0HkOJ)8tt3Zu z=j+Sksf3XhMacrqJ-#=|EI7$R8hK*FRZPZP)ytJ&$B_nIDTQbwD6iFJRz&7NoMZbu zuN9$P>x(||nxXzI`806?5y4C~_@}Cc$hotiV3b=Vf>A&|Cmrc_%>6aIBPA98Pu3dLefLtTx z(EYU5>Iwj$|DR6p%k9y*N&|kuMc>n|h_Atkt)>{?U;}8y<;1I1QrUlIi;-4TAWC~T zO9vqUS;KAE$Xd<)q1_rp`PM0R3)OjZ($&T^f{0BENsy#i@^be=km=keJs4tazXLmJ^gn^YUIs6~_m=`B~8JwcYFY?MW zMC$BsLQOuP423a9O!P>WY!^pm+vgYy4~kFoyV%TWp`!+-9OUrafyVymRpMam_4+2yHp;kIqz+U>iQdizEjN&s&JcE&gP z74-^fDo%QKQTT%hQoFH@wXxFF9SKMMXaF#VGKDQScTqQU{-bGi%SjkdrK_i)lU~A90FDRE3PwMO0}*B z)3D%uU%^IW%xDZ~+XyEYdwse@ZFs)hicdB0X7b2}6(&84MrkgZD`l2TJHwddAglH- z7)3@;;oj~ZR#gAStIJQsB;~5J`3ufDf346cGf8Em~lZhkbGhtN(e<_KX>CPP93Z11vEx8kS1|BJ!T^{qdqHQ(p^_M?u6}+l&8InC=pH|16w@`TNqxONG}0kET?5Gx`E`Pa(KaKQ zCpH@R)Os6J+hChrmhn7z(Nr?TV*k4=`T4HA@f}8`fi1Hsr|3V*#g085vc54c{%vkM zmKXHe7{8w6anqNjm(ip3#s;MY7JTY`|BsxTJQSXfo6@^w!UUQesJrg@Uc2nv`&6~w z8%#gvA}+@&R5F}3>04h+X>;xy?6teA#k0n_=Xp2SE_>}@Um9)HlwRst^XII`D1HZ| zufJdrTRa_A%R%l_S(&*{E0XD&{7iZ_~3|EuJ3fkeNx2WZmfZg}WxTsX_he z&jdXGvoForx~RVL`PI3iIVq9F*03jrpHDlMQlNVzr?Mhaw%-=orPcJ)DgV-F!fQIv zfuAk{(LJ*LrqD`%s;?I8%8B04b3Mo%9@Pa4_Yjq)jI-U|ej6#~-3f$mTP$#9b&DK?RYEH~@rjD{R( z%H~S)KWPf-wb5IHh=EzEq*!1f4`m^Q=I*4~y+RPgvL2>MHtGK^c1AR-^w1QUb1OtC zdb4?(T=u|OyiFdbtB!E`S#RgJ-iA8*f_C@*8EqTOesG__hKfYWx`A&adO=vd8|Fhq z4hud%Os~z-a|Ik!gEx-&nxc%RcgO|SPF9ZlDtJvpM{DG;E=J#bU<;Jh-%inOROz>* zuxjU1lD2tYcMJYK33QAtS_8N7u2ySQqrmH9Y5s%P z!m~MHkSt-3KN>Wv8dZ8thjSGcP8Tqc{0NHHulJbV1fYL}l_*TR^FuG{oFbcI$r}mr zfp%0kM++fLZy5}mt+~!|qZ=LxJ(tErFJf08>6EsuJ) za;Vliw8 z3Rj*<8W4XtyNdQ-bdba0R#~-DFfjM#6EK(3o^|O2C6%QE&$HuDzTiAnB$7ZyGE6a* zj|eY&DT|Gr)c2FVm4F$9sP%X-;=qk9J!Kyd#$H#fnay~AaJ~MvXY%5X7JmmIU_$L< zaw{uy{K4eXbntoa%t0KbN8a}v^3_Lr_OM|DNC(a}+N@ncK2S`TF>8-H5+TQ85!r8|n|(^Wnr zQf0A5rgT%Dp|(kk=;?p@SNfoJ~{E{}*tnJMlHYztx5v#mbqR#IXF2 zH*j&~@G=m0eY`|sQSWuRTd7k|_R%PCeIyLB+&|fA$EH(fIa3_FA}j){rngC=6dniD zvXLLP=2K6Wn`-6bsQ@E%F_o|t*C6nAx3&FBb3LlUzdx0v|6QZ*W=(~5W#vH;^=oYf zsBZTLOU-ECkB4>x$Po@jylQ?Ys5ix7foP!_? z=i+iS(&3l_5sfW{pwznik_Nd*$T@IqQ1e|+FR>ZHh@QXi9tjZI%Iy$UW_UKg*ark> zBYwv}wRO2Tb0`V2To6$QT$g>_A$VLdz5AO_5rFJ?v5j_lf*W|Adapi#?tVEdTI_9q zx$_Vz?|^XSKmW3$-I0D}Yb&IoD01eirN;hGU*$W_e>9cuV^&baWnv{2 z-yJ9Qo8dc6YVmpzK3tI7^RM2u0MUw?f%uH#9ReRd0q1r{{4#$m9+GPBeIJ5QA7miX zNbA+mYlg`|JS+vDTEz2Xq4!nm6ISQL4K~yZJoF8~0hT-X-(`Au?3QggagSbjnIBMG z9xTd?fx%S9!=_vlH~c8@;%tb-zk<(*YSVm#v-(Z#eNJB9MZJ`0Zw^prtOamVSAKf( zcFFY)Shk5OMjR=7^^t~M8??febzS^Iv z@)}C`;9;PWlmHA2)myaIPO5s)Q_c3;CGF>6b4OyH_@HKU^-rfQc@L}Q5c9;_UVt>6 zQ9Tq=^`lDT6lO@As+W5cnut{W9*%12keclQ>VVNR0Mt}(sok$7wzJ2vnnq+CRpcRS zVE|<4d)}A2kCYiH55%caD^k$Zb3!T=uo$NZ*FXCJtIj9wY6H=eE?{V@o&cIqmsuwv zu12{A)AUfbXiGOer=Iz6GLw89MdN?>7dt(B0HkmP0+FoWuyyp5&Z5aq^>&MM29H%J zMZNXho#W0AO)iNvqd^9CCvIOvV&$}tUD~)$#;a~`Ga;Lon_Sd!on;?d zQ%51#qy*`k+%7QdZXL|qaja%=A-Xa1oiJcHnos#;EjUQ&@d6$!zM z36=~GgH;b%77b06y!(lFy95@>0k8g(%Zt;=W3H})2m>U_+_KzhWPlAcR#;BE#63u(-hxni4*&V z0xRzXB?7uZLz{v@ybUb7@=<4#c{g7DL)L!*s~Vf7hsGC6yAO318-=F(ujxso@r~xd zvYrdgbh0Mptbcc@^FQUD{<|I92(ifaKA-ATN3%H15^-9_^jX#z_C1S^pCBY?v^SV? z{m-AF7uR%U2l?_?^8>n&QzMhtK_s4ZJVQ2D{IWTjLBQe6m%aD;{P19*5(a&NNIUtt zfX8G0@K%^Hz+xB{n3Ufh8hqC1$dy4Laa33sO^<>i%X)9C+6kicf#VDUxM zm8@zgQw88AeZGE*a#Z`L--BnyBT)9Es{4OC&4;-lW@sYDKg83B=+0WFt$r2pXAO18 z&3_=-^{H8afYn4s9h`m`MCZUdz-tnnR{Xz;|FsP&zVDWx>Zd{S?B&|JFrGWt$ZPsj zscWN5=T4M^tI;*B1MRJI27d3dEL!_ltdtH|pv|&0|{>7~wr=2B^-c&&?hO*VH zGZ0RPa5w=j6BS5Gc_!u7$^?(n#iW|q2igyJ8X(6-hHlS!{xwlSCOJk@k1?e9_R@O0 z>O;z)kjg%mW%>n&OUfydHo>Cb)j9-E^*nTgL&3r+Nik-T7>Gg4y59{7C-?OkmRjK5 zRE27ksnt8I8DJ=s*&$0h^ja~8vL0v@IQjs~7_+PafRb*~IOF5DSpe2|_rBF%15-B? z_BklPTro-5>3=bIhkvk?`3hqkU3KaC0O91w6o14|^n7WhQ3itd zd|`9Me``3SSRoj2yFFRqVHD%Gqa+2IvA|$fg0(8ASa=-G5WzP zjtYqId@iWIQ63`PA!Kv98OJ6OVP(+oT1oJId@--NEJ4s||8+B-8pKm_3#QT$yXE1} zS`}{kNF|ldJw>SEu^r-M!RFr9rvDBYuwY|=oXAD-bO_;oa%S#Y)>?Lr28no|jqAZ1)ZsVyBfiNpEfsUB*F{+i#a7QrcI{_42N*cSNr(JGdnSLwtacfuT-^ zaPhQ6j;!DvpIQEuf9aVD>G@U!BuZji>L^YZj@=6?#+~7!#^q+>jc%9PeYW~zuH{x> zz`|)NHFpD_qR54=$sjc@St?f>IaH5_E>G^HH>hnTB9TJaTI_Y+_U_}y(|dWxX|+O8 z6Ezwp%Klkyipjr$*vX`raB4NB-v;8s7~4L3NQE!|gd|mUR>FhEK1I z)a}%&HmfoLC9JiW;s3jZDWXk!#V$Q5;_cBwL12~60W&m)B4|L|emXTEaGhw2Xnsao z3f-PfYy*aB6V)X0;yZJ$EZ%Ep8$EAx9$o$^r&%7Ak0-ZI{xTaOj%mHkRWsC6%acM9 zQEM?zf+JKEgE@&^iJDQ}5Cq7Ly_qQGf?oCk+Ix0$yrk*#-&Y2-gtzWar8>vys{CGo zR90<#+pg?O)`o>#cHecp4L~uKSodBp5+%1e=9VH%@yYq^ZJm-(q|5o~q{g9wY>#I^ zfTfD(T8jtAy(x`Bi@V*+)BVzKyMMm8gPW3+IXbx#LDlUK3aOsot`Fx520+%uFgl{4 zlCWR_xE;>I`0)F(OF`G$er}RLy)i%VWU(G&EyRgHtO!l)`AR+OF63__P=(4`mr^$0h~W2BardVWgrmmidztGYjah0sjtyr_tXM;4j;1@T|KLFT{iU3-tZb$VKh0FPX zI3{*1&63#7%-+{)0h5r7ZsB#Jk4p_sPaA9F8B;A{$7Mi!algHC*`TltFf=C9Y}g{w zP=M%^r?aNTBh3qvO@l}rM2NyfN-)MjeaO(1&sz2tSW&xUl>ZK-5%@Mp|}&}Nsurz$1Ro=d-Y z%&(%!r*;VaR6LeO15yes%u-<2hZ0d_-^DeFjg>{E6R_y{Z9h`l*LD~+muU)2D)r>V zile-h`(`&Nro$h{X#>!o@)CU0&Ggo|=7v3EP13kH1CRzQv?l<@K|>ahUa*2riVP2R ziD(E7(Jtj~cQe;}*>^*PW1qqih7#mK;XOkMdZclnH@d22C?mBdQV)rSMN`|bwYMHp z>CD(&bj3}yfT!~T%;;`VnDa`LOUW+19U_&5#NPyg1HG-ot?dr^Gt>7+N8Op0h(()t z$bU>vWj-`<%R1pr6o_05(#4#PD;wZ1e{+@{;Osh9d;=+=thHJ~PNY^c1jPj>qRu+g z31c*-1o#s~_X}DL5&%4}%$imy+*gch;RRv&nD>%l!Z>h#{m$0EVT}wV7hKZAtQ=rEY z_tU2bFf{a3ia1m<$oJ-OPB9<}4mbYi&J8diG zhztwNWwg=R6Mr}HTguY`R@+dEnrw0~e3NO?RU68~`o_B3Y_(yII~?wGk)k|0o?}w) zImnXIzCiwOrEaS8LJlGA`rA1aL)%aYY>Cfq8n0H-viMpKf=mrx&}$)Bz=x&}N#G>2xpuNV82%@whjE>y415|6AxTBY@ud0A6MNK+ZlymP(^B(&s&OWdF2 z-A`i`MA{yWG2`sU=j}KS_}0sD+?ij&Ouitg)U?pboU}OpG?Rl(;Xg`R9ReRM{{Bp1 z%HGgOT^zuEN%lO`yxczyH1Mq^Cn#zEw(8A*OI$ojFaNa{Ii=%d>6pj3H;}gOJlFznZ;)CHm(k>V#ae% zGm`53l~}$Dzny974*XV>N_2|7t00CBVs1~R>6{r!3^%8^62Gkl@lTFTP7X|{+OBIp z*$w*yRlHi6DHwu-OORbLDDF9r+qm0~N}l-?|EiLJU>{`TE%7Xk0jewyu=}m;$7f?lX zcFRK+iGnOzDxK-{J#dR7 zelh@}?0Ya>w0z(yBhBEM=;REGNxs!-@9*4V#$EYszlFvW@$?V_4TI@v*b{q8HoRV8%BPbtqRuPHoC*elislNY2qUr)HU0g(fsXQ2^@j1 z5&2|D>LGq{=1&Cru490*T+j~|O=3pX&PWK4IwG`}`uEc(p|b)E;6Wc_I5#U!UtXHK zJN{qIl>tQl6s{-1TdeDkMC%_mw5C$>DWGFhc zO(Y#=;_V+cJo1)Anky<ss010uY8aMa-=_SnQ!W1Tx-{4Lt~ipyCVf6Badinp7UfL7whP-0NvwiK>viS{ z>s!w1njT{FP^e>M=D}YroK@KrrH?{iVFck6FP-9g;S&U6e5{t$uHCAYNIjf6y5i^m zA@bXQ0qsAxoMH=mU2>1z%PSB3lDL|H?D-Di+;rR>@`;R$zZv8gh<_S?v!>Sgf?Kl` zgli^57S=QdDH?U?TMqQNU;e2~Il7rdSfe?qBLLZ`ge;Lo9lwG`42kYEg-=z23f{+ON+OIm z>uel$&H)|7x!+R?n%X;%H_q0sp0}-KpZEb)5Pzp0Cc^2DHun|FdOdp`u5u^`skgoZ-3&Adc@s3Smm=-HxK~xZfo|3$+jX8gSl6(uqN7 zJzM&jR^gQFFQbQo5X`r|K#Ga@^lD;A)NjF*AL;U{uvVUQ;~0#5q~*AZq=-}?J*{!*u#f&6+8WokxQP4l}7J2cLiN`a{)X&ZRFQIJ#b!wAuJG6 zH2LVq5|tcq@c#P+xm3BB_g!>t-q%t%KkSyRcp$<}Sbw8Q&edFTZs);{gY29N`9qik zX?RzB%TS|1L}f=i=6k@>-Dq+!`B`1%Ql!{hvtQw;M7&RNERY=vU^;&4-kl5yg}BN! z6QNoE%paH2oJ$ldOEi8dLGBK_D&e0ZwIWlH$99?ugVdp#X(D=N{FwE`xCRC1_+CVk zJ#+>k%mPvwlZAxsD(ztrk}ID7QBt*(n!d&F(VfEI?>9{+|3z3S#T*guP_1)Er7D8X zWgxNfP|pUSUdZEQxlFwzzk(3bnrIOo7>tDR+ioeP{0~gJG2&ft_|;>z$jhS@Z05>; z+)*OX6K=LG_hgx(UBCD|JAdi$f2I(0R)PwAUMTjiufQ8hKT@Ig-Px{Lky%h`am2D#%x{I>{IfEo_8NKuqh;O2XZvOKtwNcI1I%OxhcT3MrB#i zK*^K5jn?R%gBn-#J;@IS&|cO_-_Gdc_<6fUvQ#E6na2x@=kJ8m9Nj0+WQ31&6M{MS z-7Fu|TuHq{N2rqii}Mt2pl2uP4T|KC2;d&T&g@lP-5lBqsu+k@D|aly(nMp}Fx>{# zu9I{0IwpGh6ZKn8CoK05lPGKMd5KS?W6YxLV_(m74T zdPzNf*0Sd$_7s_;m_iRV{PN&R#~j2Y9Aw!uq|fjs67*a8uP@K)Jd~u*G23DNLq4Z% zf5YB(PYw|u`bj%K=h>GiXZEj$QGZ_x8!6$fLhtz2pu|PCd2o;nVsmi|Ta)}KBSax% zq09^)uch|Cc?5S-bZEdnwH!E?a6>~wmEi)TQ z5desKUrE5-)w=!rBQnBYM;99>bWZ;=`bASetRcid{~Ztei8{;!GkL6nTNHzr*GfOr zL3x^w=|RCu2k@)1(Zm~uPU7PL{`IE>JB`m32e?lx$F==_-FRUmo>tAS2aaZ(B#T&p zsV5{r@V_)6w?n9)i?tQ0_lX;P8`@?Bgyveh4}PyPEiSt1up z=CO1FVz~iMhR23hR+k+!(#qO z0Z!t)P~!Z#Z5q>{`c31Y(P`_cYwGP4Y#CI*zPQ6-mCDxM#thvM|JBIhcKcNDsU1%g zyck&ZaC{}98Vb2%Yb?&l=*@vsJKL!V#Z=L9bHood9_$g+`)PvoH8qhifasJyqim=o z+naeAUh`)m1`sI;UqVS7ek(;FkIQ-e4+am%J&KcBAuF^Hxs*|a0IJr{h0IEUpp3=@ zKhYhALF6y5%kXxq78@kSDQZ^%!OB_<&$IpY#b->B88v=|>!2ItAfZVOZ1Ga^&55#4RclYTO*^1LWCKyQ!mWnaMN&wqIK7i0`K$6WK=iX91-LSKHjWs~%FDS|65P;Vv~ri*j& zXqdi?2&ZEiyexAgwRNoNUEz}tftlcf&hmWrFiV1HQ)~pa? z!qrdPd7);6hAH71gu?&k6#}Wggyu-^b?+pcPl?IfHeO0duyDpvS< zh#9sj&UV@!$URzWz_}cm>^~b=Z{%idWHCfS8c<=4)O3>^>M*%}U<)Q2=ZS51g9v6!*Zd#Z+Uesc$nw1` z#3ZEeM0}AA9H$9Y<1Fq2QDjlJyBvLh=k90UBtP&ZP$Ye+Op*=L^8q@I?jt#pa%?jD zGiW-Ud8XcghXd%uw}X;Q9BX9fshh<$K{MCZJW#|bNBU3pNOYwYj`)}PeGX}qPr7Fb zM;p`X74NC_^Xb+n2Q{9iBV2;qCIy(2lBR8JoH zyb9TQai)Df)u)6dN56B=p?3~V_q&-x$h$f>uMyP#fytloGbCnMG*TIKy_i<(Nq|E@ zcFxJr`o!x__5)9`|8PNxacEUPePJdr2y~MTJJb00r_xISBJX}$2yUEIAsxmK0mB}} zdE0T!)0z|`>Q|B-V_Z|;I_{&{k88Py8mX8ZbPRy+CX>nTW_0n=y7Mk%HZViw)4({E zvK~KhV8flZSVW!alIUb1ES66FL~%S$j3qSo@erdL90v_lY4vxjzA5&~Y6ldJmS4 zPl%aIc)_A5F!R zie?evFap~kowZ?m2@5C1M3!(W{?vaT1{8SG5z9csRbLEl_zpvv>x*`aOe58*4can( zdH%J!d+V-}kq|-F)p075~k(=qB(T01p-lIWsyuo&}hHWzpv>od1GZ zP|Wc2(gcK6uqZx`8Z2p^+{J8SLI-B)GU!Ky+zEJ1nQrz*rs}(=$4Onj{Gx;dMiVlb zh^n!hjiya;Q5v9^1{Yv!U!AOw$2Fe!lQ(^kkE5s)5Ew$C1X={^Zj@_QgH!XSU@?Uu z_}0MhdM-)|G!V+d%emJLs*8?O32=b9CM@>za-z^SIpU9W?oAgddYrDdX{y$BDrxNz zy3S?NM4|$jibY?sssD4@>JMf;k|R?sygYCjED=9>X>?wmoYa&UP(~T!88ItoXCI`P3w2^U$LcmjlibggLayuDHOUk6riU^!lbz1hfFQMzA1nj(l?kp?36$)FIOf`t7(rsL za^w!mXR`>=5LE3x(*@^3qI>XD2x~DT_I&q{xx3$pjYpAyxBPz z?d8S{L4aG*<4{3$JWt1CM|q;*A7p>HG{e@W$TZ22;%ammtavr=C|k_bM)bNs%KBb( zX9AiEkNO9}=oE=e>I{1aIE&rYZ4f-iX}2N!3ZAa|XmpMFN?rc4w&a9tDP07vzz-|j z-cX*dIeU>$Lf40LGjSvA`psuW1i+yi?g^2%_xh?NV3{7>-?nJ-o=(npXB)oAEl|-g z3L%dut8%31JVYi8wBOcqQHX5dx53H;3`&k0fJJZveDXfcULb_9>!Bizu4=k6JK)93 zj>*kT>)iA|BSlV0Uh7%MY%<)7TwJ55@i?Y;_w^9G^6pMGO&+Ld9s+L~k5v)|uuO>+ zcpZohE78o~2+nNaB+s{la(^lnXLxMqaZk3$|C5|4RtD|uW;*D zLzWO^tnLrz|GHpCdA>s(1Nrm`s@Lea(du=1_SxyHQ;~u1xh$KzC<@foK0O8*Nbjy< zrr`9;aF~7pX5vFx9;=|6LB1bn7b6@9Ng5+d4jr+;ND_YUt9@AQN756GebHsu+T0}c zk2oyKw!6z3%jCDQPAZ<7E!28DezDfzKz&>)VB~I~Hl^2w=Lywi@QZ4-veCI+H`@rTA`chr?uU&#B)a&WNf^CsZBEF-AUHk=9jW}x09=|xuEd?W>{ z#Uk2>u0;o0cxyZ}Nag;1W;o*JcuBn~o!df9vu@m`x~+KNpl}<-|F1}HT4IC5=037{ zifMi9Ea?@|^H3t4Jj_6tuo-3%OO)%QA;opFFjC`3#-UPDhRGRsrI>x7Y)5x0JJ*20#3C%Y4H;ooYT@Pf+*;Oi&y$w`S!dJT-n0RM^S z|DE}KI}7*nAaJlOOo|P}6QO-7iX;GTa&2&LF+58`Tlqn(;MFVu7+SX%X<2*$&*pL+ zzUj1Cn3V{Cn5K=YLnUF=LC%M%^j^%jv6x{XhLqd=NGnWbDg~s4UlJ!&C|2Lm@5PFW zO^y|$SWU-JKRQ?cwoAsHQBllLgvOq7<#b_!9t$s@%%=MlkIGU3w+xo1U7J(bbm1BH z5uUGL<-(>`_$gTcO~n0V`5sn8D8ZJNI!`||4dB#NyDiOupT++=b0PisLZe!TG&jwx zz@xgvcTmargLV}LeOS-ivg<0(57$KS-%COvuD(&1_j@@AQ!r&)X!WX{55-S3-t*1B zOGY$Kx&HSzx|NK_Qi9f%^aV2lVkzt{C#-gWS2&TSQ$~&r%zJN-5dkS|^}WB~v6`0H zcjc*4vo?yw{Pzx<#g#UOyt=pw_H+lbXhhOoHvmL^wc9CCMdmflS_nG05;LoyC=k(S zIU%1ER&5yYYyw1^)ru6t(1~c34J7kuPGJ9>i8zsPw9c29uc0?{j)7PJvrfYfI%D07 zy$Qn>ce{)Kr14q4{`U#&$>jc+VN-PuD>}mld;Rv3N>cex5$Ho%!u%odHyu)8=%U_N zG&>*&gTC9`7faOnk(@f&u3)6M?j!x~8p~6F7X#8Uci%^5MNDE?(2@H2e2Mq}`f!_Y zO?w?LOAymt+sQbJ4BEWkRGk`>fJc1#Nqj0N@DslM+bq zR0Tt!qCR}9eOCuFPJ$98{HvY_d&*Ou-N#uXh5}ZR)57XrRGQ7rj!7huv_tp{bdcK> z4{E^@Lc&AX^9VSu|J$3Ckx>T|^uYSjFPBLII~(avNLLa;xxjl`#~YlwS1_$|bUs1Ozp6#xPASGq`zNoaPvg@ou3 z5rth(S1ETlxgTOGCC*(Pkq1LI6S1|D>Ey9rLj4#M^I0#5V?t8o|CE1;M*OgRv{363 z=|ec0aB`}%^WA^iurWdyq{`1Cd1aVjSwa&AQN@fbc!fC`cRIi<_s45}?rb#Vii7g= zRGpRj{`;@qCrx`tM`@1uE%F&!%qIY*3kl@Xo~{s-nRq=k=i1=n>D*)Zh-N}WfZM! z6eB!N6x^*9T;&QLs9)!|EhxB7v)%W85=+Ab=5Y*-V#Jq4T3LbR-OkSOS>Nh|=V);l zO2XEc zWcXJKp3Vjm#klvJCRh7YFh5s)OKi>g{e;6mtV1WyXN*9yMFqR!k4M~EY6HQRu`K!D zBS-)L1G9^hFER)Uv7r~Slv z39yuvKaxO(^mbfSy8ja3^MRljcM9pQpGr!87ZkckfSDx9g{E;q13+z4YjEGGAuiE|3DiVsNf5I# z=?6tU6n@R|y#N{ISa2c<0SH~-$i9K(;wZ}QAf{9;dFuH4EAI&mB#}(`K-%tdo~TvU zwIwN}!sMS-KFsE+8+#(sZ}=EQwfVh1-+spD@GEfkRr#G~beHN)P{sTm*D4?Io-{_B zgO*7r<%!!ik7}_bl0jALSJVza$bz3y(G`xe{a^{v@TGner#*lKE|?h1PoB~n0T`x> z7)99{Q^d*KJK?MrwU@)>J;mfh1HN`!`cB9AP8}`ak$H>1&bK~8y)LjXk5+aoEfDAz z&lgAopZrtPxt?aba@0k3HJ_4Yv_M(_M|0JB_F(rd2-kb+M_7C%*A!^)r_mv+i_nN-f#s{? zF%uAZ;}?ep)&popAx$ziKb1izR?k*xc5q@ zqM=F7z1Bkgt;0nwtDaL&y0bgFzCIG2AcF&5%EOwyKa7Q-f)ZCN`9_cPwiHfJ<(x~r z%Ke(46SIJB`Z%g2={;Or>)yy@qwV1R0f?y$$HQSPLyv;0AKQXYoq4CZM4l%xn@-_R zrtavg#yKpDdLuX!6BFhy<=g0Xra81`4wQ0@+xXV+db(e$yj{e;p9o%_iuC@mF|9N0 zMgbYJ|C-E#)!Yyso!sExZqms*Bx&xPiNCt<+t1ODOp;L3yD!3#gT@^ziKycxaratXRPPLy)Qqs?`V~3a>deP7JXfwTaJSxG zqJXB(-!2Vn8rCzRp%U|b+lYJ*IqtF~?pF!o+ew(c1okKlU@EJ2 z@U?2<{X6#sIFGaSuGS*y2yD|wm`z)-8o+o1CM?y>hvhJMNsK@xgsMShLLsQUn2`cb zYJ2ntlPv3D{lSd&t3*&lySis+xWrHSecUq$ z>1%q_-cZ{UBwgE`~72Fo6!>D)QhdAO;_4a)L|GPokNBBL-agP}Lm5IgO$IU~ZGO4#>f&FrP=bhqY9&P_X$Png$3T<@uS+Bf;p zYzO7jemLmUHA-zjyf)8@QosaM0RPkLW&G%WpUwMGUAPWP2CzoPP`-@@5A6<nP;;H+$hEr-km&o#gb8Tje3k z3N}gY^gYgf>oJv0CX`V$fUT!9IN%2wydwAu2|1lpYanBNr1Qo05Uqld_0jy#Z~ZZn z{AXqBtdPCr<`-%!z35VY%FKhf4mlnEK=0%Ai<+87Z`?D|(>70twN_(1$ z=ODIoE2NO4{pmnz&0*meebzHneX=Wcp7!;szXNXk$wW-wf&qvBn;~bkMMk5Q`BI5R zu_Xci==8$wWc40C?`Fj5Xg^UTFs^96a3F_gsUfZLzQk2qtFMDAlYsh`^?FelRBnHl@!>#l?_`N;exUelqFs zf+dNw_mIA!hE;D2O_$#9c;kPEj4>LFIt33LieS;wGv?u?tRy>Mb*aHYGkj}ntAJy$ zL$dv8HhIu;*f4#*(bH(U@>6+WI6tGWwVPh<%POTwR59;0dWQR)QuIZ!hMbG$Qt0y< z3U*jWWj#{{gJZykqEh5lu?(`hi2gf#0)kPG7Ny6GV(Gb_mUbcaB^QSDasGD+k&zd4ksVK_;bOLAsdoW4h9-aCU!yH5 zGCshTCF8_Zt?7D4h(Xw*dLJq2uy!A?`nZzi=Xbg?Vv@gld3Lt!_ib}@H2w58i`xR4 z>|v**vqiz%*`&rSZPGIAgcbde@xwK{I^*(6JwAKeK3=Za`13{7sR73aF8NKY9pz*A zVsKE->Jl|2fn7coz|3$a2^{3mxSHIu%%AVkJt2PASZ|b6tD|5=_bW5*i*j4{ZnNUJ z=&dJ(-|?1ou{u_X&~lO7Y*;|@nWZzd$;Y0Po?9lsn~{@G=zwLWd||hsAf(8i=FRt+y^ZmbHi5 zhSbyU_0;4-WTOZdetwHMf80xug2f5AvqBYpMxwfry9O@f0^9boDUhdXo>W+AmOY#9 zZ%n#(LGWh~+uybeMu^@;%9(t6lH4CL-tRX$ZB3t9O_4PEsbQ$O2dTxV6{^MHcXjH> zf#ymv07$J4p`sO<7*$%^QvVyng!;qR?gI&k;Jy7Cs~s6NW!`{}B-7ijsn z&}XEuv2a-r50#5or^X1*t#EjeD-wSa&6WIF0^rsQ&_^{pS?i!)IaI zJZ|8DTsuAYaoAI9{#!p>axA0n#$X|PyA;y{_c6Xr`7Q{HTU*zfKRkjdem5Hr_F;dZ;o{6MMv4?PY- zRrK(bP^)(K$6)5ev{Ku@(Y}^x*9RV#{p}%0-e+!$aYX;`e>l-jmYZB|juwp2YUo|6 z;wsT3fpFi9h^Ua0e~u>xAkwiiQBW@u*2Wz-5k=Vvq@Q}e5Lo=xXt`CgZE zSebsNQEQV$Wq>^X2eXP)!oNVu9_D!~7K3bP}Y1vXPm-+gw*59FZ$Iv-kZTCvHlf07e8^|e;>SfPK`b2C}UrYVH=-un% zcwWR-gn)0Y!=>k8cZU_u9hko5lX!c-%r4KE0$|){^1nDPo83n-ku=wT>o(>$mfYKN z>Y^T-HM#^|oYr*Q*xa1M7awPqdk;pIzsR^R2${{U1qZ z8P!(Pc46Gzp~WS*Q;NGoaHqKQ6bnnYr(v!8!)YpSNEM`%M)BaofsA=Y{A}`$ffa+`s&; z4{WA#KUH!k!(gq+Wh3_-=X&_NL@>p^b(7=5(H=!LFrGp{IT)eSX`upHAe>N&lgzCM z_p|Tw^-?_t+;xwb6qbx2q=@V!BZ_+(79e_ZH}R(p>?70m@`_3bWwULby z87Q(OSDLop+!W8Xx{5kcDH7aepK4AOyu4~6ass{$n^VGQ4ywQW_oMs;0r2OgWy4hu z-ubh&*XIusuT!1RS^EpCziO!OB^tkrY;6vfdk-LHldAC_l6;)>aTdCc``tFuCO66@ z`j;KVR6pOaJE1?G%_X$3+O;rFZI>Iw&!~+a)7`zHxzzGqD6aX@lsoE1=+7L(Mi6>| zSF&6ml&_506cmbp+yi7(NsGuz3;DGVblQM>#vKH&x~B{ z&%s8MUnPw_lh2N+9LA1ut${E1dp&$7Z#@*-Joa`;f*tR1g%|6s6r4vC;*B>^-CID( z8{GYt1F`zy(9*fPb3WPs#m@OGB#f9S3o|Ue>(A`AFoi<6*;h`P9~6 zYe3BxwE274>=g2JmsqYl&HjEbE&)CFG`lv7i4hDfl2>b(WdRY~pS;ti3w(MOn|kqK zM`QJO>tOM87|)rR*$aC9WT#7n41}79Et0g_(UrUm09j_(PE9g}j;QJ38F5?Zl$jTxy zmU1$T-3_!x=7Gt+{|ZMH{BOAqCM#srT0QpAMXArBQ!aUoB!LNEk3I)D=RD4E{!MW8>IZcC*F;OJ-KC@QVyX?UU60y zti_^0{BVY*A_%#X-PDxSS5_I31CVl=stOD+mW%sI0^B_oW*Mwa6e0?BL6!7OJ6jd> zOw|c&9G<4s`mpP<;Z+6n5v0{c?0Ao|iBR$zh_#gGEa;3lQ;=LwP#%jMek{o>o>M!1 znw*uHOP;J&*3W#1v@#74MhA)A)Uo7pp6nc-)9EGF4uB{Ap--;iZU}gTyaLuot@*Dp z?pFXoK)%0pKtKPslv@|5GurswG`7{3l;;j9T|SHhIk%kEW3LdfP7EdtU&>sI!L{oU zzgqm(Yer$$Mh6x<#(xj&z)Y4idd*2?j3O5w32i=?tA=c=D%714;u51=kB#8eGF2Ac zCX@IM%6oZh!3kx^-F{S&g49ya0EI6&R)_C9`7BGhBC6RfX?b3_zSAcwR$E&9jp08) zWBL050POpO)0F_FO2;`yKT1%Ls6A~54%NH<5k?JCFgYe_RsMih>vE`U7SPjdUZSGG z7=o<hb%%WrBC|3WcB`gI}@-b)0TfCx6< znrL|-A0dH}YcI}HShQ)9%cTF`(OlSUXZC3M=+U1pqz69Avzzt=wAu%bv;%m)({8kU>Q zjnwWR)K}Vl$9WLWX>pw7<8rwTvhnlzxsiVDsLf`k6$<&4vCsmtln$tpLAS#ay!B2H zKesCQdG___mQC1~*Hid@M`3q<>RjSwD&Qqay92PuJs23i0ukbZe2wF~j{9ik)qA|V z^Le+P7&ssXatCn>qqk57WotuLmOi2=Ec^ncbcvoz7gUmy&PcdpxmUxSeSuuV!* zwkn&o+9}OGx9SVlHjbs7DI1V2dcs(>k-d|>U)g5U(gup1O1o-?NPpuaTLoScGiJiC zR%vfz0OLnS(bRtGNPBP`W2n%$qg+`F>}Pl&N}tc9DO=0sDxXOHm+VZpFHXoXJ)}!u zn?%|@ZOt!CKb%WNrenVoj*9ywXm<+F5C2))*(x|?x_JK}f9vb>b#Kp%U`}3k!s>A( zw)KB6yA}f)a>ZB&5}g=DN~5tzapa{r-5eUYwU?YLXxTV+3r9}O`3`!#C-*~y1X~lY z@maaw)JCv=M%fAB;b`!`0GTcRA-3EF-T!jquFU!)%FpmJuB71U|DEqTHlsp_K#;?W zb+ekE%BG}SYveS zXzqUnt?G0Sem&X}@gCiCbiSM@RSFfC1+bZrcl*W&dGwBxS&V+NFkQ>t_9r3yd~#sB zI3dveG-VjcU`TdYzNHk?c^=lFULlhj5jgcuXQup%!zc0cE$@HNw*B*LqkV23@{I4- zT}oE%=-e|t>=17FvEcvoHBZ>`Sgz3;?+E(dM}L|%DM0zX<(aGB{|nU<+AM0bs!^zz zm+BlRn0^@k<1b=7OhTswDly6I@dg-4Hjas5!J-NFWx=0I;W8}ye)e%mxI{SK%-hVY zO8r`#uZ>#>XNX$JJF!3n(!U|rdtU0Em{L(Awscrq$)w|FbQ^EiAi z@IGdLW3o}X1gtLVNcUr?Hq%3xwykg=hwpnJwCc#|kQ$UMCH!NFoN@`x?D2sQAU(+? zk!2B>FTMAHD`BRCf8h0}N5Fvk%TZ_BDe+uutMBE2&zhfKVR^&BQ&FgA@T16-(;8YJ-F~2 z$H=)6`BCCfMnilWNDBw}fyIr9 z_!$%}o0K;kU*8$Z49Nn95~yGOp+)|ovuc2*DWDzvGP1I_0hKIf%FQa?aUoG57ARmr zPx*GAR!530b?OnhBlg$4a`B(@>-r(8aO?ah&%;HjR+`ks+f-i*n4=g~Md(|Gma1jT z%a{krB#!b^(Gv)3s7JSodEtYXIINoRec01eve~+9-d<4xfJJoUZu99zeI;wgOaqLX z5X;lI5|3r+||RIrSFrczqN+&3is>}_IQ4O z?{4+k#!*!sYm;+GkD~G`Q%+?K{j>aP`s-@#D1G|;GZ70;IN?KdB3>^PMSisK3(rs6 z35u6jnF>5&VmZLC5OYFqg<|DY_gbe2lB&@Hxi}&kG%M-vvcyseqYt$so#>Js{hyt* zvL5GfbFd8s7eoV(-Z2?np1q&Tzi3lmPaqATl;~gmbG*tmL@7&3x)rc@`lr|MB@xrG zRPpleAf+hiWrm;q-=8j_=-gjA+4{oH#o$vf6Ujpo9u8%Io1g>&k9swq*x^8s*Ye}Q z=1inDQLu4kgRy@01Y1rpeGa9C?ZfLp2>6hg5BKJBAO~F>M(yh}ClPS#q~9}cl57WL z?AZGP{lX0|5;HG?nH-B84A%`cJ|>Bpz@;VW18TCtlXL#o0K zvkX1&Kk;Qh8vGPpA9Vv z&EAzy2Xa)(11LbwIS@Du^Z@IOr0jT)Il$j_#K2KxU%bX-ql ze>>yxAaoka^vYx?I*~F8WsgfZ+NydE|afyQ$aU}~QbHcw? zIO6c^PyCit?VwwN#D5<+1goF#=5>exH@eJRQ}f|zq|R*e}T)Y)V35v0%J^!(h;~v zJY89tle$~YwQ)Aln!TJ&s<*=RwMU9ZTB05+`Ctg$l<0YMLj8wp@ww(?p*tIL4Y#)_3gZ+_ZW3EITU{E#XX@D`HvO7Oh=`0l&Bt*Y z-^*PaD13buzeBI<3pVHnObB4>|DA{z`!pp(@SK`p64Ua!Hc*wY_+X|Gbr;PEOaVbU z?sJSIW^1+{A^3>DNFVrc1^X}TrvPg;lHIu8%XdMt@V4U_p^W{UYd%}wGOA!Hn6GhW zcD>7=g}92aP~o1|K9yCs;3v(<^v1}XG$8zo&jOP&ZXw9O%d)>we!m3lJhXKCY}wc4 z_>F-1V#TS};oB_AUZ~jdO4A{EHxvv1-8r$mgSU18yj+0iX-R)gtY(;pEUSZkB1Z~` z?5e(ZKyG6W13{LKA5Lu}Xtup=#lEJX{p|(B_XG-oSa;qIO?*~n&T{*j6ArMuN2CDM z0IwyXvRRe4Hb%v5P{wiS`zkas`-{vp?(9*Ter z!ds{Aoy*kXnaMz|q9a`Nl~HR~;v6RY!zgT6Ad7CRO4)Wzo$l|-(0sO#7 zER1fPBe;aUur}4;?DT$jO|~ax#}8lWHDIc+5BKzJ-|~T*=!RK zr440har^|n`?tjcC93lGSX)-#XaUW#z^s}DnbSYhWk2F$i(HX0?={Sz@NgQecScj| z6CuK$2=*K%t#~=U`JjupmP_bicEia3>E%l!PqQegW%9~Zf_rVLgv+%}Z!3#ONPBugqi9z(gOtI~3SHhYvyOZgO0RJz{>XvW|(3MF=wcFPApBf}uYf zTLt36d%OOhZ2~u6ROz(R_t$K!oXR7c5>3q^nT}cANh_DG8_6R|rJ?<@BF4E&&Ar4Wwx(vMB|nu7eZ_)yzJgCF zU2%fhgOp~w4>`|M6RPT|R5DnPeo+d>*-x}|&FdPN69Qfo^=v|dYVU76_Oh2DpCEuS zYkt8Lk1)6Mp2YawLT|1A#?Gy5T>-&14MJvv!g5*FYy`Al(a~+MB=@#(YhAk(#5TIb zawNt+1zl|2g73yEgAP7@&`!oVJ+fa97-_riJ{?akFVPFqzGofJBXnz7Zxyg+>S98*cwl|&7sVC@(AkOLb?(17+swi z&>11=ayqPS58WEuQ^^N^_)(b+3`>k!w-(kBzup;&SEs41`s)5crG4M}_$j8AL807p zZiG76749DTQXk_czHsugUgFOS$@wro&qmf@G1EqWT0(Re-ZH^8)b+(_dpOD2PM=9_ z@aVW@qbBj?$()F_D z^+3|-a(5ydVREVZt(T2H5Di2{h!c_CNEE&!DIj>jC`Ht!8?>aIP} z-46~L)l=~qw>R0hxF5ZPAIwI7ML*p=cmOgMvbnOoO}#snL99 zn>VP{{B|zsCmYX>^_7Byo()IehoTE#rD;QCT!i=ZbCq(-a4ETKPu&mh7O6Zo8VfGiSZ@dsaJ8}*le40kt`lZP9@$INGmV3#n@A97LOgRM7bM0=*0C@W=* zw&!r)Qx*hk$w$rnV$veRFzLJW1;biT|q-6*cUGRHQr)eXdZ9bawm{rNkf+NZlvDQ#0SF|ERFJhnO{lkkU?K+a{J zTp0NB#L_MQ9oODnKmWN9^X~0rBFXclDG}+%_tX3UqQ+6-`(o| ztX0twI%%wP#4~VWs1R<9e#RyR)1k0w7tN+s zlP0s-LAT<}M&?W-Jbm0GthtdmW&625&K+uQEg>?nXke>B!kq^{D}2&jWM12;Pc#wV6HwzRv zL%c!`$olX(s~PdXhNg%tTLfBrF?!BZ%Wre)hT3HR62Pn-pM zXi}+HUA4qql4t%aZ2w8CT#K>7cAvqP)^0L~NPh1)Y>^EAfg26Y+Cbp*iVobk%y^qI z?1~Q-Di6mkP5WhC#NJ0t>{bOdIW! zAlV`5U?#PH#Db9RsYpyx(_K=6kyN%NZFMml0Ol8o%mO-fHtzAzq*Y|G6{Zp$s#C+S zd{>Fa%XojBV&Fq(ocMgYX|A-t|mN6YoE|JDpP0{-?#?Q8WN1rADy&=l8)Q@S_WHseYn zH|6-G?`sNry~eramDEb`-QMy(XAO0>Or3KW9m`ts#{oVn6u&-&H<(>4mf&Q2%#Bd^ z2Fi$he;8KJ`@qg4c95Nb!;~v@{9omNnh)EksDYa!)s>J|LF~8;M6SCa@e`E-@S$4& z!c4;WH+aa2|A^?vY1L;5yH}>fT4~$4+Tw6`sld7h0JT7Mt>74w5VCmP(0O{?aFFw3 zyR0eF*2Me2>}cZkbXga{0mDK!Coj(R8-b~47f6E5m6lZPTdTMm!rXV0oNtwzqSmi8 zS4x*e*s4<-vI09Ma5qG}&4NQaeqv)5s6YR!NHZVIP){&!qe{%4TMys^vG-F~6(!Vry>1){+#t40Db!N>TB9`%aKj+F04^5&S zwC}#mB^-g%hfrpYfQ=uE+Chs-tI7k(G|Vk;Rsu79)u^#TB&X<{WDfa`0CsNMA(6)* z6l*h2soN&A-gUl}qRnu^P?8UIzDxtMPP54nAjJ7HM82JkG1nqg#8d5tk;)Etk&@rw2>45Rw`?mg0=NoX=Swm+Bosgqz-YnC#`C zrK)E#dy*9a)GFGaE7iu#BNfm^qT+|sT95+A_7rk}$B~V)kg6OVW~nfxJC>i5_nrt^ zIp3b{ssgyA-wvr}o=dUR2|W;e%>VEA4=jv_57CrFGq9}g7wMl?dI{C*@H!?_2!VG+ zGtYx1I*=mgs6djqWH6bi54S4(E^;Fc*LsCsb=F;qF_}}RE=(|B&c|b5j&y&yxA8Mj zWE`y*0gYCQMqw&f%=at*zO*x(y!w~eusr@zMO2J7(7x7;5*}#)M(Y4~DECF0mx-ld zP1`O-Y=5;>I0`&+{;)%II2(yS7tGLEl;3qPCZ-!z;+E5%t7*OojG!Pltjrr+d`#eG_BR|ayacDc z=6$MW%i_%pXu1#r+E1ut+Tad+zvJO~$jKBK6>_h!BpK3ATVfGnzi#7*!5hr5znnKJ z6}BFYv*8u`YmC~&ClRp4&ea>K`@-|A-dp(Cl!lq(vWQq(K6xPI?s=IXanPpreK&s0 zWdEyMg91e8&TqCntLbv!WR>jsAr41wX9^|K%5-f9^wnxZ_|NnMKcC>j2XC(rE&RZI zFd&Fm`@|bzL9cz3rEY^``pWUYoBwWs78#K-gn-?#bX*mKR#%I!rZD^prIsYUmibEd zL9O22nwpz3gZ)1=8Pi-VENpOq2AX)Xyawu`R^S_`y*=Zcc zya(h6SW4p*+THipZD0T}C&Zr@S_dwlQQEqV>(jB69w{(sa~Cy(8Pqg>LkN_?MrA@f zOqB;`MXgrz)XRw!qCx!9*zkM;Xy z9I)&v2T&lEn*BtlwJ%gUd;Ee?Zc=9sujjWrp1HihV>M`RXJc==Z&-eH_sgihh5bz# zoH-o|+hSGX&oLDf=sqvkS-{jxM;qT~_3c^gOty5Jql4C8@68LZv7$xBq`brA=F~M2 z#y(>vuI6H;I*iNK0>)`aIDbjxd4gG~DR?<%q*#U37AT+-VL>ZVcaQ?@FD#!U)9_Hi zV^te9X+405BMa@0e8gGitBpycrN7VLq7D)z{6Zzas}sdb%C+0{=yKWknSrJP*!S;Y z?I8-fKDs3)#(F2*2Lr4-R#(h6sP+DAael;wwA4F{vf=Lrw5~LbS+V?%^Jr;NtSM-V=;Fx4 zVIHBad5X-TGyTR;c-eF>;TYRZ6YGA1MJqDqt1nV`^}W)t@FL)PTL3NcVqwL5FF$pO z6{8Qk&+56NDY7KF)+`)e1pbP|Rcw^a$a#wDXv%;Ql`8VMez^*zuxT%2TeeVt0Dc*d zT3_7OP(rCx6QtX?#hJ!SwO)F77JIW9R4wu0=~Rx3pFXph59g8^yb)Jls-Btd^|4!!UBIP# z*V^yoD`BjH+)CF1`f=;E1(l-cozW4@&Yki^pYHl%%mS0oo;6F)p6<7^B2K%3jgC(z zDwq4TLvfy4KZu0ON0XPb?&AxX&zhTdp>`}(Zq61!B!H}(+(fRJ|ITQtdqEzxB`tZK zc8TiW#du1QJ3@1sEtH%dx*5;?kuWqO8$X`iISO8%}1qPV^B|b_8y+fxYMT|8-V$N0Y+O}0pon+EJBNFffs~pU)&^_sR7@lPt*HF zN}75&jpNd$oT8%htDg~(zEFx6v5}R z5rtty1nj^LokV|pt4E+j?w29pq~|U9@+%xQ4(OhKVMR?gU{VG1u+D7dB%0q+h<_`j zbXkSbE#~EQ*tP!lM*82LR6{f}SPW?Av#F;mVS2mriP%6?o_T=D`{3VCxxbpgm3;=U z1OgHcBcep6&pmN7e|!tCTK5^4IGG`DB{5=&*>-Urq|{hYD8ICW1(-lE;cLXNBGmPU zPSZ9mDCHLE++XZ$DIF0|#>gU2<|FP~?@dCQ#3F2aaXd%^#yE6B51;_v?sQSI1gy{8GiA-8G73|E{5Nizf`2VuAL;|5gAIe9a~pj}NhFZB z?5~FCuIBLe2v`OcsEP?;82bM@7Hi@DEXOsUIy6Wd>s2#(iP`kn^=sajzwM@qoyZnk zs?b%*^`D2dAoLx4i9d=JAb~LKup9o+aH4WuYBy?fY?St?i((W|iWWRfXNXLx%30v& zB7PlSJ>%iGc-z0|u6e0^iz4i;N;M^}e0WU(y>r~UT-IiJ-6L)5c2u|7JWt8BQTES` z#-1-sRmS@vYJOZ!SI2Sx^FRmx5Z(!~XB1ISgiWm8ud!jaL95(V46c`)&lavXRO#$z z9$PAHS+T$7EP;|>`uh`7Z+`s_eso7h?@c=XObk{8Tu}s07D0UuwE~{0G$oyHlf}Gb0uok+H^8L>z%$)IFuCJ=5X(&a+2thJ|f>tE1?9fwR^HOPax;}OT0c^ zf_kSx7ZsH??n5adO))@T*WvV7^Y_p_Q7kEsT3|0mumprbssl-Bbfq?e_McvZ?Zkgr zT>}Hn2<>ot{Pr^B;8V* zG@8LPLWMOtXN~uMzw~2#bp(%1Tctq9->V z2U!*nrh{ox_*uZ&U`6b#ysP~WAZhO4O^b~tr=?wCdbubmW==W=WZq;hGx2vnay9#| z#RDIheIlU@Q-Ut*@0)vj=B=(Aqu+KJ?kCbhx7WNk)G(g7P*n!SgJXdOs2NNtqZiI- zr`Uq4A?NopPzDKDCh?pQSTd*PH{j-ijc}xSLF4eSVk2$3Ig(5gOzvlt?!O2g+tXcS<4 z%X%0Jp%)he%6SIMjPqQ~kpAB3tVj&vADDT|TDkd4zM}4O0MDPgXu>hl!rmuUrV+D^ z-n?{l1u$Yd;Un#R+cwC^E)^L=tRv)ewmA*Ju`0+Mg>MgbJD1$bGr4_9+2Hcno7A1I zh*PsiM*e|GJ6<}T5o#7FgT`!mu|0y|Ldt5*Z$C|AyL?IY;FUBzl2;nFY@=Kq*G68f zSd9J5ifeGIydxNN&aE7II3tvL5pvxh5^4GyuI{9el>?T?!`#g=$-4isCaG#cK+{?j8&63$9l$hdBgu9$N9dYN=Bu*U_r)Btkp4%-OvY< z-Y{PpnSd0M!)J#B`T>hIuyyOQR708I76*b&$w8BwsA(nSf|2hM!L_DcUvMauGwoIS!sJU3E-zvO$ zQ}t}1j?LzzGE9xcjQazPip322la)8A>pq{XwtXd~*9wMf%0M{B4l!fsMuXc`ZFJ3W>IEUf>Q?YWh>%b+Kly( z^h{K8O+KWw_M%iwYL??G=`g8$%=#ov*iw~o3$O)BdnJsPB2GJNmlwf+Q;i3YZbHQO zGU1IyXTafbVE}UpS)sO|%L&0spH)j$9@V>F%lUSTRfdE=X#Pms?FzT`S+mN|eggl|yhDP~DUcLM9A6n^P2w32>H|D>eZ2C1OU48-*WZBz)I(LL#?f^3U#042yJ8ZyYSgN4%a=`N>`n8Q#dJ3TP*Q(e#sWmP z9eAg7_S=)SN=6k;6^LQ^weszY^1DU_syYlr%qEit+i#z0k*XX$iXS8J%NV(_OfUo^ z0OE=4X`)7M4T^_b70<~RZj=&1ovqt4LGaYc_&Y^UvAfF1KY|P7e$=2|=`9ADf z33DDjU+{|1;J^F6KctBCO(+DenLE=KVY4;97)%neX9d=I)9-tF^Egqv4X^O8Yo9nL zkkmMib}er?O1PaPyq&|o4%64V^0W@KT5wv z$c4=q{|vY{={`fOjFgkpOiD_6>%6+D(TUFerJ97-q~0ut^>J6LB9=qdi)OLs;OX-?N zKZs{X0mC$xYRx2qUjlML34W67JMcrvXak5q#NK0_0jwsQF%oWW7Ap+L#VUt=2EG}X z+of=EAav>{MA9VEJQO80bnFl5kQtoc-V0glGDhh-vEocD^EJMWZAPHJ0W zs#9=+fvH|>yZeGETrUJk`igUIK7j0WcHf=JHYmR$p8W}M(cU%qh7A4uOu(6mObp29I7ITunI?hP3n8)HUFOgV&%?#%hwFxAXo>)+lskG-GU$ts&p-ve)cs|l`wV$68$Cb7)JH&?y>e15A4LLQB{ zRH;+$zCDbuv+~16MJ!Xy-%C~4ob3HDSpSnJaZ2JL)@7a@gOoKabfa*E>-FH#YMV=^ zY_zzTF)Ctko7}S9uKT;dwA=GGUgQMseHyc7m^b;C?cr*+n$|Gct8>@BFW9hHR^%uI zn}8`Sgz5-3h;i`yhtv6pr=}hg0<7HjY2sM2QH>XLx=ew`lK5s`b4o9#Gli%~QEd8; z#ZF5#bVW3dpjj9(jB$2+4f{30g3kJnB!omqb%Z6?%j2vF%FyywH=olz@^BloZSj0G z4>arYrg1mbbfxa0PZgGRi z?uUBmoS#}f?|0I*y@|?5_(xO{Ps}fvBYL^BRzU>7q6sPH2-Y*<18fiqA!Ho3YK8NE ztZ*R);>q-f@c*}*$eM`IqG@(g`r;2o{E@uFCS(uOe)HaG6?be3{xaRlw0KTz4oRAUWDFu(c_y=gkak6ibS3iT zx6)sDaZrYkY5CBXcgPy>xA3@8C1>V*A?M!&*X?BjUgK=S}rG zx?w_5Tx@vb-jzI0xJQ^ho?~fXgG#3l8wI9`9Kir}su1Q1#Qk45Z#xga!z2Rwy8+OT zWV$<&e$?}-fey!tmwt{=8#;?%_NyzEO&{eF+*FDlGGsk!+@qMm4xvs)JG8Dk=QdB? zATrMVfRB%l_YD@O!ocPDSD|b@D(Xs5Tvuv)(rY?=G85QJV-bo@pHaJ)DwWiBW!K#e z7K9+(dqgf#`)r27sMrcagJyfDeu%08lq|u5C`n0%MQl0j;RK@wZklu1JdudFAz1+V z*i)Vy^Ns&$7wYX&}ve9^cq=XqTwcK#=}uqxj@V zJ0;WWJfs;rqbmc58Q>RYyy`wZP*D<;ZM1tj5lDp=!3F2bZN{Xe;h?zXAx=*~0iDCf zSMM`$x}a};P)Up!-DZ?9-b%ThB-;+fQ?iV}vZxaHhiN=g*YiVqD0@B53-eGE* zKFW2-wd|1_m)=UWnBofkjd|G)l2du{b;!aw-6G=RNv&+L{U6GDg-)%*)Pl7C1?sY5 z|G461#$L(3PSx+?5O`i*!=qT3kP^j#I@%n^idq@^B2rkWY)VMx<#KE0Qy#Ru-IRRW z{pil})_XX>78hjyi+{nG;XNR}tR^Pb9$B3$H5rv~>Fs5<||5aBj2_sC=`;EN*FL=!o zhmnP#h)idKB)nhq);Tx83NxORlkV4` zw%D0xdqZaR4zJ^s=o{b#1NMB0+B-$)l36f^t4bDkmi#vg-}jh*KVB3y>6>FGQVbB9 z+xH-a)3pO~eGs%7V33fB54HYAA#hak1x5(cTK4v6q^qGOI#?8>XG&_vh9d-i`18aR zPTn%p4=}eX=Eg!*q}!6#Wm341({vU_U;ZL5WdJoFjV5Iw*l7U~R5^Vkhz)ypLB@bt zqhO|6!rbh4eNX_#lBD4m12>!7hb-`<>Q?B~gWRX{q@=uqqk$JiCt;cOz=}~aMp7F17GI8>CHDYBJ6pv z+}?RLt8(?8Km1dq(=BwSubJ{0$#drY;Hia*X&v!af@}0=9lOM7zWqkmfEgtsI{GSt z0&AUW>%T84;1?1<|1s(@W*IKS_Hvue@kb~KX5JKS<_#! zH=IPDZPpXf<$r7YGP@Ghnd-hbiS38f%(L$UW%!UI6pgw~T}vk z>batZ>_<0$T=p#P*LWViPuC$5nO{T1QZPO$!7X2UVaj7BxEMPm%s?l?SR?e=yzw(GIe_hMF{g%kZqg(5KAey!m`m|G z*&6;4UP7_WdL&s#&j`WzfPc}G}2STQA|Acys0A6~;WAVLMPP^VlR$@XlyHee9{dH~N* zxXu68IolS@q{fWWoCLW4yoF7n&rJ1M0a>n4#xaVLKJe?;VlZ!h`Ha%o`M}FteFJJd zNCd@MMp-6t6_2d@uP|f{(a7=^OPTYcNT9Suqj;S1XH@f)g(}0j%W72+0o~>clM>iM z+JU}Njk<8b2SSqa$hkWy1K8)--oZHv8Tp6Nr2=p6AmUGX&8yVpyk=A^{VM7^C3for zM0z~jFN)GfsnJnB;w{ETd3WW5?_EXZ+v7J$f?xi$%H?HTtXTXFiA}y7lKS{;nLt`E z!j`o6J=kDh%9p z49&_~`%O_LL~Z2dbAUJu|1V6+rEMzS!5xW07M?=--SR8}&m|lrao`VZuP(2iD4ZI} zkzA-5=8$Z!Yf`tMy|KOW;0fcRl+S|xiq%R-uze$WHTJ0WsgP@s(>iBHVX@y3E}Vy= zMY7rB-Pw3PqUkQTTPjMbz|l-G+|tEyJUrevWlR!xM<|lWg^@cYW#=V=HMIN ztT>I+i6G!@;(4z9-TRy~zm^w}Bc2xfHBG~(!w;77&q!mJDJ8nxVoqY4_mgPx0Qv|_ zNkEwYvcM+=T!OBT7s<`c$}Qjp*v8Rpp?1A?pJ$MzbD;OrZKpjQUXfn}G&RLyys|p< z@*q1_aBgsuu%USn+`xL_0bz8_|Kx_Vwe!mk6rT~fryk$Wf{8rf@Phndg_dR|>~iOZ z($+Z`%INwnU{FWlF#~XO7_KE_o;LnxAROd{E+V&g<{`}xZPFbN3j@oIYrlc0|Qt+IEYGxL89 zNo45SM8XOqpn6*43rJbTsQM*4gG)cV^dv0M8`<+aCm0~88FCoptO&aeCQ$zb2h<2S zV_Pe9l55+l>8=JSTdy?4%UK{u5^e`@5X#u{g67dgfQ+|1O@!~99De^##LZcgHeY^Oj!-|8v*@Z z2CQKQR`k;(8O7m_Fo6hID*=5QRCSD6XEL@tYS}VP#E2O3Ne^lWLUaL5^-+SOQ>`}k zr*W=WrizAAQ-(ef9p*4b!n zb_M75tzc&w4=Kl)`3V0=*>#q6PFVSYD6qfH&#w6!oSD-!;;e6)@PV`hz+&r%2{9r+ zw?E4a0*iK%%WP?r!^#4Qxot=6uyLm+`h7@w%GirhQ0w?ioU$y)nMCM5LUHvrGWiLIf#XL=H%rdYV@~vC!Y@<76&Q zlQ{Gj1U@BN?a+Q-IC08>D$zxi9>1n({gh4efK48|V|BbNZDnZ%ml zn18dd%{BNlDU@_rLHJZuR917PKQ4L%9|fwQc@ctrV`%Qz>Gz_h`-9p=Y7ZLW+MOp+ z0Ro=4=UT5F<~(uWJatV>>Shf4&=?UW{+vwGfUecbKjt5b2m@bQoUyrbhTg^OBZSU%BDfR7u(G=y2W`rYJ_e|1m{NGD{3R967^8`Fn{ z0II}<0pJhYgvtQhSfOqn7TpF3-;mVzj^S1vFhD(&(&+{txJ=`ssRmNsM!R*v(vmra zllviP0WAX!<>!o>V~4b)gY$lj1ZNs3284nQaVqR;zTj1o=#QkZstirTiUXHxER4$a zY4`2kw?$#mVO)3Ckwn4hM#bMv3<`Qb#wBy!Og-SKX~S+~X7)@S@>&Ow%1YH17&=4n zTXxTQyBTU51Ws#*G1D1NDw9roWtw##WUB_?ZX5J)kyT}XO1)6(S_tSf*47*)xjGf_ z*~Yp<>w=|O!7|)jHv<-pJi}BR6_%u#&xe96aXru-Hu6ysSj922BNfO zOfZm;QTJtTY=qT%{>p|N7^}bLiVDexafc(n6%swTo~{hmjJ-V%!ow076n)4~T~tng zVp6I2Dc4C5eI*zUD%EY}-N4~LPp|GC(^m^#sN|0$cN1@}XwYiU&^s0lJpWDoQI7hX ztUWFupg0>@XB{j7Og($wh+0Otn)wCFLtm5&QIR9SOMcJ!r6yFnpX^14e=?q!@)p7n zM}&fY{)j{Vc&+|R5>20lM<%;i0vJ3hI{e^gKuC16_ z8Z$@dOrNPlsbC1Il>Z7L6&6jDcn;N!9?ATVD_RjLJV(V)CuCng_$hu?CBxlL?O8 z8|DiG58|>P5L%=HoVhSW12LxTD02P2cdQZHwJ4UVS7KAkoST{RBB$p_5M*6y$wq^x zj`V%wsG4A}(TGKnS(USRMy{i8PnM00VTw8|NU203I<;v1c|Rl-v*}2HTXrOp7&FD$ zo$*3|b0OL=o7YUQGw7o;`vC7K+#S8>h<&4Lug8>qC|6P)L~Pj1h_bqecoF71F9`*K zKV%iN{UXp&G_@R+AR-DFXQWwVC~v`@02f!RoeumZFqR=8Bpf_9rX57<5CdAU^$8YV z2z@tVG98jcj&d8fY}*I)3d`n)P}AwP@xO@t=8t1`g{f5*Z9w%EMJxbuXNt?t#DD&M zmdiwx+>h%w4_*2MssWcqskKhumeuIi)_X}r#RJf=Q0JUl!qDcOXf#$BlKkWKYt;|d zGzbZh=Xl?jQQdbo7J+4YJY>~n`c(MUD5Xu06(m*5f+-Tzxda){nJ_KqOf&a{z3lT( zBqj%eTtBl~8RunnyyBn+HiujVBj>g%s)(`nBLp-VS6IkU9HM!#YUla-2=6($#!&w^bSrSF~R2ihS{f!vJM%3k6>2yK)(Bl|V+ z9i6T=dyXaXFlPdoZEh1ipw%~*^V4hS>VoF-z+YTf>?{wEDQu)rl9 z7&1B)ouclbcnj!^T-yg11t1pOiIzO*$+~xkp#2IbhA9k*qII30*CMGN#~0c1OJF*xP1El$A3r0MAI zFO?+@MkKWmL@sTl24T2HiKOLPE3Al!S!b|3G9Ax0$h|2hnRktK+p z@X7{PmNrip%Ky@@A=1ckvNecs`IOMb*boxoyzYIM>-31x8sgBK*Ft(5iG9C1hgAb-z3?mU(J&BUMaua2?gn(67jdC00|A1Yh7 z2lc(SF{5Rv2Io<|+>4%%Wgl9&P{Un4W;>kcNDb1+DtD@lUVF%|;Fkr0G_dVbO*qix=z~)yV2FWcqR$Y6&aXAe zl^1zL-=}Ayk@?V5WuhCGHcLQr=>;vL(H*MwKf(0sWdA5Kh3^PZzVwH`(PYAFs`oR_ zxb%~_v5@%r`k}CpSo5WcNJvEBUQB>U5!c`pQ@X6poz>x3lKP#>j`PV24XbgY#g?8RYxmhSJ7hOoffIMpN=2as{MS2+p|Av)YhhZAP|c8UI82mU2$<%p&ei2!N&Rc9rn;0Z?9EBSOT1gT=D z1i_F~yX*L;ZiIVohb?ja2RID=_r8(gk>U6(VZv4%n5`ci^X*@v&PV`Y_CaPt?2kDN)a(Kc;!!qb1e}$C(?b*N&@5mcf|S*PjtKbJKXq;J@#CVMaCTWM113 zvSdEnp^Ubf`WI)c*3f2F802=Z4(Y&ZL`DmwPm%G?-rktsYyAgVTQj4)>ao=&^~_~H zT`?rW<1S$9kwW8Eq>_K3#2s{waDJZ78&A6slTRHU>+98S5%@_+2#@eu3Z*CL9a@_d zUfBl|Iz4+K3oXSkFiV_2i84phx$Q#HNo=9Yy5s|kt%bo#x(_wI6iB}CeIOD>U42E+ zYO~wk4}JD}XZp%eFk57;#Wdo~-dd-)fj;G9&G6BqV~hYiVFK<%=1fXM@aGCO?iKs) zHt#2>6~4b191gku-stsknaXBD|NRdx54;w9W)Q1?11-w|hsBh5m_$G;LaHp|iX-qw z5A&S=+kgMe`;ZcHeLs$^x~-48G)toDHf=>P@OuI)H8EoG=&<8{7or@1cbC)JrI~ z^5H+F{>|>tBcqQ9Ax^AKHxf(oz{U^ZMisPw=}ZWC?8!0U3m~^CH<-?j1923o>}DZ( zho0!-h=$8;-kvOeQgEotvdpcxrQnA_5@q2BC?pC+{F7E#s4|f~U1^-eR;Q$-3{cHM zawK_X`G0NypoNq8n_XhL1P%+{BZWv)(O7wZ1&8fQ3T~0n-dH9m$Qa?U!cm=|X?-2L zb6Wx1GWtOxHTP>(OV^h<6s)K)v!Lm*Pb1=zOe(1s{hs-9pt0c>myclm=qYuRzgDT+ z0e(d_xYty_c|mNNg)?Z+KNA)dX0NYAs?tN8f~BysnQ$^_ zr~&AK0DolF_fUg^;5Yw_;G>}QxE!;G#e5J3y6}X3Xj-}w5eNP|ILw7O7NSfK`i?t) zwiA4s_>yMq!ObZ^oHpo|ih;p9GOXctKUtb$OPXqe-eOF%YQig?QVBPjEcM^IA`;W9 z_34?3?H`BR1;xJ1@MzZUkhBQ3)NQ?|*m^$O_ZbMK2E5-RpSHyIxZiyEe;OjkdRwW= zvA3pw9lW(L737KAS(34P-2HSlVpOP^6%>qv-G0CD<05_B+YJ10oIs0^#n)F;X3VR` zje*7~wdU$5CHOMoTx5FqIm+kmrs1APE^qNI!a`%rxja1xW-p5UUpasE6RVRa5^(+d z^e8B~dVyIewf1V%rYu9Nl_-7QHMPgss>vo(L$H^>deU0g)`OFkdzS4fOZH;BU_|I; zod2#tgJ+GOZCPKXl~!N&e_aJ~_>Fj^%3bsqMajyw4Ttu);mi zg(dMV}_`5 z`*7-&TJ^R|uD`YX1U?$YQ%ZC=c1TYSPX3Z&7waU9{LF}=c9TIKtD#;A zNWq_it?EL`ExOFssL=PnAVchgJcD@swA|tp^bc$2bxR;5FeNEey7OzFBV>ju@GJp$ zVBH;$+vCOJPXOsq<>j-QHv|!kqR6ptm4*^N6QF(45zcFrubFw!s2I|A8s)rPBKqnG z2qWPw=0RQX&6sVT zT0NVE%B0!Z&Blyd;&z?J1wyfF)Q_P?ZuHpEPv%=n0aBg<-HUX-Z>{4=H}aYwHYtp& z;ryPXKm3ysCo>3e31mcw+(A-!9}^To5Qx0R$O~8vY3s2=iQ+t3ZxQ?#h3i* zAhq@i!iBk&$;Fy4R+LUXLi`LgkELhJ<#JCSomQ!#P>IYv&*`m|cGxJtUO3qw!&`dp zyUshluFbdm;_c(O!~PqbBDME~jf4H*w6$7zY*HxByQkMUJaVI!#+EwL!v|jQ>R&Oi z{Kx*HnVPF3mo8K2>a(uJ+-r$esR|4I!OZWyN`!L34A3w6z^=;XI`Jo=qtw0nR745+ z?W2*ClhF-up@fDq(DymU1>M(c(?a=iDkwT~+dKT0Jtv&VW^PPg(_8C2t~f3g9%rCl z)&}^G@UGyPFP*PbuX7h1&#TIrRF$UYM#I`icbAHNK$lRiSlJ_Tl4#L&$_R36e_BE{ zx1!fE;Z)yjLFXNKr=eF$gH4Lg=tm^w|)=eQzX9k18kP zZ!&c$f1^jGZl_so)F1Oc;jcELyv<@{q>iVwo4icO7*=T?uK zfYp7FX9bZ{gg~H@Bh;NlGLLy_Uc~ppMpIbf0&=uQqF7WD@|LepmXrGjKB4^TEv+=_ z2dA=0(0v=Dkxz4vLALj8Z9gbXm)7uEat{2f)4UY-M^1ReLo5Wf(pGJx?s}Y2t8PJS z3a-@~nv|KmE_oRO9@iB|+faQAe9%O)*cF_@Xi{min5G$urB7k{any-KRwMfW17q2* zKa;9a;a-G^0l`hgyzI?JZN;q5_jRWvnvQsjz++Gm<-mAQ3S%7BRb(SFs<~v@9O!5*!CcvL2pVw!x}{~Pp$*b6X88;rEMf%X zyvHc>5!}W2k8dT&GXdAsy19^vi+wz(hilbZ;@Rce5EXep-8v`0!XbVG)3S_zBkldH z{NPWSFDAL~|9Htl*!p}qY%qiMzTNpuryO;NNuY)8dNYaQR_%2I{|=eTwN;6<;`Bxa z;Y1OjZu1uvb?FziY#Gopk{Z%AJec=y7+;(6GHf4~QL2j)KGM~*8nS`;1uEy(h&xrI_Y<)MH`(HVWj%5n6*hr#h2KAVokOHMc{?)$M zbP@b9T?`rV=X9yvw7c7a2K$!F(jQQ|xhHw=8^6ei-kW~WflS@(8gKW=qReX5wYrKu z$H;bspW07$>wT9ry*`$~W)>l$bw4j@Bg60h%-2P)i}(ZeRh4mwW6zbpfawvv(@u_ZB!0aJqc@c&a5XxT zmGeKDl>06mWXv@+w{*kgo><}xaS7lG8t3gON#^I9P1w2@dZGs+77 zl`e6-`KaAVM43T%{*TsMe6GjR*@7=Y$T&guAQYcU>qRzw-M*;zSrUEj^NRttca4kH zW_GJh-<=bBKH)RTwJHAw%SV@M@P;42b&L70E}zhG6?CD5gNI^SztQTxpYd{@VzLOI z@zbaHt-ku_d&%xtrsvb`$zw_%28o$nV9cwO_+MrJW~s)m5fkFbLJZ5AMp`~!5v?id zpD{$v!++X@moN}SAO$7|b|?xLW|7bFKGoBjnx?$w8(~;fDVC5ggZ^+D)u!LWd{z_g ziZ7m493vgfGTV00BVNa!2!j&#)45LY@>DF`2=gpz`uAGo?E<%&YEd%ZPYe=B3NTJY zM<0psh2J`B8G@@$Ke!LYYT}}v>p86$zrUjOrOZSfr49V6(j=f?mj4-9m5;&q`jhyV z^97kZ!vZLn>XxJOYl-JiAqLhuc-B}xMCg4fuF1n3)tsA&05G#fvesHCCR`69+MG&B_EYXlehE) zs*O0iTlGu#S10=ZV^+w6B)DOu5It;vxC6gl;_#2n3>ewk7$Vj=yATg z<4!+p96R>mpIuG!;r+q%D5o?}GB>U=>M{qo+hJsoAD0|!%2&>pPH{xZ6xY-~BVM7P zVHFIYRUOY}v9+Jt?L?pTuCI;w>P?A!;`JJTpu}g}ouK|w*in1MXWL58qMl53 zc$xh;Md1K-LzEy_RCV{f|A?TBQtEA-djN>ChQ=5dLLXmw6d`+v!E(E=Z!gSXJQdP^ zkfS^Zii+)EDc;v+-GndDsJhB94$37sQnd3<_`o9B{OGJh#^YbDz@X&DFv-i(4m~-|BTc~i87zdIkI{a*JyIK zfZpqbs#kmCzWceMe^iPS*v-Jf5EO?aGR8azr`4RZr+Dc9fW{XB&f@+Sd*fG|KXqD) zs$E<&oM@{=I0JW!)4otGQ6p!eMh`b$IwMn%uBK_(*iWrJV_Eo_`tGThw;_Q|qeEBd z`CN?HUrJl4nPzn_Fz8^%SHy=0F*Xv)o8@^AHo7MCrkqF_4GwvbN@hES$Kw{4=wdGy z>`eZL>gwN@{b&E(%}fI`MiZR+zj^|*eR!56fG@f3ADV`Clh6weRr^~iX1!eR)k+{1 zxsdNpsa$xFSCN;Ed;#K~SND;6qiVYN)0HNPJ+E+z{T&VBMVApwWkxrp3s+lKmvT-U zhBPxS9tn?4kTPRzG8p|JqvrI-ZB4PS4oc>+$~1S5jq^xjzH$3=&&tY%nsb%uTH=RD zk@YFsIUFo$XUDCc@LMCnZN;Z>A`Wwy$-o%aqDuO7E}NkQ>fs*;`A;?IsG?2I2T-Em zwprrHiVX{U9|Q!q_WSW|`_1Yz+owkDQ;B*8Do+#R;3{gqK~DNAQP%+`D$nx20z-1N z;*zS8fM8lY%|y1bw;%20UOvB_+Sbcu=^fTEFk;UHvd15y?#x=V_o_cLYKkxao)75i z0C}+3U!FFf)n)g>R!!<51E+s0w7Z^Yl9;zcC3quJ=SPW55`C=DYs1R|?@3O6IS%+x z^j4VXtJU0>;dKcLX#K_kPelqopLgFsKmVCXpH%oTw)Um3j5!Uz*``WNcd5ogOnE4c z(@I=iTt#IjjzWw>YtJJNUOi*GmTOZF7G}sCBANVjt`k;rg@MI!m8;YB*xP&NRSKS=!_@ zom9Q9^RO9(m$YE{{p8NB?b!$=Rv+W6dXDjhByG92mp)_6QuFl^$oKYfFWG5smviHg zEGrbLZ!lcUNaKD6zYU;McY9h9QP@7!cyZ9MVI110dht{q<$E(#**&+HtuCe~>F>L- zgP*O5K~u-e`T8=#?VG=Ow_d8?s&%yXy6W&kZNp`=R8t_6#J1e#97JP7rd4CTSjGD< zsV@xgcQ;<(#*X*hD$?iyu8c=Tp?rE*AS)}Ydfh#@XVpHTuypIq^VRqjF}pgCq~7KN z9|)2Sji}bUHDW@-10J{@f5n7+hNxNhwrP`(?33r)B@RLwpYWqb^8k1P^@pis%KI7 zW%Pzp@2RJBylfJDo-Q`|SAM1YZCC6^y)Sh--$* z=!N~|Eo80CXug@N%-&&%#i|of;w{F|ucLa^KkoZ9TW|)}V4i`!W~%*hIkjl__rIqR zOI3t<+01n9hkw5pMq?#T>rvL9mOEnFPaZooIoB<9Ib9k4okqVM8Sn}bH;*}qV_0qJ zm-u>?Xtps3r1gu=RjjG5;i_iul{&l_orRU2=iCUl40B$-Re5ZZg${`pe!tX2lhv3G z)u8gwBq37&SFN{F^Eef(S4LV^s_mxd(Y9LwPCp@3KK2z=Q*VrG834&-YHghm;#&D8DG?vMCc8Ba^PkFdA z2#FKC>1x>TLU6Am`5z%2KzK}H5=?cJ4CX#55R2d7$@+j@7J z%OwE9zk2b+>61>UvNJ)KBevC#g$e^IshI1d>C&cF9k#T4^pqK0QaA`99vlrX_eMmvj zjiAX;qUmVb>|dSqoTXYTv(stRogf>(hsi!_)Xvj0Q|Q_pP2)Vuyi(*o1aP{kF6Am!Ed%*<3~80f>3+fkkT*O0;bx3al4oY} z!5dhzX=3g{5P&XDIVpJU_OhGMN=2_^qE$7^Sk-?UU&4v!tXXzX76d}&@Ws^hsXcNv ztMb++wu}oHs}((bk(WdjpCqtzH_xk6{GErZC^@_B`K7*+w4?7UPHEnOQLHS&k&JN* z$KUm&>9$2Va(uQ?Cxv6j#phx}oops2lY`R8_J=|gh0K~hj3^y6;-ra75)99H78m%5 zYwl8Oipt8wQICHscgZ2H(^#c*5DCLOPoJx#8$%tv1Z=IvZJp!UtxI-1Lme#vhkrAb z46`UN@fW$7OfNp0LsY46_fA9lkPk$$O(CI9bfc8yl$~y;uQNT_jR>zw?u1Y#C>v9KoQ& zEf+ryjVj}w0$O8I7XA20D5gA?#a#D$ z543)ao#tDGxumpURdtvTV_2g~DT<rWHzllI#^qury_=G7iP zQW-?5Z2Gt1#Z}K?Pa!NU&z+G9(Q~KGj-O4 z-#@+aw~IXmA$4B!{p7349}l~->ssx7h>;A)RQAsU)iese{7?Pa_&zVnEj_*McWRm# z)DL7}`olNsd*@^972&c_LGj2w-vS~emQMim{{)sNBfk}~tTr(vcg%>%(cO~>kF z!RD(q-b8KQWuJWZ;rBo9|Cn*WN(66g>hRKfZ{%rB@DxFWTucH@_;jaQCxS@>ZF{a! z^COH)m?Azo}B(* z;+@g-$>J59+zVLWp1n}+@p&HFDUqW=I+vEwz0#2d@JQ6$-FdzUuS?fsfK5kI6kXF) z6Box>f4NT9PNkkLRwFTtof_jmYAq!eGxmu7V|@V{p}20pw?bMMya@H>_0mXE&r0zs zB-?dK!xO^@4EWXWx&ioWEDphco`@5lv1_^L6S!NMt}qbeB}@a|9xpoW4EQ5G{ji-1 zSw+rxAGJ`+C_8_MFok%Cl8;8B)1@9bzS`^t;dDx=aFp7RVQH-X9omw^KsZtr{jk2` z*Nr)7{|g4ryA_c4JKKjyZdy$nnT}4Q>bCXGCix&oQMydmue4{Sq#a**9_@gzlo zaPGd6&?7gZ)Rd&mhfToH`&-DVd{DjhVpk*qHgo&4V*&v5J^@}PSGUyzcV#Gvflk9~ z?$37y002I_&!RU14;?6TRU`jREt-f^fA-;OuNj1rX$6K9DN-HmAp=B{b{|OCtO$+U z*aj%o+qJ_}=w#XTEL>F)w`4}u@_ehSrz+7^k?ub-N+gSjU!~VbjY?BC=}nC#s1T6+ z`||_T4khzw2r1ZO3q<~KnpkUSdprw_EYytMtBY8DTVARcsJYm&Bde|e9lJI6C?4A- zL4_5%mfxOF=qD#96%`e^F9_CpBk`f-@vlzvE!mj#Z*b;&FB%;DU7NL*MQxZRs3?z! zN**rnO#kbRoDsO|3gMH_N$CpyWc7D%&GRgi&y9&E^@~Q8VQ<8$%e)SSV6jFuO-S~$ za!Ku*Q}+tH#kQTz}Y?D>}Fh-uYyTa55Xk$JZ2sJZm`6t-4G|8 z3&$w)<6n}RN-Ce*DQciFC4VW@lQpmp`amNaP~5=!uz3~NBNh(`d{ZuzE4Kd0sKuq% z=JhB~R3jqxVItn48HWc1j>KnXvN3lGUHskX^Wq^2;ks{k{5P~*XX9i=rS?~Q|L3c` zmD+u~*?3mdIBuj`X+9l)hR5~30hp6az{5ENmGC1WhD79N#_xY{$wMxzAO1@C?8Hmi zi&jE`AZRH^$Zcjn;(cVA)$iXH(}mC*$eV=M*{^G0(hnAHq@H=Eh)y;_vOpN?s0Ka) zgY;~zl@DVQdlL3fe0;q6vA;bwZ%*CD=zne@FXIdoyhSNco1p*xCnd%Ws+)UXIt>X%}`<7>0i`K83Oej9S-szBcJM8~(ElI$3Sz zrfHH}To$efF7hPEb8{c=UHQNy{Ci?z!k|0E;LXUz$WBUJyo2-Q=?*DgpL&%-UqZ@yL> z4tT@&jw3^fbmzed4jUb?IJkr}D018I;6rTM8d%p(RX|D|`S_2kT?xB=*i)+b0OmVh z1GZosLf@0xc|;6SIjLky2^1yi;lt_Q7_f6CYIcV+#rtHx&(H0@Mb-F-9eu=KZtXUJL z{w+Xb@ao`qHa5|X&Ba!)Esz}dw@@nY)7{>9HrZ7D8M4a;ppgo5GhebOS1dH3z}brS z7F|!=xL@v$QvHs#;&xERX)w&YaLT7O%)4sJ$1s+dkyFnC+{^8EfVmCG7L`6pJ&?06 z>xF?eldIJuPD6;-Nkhcrlky*xVx@Z^$D?ocpGEXCR9#bKZA^m=eL0797}1YJ@PXU; zOr`T|U)u+1jPEq*o^b@Xv3BF&fP*<(H+-5FGi|!EeiH;tCz@LdAv#jHGG%(*;h`d* z%dydKiRT&|=`)OvRq4z*o4eabqO6$0sC8>bg?)8o%`W67)1@Cevu~+*Suu*Z{EuO^ zPj37zC0DH`^MdQW<{eKm^Cw(haC~i->lgt5@f9?~jt?{NwdB{~-stlU?HTZ0AQW29 z+hZtYVb*0&Abtxldr)k4J%LBYPI=f83q|h~u}7*Dwrp7|lqYU)entf+{DB7RIy5cP zPC3L8Z#LlDC+P9NsFVM0ILibK8}-K|aY>UdnM0RrF@6H6r;yMliDJpW>oi&Yl?j~tfFDX6s#yI*W!HIM)Y6PFNraq;ky zpqWb4W}mP&WsTNA16~St{O_xy@p~#}?;9E#-iu78(?oH7Q}O?Ru;z6opFytLjN`v; zOs1Xp>sK+0U(33a$10CTtA|U27~bwhKbb-X&xKGs+2$NzNLcEQr|=6&XlKN*c%nb} z*kOf*vSuc+;ANk*ztjZttLyi+7JB%+3FpHYDEs+RU!9WZ zzq?1eRT~cmywG`uXZg;RYNS}EAQ2!wT>f)HqBW2^m?_5bsnGfe@1%m?fGL{Hq~rb< zfHetKSQE-6hlE5U_H9OJ(zutXSLXe6VYA^*0leoe`8@aFO6r~m}-VxVT!ykul%k91Y5 z&BD*`HB+S61yYBb#Ucu^&E$0%0q>0qz5ORg&h!sUd7`{nvafP4+T$TNumYN<0h3mB zZmieJ_E2kQ0XyxD^*TY*kjr}ETb;EAss)=g8&tPNjy>;Ad#h&iu?NL49>Xqr@%6sd zN`EcKq_QYI!XlG`npDWgD~*xp6k6`yrlmW{ zBKTr>!WUKZ#E}obr*T-wB+(<(_&gr`Ch(~d)Wp;lGdcD7zE9|f`$bGs21->I2izBk zK#)_eXs|R!JD%wLUmXyCj*P_YS4VC?NJ~L*@t+P;5ri8Yo1KwV<)!`Qdgdka%o=lU zFy$@;>no*~PNRgxDm2l{F%>8CB$NweB>sw68%m9Tb=+ZzL^Ge+_+y{o6CMIGEnXg? zlR(rLEsZI%kaA|bR@qHQb;#X=^2?+MqfS#|h(gRjX{@i4=OjGg5M-Px=@b?UfNjKX8qZgYDFA{r zcoLx4^KW=3GYWF*QsEB{xbakt#d_M6VGN$-$lIPEb+T2kj~~ZT>lL80_}q}T?e-t= z{C^cW%iZzQP&}0s2d~kTKCZtVlsDNBN#}@M(L-npsc52&m?`Wwd$b7IO=qVmyMoIavYw)YnZoXV9_V*g7RP*wt8FzCICo|W3?O{OZjul1*L;?}N7CNww zyW9SJZM$3Zy#J5g6cvsvTna89lRcf^(AO|Xt4$V-{0pLL2>6S@!Dp9vkt_&mYGGQT z|Kxx~t>vuW7q0}qCux~NY3xRFy_>_??qghV-hYNFT;cWd>0IuJCyJl4D84BLYo2qt z9;>?@=nEJs8M;7JhJpbX#7-ZydkMJi=HkH|s!h%o!}Z>%KveyYX;sU$R`_5*%Dyym zB3cLzl_mn7V)1QTt=&55w!cj8Sx-2Qk^6fCvpaFW@u%Ap2%h}0FgHy^D8wJ^+6#jN zwyaBQlAly-p=TlAG5?FvMg!Jt`(Z#t9vxhlvl_6m;17pn{#sKW!9`(j$s@18Q;a-H z&I79Kq6#|rn6KCFQxn!6073j)`-d!}C#g>C$lj{kn!9crU~Rrd$vPwXhhgS+$*Mfw z3K#wE0)Fl@c#E-K;n*&hyNReuqs85!3KYNii$>s-DIOdZVkG?^T$bpLj^W551d1Kb zvW3?m86JyuN`W7j#*fBCY4+IntxOsD4wGl`#m9@))AFhE4b^7jg^ICcLTg@lJ-}{w z0U>W1@OEFc6JM%62sl_6i=tAn$^()_&9>aXu%CiWiYbx&Q07>J7RPf$ zuHb8pl-8H_%Wy8CtmkS1M-GLZML8MEsp+EzTU2S?~lvY=)% z{BsuHE~MA>WGNp17;_Uahx;>}hVCO8!D6%9+56~MHcWNmWR_d$KdG5BnSc5ayOloF zLPdZgqoRQ@e3xHP1uNPGk^blB1Z)7B-(L1Kgw(-#sr~19(6naMI)+=peE?J z0~GFgW(+lk8e`|9xw4*MiwOFPQI>GCu?)KGg_;Q_^*!~!Beb!$$nf2|IMlc()NS^g zT~=FwTXvIv2FJW_rlV;E$lo~R8n2HRm2c01*W5BG%=}My{F%)Ac zdGB5g?Gso=W#AHpLnZ42Npk?a+0?Q>%}=;r0!e@;k>`puS)<2*Oqj1qGaMk?u!L2h zNoNY~U#1$RYKcMnqdbX7)u;E-SFr-O1Sf7#PDcbD%pFq{{c48I02r(`x%}!cfilZd zt<}kr&)upUyXi<6c9bTKe46;l;cUr#8mH9?*qN@zK^X-L3kx@UT?cBqYhP+m1x*eF zYk&iw3g@vHiHaCH*(WAhs^5Pj1}2~Bf;eQgsBb|aMtcbkx`SlulX-a$o`b<4WE{;p z>w`5Tmu^wB<$Ms1r{1I6Cob%6?z+5YB6dr0DXAxys@VMN)YI7Rd1?;oM^{t{LY?}Y z2}S*T*8f&eLOt2Hj7-y4nX=S<1tZL$0f_pdj&+-cYQK4?K7Jq=frQ8^xgAR86UIP8 zo1{G*pOS3%2=DaiH&m;6k6}CDyQ{pPZfU&!T=zv2yJU{m*({sOQ%S|ZH+P_oaOwEi z*kiMFUQ$q^ni{5Z+mU{zf_2@W5a9`rx7g}x=u(9pGWLtt+!p6S1P)$Gk$H;~b>u<4 z(Y#mTk;(Y0@9!&VFJ7^^t?A0xGFQ1dl!f zc5qbVeH0a#h}2BGZ>PI~+L9Iy%@5B`7wj!1fZ#o?upoOz55T+;p zC&#x$G-9qE3`McKE%`?ddp3uyo&Yy^$S;qZLxOSsyO^y?;y7VgMo~S_fDJ%t;uj4z zAFGi9jeq0WdMx`Nt3`uRRARrEs1_$$D0dA){}LvnX|=ko9)1)y#=hknqM0%xH`%ggPu;}(*DLbd7WKFTo<=y*oV@|Wj08#sTC2cdH? z90wSn=4=IxlwV?@-x`biTr&VK(2tl65%<=$T5aN_`@P4S%!vJ|d|P?C0XIlcpjdke zYVWt;sfTZs2a+?e*yuVq;N4GIST<@LngtB9apav7xnd{L-cV3951;>0v=+sc2bgTX z;3beHwSxh&7P(7b<*&0Gp+1Pj(8@oeS@t%$9G(BTKQ~Zhw3*)Q!C^d|twZo;`+z}r zL{6M7knwD0&o;nX5%VxaX0zqyRDi|qW+6l|_bnd|FdCKLBPYW<*RbR;l@Em~g(w#K zV(w-QSVPIzZYefHd4t_WKHg?!b#;O{Ma&RG+&RNsD@o^_0jx~bJvU1WC_52!L~YcA zH`%P?^-qR6H&8J!%&uF)v(atU-<$DBJIi02M$x?3PH)xq58fQj8-bS2*u>NbiqtP- zz6WYt*M@-GMo8mcRG*Vf1M=nFPF zRGE!uEogSg)>$ux1-}h`oWrI0X^#zN?L54nE09edf~oe^t;jw`nVFEna{2j1BMiTU z#-J+*5%|D9v6d~&Gx+|{Xm=zP;+D(R5Zn@;jZXJ4bZy2iA8yB3!u?e^^~GW-n0Qx@Cg=NW&uYKPU$Yx99VTm~UT8)5b+z@z$ob zE!CDh^)N25>$bQ%vN}}^FcTFjJ z34w-PzZ!Ab{Cn*|jY8I31p<_S)jaOtbkuHg3@8J?%g<^SK87}vz;u%NywLG!ZTB$8 zO94g@J52>tQAdnlWi0i%Wv5e^nGkKhgwR1|9!URnv-7}SgXK^?$F&&R^447}8Rt(( z4Bq(B)5EQ3fzElH+}P3S5)=cr45k8VVjtDWpgfyZoVh*b%i?k}Tv&Dtfhdfe^X0g$ zB@p+$&>8glBVF#VZcq2u{EPKUep}tpl)XWyQ@cPTK{iRx9^N)+q|&5AoO%jdXGFOG zLR}Kzo$_77IM;P%{C8LY<)NHw%3QWAHaVB-o^0r-S`P}F5XV-trT0wVh%B;_y*if+ zP-ZZ+vu6_z>MGHb3jdbM7dKt}8bdUv1&ofKW7nR&&Q;|Te*vMufE?#+ckJ_Fl4{Yk zXjy7ud#hG74lqoT%b+%QZRRpFGgI8_5LKLox-TU)=fiOo2jF#e7&Rr&Bg8mvwi9L0 zq2nD%d~Dit)%rL#o~X7yVWqxfw&8(Ac$fO=;>w&N%lkiSGEAMi!-X2~>BO~ee?y0N zLHhUP)>L51XvK@S0OJEDw2-8BV`(S|ardeA<$!DG0B1m$zmLj?3Ny4^&~xB)*0G^4g7>kIgxcifKTRF_TwPv_@#aL? zF!VdjRi3w~&z&1}>XU%-VZ?OARZlx>jIa>yDq(n9Fq(QyE}#fe#7G6t6=Q#Ry0Iw7 zF;e;bQDS-*$seAJ8ZhxneTZEBc3LVyxFNJZAt{QPHGv8`6buy{vLAxhxw?Rh3aQ5S zQ~4y?JP!l_$LCS|5OCI^q7ttQ7}$gN!TMi|Z=?>rvLB0h&c$4tLc728J^*^m_Dve8aQPjbG(R+|k(AlXd z`K~%__Wq2(!FQK*1!g+L13;y^E9keBwo9f=r&--SU2W6p8;^KJ8WJyMEva}nX5NU5aHIW?YG?{bJ3t5`=Cam4HKmn17q*{#e|-ex zibyt;F}Kv9hzX>gj{9+Th?YZezQi@9{r5{>-ZoC+-0Zl#dUu*qd_YEn)=JSdTJQN@1jog)!;8@qT9f-r)9N=A}N`_uY%u)Q^uy+ z+STl`o-o?E>Oe1CFJMV%IOJB7`BDG_XlrXfYEELQXiY8dB_}7JZx2P&`VA)nxQ`=y z3=s>sag6KmJ>Q!4u!t>%LeU&m~30zH040!DmwH*6gP8UB0BBd$y2W z`HL*(+c^B^8gmXW0r)Eb1FFz5mFkQ!UTX@FjarMVst_ut?#dYwb*OJY!K){3GGGg4~W;{ zT#qM6f3d+TRy9oo+u`>{kFx@rL@w9u$%=u}vQGYbq_syOEiv$lV?}gS-jqYV$f$P7B9aX|h8pnoUQN z9nx-~J`Ryv?zK#mns2aF=?*2_$Eb`hq_TbsQz+}06+z;B-v=bHgNx@ zv^hbhWmWJLV4;9O*^VzaZnV)j^myY+Og2q1Z8`PPR_>~7&i;0!79EV08#o<` z+6(oVWOJ&2)oAm{=nIElC1F{eWdd!Pf5oTgdx((WUFjd+&Q*p$d@iRJRS~_4@TCz}KT04C2ykw^PsS z8QC66v@|oz2{r4cE2rM&w5d*)G;g=-BF+Pu$*<#MY-;2P^I6vGyY_A@l-cz{$F(!V z)^dE$e*yp>$MDG==~mJEa&HoRBU>QrCHEV6sH$ef*^!LF%>K&qLlKuXS}?B6W+_af z-`=>v0&N@r`GRC2k9x6}nK-c}P)Ly2J;Rm;3o_qZsYJ9OcE*@~b7$=V{Oe0xhlnXH zG-(OXec94|RL+DV?8dAsGwV>eVP^mEdj%1VkV^TA_m>rJMlG&Puzu%U+qp~+TY?nU zK-ogoWM-?wlje1D7{?iq-^@=TGVcVWx8TY6m-H)($qIBFf3G2|wcp6a)Cmp}Ir-N=p;~h+JOc--H4^=LxhY#60zLt?9 z?hdHA+lnGylW1vHKU>_kUd0)5oH*2VD8I?R>d~)Y)!JgWnktlg%olZ8JD9Cl`1neJ zUYo8+J5QD4en`YMSO21b-kM#dniDTpep;T(_+t1Upk_ZC-zKix6gO+}s+EW>RBHF> zt#$<5Zk4Wv%`J8YJ!C&%f4Lk!%eHDoHpa{90SnPS&l>!GBngIk;?F_svyK0286CJt(iROO?!JTBH1MxPIllLJfr|QS z$8(sCr-c}9`J-CjxYe^~W5GxfD?KVJFQPFDpDxzC-DSO#K>AO}dJG8|9TW)^U&rUX%FBbAhYj_EdJos0Ni*&ZFPjrd<5 z+GUo!Erhr#5nK$`I~31ri!tVuWVEosEDUnQCYThWo*kF^ZFGljlzywA`4L0a1MOWn zKi)ys==}Hh!RWf;DP>t=L}Bg&L$I#8b}BKJ+wUEbHksA)w8X#vj+Yu2nqF-EbxIPE zUuih|jRzv-Z;+S|(RQ*`lQi(`r?J%(3V#3obHamcxTZL>)^|EKBBHuiJLOLUZgUmN zFMI^vN7lwv2XvT%Fg=duKM6q_qbYPy`j10)e=`g{4bOSlZDfCAIk(LeaNki^M{;pg zAZgHDQtkHQp1kZ-54f20j1z6IVvx97Y_LSs5SjYZIc$HvFmOKV&~j6v)VYq#z~++!bzD@Y6l3S}Nv4 z7r=|%mVnwSC@7dC4&h^gaY)(CkaI;{=plDED=t2#KdInroq_7GUWE1%Pzzy3JO@e% z0TOesCXifXGU zD_>XvUufY2e76N_tT{G~`DnfCU9G8Te}}FPqn+vYAu#&9E*;n8kQi%c(EvRu#L*0Yv&(L_jkP2ug`bUZKph7O z_CzkAM(|4i8*&XjdQ_k6XaE=ks|`6UX(c#^`aG!jz~N+qYg3#ShrNQ$jg8J z$I3GbE<--E?vOAvoD1d`(bfSPxu}v8It(1)t|?}B+MkSsNrb&ZD!nMjyf$}eT-wbg zc}+VdB_(r7z0cP2MlJETfOiU5Gl%()SfnMc)fmgNccjrM;272D9_ibk9tnzr*2NPf zn$ES3Ywcnj930xkiU0-Q%c`Vxk~w=`_y4!M^Cn!Q>&=05>rm&yOv8b|`xeuN$q0Xk zH)le?!{OQZJ>6e_nZX(lZRdFTvBmpjIU0Dw$tv`rRQmh~XFNEP%%Z}knNK@r>J|0R z=WH!LnSd0v2XT+RxmuP-eN3zSuTi68?2Pl5K<(%PSYrT(fyf0&)K$nG;4L6G9LrUx zjohz3TZs>1JR$`ky)D$iC>}%uYZgdrFm`8)X?Xs9yvq`>HUdDP-P^;BSR{@?MtY+jJK)W)LME9p33VjSjtt zBPBKy4u1Gc$UzHxe>{9~P<%00T5*hG+7AfQRZ)ktrADxj5NQ)d+Sy8Tonj2JcWwmF zm&LRz08MhnYYiL1)Kd7&SM&*7cQ~z^#>x=id`& zFJrGPRUj119hN(2y#&q^Luu+jD`M^S*-x5Aa%nCT9lWzH&?M8skUiQqkvrdzfU5l9IIBv@Oq2%VBx3cdLbR;Vdc% zJAfwu;xzNu>t<&(D1hQf^FSFvf(bzoBK~-Hso?a1f_Dvou4?@nOg!&r_5huaw>Yng zo9uB{nhzz=)ph+9cP%RM?T-CyJ+>7w@FnQsM$BV3A~G_RY*O+Pm#z*4+>^Wf#o?iY z2i0O`gd1Q$i~ddH?j#u|(`0RcsS9=tW?!?btQ?N?0_L~Q$D7y;BX8dfWfKGgz(|GL z_2wREl+f%TwUV;})tQ+Df|5^bLq_LV!WcS^lK zSvzFUb(}6nL-RjgY>qojaK9+pW<0Y2 zi0JuGuN^{bd!Pt1Yx6l{3y**@vd1sZmO?Lo_YuH@5xe!63O08BK0TbjtT*ccK1K(s z97kEi`Vkn+QfVBpY0$NPdl8R($s9SCp)51h-pUFjc433qLjr$iEd6H#T= z4YO6=(EuEj)$j zmcIyn&ZzP6%1U~g45fFZSn0#E#0@T$fbAA;pGkgE(Oi|T;HcTn7&O`&s4GIu%<|`h zK$rl0!_UtT_%BO6;b>a<&r`1ov)H<^w`P;;%`%*s8NXDIKck4r5^>6=0ecx1f7K6* zPUFy*=VoUDfl$eMbh{ZLP;9EwW5^w#M=e96Bw!dIYSBrX&*fPv0OFoEP}u~%64bQ| zA&@rj)~nLt7Z^-rC~&3%^R3sxMM8C~N(o~tNIk73MPgi28pytIvdU)7w`>(y?WZ7% z{-cMu%GSUQtvJEh&pg1RzW6Phls zmYFl2F?G3L7Fuo(w>XLPN^4@s6jNvu*}^zqvjyMcPZhZ@uwFbv=4y0Y62QIwCLN0W zyUYFuhX?Tn218&71A7SJzU&oM(&*RVCx0is)F~(81m~K5vI1Gwd1=Wu>oM|eROD{C zejJm{Xy1cu)sZ5FXvAhjt%bn&xsK>iS9btdB1%eLLT3`_B)S=9y)Nf3evO?p^Q1gy z?ybm8pqJv1B1Bdc0UR$N0DVE(hI-6J+->-PQ#v-$3x}7#Dw0`4w)6^*$rcMG$%uln zV^#P`Z!!&{1eS8c@xkc$+lqg7NGAj>iunx}0}JLNS$21rKYx8YNv{^W5KX`!?Xmk} zYW!&;-Hl=*dA0XiA% zz{%R6W&fu%Sm%A^^iSoJ5e=$pN!HApU(b8sN7a12P&|wcD?`If?~Hxd;I>H=4E)79 z-Z?tg1xe3T3arD{c|ABK-O7Hm^w^KU1Qw)-Gf}G20@)Y;HYmVpx(_L;!HJao%m8$r zYCPfJ?Z7n=x6{ekb7Dj7XUpSX*6UU4jl|Xa4kxo<^u-?3rMA(Ww)iG5Q04rz?8wEG z(b|x#(<(xSRPA7asmA{3iV9>>XiK9fu6~sp$wb=CwQn}#OY#|-FfE1KlVmUvDDYW&c(U!bK^H8*xi3MxLU{nLjam!I5ds->2;e%&7OJf~v z>~EBj zue}jiz-tFMeyvPBVr`Dlct5Tp>pBq+JenaE6TqT ze?!x`ULp1|cEx9W6#>}4va-^(K(F=<6=NCoWF|k$>#vSU8G{oOIieYy1_>`e_Wc8D z%a7qvL$nq@Rf6qU^Gn?3VvQS;p^= zJ5oGO#Pc(*1y-E-pYElB^eoWaEEMpU18;v(0Z2fb~IT? z{(dv&b#uC^t^$fAJOfgH!^g_+@7-P~kUnAulUagb>M5VqnKJbwFDDdjW-MBc{?~u> zU$y%-l)On`kbw~awR!b?Yd|-ocZ9;kH`Ibz2wO^A9FVr43&b>DXHWoK*E3Dn;iY`7 z(U-%Xa11(Yjn$Bz5yvQ8Dx)v1=S~4>tH!O-#J@^DD>FU5shzQmI=k6&qd7J3i$?2i z?42vq$uAF92Aa<4vZ4eskH3Z6&V?Q3t;RF?d2DwFe}D@DiFGx+H&6&93#*V+w7{DA za~^RcIbIjIzL`RHI=_EsGlwY^t;$;VyVXa zDCbq|!u$Fw7rGz7)CY%OJR)K-xMU6Ed;rg>n$AVlRYY%Z1Na&_`CC!uKVb`0kU7<= z$GNw?OC15CUOCiluAB0hl>nkEa%h#wozsc{xMT@{e#4_z1+h?37ViwYZR&GfWsMk_ zu?$`Ulk@Gr4`&!l>D;f&cc0BqPyHznO6AbU#%|mONkapR6=OD}Wr-pEubxNnS-5-@@6wU8W<6r>N+uE|v>DIjD7MJoJ zI-{E}BwUS58oJ1Pfq#XxT=||pJRc(sImHa(sHzj$eIchZPqNArm1=zO11 z&r}w>+LxcG?MPt6m`0xr8*jj%-kLYOd2n0rTqunpLT<6KccH z=gt>jzYe4v;?jRuPWRVWH;~;PFOiUuMdlsTUF|?=@x+GKpj?P+r4N4!esnnYNSaN6 z^D)v|;kN_;Z;*f5Zyz(OT2((WE)JCw)iw$Fhwtx=o=2!<#YlxlPCBL6(roj3usUZB zkO3lHpWA6_3q|qVe;Zr4N~17xMGS8(F9;Yxz^*DLN6n( z7Tpj#OXN9LInZ7yxcWW-1fLchnBp@;oBMiL8XHtm`ZDL<;G>~j=Hs*5VIr*;afRd~ zQB%{;T2sCP?=eoaY0pG}2opS+C!tai3opNW#+>vGP|t{GRXwj}D>Mx@&e|{WRdH>3`D_WmhzuT=mHAfLqaK@A|ZPpXg=WoULo_ z4U!C@mi3IF<555JAr%TTYWF?g?@N=9vf;~$RfP0HyBP?-2F^}ckEUYb;FKg3nJ?1f zIe765`K#Gi{$E7ZU|FJClH1e= z#NljRnV!|PyZ_@1LyLUUT?HGmz5Sjm7W~-qhaLD24C9u&;>s{se_V~|YDz`24)#$A z+K_S^k;2PeH+$i18ah9E*>yq;WBQ^A2=rtDWntH=OcDzi-2m-I^BdJ`{ssz59G;Gn zfLQ}jGqZf5A~yu-l;py-u^Cq3Ui#H~Oj0fO1*8zHQ}eN&7}PL$f{S~p*6m=*D=IPZ znOF*@H^()oSj32l9syhaz2&b?ALt^V!dZ_OpvtK%k3e8r4<{i>lTBMPSUf*j>sYBt z&+k{Fg-}sb+t05&BW*<;O@LGGQ63hml_F&e)IJc(7dVO;((|9Zj_Zp7zlM zNENR?`2nXz4Vb7V{s*ifu>Izs2k(w+fZUt_Z@Aj(wLO&R0{jD%)bo0q3F=L&YP~8U zJPtmP&?bEh#TjL8;C8&|xcDRz3i>m~Cbw`n;*!O*gQm-G9(&(!u^@dU9w!%owPti^ zOcF?%dd6u`o6D}v?5Sjs1YiK2g!j~4A+vj|&Bg8n&R7z!|G?J3hmvN|^*~+z!+wMI zZ;A4F5pYl4kigGYBm1=7Jfp}aY?SP5h0E?u;lbYb*xPo0B`_cw+ldjwU-$lRN&FPcCD#7+E@V~V${>Q zn1p6Dh0&QdgEp;veOun5{Qr*et&uKvLr+R@CQqXDy)8gCe3XcZ5GO4_OMIn!C=FX& znY__TMEb<%EdfVda@R*76L%2F9qL6&OpI)Gpz93)7~dN#!f+0!TdJ#hfNP9|=#U!_ z_qN^t6nEW_6<0_N@dv^>vH9uYc5eiZQLqE!SBt(%w@KU)cAL2{&c-c2XC5ux3;p!| z*YC|fPpzF{)CAk2s(`j)8nCca#j)&L{M@EMc)OegF(IBD-;o0t5vjGA?-45Ktp@-{^O_o5^VyWYbV{oc`5m#R84n zxK(e>QzNnV+jPt1zsI%D);KR;#t^ewMVn~>h8R;~A}EMbgj;zUFfS)jZa^rpX=In8 z_*v1JKeOz0T5Heh#{@UL=Ig7Uh_G4t>ePpS@S}!;jT18BGCqffL;f4gX9!ed$3y_B z%q7e-l~h!=k+8{O77pgBBsj`kwDHEIJIDBWB*@kd4dgatLf8h>1e`BFcI(kd2mS#- ziw*|lZz^1DZ25xDEtgR)Of8Kg%fZ#!330Jj$yi&=Ae^QT+Gsw-3$sT)f4sYF()wKl zV1dw1yWgdF7}|d29>Cc<0}O%4WzLKBa(lU#;E!^Bb7+Qhfy)aO1;J`#Wt<@cW*F7? z?}=CnpM}Fg-Q%z@xX=ra`fn)UiWgZHX3;NE45y73-BM({gnttlL`Jm(rc%K>J1=gG zONI^~Yb;+%B3?U({fF5diFL|fz-z}2?~mFJ$ShiI55^Z3Ka3Hml97>FtNvc~Stomhd?(tzcGJfA_BgD-dxtbRNxpm?`PjAT;&e?+rQsoPu|M z?*K&re(sGJsHzT!qF^9zg3d&omW50^0|9E{uSG2D!kc9HAz5r1)b}Q1qD-~c<5x3m zEIZCX1-4Rz00!^7EW}QRCh7CkvDLr7Pk>)~9ObOD{lF@Z2WF9Na!oPX`(MZ)W+Y2g z63gHIjo!A7pcb~D6Rwl&OlkBWyhfLg>JLlq4kKufptvEC+G( z!ixkM%xZ9{1Tev-Kt+f`T-s%hV=jL2uIA;Z`Xf*J_r|^yEd9awl2QEVG<9ZM7GKTJ zQz&h5B>QzDbt2)EWTg?^{LXiB5F0u!HVpu@?>-4Rd?s!i7E%^?{|_i9;qcPg+>HoL zccZT0C)qDVoZ0x;f?Pn=-NAfty1zQ0bPsyC@!A0SN(0E3tMw5D>?Y8nhCQtVR35e$ znP!QY0iR!fGRoXvE4t0^Cqk?l6)qD~)5DE406E@|96y`~oIy|cpQb>E4J?tV_kn;5c3k>QWTdDVp^dXS^O=H?~-}-*~&TR@+=*oITDu&Se~;*CNKznLLJ}U zQ&adIHw@KtjwhW{L~fRN9nDkcQORBGO`3jl|CN)o0oc{O(XduwZ?ov+BqUl-lsnggkNLf)mse2+Wt9hI~xr7Xwu;i#J+I(iW~7|ITX&8D0zWd zPN7OhOuR(_mg62*59?JkPcJg)FL4#$Ry&9MDtT zjSKiKHdN)0A2HjPn)NMa%;5V?gk#MEGcVqVTZpQhQ?e$VSLFMT29bi!ESk-rDOJCJ zyK)ra8Xp$`UK5uVG8GEnV0y~zgF<59{P<9g?6|l%Psi6NJ5Y43jm=W9TR)U9Uit*6 z2njea9^+Oap!P2w3e^DLT6;;SRP`J{j5e7q^A!gdvjXWL6W`6qI4Z$j#wNvO{5LT` z*5|--Aw{~L`^G)BVQ4t=7=+~Eh4{78a#9iA#*i4kpR#yD9?N!s^P>f~5%YGCcRBp1 zMpK=yHO~2t>SA<*wLL{dgqbu}Amp*}Jvj7>F^_2{mwSYH{2}E9fN)~;Gt*gja*Wyi zNkca$D{wQ{L~|ggo}cnji630WQt-kUy$X{}L;y^B17h z{QUf~%yeu_B+^pcFmb{kQd1;mm%9@(e>TEfHb6f@E?9X>tp?+$uA=KH@7!~+d!e2% z-ey30R|(|F(Qzq5oV|7vEji{x;h)hDz+c=cU3Zll?^!WnI(|(PMXwrdu5#z7TD9_y zW0Rv|U5n*)$VMPqn!O2h61%|Y=Kr)oCL6`~lqBeUigu2d({KreCulysQ`+jRxm|JT zDqARCZ;M&(cK@CyaVx_|u{+Gdg7)-#Lfq!% z%|QIls_u=T_CKyw6Z|YF$|61dLSGf-;jtg{P{Jl1jD3I7BU((5Ub_3)5SuXMnVT5r~5#~ zcfIV;fQ6Y?W6jl}e9%&{CE-t+zJ^sgtZOq^z0TpO*Pr+jy1OwTaBbdR7rgTg{-YfCAchoM(fzb&WGm%s3T`z8a=bK z3LqBtBpn3$4u|PbKugNplhIUsB%b2n$kT|31!7ksJ8`6lv{Gx@Wnx-iC8?)cJeK-g zH=bIU@)ohE7<9U=Bm~v(M-hJYS{Um$Kyo2<9l_lsn$9Ro-#oy^&Weit`_m=XansS3 zFFK!YR&XeI`uE*U)oPmo@E?0ksn@QwCkvjh(gmBm`R2~bMw?!AC#~6q=rw^@;0GMX zXPcAeXN$j%ml|nA91VBi8aX0V+ex5va0hJ(S^5sZ8A7KJ*Az4UAcOme;PKqWo29n} z2#nAa@UEU6;jMtiKkUKNF8oD}N>@7f_ZUPf8Mb zb6^~Q4xRJ7{!BtSHG+ebqB0k7u>-wh((SK(FxTc~`2)x~luV6f>Bh2&$_dJGzk`7? zp~4WfL;2O0g4yh+IU^$#V1PmoC=;h7A%m6C?#D_Y{@M~zQhsuwryj@}ou%w48ai!0 zXU?uE%*rE>9*RU$@~3(Rk5jd{1}_K{A@1149$|yl`D-*yog7nXz0JqPl~`EZRmbPY_0fW6 zJjE}~TnJH3l>PSmj6F&vK+c?VcSO(aQ{>0ijv-a4nRnJkNNe@*NVw0cSB5i#)`ux6 zA92|fwc0FaY6@X64VwzJtCsm6 z&sF8Un@PpR)j$FQI(S)ywng+t{=|xv^a~F$iJ>w6N?&{m)D8)a;_zRuuk0{|VwmO@n(X`Q!s->(hRAku1P>baJ{YFvA9b{<^6G>wTnFVWlI5+7D_F~3 zR?bP3j{^~@&Oh{r1#v}IgU|6IKM)Ft0Q2>Qh`b$$C0ixQ07yZ^Wg=IMM1l|n_rrPT z!|Ck#wwU|QGtRlU$Y_9|eqfN1u7y~SrJqcQu6w>~3HQ$yb;;*?C1A0@WCQro=~1C^ z)u6!_1=3QRApzpZ-xJ`OCE*wZY(0N=n25~vj;`lFy*|Pfjr)N(yz4^oT&F)b;roV? z4OTjrZB}&82%_DHG2o*f|2~{)CNYNMkLc+%T8-$mc{^oIBvifd%oKK*2mF9hNvWfI z@e~{BMe$^p75r+h#y~URklz%CoNHJMHktU!q%+WO+*e1v-6~emJ|bHxKxBlm3Y5t} zxze3&Iba7=;_;KicpA~cel&0lDW}0wY207}UCpyii8#Mv#){JDec#oyr|D(4l1up! z>2vDb2yzC$9in^^9Ht~9#>htq3IH8R#~#SDrMRM*cplrFDDkl)Q^#^eKb=F6||cHjfqNNfpzSKCW%?qv^q(} z7cuL!6XuZS)K^1Ne9M&Msre}Mlhu@_aT%m(3m!EcibYy^Lsq)p$xMiei!bxSX26x1 z$_cbkVE}TBk*2>mEI9Xsp#i2~zEy(oc&bQ2TyA;;B;o{EJ~!a)8~|p^_B+C2!Ou8^D_-#3vFEv+l_@hP_1<)B)fu=|}xrWvpXVa!@wSG-{RxxYh z&fFO(XtdP0$z?siHt~D3Bl4W616mtUrnk1Fm#+PP{W;%eRZlN{-L_jB_`m%~&UB$; z^}p(8{clg>^U86G0B0E40PsO8EKmF#Y?Ef0h3X=Qo%wzW$pt8w1TK6OX2@rVL$(h^ zJa1Z_y_QqX{9M2J*?NpmD+Y(st&S~Ez#7{{uI>W`?_lZxE{gacB$F5|*>7o_1{Q@| zc&Aetvf=Q$jvMOSUe(gE6we5j5fYe%B+2tLWZ}$Y!%xd@-vVw=o9t#&K)IBtUWYBN z#14oBRLW?;9-w8E!}8Pw>ILQGkNc*kv{FLT@Hxa`ScI@%x9oPtyv(Z|G~G+UETQVO zdL95z`q8if*&Tz@>ne9i;(6{I_hhLzK<}CBR{x?If}f3-6c?L?@>>oj87<1~x#akf zVEqZ9!&ySy3XUspXI*^cq`|7_&ili}Hj$saGfEI1CLxr!a|#MVS!u zTi+TvETyV95@%c7YM5{o|ALig|Kj&%U*?mR;4&kNN+Lb0@+iAzzGT0Wb{NV&;TRHG zvZ`Jw*{5_Dbi4@(SK^2sEwCxzuz$9=l{8CDTzm>IW+!1)i%78xA!Ws6tDdn7(4*gQ z1~5)2y6vnpXBigbdA4Q@LuiE^%EM#K%gF+nfAg3vM;#i(2UB744+&1x)N&_9&w*Iyl{Gdvd4{|?o` ze@XmEUktd~-~2QFy?@9KZsv}Bn07;jRX z+qnS@2UM<->wWIi_6Us5R+my`(az2`@FlDgZ0gJHRUu4XkA zUxNfX$Wl~=y|aT8az4Q9$MuT4ch>bv&Ep5N7n%I;p z+k7IW0W`3+BO!0(mhfwqRJyWy$0dR6lOcw8j`PCW+IR4;BP2}|1k?+=6FD+>J0#c^ zXKNiBIn}6<-(8H-W3k?^G})01D<6rBC9ckNz57>RUk@bD{v>Z8b8BfZG0vI21Mz@H zNr^N`XDx^^utldaqQA{yfybWoEQNSzU_Dj37SOPj&Y(8?s$Z|2)xehNJLiPOr5a-8 zI8_D@PchP^NtE0n;EE<6WKk&{La;Eq`(9_^<568#xq$AiP?S(!Ew~W*f|X9KhDXA&4!>48cr3O z14ohp=vEYa*{ORIKWkpAK)k$sIRhNWda?GZB=+ zrrj=%O5t$B6jrs=XT&kh2l_D-y!2N?Q|K^xQJZsIw@s4r?IGYBBr_{vKcFK$XiG}? zoaRagiG%d(&EyPqFy_raSVUN=qDTZ^Q=x+S!##F}i?|5cxV~8q;Zrr^=K>N`jFr@m z5?%w4{aX7su`?L*`rQE3JcADG#q=4m_6kToo9y_iq~8TdJ$-y%V-LxKOai+YC@_`F zwd@|G1Xau`2Qy_rIHNH&IWFnUT4irFZI}L%;CbfzZa3?#5Q_R6*N#kn9>_QQ9~=Z= z7ows!l>w>hg%e+WQnmUrc#PF_V`E~@MKJzraE+MH^btVxMHtLf==%5fVK|v(dnoa& z^9x|6Z*rEu=S$)6VuC4nO>hNv#PZW`iSo#iUC~H)6<~8fHCcbKAih_=SEl@n>o0qe6$9h)9+%3?|CvYPS*)! zsouQrXaG7UN-_tK^%@#IkkF@qv;np}`56W*okO345VpLB7mZ6rtdc7PZexCy=jskb zt+uxI?N5)y63_S3ZaaCdGqvpDa6)!#gW5M@q|QR?)%u*P$TmYzNtCE6-HKYHFB}aU z(R@<5kBQi6<~PSnz*l(H=KZMx?>-C2^jQ_-vv~FYpWp?4G$X;nXc&U7l7F?`U~aD` zEhNhPT`bq2IewRicG3;Kd`XzwkAjN&;pzUUjv^3oiW_msh|5Po2%WJ^Ro)Y&teN(rz zhV6cTb%2IL9tc>Ne2&T+z>5Fa6aN35&FB4a2|O_3+8A6f$6!7@`)6dEI3dVes>#fe zPkIUxual?mXSD|66vbBT@%m_7~sttq3X-5|$364G`8xk7LJ^^)8vRsFbowpEbYe z%1Ah17b9+wUb}~q+;93J+S~4>(t&#v0+GMz*Z~+dZeh?(&P^m;2amfsS=rthgl@5# z0>piDQ-a9Fe_q;kHS1SivY~n=ACuz%r1-&)d)<+3vG)iBQHa7VZ8vPNXk9x6J`@#v zl7Wc{=3ciqQFe7lq6eaoq8OSd?gb>mSAZxz4|Kx9{uYjT9?V2WMuwVU5rg)Z8o@?e zljwNVe}3$_bUmSOrtp3K7)Rm@gxRLr3pC2yeQYugy+#`iVl0~k2ATZkXZjMbbWQ`n zxomE3IxN&GWwEC#5X)gJAuEDGnz3P2qAqK3oPI^fA+f2+u`QNE3Dn6akZ)!^$d4OH zE{}}55z5+O9edyNI1TFyYe}cA`QHa^0Tn(y{ftLGHAXb`>=xbrzXbRf%SStPRuxd{ zQsHqK0G(auK&&Z@{U|dMRj1UY)cp67yv=nJnGJ*J&X|thc8W0yOSzc_pP@0D@aIb4 z|K}0sP$GlNk7}~r`*iNtJf@wvYTa%c*+M-Q7$1H{|5ojMyio7B-i&4l^P&^?oN`S4 z^|}h;vHOBi72JLfF1!agM#O%u5{M0jXnZ_R_rHKhnJJuf9WB%qP;H||`>DU?1I~b!q|471eq5zqToUeApGyIR^1ip7EssClC3!sL?j52Tu>py@ zZAJWQvrD$R1e9jiVgBQ*W@kF-y@{M5&eb-b1s$C(d334+RY5Am?M8sWws{^D^Om*w zoFybAAlmC8mgS=nEs^LIC z9oE!Y;BTs>KerJ422~_2z(UNS>pYi}>mg;9Vb_v}xbM8jzhvU~2$J72_n@Q=-$QhW z>(oM9n@apv-1|Q^1z+v;La)=W3e3&T*Mn~9-q|mNJfx{-@F285p^U}(o9{XEDx35w z|KD8_iT!VG#0C}wp6%5sdp<#!1Z1CSz+TzSrrn@!nwIOBLVQ|C_lB(jDOQsEPsoS| z9rc;0P}RU+MTT)N9=EgHlOTb`i&;$><3@Pm!=8#;Xvxrx#OHkr{M#eY2yO{A z^E*1eJv+OIZ=?P7wFr?&5Vb?u(12Dv){I3JRfC@8jb&T^fkjYxGQW)P{L+6c@iJ} z_UGnY7bs7lneh~&(XbiC$|fx6)&1HIsF(iQCB{h3FJsWhvs>Pp?H+A081~0H_3`P?Oq$MB7?VfbZ|z z?G=EF0U}NbG3oHnLg~k+m;7@v#w&US1w_P4sAt8c%eYt(OP<}d^RYV=rQ`7Mf13}S zSTbn=HPdyYj#)FecijOtJ|HAD^yFojQa0<_iv_5(jtkUU!(9kTnF!dPu;_ySuA!#vACZE zO_6qY#Zt;oy}Mpae2)ru_$zf8W8H5lC zvD~H8vfNPY>wl1C)6;aL=rA~*`TTY)wDEj#hBj+*aDVitutd?={C(7FC^vgDCsr@z zYI4Y~=Jxx~soapB#Txw`&OJUU!=F2YQ8xV}A1xV<+oFa5qhCMhREvu=6_aU|rKP3C z#Rtxo8}>=}C^>A^HdJhhik5+}6LolkUm#cx5;}eiYzq8f< z-+K@Y(ns?=1{FU)sF&2|vX7Y0oyXC+F9-(AdfQcvf-;FzG8b!YWvR7<0g?e9W1POz zsT7edFV~yRI=O&j?qm8Hf-W#pljmvKB3HdsDNv}vbW}8YK(2O$f)(uOcc|m|eQy6q z{mboY_!M`twEDQ1x?(5SwV%4ebSJ7KyRKKd?&a-JCTz;R+!`h<8Xb?mBVzmm9>K}u z%ym3elav6GOmooR`qv;s{b#(BJ^^K3q%i2jdx*P(jJTA9H zmeDMAndt?SKcimC7I2BnOioNJFD;S57X*dSk~;FnBpHe&BiIT%)8b$9Y4ruvvK#l) z{n~I_)YH`ez7H0SPw4?(;vt_eAA->Y4M{X5qd&76-+HLHy553evLyxc#713Ry;z>v zeBx?wfs1Prh^l}xj|j9ByY}QCU5*`rVO~5=$0N{dQm0mlXzggxz{bl{a#mO~yYFnNBz=#e%ifPnSU76Y8m8_-~jf}#kl4N5; zc%PY7QNLu=Cm6NXgezoqTr5UCzrYm2i?!F#`ek_k3aZ~^ZthzwDqI#}R&49{+PS$& z=$GofJsG}~IgaJAefa)h}QHk-^hfRGb1s3r2ipB@pQcj5f4e4v$li4+J=oVXMU*^YGCbd3e$v#rHnZ zs;a7f2Z=X=y#j_|y!=pZMuxJA3Z!)(d!Ni!N@^-DKH|%|$7UaY9!QwXuwmJ8W^RrO z$nz-;0|cG6?lery%*;%sr^N1}iwI(?1u@EH6L3zx?f& z(bUAlpIcav>>~kVuvv&hR9BaPyeP>}3%Cw87XUu1@j&>WO_kEeP}(Z4p_D&^lsQU? z85t>ANt`^i!5uqeh^zGbxHwlN{6Ql@G*-1m=;L>n&X-;0; zwXq% zKadcY%wJDWPLIz`YpDIg$1OyPpJv!T1)1*?+cvkLCO617Q|VwYqaYU-9UUDP^;=qz zfqoqB@c#ZG7ZG80Zf0R&1{vw={OW8-6cWFmq=vh^t&gRprL(h&mR5vxEr*g%0t;ge zt%JQi)j?H$(VB{YUe!zikrE>?OmY~Nm)FLs9QF308iW384RXFLVgruo-NS<`8Zuo) zSqCp)bj+AW3`usntLu%Drs~D{@tIcNXp-}Z5@X%_HWXJFD&LZPbR65%%^(d72>ME0 zljV(>gO?W(1TnDfxmd0D?{Qctz$zsrMR+7KGVG zHZV$tBqhDPp6TUO1kVfw*!X$)xJ#NmNI91{3-j8QC4d@m$eDb+oV3zsHfiU5D;w)} zE=vi68c8=lUC&ByR(KE~1@`s|#*Al;mTc994B~R$-vyj8h`-vh98B$}CKLQ+PvaKT z%LZpyd~#+vl?N*wmnhlR3moik186Jr5`f%by;i$elFJG&uSTl5LJZ!w!7EqY@;8y+ z+watQSvq?!VUne#uXC%bO_HVYtsF1GaG@`&$4Vullo;hDB^71fp9T|?Kg%6R>=>wc zwI@b8d+7MyAOi6nPptVI7+K?{g!XpK&5Rb7S8CrQK+*5jJP5Rfi~NVqZP0-2=i`!G zedkf?t>Kbfzvr@&98vV%Ep<)3{r!DvQXPAHX2(RvpenL}qVDc@zQ3I}M}={aeawYL z0Z9RL@dTK@k(e{0wrToabfOrb&YMX-nJK#D%uGbwn}-LuFCU{{!POz-bt>ytg}({RkfZg5QiScptS1|V&o*x}qqJ}}eh*W|X z+s^LovLDUD+#RqW zDM$)nBGQ9*%)WH3s46qDvfTNmu3pyGCSreKIyATD<7!J0IFUYbIT=gS)|SKu8fRhF zP*ESW(%s8gX%D4jzDTy<5Tv%*GBvU)qt_WqOc`v8nW(atQrt=(R5`e6y`r{1 za}`*dUnWlt?*!(kX(<0$oMjprWn^StwSk>ecXxJ9PX}FJqnTDz*jPLM5``R+48vk~ zng2@Q=;qRjrdCRsmcCsNKRt1Tnv1tzRntihAFiLK&(XCzEdL~>or&G0TyzGhpV4|W_ zRb?3q`-l<~F+D7!Pv$8`6c-QgcthqAyLWhDfs2wd_{;zV&ikaK!rEeP-9BBR*Gnkh z5XKzXYvYDxa29`^i3|^?Wn`3>mTrB2KE-ilBO}|2WT<|8y_r%~QJJBIn2tx!i{9Eh zZ`lNTh|KUT&&*ukuR45Kdk!E4A2a|465<=?Qj~3INC*x#cEDu3)OV1s9ZOtyx8T+u zo`KI5xccj8X$6vEOnp?2i;lnabaa7D`%cdP-ruAX^mX(}01ONaP63UUfaFz^I00A? z6(Q*3zS#Wyd|H(~Jecs;gTq61p3#qW?@_C&s>;sJ#?zg_+T6h5F0!<-DNNJVY5Kz_ z5VO_L(BR+P+3#G>O>JF~X;xlcEvepguUiGyRB+uBIwv3~bx+{rP)?1Dmgqh>IB>K{ zWohXsz|xxZZHs?cSy`EH##2_3l9HOB2UkNWwYRr71qB5>U6RxUexS8gJrWX|70A`2 znUpla?tFb_wnCgnnrr^|Zjl zMnWP{6nAM;;p*5uxCZiY-60cXoN=mmM9w zy6o)5Gc`3$O~aXzSF9`}BlmH$l6k|=IZ$kTe0+5^GhLG=41JTPfv?*+)vx}3 zZo8Gnchcv}JJ>>M8k$5eJCuC)o9kM+IEQs*rEJ*?=l4!|* zh>p>s8Ffg!B3{3zmBfmS-dk6rOqQONJ%YQ$u%Z;}} z0>}86hDQ_X>XL8eEi^r5Ry{R37B8}GE$vx1Y-oh2=1*ItG*XevV24XkJ4goy3(k0U z+J1Hk2-3Or3_|R?T(NAM`dZ}XN0im&`)SIh2r~+to%y&QF%mKfL{gVI)jB1ZcAh?S zvU3~g>YEwaMU{fGQPWbe3uyhUN@o%wG3gn<%H<;^elfApTh=PMH3J^DD~TCna&T~} zV)kbYKN=5>dSA2wzI;I^o#J%F#333vO^_nFy1R>sigIytqxSwr`x+lL#V2@2$ZbDR z!pFvT4K{g?)!p|iHl>w9Z?~$B_?FD%eJ>ZvJJ?&eG^8LQ_vz*ziJ?j#DHol+r~I z4;X?Grod5VprL^atg5VZlx0C?h)Z&FbNloS`v7dZXJ%)wQpmO!* z1|dFvf|*rdlCT`xAeaEZ^71}|X~j?mlo%2W4=k^!u&}TwLSg+y;c<0Wq6?FHGf7betl);Ce|D^(n9WlSiJQHXnjo8aUr5txMf9e`G>_y8_4d zZx)j7f-Q(m9~+xfg9IlBhrd}4-5F;>Ap}3vrb~Y@?zx^V)iuc-C`Kj8$jAtL&Rv5s z4MO&MMvg_I101cAvP_Fl^O^>IwrUqVOJKt8UOox;3y;8z7EZRZE}zyO{^ zm2G815u>OHvraA&Q&V@gzpH&G<{8C;KPAYbEGVe5MI9468jy~I1Olg6+DUFyl-1{F z=8!KRCPt*W!NG(AAO@N8SXtW=5#r#JlIA9-rza)`Em(Q$%z7EdFT6r>e_@oB)0|ox zr(&nHGqyGD%Kuf^L~OrLSm|R1Hqa@~uW#(+Qd6Zw=lVAkro{#9&Ak^>LZ;U>+$2cZ?PAak!)L>fv7cs^7zSGcYx60*p zDE@tZaS`g2x#!i{N4utVCvuq7pJ={XoB{z6QPeCf?jG#c5{NvpioW-waBl_Mnwz_? zyDg%i{dTV#otpX>&4^A^wndRhxtf3u^4SW6+dBkO(EGePA?r#oK#r1&ZjlIMLR{g^ zLzLr~BFZDGgvyvYD9p(kih+YBo<-WR=~r1*l>`E~G;$AcDKP;*j-fcqI%4XsEiAy^ zD5?HCHTWkw`bj8Zx*ttQ-T`}NdiwHi(I81dUg`MbtV3H z=!o_$iW;N){E|+H(bNv~V=5y9e@Ph4NnByfydl^B{ri)>6dQ^-x%phq<5n;PPH5II zz>cm7vbBfD10dJuV<>1sXVRv(VyUELsW;0Tfu7dj;5tq!ks>67n)(^}6pCbj-}mN;CfykO}oqPEHm$ z8(jP-h6E{brj5|i(?`BeMvoC_oNsgyo`>!1>@-zjMu^kWK8E2xZ2Ajn^OcstSV%Zx zqM)r2g9`Z5TzD@aFBluj&;N!cp&;_K_3pw+4s0*Y==z&_3e(~aQy=26(J9$YBquEC)^M?Z z4*YlT-uWccNroh%s7N4D9A;zb+f=+QU8qVhN6&*MdG_ojQ6@O z#;nF5`u(?P6T^>_BSIx*bs1ndjT!^CoN=N`in{xQYZJ@Y!QXs8`^q|OtYmV_i@A1v z52W<$GAte`YJ8B8kmTg#oC0cG-P||@S|CYzeauH`$>=ymajHvwlw-^-ELxhIt8oGP zVV#|wx3{jJFgg=t(Q&ZoXCEIQlarILubtH{9)CfRY~vejMMfgFYlPryX=$;tvVM|$ zBj&f>#hyZM(XMX^zYSWPFy&yWz#Rq z=k;Urw{jfP6hOjJUohNuqtot?|LZQP$HsTSBMg=Fy_O`s za8^+fl^R?a8fiBerZLVr7j<30p!|2a!NSrK9;m771jBmJ2S*D1zGXv7OpGGk2F6^B z?P7(jv-9&~QnmdADq33jgs{-i#Ff-7s^d@{j36bUL<5fmK2wx?^i~?4C$O9Qh1vQG zp*bN}5iCcBwIwA0=7MlAHYs(2RS=8#{5MO_>vk9^=8aO+8(5HNU9e#a+K-E~KAja6 zthKouHruT_8lX>se`J)J;L90%CIgtnoQNkpVXh_cyTSFr^*l}%e?OWqhA&9mq3dn| z%pI731m)?{R(@Nl=nc;8raE!KzC$?G<8i(N{hi6_x|a>K*2N1{ z0n*z~N@-_WYwtTc`z8FvBM323K+zDhQ;-*}zn*!VSyzdub;behAxZohJ>C-Z6u>&$ zTv<6dB^91nQzJQbASB3jcNLOk$}iN>Q{UjGShW|E;G%Rku#t-zzQP)l3)VaTiRt8P zA>^1isN%+NyEwa^5uZ>sx!t?G9ZyV9AxTqQUS7Vk0t$L%q-(;CqnA@x75iDx>3Ckh z;yo=AQ-zK1)L!xcdVcnThI}W;A3sB-R1^2SyjCjQ#e#hq=j5SpYs+}VG~eH6C@aso zbOmMSPyvZx0BBNPL5CTowAergZ(>ylR^!{@vW||Ir^DQjW`{ptK79=eR~9LZgcxND z`LFc$6!v1|kj+>j?|7kzX)W`)KB&HA;K^COmXRJyj z6cC6QxrppXB4Xi)89x_;D0!@mjT6ZLYQm;W1mfOP0uO6$i+Z%UzP@kgt1X3ski36* z5NwMwTUQKSdQmgGw|KzC2pby+27HAr3vdR5>fu2OHo>4i2>m()GLV&n5R=?ZOiXM*#z00+PK?Tyi}2?y z7>n)K+nWjtgPBq4iNDFpBHEu?1Fx?-Iy!N+B-CLem^bbL>S(r9m)WkE7)S+6Gt$x4EO2vBRJZf;!Z9)}Tc7aQ zJCs*iTh4JMR#ow`uap?d+en4QbafHzCxsVQyN}P}Oi?P*3S!|%fntdSIfS@gzd3FaCn`uvbW(in$RnA|4_7`c~$C)yg%nHF4I@BuV&aP2KfA zGB)wYdMUUqub2(a{887U@zuNE>ea?_Tjup*2r))MzLhPSc}|V>J;0q~28?9ZKfQO^ zG1Xr^G4M7uGoq~Hh5sZsO6a{Al`*f8k&J#9zVhVf_+7d>>Jj2g$t0kK6$=@ypwN6)4lbK4KD zyvj;s7#PHy+*|+;f;QEFwz@hD;zpebTxsMM)guN>ctEWY3J6+qo4K)tB_;$)ZNsr2 z#Wc!di|Pwvr+hP2Lv5{aIUtWMj;N}tT5|0^6Qov>0uYG%olQ)38LC?$%XTHP z=9pMm(p2=eySuw-t@#0XH@|=5$y~^gX4YhhGPu_U~`eQ1=fGONxqBL}n3@u3K*!8ddfE1R*sv)nx~N zU6o}7{VGtic6v`OE^ZGUIyf^s9w9r%FvHGZDp09 z);Y%@&_f%*O~t|L1i|rp^7oW>apH~-vqx3n?DA8^5AAp}(xdgY71)Xy!*7z>HgZ^W zPe?p6MND?YT3S{Nu`w0{;eYY{9^wR`* zOCa>0v6-2f0w>I52tXs(`r6vZPMZ{|FLwSGsXTcPHd-_U6ooR_3y{iw;zcLQ`(_lC zba7$tI19%7XsGX?SFo&s0Vy^c$5?o#x2vY-J(E%K&{uJx#VvYK( zUFb*aD|(r+e{XboBXmFj`l30EvCN^H1_uVvK}8sf8xf(Z0s>tqgj~>YaJj>rK7#0< z(GZTg-k5kIUL>YIN5;ku?FM#0@w9;z{}MZ)W9#s6*t|hxdG7&H(*FllvY&)-op}9Z zZ4a#p#Gz}|#8b65<0QNPbuP!eGY}D0p z`eX>87QqhxhtkKEV^zyWWUWq%eb>W=_rBBh$3e|w2V2{ZK_LI07kjR6Zv3B*OD3|o zgWEJJ1+ufVm5ai$GD7fg5n*X_!K#(i4Rpp^TVD?ZSy@@pZsTMNyX+xeuwCF;Y8zSL zQ-vKoFtx0SdZGCv0mo|2GPAOxETHfqEDhY|)w$Okp~k}2AlFcdcK?{^8%g#^Ao&>m zqt7HFH6IK6-#!JnYR2`-un{E;$vB3kq~HV`g^~Il9UpIBdD_|8fnn>6fCr)4%HAH9 zKIpi;qoYsNq5FwOYtqc!9hc{$pCoa9TOUlgtM(leYimTwf$4$D;K-kF20^DmSm=8l z|E#ZP>qVu22nv)65Jl{f`6c>=MJaX&Hzg{K>k})toiTx{NIMobJA8(Qc@B>5EA>wWRnYqo;Z z5wk2_J;GA+Taaa7%m`$kjIXcn%tP3(wx@$E1J7-kFv1!}0C$^?x)}|>UwDlVN z3fSJ>78d;m99sUB2*x0=KH-!g0`v3p9TS;$WwHx?eBAu-IwSY_&o8V3u$aZt^n5}_ zL4kpR;pFD7Vb!?A+ork%RkB9$F$?e^;^8+oG?;*cF8cG^{s5lLE*9pmU!tehEU#E= z1LKf_bIJ)8BYVc*w~W`4mmXVWjesOVe zaGAQqF_ly0vYp~OU$TXaazyid>1SM@9 zee6VlQBow*k>V7CZj0(0GOMolc~fuy$L`fiBLV~h5EHO>n&r?9(IN2f^@cX=H*?3? z=D&CDUhA*GNiYj6+t$0IFGosA2#pZ{qf=#%1ZKvE#?bR1#GYvwmt)AN`{)Ia` zsLQJ_FE8)igPfe~r!MqMV=G>{^5)H48p~Q%c%T$UBpgSsWPF4aSy3j&YvaV3%Bm_R zx~C`5XZ*9TY5UKxgnWEpaOPQFUN%+EM?c%j$8mFXO~(H`6^>CDrETDQml7HZ8xBhg zVan%uNp`+>a`JrMvf13+{0m`88q{l?>wAyC1X1-2{>_l~D%O04>gwuWAVD9m$sHX2 zlKMSvgY`sYFRvL~(L-##$yvTYN^gtE!aq)nq2&)z+@Nni8OdsCX|1oX_cFKcxDLk> zgJqTsiKyh~&%nXxm>8$%$G&FcIvy@A+>v1TZGSL07>?pZz)~UAyLfm2qL!ecp?l}{ zv+X%vlGD;0R+~{IDa@(h45?OIt|7j$K$r!Orp z*L`DTQ)_B$Om_b`=%)(-Zg9A?V?+aLRRC8qb?=||VC*Ooi+uK+2gEer>%#0FPy8NYO6=HmQe^pktF3tW~xGhw1U=4s0E#jJ!M#k0HSac(LpMa3?A(Ibf!h3TyxS23UBis=v-u9ll!mFDz_Um1^7HJ zpnKoZo)N$EZ#+KokidpyO@{w*n4^e`8z%YNs&t8z>YqGvf2!5{yPiL9+{(zv&(H5k zpQ_?39V3kUJ>du=@(XveFe6hP%&p_TPtT4uVkiYhxRJB6u{=-Ak?iHVal zOG*#_)ZYxWw6t_|=^&z-(rUr86NJdGrZx#F88lliQbPbFM8w~+NSbkl*Iy$dfdB6rL*&=^!vosx~gL3*<3%z`&# z!7IhVpFf4L}AK>z1{`GxwYplD5t^MOwh%d z&EKY9pO(I&n(x?uY`wpKVuI;QZ%;wxH^%l$MWe!9ET@Q3{S86S$FcxG2k&b5?AfcR zxqWv_TwF^_OHGZUz5CGXS|dm`5TwfMRBmgFB1lZ++zreX)H6^YN8jI6beS{MjOAtE zqJb_Ud50)xOwFmTUe;$%p{CQ(x;Q}*)KbS)zu3Kyq1)t1d8V=%K-x_9_fle2kgg>OvCd*ohN)r3=Kaqy)mA>YVW zEnTg1;glv`+P#AI<>~t$&6BLml=-hRbrwHf2j@i*eyaSqz7r5Ju(B)`9R%TL?H73Z z`o>b84wSWb8^uLBEBh6zQ7i}c5s zmzUFND|~uQM&+QP`>t##$MP{(~}6*6wc3c z4tM&Lg;_pKPxlh=eC_DHLqrZq>aOPC;@)#J1DH18d`NPwzkNY&J}+ps#v$yzfNXFzo&^3 zT3MPlw*72suCDH?vh%S`o=QXM*tv%3@9(GV7t_7qw|bSIn%o{c8*db+I6(NplLG>! zXXe|-3g~Ac-?yQ|5Q&d*fWMyYV49ZW8H@mwY>>p}sYQ`d?IpZBn6*Gh$MqIHj zOA7h=QvakTwqsIF+BHrH|Gj&-hexZ-qou0HD)94>FIbu}1C%LR(c0QtT3p;-(_-Og zpV}GsQ@!a0^&6$ByX;)Ft$+~%CIJDym8ETYRh6BM9XyFr(1 z@m-+{F)KSQg9@jHbIIG#(h@D}+;z#lwnv8%cZ!KIRD1~X(+a^DT&UEy72Z_b;%s6j z$CIPubsMXys=bV_1x_~pfcx2%2fD1ipvh$jGUPLX~Zmo)RU-7@)LKUGnqG z)Ef_OMq=NeIe64tb4k=M|K~v8XCf74)E8%pUm9-jT-j!KzDFU!xK;7Y&nYpD{0`v0 zEHwDWSp5UU+uZs^XK^8T7wX`p5^ZcD*xAWx50N?t(CPGNVp(}}3Hy9$Xz2MlwK-VL zfE+_gk7@efz`ze%5{;>&#!9gP;mx(3PdW-Qp0&+ui>u3t8sF$P2M-R6nH;{X=*QS) zvGADi-Ajl%lJk$v-YQ~x*{z%rQIE? z#lz7tE>cBBh2NK&oy9;sTNRWvH^-S*Pyk9sm&?qQ7Nlbm(~@ZGD6DJqMh8Y9upWYD z=t}M-LktjtD2Wh_zQ>cpTLS{o;SCKcdhCfvyIeplfS?(fH6{vHct9&<)O z2PNn9U@J<9MUl@ZM8-vD66g@O!RVBi9$D5!Mb-N&JCUE{C)6E1iu;ODGARJ1FU#IH zChvX_kPt^jD6)~|2c?ScFLG5>G#D2IVLP&MQz|oJzRGVG?fHP_7S#y}w6z^9yo|2$ z`i%ti6#9N~+)%Oq|0rlbA;t&1n$>Nd-5$@{qDn2GaxB=`mot>wByg@a&dWtQ7tN7a zLnK^51KN-pP|mwt`IOWpmS_7j0Et8b+hTF`Y90k9wA3^lk9(AF-&QGdx{5=coa*4tiKq9tIJs=?E5}Ee z*x0xd$gApyVtfLp$HU84w^Vva83hkgt=VrRr_J)SF~~Pq6u;{ zNl2k6<%R$>1X(%)vAM#k4UM!OcClF*xr#uA;}dOdP1A&7Az~7QbUT~U@e14Nt=jqq z70W3tm=H#kiRy#Q*K+mjJ<1xJ^R=o1*O>>}IKC4+KCeEUNrOjh4Q# zp(!>d;+pTcrV$mCEV45qtzw;-7FUy#1M%j>bKv(40)Y1vG@HP>CDv&(9M=w@8dzQC zqpb-_+IO1>rSZN}A*uZm1$KVX(O}OP6BQ*VA5M*gUS-g~s~TqZsp8Ccja`UEr#`l9 zVtQntaaT5HIun=hwM&FMAGcx>grfqQ&V$xcE(6oL3VmryDVEeu;=J( z@0H{IOXxG8IaP92H3_ng=L?l<%7%=UuT;&k9}-uV8}A6=5Il5H>SRu0Vq)dq1Z)){<2SfbEBY-;)_`)SVD5qEb;;*INwt#^ZjP!Q}Y(2w#5H z>g+5#H@6g!iIMUBuEt*hY&lOF=@}Suy-vUde|qz`C)k}%WO1`>8mQ<)K|u+=|7fuE@bI8(iaJ`T(kUtV z$F`e>x~f8ewbg$4xR&Tamp2rqP;nvhf`p`jT<%J3j8{E`;%aNe(o?OnEF&W|HMPCHJu;Hs zvA#m085sMj!Y}*N4BCYX8-RJY^tl1T8;3t?jUhQBo=>peVLb3h3Eco=X+)7wp}nvYMEv8<}cPS_5xW zia?^D{m1^&vX9>x4~^z(4v)rr;sdR1%7=%dGIqb#j483=$Xb?sw&ATafO3| zgMDqbOcniw62B5uSa$7fZQrlr{ArbH zgLwJ)zyaH@*Wv!Af=&}P%fq_xbDOWPucoe3 zNJ0We^=@Bp;Wc2{&rE==MS%9yh<}^>faQ&&Z}&G9ZqyX2yE>&yGA{1-usAPb)1oTxty~5~kf*`N_$}g$pqX6?A9e|iU(vA6eh-IRAMN`3f8dsPpp=o)DAl)!LBf>Y{^7GJPb8`PueyIw+&$XJH42mX3i#O$L6{#KQcai@%BI+n=+O3xIFPKdXzA zvy!yumrfi9wER+kc4fPjAy1U%st{*8QS);+o~P*Xg_Wpjs2BlH2u{u1sxZsR_+awA z!iLbkjhZ{Evh$i1vPB}M4Yf>-PZHnVX)aEGda|~(-09g;-B6taIh8h-NlXne@{h>% zTHI%ToC7H|o1jmybaKM5Qw}+`%q*Dinq2TxQkpJS$SNo((75^ZMI19+i58n#(bC=? zbwH{{3vsGp{GGrJ=Fmyi~=GKr9hvGM!Uls_yqbUfAA*jRf<$G#Xurn!Yh+Nu~H zQl;MNC-Eq0!_Ll@f&z*!yQeih-D^UQFFD>9PEJkxY%EE<}c57)n07#J9S3whSU z$x!~n8Ah0mo30^|h<>c7s90TH#h5oB090jz%4AgFp1n-fc)kv!z#}6gA|9QbSQ3Bc zTjk4uDT&C?;w*>p^!r<+EhW_e2_(6zrPM^U$>hnjl&wp`Dm2r}(Y4pH@bLA0GxU%9 zMy1OQq(^1?On{FN6%LPpQsq!OIyowUMPk*i*u0vZlS6aC6q7W;S?_KuE&d}h60x$h zntt~N_h!t-^%f;{yC^u>8YWY7HAWo0Eaw4Kh{N-I#hx&CzREc)@a zM2#$=+{*FQM{#;&6enD?U`IZh<2Z#|WA66s%!nJ!jtS_f)O)*^-l;0*kxMT}O-+}2 zyO@VhnwwZ$SunT$XJ%$y@$2Bo*PmDb%;qK!!=9fp{e8ajDYp-)!i?b5l~a^EKS^Hy z@KVXi$zzdhW#ZB&$v;eK!9`V0c7kU}#$AI~3*N@wh@88JECbWu$zNf+y zq=>qnuc)!HsHmv9xul1trnx(+?r%Ay%UIWk``y+eT8F2W%waq=jYTp;{+~rf0|&)k z80t)jKMGD(yrAV}WU9-UvvRUoXz4>qsZ{heR;HJdQ*&}MGgto5^pC>ikO8>Sa#U55 zMhXVR3b7(&WUdepz`-)|$8fXlnY*WvNKhw}U_t*L(V%%Rg@Y{0dOkO^q*PRg4!bfj zoO&kqVx#rZ)0)}BN6V^CJXRjeg)t$fp`if+fgg7!EFJE~3BmgRN&bO&@iAKZylHX6a~B0SYJQW&#z0F)=VSI18LB9$ zWzn|lVzu7KMKUIF0--}s;O|}R?lypQd3kxeA9s+%L*Ox>zloql5r6(He5q;Ri{p5; z;r$l|7WV%3*3!ntz+>HQD^pSEjf0MEbYeomZ;SR4Wx?w^lbv1k)Vq#D*Bvi4k+`Jf z4#ju?>zCs{QltVtkC%^+t>xwAV97uTqC($hNdCB{#}u>&PX^V^<8@0Lj<#sT^zQEF zR`o4l1RGfr`3uQLeZ6Vb!|SV$>CG5JP3L~9j=X}xehZ}t{c4Lt&q;X&iRV^em-j=# zIub~ni;0QpW6dRD-cSJgF@J zN=hg^<+ED^Si0o3ms9ZdjJyW?%*fF4QmG8@@e~0SNeK0LcPs}LS@a&+W;bvf|TWEc%75UG`x60~P~A6g1(Z|k zv|?G#M)woKj3tsUB!qf4y}}loWVT3`H<`Iv#r|RWs8mq>{jw)SNG@238d46qfArZ2 z8-=(`R&625Cx4%PTZ-EWWs56&f%h{4~Hp&!g5?{C346FZw#nNV!FdzSS5h z3D>b`H6Mweprk-%ehl@2dGp;B^3dK!m?NLidDb?I%p9rl*hW-|kJ{ z-u}6XASESblo%QcyGz2 z2wwcrEI8HXH4Vs>mkv%(8Gb%9KrE68{(vMCx*nnYvO5aM)$NusGcww4wp&$_W$C)b zG(5zW-QM0F9UX0rbxo+r^?%p$b0>F1D8>X_BJDr}Dg27M&3@y4p{d?<>_B7uS{*&WZfMP<)Q0+mNiAqD#}62GpF)yBq#KQN2i0akiPW=T4t_hUTTr=0MA zVC5BA4iZjC5b(aI*zP;E716b2&0_(aVn_#EEKm$;2=lQ1o zA5Ui)6jv9lYuw%4VMriA&_RO+2Essahv2Tk-7UDo0Kpvs!6CT2ySqDtpm+GrId}b} zsG(|hcfZfe?$zxQF$r|vDu$=@HMg#*kH$(RsG>47{kov4rUe5CNbnG_tm8330Q`9e z`GI;359Y0_uPH8xw6wH5tK_}n9UpO02>x7L=7jSh%L{7VB+DuaG~+W^op#ZL6z;oB zb%YL&DYH|5eon)DgiUI0_84FZ%}d7dL>d)#rKYawVi+kdXVu$4$B2qrwC3UA&3KP# zkf!A(Lld*LSXk*JJ~6EB@}azZer`^TDl>+ny0*q2w6v7Y*!%A$D~Y8vzdra!;&frY z1S+!b2OjZiV9PHRG0fUya3Jyua!oZ;6t?l=ta&d8y zA+V9F5x``I0h{B{(f(^nKmZ)_hadnPzRG^cg+l|&%F=-W3Rws_sTmpDKmh?VCfF@| zAs!w?$lKi)|7P!jI6o1JNyEhK@lv->Pd^k8UAse7@2u_dY;NwFNUO(L z5u1({y$J^fnZ;jeGch?igho1sN>`7dXK>odBF({=;vk}UfQ|zd6_puNlo{;^S|ox< z{S1}hm|bwF8&z}mQ#KeP8h(n-%>bV38`+^sJAjTuUc`XHiIpwd&Myn}~L6ESTDl%cx2gGB7|N`-QC@*tKHMn^t2)&7|DST(tW})AKvi^3bQo8 zAQuELio;gfxncC1iG$^Tu$!pSBp2qJY#4r9Yf?4rF$77;|Jk3+t0@*10%r;=F4xUy z3W@xN87~TaLPj?JP45o(&E*?vrAqQngp_!jVxqo^N206%FOy{F-r~RBg&+nfEjuV* zL?@=~Oy`}yFSYvP?S;!h|3Q-#Pm+;gz{|q}0diGVQi+8nBF|qS(;HCIB-Nhq0=&Ju zvbIYR1}i%`6?J!+AbGmcDC$@v{NWLO9YF9xLVSqAz-BAD%B_)Acpu}I^5;*qx@w}1 zJt?GcY|V(p!dUcf?U#zCJ!8tEu{! zfJvPn5fO0bKZVbCcMFP&LVx)&iDKTPyQ!+HOB<0by~?DFWa?mp>l+&2$vc_e#zx!P zzFo@T2nG6&oi%P_Awo_L4`Bs_FFN3_&^Np;I+39WrS9y^(>eG-yM6-PQ6`_kOZ)yG zMO|%e>t!GL+u8=NPplYg&CXUvMn-CCL<8nh5QOJW5EVd7lp_l=Ha-py_yjG&gM*+{ zew4%Ga`vp81q8V*PQI-dq>#y2c z0!EmCJPFuKzsh?#dpv@0&l{*X(iROnL6hmH{9j`D(GJ%Q54MyRFa)8x?ct~l0dTpX zq*LK}`|S|M?pPkJR&N!6;^PEI{JYEfD7tWityZ1Y4$? z9|Nb?kpSUAba60>40tcNae0211QonZ_v&)2aWrbAQhMeC5Npw;BbJ)V4Sm*-x_Et{ zth{6}9?Jc9@l$V!`%=k@{Gj`=+aEXhidKV_3&Zc6@FM2UU`+mhqoCZz4wTO9JjCfV zVm261aE0IyM7urF8AVAUSd;=i+k-^h=olCbz>@OvFa7mM;M`k8NspI*`{ym^ZRB>X zxN-OpNMVUSd(~3z`d}xVOFaRvX54cI=MNP+A_U;=Rs( zecHcUwhO&P0KDy<6budxrPseHSIV86Qef|{6q(7JuJ*HXO=KU zg=()K?-ks*_83}`jQBS*%z%U|3xB?^t*k`o)oH1ztye=VG}4J{A(-U$nH$EMnxqkw zO?tMpoghbFe`|hz{<2Mmp;)~|!qIzTeJ|X(7XgUmH08X70Yeka>6+8H@Bm^bXeZG{ zsxWz*Axu8m-*km!ygm^;t@HVx}ZVe-dwkRzvEesa(zNv}d zfYNPfem;eJ>gxJ>cON`O9{g+3+5pb)tL*5^^xPa0iXW*z7mcJM25MVlW24==$OI!t zR3C^VSO^?Y>L();e0B;~LQ88ve4+^e-`(BOJ>FyyBXGn$?`Qi`K^&pZ;n0o;BFPX& ztsyWsN=QwuV2`H*O8x5NQw#@Q^Ej^XbG-^eKt|3>G@!Ee&&r~Lpm0G| zZHtH=&mF=L{MlYfN(vE}mY(j>jmZadG)Rx^>E-1m8o)|)OuWf(72NWJp(6)c>GJaO zj6W>)Q+cxT@uhTv{;LYwvNQxx1e5JKUe?5@K%}x$Dn#`cb-)MV)*Tbo=_i@10-F3m z@v1#51aEUiMu6et8&H3U!2nC?=HUVN-=w9bp@9KWbczax+8yYhfHgOt?aqjdL|=Lh z4-YpU)AjIZ?iy2r2H0BzHZ*F^PfxusHpFUA<0jrl=V@qYC@R`7nxu5b(@RG$EH3(| z+O|Kt)F?A_>_d%WpH%F?+8EF z0LBjnwC3|@qk+Ce2Mk|Mh9q51Xi=*;)y$ko{2j}kiK3z&Tl97{l zFGINl7vPBeIWV|ChT7G|1?m2+_|Xjg`o+P3$sk?K-gXbS#>&dtVWl8^I|DWKPoHV4 ztE&f4=u}e0KnYAkP^=+RK)Jvynw_0BkXWIic)gicfRYo9WMVuVxU{r%OB3#a))iai zo<_E&tSpj4aLEC@qM6;EFmylry>xo0GR`JhfbM; zYLFHW>aS`($T&EBOvN>2XLl0CjG$yXU1`F%@Hg=rxtgX$1OIOIo_ZS_S63IcYSc1 z;Vdsboy`3C@w`1nfq*6?^}P9*&F^kE5eGFj1>?D*ynLnF2>B|^&43*E7pkIw)pBS; zz5PSQx+5^C9~FFo6b*keKR@4ow`BEezkb# zpDzg>9UXOuxfsB`qo8_o`k_4B+>JVHj{b(7y4}t&Omqywt#4)bJ8lF32T8Jz-R6DI zGa?H{%=k!?=kT46yaLc$Y`nr-;t@;3!pfq4Hswh#*^Dr`*nyjM^zWTBug-*%p_+e4 za&%jki-!3DE-@b=p^38c^WL5ZFiQT521Tv1+Sf~aXDkdX{$rJ*4FUp+=A9XpP>{a5%CXO5Q$b(D>GfVpSj;nMPQS!pS>j7*F$VS2)l z{fg7$M_$80`2IQh0Jhz4X~$J7KbT~IVq|SiuXbk>8My~wNJT+$a&Ta7WhG&KV*u_! z-4TOaD2QU;(cm$_(pzvz(&38F&dtI3Z<2Q6lFRtRuv>S3ta(Qi`AsNOAJ5&{*;!s5 zbE@DUF@G*n$Cs?KZ|*`QRUAEuC^@m{J$`Nif`W&tdU5m!Ukxn(8HR#n0th%+6VFW~ z+RW*3X}6?zpdT>6^UfGCt`-O2xVo?qCLX&!56}1`0I|gXAdcuGNfsyqMgWp4BX-PP zoV#KGZ-XbksRC>CHI)NzH#|R%&X#2)FET9go17eadDPsEz{$pr(MSlBTPD?t-CO zgHw=?PwH@sRHJtry>SIm$atlFn{mg%O!9F+2KMFha{&?I*|1c2`WOWPsv* zNLUJD;(*#5VFk%18Tf~fzP$YS&E4&`;Nt2k4-e0~jbV}V#?gC>EtR|21a^{`m~qN1 z)f&BzN7j%bs`|9Wxx2gGV2f6i#xC8|{-nDxuvb!n%BSsxdr2oNPgN5WU+U5&(wc~x zpofuMPN^Vzqir5%XW>jrr{B}Y76+S?9~H7;{9?}?QgS+9cICjA_fMDMB_VyLDxg(e zO63H6lrXcxir@WfiFE1fdd33GZ8GuKfa9Ca`VWd zPZ5_4QMUC1n6#JQ8uUFqniXNLj;ZLWygL4QtywZIE`IXr*rNfCO&Qwxs&6C8>80g; zt6r~dE2Ll_c!J~mNKcHDnw><4i|#aRscEhDMRK5P1w(`<4Uv(Rh(-9FEW^%zG7B)N z>)nU1d))K@0y`HU|M!uER9o!>nPyo||8v7BY%*J|VAh%Gab$3O!^w%u_rvz&$|*TT zX-Nqw)q(D7GO1S%^ZR$gtP3&Yna;QThdai9kBKyQBMbVy!Bir(udY4z?7qH?N!dMH z>rTo^Y3{a~QYO}3;u>xmpFL!4Z0a-^G!#1OE6-X3y28Q+ri&EJO!A@rYYLGE$eFCK zk(da9#K-ICs($42#PZ+GEFBXV9dm-EBpjZZni|m8G0^MQFFFcA!qoL{mW%BE8WV%H z%QiAs`}c^Hq@<)o@-qTn_Qy2D3;U7LZJR_^9Byw_2T?m-$5}w5!b8_)~JTWgxk?r9U3Qw-DuZ*sbs^gJXj%++zwpvkC z4w;Y5%acI<_FHqS_u7XlObz~EmffkEn%dZl{fE#H%2i=8 zRmW8qPpu5AYqW7LRv`vOh8@*eo+162xheC~vRK(pMJp{Anc9#~9!OhVt?i=l@;Gdge#O;;gTin3fCduCC`UdgOe0pRT|2 zFIckUwC$FE^baXUeoD3k(kJI{?SCoAr&Ozht(xl8~Y_#utV$wwM;bN5$WZSh%f zi$R|mHR^||sw&S%-tVq|CnjfA)s6N|3-n@twjhPbk7C=;%tlkV08b8j)Reh+=c>xe z600|JFMj>bNGDtFe3^h{A?IA~ZJ+c9YXj_S>Att{Gat0m7H3=Dn>7x5L+Eq>Ytl1k}S z3Z{M}DZ037{gr_y;Vk$&M~A9#Y<1p?Ut~CN?IdI3)Qw6_^0QWq5Dl zQzx$yB4@OV8+%t_m#$C*4D>r)om9-oA5$~4-6i31KK6<~HSE{a3)-4APhS@W(Jy4m zu1|?W;Y_NPYDM2EQD|wsxcMt-s-u>Rh+=XI;0NnU2{-SF2iJGxku7j$U8fnS?1>IXKYr(oXuJ zZY?aUs3i^-bluQP*M9$gd#f3KSzTg5nmjj$;_T!^k&$|Vi7{t%2(J$R)G9bu>kN$! z4K3Q4$xaa-o>_?dsKYNxsslRe?|pZr)T8est`o0L+Y3-6b8EY$F&7^)i?mC%#&u}G zd&EQ#{^`$byN>R+m!CUMF4H+%-8D^#CZU=!T7fE_K?kw~S5^>a2!0yoYzSMTm*INt z`C)A(cYUWkTAQi-^}pkt!kENToAxbWrzdr=`r9ll5r#?p%M@M=AR%Jl_Gsy0YHRCZ zY0j(O$zN)0m#w_CULrADD$z+1k@%S0YxcxEB%YuY7Y#N=uu90aTSApv#P_@P_q2xm z6`NvQT(@DC>uaZ@XW_Yj0R#Emvlo&c<&s`GKz@EfE7NaNQ!0Gi4aQbxe0*y~nn5zG z$+E7btqCjy%hB_Tgn%?7QRBypmiGy|7s@$(gMs^73|pMLXJFsuFH0q7aUd3LPif@g z%}rV=yQVVNj)j?-`F z2}A0u+t&Dj#y_=eijq=XgEsQp+Q2?~4{gAIQWhYnr(A#N6X*o#>SpG)mRD9rGp;Eq zO6J!`M`xg$dF3n6;P7T2Dn;>f<~Px*aR5sQDJh#rv^DfJx845Ha=+s>HgdKwQYJ}) z_z%wnUEI#@+EldOegXVr%whN>O|$VA6N`|Lcz=(IFfy2Hg>ijCMs;G6AWbD=0FjYV z#HY>N`RTTfr;P*18qf*CT9ZC~?w-4g?z8Sbo5tj968gxaE3H1?x8&H^4nLQ5NXgC3 zIW;>wHvZ{L1bF;ISX8*hr`cww?=@EDBMT!!^xLtbzrHRlxcDdN@~|YS>)2YI8yJ}^ z&3hxcicHQ$$AqiM2Ah2{RmH`?{BCMm_}WCz+@2qRnyzBDFg0m2U>X{HA0MOt{(nyC zd0|LVVz{FJ7cNd?vmC3=Wsi%QB9X>u+b>guD(Z>-ub{gh|m6er|5scRl ztgI1^T&N!hjjxvW5_s!f3JXn9TpV1W_NThGc3?!s*)UIeinXF#XhpcIs|)0a%{Pz# zL4ML9ypfxS$Jy2SNN81D)WY`LJAqA{v$sL3h4}qBmu@_oe=W}sql6Oh61=>3tr8_ydt!0Y+CP@*GMxq*<4&)3XOLTj?7K+ zi;#k)a<`It-4FJ1qy;#5ZJgEYyABljat5+Gzw)_auNYgJrA689@AdIQB#Hlc+V?Ea zQ@^XIsPJxGX%SSwWxs{uYje}wJf-XP)i=j_j0@-NZ}syq?{m>93CKb+P$DA2Zm#ZV z^Ab?V$g;0)v3tC=wY4Q>KoPpSUn$p?1c4_TdrMO*CmTmc$ER(t^|Xt@z1GUVdk?=k z&(AM@8kk>JrrkVWmvFhe_|?!57uN9bhdcw$dp1=L$JGILv~O(eb7K<^kB6l{a?OB@ z0+CF9C6%5_eG7ukaW{LVjetD_{>dBRN%aBzWE!NN5)PNvLODIHdly{ikdeV~}?>Sk&QXO~+r8#SRZ zt0pwttG%yOQCZ>q7xVMyevJ)!QB`{HfCOeI1IMwo!QO=h^Wq}aN|n#Oy%ryxtZd3F z3@Vb6>Y}5u=%@$5^xbiW;RsoApoUknz7!cu`7hlP@bl_KmmwdlfQMVgpZKSoXcPA1 z%*@vPQevuda%e?H1;BO1ME;x^M<+d?`nbE1lbNEHO@?JfPZv`wcFk%XDiR`7!!Et7 zqG_Fy;{Q(DGLT=Gnv}9EuP79p65N!QUB&16ZBnJqQTFk~kU1mz4nJ;0FOoIc*1*6I zz8@s5j{RJFxQSI@`7>vDWhg|mu*b#Onaf!1tA&LXBU5QIL9dB%!pMgYBbgA$Bs=3` zF0166NkIG-9m4VOf%0OL`}S1N!ocwGbl)6RmAw3oAjtx^s|!6Ulrr8LQT$5TORIQ< zxq_o9ka*MmjpB;uMbWAuxzj)1pNUE<8>?c}t*tR)mDeXYI+kIdXG{1i zQ+#7TE^`2xnQ3V!JL9@BR*LQMQV;P7Ol>TpG0@Q?g<8Ea7W;M)Ne`S|Z|=x7OHH41 zqAlKmBAxJ`Mn{uoPqj2P7gu(w%I&`Yy=>VNz^yMc($=5i5Rq@nOhGeJ#(Ts(wQ;O(a6E$^Kc-;86`+fR-iXyKD7| zhrLokQ4IBUGWXr><>lYM*eEC{J<_5EqS{v7&5CdkZtjVSQdS0FnyONPe*#`WLd)67 zdmPaF=-Gew4_cbb<|E!O-{S=T)HYL*WfZS1sT%|!2vTl`rablgBE;F*MOHpKMK0(l+fZbFIx-3^A-ut-8duhMu_+kKrBLT=#a2uT zMQg)0^Lln}+Rnm?dgJ(uHjwbYGwZ4kmoqS+RrmB>@EOO~+r-9bn-xs;MV?gd>6X7E4jcxSro0}?At6ZpF{)sN@tqxF(voD6%)o^D zIW<7~v2;HZh3=}VRm+zs7CH1nQ`6^emETLPtNhdW-GS5S#=UAqF3ahz{&vCIH5WA^-&RGBvYpdvOpCa~ONsLS-WG)%QrqY6xbZKGn5yO!bk z{cEQ}T*f9`MM-nsUh#1w4)Xn;DA?r=bI}2U0>+Axzehl%{-nlc^f{7gk4V@H{?AJJ zt|NaZh|laX&R?$!Zg-Xkie{7hXs*%oYPfoSAmPAn+_ zMl!NrLlI7!e1g(N103wm#fl8P+l@U^!7kVsG|Y52!!&UkgaqV-%}p=6m1CF{HibmV zr0+i7VBX6UWTY2Xl$lu>@eBQYm=$MGr_@PJNLZbn{aF3W(88vys!BUH1>{5V%bNyG3_y9hXvuVC_!$8Ik^D zk@WWVW~6FvU~Zl5Dd{WI5uNhU3bFA}o`(&DO_YRB+Dy-%3V8|ZPy+fN26t~L=6jbv z(e+r_BuNJ_eI7>|b<*{!4+vZS?Q{)=^?oElbM&Iz+}x#-!9fr_d|*zF-RZu$tE($H zdB&fy$@{8A83s;XUMx(^)!UA^^DuCxKtVx4@at0z+RM-M^IhUo0XrDpN_6;bvn|-K-AvRB8i%;U@4%xKS839(-uY2 zB^qJ_Bt1BnK*D@Zdlv8#*4-=ooLJhcQ&Acx%N2MwraTJ}NEIfp6Bb^XsEdq<{zgjn zkzbJYnkXz-`nNLUm-EWJ(3ADzE>I##cFs~n5e?w$A42Tk90@JII;75>&5}Y*iON|= zky;cIDFtl}tXsR3Y1ar+_7ACz%|>6Y%*p+Wi;B#g-EqsgdAPWSce4b%n}7afX5~zW zO2naQMR>yRYaIzWawo3t^rMKev9Zdrv8f?TIdVZ{ZDVEt&^@IVSl$5y(pt){ zu)D(l?WhanRmP{!S1i%NO^B6YYKdTsPityQ`_~jbR++mMKadJkc0x~NOc_Q2l{ zV`>$knMgRvL6K{$X=rTBQgHDL6{aPRh_L65d1XOVMRYXS?brFx)<|$|Y|?Gi)0UE_ zG*)D<0L0xqxB&>{w=+5?!8>Ti1Z?L?EPHxbQ&0rL>(*~F$SB(r0iY@X-<5}PQ%AH{ zl%%pQI!gJcuW+xqS%6loO?Y*6kW{nT!{dQ9^QtC*r@Cuy4c3mC*etX!BqZ?$gOhZl z%R#9m{Y#lvl)0^`mQJi7FE5oZb6WQ%P*AY8o;S9_?XC-yqY)pQ87fB{ZR5I6I%?9c zl-By|2zdP)ujNG}ScZYEqMUZQ8q1}gwY(friYpsWZ_J5H*{N0a^%wIMKMfw*ak|z3 zlAx_^^m`17jQVZhZw-(8Us{@bCVNB&hvdJaenjsXM@RoCG~0jkQi6hNs!6eT=lE2I z`}^}tDn&xB*(~8-+G=XVqxUuR^~c|{y8iloBrwgYX6tVmVuilu_0=6~D)vNK|Y48@78DSE_VM%V?GRP$xX5Gq-eUB+ zLvMfo>t&2@5OteUXJ+J<+szc4L8)Ii|5~i4vR-vV!qPI6bKE9EWk?yRqIw5$Bt>XUUqiGO= zbsVCAlFQiGvOOnrhkED91Kz-w^xJF4-Lc|>lJb(MG})s0NuMnl&CxkLu!Mv%equeN zp!W8^f24-rG{3TunjasXK0nDp2>J^4bvDK-Z{_7(u%b<&-+jQ+k_LJ8qKAhE7S`S1 z;H6V5&-%{^Mc<-K%7Lcd-LQkVnR`%FXJKLCnmx!`9xtptvo;T^46Q0 znquAcSwc>%t(4B$dp36Vz5HqDs~ET^jKUuoHR3XLO&kxWjy%L2m(-f(=1lkYSd-hB zz%Gz-bu;ET8Oat9o$4w8VDvr}pJCDrD@x9g{7_w$0Mg)ogAtvstwEBJx}cE}gLM}s zRl0uGEL~K7LXk`F#ci)-ytR>-OtH?xVQ#aJLwJ^ViJqE@@NSHaNYH)n2XCaR-gmdx zv>=szLg2vQG=5J}QBfoxQ+fe3)l?*l{n`UeH@6OZpCt2)jDuX0V1G-Oxu_Jc4^8<1 z4|fc5$9!#+&26kAPcGN`Gvd;mN;7cC2lch-fELEZ+Pa#O_M9#GT2Tp{O}RB~gdv-O zT_YnZ!o(@Xe_BFKjC)8-!}dl^$+zpOt2-aa6ljtQsmJEO?VRubX&#c38J#hCAC~&d zzqdT|yNe@%Eh~Eky0G_Cn(jAE#HPh#@-iyDwXh+>YMcZ&dhP+=C_ZVj_ILdzRhhax zs%zheW(R#tpM;*%N_w4Zo~DO}req}m8UAH8|D>|=TKF1aKi{r?zCL2)EP6Q* zNHLZdBeJxx(D(uW=I`BNR&{&(EApp%|AYj5I(UHZ-S2E%2t)m#i=eg_b+^ldSyk$? zV=`wmPLaI4JSD$l(D1IMX~EH=PcN=&{?hP2;swV$I~dQpT67CuXJ==qGA-*!kKD6& z4n9~0B#3f^tkzB`;mxb1OfEavI{<)9jm@}tl>Mw0+_)SPY1geL5<71YxGN?o*BqXr3B5o`MZ{+VCFi=s!nC-U){|gR2dN4(oWBEiq zzg6Q1ZYEMh^nEuHNJN$DjH+As;bllT@&B! z;ohcuFs+F{Ib2gm%px#mMmJZa_+c@;#E z$<+1-fQE-aPUj2ywG&#CS1>zT)DM1Q068ecG1$@GE#HI>GwKIZK_MyGp@l6jKX1FC z@jxl-_dCTFU--xMt2qjgG5kv@unn2eH{w*;cyf zBV8gggb4{=*nq$BFDo__g^uk$@`fp~DagpHf3Q&bV2vRo6ZUneA#0{kg9xX!AU+`P zb`)@t+sdHdq2CQqwYC&sn_Y$sslcz4qWm)(FJb6nw0h@6h;LI7?JOuH`;8 zApeoyAlV-oB+rg|bN7oh3u%e=;E9a^a}Aa6cKxWqI^YbxxAchK+SV?!9Ld1(Hpm*oy@QY@F_Q?2d1>kCaDcCxGlsUd zSipa8jRZYCILij99*y|!Swil3nw=aZu@FdWO-&7#LMkySDQf7p)qH0sEEYREJK!cr zAS5_gRZY#**q8>{4TeuzTKX%uQ22lh%J_C14>$Kuno-gUx5P&H25c;>Ep2B513wzt z3(_e66EGHh)(p69~&)o4Gk$jt!!*QP*FIDERkf*j74;ixRH;e z7vibMiifk5mX&?wS@*SUPeyKL4x`To7J#+6TmZ5i&Os4i zQ`@^ApwTWVjoA5-n>p~~Xwg`{nJFRBPMLI1+X(_&)iS>$l3+&51Ja0fc}toyK@JbB z!3Qnv$Lqsz+Nl<>pq7E5<<#^X?4QV{O9zr z^&Wi!OS*!y#=?T*$>LF6f+d7tI4N|Bv%I3>bd2zfVr(p0UZw-z+D4!rk%m*saqg>8 zy^oFaq|c{4=0q?Rm8mJy>M5X}kF;QFbbfwhCja_JsT?+XG(n2L0?W`<8cn-yfNaBr zvxWQO%vfBSBfoUJaQlZi{WTZi)jjRFqfpM08*OBYE2F)!z)+X)cL}-!B4yfh?+Nf! z$7<|sH!mL^;)QG5THRoiW3#_83hoP?;7dwLN!@-bHp}+DLpDPc*U{5M($#ZWG;v+` z=IcPdaUB=_OCjRrMh@=l?|ns;E-kARk7ucB#Y3e17s=ih_82B4Ed0FUG`_j_HtA7Oa(aHgf7Heu?!f21 zo4RIEyG#m38C&S0qbS>_xw;zG{&APx*S(ieUFc>)VqV`@n3Io}muZ_4rW={s>mpu` zO^h&>D+0zlmI5k{?Yd5*Z!3fme!R{5oSU1QG3n&3%Zr5%(DOX4qkcY+{`7pP@HT#K zCq_uDaG5ozW#dacTD?Ep=In80%UKAyt>|Q9_!9J&eBnAvJSIm+V?MnAEiw1?zfVfN z?Qn35=-;*(p6>5Q{@gV7@C8Vu7=rwfpFh0T?MsKA5DLt@u&Z(37p~Utr*-qW zZ89j#S(%xmLqp<+FfIXW7eCU{NYDJtI%h6O6mkEG6=HvS;yByZ>^3zvG&JPo%6r%( zu6tQM_bFmxCxNm1iTW;WHl>&qP0CqOY=*eF(PjgC?&WF!(;EeEithXXAWC-nx+iA-4iqhFax5K*ugygTCHCLrejVjO3xW!qNS*2dK@Mys{1ww`;W1z#VhQTugy z#nQ@1Kt!N%7rEd{;~He7%*BqK(jDp)uRJY3IwCKR8Pqk}<%qN1=?Al3T3Q;^Bfw{)~4L>J~q=4r*yA8Ej@qs8k*>WBWtxh1-H zwDq|)Lxa7+CnxXYK*w6(j)b)}s-z@BP^c1xiuR59?~nw5FAR(oolLb9)%HJ-Lvq7Y-24Ys`)E%^ZI(~$(zGcPb_%8E zjb!QRL$1moi@}E@yj$!yXl!6KAZ}g}4QXu^63NCkRdMZtrECN-S;`hDA*}koKF`k1 zib`?N#QTvMbCTj5jtQPiV!z&BZqu|uDf9cVSP4`%(-Cugu_#2v(nS?!X-OE z8!#wX{4p^xd5R2@p~%9Xp#fP^rNC2?$0 zLP;jO)=Q*Dc%s~&Z=K1kA#IFj@Q$7OG-3t>ouE_%$jIoZ)Lyz#`StZRD-rs~7z+M? zr|qpRoNFkgir+Tr*n+`Wji_#QHf3}w_>!p90bLsuhP2G69RY2Io}P~_=WXaN@OA#d zuxj?!U%p_tVctC*ske)tMnu%dh&47f(Ml-3RvYyzBH~a$;DO?^C}6r*XvUH(AZCaS zabSR;U$r8gK&=}>={t!cFf9LDGu-6l*8n@W02q4$Ob7yRVSfI`Cft+%vK#Y&rLpl& zFtMJf?d0U-1x6=`(??cKXX_Hyz@en5D0Kep>`VqRwBx#}^-9*vY`;DNhGet5{q_0$ z7pwxQB>XTXCFSJ88uS?mo;AXQ`?e(t-mc@N#-*j9Ciq-uti#k^dVSTO!KDi1J2^Qq z=sx#-^}KlJ70EDw(}w8S^&``0xBca|YVyfI$R1AtAqq2!0yJTcO#y_la#ebAB?3@- zKTS4Uma%likUzI6FsM-wP|Gx)htt?16@JDv7bqdfxExpBs5ULekQ@0uPVK?Z3Np)&&L% zZ}zWT$vUyHP|r?AET@nF%!~#2H9^KT5zU2pi|>qEXz6G+!|$kObCO4J(|kmzxJD3K zdy{U%4m47YO-yzT?6j3tV%EiL1-$S@&7iRn~i#g?>m)s5v3sZp7K5TS;5xG%)W zc&EV5yr*+kf(QNVL`G8fb4Yb~o2Bt*rccwW=UZptj&Z*B20vq}*ip4s7rw}X_;^2> ze!i=SM0d)=$Gf1(rT2aem8R4c_E6al*{5EL9VX0trZ*k&&*Z>}zPkIaDX4Ge=3~-5 zy*zImie*;t&X{hG$T^W;+L10@xuH8nN$YIN1uRz%1TvB&?_n)k8!xDp=ygcZH@0$R!A=MTo=xo2h;7Z$>-C;uV$=Y+jY zXTIm^DsFA15Id0V{DIyB($>}%ozs7Pm|t32dU^4&mzR*}K011Djwp(dF+1ns=0=16 z1OTE6ErRSN+1S|L9M9QQ9k$l-O85#R-;hB=`+?rQ?eW`xRJSTkUHU-k@#?aq$7h_vqt(85c7s;DF4~ zP}R_^zD%%%Y#lORaMeWztC(@o!7$?-o%kER!&ml&xDX)?8foLgyOFcT9g#F78dTa zs_Oq9AG{^MG3 zzO^-1nOw&z%BbuHrs+C451Vp#gq|5_jG($sXYW5&Wi0!n%0uPhYpW-J0*n9m+;xI3$n5cIZ=u$H)p=gmIJuAv;QN!7^IFl} zMe@9l+zz4lXZGvk`YRPHsxdqkgc$I)&Gq)Gqq34MAOU71!>)}qt@Y_@xQg>()Xpc6 z#>wg0M&}nc`0n;L&b^f;Z$HZuOBIGX$I8so(qqvi1y*}zF5W$716PT72j*^t8ZcS+ z2!))7r|a>uzn)@a(2B>*#?F4;3j8++$Sz)dFDRI?!4QVcF6s*{cW5O%11PS!xw$S| z46!)n`Da4NNJw-{2QeG@adEhV)Hr|hsGm{9?0etZmmiL+5=wG7^ajg)q?j?_m7ouN z)qOwH+1a@`o$PJ;XXkCYb}L@G=lP$%re5t$rsR}jaV0$AZ7J*waxm0u;y@Vae;I(BlQtC==GNESZ7P}UuP*zk0pnKc5N;?W zudGf@1pp9@B@jl1e%I6_j_``Pr8lg)kl#~cg(`HYr2|osf~KP>_@Nfs`TO^a8E9CB zO9q4n^BO>{sdQ&Ol(6mhak)A`2AL0z78a=AU+wV{0%lu)!i;TIWhK&&ZWxkq-ix=C$|IMe!(FND8+@}c=3Mq7M}i+e zZXO*)s3EMZg(qClru{852CFn}MX=o5+RR}qQ#j7wBS`%R_;&&TJCo+_k!wp5ycyAO-)@aEggM)utZXZ^KX>nB97MS z<1|G_nKeJ@*g-K-XkTjpXn|m zm76f#v9u}S{Fg&A2W5GYXQ!v5yN;8g$U}$-2oMo(GGoa*AmYo&$jEnB*D_a^ii!$E z8lmeEE+|SJY`)!Y-Uzt5a>S7bflvb`bkC2Dmj2;N*W1}xTO%l(1}B8w4Y5@D#Q-V5 zR#q&}<6m~Z5QN}WkK+m|Dk>u1M&{w#UR^`-=sr3p!juVNDR2X#G^f z0^Y(3fI0a^%AlvBasw^ko%K-Jv>}bJaNF2~Qn?Cp40g)f0?l&h)4uqyftyq8qpeLY zggVk+;Gs+}dL#UIB~Z|f+4!!82^@gDSq7CPW#JG&|RNL&GXC?s1sGxPJ^ zC(y@VR@sauc6WDYzk$x)3PZkufJ1$dWF0G4zty=7wBPWnsIZZfL+1=q5N-7L_kXnO zz5W!P@b>oQo&4CSV3RxNZ@4xRij&v1MeO${$Dt1{!f2N4qa#iqPOQtyhSj9-v;~(Z zU#9g#hY5ySw>Vviwb!P)8t#CNLfGvc%@KL8bguHFqx*yeV_$S80<-ir1ZLO1s;K;6 zUoo0Zf`|7$Vq8Eo^*!k;+=JGB{EE>p!;=_C%cR`GT+`EkBKP)950_)1Af-JynI}Ey zI8a+#+Z~FXSA}&22h?%sC4|cP8MFof?yv0@j%!@D#Ig@N}n3tU1%KL*}5dC%&% zSwa$rcMA#%6h!_p)HJ`158!va`}=p@{f0pXZMSQ=VcqBPZ4$_&6frH~fZQO(8S10_ zmoGD(L_9n^u+xg(222OodJn#@=db?rGQ}FKKDV>#xRy|pmKwRSgUPoddcaOkAJ~YC z*g0rUE-L3305Hcz!jX&p&v@`~!Oec9$ReZSBZJq8dK$c>TeipJ-^QiqbPqUCiHeFE zH0D%+wG{x9Ky1GYffiU|H1F5vzYeH<2)mtw#kg#jCmr$QpI)D!g>7WhK5^upsWi|u zFum)2P)BHSlH|5iq^-ycA)>`A zn*N8YZ(lt;nr$n`USR#9h9@M%!v;VOGVdO&4-^m}+B3Zu z;N{}t;}BI0G>!e2BG$|h#=m?ZSABEyJ+%N+Q}gh~Mn+2NwgN@i($Cn^^621z`5ulH z2Ol4wkT6*AAR=4H9nTsC3vS-8XojI{*Rhif6BCn$7^;;jP;T0&f!3Dv^z=WbntoTY zAAS-J`Xi~TsvbGpSXo&O#6r|!cD%j4VUnTfsu7=((m=d5IzHYlMDk@!Bd88q@r)gf z-ge4k=dhj9_Cwzs#xH7#jzvNq1A1^&d|Vs?WE`8Bvvl9G~=kc3US zM)%=$@^hem^go69$U)CG>!i*E0DQFy5DIfYnki{)1kMQX^490(ieGQY$wLrM;3Kdp z1qg6)#fW_3F)mqUWo5@8{CWI*NLfLP1Nhh|jSZN`7YLU?7{l}@^w2VSIE_vc6?}b# z0UgXPx;PYDhU1T1TwIfGP+$FvKu5sFdjD`;G*!9Cz>g(&r_Ny{S<)aw_Mo)__P$Y8)OG<(f z&-BpkdX)}OR#x`QU9X-KhEAVs_kzH7jE$ah2jo{0%>t~ zX>kpdV#SNQyB2p17PPp#dug%Y7Tn$4^$lm8|2gM=d+(i8-6Fm)uPH>_DW>jviwfhj?%A3iw$%q&o%)gX}JwI)x*-%2mg zJVl&#Zw3t+-`_UMia%)kMMO%Ep6u+rd0Usx*UiORRaL)ZF8pOV^aY%YD|n5YpOP}c z1YGc$q}vyVOopF>_zBt%BkHHwUN7{z;3S)xeEgny^ERpEy=HQQ#nW=v?L7%nn&-us zWNJ!EpFwj>HuEUxz5#iw)nD81iVaUXCS|1<4?=4(hT-4OmJdp1T z3vCgsWfI1!PJzI*kdt?6E|?@FFjbp+Qu(`Q3m+L^Lfz@4q@Sjod*}9!V&Z#KV7;?* zVqzkSz4Mx~8g6X#D4s7mE#lohEj2YyQzKh&;apE|fWvlvOAw%}v<&j3t*V-6$Lbrh zEXMJ#}D&MKV*x7 z^$}A&;q;pVyGbXz#;~s21QsNa++$|B(r{%r5%cgcNV`Nh?*Go3rIHkfDxk>ERLlO1NURQwJ{g{eH@wgbBCH#=+qxI4;iIYWuUT5)~+EdXlfHk%frQ zwXwxHgBRk+89!uo7|cEaOygVM+e(bb^`VSz@v;1atHQ}OWl+V00DwVfT`lGrw<@#) zFw^Yj+Q@g>2oi_ZAz7~fC9>OC0nDruU|CpLElrFmDSstvohS++7sa9WaVnfZR)LVNYd1HIR9e2ZWQI;R!~3?696VH;X`w^wT$~) z+JXS$pq0*0T3V~@bP*ASet5t`L`sCXF6s~OV2^Qs zgG@|FoDUFRY03Ikdw^!ei0RVc*V?)>!y`*iZ*@4rHKoRBr}Q4XfC4gMvfI?uWSm>j z(%7<3LQEEhwrx{7WKSS>K&p)4Sc{4F_Vo0en?>KFdF~`p8E}|LQSzAf2KDV5=j#h< zA!;7C)}mVnD@Fp7g4P^K0~~BC%fs3_;mj1`q)+kC%OSZuOm{c;jSa)luI#!??b@a$ zr_a!}{ymdsKD)13UZQ`2)*0K~(!cb6m=#rICb{o`nBNhDQ}5k9LT(0jn{J!$?pkMm zI6dG9iUuLMZyLD~c_1caIC#(go{7(?3D1n)=N86H3VT6RkK+D*8D{2+s;a7E5AlV? zMR<7l4s$x8Oq)ROki;qBr&G*_ZCf6XA=5mV=)W75p-ybPLxz+6BMO&9u#JlvNDNri zB4r={w!dditf^^rc-Shi*b|IAb?cWqiH-!Q+eCFUI<%`MK9X|2I~cV5Viwp$qqt9+ zhQR9H=zxTLHxNz6&Bi5B2m*;JxJaIda(ThSztca8EiFRKs4Gj4igK2UIX<{Bd|nA@ zLQSvzhHVh=0IlIE+T7mu9nJ8?av)JLRh60C+UfyE9r>fHr(0VjNGbn~wMt)n`a)Tp z<4Z%*GSytX8=vFPX!C$%d8-xOE=HZRN zxT3=g+pN0`X%wrEy;?Y!q_UZX%#X~DSv&qh{<8lt)Kx2IrLDa}{jR0xFrp&57ncY{ zl`edMUh!zs^!a<*WLN|`{>ikR+nO9QZ@kR6VkeG3HyNtrTOrvHuoGv=r3dZf!RR%|Z%zrD<4c8NgV*r^{ z^aDu*xkp|??TyPn*%;kAN^Y;_NUp7|8?3MK0Abj}9hg1&7tz(q3W9H4j4y7D+WqCn z>bwNt^1_jATpz2MNtFdYTq78xn;u*gBQfZ@IhJ;TlfIb0mH1oQ1Q48?+qJQQYXF_e zt1kgv&PWM&O4rBgIDpK*xn!whCwV8Yv|jQqs0StD1TU&lln>} z$E4w79Z+Hy(dj6C&C1J}pI*w1nwpq)xx4t3+^?wv&d4ApBe5{G?C&40cX1RWo5nBT zu&egcBUOVmZiIfgcAsBZswI1WzPlS5T2wSrTZd|2 zlV=h=dq_%Hy~+a`gVbGKLW&?&p{I#cIK07_Esae@Y@~a%JP@vNGUcHrl}PH0-92e} zS=r^R{xGE`EiEM#gFfR-bHS)TlE(Nv>h@evl z2mm8LBl)yRD3s5g!vPJzodiQ0JV)wpUIk?}1EVw4{ERvb_~YE~@%}OBH8}uBKVh8N zZoL0bVMhZ*? z#yw+jQ6La`xRI&pN}nB@e$9|vq?czae!gT_e?Nw~#gH6^jclIc$Gwykvh;LVy=P=# zn6>0O{mqqDYH9gb9>>5SwT6wIT~wSlxETeQNU;5BQ!^YPd|;qs^hqQVgokIew>HV& z;>Y*pl$1bCQxod01Wl1N?yn*SSe4Eg(*x)Hm0+oKaM(tE%VRA{;mvqg#BiclfiL$61e6Qk>0V zo%GA;gNkD3_Zb3;eh3u$m|b$t;dTA>KlXUNnp+gAqtH;?Fe14v%pXleYFNibMi7c{ zE8eYv4m=C|BRVUIWoT*}(<_Idy=j9K5MY^lP+U*~O2n>X2Ign(?67e*=pc!FDjzJjHzmPUhDE+VT}vCLJjkN*I@ZrDEKL;^jyPC_v84$JgA_a-VAGhdEwaTG|$MbyF@)jU5;mSXW!CrRT|m z%%q_{v$?bJ^z<|{Go$_Q6Lcn005?K*K*Wb)E5ieMuG@Vac8AxLS%W*diCTy}mxImX zP^#YMxw!z*PZEPbHeEb`WPvfGmF0Ja#lpUo)2gx9vD4hzh>(+$xjlQZy6q1hw-a@z zJgLGt>Utl;3tMX)XXkp6=BAo#2GPLWkLePh>$0roa&cTz-QZ_c^8H%Gf-y9 zux$*u>Xg>|Rh1B#*+B22>J*hA#Q^E2A03Cn1BdOKEG_0IyZVNlpj~55Lc*s92eVc@ zpHx1|(pfMtFjx*J)YUn;s>i4|vUXIm2nxOx$V^W!<6AN{HcO9t*IxNMLHc?@2!kmE zC?#eWS+}_zR5%rM5e57{JA-)Jf|F_MMz4xN%B;{32@PBtGebZ$N8+__6;S>{?bZ9c zGV!W&d>pR%4dzR$xqN(FiGYB>euF}NH^rj-^!)sumZ-U@>E#+~SduS??=dqo>w2Dc zZ*6T65DK%go&ENOhbdZq|382K`ds8taB^}Uf;{!~RzM0uMMXtfZ=+x6$J)lr7>z8u zeK=Tj+bKJTO0cyRvc&&c7@RE3%f7w4uTXzP`R%jI(Lpl-(2oY4Fl|sU?Nfq`K^%J@ zd8KtZ(=d}YUvu*v!(#TsUwg2lPa0`@@(tiyd0C{BY7pIa@tuTVeN}mRxmII!Sv3`y zN`Q}xZqUNb>aQ?cdE-jR1A|hT<;kN;ZfQbdijune&LKsijj6gu46l&j{>ss&o`ute zt*V=wk)Ca378XgjQ30USk`u^OQHC5K`8_$cr&l5=KEA69psqd}fP7zGb_Ux{${W@W zMOjUHmfscSSLzzZQJgi%Shn_dZr!uoqdols^dIV~tNAz>(yU5TFiA;>s6f&jc1nmH zT1h%>=dP=4NjYI*d?fx~_$4`|h`dg4DE~pn+<XX36sc^8q7Z)a zr+9czM;FE=@WTF|jS#zNE7ePD`57dkv&i@-bO08-P}|WHnlX-7UUA9 zf=LK>)Dp;4KE|W9CftY?At50J1>HfU-((22r||6VQ}l7MF$|CBDFSyl4&X54<>lXt zlYmp#*@T}_bSkV*&cg;S)iv2TS%p+p{%n`j8zTbOqS7P3_Yy$~n$@X>=otQ{FO*Wp z#&mpomv2l)`DRgz5i6^FGoUIEPcAOJetm<%2Fm@>v2wp_@Szo)F7M<7HvWh*JTHv$ zX11q?AyMb6PQBFcq<%xrOL^l&Rm=L=&``5q9X1BvYCz#6J1VtJ8j4D*tL6im8b9fc z8)Yf6#_sO!dS0%9LBjgcdCrc58tB*3Xt=%gT}7u<*)m;BOXGXdz<3JytCxI*4eDB4 z+>Z{hO#bVqr>H34TPUJ^Q|qN;OI{h-DEjj5ku}qh{LoVS(@CqV!>zh#30kkaz5Ygt z(9zf|B7wqjeg4^F&M6lHWh`qc87k_x8Yr;<>a-U!eBVjQAO#5UQ#uX_Ix-i;v=uj-ns^N{{^H}~{{$6Q2L~gI*x}TPmJRgx>j6GltEC0h zRc5uelCs897Lg?l2->Z6^#tu{s#9ZMUR=C~Ll

          ZNtgiz%>}e_=0Zs{DNaq#eeCr zun7xO#Qp#j!99I|Q|f%K#Ce9Q(8ATOVQ77sXL+GbK2_98w$Ll)oIn~KNfSvmwdpm# zy_ne9ZX=uLS1>eVW=^V53)9Mqk;=Wsxa`= zD-36DzbO!Y+X>(h;=)_Q-`(lTs{2-IQjx>~&4K zZIbDQ{}ZY55u)II*0TI)Z7Su&p`@)%M%8*brMXclF7_VYlb)Vl??-O)Vf}o0``sRW zMJpQ<6UH)s2z;E^{F-hNs#%Stj;insq|-ZfzT;@A}1@0_8v>_Zd4Sr6aEB# z?WJe^Yj|)_uC4(K^+Zg>Fi`eg+Z-@U5k*7n&&&1CoyZg~pLxD&=%9>>j>aq^%Yd-~ z#G{`&W+eG9Vl)#wCM!QnT2_tVVQ2eL=j+#13c}pHva*t#Z#rqBkLQbO9wsJ^gG?gK z*;VbT($X(|1dqJ9xVV=m&y}|v+1uI@5)tk0?ZM@~+JtcqB_$Z5V>A)>=+Gs`L|L-BO}L&n%18_ew0#B zK!&zIUdt@Srgdy+h!IA#I5;kv_sc!jLIH|j{6KwgpFdDh(bCc? z)}5T3Y;74cGM0riHKW9%YIQ#&le@kOX?UrW@NjT(AW&pP#LvOw*7GR7!m27eW8*Dm zpIbEaprV^>Zf@>guZQFP{hIoEiQP=kvp2;-Rj_`5XtXi1i^z`%>_2c$?CUh1SmRD1+Ct~pA%q=Y7 z3E{e4wXR6w;DCmP?48|)-NlE0^m-&oWqo1t|-)wNDO)kvh zO>P|?%D=~ot$?K^+&7V|(a}*wZH}+DwkLJdI%x2~bUwtLn(Ar|EiHtwm(U&&eimTr z{7#_jSp^0Yos_k=Kf$v2^YF`fYcfF$bbda3?N##21@AAT^T5Z%<$ zG7W{sg1&LsjnB^Bw%;GoGe6t^@HRH4rL!vgEJO`Jg65ti8gTj=QMOidecFrR&$P!{9&ykY5ta4&m06j1b) zs&#q7a>J&1mzMD11#Y+P2Kil_7ehfZ#wDbmIl^d57-C5Z@u>?#L4^k|Kh9ZLXnhM< z{metkQ$*gV%$7>qNpij9as2!D?-B1S_DdNhy8l}7^Lt=1GR}3U^ydj!oT`2Q{^kJA z&^JOxR@UFokE4M^Wqm{2Wl=m)kPf_P^I2(H%R%15gWvY$+F~R|Y)@EaZ@Jw{JwHE( znrUlkF|{02-`%-4XGYU`;Wl@LEf* zR0dO(yO zc-c${10i+GMC--4tl@{#?F^42*y}5%KNVbmU1jAfyd~#(tM@#gv*UP8UIs&7p~3TB z|AD}YdBc+X{*9R>zQ+@tZA2}62v`LqC~Z{J`sOaan18R%CIcBae%fpFd>a2fnh0Qhvk z;uK-JmY+(mF!P0e{; zk`C(L7uDYsT?h-WPv0S=wO-9xZcvijPOQgAZJ__w-zt zo4Y&qdA{$Z@F^`Td;759yuk9+$S4mM>#)dqd9ud`;~zgL-w+cLeva8%;{Uj~xJX9y zl>X9LCjJ$}DqpGS3RzV>zLzkFBH=oti8tUs+$q+tDj4nT2 zald0#jFo#UzQw}8#AIDCi(>EOB>wP{7$gx=x zlepZ%dI588Zf--v!*t;9btiyUE7*5RklEheh86dxP89JErUnN7dd!x?5D4W=;nVUn61;BJR7M5QgXNv!Gj#ZGW=Sa!AY0pat8rjzE`y;r5O=Sb0tt~6bF}g6# zev6~#Dua;l2#^nN|hUqa`Q zp1X?J5d+18F=z@3@>JCl9JWnHFyl}+cW%UtRGi!;da^{N0}-44`g@sEQ)H%<7V{=% zW~wPF+P0P(>wFL$`qf9wER?#2s^^A+#?My`-RtSHf=i%k)eeS1`x{$kroV(oXC0UNfaHbos&aB&4LcuW z#gx>)8W`%E|1eIAOFP&(@S}Qo6ddLss!2jVS-up1C6BfNwF-PZIGP zY{8(`wM`>DyFzczB%k57?ouUffl>WbCEz-}6Nb_Wy5)CnubRL`fG4LLdeu==ac zSl_6}lkarQg*-?G{bA>7YOeJ3C6Z{U--9HcmZGSta*Nx=H6;sJxINs=Vq0p{;uAyB zJ@|pYbol+MlYgl;iL}?YvSnxWOmRig@7?e2u_e`;{4d<6%JB{};Fq-WD11tiV=P;* z1NpZ_S5#olt1BpACi!}2I83bT)#0RjHP*5i3=PWd5fbj~?D?U>R44=EAYOJ|bE2v! zyMtJa6%+hwPyY6TV4FIzj6zgGSm6Ciu1I%1yES>Sa<1t|Zh#7HLT!DW+5YbC&dz&E zziM_RL+q~}%Q3#bS$sZR^M$vro0AKEx>7u$q0fol$1Lc}KCd zHpMW->B~b!`}%^rcQb{T&!dHZSS~W|7rWpizB5KF<G`+1|}f^c|58O2v1E^yHn7+?Wd5f`VF6*O_z3fN8EkR_P)XHda_YrD+dH{sWkyy;SY%{YRwfl?sP;R% zW+MV|BgQ3`@Y_AzL6Hg(_W@#S*tkS1$J={bzH$-h-<>$~WCBS^XQnuR6^DSI1~0mV zqSngFx@o!^8ZxPpu!}evDsO((JKJ~+2o;IxOFMaeTdcBQ-MahkPFCmQ%*hQ+2d7SO zHw;2}sIjbl56AC}ZN+N+%T5m-uHKXTQ5n3;<<&lEK%1No}K%cP*4$Pa$ z#Z^Ur#j5LomL~Jq(2P4P-7@oro;avQxhyLNBBTX*^>6cZPQSQ5*U-)o2gMUx**U>4En|oSR5Y}| zd*K+TL>k4HyT$;CBl78EU0p4+3mbVjIXSo77zPIRbk&p~x z90bNp1Tu{hF^X^EVa0w$@2P3Hglg2q`8Zv|Z$(6^PLQQvoO%a2#u+Oia)p+H1lMci zXmhIC$Mv~76VU&?^xr1a(!xv@-T5H8$nx4FvNm8GE$?2gRKBbBSm2c>Lv%r)ajMJe?gG6db6kg1gTl<09c9 z*38GoNkWX(eR&CyQsAGN|I>!IyP=SgVKsD#55ma&X23#_pwiWikfE!i4@xnm#rhDD z%rF(xR~XPp7#M(=#QM*k>V^TCW}T`xgwic77+fYHyG>0LR^m00mr$7|$L$>s;(hlE z@^sv=ZuXj*ob~l^*>ESPx8Hf2ykF0t8t9AIIGxe*e^>f?I%piSp5w0(>27EZULVMV zLcn!o6y=#o1T|%OI(bT;aKjwPpLce4?!rv!oh%GE!0~i>swH-ZLFQ%kt@Rn}L&Jko zEo)8ue{yE^!Mcklm>9A$AtXdQwAUQ;aZ(Q-veC}jbM-x6dUgMffC6|UAvxjm|EGJ~q6-QV8j(}qYtqOj6H@Y&3_C5(oLq6u5nvV)!fe7 zWhYP7M~IhjPu4l!+0KO5tmD^w&zaz^uV$}CiqpBVZ*s+~lE0*3 zay-+rO;5`RtV_Sp&!g@Li44EqvK^hs$}r}*lqr^xkr!3)^73k)oA0Ni7fhC_oOyF< zH)60pQ(q7EeQIaNfj8ZfN(H)mc+k*@k&zzZsZJSuh+qL@VXacud%L!_CHs4k;VX@l zzkV7FKgS^en7iGh4B-=FKb#ru(PI*I zqlF=r3kL@m5e&~if7Qmjj&Z8CHaFLW(~4t*;7+Bl#w6tMEu3|Pg4eCs3RnNT`86@x zTI57Tyj%-5b%e3iS-razI;3QJk*Ia$$`57+pV z#3&tU8JXIhguaM4CEct7DaJ@+2MZWsqMlM_r4*`%pVhr3;rImLA21ztzPiZjby5+J z;{Qt^bB2ogf$EeiO8rA`Y^QZ=D~_A4+Oyu^x%!2^q-Kq3$#CC5?^Z~NYeEVKE9>oA zcX(l8VY##AtD$guX=OR|6heY<&X`FebkX&RE^}RKn(~UlRJkjy)t)8R6!s5{(yoWa zSZm`~U#Q6ng3FOSaiyuhp1z5KdCI`3#5ml@{0HlkxP9)S-nj$2LiF|N!-o`(wn{O% z{(+|S07a6)%>?M_DVFVP_<#H7Q}iUU)L$Jz^q^@JDhnn`8&*MQfr{sSNUXqxwLfrMm7LFe%Q`Rk}Y zN2(K$1&nU%{p$bTeoE?9smIgRsWVKOD`RS_7Ab{x>4W9=h6k~Wlo{}gpv9QWCJ7o2 zp6*<%yu2J7jaBX0O8t!Z1HlY=Q>MTX=IJR_Zmy}@R|M|bdNVzgjKg1dRJ9o^=oF)7F;#HLe3|O*r{w@-g zj0tnZcb*iMlsx?=YsZ$YKG(@1i}E7JITx7n@9c9;U})rN@+o@oYmseR(Iqv=pa*T^ z5#+$Tk(1$(ou_rWs%mQ&t9~l0@BCdjF`v zP^QMhe>`zRxbqgNNvm9$jsgGN>s;ewv^;*eND)hFwQGd+SE)o{?bZ#rRH|n&`Horkc&fcuR)> zHxajOE0f|PBEooUBR(M^B3hwcMwVpHij(+)EwH+%Y<;st?extlvu=K3A};xX)%*i6 zQ%xgEm3vfJQAa1kk1I1R4GebnY%GDAgC@ow;QeEO5&?*6Dyr&{8vWMchW%m1=C#U7 zO4xIUgM)+Vku-Ix%Yr=Eq}YD=8@8=F9m6`hnqne1^<^Iz1qFF|Z($_>OhlBBkf$1c zDnnIKZe!@-mIW3S6_p8d5YMKkjyrC-9~}lzQ^Qt^i??A@%DAejY*D-D|M%@%r)>Z- z?$G28y2|m~w>W*K5sXu{8>-!sK~m-l6D0o$J3v)l%G@_>n@rk}FZ(~@Ix zi0~^rYNGhhx)!pdeOBgEL~S4Dr zG7^%jLuC=`*Dt-2Eq%ieIR<0It*x!2iSTf6MD;^~2zIWXH2i zUaI@@d3aDc+KGX1JZ$W>^?eIXmXi(Bg4(UJq@j0Xla-@CPfvaS6r1CxL_^TgKO?ZQ z5+)?j1QV!zGW(v9AvgckRZ<*DODippApQscfIcF^&Hc?yc3UJ0+Kjs9XA(Ra>Mvte z4EPpC-hbS=gG;9NikIrA)RO2nsU8y8eNV(SkWwF!3HU-8FNf>nBU+VdHNpVzZ2x|+ zSi&`nzrz0|5PM-{Y^{u-Rx*t#KgBGK`FjYPq-}U4A`L z)`>%MqJHqQ3>(2ghujDVO^VAC%< zDKiUJ3>qXLbNu3sf4t^tX`XoKA8KwR34;8>ku`c_M)dXTSIuPYW;(w%eA)iuVsCvG zb9yu_+!j6t8pev^p2XshjT`6QdMtCAOKT?NS?u3s>5Kn}dg0NjXj`aB#f&T+AyrvA zC{U!Xe`uWn=!}ub6Cu)MQ9kWkg#V96H&9fN6ciM46-6JlRl{dZIU?mooE#lX8Ao<6 z`CJ^Ub6GS?s`kmtL9d?{x|{5@8s{YQ#{?MiCGEa`@wmTlI8JGOd>EszsL>7S643%^ zF01a>nQIDeFTgmYOdeH{(&L@{Tlev09SbK@{-!Dy!Y2W8`M0PSB_(BM=4QKldyPE& zo%hUbyJ3Jqb4_~#3kO5b>a42rva+(GCeHUCQKqFmRqD%KGiK+28j|?j$#VFh-B?h% z@72}gy>pa&IlFGRw3wO%X!qv8)5S!xD28v^LH2o6O4V9uPR!alNZIo+V^Z@jcuc9{ zP&TyuMorD2=Kff10?I+GW3l+@q&|7YP4LIx;~|FG303M0 z4`#nQ0J^{bI@#+tPMdcsxlTAZ2rusBie>dPSJ+S0lt|coEGaUmo)H_#d;Qw`){WPG zEDxGxGJUnwKB;Er%@x_^n+>|k(4I%?IYHIzU%I<@%gCfy_F%h?0)`LJw|aT{!@;|^ z%y&~YXvH~y$_4c;EH`kd%ez+tCB$uwP>rMy`R5LDHSDEZv7gx(*{Ci|ZOEAH|A8$b zB#$JjT#yjy)Qx%vlxyyT?nfaZp~SF?A^aL-5{rPDOY#ZnTt`s21v+thTK1T9o1pIO zoUpM)1cY#BUr6u;wZA-PU!J>}$RzBk0)~d2sv{);PVR!b?`P%~Ei8^hA|tP_G4-m| zrCyz%jep{E`xHl$+bXgj8ilHxoQjPa$ZB^w>}YT542BrGRS}g9y)`j0=~~j!Nh7x6 z6{?xFWCNReq%86ZgaYNR*6ryBP!nXDLMMGn(VU}0@=*I^wZp~agrA%HvCHO|wvwjT zCL<2wyI9JA%lv%Zr^c40^Y;GZytcRbpYt&=-pb3$R;$a|#{MS|wRG`-C70zP zg=9|`6}{)>Uf`wiub7jQccJQzgDp|AGC$Y^_bpH(B_@_2-(3xJDu^?V)wQ)! zdGQqonXrJ;rKs3)al)>;xp=5>eW$Gj4cieA>OpA(G_ms>d%L|Jse=mD@IgzL9_>WC;vUFW+4Mts4g3~oM zuJqWJxu=OP)Poxc)c#Cf46b~R>ih**LZQ%Io;|g0{PPc~y>ZRm#9O({oCSkVLm|nJ zxAuwK1u?8fiOMU`4C&A}V~d;Y8`>6TN3cU#&NiGK^Xnw7R; zuK4p%8e3EpfLj`zS=d+Ua-5Q#(L0CHnRDV4)jh=!8@@}ep`fQCK9(SLA@B)WAAIo8 zx)4C{slMC@y#Ch1#!ukOxxVciR(DEI?8rL}|>_Ga*cJG<7L{1jQD z9}`z(DZzO!#CS`Ui%07@t+e*2d^mCHdaUYnBpL`=HP|JSEX3JLjVf*V@&!$Btlm;Ps*e$eP z=Bp*4q)kO}Kb@wUfN+eHy_a2z6m)UNFdnK$@oLPn%JPWJcx%gJp;TCa!LYDHGf&C9 zw)q5MPzNA!cTx}H=DUR-m);P|`Bu|jj}$%j6)Uj?K5z%UXEv|ycZ{NvgH%t;9bEz( zPGMd8dEaY- zNVD0sgoJc+?O5M$h`sRiKxHr*KH#v9o8H>oezkGKMj8@!!bzM?OJ5Nna+mjKObIDZ zV{v9~_;j;62EhJ3c9rsc!azdv2`l}`eIHd z1tkS#i*|0uLvnW-N9keGg1Y{g@z(MebS>DDWrxhUCxY?#6`y(;u);QMVOHr1C!0Hj zTIn^#Vaw;NnAmxP?1?PJA||(1i-X1h_w+=8H)J0)ShZ&Us}q^qKxjpuE+$n8{@ngo zKAMgZN3a1_atz`AA9P|S83@u^S*@dIU}HcI?33))tCnMCP>9APx|jp#HpwxKF!t%H zC%3r_gV1!mzkD$>d%EO&wwpIUCOJ6Vt<{Jq$C$D#E342=BXMXezD#dB3q$o+m3Di) z@KaM!8|mP&Yis=cvDnJfrLp7fy5+yW;%~s#j?(YTa|0GaIa&w(%FU8_pDL}({CZXa z0nZ=R#{T`+u}|wY+|hG&K@&|n%A+$c<)r@EZSB#7@L4XXv}n4Y#eqxw-QvgxAO<6;m(xsNore6dVobO z(%iWqVLiUtJ@<;y)XmkQPt2ceDouM-*ZHiFU?cIp`Dgc&Pm79Rh_j(@ ziJwzkymsdJd?qtFF;P>?(ooqtzA(qf%Nu3<&D0UzU({xqlaqs^wwA-i#RZK?;n3Tp z3IiRJo1?v~q-6iVH9ArJn@N68f_>GJAsIP25h-DEO4`oeuGjsMwx;HJ|JmBnlDCNq zcgpkQ{nTOE+Xc87?KJJPB^T$ZDX5y7ij#A#O=(54RTyR5r!n&a0Kj;AYuUw7RZXp- zuD+CMXxB+2Pe$droR@)(m`p@xYM^PBsATr1vzeWno0(bYNKXDzgz^65tz31zHTzsql zDNtsDpXDdM7_yC~4A7%KnhDX;##v30-CBpX#_0HjkP#Ysl~dwiY}~J3UDB*tk(rV% zS&<{Sd$_waKkG=FP(aX{L87Xr>O-}gD@AvF*l-Np>5BpSLvlJ{b)EQ3k41;NC;II* zU4lI<>6&VS)8Edg8RUGxKCOE^O9pG|XjE#*1zf+y#MFA@8UXA!T!Vmlb$y;kM^{!? z+vz(u$-KBUdwY7Xou@|EAJ;+czTUBl0YF?n-$iZh@bhn16ZXzgT=~3%%JW+CMa*-ghjaxpImeighZgsE_Sva$WY5mxvzei6LVGHnVO@r4@k!$ zci-FIU#EDt<5r_*YP$k?>Y>Se#xaXc`ouiwp4VgQ6?@0Vz|mOJ7Hi*Up2NvR`H5AC zi-9Wc@9Hmq{VMgcAsah`wb0EXGa_>I=$)Oy(Mns6qWWSjrcP952l`@Op|q|pYG!6; zjNV`v={69U(e9lbF@-<|t_`dG{QP)!q`(m!9w=s185ATrqu@<=eYWPfzQRF8hm;-~5P(ph z#N9jJa%&Z-8c1YkcvkX|8m8K{H=HG$)W#w#y|aOsnRLPSxJ9;FUN#u(f@wuh#a3O- zfGlWzNTzphtJCJ$-2;3d9O}%_XX8eGUzP2p*Ef(v-`4IrKO0?v+BOhbCw^YC-~NTN zg(Q4ONsx~>Qd&w(mZqy0F)$!IoR0TX;z$QVI>Nt&%m`vMv+3?mm6z|cSz(7-Ui{Fk zBldt=^{f_CK~}l_`3W^07x}ErTuB#bJ!g$ug@J3{*n!@|q_waSfx|&c@pJEe;^2Y+ z5-2nyKfB^?8(9WEAGBj8rhf9-$H!6YVJL+N-m8t7z1nKTJ0*=&+#@bg*D|&1;K)^& zy`k^oN`GA<&N18ou18Z zUVGHM&bSk**$;c2j%+voNY>0Q&aODAcB1MiqPF$GmZK%Wmz+#tXnCll7R_tWu9~<`JwI9SDam zPX}V)@ZLn%Q=oROS%4sfNf~$~I91gwj3CI3U&%pS*vyXNLi`6yKC>psQn@9Ct=D&l zn)Lu6u@haDGCnRoF$Kj3eC_>9KFM?jCb^a|>E)2h(erh|T45_ec%k-oqi&*^Tp`Oi znLld9oON&Cjt~l4Sy>gvhs`Fa0QF9e?)+x;!CLBHOq>iGb!kCiU2*lpOooph^ZUO* z|7aniS)r!dyhP6^43`*-6+VcuTNI|te8Rbg01JoKvSLR=O;t_JH|WW5>N*ZKscmh| z`Xme#F2RCXByl^pBlXF>a3K-9UK%0pzXo(sPnP?c~xB2v}8VR;nXb5B4BP#caoRL-C$x; zkRTJdvbT4#(^y@F$h+P;M05<5_Ech-a%StSBAxyUP;gEIhrgQi7)Ox-;R6s`(dgF-wkJv~Bl54*wKszxxKDNT* zBf?+%urfd2X?EGO+Z4F)07s$A^i?%%-%!+n{Z94xxVLWS&k6joA$+@ke_USI zXGx>BLGwW)uy|A{Ru*34<6S6WB@{e_R;sH`&L^gH@y>mpt$Sl56?5JBgs-7ktW2Of ziOu)v-N5*Hc;zK}{gOvzBM^Us2B!jjxU5GkFrCc$Ami*WRgOt7pADj70a{4t07MF3 zH~m9;L|9lYvGUcWDF@6+dwa#@hQ-M*=FU4!#43k1{$BPnnipRk*zmc!;4}Wg`M^|Id5=;!Gk&KgWIv2poCOB{=j7^8@UXmeb$V@_TO6(9B5oD8k}pST^;{H{w<9 z3q>|%*YSmnxj$2`T0kL3`0cVZuuht;t0+Nd+sd!4?b)+ubX{GK%BG91%Xyn93;y!R z_5PYC36>Zz*HaL!c((y@BeO9450j<+_Q zJ_atPmFN`}7sugVL{Ql}5_-$aYHMqnGovCArlP`v@boMzdpn%Yd2a9SJ}D}ygIQOu z#8L2R5v%<{wKi1(LH-(%J=IB&gak>^_hpr%cB3mTtwu=JCvZ>@v@#T;qzF5=**RV7 zx8<^~)h$SvnsQ(zu0h&@!GlM}HQ0umkm$If-@hk2Y}T*eZ<_axVs|AN(pvEBWb*Efoot;qs-sWD4e**JWeNxpQ-A>DTB*{22dR(Cr`KFL6yzyf!ai#waTGlQroZ zMy$dRIv1LS((bOzv(nz#(&juIVYI!3Et4 z-CTZBh}UgrXXhC7W1;Fn5d`w8Zn?|uU5S8*n2?ZA(qK2<82HIJB5{q>xRD@De7Vzn zMl(q-8e{<~88_*vlwJJ#QHe*_04%jW`k6zp?dyB(avF~)1DB{s(7fLJVs6q(sl4ed z8itd(%S%~tYimo(cy&v$2kC^SqB5{NZqwGa4bl*0x>gFTq~fJ8=qf{o?lW_H@Fea2ls`h zr@)PVQ1Z^lj9+iWRV3KCf|!yJLB=bQ$J|v{7MGp4aj{;WT>n>|@-v8JVmu`!2Zuvw zU{-tJn^wcozaJjpb!jXm$5OiJ!GUM>J4QH};oEDn*;B^M<>fsoZ0!93OUO|EvS`eU z%@YoT-L)jitgGf(O|Bgwer~He(j;_w)@dBZ{G!rPKe!}cYTCto+^*2%jFXp>le70V zE!|-F>eNhB(gtV(d@9gUyEv0FF?M}^dU|?!Sx{OXy1GC0XKLe{mXQ;R2?3V;!6CrF zci=TSuoA5e0Eq}y+1p~h{9DdC6w6l0ty8YWVVIdkfx5a)E97;xmXC6-VFK#&&c&GSVJ}MPZ&a;uetO#^0_2|GJL}TwOMJB249AZZ9efBHsTk8xTHciuRxUYNur- zF8k#!$LLJ@tJUu*$1i=9Ongar~xor(OBZMHo)1---u?j-m6H)SN}J1 zy0pjkmm3%B?B>zu1#252oueZ3w(*%y;jXF8j{rDSAYJbzI=SAGzy8BA=$p`&a-9a9HaPjJQGjl>XX zPcCu(M3N_ggNwa#eN!`AzR{~&sIcZ)nsFnYM=Kudu7xU=&+wsHhUyz;m;a7F>Sr{h zhU~WJCW%LO*SG$dPw2tL#*U6tIyydnAiLk#ySKah^74{_o`IIc z=b@cU5!8X-G0-pWLxfMU*R}2}fZS(`!A|QpI~UUr_dHHSbd1JEq2oUkh%t_Gu9GdLwbb#(5D z3Qq=@*o~6$JS=8_Ax=rVjpO@y1XO za?T3chtDkgK1Dk^qt&uDH#gVRBA#MqJ!60kj7^-?(Zh$42`{gs7Z&HzGBeXtNey)~ zS5clUEG(8;cWnl1bh;JiLBQ11pXq-n4-R?jFaFvAUu_f6dzC_tTTG0il42GG^-otOE= zen~s5Uu5ogeX_K$lhymT4el4xeZ67fk9``Jl0p)(qhF`VFT&3+%E`$E;^G$Za`%?> z(c((`eIo<3tREX2D?vm|BqSiVOKNHeYGMY_a828WsPm+9<^$@@!MzDbwhTiu?i5#?_o%k zdeP0Ng*(rL(@lR?@+V0*)K^=zG}i;Tu2znJ{Bnm7$`Se7DL`WLFXVHT_x28Qqx!z7 z<%8u}%8ZwZZrT1FNf?$x(xZtZUK1eT8iN}!sWS9O^!OWxN=P^!xV$yC9sl=S%&#Ef zh$C-%FA-Me^v=&~o2FYD<1+T4_7d6aRH)RGRcEGrggUC8ci$}U?{P>g;WX8#t$Q2! zu)R{FAT1}4&=ac`tQT0P`ZlAVn5yb48_b6-dLg}Gv0>=A80c~65dtaMYSR*P2b*4o zUjzOl4wf-+0wOP7H`YNCA8!==_)&J-^3>gwF4rlxp#dEMOHqE03pbu*3XwfQ~HlQ$S%c~@jK zF!zPz<3#Z+N?D8|c(~d#JAjLNt@;!qR8pn00i%b^xHn_M{h*kF%%UhB`o)`nE?A5i z&eIb3(IGivXj5imi2kIPR?$-Zl>UQb=@Yce{JYei!e@}4gvC-(W#E~2n>w2aF?AKr zw8e-8R0^3N|37x=2mrGBC3(Cz+FG+QN&g?keo@LvxL^j*z*5EEo`TvSr7)^UJQ8-| zUZvh}-0*m+^Zkn^GShtFq%Z%$!Ov%|_wwF>@$zCBg0fdJO@<|0xp%h*76H4gBv`AJ>H}d4--JZVeLRvS(|dhy6>!Ey|H8 zk&nMEA>zfwu+B|=bwk5R?yl0nu+JISoUw8MO`o2o&UWYJM~Bfkg<(ml@N6n-Uv+rv z3@y{2+7;rGF{?}G`-8KCmGzZwMEB25v>ptfb8l~VYT{Z|FILg%-80jCS61H_|K;Q! z({0>8SellJ8%~|!K27xw76K_v{N29e#%LLHCf`2lLy`VxzZzTC|m0kF`U#0rrUku~u@HlK*CFzVgRgo;B{{yKt34 zo-E3@4Vuw5IK5MXgkj+!PIklJ)JgyB<)b0#9@*b99++vMPeDO-aIg=jpk`j_&Y*LzW47~VU^f#9G;a;O+`sbK|w)HZGd&TCDqpHIlOv>e)(u9;n|cnJldsi z+B|)|BQ-r;T|K?Mt+{rr8dw^Mu`ey@wX4e@4#FT&ubzN zIe8IVPy~b9`FV9~>xh!O*pdI~ma``OQ}MWQmt>YKB$+)K9S_6GMhyX$R(J`OxAzcX zJSsf;US*AUGC;Qs9S*xk7iZ4hA$rW!C4<{BGNbO3gL?nV&Aza+7hTVYU~lD`I@2KH z>G)`0s-o(VqDx;s1c-Iy{QbS~ zLBcYX3hwll>u?=bP36xy*&SlR%VQIBVYf+K0VDmXBr{6C#X7UC6{Z_Qx_{lOpI#oF zvhs3g^q7Z-hdTNC<~^D-hOqB9K|RerjuaWGYY0>H=g&Rg3p=}vbBugv)@&Q&X=x>< zBJ26==`4`BwYAmXFWVaf$ufvoH7rOZD)RdZ5$&gUf=}+$a@9oxSNE|lh}nt5;=*pu zZ!B41{Za?>E>R)){$C+0f^x!&UW~$$>?KpySS1BpfC`mgh6MkBM{%cM>~o@gOiFR@ zzJ?a8k*lou`4#{TZHdpkY^rN;S4wqdeC2j$-dkQKjwEAlZtRDLqq61=@tn!v!dupT z%l9`gUOXzhM=q~&n=ee#z?~scOwZ0p2KNk!+}ZN6Z~#q=jQqXL z8EANimPR~`ZAYCZu;#q1>gyB8F@T*$ZCbZ4JIgh!`CQRm8PT> zfG%7Fqnmpz^%t`KH{L=G_4U0)=J+sJ@Kb@U8fq(Z1!GmmcOE$%4rXSBMeWdC>Pu#N z+&|Rr=Xery`E=sX#tPErnr?p?%=89Mj>Of0q3=_Tq zJUc)&7BzG-bg5DY6F^$4p=y`11boU2O7>q){)DD2!i}P%^Eq1uHPea8Y5zFZS88Jm zqL!Fp=u`b`a!{>nINit&Stl?00Z8OrYzO{q%KlHTC!&`X7h4$lSE`hWEAfKv`Y*ee zJ4L;P>)J`);(OM%gi!4cO~ZctNa|s_!T2$C{VYL8Kh=TPdQ6Rd+MSE2t(;Rg8wik+ z4nvsX`wmZ>L{XDQU(aKgfe#gcLgBpv`W@qWFK^x2WkGzR>?uc!li=Vv-G|B-C4UPm z_@->D?GN|kVqPS9Jm&*&gSC=DzFI=QnF`qL{rASqQV7j&|1Bf0#(aKzOQ$v zZNb#-1QfI4RpRozeWe40Yqb6A#m8pdaUFMi@rDMb8x!bZK5NjT_QzX>)M60_qf-*J zy;rPjVI|kt_9$M>@b86_5yqUPR3%ItMa8|IDI}gGJly0rArM-2cCSZ87UPhiYS?b< zbrWdzSURCn_t=q8cvHClRe^RXZ>h*OZVcRD? z9gvuq%ie5X8YHjJudAzFJBhVxDSKgY@_S7UJyFz42A7ee=iZzgLN(RZWA#FZ#wM$y zEU?|E@#doF6qMF2xA9$lmVtxY@z8>K#}~9H$bASX;?+^E#^985p#FE4I+w%u(8MBW zB1q$hcyqFh$4acqfh!GMy==-fznl7hSbC`ylGl3LIGP`fAPjD0+S7SOScqABZ9m`3EE$Unp@v(NBz@VDgU<&~Dg_E&em zC0NXifBiy8a%sDn|g+;nX#?AU4F>I+$bbYNGvk7MBAkKqBvDg1m_ zFD^6cxJaaFUSuKOxd7X2dIlgxk9K zCi}~l-O6-nT5A3DY5Zz|!Y2Mv+Yl9e5V+(v_f~f|kHxKVF!)fP_qqpIpBa z>S&}Or7(868;Cra#Ksy&d>_r3xZ~x~bCYl3ND&%e%8dt)S-kfST_1Ft1gG_q5|CdA zGc0dU#DqX9%jpuVc=di;$GH1=RJD1G_Ra9~Ul6rHj`u-L9=&)` zU&TQs+^Oay$@SADW5Dl{%z8Qo@`D5Crq#o^GdD8Dq|w=r;PrK(msmHT&!Hkw^iu%gJ!(ozAmc?lXzXI+ubQS*wxEASP;VxD_=I(}^bDS-2Wp2j{~B_ytuVN+6wg(jdsob4uypfI@julN2-=2NvG6t4 z%>NYQ-?N*S*P~nzhn+;*>jHWh?E=}@6L$LJqXP76i$b#P9>vYL0KTjsMU{s`nd2X| zQgww&Lk%zJ$Nbbe0Zi;uL&MAuRV3@Sy?@yUYZHhK`}yPnOVs} zF|9_`(m+5?p*!Cm{g3<_`Tkc+ZDk(03G2MPtQ_Z8W5oB@oQC+XNmEl2Fz2mpc`nF_dye&Wr2v0Wz{r44UrOMWZGs`jMxPf#s&EZZ9e(u zqoQuU*XefU<&kAYr!XOih%}HCAzFqGz;tIo{5y-&Q`1xTx}hq2^ylH1*N&=cFbQ$- zE^&!qiC?p}8=nosr;H=z6pY`KI&m6>`(()YI%!J+GKL}}VzF^wN%W>r=F> zj6ms=`~qwHtE>A%m1QMhZ)gxMkc+n4bbN5Cxw(iBx34dImz;!p=mIe?fa)Z^Fn{m=(@nK}w4lgLQtG;e-GUyEpk$Jfo*7ZH=DKZcwdMHL z{|jEYv*r(}@$)hX!~UK409zd^r|6A!bCST3)zqr)hC06{wgiM@zAvm)>!0-_-;j3) z_p$3C3M<~$J&9NwPM_!$wZ$&c%glrJg@Vt5gIdca3qJB|$^mz3Rkxd2+#dY`=50+E ziQE9PmFY2q{Gf!&~L%Gl6qLVtj)INo6__?%p)Uz1~><9u(Gj9aL-In_jha6F6@)TxAwPx%-7d7*WDE5s$Gri`ktIwSo>&`l;j2(u!z8!6Q;inm=FyizqIN4lA zKc$8?DzU`OS1{nv+hN()=+ZHjt2sPlz5J1DgX_Fp`^E6>XKN=<8{hfR3mP`LRnynd zGz5~gH>;iP{pt8!iUU?(0APS=(;ipKuh(chcH_t=m|QVlIr`Oa zD~+la?^1>l$u}VdnwooQ8NBs+lr88-_!ibRKsviOxrKz(A2BET?bTY;YcfkOMFVH! zXa(k?DR6DJYTc=%^N-G@pWzX%#fF+Q?Ar=J1Q}TFMuzrbws!H<5-vHY%AI6WkqXIj z02iwMVnpmSBE$++cU&;@L-eQ~SGKiAQkDQ>)13EiG?~>dh<)26Ea48;B11HxipRit z$9-uk|E6GDfTKd9HUS&yzyM8-stT9eJBHrycmY+AWm1WmOkRGEe7PZ|vs9U%YkvkO zt<|+<8yOeOl5pD+svQTCT-?{f@BsU;$bzDL8%}YfdORFRkjM$Hb{t-TU ze5^Uf2=~OqQZ0)!L56=hFI(3eN3`%(GNjGcc33THbCnCa&dF)7DNe}luM~t)c&a)h z8DKRgjD!am_KBW3XJ11+>`P*$!9rXlr1WTyIw1R4b0yEm(LzGP+AXX)t>-*hx==sJ zqcne%v2smo_C2(ZAU5AefG@IOKV?eC5L9^*=b;*p8zHqwjrveJE3oucrc3{s-D~cg z?`7*NLVfcy8$`cZW|U?^#dEb;8ORHFc?$Ej{>cqP%D7AL=+L1<_Hpc?_I&9SDL}lu z_N-_|Go4+JiE?jt{Y_kk{#r2Mc&HY3RZ{n1?b-&QyKQR7ND>Xr5oJSK+xa}Jb+iZJ zkmNC-bB5lgTSi(wq^n0ATYV;MSQNRz*MVaF zpzSRfcfPYnkS0(Cvx=~rElKst#UTp++ta6CirK0ii?Tm!D-X-D#KnRULS2#rS3bYm z)(6*1CYT1$sMqS_V~Hy8tO>WZ`>m_Y+_s=eD{+a=nle%4*=1GPZd5L3AzH{WL`#}n z?Vq~Uy4_tHs4SqGrf#`>C&~B51(m`4&lJ6~+>q$_<@Xfs>fXn{rHBtjo&IcWlC+}( zBV<7~3|=NsIha&43#_v3c)lpX9;r%=l79Re=FoF^h_mK=J$|iNB|i1wmfBk#fKu-Q zq3v+ya5PnnF>%w9{6RjE!y7Ay2ifOiubnf@zu;Xp_7VYfzsk;5!thVY(byGR=)6`;bx;sWsv%QBzhfJ(umnfB-l!+{0GBwC6F?M4$?O}B;Iv5M|VQhMuEUSs{BTkiyFBJdk=3C-rCrs&ufAZ*d zUIlj8m&dp)eRc>!i@Oi@x8QUX_|ms=wvkZ4M9um1E5ssR{uS^htj?>ru;Sd_ol0Xq z(iL{pji8AjccM$8=9=Okecf(1REPOYatY1EPg38g(;K#3S|D4y|n@5J% z*+VipMS4Wm^2B2j?3*h4XaYDEJ@^#X;G()0i#wmgi&OwvU-cboFz^w)wrIEjvmutD zb4SZJU_v-PQ3YWNAf>_>+}q--MmJyXc$nX?rWR0pwM;ofp4H_viW*dV;#Gun^B8n_b)fk0i`ybJ$zm zr~()8T#S5kNdkT(WSsAtq+apPT4M5hxnC?==6e!pUr0WD5N?80a?HBH@IY6J9s@h& z5g}2|nx;_vq&0QtW~SLpp==jU1%R0=-Xbk!nYI-hjH?!d{$ZWq&lIY7Y#oq9-3Q>j`Sv2vA1f!|7#F*<69{anlPjqn8}7oC_I*~b6=ko{2D34As&W+$pX4ik{Vxn1X9KVn+Xy7rvD!W# zT&T9tV9}~R6K3(TjJ}Vl^0aJBYgvPn8AJ;{Jve_AhsvGV zMH$gnCC#+Vv?LTKJiB>zcXJVq`nUjsZ5f2uKhmv)bn_$rJwoI*d`gFgMGA;|Nmn7O zsi?lZtP8AuUZ^NfNv>`zCqV8Sh`K zHVqp-%z~_VQhAtHud1C~5VBtZ&{)?$9xP*KW#o_D)2t~DbOKZClKc^V-HdshS-?|h z0A!N(nn;9c0!v;o)4Y4P7`sp_de4%;UG*G(+dH6RC3BinVOjU6C2L<1FwOpCJw8CA zPJBXZ)pzD-`vzXk0LpI5E}r#=mV0D6{n&vh zsB6S(fnp-$6y6`Q2a(fLRhE7t`KD2os#S?xOBW7VtOF0>H!$W~6E=rnDdf&k%cQ z0Yit!6NkBy3huq^r^eGhi+}haaK96T(Zdokg0b*S%W7ayZB=6MERdr>O>>4xw$E8J z1`>QxR^!_w?8P+~FnZXm0x0yD_VJl?N)Bjk$V^fllUraMuei-m_?@56tr@K$fTP<7 zDCWR&d)y5vp*;ZrJ=DJ^20ulPL{NX;yx7p8Q9$+U2)^Oz)DJ9&*WC>+sFv5-ef7y@ ztr~q};Rq0TK|W5%5Iqrlb-l#M175VMNdn)0Jp?c?1%R7mBWfZwe=x_M8?+GAr@@mt z@GF=KhrJ)SeH{4%KN|n(%9GqejX@uIBPc|)w*Bd4v#V-_+R6HDMOnpMjn2(`=tWY^ zIDh2g&d;Y00}bE_-d#AS=(IgPRPyh7c>$ERgcfX12#zKc)H*CT00`27^?Gy#0}J1B zdQnt05|~`{2=IROrH2+35Vji&32G?`d4Cm=0b46ZKw@i-wOU)U9GL&g@1+ns)_wTd z^MHEBEw`YUFwGdDI;#h7)t{R46o*e*M+f1o9yB}o1s2s%(lU9e&6K)L&~MA>MKo)2 zeyWJP`rOe!Ml0i8br3TqsxKxb*^Xb~Zv2-|(W_xe>$sf>EM3yfDK`qn{MuK{N-1xo zwZ~R&2NJ}2guYk%AK5LYw%x2Nbc>SV@*^o6DKfFr@#3ms5#2ZAxvm2{&3Q@gu6Q$c zG*;3V+RZ|>;R#3`EA+EQB`T%}SsAb|_xZ*UqhexQ;%cCn8@vus%tYA+6K1BTR|F5M zgEs6UK(k`??`FgUnzf4s7qX4`MZvx{B+(~yZnrhp@t37b&=KFMiUz;Hn=1sn%Edyz zTDmsvp9$21*P;g7p~g(-d@Vgy^_;uG>KPB zPRuD_9qSwHL5O5)DIZ^xoy0K!1(Iv>$m2DO+b9{1e_g$Y*6V7@(d>q&)PQy&;fp1) zQ3tM>>(rEedya`RGbPfxE`U7S#%Rn)t?|-AlPeZpH9n(I%Hx3;IbH!FLQL3SJlRV?em$PbIA#oZ3(k8N#LZ3)CFXD!Bkd= zzRTmPHr>kDC3YvBY1lrL0)R}ky^FbOzY(#M55|Iur#>x z3q9COOamD4&I1kS6Bf!0-N~t$BwGil(r9T6E?^povl6ZP02FJ3G@C&A#l(sdVwqoN`F@Lu?`+T`zlll%3^efV*uN~&;#XM~BBWN>XgA6C@_l|IOUw$v zk`RrA7Lztb8Cd!UWBPK*#@}MexGCe^ubFJC8i%!zrR$zAvhuqp5+#>eIECqr1}zs%2AeW2Ak8O_s~J>n3+& zW_(wXMNTGTR#q&6U*FDzf`?*cOZ#cT^|E<~(|RejI%}7TyRr(W-ur<>jkFlG>-3zQ zdn%qa6D{umYnRoWSYmapNJYXq5HzzDpi(myaoRr$40ERxk`>l8bQ7FswUz%&rz zf6XcSjZQ-F$yL5|v5Ix#Oyq9cZd=JjNoR29{hhxB@pfuZHynkG>M2W9ozk=99;3EB z+YNh*<57Mx_VK3T5?0S`Hm82Svb+Gc6vw1mFz+W690S1%Sq(fUCCG|lT;KcqZm4di znvfD5=S$Q00d79`SSv1>nRwSUE4iD#$UkZy39%Z5T8)J;VMHHG8w|R3oVjtY039 zkV5X;hA--{G*u>jQ*(0#|KK~X%ND{hrUHKQil|DH)j{sRJijgy)21;iz#kAu&1Mjl zlyW+|%nNcA?Z`C9!v(JbsG4CT?Ol0zVwE!bnZuJX+N6dnxp4HP;_$b9Kd_yrShm*s zw%|$ic}a^xETTWdKd=kDrYt|wv}A+52KUjxO4iHyX~7v$uDZj`^DDGWU@+q-UnF2a z$KZ5$CyxzaM*?a%ww#cjzjTDUF0oJ+!We_-cRoivD~{C>)Z4raJ(r(Mh&!G7W2W3^ zbhXmeGx|-5+Er_KBCC?)w%PeaQt*De33tZkhPkrKfmL*EWNp=8r&g?3Kv9Q%X?r@O z{weVv_@>fEl3Zcr^QQANO=h=LS?sIpe1p4rVYin80|Kx_b67w9CUDOSEGG?He3X(3 zu%mQxXn||Ji`0Q_xH0sOGKK%%vn;;tP$g3kN2UtU_o0unq;)k(#A99yN%rfwNDAn6 zDL;^tOwD^#bMbCFhq8Tw^J}2GsQc?IdmAbiSAn!_n(qcXE*1baEg=O^rI1M$EFk?7 zbMxq$X(fw)1&K30CT-=C0x7`9(IXM@a6Jxz01+BhISJI-^KvY4wT}oab!^(o);Ya6 zw>UeNy80ffeOT@@SsyP+AnW4+(z|$x3!%!-b$i9~D|dfv1>zzre83l38;1*SzfpTD zwX#oJ>@c9?@Kzi-u&OB0zi=Lxzb?5cD2XF8Gpx;{Y#Qg!ihYBFb0hlhdOxsYs9x8? zI--xVj-sU`n6jav%60E$a%Kx)C3neZ+ob6HqhUjqc|P9DK9k~@$gxPR!%xdlWahp3 zT1*Dcc$UT~Uz@FOntDRW(~9rDjkgHAV$&Qzu?TR}52C53sbctMzh#dU;fB~V<>QWs zpgnbCY)+p=d12b*tD7#8q@!N5@>(PEY;kNe`C!XY4vEkRQgBn?y%@d`_RV z2eiadf7U>(w4_($#(8}?h)$BA1oaIit)_S!26M;)$wn5s=~bS~Z})}^SMDMLd#iJT z+%XME+1IdSA`230tXx&i!D(P0G^Uv5+vWGo7fZomkkz<*wMn z8AtoWi%7$VnU3?X=bp!u_eu|^+5T4#23L}>d8ym`hx@ycj)$ue z|9fu2jw}8SaEZK=1=Bnw<2DDv8X>M5l1NiUcZlHlj@P=gsE)sdoT=oz(J8{&FZDj!P2JELuso-;%+att`<-D15o6*F*hCo7l(QBc}%?Ml}bYN zd4@6sB>RSULx$^a8-7>;ik6!Xp;sJB4?8}$?;q~OZg0AGx@9V@TX#GHP%R5$zh~Z1 zyNy6A&G{_y%HE#bZLkj9sDhLu4Nn-I7o3^Yvd>G~FD?k=+IUo+90;Is60;0>pi?3} z#XN+89f70Zr=j|8Y|4k_Hk#&j{PSO5puQ05T0AQ2wi$4{qVzB(O^;xe>W%C1j!OAM_Qud6#JlFO*qZ!T!u-+^AHFkK6 z*zp?YxXZf0uZ@K8Rd>|tu}RPUTvfnDalkd@;~wk;L}J@{OKLT<8-L$D4YBT zRZ(??=_`M%^meoTh(&y52?qda-Mr!YbRC+Xs3UPnIEcgJEW;vPmtm%G!1b)tZ*f)D z@iBS?7;G)Li?1j{Mi^BPi{g~H%ad)F(SoRtM*@;#DcUFppPlsO;`<0N(B6QVWQF6U z&W+Axk~{Y<<{nT1H*rgM2Q7wo>s9{u3)v5w0rw+w`*T+!SHmlABQ~`C(h(TY9|f}O z6}t21$y@KI50dgdnnUQla|$=ufy{q6F|8Fe{RR&6l*nh391WkZqu*_e1e{daV90heMAG!5J-x6hsm?vZ)v zJr;SB!H&nnxd+o3(^?68&<}`f;2q5oUchyk*xgjXNtxk&568p#;eCB$$7~PQ)v4Be za4jmUX5aCxN=^rBLBi6*fzPe!{Ypc}CCv)PtrDJJ!7cY{cEEi`c7DRiU3S33#l!AW zeuw1>UP9}n;T>K8kp}*H`OlwlmiM&4phnAw+ofB<#3n=8DmbbqQeN*=yq(Q!GqTRGEkDByjVmnL>| zZ!tUBaXV%Ba1mfItG9K1cO5T(cfJF!bb<~6Hd!2GBAmA>!!4D;07fWez?AC;WTn4A z?!M64L9I>LrC37hHgNEho`Xz+E2sLCu?4`G>bQ;-3k@&3t_j$XTpBP zX>6<(1$@{cb}-*J(Q>4|`qhSFcZ&$5mI?%eP*2m_##n!_u*T51O{4=A7@N$r z_Y?{nEw9qG@ZKQ5*2GDD<#M+3F;+ziN6svfu?_X>%>B=ka+BA-XzqBz9- zuewsG{cgsBtEgJfuJp7%>A!)&HAeMir9Z(_x_@x>qpH8W5cO1Lg~iI!sOcWDXvkVq za;dS9jmb5?n>+H1!HP3IVpgV#@P9{_BJEkY=^9tj!sb8R_@enNYn#&FPdomo4U-tg z;{=wyV5}O1(t!4rr9+;MWc$dq(?u!dOb5gqzume~?aT9(S zK_Kl|;g=?S7J`7|r-yh;ah;>XgZ6)K(U!VMapnYG2-@MBWz&~2EVR!4ZkZh_!~CYN zZck{>?&so%mX=*)efaw>B>jBHo3TLFR}W2E(^-*A8DRY+C;D3+BhTpUg^_m1p19|W3ToU)$oZ0dqZtAGJ2@+7nGhVcNj5=iM9j5k@)X07w7MMdd-|e&9NN6~aKQ(j z)L`UxK2Y;>7z%o- z_F=bHpDL@FkR$azartcju42z7NN(OC;#Cs}!7l)#cXO%fE?Xs$GFQhPpC~n&`*sil z17f|+{;tWd>N;8OQr{nkbND~>tS$++pOgvli?(!<4@c_2#H5^m>AYB<%1zi2Uj4MX zilqn*n!Xf3Q30L};tZ25Ig^Nq&+A1RZZGw1QOtRSR!U@?Y~k z-xloY2BZDXjgknGyquD)G`(a;Y$sb*(ogt##jw>9BrLs6xm{-q40>sxN-8=U0Qnx5 zTJ^3ERW=xt{ozp<6KPmwvK}zsdsHSXCw=+&%#o{|_CC98j75Ev_jgh^;=blC2wS4k zH+?DTFk#CDaDXXm31Q6a2?(4_!P=sVNND-(5omQ+RXfFE`BrZZd4-4hrtC`>QAi!l zHGU74$+zqZJO#Yd$djiirL(H^Z{iYoVQdiz8@L-EygWY_O%{#{lvEjrYTl2$QneSH z_K5BU#|+(BTnE6Gj}D`jRK)bZ!-<7~a1Bb-hYSBGKoRDW5KUR>&VqD;(!Ebi)NDoZ9SZhNzKbeCNplrrLHZvJ7_ z^waduo{5gu-wVSJL765OxI!`$VqVv2br;~w-wFo!j!`L^M=2;39>{?QmPp(AT*r*D zZ>alF+_BlJuH9+Slt~}=R&?rVT*9EUaUUR&&ncd9=Nu|f zW8Mbp$NvnjkgrfYQGB+EA2ZNnlVBRl$bC_Ren5&S2NTQTV|trQDs=$E4gMzu2zi zRV7}rE5+fK&>wy$Gx2zu=N`G{VeECh!+d#a%`+{z){Z4wuI4d@RMhPPFQq~Q0ww>Z zkGB3H{{t_BzjJh&4Rzr6wj!)|t#EUzaPN%CA$d;p()xLr_aZ7qeVzG~Xmfzy%?`ix z*`~Nm@O5WLj@Bqi4rI+J2QQ~Kmn^sT2BD7k(t%Md-*1+(b{@+*7=+1;BZA{$1Yk!G z{PokU z6D#)dm7TO0>?s?b-zy9Wm1V<5oOI@4x7j)?bjbAZBuwkWpAahV_sCo?vN8@R8wV2` zcmUKuE58L`8-gEH8m#%Dx(kHoVl9z51|-?%6==MCjn0Kzf3 zdSeO1kO;Qu9-lf7YYC-Xh=o4I0gfVeTZAiBBDGwUYu1I}2i~W4LP95ATU+D4| zo|hT;6<_~dMx0JA>E=8$d!vFhSZ)y@gp5f5zxX`>$bp87cU1lzH+K&0_sd;<0iK>W zN*50I5&B!N%-TGeAkH6P=kmsp0G9@?JUy}!L1gpqSbHMa52EKn^dkUNUL^MlNk5;`Q9vCtuNro!wbQddqi5@X4%Q%NOT+bxQAKe#qs6ey6v%y zLGHsY_t~iD_hC`Lm0C@VYsoJh^c9BYS1^EDqUfS8@`Rg?m*;;G?8M?IJz|B0LYr{g zH7cUeLiRJqxk;AJO;7JJ#yeoLD4KC7+a^TVFsq55--)0y*pYNtr0IC9WR<$Jqnzhs zcDA;6tAL+{`yTu%LT`{84^nj>1k`z*5zU@?>*{rm+`AM?=;AMuMy8Xsc=;aC>|SzQ zLCyi|TpF#Lj!SBNB~L#Hz2{nLcREk`c2s^WCe(J0)qK-LkX=43_9@Me+SG2Dj7K!z z)3Idr8#s=`{S0UEO;g&PW0YE-n0|UY&d{&szb(LI zv5+E@VSh73k6N}Jt5~pfSc`;E{!@zV0AK%AZd~Fqf4gCsh!Ote>|dx+*j8d;8b%I2 ziIQLEpFw?rH0Tf6y}PG%08Cd#bz*y9V{CSx)JD93m-SiCRg99>2GxfbBt-{5J4S!y zyo@HuU9Sdp#`HhSc{#fGn3Y8QAY`7yyZ6|dn+N;V?!7&+m~4X8r*B+E82K`P2%N?C z65Cx%c;5>!zR&Ej)DXar8M*B*30Xl7kWN)rC!3jC{>eS`tz2}FZVL%s1ZgP`Cv>p(=; zReeU`g7+XhwKlab+|5XahU;&WGot~e!zcT5`O}02*6=v3DfJlEXoYWJW#vMj?>QA{ zFGztJKpKrXvz9@oek=%(gH(&mV#PEF_xnk;jjpY+L)BM0r{k^ad{e}N=7MUeD&Ow^ z15!Y(zi#I0HANY>5VyScJg_aXCyOnNe8Mbo388V);fO=YP>D;Ri>S0H`*I?$ZP~dc zG%K`irHxjAE8`JG5r%sWQGp%&9Y8;EG&NYWS&dmX2W%MaDWfa{SI%zChW13)Nvch9 z3w6`bqZL&~K?a7v!RUkaGxfM}K=adU(hY4585b0l6g71+O|MM{eI}D67xfewIkE<( zoxXFRGpJU2eL83+HR$xW2Id4>AF?*EHvrMyts7MoHTDJ6)107%c;>*Eq(Ctg5VcoOk0wBV#N8Lsbk{zyn7` zM}_PiacS}0?zZxk99foaKUYM$!6>OB34Msb0VECc4Gw+|mTs2tY_vOK zS213ZR+pw@rh~f=o@V>}_Q6vT4n`^07!lySOGJ^mVYvcdIc`eyroQ=$J750t`;VUf z{@u5UKr&*XH{^2^Ab%mV?g&}|gps?IcbX(4>kAl`jHpZQWIMD+vaNo_+RV$`_@KG5 zr#{fB5TCue>clAC0V8Ujo$nIK(#_?qy+o(8Rz!HlkyF@grgy=BE+< zIZzl2N<5DotU?5O@zjgxkYWpyLl!0nO$|Mc70t|z-;M~*kQ5VRg*fJIEPp&beB;pm zqYit5_t}LyJI3_1U9Bu0G1j-(B*NAJF)<}Km&BI(ljl!QX2}w`9GCzLX_h71-ktdYU+{n}4yJ%tR33-c+rHA&`eys8zf?6Mq z8URFsdexUtJ6QX(>g(z3nAp>H4L8Nv_2*qJtHFMms!Cd1FA?d@?k)+%`Gbqok9gA} zVdpZ(#rz9XeG4L{w7aEl;ebnsgc#c@5EYfQu?niMS_3R%Oo?5Yy`PuSYHQ^wB_Tr= zKy!;#;?ahV=94FnKWChBYURW7qJCQ|cMb5V+%_#>kYb&rxRWb~gSvZ6vOhI+2XMON&yJ0dATj}G1K`$7W>GLpNXp->Pw^yzTV#i)>c6$LfMV@*}n zBr2?OwEr3?29e?F^OTq>JL`ab_F;Q0{fhJE`#aA09Ez6a1W1dBi0|6zoRcxIw)hN( z#d3QpzauA9;@OmpWkdwwBqGY6aq?9>k_adN_K&~)?$5vb{P&+f{pRW2FYf|HUj6hc z623Whgg7E!Wtm7p6v?|lB=4li^@m*RfD2jPi#GuyS85%>Gw(?61Mf^HSATeU0A_%ym5ouN_-EKkd&yK zt?ND0yZ6vuywSkM0ANR4Qk*@n%GCmJ5{wWqlXMJpUK9M=Wx1<*vYL#QEg2{=-eWB2 zcz~mzjG(TQT{vPE{)jJ+-)6K;&?%bwnn2dr?+M2jcNc5xX$vWpjf>6Txk2H}XhNIA zVPs&W<}S_GM3|S_rnl`#)De{}D!g~ux?^iePYF4b6q?;V#9c_inR)`B*u5L62w;Q3*D|$*9UekD%?qk0egU zmc`1k;j^Y120N6U`Y4yyNAK6gid zM|$q$7TKDq8svx{x-b-x9RV6Es6C;;Z~!1DTnf-h&|#U4nWzQ2HoAP`eFRmLx}b!3 zP-;-$nLa#8nT#Y<(^lIbvLDZ8-DbEgwjy?$KCQYtEO)f7w32G(mFPuYzx8;lAceH{ zqyq`0<)kT(9t%JQ&JEzkp*mDf2Gtk2vqeQk@viXv@R3U+apiHKIe6|QP!enev=mfj z;AJ=MEkuSXRo^!Bk92jQ48B4#ovN z1^6r|MqXQ}~iCVT%&~mpEK}cKrR*tIupL z>6f^ZWAftEVduJJruD@S@QEACk3HRkL6L+G+^Tdc}JL9+C<>>g}J#_H;;(hYjnwB(&whwlmHP~rDp5=8gZF%+? zcOA(JK941EQhTeu!A>*LO`DiqD5Y?~En}qb7T>cBcDeR-yhB{`MbME*aZW|#i*wSsjZeu1UOAb3xZIQ+sHE2rK@XfypR*H)0Z}rhPhz6v zy8z|SIEj9L|DV5q_vi0E`Tmnfzj<`~%iGsKzm6#q3FVZ0AP6n5Ry6yGkuHObBO=r6uqQ}f87FZPECfjf zNl{5r5+}j73C$1XYn9O_ii%k7x2&0|XZ zrfaTSFb|K86v(6#3jd-)Y$AI~sP;1S`c$Scby zl_ybCP=TZ_kG8C|Si4!1yg;hKYuuZ2TXLxrFOB-g(=S{dW1VAT$I#V~96WkZOj3-* zNwhuoSS%M#md2uz*U!~c-nvb~iVZexdP_P^^UIjbi^VC}3FD;jUvf<{r2s6CHhGq; znr!uC_3))(ki;r#WfS4oQPEJzXwHC3neR6jbWBD=1_h@Vhk{ds!8{gzL1|g(u#7Nh zWK<&(C!w2QU~UrMgmJQLq|9`WDLIZRhbzfX7MeS0IMOuG9KSp+NFlRZvgtu8C6U*i zhZv+}sALoIPKV+FcOVSUY|kWjRZmpIu!^sY$N75^P7b|3v~$l+LG>-@E`YO0oP3GS z`@6!^1AW%u6;v=l&R4k87NkUJ*_{+&F&s( zP?DS@$?KHlSy1vj9NNm2b>|}2WJ&H7K+r-SzvOtbNSu`2v`I`_N)B7&J9Qm9ny;N+ z{Wv_}D6fgm^;vk6jE8&P-1x(xu5+6e`1gXQ=FXY1M?5&0v@rQTFe68vTbo!CIC%h! zaMpaxkL<1Xp~n^Uyo9)nw4@Y?lk1Bg_O`BVQC5DH5o~UHczX0bL|$Y47mf6cUv`RE zT{bb`kTF zkAzn6d2Cpw$SYJ(OiV5$uyS?b1NK?mIN96&4xxmfg!;yaa~!yGa#md}SLVjwRu}M{ zL`7M>Fnd5*PL4lLnmR2`KRvVd$@0t{9c{grmUFv~-SRB{!1BV`*6G#EI;qB*i;V0& zC`%7__Sf&pd6YCx{(@dG_h+1Z6`cIv|L1@IumrU9w6Z#~niiW#KL{9{hI$G-iMVChBwCA`*xsmn>oYHruZ{R#N8_4d69ckXkD$4FTvd1&lQ+qq%rOWM9xeuBH=tO>>7PbZ9_EfSQgPsZKj=cHkUP)L8^h zR!vkv%YceH`_OYMw&-q2s7z>_Ypfit+~>ECE||z`2Z9g4@xWi9d7<0Qwv+Lk9x)za z1!0W~jc}K&)+{AWCDIXTXm6NQlLRECW2Qsa6j~s^J0I03z9gQnR}_YTo~0hNd{SK! zsd(Xe;TW}=mz(94XikYQj~C+6tDUSB6&J)cyyy%$5zCm4z=^9$Bvef z7H}C1!=vR#Nt_JH34x87ZJB{tfm;n}SW{G2JQ#N{G(WU;r4?F_f>07CMJNyHp}0e^ zeV6qvQbl2O6b}^hO$3cKu%Nww`4vk_LS0YY(9uv%QI2eCxUzqOKT?DAx^!F}(8C>O zI})oC^Sbh!f}KcqgP{$S1b2aAo9yEX;8avobo6(0i*Vbly_sw@TQ6I9I>9MNqK=R_ zSw2=?HdH3BO!twbjAUdn&POm(ZOzP-Mhwi;Z7+-0=e2+ar>zBo)K z@PYOxhb^G7%61wjE!-^Ntcvjp7>VSk5@;F607n>8B?Be-J^2wu5j(7QkOAIqk#6Ay z;dL{0aC$*c0X#{_d6)V&`p~B-bt$@*y5zSnC_D@hRJ+37LIzHPhC6sWz(_H5G9|kY zG%dL{nKyAahDzk1OXn9|Kypa^LO#;;p771jMc+m zD%=#wl50P3uO|6D_cTe4Q<4g8{e~s{SChmmfV|EIN#vLVp8BLHyLl7&Hf8+*ye227 zWNhf()_8Sd@RG8UD#0D{&W@@18AERS0_BN_R)B@-@|A^&dnLJJLEafk3iK&@J6w}u z+w;;#z?eU|@??(%{Sx2jkT^H~9txCY$;Z2mEl8Y%jc3-LpIQ6Bj*XM-a*9wMYEfxv zc_`;0&yv;oXWh-K+&H;OT55~yzNEtJVS8&232|DzWn^@-(`Q)@qvz#C-FVPRORGkQ zwM-1ZH8b{hR&uknlq_N7yPsYEl$YJGjQ3wM&@;owySt_?O+QA{PLI#MYiVYO3-5h6 zcX{?Ht5VN163S!=oGi*)hK(mzKFCh1p`SLQVpbNO6~zlpHLI=;fs!<`Z89+qJWXBa z6K;7<$TO2&44f2GRn;*z^wiyEDkr1BjYW1FE7UZ-Mo*Gls`mE`HGNlMBX>3hUSHJTaPlkuOL8Wy#c=crrE-Q~u~+4+fE zhdshDOK#dEW@{5R(s%RBODgzLOlSr-PHvKuRnpt(YGUA|Ag4sasf2`1OZ{2)Sp$!BdzC|iwh)*<$lO0WOtSvk)FPI7s$lI)a2)!HgsLjtPnE0+Vjl2nwokVdV$TN#>7= zzuQRf+Uc5_&=VD0uvvvGB*wx#6=jhnv%4VEOl+>8+ZoA_LV_G*n6lO2LW) zshO=IrxS|Fh*eKkgUyyuk${)30HE0Gv$y4V3!45}IZUbxbH|g6+Xsbg2|o z6{$I%=LeBF3dSdxk$^2Ax~96os={;C?snQu&IS$42!!jyb}%w^jJUpM+I!nW1>qJ@ zJTpf#Tq;R<$-?eJ*xtU@?&#%6a&%}`D0Bg;OXFgrt*0$%lSdUq0Ug)R*IPQ%ACQ4i zd=h=2Tj3Nye&0l2hFc-4F$-ZkIR$K+(KhHZbR#6dP$W)*Nr~LYz>g$OMioav$$=)6 zwQ0*i+d#W!x(2l;bhKNz8zxOzCE24DM~7Y?5|SL4fs+Qd22fg5Dri+XWg52?v=wlH z_Xh4Iak65p0yP@hIQE|QpuI?)K(Y4+?Wg*Bn;QJ<5#|B<45vUJF;ekBGoo97J|B!c zNK%7WtQTxVEdy6}3vmPFp}pI2KE0=@9*--IV}z7%+qEqyE2wg^vTn8x3e$I{Pgz}= zbV1@YRzcZ8c+AQu%2bV3G1hfOnYGZt?d$E<9`yH(U1qzGV(VGyfxd}|(Y$ZtX@ll9 zZ_}f{FZrkVgT8@M#U6_#aWXhNm`c=hwy*nSw|5Nfn=`dD1*L`Us7Xl(MNyiCJ%w0% z&G(sOotIXY&Th*VqyVTr^V;&bJakI((fQGEFSr^swR^Zb+0+)!7BCQ??~WuKA;V3f zc&Grd%QwZBD^)B@so)VoCaT)Jb#udf13IO8x|;fYK}`IFM<{Ifiu5AC!$jmqY}vYn zoOtM!=p{tG>1v)IBykd~XjflXlnsf}nTj~*Zn|Jvn~VC3s5Cq02N*cXj_bHENVW4q zBZ-sdZsvG^l=PL5NQk~0Ac0nmDU6{b@ON&-?FRbb6YoP3J&Y7QBH*xtQ3px#^$hof zQ(%C@6NAJ_6-||lrVNzR8wQ%QzcYR&zxs->UmZBL z(Yt=K_rxhA3ukZR&;IN$|JT^DWMu3scSfB*;w_jZ$&{^(&{ph`Bo~yt@y55D+^yg6 z=7(V|0>U?UD?4Q?3wE9tWHoK#_A~C>;TRv?-q(I*sQdcL?E8oJ`(oFmxVUm=>KMwR zvpWBzvS?I+AWBEOEZDd@|8!yErm3+Fk&35wWtPglv%dJj`r`Y0%pFLaoEd#^a^)kA zd`RM?l9Kz$6_kgB%cserSCxH^k>y3p{T)|k#_pdw{&82+iW=cRQdKc7DOf&roC1WU zsr$Z%VsR}bCAX#~jl%Yg7U3&%Pf=61)vb_lBrYyh zS$1w?`NOWpH7yMt&Qn4rJAD8;4z`2zww~ImiH#!V;{0jYxHNSy!22jUyYpyN^YJ+< zv(wV_gRp=!909v&lX7HO>&D7Q%QLq~oQw!*3-F00lu*LV)UUhsO}FF+-)n-WL8l1qp1#Yx5jlt1Gn zFHZjTfByQrzx?itAHR6^?X$aI-NjHT947_Ml;k^2l6Q6_z1WA)a8|}jkwRFK*B2?o z5h(;G8KJGhr%BT5NHTDe`+L6T4$b`Td}Qf?fMIX%VNcr(hFift0f?i(aD!sQy#af% z&rV!c91L>U*u2tg?Lr%<&c4oIhai>&Lz;n;HV16LZp5$&lGl~z8S06|JHZ<)4Y(Ir z^7*~_yZ7%VaT0cc$roM}4#a`C`z85Ni8@)PEJ#RR$X27R+Q!;QYNu=Al;BjF4V5*N zlWLRj@gRX&fl~5p>q|^ZETtv|n&L>}5z?{(L)ZJLcXC}a6do*9AnUyDJdm8u9OS|f zC>ObK63SLJS%vrR^P#Z_n6aR%02_YZ$=+o6Sx!q1Y%J_6+`OG8dP^ruC=4>&`p;86 zSUOy)q(;A>ciHX&yDq0aM|LyaVrC9z!0fowTUT4b(k4B6nGKnJ=ctxp;^d%Eoa`<@ z+kqdY6=|G|EQ*AZ*G|=PO|MAw!ih{liu;RIbyV>u4kuqH+zxz&0z>Rmme>SlFj=sz zCR<6I#5HB$Wcg@0^$B98#>9dCuB)J?;Bd$Ra2wPQln~%Fvn?~LBP*jVqim!MVG#_I z;51sJc9`sdBiSD`rfW0|==n;zM!L<*&1BiCr>eKujnY*K6>VQm1C6* zU2^c{8cOIp2B;rNVS9b{!gkuj^~MOBB`>ir0{05f3MYNRFj`@ZYwy&Ci{Q|Agvl^= zK;bpEvum_Td{c6DGHe7PaS|Q{K)z@@+}$gRhAERhCN0NXde8Qvu|}Q+9epJB2%LgD z=s?r~JR28qGOIOCdJ4O&UKhU1!&IH_x<3(bZ1!o$-&)SV0zKazBWD%CkIob){ENopW3PU7|lv?u+! zXkt4OxNlTGy*Q564y~5u7PJcJlSZ?CeA6?XnlB%O^kPKt;~xw&MWSi%Qn;cdIO}n=Je@RI)N=ed0t)I zO-zuKsV+ax!nzM5f>J~|m}z9_-rMmOE>(JbDT$K>*$V&{(6&{jqalImAfbU-xfv9) zK~a~cA6Au2SeV+8IJvR%G1&-M5T|S`KQ2r-|ES zYI0~|=v@q1ZFNhwR-QYz@6pq>)zfuKOY8;0TAIEoMmU>QmG#8wNtYr!cX~9{UO36! zzXGcHK@NM( zlecV$IlQ4kh08OKSz1lW?C5oMV!CTy*2vnzGn64VCL}|O_R`8`r;l=WeTX_YHSQRp zhw?Fz!@M{tDQPe_@!-rF(zh39);`|4nYQ0lRrg+GtxJMZ!V(Tj_B=`)_4+eT{)BTU z|N4)={`lXl46fgObo*Dg5mCM(OS1E|e#8ZmLKgcF6x2#)*FmAJRF0ho0zs0?7s<0^ z)7Z3b7Hp({U&nqacWv_>NwFs$$AILr&5YiNi|8pn7jf<7W5UkMY@^V znVRk~HQa5exl@x2Bm;nQO* zeaUz#Ju^KsJ2NaghFl?t@ul(58c9`2yfa3X)Rn-_hf`eqT}p>a!BTp;f8oO5?tOIQ zn7f!aEH+?+5bS46WB@n-?-UiXB&j}$q~`3VY%tH#>eBG>(0#5!t|S+OKnv(v(EeHF z?aDwpsWqv1A|4pG{;B@R^2ZWU6d^57&!Nbu&p_KrHxuAw;XomIuLIEsNSw^;%0t_M zA4!~yD2#xTgQ}2?32km}Z;l1jOjePutgRarG>Dsm77T^~G)@AM)y~$E1tVwhDQs21 z)pQJSBysZC$T8U1w$|o&$dNg*NPH8hx}lXJ^tD&K7nsLnbAcHjm=Z|ir11`5Mzjm6 zNq+BJ@qS_(j{P$O~`1~DnIBk>d$U_C*)R5rxbhH;f~un|Vz zPE)$R5!n&c@vjeoQ2fZ69E$R5VM(q@hJi!7gjzGoM$0yDrCxKYTB=5lMu0q&*}qF0 z8aAytO;L^Qo6|DTqP{P&VilrGqk)p}FbvELgpDBW>+OdlX_zwJV+@UhhbI*X%{fa^ zT`{3Lfo#~r35Rj(!C{##nd}}Hpb0rGIdn&>D8K`R(bQz5y_AwvdQ&>u4$^(HyP&_o zIoKJx7@llK)<){vxn@TKPC|j(H_W=O+u(gtOwaF^>g(k zPMYmE!)-#%J0NhfZmte@4fJeeZX}J9x>}%kXjjc-4f)~A(9RH_g*(FGhy!*t0@oMy z6;WRUy7J&}`niZC-btx-Q)#q3NM0-88-2@U=-YKM!MtN;Xc?nR!;1Zmmzh zd1CO?$=>yo3ukVdpBpC;QDUyVbAuho%ImnKv+i<yMQ8oF%bql9_mi732D~ zK$c|98ANl$z#=7aQe0d$GOQg;T$US=vXB=hZkiZb6E45)Ru;}SyZ2+!R3}4Xwk}RT z0?eElyaOR0oP$o%(>-%_{u#!Ww73!yC-buAF~~#3 zkIy}7s8~7d9%pCcw#RzEmH9r6E!)YG8X5W`9^nt|E`9fFo#mS-DaNmW=cS!G~q=W>XShQ)Acvx@`MlIoTV(DpQ za2hu3EX@xN_ul3{;C&r+Ivz$*(FIg=eenr-)-FBgj;1#`%}%v^kXIy$lg)J(P@Bw; z-?X8Fu3rlYEC9u3X*DI&BX5#8nVUIueC`RWCEq{bEc7+UVQvVAvpQ>zyJMzIKTftaZLt1i=#|g;OMUN+OCRgWQnh zx8;+el1X(*q&e5N+GgYWPvnisY|aGh5sYmHPBtzz!gfm5+DV+;WxWe5F7_^tz)cgY z6Sa-BWff$x*~WJs85|6Vy4Pzjy%4}=+0=$q1f-gqVuDN^ov4_PK*b z1tilsZ*`4z8x|UXCXa|8-Iv7ER`x@C8LGR$N zMo}eE_$;kmTDjf1&}g`24#ge9U?Qa~mC>9bLS~If8z6a|c_dEO%+#O= z6A);$@a%BX1qrQ;j9|01{|t87jSbwv zOv+F2_V*(KQ$%QIxBu+;dt?i&Ej+O`vmw3}=+BJ33ui?JrQ);nb~?A#UnYw8IPh=; ziIYt==Z?=lhDyzjzGY2#$%Fj!=f)|;Mlv~gWs4deS&^MSxHL`a{PN8GeYWnzB*&os z&bL-r7sTz;-Lg*1{FT^aoy>yqr+ckwwLf@(nj?IQ6W$Deg!!cqpL+J3<18|Qh!P$G zIO-Li733sJ{ER|hx<2{n5AZ`oiL&u967t{$D1XLDzUzY^*8T_Q_t(Gu_4_}4|LN~O zeel(Tn_t|#_Tn1gB$;@JFHRz-ByX}E=BknJaZQkX_1Tev!da=sK5lV?B?G||HGjI}YElGJvX+>$iA|WdQ#!TB<8`#pjoe7-u zcA_Fe*V-sqZKHDFV4SqsRXkM8z{#}6G^PPBDWoZ&iqyP?B z?WJGSX3l0{hOs}|pY0`a66(T*lg(-59KekF4Co^gCjlbjs^fU^8SF#)6QZ(Y!+b+> zO)?H*1e{E6OlC9@a3UEZn_82K%t$h75pXiEH;=p#11G^aMBBp(!bqG9%MXK+m-Lr# zeH@Sx7t{q(3R2elt@+|4c5;zRepnr_s$Zx_z=%ZGMwi4%I_?^9Qk2HY;(=n^0x3-? zhSr8;jw7a(A|dJ;;@Wb&1!lT<=MqNuNk za`xp%le6O7p>RE}Vqt10JCyPHOJd z%_7{Ni??|bsXq?SaukRleM$8upJI4 zA1NoFu0gp$ygEL>3^Fg_DSw*x=AoJ5S2+L!ePP4h=g7DF zV9z`G84a6gN^+i`e1r=OrDEV@PR1-W!qW7Eq?i)!FH@VOq*OH34U7$KiK&Ysh6X;z z=bsSp$o?0u%t5*PMg&gA$2J4(qt-?;)OA5q6~}^#nw!SK#)-i*X?w1&ufxK)z3;48CZ*M+3}7ZH(h-=Dj{a{O_#;ZsJZug*UT zCveii&To430om`X^N;NzCG?luGhf6jvI^y>1tY2r#-xqdmVCE%K2pP zZW<>&-Ae#GsTg2(g!4zdI7#InX5l0!>Xn0&7wJT=9Gv`K5KdwT<i#u1IUm;l%<0M}GgW;NFgtpR|cHTRI16=unBsnQk zNSao()G`Qz9|f)YA&ez&5G;9(k6)5b;(D3Qk{BmZ;3Wem6YCR6w@%AS3+ZRnv()oT z_Y2Ai!V;Jrh{Zd_yJEbeb+r|Yc@ii0dG7-Q61F2@;AGKY5t}qQqHnEFdj0GU+8v2I zl315mHCdHfpGq3%a5b=3U4vY)H7=zjl~|pK$rQ|+rllqz*3ywukh0M-I0X>kaP(m^ z`G!x5PjGH9U-8fIFYGHsW)c`e@JCK(jz_46(-9{_TSGj>lFYRNxWtG!WklRr?zJRw zl3G87V>G%&xY3ivRHXB|^01+p+LTJ-WO{u%bWmz-DhfnI(Cr@SPDcxGuq}2n*i}wL z4oD}yjLsS=qbLKoM*}!ZBFiGloE|CFDQG(xwYbe_TYhgo389WhXr_b0XSHRa?a&}x zIGGm)B`@ganzZYc;1!x5%2%KlpietbbTTYwtfe3%7+SeoAxBB)Np`^)IEfp_-p`)I z$)bTGR86EjptO-ik-%AYo_0E>d{Vw^>1$e`s)fQwFk+l(acj6^T)OFP}S~J)Y1?z28fV2{g zlYVJ_XgD`5H+hD8(l}{t1dT)OT5n@OsK!o>td1-+){q=L%7v3@jcL%=eANJPN@hbQ z?RMX+STa?p$xno^TOKM>0*kX13-BsPQnuyKUzWOL$m1g zQ<~c~sfD6gkKBr}3MmCCaxy0G$31&5d-7S4*GWC-;E6%vWLk3?t-9y?p*I;g32!m< zjg%|u^%|Qfsdweuvm{ZnbG_c-Orm5FCBn(KK6vZvuYdj7r@vuA<#)XED9H#|A%a*E zW%a>+NgkFI9^)!#z9c*S4kyMH#b;7DN%D?{x=Bs>1w=ZCN2Z3a85z)T9Gl(#@zKr6 zN83P>Vp|y!9ac9ve0O2;!T7)xBLgcUV@Ww!-C$a?=9*UwqI77xz>rStXgL3oZyg4PBNCsJNnz{Wk+Ho`$GJaaeA2}2kVgY3rliL zA%T-Sv(slN#OuDOw~eMbMFs7H2jb(Sn`+9|CI)XNL>Cb_>CNp29PH|7U$`{=Fd?#7RvKFiVkSl|zDKfh)5kiSFAa8G)TK#NIWKE; zY5Gx9)r=fx^~_D1WZYa!(We6>3zPQ;yWZ?+eFLPo?aJiP9oRTMa!rgY0hG9gx|ymn z9geP{ZdzG-Tu{{rc`rO5S%lV4uaUmni~~%Fg(Sl6z*5j?@+{xW; zyDKLv5fuWIfq<>pxX{R!#m1(UCXkxh8Y?IIO|?_*D!f@gT-RF9=2fs;;V)ic#}3|RPn5+`#2UO5I>aziqSlWDbSV4fq%-hV>>_ zC8K6J6hTh`Q_)gMtfk2v&a!Z{Al<~7t(j<7XkI9ZlOeewQ1a4&QZi5`vpti6wC!tD z*fR+H0roK83AVI#N`RrIyCrBK35E=u#P+bAuN{q(n`H`m3t(gENNGqx2=p@i8(A7z zF;M{;nAejRnHT96>P7~^N-9W3mqx=W(B{4gzGOC=>gj6Kn81dLTj?yIdKP*Oiw&eN z9*)#Cri-U#tOa^S5j`<64RA88C5?3MAZ-B!1LU!EvBckApi|_O*h;cZe;fIwg5lZ3 zem$h9h5dzEJGIaV5|a@_i-Cf^CDtWEVH|weQNi%9xSTlRAmcs8piAth!D>rbK^Tpb zGUC3ezGy_(FVuU4()ra5tqp-Y@CXer498~yPJ$YMrs2jRhc@73YJDpIdDa}Ap_cq0 z@@2UOx{^&zB{beg4?U%=N-%utXX{Cu(<9OY3XIA|`Bh^Nk~oPT5&MGo;UIiyuGHF8 zOvh9peX=(^Qs7YoqHChtv`CFdj}W>A#H7XC!`<_`^T_ow0M?FH9TlSCc) z;ZqHBL2bmkc2QoW$XL{r|l9|yvXya(#8zh8AgdCe5 zc^92EKXKcNz)8KGK0R%3VuO5c{2f&yaf+g%+rs2Smf`&_>C?2gjT`N|#VR4YoN!EI z)y!r^_R~^9L9;Mt9bFUI?d^4|1_Vxq1yxg|Gx2Ut%0OCtZ&uPkYJ6v3`;GaDd;J}6 z94j12I$E_$mvqa@AM&UX5O_&PU>=`)KRuz6jto)N+pMC&p+&i#_8Vk@K@y`1NSw?} zoq_^)Hm!)#32Y@}B08o=?xMO(4Zq`iD2B#KeQ%&SvK_F%#Sy$4?VxdTi<nL zK09_FI*ug|8Y`z9tlaMeli<(tw!5VH8 zP*Hnp7vf8TMP217RF{c?H?4@E>j2-Jso}dE#lAn%bCJZ!jFi6Fanx@2{0@d;cc+Mm zY+lwFkS1Ic-4U*wm)I{(J`A(s3z>jw?{ zr$7Da4}bi__dkCB&G+AY{PoATKfV3N$8TKx@FErC%5h4bdVGpEx)r-4>6EPx_^%y_ ze35)3TCp!u$m~erE=ay2WGRq|Hz#;kmt(}ZQj@1H3^0;cP&iqefI|V1HNN-oUL4y= zMeAjS0X8C*tedSf+HItys)PivrDU)KOlvR~EuAd6aB{X5wo|gi#L0sG0um?TT++&l ztB6DQ0s)&ub-OBwlW;-Uo>ZSiu9%>0q78-zY;Qi^4EH5%bvbo8AVJs_lp2IN0?efS z0sHIb>d;*p78;y=os~8#AyL_)l30-l8>Qu?C1oU$fIS9BqEGQ)BLST;a1ym4-&s_! zoy0CvCsQ!PFe$i(yYk{BvK5mWl1Q9Ptw}{NV&hInBTLCk1*8T*BP05&ovGdJvYT9a z(=Wvj8ZE0MYs*eL;eh;R`LO)3#wDs-p>rdPBN;OXlPZ%?;~b7UOs>%98SV+kQ#`fQ z6qp%^*Iq$|2jdXgkid^zIGGayC9fQ>1cRUS=s{_b!3h_PKNgR>Kv_*0I*6nOULkSP z!p#CXO0ZSD-FiETlV~Fl5CbRkd-9=<5xEgyhog>`SCjWi@j+@vY2ZS=!yyL-PEw7w z)X0mI=oCOv=KyCiit<3jfyM=P?03U_gR8$QxsuC)umfnKaYRl8{g%;EO>L%0ii{hC z|N6%J@>x?}gv#>7aCk9-C$U0O^9R@3u?rG+v8skDj36iskdBnB6uB38YOnuZJT_tE zhUSNoIEmT~q;9_MKQngkJ{>1t#}y~9rlXcv zn+Rp2oTN)lehGf$v&GiKwtA-e*vK*Rl$_2ST(*jd3b`%xh=b=FqTr*IN6D3Rbggvp z*8_MYq7+7KTY9S^it|4Ze1LT8=XU2(^KH`u$QeiQq=F$JNW<|5B66)0(B6RT0Q3b3 zcICC_Nz2k1wA8n$mkyVrU3B-cA}FdSIR&1p+itm?7bnr)%;rokoE$61jRQ9g&Io4U zBpxQf%j8rA=RoKBxq8@zrb2jzd6Hw_+26Tgk&1t2;AC=RGO4$P1BE0`2Bid1ILXS= zLr1+{9p}pRdV|jON)hEvVm(SUkMi9W6k>G!+4ZkkKQ>f;{hKd7|K`cV0Czx$zi)3{ z$3*$PAcW*y5QO2BBtcS89#>Y3>z8DVD_$9dwZ0@?|NRBYk|$TF#F)8UIB8sc>>S`E zMv{feckL{lMCja-TBQYZKsU2v@6L|h1#HyQF;rF2K(a;64R+0p-W}<=WT;QS#KS|% zCWr38DJ@4Y}=lhGioQ*ImXAXm8+JM4LEa`-mvf(9S$yQHqXg$M+dZK}OAJ^Yrl zBOOQN<{C57cazoK?*h#Fc+!&!0VlK5hv7N{9Ty#}-H2Y(OO77_HGo|+qqkzivc>2n zS~O!Kx+yLjxDg1pn{w>ycg=1NG=p&ZWhqq_&RE? zso@*0j)z5Q8%889x($?VVe(#hKnlH8L@6|=W@>~g@bt*7gs1{}Sve9XYs*ikiIbS0503# zaaxgBa7RHw13H~G2Hzub^1%M0g~|6gLE6;J$`BteoIJhu30gx0lgPw zyMOKDYnMK_boR+vcKTL+xm&Sc63v$sn6Fj91WC-2ub5-!Rd7e#Y zQ5+J|5(gp=q&KAJcIBouq*0JXlxhKB#DVYwM@x=U z%OJ{0FkYho)L@f?H5geE3G7Mka`AV8cD6raPp&9|3ZLGb-n!Nb5}X@M;$(16FjNQn z8rqQSWo@u6svru`H6$a1a*z@Egkz4yFecbCgakvtNx%fkBxc@=zoy-hdU50KLh;N$+HD zP%{u1aU@QvZBq+K3xLJ}wTBZ)pC;gBdRsbRKE*Puj`N81AaOFeE?I~Uw5_+L)iS4D zE2t}Y9rc274T?%`hav2j=m#oYGgZTtLBieupeDaJKdCxNZx7d0EWpX;!NmB!h6+H!>;D#*g9N1x`%SPO)c z_ejZ^s$s6O!#>q=~zT~Uoz@!Ti6;F4PS$bZWZ5|u zOkpH>Sa)oK2z{h{Zt*b{U!*6o}Pw;bcf)B~)!<@Vc%RJrhAjMmZ#)y!zODOYKH==|qTs3c=CJQQ`gE zlk)foD?Iq^!v{inlmF#r&H)*b1zwoEpAebHi<52j3;0R8Nkq(kPhvyWdRzUevcf?< z9bPd+5QjojAiBL57f!OGbTsWj-|{m%_gK1+ zyA%{m>nb;>vnKB6B-bg^E1pn0eGX^mW^^8K2_cp&VdG>?`39gLP~lkLRV#DaJ85R( zo{`*MRyYDs3FJ7`#f6iO_Tl+iJvGN>Cx`9;R@+)Qaa~qMFEydHIIlk?u3Cw!RbR6- zPgr1A^MQkvJ%N+d=MJ>AEBbs9;*-RMldQFD5K;1mypk)1AO|HUUD%JmAaD{*pF|0H z7}FF0{^slFUp;^Cv-jTl#XGM* zeH{@cPPv0Al4MC6Nv9+ul`Br_h~`f*a5AnY zj{Mq>TtyyX9(>#%+&@50Fd@LMZdhulo3F$9I!Mkc87_eX_PFig!pYuzWSk&@1JrkN z<>!~(EUROt!#hh+TtXbU6`d7*ELunoSoV8XS0lYK9p43PA+ThGp8_BQAdF4{%aE}b ziln+-6+n#3%vP2!9W52&N9$PcuyCMp(qtdS;Mf7-66QkUWL8@i8;e$36YCOj93u)q zMIPA7sY**XOF=1T>C(zcK^35D5Viv!QH#9rokTAtLNYk~63P>x1>h{`K|OQ5SIG~E zX1XDdb5KqYiIYLuLCE)!+mVX`EQSA^e4S9pF(2!i&Op5~oGr`8%aJ;f3x(icOlb@Z2Ph0+0=e`I z|4hYF;%=dCb#ry7(ZVvr$hhK^#uQvxa%wOLFb?_khHWKiDgjCe3!dCyYG!t4wu}PT zH+g$MdmPygWniQ^1;!*tZb)7T11G7c!D2)GeEp%QL%j7(txtusNC*XTPi;wsuEDVi z2ci# z(IwHZ)Gi{g89N!{k9+xD`Mig?1-n5zK+i_xM)2+p%L%JrsIQu?+8?@~PNFN|2ZO@N z-wB0GLp9-{gx$e_lSvKq8dB73>%IaKCj*lLQL3bglG$AOO_}@^ zhb6z@WZ?OfJN*uo6OujYZ}Dkv8W&Dhm7ZOmc|=<5bK`doIQzX^W4Bp0)@)1--v${U zxMps|e2J@X(d})&0le8mroKnsga+x ziXv~3v{WyXI2jyJF+cGD*fu6Kn_->E%BX3nn-Hr6vIf^?>%Pvn`A^@QeY`>hnl4R0 zNIqI3DK5@s49J=Gc3dU#7R5luM{wa}M)Cv{wX6QSAln4m&2WdYpaiOnM^tv&^Wg~s(&C0wP03=fq z+R+Du=9+n9eY2Om)+H69!`lJ7Kt}s6k;6MCVi*;8V&Iy=POgtvUI$C(iFRYO;oSJ$ z5Z?rmS9&~2ANI^2>%Ym0(0;e4<+O>xE2S)!k+G;MU57e?Ob*_#B^Fv`zb+NGbhlk+ zsr^;0E!vE|Murakoo~V3mYQWHdHI*#PF2OYz3~#OH7LGzu%vO)-L+tD`~lKB^z9

          +p!w;gP?nuX!*l#(+NeE+H)VZztpq*#0tRNtYTXFDxURC$UB%T`-tzOYy zbe*2L?TkGbbE@~=NSXM@-syA;-}M3BaIe!jt%99arS8sj(3S6!opG*#@t-ScuUqE1 z^-iwCd=s&Q$W`%58zK+}=CSaX+hn~XZ#8@Mb;tm>MpVD~!~P*l2*xBv_+`ppCuQbB8;RjUI_R8GGu~9_3Qg`&&`V@-zERoiJLxCg z5642pTtCY_Tl-3-U1V)=fwT42T2!A~ywut7B$InT<(1*lm$|9oF!CeG*5>1jU(O~! zu3Pl#Kejx&!I({=J)mVz6AV{w2XlLjs@K2z<5@Df*F+TGYf|?bAM2H;6+;Qz7pb49 zSLPI&HU#$i+t(;DfQE|bAFZFuizP7KVrNOJ@JitMO|ZRfYLQrwVwD>wINuYp%@~^3 z@ca|E_soVTZo9DH53zgN=xAw!E^JV%P~oo0Wmx~~Y?imAO`~Pwp;H9=hn2 z7EQY)8T6_xz`SCMbpa|x=O_davt_fEHP+AR2%bJ8y)N-T(1>iK=-X*~zxn8Iv~b#M z(w}a$)Z;@Q5oy|Ytq}7T@LNCMa|6qKGbkUget*98{QxMEX_xaW9nyj=RW2E0Y z27_(wH9++GZc#UxUWS|dx7D)vd(0yT&p~`* z6~lhT#2<2rBBZiw3+Y6z`(Xl+!Z+fS&j%^ja~7Gq;6x*;(e}1QF~_P z+ETRKq#tgzPIhqK|8V-9#)4u|!R^h@853_=`{!qM+9}V%NX4_~+Nyb7isMDb9=DqO zD9YYoRlRA^ilAXdUZ|*U+Vujy@00NyL8*XLEm*p^s*gwrt4>CiIY6Wv!i;%hl|E1=9yDL%)hRS%nQ1&Ps%n( zs{Q9uxGFqBiZv!-Jqre(rX8bPd44REj;I=J!0goZ-hZDmD09YD%j_;a5WwfO8p;Sv z_QcBgKt^(vDATGuC6UBFX`eV2p?Kn7-d?!Fiv!a(u3b-E0@B}pL#oKf!vl}F%5uTv znA(xrUvzNbSQ_4-%sJ;|zqneH7)H>PV2^55#dZXd3IjFS6J~wG-&{{SMQ&k9qhPt- zyh&a&fMnK7P+5sP$s!XP3>=>SL?Y6un76p;>Fb4T5{}B8S~o;2s@Hv!>+~joPhIq@KRb5vkqm;7FOZqoNA!VFBh&&7qyNhL3s=$Z`#@PvEj`y zuwuA8*rdU&w{tPzX$<~M6Lf~%cS)li8$Dy7ldEAsf?toE?r`17UEBAij6xeh>FHvC z;dnpp)#K< zMly`>f%{Q1DRtqf@8f3#r>{+TVGn6nzML)R5{6)Cd)}Ch3ACFU3Y>WN_POS{Gr0d! znk~u8pC#V>szSoqW^#9;B!_Lyyc%#y7s)RxIDeh~U8DVf(R9^uar{mjch|!Th2pM7 z4|jL>;zf(Qd!cx7clY9QNOAY#?(X&;-{0r`<8s+-a+jT*%skI-GSU5Gk@fq*&P9*2 z*)D4#X*fiO;K7b$>sgnn6JDf~sBK%8uld|Pp;|7(=j-R0%9%^bRj#+slTPVt!K_vNF--JP@AORyj@LngOYn0jK(JwiOgiKQ*9FN|}XI#qW!n$S0dZY8o8JZN1YuQHB+Q3f3Y~-uAS6-rKzpk}iS-O;DzphW* zb*adJ-y~;3tW;~eXgKWj)ei9ShO5J11z>R^yOg^}IPHi*XIi`(wn1hOCu~Cbx)E%u z=**^XrS|)P4gHf<(DS+_ZG=VxrD#&JQ`U*K70lQ2$GRP<0Y5_W0X$5oyUD zrbeAJC03!Mb)K&Z$(wELJ!YK*HaDpY#0+VxBPI`a7=z8MwXoTch`@PV)cM7-??nH- zR-!suC$*aYJv8=u=8@GE%b=UZ_n#~E@#j_l7y>|C7uG#L287kmQ9s!6MaCr?!(X@R zm%#n#uXa6NbGm%W5;f`PH3oYW`0GLXO0hS}j6?ToX36ST0)HEFHgTK}+}+b$M6_1^ zU7KZ{LndQ;kM!S@@qNlNFO@9l0<&y^m&Yp_-w_+loM6@NQ)*Wvs^ho=P1Qgt_li0m#o-` z>=0UK4$f6XMUUO4y5pJ>W7)?@DlY}<3$d7)djb9ll47jYTtULq-w##aPPpKxN^BNv zgXNXJO7VD_FP|aV4bd}oDxMA5b;7SqeQ{3qoL-gCN3O+d$WcPbJ@-4oC zaUsI{cfK4#`FIv5yM37)b-6o!g%bUB+PR@WvqLjC>{ry~K#5(Yb0F^xM%9E($9S=( z8s7QjbVcFP0F_#)L%Hgxq-o2xDou)%T_r__%&j9g$_`fkBn{T3C{Ca8$!CN-i~-I( zZ5oTy`rpO%-hIm7`mIU_HzKbb9JP8aPk=s`8O~nfp^@%%q;6()L1e|u8UuVJ7Fuyz zrB&A3nZq~6{Bx?d?W(Dr=wxe$`^)adY)~vdmtf`R&N}+=HGfpPlS?LIGgf!EDF^gr z!-gog{27%~a5X)?pW7!GE2q!#H0QyK#W7#9InuW!6=OOIkH!}0Z|)|w&Ds*BL@2_E zMJQxt!;3}W`N2>znM3E%l}4rdm(X1+jMra+QNG-#dd4}8Pk*$Ck#8*Krf zA|_HFfZ!V4_o70xY?^msLOAg2BOZ>#-pue~j+QbqZh{nYB{JZKaGkoUNwV5Q_YogI z0@_Hv*Yl2j?TNy+QOtcNF&2T=sCusT3v3lW>+quLRD=<8T!b@ld9J4}fnOp~;}Gu< zoG}eNw;Fnl0aXIoE>}Tr>{UMo(ra>{VnLOQ4`_U5U7K58lgL@@z@f98JhpY{e{s!n z-sl%Fz9W72N_JJ_-S->LZc0-y>p^-K-ss9qC6aLN5>7lwk`iw8%n+%g>pWVnJpKptXv9-Re8g8P-{{Zh|TUn{H&r6kvF zCz2zI--!R_;Se9M7&3NZz8pEEG6;L#epz6_9zBo@2L zl8nr#mI75Kk;Cu4Q^ewU0BVN6h#RO5@6_H`E>;c~*}ew_Y`AM%D!)&hmw)pTdyx}^ zxLsEta!uu)b@$b!Trt}!H5}{f8#$!?ImzcKRAr7nFB<6_Zz+K6}r z>A~?n9b|1+OQ~IqrV$a(M12-7V1qsDa&YG*r_}sPAZgZVV*%{%A*6iRDow@}e7mCF z!rw1|ElufWRBqkOi*0Q@KTu(jUXs@~-ik$y1_}%Z{CG--1IE%KKb*aH2js+eiaw`( zgC8eu-|uEQFLL#Oa0%c>YR7TG^h}^B!{Do0wgPOM#FxY$E9Fv4+nDi@rxZ&Qt!{2) z1!LkjJ`0R^9C@{`%%DU#(pqsi9o3u#PGw|&&Z~-i{1R<`g>o1;)g7KCne2rLM0$N7 zVCWdvvKNMLvsEgln%7YE)aTeat_)nSG6tBl{XI~9df zdpL>Ppxnw&680+pKFf=5RlB79h8nz;K@&fe;HOyFY)M!+x03mYxeh`Ym+~`OR!PtN zPIgA|cjP#B`t4?Tn`teaM%q^mqkisaH@^ai(Dk_z487V2p8EagVr&$unxiJdZ0DPo zB+8i+*B4gsi(e*5=1#(SRm6`~SNzO-DeBZwRy?m)dTN_aC&3zZ^Z{Mi>3G8<}XYFc7D zM6R@!gRR~FoM$EBdY1QyyJ6K?&=cq2#`5EQ<%5s4o3E2+IHiHG(JN}%w4 z4>T#c6?^dY5AP@^;pw}*~s}$W3b_AP|%~fX>5zee*F}T z1}$+IWG;kp&hex_>2EEnH@n1>a#LkY>3042yXs&pscs=~ZO%hc#*=U!9Uz(B|H-MV zX@bY8@txI|;UU*)I|B1@E~34RL70MOWa1!2mMxO7hjx1X;kTG+1$Pefz>V>pPKOrW zf+4mWBjE$|54vOf61LZb%`@J_VDfik(-1G<+xD=|0+_xg6^;D3BhP8T9}{<>!Jt_* zOi+e%fY`K=K*>oIU^V%5Xca{)ie!HMkHzGdoYxJK85E=A6&(?rPKz1qWKG%xE-Bpd z!<`!5G)xFrf;WIWxCfd7u9HGO^#+!O>;WuNxIKE-wZ9U1^#^I_(E0K|+&>{go9@)P z)zQw{Zi2dLr~Wl21_#(wBM5`KZ9L=3sZaug+QQL;N>Vz|<>W?=#JL+UL(!q>@#p0$ zMOr`B0cn}0Uw^d(EdHq=-k8scb~5tOyHjXVX7-|P%fc~ShLJ+^1%(9!aV;xG+aV>S z1vy&*xa%wOp)7LPh69i#)DmsKcauHswZd|s#9JxeedfvE>2nE#Th$lM0 zX%NmYJKo`?ig0DjSt*pSa`<8I*uzoSoUC*Shu@%zY<1f1%=tzKT%uRHD@t$LK<>gM zesT&csN?Z71F5-dWwr{LyoMtIYp|z>mwD}X42Wk8j8o*TD~{xbgU0`~bI_kSWyfdC z)01t!=GwP8kY0u?7dk$<$K|^blg#*1ZueM9MpB&aiESBUy3Qb*oX*l3pcG;ZCUhN9 zA1TKxGu_7UQOh?~7SUJ;gKC??dpLF-Bp&N7u=zO=01-UVy)}6atAqWGnMWIgovIXq zGc-hNXrw2gM178mV%CZ zr4}KqCbn%M9!K+#m%e8`Y8xVpm>#moChk~2rkFyZBZdS5`fB#{(hYQqK3gJl1h1ZJ zw8(FqO1JRD2#}mvh<=4%HMgWw#L7Q6RZ%`jKX zC^D>&g!N`l;n5IqqrKk$2IK~kb#6f@3*)T+$SEn*cY%piM9w?Ayi{O?3G;png_f|5 z)4ZWZ12jr@lvHaQMH|m;GGql#{Y|w19X{ua&at+6(J3%g6@A0kUg25$lN#^X>ddZs zdh!W3wbYd`Gu1k!`Amg(%j&aw^s{E!u7mKKQ+e23i3`%J$e4@p%=!M|bBvZg(z7wg z^^+MxxKX<6Ah|>z84Z!4MF9YFu=WcDlu{NOxk4YUM4vIoR5_AaOE1Zf_-6wl5EO2uiS7sZ=%Hk<;fZQrK@KlvBwt!jw&kitdn){zsn`uM)A2Yk= zEyVOywqnsc_t@BpF+DHtm?EneNkjMze`Of$w+?=uVsiO+ z{+T6T(N|8q)wGHmZQCvp$8wd7mz`Aw9%=^Ve2+Zv%sIAADy|Q^+ulItyyD*6qBBqe^8Kc%NNO{pEM`fWV{s>i&>O=K=67T8IgaeVuX@ zT6n}1{py$h)ggv+aOU90m?Pfjy&W7;QYm?LOm?EgOdV z_w(L`hh7ud2C?*69UY7q50yrR@qrnm_~dZQC`3k93d30}MbA`j3dKn*MT=go(-G%7 z@7n~>pw8CP1$&q&S3CL5kDS`VjF3*Woh>{3pA>@iJ;iknR+U_aTeD&Z`_4W5txyE6 zW`}6NA00$s2e~%bRV3*839))0I2X!8((jl-bzar+5N9=Cs-@U#?u(hRnc<=^fsj_~ zHZ>Yd(9uv-Mjrp;$x290ym_mQjVL;f&V^lKm}$iy?xi&yKmz{$`q?tkD(PVqVhcM- zEF#QZcOGy(meZ^0t{O~Q}eWJ6Bxj>YL>-U3{BPWw%)2V&VWdbm^;cL|yi;QnCXJ`xrX=JYW=PO~U~ zkzp5EO$Pw|;CjtY0q1JWbD>bBQ~ol;;(v=z3SbQv=pUrTE~u$6!7<94ip{~+Y=qt8{z+hVJZrB#n@1r$PVg_ZeTP- z{m~+;xQ^THa5|QVp50a_c~L>TwN~+lt+>)qaIj)2OJ3B%ew)tCuq+;+AZPiiD&S^U z_Pdi0r`a${k2sqhkJ0Rf_Hi7vgilo#N1q$6ao^Z{7Prx?g3Irc8I;Rh5O*dO$rz02 zlaU<4zydJ~;X%6hjz8u-Pus5l)IkGI^ngOg0HdnW+VPG>JvdkX@zz*ZM3T zqlOxXS3Wd=q(HrxnP>?u;4~v8jd+xn4jZCfSF)W=nM1Xcd=D6HY1nGAcM5`QlNgLqP$D zY3u-2!z6?tO)wVhxX}KF+UrmFPb#hFGlm^N7y%*JO9BH6YV+QkjJu`AfOXJa^LE^GJZdDyAHa}WeK6MhGwqQ3lDW{ zP`wUxe=l-*ePK3|NhY&E`OGioLapM@6oTvq8C&pj#9ZI0&?H(n6*a$6&xNGSpk@3p zwr%bobXBSGSxN~b-L9wbdbddo+%*TN}63C z#si{T7YLCkPW%*)9?;JAJJY6S3MwGdG7!v+RGgZ?skV-Yl8D1Y1PwTP2OCY8`&_6BHM6g`*UnHc5f z_<&J+f|E8%MhwJLv2NS>^RBUQ_TB?;e?J%)6FFrYh_P=xF_*VpAuHZ4~xYeUptGP(F1@L z;ZB-91}TSbyMCkBf-aN+qt$}3a6d@0g0Eo8iere(0!Je&EAxZ`g?j30quFwdo}R&E zt^NG3La`i%ilhb;Ec9zW|NN5BifpC#!a+onHAau3X5IoY1sW}u-jCkJe zqXFHXFJMFMk0{_44d`n)@iF?Q$S5!kLn44l1K1$W`&gg+H>>P45m8U_k!~19!$l1t z$4H4LZ~$!oNeXYIu=`?U2oe#==?q;!;lgsrBaq+suTe?iG?vU*Yk0$B3?#1sTIFCS zj$A!T5ALMF9YY0~VV4w2muHwJd*}eMmmQt^v%cxo48_WPW!u zc~kQ>bHJ@J9+x}R$bhgZ;3ikDK7xZV+2ng1rqPp4zPQjSkh(^-Oct(r6^}$EoE9O6 zv>$O((%x{=T}s}#KtH7*=~`C%2x)h5-gv*`y@9TlNFN?Zd9BY>9!U8j@s#GXMcRf$ zmfw}+AKZWtSEHNO^>KmzY_8e}i9eA|H;5Y|9#{~HIs`Bfp%>jwBG923@jKyfw(tWa z%5-SgYhYn2Rohmjo?vE_J<~WK8Dx9ii7f3`TsX1dgqxn7qzy4%dIKR=Kx<&HKjJ6I zUM6-Slb`%vUtO2r_)ZA2l->7`~SYOe%)ko$EL-?x` zVqUl%%#(-FB*|@|f_rp=s6^95MWbzPR9IvC{0ft&=3=9I`9Hg@( z*kwY<*1Z2jho;{4UU(cnvMF#EtB$oA%kOU#w{~sJaPv(cu^EY2+$ys3P9F9q_RbpC z8(to_!mn?t*E64fxNbb(GP!QFX%m(3pCgteEhUwh(fJ$2;J8SPRT{KJ*>kK9{k(aP z!E_ZCo8MtDh{{7fkiU7ykD0v;VbY|Kzb5ZhV%2qfI0TAa9f%$zTv*q{@n^uAFLsaA zBAszk(9TdE50o_(g>+Un__0S9jiXsi_Je|K7#-JaI4Y6-UjI8Chhael+k{hvpX={H zmTHwxHu|_G=1ZxfJX}d8j0xj7cka28;Y{Wh8gBf_Ca>N8`AW0_>V{u`;o*x^QTATe zr^?>Dmo+x$)v%E;t!^DnErzho*)D4?P%balgP1*T%yPv?(L=2mXsg54H zcDF3_q0a|riuN(im2|9*(k~?fKSpe7$hnY#dm?M1@caukuCDfIHY!u}L};%a-k1fb z{|M&x`-Nk*Qx=Q?Dtz8dda43c7jrGg3qHwpuCJf#R{f^bOW!2LWekYx!G#z=NQb^+ zA8|XvG^Ck<5xgBHBzS$>uY(U0(kXewQhN>=@-ZyU7ikR7|qf^1{Jyq8YRIhwT)A5?rWH6 z`Z8NP-g^2RsXU)5;j;l!`+<=s$N4Z92izTWfO&SBz6kd1w$oMrlVfV^K#q!sDeOZu z&-NyMO#F3hW}$EALnfQAhVHrd!_=;uzvj7Rc2D{J7*r*I&od@JHYRHoWktjhM^e$k z4On=u!ok&Ic0KYsZWWLDX&ptNWpZB@Sd3Di^RBVUL8}6%3}I4{!S%FNq{;br)i)n! zfvTAAxPin8l!a$HbMr@?9h}ro$j@v~=3CKCRvE}-uM-ieGqhE+Uyz;t%q(8vbJxe{ zQX;6Zi{1Ub8<~!XqdlF4te)6Mg3wLmakG(!7{r(%G{>gPmstci~o%zrE$3mnp zglai?@w7*O?x3eA9Ht?nb{cJ%`Gs@4N^h2y+i@nlFlZLmh830O1s5QHmjvJ+fhFg+cjG8_(%z1_VRIB)z7hL+y%sWl&iKPGV+B^pb_%xtmSXLS`?&gUx7Y z+d(Qiw5^EOZz@=5)bw2-*ix_ufRPe{l{U{LYokS#5(^8<)>AS%G_+{-+O@Hf(a#jH zjr_f_T(2nwxGAXq#eoEfdItMNytLeAFd#};{y|Lx&|1f2Qp##5-?RQ!OntZ>(K|dF|p>%nNF?j#!aMAUv&%bWz zey@wjlW)YK=&_n${1hU)Hg=Hln4oe8dn1tP7Pu$N0G6Ie@Ks}e1V6HjZ8{X7fSaoP z+xGEbnB^h$l8L*~cErA3*`4rKxV{dv<%cT?g(zXcEVg`%#D1@i;e`T6n?)P> ze4}2mF>LLN5v|?T;Gb2ahk4J-3_N$A^TXGWtYQvLL zm+_&@d*1iu+T!OAy-h(EDsG+!Ik2+6cwb5$6+1lFZ$cM-OF~*%3qH1tUu&2gCp8SK zwb}maJ$&J6&CcZ^7+Hs3Je5DVuuS7Mb@yOBjm9F6b*t+MaTa&cPl@4WZL@`I*r&^h zGnbKv^4fgAU%8gHZcwa&yR-Zl5rV78KZUIi)%5T{dDmcHZ)(vna?e~_oSUDrsPgNA zoVix))0v@(ABT=+M~Xo_KK_8Ik8+bwgRRHuz^uo2aa2>I-J$0)qZPKxYfV~Z3nzKZ zb$)*kn-g?V5nFPzyn5~UiDCRTZf9_rN_)Bj{*yFeeerJX#u>lh(&RFN!CLWd>vi>$ zmB*HZv4>99A5E>SFAPN>1^69A;1n-T;J#jW-yNYj}bccDYJtJxU5-sjH0F2-asl*>=-D zu)@R9e?f`2X>O-6^k1*~SY15#@BD#t_F%AZn9|=(+jZizv5`6I zPReb=Ey6%Wb+IVg69)O+^R6!}fO$6Ga2&Jd>#3=ZtZpPBe#6c`*DmvcG@53058|PQ zYF~S%gs>3FW6m{bAK|M}^}%0B3+D_YB&r4Ls)1=Dq%wFE@7S^oHXg5wb?*`A5b880 z-|i~Kn{ZD z&^C79ZKZTK8|oP1_1x-B7s)5~rTJZFD7#b?MW6f~eB&vMUy*c9-sKpkq*5Wc5*|sw zMP^X3fks{XK|(z&YhcztiIf@to`4RPt%c8cSb(c%gwT!$C0C!zBzD};R$<~|%}fTP zbi`}b(-Td680N;h+WH3kQ=qS}hW81_6d6eIeM zh4~{Lz&(5gA~dLBm~x>sNR-lKgW;mQ#4#P5 zvGVp5nD#5>IdX2qQbhbpE^RX4O(jjq@l`HODGr!GrM4$H8~pM9sAnP4Z&y@^r=a9T zwg(rKzH1bIMb5{W<&(;>3TZq9kQIj`|+XRrEP?>pdg z=l2)VGxRAs!7mVrjU?lA!}#4*ZC!g{SyCBxZG+9x-sHzB-ut}guV5l7dH?tPk!5m- z$qS9(Fj*ix+UYdcu7KH}Y@OWz7EQ4H!Wd(#SUEvoOA?tlG)%{exrl0|p~;npvqdUP zS{^uQC?n5Ql`SpLG;N`hF!B;+eU<$H(Oo^Te)&0vAvVq+i)>@f!5biUeYmD~>wsZ9 za%5Pg$f3qgJB^RM9$TI|`AMI8-Y*h^F)0t@=2mf1kaA2-lU?|RS&Rn8lQSXeIlbl$ zXGIoA>3}{W@~0klwf!&*;avG+GI~InH5DU9Vp%Ge+*j!=3aAtR*Cd;djr;zxczkKtZuY^O8-3;Fev_vzr~ zU}J1(ETJHZjNxLKi$yn~hrjXc!zKqIr!Pha32^_|_O}-1^J~CbU5(sBJ6mT-DY5!^ZWcJI{I?%i>c&ds{!_h1%k%bqxR)7ncXVo>;fUT7X9XBdQRMJ*{a7mdF zHwwXb%f}{Y&>6;-0y_#a5*g~CL-zu(|s=MroK8vO|NCfg|;v+l+mDR-J-sa zVp=B4pya%yY|-YWGE*V#Re6tX%$FhS*&<_R62u-u*3_QrH-L$oDZc-Qisp9JYNy}3 zux;71A3G1`cvV1sL7h%kl_sLha%aL!pWIQKxiINH#e=7_r6@h8!mzYkMLM59AcA;I zhKj1@AmTm^3`nqLZOgClyTdbZ!Gx+#EiskFRXdF%k#+I{XpsnwYP0k_BHsIw2njx{f_Hlx+YJC5da%&yY* zRd^G_!Vk!dBfIqo82&HsCd`8+nA+87-Ws@(ArqUNe);lK22G~fV5K)S!enI@|n0xw;M z-Q-tqU2{NOTz~g(_ithfT_1}hIaeBBp;Z@)ya6y>CrRJ2;)7zNc`;R`pSSQAMJQ~! zP#iKL!Hz1qIMIy&dS5GJeV5tj=tL~IQGO|~I6lIa*vKu}qsLfB z+9=Ttc{!rj`tZZ`{D(<`P=uz6-YkGcm~#sWK%glr`!Jx}p&l$htzGkHvp4Y@N2_mh zQ5vL&{V*oeWnHCckqmwTmDaRmN7`zZYJ*Lxj2r_R-h6YtELak|u)6=EhofeEwRii4 z*D><1wsP#ll|39MLxxJ)xdGEnd!X(S#RZoh8#gIyrcY+f$?V@jcR$Ggo~*w4CUbx} zY#fI-VY=Di_++OP5iq7pifH_AcAXWZ2jsy1A#B?vegvp^bMQphQNlNoC*udz{tgr6 z=l5mPr$C6&R6q>Sm0vG9%%T+Zc(J`D2~zB@>nqWk2O^KsG~YQT%CbXbg@)EXVYH8$usMdO= zK@Pz1qnEXYhy-X^-MdakO$vT}&p~#swwoA>3hohU0W@)*QhFVQGRsOO?@?p^3nit0 zYijmm;dgR#p@#_?qYN3Yi)(XcGszRWi3sis2}{zQxTiVjfaX;*@zkBghZHvLwFhdK zlRxR~F5lZP?-hZ?xw|wAJU$(!+u0`(WgUj=`GxJTBm(uqqs-a!l$C3zO35r)91Y~p z#zIdM-Y>Bclz4ekq(C_Si%UbRo${_tXd#0BD+s~dWSV4_)hn19_P>%6C`MCL77{2M zHX!zG+AkihJSo(Z{Hqxw*jj^IZww|mse1Oi%>GqhC3w17OWudVAep+rcqCwoKb8_) z&RQ}Nz2NxyPb@n0gHa=R1Z6C{*jPJp$V_#X}%8$(iqCTn$j5;l*K4O(Q9I%tZ8RT=v zQv*@jIb~tO#_ykh**!R>lC@nn_0c>biO-2e9qly7k_X^0KDFX4vw3Ji7V!$-Nxfes z8`DCl8u-bd&fwimQ2u3V;hSC?)NJ9ii)afH0=nw?rR)e>rNyko)_DIW7G5QWd18sV zB_Vw_1{_n6zUQC)c|EDrz#+QpZ2b)e#vbi7AR_RlL0Jewg zCS6m?Mg}FCdWvQr39ID4e98S|t}Mg8(QX-MH_kq47*-AIXt4K^8IFK({CLjs&C4c2 z`Y7+A_wFyHG zK`&OcIg+)Vm$$!2xnaYR8DH+G``-D0Z~M11A}-a^!!U54FCN&&bSm}v(DA8h9P>FF ztXdgs3oiP4(QAoMA(QI+Y*`&O)#?kKKZl1dyh2^_tlqVR{`rm3A9MGm{(DdBDYSBP zW+B>2(dxZ}z=Cb1fl7?$TF*X@s*;lX7usX;sC0_k+}2nCcA^ULTwOuZagEkqu=H_^ z-oM9fOuTxJu|BtsuA7yUYwga##jF{&5jP4^)LWU(?ZwJ7bECg#xE8LK#BX|r%em(5u~69VbqgkI7iT+MhS!l4=`EEH1Bhw&3OJBN71@ZZp2236DE$UQqYOBO@L5;>ivZ)Vp2U;+6_=Ui9C1Cf;*)B z$UPx<@+*nFIE0U|C%Z>Zr_MyRpc;(~_zDc_Y=Cd{r7PFsv=AH1DEHn7vmM2epZM-x z1YA@ZjAt;U@c_ zkd6R$ZG}W;sqd4I&Y(d*ErJsZ;M?{Dh7J^`F^l{ zBAV_6h@H5619e~Cd}B1-h}O~IbkS&pk4~W4C{<=>g^UjU;KsDc4zqQS91G0Ov>-3l z8|NGxamk--c%YRfTR&o*(&i&VJ;|%U8-G20m%=~Z-`yAJ+r^(0>K1*>p5iDm+y1`) z(!#2ZIv#{Hrw2kL#xvxu?IPwF-e;jh5nDBx^g$Rve4rRLz0}_j8hRez_(Kc!Ee+M* zplo~VoN{b8O5QkFAuIk|#bH7NC@(%@Tn*j{kix+g?X#}I4b*YaGnpFcW!P!78*!&! zhoQmm-VTXhjR}Q8H%4)095|5KDd3)?2U(GzLD)hLl12)U4yf`HBlJ#B@DURag3#bi z{(T{%Ry=fYU;w52otBUajc1H(;-5m-p}`N{L1Kfh`z>Z;qXbETN-`>x%wNkeUv6iQ zh4?z``)j4+Z(P|2@rmGUE#X;@Tz>tGX=4THfb2|S$TZv{SuERw_N3UYJA#5XxAe38loh&bA!B=KL zJhr{$05W=kn8kW2YmFT`U*nYT8=Qom+I}ds1nLi(Puxbcc+%Sx$k8NC*Tm5mKM&9u zSR|Itt};KPdI8sdbXz7G$Pl73Jh~1-=Cj(-T5;6yQ$}$RF7_vj6aGY(mCi>rrnTxT z%&q1&YEWtXdIN3;3S4vOw)_dpvgXunX_K+%!lIMDY3Anbytn}U+FC;eDwJ5LNs-^&T4U&`W8fhG3{R>Jb>}vuTdPlC0p%g0hndn zq&!A9)~xb#Hmh&(yr}tMuG{SJ(VyT@z<+hHYBGKB3jXlvsEzjgmh%c6;|Yy zo~&|+=GC4qk+B!7CYsE{n)3S*;+&HIKs0q2BWH&a#F4!X$ZDeI*BP&wT8Xb%8G4vh;5UK=us5}dz)n98_ ziVQZUjvtI9%8?=o!M0Dn^2!cuY{g_zT1MGNes%$`4?g&CHooSXA2)1 zjB52@&0o~Tv8M=V;ll65QF(HNaB0z7l)6<|tZoWuGpASL15rfqvXOg6Lx+9ws^RNY zRkoTjeso(b$f+x6cm+n%ShkKx$^1WyVPr+FOvtsaI6lG2#%!VX6L^T!?9hs^ye~Tn zZCd?te11xpiOwcujuaw+x2XNuuPDH%zmx5$_tbykO-nf*K77e%#ZIJ7nb4&FRdPy4 z@B7AJ=nv0wED{mw=9coS3sXInh+Jrie{cPJW}fu_+PcOm6o39R!K&YwWWLL7v7R`U z%jf$Ev~mU=IA&=VN)$J}k6JrFt0M?Zu43@*tlMIf?rsjoL?mPR(P2EQr?v~GsACHT)TG z^;-B>%HIa5SDuLC96BtVOB{_dTPo|M?{^jhP>j7L`j};xyUyIF%uMwom-H;YetKu{ zQP(3U-@p5=d~3K~p(16b8_ceJb@;Tu&ddAj$JNrsi(UVIbIBBk#n*7hy&Q(pRcmyw zf+MW&T4@=E%Q@*I(8shbBJT#qia3bJrNaQ6A9+$scLRJWG*K;Evfua$>typ0J)6yX zmWx_B-o#!GpgmY2@tII$W|*jw1(ymhV@mWf4nRylo0DF6rtk}fD`tyvd!J;Jw5{T$ zQoFge7SuSLEMe*DBj>mNd_iz9n9a$%h{he z(cXIYm!IlRhPrHDNQ9?<|AFerN=XB$WH`0lFnUG#6?*#-1O>e?2MpWEI7OHHK7oB; z;sP6~-RaerdN1d_ppv9yw$Y}6bn%Lcz1}Ds@7dqymbr`4_qcGW(Jq`MX9OgrngoNhYu?bdZ_==z%5_oFM0j=tNo%}Yd> zT^vAfuLE9V`llEsuliXREtP1Lqr1DlFOtKLdnped!o5kq4Kdp~#+;~dK{J4dDt6Ai z)|w-Rbr;F90seKz_Z|zXP8-c=x803rV4!G2AH>8piG*0Y*;ZS?A+Di3ktOkz3e&Q_ zP^x89B~glm``t?0&k&h22BF*@+xErjJZ3eR$^#AOM{*B`-zh_)**gNa;!as_1JoXy z>@T55Qk^-9$9T6fPsChZz6S|kETl$f27yBhv-r}zFg3cf*^e0At9ia4c*r~HkF5*Z zzEnT3OcH*~OA$8s!8%Kwg3(DfN*uTP5s3wSiUrBIW((B)Tggpr!Q|IH5<;VZoiw(X zH$jcD5oPZNCn=mq;j2=%zg){WZ|m21Dg=ZecnK7&-i<7D=wguxY^+V}j3jnNsScW* zq$5$=1(azR%-jpZvCY=NGN^qjT-hEW--v-zmlRME)Rnw0YDn8h7_W9{#}Bc z{&tf-$h6V-K1()PGYyirv^zaD=3AW>dGze7qhDQnQ7KwFTFODh4Eca`Z}D;;DUtvc%hW~m7_TSTZh`G3d}ItwxE^`<$}8(wNZ1 zsW%o9l~Niz>U2?VH_n>Sy{Mn zb)pY;18MrSd=BFZ#ioN%P*cH?>1Mr86%a~3{bS^2#y;{^xroCX-W9adF4}C3qo}bo z_CW=I%~VJFD9S=_`XKY-F>@Z`pvBG9e*A1B0I2WzRxxFN1^qITxjpq%RvTi1&DW3u zWP`Edz;>oB_pd&)K7%}=d?cIZQz#XKjDi&9_L3=g={GD6(dr4Ry%fdrSt+@gqRIQ> z>8jhgV}ujM@OL-w7fqF>C|)Zlt?+9{kDo@Saw;5wN5JBlVBDiv=@Va0Y3+lUERaQ_ z6|4zqMEdu5qH)*6z03j>B02*{GJtZ|CN&xi?#aj#JAANA`d!l$J0Bq)m-iTC-j(It zxz-NL@?BmiI}24;;umY&Idyl3kVQ6629SxbV?`@>bx{06*ho zdn_}o&*fM}dC36TJVqSK^O_SBH$}gzvn=G5pD|D8u9=dlcx7fQ6EAJ{6**Dc%Jwsv z7g>(YT_g2BvR%y{d8p4lM&4|ezo5^3WQ-+apIA1beRL#a7v?&_ zS|&SpZSB*%ix_R{0isca;Pd3a6!tgV%?9fRA}shOUzERmSY)o6_F_EN?&>Qr3F;0G zjP(X=Xg-1mUo;|vy@&WmEwI(&&i&YK>4omSJ1k%>U{}5^9MU(*zT`sfEm-7{ABYjZ zO?#l6(Nh|tn7@=5h(~?7Jk;|$Ng3BS^LPwryOY8=mDO_25UUaw%EOk-C(SQKh?FW! zWz{3)roS&iyOK%LL~wTZ?D3)6i0;`22;ty#@Da1C|4s>Z8ed5NEI=8qz^ZFc8v7uo zfEx+UV?Tgp{WA9xbj66H$uE=&c2Fp!0@|y`BVqPJ$U?#2 zc%n#~gzTbt$s)EAmS<<8z4Sob#wKWwG@{*o>%vN@u3!I@%Ik0spSxAw%KyHJI6)J= z*Anf)C3xBN$(0bkrh&7>E7t8wZ>JGf~Azz$t1K&2OYZosRDrz5%! ziT6a`G5^Djs%gEz#FmN5oFKU!mF-C=_cHrBJpsJ+K3uw}FHGd7pc_2DD~~ufe$Kcn zkF%>Z4T~K_%SbTJaYTx@S}CHhkw<10aeT&4Pd;C%N^k30v;9ZH3z9r_9Uh9h4Y{&u z*&NGS85puPoJx!ZliGA!7hr3yV)61D`!V@SwMfA#nxirE@rt{J$3v}YUg7KnM)*sa z9FQ;I)Wbo563Y^dQ!21cpGZsGW?_9;i%3naUK8o9eP3lfSRl34Dddb$e{Z0w%ah4r zBwCtbB0?pJmo6`d8x7+hFqE&)msIgHzu z8oz(R_0j3>&dWRxv)7SEh77F>Iz7?(b$RzI)UZl;y4`^njL16X%R2I{e}s&xz;Poo>N5cc+34_%{MB zPjXVfYRj(d;ZJ0`2M(5{soV+K*(b5P>Me$oi z571NXX;6lt>9w@ii4?DTJ0mv_GW}C{+EYo61e|G~={*rTL)$CkRemPXLDcn@75vfs z$_e)~CZiRlUukf5?YCxY=_h%j^Z=wVT}Z5?OC`>sYShVVg$rnN%d_pjt6_ZHCbQM?;u-d1_|rLYNuC zHFuB2!FzG@L?@h&JX!Q49VmgHOFsTlnJ;<(#phsMcJe@8@^&4nfjwz@hKbOp=5)@_ zg;3y+Ku288R1n8n#H1EV$7qVADa$VrJ4#EG@x~Oj1uGO_^b?^d!fE3lWF+ahxBp|$ zE!*O1wsm2=aT44if#B}$9$W$h4GzI2A<)n`!97TVdvJGXg1bx5#x1x*L!W-0wbogC zpKHDEIX_^3=~+W+%&JlI9yRW(FSza5O0_-Lpo#0Z^61+=%Hs}nPDGDkPQUTz#+v+%!1t^c z)L*_;QpFwof%qkP-9*0X56ZWwtx^5PS0z<70c$5_^mc5-+Ji8>Ysq?w4P-3XD3s;mU_oYV;;I60mQd@#A$-9Nt-iP#) zDmwj?DAY2`pLlWg8J`dBjK^r(5qmu5fgE`;_Rch@Ki<&{z5|mLcy=B3iLcay`q9^j z#Z@LrO%xS3QA1I}UXJE-E3A_oR7f#??LUPd*iv*Jx0iti79T_G_uhQ&K)yAV$u#gY zL=d0PCW~$?ms_9efP=iQ!4L5f)AJhVAdfq^^bPAvason!d&8jqX}7{UDa#uB*#!fz z(n{|W4L|bhZKvCpT~vKLi;Fe^PxByIpO$72`cax-fT4&M2vhazBdBQL$<0dt0sq=fBWH2ccNtORmJxE&U`*R@mZIx7;?)|K8T#?%T=y&Pdl!%t2kHXRupTqH& zY_DdCEW8fu)>$Ua8z(sN`Id4Nr|j}iM!t93*Z;=Oe~B%%qB3cq@#Qpc%5eQNR`|?5 z(06kWDF!#1PXc}z+J{)A`Z?XK5Je2~j#$40g&zt+qwE*_4}I8yHsl*zw<QRsn{swpIZgMv&b+A26OcU4=q3m_1${8s*uL2K0+fqrh=oubK_J9ra%Rbut z?(Mc~bWSOYyO6@9?voz;)G~gWy|Iffy;@z@wHvi3jVXj5Q{WcAyjbk^7?TcvpzokB z2DwgszQ7#HyLW!Xxi!67MGk0AKj1sF5gpYX%c{9Nw;Sbdz(X?$7_Z?xtwJ&ZK8CD` z#K=EteRn|QbZ~)#Y&@Dr56e3R2LEvIMF{#?;Duv&i>WWpoib+rLvpD@y*!2ORV$@J zn^>fBe)mwlncQo45$Uxp*mD$iy8OaS0lBCZ$0}Nhox6Nx*q5T8T~2#eKW!&J!l30y zPO(;UQ6C8&w~^j^GJg`Cf{H0x8%v$3Mz(i8M4}4^H7@t+ha*Sz$ArW;`tlq1>!&bpe?6+3p9-M;G9P@WeAudG3>gnek4@hm zt8Nnr=UgDGj~W$5aSX`^XX6_)+^tWMlWL!7&{&o`;wPQI8E$rmGr4Izi#q_;P#WvVT*7$1|RzvzGUfbf0Uf{5ibtb}f!lpV^KE^(xG~K|H`U{Vb#;$0q_!ZQioFc!y@7LN zVu;&~uZ-kW*@1yMh`7&cvB+2%ZLHF``1Rl}EO$+$yEh}5sAwYCokMPrAE2Fq_J}sA z5IU+$Sobb*C}8z|!qGtsI2qt;#p??$rn>B^mgLZV)x`lNEJPqX74GKRR%P;9Wrtn%kZD z;+Q^jbEkSOg8L(ZA>ZeR-Nw|Ej9n6@X( zz^pR(+v?EeVTJh}=m$@;RKXfbSONU8c<$Jw-}TnNA=4mKA5yZ1SBXxV1KA8kbkq0o=Tn>%ZVW`9G1a=qc z+)7?Z9!z_w?MZ7peA#bh@TEC66fJ_=y!D425^BE};bdYK*!LkIhyhoIdQ>_{BA7xN z7rZtMd$FD4dDTfzg<}4DG#?HPDaBJGVO%x?naj_@xaCKrT5|7c(>@_5*GpX;6Ej5w z7Yt+ph{d?pvE1VoL4Y@L;)$95YR=bkn}iF(*}q1;C~k4SYZFp?vUFCH$)B@t&-+;t z_<*yQn_E{aiUw(Ze2oa*q@&91yUPACSQK_Bd32-g6A2Z@^M^G!-TqX@N-N30f-+%~ zvTp6_HKL2&P;fyIMj54XUlXph5p2`$-n>I8U>t1hxMj9StoHl9EuE8_@8_3-6=(H} zdQ)2h@+*ITcQN&_V?5fv;;GKl;anui=u2MFS;*0-Mz0b%)3Y^5K-IsmMNRg+$(r#H zAC~2p`30Oc$6S815?OP2qbh)tVk7@xcV|=I}8d) zpX;f0w=*zAGQpUaQKBrFTcJcim(~+rTP!B$k=?R&Tj!54J*sqG14m*0nRO^G#_N8& z_!9fx+$X%8XM3@!_NN3g3G1Ipp9!Jpcpvd+K%|HSOK=$L5wCQpD=5 zYs^YsS>X|;@>3z2-wWwX?b3{~)s?(jP$yRFxy593aQ3NCV@pd%-XKk$5(-71hHHr& z|DkOx-mwrUc}8;a$LBZ2FbjF->9bp!=qHKcm*(Z~#_=xTHj{kGTmjsF+<=( zhS3g6PyZD6Nce@gmsl8qyqzc?8=N@c4@goVt9J69OA<`K`|;2#_9bF``DK>xg}ToS z|2&Tt8upuy^J^1UbOq;lBu@D6&L%2o?cT_p{?@`GT$8dt`y(?*_uP&HGHBRjjf5tx z#J6vUG?YkoyD4%%kucd^8LGovjgM9ISPW@^gu0!vCCNxopHZxKo+Fwg=d(q)vz}Dscv+K^8{Oq%J-M#D% z*5v1>1gcZTjqYhx|8|9E+>1;s6I&G-CPN+ zxuqK?>B+6{VhfOG<5|4(r#MKXnI_eYVWlhj^jM}j+vS#-2lPf3t=%cSHvV_dUT(SO)v6jEvi( zXZNAY*XZ3B$kmn8`=L*Kx8y8+>o?S~yn#oJlXM;UAdEGsh_=&%lsl5UNL_#&4iJAE zVEaO1O7s=mMjL`D+t-72k~tA@Z~>@#TuBpFn(vtygokz|F?7(iU-KYne&5qUiHP=t zgKjVYk?}+V-C4RD2jk0h?K0G3odz4uIB(|MK6WY=0=atSqQA zPj{X9LTOrbAQsCxq*V{*VG-1zurO|Z!cnIBvo(#3`PDc zl!;8ye~-#0kO?}cv)S4p_H7-jq~VsV<79IKW=qi}kFZD5@JJmi3N!$qEu4n$DyZg^ zAF@43j@+zRumY%h%sSUU#U34l6y-ca+rQ(mHxW^ai!`i!`dulzaze?u>c0G@BQ+#( zq1!nsvM1Op52%CEcWWwrSEc~{Vyc)}veml-xD=t@zH*61tP1NxPYVGuU_td_5eX9I zRIGL|c&>1u%4Zal%6X^o6&JrDpV*>YgdAq>0nk=v(44m7H-23g$e9L3?aFcl-ERM3 z3p!20OqS!O5H#CMyEx5T8@s6S?i?@h{l(t2zlmOT=3yH&ak3d6*_F{u+}d%4HGmiI zf6_ukBIGZzs}(l|D=_e=1qV|i?k01K7(xz2dRSBz@kGHpGd~Qmr#E+kG1}RvbH5C6 z<Am|#la@m{AJVt^caS{iHX|f4HEiLcf-rbB6A^(@$T6lMnb`~D&y1LJf{f9KX zHSk;}|9PS6xRIEd6d|6Z(U7+IOE{8|!1r~QkJr}t5B6v`+dt3*IUklzfHPa3M zYXkxUiWEHVnku@rsa~6irq)=`;yT4WuPcfbBBwmATUUh*_F2sEYy@xkrF`@L<;I;t@q^NKE*1Ng&z6kTFXq5c#CwoPD_vu!N$(Xw#9uoUI#i27 zHH@hZpW1XFLFGOTk8!hEZ%5A14khn293~2_feSinVguPtZr5e=ZXWd403}JYovUos zfognAf9f(&_1Gba@Dl}OcVn99Njuwbi93+ z8VD8~xj&MWa=-wUZ=-tXOnA~c*kkb+D#hJoF%_ZrDWcnnFfa}?4`ZsuEb}y7M3bV{vkHi z;(SLS=e$tdiELU)A)ZKw*92$XFAHZW^@ks;auvc{cF@yS@M^la@R9oqal5i>r6#GS zIH!?HE&Z`Vg9k~grhBD_uMoM_C~1S!THiJVdc2(ie6Mi)WSicQy7$dtX+g@nLCiE% z)LV69Gx*8yv?chrE0C)mOg$R5iOKAr+{n(umjt??9d^sog_05>xA0B23UBrD>& z-QYQlMG@RTu`i_0qyedyyDDo$@N|88Jt)of6O>fqhM>?3Crk*OSrS<82-L=AaPqXP zr@md!%=1ep`!|IoW;Ux?#p@%A&~-sOJ(6|8+mvjG*_}s1F?Hol$0=#8^rXgMnq&d_ zHE$R5yH$N^Mc|T@`b`Re1H_Cks4gTS7JnJru>rvfczFvDMq|i49uFgp(lT!!?KUz* zptfZmkPhIOp+Ob?+VX`W&ke!UX%$X+v{!SFB+%cBnfPg_$eF*kcmjpm59t?{0o^UR*%CZWqS zSLm_YkDs%v(SLB0N0*A&*;uj;TW#Tdr4oBS`KCpo8CaG3X*R6+GKr13>xTD{_!dF3 z3*`#m+CxY}$nrMOFCuC)`+fKg;n>FEghHN8Wgf`MtlZ{=Z;L3ks@Ntr$R%fg1LkTw zyLmT%y?r!(rdKGCv3e8qS~88Lwbgx({nyddi&)8tZf+_kPV@^~ z(RVO~w%A6JWK{K`6@3@qgg+mq4~#qCW}OQLvxr|B!pN_kwuvzH@B4eericx(v!~#ynXR2+f2bHp^QuS zd6a2Y6Xzj4<0BLsYZ|GLt|thL0HnA#j775SkmK;SM&u&BDx(ER?<$b)(JCY?D?u?5 ziCSWMNd{ZeiHlTru>~k`zvF=l`bqq30q^$jq zjdInwajC}_5JV@kJ2=qiIfWu}T~9=KAUpNT4z5cYZI`VTpmCq3-Q$_I7=}`40EDw8 z?K!Ke=cokks>xe3Ksq~)37Bv$Ye(H2q0@u702~nWZXMGdvVrd>jGL!aV;LGuI^Zl@ z{pFf|P@3iS=kb(aG?67ZHPQSL{XLM{dMR2Q%lz@!^o$E_tV}=Nb?=w6To#?7Bs7|n zkb0C5#wgkxxVemiB6#;WjtFvoy1F`{9Xt<PI`^{)_`WA{dx>eQ#Rw+--6n{Nve! zaOg(nyqo>fR2|kY^zxGC4S12h_Fzi`;U?iOoD#L)_T?79j8>+m5RM&$%Z>RUN-Mz| zUM~44Qppt59F|6!ZJ_|Qa8WqBT2$GLfpe`d2|p=-h*k3V8g95jG`{4EY4DDlxE%f2 zBtFPKt^2;iCRugt@Cb&amL2D zz|A(zt{10zu*QTk2X^i3EmmzhmS`=#Rk*r%tUk2&gj?tLfm)iBHBjq43org*9=l(064p`Tl013 zrY&cf{MMrnZRxsD)5NCc%cZ$vU<&Kv&((tw?IC8*kEGD7NbLXyCi&XWnL1U)86)w& z&H8_v0oC(xATUTa7m5!a(5y_Y4IQipT-P_bqma_U-zgcG(qa!LK}bSBK@oN}q@O|E zqa`InCiDxMoGFi~m70FdKX!-o`!k?DoRWC28oul-7^=<&gA5F;|;b-7(o4qqx zIn%{sR+a+_6e1#qh~)1{_4xQ7>t6Ki5;J6}Fzm>9QdLCY))UL15sugD+P2H`2 z8c`U%RL^giacFl;U|u|&6}n(a(pKY+(y8VZ-Bu3(Fcz-4$4t|8=26U1<`bq$N(mff zw+JxDX5-uGMjfo%RlKkGgpY{kIPeBeA$-wRhqcVXQ$pEQjb-Aet;wAA-R!iG&n>7P zK*Od0+OAV(X9fsheS`SLnWe^rTF|qHMyRCp^EAJ5$eI7)$_8<~M8GuMN*Z89XuQnM zb^oP$nYIanE;+~!KDS;$qBQGg2hVYC5koFUno)`T&DPk#p}rrQ0vH$PR)Y#Y6MR-| zL1k)>H*y8j>=5T%1Uq+YIDRMWQ+!a3JOGL8(ARzJLPr5RcZ&+66&a?BJ0o^VsdDZU z_wK=7`Q@@Zck}pX8*%lJe8T#+bJ_}D`fUs9$eo{ackOeVGZy*Va{!02(%Na34!ROa24sBx&CJ? zV2jd=L@z8&?@9K%;YJm_yM~*U^vo=ccp5&k)87KjkuLRUwq{>nnnzd0<zH>;xlB-ShQm$rmftezuANvJdXA-+cqGC z&roA!d_QK_gNlt55vHO~;Bmw3X8Ay&&S3IKNr5u6gvdjG+sDchs8#_!%7Dh}P+EA? z&Wtv2E$Kxlf|+m*;L0h4s>LFf@2f>4Aro(d2)Dse_19Hmhz9X6_4r`YH<8_}SXL#p z*?%Urln@jHAk-$vSk}2cYv6R_p+!ISheDv!C3YxdSSAwg_{kEYCbG&(00t)Byr-Yl zz*|k=seCOfoFWivK0K+^@$`taQL(X@Dheqe-j#J4=1yUV4P@x=L#!pn8mj|&VOn3cOhFv*UTmnN9j&Q>0t?$#fi{u;ShIAHQ} zbJKFs{yh@l=jZvin(LoxF)>}|my147Oez3Hr{cF0c2QL>qA`d*G_TLgWEiX6!-;#s`EvJHuv*+J_3PJ)L zTyT@{KO7Z=g#QwG{y9%Un1=%%hKK)OR>8lmT>ldJ{+=uNFOmOmQRrWDx&C(M{Y%7z zTZR4>x&LM5{#)ex*IeGe=L-Dq6&h$*I9OZ$W0A^E@CEU5|05FIC?WChobmpboT*wn z+j`o;J^vY1_lv9bzaw$#cv*Pov7w>jnS*h|B zt2)uG^*E5@spC8U4h_lv{5?&ETh2O#h4JB6?$!Q2^=@u0ejXjmL&SYpoe~{h;j6#r zzw%qV$=|#S|1(mAx2KWvLi^W4iPbD6)}N|OtGRdE-j_cS-p;H1CUPZH`p9>SA_^gS zU5$Y3olXc7<{&?3*%&vx*2K&!ZMp0 zs5l}h&*gQz-P`%~LIsvQpEpR`m#hz>VW(K#msASq_SsTYaSRHjif*F7dRcUWSL8BC z(nI`zXdl*bXui|Sld9jyO)~4Mgig9m@yH&MnP>z2_R%e0yJ9A50VI0{*lgb&PNH*^)rqMMeAETt)M+#@a7eot$||?$cJF`-^A2MPNUApkq(Y z^0h9$dGgqgXXtX7W{5#;Ybc`(qOWF%w=%bjmE+0lVwVc*z!zD&)|B2&gVevunEt%Z zjkd3QkyofywuH9OEZW!bj##Fi&%tzgb~e%weTq7_DE}%kuk+olx}as8=I_jgi_)(P z;}pIj%dMEjuTVCn&DiJI2qr)%L8<5)4k~rVNdY*oLS$c^8t6WVuCbro8cCz4cOMPb z%8L0eU>J;>B~<4^HX#hPak0EJ^B^NYYz$jtOY{9!s( z1d4z)m1z2MSM3JX2QiJ#eiHVs=BLLag1FOj>Hk!``2LAFLGFK-E*^pZ07IUC76x@% zURqA+zu@8w#|kZ{ob@MrOKWXKng56)%>RlazeEisLM_UHuDUle<*3#S+GpyG0DZJ$ zbE@doYnS21@{dL6wd0+?sWLM&*G8S+P|JMfke=smHJDNs2?O9!A>q9YvM_nQ&qM}4 zqWEJ$-nNskOTmJtyj`%abzdnHCZ`Oa0K_jn#6!EKp|Mc!M_{8|?`+M9R0P$t;qZ)d~{1H}!jM z>m;&n+`^17&w0+(`UnXb<6l!VF&i@O;?_7?@dafhbL>{i?R8sBr>eG?JI(@XqSHoM+T(SiAA_ zW2^BRNLIKLnZ~P-NhO6$d71=#)MFC!v;vXQN%Jtn(9-13d{pphUpiWdQoMds=85mi z>!wdqEqBZH360bTyB&&Q?1yK3hd@srFzbavo!jd43?3t3O~VWQHuk$*_M51|qOgcz zh$*^ljm#R`l5w@Pti6k+y@_pQX&*{cGt;@M=!H+s(y8#0v~zUqr1B+Z$;x3xHD8kQ z?c{1srZ-)WuTSP@>Gl!_zu@uE$>)N|POZ4Y%M9_f3!zD;{qqgX9;RLwU+x;qr70`^ zPCfF2iecO7CVbDvcxb=lhrt^A*XxtU9Q?aA$r&Skn?$C4LY}U6T>BpbUPbuJy$r($ zMADtMv&v0KZW9Pv{Pm~in+U#yO~E=tw$s8Mb>#N3_o_5sY-nRJy6Q6n>|4|JoBImr z$C^UYpZ3JP$wlRokFsu=qjSwfPK6AdoibnO3g!~t*gxkmj_8+GiOd-|mdd-kpD~_` zo29O#GDq7BPM3c#-9BV{Pyqf`&!GNYIaVdG;O>-Zn!bWvIYyJAx1ppD%_-}F@r!mz z!T@8{h<5)0KYyd*Z~Slx{2Np}|5U=Sdu3T!nGYV;R>l{T%(zvl}5CzuKU56u1t zX8!}T{{v>i{|RRN{}Eu^wUE~il&WG7ik86wk&QuEtgnuCY#qBqY;m~=$d z5@{8yac;hBA0|p$2!s5GlkFK^#M0dSNdan6#hXLA_4EX;c z3B3R6j=6bw|E>J5G~*vFvgY6Yu;vH%znWVf?tk{^+SVQ}UhbCG9`Mcoi%7tE1Kj5? z4fj9#dNpe+`wucM-n2%4g%uR$p%vifG5N18Ixi3H|0k{aPsD|rmj6Gp00k#*0eCdN ze;NPlEBOA?feHNovj7Dbcc*{+{_VjH@AKjN!2Iv~_-{$z|9|@eW;;xh=v&;_?_$jo z`cvPGg$;oPWojR3ahSDi$ld$W+wjNkre{pVO?17y>dJg}$2(SFo#_cQfnQw#lmT>Q z`aWsY>Q@*Vl89i$W*XS?iR35HvVBwC{7C}^THDO0(_^97PsL$==soA4N6)6miPfzW zK{HAF2H&Upq!~Et%z7^R>}!py5pnPG>~pTae&T-#TKDtuyFI_ZEDK*Pe%zv%hznbF zy@QR+xPOT7e)7Nl4)U$KI%%T8wV}pI`5;LN(=d6q8pvGmksPL*?M__O_N%`_m;4%B z2wKMREgU$2sl$$-Ri-B$-_30WDNUaz){p;OZST;mcaU`5r)r&s_r$?Yj!#nC%#J%B zk4`?X>lrd~%u_vi*WMnvOu$B(%ucsW;~XxAG(;O7Pjn6e=q@+iG|!MGNyzrbrDUh5 z_m!D~#}gtb3nYcjIsg0$Y=jO2J*!CFwP6Bx#s&f@^vrO@?$RaB z++5Lx_c=>8zyQ1MmaQ$?5(L+?jJRM(ZqGYf&n_u7RYL!+>_Xi#wkjQJ33dD!tZL8KRfJ# zSuGfnQrjT#INr9r;ty3=0%>DGKxp8PJeK&T+!ur+#}Nsd(`4@G_W2a)s_%<>*1Y#c zFF*O*K;x3UVxgH|k}~;mSvS{IK_8o`ZBE9{NwrVQF=jv%crz8t8vQ5!?08j@P}>6y z+YANMSgtCK)7cM;lwaRV`iNMH2P@+K=zc{|6<*E^PgA^N@cN!uBnx=TbE8pe|&m_FTBP^A7?^L)rs<7ZsfBm4Hx2=ec6`HK%Ep|5KC$~3o8ScoS~rS&IpA6+BjAd>yuN!9PE zEwbSkpzqEEcaq2|&WPHmr{7Y^(>?I`ya-=R85vi$5ThWU;5pC> zi!;W2a@jeE_w#?B?VpW*`Ge18#|CQW*S<+7K_r}g((lGOXU{%#r^^O>z&ZXNy3vPZ zDr+`t@~RU&*7Va+9Y6HM4Go;#=$#V9|9F)veHkWTtLYywD`ZSFbn`Kq@6qf38%~Hs<=#(1}yHjX6BEaut_J>Q}^Lme-7&&zN|Y$v3*-l90U5BkeqmOjMwNh4!&Dne$T zW!)xSyVud2;-7B&xRD(sy^U^n8D0e^%`l1k-^%|vHee`zB8~p`aOQ?=^Lk|T#Z58k zUi({dDtQVlb=|5pLQY<$&N(p8Ws!G!3nYr)Kj7PaRg^y2?DJjkOsY*|yy**TJvlzwf&=HnY^Z`-2vYOHDoDW&$VSTU}pk<()oL z92Klk$nvmjsz>&si8j!yAV5E4J(l5ZT==SbNqH1;jo(EIB-bvwBPdK)a_mM&jxNbm z_0UeuYIJLlxAdX4v0M#@BO1DjBYXfC6N8fQd{gF&E%*Ku_doH+D|9u^Xi+(5EaGZf ztii~Q=$Y^ey+{mu@?$KSDqzDwip8uSgz@ESj2aPZy8Ll-`2Ya4xNpCiPR-F^vKZbh ztr4-vG7>T`to;*~5cW^g+c`2(SNuPJ*CNGDs;7(jWmooG_Wg%eNx*nT-YZYT42GXF zsrTLk(Tv7TE&D;`kHyozm8AasBa2tutj7rW1A@3coWcRU=c~X8>$iL42q50R@Q1PF zoJC2QyDF6l8aE)b_#LubVQ@f2EujDAqXZiL9ftUs)(ic%+YPW0*U9#lIbR-AHT#Z~ z^6F<&N+fd#Y8<@uASaFX2f7nOAmVfYh_2hfK%hbqrT}jJ1%x;v2D!rTsgN-g*-3WY zEyrYEl;nWx#su#Q-9!uq9thOJ5u7N9mq$Hw$cjO>6cbAPEySgT*2z9bO79i`lm}8q z)A`kwZGeN!rr@{BJ88<5b2oGLE3CCkH}l{>BY_lz&HHt3kYwV!bV_7^`sdiFAAzQ4 zfeFaAU|&=TT(NqFQ&M5{NymqbIAqD@PD*bs4vQaA?O_%(0ExeDH=h0?YN)Ciulozn z^~Kq^Nn_6mZ*9c2CJ1>tr6#E#7V4u(;%Lj zvU$^Bs!(r0LfrfHFfyD<^PIMp2+v)t%pv}#K_67CV)Ip4*E_s&ES9{;@T1F+$Z(>Y z5WqVzr4sF1NM1gIZne?()a!c2@A`3OP63!+`V-@Qwia~s7QZ%vdCM^IKNcbJH84kJ zW_J?zMVgI#V1bg-vL_@yL;}@+8B3YBi`K~wDKk}qzHZ3-Ge2~`FoWy{-&cbQO-8j= zkU8YLa^ZusIQga^?|5Y}NkQR>j{Oscvt$~@V`;q|=|F05MOQp+hm>@yi6k8nU;4SB z_a1dvM}3mxuXzb+vx7udOyIFZ>Oz)n^B0xuy>dI1u5nijJqrqPKjxZ_ck#;UY&Ap` zdJ;;Ddt-ca(?5ZooUsp@-pwI}Li@7k6=;|SStC{PoScigFJtU#oM0s?p>^a#OJeS$ zsiR5jzbsoadPT?{vTC%(&J3)MfJ>fCM+x2)nL#AU$!aX{>bxNPoBR#tYVgA7R|Z(G zHE&*yBSSD}B#W)PnMAjL)nQW)A#`e%Mp5$&Z~6G4&I1!sUXPC-n;z5Nn<=0!c#X&1 z+{6}ln8krb=&VwrD)=f0awuy!j5Uj}TIj#IMQda-GaNW{m^ntuasxC~qvG%r!tyw! zg+A91FhY5g5-OYYo;|)t;)oH$LC=`lIACW!m#??A85dXQ$heeNMr$q>`Xe5=cXXZsjAC)Pcs6PS`SZ~hX}Eo-&uMUJ{& z0)1&-RZH=inWFc0om2ly{z~CTDaXt~^)4D`ce?^;H7*xQOKYm8Pjl#cLa*K@PCuK1 z_I$i|H6mzE2E+1={i^Cj7xx(N_%c5u6U}_TJh?|%F6;0b7+JYPd4&9#AzHgZ`Tk{@ zJ9;2UerwdUb?ct(P5UdGIqRD4v4ObWq#DX*vO`NoQnAQPN~`-~eAhsu6ECu6CbzfA z8H55D&UsUN`Rd{7a}XWiYqfL*IZP@g;Xuku_H)-)d!z?BZdV!hl**D8`NOA*PH zY0?!Ekr)HpmW>~qtE<_}W{h-kR?Qbb97`(3>;sm4cv*Se2bWWZOFcTb+zUmllfDWF zZ$TBrT4m~eh9~n5#Ggy=FbP8eQFbE)c${}Z1x5G9KfJ##;m!B?adZYLoIed}7Y1y` zB^H`vUP}U}E_xLMW)lm&2|$4fY#0}JSZuxBq6)YwmB?j6q+VvYvpI&C063TJ(Pj#A z&+)XyB{Ud?WhEeUA!jEbi#Kob55+pzum520=Jl z0)~-aFk>tmgoqWpcAj8P=n1@!|khubfen*MVGJXFI8z-7bng|~VKZu)O|B9QmOI=8^D zSjlMs5RT)BIAlCiU4OVWxUD`e`q4`B07^##SUc(zMZxozzm290sW}xwhv>tb&EOo2 zA^F)hdTG(zI``8e58?fg6JRR6vzv_Vl_{#j!TF;_asFA(#E8Z|$6e5DUXB={{4v0z zVx0(d&Ey{ts1nk>w;?N*!8-Bwfd&a7_p1S#EhQI;?S#2ZCy5A2DB9bz~Nk$HM zwO^bDphEs_>lG9==Ns0RkS0XGzH6!>z16BH=cdCvw7qTqbm4t!`{C-Z86NvCI@25c zvu-}GO*bS|8bb42(|UrHQztW6aCq10J(RPsEL%c}6X6X{_C0BQPVNjc2PH9eQjo@AQix9(={Sb}$; zOnFyxYK(G(D9P*26`P5y!+#Z{>Qvcn9bPX&$Cyrv$`G*5Q=wiK^pJ5e#)DZ!Kl0%k z)r^)(%c#y!^YQH!(#Ms!ebm}}8e%T*Z8|BIED9i$Wcv!qh&ldU%}T}wr)#AA72zH& z;nhjWh7?ZNPCpt5(fw*f5YIk~4HNhp30bS(E$4^jkX5%CghGy9iIWsL>V@!dAhnDc zZap?z_`)3)coYmLes&`>gou0KOTHp72$A%la<*R1L=IJ#t?Gf1#>g#+w9Mu$}A8cBP_pKbX_7mi~d|wrUr#THCC$#&I*6%U)Fe6Dbdn)7E;y? zweb@wVY#`&y8`SN7A18S+`KA z_Jr^GU3pALK-_iv#6;C~``%uv&)VCM>hG66{wd449llbc6L^kco%&NaHnW8#emb|6 zfTO<;w;cYqEYT{g#_^Ly(jk54F3IAcwyjeW#D@t|Js?UEOhJ%1J}WYoCU2l&OM6s< z8zNoaLB)8`6r{n+QQyO2rQw!AD6!EpKCtubzT%pblhiH740^JNNrRC@@G z7fQ-GQdJRDjdV?0wJ50!TQ|pIaxM`M8zD0#|OeDW7gT3#s8u>^@DcR|xbw-HFPi%`R2)J@nISF40q#h_dJ&M9v5) zC(x5wX98~as0{mUb(z*Hnh(rO_c*I1%bT0MBnoEyvrU+7ZqlxcP;`X=dNFk|^&%MY zto(z)I8enSCH57pJ7=bAR`JQCLR2PR6|0bc(9kh-SRY?*!~?Qt{6l2Q{e>7Yd$=z7 z`nLc^8`{+A{!uk);iiC}S+FC9OyXqTM_F%E0c>?1k*DkH%q}Zy;@D}U6)pJz@}6dW ztEp}f`*^?9MtUoi*_r)n?8xOW%|~&KCQCw)E?ZtOlZ5d!G%^mMx!^uM4zal)Jpsv^ z?zVR@u!+s^gAky**6s+B?+qCmg;!)^1E9^1aBxPiq6BU-4qL|SJ5Gc;I#~ap^qHUV zr0jkhsa;=EdN>S8Q|e&-PAEVg0P;<;lMXvibk`wdUt#!`P98|~`}&(VI0NOI=0pbG zEL%BB?PTqSIllrLJ%ECxCUFg+5G@-^q$PLoYd=$=Agj#48nQ-Pc39P8&Wh322z?0^`RrLc=TzWV77JKd3%(&_<) zM1>v4R9y3dnGM-9fFT1u>eqVNY*K^x_r5PvqPdbrqHs~C$U@v@&uR3W!!U8=JF){K zO!cyPte6~GI8+~H9du}Gdw~*SKbcEIUR1~YUNM(G&}|sPnJ=!jZWzbuq+jOn2+rS2 zZRt*JU-Zgy!Um1k5q;mwUx6H5j;uiXwo=#<=|iZQx5HACMeB3QCJm z1+P1h;9V;k6Fvr)YqaJ;f`z5BRd`F?fWmyqFm3es;p5sEiKMMMQzFhERSqV5I@M-xPEN|P$Hf*Oxnt*hv{ph~9|f2j=uMiuY2QqHVJMdxP6VWSfc7rh zJ|FatJNa|IU0}cReQlE3eOirqQ2c%SnbJUbS2d-=u8ksHK>fqMQY{A|7A`)7&aghw z*yI~6TeHWZmEntbv(!z`)f?UuK50egh+i((ntk|YV(HsGU5u&zw4f@bt~CpZX}GMg z`WLS?H$RDWxVZtd;5rEn7vmL}YKPl74S1G9@EnOwxPAnm)Ac7WK-$ABEa zhb**o7wbmO6Q4IC2&bNSs~AtBGysQ?pu6>Rw;X9)>N}xHmMar12xS%gTH6OthvI<{ zS5mIwmvl4h5$~2yx#)zv>+%9#G-Uvp&N{C5Dn|=6<9|DqTqC_1S zOcmu}X+aWoHuKpkfyRTbMltxs3-A`Pjr z8Iotk+I{QnP@skmr(!yfB#6eO{vq#f;L%RHJ&pl_wdv=15E8s3sp8X}T5^W>iH4np z3T0KX?#Fx%Hu!dG0!XN&>HADY2T;OirUB%ij0BQ<`q6j}b81EwvYKw9qE%YhY)Kh@ z4W=O#J}cq{&`m^;Js`yll2*Ir6mIR~MtJ0OpA5O&3r#|NS}eE0Xy3leK~Zss9lQqy zrOgj?zM~s%Po^Rx+k9(>_uBgj`FdRAf!tZL!7S%k<;QK*q?&0D2?@y6vU|KVfKTXb zf)U?P$MASa zr!ODiTL>?j0xlt}K;Vq7<5jykK+^WMKcFAun{VU;W<>r^=fyOJ!&%vVBK#?;VqBlr z<;z~t@%t~+RC`ESt^>l7*#Lo6~#-q0NJ3;cPighp*aFe7-K0gxiTa zKeaqO>R-q2AC&ogO*_)ZoR!USkx4EIHxPb$S!VWvwQB|va}xKeVWq}{>ahxy61m3i%(enhMKmw48M;19eUwTgC4 zok8u8+_OCor>R+Hmq5;o%!?AZ?gDGr*-t(+uG+{<>$G63qAI}I@1x-haK&lm&3vky z%v6O74&bcf6m;R11K3x;ftLw(*;bPetbkTQz+%Nk%xqZk@=%J~_R>jov^BYrOgBZY~Y1oT1G~df_dmk=1T^^4e*|Oc~l{=K5@q%WiLm%_G^E4$)h{Mx&W+K2q#b& z>#x6Ps{MK>Byb65609tWsKLuN61WOk?Jtv&aprMBkS!@zz4hyqE2M%?X)(w+@BAcq z-OayTD4dx={`w_}ZsY`@CF}T&krD)!^5X$1!Ea9BK}qQhFN)7dxR?{^H?>ya6C`*OT_o7D5?`TYb|_% z!dSXWRogkCv97b5D5k;xWjpQsF|nRR?rx7@bC+)p2AU3K$O@#BGnVK~(7WXDI`&OP zl<^k3TG~&TCPQwS|K{#tNT&Hqs7hA$*PjzcBdPnitxHhbJZC>#V~&q`sEd0A4mo?g z5x6wtHBR$OLRPpev$Gl>qSVTCe73$C_nUp#`l|NiG^xWwJH}`|;AiL<(U^K#wIMz{ zgJZp+(WNK4Cc9FuR1{j+|7IshEZDEp37_@Yee+2Og#%nfn%k^Dh{EAILWS}iyEsm_ z_idk#)luL)Z)%T6#2!;~Z#;G;PkTGgDT}!4b)&872dr|Gu8s=3t@0Ax#kfY`C-2uc zXY}Ban&;lopsE~)QjMmen1uy20L3NBjGL0IPkTZtgH9QQL;MM!v4*vswjwGpFM_#t zH<%ZS4-5ZZ-ZuPARiMqT_GO4^b&KJFNOsj$2UdwKuzoTLh zOI6J<-#`2>Hr_g_ttaXl#@*f1;!w1>ySuv-N-4$NgB5ov?rxSDu%{&4&N6PV-m^}|wQfXQuzl_LG$yvN$HZlIZ=2-Wq7^-PkAu(I~sB^w?f!w3? zPGx7Z;)~6C$iEtN)5^cRQOcPRrRbY4Tn_fd;KNc~+x5{T6Va zI6+oBaPwmigCijb$i!rkAqbvA=I5?(ww$jMFq17UObqv8W&BJ1w6gzjd!RSPI|d{v zJ_5Fh1F-B2d4ll@dFh-P7_YFD{KqS}hP@J^drjkEDLhV;&yE?j zK5mu{fU2L!*763Xqs86gT$4TXmJki)4ziLFUBrA~k~dWb-2N-1;Q)s4Q;H`3aeGnh_@n0#rWNLDDOS zp9>2iVg;|yzurq~y{fo8K1L+MRr!#xJ|RPt@5BJev#ja*-vm+fnJfo_q>`?qWlD_@ zo?^s#)MdK&-Y)plYIobxF8H%*ckj_|_;bwu?+3*6DkK?kdQP0;6}jX<1ZSdm4hbnJ zWR~r?@P^RHinBpOxli+fLu`B0) z>CCU*cAbigudvqwj=%7ZR2+wjnQfq*Mi4gKXjpa}xQW;9!jVX5Y`Q5s-k9rUT|ng3 zSxA;Q$MA`1q(3KWtk>)ue#F>0CPjG*V)}!}*!>n&PM{-Bx_$d9$lZnP)Yg{ZR8TQZ zU+>+oPljnUhrWJCaeRE)RhjE(W0oA78)jQ}G97nbBqNEm(iT4qqM;_0UH6U$??XGm zq^jk7F91HX{Ep#QH#7*_kbE$2Qt0hFaTNN>?x$Z0Ay~h${#^ zk+uiA5aSTAeR!$OvgM0uL>Fx zrZwlFw4#^w@GFG+6&fg75`^h0CK2Hvl639p7c{p@;~V8Yd9C3~0Rryu#9*f~22ghj z0b}=yjWb=rm;E=t)~dF6B)eh?$>22qhr4p8HlNk0&@jFP=P15Hp|eY+o5qV90Z(!8 zXXURC))zeOitN{NksQSnoZ1f_HL>|+%bx^EpTA8?&sQrVbn#w)cY_Onpp*e?WE#Mu z4@TLcxHqh;=l2qlO;>aUuMF*Kmh_U<$-o%x0k{BF_ni0yj6=2wqt=-s;2R_#my%1u zbHtVH3Y5PjZXOwcJ05O11cg$Jg)!Xhg?EB8QxtQQqG?tgjfl z26Fh>KmAs!xWD+_nz;H`n0Tkv_H>tXYSM3Sq;AsByXI4Oamnl{n`~`Y{>x{frc#zO zOE0SioGW5bDh{ucL?RAv!mHfAWJVx$4c6;U?zdxpHvNr=J$ynnii{AxTkbfT&MR)B zQT_oN+W3!KTc5Qq2=}cc6@>}PRTDb@iq;iKQ)@4^f_Tpx>{YO#AVJq*v*8VPel8Iw_IQY+MOQ$7auRaJ$H#G~rM+ zGy>?!Tzc*h0qBgq;#PEhp>s2jlzHzDtW_f7J=rERo0eBTO>okW+Fgb4Y5gIrrrGpH+9}|#1L!c8&`^0N{ zP6%)yYWk*vLAXvh+8#ce%8Su+xs=+h>6d~6an_invU~+p9%lJImd$%0$cBfN@>^=a zX}yNmr7p4+YWjMomV6e=eMPR<*!fy=De;QI+4xTHK&tDPszx~Gw`D`83f;K+cV;z6 zlia>OeDf-maCfxbR(fa)ZOmb--K_`FVP{6VxeZP@2qj@?0_tWP#bHtVUp1PkW$_w0 zBhQ%|>(+yt-DF$N(Z4IXEfW}rM@RqUYA>wZzLgj?_~J}bj-JgdzGVw2l3OgZSngu{ z2A&gdbbQJ?8cGQ7l&?X7S?D=|8Xd%G^FX zm!KW3+QFb;SgG0tH?w0~A}Ksnl%E5En-SZETFzg8AhS!C35OOwPB|8r#f5P20jqp7jVr4^q#m3c#ytNFQ{G;*C(EMeO#awofr z-AxIdmO<@s*3dAr5W0Yv(AoaW?+lbrT&-I?^h$ zZAci6JhWW@zy(dU47@2av?i?plrv1ehqT8r%FVK&(gd5*S9=klaWo=iBSWeTY13@# zq6ymQ%Xs8UrZW_FidA_;kU0p7v-I|ZHGdff=_do^8Qijlpv*HwH6Z1@>kOjO;^$vH zEf);9oO<0l<^&zXqZ4#E(YytaOTME;dr#+9mzH?JN5;&;&rkp)P7wz++k6NqiP(F&E;wa zKxI9fh~Nqq@BW;~w^$5p7SJNicNLXUd_>eR2@NVH`MPtC|4k!%Sr8r^@vshvd4zqF ze--!}s>GR8ugOG-s6GC0M1p}l%U>#+3Jh`HA6N0~6P&;OTGkCmfdamCE!;6QyO7_O ztcqwRoW)dCw79-u%N1X`$4lSGU$Zt~2FrcPQ|Q}L3ec{d7sd@rALtt_Gv0f8QvS{Z zG@U@myoA1MnL-X=>+<#mn#;8<=6difEi-LQd_QPXEl{lSoN@y;H2iZ}mjB+Q%&e7U z6{Ly(pH?jNnPROSQfP49nB=v%a=jPP}2KW z?U%j0dL41Q-&5nEd(D^CeR4SgBPgcL``!*YRW|F}x&wdsP;vA>Xz$XyLFnec9TtUa z_LXcU17ziBX>xR9{&IcMKL1s`_fd59DStfI;Zh{?I0Nhf-c9-e;wlYyoh`FFnMnz1G1JJ*CC@sEcrxAWUf1EuDryR8t<+~( z1nMW%R&K0aJ$zz&`7mlx1w0dH@?=#teHigmF@c=;g!4c~d_tlEr9q@2TLNyW=V=D3 z&=)uke8MN>!l+Rm7zLK5>ayN}!!5`Xgp*Sx6VhZ~p(`a-T=J&Th8*wxliIY5|Mu*- zPf_J@GBM<|aCmi!m>)2CGesVfVQQf~@x2>dY^Er;8^jl*{M-VL&!%dRcp%epw~%z{n_W4=f+=?u9Ynckla#6um}Xa-?AC_pcyrGE z-mpiWTHk#4STr6nOyKKbL#d6}w69hb@-t*Uog$M`$+0TLXqvYS<lKgis%HqOedgk7!pX-631n&B4^S9~adw%po}NV-JkJsJ{>T1C`7Pji}S3 zdb7F+qY&wC$*@?a%`nn|)pMHdK%`PII*2)8$oW%ctM{&m2NmA0Zz+IkxzD|Hl*zpC z4bHzi%Qhr`R90>EqO5qUc|q85p?;9kLlIITZ1${wij~CpJ;-LKH!)8L?$P;mVg!Dj znX_@XS9z$@`bs);%L!(#lBIYC~%O>_V5YwicS)BV3U3)G%r@5))ELp1I#et@ds8 z2<}}VfR5j2f_@bD)=Us>azkgcRX))=nS&0X*)~l3D{(+WU5Z-5V_9o{Yb4J0MsldT z>3o1-&N;}*Egq=MvrcBfK8?emSiF3o+wvHxI5RQXh;goDvyg0-*>pmfmkNX=a+ zQm5?EzJE87KNbS53MgJ?H)JiS)V!DJmCG9gVC9oZmc3^v9%LWY6`$F^)PuF1VTN)j z>)ek;;^&Wza3ye51(ZrZY=@*N?pl*6W$5;Z%djNF8q#46g9)d_6Fkwn;wT^s?R(h| ztN?}LI4m8~u0hsUE3s-@IC>BN_c9a=rn1CeXOl9)J^N-KjU?8pi|B=FhQ{ zl^Idv+8n^HvpM=_YMonD{6e$?_h=Dg-X7lxa_PfbQJz%6u!O;C$~7hTsX1^Yg!*rt{n>Q;*bT}zuQpWbVD#_7u;NP;Mai_MiI<0 z0H2#P<`*=_EsM*0Ku^tcuR`#Agw10VsMk21mi7sGs)_ytO7*q3F?=MbZ{Lt{bdYW9 z2$@ES^S9_oG&8D8;)TnpJ?>9VK(Bh=H=sBjJ{vlKQ z{f4l~eTrY_n0|hN#iw@#01Ml9oDitPE^@$M$oS>B!)_U0h3XdH4WEgx&BGNWZL#Z@ zzIgk7ChNNmoO<7!58VN#viuG_jZgjH;yl3|}36K`6LTjkRKjf6Xk?d&hwY!SrhsdE1?785HgDz49#4{`09! z-!1lTC(&yn_GF+U*fu)O5gXnx)t?`w^nD;pQaPmKXG|D@(i$rco}P&~j-*^XH65xA z`uQ#uk!R13EjXR_ZY2kWhQf=*_@(Xyaori5YT0HXTRR{@a_18DQwP>WVX*yem!h zjBM;_j%6t}=nq?L=YbiBj=mg&Fn;BPD^c%3KHi!t91~57tUVa}z+0b!trnm1Ydm71 z_+xKrGO~~EO)G*?(rjpDWPp;hkD0_kd9oD4vNsjh*zTCoavH1B+uFr?C`9v+5 zOz&kCDh>(5vfyJv_^=IrB(rv#>YSl&lA*k{&hON$%fHL^T>S^46_{^k{`@WJrRjwd zq9*#09TLv*$bMOI)LyU@f4-%X{bEh9SL=vb(zM}&RlelIYx#D85{DxGi_ndR%#p6_ zl59x>P2qWRm^@Sl`e9oLhxlqh)>C;L&G44cwPrxpu6&1eiKUD>+*a8R1i4kVQ#gjz z6wb4>SG5Al)4b+iO<9ijaUsffBNn}Bvk9PJnDgGh;uTqyy#XQ+xHCGytCESgvM%QfC!?@mkqVzzNWAB$b^q3k=LppQRbl(O&&AO{l$UuP*)wmZ^kRmjQQ++>;6?fbnXB=2G$}&vHR9PXeqP>~BL=11Avk9FFN??d6W-=MTGSd(e^XAHKpK346sr#<;WgBWcb_{ z7UK327WU>}aVH9kEe<;wb+}YG?`_gEG#4iGUb@~qANWK#fhl;H(TZdnAEMqBtPm`6 zjz9x{f`kg|6Kw%!p75HLh{ymn9K|#Sv|EKZ)>G?m# z!ns@^Bq+gT|dMLO2thFGBW4e%$xg*zN^D(1aOWj|bA+g}+E{uR74z z{m}S9Uw3>U0ao8$EnuC_r61A*XDFLO&n!)^bF`z6-t{Qf(58*vYW;1i76&JVo>B~Y zFyHljxKuiS-It0!p%!}X6p!scdgdOmzCyorVxaZT!`s6LecR_(uchxOsVHHcNtJEW zSBiGhN-54KRLNR0BW2WNlL^e)dam=(Q<&*Py54Tb2yeR-%KRaL+S%*8GbC0z_3UY< z8g9&4hI9s4&gJ}ea2RNZ`s-PvZFGv~h3jr{cv7iLMy7F(z&MQ4Nzh{_)U3#}nw}S-x1dHFC`1jN<8ajj6nTrv< zs<|>Fqw-Y$Cs7Sjz=ciUd1$bgIOjE7Xy4x2*Ff2?U2vw5^bCE(D1tWnSa{i-X@eHH zE<##HVIbxCzRU6e6g)7#>sd3f2+aNXeFnX_heXn0##?OxuFEf0`Qf>8tT^V!XB`6^ z<1r2j_;|idgcNky=%m=JjRDQ5ZRj05-&mfkTFw(dRi zhzfNQ3Ai^^?bhxfBn|KUyC(_dgl2Uji;y8IiH3U%7G@17HF(~7xXwNCLS|`nuYTEW zzM%NdZ~yUmK>1g}^3xCB*=*MUuA2L->DNWC=a&|5Gf)urrpe_!7^~;#(7spS4A56gaT@$=gpRx1_#MA2h`-6FBJi2tH`1GF{h>U2a~$mz zs~+s#)6=a=U|#zJ%fZ8@ch|rDEPDFhWn<2NRad@G!kj$nkLO9Kh65Z36tA4;sxTzy zVOYFCueLI-#TN~@ox`fIJG`(0(&%Pb7<^)bzY)*71Xrw9#weF`w|3vwKj7JEJH zm}|QHp<4a?gGRj-MNogZ^5?{!@Wqu2)uN5J<9V&u&TrN4=(R%A0ykHr)31W@LXmMo zT3UTA1|t^2BY=@DZjTKtQr6|1d*TD3 zkEn@R-`mH!w_2>#@wI{h>mw3oI^DZ03nucLJO-zMGHaKb5IQY~8EQ#l=d>KXuS0WIw7KZtpKH9ADs9}w*p z?#+H@eK$1deu)-l6X-<{)wte8+(cX7*=JtRDR-ChiU`B_C86-EcyaQ>T7ar15B}V* z5&C58utX{>W#pgG=&*i6!Jvqj$SVi-vpz}j$$4n~tup<{z%a*@J@s88Y7K7FzzZ9{ zYo0Mq>S*b&#ysN*OWbMMrli>cU#r}`Z}*kE7(IfNJ;6)%ZCKETPUS2CP!V;fZNu~m zQ}L(JkUnI?v%e}b!-PKDlkdUU6bRA`Pr-;t$*LZ5;mTZ+Cy=<|~LHyZB*l#?IJk86n`M_Q)epJUfm+ z%M?o^db^HrnKs5`%Cg~lbVPvr^V8k+i_P^NTcM{{WfxL$vW&r@$l^^K7I35c}e38OFq7CCQMZTnE87oJeaY_z0$-!(=73Y^hvy5mm5m>Vx4P{VFno! zPdDE(xTD75Jg@baO6*@LV~xYjc!S5=tyO~%Y)f48D@#MGMscbUDM0qEs_p|STBB^s zF#gahHuj*>3+KUGb7)Y#$TDKV>u%wph+-0oWUL$60cmq(WU{#>>CsA6^Qj_o`yzD8wAJQ8l4AyYD@KBHq~O|mjjN&<$9ua zyPCM5=)5`?^f80RDa*xb)i#J6#$Sz-jwMcrDJk@KsoE7v%xC^wDi+J>DmK4?6l)hE zuS9H@TVJp-ti2)$FB?52j2@HPk!ZCLk3R&~I(O#ZiZG7%L%osH(|W8g9(VVpT_(6C zl}9wiM)95!el?uknc<3oZexjJD`N!Rft&J&bDPUCzz zzIE?zlvY`Qshy7+uHR0pByi=?g=q83OBLu%VQeJv{(i%#sYZfj>|x_)0#E#a2`kUt z2CkTaKJH04AnWO5oPQu3c+2ncwE6tAPHlb~i3Q}pG6=Kyxf^#*tzvq z1>*WSh&?LZiM1C+l1)DRor?1sD|e4o&D8mlf7_4V(4@hyd6dA`WH!Iq+ z+KMk*f|KYXeXjMJkfSyG@?`qH%zd6YO>LQ(9^Euw`7L{-Fz~mq`JXgdPj#UV66Ax9 zsMG$pZA!l|+)kf(06##$zu96*@^7-=7IH`?q|(RB9U=@Cn_fO}edmDdRbNClEvQ&P z9z09yfJ4_SH|OyX@Pt1Yffa5h_N-{sts41!edep*I5CkDmQPG`UD=;=3+mYMKL2VH zcW{meMICCoA@_i!2->NqSK|%l%&QqLo`j~^z7zB_smqzVlZrhs(0`?Lo=SQ`-!gD8 zmcE;l_!j<#xg*2Sk28=#wr>RgmnzWAr?EknG*-Mn$rd9+di}ISHSHE(29L;0sj~S& z$NiAg&VP@?_=EkU+Z+PBa~vFJ5fJ;x{MUQ|XS?5909Ja%I<3~9ERiqjcjV$*iRUz!uPan3!r&UUm8of>O$#8v=icT_?$WCC+YFnZFj9o^ub z91DsYUf5EsKz7U~#SoE|rC0dF*^Bh)*An2*(tx8M{>M-CxMdUxaH8xi1!NRjXMLV2 z51x2u)bo?+l|It0L0kvL;rg$Mtl-I3g9RzU+Nhi5&SHm?9z8ADU;d}^&kmdlD(1)E zMa-GmoekHj>3%7@W?aI1V|`4hKBIJwI@E8qcUY8fH5xEkUH;T}eu$>^m!wv>n5Dr7 zox_k~**vjYa~!jVPBzPeU;!V?9HgtjYa>zQIY>eyNXeGOMdf9LU#y*s+I(UEUEp2=*`X$mN^Z*+*} z-B=t)jY60&V|9DFy>Jy!Yqo=?cf1aMQ*%dx`|4q0$+G;}k@6)lY zhheA@sD@x>)D0BoJq?@7x^H&i$r50s#^yf^$g`LDJ~R_J?fb{AZb_Fe?lJK1fwzu6 zxxv0S;?${W4Qs7me@ksP!M7GS&|^adSW4|17>0_<`)N;!u$hO5Uc!El@3+*?PJMch z|0W$zc#228BLUnw*JDj}(3>-8U<$l#e4Yi|`u|?olk^2WO10FqZ|y_Wwx>-y84)+s z{~jGmV0h2)o8ppiJq`vS2O@lXrjstov))Yw=E`t$ak{T6dz2gQ}azeRvUb7OG-jmuOLAZeSChbD{n2 zwj!0Xw98}0=<1>Q^Ir+Q6{C5w@FR3*Wj|o4H>WXttSV&$?p14A`)K)Dx?)lu{3dvC zBU%n$Zj@>yTo1TxlJSWJKM(C8H|3z6H>g50(1l}JLT?8LqV$sf1vd{@om^Cg>+ zM!^TP7CF|5Ajug$BCW^OfinibbrL0+W^u8N()nH=3GB@UTdj@O&qkp?2g|?h7k=w3 zuCkqJ^kESj3(ME{n0Hci%Fjm4?k92Fh~bBt5aqpOPO5CzQ%E z(MA-}OW8TsHGI8(vrVpAuSs@&#iKv+7Ni2SvVEmp|s`jz@@aw15+)Wds zmzLu%wS+?q(^KX++A}Lbl?J};{g?#jMZD?KlaVS6G6%be$ge(z3>foL@9);c^LtbS zKXMnN-zeBW#=W9$S299I;BA?wkjuLyDGT?X!~lr1E1}gcn_&n{(+VjJsK}p{1lt@b zgx5OE!XD<}D{=gPv`VkVzIT~1`)pF+gpXx6^Q5zaP9F1}jA9&?d;bvi)Qh9Ftdp9n zL=m+0USmt7vp7Qc$2H}+e8e`Ta*A5kedSTdC@6LuFY;aK0t*a9lXe7~E26h#?8sKj zT4x$ccb4->qStU3-MU#-=z3?=K0D`ymWY5ipYU$|U5@3t+mEfa!jhyx_6KWopIkhs zS91c3flCQeqHt}2RI77?njVOCG|n*i+xeYe_w~n$@`A;!?Xy#yQ^wWEO!u)Mh_aqx z6AyVEriyq?tWtnj1>mX^Ps*(ap`9^ z5QSoe`M@RMYz}tqT|6$kYy9b(EmWve%c5Bu7j^Mi;{o1Uj;G_A0#Qv`1FY7tjyBkh zQ>wU#x15Yq^0X(N7E)9bbowg}W>T<*P)t&Yfz&EzrYep7qj)V;>w#ivd1-}^#g;aD znZAr6s^TvS*r5P3iT57#ox#qDO1))2>#5OR*p=tZS>sFW*Xph#OV-k5!`3B3Q|ZOI z;_2JJ+&ZpYq-TC0t0vR(;N$vATnYY0Au?sD%yZ>5GIRd2NA(}Iv+sHp3In&KA8%15 z;M_w2_QOQ@}`d>=}pGtOhQJsQp#dN|E_D^62{my{wt}$F{-=MP083 z%6|DGlft)NN?9|=hDo#DQQB&mqq{cpq5D|US;=>av&vi-^84DKzEY&GFfDx}X9qbp z)CzO}>t}wM2X1Dl?L6(<5V9m(%fH+?j+?D9YNrWYQ9hX?7y8MT9>vGh%XMt-6A%Tk ztpP04PoIK`7k;;)G7B0`TvfZ|#1~ue1IAPGI)&Su*N}ykI6w9GGpyfe%{?cCt1x%O zw5BCP3o@yG)S^a9!RBko9zBMw~3)s5~Gjs^~*~u>r>=ngq6wcVF5qvqS1WWOMqiqobn*oj(?I z?j{yL)cYjz@8%b45bxIZCl;4#bp8U=0=tEgEkXw(4S%Tn!3zR6FS*}z0~`E2-7{S@ z!k5|uISm_us>eoZ&TUo33MFJ>*(_G)oY`sL!!{E0#+FJx!vZEo>H(C z13z7K>dPn@L`Z`MeCI?sKqf0}6iJe|)jtva`%f*0`%oES$aeTAYxL9w^#(@p1T69S zOiGb9XM(mbL}WP2U_w&mfG-uyzC5=V0&_BYg@NFJ&9erKkyvh{Ep>e9cC34^a@So{ z!QOXjsnCwA3XFV|41~c0V)*-?PbXK)=lh9LKySY?q>0LHC9oV6tf2(`Yc z7v?+gIoscj5hn;G^<{HhC06#rg(p*|>6*G>MflQeeFd;-HMy8`bmr>7utxfY$n@yO z*B+hb6m`{vW;eo$;8K`FdYt-q-|7-@%fc}wHWjt#Z=XLGB0h!ZgFD_ll5Y=sgp>-> z;>EtYTN;uK9y?j*r7>~CrFha6G*Z$N(I%R`CKP#9>$%X|y82}8)kJRpdU<+!X`8X zTHn^qqs~k@P^>rZhna?~TuZ%4^}UiJ_{CX+8%nt-2l%)aA^4zP;@b64%_;JHKO;wJ zC9yjyP{D0xBZZ_!A}gY1Clg>t>u1nTfVf|w--kosd)G>kxBTvIFS0S7>X5?j?N)N< zTB(`|I=R6Do_Ev8#0Mr``fNX>)^vQsHo!42U2u6@I=;h}?>O4~KRRP*v(10b)nZW) z;la`rSV4Q2Ap4o#H_H~Y3~j@&Q4vTvue*g5)vqjwa5G7k){?Aq83?K}p^1n`!tTLs zQ#RYZZIzaq=E0v8>s<>`z;A|SAa7>m+k%vC-X@5WJdA#YElne9mU}-$K`>E}m;Z6Ax((Az zjdB`0h-ER{)DB}_M-=r(;kIw_2{AIjp2V*O1-f+#5TjE z*CX&^r*5GV77Ax27-t%|yL;Pyt?*biOI@FpM8lx-Y5On@9X3iKY|YI4fGG_j$h!|1~y(VvSV z$gqGwxoODAPcW9=@5)`vdI)ARD**+@T|J+-znc&yeex)bZnM)2 zpY$7U@vcxVjLer&3Y{eNR<%Ya`4VVFp{o4z=8BPO2Tcf^rwhU4MQIDp*jFQ6SA1@TL*aY)9IfZ9fgtAhP@+Y_=>m-Lf9fN zRZD4(@P-9G0cI2pK2OFJ4SrO|Mb(q-*MA$}kG6P(YFU{GIQR%==34j&t^udIBrbOg z^%K4(@n54t*1pio_V4slpi6nnx5`VK+S7Z*^AWJrOz{y^eyFiv%MQm$XRWg`W5W-G zF`op9(@H}tpvQ{L^}H@*QB1dmred2<J8MDXfKNewaj6JTSmHzXyE z1l(O)9sVXT{+>(NhL^Xxa!Z+@y$n1 z=m0hbycVe!5~F(F;t4Lp`B1keZ^fYBqy6wRy!z=3h{X#FTIn(>1EUPhpTF?^%+pN8 zVPV0;v*}S!M`@mEXT!j=A$?V%h&5JDpSep3hx;_2A)2?U*IDCvGMf=$Y3BMC4(?Ts z7y&D?`-9ZJrY>^QK>F91eNtw4GU*iVTBKl~ChT74o;JVdx5-U3-{E|ECT|&^{W$JY zV&LXo#M4R)1rirtJ?V}n7*IQYd4KMqYx8|cDcY1i_Vni*Yr8#KS2&)k8DPCVU$$9T za#|j}ugb`4#_&Jt9l)`?ymDOOcnj<0E&!pTb(;=vp->2$^_8J5~st}xFh#DQ~ zuuZ1ElBh`~Tc0zhw8~Mvk39*H(YJPbqf|dRCpM=Tdg)NLLMk-fE9U=i!$4Ps#Chrz zV*=r>cgGtUnC$%XX>(qVH5SJ!dHZ3L*pU4UmOG7cuvg|_U1n2FflKmyQEs0|9hTez zvadTc#Gb`jRW;N4PUR00fC9t3QLlfVoN^t1k&pnSgy?Y6R+RcpD^ql;!$)KPP>|PmvjP0^KrfW~`g&(Nl8~)pgkMY0?%zdlw?@H?H4n#hb6_ zCi4lgdZ42kNj=uGgdQqlhEu2TwaX9x_M>j`Ce8B6V)q9Pe;!1MY1Zs!ozhO*mY{0- zrCw^-M0Sumypbr9n&CpN^Yj;Ez;IIYXL%tI&2M$^&rqAcfDjrl3~C4D{(jqhyU;gN zX0K?gRHRXM*YWeS2zMO)CQ7RH8{f4;l`OfDL^Se<+1;r6ssT*l^fZs-GW+&pOO}_; z#uNe=nB@b#HI?o(Oo0GL1<+AnOU75|{%lLzXZ2bY_9BC+)71!=2Nt`itH&ASHe~$N zS_1}MKM!DXZ~%GF6c~v)1%PSE-jqIDm}HdleA;9uE866_->5F?=HpMOBRA%S0tKu) z&54{k0jnzgt{$2QuqZea)$K4qL)^=PbrX5g%<4N;zm2n{VrIYkwd*a>n!#Ao`uKr) z2ljUGBaPd>yPGf|#qiG_lq~H6A`Xt!C?K zjzBVpvDT^$h7StY(Mx-KmkeDjYXsupG_?u7_y(bzhmo4=gOQ=t?7QwLWm^bA@LUL54x=4;=? z{zR%b!xkAErJ}Wevk)r~lk9gcm)tRkXWLBQ+FLwn;0dwv4>tgr+H_k@jJNRUoHYNe zU8nWnV^^JgYq$8Vjfbu`%)J-YN`xJuM@v%Rdqu|-Pq9k`UnC2j(X*_3Qw=%npMbm8 zNwK?Ef93t5--E+In7PM!b1`Kq^Ls=BRZkSu+5T2aV+1S*y-pU)M>|vIZ$@3;jvZ|E z9)2ZsC4RGfIvjBmjP!(`J)M6KlU-54|K4`HHk{Ljie=y$RUGxR(jepWm-*K0HrZG& zxk;t-gTLPG9+)bM`cXgxvfXUk=?B0Ow6m3 z8I{+!wbNte3;da*Z_Q$-t>KZteku}Sh)qVH1tTWz<*E_RBeu2Z&(j&Opo$MgM)_0# z#rJWYi>>PDYa=%|($VCf(6DW?jXdhH`(f}gfPj{$3N*0EsxAYf^635Sxs8>TQkjBj z88NI$q4@UWdN_oo+qyo)S(q$YlJ_#LZ_yEZKGAc>aYmqC>ajWNB=>vRU|z@-$*bQu zgaOrNhmcS1I2BI|WWFm&bEhw&Clt#cF-M4KDvAaAy`*`E{h*H&6PsA`*)fe%2ZF7-$08vN?S-HDe@9|}`N?Nv4`Oyz z(QcCBeFzYmj)^g%f+sbajF9$7o^hzu4p$F|W5~uH8elG3>E%ue@INvPpeG*dAi-fU zT)cK%!T4IDveYxsJM+z6vwP}Z4Cb}v?c(?nJ$~B$2{8!J9EVyR%l zY;3Bx)ii6Tg9Pwg)&CB1hI5CQ0d}2)O_zvJbHPXY-!ks@XGk3sBEbKUEZ0V`YIx?q zb_-rg+2WHhTMti-CZe?~Z%EF3CnGAwMc?-0nG^&Bl)S;003MToV7!XtM`$*)N2$~K|iZD|RH=q;rTV$)eRn)MNP zxb!EO%iW=I=TJq2H_Q>q1Li~2(QP6sp2zPUt07q0ViJJR@xO(ry0v?oPwp^hiAlh9 zbzrK~InfbC#}Kq&e%w2jDH6vbs=oj28*lQ8*3a+gA#&Bmk3D!2EyKiKairlV+*!jT zV(&_RP(#PXJ2xDa$6z&<#UZ`6wuX~g?w$$np!g3z;(sety&uT=01C-byriLK56n1jgZLjIR&7KNwadPfV ztKV3LEw|RzZVxhr+d467%-csY;fD>ZW5*1F{p#*xZG^m{4dN4T>$NqG|Bs!wev7*6 z{>AAbXAqDa7*e`xXaZl1@S~DF8g97NOk&H~{|n1cMme#jAyiv)vC=f59n3)xcYP z=MPUnsQ|x>`63E9=Z(c^j^$2quZ&)R=So5LHR7H)vZ> z5ZFa(+s9F_us~gj_-)0Mi1_h`wB=($T*rtJOZLK@6erTcofkd5C|vif+qXvl{dMY1N0S5oKF7D63*VzT(l(m08 zI;B#-2LBOGCDe%c9VJi==px~N&rq^xfEsreH8?3cpZtG!tXB^B=ciF~9URmd=1Eq&XFmLubRbj3HFoV*n>_9e%>J`x=0pR;mN#8l<7wRt#2 zol+dBH+rmtUJktONVTDR*P|g~I~4e^%t>Z;%OIDs?DhZI{MNwv>z}ROmgjZlAo>Vt$y1xufMpq z4M|PLOWU%qFM#meL%$EDJUYZUXb^4;Kad&G7-74Zz`W=@>m&1%IX}%hl+m%cz?ZRW(Il|Jm{qrn`FL&J{uBkM)`zR6y|*2*XOgT5H!Lw?mX%NSH$%TPPc zI!-2n8hf~hV0&$O+9Jy;-fr;w#p^JK!ujR+KVQ@aG&iW`-Xa$v((iyou`wuBXU#DngNf{MLT}hWyB# zUUGgKuJ~KtKglCgkpOrC08-DJZcY1H2#K$eaQcwOIvRwsMmzHV5)!xaiB$wV61@uv z>n8U392>AnUg{$?HXu}Fb7Bg;3`Z!MOmuz=RRocr2CU@q6PCtTM0L|QJoyL*&)13*pF&75}o#>(J-TObs@6R2dcu7=|HnEwAU`BhV1Tr>Q@o^&uE{0@OWuzCWQn z8^l8@&w!(&k45m~;W)b=t6Vpr2yWawe2@!{)o&IKmnmaUi9{O3Uv^HS8;7t5k!RI%hNJ9tsoUky7~|snB?p1*c>lw8S-D9uS`SuJpiK zJ?UESnGR>^m*NpY2h%s8VN+jej3ufaK?vrk9GT>?wsU$L8gP%Q2MvmlI)J17sRyn^ zcU)q(tRZE+BN3n&a11eE|5_=ryTmR@+;UD!MgiUH1=%HLRZvC{XsFHeTRb8Jq?kCC zuMu+H#&+cCcNej-1VGIqmY#?XjrJQ>LI*!y;EzLh1_rDm(Q**Em(ZYsURKmRx(S!q z_k+FYP{5!6?@1*Fm>k3N+&dhj+k-tY>zJ&NvVg~n<(mgK zGB@gRrWmC}1>m_HIAM(zk69lx@qj>@o$`TO-FeLKM zX_QfkAZPIq&WEFYosk4Rz+YJ^eB3V|5-$+FE_%cCO^_tz7yI^*GSoe|HI@l-dz?w0 zy^SsS&?nvK^s_>ujr@Yp*W?BDClWe$N8i5?Y;u4AaU`VvPx1-k>?uUvtbDT}Gf)t0 ztmu1Q&qz?RwS@DXUJBz}(G9k1$72RJr;6fre4oXZGKvP?gF<7nfLED2xbHgaw(=_a z!0OP>7xm*|LOvz_yS_l`aXt(o6uL@;gaoBrMoPF&!ch1sX?@$Gi`^zx}r zHNg5N2ch_xo;q+nPh07`YV)HqI?u?OBx$3xpCwHietu7cwoQGxW8k9rCLam2Km1g- zwrSkR`^koTg_?t?j?8a8?`Pe}8%5Ia6At-iJ@T+8%fLt3S20epq)~qPfowugbWh5T z9U+enbKcs7u#az9XIlSYby2eTkQ^R$(f%}hP9vsWxasMW*eLxn+eH&8hTm_)E4s%#nlI#j)I}TP2&UmN0wcv0ejX z@ic>P|H7BZ`~%gf85UqWMWNP(&Y{wq8PNJ*suDk&G$p>w@#Q@+K7os>9TB=S+h8x+ zJHhK-)V0QUjSGeen^S5j2bnEPNRuoTP6JS>zSppFJ8t3uCIsNjHP{QA(=A|0>NG*? zZolvBX=5O_oE~2(Ycut%=B0-_M}`?hmmE+8RUJq{0NwInzv13CeJus;j^MZ1J*X*A z7uGp4RDu`RneB$4yUu!39phbP7nJzjt|V0(p5Y&SW+QZ_BcK;3s~i}tLQuy) z%y{41+g73vl=w+uZDXKus|}1EVzm2Hv5%_WUxQFmAkbG#hkMZd$S*Pf>PL%8n{EV| z0A?ExsifbSzf7w7sw@IrGQ2$Z15csBoqH%B66LV?W8GpOXs-&Q4s3Um6y+}D!GAg} zX|E3Zf$6IYT2`6bXu4dw5iPAS=0+qFx^(ovQokQPuo3)0LQ5pQek5Z50?H;H{b{zq zJtszST#S$U$p$v6(M@zB0&d!8-r*UH7~_htj}i?sT+@p&w76h9qKNVRlW`7VzJV2M za@7~@{SbG4u?N7kf!Dn2AX#eTjLLmuvBPumZLDdyOEskAmPe4(Q(}{FnNe3;VZOr2 zbf#+mBd=(z4~|-pUOnss$|>{k=%NpD--(P85oHmD+?oYH*NVMosrz!Xrsqf48c}&a zWx_ZGRu>=MOo!)}vQ@#Fyo~L~s+?~8cwIlI?U+-So_|j9ka?Z<__fj7YX?}{K8b$k zQ^1oKlo+DZbpk}#FpqGej4uJ&zb$JYlRvh7$aYi}A5%h#)5iymYobia6T;;9$&NqA z@Y#{0wOfbB!{HahN^7+L>w%EgY-E0>^)dJw>e*QXn#f%Yb z6zNb-rrdlYM7@hfy)R}hWSV!-3oC$+6kcHhVlBC}LO2V40zXp3KHpLl<4IApQ?IE0 z`C^mc@((Qmo>-An!{(cE#jM>(M&Uk7c|V06aY=;4o%0s+)H2?>$n@JxMo^0uDjgH) zx~x`ut`F=y69J2y#LZZ&40o{(P+S3l|`M?T%* z_0+g1-c0+iOd)MwthFD!;??A9d%>EYOWFCcZmNo4#BKMFiR5f?g9wJsQO6^e)3R28 z<~Vv13@0SS&c6``e-pOJZ$ukB{PP=T$5FQ)6b7gTnDJWB%0=%}<1x8cKsP zYcV(JcEGfoyr1b~J@O7fJ+L;Bhz}~fl+IW zaeeU8aR>@r0uQ4a;ksCB?Jzo{ZFt><#ADXY`7I&Qh7RXk_kPj?xgdaoQGcQ z3)Ccvd=EAt*H-IdrDp}%FK+X?iFi|lyrihbP1yz8MuDe}rkS&l1!LPuImSc#5oh5a zS=p0Uew~?;MdRH&^KGg0DMvcCBf*7DcpdZ+2=|t_JHJ*hUwGTi!A{7g0l(Dmm^nl5 z8%;ZV*QtE;5i1>Fd_z-qb1v@DWY1g?)7<4DrT^tcXtNJ>zUDVp;E+iw<(e_=EBPm+ z>_IT?{-wPVw_JLyPAubG>`OymuP{I7O63vJ%&54IS}@J)v#X#r(AQr_aDL#g;=sA2 zM>36^e(RTO`;F4-*Y7!h6`Rz5k@WGgz`HQOjDORK{1x%B1Fn(2K_vxtMdt0xjx;|d z^=RAu@!$vJVlmr|G^yaA8&`8~qrmNFSdO}+E6I=)4f#7|(KSuF{5n#9kMz3%w)|qm zJm9PMw|w;QIhFnq=`3g57FN>oazPiD>#@Ogfp1UT=v5mt8*bXUZ}tcwk3+*<$XO%T zO%7H+3YR#b4zc8n^S-n=&SfWH=qRVMTO+waqJwD%uQJAbj9w^@pt-x6tq1TJ&=+;PFN>uJeGwkC=iG#UJdHM#(IJ@HBqB0i4$I z{!)`dx#W&Pf5Nypn}8HyW3617&#aRXDs7w85?^gG`?!C{XBcs`c2;RroD_N-G6f58)(v2(76kGzh{O&h9~53Qt@QEdqR-vE_90 zHaJq0$1RqoBZx(u94nTgh8VVd(GRI>G;;|>ty?0b;6V_(5?n)uGC_$H&z>F--XZC z$an)@a;b}nBPoeGdt8uiHJ)DA+hoI`x0}yX30jZFjyHLmq}A_=2!3fQg{lo~V0Klr zB$zNB3?lQ_HAtjaX4NgKj^iqt14_4JSaBu?sUBN$-ffA$b_t}9;q(B^+fWn@E5ur?M4G`k4v0_= z74{+_0u&=TI6Hblw14TPCBHd{NLq5f2#*H{rwI}(y3N01e!qAy*xLbK>UQ$#=|RxV z0dHPRdyUwJdUoH!_Vn_Y*afu8LwLYBhd!Na>m62_$`hw9-ivNToxZIgb4%7EJtPd~C=QxXm} zFgRv}fbIgSh1uCggNmefcuZyz-ztQRCNOKge4zb3z4dtYDe3S)N4LvNXzGvTGAzGG zze#eZ+B8Z_CYpHeTD81buustUISzx@mrfp}U({<|$9_t)E?AOKrrK_~yn%cxp$lNf zP|Sk(Z|yf2jOSyvEGEXDQk3QVtRdW|2n4ug8-OTJ$gj8QVabQF& zL7h}DnRgm(4(+mD_>E!iU#|yCKCG~ev!b;vx1kkYoE${+l6?POq?3|2weQ#Tjsbfy zen}+f$Grf@cb?c0Wh`Z}6AM{eqly}JpJ3qwvM!|%*L;3eH9cEqBJl3o7iY6P)9BG{ zPHe_=Y%vv;euR4nyXqU@=xZ;zl(W(kW}=?S5;W^R73#P^bxJaK{AproZdJ}^^447t zw$F8byUYRMX~W8LYzw_D;b`SRH&sHni-Jv*$r8AUANCNStb;8AOreIJaXpTa|JGRgt9QHf1+5R41+-zBM(RAKk`nGH3x-yN8*hAPq_Q{mBM z>^6&FR#}W4pvMEI>zydp9GpjVX7>B*$F;l#jlN~Web24DRS?y@knozCnInktqJ)c50bd=O}MGF+Tul~T#zwR zp#YruFh?O2hFNhI?X?15lJD>$9wbco=zSin=ZiT7DG`MAQCgKniC-B z=_{ji@ZK71^P@DD>>?OLrWruLGC>9^Uer0QHxV5^;~k+`xhXTIzm_1gG}Wh@UtP%y z9r$LrSoW2BKg&WvLY)3}^_y`X*R}wmYY2TKi0mG-Q;*4e=R-q}=i{vXSZ`PP%UN0Y zp`71o)I@+^*u~T8lxs|8*+#3zBdcb5Ys|Srwgk#&*h9#?Ew&B4L70+v$$&N9vgDYB z;sJ$!$?uw?6nj;#Exz~l3$JXFB3uM1cpth>;pphhYwVqSD_5w$OM*#zSp7f*Sk=7(SxIv$QgRu^Q(0&3kW zYdOnm!djsHgUK?*rQ-HCmWnrKhYVzUoBeCUOHO6Eb*0Z;V)pSf$J1!~FfNOd1Y^wm z(6%3c9#c*w)XGJE;LS6gDk$gQXnyMl`;}_A%nrWb`1m}%JNWzs-_IYfRqZ(!x?7cN ze?QRv(7EuoB7wG%ro*bqV1M8(C5ephvrGN*PK{;OCsFg%8yk@_8n`76$H%ug;w&x7 zl1#dV=0WvRe`RCYNJ8Ev*^`KJi+9V0nmy%%YL=u%VKROjiR`BnGU>O=#B_GV$ui)T zvbzJ`bv5<)eSv3);ll{|%kfD629#dynGSfx3r&SA0%|S`wQ4015w zx3bOw(GM6`Z>%mij;YARTe)!pX2uLYR1eB&I`1`;9jih7+UN!Cw-7n9`l zK${vnKXuEC(Is!@yA>ng-7Nkc#)JclV7vR=b9*1J!&%j@yy1rHF1{iarntPqOd+d5 zCgiUifb?xgWlm1(J9se_;lsCS(0kiRi9|H1o(-aSbd`r4`)O2phh%Ee0D2pEZ=2#1 zzMFsxf<~XI1|&R>^Uz5W=%-HDViJz%6#KEns|E5Sawy%eXk>r|MBtj#;+CPoWd^O8v*XS>BfNfHy^DQ zUy73;%bu@DIo*w0UoCncS4`^GZ9K?pIc!YXMc@I*s-ORmovE|+muCh4Tq z)9D=Pn_ry&xD%O0Hst4Hoy`-iIY~rEAuecH4Dpao9_R(Dl#gUvO8ih0TkT36vJs!A zAJQaZp5}j9hv%8-?serepoIVx)0(r>lnaH5tIH_sV*Qv!Dtg&&lh28okeV z=(7;*TMSpg1IeHTiM#HP;sKs#tV1taKl|H&e+!*y1@LG>$%{GVsJJ~_7AiK`kiIz?=}!d-r~ zy!g|O*XZ`~-hpKv=u0$tj@N5}jdcCl-d{q07upcjdb&aw2=~L53wtgY`1a@kH;1>g z30vY8SIGr^ZVP6+!^+9h%OEJu;j^>7Ul-L)V6r6dGUIgNo)o zrK=knoCGy#poA6m`*ec?wLQF?P%{nVj-#?Y30FyqZase`h}UsNeVn8BF>fmHl@2cP z2t!PFP|lRgaDgny;O>h$y*3Ny;!d0`(`7k(LT}Hy);K&|x=;Qh1o^8#H~|+~hJLr3(H2?gX;PGgN;1Te^!a{GimLL*>fpmX}?8$sU7gTIw)Zp28 zxz9#rL22?a)dkv$c|kf4Tj%my@VH$zWnO$n3zTy$dB2V??)L%&z`O`qAX(?Ird-rX zvf&F*PU(Qf??)er?UrM*wQL*mTXDX=DSySxxjq46>7^vi+i;aWq8vf6CipN)=t3($@U?J-~nF;XeKbnf4%;2`=xm1y8V$`ad{sy z#qI^|M+3ui2WcSv6(W#t5)KT_)HP>~gWJ~I&t`5O#Fim9+Q+rg_Ju26+Q?+^-%at^ z9o>I*b|>qt_&{-M#!xnLO6N)H`^GSgV^=jjW$W?vTkLkV$8ay%8|U^cn@-P6r8mwc zp+{wO=d~#8{8o}YST`Bt;IpGcU$N_dPZ9_#;q@x{WL&Q@BeFTVEnjb4!hh0N@5kQ= zB8&iZS5%K*r@5cf9Sl(8WsCz-O{D5>`m+K{C6VTtRI=QUJ$uY#_lXaC3uG$}Dj&HJ zGcob=2+IBvA4zaZWNq_*TV3Thxq6x`vc~}lWvs|OwOtE8z@|Rv+dl2MaF?4HUP0xh z5(Nc2l!5Qu#hR!-a3-2C^SubL!qFOr@dX-+ip}g(xC0S;t)z_MDEZ8F$2^uRq^};#)9sWSmy){>@N$yf*`{By(?Ngcc z&#?e4g7^w=LgjfrjBr7d5nVx7XVs>m7lZv)%njijoFwfW)kOwA9%=NU8$!l1OKEFu z8NaNnZW5C^qYlUGcXGXsdEZ*C@|$6tDAb`I(?ap*8R*dOks0VS1K+zuKbA(&_IW;Y zghQS)>=wCV4SS9%8;>4JLf!XEj}V& z_Z=g7Z3PhDRgElzh}nk#y+I}Xr7cHn#KNE8PgZ4PiBLpfX?&_ui4Ndn23Qd}c>keO zbQ%41!IfyLjm`@T=7#9w!y0T8_(KBM3@XA39G2#v7&M`mm$2`o4EPF^A*p z>HAT~CgU+emg+%En5`K5bpAE?sZKSX@%c|Pv(}i#r90|9Rd=?JbZ_IEtmm;6d>K4w zghkS!ExdRY%EKI&Kl?Vn}9bMz@I@RPy`&~Lh9y22MZ(zvEmL>h%oW})e ziti7l5Q-2X+M`%lK}9w9aTpAFAWicFr0Ts{sM7RdgmolBC`<&;K9UYn~zh?or zch~n8o#$Ej7LMkwZY~zD9R8G?Ufbde3X0J4(f?iI7x<4__;0nOBt5T|i<6m-g&Vyg zs;Hny&#PUOzm>3Tqs_O5Ciekcl07*c$zlnnX7KM2D@CAhg{w)gr zRm=ak$j`_3mkj-Pwa8zh(7#2|zr;VgdWw${p?`@Y|9cVony+mw%>K0w6$b&-3I(D6 zu9TMkk6EDqWfpY{M=LjLR7X!NE+DFd|}2CPqbhyH4j2$IG8m{Q|RVT4^*HEaa_Q$T*3%IGP;e-qb?(HTEQ z8z9rs!)5h+djzZbK}c~_wla+0h^wqpv84Mn4=Ihlj*a74R{^e)IEl z4N2M%cNE+_4t?Jj8$w5R6q4Es-`np#V z3*39>hA`ZWw%@&9Qysz7A9(=AMe)ynwoKfb}^ zw%ju5H0k0lCM2=o;6xbg_0qox_&`m{6dg`7F7t4TkHm)H67313gvTl~^g87tN-iNL zb!@06LQ+etf9NPar$w7%GfTiem^~Au*P#+ZD+iAwEkDHzVUN^AQV{tTYaK)Z6n7t* z9tD>!{TiK2*v_Dh!Va1An}WNg?)LgOY5e{n?4SIT*x!f~{V(q% zB=!$56#kb>;nkoQr00eGfr}#wEA+ey79KWc7EhJr{t-p^|BWL5Bu!;9ZE#P^R~ETX z*cOkT9%$46^l)}fX=CP3o%(A&*?qwMGSoaxo1LA#FzCoaCl|>Bo8Yh4|EVG#4gk?& zfF6XrHe%dlqe2}~!mg-b!(QYJLUdoS<-TRnSJsHlA=4)a-MfRl?~biOLb`2RR4W1p z3�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%0Dy*EMqiusQvE+YCGiKHc1j+?8{P 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�?ACRK_KdRm`EUsW# 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

          Z!os{Wkse7rajuerocM!m* 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%0A(Q2}f^c;L^{XvUEa*8egN%hSF<-a# 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

          m*?gQxmj7QMJytsGa~5dJT`|C7`6F54zDF- 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%0Di4xT(Z! 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
          lKA>@bNA->NXFXpH|;)$wfQ#@dxyouVqE+ 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
          FBCYbnw3e zGXyf;2?U8w61fNR<7N_nh;7_#oP92K@x08`CNwr&Ny=;RxF0SI9=Z_{=hS%ckmq*f z^Zw#@jN?WszUDRw%g(|vs?(C>tQx0r!A8c|9Ds|d9-Gfp)!Sz3kEmE+E_&eSPSO{t zv*UXs!-HEqI*MHiiD`YQt;jPp;*DZRXGB^Qxf|&SR}=!nSTP24x|(oQKNi}iC1O^e z>n5IO27ARxg-@#T=ia@-SIh zA+zl9ZD(luKFb9>tj{Mz(vwc@1!sy+^)P^iD14lz_3lljSuc8cs|y;dR)Mnw#xHN2E>GG#PU?XaFOFi;!H88BMw~y)AV_0QTZUk34;Xw^CT0@djvsf}0B`l+v0(-{I0w4I z#3e==g^uE3m8YU-zWHuFOtu|uGH$Ngl=gYQm5P;EP3h9+e_g53=A%EmeO=5sy7x7b zJlUR4*x&Yklx=z4&JNe(nK(K6yu;R^ny5o5%&$|b#o^|xR~q6Z{R-n8=_buWi@3#c zJCtO>?;jasJev_?KYJw?KZ4xx9Bu1IWK~}foy|awihCdx;S>2v=1u;T%cJ-aIV8Ro zI&gfrOJKkiawXOpphv4)O2?)jLw#p3ZSRs<^L^+3LLK6QG3QR_ws&xnhcg=MD&vSw zW*2H_FQh-^La1gMC?LaJ~N0SiQYRA4ogKEo|=%9 zUnGV;k#R*y#GBdFIFmv_ZB)*8_#GIN3g^)XE_iT1^FGA~r9xZk{8njla(@XISY5Vd z!wc*`vk5fAW*~56e|xntRbn?Ev>#W!o%eC|AffW3_kBb^|3&Ywa~pPso9Fjg7V5s6 z{l$nk)T!x-@NRjYLhsJ|5AtWqT^^%=0Co`^54UKi#<^Hjj9wpb zNj-BG9LIStDJf>PO6+v3!sxuOz`hCs>WKrwtP6;ORT3<)ij#H$N^!?DHplERgH0Em zMsoEi_>7e0keO0?_I+G5HN#X5L!xp*bYo34_7B=V17v6iE$)r8l8P_XXxxRg`y&5Y zf{U!Q46oQCXJqm{)+DnQ{n19r#KM?r@(61J+DtW$|23T2L&jX4^F|y!ZVlg{tZ$az zJ}XW$&8f^0Gn5Ig;ehM<2Wq+F*9k$#-gY%cpR@6D?-5UT(Y#*keY;M*&eKF!xINFq zy4j3v4pRoFUk&AT``_0uT8SNQK}U9+LkogiErea0q@#I>M7#zx+)#1TDE4$6GCH+m zE2p?#m}KDH5VpisCsI~Mw|>UYQ$GCtj}Az%4^fEj@el|JiVkxyN^!H!^bj*K^~h=` z`Q&9_)VGG^+mG>&inWn9k~z6!jN}Xo!ng{QKQeh`XxXXe_yh1j?x-CH1c(mtJ1l|^ zEF4n}!G<=A>G=5^r*G1ZmTJ|3v5Ne;s}Yn{7MAd3RqTW(A2hQhlQcB7Q${pi2xTO2 zD(t~xSaIuk2%{^V%8kriWfvows6CI%v)k8LxqY028P$z#)t&6kER=vdh1S!1y66od z)_Tkh&Tz6`f;`m3u8rtk%lOfc1K$0K?Tp!=tIOs7sM#=b z(l@niBn0ggrJyw6m?TFK=?qXsNiE1!)2)CT7Ge&2io<7g6+XJtc?^^w!cP#u7y&Gp z{*bp4Fn6q4$`g81%s>wWlf$6$QC{hbbp37>(!Jsxl!|BpcPbBh?_}KH~>7h10QA%vq?H`V7v?1>)<$%`8l{-};x| zvD!N>8@A>rzzT3ua=U#Xc@rX~9+kgKEQ8u*qrDlI!o0=EIWlz0$a_p1accA3Q`B#A zY2=oVtp%!nrW_xmQqd8k;A#3QJXAK)SSs~}`UzZ3pR|1kZwZoNDPA;*W*IWJiz{nN zFD>pc!FNXb=-u9YjpTVY{;H$gNy?^YD6M2$CSj}uA_VI!$k(;ggh-B5A~43BRxy^d z=v9t^1`hk#ywm$9_m9q}15Zq*uu!aj$~L@pgJXP^eF%XuT*irrLo|jFbW@6|d`iR>~9$seU%RJ|h-5=U4 z(M9Te{6q!6C|3jL;s-*4y=>ulach zjJ0p?IJxb;gsbxnr+#-D@96k@93iHJuab@|y29x3S|i>A@0|o7%I9L5nT)^nZ8_N0 z4>p$pe;cIgyPYvGQW_k_KqYCYJarhUJy%Q9c8Cn}mznxt=wK-iIWdX_3U9+=>W~aw z@{o(pt7H()stb5iOQTg8v9>X2&(bCH_h!rK#F_%r`K$F;sqaV;Y8`LxTR)Zh_QZP} zJlC{B`*KR{6hwj?;YsjDyPM}c5z-4BDD(3;%3W*}bl9Sj46P?IH9OnPMckc?jBdQ^ za$9fb@QzEH%-U@80iY{6<~x>&xl1}kR)*IT0vVBY`5G{QRW_41>EbdEqB^l~M)B6( z+t~1F^9i@zeiz-fuLWtnZg0oN|8!YXc$$2Y!Ut4nv+vLs2CtS%3vdTH zPEnXfFIBlvji)3>g{1hHW-b-k%(3EYEJbD22c(kUg{X+y!M|PwO;i`5VIuWs?hLix z<9|BpUG6H}gWV~8GhN>G*fJ(l`*3V|Kyc`lDja2+95g4z&W|y8PKnZl5(}t*b3LXt zzX(y4%=x00IC?rK)y9HV*jQLwAN)9;E@a~IJ04T%LcUp8fe;LgU5ejm4|@_bz#YiAq#NDvum(fuU^QK-RJDS9M7ZziH>P%O9Mw)~Lxz zq-3U<&IOI}%FxGqQgY*`PyqTv?%FUOJ@RR>92qnK3}v*6V_Cx|2p=`rzhevifOR~U z`1mzUkGxdc)~L8lmNOIN*kaJb(Zt!s7BsMEoE_MVEpbLu0!G(bOOG+1r|YlR)VW^! z5He&ya;oLjImjR64_PLvG)+S) zFwe`(s;Ah57Vp8erTN0Rw@PmrtqhacQo46VTOMAS;HKCGvY|CVTu@jbd+P0uTA6|s z2wzsptJELYDaSkIM=YU|#6?0=Gpt2?rE(kREDmr)ESEqWd41#T0Ux2?F@7T7g}jzN z+TTHPjn`IzjNgf(k&7i7N+ce2ka>|y9eVIHROksQsu5}CK`3|%rI_q$mfT;hTT+9} z8_|WbY|}=t{0y{|f3pWdmy9Au2KPre;Nw8%h^%ox8urXH#a)(S$0Q|YO934#5*_Ch z6xev+HfeC&{vp z(U5@p*h&UM<44NdJIuE^9UFPS3q8O}f2Py@d0o_40dUt?5j&beuoN0rkFK zT<-jf(1uu+rIjR^~>@ZpVT@9XT7Avnz-?;H*>`EmLQ{>c~- z>x+Tl&u&dr(9$c5vQ_1@Nu!HuKTzZGX9&E)l3R;(9%4TM`!p!Grc0jP{RzHcUIS!wnYlf7MtvkkQDW5fF#6BpA`0{Z z*o_yO^jqb!ofrQA`|Rg60vNN~+&8c5jPA2X0gzh{9&5fP<5g-0ggw<4Up2E&*bC8! z`u3h+@{b9%X5DYlFP$f3?te({RS#D|27ejvf6NXC9t64s#82skubn_-!$$Lqu;FzT zQw?0!05x~An%P>;{8{R%rH^F}RG*kDKr&lR8>^vT{}~joC^I8*DyOGFU^82=#QJV& z1fFssw(%f=9IWOUiLZOsK9jJv#UQyjw4)!R>PFF2Crw3~4UuyXtygvdB+I5bvMbTd zH0MT~=7sLwCF$8{bzt^FgY@^FS?0l(fnAJWuJYxDV z?=A`o^;o#e2gHqvn8Rmi2xdBg*Me^Vx0gUXA@7IYt2PSt{rW{Tt#%Cb0;In)06##$ zzu@59;@x8JVGzb7l4-%-h3kt7DicCJh36dU9ceGWYn4+R5#$KXp_NgiSHyUH4CDNJ zwCg`H&Mix-zLmDiAkzcwnKKW(ygf6W5!Alx2gPRvD0p`Vch=h z0CL@ZTfmMl?R=}*_^S(_$6l{L*u&utpH{{HhWj;Mf0x&$=jm9-|N9`@o(Zo`fqoYj zDBLb3oU!?OVK(m={MaJ7KDtd@%C9AyV7hjqasof8o34wR2JsdVD*iqmhGQcA6z~Zc zf;|#@2XT({SLz^rZ+jUY2rq1ZkoQnH#E&m4?!(GwP3H1_12*Fmn98y9tNJ44FtuWU zJc(XF>N<_)WIcq!z*ldq)V50gQ*^HsHd2wA$^J8wXRZpmVfk32wAPC=k5FEn^2f+V z`b+w&*SxiLcS=H$XwJ)5zN@@b-QT z8r4o_=STB=rWOVZ^-3}qTS+~C z(#pm1B*=Z=x6m%?PWs^dka;BPLl_6zB3bxp>}>#Ne=*7;RW)k1{Pf15jpMy19aiFa z!->ftl({?8&}0y@JVuNIi|N!5G(U`WdGEb?i$cBe{ekqFzqnR37GpDK$jClY(mcE0 zRfVqI-#6rl9~8qYZncm62%*{a)X1=x=@7iR=-RZ@zZ^$LEA28ndJp5r65TL)x~=<> zwzTzLbgcmspyT^`ntzhI?jm{o@TU0OZ+8jxd`~8-pFgi>19CKg7#SYB*c!HiRy0$7ci$Xc*1Aa)_B&3X2y;lZIQDBt~#>7 z&i9WcAn7Z*50`{Q!r*#Vvd1Y2Ec+Y=l1E9;v(nsqjfV>vzQEh@cNelBbk^=d{|*69 zQJHEkt_*dCR;Ti$WJl%Q@~X7u1JL}bc5nE)E+h1zlBq*7&^6&_63nRpE7*VFe8UBM(N1cYglbQ$6>|Q$VS-I<@`yDt@i23+w=j6o&~gVqcb9e>iSh}10FptBpl(h9ESf8u_e;xiU94*( z;e&g_6lNEj?q0rXZme5-RYM(XFWn9l8p2MAtGWz z)2J0y1?lO{9kv5=)Z<_qJRgHpy)0Oz8sM3r*d~cL20Wc6;i{@I>DN&!cnqVZkJOJ* zOPA(A(#<_Esr7El(b6K9O5mfVYI5lK=p}VUr9r9-P=3fT>u!vsT@~=ANH;CQJc6{( zJjaV9l&C}Ut9<6Hq~v}rMY3)Uzc(`-jQ1LAym2p+p_f66%}1Dh12;pA-qvSCJyuq z@9UM=tM#A%Xx>8N>UvL+6uR={wEt@NQrmfD)b}*l+Wjtdm+SgII;&In9S!;o>)UsK zEBA4o-L;!~f!G_*7(u7a@4gP+DA;3k_@|Myj(So-&tv;2FcLtaK2Fj}&|2Yidyc)# zq5nyDv|RM)UZUy&^mg{aM&oNrrZmd$$$~{gFBH>YSCJvYuOh{*rnr-H%nGYS%)aG_ zUrz4X!O|n8P0=cuO-2y-)goq<%3U&?G?B(^z6!`UQYBji5471|eV%4Xoq;(a#CBDj zjydzqBSlk;^*KEJwL-dPgO=>k!xo<&1`uGB&?=a0_! zp!a8oo^+?@y=DTvxPMUl*;6RyN5Xt$9-Ni?MG5UCJ|7?mJjcT~b^y652~&!gXj#Zq zu%#f}5%bl#R3p5jM^`v$a@E~RtGiNdSCOKos%z0@(c>83nI9KZ(NWdJz~^D&6b$bC zxQGjeH>iQMvSqFv1V#$?oH6A%wwpFswG6a73fh;hp}R zso~VwJ$0w^v(K&kVO>Klt}O3Q&=CMR9G!uit^XtH`T6#`XnnU(S@6E zB%o9}7)M%92%RP{Mk`<1um|RiD7d$HH7iL^jS41H2IDi%zpf>ukMulZ-Iwv-pU%ck#*S&`rMx68v_%h z%?JLU7+T<184Tq|GWM)OHYz$9|2!XjQ2)HczhV|TytZg<>YG!C0p7j#u z&qhmq5L08EboaZ4M>~t)f?duO&6f5&+^oJ!N)ItrGZTODgxU5c=&O!KckLq&OE1vh zMqsjuIZxQ3dUDpIB@Sydyf!&js>*X$De7AW@GdaN;1X*uVR^Q&uW${qP5DMT7kMYL zO7v~{#(LDcl=et$U2I)_r+bJ~Fa9F07@=}Y;f&rs`ukn+$G5ddzAwL9!5_t*T&I=t zQP-lqW9<&dU(`qcE$CO`?xV$000m~)_at97$=sbolnv?@7m zKz=~2z|C~j$>UYCW1QqrSeR`C+GVuySK-8-5L0DNo2 zXbi7mExG&Fa{kP7h7Kl<>-Rbq&?dw;RW=(0|HX0bC9URjx(?P(r)HnuOedYYAFyiY zUqgZfJTrQ^7Ww7V)laGAKQR>q+SI@J`7?J$V; z>0ZXGicFR+*5o>EWaaVp=|yhUJP#1-1YX741_(pFLVEariJ!{cw*udjd!LiL?Em`a z=IfqF6Yf-szfl9BJ}2oi9(}L;`O6ZH~PgK zE>W(x^`VNd|F)7h>&v*_OaJ?MUxn{4DDuMs^cwDARNco8ujFwqm$do~w|B%O4&`al z53rW;e!r=UQXHx^i2_<;1jIr~^2X8JJsGLYb7}A`tUQMs2E;~A7#qJPVB3??zy34e zK*&6Nf!Iybo*TXVs2bXlfP5S()AtU@mcCCUd3qc30bV(neb$k%Prp~+JFw-V-qN1) zFH5}B4UIoLKa+skw$}5K%b^<=C`1M(Nvb`9wsTYjmZVzb#9xgPQQ)8ny>0;oG%hK1 zG`c7lT^9s(YztRVp4_m?KuaOG*kw627nE|Vz92oN2yBTcOyW?|FmNkp8YA19`TE>+H_<9W^cSf)uHB*Yy$VaOQLykbxiFLmrS@a2w zU_c*3-zq(;l6x25QN>hz7c&ai#x7<-Biwe*elY^LTb-$>?pCK-v70QM!JMpFVeIMK z#Tg&h91>2yp8D%V*NjX!b|XOoFHvmn>ZgY(6L!Gi;r(`GWyrH;FmHwWW6BT5sslI~H--Bg`p zp%avBDREDg0!V3W@ssW{tVTT<73cq*KfUl6C{68<;l+H%*@Djt%K^Uz&jaULi=d6Q z{+Kij#ne%dwbn|*?D^L4I%MgAbRrgx)pe)88JTlX08uL~KYj1qr52K2+6;aql3 z4q$!TmnUO)PEv=7C`W!9%o2K4WZ~j&WV;H}Er&Z|xT7oxP~&yV;v`qXA&3kRo+AAq zAzP9^cjE%aNNdlPZEN9fKcWC^e{79x$Aw?I?F+N=)+~v@X{)Q=)W$D&-g#+La_2NQ zZ$UQ@yV~xZS|P;(^)S5q;uDd)n^_I;x{^rtYpr6#WaQR_fvosWD5v;bgHe)KKE?P6 zUULcl1rz++6Y=(W!%$u>%Mi&3GCSNRjoo`9cPW>kNnHDY*!&Qn*QBX;Nxpn^rdKrGmF~gU1oj;s#(9E>a1FW7 z1hr}nuWD`ZzF6TjuY3k^CLfvHP~P9ZYIxdOFh%EIG3AJ!_CDPTR;(S@oos*tXTqOu z=|4Vn$vwzVIc8N6*B7#3nfF3X{b8-V5-c*Eot^FId>oGJC?CV{Q1u*Lr0O7#@9j@W z-&<1C6*b&HwfYL`|9#c<=Z^3EEB)7}O6=%>goA!kYFf&%6hf ziwkJLF_44d8+Ii7;~0=|kQK8Vr?qQh9f%hFM5yybkg_2oY26Taelzg zX3+q*VH5YqI@#BXNgFTWuk8e@vYovqjb9$*AAnz}Co7EKzJB*fO@6+e{bsbEFF-|s zs9rI*vpJ6{@QsX*PVa-2#X1;sF00=%2-BC*J0B8y=W}T;M^PC_7N-i6pZ&0IxvW%d z81QV1@tex2#{t)*8#_eE8#`8%H-$2HUaYyivFgpL!Fgd$Oex-P=oT;~#tBx$vq5cq zj~z^G+vKuhFEI5*o(TkD@5M&&+8|Hkd$0Tig;tzDdUuvC0xk1l2ah?}pOh6GIS)`P z=#nHk-n1n~obG5Pt`6HCR2RgtVQz>iB1E<0^+oWnzaNVo@T6Txx7_(`!&&K6^q_qE zu;bPSUBw#wNmoQ}>5!!j%-po(re z9II6seaZDpJW@Z@)O3pp7RoQmW7OgVxKQWZoI9%tY_?DMfa@>6I8VrT>c5@>g@gbd z%!jc082kip{4e&N{nI-rx_EqA9z^V|RLD0PJsl=;@#QkLOQh^}3q-R0Cv3RT1Mn0y z5-Q01@NDq5A-Q{VyE38(A!V@yOAdDxhr36xX7mJrjc-bFsM6@OcDnCrd!!Hbi~!YL zMtmC*)J~)?ZB>NV^G+(nK-3_V3ar!uZ7mrzETpv0?`c9<0D}qR9&;tl;my%voVL3ob6uS%H5R7(&_<+z=QJKTmZe zEhX`$!h7(RI3)qZ+t8K(GGs0Qy$ta-kR@SB@@2&6oBNioWvhrIEv*~FuU~_1<{RAr zoQ>XIR-0D6p*zgj63>pk%Y$j4Bx`Ob=dUBSaVa2lfqsU?%`0o^|L@MkUY z33Is!8l%U9#S`NexFx;`ocGK&{*?X_97s%+iO`<-C9?_7Lfl|yI+7$@2%F67{3L|L zly69>B2~exs7q#&A4I;eQY3`Jc1it8O@>^xYeFQ4_6gaCpjfMr2|SZZ75L;5h1T{r z6?K*C!!(okvg87Jm9N8@QJWfz^50Dd;RJ72hsn8%Cf{j;y^}l@=qQRLhZH4LC3gu~ zMD)RA!dFl$aRnHX*+jO1D=<Q~pekdji;-rdDsQrb}76Ngp{b zqlRXZw^sBAxylk3KJ>(4M@_Gq7&6~S85<>q`){eW$sQ5;#iK*MueDkvPwn%CqC@;X z$^L1S)Yu|%0a9W?cuz|IXWuVNG~SEEAz`o?aAd5o!;IcJrb_sYKL6IuzK992r& zJNDBi#pT1uyi5J>=9(|JvtpIOC=5Xu%m+O32&n3yrRtzK&AK4z6sr-OBdjB)lGqAy zH$G$^kqPM(gD4Jjmgi=?r%)i`q!F-weia0UvJjsIwFF>lF!=6Ygx(LcUk_rM`lg!a z1Tl1MpEQyff*iJ~FBjt_`bP;9cFd_+ozJOuyUpfoxW+qWD*Q&)w{za%K5f zRDWvB!U|{p1m#)Fe44xF{j48RpLP~{2Uv-ru9&u_>+7SgG-GwB9y^z$y?UPm36w?+ zsM0&Ej3sSMgg=pf61AnPP2MH zaT;EyF;0njD*8!Xr@2ovXHMHXRrlyxst--En^rf8DW!0eS4hIBv@HvG;kwLk>S1E& zV?jtkgyN^IY8;{L98jVBjo2y&1+R3Vf(3tBC8L$KxYiHfC$RDSiuh3Fg|%}IL>F(e zt5>=`Ja5Qmg{k9xG;0KN7!(6X3gcH=?M?UEDxwKxKKy}OZZgi+P_1iS-+%{3&tO@$SrY~=Vd)b@!vBSPjY>Ju= z^y|ncr0_2gFxLV{M1UpWkNGP?Fqh#SR4$q+&Ra&kh;ySHn?CS9aX}Q?qZmOB#)u39 zt%nq$(ZqA#sVot`d%2K7&-sjSP*g_MM#|{K3n;V%e3tN z&X~*E(V&9zO;rB@*Y^p|c4-}nZB@hbL#i8~0zF<|g_*_xI65xlt15TH04Zr_|rLY29pjuDD2Of08$n3z70v(Ef;D z%)S;*{GwUy0@3(V#M+j-qXU$gUt(iS_NP{VZFCe`dxfFsC5L_K?wtnaRGB&(wh z#0|4H)CXcQ#L0TlVqRgrYjzJ%wh3%t-4`H0FQ3>)8omgDv94~o%glYI=Z9PBty>$S zdh_C9W1B|4ffYm;X#N{S@m~bEfBweI#mU9_@53zrU)R_EE27BC{;!H62RqmQiYRKz z2y1Cb|0|Uzr%Lo60Yw<5|5J30De=!D` zxtRaO4*ZXn;6MNVpO61>-9Lh9{|KS|cVV@ET*vaiF%AD=82$@}_^%V{S>G)q_ zY)toaK(Qo4FBUC|G`B3$Nm57bNpM(jfv^s-sQgr;8^}=%* zKLp@l{^wl(DFFBXFiQ9TDrEQn=Q;kdPXCRpWaj$sbBg~5vhu&~!~e=vva6m1~$OHpK zg*8Dt6TpQ>z@W&8;bb*K6fH3@z{y5J=`B#jl+b`_i_|_cz(S>N`HJTMq`hcYz*dOu z^@fXEt5k?tr_S`;Y=Mbx_U-%#0Cqaf-{v|`Hv65OLBW7z7vSJpN~^8UCrR#EpFb&w zDoZcc-mmR5GQk81Ad$N4>h&AFp2OL3161R#IMlZq_n!YY8G;040VVL79NlM`=EtI# z1C<=@e>T!K4nLBAfVQm}c~4CJw!W#twTl>MuY+{oR%&lCTWpL{09taC%V_F4uJhXC zI2W@?H{5(V$of6a*voa`X0vAOt?9d+)%wT?vR`&H{9N=tcJws;>|)6Fg>yX^f)0{H zAfE{KGqx504$AlQD)J*G@Sz7w4Th|7`7_~F3D*K=fLBq;aVsaFISYqDS36MILdyC0 zm(xL*w__mo2~0ACOmgfGQOKZ2H-qHL9upaiB_~W{-UU)G>FV%!k&Ll_5nrP~WPM<8 zUbHTH_aGWiw5Y4UKV+l-ePQyMiSOr@fU$xAK>?WS>v+C07Q9a={Vm&Lf@lXUJF))u zt;B=`|8?-vI`S(>=`H-H`=!W4pn_3<2+!VuCan>=FzDmnmI)^iX5)?i9{VffNKEhp z6G+*B$SoRP(8(^G57bX=k9?36r#t2O3FR#Z$=Kh4PKHBy7P#Qd286g_XinI4hXZ;l zM8r1l0?axjNZL48B7O5AVNJLTLq@zJY#Rh=Bg~dzrB}AP9T6(282Xsnm|lEuL~_&s zM<#+OL#~zK;#XgcxIw8A-dJ}JLic4*e~L&GZs?>|vLO%~H0wAv5w`1VW)D1W$M~Be z{la+735O&hj3lpn&d7z>-OxfNl(U*pHVgOJ2K-812>X36fASDG5`_e)w+xIW`;0`- zjRPCT3zUckO%J3u@*IwM?;gj=|Tvmcs zcE;5kUzcRw$zO3#Fm{GP3A8>mD2`36zpP@PMH$D%$Mxb|N9%}k;c90B?(Yxu00wAi zd+k`Zoj9fKAa891{kTd8*W-M4;rI&>hzAV$B4;^4?R)rJo1U*wt=F(y+xo;|c0$B% zTRK1PNY{?6lViTeNt+Y7hsgJMXJq|E_K5;YxULH>Ua*>~jg~+oc zvJa}Zh56{e>u*6W31CM1d3JhwjcM_v+J3=}k`7n_1&Nvk*+>IR}puXAj#~h~+VUa=$^iQle1a1T~?D zwV*2a$JLAwF!rWOm9~n4Cf4@OxYYA1l1Ep;Geof$W4QXKAhWe`@-HJ^FZKP`Y zHxMZv!M>b7X?f{NF5{Znynb;GYh*Mu4Pa6b>l=1hd`+bdDFWB6)!{sVzD>uHN(go< zjaEgqIw%$N<)XPMc|9V32)$sgX*A zNPRC2Br$=Nh1Ozo!yI0;L(9AwYW2s~rzL}S`&^NB=@3M$8%R+Nx6n1zm>HU8{8qj5 zUIz>syXrT)mlDCE!&O!J~EXmda+>p&M-nFM_LBAdJoC>PS3>3RjwU2E$wQJs@ z`UO~=M7wAI&Y!tOyA~L+?EKR5GnTDCJM9VU?whk3az~>QM~D7Mdv~Br4P=tTpN~E| zC^S9u5FJ)P7m8aY`4OgXi~NOTR7JmQ{f4554ASfW>8CI&7@uPGf#Q)`Jq@2ae0TBW zATI9l>QG1R#2&Mszu5`)*s{|lv}{cVVRf`zJjL`n@6ka*-LkbYkm0U^_XY?r6I zvGY8bbcnFP0;n2d9g*m&j~|&oAe~*4u#-guSIpI4T`qlXNOC(cZ|&TN(U6BjUHf6~ z>G8*#Eniq;h^VADO|@jB?@n44rbkpQw1`?j)6tFs=_^W8l#wG_?IGK32G{;0BdvW7 zE3zgPHPYoy9^MLBrH*1^#o3*YyVvn4ohDoTZq1r$SZiWeVDcO^bq6X83tRb0tA|1L zOFf!qrN;z)3f7+u(LwB?eSHYffA7qjWyOQ)5gQ`)3oECMY4Ufw+z=8b1=Z_5lXLv| zU?Ntqc)^Yxrck_C^B*x{;U;duB!vVzJhH=W4J^=NGVuxeajaqheA7TRSXAnpfb>Mi ztQ(uVy8g9oTfLL{#=8?SBjz-}-d0ko?aQXhm)j3i6WcooHjb}Ch&{0cXGJ*7dVm-d zDMavIRy1-KQcOw%JE4hT1w$|r1#qqj3shTuP%kQlAOVKYq|FD!OkWY7m%2C9+Ipxb z>COk)ENygBfRHP3Vo7M00U9|`ijOx5jCQT9)5FBLz1 zqu~^?I6XUCk{agnpHpv}I%JUhUh1N^;vTIe?*B7%BZrX@%2l99#3LVE>Gvtm{Vv4z`kX23^z@pJZ%gmg)(KX@LknEYY*f}?HFG+2tirjSJ zfonFZp%{g{REV9t3LQ2|VC27wK|FSFTO*F)%$ijT@5YfzV+x~NW22;<3Oa>+RN|!F zS@28UC`##!jK{FysyfWTUcceRiV@|nJDUe}#1VN3J=Wm}ayuEA^3w8Uo1<~FM7OS; zCmM8#q+2$v_oJrU%gKR}!~R2f{?EpBy~0%mw&!RspyTOHB2NMk~c2g6$u|%bj&g@N9GczoQgXqr#0tVK5@8 z&>%7_j6{O9Y2Z~-g9k~I8!6PkWzxybQdvsX&mzcD46~(?vr5Ue)L&(_%2-fAlV=aR z{U%wU%jEBw$Ts_|4qNVnteK}e8Pi1s8j)fi;-8TudQh9o0tnfB9?`M@W@u6hur@@L zdH#*IbDtjymvM1F`|DkQK9NZ=F--*M+)`ac8GFC%7xP4%L)Yq$Vk*x4&NDS`8nQcU zIEZ6AC5vIYTOxym48_$9VBy3`C5t4XQ_;o1#Z=Y*2Yc@rEZefK>vr3=tTDhD7m^zU}7z-1p==z{c9rC>Rpm-sPcmp6ZYvEX$p3+>pSOLF0QIUpZB55g& zWYk6@;?hmxPmkp+v$8 zo3N(HppavzVd0X+urQ^1rx8y5LOMX&su}u8w^t96P$#1o%N1srZNW|-HpFJ`fH~2r zjs`atB-w*^0e)oj7Ud=1LxdgY7HZPW`V^U!O!S1()?a`Ij_ui=*53aNcE_ey)vuQ| z#lX4&?vhFK=6z;vFJn{m%wTR-$CUd~0-PH*WCN*l{nUE&NWQv z7%!$KmIuk2%ljjF!AM#c9}mS)wReEaM(Agl;7@u%phfe-&HY-OMGMA_DzjKJu{s() z#0-8)NuuczZtw3@<9;$zLVFl-v1J@Rh8+ZaRjmqWdV4;<79QpipV$r8#tMf7Ia$%p zpCsGn{e})i!j2@HIKbHBE%5igO&2w(Gx)15-6jz&r}p*KJV%AZ;M2;F*~mJvA@eEI z6gnvd7k3CS3+Rt(%*xo5h!W`ZRDt_UhnUR3$UDiZeVyt_YUQaWb0!|a5j-A2IYm(> zM4`3M+Vd~Vl{XN;jxoI3w&YxevJJ>{-UAo9zMoepTRH~vhYLtuu|VWao(*DfQ%DX) zH0s2`O2|;8(yS98Al&0&%?X!6l89*p4H^f6) zc}~Je4J6VQDILX32^8KnyDipf&^RQjVR6FD^HLpm6ch>Mx}a zM-YO7x&VE5mj}}wwiw+&FS$zuXL{mJ$XNd_`C0u1?W14+-N1Wns^dE=`-!MUB`ZlKS-@biGgEli|2?TEGFvrcXvP`0O&tsKShK}M5$+QgjxygML zm0NRb|Hy$+-H%p4Vq?Qwi^6OEfYf^rhN8neC&1)(hSfZBuv1;Jca(%^Led-#?Q1?x zk>sSNEC$7~w)%sSQ~4yZ)16{Bo075(k|$SlQMjKUL(J#*TK7`xJ{KvuGMyJ+f$rgN ziKSBHIf(uEZ=b^lHju^h-*``tfsS~W5h5BbI~^@$r^C54t18FRPs%aSQL#BLBrp=< zm|X5QUjwk8vW&h__a3m$3xAs-&{tj?P-@MvXXe9_FrTvD+6CH-T`dXD^0{3dQKha_ zc9LHkbFkeS$;QK;-Py~)vyL90Zl8_*>=&aA*Cke;(-M2a|UNHh1N12-9--p`OudjmR!jf z9~?Sy^9IgZp|*`DYkNA(^J{xnizdF$cQ$!s>*3?$Rd=z+K=o5rf;Ti;96&t+c6csF z;(EreL2*~Zb_zfF)aBAsXiJstc*{aCloiD^@QI>iQE>jQ6zw~A{SQOvb{yq-uQtY~NAtt! zf??BvwyW-AEsR1t@xXe(SQ6Mw@7&x=cV3>r#2h>mN!qNx-j%JmcB^>494pV{sx`;! zZ8vzRY?-xG)wwyb5;`)%^SIC888zMQKBs)neLu1^$EDtEb33nl)clxRyJR?Ygo+A4 zZ(8rR_XNvrZoo~!wU5UD8NtU+y3=%y1V9R+N#7n`h04RuLHc z`H2{X@6x#kbG#b>hz;e1f^>e@rLxKkD`Qc2Gwxr)Wz4 zjD3A*@nbz455Sq_0$S&&rzrnUA+W|_GXQL$L-P;@gDqH!Y(>5BLPw@$Yn)3YKI@Bb zr#4VBoJcyy#j?bAEX`9AUt`_P=H{~6aGRR<-snPdsaN}_<@I|=yQ2zvv1}LVoP5vu z_}jzHhM?cY(MN=6t@QV6YjZ14OA^n=K+mTvK2IHd&B-}QkjuzS6!bb|{X zUKLXitef6Y9F+l;s&oU0GzD@-Ff0Edx!5$Szp7g;fgNxDX?O+Rkcj@ z+itu9yGYP!v#lwV`Hs)+)|%>0U+)gq^lj#c*;Na`|kzG%itT#^@NwF;Kf!4~Z_LZgOo#bO247xmR$72enYt zUc!`(tds;+g2gYXACk6`@TJfyn$3kUwEozBnu>`?NR^3`3F~sNUD@ea7z)`EIRcCd zjS9_+4T~*G4A4LF7d@(6N+o*yzvRx-l_;AN4+S!EMh^BCL!ca#Rgt@4o=e+2QZiQ} z4?K#(Cu2@>mX7ekSku-oGV)Y!Zxammys5X->k6B^6yJxcNtIs?U!rnZE#+mk_N&(( z7CeHQLXVSEXEIfJY`^n+s5)NxuC5#9B_e%zJT&^ff4|od=3WnRpA&A0ZdIC>PvekF zJK5M>J6$_}{aQOq`Z^|20cXH0h6){~;V`OHW{E$SQlcS9mxGGTM~&$-Zv#kW5RQQZ((~Zj01K`QSC)F1a-`Z>P39LK?r~Aez_P1}7MT zzZAI16_PPX#PzSE1H22V#wt9>(%CId#*#few#h;nIC_bw{m>)EtEHJVEzX}X#?BuD z$8!nGdAUSuLpcQSpz2z8n)mh`V2+Oq-_8`Eiu$I|GJRiaS$mz0AAGIceuDX0RaCTf zmNytMNw10Kad>=u`??_&ndrzTopj{kDzT?%(eF+|Wa?T5!Ni9P@~R+aM*A zT&i0CAa>yz36qYZwnRFwaxARSutwv`vDjiMo{%Wk(U%B{Spi~=Y+fH>VVV^2YN5$A zp>BlyOpUAFUN%Xz(!vY;E$G?Hx(#t%=C`T%#8nQ6+J(1y<)3+G$<0<^eO-96?b&oY zZT>TLd5X5Xu%@aDPgnsjLMOrp`&038@MEH9M(t$s2lvulV`=XGvrcG$he)Y?;xWG@ znt3_~(uJ@~zkkNDvs@wI8B@UxgRodKt3XOL7(K$URhwQO81M+UQn!V`s-kgI^n7H} zD}Dcp873-4>G*c7;YU5TNQqR=m@zzvC)f7{2qdc>&`EENwoUs^)YwN(;{g>}(sUXF zAy?%pdC||73i^{t`GwA}5Kp`a4;K8FESayO>;yiR@Z+ly>zL|57dQ^4)9ij*&+Yr3 zE6)wv9P_N=X~rqW6L`A&L(kGTs86sZnvxT@h$-Pf=(V7xfwH9No&B%5#DP0_QmMxHS&;X~Tz+xBU<3Xy~Qj zlHlX}e#f82+wDE=KBLGZ-se0EJP*WyuAb{%o!*_FC($QM48$MQc!+* z9>&L1$8OGhNqY2U$FaC9R~?i4JZ0fQBOB(i-T`YAGExW=on`{@{GW-51H zPPei3UpJcS^QfAjUu`Pgmf>|p5SIRU(V%}hH~U(I$?hlpDcmoYVLcps4Jzi<7xQRP zvwyruM1JX?b(v-FLd8p}$>`NS-Efp#iIbvSNx!cZm2%?%EB&SC=6*H==kUJ25n8|% z-@;-h`0>^RozXl#SR6i2c?K-5Mjl_uSU(;FK}WB_AQ|n-84VU5*LE(2Uf(WOQn}c? zx^&LD&w16c+i|I&wGs&9`*Eh+fO0-4Fqo3}K`{1shfoN=vYV@}o_~&8YM+Ru<%R=B>&<=}KdiT-K`RY;{vB-dSVWfEjB6y2o zrRMT<8pZo^cN*CV1xfYtqVftr?|PC-DSqpeDk?|*fIaa>4?LNalnz&-E1Dhdox zab_&xs8}!tq>H8P;YZOhLoo4_3)DbGc^DCK6xni-(h4llB_qyZ5OPBxdWj22c1SX* zgb9cWAUXadP+`IZz$ik=?qDpGIf`@;R1EoNTmD+A4WryF(%husFH@x_j2j_$&GII- zio_PN0M&`4dy;JwZ-taaT86U&1?PH=QX6^D+Klq!@-E8vMVe+!ZDg^du4#uLbPoA@(it1MrAfE+IfiafDO@@yA!_7;V7X$MQH_*q z-vUqnsKxs9UEHO+PM9XU-hAibpS)Um>h*+b`h*SUg~VFI|8&zCcPG)LFET~C-Ww^` z&HkF<74~JK^j^+JeampP8fkJLAESr<+{gMf{+zgbemI_J?zq121y498eWq(U_JQ2~ zN-fa&p>x>g6D?fWIGnt{k=4t#-7?^QzcsgEcbsD;+azl7+3DKEeQ1s04*-E}Muvl= z1IkAsxawC2so$6e!xW5Qg+c*?C{Rzq1=Ftf%^*OyJbF)^JHzjVuA=u_CdeyDg!_7# za9U1_3vt8Jjuv#|1Gh%&gD!w|pOCj$W?ih%>L*uZ%NmVJgsqrh@x#5gL+VF(gM53K z!zF!&lJqBf;=*I|+a6$!n;zgiC-4JiM7lItjsjm=X@*xiv zlyy~g`$0>_$Vdm5s7z(2;hMB<>F~V%46oP2L}72aNoYSk$UN9~5+>{#Jsc&4pFmoS zXBuQHkZ;AW9gGa<2R$AoKGJJj!oEceoP21)C_6;J1DX_&<#`Jl>qnJYgbYLsoS}On zAW-~lNOg!Oh$)CI2vY=-OUhyQDJRwxLK=9YEPlOJs=*!`np(LpFU>;7JQ%=sLDSs` zCiY@A9a|RSCPEycI0Q$q8hYTB?=La70aOss6X{X+1$*5E`>QjtIVYU#7)L=h);~(( zU?AS^$ru{FXHM$LK~f^NX8P%enp9N^*fb-N3zkM_n)s-oL{nvc2Srx1c{bA};^ zv;`1IOZU}#;Y^PHJ>gjKbh{|nHYC2<6&xeF%9!xNZeTUTK4*h?(k{Zv5N|#%sH=A; z4vsj6vhZ^@8c22?(o-RZa&m+HDEN5>S~+#zXrdkrX}uh{T-UteG2$`jF-(PBH6+O> zj)zEwLm)~oltqRP;p-MmT%h_3V~VbB zl4isRSnu`dPONT1heL5X@h;??pCt`|gkhw7 zArvym#3A%xbm9C(&pyd&o!ZnC4>-57rGqEAz$L>cg<`t+LsE-y6vt{Ija0sSq$Ut3 z$QF=8O&}5?0WVGNsmPUm%At*Y^X$ec@rSI8#DIlkArkT-MN+TML)aZ3A{SJa0paaS zc5+YRL+L4Ro0`iEbcx$(=rv?5Ii(?8=4R@3$a_Lx>Ey1(xg`Iv8CT}u+j}k11<~zt zsyE82JXya~Zt02O+t zZ``%v2`6Sh#bTjxecO53QCDg%Fb>w=Y}r`baXVw2q+D1I$kr-xH?%VCrFx)OT=bJD zQ%9V<4l71$7Kh&@D&HhOM_b?6tly(Pn6qf3*Ic|ClngcRs zH9N)j<|2s4$2@FDI}*3cSs5|V!fN})aWI1vQ~K4aNDZw~JiO4wIW_Dl{Z_+km9ic> zd(>ygQ*Z1(n~4N|jfS>w>!coiZjC_fOxjX&D$+gF*Ek~<;5~>?@!aF-ARrzU&a~$U zJ+eMJU=+unrfbp%fNSAeHQY!0XUol2q)21Ytt-3LuEF$0W}tv@eK>w|P<~ z(cA_1W?+XQ99)9xGtfr|;gZTJ@X&Je6oPz?W!<(#CDduDXs^kP$yN+Fg?`;*%};G; zCcb%EX7i2JRl}1#SXx~KDk~dF1GO=JeI@omD=4(&L%-bsaugcTscbx24D8Z9F*iV9x894H?+4OQ-;4<)(^G{>mY-Ynh?G2qmGR-*=kUQw%@vY$Eb z(&C;}KXS0`$?KXEo6oWF zesU#&0#oR2^SvpELVAZP%*6`i_QnY0ilQjQE`A!@7>maDmf5KSUdKM&szh&}n`y`^ zwK2+JP`&ofSyX)M&UWn57I^?5Gk&dw8hw0wr^phEqJR3_kbQ+1P{_665Ta~1`xpzf zxrfiJ^t`+P*V2^)r_gAR0B}H$zt^%%4)(&+{D8QDMR{FEw|)m7%zV8q;N$1AqN1s_ z+9{&_ajI5CO9iutqJ#^}O0)La?RnK@UrP%6tyd4$vx?+XyL;_R-<1gu{?_gC;CXfY z0%gJfsZ&&!lBua~+zGT$agYA28>_Gswu~(CtSarec3yf~!aSZko3u#^;EuN#RZ&Mt zPirNzD@a@#lQj|g`t7qD7u=i1NuM0ThK;V z;#e$K?3Apk4pN;h-HflIZ@z&-SPwM+%yG){ug)$G77n)m$YuQ>8%~*6|C8bL4~N9GB_}pal9UN?3X$5SpjQ$5Zce67x{e#z(@xORYng5&D zl54ja1=u00T=hGu213`r#PA6g7V}Kw88I!X#K^l;xpCfstz^ED) zmCKj#RtB_0q*9Y1698{QYG2Z6MyragSb@@M*3d-FZLN-5@Xdv({r$FevwhQPI-_A( zJGyOo)x5HHl0_&Yl-`sB0-C8hx-rIo6!!rax6)NI_*wj2jXmd^JNC6X-(pP1X%2(7r+PPZSbV3tJX!@ zfC!Q?Jm8Jm(mGBl0G6?!NXycl<%U&in@hkCkeeRHo{pmpNf9~_d?4PQ>gMi2ngY_@ zjlNj(&W_@%&v8v3xG$bQy)lgOr!mwufHXmgMJ~iEt9bz8VYCTy#vM>S>0{B)#$So& zs6{We%(2iMg9nrZ_wzrSqM^<}GWkNwV@>7?mBgEyf=d<<*Co}Ra6RKu<|&0b$0nKg zl?2-LezbMRGf}4P47Z7om@IXa2K@s3nTk+W9*>WInMy0M zso^P7hM>KfFQ08gzf}N4hT#;|gO8Z&Jo@HnF0#weUSay8nCtA|*vLg$e62cIXV}jn zm%{E}Jjy$KR*2_C7xKFBgq~dH@VI)&s~|a(j`7u6SfbE*8$w*Wy{Rz`5RnZ$&rz%S zDbK2Dg1_>QLrcUD$^j8=3Qczps8yh_-4H+v1Tm|f%8W~GhM-bs1D%p|L~w2hZgdxR z*4&z0-(b5YwT!MAdE-z;v7}4fo6vCe-*$h&Vl7u{QD{+Q4)rO5&Lzn7}t&lrIN!KzjrEL!Id{DpDF!qJ-S{&*t zGLF*BF``3sv(e@pF8g4|p0(9(=sZ$#Oa<34RH9J3WA1it%ejM|A$SLN5V42Ij*2`S zzwf?!pM5P|5^wS@Vi z_o~*YxKP`cGcC1sY~bDWHhdd18GMa(C|ZSC(!8AsWCXpdM_6LDln5NqI+d^pz%!PdY(+b`*W^(DF?ke4TEWbG8zt9uohI}()74CzUaq(C z^1IT4((SX-FT~HCi{8@j^e_0S;A7{o9m!!QK%#C?`R!P&P5);MDtq3ap$`|aDpk7l z(@IKScnk8dK9?GxnbRf(+7rk5w0xRFXobV-$eJDiQq{4^$smR`avFQt@|d zBl`!aBZRfINUza*Q9_3+_wk`rKP1ADpU_$W zFdOeY>LoTQzw+pe$%8VxhdYL$?1SIJ%JzKGtE~umhoFK=QX-3;xYDiId{cdgd6hyM zJigFXiaydlBU&RYY!YP_Rg>~3q|Zf#K4O)oSL%7bs@lXijlMD_mZ~q)I+A;(Y>wFR zrAF;kcLweb^L8Fky@**T&?|Q4p$m|s8^RD z?9GzZ@3h~~F(^Dkc0p~f&y|b&IsP@2FtkcnpEz}#zDgU&wMK&T{R0x-Q@Kb{X=H5V zHoqz*cNcm{v88aIXv9w9!@tHfAi2OrM)%W+^xBWsi)OlsUM5jh4fANOoBgKu+*cxJ z^&II5-*%7tzJdE4<0>`GH{+eenc8<~O?uNlq2s=k^)GVicVNs2fmQ8i<&^y9qRXOYDg?Up4 zaI<881?W?Mgn24RNs4Sb_t}0VU6vYae$!!qL9gvcTS2{HSFnfwXmvCm3#0GQZP%v0 zAlM0vgRvP#w^5{y?RPnfm#(4Ct#=AyuH+hh+slIvr3{sWj)O-( zvv6cUjH6}+^$pwb5)d&4uw#BOSe&o~3BKXUHm%y$ott!z6Le3EJ*$%`S+_G-Ero13 z9Ow|L3Sw{l{OY;hNTjofcw4;|TmeAeqW(|KYBArrZ z%;?M}8-iIwF-Tzu`D_>*uY!Bwk}PF~7B?i~OwneQ0|kxlb8Bb@85Iq^dHW zE)e+Tv~&9wb$4Lwzgk&e7-pX_tgCdXn|K(qee4iO;H?z7IZ}8;D%LYf-0Et`C?>5J z_4I%R=ElZyL{6c$ABn|H#^PPdB8VSg~iI=)wQWN z_yz7f>BqyU8~aOha~IBaRG~e3F?SU9lstE?*u#p?KL|SlJw2nm@bMgtO$^YdqE!UG zHf*Y|Is_xSe+iZ-R}|cXTUSjn-{%JxQ=<_U!eRp6 z;{xNV27f=u^karYdPYbjDdnB6X=Lr^r@qEvfi2hjh1QWNbLkJ8K{hJ-@mjtNxlLiPrA2y8BC9Gd1 zRoPD#KyE!q^r1Kvv2PXjh2sQzG>tnLl;nodnYX6=D$P^)=9BQ@ebvuefnTu3S<&LBW0HZ{E zoy$vUt)x*)qk~3hwhCn`rG+-7rI?LYQ9{#0Gzu%PuA_ial6e6hAS(m_9f%Gj2q3~t z1|`J|d>BXLDo-zEdAL(3b-tLYm@vgrEJ>c$#xmMLhyhfOUd9rpPQ1RUrRm9hAo*B^ zS{k}!sieI6HEok5h)hB#IE@-BID`2&((`>dLH}9HeRw8Qizx=CH>N0)(%`Zwmj#y% zm%idwi-P8?ie=>5y48hsruBxkd8T#d6?e*9N9T$qv3=V-$b_7-oP4el6FVAN#eexSUptSpi4xec|&HbL_x z&F*U9YObXAcdeVvf_APXsO|wxd8K+m$~nm{Qejdq6zP>NjrbP9HD=G7OTot2Un*Fp zt<%>Tv}F1h9>_iOjFD(=q+6*NJOx$?E=Ni|=#%Ck+hFWq2t|OY08{|g0Kqq)%dZD< zJaA_R%;>Waat!IHucWGXh*JE)2INV{aF1ZM2Cnt!TNsnVdcTrq34AS zn?(*0eX+0O^@zR(PD2W^V6no?#ANZqsTN0?7Jy}0r3T+L-ddy8)Y<9NTc$i@s!x}i za@gh^;Y7my7*H)tw63osPm@3MDwyYJo#&{T4_|W_7nI>y9AFJ!)1~De9r)Tsh<(7v zJ4wYmIl(&-#5+;OJ0Zp6upznDCdW6}g9*P=|8YkH9Sdnx(R4=5Lm2zl=XhH^*Oz;`r=M<+H-lr1hO9td>DO>ML ze-S^@BaYHjs|;tXTb~|r*ef+RvnJ)GXK@K~$~Y@Z+1HiFD+^+i^c<`A0le!g0t#pT zP0y1}x;0{=aUZI1fG72ux%*TK`R#oB4)8`>`$G0{Bk18e;EO$`4f#zKCkO!xGGbPLR1*DGV zG5I1*#VC?3D9+q2v?+r%m0KCAx-#PYoiKGPS+|{)FY4POEq3pz24v0Vmz;rjw17`p zR;GGQ&o@6QRROMjS;iZmtC#o0^~PZF7W(|Bw?sG!xVOZts|AlZBjA>-tCi>XRP)%2 z6qisq+7=JZJhk8DJ!+jh&^-BDr@j&){FU|l!E&OX3r%bOTN=@9<9TpkyEJJv$rq}Y ziUc`XMogZrmdH?vj7bW=>OFf|@$g1ZRVbjza1YVrvz@^{pW!?cz4N_uyeqs5x>v7T zVjE(c;O!6DwPI*QONh7j>{f9i0=dQ*NX+rz-w%IpAY@LyD=NjS)xXox-Su7IZad=Q zyu>i53Aq{hpfWiSp_JD$lD!d$cdDC8JqyE#UcF#>V01D;P4BjnVJ@-d@fDj1_Ix1l z@I@tCwGr#iH)CIiiKq{qT9$|hG*k z&$wPEvrV*-GxqkoSt%`2B;qNnV0e&mA3HIkye~KItUR3Cl z8^!u>Ggaq9Zr#@GJLRn>+(hT`@rvSFQR1Ea7_q0qc~znJ2r=DQF#KjO;qwZ$qL%zo zer0(tNX@2H)1m{Pup`d``zrM>H< z3Ys@nWr<|hK_%HQ{ub(D2Yzm`S|a?TVAY`MkM)fWE)pk~cRw!92O4#78;zNdFnMC$ zDqs-;D-gqcio}h%^o|PbfEq!6V!&;zQz$DaE9gtuvg~a6Fh@949Ln8j&}vX^&`hWn z)Jxhr@nK`w-+}(tpt-1FGD^r7eW-BiJY4*DiB_Vfom~)c>wv)5UfDh8Arn9rBO7#s zneGg*V5ffJes2KDU$C#JeV%?l0HL-(yx4XT`D&BG4CHa9H4zi=3VGa555pU_=OZV` z$oUT>!B0Piftk5Y{lKUu@A;5Xkr${N@Ajuo32veNS^@BZzaZs=( zV+@ef<03Wx=1hafC0p2YWdt^k|12Z0{u3F2f$ z1O*{61vP3Vb8BNq8DrPK(_A@4X{CRzBK+I(70itPbomMvj(?OC{uKo){39G@VfYV8 z;cwmlcihd)&hUSPyZ>n~{wweP`)B#!rg!2 z?!R#NU%2}(-2E5s{tI{ig}eX4-GAZkzi{_oxce{M{TJ^33wQs8yZ^%7f8p-GaQFX} zxSNIPPjUC3uj=}L5AJ4R{BO9M<!0Cnw*QQ~8R^;C z+5h*vyV(oUO-Z=LPI;^P=E_^Q!O4~LOlBSuQaqFdVH}nOF^o@5x-h;j5F0Wek4Zqu z2(pa5aFyW+EEL)5_6UBL2ygh=v_=|5vM zCD!-UH7>+>It1iGinjOQ{6}q*E1^*vR{lKhWGao?M{FY+wZOrQ0KQ?0p#Kpm?(T{R zL2l(p3a7MUwC&5C@3fcYN%ykWK@8 z^F+h|<>$vD(9RzD3K7%uhO9Vx)0a$K*|lwCMNCv$R!(O4{WrVxDDYA9zGZU~1XHANP4`!t<`JiV#Z;KsX9i7(jK7wEP?7;m(Qn4n4y7diXrqzO^rCnpYA8IZ4}jl84`SSl*~?6X zC(i{9hbfrri#MmA7I32W0PObv^6w$SPQaceVTKm*0X5afhXWejA+~AAsXE!_FZ5ei zNxQ;o!XDNWhRX{)rN2GinIm||*suf32|(ZPyj2wvMN4dL18?)*#CQAk4fTr4=iXPi zbjr|#|NM}7N=w7{UEGGL8?L&q{YuC!W^f374_muud(?Xp8mwnPf9LI>ac_Ajfae6+ zfoKh|{e|>Y;C;F?+j&a;DC>lkX@{y4gFnK+9o9?0I8L}A&b20vM?7P<(AL?8{tD#- zX?UAZwrShdal2iY=nAyhIa4hz!vp|<`tU&KNfmu zduS=M>(Iua1^z;he(>H_xJlj>4u4c~W&-IMR2qaHoM;f;re=lC zn`{%$YT?7C#r|;uB0(cNgw##Yi4|9b?T_5c7wflq6Ug!kYxlULHxhV?QWXIH+aBUr zI~v;_IVa-BaOwf+D_R%kH_T2XeqZdasXtJjzZm@seK~RC7*Ioy6-nm!l@Y!dd>q@D z=OG4WKsr}D0Q#|rV`97ertxMo-=Kxf&sIcsPxKd(7qk~R*MQ$i*a6Cp_iG1_xm z*Ic@q2yB=AR`(?Jci6WGC`S5tnEv8sQF8jyTQt}mEFt@4) zfn`9w0jyy`z(*7C1?*qQn1{MV==rYp*e(yUb}LZ5gg%cbW`($i2pnPLdEP}KzewR7 zAbg`<@?!b7SModWlwUa?QSb%~@1)z1Z25c%;B3&g!z>bF5%4D67xHvOqgrXH@@?C5tN0H)7ZD({5wj+I_+4T+zzjAHDauvYS zTg+bEb|ZJkw)XRMy?$RWiqVJwpE_O+xVOPP560Pb*9p2Qtdf6dxGCbmZf=L+0fc`+ zi!}nF&SP zLAhPm3&oN{t3dmTfTWU;l2nOD-PC6{Opx1#EmZ~UfN<@jiQ*fjZ#XzBBVs^4zJ*i6 zbZ%T)ze8V&!q(JQR!5}#fvv58^Vl+sMW?r`GQS$H<6@2q85lX0VpzCLbWT74x;%|(b~`ZpfI$+$bZ`|ffY~EW z=@)XDZCE?-lM@&NU9EoqzS=`nO2|7*FRz9c${;d2DB6gep1>~*6X{tYRw=10jKo#? z9@HePrl}Q0=Go@%nIN>5VCP8SNOY}jqysdeGmK;UC{29FZMV%QK{U=*DXTRvA8W9c zrCp7^!nK;3sh-uosFVlGPv#hreE2?6_h@VFX!=JNJ%a@r{3sEd$d;j7Yx<&C1%Yyj zxmJ={KFRf($Kk`ipuYPW>J2?}ZfyqU2Qc5w1Nq;Hfny817a3bfx1$zJKy#o^=|5Q) zSsp@kTF)JI)fBZB4H-)@HVo-YkU2l!!bwlg)go9*%S+Nv*dx!PfD-u$40?ol(!?bJ z%qj}z5~voN%b+s)$s+)%TQF3Ngr#y;myNL`CnnQ_nIR>O|J&SJF;xl&qm2Dm*EloX?l1IU7Ky^3PKy^w(=3 zOia$Ol%%6+N6iHC#zQ{sV}J{cL)FzXm{?>cMHEKteCzH%if25;y(f@Uq5<>f6`NvW zWB1VWUI%=DHZC~Z)9dnxWthxdoGZ|kS%QErE-hi)vbZ!m)1FGY(80V)`PcZ|gSZz| zcIR6g@&8T$Z!sRiY8CYlJ949epyo%8D0lZyHwEoM4JBdL$M1)fKPPUkK!x-Q5R4ci zr+2UvBIIuqWDhfUf+7#$UFC4e@ipA~2nL@07-qa6QT?%6k*dLMK{ z%;h;1t1T>Qg^R_*VuU5o++2c%92Kl-PasAmwak!w6trrMRvJj-zSnat?8pXZrR^dw zOu%pe@^#Kc4?4cPH?$Eh`Tb>PFas>9Xmc!-7CCXusO}srCZ;ZuLfPqO?+KGo#X$Jl zn08v#*D5n*k$apw0L;mWKbeet<`ohWtILji;Z{Q=(B=?2Y?BDFLSN})bv$1!>hhBz z|Lkli>a}*ptLgaWRkiIfHvE#w);FC!`IUzyl_lKg1EVBG=gP4`gqlhLe_DlU2;4qd zMP6kuFUe9!=TNY?Pr21*?Wu;ouE+WOP9MYje70QQsz&7a{CuuhrFV-gLc#1;+C-nr zC7l*it-~})18C8B z%cZV2lmkxf&5VUImogU!Fu$i^gzdiTAxOK;N0gjT^62#T3GPke-9ZVle&@EQ`yw&DSYDaIqk zX?EcuB{g>86nF6vy(Dqgx=*3>6Yl^sWDxnnvYe_rC|rSy@dyg{paUVD>%mZ^Kng^E zaB|f`N6w#Ru{3hcI={4PWq$4PBvel5V5UxFGseTmX$=WNuaWEZS9cr8XRHlgFI3}} zYH(={E?}iB`T_~STa{O*a~icMr7psR4zgqh%kNFGb$7WZMFNd0DK@?xrFsf6+Ph5h za1dP(Q{aFym`9kKvJ5xqZ@duGrH5I%9q};&W^ry1-zz^N593zrKi~c4cs1xvJ_sTX z*L8)v=_S0Q!VIm1_I;qr$v8!Y%eo@!+2fyZfumt2p#j;}Ce*P}Q+ z%{Vdc)kb@W{BVbhT;bW0k+|}_8nS5xb-1TdiJnObMI47{j?CUIU_J_cKCgpwTcfrl zCV1FT_C2F;R(dFFk-sYB6urV&`YCaMt;`t_)o}D0H=|)ey3Es1-RkyOh0lf8YtdL@mk;BRpsz2EkcYQ1;)5!s_8qDmhXNf|-2G(;|C>s;Fhn$)=k^ zJ4mgPx)jQX{5f~FGwXS}>FTf+q^e6b_2u=XLu7+Bxne>oi^7-Zipx-2TUreG4}p1% zSP6S)&g`K2#&G7W9FkI__blsO1@@3s>1Mjm#kLkn(&Rm`d<&!ZLOM7%hT8SqEz5z-xXPoFMsx%TPF} zaFKHq#2mrpuXB(YI*xb`$W-sLDE2pL+((f`b2X_BC}>boYF9Kb#Cm@z@ZM$85`>m0 zAT!8wJbsqp3r~2Mm1@|+)B$MZE_AVNTojrN>?eIW0 zSb&W^m8#quQ0%p`%n0IC|mr3&lS)L3|{V#Yic{p;`Xq@h;a{a`e!7)~|Tv zr|~1(dSk8^u1fc)I98g9wW0-lR#IsO@PukfvFl&{U+leOlx5A9_nXE}+qP}nwr$&X zr7Brz+pM&0+o*J<&G)H;?sM+#?$Pi4e8*VxA2T9WV8kA=V#J5vp8H_4GKDe|Q~n(S zc$a%NGydWb5q`RDj=Qq^yBtw*4y*4TeeWFo?`BQX)nPBu!a0Wv$<}d}{PWjj8F<(Q zb9typ%!-OM@{n6hNuZU%p1$kKbaVQWLANHTP0AoA_jInW0_+2No3q!P4W7?J+#Ms+ zusdSM;%<6G2frDXc+)XZ<3^?N9o8m{;zSAvdr3)SAvkF)efM=#?MKXb?GdmtYz4aBE%B|o7k>%>Wr^5Cd&s=TR=Z&NZh`Du!ZQ^b+WXhQUpJ6K`gIRBv zgD*w+#}sjJ1jz8P1VnB-Y>Al>96)j#L3MtDC=u!nY!`IVqF~gQLA(%4+L$W`dvR|H>EQrc#)3`WFz9u7Lhuw#U4%ij( z=5fKwk)m3K?`ogIL5;FXRisHAWBO!*-#l}5L5?<@{iA$~8&azd2vTxYbCM7!OMhLV zj@bK0bn1Ai`HQ@ea1HlR^wee%=H3!aBxbj(=MprMT7`khs zDmk{RnImOp@2K7K35hl~6E&Q+pJ*YrFcMvC-igqXD2g^5q&kaabug>ythLP~x`o>~ zyyXy?NQnUKTyRYHA!jqD_{|Nr7X5)I&d3ee#UOK>V4@&LRvd+BX<#*}RVRe)$-t|= z_m@+kDpP%X6&soSv{oaDaC(t64y&e%Cumi_QME!PiC>X)b0BW{EMoaAREk$Q7tq$p z=`>^Z873e?jxB&=$#b)0FK#amJAML;91%4w&ZGBG&Nj2xmZ2$X{xRMS{Q^hMxlZD| za9Ez^jgbqs&=C?1C+1Whcw);JgFh0Dc26WKe=s7dhx`+kJU;sEzC-*o^=f4SC>S&B z?inm=L_9eNU+MS)+1=`LY0GApO_SL&CXwb)o1(T^(q`)XBJ;UAqqc`d)@-ftJHAZFGZwh;;-s{iOjf+)3s~)SSt1fBh zez-A5o2CnIL8+W~CZERr?n*y5;PzN-NGeUq=AHD0Q0D3Nj|y~C<|^U!>m{~r?Ck?Y zz~eT|MVZaeZmdV2-`GVxL=8lJ4tn#xCgtSx_&>kjg&ZP;JpCLQFhN-%zf|B&)`T9p zxOG4oGrhe?zdGH{NPG|d0z4~*##dlGWWF^#9`|SuhTIrI9t>Op7?4sAYtdIuHI92~ zeHikhsa;@QoC|_}wHK$FeWJZgd|NiR8(%+N(E@S(GV>upt&rKw8I8%p3c_&Khq}h& z!VAiDv4?+`m<|9NtWz$VnHqyrJtqkwFP1XMWnpqG_Ltg)_=x4wdC=pEr%^b0I@B~1 zTaM;3?yYWph{L6#$UE`6$U0Zv>K>KG&_7-OO#zUWoag~eI8I-D<+1~@g1 zXHfp8wi&Z=4ZjKZc?`6?+jCb@x;|*q-KyyBm+op@YV9VTC8tbzg7pi|Ez{T#nstw1 zic0Ml{iomSiB-nZe8^%2WutUyx;!XsZ9$2m#Ivf+vnQYiKmfTWH%6**%heknQ+3lD zUugBb(%Q@oxe5y8>@Y~j>Y>V}UGcy#)7&4Nkm^@~?W$N(tFFtcxxmBy5mkZ~;aA11 zZjhh??3-1Uo3?=Isr#Z97pz@KQX-u*kbs<-QoFGV>LWmc|Yx;B-1`eS6Ma8#G!gEM^pkimtuQ>zcSDO*HK_1A(LrpgO-uuFdKi+kmwV3h9o55SZ& zkEa}usnj6I*Z~(YQ7o)HdJk}CDZg$Nbpe<^`nuo@%xDIe2#Xa(wkhOZln%?gtGAkY z(>0$!!Zo$qhpe*WHJwxr)5J|9JfVNFfmQ z0N$DNSm79I18xo#RuVJC@khrgNh9y@)=4*O>tYveE7dd0(+pp{&nt`mU1v@{idfec zQ9B+{eJ{RSEm`L1!M@9WWx=K7p&!cFI3121{rqvoo>GD?8wCNehq|fR<(h8dMw(c0 z;_RRJW= zA`{dStZ+23Wqt*_-Q!7KiQx2#L|6M3H^?goG_@uhCo%WTJycv%pZBKHHzs<9>lu&z z_$<$Mmu{EhB$xIHjm6lkd%`U|k?O@oK&kV{=@`N|4{Q~9*pz7wmi}Hc;jm1Dql7DE z%Be)#SkN&`1977Z#&P1ZW3qSgZmJW6inS8AcDZA?AnJtRGiT<&Y3V%Gw;){d{1g*v z6>B&ZjwyQ=MTTl;S#bSC*ssrO5kEOyas7RlYN>s4zV+9Wy*7mRixim*4fd&FjhGkS zmWJZb#Bk@N)OWMR4-bhJ{@jxd{|&PA6ni-n6W@u>jZEe{-*gu2VKRRQDwiKP)uWcX znfG$b;V~V>Z>C}vKp~J`hFJT-riGP8OV+WHPOoe^kG5HM)P%Z-S+yW)5gSSrOY~aJ zRB;}QvUu1vFQysg2dsDOWy_@{h-W}8*2d8ldero4sobgU>ZX8drN!|Jdcz!Wco0La zQTs4I-%Hxnn5~vU16k7WH->X1x`Z)~rtNm8wM02X)|^frC*m8sebfDri2{Vg{*jWF zD}U>+0fad|Zb-}8u&!P4ul#9CCULr5MJx?XbxwQdt=(-g_fvhguCv#|Q@$08eT$5l zs@%1i$YpAq6u)m~-wNl@ma1o^Oz2YLq%m65HElL&ZJF)euIhRBPFgNJMj^-xv5)|{ zjjP1r&U|!E7801O86>ZuX%c|zN#kW=vRRO9OCkcT5(Rlgy zsXEKoZ<*}6OPz~xc6%xg{;AJ6?yz0YOfLnt%NHFvyzjeaG&24l#PG)WRneUkWt)=_ z+jNo>Q}E5J$Y_Pqi;0P;K0>V1qs~6=7VKCPVy-5?k)BX%^f`v~ueudd?PPVERIPh^ zlVHU)0Yh4bvyePTXWnvJ1twVAs7oWmP8{ku=F@smV=| z)k-}*#Bzk1F!GEE(->&}Li=y+IbJgq-3pzUJ>VS?bYu@4^s5a{Yx`3O`shPMoJ?@5 zejH5Mb^*7EHUvKRFA*M~U2cL7P^LrS%r^{g3DA#Hg+E{UU;IDh7x4F>f93fq?i|lq z+Ik|lY1*omSX|9rVLbWhtLU$EmEtaBCv?x9v&5#mqq&Cav89oSzahQpxKB?P5p|>r zg`g0&=`CTwrJ9Rm24U)=dpBHpScp2dh3UDOz9?(pbAeM~(#s2JkcU(tp;~kJ2^$7m z&9rC+PIYxI?-yK5FG-Ka%UnSu;<#{+o*Oifxs%94_t$L5QsR|RkHuc zaHw=EUlWfMgzhN&X@2bdn~~?4juG0@C_gDkJhiEzgpq$96_t)>0t+M$4x)ne)VHT# zhU?^Sj;yJI9+>1Cp=ZLsk@>t~M^pDZo5&U^LhUjY9OWpi)y;*Ww!F{NeCz{3z+)wX z5N2=CCTf7gE;F>Y+i74hYDKAQFBt9`dNmGyu{1Sy&xz=Y}|9i5V%gipl!M*A5xiuO0DQiKfr#cHBE|Gka z12xkO2Z{^9ky=+DHtElovJIwPLU?MF2Ks$Ro|T6rG|Fc4Jmu4*u*Pab)Yf5@qN_sc9qfRo&+5ug^W8vaS*@3O)^u>L?fT(fmn?!5;Qw2~!}(1l#k8Akhw<~0FG4cADHyiaxkz#or} z830q$()CUQde+PdfeF$8>Kh2{7ZAFoW8=9#c4j$hJ^s60ndrv8hbi*3u?_;B7WDmK2E5B3 zh>YhJhArYkwLFTta5(iC8Vg~pa=j>%0mD1STFAJ<^j1s^959$Dl~cC$&g{Xl$>myE zq%_~AYB&++sfA*zUY$vN%(9Z}VQs_7oDL7g-CNuBiniS5#kyUMFdD$|+)IAu*|p&1 zHkov6Xk{AnKBJzVGe~C3AE$km^4}p|FOI>|!ZmvDvF1Stv)6}EN~}6j%#-?CPyBW5 zlAn>zx}It+yIH>-gl2@{-{vd#o5&vUNSITYtSsAUw|a&l#5R39u0zT-f09Pl-iSB# zPBK-uR%_ED&vur@{~kYXFdnR7pTse`rAX*l5DJzPq9SYdB!O!Uo+*hc8l@2lWohVSKgf43My;xBN7^4Be|AF}5waNTxH0-5Fdz&6gk zNiO^BdvM|mm-u=u5_fjm0k~<)sT_CGd#%guHf{k|YQ(_8$g}F5C_sYs0eZiew9|Ce)KH zCLTjIY+*1J;u|2tj>TkR({WclU%yc_Fk>mah!~t)Rp zy=BU_59#A1v!WWm5qXujYH$^F(toMH2r8L7+2PK~(6=dds=9PhUi=W)k9cl;UnyXe z%P7&J-X3%~CfFrFy~Mcsak)aNzfBzeQm06XE*+ME?1!>LN@?g2vQe!BCUzvMPjgM| zw^+GkO&X?xO1C3Xqr@j1RkBWFWEGWT8PbYk#2~v`UHKuk?w7aelqv7gDyT7wlbvur zvp5xZM7}VQk%7e5M`jQ|@p(@|@0}f@-du8t#?&>{m*_>~elX^#zmM;$v;TW=r3C;v zoin^b;m_?0{^@A5Z-w~^$(22HDX;`WT`b%v$Q_o(NQjHpEvx5kkJz3s2$aal$lgXM zPI4Q$`5urs(gc=TTEyTt(uPlTqd)sZ#9Kpv2INi?1AbgNP0#I$L|+iqN*v@ppJ(N` z1nJ6OQ)HOBsXnV!*RiW~1AXeW<+AV6uGu#i+y??mO-W@L{*45j04)-{f`UaE=0#qe zO448d)^rY(sYcS@o&Gj)%og6v)Eq(tU`t&{Wyw@|N4-AjNoJeCKVOE;ht*dlOR19{ zwZZH}p8R_P20~;pHHHM$_$WnJCZ8MP2rsyVs2N@uE_73ov?#8NQW@Es=3Xh1CA>3# z8Zkn+ThWRVYhUE@y=OUwGxF3Xa*;~W1)CO&(^kQwNtv-AdDRRb7yg(pMF*_}k{({? z!~N`yD;@I0m5~gMyR^uER^yzh#m?|_dVW}f-r!D>-?F-DHpXc}f=u3YC9YgYKZ~;u z^6GWzg3HBxrl<3Bdyg{xD_V&y>E~}*#QEpm&Vu3CC%9a>ExbD=O%}-Y>UPq~1#X2# z-GQeYO!W!X+H#J+PA<`srl~|BhO;JZ#(rpcZbX%JD2n`~FKH{9^}K1pm&%p%=~H_= zekr$6@b*lnGlBA}#bM0)oevC3n_*JLJzrKQVh{0$!zCldp#Gm8+E=-kWNQix<<{Gn z3Z5^!A#ddLJI_grE)D61nL7wgXMIT<#qzJHxwF0|AH&l<;{0flLv*cX$ZS*1({7@A z9iv_QT^V}q{4aX9SN*w%9&Qw&DEp<}3n&>oi91mYR{BfOHmo{BvDnj-hl=M#vJE$h z)!MgBW=$5~VM7S?cD;*nSCd7Uof{@-WM%pYwD$Iy_?De2*^Ghv1zAGwGH@n&u3&T5 z*xq*q97%76F$83M7sC8_YP%kDd}_MfDaO{~hH3_F3_eM2=7$e+3@+9dK6Z2XlDF-m zDqr*jYoUE>-s|NgGSTTaK%zG~Id6^!9rs=LKZdyma-BZ96!;e3 z21z=ENI6Ib)tJ|x%3eCaXmPG-jmqo9ccp3R!heOk!_yKGD!1t!naw~<*u$hdtQoG^a9Qusk)sac7Uq7J-;9NJ&$M}SBFAoP z;G~!>JslgBwcQ09^>EYrhK5&0b(FP)T4|`TH&GFY;7`7E9Ah^Z(@`#~&{@$<=Y2Ya z5u2&i59y(&W^nUR)=q))1%xdllp`l-Lgb}{hd5;{h~k`)9pppzwC)~uNtH~dQy8lW zfA$7f`yv3JHJ3Y$1at3lFLVE7>7kV~db%Rz2F%vN-%4xYx`SX|SuaHT}!Os0f1*|1ZLaO&*r45Dlwr|p_;pZy!+?E%~d(6Y*b zzU|Oc>S!?C9oUVsbGmuiUVE((R!=;4>QVM7IGAtlO`;F^3ALH-9NWWnHO-q?+TK9y zl|%e^4R&wuf<#Z(PbSt%xnTfMm*jdZY_gZ<8`H2>p+NC_8NkzDk9+BuRda$D_)xCza~IOJy{WqW+sKOz6j|f+CM|0?%jd!4 zxHIc60(UOAaN({KviJi{Ri5vMzJ(K=JWmU4ZW4x3%Y&BVD^XT^?eT^q1%DJ*sNBV4 zjs;ycyk%59H`Ha(G%>_uV-w6&}HQxPJxLUdGH>^{fr{tDZ;N0a!l+DdUoQkUEMeI8w z5Psi!1B2?u(+Vr*nnI7~+$YP*be%Y0f_tMgcKl5&&I{qT3-+9xfMbKEHb|CnQd0@ zn{Vy#TlIGL&(Qi3gc~_+uF?x7xgY$)Ib%LaxrrU25xc6MDsFLf|rJK|?|Ni;A*~#vw{097n(f~z3y1#~0W}q#3=8U@aft~$K z`z2CH0hKy*hB2;B$5<+Ep2n+%3dd`S%47h6u>*|o!olRK{M%JEW|kYyK}AwSEdM?u zB=tDW?d0JwupK1}>rnG`>5om#>J*1=ET89HL*qxfy~!8^z=Q>BOgCf?+w*i`RCRCe zhS1F9euyCnZy7fO8w1M~DyNofG+WW|rf9|_MdaW+H%qM>;gEeJRfANGZ+r{wd0riO5DnGo02J#3)Xq~lV#pkU02*}WfQ~5(AK%*bkSF@`dfd zVwdd2onPVD!Oz{Q7^*K~t}(|nMFADX3gwljv4U=H;ns7+VJp-PvQX$mbQ%jjMoTH_ z1aoIy7uD$cSFYZ&($&n_e5!P6&AjEyx6SXaIR^;el^N%`)e37sj0h-^;5*zHLTua0 z9mDigBDD9atlb(pt~GPk%E%x2A;PKZrts{GJLisFf?c0+k{(_%$x?p6hh7DxtX1>urra=_q^kz3H1XHO#^ z^&1Q7OsPdDwMy-GZFUiN;ApI%>A})2-gfp*Xoszs5h7e6+BWFapSuDl&qRb8a~VLN ziWf>7b#6w|lViXn6^-3$H^mvyR3)uY*|=rSq5C)1iES6yE_cOmAMc=Tr|f8KFZsps zAIHOt{F+HQXm^-vdAHh&an=4*=c=Ybe@(n9a~@uWA_$edl=1I%227obpCL{~UG)3Y zqQwUt16!*_&dXHw8L~C5RK8c~H;V{Y&S$BEvC#*Cjk(U18+`ZYB5J;U(_g#|u4UkA z)=)JK{846xJO2U{y+9P~g-1cDEwvnpErkr0Q+nH{uP7)TmA@H#+XV{3#S6%prCLlD)68A^eM3az*~yUZ&lTXA$qEL{54J%J=^IUQV?kikWs=x=TB z!&SX9pc1i#xWJd@{lSKNsmZqFddAtsOC`lb@R*za5)t!~7_$=MDxB9KJl*h56EvL>QimpK?`7owGs)!lkTTyHIZ7(qh<}g(F zVlEyy0>#3Su-?shdr*dhbtdg7N3s4Iz`?j9*v&2Ts)M1QZ1S1(*={-BvOY?8{1Z?c z0`FD;zeGr#IAp{YT&VHueN)t5bZapg$=k=+Lm*OSqd+n$?Gwv7ob@qX!gZ$YG*w!k^vIp^bIu1p2B_!ed!flNMB zW2Q2TFWt89O4wU2xw!4u>5mqSzwVEo2NWABQqm&;`f<0q4l)YuT52n9QCeo~qM2s3 zQOiE`3>X~&5B1ZNnYw_y!ZTm)3g33+tslGk*SlIV=WcxNerG9fUnT|qo;UCBtX6%O zs6?JF#9t8{^I@PpZB9NB4seRWTgQnP9E4eyau#oW>36Yg1~!}6k2Y->6b43ELH8w! zof@7Ir#9~cGsDFKX2lA*-PaJD|kdf-OHMJqtQBA#$WP&`Dm zfsQSV7+V8hXuk{0X3cqu2#|9{J))K<0d6XU27?9>(D7(&G@y{jZf2^L(bjKxfhF-qWhVP=vj?Ok?8M0iKfD2P_9XwQ%%U@P&P(Vci%tP zvE@37>W%h09k(jbU~1@d>Tb`5R4j6Rb_nuKp+0UT0**8Xw`Ep>SFx1P$HlxTBZVVB zu?1k=$nwm_1Bazm z-kdb}XPl_Pnvq-fz`YQ<3hyd%45s~3gKGLm+SS}_DUku2alS=>S0q;;Xt$f_>G^N?qUuU1(XU*u6U0#^o zatXRROaH(~UWg2llC06k%x^7@8;=8LGz-r5rXQDSeabkcgB>2P&l66UJZ)D0k{VHs zr&pYw$NmW(_t1Yj<0Iw~ zA{3(=Xwk`rAbAapvR<96ULEV7hcTKSkz>#+8es+GKq zVZ6w-McEgT1h-yqWAF_kZfX@?*7dKP8W|eey04ta6L)BD)PC`AXR?RziiRD~wweua z`_hLbgnWpqP&}i{oCa8xI1m|>dSGtCn^Vemh%Jq%!KLQw;Ms#KI?!A_fF@K2#=I_8c_&+kuxW0B`L#Pp|tPv}yIE&#Q8L)(iG4K5&;d8Kga_=7rR{~%b2P%y-`UdWS!V(xhV}>LA!ymW?{^P?A zfMJsNG6IK38KnXJ-DiSD(aB{)q#PzRga!E{%rQc}m|%az6f-1{2?{gB)DFR;=@Lzl z3qUCW{EJfLA88)0**{Xbr0xu+kigZdh&o_l3b1cHK&_yGe+1SeFlq%G3Y7x_lc_fn zSUkpP5QyY&K2r>);a~nRV>@sm&L7D%as?IVF#IC}C+5K&5FkU(xiG)JJgr8jTE##k zXif*gVeJJC7+dl2Os>fn2X+c%LqZA9 zXUvf~r%H-+C-UeHfzL8fj*)`86Uxn`AP3@tGwQt@!o(F`qfcf;{*{OXRD(V+H`!sW z^5hsMIab^R6{L(#n+0dV2VEnCst_UvLM&VLUofQ{__znZ2O^a71mQs6L4*-PM~F5- z@{xtHLXDxk5Id`?5Z7DExK8O2grJ13MXu+Fz7GJ4Ck<68y+z>*Y`=ZOpCe!z7I_Ku zV8o{epT$6sgS__TZJLGAzw<{eFh}%Oxf?!5UB{n}$YG69dd_;f>8##{%wx!E+40HsNPddj=Z8bxfxp`x z50CV5xOqq@Rjq7U&^go7^WF5x_W0%zAHonHh%m$YnkYiL!Hb{D*!jC+*6LOgQM}; zjF_y~9H-UhcaI#K*xe#>53l1+h#WTqM*(lX<`{l&20S~$*oEnU@Uz#0EGMkM$bIXo zf`;gbb2}Wet6fH#Bj2j$q$b#nJhc#L?kzg8mZlPnCr_*q*al?h*Z> z5!cBxf)4$;`t$rphjBKHUw6)f&HNWV$?8wXIcER{ZB#WhZFzh(!s45^c+Wk_62sit zT+l22z4E|CYR->EvWJ_wvy<@N;8#lrJ2{yxa1%Q|4t1HScvp219-DlVrR5JvH@xba zVw0u0`m+44Qjjfy=_~DAr$7l$ zg!%A7COt!8S%e^Uv=y|KIqFr5rg6cq2dVb)X8$aK1EB4s8fKw-F2=phE`oyClg8PS zw1DMKbZTlQx4!t=HMjeL3cWHTF}`;pe>RwFz8fQv@+sf=^WCURdqVY&K# zExCH8`>`t0K1I6+B}yDNdrK3#4E3lu&ze4b zFs>7Ch=;o4u06Vg<`n$yb0mNEjgwFMfGpm{((Sn&NnFs`4YgRmBkeFYNGsh<5{)&zYnD z3g`W294IDM4px@`Eav>*^1NJ(Z2uMo>reK769tQv{qJG0IGNf0-(j%iWyQrr{t@cv zZ$XaaR0;o;<^}v$G%pLwe@pYSGyZ!#tiO@2{}vC6jq5*YUJgz|4mQUB)>!@;=#Tv~ z|6jZh_@CPUYd`;OJu@@lFC+Y?v9og!vj4SO|ET-7G5?fv{I{DzEwxBn#5ng2ii5$k`s8UOuj@Q)A1ze4F;|09(CXXpP9RQkW}Om@cqf=Xv+ z`hQUA%*_8AD!uqWsPvD=ZU(Ja_kTj^h>?d7iBO`1RV8zhn*ICY!M5BaqGIl7e_iY% z;{YMtuH2E(6PQnC!$>1=czAc_ii-&e$BdEE?O!S_JWwp%Pkvut|3;*9#4-v?#&aWu zEWWHv+EHYVYEiy`hH@O$>el$)9rAr2=0QXjr?WM1jr}5@VGkYjK-wo~Xn%bT>uABx z3Hi>1k&m<#y>UeU{HRw>`7Yr4F#qC0 z=RnngRAB)3vTSoyV}JZ*^a6h?K~$^D^OW(^pnB~A>~Kbqzt->6ZDLK%7c3tF{5Jdd z#QM6;2Mp$@2a%~hzzkE#n^KJT74J9b)Uq_x>*)aDqi%+Xz}FtbD72&~a$)E~;P~B?34RhVV-n5Ly8v zweXN7rtAgK_+meO@)!g#3Ryf{*kIxzlePrW3m|e@I_#bzE=QPP*S9JU{~dJl7wqHi zo+XIl2i|Nq23&!UQ8&x1yKUG_wk3H+pq3?yxXw+;Sjrf~oY)Edz2&WzuZuIn;!cph zkcA;cfDu!LXj1-%>|%JgDZj|vA!u(pT7%%{eK zAQg>#ojLdmBmJPot`nx@Uhnz-m;=GYz#6R+?IwVoxX&!k>bK0+!p*TmhQtvgIJ@4Z zHcRMNWQ|>^LnrlI+@yCXz3|sr8$pJT$HpJ^9jz0{Y-15g487R=(Pq9-0y8O2EePAm zzN9ZYnpcF_@VM!)2a_T#dB=0-Cp~j5rgqMB*zqL;qYMYMRl9_a?|%D4Hlx@_c$$6M ziy)19LGA^ZRinVJhq}r=a)(PdpO) zk%u#@z5BaX31L0rGjdyGry!tUVKqi#f9M$rcL4O+hByJ2Ijkw^_o34*D@%G?l2=Z( z;YfooT!TsIXGj?^r#Fh^(7_4UJ^cMA(JRcUhFgeJF7odPizkeb;9EmQK1xGOnWjdDF2r1CHYhDi9_EL)JvqV z@TdIekfSU-OYo^7zLBvkgG=a37F(l`J0?$7cK@__QXR9|=Fq0AJ;xL26NpD*?GeWH z?{|#;sebMogpjb10I9seeNoyu&<2`d(k-B@XEblrLw|y*KAhe;f&LiCSt?C%hQ|ZM z$qoR=t~f8W!8e8xyJz!G;GHm!UC5il=N3WWSwXNgpR~oqQ&V~?lJijrXPh<29neF! zTYfHS`QAxA*+6KPfpq9e+au;9?K~r{#&9jjtgfWBfzF}M0bGl2L;2o{wpCkqa34?~ zfsW{{k?twIem&3~iMHcb|4X||T8~tU&L1;}GS4(GTki(o`j|wl(3zngVFBNMbE07M zPo~_V!QS-ZPm=pYX6r>O2nwN_3khsR_1D2K7-_ttEHOfBVvtlvv~fj7G+TX>H!}(B z!6gtydp2uIrGPz=aR(Z@88Hp?OVAD79;jX&xHPW$wN2=MPik3c_lHs+Dex=Gm?TDE zf(i)tD4Y@8)+qG3{zIvg@&`%m;W&}$M{kqKn{(?&R3ybCqsw@L{Ebp4cL#0<`KTq( z4dWL#Aom}_UNs2zKNH(963Z3N-QUS0VEplp-Gl?WZb@&MUQKw_LR|5nZJ1jf_HhCX z=gjtnz8)cz36t`U`3T{P>=)mC2p=dK3ohr)TOay?_SRx*)`01bdBNO-^SEW~%5;%7 zBPb0ol5<2Kkxd^$PZgrK1x7Ir;!0xK#gkNjC^Dv#xI*!xUkY z8?M_U58(!VH3FmXt5m@l_)NmUh+}%dtd2n5k*3XV6W^ZTiRV(zpVQF?&l{2SwU%&- zS&@;TE4EvB#|UY87?eT^?1%^XXgj8cT6sT&TL75G6Xr4~5j?LMW^O0Qo&;Yib-RuQx2i(suf?f>9Fchf_+M_W1(0^7nNeS-`a@T{Ny|A7WQUJoU zx=tk4QCr<9U;qq_jGRIuk!)5Y$wzFNH>b&ohv-wt6!f~#iZD`F zAh0%3*Bjczz(EYhGnBma>Qbip=nL7%1{H+EYz!u=SEoB0$)IV|zqh1XR}_2Kkg?M& zm9@7@mLpKsbDV=nGvx3!W6ifLffq<$gr?>c6}MPfffjxE3o4#%MV}{Q+N+(Jz|mkh z)Hqa!T(-O2w)VENx3xmKO>j$|5u&+(uXohjz%C;XstHtN63zi7ee(i!dtg$?i<>4K zK3tm7L$t|Q*ERUD_aqS=ZS1-E-rI=@h>1<_*G6HL#~~k%kA_}n97mRhTQ6|McyQQW zw-LY79(V;00(W6>h+}dobcL0{9IlRTv*$eeq=L!T8DVqa>|qaC)4kF!n7uff!b#Tr zT0Hs}NFA;^6UXqRx_5B+6c8hBAIm;+UCme|OqH)%d}0H$xRAI^lahvtiKE&1GOn(P zeRYJH;oc>1`B33E27Fkp!9HUN|7^mB6?C%MK55Uh&infnKfc0~zKV+ej9o`L<~MuB zJapIIyXZz6H(fDXY5B0#-ywArK|09{)({0$P<312s?o$W z)*81)FI2kHXD0d?Tt)UTm>@7Pd0#)Hu}xR#T#HYP0x4>WV^O%Xi1~U)PIXO5F;PrN z8-NRL;V+tR(dv(hNI~w6AV8}T8G$V>g@w|AAN~S*yL4UD8Ib9k$BRd*`a*Zi`;v6f z5++3{%l8ONoaXZx)A<=LC)L2;5B)OQE+eD*Tmr}&7u0(^RbhF)ew_VO^*gv1JXl zq>6QLvid;9N%isVOCn2Oh!>%p!zB%V zl@yr@Y6{p@;%wj9bHgk>%Xju$4uwMZcKItAKP=SXKO#|o=6YNImgQK0_=JOGpHj0n z1#J=X$l$3q@rqk%cCu?v*_6hM=Y+W9)eYC9~7qS4gy<$z-(I zLBDP)=UF)2`h7u`7Sk%HdSNz$L4}l!e#Vy3QVbfkv}YCletGLSn$ceAv6>S@3mRNJ zc-~;>QzZk9`0K!@{}?fe+CrdToFrj|KPs?xNzZE+AthxXjy`-dH1fa!mtrM(Zp=8X zLad5nuk_m&XoGxk@i_5~~b>DNfHA(vhWi+0x9-&7l`*Gi{ln%qe=dn{$AFDuC zG92J>w1D>2+tWuzK-w_V`60Kjx<9h0dl`O0bpeburiN!qnkY3}#MMz;H;(TBAE6zq?oyUN4A4b$E?*l3^C%Cs3@VUs5vU4n00!DhU&QD4jU!iQK7CI9l zc_Q~%sq8NnszDUIsnk415X>FfOJM=i=G!JJfUM@s_DVCCQWUE-N{5ayX24hy#aj|R zGnzOEK!zYutP80glcBA2?94v!R8sHKGBM>2oz6r{xPuzFu3C&nC>Pf!#D$S>F7s&X zEc-F3=Eh$YWm`(#)K+nr(uuCPv%z9TnaMe+%s{BJGrGYu>4%cz}4&J3gpB6f^9QVN{mwAsrc2b08~kMt{|x{u zwi2-839cZ0?+7_gYc=pqb=h`3tdK;oZF*L4%trBo!d~nu3v$jA>^MZ$*Yj8N@ zqU{$)1+RRzdQJ!*!S_AMqB-gt9|B1tlJzl9ADQ(e!tW&$zUu~wc`?E8mWt1LqqDja zqw0b62sii*_9~mSGFTcs@$fYl)S^{syTN6dpZBN;xjDudOCm{=ba%UIgm2*@pQk;Qb@#AMT7GV1M8m`(hUuH(w{ddI41SEEk1sxN~p`r`ld4OzGLLj zcOK3UM~OLH^)1(2ub!SgI59?Q9-8T>@so_3yj6y}Fvly2sj3e(xHjY@2N_eMBeR7Ww*h=lAOG>h@KC zUv?=lMA4~%UtS{DxG6TSHC+6 zwCIhz(5f=pE%PR6-G@E`G$m!oie;MJUhDT69#DFQ0M3^5Y$z-#BEKwtU1uRGbMr8w zk^WFo>E``_P&Q@_R~!T8YL77G+wfL#uyOj;FV!;XV|$I4^)<#oGcr?N)9wA5X3+|o z-iLua^7TAPr+0?~<97jLK@+pA#c;LO7?8h|Hox!`91wtPxs-2rCPq90FvfRyaB5B7 zfB~c?VY0^?63cjTgMBKJhzw6iM!4w@DOxMS#RR3G%BFBfg3lHSD4u3!rv#llXJeGIx^_EJjyULmNEX?3}T52*&*ZZUN{m!IDBUu zZ3Ag9GBR~Hd89QeZdDGbY?TkFw9yM6?0AN)oXALU81p#xxoaG{X`fidnz!9bxnNku z*_`Nli+!7_#nxvEFyyyqXHM@F{-yokRp~p+GaHwkKGbPiTwrIHWjw%6z4F%+Hf@Xo zdfc&}4mw11PP?yy8t$2rHIJKk0PQxmO8R!FY#kiv`?hk?DcDUFJy|O6YT3?3c1(Cg zL943b5n9Q%R1n2obFCw|?BZ-RSDivKj>b;+8@>^(sH-8koXAESnJ4#!xBj^NvwPz+ zl&-at@+RSGY#M|AZC`Ps&x!P)qi=gHGiM}v`vsOEjb*QqgSxi+=DsD007XDP5_k4l z^1(Tu9I{9Kjx;q1i+Ied%8ele3*rVBQkgK4SQ40m`dvqLcnqCQf{hhR8&0+(e?hQJ z(iQ6!t}5t6S$GZsAV7vrLy!7kR;n|vp64zo1SV@acNqNFBUP>o_>`j$7d_bY;F+dy z;}mdmy+-sfyyjAV69H|ra-^GWLWA0XWM#4}CwJg8OMsGSF(*_Av5wtB6UrKAbIRTX z8hL3|ugT^atIx)@qyk|lHR1=e;RuI7Tu^W$AUlIP)O4le@wMdoQ7lzH2U`+n#;C*H zQ_Y#nb1ecod0@0^67SLjj`K*ov_U%CtuV&aol*5ibgRnFSg5IXc4x8^iAg|CSmb=f~ABI1f+MNtV7N^eQFg;06ZUL2tElmtoeYKWi7mDFa9O}mLG zM;;2Z!7hmME;qZVu zQok*k(NQ@$%jF{Njf1Ia(iq=dYiouLaEp~vbeR@egL5h86Dj8-QQs*ofVVTvW*hM@ zIT7QsYkUpp{(eY<^vkckoFTj=LcQxQi))ntWhWYsiyepwZ;euQF`1a16c} z8Pn=IoWPED)WiwmR|K@?t#Ly z4A*Mz61|mj61{eRJSEp+?%l@Z%VgmtPCsu^>JGu^(PJwlMl+#!SSsXEt2YIgJ;YGB z0m_@+{A66EYUVs?LbQU!#Dq@^GHSMrKAGl;>v<>b%IS}GK)s4aK9YNaho)#2Jkkhf zI?<$ZwI6hc({Jlq!C88J!}aWm8jT8xx5hWuB*X#wCzl2))O z1y(<)G6OFmFV%aFuVgpjNZ3^rz36RNRKK-R;Wg@BIlMMH{%anQQY5h)av6MIDxN0M z)N1OpVI2-wUYgf&1jNzoT6^*bN*K!nXI43RauB|n#rDV+#pUc3V*@dIOo5bR#Aao& znz~VnS+faWhty_~fkWp~`&jo}{ao{0*LEdF6(Nj%#FEWZJDz@@y6tz~A&>*u-ziLq zQw@pSNNUBbGE>%5)-z|5XXE=RRY_W;6S!x>Y2M$8*DD-;kLlj+x0$FkCTg?NNZs8F zF7os)#|4tf%?u?oMb>5GM;j9MAz|TZJl+?`@wLM5WN0RFW}V1X^$iGIU4Cv*%<%IF zZsV=a;UmOL>t=cq-Z&alrG-ZKD3B(NHCp%=`R4tc!&-$*MyOom%{gy;YDWuWs zB~h2j>9Z8YGPfrDKg`@?kY(GNH~O?IU1{64ZQHhO+qP|^(zfl)N*k3n?yh}$pFXGi z^zFWJ-;Q`cjAzXG#8_*^nsdZj5&ww!OOHEwhntu=ouH6j7%@(lK0be$gpTfU{DIpX z&!lTT`WZ+Je8+Mr1OkKuR8;I8=6RD_Z@-?weRq}Vb$C9*+wOYUN;$0RWDlP8Df?)1 zqHSOghF-f;tAcB>Pi)h~>i1P!E{d_v z(FvM4@>n_+G)$=gvlJ?q!Yw1#Sh^TGZ7U7^&Y$lwRhrb*k5!ZFWY+gpGke6P+Vh!F z3(=HO=TT2+zSaj(5&X8SX!j&t13L~!Ym+XU7QY&hIB27iq-ZxHmGYql_>wUBRF}mc~p-?yWn`wm6P_K^?~vzgTPau zvuJucwVwMWfdD<744g$7%DFk*d`Nq&ikWikTjtA~7dy@v&FEO*KlB>BEc{9Q5*eXl zTs^aXwW0}pKRNvcJFtK9$CF$b>hPm0392I^gP+86Y>PRnfcH${O?;4jiP zCzr}dV^^F{ZP&FMk|iB7#V$MA0n_1Vl|Y65jK#AP&kbf86NeP{jml-pp%RCHD=d`YR|W>qGf#2;76;R zgKwgfeyW9|uvWAH*$MU$v~#-Q&MDKLEmb+_J@OYh^ z0i^kM#AsME^)5J}LarfN&dYH3xCcjoOV zG^Jb-jB216BK>wKF!jSlvAig{C=@e0AgiFA1XiuCT(P>EEnvW&(~S$#ew3E~VePgBybrt&9VhHgPnL7fS; zd|)^mc2b(0+Ex7vG-N*GRzYnlw;?H-iPP*f zdLBoCpSe@H8bt^>U^B&i!8yWx4}Be6uAaHqkH(#6-qeCKcVMB3Pi%r-{)A`h!pn)I z&!*3+ZXb^Ea8pE-Emp0?qj8lXp~4PJSzcjW>hZ;GrjFt^f+$#G|DQp zQ@OdwP{dwB%4B;KWqVbm1KKJuvJtvmB|tsqhV%N`vYPgKfs)t@taZ(K{9nOFI&df!Wumt3XE77y;?H*|A+nySyv0 zKFaxz77Kbh?Yo&G%uvhQewcC^OG#%4u28M|DHF z?PQ%68pD59x9B9OpCVvl>|vU2FQ=uK8p%}SWakdNO6= zBXMtrR*f;9*=Z{q4-cUaazy45&p1pwh%)vdJwv%P={Hpq6y{hnF|D65ULjni8g(IL z2_6I+hdBmh*MvxyGUBftqIO-bv2AGarR9~QqLz7V#&DFYOjU^6cNTighxeV$kOor6 zHxTs-6xa}+ne|ccXDDw8_~duaw#{}CC0YV%%H7HPyQ|P;_!;Aee!E{`?=S~`+{E(5 zk4L-csM2f}A<^1)m}nQaKJV+}ahKh5+j|=v8x&0y#w7@jl{MdfIrtRCDQPz+nbiUI z>UOtU(9{ zoG#L6Cw-|vkb+5=qDk;@gHHj@@6jk4c+4d zjmMcliq=FUCRp()7C_My@S4dRRPfM3h*)$eCLf(BEJNmAas?GjVSsEI96^G~H zC^fvt@HiZmhfp_FI@kU@_1~q`6oJAugnJjt?Qx>|-DC2FtyILIvRIIz6U7h0z+ILj17uqBN;d zPw-^yo|7?)8Xi&ok<+9>GYlSMSxXee(FlFW9w8kAX>sUn#D_P^d5{3(OQ5e^FM0iA z5}&HeoDZwLkwNI2%zD#V4F%VM&FFI!>ecI6V|gqf$-Xe|C-}RyNA6Uuw`ao{o(80o zYETbBJW7|OaNn)a$vRmKC*>zeIJ6&`u8tiCf%E)=wW`RMZd`3?wsECKzgRAgpFDMw zbr*VQahGxtx*5?Jq|;%)I|T_cYY>o(IL5SKMF}Q`Twr{|&;}T@rbsJYCNZpxN83`d zn7eo~60&Pk?&zOZP*7d_H#5Vv1WXx;Y?0=*Xbol|$FLbF(^D;bNqQ~25-AQhl}$lF zDS?~R)BJJTie=*fRXLFSFEeAEv^P)w(uR3kXJ4gJ8r~n#MbWx?jgUDoqt7r{oDZ5Z z8-}T&B$+w*Cch-lj2TlzkWWs(x*##8gDmVp>=un$^Sl;PQIypq>TDLp+N}^ui(#HW z+UbvjNeT9W^+E!=j@}rWm6|3#O+AV|C^T-RVTAn^DSXZGTl;w2I?usWPbA+SXUHEt zjzF3({K;+ZSF3CICJ$8;m6h~4D!09aGn+4vqXKL<7JJvxn#22*wrZRQX99$vy@1P zya!M1tFH(p4Y*H{Qa_ttw3flXk|= zI+fKi8^V-r&2YPa&a!7I(>?P`k<*YKMn#Oo+fN#olyPUUR_dWpEh(2UrZBRcn+di# zI{COGumMaDzqc18zVfGfab~S^bn&Z}u?9uSq!zB`fg>$tOS<+luEWlPY?;jk6^WM0 z_PzHnf4&*nPadaT^ zqpf4JXv=$Ey4&86wE;XER@$0>g9e=Ev==tEl4Qv3x_BPW1kafxd*PnfIZqZqRy)I= z*kYL{3v7{Zlmr(3FwAB1hABLE)6MNlP_Y4VB)J@wSxYkqpw{iWF?)Z5^(Va>DSEf1 zi||&-L!d739NxydC%`&(r=Q9Le)!LJ%>xW&iv+P!jT~NXGQX)dDz1Bh-mP*}pw*8w z>8uZX0?hXt!ppT061771^~PA=dCp#04;Ylo5XG)JMJxm~M#Fu$l=_pJAfd(Rg_ z^_=M@hC#g6Vz5sId*YeP)IWYw>rB^tZ#Iqe8(QOf;LmN9QH^C%&~ldSsbqDl=T3$AO^nn>9uq8;XjKVRUO=dt(8FlL zI1x%>i@9Dibc?2}B-%#2+6TUQMtE=trs9`x7@VzyE%9mxbfcucpNhWUN1#z#igQJ8=BR%dwy1DG>cvNkALj!C34zFFJRf#B>iL#4U{`+~Q!ZZ$g#K;3)~CL$Ji+vUm*0lD8h)$e!0CIWOhdDZ%?>Vp^<7z6RqgJz6i zHK@-nB2=Jtpb8cxF_aQn3Dc4xjU^fFElH+>8ob^6^upG)?1Ka{&Mn)pCX}O5rUXKcBKxx;q#u zcd6Nnao^d3m=b*27c{`q6Zk4dGo|Rj-aLiH(UR`FzG6w&SnRv|I3FTP zt9xU{b8%HQyEqpaN*rUl5>=+HmBls<_UnBrDxJ}EvaQo*L@#ObWvTA$M)LSX zxTrmi-p6{n#JYBaXS-a8;TfiDChUb*Z=Da|svfcL>2GQtvc6fI)4uw2zYu+8 zKYM$~x(kj~!ZM$o2@K~BOncU}bb{=zeuJ+N>Y-g??g+BG&qPtL}A7sjc~3Hb4FJylmbOpH`W) zmFaw)@+H;LO5OaZ-0JASS?|i6?;y5k_QajF1j9W9bY2zPaKo$@Nuv-v9MA{=(g`ziU!s! zG%PYn^aYMC#+xz8tB>o< zd%Q#8!3)tsQPm4|4*lq!?FvrNv#moq=NHVqQT{UZXAD_j_wv^-$)B>Tz2Z5q$>Qmf z!<2J84~TR?0bx~RU0pfeOrTT-JAVP&5*k2O4D_{%iA%(UQaPi1zt3qVP~9<}CV1Hj ziQ^$9CB-{9DidBgRo$p{t)fzsZ=I{Jxdt5R3Vw5V1ck|dhFwv4`UvhJkNSQ?)1&wR zP9Vd)fO^AzQ>yov8u?k$$$2Z5b2c4u;2zlo-jL^-8DVFRKttXyy!NTU$dVd(p1V9% z&YFIZu{b7_3+mBd=}A5@6VSbMRXfiihh6&;$5c2FZ!6!NG8{^!TfM>GGF!AJ*j= zZ|V`ahgVy9=Sbz@5{#IZaWA0*hJy>*)tEc^@fOz4+(Op6D%9dj4<#AucN|swZ!(H^|+6|>Eao5cb> zG~YR#%fBZhpmyatmAiw&^Y@UX%632*X)|_FoY*F!vbrbgB#`KI?5yzIN7tmlzS^ub zD6tGh-A8+kSDyLFN}g56Z62Ig6g4iV-Tt;Iy0+ztTh1%Z7-~vg-*uhOE0~_XFNkJi zpKf^2z3tXPA6m3L+`n^vHROEufOpYQ4e6XW-_@2+Hgb{><+NK(iROCW+xYBpPGlVw z7fYDH^Ws|bJWPcKwi0n!oA{W7@6~Byj7+xs-sNw!z~C}2AHx`NGN8&>Y5A_?8f0*v zO8W3$9pHp0?n*cF@$dAGftJV*hYy#DU$ez!+H=HBSTq`@Ca>0K#)GKOc90K9k1icX zw56#4e9#Po##n6nm(O4D!@j0GI4qT|h!Ziv88*ZC#TbgQI zWyUgG>ZtHBQ}p#N=CG(EbMa<9qOzR#4{yib)f@jeATy09>D zgOvmob6p<)(6h6+#8A~vvc5+MBbJlbi8sY(y+0R7&kw(H@98`Up~!YxkY1et14m@E zfi*SpQc~k-_Id7luJ(7uk+cH(+ywJ5;lKpJ+{IsVE;o)h<{T0046P+uN)eeiW0wJ$ z`l_$vAWgt_vD@v7h2y{qs}L(xY(!R={`@i^7u#b;;vXaxruv+*kvoffVTH~oc0TJM2vJ|DO62{GGI^AI~<1(LY2iFvx)3AqjRT=|Y@`XP+ z4aVWjCg^PU@-rcfk1$7sAi8&qZ5>$7(H!|#*(fm85qdV+xCi#L_29T0acx#$gmdlL zeO-ra#WWQ$0ilekD2_G`#iH;m*%la4@%Bz~J%8;(aiSIi3L)g3Sjh~Z9{Rw#;2g|S zg&;#^B5^qUq@YGc!Bc4kCnIkG<8xEXt6Jd1A@cYgLe1ISHN*f#mD66H^! z_1i}UD-SFHM?kp0b^{LX!;z4D``D7BNG}vnOQX7mTb!@*e>ht7P8dN;rOuG4iHwLa;#VsufqXI)aQ%%$- z$e28!k4|u~cO1lHdw2sJHsaT)ji(B}?v^EB5;EsSjtyd<%&D}@*{(6<4zUG#;60Qcy@wE8r74>_sTct*6wpXL zRWjUVF)2|hnq|}=gaH1s#A+Dw&I_{`IKMCq%avl?$h89QV@cKbTGRQw6>heZ2bgw6 z0lO<_PjvaKlcMfG)Ntu8> zQw6_LS$}6HRyrpbvtx+ns4}m$6Wm8em>3d+)!Vbi)x{6b3o)+r=f^c~Ji~o)+Hbr* zLOEDj<)?Ps7h5XUzpmt34xnr6jY4Nbd53>Nl77n~b5m!{olz}_-*dwn>KUX2VGkSV zhv1Sh>qQF2ZfAT)=N~r=6v)TY7aiMQ9lMRJatr4Qj2?$xwLDmQ7J0#O>9FJTiTzOH zp~OT}fhSrUqp-@?nqD6LR&}7qeM{!v;Fa7N>7C-O%`+tdG`nHwtQc+IG_qS@$LD-P zjW9V5B$bUz4hZbUZ=qftruBQG(`z0R|K0pFdQjB^p^xs+hW8?t5wWCXVXVdMcc2 zn$ULGlp;WU{PVF0PImxX(6*siL6Ft6rXs0~myi-~DXDj{cqq=V$;pXofQe#cecYhE z#-o$Pp0xXZmeS3@0Q_gts`EV|BA(QqVOC}w*!D0I;!Md;R~C|zh6O!sYqo}&j2V4Q z;-A&5!a}8e$OvYG3t^4|=;B>aTonB`T$Z!w?u`5_In4+tMBzF#Edl&%kxu~%%;*wP zFJksd92(d#T}}&BHF`oFk&PxMqFDFgUf&Dbxe;DX^k`wr5$7C0kTM$gD2hyC!iu(2 z>UxrRY6lX*xZxGIGG1F?cUBt2j}%9GpDfA6ttqlR8my(QDf-H`B1&2mBn>BFMn1^c zuJ)_YvBmm5h-FD^5~O2KOB?^S^K;IL8|QV!HYkWbe9SBh{o`8DprY+lYihPMD3m|} zbn6SJIg$H>0%9M}m$i4LO_jewS9k+|GT07|6?$tzHQ&7nX5Gs8D+K50DUTDs2Y9@& zNym~GS~{qmz(&O(t_xP$?;gyL5pWtn4cfb-`F?v=+lh*7LnuEkc$sf48@_~pwcp6x zt$6k)_{#=fb)Y?wp9jRf@;kz{cI>BLbt_Cug4Hc)N%l*YwO-Gji5+LF>T_bhxP9Am zy;H|KXLgllZO>L7>jnK$+O2fQ)CRT8gn?u~Mm@Uqxs~Z9>uQgSjU#!D=cXaoM5n5e zk>w@@|26^Glqi;1D!N17@$=YGv787KtmXn&aZi%JiBz`NSklezy0PSujy9Le=@K-_ z6d&)0g9Jkm&-0qEJnh`)Na$y64vxB<$}6h$$*=SxpQ$1cBTqI8!NW43lWL)*GT0?T zHiJ1gCO~PS=o3UHbZLHRGm4Cmk^wB!d`Wr6h=R2f2B()_voJ@1M*WL}SEeraX_v+p zw2r>9V=5)f8R?$#NFV_QlSGSf{&~fd*=E!rKvS6eLjx19W(A@wDe3tiC`EiHLA`l2 zVf87h__L3iz26G9wh>v?nL2d`B?-%gV%M~nl`KtF2q&B9R|)`b=`8_FfV1G}pm(@T z02$2glsu)58f4IF!7^6pV3h!tnxl}OcMQ+aUNz~O)*@QznWrP%eDu|;C!-8EHIR@D z`4IdF2nQ#;#`#5p(<>&2al}QBTj*_ElCVu|j6sY-RkCNt4;isdjFf=<6&MOd8Ir6k zmlzrSCeeFQa3>K8vo)$1R)+Hl(Q0$XKoU1cv_SXH09JdAMzFg-11GmM8avEr>3*iQ zs>$%j_NguFQqmjdu?%m*V)bZaT5HPM8KGBvV|Xb;1_CUp2}bsQ8=bTYSu{~AnW|&T z)Hi1tpki6TUDapdpCU0+?BDcTPggd>49bo($(IzxVp}c!Q^Y`n+Xs_LgZop&@FXJ4 zPUo~~HlNz$_ApeR(m�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%0D%H2NPqv~C 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 mtX7J2K?==LqiMv?$Gtvb_xfnCp;}e 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≠ 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 ~PzQnNsNx+^79{+u-@}Y% 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 z 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

          _b<>PH) z?#i4E3g$h%4v8+uvrclGgH*MEnsy?c3ox!G2%m5|gP7l%v4ryts-E>HU3qtb`bjq# z6MAHNq^*s1eKUMu7q|ql7X;J{$PoeG#pwyz9>KZO3(UMqcE{Wf#UBnL5$hq_X(aN( zensXU0!0pr$W2sA`~#&F{hn<;FqUg5A%)N7TziF%Uf6t7vCd&V#FB?da@!) zux3hbN~%7Pyn$g3SsUo;Q?1)ytz2zgg>UC>j~U=0bZ|BM-ZR7;!A}BD_6g8c81@lV z21wxvZ9klJ;&BIe_W}5V@t%AGf5#6t)34S?@$K5vo8K3#H}KQHH&BJ>KJ&{+JQs!w zW;@)8Gj)61CVXKp>`vi<@D1ZL_A~h)e`k^Ov(K!jf5Xu#!T zKVBCk$~*6*JAw~*=kACvPN0X{9@u6$`M&h^VH@mDZU*Ss;hIQbL3C#C*qT&yvy3shytoC?11Om0EdSf08;x~mz`BS0_j4LZ!zu15yuub5AEko;z>>HD>4NNX++qA7B>>3N%1AO zQ@RM-Vcy~F{f0uG#5ZBd3*Z?l=6+svgZuci4{&y2y!*Y7pcMe#p}Kz8)&@J?BXQ$x zP2U(i-}n92J)8>EY$py6EdGhwrV)xtBj6{Xmw#Cg;k7RmLIHG(3+iMirj|tE1QIi9 zy9j5-27mC>b|;l0Oy3H0j~8(34Kh7K8IPPAbioq}>Dm{G*7rnow*cXs16}Pl0Jk0L zm2XTaaSn9HuHK3lM?|g91M0aBrDz3kbcgtYQuFq(<7c*5W+AZu^8+n zFMIt>F=VztyGTbrEs4%r&35oO>}5dOgc;)2{j1%?2)f;D@(9( zd24E7>b^-=I%wOdIZ0M1Si4|pEQ#VCYXTt_avu{l%*!PMK3;r_x&`fOAm(a{n98_jo!SGK(%Q*+^U*u`{cAVQr~>o|RHA;*=e%6*?H&bY~am$Yj(!ql^JY zE8S7sb=&PRjk7J@PS?eoCj5fRrS@szT1|~h&uU-O(XG`xORQKvd>?5$Y_$$7!yOrc z;XVw0wAe*B+vpW8Ls48!a1B*+Pm2IAtwr}ddJ@n+kaS0lbx5^?+wkli_M1bi)(<&2 zBDd~ZD^sUF{K{*Pg4XOXalh{F_QaQozaCBoWpSr z?IZrRKXV~C2<&fuLQ5YNOFwDv^CNyyKt1ezcka9>qQ+gE4RQ&4vI z!Nn(>vIlN~c-87#Ou!prl zqq)GT?F84&3Xs($$GT#}$mo7Cqu-=;ni?Hz@cOB^l~Q4sg=n6|R=TFPvy@R{vp)&# zSpK4Ld^%sAX5!7fPxu4nn!%Em;qdSnYeA-wZRBVGzn1BK00UU298F(Ocyg7C5LMiy z_tS6a2lCKu{7YgfMGBO!nDh)28<)3%?g$H zbyb1=2gI!15I)61b%aqe3=(K-AmY?9C&&Su5kZoGgdZZ)b=S`K^7knFZc9mF6$-FL zF=m8RwAYz$CEDQ(6c>$rrn^-G`ML3NxOq9~Pf<^``X;mWVib6$C`ZomAwGOU((K>_RLEwj5{uMrUHNe-> zjx4mqUVkGc_LfVcsUh(r5EC(U5lVWZA?XD{K8dH6|AVw5oSFc$0m7ijuof?prU!VF zaU-`j#c-A#9ecuzGe${>rZSdDC(}q|!U7FJw?i;6(I%YG<&MWRAIsy`C>OQb$wKDN zV1k>M@&9NnJ_jFeI?#*Oi5vlZP4bB!k5y0YM`Q0ux}Z(b9->sKk}MG?hiX|7e{#)s zv1!sdMFjWLr$p*i=<@X2UOFMjS2@=F#*2bCtE$TPTQaMssV9JmtXX#^9lmx5@ZN=@ z1P^KI_Sv0be19h;?mIx!8Ogs1~kzbbp(u(p*sJ&Is>XuRSQ2KZ%jaO zX9;<2z;^&d|AwP6*4^i*BX1koBV}A@KrB9crWlxl&71ODxBly-l zF}>JCYPLGKS9E~;(D{vZdfGQf^gQj$`PQ7lwi+&V(`_4a&K%ClWqCm0h=o#`Zsn~v0GO}41`*x&XItpyl zOA??@yo^=lr1+a_b7RSwXNURo#FL&0_ojYHk|VqmkZ=fDT5GBP~Nc9#0z?IwAyk{6x_* zB)HCOsYS6ar^W6rFGrW4CqU(>B@E%b??Y~gJcC1l=6i&|?hYX#r)cMa!jtOx3G$pF zfCrDK*W)k=Ax~;U6LsEcsSI;{F1fSl&!~;`HjDYrDfkP7nZXm7C-^&pSI9lB>Rl>_ z7Uza%;qABWQqOEpb|8yNeQL$r@~Q6gEp1oYQeG~V7FguSk<&>E2t@|!QzvAX{Sxjh zElxdzA~>s4H}at{(==2u87DU>O=_^|pnx*oFA|LvS|3-jeXjMO3Y3>d`dWVyk7_DlbugB){vu0ybVFhBMe!_Ja3 zpB%A#YifES#?I1G2zNgGN8(h}w?O3X5HN9zcgmuH0Y`G((4KR2N56t!s#b#ID01y~ zUnAY4<$KEd--&yJ`~CpLM?H@#SwBRts`VpC4?Set&bzk;6hVsqFCSYOfgMCX9z?H| zs9vi&m3&CaKPHm6+vTS)cx{jB&^woN7pY5NDaDAcA0{vAk!#h`3HI{L^^Z3(H{h3^kzkfR18Lj9Zni=!! z7IG{Hnl0yp#Vz`-bc*Z`&UX=P(-z!i0FzC88MGgxD39Kcs7dq~oUvkP$RlSca%5yM z?B8l!zRTDP5Tm!tsa8=DX?{dkGE}C6)hExIWe%pVW|M=>7sazLX251#iF{?`rxXKo z4H5RUQ$@^XhYO@TMXb@3^KkY>uG?UX0-3m>>93>+QaTvXPN}WIdgwIl8j@hnFzci4 zE}?kmr#f98cW4tHE`#P_!X(B5Ky~P#f+5(2y|U-tXfAZ!>GZov79H11F;x&2VZ^YI zcoY^}Vb7hSf*gZGWiw>@o)2LNM9|YIKYgvKt(iGT!Lga{|P-N$;|eC(BC-&Hs$@ zwYP`|X!?l%M&p_8X9y%JCNgf!mo}K~(pb0o;ckxZQP?MQq84c{OVpcT%F3QxPr=tJ zN#bnsR4MnX^{UyVgIDO)CL}J}iQ$m0Uw}tgX&WS);X1bA=WG_U)SvksqVMnWNuc+nB##g5rSPhL) z0`Bum!Snl1u*#q$9-E5E(wJ-0jJ1lBPFW&^l7%?q(#geWL+{YU8VIg`H`Zr-8Anc1 zxnDEdO51mtj?Y4AQcw-+Aje9s4Kv^^ez55*NlH*#Y}kV1kbvV9u`sG5E&%G?$g!aJ z-E-k00jq!QYdw16MDa!OR~;&l)kx5=5fa) zu91Na7vvF``f;LWbAwGn`YX0;D@^`X=BkxwgE5&b!mThNlTl$%abPbXI?QzX%(9xZ z>5q<~{6G~-&eYiy@--3G>uxqu9Tq~ODwgW0OL;1l7nZY8Qs!5O_(7uSJpHuu_=ZfF zLUcnUiWRO`*hM}KFv41#Aq)gmsYj$XRB$vXPT?1_kCTJK(JlZRHKj6b9To%oRc|3x zVhl-Ne&SJTVevFiK-Q z5n^a)Q>iYdaH`=`vvwlwXvs{utMJIMim?48#7WGPum{k^FsXbdX)XF%%zO&IG}QI* zNI|Pi^kS(~Fw{01`R%3zHdEOnMN$4iAn{pVK@O(K`L!}PIkcB&=!JQR6X68fmUidu z(c7(CAC1uv12(8%iLPy}({!~gb?v)T4oI9<_bdCxdq(<>y7yZ5y~}mzvxBe>Ih*$G zy!H-5Dy1oU;vlAow`t7DfM!Jtvub|;UqGP0Kk_UY3tJ0c3rh=6iu)P9G-(zmog%GXSe=DZYhjqsrNl%Ae~XtW zWBrIH*&10q*%zv<)8#ooe?frX!vT@Er<1QQA0Lmi{ZY|qNwj&PN5*%e6h(^V{I}TU z1JFeQs}lkhz6Ny{-@4xza=*1+vl+I_FX$G-K10TU5% zPS44^zh3v<{bdx}3k4gPsCA@g>m2lpQ%?1i}K`}uc!5??v-ul*(aGvPgp(!XWT4pwuIjV)tWY$wyQdSlFa0KWw}PCa3LmfoCLEL zyK8#$Z>XA?FM!D*&WUv}s)V5Lgy}w7?7#=?0%1G`w#4*IPnxt>3b_QNxEV#7IE&!{ zM5rzZ4&mK#O^q(ujvVEx=$+AjnEMC;tl7SaEHu?RyQ*;&z!424ZbFW3k{Eb7lO?xrDYEHd!5ZH znyT|Y2_#x_GcjUbsYpN<6G2NvT4gX`Fs6semTivLjoX*swnyIf#6jK$Hv5kkoU!xN zVa!?(uaj7_3+!&IU4~vwYw*eEYalM)UA`a{RE#d)Vm~wzz_sVhs~_PwF*Epd?w(WA ztokTeSJ}|CRj$`$yI>4JbBxs!SSC(M@I#xawsal+GwN#Eab3<<;QU3~b-K|K_-zDW zM-6*9mz0?6vUpsx%zD@qJDQEuEqNx$Z#!eFWy}Ke=SN+eF!g6NX@t^1e#o)Gn{!Ku zhl{#DexHK8fy9%9Z(7~q=uP9BbU62jA_-;lYmx%=X*i=}=uQ4QFCh{{)}J+m`8|nr zG%^XZJ;QqL0Fx=eVz~GKMdz~coaq!f$u~Nz40g8G=taLh6)=p@Ot&4$9@CqCX(nI{ zF+>%<+)bzxr0oV}i&W$ZMvi5g;k1VjoZFOsucI^kE9Ja4KLvA(Ptf)y*uYdK;~tV- z05z@;Lp>?kY2>yOc=Q8D%x!urvv7c&9>3*y~^B4ZO~@S~hJDK}WFEyPyz zMOuK?sAF1Fb__6f3)~Dd$V?MlhRkoM_Fcg# z)EVEPNLsCnuT@jeuNzCLmn?1a#{43NRis#RP?!U_&R z*EHCl-jeCmcA&8w03)bdHMB6BMguBF8?Gek(v2@eq2#*NlG*Hdg*{<{pcWX z$XEZp%d`78e?ynyyOp>zZ`6E;xPHxKo*CspL15at0O9AL6pQP$jC^=E9yuRL za*5fw@X2%>-3)h*s0$8D)hNRvE(xZ&Nvid1ocW)`DGLjXBbQPk>eb(1b5FF`Zvg52Mp5 z<7Wdt_B0u+b=J604Vj;6a;ML_Wv^xcI8W=yh`WTlPE3m(m+`VJH2Nl@qJBTQJvgi` z{@BY`6J&p^7+fQ&CuSL7HO^YAz8euf4g*%#ri2pSNL`=eRI010U-WK>&o;m9yxaZT zS+gJe1~nT^-Aw7w^L^Tt*R87FcNqDorgZqZ+9u(*k%9%E0$-^72F zVe7$eG*d^}KcNaq;G23CsonU7!v)LmVmRGuA-aOs#>h;^&e*np(>v4# zuv_l8@mu|*JpTQQ@sn|kk=}6Y*F(B;x^lbpne-ckrCN^~Z5)T@7H!@vjYFC-zGsDT zsBMRLM&G{QAj73P!K>Iy^+$`u%PEh}(R57Zf>F!`f-%OF5NnHcD4JCanpNa9Cuju$ z$l{Dh+B~t5PRviGmLw|AUo|BehlGQU?wvVmm8BkPA9nOVcV?Le3T=3Z6?f%8kYtr!`4wc;>t|9H6YtWzhqdm~#3)&s#Ow7@Ljk-@Ceo6n`RaDGk5l{Pa0Y&(irN z3A*gG9~})xg=a$`vwC8m=Hv=@d)fBwG-76z1!yGas2w&DYMmvLw_12wCaoxn@$F+f zDVW{2q}zGcLzB(aH^oJ}AacEg9fRr;@jrd^kyI6!u@Zk1O!EdTrfur^JA~s`sN$8_ z{7oec(lIh0r0p*IR`IUl9;5e@UAb?NVnpHtf&Ab0O$ukH7H9d=7H#2z7OCHdTR7huh|-*=sCQ5JB0Y#?Yk(${i=^_qxde+YghA^(yN zEx!`JB;M6Hc5uk}&V9+PpQn$};0xB9<(yP)@wi5KfZS=AYOvkUNU)xV+P`+gj)2Pn zVHqyJkVg)^_1@m*7%z7b)d0Y}A_ScU0!DS+u`-B=bTb1~M? z#v^k=3e|6Q(Se1-yJ8f0?h1+4Xs1k9?dk?7N9B}+D4OdI28sp_d7klKTg#gxDJ8*5dNg%zfzl% zYU>St#R;gU-nzMv{O(QJxS=p%-IJgiH3mBuaUNiif{;2KxN1k-h|YToD+O%m$FKgF zQOn$7N2z_GUE9H8P1he!LQjP4*@;vJS60sg6|_<`r`F_)WQi)3h1Bg}06pS338=gt zOs~#_9#0skJx&NxDDVwKd+DwqMbVU@v3GddJo82v9WiBISzu zni}XIQr{+u_T#p;OVli*S-BJU?HbcASr7R;pDmy^8uA0vlw8Zxq`cU)QfF!=@&E^Z;W%3~mGTFTV*B569{ zWb0&IG0z!c80pWd(p{ZACK}HgfRNKIj3mLm;18%j2Gtt10@KYo4|JGW9pBp0x-fRL zgWnzV6CR%%+)Rw^e!ISt_5WONZtGy~_XS9A+rt+rx6=*uu{n*6DBcg8^VbgDSrTyh zJ|2o{YP|2)QFi>CElvddn7x+>)%p%)#D?f~lystS7%|ot<67fIPGtQF2^>rw-0Z?z zvePj+VxqvPnX)sk1;eFMX2ljxHm{LyCoN41EiV0VA@L>8O>G1-i=c0^JQw5O?a3?M z^`4gQcQ&DHhPdTWw-erWz!fkb;m9bV5chg$S=M|@>0hmxlSnjl4!)zW(~mW3zHxCE&wUJ~w(jJc1Z|FUwD7foR0x z{8k}t_fUaYHJ9$k#|(e3c5Wq#n>OV^O!a|B8V*XbemQv1N|d8+xq?#`n1^b6e2&xf z=r9#jCu{*=tWxW3v=N6Y0Ox(^zA&Jssj*B2xz}+PRdg^Xsf2;A^*@7A``SE(5nK?X%*l zp`hdk?sYRJS&@34-MKU+)){n1`7UP#G_6gK6V0iS3<8ddB5IKdkQDpFiBnOflV5E0 z^*MzT_Hj!zBH|?{I1PD&fd%Upu{OTlhD<>sk((rhUxj&{=MG$#K>e$Lxb4jI?0zyZ zWS{(Ile&ZK8`+P{hKo)qX$&e{((&H3nY z6snUcNyuBHsq{00b=X{>({HB`p~NB2% z@?YFlWt!CsAa3Dc{u%wjf{#GTyH5xoR|+00_2ES7^LrJ!Lf)UV zc0#b?LSop{TYG&!r6rsXNzcN`U8kN2A&~%{W^8%4T=HJ9XcVEH=Aq zkW^FL=wug`8X0kg!F339y0E*-!o&^dZz;i#QElX+a~&lo*`6@jpf}Caviw+@e5@v7 zf%d^~ShX5#B;&G@tR@0!AmsTh086Tcws}qM=gE7^G#e$&pfNp!>C1 z`Ue&)QHBgj){f1Y#8PK<6y2C>ZD-t5hamfkTwAdNVAIW?|Ij=n`35j_`Q4!6`M5l^ z=LfY`4SH{u!*U4gC-S}b)Ccef_zfYq#JWn8+2q=1*(dOHB;9^{IOnu0`Xqd3{g(1k z^bO%13M^v1LkX1plM*QHr#@4M#`(|@8z+4#3J67+nub}U8QQ(Fen(2!OJH!KR8i2L zo+Mb)SW-DAX>7{i(Uwz3cW4ruZDdO1I7mDNbDdw7UG9k>_~eZz+xz(18-3T`=y=_- zCG3y5qM`hg2-}$-T?dc)h?8~Y5G(EEMz^z?}`ZFpz9i^NOjbRec zq~1*S1Ig9Cwi5+G(FP1(IWG58U!*v0*qqU4X#sr@ev2h3+p_>e7< zU%20_&MQqwjPAMPEFMT}xAPR<7 z6_L01GNbk{D9Xq)NZ&s0s@|EpGjv3<`lZ99P58}i_jk*I+#d&y`}wsitu??B2NzAn znpZDwrW#RpWUdD8JR8l~5@>3Ac!SYgZcMY(3o@~LY z-)c#fioU!YVTDI&L3dCz!Zbr_iGX|2*Zp@S!^@Ao4P=^8$LALKy4snJJu0fAVf)$0 zynr7k<71z-!*er=p#;(ZlKr2%9K;AGXRoi?-Z+zjIU5^1-rqy@Bc6_Q_`JVt5zRJP zFyw7|pZ5gES1fV%PB6`2->Iy^J5v1!K`do|amKAFE=j_N%tYkI?MC2P#G>=gj>hE0 zkxhoINkcmb#XCsO4z+?{IWZwP(HwKggImtSV`+Efrq{zC%&Fn2+yW2N~RmMouk}5DKum`=>vP*X0rc{;n$V+9OmBOu(+B& z_6p(w#qYEq%S#{&1;vd{jJF)!^WhB`I0Z6 zVK&Aazd#}+nQaqiZOo)ez@8J+t1t8`j%Fugt=tUsqZJmLcp^vaQ*BSGu4aJ9V&FdRopQbPt)ae;sEgZE>>f>g7@1HY^a*SYT>~6V0zoP{U)FzK--=0+(~7IW1cs;z ztJ1?#RSIk4yhvbkPlP>^$FjLPjMAFTQZ#H4Sd9e=t4yjtpl87Xcw6!`?|su&!!bdj z+39AQk|iwK2u>_+bJbm@IO;fpo;Hv)$xf$;?WwCz#%16yOk9{bg)^z@L~1tGcWkWN zdS!YL>MYltughMacy1vtK;QW9_%A^}`ENBZXy3Rz^}b{T>VJTL2J_E;K~qYBi%Abewmi>ENzc-a!RyZFR!C(oDh^K~M8*Z^CS z98n}pu86RxV$p-O>`>?L*-is^4`0)5GQ1ooJopY%<5R*otWBLirdg$O0ZTs0dzBGE zI%{D?OTxl?B{%B3MhKEhb=fIVC6eA)dGqm#2SlSYCRsKsdlUNtdU5vY_U9eY5vJ~& z2&XK~@kd}n$hNf!b%`=s*j+$rH?=bObn;0I$?r`Nn;j=Bw55Yy-?H=6Oz^JTxT)~e z>~vJYTABx!?7@ggq)Qt@;Rz-gW5`x95g^e+`6-9NqRq&~j=TUA`u;MZ)+)|IZ4^;l zv?6%^A~Ige$!t;Ar0b)fF3>^6$lK*t9v2Yqaq&fCrFx>Va}_F>n=f6|v0DM@;P?tY z)aTiDcHDL4O3pIV%PJBe6$ZMmkc5{sA+KGh5tSAz&b`8=QuUmQoz&lmDcDVw&d&EYT;FUm!Z9zSX&F zughiGR{p8DkojT#jzw)?LKO9J9d|t6Q#Sv32;2un8>c8Qe3ba7^F>>ae+B*?`1T`+ zkwWjR@?F5)u^k+1D5^s`6YebdL9-9-mj5Pb1%KN9q(M8iD1juB3+Wc2>Pg7SlM}%* z$ta0dYDYMr3t|Oc6Dd$&|Do>2{OU?jBPXm-niR7ww1W-1MB-q{qA`GOeHZz|AZ2Sr z2VIB(;_vQ5=7)J?_bs3;+;1Ym%-O`-mFEW>*zizXiMcL?z2woQn^MMI3%HQDM!59E zeS+h}5#Y4IQp~C6z~`Lj9I(~5N44kN42|dh1%cV1LPF>ti`5F`JjgAf7AF+(s2Vp@ z7+1N%T5&1fA_g(`AndpV$z{h>*=ha_hv;5zA z!G3B`xjHe^O5C;3V#L)VtCa|=q)J&UB?6m0PFlB`AsEsJH9*y4+L zZrI)59aa?2NGwJ+EQn0ozJN8BvIOtObt7t38^A1RB{YaIvjq!IkkA5)1*{Hiu+a0k zm$J3Cp#0197Yk|Yev}^)4>40Eu1W0~I#lbAgp;k+d&d|&1^T__W3m*@qODsx`>IaX zDio{zY#UWj?<`J`HV`JzEErdTc9h!{Uz$N^Q!VOvP4F3e96Z&bxeYe2((ud*^UFK7 zRZE()zfEr1V{b^aP8Rk&*D3{sL?j82xI|QjxBomd%&eO6+Pe%6&%mp5N!<;UD)Oy z-W~`yv$k`N_W{qfVC%+U3pS3EgCSjYp=LP)ennDr86DmhQ z6D$-|X-h1=55vl$pLi8we-%=9`R}gnwn*4x#33{XVWm2|6SbA4Zp9jgpJ-7etBXgq z(LmwyH2sB*c?>3lRRFqWOy&MA%xW(5(pS|(Jx2J0OM7lM8PdnCAvp^zxY!o zNLe_%Uv{W#{qY-34k59mk11wJ@{iP^kv+s`oWLLnVF`XB$qDxpN-iwpXX4AEb|Rvb zU^TE8+!HMD8z>#57u8+h?zZHY5Afg)Vf^)tThmFIS0`8A!&x~hf+CM`d&cTnGUgO4 z6=?Sd>L6YaVolKP>XZwG&{O4Vv6OI>Lk2;K{Vv9Qg;t$<}o`TbsW!SkwooCeXH|`M^wtJO*p5%rS4Ms{k#|823hYY@ z)R;a@0jeV?t2t{2>QEEOA;hUgrx|2e2C7ELuN72+*XSSg#4I9U-3I*&8i^jBFBvGb z5_BdV;D4bWr!i;+{x8&-FZ^_YOVr1#K;kF{{{?ypG*dRvzfk+niYPD~I1}2SlG=YX zK%&ab|4$R51>R(iv{6{5Ooqu+5OB3jnst^x6 zwS;C`S%@2kN)q_AGR6f>DIR2c@nuP~a+GM0!BvSV4ATCz9pozhDO9IwKzTv@?NRZYmt8h?)ok@u-X%BFTk;mMY-sOPuV4!DomSaXI35r zCQd+F3Jx{WdpvL={=3HF8VSrIV1kcErD8(3F!3@R+J8AAN4wUlm$L8OdjR5P0N6N~ zU*O@j325)v?MMsyrf=uP`a2?*byfHCBn!fT!gh#Qn$u<}dyO{{`M*Ur*%% zs4>r>Ud~F<(Y}tauSwOIvF%Ix$9gKBJN>)7lf3i1JNv2dr_Ohmdt)AXw6VF9D$qTO z3n!9V63)9mt`5aKlhAjFh9h|I8ox+t|HVqRfi&?*YH%fOn-`HnM_~uT(?{(z|BX^K zsEV+;Ve?@w<2WRw=5RV<)y5c$MX2#^jZ|^v6LAeP5|p}?Bsf*m?dfICaHRRAO!egh zPL=n6rU^)ND2)J9jPfM5Us#d2rl7D&$9{%4FL6SI=@oO)&cV)H77k(n)`>BRaNOTv zCofv&oy-($`fEF(kGslLfTUM{tU0^85osN_$jCoX5{MF>JExbDSUq>0v^e4lzhBvZ z;XG@ps*CP2iq&0y^ak2EHF&oE~+Bg z-&t-)7X|RpTW(($FWhu)!F6gQ&M8HKSW(1_3T(lhOmS_&y-}?)KwT{SQUq>Iai^+m zhn?nW!;iJ@$v5r)>Lw^qv`>j$U~Zdh(sMJwJ-`~QyM~5X)c_`RD6eyJ9js8GGrXO= z4yO<|XoH66QMjFqT^%wR6Xcwd=d9vdFBQR$9TMz#EZ@?4j@Z_EE|mZHdtPC$hxMLb zulJ1dvzoLfvgvT?W9T@uM>RE9x7B5V-ss*jh@S@Q&u5JpHlBqkA3`(H{7$VEq%S3%IG4Rw{VE>v)`K?&4v-Z47;?~&ygqrXPIURSOJ?Z^zW zO&t2HRUDvH(E%Jd!lo`(WHaiJB|>?|hpeifksBz@I1|i3II^UQsoc?qhQ&)C_ZQ08bm8QRBzFxtfzV01@%*dY+Rue};f4aQYf zi5Xqk#P#m1crI=&1$NvpudQY zs zF){xyrJVmS9{Xq$5}vHrhpb51UHmj7?r zyiN<&OKr8y!1vzOf+9gW;z5dNFl%Z`$cTah3>}Izi;VS<8HyNeQpwf=WmuMJk?eyC zt9DFMsYu3O9oQC`MoWQ01hN&SYt^6)qc)*>9mb$dM;E=Iqb_kdumG;%_vh~Y-hGed zypCOc#h`8_N4G>;x|I#dT;s2Pubr(+{M6x$v-UF!Xv+3`V&B2XbZ=cdXlIMTB2!IxV1wOh!K_txh0ewS1gwJSt z>Ro3JOQ4t|0^e(`ZsAn`;h2j`w68weZrf#adW0~7-S@Nfcb{&{N-%&Cf(Z84we^kA z6_X!q4<=ambeG-!Oz8$7{1F&5n#7uVokZUR$`qAZ;YGf+TLK~-!1v znN7JuFMV%dOMvAbIi@ChTH9zmoFo4$!fdd`zE0+QH%9V z&afS+iFV1A{l1j%j;k+6yx>At4%;*4&ZLyHXNxP(3MO?5PPe+TDG#M?p)lC>h`xiB(0eqEW=pbgOz z#Xss%(l;xhzAt2ld{ug_Y=}tg%WI8@Z-lx5mOtZ~RHug{30t@=#(OZ35#J0I+br-F zw^5Y-rkN=^TXYs#E`3}DjO1YRtPUFTM5Ug0nbld%x$mTDk@cTaS0 zxV*pV)#~{P-#epccE=)^h%SjEU+&$SsbdYVFDf`vPf)(UaDJnk4>3bJ-E#GM1^vu$ z;sK{l{MOZ&pU}l=l7W&c=8Ip0H@c%WX2ub@+GK8r+7n5>nR6rWa7++@{#Og@Nc^$g zrKvjmG}9Uj5Mh{yvFLI$2tWCzuXWGhlb&xWx{0L`hu#f`$N@z20ppshy=zB&iK_eJSMV)*<9(wwDrD z<-E#_o{Jt^0C&RT^Go(G)E{_Wq1n((&B5O`YP%2~lv_V`h`tg0Gx?VH&5mZr;8x<_ zCI&+_-tdOwoQ3v>lAqV#q|7R8u?$TF_B9)fdume3XsYz0IYka?o?8a3n46XxId}uS zpHo$j6~z^Mmlc1IfA+5jD*k5uL7WRebC24W9diRF=>u2ZOTgI)e#4@17UYk7zE04n zHDvmwrshYmtPCG;qXVAv%c59+`mBgvNOu&YWK0`XH-2qwt%a~TXCq+)|Atbd2hnzW zC}8NV2IaYH-2&4He6OE#TK{Jz@lS(>0GmSglQC%LfdU~bt+DO0e zQDh%%Uv?|7ZLlrbp5l?yx3*_yXdAfdz|+fB7ZB@yU*g(;vW>h}kDy$CI^kq^63y|7 z(GG;&^61kfvqSx-kincXET?a*dkn@o{4=WZFc7oOj#zLMCagR?w#uxf;(+1=m zPPqu>CY&_)haXQ0_n*=INZF|{tM`{+PJS@2+9u!G0%&m=4b7ZQVS9GPyFpB+~?>BtD@PBR+Q89GZR0(M zehJZ}1Q4@IXvM{MYj*#b-Z>(*}2Hrb(S@YkUj>kP2+bj2*b%cEF^TrG~G){_vE0mtvo;wIDHaG&6bIsgGXOW^23 z?~bu3#5tUcxg|F%>(VlwM@}`=uSvo+TN4LUxml(03sws>S%U;oBtc0e)*YnPTu0MR z)AX$0eltXL8Gkru4uZ@d;>caQ9`jXiJR{vZ9#y0~DL0S2;V<@)mr5LtQELLLR`=~* z^Dcb(unrK;=@Gl&Fskp9G4n8;*@v7JXAhebbX~+7xQ`UCef? z5xXwO2E>}8xV!v+`tP<=7;IubSu!qUk22V?NC?sdAU+Q`%}xyd2JC5Lq@1g9?zq%* z7`jD1Yjl!t@A}7XZwNFT>eWdeS)sXN?dYOj*9RYOCk;>far!;NFG7Uc2Z?s*Md~dN zUg^9vrjBZK1K9dx4EOq2A^_Nn_DZ|%`J++DL!f8QILIEJ>zo$^B_xIkXia|tE#SBu>lFF7Tb>YpI(@HAzS zk~fNbea3rFsr+BfZ#cy(gj#4n1H{aELbe_u@edo!;Qhr%C0JTxx(O-0uHF| zkU(sRnj5T(zyb`d!jlw8Li+F-YN-|lF!HjtnBlOT>cy;Eto}_d-3yW({Ai@z7_0;9^@cEr`HU#*Tn7dV`GvTI{w05md<}`KpAL+7gx8c;0 z)4R)!iC~oC)!!P~O!>C%)!q6m0;`fq7W@e-bnCgfF=g8^Rz(z^mu_@U9j`aaP|crz zl|N83iodQIEUN%f3+}%rTL@E`Cz>Z>L>f_jF4cX>gR6d_-=q4feb@Aw^}BqSQz|D@ju$#bLyna1bfvtS`=ICYz9?H!eVZ|SwGV6hirJj0h>S> zd7_`=jjpa%J3pEN&D(n%GoPSY9^-w%4vO_0W#)^oQ|=STOwFrw6B!(ZPX%<40@`B* zlYkG<&>UYe;;FYiq`ncpFh`%Gv=Mv-4)N3?paW?G!rg7XLiaP4Zm#EW)Fjewj}S^r z5I?96xDLRCiZq&1x`A?le1T!iL2ZLj2KA_sd&V3_yFiayf@Oi~g5-h1uf|Lh4T+mJ z$Tg1AL{K}9Qv#?iB%C|M0}*&YUMv%jM`Zcn43_Mv|5OyJ{1uW35d1JMd@sA`OFR$V zGyPF7j4mksU@uw5O*MD8liopnNdZw!oIiy zj&ZA#^>VXKSbIG~VBC&RtrxvoCw9F~>~b#^YI|#)+XBupX~N*JHE#I_NogvJ2!XfF zZbAA$oI*tRx05}oxP$&dCF$RigE_$4KfI^A?)3$FxCC?PZ+wsxrDhl5seNjorm8vTVzUK)De>m>>*bVL&lf z3TWw8kYji{w}nROYhyiP8B1j}WyI;OQmM-H4z>UnF=lWhCIwr#M(L*3_SRSH;j}Xa zT6x&=)$*#kkIWsiFbWy5@Jw2q@NBlB{@9YNY9niwyf(ZJ zyvC}#?JBwp8n&^UTXxs>IriK3);ab$w|wb~=}iKnoh&=pW!OV;TX55(QJ6@c6T2O-E18p zxP|nktzT9O2}y61r4URQTXa$_iQC76lxB!bu(_!JZW@xG(qb1N9-ubB!^!xNg*HKo z*D|VKSc4Xqidq~M?!w&Z1#sgNZvfMAu6BRCZN7MLQ1mqOA&|n{++2yi#ci#XPEqSs z-M%{UI^NW-FTMMn;x67)n7(0MWwjP6XJa&dBAH2L*jouqcrO*Y^A8_|}8Sq&V^ zj$e1#^c2R|KB)amEU_3~ySJ9;a&km^0R3dk|a@NTt9TKr}#gK;ie`Yahpn z0tlDKY?upBO3X*j-n~G!)Oo3nEpE+}uit!qgTwD+)0DsJa>GeGkQ?ENnBEC4-nG_1 z`})#%fCL<-&dYB)bY0*-Ua*2e9h%%{>Bnz7GHHMSK^#FclA|O%5QDRWIEC*gb8Rm%IG^FR782)pBl<-VQ zaGpVMeok;MN^q`Da86FZ?Lc;?Pf2KU2p9dR&G<+Mn*eQL_3NDNoMet$+Es&RQv>2& z&HQi?<5xze|D%`(RnAhrnV}LCYm=B!Zu*HCvIPZ58qrVmpj)D9^q@v!AO(o0tzuIk z({<8#zcgBZgF1q_VN+Jj$$;GA{HC0rkF14*$M1e$tWh1vAIdlx z$XXbC6GD33zx;`%C=jH!OdTFECah7!GSNR!&Yl4W4nX!`qa?s3RB`6Z0bo!SdPSTm zTeUCz`qMnBP^6_4MZ5*YncImvWw@q#D@$2dMwGu3reQ7TwzKk0bz7v(?mg9jq}BYA z)Blbd@FmB}RIlav<|nNt$h9xWc;j>R@}9Wf7%b63pa1lh2uBY0mY8+5;1OpG+>&** z^8B7^5qpv18VX0#;-QtN{!!ko-mwGCo4NpZ5?vxgNIcjQ!+9GVp85G_921?=k?&NI< z!n>er^|~dtA+`zL;gDTBhFYwIXlu`Y6+0r3Ym|Z50vG=M@M8lZbK+e|IbOZ~otE~l z_X20z2?zTnhCyA}&DaNp$&nDbyq1yljZmUP!%X^F1V-%Y1=9n)g9&PSx0MuQi7k)6 z*j%Xl6M>gMD%rY?NN>Iw>pDzSWAN0fL_Bfh)s%NRJ_gN0rFOi~z>4yo(y;_KLlNm6 z4q3`zXN_v+_jNMccpDjGPoJB$@*;U6j*~L8p>%5QEcmNRCkr-b?*?%=E4Kd1LuJ2< z;&ctX$V{37pj{vaC~>@LmoolTnctJ9X(J6&l7#^KqLMtlzH{1Ck|=rZK+0T$e>>D3 zkkgVR5EE|(RCPPlo4G}Z2YMRy$L1JgxQSMxiCF^6nz+T{!BhX>O)@D@VkiCSoovHm z$4rIG4L`fWy{1nmwdI?^WtGgFA8ZA_$pB8>-IuQ}jmi(W(K42=r$pl?5m8B~7660M zLB^5$@H=U1huPRhxi9u@&T&_5a#2Oedi83RwSJX3us z@`Siip-*n)>mTN7E{EKDt=V@fTTeKNE@NXA#kFEYJNYrm(o&_oc+BOSSnMM_4HzA*aPsdy$yw9?5$k;wla% z4#moQ*GU!BZ)z%%$-f7b<-P@4sEQp0xW#J;@s5Jkf~G&$H#WG4on7DkxHuoEHNb5( zXFkIei1@02Me(gcjPl77H|Em+RA2?v2>BBMZeyN8SwmSvU&5AUXDfs`!J%MN>_&rD zgX(~0Lbae=($q-|nZSMo`rCl!qJ+sRBVF{Oz-jPu3EU-Gi-~oR_%8R6vH} z(-`mt)V&{v|Br6MKg*y0B7| zW&hXmcTR$$qOiE4I+e18jfs=2$?tzsbLEv}l>hSuYyZ_wU}pSJ?F1H%zqJ$oMG98L z|66gG<=^ZCmcNC0a{Oas<-d@+|MOn_yMg@YvHn}Vo8|wicQY|U{a@tnzv~g}Ka#uI z{$B28plAN?=-q!q^gNHeKJUm3;Wamp2g4M=l23}j4j_(zg0iF{C&!1vWxy1n2T_Pp zNXRplHchZLHI&_OV8m_I>(8)Cyd+JZBxW)-Wtz5TWEewlOxH##_V`g-ax;Fo^4Yjw z`PlJ%((U^B{%JrEg*a2dGmL9v(@gRGFJ{QhM>rW==jr8-Q0e(0Gjgv0s0MgL1aU(UuD9CASoB>%}bZV z5-blce>8J=4(iz<88HEHlPK|MA*r!w${^12&6TN;>mk4Fq2SnPw4!_k_ql*BdoErv zATIwIIWXuPND^dMxP2azeXHBnQwSbb&=w~`gs-sY9rQhleL2&2euJuItlq8)DP@ekIy;CryiemU+C?`t2|Kc03(_?UhMvtA6&lW;E-KpZj_#=Tmkv6%bnPM z>KKyrIV_fq$i`7J9bjh^TmLz1!!}O;#H|lE=nnWRFhHKwE77NtcIbD|#_ZK?r|(EH zJM{X_ZsuIAUo31J)>1*~EVLV*>71@Jx|Rd)^`I>K7Ni&Y$v&la$i!@`eU8#AU!AaQ zp&lVIs%VKc?PzWi+Vs>IoQce27Q&=Be9@b?uAF5A*V@s)Kt0i6B|NfK3y)Q>ClI0< z940lE?Kg))H+_0~7|7=2y6f?b7=!3O8H`;&fJ*`@f4BFvQXYAJE#5rwsC_sYj$&5A zBqc9o#}SCnCMJ0V0-% zsX*suvYJbrgvu>V;y{oey9lCZdI;4SZC04nAU_uCz>lisv#i zIjcG-oxe)mX0&{T*Os0SW!4ev8X5xTT_1YPqRn?vx-vX0N`~!LMhJk_Z;FD$8=d(14(uG+jX0P%(OM~@8-R;3AqQZqx#loFmi zGTg;6@EnzGlo{w{91BS(97{hW*(_rm>kF#K>X*0Ic@>`l4TPNbI%BqU~K5ynN0xlhRoOMj{SHNERv{YWR8A-^0} z4)j@xq%3Pk{`@%;bEKpBKnFw<^iOf(7$9x0o=X8BZQ&oV9(Z(>o!L_`UKaUIIQ!z_ zKOld!Kn!K;qVLO^Pbodef0gaXp*Y`AAXfXyR@vzW&cEcNT;~!oU<0``&!x}ZVQBGW zpJC;;|LLRvkb4WpuC!)wxjoNSsMDfcFBz`;@=do@IW|gZ02`LUM2Tv{h_DdSza(K0 zgSefXMS$3==9h*TYHJ8l_$^T=NAHi8x37gzmfqSXKw!?}XYPpxY*Xwib7s54n2*N?sL5{y96D7I<6 z7q)Ir$7(cF{(7=+?5!9yWHI!|85NXFwjnqh>Eqe6ZjQ(!#nWfsfCslUL(CgJHRvO2 zdhF}i;#l?lkpJ#=6e){Om; z=~iySS7<^uC=Slcx8!@^V`|~dN{ZL>5F46l^QCs<7}Zo(M_q;Ua2CJLUd(cH#|?h% zwB>1;C0j?$>p6FF_a$BK+1mom)Q1`0?fPj=Mt<;dsd%4-%icNc z6OH3*p+Z~`!9Bw$4b-W{urwHY2$s20qcjyH;9J?_ei1h`gb^1n!Bzmgl#S#uQV+kR z036IXVm1WQJv5jG2AHW^f15npa2owyfPE8yo3bY3=urrmr!L4b@-D!&hZN^6*h}V( z^*9D0{s&c^8l|QaX8OTSL<_M{kc6wFbp!#0glA8>97jO5E9GDnv5|2zpxu!@RN^ED z2NyX-&xko)^Gz$0Yi(B~@f8Dl9k|k*|Dxa?Im9eTL%66Aza+(DS(;$tJ?VZJhmkgj z*D#D?+zlW_nOj^;ZkMBb#T8DLLxG9OR8}%+`PACW9ac|A(@7s&D-Ai}M($AY30R0} z5{+K{*3V*3mG0epjE>&6lAdmvu{Wa}fmOjDZUtusxm2Kd(PxWoX=PxT87sdoOI=gD zF?C2D73Myp4HaJCI)U;ltMsipGW9S^utQC5;~=>R_a$y0waCgP=sUqHTAE7Hx=Pfd zygg>_9;G1-l{gx6h_$ggd=yn+I8kcUDn!`IE;J)mP(el^&icr;LP8KL4OiMgc={8J z{$ABOMP-BJ2t<~x3U{4_TI@Ay?20W1u@<=9v>H{W{#lw;G@~j2e(Q zhNQHlz6(E`j-ISw?ll0Q}uy17x@hZ!9s z0#nP>=v7N8(F`}ZQMqt&ia0DuKH6V6O`Y$2@B?>{dQ0*dp-i1#WU-lE&)$ch?QS%3 z>J$T1f3eE}0~Im-wV8=60K*=+{RIQ&JJ$jCIfPj;tAHRtfx@%(M((4LA!*`uRV6oS z<}Gf`+uu1B_c0oICoqf|~Xu~dgWQsM5?Q!t3xPtTn5)0qsV!urXqYYHm|NnJLV?lBlH!RFmo9NB*=?Vu+tjN$UdMFyD|@gRP>)f^WGe z!eUMnA$qi6)B}c`s`h#h-r#nLl)&}e^7u~1=(J6uVbs$xFOuR#@)b7kityMA+~hDy zm4PU9edPCJjYiOw6(JRt3+0=21b!!V7(AiX#*`W>5vu=1|H=S#@pP&%m#1h{xn50x znaj#oz>C61mjQ@amwLBHKfuTvO%`DA3epsm@$4K()_-gHq|mPpX;7zH$RSCemuBt` zb|xU+tKF3j_#Kcsd+(j)uO-&x{Z9PVW-BOP7%y{-NFV+_i3N+Lj?|wokNmx?^=T`8 z1^}1-IZ$+6iGhIjZrHdpL;eO2!o_Bz59I@Kh0o(;;DdajQ5 zD59GVn> z4%@^3qHzry$iXEL6EEV)k0cl>4=JM!GG381sdZa<3bzI~HW;hpLOzy*kQL8G2x2Dd z^7GI-x9VFGBrO{0#X`Zl&DVHMBT#l1bMo~0rYrvK`SH&1L*TjxNuk(fVY9HQ*<%Nt z6Lwb(FOIeyA5!%2D)iga;2?-tk( za=Zcj4q(S9X%yHX@Nx&!9E6tClYUU6Hv{_K`T7JaS-MFUskeD%id-%toK9>bD}z{} zyPk@wx=^H}i1NH*&XRdS>j6vXU+89Z5~LSl?JK8@HSHDgB*kbe3*rZCbDgp%;u9pj zK&yHR;w`8>>^EmezjJh%o(H=RsXzC7kF~&i`Qf(j<`(=Va)!mwwwA`6wb$BB>~~$= zc%vT{_TDTPX=RDzZVIE1@1hN^FL=tU9AaUv9ch4y0H_#T8#TsYq(jSi5ev9 zqt9PKW%bSS!pji0955{o(1dG6vFcIM7(@y6AwV19z<@vn6bd6j#N6`zDAj93@hH$8 z)}~sx7vlsKK_Y1q2v4678)@X(^%;?|)*;SE*lYQU$xT!Uk3ueOs*2j!g`F}g+#!B-wTvj!m?RYLTr%WZk z-|a0qRjRS7QJaImH58D0Q|tJMzL)T^c^?H1cAIT1e{r$e0h?sN@{YkZJm&`+Dj=$v zTkfK!ukr>}FLPtHtYs0A0v5$^6J>QFqgY7UL{;xtf^wAXx$a-Dyf;_Y6q_ilxg&=r zcfvT1-c3@c`W5lZ#$SAa^6)y*UB7HS+(BP*>~=v`L@f1sxxw2=%lBl&*$_+E$KJXcE>!fXSb`QZ6cooS0I5JQWP;V9wIZ7JEHlZ@p)XC${v?5> z%_3`jjUx9+FU=cEEdF+EaF;!=&0d>zzaFSZOTnWs;5?qP)YRZ9jXoBGZvk<d&vc%%PRtMA&F5Bh0VfZ8M7&# z&@~$5O{h34iRJ&A&UUOnTtjj0;oAE}flrIo9XOZoh0H5C?aE(rBs` zlEC_q^);^br^;eNitrmBSC>-f?ZdA76_R$S2ENWiTr*!!XN8+ZC^A@4913ZVD*!$&q^jM|!kOq9~S6-Z5klTsy#2`%KToteBkg9@Fn7UY0+HGk4`siAo zIwK+iJXhWkg$)_@bl7IVOPm&j7WQCa+~rB{93bT4ShPPMoQTZsqj|kWfH{mjy$NIW z4R)vYMR}OpbJe2jtNl2Q=kMyb)~xfa{=f3kmOG57+XEW!Z9VjloL5%fqoh0bUy9r> z@%(?z$l+nbLzaB9@Y3+`T`NS+l(Qd^1=^n{jROfJcnf(1H}ov=A4y3v%gspxvL=bn zlP2R2HxYaMqONjya03Ke02Aca!}9e?Cr)3a@3o!$@=P20Lg`Xs6exm`S4zz@e>q^Q z(i7r6xn}(eC^gamw17!rx%JTNr5@mE^VwvDHF$>LC8bsIvpb#LMFeKfGrl+B;&xLgi3d%K_6bidY`TxOBtTVHKUq3VXXKCu|R5Rm|yulWedzfIc$7yHxP=-z5dmBQoPhSVM>?Wn;7j~Xa8)~gBzJp zkpj9k@Jr#+6oS^L-E>c(&%r}nP$L9#^%Ql+r`&|i{SaC~I_(COS5vxlAdWAN1 zbA2Dt)B_q@%Tnj}N4@H=YAECu8|)9F@)~Co+4EJ-=hTZs_(zS|DKc5dG%lBHD1dUv zIjmt3yHA2SJ?d_S$2lwHP4ah}rKf^M@uUt8<9*14EMQYb>=#|&oT^HT?eLNAk&*IrxfYU-o3ZZ40 zlZy@($Ra}XcE>Cp=_%U77oW)oBpxeY5INi@!}kM+J7rW~K64Ha zKyVOnM|Nn><3}JYe^LLd)-`6CYE_CPDqx!%%pSoY^^yt2*6?Dyp%cK9Xbz%6N`dOi z1rHt7X;ZTM%LZtfx-S8j^jpz-g4|#AG7o*A(B)f$s1Q%&mMHdiWWZKE`xv@dG|v* z((3pG#PRF*&vWU8o$m|U3{MA((z*f6VX|71sp+-H*U@v0l%4p`9V{GJr71`PnK744 zP1Jm#%vGpW$@VrXwf#FOD5-jNfYJ9JiBzt}7t_#n+(p?N4O2W({_tr8z7y_a|J>~R-K{r`N1)>DW6-e@vyawM z)Sw_V6}L#tk@3>ogT(S@mV1uSS17zPHa7(AAEozfW_4RRsTAJ(nYXc-J5%mEP>N#*s|*L<-5b{3bcZouu=fLH2N#(?+U)| zw@)BZ!^Gdkqv{4hF`7REP$$Dty@u3wX0~6!z$fVX4$&IJ)!0|%Zs*vx`^1XQ<_TEY zTe7%e^5Ldu_$M(#9xmoenM-1GX4jFq*nsOR*?x~iR$pP^CZbpS!OnQYpQa6t7<+Ino7C@Np$v6QnWvp$kn(l^@3i59a=(4 z?^yZkjB&@W6%6=*!SlR%Zn}I+aFg34!+l@Vobm3?O5WoKPu#?B*Jnpmag4(A0qUmD zZtN>Z_hw+?)9A}Y=;Nt@SS5g30X4{Al0Bs_iaY_bNi$w~Bu?Wyp_RZ8WgsU`#n7X} ziy4z0hDz_bqt2Mb`lF`N3lPG%^fR7rWtHOzuQUZqs$0^8 zf2EI+HQE=h@H)AT;)UI7NyvA@DLB)ignWpyGoL$<4cQQc6SP9meubehKn5VLJdZyd zQ~4>mjlnm54?HX|?vbv*3*aOWgwPLy4)DVg01rSTU@zOVDzNfp-q+nn zx_4RXmz*+y4dSC6a8|Dqx;e+&1vb^Y*`p`%p2{l#fiZ=q75{JvpS>uzW-P)F~ z-BMPKdo(G`H!UJ8W7@NOG$Dc{SOzwjWO-gnendA*L`s39G9Z-#jWQ^e!nHE6t*GPv zv*W%q)I5(S1R5Z{l`z!8Vu*0u8C1`6o9Cn{*O%(&LmAf<(T~iF?MuRsl_!^Y+Ybts zUrI_`9hWgl)3l)-m5r^5&aUmtRgE1hRTo=vn+Cd(&Lja!vFF{v<=^^L=X5s6Q^3d|Y@qeDH zX|_wj@4I4$9=DC^y>1);j9~b9({6a`n07kw@@|lM8y3&I@OI@F4{-q7ewUAN!Q5W* zr@W+gX>5B(E^c>4VsG;R1j54I0Pyqi>&fZa?Z}#*5GJ<%2_@DB(!{zl|K6Wr9!J+uKD)dNZm1~BaDm_3eKwN|n|9%D7~m&vtTkZvfyx0YTF zakN?E7_N#Va4KM6?~BVZkcLM0@+lm#vM((n<2suFC*@7r!X!t-DbzyLQp#X|*x4ugVQCbx#1wXVilqHJ# z0DEpnvN19uXK5)m6%eZ8YGzOsj0Y}{X1;;6*=(bD?D@Q%x%fDzT7O9iP3q{Yod}Bx zW{ue?i5mNg=4*oH7EO1E*=c4tjyeL49)}%aNg7OfV?unlqt$(@`bQr7zj9I8m|5BX zt(N`2>#_e&k+Agt3WR0-k9j?HIZ0(1q5n-F>_7X>e;?7~!2hp+uHo$*dcXKH)W9&K9!|fZq74eZXiHgvh1MQ?6_6# zU%Ib6<_xBd`_3g0ct26#E8GPlGH_>MEU>I7_GeD!HF8~-O`S`vide3r&Jc}N1Y4TL zr!3T)H+2;`gw_T*u{%5uq^jK_~IDr=0EZm~c8qA!!UY5Ew{>S~#Til!SA*2hzOS&#gHVaw0-j!!ZEt*EED-^lkiHBv$M%)E`j`t%0 z5_NR6U$KNWCH0i))Fs^Vn9o#>=}bfRrHgBvcb{y-jXUK|FW#=_Ywjzck30;TtpY_3 zf?dYE3|@v$9cvEO_KW1sn7H;J5(d&)6gMUZHb;%B0Xk)O5~aLOq&?}TNcN+Z2MouK zz{eTSqE4(w%sfR^AN*v1C1yYvV_IaiaeLZUb5+h(Kj-R~HMD26_hd{%W0o8DOz*+* z!J9H~WbM(&s|F&Kc7gOJCGM}AFs2d}Q@R|RW3 z_Qe9wcz zHs_dk^bwDYbXYm&XP_!+&=KfVtR$$excimlCh-F+%Pr_nt|$u%3JH)fPO9xOQN~$-*^m>gW5B z>r>?1u$}v6;Sx!boFJu38ISO7<{m3d^Y1L(6QMJZ=>c$IBHwho!*c7+G<{7o52Vs* z%E340n?2QT985g}7Sn|#YY1`N_dqpyP^~AKzITwzQ}^>z<&(K2jMtnItJARm&SNxa)#Lh@rE@>X68WFVBX2Z$i)5Vfu26v~ zq__t*+=V+09OrAx)U+XMe?lHC(6OMUq|5=2_o6-v?VzctiwG$VomQnQf{YoX!>9!g zXZES@MNCClGq5IcJtB3+z~-sgyAMd*A$sNNyHgW187WkzayN$lh=PtkM0pgw@r zr&6xUTlQh31v+(LbEJhQTL&jMHvxW}VRQ;@7bs2kna)i(LvWeVKfh_ew)V-g=tQg7 z6`MJ5ZjT9`ri&4cMssHyKvsp-`ti9>^M*OKU@>?L|MZR_DmWZ9Kvw;#WJ~Q%^u)j& zR-(Bms2G)17KBxaU^`3G235dKs;MB7iD+))7prfP2W^;{tX$bh7b8p9e zDa(pq(@3w0axP^xe64HB7g7X=$7IJR;TVfg(~pgfjIP(9F-_c!a{Q{P$WxkuJ1?`ry0pD8k~6#+*LD5l?!2#Q8;A+TAmM z1k;$laM8D;b!KUQK7xWL?^U{gwY#vu(0eAAt#`JlF?+UBsXBdg3r=NFLq*%tuQG?6 znJT4I@1TFsdlsleqhoCksRV;}Nq4<(+(<<3T~;|?3-6#Z4&fYsWS3RCB3t{SR#IHb zc6fANWmsbsBU|IhGgqiwCfGhlgYrkE-GMf)G5=}0X7f4*)&P78(qsRm{g`FCVnxI# z@G<_-e@D{$)<#T;j@5v>z2N&APijFpl+VRqiIt1<+VwoMbmd1qgVsR^*jk@@rUJ@U zx$g;#xc;4ztncpNZ2yYSG=p{& zxpa|4jpsnnG(BpR1r#)&>x2_gq6^xIGNG(IjPn>(0JaA#MB$ygY7~g4gm86_Jmt%= z({|diEeod<5@nau=W;%0_#0O$<$zg2b$KjUG4PYS)|30s294C9ray~F6iEdSE!}UE zG`>Ac2X=ut-U<<0EUbu!`0q#O_TGyD-i*MIZQd^4b=UbU=0LBv9I$Ng;-ZgEBohx>Kk^iPH}#aEE2O>~fS-9q^KO02atnQL>1p5awcWb$HS$rBn&h?nLt zV(TYuS#WA2wAyN-u1&9jCu+>tYhAoDwd=Ef5|d^_Wva4A?m;(r?xnqfAL+^CzwKLQ z3}K-&>4GOqyaNoYOT42(R;iD@wL1sL$-(HVt;m-SUS0Rw!&zeNNWrFMiWF~S8u?RE zipYw|OaK`e=QK)Bc`uk2;18Ky5;gS@dwOP^hf3DMk>oZ)Ru^&hmMGYWb4$?*43HOo zaLR@?7Ct_ms{?)7O6@`hd<7i8M`&J2j}&yhqbXr!^?*@(u}9DpdAFU7yRdfB0@~)q zuUn1!u)<9z%d)r&x0PD;C6ugW7HF7KXe_ifJymqy8ipQ#T!g=diO%jfp2&O@X(4j; zUE*yMA>O`p_0SiYG!=-t`va;7nm%Seop)7_X2qlu))am{Qf zp+??ZCIZ;@qfzPJSt^s8HN7lSnKR9ag-4C)IOU@?l6~5KsLqh)XLTcti!% zE07+FKP{)gBH$6^@J0TYsye0eF=uBCiCFvDP*wsJ`Qlm z?hRW34&FxwJO1*nW_kF@kfu@Ia+jD_>0)=X>h2B20IO(198ced4k}SjfHImM(SaV7 z-A+(LWT$cp4XZq$A5nR3z=twwF+1QjNXi*V%JE;f0(SoZVh8MmgV`}Ou`&_t64_p) zT^aiJaelDh6r@Ze9a5i}ZNTaFmjc)59%`Y6zl@E4qmNNYUd70J1++TXy5*JtvIp=X zV`iP}w1|BQ$`mstWsrh@PKAYwo!iFNfP!t4uISgAqgkntE|%w@KTO)3YLqC*-rbr~|2@M@S?H89W% z4S9(`Og{1yV2UuxETTU!gRpP)>QhuhqM&#}KZjwm>|qKyiF8CK5k!_36S6saKUSi{e5SAXq7feWDpMMJZssgkX=6-?{f!_CG5k z)M4ZSORJ01Eq487*NxX{xqiSj(e^%t+I4-AGs&|z16CO%PY(7!XMGts>tO`Pf(b=q`79jhZYojGMja*f$EgC-@M)ghPOf>1B1 z09CrLEv4<5T>;@FvN9SehTRPNCTat_bi`!@CyMDJ#dbnKs`e;pNZSfhQ0Og24*j-%29fAm+VkcA|4ZAnkd`HdWM(D=7_=We8_(jS4FO3bo`B|Zy0MW)_ z`|jAIkfy*M$M)`9?~(!V00_MG7WNr5@CT8h>Ipgg(Vn7 z1cksnP18ypX6id4N!tb>uFV4!H=vvyV?|4rcg&?BlMESoj6>a3B;{KdT>;20_~puL z^V*m1w@_sdLfhc9sX5T}X3|AvR|ox zgN|vY-OxK?G=?vWw;@b6in$UY9WU+#2V`Z})VI;~9@zA29j zzfc7C$h+m!5iESWmwYu#e=MXwmoi>?u9hYN3jDD%5BX|@`RFlQ)tjv2%QfiX8{nlH z;N=f9&$WFsAgScb_@k##pLvo(lh{+Hn**M7bRhSvyK*-ACqEE;l>dX zfpeG!i%uVmZoc|}7aqQM4l*K!Fds5*ZsZkVOcnBrqEGq6F?0M9D1P*mDfxw>oUoUo z2{&-HsB7x5SVcXo$hy&_#0B2LmlU+d65=|H*1{n4K?`nN>Pk&7_Cbj-+^qWXOUrFT zwi>)bOtSZVzbST8ta)GxV_k1^_O{r<*EM$e*`#*9pTo0BUO#9#xcBjxWBu9GWbb7S z-PBymsXxo$@%WgkIdlv6D*v)BYEMnRTkG8~-{o3mef^SUeTqC7#ox0@^~JuLC<6AZjQvYT_X25LesaoE(Z*=^DEX36F^K z!+GWSlc1c-DrR~)nu7evc!X9P#Vi_?Kb>pxr{m9*caM?#S!J)k z74B||*e6#--r6qBn>doHxs4yNPu;%pd}WS)LItRqEso|r-eOzxCU!s|&M(xa<(4*1 z*t2z{)SiFDXt~(UuDv9%G9Qy`N+i9@E9ci(%D>45pA@;rRMteEzW=<}c<3n=GmNo~ z-B?yxLo8KMX!?ZLdeXj9YCa$hFN+(A%&Se^=OWOh?qi-=wLdm%zgOHXk?Sonjcd5r zc&A2>V^NxlScHuX8McBf%wvs%b7)E~E~m%k{Nc1|4PRA_cwj!gt8v_di!11C=wzhm zPe~~Nd7D}CQ8+(`JhSLnTlR?u-jb+s)QmsZlMnAv{Zy@L!{9q?Yi{1GMn}SlnW{gF5LQO4-e$A0?UWZ_5~cUt8Fh9VT%M@%0o){_pW{(+8;4E z+%q1+KM!!nPsic?-w;KWU?C86ylkGDb}3u9C8m|f(Z^77m144QUU0Mbqq^xRp9No* zS>USNXu}?~jMWNzQh()Yib zy=0*O_t{GZrhlBhWcZ(182?3A{(S(Gf${I%3sVD)Se_ZtS^2XQYobPUTF{X)>2=f2gzxq7_4DxMbn^JJ=`_8u!vqWh zAUz9)9dt}m!M*W_AQYWas^+%XlCA9bRy;oy-cl+~$NFP4-2ZWJaAE2tCW{4ro*Z)jPby#zMr>=gr;njEk zNBFgHEa{aSp3DHtxzERolb?ipGSH zC=WSA0Jds)AuEJ!*ZURbTcji&lv%vgvAVODE~;Z+%zg%g9$>egmj^O$aHrTF9b})t05TskYTgXq8?m*vP&=~w7agq&w+H%VYLWkrWvfHFLf0dE( zO3m5;*nn5IM}YOF91h*(>OJzx)-69gIX)_8GU z27x;aneEaG-*N!r^@iTE4Q2(zN@fkpG)U+vibsfJq>GcrV;B=?h%Cozjcyr(yT@@0 z5*9)Kejs#D{|xq$ppCmhUk)%79vA-w3Hro;Xmj8&RuE@Xg32N&s*v^?&lpw%m||1ukWf3w zD5=z!RNxz64SJ@K*rqV@OmkbZH!qMXE-d>OU> z*DI_`KbA9|q5;PzoDUJDGx)qW*WtVZeO#1jQ~t>wRT3OldBBCdtj8EqKjk~R#*DXw zjJ%x38JTfd9TaL9<)-wXQ@3kaM>vuj_rp}qhA`DQj#=p3#F4QRXUwR=)_$Z5&8#Y@Y^KPC2Sz? zIRO`nqBOYXVQ^*Co|;Fz)>S@RriIl?fIsNKVhE0c{=hOO`N8Of5LeXxqJ)O_Vgb}U zly>PwBVi&9uJ=)M$?HQqo4Yu8WC-;tFR*6=4aUu44Npn$U#eI zr_ff)K7L_CMim|nYxn0sgn)@v59EZ1noSK4BO*-bj;amD0dINdgpzHxi>#n8r7+Jx zOIz`>Vee;Qt7EYi&~D}2*Y%x#utL(a#Y5coIx@#x(LJ!Zt2g!hFx4}@DY{KA^hsf3 z-sQ5VohrAntQ{(DWuW$muqU$qxFio3nu1@f%PG0=LL{N*t}FZcLrN@e=?Oww`|!J@ zB;?OQuApUft+yrnZme=KC}u|G0$0{7ue(kv+u{G=?Vf{ViPC*x@3w8*wr%f5wQbwn zZQHhO+q-Ss-fee(Gjk8;n{&>@y>ag!E2?6x%(pVKG9s%Yo_v4zx_nCNv-#`DtCw}^ ziD-$hzkh#B7O#sC+_!x8ti^KVLV{(`_7YIqII^SLGj9aI46*NFF! z3`q%NE-2T*n|xdQ2#YHO_rBTzN#L8ke_Z058pmgn_{3LFW*RjCAH0=$lw`ylpE2_$ ziWU^!#}7Tf@(%{HDrlmet$3>weCQuyl()jv4&r=%#{#s9i!egq#J5Q8iEcnR&2tl} zpjwB`lCwLW&rAMhWuJGoIJ|o(`O$ELwB;ZZKGvSvtGaYlroqZ7toF%U-}9Eqw?F-uvyxMTOnlXL>eVyO6LE1q-jch3^P>ueeHI=h|ebyyEbZ=Q->tNBe zBfO=Kyw#4D7E9Zo1}~jM@;R%VWbQ!$>7DezGvF^|m|O_j)j(P20F8?^S3K!Ghoa(F zc3F*Et6PP;q6Gy|SM%$y@~huDZavZ$pWXTz9?gCuBkh~nJy2k(?eV*uF-FoP0vidn zUYi#Tmo69>@9Oh+&qgh7b*AnUI};(|DJ}ws-89e?fgj`?Oqf}V!0?(8LaSLURQ;MY za#BO|0xPS1W+0CyJ0eSzniu2EA~ShR-!Bq-ofX67Or7nS49 z9ap3X9g%D(klI&Sm`VC6_5@>?#Ea1&i9F+kJ62L!)w;b8<+&8OTVA2E=7i*+4OkQT z^QR>uV(K#>lOt<;a|UHIF9&}85)JKTt4dQIrc}Xh*-5H;vnuCW50{WE=EuoNSnk9X ziL_691w)UQgYnH?tt8rO)c^y6IkNnRip8zFH1;n%UM>T$My3qt@ukVQc*dUBB zIU?&&(7~rD8dxu=t7jUI5a{kWg-(Do<}-scG;C!Hy>UkHmMEwKV!QEX`*!5XVkE}Q zSyce*Chdb!=C$4>p)ZshMf&)ZvDyekJqdxyP>Pg`mY=r~&4DuV4ziXw!OF9}4W$uk z)Nxr*+o8KCA@PjDCGZUf8Gx5|cVCB>OSYbOM2d~qndIHqF$ss_yE)il+4Na>BfZK-lY9{_6(-TDy5kD^IPQ_|rN;J-NhzU}X z70_=CixhbX?a|?vpUXfu#&IX+(QY~o&6V!oMR>x91736t76=C3xS-G2*}%r(px|m= zu2f_2YXob{pfa+p;P5$rk~lX_%kcqO|pP(^RH64{QcB3QwIlZSC?J`lG=~*vKe`61>6jFZYn- z1P!1*6Q6hwme zjBgXmtcs3@{{4j-(GfGc$?}BVl-<-m!f&t6M0|YG@*%Q$KhJ;KN9@~+N@fvW^`ZJWX2;wGzb!sGRgfKo|VML3G7E!8emc)B%{Seu82L1bH-kU zNI4Het{neWD0AK#-F>qZZpFUsDmSq`@IiK%a=hk+zRBw~-E-G75WXFW65{i5t>d@D z(rLaHu`(WCMd!97uVmMDu)P&qBi^nX-sVaqP}<)Tmmgr|Krg#Ncb8-Su`tWJq^fDK zYFW5a(p<(tb+HIxBIMkW<&%s=Dm&O+JV)0EyE{`-Ck zo!0fNT}aKSQ%?-9$*=%aK&!v`t3HSEkigZz!P**^8HpKHmiZn_mv$tTCBJFBHoBR( z9#tIkJo6SY_ZB9_I~*9*V+a_y0V9@vnQS@9Ae@nsXzY?DGj?_a)I6(LgC?weH1?F8 z=0FJt;KKTX`9hb*E;`}T$ajh2@XfJPN?r-(>C~KabW&XbKt_J(Ppq^{-WPa@=sPbxHz-_Jl}qp79TZ{7WQxB7<3TRZdxGsO8>7(MG8Twq^FD9D_DQX7`W zAOwwx!K%`%GWFSAqNJdK@7!lCa?acTHe_+CoR?8uQU+{V-g+5!Om*(LNKl0tiH0|Q zptKl$)phlGy?kr>oi*`Le7jEKj4z+HRACy<_@#=dwHCFiqIu~J%Fxo>^?DXG5EKPB zK`?e2f3o(}M%y>$bYx2B)-#T2BH}2lgwPQtHmzflUVfZ`+&%aOWemAJJbrWa6=S)p z>kkv~bN7oMZLjy}4p-}~ByFZVnHG92x0L2(t8e$=5EhQ1wR$S(8?$?|s*Dr&r2#d0>>93?`70Lz2lam%WRL6i}5Q`W- ziehMLw(TQnD*H}2aJw9?nS)1gSlcF0+XT40ePl&Xx3VGaA}%t89IeTPNpQu9I#1q+ z6&zJWd53n?XL63YO|fhC=M7ummdqdPag5fH;ol}~t-l5P1YwIk zY?pS~ldv7l3g?w*6z#y4l%prcPt0lfmAwKldabOrdji}Q4ak<3HM(C^XB75+yy5am zH7^A=&A~<5kI$@HD=JJtB^TdY&t9SH*k;R3Ow{h~+#yd3qlh|kZq?{Drv=0F%Qrf{ z#qMxaP|oyoyO5H=KuzC1gj2?liS^jk7zKO|ez) z8-G6KJaZ_MYE zPKE@g_**14o;sl^NlhhyV0ileG8o_60LL$-)O*aF?nrIIoZj8-bCzaO%-#bLDUyAU zk^p<9RywytzRM!mO^hwZ=vXE1;1cOZ44Ozv3c{YmQvvT30 z7Fze!qOUm;drq{RTaG4O%xI{}*h66+lF3k7*o5pYJXy9O1tRqVzqT-lgsq>XU;S}Z zLg3hII_q_<|K#ffF# z6YwHFD`;Jle?0T!)7J@eZWn^EY)RjQ;xqmDSl-0m{1Y!HCTqF_vT;Npq=p*{1FLeo znf7j2@aabH3$x*jiI6)2x-0C=Z+A1Y6k>ewaaG(#B|~Bf?7YU>_>Lo_;;nZCx@H0ugn7Dz5IR|Bm z9EpOc8B~|`cpMosi84GS0NmF$UNFc8a13?4W;#9j)CfFY`gKmdlxZLMxWOwF;-zvF zEkrurrrSL?hWq2uY18b;guUw$_z~u}B#wVDb1F^mn>2XM(_hQ}y zJXtyie3^q?dg`I(8cK6ZOHu@UmkXYN@@viUszAWP9M`o1P5N9Hh;l zG_eRqfk5v|$bK4!-fx@m`LXaiN|wc;g(LEv z75bh06T$2{^$@&;h9R~Pz~S5BP4MX5r|Fi}&yOrp&Yr+hXaM&G}1XU0%XUUaMTa`u3c;H9`|Pai?+R9xTaG zsP}k@kFC-tT^Pa=+=NX_0rjET)SN01VhlbGV^t<)=?1L7GAb0KAI$}qKK=kcFh%EI zRHn+g)41g+Lq(uYkmT0U>!#!h&;02_r!}E<08ptehWDiJ8X9H(7@S&hw#* zigBhx$c_E)JVpN^K~PPOR;I*KW{eO+-Tn6xz1RSH@}1RV+v| zr30HTl^c#iC#OwSfRIqpOB)j56pK!>v`?8nunMwOmf^>^WeiZG6FDWPmvscFn;uWi z%)y;nDLED_;E~G?^VH-;Lu?)wB^wXv+cKd~)I&CO!iPAipaGJ10WlqrrI=`HVvnxr{4tsMr9u@hH@^j4e4IJs_|QzNGc zaCpBf0;W!UmPru;59a+DV1D%tIQECzlDyc|5#c$0Xp7&LQw0TaDf^R$*jX$}=PVb^ zCRB16oWg{ai)_<4$}490dqK|8sf>)wnm&lswA8`cy(ozPSVV2f$7Lm}i&GtTa6$SiwYlXmXu`OaO8 zv%wJ;jtRTOOC)^`*%oStWUgCFp;c6*z|s*-*iIQX9r=sh77L$Ws$^gnfBj^S>_W?= zgZ+)J(^+xJ?p_6~;UQZroU#|4ua@~?=Mv~woYHyNbKWDUAgrF)-vVb;sb^$!h+>Sg zr8WGs5-EC=%ru|&{Bn>CZ&BvU0-A~|kL^0+qt8m_`MOeIt)XS`SV!@BtUNQ*a(R*f z-wH{$t+oBSu=Qzl`i9`Ub31YK6z2^tQ__@Rr_1VL+AS_t6LBUIX{PMgZf4wVQ26F) zH_KxTEPY}yLYOoJ41u+}lnb0c^aN-c)QW%F@S?YY6cvp~;nrEPVF`^>N3fHZ$`Y)+ zGIq0iHPF)K5IKwhorh`saIR&}l3_iis+BrGbBeMqOcnsBT!cEeMhllb4pA8nxh*@N zVX3UpdcD7<-s>%K*!P^x#-=)EDSZ;ctjZ!7k=^B;C&oxxw@WVE}A>FxQ1hPu*ecz70w z-WBKX@Pbj~*mAs?4ewMVv*tSIv?bqPhQ<)#px(s$P47`U5NVp~(fdLD&GAJcKUwVY zL8v4y5$|#+Ppnau#G*8$9l(-YM~j_UWg&;@F@zgLYe~gjY<`Tj6tVUQK4LC68*%&v zd|nmww4bNDWb=iyRfJ5R>4Rryt~d9`4TKOa`>TkmwQWu_QwIt~_jGw;da~%zR?@So zUvKR-VQqP7fJ{YiUta|=6*XIHK2Tf5-V268fVjn!*GQml)ux&6(6=OdYlzlO_l|pRI0v)AGa1*? zOkPF3BTws6<4oJm57kC48m95S4>?JyzweI}UI(*Iavs9WxSsM15#*+x z5m-G*vU6&sz8WA@{V1jj|(45$8KM$?IFEok~BF##8(6`9X- zJ?XNEqkabr9IqKRLl-dw?8u|koA^~WZ_ZO1|ubT>oIaX?QGP6d+ z9V_gNwd8g2E!HFhA*&-c-4a?lJ+!=fICo3f{1`Ugv`yl9(El zt?Ac)HYv8u+(W#ilio3Z^H~+Kg#b#H@aun}mZP=IvGWgK2(1hrxpd4ftOgyrdZb?v zjmfuT>L8>;2EaC~6pz_5%|t{@Uob(Id(hX?mR;9Ha-pdzwEdP*xdFYgzF}s#iJphk zv7p?WB#`2GjR130eNky6v=<%?6{LR9eC0=M2;V+pKe1`h@clf zD=kK-fq*5wT_%|EuU%;8+#_AVUf>QiR?(Ojw?!A%0-WNLgUL>kV&u zKnvQ7E}~9Eamp7b+y)=Tz2qduCsv02kf$dQoc$>)j(pfj{ITMt^3|kWPB5XG)73s7 z8w6q4(Z^}7@1ZJmwi`1Yj*s)Y8@!$FgrBB`ruC=k{BcHm==ti?a0cJ@ZRUWO2ALg7 zF5ztQEF}7Qszue8!OP^+j-wZcZ^E}cYNB4s5Jx-@HEH78bVvys8wY{pP+7olQHz2= zuvWI?JeTK;7|M=YG3A*dYp1@PQD>wj_i65w zBi_IzYiXR2bD!B8GQx_qrWax>FH#`u>RhgyKf3X-lPTejMayC3lZMG)ZS~ZqG?%wm z*!1lSvUddLrl+y$EYhT(iQuO%+R^TbWdUjI2Kx@TJ~~ub;T92za$W^AY&O3hNqvBc za{4?JPPM#=jr$DVK^+1_XAo#8^!7HMPG8CSa;r}Op1MUR%ZH~sYv-Q6N;3!-9`QM9 zXRn}qdL<{^yl4Fvgqq;ETs#m z;*`Yo+Xt9UBpY}_qU@yi3VR`$y+4ruisfG@|J24Ld(2)}&{QGMUXRsGN{ADAPj!`l zFMY~->Sh=B;`_#`#>vM&Uo6l}k|^tbReX~jtFT!jKRBMYuxh?&F6Q?+^%OuSDrCo? zm>SE?5B5=P`R$(D^IH;5&q=njzyJJ$l4!Ik&b3rksZ0T{uLOVL&5EYUH={>e$gsU9 zy!)trKW!NTV`5&de6A!Ntx>7xK*VBH$YRvjVpQB>l+j`o(Ly4<$tbU>P<>sI^a@g% z$FT?xD?z!XP_=c8e2s8|GM3lUJuZ7v5r!GdDT10tH0P*GSB+`{g*c3Z87m3h5ZDq2hNQ8YjB5 zmUH2FrK7HA1N~)z z9_ZvwNH7$p&0DSCBw>fS&0Cc)>s@(lagTW`R~Kl-f%vEL780bk=L!_wvFN@|yfmKZ z0^(5Z86hQg27CchMd0EWv{D-AnHyG7ZV$4AZ}1#4qv;MACW{u;OYhrXeuu&?H!_T^#B{y5g9_l#$tjD=2!eK{1&CpASQN|O2d3W z>@_o5hr%Bd!dnm8IzIflS2ti_4cVRwr?I+&oG6kLE%ISOG1h+=7qP{zeGuVOquGot zuv>0X-t(c8{!t~LQkh4eAW%%N#AYGhCX!%DoL_Pdeo51_XvVs%Pnd9e8JeA3m3Tl8 zqI<2JL`rCQuo?u+EJSkD796rGy$Mb4Oa`u2ExH!;4a~bLeD{wS*}pce=VE4N`uAD( zf0mK`vr)iY?Eg6mn2DMBU$TIiSP1{>m;MtalUGuZQPupHN67yd9Q%7hM)%j+|9u`X z6XRdq*gwt#{uf*IpAi`c;s0(P@ITo8pUMON?>^_R5BdKe|LgqUw*Sjl_}B55^}oITwVA=c?ej0=uT2R4w$8x`{V%oty*}fAgnAtRST6n# zQ18FEQ2u{FkNxj}9>@RGZs4C5dYu1A=yCm>&|_j^|0ntlRC{`Ot1PX3J56^x-CR1E zF{hJlWRH`IjLAxl;X@h=qx%aI3hsl#l3vEsK}71U7WMr~lw9}jhKoRGAd zOUppLL@f0uIvhv?UlH$kKjvZbD)iRtt(S(I+%kcJ?pJFxS{x7N!T5XN^y0wu zdyQTbT88~T`x1Waa)sSTrW%EA4;^UF+|*~+doOidb1fO-tJXvHCtIO6%gv%o)Zq<1 zr2%ZV@K}qM4ZR>*bSgJg={#<&4^vn9qplS3td?s?)Hpd>W(+!e3az9@b%^p&2^WIB z)}#KH(*xz4-UgDp&AIVIo$;xVGPd$hfC3%-Me0$`615e4{BPaMF>R0=i2aj`~0#U5}oYNm*YjW_-TCnYq#;~oN zQ`>}JJg&lM&i#mPA@6bz3`Hqb;;4!F*rxps*9?D%_Rc_)MVi?&0y)ih&FoX;2YoVc zMadY!&iBwa7g*X>IQHB~WdLZOpqq%l*4pmG-4WsYX2xwhf@(@3+F2?_PK^|`!FGzk z85V_kl&XU_cA0ob$qLAz4%zOgPId`mwZlJHev{guq6(8O_IdJ7;rxO32F)GdD2k^o z=I0K**adtvl+k&@K4(F{GNR?4%|ce&Ls*Lq<^1CJ{I!ARL2`$Xga)6ByXgWIHF!TG zRy93f7oN^3MUEv#p14+&eMzyS7@so7b0+kLAU|xfr#y+b3*IhZpKI@TL~+0MVHQB2 zfmR(!AL}adET$m#9hUYx4s791c59!v`JnO^xZA*19Z35lC%-};zdLp@JFJL3vM*R} zAHg2%R+AxK6r?GCLfZc1n_#{_lr=BBxWS106nk!eyk1aWNvrjw@bHiu$KR@_B7Csce_`YPma;dY=g_d-eVpVc0_|XL8f}jRu4ch<2 zA)@mmbJYuJQ`;i7M!1EKF6BLy>HYHU!t-&Tzd-A!`-A!s(FIMAD3X=TuV6ZFHa0jk z#-$JTY;-3Bz}r-qun3baWxuvF23h+NzS($4tsQ)jR7!wM@D00$z;Gb9E~YkXyDe&a zoO={H&i&<+Q;4yP_!;T=S^dG%whpeMP&p=AMHdM8L)tvR^FZjBkD?n&0S0#^)^h{S zkPRzl41ECC4XU?)#h3`)hITW~$d#ulkxQJ}#!!ZzF~;~A6s1-jSR4TAmH?zV(=9^3 zJLQFSR2)NFYGO(3sHM`O6IEvKd8b1{l z48W>Ubpp@;*Ob2mkFo@ZhoFuQMw63MP|?s2W2YwY5)YnDVyCf>rY8Rsb?P{3T1q=6 zEEu$sX`;}YjvKR{x@bmgqNXc zA6f#&v^kW(;~dYv^I(T4K}eEB9g{^oVs-!r4#Cr^UfKrCtwdpu5EXn=HM3&H{5s|L zy2S>4Asf*w+H5gLOEriVE=xg{9JDv(7S$uqk7rGQoC>maT!9A*7xg6rI^$>O2c&n= z0+q6EQ*8pUW*|2-={uE`psXCrmSDtGjfECY)WQ}XH3$9D${D{7Gd1;q;A;NA{2$+M(F!1{sZOspc-re&B6=@@iMh#q zag+hrzdsg^Yb!(-ZVhMf@onhjf5P=&NNmyC*^apFYG-I{tSd*#+!#`FJ39Q$=GBYP z-7ePUENkfyMVlpU@8_Skc9agDwSb@q9xE`hl7$Q2-Iqt~^;PXmS zO{63V&lD(;4(hS=Yvd1)g*?TTR5VLqkG`#a#8E5XwR!e{8+V@Ut8qLv4SNO2o>}Pw z$Z<)4Lk?EXiEWvVUOCEJoc?h_qv2opv+w`hdH_ zX(_$gvmfkAU7kwcSSai^s6u~~S5T-P1#B#=FQCWRYMnYr<>U~(vHEnB7M46>OAO8> z@+68hcV^roPK&sR@GZ z_(uv%b-iMcz-f1%tDRC|K*%a!>ai**0!Q}bRP-VZ9$o-het-`go)fxcsM4q3?6p31>wDM=GhRO{CD>c`!H? z?+{<^7ls?lJ6;fWx-AJpr?OlPm$uPtTAt2Wz+6(^h;N7Mmt;k_Z%setm(6y z>BfuK#6zSt$>6O`6Jq3=w3yHXYGASC{@9>`ZTH1-DuKF0(4!TgHv%_?_oG$vVhxYL zmPmjkkRY+VNG{woZKe*pnh|39pa{IFDP*?*a=gwljkUQ|)ZIwaNI;VLIlsicUl#E%gO*un;#6kZrM4Q|>+ zG=89D1iS%eU_jm3!bMNMoL+UpZdIBPea$@W@@j@FT=bWO~k)G zgzwU&<}rQlCraqF|KKLxHiy;2G0BJM0NG%z*y^Nwg!S>H5pqZ$4=`WJvviZS>vV`T zDtf9^BUiCsn9HF-&F5({nqZn;NQ&cw|LVR}{$UsIQlKn8!*)vS5tJ|?o+#wb`ap@9z8>M>lODL}&HF!MN%ElICIrlbEuX32( zc=!P-T~qG7Fgz!~h3!8Fp~U%@#+xq&Lk`5}Oq)t#(D}kSu-Rf4J>vSYI4xA(fJ!Xp?@ zy%)mgiuK&I=ATIMG3iJtfXs+Ym8p#-Phk}Mez}pWx-(}g$lqmp(Y-5XYPhFXVO&w- zl&$(AO15+?>MB%Bpw@Ll_mie`%jOa)p|EtJ7y<7`N=d@vi}9vqYQDe$wKA>q{n%P=~d_GhKz&TjP#*4C*wFA&ywNn=)EHPL~6eT4ti_;JTq8wp^xV| zjm4l{$j7@*Z0S{VyWJo;F7(uHSLc%P5O^A*tR)rf)SC(H15n$s3Xj9XRDq=MfbC>` zfAY|n@QYLdBOQ!tjw)>{mRLN{-`dhBnY`Uan3s^T)C2!E!Cxxfv0bsu)(D{uT{xRt zSL9if0{;~x6Lc2n4=hq+jfSV;N+iQ>4#u@~Xm6f1od% zC;#J7GtCr#ArB)!{IFXP+U3d>e4s`{VHO-e(1=36DlKztL1C=aFccdB~HGhar4XXurgXKQXI9S(LH`0d#YtX?Jmspgqa$pZCWJL6` za0oOW44no9v)Z~qUK;YtIIhpOj$;q+50k3Y(NJr-Zbwv<`Pp4^;wJh|$yvexhBaYf zQvCEwm~*rNyf?!^@<8oXMVi6D{NA7vYf9>9leG*+lQVi8usqZA)mQeD(D+f6>6+7 zmbWHSjy#``cdTcwXSPwRv_WRN)+YN9)6C-ggn*3TlQkH;mjRm(uADod?D9Ch+GWJ>SP%?|sg*Mk zQbuFULy(1070Lxxv~6g9MkZwoxJ3`6?h$E@C(TC2Mt4Jza*ujuG7i=CgCcAi5;?r$ zrnl^C=$*&jW4{B%D5xV^HBO{n)`E&I?Igpf(+3yi2OcS5APGzFQSbQkSO|e*h8(_k z9pIbK>sHy2NTdxFunoz)dVrW|SxfnJIVW2@puNJUqOd}_qD;C77b8_U1V1z(eAZ#} z+zQytU-=LItc^YV8rp1rY-5(hYTtI#F19sna}B0BqP;rxF1C4}pt9yj60$XsdS9QR z4#;(adN^S}Tih@Iq6cD0M2XB~3hK4IQAZL-lG#s$L+>MpMbx5>pPEuk(58nN6^T2` z)cl@kzv|!~9of^7(|%f!fBh2IYMc2^I7#~Ed*8^JDgRUUsW^kQ5&uy5m3k>0T`#p| z-nG`S*tW!AF4@7orCvnOxLg4yu<-^Ps4^BkUBb$fX&|Mow8kB9i!CK5b3aC38R^m% zM%yWi9!b$}+1vn6BPCg9`a3{*`2ww*(0IZEYV3z!S{DJMx*WF5EVWQTk|4@}u~;8r zskDWV%4!3ta{A+#VDTkke9sD`9KUh2OhUC1Fv`VhbSxQb6rH*(!3eEtch3`eJU!#? zABm44&O^)kkk=es1`2`1VIWlOsRmEl_$>)-}>4jzu#>EosJPt=*g^FCNsm<*3L^yDOBr097**14f(rELMnMe2O?x$V8vv2t0#4xrbD z-I1N=2rOp(3c40pNh5TivMnQ}u26>9!DcF0id4TO2~xwev;S90e7TlfTGr_b1k)xj zlHjmhkJ>uJ+|((KqGQ7j{*dIYG2tHfHfN98LKN0y^k4xBjF=V6Nz0_QQr5}A)My$MHg(%MO;lHyrPA>pNO&IE<6!<-o5FuOvgr}Y>O~HRn$Nb$ zRy_Wk7E^s;HGXBAE2puf5GD`73!|l01+^QXoQ2JFybO`(<$m3T#>>QR-cCpKZ?heA zpf8jD_EP1zKBp!2k{a&}W$5)HzB}I2(%ZTJ6YHd9*K0A?we15J+Z%ck>5FA?LUHgq zxf@~!a>nL}BCx~C;SemvMqe*kvsao~LR!K6%0#Yb2&HGMB(-;XBnX1fA51iRc}k9h z_nauPi_^O6?EYA6%&b99=LTuXQJ+SYYFTRPq#Z1sz{F;H0M==}nBLe|=0GMiA3&Oc zT5>H2&gf*zUdXkRZ>|>ZBbQm?|3F)!M5OaRJ#?{2hwN0U`L(6OQoIpxG~Cv$dS?K; zauC5lPeDl@;TD`P1S26H6x={*fr{Z)R`aSHUbKtVZgNvakgd`Et-nzIbj{z`Sb2TB z;MTHit^3kh@>9$zI|}u3>NZzD?z|9lIrBi@$FjQ0c$H zw&|16ea?ri%eV>~x@dRnx8HjN$}qJrBgK?0%bxHaZqBMGFCkZA6@v^O+QI2vl19XA zfQZQ`9h_%S0tvu5tdB$b+*UmmOmxP&0bGVS%#u>Mo@Em$!IPAnNk{HqI_EoJ0}BQk zx{OXm&&8k*>qn-i<8~@Nl@8O%I&A{(J|%9-_A>w>R+NQ^dYw_Oicq+JkgsRbABU>; zv6P);FtVsJC%gnYd#+6)>()`KGSm6M zO^;@Smcm?9|vDm1dO7 zLU??d_ySRM(@S77#81F9ffTulQe8hI9D zGS}sCpJa#OmoM-WFNAazX)MQ5({f#Z-S#d1b}q<_H9u*AN{=*8kqDPlPJixo%Cl)E zYub4&DkV=((~L`sI8HDTqDm;5UpDa_?!uX2!5DSfc$QGI16BaKvS_V(kJX^Vi?H4K zmyf5-txmT++O56^tt$b2t)TYrqSo{W8ykuZdWZM3xdxrItuguks1HT1z z=d(MN-BP<&W^Sy>Aev#5CA)=$d>m6m4Rx*VuSh4V;P(UR(0DZFalOLy7$# z<(rl7wckDVOW_p@m(8!|c23+Sy(QmypR4lli|HJ!5jo6P&Q^Fp1;&$qPbyD( z7cBT6&mA|d&tlt(xo%`l@>VRWy5MI>uql===DDu3T1IioF)wl9X#$i|rpi^Np7Nrx z_!CLg_ec|*LY(}aq7&T=Sy|$uII`9zQM+jr#HP!qE9ooSv;n~p6|+JK6Eu- z=WE5$K7)WBNosUt0I^dfLqW7ChnS+nq-aB40vEM(kztadq6y5qbIDLV*(u5B!JAfB%~yu?mD0&pZJIR%A0f>hw=ICrh}j_VKJ#dvAB zG|eIEi0`$w%_&8Q(#>aNmNvA@*&tzmA204-CzzeFfy!5{I zgiLJgaz-W#@UWz0CzsYI=WeqmXw9O6Bv80LV^^sO`5%-|Lf@wsQD1ruz@4Yf@w&doZpT!Pr)>F6~Mt z&jr)E?1>w;7`wK9oT92dm?fK9j-YJr{NC{J)60W*X~=V&V$;|oxC62I1Ut* z>wT%hS4#DMC~(P25ej{Y_Yi)I_)2|g=1})$e|GT(sl+}`7;sIJEPY)v`ta)~xczRl zcfvTd^(gLIFNUplHbR;mkF=lPyli)zMKi5j>`VgK4*WW+KX8PDS2YWT;-ZH*d_M}n zHL>K+^wh?uaT_->HsSKKZl9~~HmTolRX!YSWA@DIej25(>jIz^l71xZGv+Wp`IZ{ZderB%94ut zSzb#|D{dAn?d?M3aNMO&K!m_bQbnb+Kb z^?q0Lc;?J@nm58ds&B@1aoC155YHb?E+1x&o4ZHBVyqOPW&Tt>T)iv2LegeSw=MT# zXM%z<`;V;5zlKq8GIDVJ+blEV|7|P7#`+(q%-_dwNQy~m{9mUsoPSScn3?`*D)UzY z@{ck#{=2 z|HXyz_cVr?@jufTW~Tq1#xQaGvowa8`5(|2W|sdme3nEweGqYmS)vec~Wb>n18 z9xD~{N0P8FeSBO{pPU>N4U#0Clx2?zk_dF{r($Eib-XS zR>wsK-3^inn1R#PUCK+s%)28$NG_<~ts^9O?1cA^52!!E6KZbS7ik0H$R-FtH|k64 zxTQa^O+>_7mTs*!tW(=u0~kPWdYF4Ujy7b(=|KsA1$wHRy9a3t$aXjSVl6s5imyJ$ zwS3{f`1|z7FvlOq(AIvWiAXQm%8dZ|!2NW|~eGH^ttjzYA0N((x=16oH1r@ks& zQ3vgoIpcneZt`h@F2pxzubSaC^_5hhiPB_TKsZws&C28V^)FLxB{4HPMa~d$F!vL* zYv{KQfXpzOqQ3W)beqT69L+^>9oj2QUzBv49UL3ED2uPv0PhUr8*(k|p5zDY2wEeZ z7hNdoArN`-SRml(qpX7FOgP0?Yhz2m5Ajt5Z>r5?5w#rxxK=5O=ufm zGYiC_Nnp#Bcr>MHTEOXu2n^QXm+Z`*Tx#WjPmug>Jbyfgx~D&Mg#{2jwb$juwsRP! zA}5J@;Z@=eZK@9&vxhF#n^>cChLWviUdq`X;QOL|t7Gnq-L^Q^S7aQeSztzo=w+kN zIbQa`jXml7f6To@j4w{~_Sv>=+q`Ytwr$(pw{6?DZCkf(+s3y!zjra2MFe2>Yt*T` z(>heLu5@&55#04R{hF~F|4ekL*hbjU0WO5ILO!&jth+!SS_}2$Y%atv%XpL+Jr>+I zW8Dag&Mw$LP`}}M1ZRRXGzLDcRd*oVDL21u5q-k=rt>WBnjB1zz%9kTjP(brz2FVT zI120zBmh@mq|C}}(F~0QcGc^QyQ-2(Xe#s~*@gD19-I0tm>U-B*?9dtfXT{-@}lzH zi}D}j@4c)3^54uK#M#hOw}?HNQCDD+UT~$|c%1E^S1cMQ0lx63t9bPq1Ex7uRbPT7 zC3yd9ZSd?l^CG>e(?WVdoe_-UQ7u%RxYg0sX2PcI_4sxCYfANQM4PQa|H0Sd?nA_!Dwp7zIKNEAg3n(3766w;~bDcq^{sMWcTde)m>8qn}8L2?jFus|7f?nVwZZ9E#%cY1f{x@aYuvW$UiR_Z9v$~58jQ^ z+tfb=3}%!e*}bD(qcBdPfQX8N0L)rjVu2Bukg~MsQdgc#TaJMAfKdU}uqN*xO!bnl zjPI!SC~Ny<`DKli!YR2+3DK{3)w#7s{-2r-scqArtf`gS>x{0{ep&kyPD0snM~%Iq zhvS01Cv;y@b}G!Oy+xSgZ_LZqi8nTXT3kkbwYEh_;WL9K)N6tq9L7d1Y2yAI1*2}K z!#v~S3siUX*2a9r1is0ik))AzhQ{RC)68}HV4e*!ykACWL?5*h71gncvHQZBwETV8 z5tX*$Ly|E^>93$Vi@&Kw?(zoTuH?6Y^uBa+Ell#s8k*QA3%#6o{g(mKdFz+Bm*UGC z!$S&gs?vLBjE7uanDSYOjtaZ7X0Ax=p0uftpO&?qdGv#w0n~E}@=|R{(wY$R)4C(8 zp=YB^`hm?2$oju=Pru+fAIPuNdc)ft%^ww#iCJ5zO!8$|b9=FtGUuQB1SQ?JpUWDS z4AbPw+uu4$Ck{&|o~J#Kzohqg-^}uD;phTI?nkD5Fr)<6`9eZ1*%xACR`|wwVV^zf znL){K1TN(29U$`+8=e&W3bZpml{h{c7Q3eQCE`y;Pb}KvPqTWQ0c#o1T^aUD#lD4? zDhwmopS+*&c@n>ae-5|vgd7fdADehTux`>L0L_Y7=?V1?8n2BdU}p&!x$oIF5`j2_b2hW! zVr5-i!gJ5Af|{EkT(vQ_H<6uD96M(3qmjx%LQmYkyFd^q|~0^nyR%LtZSlKSHezs9f2zeaSud;l#Xjyk?xHRvbB{s!AL!Of99p8eU~TK5UeyI1Z6yv(_;UC@z%M`q+XafW>xSzt4P0tJH>8ZHcg3>x zN*nC5E4OFiUl8?i7Po0B_{8Xd2$BIwLCHuxn+dWKJB;^caUY>9uJUQ4; zD5*36K|sF052JB-DcJqW*+noVXFry*ScgrxFW;fBdVMPnuv|{lZ*cx__VjEU4*x*9 zO$YL`7{t%$Z0{p@j4OA>F6WQKpHt>9lzQ6=28G~8VPRY@EsZhpg^R&CZC+OoR0IZuVFXZ6g&#p?RqWrVeX75Y?c*E3$tf%JW3?M2twoDo-Uk&$)0_&-A-gA2n|po-@7|_cI)4?BydpjPqP_^P=J@X&($NV;g+mM%u?k4m=-Mx+fNF<&5^j95jUIItJxw;N^@!wHa~A zuzS|;G-?I|9OXpzTE``)jR(C!mzTnYNzmNghf%X}nx#>mXY9aej}d0xxLT!NG0c?Q3RmHQ5%`qYcGB3kXn{oFeKa(O z7mPUSEqBQ;gb&P-rwAEfs&jFtcCi2iZjfh-gri{@UO4?lJL;eE0_9&pX@7xtqk^~6^WKEB;9Zk%wSvg} zl6Ur^C7iXyqAf8W0q|4Cx1@&ZD@O_OV&9uS8h z(cR5NcM9%+Utn?Cm&8Ce@D@2`oe;q|an;tylxSiYiOwnyxu*I9SsxHqncgOkuj)ow zv#xd*o#?+BwAr*a`n0xE4tf=79dC&koPvg~A{H68B}AZ{Fd$422CxvIC`);?G)u@) zJnfqT!?e}WZqf9`QkqiYG#AMfC3<_CSZ7gYa6=|}8@L9k#+J607ptMvQ+ZlB*s_(f z%G&pgZL$ywY0=OOTAa`mWIr^9#KuA7Nu!CSStd7JBGX$!*rOIzHW zvy_ide5EXbV8Ym>lWb1dIvSufMP!1_LH%D#T>>B_dJf_aY7IP;gb!I@9jI_6t@432 zV1A*X`KR1Xh$}50ZfyKD)?|#c%@1#jHx3*WJ=JUwq#!3JN4$4oOLMtH#A-#Sw^po{ zC#Ca4_inqWlP3kHcSuJ`wNZq6L8gaXjGPBeZmmZ@9mk@5?ly~_ z!syBywQrFn8pD%(CmoBw$X40?M70ld+6rtJf)fI%1UMat2B;P&^bUOW{V0JS;o^u5 z^BPtlt}C}}%#13VGa8^QUT<|=4!Z`w8x zzy0J{*>$^)GyMBARuHItquUJq*iCx|4Nz?0pFnAe5fW~QftdlE0{8~Zf{0Pe=n;}1 z&P{?oiTB_+Xc2atKXCJLIYI~;rO_5e5IMH#p?A&qb{KUHjz&y2X;0Z&bLAFX4tXbd z(Flw~8pX+WjSZ9;N*BIGi(KuCTy=|)8_ts=^8Cv~e1v%&D$!Ai zA=`oB&hNpPHQrFam#1l{AT8XB(6UwV+*|vhy)V(_^qXx$)oFdp8~VWb`>pVYwNb|h z5Gbo5%yX!~a_4{Z_L02V94ghuRQLi&Mxa6fBi>N z`gqu&!X&e#D9<$d^#36s7(Z91f~CMe#!Sq0gZO?$@JaS7^vm|FE>k7ryQs1m%ckf5gM3%(VaMYh*dmMkgJ-z*R6XRTJXeP(HlLvc>=29% zPL^oit4cIm5%{8Q-b~M$VkN}6tfI(d=$bK`B2JY*oVL&u)CqF{;<6$Q!pffoQ`-px zu(S&E#>$}k+@55KG}B2ovq)m!khEGpdKntIOQqmT?qNEAkZ)S$tNlWntl|dvNHu?vl9q+*05O{!Wu179eNeP_TTE_M z25^pzWM!qx;5abvuIdPnq3|8wMsfs%cWG4}c~^vI4Zpzi%?_q1k`Tm%zj#t@ep+g{ z9rGHr=RTAnmp1zao@K1!_RWiEP14 z3aOH}7Bai4aR1hc1d#&o;+(_S!q~!I!&l_yDn+;;pyN^R$AZ^_>w#y(w4qM!w7-p z|F&}3S((`WpHsH~zfl|h4+9%mSpHuF1or$}1Dp+qY2cSo%`+G+l6A;teXpTCo zT2e#_rR0lqwfLT7W&3@+Q>5&P1Db8>x_uw2YGurk7e7!_9JD&$Pt`6fLB?!s#5O!` z4pTM0R{XZyQy9%o)Yf(y#JN=5fKD6=dQ4VcG-|p4X~n4_G3}_zKU9}gMps6(B&t$B zCj!!7X%Q$G1*(T1bZs@%!7g^6FkpB%TYb(NhbzYiNXCE>cV{?c*8?b#`?@=0~-a2C@l8cwXf+QE~Oe^9!|`B-Z0z zv(M8_=|3FGR*w0d33CN863G`)E4C!L0ecpn)9#CM0YPpaq&*~ag1;6Gn#-WxbCW+$>tKAcSn)Et?C(gct64vYuA|4?l9=aloOz7PvAA_Tcu3}5&oKdCe^BDlyR0> zs&q7-LXJwDtGD#T;2#Kf+-7c{zZ2xMw)Jt`AB)^o_17cmXbW*(lDDcimcg28?h9IE8(~ot z#cVrSBB?61i6zNiPJJBABevhn_p+^$2OXe3;eX6fu)Bm@5xxuW3#tyI=j%1b09Y+5 zy3}=Qy0UO&l4EB@{PDBOg=!Jjq+W%}eoSc3T(tD!rQ_BWR4UP;mFQ&E`_Pkqpm*@= zS#aVysQPTnoB6HmrB*~J=vP-b+Lo)AWyav}AHRj-%iJ|dYvy{ktzP8S#g6I26yCLM zVt=Y3#hgk>g*9yO-Md9})^VJ2^o)%a6r*WF*8sjET>L7LJq7%hysUhrr|LOsziV?+ z9T~F&_Bxi$KJz_`w~p&FjD^pMLvF_6-uO)e`K%FU9~?Q5eA>oc8d9kc(U3TV8iVqu=q|bMi#&7!)bE_x=$+b57wE4Iej* zP9GX?qqSEOp0To6K~t=FI~UL{v2#~TodYldh{hxq_gl z<*8Lu##*3M<&x@NEJUi7f+`W}IWq`zk|eoI6F%yc1?7N~odp+zbVOYYOr)&DABi@) ztZha5Evt9&9lJ{<6)I4Djb0?pCzb|o4V%$o2BXEkUCjYwTsl>;l0seZ>i#cPxi*2s z`yYf`5>@3cvBR`?Ym_98Qrf3Cz(;}QFdHQC50TQ9MGK^zKF5}=dE>151@l5G!WB&N zinX?p>yz6J9za)i(Mwchrjw z|4fl9e-I1d%U0KDDZ5IEQDV|~;Mb_>J!nr&3MJIer}{?+EjX_}uFHh@E4p*kBSZE; zQyA4UBKF^@E_I(lRKf{! zAih3Asb^YVSdg4|D)AtyeMB(-it&(HRVyl{(p6KKrhW-I?KA8H0*gW}Mhzki;y7Mf z7w1Qt0bH`Ik@d4>=GI@v0%#m#xeUfFlT)d_+!*Dl=XDc2cP-}`x7Cb9^Ub95uX6Wd zMdB3u;Zt*(zW)y(omJn8a%YkEg5~-~w@%uwEgQUjqlCH~>4?VK$KWN8Qpz0lfcG0_ z=^{;_#pso!b60Vi zo~lpxie<&8A$>9F=P(6qQ}y$(L}s3fqFOkx3{r>@cby41{(oQ@3Y<)Or( zye%1Of|8|lcA!o#jvW*z&*#Go3)Gd2w{+=&TDd!@G0RX_=X8cA2$rs)c7M^P%@30l z&oOL?70kAW8gQrw%0Ad_k%CGlzdLQi9V3ZGMo3SNBi`OlzN!0lmfyx|tdu~Ha$pED z_BN}gtT#mE*bl7L)YQapukHjkR_58QVN~WZ+96W{c7gdF#ydz%1$k;(-4BKS9o7GB zj{vI5eMkB#^|wkDCcwfdX1tFgw8zR6v{k!5X%f&ogyE=5+%n$)CNf>^2y(wl^RV?FY>p+ibKL6D)PFAu?|p#)+bcrZ}ejB0_fsdwUu-Z%|QdOG%Bwl6Agz~`{UaAnL% zkB`c4 zkCqB~pTPmMk)GXg-uAVo9L)uy7rnEVor*|vR0u>bAtj_#lz&=LC9uZ^@_7F7PfS(& zL43*VdDFxR4NYY!jsZoMn;9LMv_SNt#KWh8f5dkgKD$U zG#r9CES+oZE#q@B!ceZ#&cN1E>!3@TyhJRBIq3jD158+e@=`KPXfmryXWXS@iMA~Q z7C0UlN1>y?i#@|N9on&_9Cai!kSi#o3lF&+`x7A3`zQDGdP)8#2grf9)z8x z@q!_@t|_3z5rJR0F>A<=v%Tzj#LE0}DVw6T1XU$~HO*!>GuQUKqO9M>VM^7bPYEA} z66f04M$LFk2UB$=H=X*u+wY*`4Gz`oh}pmhvzHC&p!KKlrMM}Wf6#P%dY}qK6I{|{ z?kYKc{exDrzDd}QRnj}QURjE)ef@YXn_cds;ENz5q?4@lW#|}tqHLJ_;Wa*osf#H1 zeSgN(`SjjHrBHHZ22tR;B2u&}G?d8SZ9IJE7At#$%1xxO!^6@~sgB*qe$B|9nT01^ z(I#btER0@4_uF`RxfuSph$&NVZC$qVrg7yS#;JLA??63hOJBc~@;Q40+5 z>+F0*^D`Cia-nSeh_(Wn`VD?0e=HM9zb#y>Un>%|EcBLLH~D3hm$*KpRa(}IvRu@% zt2Jcv@Go1zCWJD*G(tY!a+mhvys=!B_|bqRWwR!53Hm|Cuu{JgNACmmua}D zzwe`YvH~^0V8~_y*wCjpT_&!GT{bNhEzsF{}>E7Pmc!tr|};k{fH@!%Hw^B zc8Gh&ZuZ-BQ`E9tZGe|MW|PmIRDA4xOE z7vszGV0;4>Z_7xN5!#C1R@?w+@`9QwGM`J2f}FC(ir zZY`lrQ(_xC#4eOa=~c!!O>!kN5F7 z4w=*)AZoysBp6j58mjO8PCs4Y>h)fSncoI|tT#G?mxg5zs3zQh7_D+yj?zNU7^|4N z^E>Vi+IRHZTUnmuy_mT9j3)nV_jrnz+qU`L>G=2~@3VEF`Pj3+>W1m2XYV^F$#x2z zwO~!Bh+Z^BTdg7M1+Evf*O%3^) zLYVwc4zdpQUBpNRiE?F)5*T+Wsui-J_x8Jr@VTS4L&}jSQ=y=Lhbf%Ap*tU&)~yZQSi+n1j&69>bb3hR8PbnlVm`gp`_tua0 zwkI6sJS}sQ5?ua}Nh*!WQvsd?aZCRzks}uZ!nT4^FKr-mwiqW@c`3>oDwI&Mgwf_B zQdbt~B=nbf227NbvqevrAjA*~vhd%jYlsFFplgF~#Ji?D&US_z{padicn0xvg?38f zu+1O;Im=*fHG{O-+B{0dMz48>)#l|y<>e)3%{uj^gj<+2|+nJ=rv=3>HQhDi)7LTn(xKZ`D zkUVelQ{b0oHvuYF1F#-r+N8$7JDWT-RU~PkH{PSj(7rk1pS3Bzc=y zON-*#-SZFEBi5I0hn(QAd>y67@#$XCdeM8Farg=F${TvOYWL7y{7o|+L%_n8$v?F& z{Fg3S>;(!ur-u<}+E#>AKkCmu$NY$#q&+#`R4JUSSUz#)$))o^@8;8DD z_tAjc(;qyIc`vgKP{yy5-c#IhgKqOxg`V4qPlY>yl+3KSQ3AKnl$LQz&E1XNPOD9w zC5xNg=XF+ZEw|xT7nOrFF35cP7Ei-QFyDbvKU2jnk%KUPx#S~2bV0Z4v2aMaQ3!A3 zGkFPQBF%!n*wBDNd{6LtBrLD{UrosjloqPQwPY2l{^&(0=%o68#lciaRGnZK@ob=zJLSBw7LB;q4ZtFlD6D=5x8PKRR7T7x$wm8xEl5ao39u8i&orE!4 z&4(7MI`2;l)dZ7SHH@O9>^B%HK7TNFZk_D8?rZ785q4eXiH(j@E<%3+7gwQ!7x>M& z?&d9$BbczEGZ;1A$e#5$JsM)GXAC>Xn^ggv?;Srp=!m!;YP}VA&;(U98aApa5fB%? zv%<4(S*3OCb?{l^?DN*{ov%Jqd~J*(IK$A?PBhQ82D{D@eemY>v6ev#O zdKa^>1YS3zcFC*k8NPr94(<1oyra-PrM-YTPfcAiK<`Cdp5uCU=l&3(|7Q?k=&-hg z-?Gn-%JRqS)-uMKg?_H)FT%Yh6z}uZ7w>%rLCSLQIGQP;=f2djfp8xrAb6sB5YpW- zLe_e~izKmQl}kwVA1@d^`^43N4b6QPe$OdHJ@TTwGL#Yv=7ny_=fKkE03V;EPeK)R z_l=}627x8RD+H;yd9ltv#>jRtB>_Tu%%FLblAIY6U5Fc|dmKK}U)5@le&brS^)8o=VqXjycWC>hN#kb@lq~-rvw$`tUr)JX(;W=+QIgPa=Sl zKZX_ruY>6NY;fxJ=*Mf(-V;@IgLRwEx9@M)B(gK^E2G%@)EgTvViB%g`M)bYqSd&p zPN;6;@i*hWTX476!^mN(w}S0pXT+(Kk;z1Itd$5|?1nhvwq*I`h8^Dc5b@3yDEzaP zpu)Oc1_bK&6zr_R#&U5yrJ;7~^?5*A)(T{Qb6VC;o@SBx1!MhCTzQbfUg_$x^Y=aa z5XSfJOLks4&z;}%YQ%JIo7rW><@@I{r*Ix2X6I4a=PmW7G~=MTrIM!+t^MrU-w)!M zCFq*3iCn?Bod~?anwN^=5oz${*uW>KcezMzY%lcp@h~@5TCzAwGJkc;VN0bFf@=Vk zbyd9 zFSjpW^xI982BmTQ_qarLT^%$whlM(0q0HfAm88+zs$zm34VcK#3G(qKqCjTt+t@X1 zz1?5#2m}G`9?%_CO?o>N!r?wEvVb|pF@L#%zDJ{Z3PXd>33ezBqF?wD1ybI~FBwUn z0UyXji!%qQMIg2w!NAD}pnI!xAMb3<`}w^V#trkSDSQ2;`)qM55-Nhb-v-$b~gb;bp(zfzwZFz)`ZtdVOS>K4^d|V{&NtA`N0lFvqcOo zcg~)_#2VEGtJDYPcUG_lvIzGL%e=nHh#3zN&0pGRRTDjOeJ)fMEd#_VwBebi`$f5C zDyHV=?sij9iBIC(z2vgHnu+*Llv*1#3KJj$IFcJg*U$yz8rlry(|pn6$hCT4s@1Qk zT3XHbw{-tIgq(H>21K@A-RY}qj>zL=Mp5V%AzQT>BYW~m+fPy=K?bEurk2FeM8K{? z45p?I?9`rauzXzUGOf7XK` z@rWKl+-h;STNvCe#}QySPis)cpN@?W0d$|CW+jFPm;YflYLW=C){iDPV!`wDF3POM z$hgf#ON6=pAn8!5E{-`eVYOtfdkfIlpnKfEP)x)EI1i!riuDz9>OYpTKJaYNmrSsOEu%wYSvD$Ru~*gn+e!+09=t=Ij# zY})VBIOZ_rh?yfs`uv@ez`YpN=lEe&jPhfYTO}pfwN)*R+0r^@iCyY4;JKB-)Q|p> zUEI*@{@_IO!%!Y_-A;0Wq5b{DusBrW-nl58HN077;zSZ{mfVpo)RB`d#FQF+W$l0a z!0P())y^~!x(%201#;OGAA92CgJyLFaRYyS02HWzo9{qK=}lh%(+H!mCDYV2Vx&wH z2f#eC4R+x0_5bA~7-3DG6b(^d=SD@=oTS;hkE9k{lV79jp z{=)`R4P#hrs?XuA7x%9G{E|3&UPvr!LMLiNDxH1^0AM*Gj2XJkB;~^saBb`fB&2RM zmhi4S;I-C8Nj>-n<;s_8cfw7w5QC)mv;@U`Z9mcx55~OzvBv66t^B6^aCx4Ya!=bo zAPDsAasPS-jJ0_Zbr4_JIaJ;{hUuUNv6)J9uGs&PuZ$ffc-0AcH=|c!Xr!pi?Ruc_ z@+Cpj#f*kp*-77Pt7?eYSs$n9y13QCf4aH~i)ZCRg&W@<5;vg3Y6-1Iu{)w{x%H|% z_bfu1c`5l>m45iSx7DMU5M^N>pd$LC{|3m!lXEvO?W)|r$2t; zOZ$m(aRv6>pYUQr);o|B7XbD}NbYwrRPyQ~`5{WvdLC1u(At*|OP)o1kZU*O|@xc&`hkGALSf->~Y@;q6=@;z*g!2A4Vjd1garuSVVbiU%N+Ca(gfYshX zE~M8D^12p_>DSJm-?j=#7|lHu*If;Y7^ZtFb_X>$7W))u2jW6?kV`PM3$;QnNTEj* zB7c2=l1B2HNv-e{?R*b7zY>&XAEhLn$Pebvt^NJ1QOP{1nuxtAa~ZHn74gM0xz>cK zKKd?>V4M~T7%Q}(e#XKaZwIU-UpKBv+De5lN7|R8S3&xi6nXTrvBTD6xw6UD2dtdC*K&-X81O%;=MK&t}93lw|u2NEMQLVVd5whQr=$iTa%9- zHlKDR>~Jwv)FycWN~C<8z2|f_g&)d=dUMgfC_vrbcV<^K(>8$SJrvAzgx!~E@l^5v zV@LM)4y+Yfsqn*8jS-v&>)a;!njwZtQJG-g(~S3yN=W?d(uQnWCk|860|9KVZ1N~R zhK=K8#(i|1q68L0g24^8vHFzRJ^$7CFTPw!w7S0YDH#|74YsAGxa$j-FUttoIAS?eptO?7Fv> z9sM=OdBeUf3?jd+Kx1-(jq;i&o#$s%%8KcqSyN^4Wc-L{*mb=r^~G zv#uvmxa$5EE^Js*Uo3~UlVqL!t(H$Q<#|ml7R3+Yf91PA_ExuhbNDY2#f5*i@9_*W zup4fcaP$4*`liV0XlFZ#_#gY8!S16H?oNvnpuL+wtC8NVqMAmq3F?ML=h*%ffoTgB zjQVauCEORr>UCEHrcBuByHh~sYncCla}18_Dq~CB**v?lc*tj9<V`9I)gtV( zJ*iMI3e(pBLoz8ov3l?!*@)hBpO=F$HWC&q`ZMgsoMp@t4xw^;a?N7#$=8iAluu+P zEG1#Qy5arM9%h^fPD$8(WzUkN2my_mqY7)wtlw$oOfX*+qf}<~stn$JMm_w6yE)7c zZjO#>CQ@ze=C@Ev+{kgA;c%&Ge2!?aH1VRth?)$bk_jnBuCj{Igb%Yecv`|`Z?vRh z*!xJ~DGzixF9Bd(sJ=rKy8%g}*qW(hM@PO6)!ByRq zs8x$OI50OX;h+ip$6`C+ohI0yk22mrfR;1)Y-O}KbW@cRhp(^Mk?_oNi*s(l+d59Z zE}AVjN}_r!7HJ)xm~b17TgdZ@O@R=zs1NJNYG3QieMf7Zgg|jZ@Tkp~oh%2lX(oJy zvcq@!zS)qnr96apX$Qk_TwXXgf?hRPu96)3IJhL=wBuJhR)5V153~~_TOAbM-a@-b zzy}3nPO}I7+G5X%MTz5*+1cx?P_a@S_ZOk{eRAV`{Np;T*zS2-X!Jdi+F-EL)m^Q5 zZdWUL-REs2b|G-O+T*6r!l9>YNs*tJHJjkc{jM(nkOHH$EDtUE>f2;~V_eMw_o+-@ z^|yZa`JvC!ut~gRGtQ>XuimqaZUolasGKE~9m|CVM8}RjG0LFl?WN4BmY8Z}tyZN> z9-lB+FKincw*_LgJU)L0kZ9t8&fqU%wC{l?t4tQ85}}FQ9jFU6f!=sMu0l*S(IW;q zX7mo=^hYSbG)qJ6)}TLFbAuQ-v>+nS=aI|A05|^1K1&KRro|>7kk#tqI@}Y9Khsv{ zbQ}d&J915ZLW%5syMCVHZ(l2CzU%jKVBwmtm@8*27~kIMZm;ExC(ei#ee?5OvH>nt z#drocmKK7+(|elCvt%nr2b)bveY@L?%50DIC2||CGxXO^IDS-jjL(Z;15u^BH`%ZY z!Ei56^v%ASveRUpwlguP4wjLBou(8p?q{^LyO}p%iZz+b8u}&Mb2n0X3dQ`>u1ge` z9lV{Bb_xq4bM}XQzO$edFqAq)y5cte@Ix88zV6J;S1rEls^Lj_$F_r zX8+;{xi+o&I|hJ;D_+U;w_oNW;#kk)dI}lw^I_kjtq1_B#TcOx9}VgYVts=s4m94T zTm?hVjgLMH{P*g|%P~s?P<%YL-DfS?eTB%!z5kgU`j}&sm5L~89MO%EQ zUSO#*aiWaP%lgsNAQtmizxat;gqZw1d4JjHrOky(DU6E`2q%ZNz8JTm$-natKTacBuzZLbtRDz3@3* zEC6MQBBT_m8<}71oVwS7YiP9et-%YAijM=HIF285^i7#^6@{^^1pWZ_IA6$+qY(IO zM>vlnxFvH}*kh^q8P+JwvHLzR1EU@@UOIQt0euObGKGW2M-6#p%R2r;bfc*0Z7MzW zj+*e_c8#3n+XchQckQA3H`+JmBMl%vEON|g3|OW4q6FYQJ*!^pmQHW?x!t#O;KIh~ zuWVJjt;Kb2%di;Sl2kp&+&_C@$taPuIC@yWTGm|UO@AC6}TynLl zAFzVHh8f^1D`|w=`Ct>!IqeTlZ+z_RSk`9hgJq=G(Rp`p)SiYcnT1s%gWe*ElT-%$ zYJ{4H7vI^EJbC|Ao@8~*%aZGwfNe^_l|K_^!3?QCCU*aQmMpJXgqbWeX=X~SCEBNe zFs$Jpl<*bdh&$ViOZmQ_J#r)k?1USiz0t{L_g8>%(W$2_@eEfI^U!8slyf*?Y~L%IZR!d6XO77M{(*Bs;zfzEqPBovfBcc;O>qgyFC-~-LfexL#;U=fN#(M_A$j6Bh(rpD9D@5G z%mmaWt)Nd@6aVm+Y5PELxsiVt&&bPemdh0>JcFn+L>B<~&6HR!JZ^&@Zc%>1Lr z+Y@EL{1GB{cp{?b57?&IBTwEheSE<1(eEKg;rL{LvuNB?*Y9z}S62I1)Y?}P9*I}W zZ&Lb)=a+q=xg<8Yrasx-eOkNM7slJ$Z*aVG%-P=YOFxmo+5Gq4bpN^hPiz472X#VI zSN@~LE|G-Sj*`B2u1uVMo5+OCvD)qpZcpGqu_x*PuKXJ2@JM-gNdG&><%4<_$uo)XEAMfi zw&m4>?1CIbOGdCE_yg~(7vxGPO~;tz_65iWbZ|US+LPG;z8sEATfYD+yaDv_8c8+< zDrk~6O2%Hu4i@yZlEBZHlWL}1rkNnr#W2&+_YSzojKOn;uDW9-xL=m9tEHw4cfBbp z2hL4k5&xwMIo@e^NN1$~xeM;eJZEpT^DAkwBmKUd;q=iQc-|vT{O)*S zF8s&j(UIRFdwefIsd8Mb$DSeoCX`nIQaf?M27ys;Kq6!IshP8V{&;?V-w6^s+>_gZ zFaCnwQXwsW%4`UYp_$?-OG-CNjxLrDc|Cfa(DoYdd`dm>XkLLTmEs6ynvctWG2QYqfkT#|M>*guX}mz8Pk4jGoG zHth7V`$tHD-xT97STpt~efu~-NqO|J#-rZfRGJy_{4}MQy~P~5;Lpba&4I(;hp4Z; zZVmm=hWSU`q6(PZz|(+GarScKa`g{-$bQf|GWhMb@~7M72=<%ACCW#`eFQQng0*i56nL; zPA0&Af&DNs{3q;(gZY2c0It{z+Fe*AJO zPB-GMJBDEY3aO1$?Zf8TT4?+cPjIV+RBfAugvFzd-FM>=L5e184XL}mo?NDNB&r_N zYq5ElyYY6mymy%7##Eh-*CE?lT>o1PdEfURhfzQDo?jQY37JzLbA4>?VrTb0MW>XmN z4IVWmUa~+Qnj_%%i(@6q^BNJbt#RHjV$N9g;HCcJ%N%?OscBk>w*u$1HjB%Q)i^^Q zeEAEJv_{T5f==KmZy05Ie;q|m;7#>j%Nd>GnJG#E>j%WgaUS|T=^aNT2|k#uH5h)h z5K}!KOCjRU6<6M_t~0?ad^f2By6Mk?b^T5l<&X*#da|i}ZfEk27%n>Au;xMxK(2bS zIXJIzfh>xocl`4=cO-!x!D%2FqK#=;kW1~DOa6|!s2AFUOR=~@_N4?-)9-HIOn*cl z75tuoFGJ-C+4^OwJ&kuPOX{1z4$Wl>EX!J`dQVC>s5FXNMaRH?@S?(6dO zl-ZNx-F`}h7z%ygCwCmFH)hWWnv)yi<_~w~8=7-lAT(gHl0I(O*^3jAdx%%A*VHPh zDxstqn)DZytbi_dAlxti))CEyR1b`pz(rP&pBLtAk^Ql_g7kUBy_tOZ!1o-@d(7P6 z^uN|`T7<>WlUg#u(m^M@XiRg#eBT5RZf7j-!8oBjpV2*WoB+N=HN$GVhwkLQV2JS) zFF(AeEmzi8308^dkO;!R($iC)5sb%U=!Dn`U3%B`^6{O4J}^89e4;)Bru4Dm`o^yd z*&`vZmxW0(j5#fcxkgYAmM54^x$eGejmhfQnr<8N?XlWx1)CE2+RD9eJ=gAEk>tpA zf;JfW-+-2(vwKpD52Bt>cw&ftA^8OI7T$vH#|_+FrvS#OI-$42{9^P5uXbwnQ^Y^U zN%qBACfc*Az<4)BFG-*J&g}-a8E%nZg5P7jhwY`wn0{#VagPaS=pJF-si~TRo>Mf3 zXHQKTq1G`CZWM3O*b+Q3KcToq*6v{3*}P-)+w^-*UWMI;e&UMVnB16mLK>@qCOR|O z@1>nE#J_>oLE3?ceZf-T^OqW6Y^;O@@w;)<47#{eb>r#MUpLl) zsDmQ=KO&WXZxm;;Ao@Kj>WIMs~!?K>w)$a>cE6ywz&=is6!CdAe&Ldw=RC*zNAr z8`ux6C+{I@u+M#iB9U9T!MM@fGSijLwPnM+|PoeA7FplI0FS;ppQM@oKK#7dnJEO zLk!w@*kHY+yaal}xuoreYVE@30Ymw~5^n^fRuA41(96H7hj<(c5iJ1Ba6y>c z@h`_iIf2RivR#1S%mj7y7PKU-)K6ab_d*QfB>>)J2Y20rVdsi73dE}`5CQZ+43&fO z()(|D=|kEL^T;=1R=MK8;#95s563S8azThMfGQUenSG)^VK!vToMXT`TvXboBOA79`ZHaoVK#5sf>eR{8h0EiT6F2zDzkHzUnv>>nOtV9 z)WnZTnORSH_S=J?%7xsUaF>iF+m)Ob)r`|<&%JUYPs$xn{dqM%+6!?Pi?7{%wPjBW z#&qT^&`U?f2eO^B{G^=9-TFc&{w*&7p}SSqctw}O#zA$&l5S5`V@Wx7=P>uq?8 z2qjy@&TvQ*rMGaNwY~)32_i$V$yu+sJ6K`QYwTM;%o&;;i`q5$i4F`_^S(w4>%;Yu zuKtwC{t0-0Fr{rYm_MBd0N4@gNrt1o?sP7K9YuSA8Dy)f_8`6C)f#+C0PGpE=hH&QsUmbbwMU3q>hPemOyJF)7aK<8?zSu(3e`X^ zVCcrOjoI(uq06|bN9GX(=rP}O$HvLn8n|xzxDcnaSWN&nAL$}}HlD_7w!aBe5k@e9 z!lHooV}Q1qqp8@a^^n^$iGbwA|Ey-c;79L^U!ir&0u2t%;Nw?u8|kVp+qfQ^k#0~+ zNh9UpdiyFLCF%NbmYvjLL23lNG`7T{ICf!kpuDa_Hxn)MNr5%%`(1@ReJmqkvL*QA zlIUTH#Hg9@?aL>zY;9f}R5_bNq+$6Eh-T#2$;yn}_`a{=C$vkuEX0WkXp!w>=alRz zxy?^~e@-r|kFB+-lBuID;bFlZwMVzdgf3${GcB3<>(ECs1RIH{r7f%g5t;!b0d?pf z@p7B6RiVO2-x!d9W!U-cvoJg*iVX#Dam?aL>KvlAv2&tOj{pdS$XU|lj-dxkXhLZ7 z2lHr3VN~*@2Zv7A6jb*a-X+%V`s}UK9vPobFk!yJy3M(w_G-gs@g^G`NHU95p}70H zq2|KT!dMwBV)kTUdYC!k8>QlVe9nj-tAeR@UB+T@rxBH>(J?_nrI3dL${LhvBLEEB zU!OpfDYS*-l2G*;lL%ZE9yb9sB2LRscDkMt<$S#RB%hB`_TZzv3C~~ykQAG13fy1;O;(JZFy=Qe&4K$WGZv4Lm6u5RmYse zab|}4b^k5rZTNZxlZ9N?Q4J(_;{?=X4Z@+(rO}6NZLo)|d$_aoBNn-F5LYLbcln2v z-SOHWe3ob(6hheG?g*)eG%NXmJ)%9=AX~cHPi@j1gqmS#tX*JxFsL(``=|6Q12job zfA^d{`=dteAVWYHybEl!dpj}?S|*eA`5=d635T9x^fu;Efn7Xjat8pfbUjc9gcSxq zUtXWz`RZIki;H@+7EKAVbTq~cyA&ZOR0o?A&r;jryD-rtGdfy<=*G%QI7iNdSAv8n zZ|%V44hXOxnO))q>0sfirA%4>ve1--g^MkQj>t2C$BE;&cRu4Pi4#9^2yCNyPfe<2%n?CU zkUaV0i7DLxY1)B5IB(WGA#~pTr3DebUHDaT^o?Ic1?uk32>>9+>YEZOKe zByv&kS>zf$5~qr-cKxli(U_wDc{!paZTbxFFOpXytV1{`fr;usTPY8UZ;^1d#_kNq zU#>g2iZM=m!(j+cVWF{!6$F-})k44ZW!(Dv5qf`MHgzI85ULFB0>p~PbE^f5=gy#r zWp~fo5N!STxwTQ3hqCup5D>OMh9KSW>1` z%+;zxFDSlV{^HokC$J2N71Q6&-N^xO^o-c6!8lo=IRTlg%fdPDAJiJdc+lxAcHpEt zNEE89Y~}&^jklBY;c)w;yiA-IM=n4RvqR2TGO;>(v2Z?j!B~e)gUKw~hvmFQv89i0 z3)nPY@3mdBUa|pf7;IT@8m}L$9Bk|?L7T>?*so96R<2t(!KQk5os3~%dfE2`Cy+?# zMkMe@eX}zNO`J`hO`T1cP3iMuk~N8k<5&p+{FDwkV7=Ds}OB@ftxI%fjwD* zSulrAi^11nZ6_(#htitNQ!h5CFiwaV?9pv+g9HiZ+Oygh+w-~k*?LmDx#{z@u+f3v^eN^Aqrdpq2<7WB!#P-sDY)AcBplyyWAYTYGe6rBomQ~%7A1^ zj#HUKNIRcCBjL=BN5IpY4p^$_GCJJz)v#ZGXogj;W~*!CSAdCxD z1vBOe#wMI4oJ*$nv0kiB&uo?2Wh@ugu7MnzgzDDOH4{=*>f2X}4u1#MB8L0D0ZF7& z6Q0?gH1zYmLT^65XtS3X8{hK>jMs>5vyODD43Q{0dzqAwzWJD-0c^iMZiA$@PVfCP z`9g!3cNo?bVv5RUcM)O}^ZGHlK3g|+?+J>%r%Y*#*0XJa)US(=*fd>hO(zw(_cVg4 zET6-~NWLyVmBD)n4MZ*I5pk4h_Zgl{2uJU(B(RXF@CY=SObh)#52}vr7HX$nxqoQCl3RTW}W z91<>>+sq`(1;*5rh?_>spO48$m1t#j?mwrnQ?|*q{KXVNV1czCKrpO$P0t|ZK~@I| zl)M$5VR4#n$ei}O>&Q_;MpW}D#BfF+yIb3Ft_b@JHdmZYj%>UH`y znvEwu8JuOGJCbI@FeE-(jmD#;QE=knos;zoH?o=8XSEx|Yx2`|woPVYZjMQA%Z-i9 z92+l>(H6TiH5#f(8bmV;nzqN0)Sm=;F$^iS3HnK|{9)kiS0CVpL|P+@Q8tEQtuo)- zClahvi9qJU5yCQch7D>kj;T@T-5rQD#ePCXk`2krt%*afimLC;!SN)mrC`Btg1L(D zT!m5XD9kJRd^bs=S{ML{ja2kp+n3u{TJ6}IUrC$#>yqa^*AvV{41403FKZH=hb$}r z!Sr3XqD}c59meq(*FkoPPIK6~*WvMnUz5*N?(R>|Yy{%(##+MJOO<}>{_vyweAT?w zlra`kzr~5Sn);h+nm(CX;RiTQUC`QJb)utwfIRtee?qD_<>6cT-cxTWLO%5A|(m0G^ET_S;fXj zy#p!8x;ZX%QO1j=@)y+1m;-6X`pHCQ!c3nTeWu3IzevRcG(BZen1@S?GO2tdf50J@ za-IJst;{t7&(_73kRvu%B4VyY@{A6~k2GA2rGPPa9K`kcRk&VFjE^UKQYXu>GQjzC z4?tk+>)z4{XP_H>ptawT!*g#p3NUI5a%h#*tPJHro7qAOidj&BBb6dw&;c3*nZ*L( zchUSgkzZ6W2*Y?CIilY%6V`z8FX?IoMxgSXw`Nc^y;N>k}$b_Tbux~k+xuH ze*VPD6MLMqyd|bW#?c$Jzi!^bs6IL2y+ezJ0pg_i(hD$9EM%+{YozZe77;!XjV#$# z(Rreac3?*teHmT=hVg&i^ypT(}(Cs^dU)2-l0MQBLH%6n%w#Dutk0dMd)$+IM zcdcWBL&Pk-TRqF}CT|O_ajhZsp_P*K(iN+0WSvS`Oe?y^G>#0MR-9;@Hu#~*8lR)C zN8USu4s&@EW?Jc8CsV5x`GQiG8e{`BY#Dq8@c`d4V;u1_qPj#H zW)D1&lAkMKF!#)bPco38`?9Fss%afWqmtMivoo~Lo&e#XmLb%9<8ugr#a%$@sJ=`} z<*W%V8rPX=AfQ3yrUwgM#!jd4^6ZtA)fztA_xJeocAd|4@$~5OV56y>-`U8(T^h#w z5h-pj4Z8iKE)`p2fZHTx+iJ-{Cb740WO~wE1FZ0V6-9H*38ughqrs-S)(T5V`I1b% zN(VlYNF^1WCKXGh05xWG9as{(LJVHq}(E{a{AXud-C`Q?|++ zq>;$(6uT77NePQx9AaKQ3(J5V0WN7?@A|U3$s2;o_G2D`FNROWbJlZgMhxZcjZTY? zxj`I)9D+W9YbdxC7lMT8pFA$BE^^$T?}Z%(T`F~3gd>q?#rt{>L|FGls#>4^&w0LK zopI~bU4-3vS1wk}s@xIUW6P5BV(0S&2Z-%@NxI8Egm}x@Xx+=d=VMM;!L5U37}EPi z*A>>+S%*p_2f`)MuyKJ#bzoZak35Bv0x+{o&)RUEi$feDG~mCOI!CSiCpJjn4$1SG zbV4GL;Vdz_h>`=&!A+U!+QJrpWG8QGXac|32hdUqgA=1itMeK@LAeIcmMYv20RY@4 zh(dgAh?ro*BK4dpxK_nVSO&q6m&w zprHW^1hr+M;5o@7T_6|VSk{lJVF@;UL0bypES|!{*pKp)v&{T80Kk?938o{%1bBge zI!1Wv2L9|-{?%nKtcWEREyu${D}gvH;M+Sjt9KdqbrGv-?c;`&`9c)ZR_)Q>N$9k{ zK}|&k$kDjoDV(qhy+n7w-0=Wp9t4%)!BBM;hX&YC$G`pj!_}~qk?5@7HEn;0cP=u~3xX_V zizdektaR7~ghN2a922-41^;kR^tnj(yHv#40~#0DBGrndwJ)I7_juqCv1z-N3gGZg zTI}~M^nNg4o##97s-aOka>#VX%kjj`q_Oz%4A(62Km>EmY_bcFg~JrCQEErMmUl&A z*oC==SAvulk0RQKIx1}1&0rW~JUy8WtL5_Zrs}k6kXu&IkRVNo5e3)BOGox$M5&!9 z%$Y4~O*30JvveL3-ZhL?uNG8oAwz^^heHKaS%58Fndo%(ED=CXUk>znPC^4ijwaAl zTrTzn5{r!+#~>acFjfk;yarYpH9fuvu_0^eESxrev85Rt)eH7Og+euYo1qhOTs?i7 z{E+~8n2$OTwm5T|A~Ec>0?JS2aCX43f~(?96#UoCx)z5FQWye(1GRF8iS^HBQ~F6A z6ieEjQ_AC=^Vr>_o^R6XlKyzbJHUa<$KYyxhF$vOw*4wUqO;nTQ%tn(t={<58o4)_q>1&`tSd-EW7R{Z&Br8@??9LE?fV%j?3`<(TL5U8957L% z7LA($s(~@d7g`MeJD6?V7f}RmZ6S5*5 z)_HE+Fh}KXITyX`o?_i3ZDFM?=>Fow%LcZ6>X;+Tg9pMm|naS8sJ1oLH$dk2HJs zRBc5;pM>&~%w+%X{3{})WKL%D6cpU8RwFpO3B}iI`T@wm^>Gl7@GcI4}pJwMt)dD zi5oQA;h~CQZ4$|_!~h9gX3%6W+vUVfH{dXCJTu9r`J|SqiqRu9da<1iuLk}uq0@v{lQxp)Mc1+E5Uw5LeNbUbsQeJ6qa?>(TCVo3ysXF}-8|k*X;hA))OlT6b+H&e z6@Hl7%|PvR>ap{PK}5BOLD^K6&TKu7@6+}wMRcDsbsS-P$Xo2<%rw3W{EX)}--*sK zIgh6jY1g6hQtRyi2r&~nF9qH1layHT^5C`vfy5k5Nd%E+ALY_*npMqlThLzVIiXkV zN9=J4^gOfFGs}7QxzPE*M$mgue-QTQz>gOsoW0v;ZX!9Qyjr8*?9lHv3Mecn?2wVq9yF@y|>MJ8UOKO-}#XOg|ZXqrwUSpB(>9)bGkbPnkicR>$hrFa|rp_>D{ z_c6OC%Bz4rw#zh#dkV@in^C3r9@0->3+08oUW4u|O^j}Jzr6w8VM``gLdf?$Zr*P2 zZrt{^HxY<7vAliWQ}d~B$TRn+;d&qyO!QMd{VER>DG$#$=K4h1d@nJdWNznN@s`2S zaA_id&61$?nQ7ui20t^oOGp3@Ya}jW9q2^97%Ojt_{(9Az#Yg(fp;oq`xos1)TQ8T z13#AX*#-8>4^DcecrGdHv5S$->^JrvwUt7zSU*{eNuE@$cq{%k@V18;d*-KkZC*8p z(lF}$jeJ(ez&NxGtb6`wi9k6X3=IL+j6jRi(||lMNt0wy(5@(Oo3kNZwq} z7V!)aJbkf*L4jNP1^{H^pqi{6WjM(2a;ww>N_hteZY*}|=_>Og{S}JQ3WEyVA~v_t zb^wn&-o^NC_?1U(n?~=366c4~THtK|JfS7wqR5 zco(W!frADar5Ys$UK(&6q-s_bF?wUTwb(XE`ZIT&)#zFFfuOEM*fznafDu2&wM5oD zCi%~^hxWT>tuQ$SoLkiOYR9wf2{%QC&=0q5x#*u`B!FFO5?@9u(U*foB0#`Ksv8bL z)+G^fjs=!d4=?&tT|gM3w083+#;BVoQy-fj(o#j3xNRxpDXh2RUDu%(&KveiAh9XN zF^Yt6j#Y+L9J^bh&O6vR zcTL#SMd9yFl%CK{=-(+skDl^aEJKW=f)fTM+IqIor7BEG4@tC(7GKh+7Vo^cN!iGs z8708*?d+;8RzDkN0l1Z!j_?ph{HcqC(r>l1uM2%JE0Qn2dIo==wMqG4Vb|(?3kryX z_L5l6f?2V^bTwGi0_feItN5hrT@pX8gzR7>icnY3wPWOil5jF5?Fr3YojmJfFyu4r0AXyCJ=nZO&O{JXMRX^zDPKP$hUqaT^> zyG~86RRsI@%Qh^pBA!#TL8jNMYED$fA_cNKO|9F0LBLoiYTzXDk#=}HC|Q!H0g-J; z;oOBpyT2Ko=GUp8hOfCuByhEMWz(;@GjkW(Q6LC?)LKsaQHo4YdvOh@4JJ~4_sO5DQ7%J&BIgNCMT9mmVjQdJ0A7A`~*mmhEmQibKY$LUOPf7Pp z(dz=T)zs2_*(%P;pSKNSLh|Mrs~F-si|+5pwrZg{r4hd9?&y9`?R z9kA-2{xEwmV|>y6!1amx^u3V1+nV6bmOoT$r~s8>!hmG`!KTS(yp=ot##iD{nR*o2B$?bNnu%eaHLg~u+*#%C+2 z`RxwD82|b=*R|?!_7vo8&O}t~0UmG1-d)&*WIOqJ{k|Mg5%uizS!0W7lJ#H)@|5fR zZ^=PmGr13OZFUrl=wHNQ&oBa=l68p1Q>6zuzU7P_oKc?a*+OiOimAClOk!P`(yI!u zp)s1vGlY^l&uO=qcPp`=8HGMSyI0xw)T6cV%<6*if?eJiC1OQti8(I8X-uu0njUP= zYkoo@q4x8^%Y`cKM>4;9?zu4++&+*Ql)S!@MWsS|a%+q>j8~_oFpp?g4;M07F}a;y zjeC>cbxCifmCrX;;S?LPDhn32;EVZ^%7Q;zaxigKbtjAhAp-3laA7q=yX`2Y3lP5C z!^2lTHm&574~;4R+5#e#6FS781 zI)>vKh}YXkUazL{Y|MhSr0~k3`)nz-QVkXJdRJP!+aVwx0pVRg^>rxZM{ty0>&%tD zVow`V$K*0?do#_tWhSnl>E~J;@7GCJ*7H*dIQ%$l*D3J3VbShA8v(*@;LHRE$0@jO z=Ats2?C%UFa<+zX0 za-EV21}&%*0|Jc*K?B+Asa2-aXbbDD#RGzo{KwEYXP$fr+;XmHQR}>Q-_cH_d z+yb&Q1|fRoJk=evZ8a^|`WU`n?NN(|l*cY)$f5|u*vM2Z#gb$$QblwQV%M!Au_Qor zoY9ifJAPu=Ni1Z!B{4rILs)$}g=cb`e-27nO6!_KfZRXCJ@jW1ny#%7SF7>4V7Ypj zs>*6+gz0n~({$dJ;}ua~;+kWzb$x(cmI@Guro+_V>1S(Zm8`Vlx(TS~A?ENh-vb9M z-QfFMww}4f!Sjt6=FD0$C(6Pya4<00&eEC`cwbm);+a2D4(9B_ONGyCCP-z*+%_37 zt9BqqNEABr_j_h@rm8vzYeWlA5JRh|&b2ZWb+5=OO=yzTYf5~B?&Cffbo6AaVV`&E z*X$D0D^t6#+S;`rS1e}M`DhTyFEEj4ORY98ZG`g*{}x!dmXGOD4CU1q4p=Gn0yiEP z386m7;#`3;Qz^94l#zPSTWmNh9Y1rk1jOf2xs@esVN{G=4)8_=bw}3o6Fz!-vm$i! zF7@FYu+`HeY~Z|}w_$tv@?s?%lq0yW72P_gHIRzAXOngW^S(3q>aiCeGY4k6+;Vth zVHaiu6F;MG(1`=%qKNL-3)1F%KcCAvoQ5%E#X-6)0&uDR7?DlVHDyVYXj~0%O7Bu_ zN3Kn{G;)IqD|%XuD|SlEF#v~Bxu{B;Op;uYEKfzVsglB`mPx8feQcO+v=cW|SMZ-a zW#BrM#lHfU3okBND`5&@poXUTPBlZQFwmQWh&wTfNRBDp7&)7RW(p$Qg!0|7Q#I3) zw|J1bl08oYhd&FADE65BnwYtuOavEfgrQrw$e}@Xo>8Yqi!aaY9ERP z)>o$XuphtLer}v)S-I^d`iBtsanD0j0uCBXHI$9^-Pn-Al(OwJ>!dFqRJ=mOc zz^MNZO)E=x9JMO-h|@x_Jqy@PX@Y^1>-J|?@0Z=}J<1y$cPHup|98f2}fCv4a=Uw7yWHNliXCU(_7~w+M))!7`E0qKoD!B zlj_sbk9Q$h3{2|o`Bvt$T7KOh-o+-Eb2tEBj3>H#wCS$~ zI&ut5Z}}AilxSvjyN2_9HBjW+9E#D z_QtEgSvHcYpA?y6sVPSmC)V4i03GijTvsLyF8?V-IToy2xfO5D+8Jo2+t*>7lTWte43#2oz;UY2yK^GOfn6wP;F+_OX4$lVTmf8k{wz* zBS#kYdtc2xJDBTI@`IP$Zv;vfGAEf(iI$Y7tb&Oqst{!mN*!0r@BUYqk$o?bve7l?!RuI=i#jx@^g zW9|(~SYnz~M$H&%CP`@{Q51Ng&&0hn{`85y$*BpwGL%`hefwl1i z$|a+B2ZR)rVfVk_l7r2q^Ys0qOLtZ=B~#B}xx+>q4=fHsYkFeAH{?5N$>R?hx`Fl$ zZoxG0#;?;WNp2}@drR|`FgRt27?Xw#O`PLx>IZb?2v$X#DW@1owMNw*0U@g)FCku- zcFk+`Mw6~Y7l z5}84B&}i1)KY~^$lih`fGH4DGP1gHI&=jBL5zt@XrSd1;LDr{F{T(r=a?GCrYIM4djnhV21cBK>d+2!@oy#d#^!4F#w%Z zf5d+m9IiI4QTSl}@RevXm?T+n1Ae@8g^*m83UB<{)i$&J5V7k z;4hIHJW&L1`Rk}X_h5{D{jMfz*@J+`ttkRMuCT{@)eNzkbwH~T*re(NzfjnvpRu9p z#7Zf@hWI8=6kXcCI8xZhAeT`;hCrszSp*)RDzpY~!B?t?70{lXd$4rc+BbU3kr>Z?5{Mxk1@p z*gK!;$6(A~oX|ND9=bqv^heO3=F#9{!080A-G}9K`y4ywiVLfh?66BRyA$bVbk3Q` zcLyL)gMq+nT!>_2p-b8u{<1(5vIZukX1BxK`#{D++=opq5a6dnLf*NxiNgW~@u$Fn z-KPWaG^$NG0@GbNwZI>Cz3NDDh+SPY{wxDy~4<*(#NOakqGQjm}37&hJv*S55KlY8+_I(V^Gfj{vfwI5Vm;_4FI6O}9ySgXxCP|eo&bmR*h#o8G+%&2 zAS&4@UXbqbGKyU=93cFEs36q&KrfAmO9lnwX zyQqGSpHVp5hFY%YCdfUNSAzx7ff!ycF#)a*8)VC2p?@KvT?5r#r^yewLhB?ZC*$yH za4ySC4->c1MP|jTWuAmmI{A}NffZ8p{2#F@T&;jthZaB|N{$zk!oW>bo?U_l3}{meUmKoLdYP7zdZwPBsJw4i6ML_$%B=ih zTr+umY+3f4(MNTn5AR$vR*`E_Q!tt0TtmgFhL&BaSgw3rVNvX;w>?uWfO-NS4C589 z3W8-Tc_%`)a@c&MocA{Ll4UiIP!Dw_v?fndaVHmkMl@UUUhz(~2IeW633qSyR!(-j z=Fr_F|0Sp;ErV zsexgEH+msQPyuIM<(o_Y7wFe!RNsGr$o>sI`x_$5#LmX@AL0KRtNSkySq=cpKO?g2 zf8PF6i!sLkro|X7GwYu;!{0h;u`zP|DwtwtD$Ny;_%>Ok1pX>Y& z`G2dy$oP*K>t9Ff@3DX0$A85C*k5s0R<^%y2lHqAxBNfV`QI1|3+vzJ{pDf)-T!TW z|BV0GpU?kef8u{UJ3Gfea(_3bzheJB?;kb(Ui**zM-w*|!2b!v`CooX{xiwR#Q3iy z=ikore@}8UFf#nFNlxbfisWSZSCW&Rk&W^H9ptR$fOY;R(%e$v)$Zk+kt27M6z?oY z22I37M5G6jfR!i>CfLs>TaXaU2ZBOKnD_3yYR(Vc-db4+3lkU#n+;}<^39&0hT_(E zlgC$8ZPh2Q23r9A;lh&f%2kfv-ENxeZOTKZy!}aa^Q@x1r=15F1c+<}3NF}`-oiHE zjWCqQ&hTUMT&4QnVNMHMoZQl?I^2 zW9pCu2i*Ru?`06SZot^UFY-Q2yp&#juH91@`wq_^Qes4_)7iDrrqYCD&O@A>)h|+QHAW!uGFUXn4 z0;+?(un*({{NwvJz9;Bl@7MHz;i8V1Q!k<+$VnfNDDEYAoa&PxN+z_e|4OMkpVDq` z|BBk#O7Gl?-ie<5(rzENpKjoO9a_5qeX1-HG^~?8ymj9#j5or?HM2E&m_B$_2v0Zx zDg8XUIsarw9{4BxEfgvjEPXGh;gHYjjthHG!#e)D=y@wWqH?d}iGeJ`)lm0$l>^yi zc}C@aW%hn=@GIohts)59X~#TnT8q+7wf_67wfa@_v`rzrAbEuBc7+$ zcU;Yfls3ULXSOfJY)snODqr`E4iOh`x5``Qk7&4?w;vpDwn-W98OqT$^Gd?J$=O;K)MLslEXjpqcgMC7I zM!E-m`#yEd7I=!hgr8tH!8gGX*b_P;GAC$vTvIOBdxxT&x`5qSpb8juXMhkTXbTdlS# zmP`0KVYUF~Qk3f}E&5y20H3^{Y)-~1WB!2Kb4$vce$g11mb5XCfR{)vN$v!$EdQy` z*0uW*@j&jEoTUrw%%?xkaJ1Qx0vFFKpW&hadvK0D1Q}!L4(lzz^9$=N?8cdrd$d#f z6DDkg=iJ*A_|lQZWYp&bmY$!DDV9Z$1J@9tkKvZ)4&i1%z?G#fi5ms>iLIY)L-!GA zzMR@L?AI3Nb3C`u)R5=tvOJ1cPzD1am%Gn%hW<+6N+%YDvEMiA3rsY+i;yri;PV-2 z&FcFQE03oKnrKagJy%;az7v6DdAhLxtxS-JGY!2H0+25SzxnySy#0iXNugLuEDa?U z%?Lq48W%VD&NO~13o{e(X4+9o@j^1us04n?c*aTHdQ|~wpEV=)J;?N_d=wanfu2fI zl`$)&b&1_ZD{jgoi;>u!3!Y45w2lhfErny!5ZU$!mf)1fR}9m)V>q3Ck^*fA6AoaG z^Q07}6kZNV>=I!lzq&a!dTJkR-NIe#64CU8YfpzzTvz(CWVAVwu#^fF*tG$fl;>{Q z!u)_PONFBI@t)|yMWt8-fn^PS)g$vJ5w)jYo1MTLo=jPMkt=vf&5bK5X^5xc zF(D;Qi(K4urzBuiZCjh8Xdd`NY1!FJu;F+pA&bA%JVvUKsgE%{ePWr|sW!$UeW=E8 zQK>c}sf_D3MvO`RV3qNbWN#oSS~;_gIN#?{+<2fgXNSfFp~4`)pw`?HL#+Jc%v&Ul z==I>y4ruZ6_uK7I&QTveozOdkvNB7o6-4O1n#16gT0^5s#}2i8LhCRCwoWptI$H5y zH@bqT|6b52a+WF|6^6;>Lxtuh3Va_8Npg(RcL&W-jZqz>v4>^qCJ8(a2Nx2DP|k*% zvyq>tGQ7;&LYn=lWl$N*pEL#Y___c|qNy(vcU$jH&mXm(l0w1=Eo|^(&7QCD%HG}w zKkEgg>(zwQjXA?-jYV-pq&hFK8zqIMVKM{!vP?&v3OfBu${vu~B#|?R2G>1#3r-E-qAf+bX)syEw4d z*~iJFx*zdh;e1NENH?5S3TM@?QjLo(t$6Safw4lCB=fn&I%pzNJI@xZ)5D;%lW|E0 z7U5F=A6D)$#+R?%6Moya-MekuwvAt7w{6?D?cQzMws+gMjrpIMlRW31%$(eLGB4JP zs#UpaRppzNTJ=d*s&hbWOyXV`7UM0oW4gb@uJbu3c&MuLg&p7VbJR}iQ`&N*#)Rej zBvE+VD=0hZeV2MI8z^qz*&QOY(|%YyLJwpHU%~G^n)(DrMD@RT7|g=y_8p8?`2duX zRyPNLUh?)1U9@&VPtT1sA=pQt59z(66mab_?N8PkDDIaTi0oGei@+t16NCY#7v@cO zRJz1NJW!{w8px=UJd%6PwxJOhalgqvSAXGRRB2uoRLb3IMb~)$!!JvtHPujVtS&Tn zSbg|t^Y>hoO3W^9dg<6u6!%xHz8%|CrM|*WAYKXr9zz2F#Hd3_ZUGdpq(J`8IRPppi zQ~CZ8dnTfq%rSEEFq%Bpoz_dgjZMdgI>}bdqZYzM#u2o}9!thj<7Mcm895vHV+semYkT2Gg66);!4kGNn$`bNYlTVB?9 z`Ld)B%w_@#SeqB0_QT6#(8J>#gB~p&wfjqVM>;K@A?KfGJ<8g`03F6oyr2bYA}YRk zY@WX{WrWBvgWhUJLdjS>15AMp*UDefQ|%eJQO?-kT_l-+Nl7^2j3Mrv2;j6y!&{S# z#!Z5_*|2Zwug$B7r*vvx5dKC*7@gVsNb##$-z*MH6Vu2+A%B+J?a^qpu@`oAWU7*D^GL`4SJjTz5XWaC&0&|PYpNC{rcz+?4lLn(2nME78q49e&&s=;KQm%S*j+C z-vC-brN2GQ8drm?u9MeFfEla3gQnm5i%}lalqNw-L zjc{Qxhe@wIhpl~vUZwV@uNpSn$;T|IW@umSh^N}Isp+>Nw)@b-sg6y@p8*ML#eM&t zkbv)EoWos-h#exU+=@^0**UT9=_~>%OP)`|{ny*n7ue&*3_h7-YdtPckst2&rK-)s zdlf(2I*VTKg3ojvC0~p-ln$NQPt~9BI=xxP-(?=Pw>Tdf&xCMkQjMz##p$twaj%e2 zd4>gWz7;yEz?F$nP}xe6S#{u7Y0BNhC;^Irnoyp?kL;{cV=8{|gYGNAJ8@=vC=;ag z*bwKUd^pt?&WKc?YV4+9LDNU#(JWa0jL_%6;W?+S?m_wQnf(3e!SQPqN?Tm?@UA86 zfxb@_f1`b>PkV7nH`^VYRtl4UsmMiVqNx$H(|1yfV%F+GQFiHZspMsA^I8aBk7ble z< zo_H-c0Y)**+rSN;R78)Jx+&q-zgyZ~uwF9PsDH=Y`I08tNWYZ6iDzoAnV2Xuju4qd z&}?xnBb)`p$s}HO$>aQ%O%NeL){zqIW_}_g0UaN<5vw32JC?+HV}NEh3CCtVNK{El zXYsiQ(kqkpW>v%boM$KM>_LdL-_Y|X?cAgOhxZtFs8YWiYv2Gl z+q}Aar~v$|aG)ULOk}yP+JiT*0)_#Zv`rfYA20N^AcFZZyPCo3z*r`2qA!Qle&>2q^wNjWVqFGF=x zk@KoXs<-WFMd!|+#>ikk%w<*>Ws`6s*D%9O%haOrlVp$SgTI^ka43HE5(^FrlmK=$ z8u$J~NPO=H^xSshm>grl~Dkk7&}oW|B~xFmoy7oTk_pJ6}=U zg3Z=AY3K50-Mrt?Cwg+&x}{WDW^943^zdJ`i}BrNCk*t|RUdNjXOvR^7p6PBAnye3 z=hESVu41_j<(8B#wi24=2U`ts*ELdsMhw#spNq4BYSC6(!>^U^K{|OZ_}NzED@*j_ zDgrF1>PIMoFN6c+@9@3FAy`{|hSMhjrmv;$pdG;KEbl0^2t4_<+9$QhAB&PK*m&Lg zCGPEsU!I#-E7=5Ls70#~s;!Gfp=>$3NcW6Y(4u9ig14McAiq&CB5?R@gXpOy&ybx9 zY4%k?Q-|@PJ;P5k4l~ZQ&H;Q%9W^}Ie7Z3%BC?LTvDwQxi+T%8?H&2C=e+beGHE7Q zZxec?ZmGw^Paw&k z1BJ9OFpXFIljH921YBNb7ugAX$JoD*BQ`KSbExFP1lHa5yCF~1E=!$0F3b*7)nqjd zG#2FL{eC2_qT-lxw0i9yf>`KGcc2J_J|fOJ4(wVDLh9WhZTHxX)D?vMt}y+AKhp!W z%aP>0f6Bfs0fg?gU;6}pvUtq%%8D1#dU}_7uHc&i&EZ}I)JWRAl6I;; zH~yvwT_V@TsOh}Nw4H)!H6PdyS&`|+_plnw60qXZ+S<ykHMBXBl&PoBz9=Pl2VxJD!>NMht4jsguXDM`X7 zst~OgvhYmF6e$^qXk2hT(_OWCqL1DK3$V64b_8rBL@T0rd!UGr3NK7 z4$FYhl<~1K;X z4P7$r(Tz%4YK;D?%vt|ko}1c-R4!hBcAMde=(?R8g^ zwl?h+m6b?TH>LiWQktQM$Z1A=T_?#I8D`w`^nmuQ7fc=8gb=skdxXRep5_+ zs=C^DQmIAV)6Z+$7YFZh(%;AYRMM?3XVkbuRx%#d1`+Zts)?fIMUsgJswe55$RXwP zKPeKWw1_xOsy_s}|A3x&N$R}&w2xi{`MT+rO}A)afE_k>g_X0 zVWGlvz0*{?p4WeQKh(zS zrKxe);@8p9*ayA79hk84qk+gv393V{Ou4jJmbRA`DNZ^WlrFDmAo#eidB%0Z=9!Zb_W|kr$ZwvAKf!TzickTw$(a5(O@Bf0X|3)r*Odi}nAeUjHc;|FTsq3&+2$UjIh>x76#uyAL}%$G=tM|HU}|of`jD zto~2e{f8#~?|uKFWNeK8^EqMuRk^sh{{JY~|0NjzTQ>h!eE+L+as2nr#l!*g-#FL5 zWQ6noRc?0j9mW)bTxHDd!wnXaC+WU`&`uMFL)(hJ9nTi1OPz?3$m72lQb}( zkfE4BB7=nIm-mAsaX5>kjUp>bIN*YS!IkGF05-AH9Wv&zLzHyQ3cV4Ssf#~yy#DZj z<@|U(_};v9D65q{d(HaJ@Tm!55f>Nz9wN3nF2t7Uak9fj^x77N>NKm-B-m;?RG9e#Uvujf`azT_ByKMa{4RVhDUtBDf~2gGM&qG;b-Ueft2}yvsv`R zySk@eOeknhU|qQH5tUktCS{LijXB6SpAuy@lm4nm3;}ec=YW4;QcL#6f%(D9Sj3g#I$NK6g#5iK%%9* zUPP<5-KZgU!|y}$=l!XcK#|2>k?#HH%x(Lv{Q775ZNL{Tn2U@zAkZ5H9BINE;Q`Y* zCpYgckf6-!9zAZ=|Jwr zoO?Rh>W>WGR8t{L6TG_xE;rbTex$A7M*<=wvq2&5eD&sr{c^Sc7Kt-3P83EF&mDQj zpLtg24jwRHZHbfh7 ziM#Fz0+W7~%)KdtqLNdgnt;)a_6))Ta3*K?rT~eeIpR%uW&4-4QzyK>KkfbYX%Z}S z8A0~yU~E86{Nc|BzV4h6(2LAP%wh3}x%DX59oSdGUI0rGhC;+T`s^{@RIY%)a=aM- z@1{b5U03?8_Fr;TBtWU2`8b>nSYL>q==l8(pUhgcr@{vPC^gevL0#pDnPAmEAT^(G zKUteVi!qxtpLJ6qW5Dk1VMe%L1Yh`J_TU6T6iEaoOdjbvktXg&gz3Kv-u!PMcdrTe z(6(iq9n-y%{W1mUj?3aq@dOjd-qGLLJh5@-7Af^Z?FMf46vhmhb3P-zr@j*X5`U6d zK|OuAw1clj6^i_fISBkm_a<+7yKrg;Uv{Tok@y39i7?|MOo-n?vqsq*8169#SOW}3 zc4({6Z83W#6{HAdf0({*WOt^tSrJ|V@J-+RkBpDjgxt~FVP}-@Sg@Ld2NqD8HDL!Bnzo$^XV1B!-Ov(qrTO5(zm4 zG=@sre0AwGX6ZuJs}I-*n!-MK2=@^mu=|`007-RXtMt5dcu4Z$9nMM7hpjWb>sl*s zN;oBd%Q#BhN_1HKBs>HMkqirvmW40O`kH`FyP-L4Aw6*~{5z582Tu-UfLIpqKsJLl zKz`ZvBku3iwftc80%^Xpd_$~T$3s~;F)YOCN{;k7b7jb7j)^-mSdiZ&5OPHw>}$8Rwjs91wX6IycQAKNVBU*)Co0?xzMXw8e-3`0e4Y%j?#b<` zD4}CUSPiq^`IUSxye(*2WG@kI(Oso%C*TI~_=P>^pUli#j<&IFD%v7;M5*2j-9z3( z?w*{PV{k+Ql_g%e^R*MSCK>@sIK$xvisqsDq1${ztclCUh-}daA}I2~i{pGa<|hTf z|7d@^l?V9&zdu8^JxD8!a>Uz-;$MN_YlF^y^8L+HaIh;xY%9{-Z!PG(r+z*_xCi6F zXxkP0_6ER2Iv^J8ILf_xHif}~$M|UXfWEr3`ocU8h;Cx~&6*-fh=XFPIpyVN%?saS zE&)4s5p2bo-8s$cm7~;(=M{|#QF}sZM3@>8_~uNVa3CStiUs?jcxnViF;TeB)3pV7 zDSn1_#np(1d7%3Y@qtzg$ofvk>?=SW-0{ZyU(9PSC2Iw#L#wTUJT-2{g2f9M^| zfE=1II8Z06&=An2@GD;KWC61-rw{lMUA9+jaPDp3!5s9*j1_p<^m?odc2f@q$Caf6 zL@zp4grPT-LU*XSXyVblfrTYn2jq({a>O)u49y6AdQvxHBp-9mjtqD@UU_9#3YDSm zd`6(wb*?WHc=@Z6`s4XbZ~l*&M`e|Sg%qFc$mv`vfacf+Yn>C!wpB$1aujk_-7B>yrxGF`LNQ99$AscJFAiJqQv~vwOp-lc ziLT%^zJRX(6=^*XgPzHGq$;)kpcD=tC3g7SE46jEpXETKDgQNuZU&799R7El1u|r- zH2W-_>2;np|7E*KM-P zR$OR1ya?z+k+aiasLOn6^+Bn#08Y{5yJs7ut_;c`4hLM2#160|9v3l;0%_}tf<=Gp z0BKPZMU#f>&+pN&1-=;ALOSWsf!8j0SeyXX0(d&}&&t&r#j*7?u25l-BHUl{5u@7Y z19$J(A|yQB=7XFg$E`pbZElIp6sToR+dynH-xidnZwxd=GnYlX!R7v3?0Z!QC0!@ znA7gMihuRN2>Q{ALwkE=h1B@Rq#iq{TwYOjkaWRnp;x?PEJ(&Rox~o>6-s0}Np#TL zMT1hbGQV)tipjfvamnSGopuG#t-km1 z7GTWoQt76f5ThKgDj7~#=us@jP*RFPZcL>HR5-Ol<}~`qKRm+Yv0_c_jzy?&SS!wQK~((~uora&$BX;tU5i1s z=1UP}K)+f|HX-Ia`Lqp#B*T|d0R60WHe{V-W6caa-4<=GHF{%FcEIC?4i^owv)ZQ5 zr&{!o5U?HKKL4|>?F%Ir!F7sWOkMNyYBOEMfAat1;Z6hvE`+JfM8NAH?FPbBQ+p#d z4ce2Eq@4AJleOSamCMEZdhbPJpY zI>Nb}0+{k#Jep0!T83r0DLgaayeb6TwcX0{bhC^@zJyn|cY?Pjk&fe;Z|Px>Kg`pq zv;Jo&;xX+xG1ONDpaE@VwlEY+(m9V224^)%ZsVXE%b67Ai1!kG@zH?^w4VWV0Pi2RnO9^FvvYC|=KDaV8u`hv3TFzz3&=MCPtSM$ z!(+lbd{(X>lU{mk?!)I=s=l#{ESjTmma{CJh-Vbq6|S zXh>X1JR*2J(C>4j+nyE>mln$n0{@n5Yfg{NOCW7fA<8|TDS7d9{%)E8T74zzvz=bg zn}YhZ=jyXreC{P@FGp4T5!2gESbJP8K@8xVG@X8O6KDzXJ*C?*P7-1ObT-mq+NMMyjpzU+ik)ELEZVR8+rE0&gW>wI$6D0r~%Eq>OYYabp2WGVOzAC2- z2Wxh9dfo4Ij+h!Xi8=3qz5w4mIga9rOjVtZO|=hp8)WbnbkVQ>R0x_ZV8=>Ulqq5ta)b%19$Z|96`Q>xhQ9gcF+zqUHRG~zM!*H)0MUYSfs?M15D z%^J0M&~GqJQ_Kjl|JrukZKK`&QEpM7eqDN^wsWU3e z#(%|x)R=}-13_NK2%9U+jRb1gwPGW?*A-ALC)oV5H4mKg0r~=@UtI8&cKVqblIV=pcw$`jRe-41#*?E~Q^L^y%cE68P*lGGWfO_CQympzD z-pHHrOO`G6dOZi6+}1AsGqHi}?|~c48pxdaqCvUin3omet0xz|n-lwywr5$VzL~jK z5h)R6lNjdga;UC&raVIfsIzP`jAi$MUMC!x0>!a}@T2qnO=%>@Q;MLA6eKZe=lq2c zP`knL&}jppglq(AhFeLpw6c`_(~`e};B_SazFE~pS@uIL#YYb76;eKdwwIHY=`gr^ z?SBz!(4N%t__^%ah4nJ!JXd2Fp+di_`x{K(C+;)H_>YpxGgH#E>%zURE6bwhgVZVt zYAq=!P*Ubgz>*+vD(5ezVm2k5(B+i-`ZditBcsrPy;ZrNAn6eZqvJP~xHx;%F_`Kv zJPB@H{kjZD-FHsdbc)r=+z|PN?taGad8219;QA@UYdT2L7XJ%qo+@yaRL9NL-mLDtj#s%W?m>id>+&pgT<_e<~L83W@2uUk3xVmhehT7(N4%OA&naN+%3RG(H09_?nQ*8shaUnPnNGoPrxJRF4~ zr{dT5P!XbUqtAm22Vd}uN6*i}Mj5^5ejn)~Os>y!;CjXt2i~Xi%zy!JQ@_*eS8Z<2 z{Ss_kb>4i~S?_qptUKYYG|XQ!sWNa-j1objKt|J*WCYwc30=1Ajz&Q>uS0av*FXZ~ zf-q!`M?s`$<)z|F!j#11*vCf`@MVE8>eJv&HW!!tRUZF9{Mz)|Hmj+iiXP`uG+K1H zJf=%!NW;!t}(v902d`H0i8s`KWD&-fU&4Xhp}WTII;Ht!Dmt;51dJ(@QR77ZTD8 z2qvm+tJqe#D$^pN?PU1Sk(#A$_rNc!t}pOVs$&~*?cs7=qqRtQu6DbxcXf8d zZ`_mv?Ab@b8vxfdc5~yZF}wS` znQ)D@w$mQhd1lahC&2GD>SN*d?z~};H*Bz{L0H&=rYqf*s=#dE>W_W|P9_b5Y~@jd z5yh){1fv=TwcN9DSamWdng{DWjK{T+R#byG_0cEj^c04W;{gK4R_}x6Y6sb|T&Y>Q zRrMw8rOHzfz!H^Y*~~4QQ#GUhQcn0Mv6P$aUA96U4IHwTuUgsf7yZ(G6}DC15k`r& zK7Kwt8ucr8uBgY9ozroqD(tl^g_B9X&2KZaFbglXs)RA`91=)6n+dk2$$qY67YE1c z87}Un*;(fSk&FJalz7nDttfo?I=*7M2OBGl*W5R-V9Rw+O9!+ZdhnJiMz1WVBM<4K z_S_Bg9{MhlmMjWcIgIl=6XuodvgY)kg&)(;$%0#MyITZ#74(1;p&1jUL}!0fr8J_Y z{M?=-t@iR_uRWwa&JKpS>x06s>ySUmAVTr5qVm?HGPL01?`atQ!Iz^r1DcJSo@mpl zZFk0RgP%&d8&Ks|gR2W8=T{3#IUD81Iks8yXLX{s$(iINUjuL3c{WQBfY4qbA{I1O z9&W|_8ule6x31LpIQ)xX{R%Y7IhSq_YnxF7HnxkYAV_>j#2VB~wp~AyD0YB}46vwb zbyreS$(JD*QFg(43ju?TWu1*3p2j{W<^eAgy%vcyUd1PA#{J%6PVf3N|M$-HU?fS( zz&Byo9_E6`m}-~B4x8Kd%t-d!ulRO`0CoE0xQRM5!uATWF0gI z-&0FK1V}dJW>o|^e+X=HGWzR1`tSigCC$Y=sMtL$kW+|ZYyzHSB=-}CsQpis^toNQ zZDoO2!oGg;*_N2N&AbekPh)he@|$zkpdCmfih?L0eDGFO9C# z`@`J|P>O9giFYl4-&fCCnt;C6z3{_kPK;069sN$W5-G+DXSdn{BrP7huNq+`?1>3K zrn(?+O5FA~OA_rE#p*Mc=1)&usS0J}I}Xb{N)vA{_EusqG9M-H^w-GhXfsYNj>O#E zr{7U0-nF-eFTcjG)Q$;~`GLI=lbaHcq@ai3khj0>c5VV=Hmh_VQ;sH*|bO=cD`XQJtdUNFw|x_vai7d)7x#hFG5g#DPQjkU_E6N125%GT~2 z1}Q7803Hi19Q3{TC>)A@Tqy%G^#+FrV#EHNZVsjf+YICtKExjS9L?PT~90@{twGiKOq$xv~cws z`_ZJhf!Az-&LWS)G+*x-i}TW#MyxOUS8AOA!%rg3LKq@{g1i7%(M{vm2i({F-R!rX zI#9PSm@_DT*7BT>dM+i}SOXbxY+1N!3JCl-%2Ay6q8_>2A$@G6QcyW@kjA$FR2Baz zb5=-$B<`?i3t(ydpdwG2dZ?vFQ=gVcU;s1EBV8uPBdt?x^~bv7I-}{1Hl^rlE=;EY z5vF5Nx}JZNZm-5x5R(AJK!%j8_zUx@g_Q?kCKB*&Hmw0Ecd_zmdnI7oi8uEcn%CmP z^RkzrASH96xqclm>pBDInInn+@ge$wzN{Ap*m1_OrtVIfBDy*a4^tjLCxKBD$qE)V zp<_jTgFs@^AfZPmkw@%Pjtb36lNcV3#?PKb^pEQ+s0LP(5F-yF!@F->1d0WqL=_kzV1)A{xo3BfRcyvN@^Dss zq0~6BhR-rQk>m@T&rDn#3q`1Qw#keYb}mY^e3N&VxNs1B{H4R%$=XEjG`iW>LDWUX ztwTuivgLH(ukeC!BhcxvChYlSxY;wUcG~b=^OAZfcW8~)>OC@i|2W28UIl-2hjW%j zP73M06oD}0I~@PB-wqTMnDNvBBoxvsD5Y{av8Gk<_2cg2H#|nNvu7d ze9;nzI-O*|@YJ6Q5IcBZ4|+HX3dt=7@H;s$IgcA0yPi>sW-tgG#_0nM+g=wr3Y!D# zzXm?37wx~Ep!V8oZ0)AM0@NNrd*v7y)`AlA)GPi@S5pEM)rkPvf|p&{Hla5Y^?($n z*Pl{y2Y|Vux!Q{2@#O5GfH%CpnIQ-moZLE1Fx$k%?VTWhcfZ@hxZgHWb!PTgTb0{s zYj3Q@i@?ZfC^}R*cRTxcNY0I(Pn~SS9i#GDWHgTJI&igX>)KVhMZhGrsmH+R;v#6_ z80@Mh7gtV5RntA7Pc|_6vr9Izfq_~t%DrgvOS4oHpZ6=p9bsQsJl+yyi_)SsFYjw` zHGI?k(Gc%=Irdxtu(Pi5og2z~Nl3tC#^E$D>HPT4A%`~*GvhXiXfrzv1ulR-G3-3v z6L+!I`8@5Ka@gSEoyVBY%0^d^zzV_ytdOraP7ox5kB_6oy_9Bi8DvaDT4B9j4fd@kf=2zq^ z!<^ZAYTBP?2Qnt0PY0NUlxL2e8vc&BJ~xP$~_~_MXe*F9>Xk{^awuRMad(WE@z3KmFJT;+N+$a|4vIT0fC%XzrWGJ|6 zn#NLj$xb=IM!3aqY9J}Gfqf# zXD&FP4up#v*Sb6Wamr%1|Ai>uCvI4qRL7Z99cHu~{MENiq{K_8dT!e7dBhU$s2-;X zzV94IV#gBV`V893Yh{(PHq0EJjm;mT5)!zN-|xo~57Z^Nc1%amqwF=4jG_*XlXkD{fNvDv_D)3j3 z-%xZiFyhAz9{Kl)YvrWUd1CF z-2^}nHjIRQyfD7KEDSRJXxG1Z1&5?%ugG2b9;qdsdp&=_lj#iZKpk50Z&{C$u=K}$ zD7r&(DPna4V&J*z|2}#Se%q&?$Zh|5Yi9f@_NzTWhdg*Ouyt@AUHiCfVoYBjt@))P&Y*?~XWR~Qjp`71ii}a3IM~?K1D4nBP zA(u|aQV}RP_RhYMRi=*IT9RN)jM}|Ksv$1xmB?Y)2L@!1iq`k=!gHi!s@oJ!^o*&A z5k-rz+<9*P$njpDtvqh0A(Xw?`N5z3yw!4colkmw$A7bUfHDm9^2dKq@5Gk2UVFeR zeC0j%E`~XvBixLvGc4qR%(MXeiKIt^ltbm!8`(|=Y<-ccz@Cgn!4Q9%cqY-2x6qdU z%5cqq$50fU1=dEeZ#CuLzCuvze;>LoOr*x#nqjD5ZnQFUg&+NC;1RGO411Wq%p_

          s}w&OjscJkeO-Lwd-iR;MLPn$e*Jdfm&H6qTV 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

          |1P@ApRrAwIzPDrqUWz%+^5k0b%`_q` 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 fx`JVeffh^h01B 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�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

          r^Po0Zfbn}K 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%0DQcV4fV_D=>z*B9o* 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

          k}D3P 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

          vM*Ql* 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

          (fxDy!4v#`+0U@X}^XSP} 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

          U38_VBN@0QpV0W7brs@t{mNruT#**DrK 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 z zv~nLXkkxKv?1<5G%TvwmWo>q5HyFQam4W-bs69xW{F*%kr%E6E?AA9Ld%gq?XP1m7 z#*pMdec4^*78@GGG(9Kbz@-^T!+SyEP^~t9YxHeN01pQfjVY{4RKsc@}K( zm`Hf&de+*&4;T&i2D8ExrpTer47+fHvdFI_5HDrPAD@@vnS z9Mc3OcM3#oEYZp=vHCg>xyMv(zX{m=M*MVh+fH&B=zuEK_yzwys2c(TQE1x_xAVHv z~4b5b^1^;2iAxCB*nnkct3OQ0&UJ?>eNj?jV)9(8DRMUIj)1rg^uHJvC z2&9t7h?h)}&*^Gj`mK>#;chfMMv}vO`^brS1+5CK2$h?WFj3v&^_{#{(_!pey6`;+ zxVG!+vGo$U$T`U8<}j67-EGyEEc<)$HsIsshqA|>4vwh@h$)wV#bl%{n@Guep2O;t zkXf!{Vz}TUy{mS79y6{Ikxq92o0=(8xL8U@i?}?T(I^8gYcCWb=f-LOk_x_ebQ(S1^Usy_* z+UKx91KB*R2WE9nZ%xmD%S$fChz!xnaZ%9H{0e2_u}Nm10wRSxS_33wL;CkGQIX3; z>!fJfiv^j)LiO7ST3Ik13Q_cFETD{|b!IDKQG4=%@lphZX)EY%)aR|&0Ou3ixMOTD z$584*G!_1$02w6b7G4}EQ1e0(&5Z7V*=kwhZQ1d>BbFr#$=J%QW+%W-8yW zCA)Vor++H6X&HcJ9+WBtlY$}S0U_C9@|-Cd;+oFF;7s*suSH#-dS=TF7$!_UcqNo3 z@DQ>_bq`DC%JG#x=2Ka(T|$2FG!LUiy*rj|+atb6Htrt3h-vHXo<)Le)6zNbj_%79 z#~c`}1-cy7PG4=RWU1^bUDxvzzZY1xnYz7&P5N#o9GrIZkotslb<5^a5|T7Ll)GOf z=WKvS^|F5SI_5=YGxTD8lA^G&WO+>+QtIlYtwa@XXvrR(IkzA-FEJ5#VZP*Yz=@t9 zy}%6iVvGyyqi7TLX3}yJQfJ7!L|ZR06lA_)&ZXL%u75YK?byrA#0Ig=YPu$fQnp>Al5k}7;&4vO)egNQLhq9!^uawRD7I`?OQhd3 z5f=62@YD_EWtu-!ObqN>US(Ue!bT6MBs&ay>f(e!J=YHsAA#i@Fk*m;E_~Rd)hL>L%@$%Alk`$V-CUxKV%c zp5H?`uS=qlmC-iPGE&d;*1qpmvN_X5mB;i10;h&*<$@_Goa7vFL%AK(DN>tK>(V*q zGI!?M1?wKk6I&<5xky3bO8R80($%reyU4xROV=oO9`QuJp-3h1&caj^$sKhqk$rQG zw;p(Yeamv<+10*di0l?nMUyAy2lM7Yn51vNvixwJR)Zj(AwEpem6&yM<$c^yW3;-Y z<-K07HrvzoYJB6i^s1-S8uduh$F}|#3D!#~P4{K-miMX2zP-3x_C@yrxux%$)kU~t zdp+X$79b{sU+C7%EMOG6zZj6Yl<-pkSdQ?Q`+;X1Pf!<%lN>k%-2mnSs%-GjnH2Dh z(7a+yH*Rw&U`h?tYk)nGwH&2{`q%)E^aZ8c*_?wd#r|ge#aWtG=M0gu81I!awa%V+49do?G7!h;yeWtv(V`+ zgkw13Y^4ETnU>`;?#B+LrHfax`g7rHE$G-{zuB##mtlp0c|-krz1?+ak@MT`eB1P0jyJISM&LrvenlYYNXRC^LU+M~&wkiwQle-7Q;{}E4&Weebl4AkS8&Se|5VB-1!}XqxBuj>?L4KU4H+G zdw@M9xE&dLh&&)1dQPSG6$p4Hlf)lriGF+wkeY@hOq8=2!t!yR{Os>}q|bnqfBK)c z&=PPZ3wj;MJNph{(Glo(YP=adNN|RG-SiWZ1#_;y=1ri$rWNHKJ@s-gQuLmq8N+}# zuBR%=s_5A`tPSp2IkpJh(&Dq(t5xuX+x5EBYMb93aHcaTreDYTiIr90Y}OW>uhmk} zW8UYc{@hXxj_fN@WFoE^YD?Ejo!7&J%cU!v%63rb0<09m| zMWz#R*Y*J@b+&&W=$eGnI18Yu=2O)vr|RCTZTEbgfPM#b;(VZP69=zJvrg!P_ES!P zu9G;^6Wy>r)o$0muve~^vVB524o|U3 z<8uNY*+NQW;wR&N94lxVP49`L20g!c2{^XzjJuKg}QzoUf?_k___NFTYhdAZG~ zsyjeB@bwzPhWEv?&scKF&qkZLpgnlG>~`Dg1@7RaRm~pq+O}pSU6ZjVjZrM`Kr(&b zb5N%G)!DlGK5MozK`BHKj9d3EGb>M>Cm+~&E^om2RG54>+QrV7_B-{35WJl6BMO)#ourN`t-90 zurVZvW>l!a%34PqTZB#3$G03u zNE5_9aCXDC%4}oV6)5q>sQ}D=m*B^T?oyE`FqvpL5?eG(j#F9iIt38b!@%a->&e}4 z`qOXmS#z|Gcr=C#_^m#Cl$3L0>N<=AG6oO|z|lsD?ROITBC0uA>5~ViQ#pM*9YLzb zsqvux8=>??RmRMz?S}LMq;|7rS4j5?CH@7Uf%81)jZZlBB(?DJda_Z zS+e&>p4Omr^J7Qe84#Zh=7Xcm_l!}{z-)y*a!X7Ol$v)m*4gpi!b70r{s}d14JOYA z>&J3){C3(K8@q}N`%o>T0OBKG_P@3)adisG*S=ZsJ&h(`+FnERw?I z7rh^|S&onEG^iyrGOyB?={jm$&WY!N`sxl)mp+p8XAo+mqA|FOov-iRQQ6fbpzjT^ zKUz>8R9qO&>VG)$K|>GgX@q^FQ~-HpJY=A~GyP{I_Xbtx2UxZ!%^3YX+FkF;QCy&{ zJfoFBC@lzF#6{#47%m<%*>BHhg>Ki+=ID`6SpgP@Rm~4Xn^zrmre_s?Dj0wGp6)$1 z)b(Tc`GCIgS{(N4OHQE757h}7ezQ4cn|;$EM=}dy(yoG8VPp6-@nQtAn8riDU8O$5 z8B@P=(YbW76-F80gaA~1K)utohJ(JYjI~Qsvl+|f)@RXoXslM7FFBQQoJ&nhZEG!Q zx9v9UJSOjxd&icHI1bng*&-z;3JFKJtD!c5ln359!_z2NQAXdRu)yt9l0E z9PzwgEN*}?Kc18@dyiAZa6O)v#aer$>)u>$oGibd>naFdIocvN^^tZ#v(y2n{jzdk zy4Zs8hhAKUUSJ5u>wUKOa9zFFr)y}zihjcfU%hQ z|H8ht;KTzuCCrL^Ab-X4gELK;~ToI`_Zj2r8c>|pZK&e*X{jqAZ; z{&k@HR8$uqndXjx?^S|Np!2^eoFhuGCu9?d zScz^@A6*tsvB5R_R8sp6OodHaO~bJ+dCr2v?L5r|o`X)37k>%SKa?zqKCf;CJsdmb z<@>R$HR`^bKDp)g(qH5ON8hC}Gn?D%V(*~J(oaQJy*u0vdC^br!%kM=BQr4hMk!?2& z6F2);#!>$Ule6s$0V7~KPMpfLC?}K!8}Vpcfn9Hmi#HbiI`nrtq~fRTc#5A`p4i{s zluIJAz$kCH>&?GE_#1elpF{D)n*v6BqJ3n4ZzZ0*5Wim>Iv0UGCEm1_k2sp~1V0J> zDZJn|;shLVLTQk|t_J<$Rm^YBTwXy0u(z#>Xc!TZ;$LjF9llW-_ ztWxtFpIsf4xcqREt}WqSUS8cAt}`F!?ALPDhepD*h}2rzDLh@Vui*0x8oUl^wK|3p4nC1{hJY6Y zE5PAB2sfeY<0Q8DRqB@PrBkpi;>tUA* zUv%^tfOwFO9HZ`h3h?u@`D3s3(BGzw!+3Io5ICv?;b}Tn?wErQb%K_W-id`KkI_Ky!tjc8Hg8Objs@ljhc|sqp6qfg` z)DLK|(I-BdgPyqy$pGBs?by#S zJD-w1=uFK1Q#gbtDF>j7@bFy?ouTjliv$)&=^e)>hk;u=BrMAeTL{)1=#RST7Jf%( z_Mo?G4nUEx*=@b6Ox&38?(b1|vL#UHaU?whpccXrFC86sIOOi319FBw28Tq1mRF(i zb9*Q(YRt8{hqBOED(-2WF1fVJ*}}UZe2Gl5Y&wfWBS&%&;h12BQ&;^Kx&ndKqp&{p zq7`}s)>oIX`SR^Q#pN%>#F2ml>?H$?&BPTIZ?#@Vp>71ve0abayl&e9Aj`B1`9!$X zk4X*=-Tb9J3=qze|DyA>=$}e?hkR^CHsenFyQ~1i-VSnXHPEu^KSkk)dL$_h)s++Z z%Z?(wA1)?)d;*oTQ+@ymO2}(4K3Iv~ zFawa!1_*9+UUOG>v94x?pQIwLCWL1#yarNdPE>wtyTmgr1oNbZ<*WpQkLItd&+CP0 z!Q`EzA&y2!E#wQSxr)CXT#q9F9vyqk6SI{mS-1@a-MAP^P5}(ogx=JwKf@%Ag-@bX z{#am!^($KgSR}09pqy}-znofhC1@=qA($!P!8zy+lJIH+?&bWPbHn62Et}i%$mhsq z57M!${>7ds3b7ZW4(}MPw{iCXuzipYniaH;ASYK!ok)I=A@u4o>U~%>$Nk`%0Fr^uqBQx1@JOa?^<}ja6+~ znp-!|vV6JMZ)-(8uevNzO_r_Q5$`Wm6j6imSeDDVakWD|7d8YavK%{q**qtm+X7I5 z+wL>?asCwyxYO%f~MpKoi5;-A)%tx|spQ{}nr5GYEXl*`Ea%uXmAV0SFK0@vX14OPCY?j8f@z>h) z22yr3nL6v0G#Ayem+i$?UD)<+u+?0zSCJ}CnGqw!#d8O{*Ie+lSUQxE#QT8p9XYjH zO?|bn{WxiYNAe6((LVT3zMQgBh~8GyFFdqqIsK_iyClSO?0??b+f-8-hywF5dOv$NG~S>PO}ILqLn@&weF~Ys<*&yQ zYMP=8`#;&LAHq3%yWb0gZ5`sv8`zvxc(XXuGRk)Bn~V>u@YXSAx z251+20+h#7#Xa+FGMv2GLYy!L2EEgZq``XGwG?s!vr3hsDWa|44-NC<^zi*e4PzPL*iIB12`BbdN%+p@W3 znw$x=C0u9z^a^VfU#ikkJqyO?<(82buNSV*{wJ<8SR0#>nNgmRmr;JTz*jE68jfwc z3wSg+x*q}ikcZHRbTZebUGHF1gjN|Y5i@39)4iL2&)mDLbvw!mdk=t52~V$SDd61P zO;!hByKz=x0Nzs!b`7m~OWIIfyU5Mid0MydF?GLGS5_w5kFiBorE?=EHK=9a-Hz21GK0XG<9|R&lc|bgfb7Al(=dO@QNrg_ln5%NELw@QOYOp z5PoLqZK3YiM@1jyXlp78cy&e|2@j8o;*4mjMTNFIamOO^L&(D@+*jgcBEKf#A)95+_1`u4gb&6_2T~5dS+Y zPFZ~Yl^p)8cCSwPl;kdP)X+~LnXv?vp$}?|{#??}A*GQ=(0iG2$hr)_`;L9Yc!Ra` z!}8A60er3Zh&UB>L^U5FJ{wQB|5zD+;(mS_U#OSZmjGIBL_>JMrSQt;h!45_1Wj$4ftRtU-E~7s-au_V`A*iOIciFJ8%5=4%hFX3J$OGZw3*+a8_vZ-D{mV<#;D{)fFT^$BEB4fH>Tvh& zt?ympM&dyan~=<7+s`4qdrr%D#%d>MIZNcztJ^tn?DoVVG}*xaSmXiL&LeBg&Oz^u z?~Q!S<3~pKm+C?4XRFTrJngGPFP?2)E+l!mXCTibr+f5L_pn3_qa;apl;8;Efzi$* zufdl)1ChQFxHqq=I z`(IZ_PVTALd;b)3`x?Aqz#%L+drk%(2&y@O?KvYy7O{(Xj|qOmhjhrv92>>&{DA9Id3T3qq}aJHy=@HkLK+ zHm?ZS7*|d7E4o&3#n~_N&*$60 z@cLopy|MfmuDScpe9s|O)f~yw8+c^9bLZ&5-4G6G1|vyDyLVk_j6U-BL*RW@9A`vP z3`I#rGniuXvxaO29XdoL-QHuWZ=)q-^0*bjhEf}HqZT-~FK(?Za z-UeHX+Jj?t1#>s48oxUoLzXmpgD85>6uoaxiCY{zG{t4RZ%3e~9YTu1PJ{_zW4=?G z_mp*N@vg?);hH%_j!XKA0O`ZhoUv-}70DQJz#VhXBj4>({=-~**D{r@Mp&)(VjxcV z5)03_s78P@^UCS;Wvdu_OL+PQqm1g+A^LEK1dO66iek&J5d555=XCEY>nq0}lAJ=x zK9`2J)6c>@*R-imZFkDBI$JM1tu2(^L9EY)gVBb;(Y?Mpq9o6Fm(tKZe!JV4a{j(Z zB0R$4Sir68}EK!3RdGHt^Oa{XK2g1gq2H z>-UiF;dj+}8{q2~IBWn>`@htK{)d^tz{t$V{BP?2>n-vBcj`g(|GLfgfB8XdO#j{w z5?50el9Bk|=LfO=XFrJJ|M!Fbzv2h6u(JNI_(A`%ll*5ti2XnMK^*_v{2*5P|H=PJ-`5Ld+sz;9rpFB!cGxiO$5A z1Q$0ZOAil(g(N>jx1WxV{bO5R9z6}s)`oxuKQkUZ6%BF0Uic=iob6zMm3M|j;O6VX z<=;Jb>vQY%+uh3{wano%TcK2Tu>!+D7+L0uc$C#uT##X{9G%MsSmC7B%!!4_%l8LY zzlnuqx1G3R;EVjtNchBpjaGL(`Lg$#p)fdNUW2=@!CDu|ee3mC# zE&feLlq>S^@qBCzKfINN|HKS5CFd6BJRwM#914Sy%&Wh3=GvBB6M{3y zmUc0;ZC|mr>JXo4(Ps%}O4%$;*_v!~Z+nk>OX`VCr0=Q=ZwP3e#iDMGKN0RuI zc(SaFi{k$2U(9)O`T%Bp{gcbrAe=f|+W&yJj_}f;PWb~kHMijKk@^#LTn}o^LU(L6 zv*Tp-bV`B6^fWMv+?k5Hc&pC(*l_v{#;>g2dcqG^vwDK3q*`K$d?u;EPGT|LvW72Ys=Sug5%$HxA$}|F8 zns*Vn)TUHT+H6MRMD1he=2B#(BnRlvK}T+;If^6BKvNvAabQUULOpYYOi0Okb;R~8 z=epgR(iKK)QqL%CBi)+B3y<6}*4wu?+%FSfKV0PgAkEi-!+j~m_EW(*xYba{z7O4N z&eEZC9Ixo@65e09%dr?0^w3DUl0V9;gxQd8ie%rRxFWM|^S+*NE~`e|V&}*!d*G%5 zEHDDX7}F!7joQ;UnyO>A1~^x|tsy;=yryF78nWEEW_u2g_uiCwBdZTaU)A9#voRsm zr^&L)(#^6?Ggq_n==n^1N50S=6`E{2<{pYk4Bxjft#IsW8dfxKTYpwM$37BN+G2!x zKoP#lJKwtEbj&7CbEHoZrawt`D1Rnz%{G0D1x{dv>Elcv!`G(pdU}++34O;_5i`C* z-4SIQ*v>^f7r$yP^5302W8g}V*x_!`V7^Ft6UrLz4FfH5&SkPWsSr+;y2G^IUCq5i zmeXa_nh2g+&M`S7zVPVX@XJ!ZAT~$!j+GQ9!pxy|g|IA`SQ-U|+2V4`n4YLwrP$YH zmvpdjij9`M7&MiBIvjN^C61}6N7M^+tUG@&@k;zcbbcAM#KJ}}mVQ{OGmjUUo+wnm zd00~^N_mwqdt#F8KzO1nzsW)xz<&)VhhaHox`x#=EiOhfPxHKr=Im@y-0JN-FjAfB z9USG7${1$%!t7NioR|YzixBN2(YZdTHs%=PN8D)e7DzkOT%!V#NperFwbAObvY)Ij zP}Bx5=j?f5jEoE{AZhx!vp@JgTKfkDDGLc%!)A#2h?6XWdqEQTf||z5<`&p8FK2K) zqjV;~7N*#H6ca|krx|?43Oay4@91SrFDbUz;yUkjB}_D?qbxaXbq#Kq`OJ0|n^UqO`pwb_-Uf8oV4E{3hW?jJtb{-r1KW~?H$d>v^%bYoQz$}l-wTahKAiM4|SF+?nX$KllHkM z@fJyU>r6F>wdrd^v?TBkojX33MJw6rwdf9`h4)y)?}S2@S88^zlQkTN6Cymaivh1Q zW3IY^>cqNPb1kRmy`(IENJ^2)WXpSdDD1a47@|v@Lv&rZwFS-dNabzP|80ywC?KxI{e$$!-&t&U@|KRpj?Ns2h zz2y(MVRqwqdvb!Y16MqL%cg{61GYGhe8uvQ!#U|VG@#T*j;?iUUqr?LV}Z-!Tv^^2 z21%t4+zkXA(8{uM1uBMhegV3KPtg&{i>T%s(TcyuF&dzFC8Jn9q(U^Ubx=9jfM3VP2BLlfZp@t_o7ak?C0r zzCViW?DD0SLBa`G0+n6AI%}V*u+7zdHL~a&etxbGXyC45TvC8s#fl%UtjfL{U0q(S zu*T8mJeEGHE_}3d1~ry5FHnkcNa;FpqlPxH2z4!IHZtjCbuPC{+mR9io{in$RO{5t zJgKz1gS*7!$6-vc&sOcT1tED&Ajw-?((-a>7>}=XzF#Tikp~Z`;-K@E;aGxF%fD=h*tRl_Rx?| zzQsiEP0ATs5^|bObv^%AU<*A(P3O2WlecLW;|${Yw6*djQB_&jSzu+Zf&#^bFy_^X zTLxVb`M4TtvQYu8F0=8@j3Lrfci2)$1(Ro5qk>Z~si>WomFL@!gS;>=u?X7HLESIi zvf*^$C0J@BEf{T=0KT3gOKo}f>MXoRSTzEvyr^j5xcUmhg<1INg@d+iXt@DuH6;OO zCSd*@CFZPawX7lq>w+QTy&8RavVuGA?wjZq+1;M6N%0+a_C=!_!QinZe!W>vzIwSi z?k{}SNOxQmng+(mUWp4#i6{21EH_)j#{JCjUPpxTpB)F(v&O)u;-_M2d{I))OXO`c zAJdP3>{46C6}918J`}&hIx{j^ZW}B^rW=Sl=?;Qp?jCrUqV%6zexq!b9yJi)~T_Sdi{sh;p-L zftGBA9UaAd7@U*ssMUEDx zNwLE(_SS)`fZs_+AkDxaHejZro8a*uWJ44|#qWNW5fY>AxHbCL$&g%%JuD``!(!p5 zF!!*$g(%umy8|ME2z3Fl;65tdvaUq4H2cC~Z8$%n_8$;xhQQ|lr)AMwfvFl)TkD^BOPMa0>!)z)YwR5hg_u`V4km$bi;(0 z05wJPnAOBLC{h%7_-2TZV{1J*CijGa7NYT}pbU(jTm8KEv0y@XuUda&<9tN0;jQdz zl!u)RYgpyacZhnKmU>fE_iiO-SVa@-c?LFhP>FJbl~MGF4)w5hdLhlwJSwQQtn+~Y z#1#2JUn{639e}nVsTU!sXa02vI{<-79Iz9Q6(rHc$~Un~=lG8eWa&GWghJmircYzv z(%v&Ua53($1#K}r)xwSukB{4~CMrR~zMX-ab|x@kGn(A%eI2lW){RI@NPjE?(%AZA7*j^K>y^I+#4*$iE*7Ir|t>Glis zOZY=twxkQu%z#0ZuLdI__C$CMOB>xG(-=fIs!5M7kzuW8R>Mrw8}<@Hn||Obgb-$s zRi8Ga=@8tRZ zlx-gZ2J=EeHfmrfVR#US4^b}?JnDnbGKfxauv<%rM$9AY7G2Z*1IP-j><h zbw2VMw3`0nK5fB$4iEr}EmsDB{hg*jv8UTV<*)0%eg*@`{sFZ|0I~(SSDzl&3cLmm z0k{E}1-R|61VDuY?{Sv|ehswe>i_2qFufkXBb*4W(RjbuiQNIk@({~sq&j9p9m@{M zrj*qwtB7Xe1S>7&@|h;tyjhroKcpc2B>e?l0sb(mA_5^6-3&VJY&)~X9XgzDU6K1_ zXfJJmNgzRc&EmZI0odf8I>Hlx3@{LO?`0R5eFD3;Yd9b=H!+FifWMy1osk?C`<%n^ zA)GyaHOY-p?k&(_WM^>Q8pF!yl`(1XL4zV|RJv(|@h|BO3aQ9Zl;Tn#1@bEPDlXZd z18)Zwhe3qX=))X`tiz@DoAw|F)8z#l4)gPt?8bB}Y67XIlI;bHb?XN56>qDGWiy5x z%BsDvgr%8&N`ECT`?3KJXbHAEfue1TW}*I>e@36Skv;7m&;+1%{WHPSMgSL}qFk#^ zKWHP2{XWDmfX_^S4!|tm9n2K@_>+mFSSeG|A=kMwDOdV>*2MDkjr5L=>NFgN0FZC62( zdqEA*E2cKn-3ip8DONU+w{P`c)}1v-+PGSQTMAw5V!nWT8X4JoB9V7nE51g=9gb!! zFflesCb0>HHvX%t>tMeh{oNs0?{5DpCi`Es(?-AB#@}@lzZDa@sADAxr0p{3uaE$= z4@Ac6JhKhGnP$Ee3qQui-Y_3Y4EW;DP}4QOsrp~B(C-lFPbZ9*PsXbz#;Zl9D>YMb zC5|IvE<9R>u7Um`@1UHQCfUz1*-yQkm(`pXvg{YnvYs_amlqb@OxKt206gZqcC^ur zl!ljmqw6jXSyI=WRB;9`cC*z4ongxxL=r+n=)uJnebjM!8g;P5QcyF0=;c7RfMWB3 z&*Vn*-0@C(A_aG#%SH*zx{g(TY%~(q86V(q4JW-?VfDNd*MP5l78r1jB9<6{cU3D) zC`Zjiv~@p4B-*k+pJ^*k=+jMf6k?eszs1(QFwBLZQU%|FOI(`*B-BvbZ}bTY^}80f zAY-kTH`wuJEN-OZObQRlC#w9p^O>SS+@&nr;1A_1&dA0|sZHt|o8layIbr0R`81mJ zFbBt)@|xx=f$#WJ&3o+eBAOGv@t~R$3LH-s&f7=b>qk4#tOSXL?~JBiC3Uk3-Z@03?!%5tb+W)=elIf}|98l%xtdaiyfG zW3ynO8c}4~Y*b_iZR1H2USY~`97e6BmwKlGH!5+UW*2#*MDJ-=($3tHXTmW=RdTg-L{XrvS2z^J0O zn~^^qB+mnNeJPRKANO9}%BR3PIALY7O> zg~sBxiJgQ$sEfGwIlAmeVcQw3z_w4YZFH`7Zg7riTG5PsnijK6W!mBx;OI-Wa#%yQ zx@%R>m^Q6Rv)U42-2)=@tez(95&~1hN>GzV$bjAMA&T*-+~t@aGN&vdD~wdtQmR4m zs327F3eh|$SFB`SUUZ^=n($O9cAY9NW0!qgtJFe7jkp!BtIRGPQC3#c$b~dc`XLx7 zYoQr*VmHvr{5YASF{F0g=;Kjc_R3-xeM0N;w2K zL_IjH|220a-@J>Tamqh@_xoZ={lx=oxGP4Hx;*0B5v=7W!Y{7XW8hP<$vbp*rP2BO zi`Q{ApWX3DVq>nX){gmop_sP2&QfthHteFvJ#l1a!z?Z)riN%vb$P`CAhePu7+*~vVoM8Lg3e_ zWgofAbMRC1wzXB?c)$&@8b?bh80y>oYM`Fg<;)ww7!A$07A2+mGYB*XvgSYwCZBm= z+PvY@%aqpnNfcikS)~+BZe(YzK7D*=e_p7RxB5;O&oj-@y)cd^H%MN3i^E?$W9_Fy z>Y&kXv@dFRPV&wetRDgXI)|a#(d!@ld^EN%gu<>PeF?jWGgw^c7s1!@0iqr;VYi)u z?j3H0HM{_4l{xtRkyBH-shP&jq3CtYN71I`#e)PT-aO!D?nX6J&_44%hFM^$Tqq+R zw2aj9J5wX^=C)%)z+bH0fFb4oiV?B?k6daNHa4bzQ_c9_MMUfz4F47pv2if|yOi$# z2N5y;J4E!a<#>90)_=->o&Syx2`WnoE2>i|TiBR5$(p$RpUd>}N;HCY*2e!as+<15 z2@T&{}9y8O8=kO5i8UG&5jsZ{_Q?z98CW!9OHlTGXE)1nw9ZC zU=3EL|5vQR#Q5LNlV)Z9FR2F0zo!};|1GMK;tA!gq>}l@ak`VWwN*UPBVmgxvq>zI zg({e}Ah=;zkieUdTEGuQ0dIaDg!+dD4kdWOkR}AkFa@aBbg8fDf*jE}dF)EA3*y5q zN5#x^OyhfwbGkaVohkfsFP3XQ>w8uva_?>P`#Z_^)%(<8?tAw2$2O8)@SpiTLeL=1 zWtP{S$`?!YSG3^NwifsDs0S3npco))%WJiUU&+29ieNM#fvoysOO4Ov)9N+EJ!~+x z3y#f9jh}Y*y;m?dj=f(wFqpJUHTZ{|AYYZycWO=D_l`Zv$7z9Ic~w`5$Ma9@_W!}y zI|lg@Y<;?IbGL2m=5E_|_io#^ZQHhO+cy4f+cxhxGxNUpoVn-5%!d^#V`Z&XnN<~; zk@3VY3d)^iF1NME-4gLF;REx1mVc))-`#s7iZ*m7m{&U&u-NSmt2p?L`<|M&186L- zK3PgB)&H6D2!g5-!kmAYLouJj+ybSQi}}0?1^OeA^)-X*DkTS+C(;#h5$E?fZd%j_ zNYgR|K}u|U%-)(B3#bwoW$p9V9Lta4RG@OmXHG(JgKz+?*6Cve_M(jBf_>P_tZDU9 zaUM-S>eG{j7aOYyM*Xrg;2$+Dp9c^{xXa=(pV` zk?6wLRDyeVgChWQ!UPb~`N(}LePVk6ivZWg^5ON0`b-t=G|aO$33We!^kup+ZFWll zI!WBfc*9B$g#7prfHntn_Xzep9yK@puY*s%Q0PVz^S{V)LVY3{6u@5cI3I~UKneP2 z)L$LAbNI&)sKu30ch6^y4D%)xT%RPL#T=rMzj;-bZ)$XfRuJ$c|fBz!Gt zelU=0eoo*BnWU~zplzugz0YWy@0^wTmgd?Q^6`aK)m!L_kZrwzReTGmDgn02N3d-*-B2~hQ(h}!B`sZdCT~{Qt4Bq)q8O{a`LwP9RCJumC;K93o*=y zNK^5yDP=;piOKiQK~WqDdC5heKQHmi2du1jfvBy(G3W40yC{qC7#pDlmmtVR1y2Ja zVMV!>@pAMDjK!42P_(?0?N(l52J32w84vLsho|OLhKu;E5USD~Zz$+Y+9u}D^0)T( zh~zHEgX1$zyC2tAS5JWgLMy%Mh^$naU0894k*6{f*cB6it7RExQAL)$23GBLe83xfrr-(~*r207?*aI_JxdgjpGP04wCDZi9` zyP`3#D?XlUFjHyYxd(L%F>UU(zZa`XrpJ+GT3%TS%$jRE%-!17Ps;Iaux)tpZgj66 z!g}^lnwtlClx1$0I-oY4IelDmsa3jr8OT|kcd`0>D!>4d#7A_sOYHO2nWw~aRCBc5 z9=N+8p8!&vUB-%7H=e$-5b;9TSJZqrp55@2^IxYn&|w_otP_PT2{@PK;srYN%5&bO zgJvvF24Aow;XRPmF5OWB{Xk=d;WJS(Q)BQ>CB6p7BUduKZWD4#YGk8sKhb=NW{pbD zQ(^iWKYzAT(qh%Ah@&Ez$^YydP?Cf7txg&|1MRl^>mv<(^rT^i*`viXsHzu=CH29| z-_bq;=(Nx!aA~mch-e&`MJAM=k{PCPcaS21K|eyOK1{TQC$>U?+5TF zvR}&<^0zTS-fM*}rNk~~2pvB&>#_{s7|Ic1WSB~dpkmXS&13aLube(7Zx2xw&7zTQ z5A3iLCpg$~{%CZr7*V(4H8HTZR%aGnvS8aoToe22Dcm{`Vs>kxCQUsrm@)Gsf_DEM z*TGKH_yZj}wbpq1Xzrt1BAUq)iHc^Thb3!1q(SfbwGQ{D%Kl+wDRuRUE^%h}==*(L zTYKrf-+dJ+H5Q|4_ZAvB*hr;Py}jpsN3dMwV|sF3iO8aaPSJptjEMAB&P^ViJyq|( zUKGw#!h$kQSO_@xBkNKzmRNJcDyGUfjPwd*1FF(JdzDKTsiP2AXM(*4rxm{mwiAd( z_a)rL_JP(RzC>5U@2>$N7al!pTGz&&sqhagB{9Mn)W8Y>_{RrHiCBt{!XO$>Su_PP z2#Ie_UjmQ*W+nB2QvEfmcpH4@dqGqt7(9t*o6!Z-LV1w%v+&A1e zG%z}v+i6k3!`Z+2=Wjmnb{ ze=Zm0yr0lqpKAf6;?f5{0#A7y-;md{d5~CUHte>DY(|9Sqy`E}VsJEc{4z<<<|J7n zmn`Y>^v}CC`ZouQDt@6 zpP`lm(02L}dMyQ?ZyatvRYR=VF2%F>t8e(^Sh@^nvls6`qqAjGdYg5~^k^{m@ws8C zXtZl{GAVsVK2tQMuCU&h|0qG8iVCQ!v?0)twgXVQHX{-0Jk$`#% zz`A9<+dC$~qRd~PGL(j`m?1VcCVa(u{R( zoQ{ZZAFau*-|FopSsq8zD`K@jZ+t#!l}jBi%`rLbZ--rbq6Ynnqlnkm?pSQz_hdHe z3=|H>{%?^aH`<^3rivwqm8O213WmV==krZ=5bkZ7q0XE-X_|Jm&q`hMIVP9c`l^Wy)XO2m~Fl1C^yO@MCRvvR-Zj?S` z+AnN%+RZLbA1juQBuM|2v?(a#R@zWBZ2tb!F{u96fS%pvEHWG=c|eK)1bbM>3f2@{ zEx?}*sp%^#euF>AM<_yH5RxqJ4-|$LmzteB)>CvV_U#e~YM(zp>Nl%K7oGGhFgcC8 znD`d~FIi*~WYW%WiliNC$hO9n8&j9h<_vB3D{~kv>8=@Nto{z}cL zpwaI&7rqK?hOq5^jV3Xv_A2XH)YOn3iK5!$$I{M@~xAb9Ni|9wf8|aGGrcqQ-(8EB`LHirv%9QmrKYHELQ->}ftwHa}JjltH_{dSVeu9>2Y`ns@? zz31)c+8u)*mNCYG&wopd!NOt4|@}|cU3H9pMI~VUkX4=fl zT^29g|@2>womGR8gTk48%W?%ydm zDP}b(iBORYUi>G^(I#P7WCR0yeWU=b-_1z3K+Jt)R)IHYvqBg0$QEmy0DRJbp8&@_ zPiL(sr$teLfKu4*dw-o*akce1*(g-o2(1;;crEchSR84C{^S~|}-EZunqIuHtx%)^{ zXo`&sf|n~62@JpXe|-zC*=Tb29)6Z666`QkPwgvQH{vuq!*(F_xaiMht?+Fz*)D%B z58!Gk_Iib~HSRx8be1HzQZ(5ZnYZG8N0c&jOso zWM6h48>vh1qxFux0^7&@Py8tV3`_j@p%7t-1I(7yMUvOCKKHKs=}rvaPiLuWlC($O zb53L0@Zb7|$*zi;YF9DEEsxK^-y5=3bbPn#D6>_y7mji~o(*LU7KeNOJdu<)CnNOr z1RytLV*@KdH)}^U`jj^!6P{=i@%bk4aoici9iq*w#IW3L90JVgf*{Tw=ws{Q>exdz zn*z9?f+IuWBjq{}-zw;Of{V&eB#RXXG+4~9B`1?&*=q?aUafzn(*XrX^4j|XX6gAG!_|D`DL z(67Toz_l(RC<^Qfu2P?oElSszaryH8I^0l64({^dZV+t$KGF4g64Hvv&eii#Q@2)A z+~FqC?4z%yE1Rf8HR5Z(!JoqYq35<%d%K_)y|L+S)I)nBnGk$tv&*4T@(URpVbRe# z)jT9&rAnru!Uq+R@1bP_m`UgBL+`^_>jDHYB_&uE3uOZwGsWJTHs_Z<6>7tzv#~sx zpkT%Vi{hM+4*Ya-dEyvY4m3kS3>4uh-P*mfayaAc$e_>2xZAd1B+v4<1Eqor)78)@ zqs1zOZChwf$gYRsA$d1zqqK?Ka>uh(vD7tGS{%M=AqsSJHtv*~8!Vl-x>&RyPQ=uI zoH}_Sn*@ZB_8MHoM&?Q?77O?n7u2+yGs&kq(0{ zWv+R7%;rZowJj6*dGJ1(Ht+`|k`&-|H+;|9A5d2AH_=~ac#)WIwil~LKCP+Cb>oLf zh1qc%SHK*`h0Uf&;k~{KIp_<4##v2jD70?wF&dINGno6(6tmB`^Nxft3@jT~*r@I& zd2Uo_rtl>>8gXA9&&gKg8@V#w>W?U8qkLHO%7dm@!XJ&Mcr}&X;j;01gTk@sqIWTB#|xX`dXE~~ei&coS|X<0?Zk;2O?ZIp zLDNqR8_21?B2ec(XV6TF>&OUAS( z`}>)Gq|nIbVm}8tSbAs$H81oyBUoQfyf>3g1TzEoXF5Y8@WgeOx2Zl~_>JArg}H_s!3lMk&yWC;^L`${L`m)Q zL~1nSBN>VihZ?Fw@E64<7b<6_bk;;YbPx-DI1c6SecWO?K5In&V`!D$h((W0bNSo5 zL}FP>t>4dRTJguUU+|@nqLu7?ij-3Ud1_LGC$5-?=oYK0Q;0FwB~|)f0b6huC;}v3 zoMzlcIwhFiUu%7x>D%Z!2t>j|ETq7F_*`tLP5xguMN4^til0F6&r}ey%QeTAP@=SJ zSZN~|EYqd^xec-Cd*4Cvi`;yHV{sCJICKM{S(6qRM{oDth@TI!tlJ;`ayp*Inl%lJ zhty?NRI}4tUo)B6TdLd2-%s?bH@RGssToYeL>!Hih-}XI)!Fv8p}k{!>F1O68X_MB zg_EjXO~*ICTy%f+4l(=jH5G=`{a6QGi7#uycPJD_*W;5lKoeDN_x*twf?uyTJbsxL zj%MdfWD1%BpMw-_qs6* zYoxXQIT-7khpa>(fWX)){?x##XfiIL%5^{axi$7;%Xx$-zQZ5WP}YnWhP8OR=Vs)8GdRWgvj;Yk2bjYi z8M=6cNMA8?wyPD}D7so<)DWfD14aE5Sc*od5Oxo$njjMXdn0ME*GHFQ=zUak z3`6X1!AG0PfI|4d96q;b#;e6S8e*QP6O(Sb{gxK5W7;WLjaCG z3_J}iy2U#d?s0?r*H-rs$eymaITVBaE$%(Bc!@~Nc%rE?(PJ!HqO6 zuHR)1-MF;01hKMR8~LO*U@w_onT`|>d#_}FJ+2JBw9^OPdoh31-dy26DjfpUj=438 zd`<7E6xUY9l3%Ugw5BB|TdN!7xdeTyMc;9H*M%l~xq33c(W|XgT5dyn-+1^kzq#df zfL^40uZ?_1njKD<(=&K7==(Qw7IRKY@3>wc^p{%-Uwe*k;_9_Gf%D#}>b5Zz#>nF$@6X>z~<_g|7Zo0bZ>^@3nj%&Ksw5Mq=e)XOZ zf_)o*ynILHR)4bvL05@~aFf8kDIjD-ftbN?R|26GAW;bz+vQLxMIYz2pCT|L(gJ0m zgUCcGfNBJ!6hLW&sPJ1S#n%H;d}3*@Y%(wCG|$m99UHH@;cuK1199FvC1S6bV+YR8 zw6|D2HB?)-09$|+k&ce+3)WSw3)V+#No~tw>ix5;Y!!~`ZbcV7tI@0MnHGe~Nymz7 zrJwTE^2kzlR~(xQ%+0iS@nPL=F(7;hOkj4PIz&DCKBPXvKA=82KVCl_zX8wI=8jl+ z^p4zUtj$rw;A<415=UUgvUex{3Z}*aM zV8d(DM846qWb27XEFK-jkd0GGDLH#~MMa}bo?)x{k~HCQJ#hwXr-1Fe`Fn_vqrQ-^ zexre-66F%!MSGM^AX+_iGt3q1t_|iuSEk}FoaEc<4q{xUm4fy6H3rxam%B?fg*^12 zMoJaTvgot(6fs%7Pkxf9k+GabOu*afI6bUEkN;RGfF53eFd0h+maNE@fd6;H+{qQc>k! z(>txO+~f=gX==?J$6;s#SSYZvr>Dr87}KJsy}%#Cn7aQFivHLCrC8Zn|NKk%KP#F3 z0~BRo`15a6l!J}^U#KV(!ylOcNks|&H!Av1*&G7{AqO)nAsZvdzhlwAN&+$h^3(zj z=K5B&f>!#5mjC}O^uPHh!@u!QHYVnO*UtS9B>4B=wNGsS%|Dr#m6?*ErMFl>yB|0(`& zHUE?Sv*!OYnEz`3>zw{|?Eh^4j|cuQN&lmR`5%K~{l|O#hllyE*nbW5pK%rz*8dkY zGcx>VdFKBCH2;4;kN+T=V`cr{=`!2@K{Utse=nM2|BrZ?ij$nsSiOQxIe%0@zgnB}z3X zViUwad^&nlAjA~hgNisV3>Z*D-jt8pF9T}{H!@eRy;l;sVWRqYyi!%xUhH+@-|7>1 zGR+Cbp8Fy2eO~)Dr%9qBe5Z2^RX~_e% zy8=JOZo+u8|MNiBfxb1?4eq)HwL~jwT3By}+yS4P+m0(E6#90dK+8#>9fE!UNdKL_ z!Q^U;FA|&2vw6d$EiR+(qa4s>faz%nH=vPv!dE zJbyE{V~44_&)~**CW0QXYcCZCXL||Tt8Rur_o3tVF2)}0ijs|ch`*P6EEn;1MuLT5 zM;d-DhFFkV4@?`qSNzKPN%tKDN4_}zb!d2<`kDBdTZA=t9yurIgyVtzh2wb(#EqaE zcCxSRhS!5)I{wg!GN+ z8{RwkGe7}tMvN>Ggc@(~Iz0Z%0sM{3-48cthv=T=%^%ioSSzA(@4Q{q26@Q>uNBy* zv#s|||C=xunDYgN6$TMnGq^O^dw@Y9wI(tC^SE5BW1^E+vhY#nEcy)ZtYvCP9{=_a zoD!w*ll%wPZ6@O9Hq@_H`0ilmJZ;R>gT~u8{`509UYmYuzXZ13k6Xj4>)sK1pychr z9l>n)U&hY7flG0YW0tmgVVzT?pGl%zW4mRv7L(|78_SEgsTGTJ( zFGMd4t^r)&y>PYn!Cnlxhl-zeKAgTBKh)oj-;Vkjw;{LXWf8E$%?6#Xh~>RbDad!G_{0=rgf^)7;S_mqMYRvi^P_y=nI7M*Wr@DP>(7vG_b>{h zD{;0WcvnC;8jv@icq^fD_O^M5ZG&q2t$Dq-R0zAW_h4-3MY|&3H2N@9`}q95#~QZ) zGYl*k^p7Gh>ajbsPt?`m@HT?)oJqo%D2U$`N4x?nh2V#?WhjrY9H0%5)+Joqxx z+%c@ibONcy*Mi;s_*Iit0TebOxdmKvDqe=~R85#@e#c%xvlt=qfdh5YwhcL5a^!K* zr4JZo*?j_!XrDgOA^D9#C-WZPJj}o>MmE!3pbOd%=q@N7nAxE*g4DhKY*~}ec@>Xl z4LnRyns8SL;ItLd)PI5JkYFmqMI&0qG?Qm) zz8QUPI(jaCy~45oDIE1bUdF`5c6n#1t~YT}zkH;&ZgZIN)iUQ&UEfkQpjL@J_f#DU z88NJe3>h-KayxJPE#G4;-o>!IK0Z;X<_=1YBTq*afMXyO=omVrVee>Vc2RfaxPoYn z4-&gkQyzE_Xj<7#J?EkvSO8JH%6rwF&dM}=p!Tccm*}AztMxxJQX?5Sh zX7Ljet!4dhTJ0>!7PR!G#KiCrIf8hz1|KZl)G4irZeI0hf$(vN(ctSdX1Hq5hxAkh za6QFaq8Nj+7w7hhSznkP>k#|3(~VrhckyV1*R$|Gfq3(xR4SyhPQ0B%Cas$ zOtihOrmikZ2(`c85dd7b}&e*`NxJI_$)qz~N#jrKrOYtpyT!>Cmq$IcJ#s zsUzZ*@T54>^gwTp2*$2*oqrN&*#-!bXSUG>`{t^3`DpNQT6)~SqMoPDBM%s;dwdYr z#Gb2lxtlmB*ss#NTZJ`3x7MMWG9n=Z{vtUcC?E8rls+0ECBBbrH+2%G0V@IH;*sV% zu0!!sNnRNxUWtJCCJ9vx5e!q3Mh++pbOYh_g8aFKLzPyiIPW|c(;U4Ja|RSbP->Ry z0b1qaJIAv9{xOvsrKk&bW7t#Dh&#MnIw$1TL@i*SV4$(Dd!Ai0uii#>1==Rlp4Q03 z?g|!#;F^$8aU|g@9FY``7($5}RT<-EK~%zsY|}Krgjm|a1#}C%D+|IItsI!5d^~D( zI3U@g!W6AxcSRYI`to@RFkfs-kR|Efo>9SF6H(3f$Tjyd*aP`)$7R2}TK||jlhNT* zxo{xfc#GaJm)@dbVPND=y4J9650HI~lM1Q6O2K!~4q}gtw8wpk`smmEEs@b7>!d-! zx%ULm53?DRIHaw;(c2=Kw3}+G@AZ1k7nSiokda($I-&u{>7L)z_z1E^5IzdxVhAxU9yv*+%HdtpZglLb^&fl{^6Db`q@M2vu4kNY!7l_u= zBBM-}D6N_w*_Lx>bdeU&`%_lR7PAQ`mUvZu%RgxmU%}2(zDqAwt#Q{sFAF@ge}($q zfc0dp$$c+P)F$vs{HCL2!gwox6npi!EmmUoNQD7;Y+8*OU6+^wpadvu#VQT-Bm9CC z2OR~P(E=+oXR`BcY&p^?o4hMI5UZBmMYhPZtXw=lFS!1NU8 z?fBmG2c>N#6$>`eg1X_sX-#}HA{w&_#?z2ScQiu92d|AH`Gt-?2u|d4XRSmP!>XQ} zKcSHA{gH=mW+J1oy;g)_v(r3jfA=zAfwz<^1kELG=6sPYX(RM$!rq&1`oulI1lDx! zRMGs>=MSosLSf8%vLy(4OGzNNE?X9}X3^${;RPOo45a@Ra2JSviDVqMFUrXi@Y#W2 znT;=$+!qB}#|boBY8z&S;rm^5a7!A`d&aa&L+xc4$}Ce9+jNR-bjGQ@Xt)*od6sT% zKw~5#pyU#l_Kb5H@>S=i$G{|Z8R>41*DldH?lnzDnSf3z)O~W2je(7uewv-aM$63G zz^{=v{iu`CO1OlpE>VM&YN?uWG2~esy=>W!IM%t}xvo29=jxnF<)YBl5gQP1;6GzS z=|nH0WUp<<3_-^sfCHn`J&Y_I*I$yNWZII^Rt~Op4g82WxUhQK%>7mQ{`Q5BB+j6t zmGP+YUE%Y!rNXE~6P}3P)$INjV|+5@YdN_=eY5#+SfMP(>porakTIs2HfqYtah$tXA0X^+ z7vbj|psT8WrMylaRBqE^8uKSQa6q*slYw~x^V|RqoN9w;q6SwE(|4dlFYxG>L((b9 zF6QgEFqFBcJx>oZ$H005NJmi?->SWprBEJ1XZe$bpiFr|n8_FN>DL&Mc&EBW?= z{So7LMWYJZx5w+nqWQ*oe`#EvHTWx_isrY?B$P+@K51Y?!p1br&T53QKzSbpsys6M z94rjX=~_S;>BOV2>Fyjo2VAxdZzI7PtzRyVD6Kn@j7#F5NoF(3rkKL8TO^ zEpT&r)xpU)HmVRhzTU;PHoOt1x^N8{_nMTXJW-EfC&}fgz^dZY@}2CmI;)cl3!bwl zrKx`NjI-#3b93`fy*FhkFsM9=jmE-i+8DLuGRWx1OKmyCyr~KDBM2O+6IH>GRH=mo z;oX?`j?I=6z!`CuXZz;obvfKIclG7ADZn(Br_;w|l;wjjyKxr-vFZii>!;GRl>2F* zkZt;O@^a^J%Cw8Xh%6YVv1(CJAk%>mQzQ+>QZf{8lez}G#0I_0qP8o5Qg@D;>XC6j z1RqYI6t%JJb+m}|h@_iaUE*riU-Dfjry~U7&t-OB|BPytD!23Uw-R56JVFX|$PT7O z70YY>HSFdj$)?*+@v_$r&Ck(@$EqGbUo;oK_3#F)m0M%qYU}1r@QC1=CF9vk~{bzm>}L`o3G@T)k4gzW;%yZvQlOVbey`asiNXnacR?!vd$@08~J$zuu1j zUNJ>o$^Wwo3|p51b11R?#iRJx{_g#r_-@%@$Lrd2CzbQymqns|NGbqehd#@@t##~* zJ#d@h7iMz{_srprH3ACHv_`w*)(X&3eRE+v;Si9&`W&!eF@;wybuVFo5jA)C~zE=DO%PMyJZvlRW=!S?4!}iC;=yvi&|~ z(1HYX67J!ujVI)MF(ZDL$68_z(%(<88W=St#>MTd=d#_>T)|n>=889Za zi@j00p^@F=VU=w|aq+lMY2~@X5V-+W*9@WBUU|Q7GZQ^NQiC%V*z0zb+~NeE^Nrd1 zvE&|G-0Ekrv(*eFYzr~BLeK3F*R<+##r6mBCv1wEpUZ;u9chZXqaKxz2Cbc8ipGxA zYC#6%L1XK7_H&V3%g>SeCz{U_FcmCN^PL9o_@8ee zt`S)ABvj(%2Q40ScYdDaGGOHOPV4x_v8v!6jK>t@jC@o2;i+dyE)03%Wcihqiw^Q6m81;p;$|tk+L|$XU^$##~0v;lv?^%Q&;mYlih0-uXTiP=yj8K5xc03(#W7=-x)D3XH+(8{4D*L ze=Zi^a@yX~$tt4xpY)eZ7LcCFr-*2SxF&f7k_#y@NWAp_9s)67~rDu=Rq=0NW4p6TshPH+Ft0+#m98XF53VabD?EgEAvt+;?8ZMKabB z;|o19w%)tb?EAynzZO6fV+A0OvZ4j5?TlvQP+y1j1J%-5Z)Dpiqm@CJi9DdfJ&9nq zMNXwbBa2b`ikE)7J*)X>?TY=WH&?T7l3e{b`12{~0hJ!XcHO?;qKTWHp7^GvhQMpU z>tVSf&B&Ll2Pqbg8t9`hS6YmDZaM{arjgQ%y%pCByhXu1&0})8w;rV$Ep%%3&G)cH zC)dNpmrIQ?xp_3Nwr6M9a1+oqp5HzY@L9>->UMp=+I}5rGaQ>xeeJ5Hb10-gX&USv z=O62m1Yn4o>#Uk#L_Q|j2FZ>@y^Tm_o)sF$9AVeO6dy67xoBc_DAPM;9#yr)7HI}w z9?j-m!n50aAU_8!`s)Ub5a!j@7PO?~DOvG;2mD*&LptH)VGcjZcEi==y*1aRWT(>? z2fyp4w#{HpO8LX*?vP>;-KXU_J{J1y<7zzh&e-=ImAjF|_Ho;5W$?`Q#*6ps=p7?1 zt5DZJOAefa&EF$;J-J?xTP@}o!w;;z8U$rr-W(i*k+5jU?4_h^DiyYYMCtP(?KKqk zp&FA3w7yEpE`YzA zonmrlnJ$o*r(8~Kn>e?^5`83vRN`HM?jAu-j)%-aLvdkk*F#_Q*;U*1%;-A;p7U&R zVXjQ?@5|{)zMuWa{x7+rMY);N7ptEhpK~?QpQ-svwHTB4JXk#BiC@;J(SrV@czhY> zbVe{e0Z3SY1w+#O`^SP z6MhtYpwBYoU(4U29vc}48>WCiUybLLfhA96KC$lv&K>S$9*e%q-qbI9<#H01D{2}y z{ z=ji@w;T0vLF;thYHm&zT%p0i7Vc_bzo&L<}acu13GhWZ$Q=9CjF)W+0qT_t#jS%Xc z*kG*0zmc1^<^Xf=>S`;Jp?GD1P#)6-kRe=%y~Go|TwVMM?$(Y?EayWY;p!A+;Oqjc zWZ{QI=x&d^kCdnIJn>^nZ|rWYSYLa-KCqhf;Mi~*SUbjG-_TpNpP7WO$Yd23_GE^^xSNG)fK_-Tm!fNtt9Mc>Bc*puO z|JF~`wJPMgqP*T%!dq1_h7$Go@3U&V?z)%^UsFBn0|y)E`l+bg`m&Wncw3Yf-L}!@ zAv&7HGuJwE9;eNyzUBd}w1`ASMb^?flP-hR3`~k<39Q!)Q}<-}Lmy&c)9K5IA>W1W+na2h1xH-r_1 z+-iw%+s~R^)@yn_ny-l!pQQs$h|pz0SMiIitb)jdvwQ z(Yh2I!W^|Wzi^P#sVoqrT`A%z@plp|D!Qa}i*U>FYKG}Q_6p;QJ9`b{DN1|dVp#jH zplzj=6o*~e5>jd-*?PaHwDWS-HOV=SAZ@(`tX z;LCcb#TMLJu))!!u5EMa#6|4q&{a+Y-N>-tAL7EtsTY<{JD|Uxkl&#aFNP_iU{+AC z1%2A<2byQ%Scu1*MSWK=853}b*X}6~a8o_#*M_WCya5ic-N2te$B=Y7)+#*t_`v#Ua!m?7SNxuiY;1^C`#03W`A%CFz~)_{vQo3uw(Sm`VSqg0Q$=V zME{$};FHC~*5XnqPdOjglXk#sJ-%ZKM_9EZ3x6a0XnUtAu^YZ zUOnQ3zxLcCU(A7N2l%j7uRMl_!9n_=!jCqt8MYaKxwu8r3bgcO9OPbP;iVB}5pAg$l)qIh2^Byl%5LasFt}CAdKx zYN!wQGazvAgP!q;s~+ruEp9?2rb!#cUdY+mAHK-MMg%F34n#;HB4R`7YACUAQKOK$ z4S1D#Z+?_{t-$aBIQi`0EU>|PYUiwVV({i(pL>K1w(4+Qy>k!t?`r~$a>F`76&QF; z(A}HSU7itSYp{#ys6o|$HA+~~);mLAU7Ja%{mDds)DoCPeN8O-0Ae%o1p@7a6IYfz>Evr1%P~P3x#; zh44{!OF0A!*ThYsNje6z8wNYpD~cb&jBDj56%6P%DVdN;i9@SqoZ704hLVP;$VSV= z$VqBdOtYc49lx4Ds#>UGt7fQbrl!)!R2?l_vf*4zZ&cw()yQocTQRd8qZu*q-xL&4 zB*0OR>i})Y*VcvJtgwZf1Ug`KtBTsh#EB2sKGIRj>;~;(ls(z)vx0Xg2Y~R6R_RP! zm0Jdob($OK7f#5YVAOk3NNR~$i!wyiT+bit!OE;3#K=3TCT0=cA9K+SKE!}Tq@0#d zf~aHF2O< zkZL;Z=@@;HvazDYUQ%Hpu$HGiNzd2jw3aICRf_nC=&4R~ZL)zR4jhMD&&*kzO|ymN zNUSj%&LB<2F(u%RG2>yayNb<(&dSJ#yqG4)YS`Pv^| zbqqN^`1){obbK&?QBp**Z$mNL8XiF};gExJ<{}5}n0X51k7vBw{QG#6;YW?n{F(l_ z_Sw;g1WU0#!%+dC=7Kc95N;u>v1F52cCX%do+jM9L0Tc>j#~X?^h;4DyRfRHO7TDs zWcj369tA>mq#tCeQXe5E({`JU+WY>BugF)c%l5TVwYO7q)zji5^h_~!GbWn8ouSmF ztLb9jdsWPwR8W@<&aCL*t<%_;a1`jzhb~+5X9X`@Yr{Nj!#I42rP?vWUnbs&eUFMOww1(k&Oe!d_Yb-D06u zlpX<*+7b(LAiI8bc94~bGFptEUHiJkoQjiiS9OgF@Zo`WOTM`W+&@ltaa>SDk6{4} z_ebvpnuf$Bro-n4ReABdHiONzWmp~=OVFdOeA`PBLN87aSjpu4J)`M}emqW?6l6lZ z#C360wAF?FO0X&wPSU+|5#01Ld{Ya zR;yP;Y_yK}H>fVj13R`~u`#0YJZ41L-|bf%jfmK&c&q>w#W=Suid>yOdt>*sXYQn9 zPPS>;`|YUYDTF0)hrpZ?`?c;w{=d_TI7=vvekpgF9zvd&EL!p_$E+|_pCRnK_jgBi zR^Hq6w|4*dc;ql&UlVNiZn&$Od*Is`-dNOucEu$KN0R&w;wd21ySL1d5@&7#@`3W+ zVVd}2Uh@6y?FPdDD77E3h_ummKYqR3S)aMPMi#p&Mmg&o!}3n#22aS-o>{9>hWy26 z960KZx_7Y4ySE?#ofJ!A!;(3Ah;~1k_Fl%Z^xQh><@+p(S51jTO={pq*YMzeR9d^9 zdocbGf}H$LdeKkk9*Tu6J91GRzIXG%{#BO$&J~^l0~*|~B;xLjr>n{kz}ITfu$h)Y zGAl*9vT{~?#)rvQwAl=xo6<}s1Ni%h^z1(BM0&*Q%uA{UULdRp)kI0TjWtg{RYy9W ztn$kszk1CPB zO89GjSdU1Nj$!OJPnMd55sJP8lhsIq++YWoXF)XYKuUeCeqN`paia|2TFm>EwBGRl zu=kEZqCQEYciXo6boXi7wr$(SY1_7K+qP}nwv9Xg*_qvW7ZLm3&o?47vZ|h}s;qh{ zzy7kIY%|vB`W>xgqvisS+@Om9H;0cJ60I$7OON_vNhyURV8s-1nfCqR-t(J}Yb-1t zIupiOib-tJU=<-~0=0 zI^)BR;pbg^AiMj|WBMFV3L=eoY048%Lmly|{e+muu$yTmoAdoJBls@-M83*e>9|7% zEsn!6>ZGk2G=sL-0V5fHP4mr&zfCd(bH5zF8JQLJ@1UTex$;x?xuGCzs3E^?cOS1; z&!4wFlD4r_1C}>hsF@U6=Hv8~H(F>HlbuSmaD|xc_F(@Wbg7kUwm5)z| zSW=p7J2;e+h&-b|=syKTnr<{YzsZnLi7StVwKZxFV}q%umeZS-ux=u;%%mim^jLNs z2v2fwCWN;#6KSHNeH%`(ll&#d<*hNDRS8JELrt?BP*Z*t0t5T6M{3^DPonRGae+Cc zI`1f1<=Kr-mjDH))#@#~8Nj2WO$LH4(7`0pJD25jV}YM})WviIg+K+bWG{m%w5ciZ zj-UGz0c3k~jJ6BDo>V*7EB6AlQ1Md>>uqlOCiW6E%5}CT0_QGfo%wq3&NUl-3~gv! zKDy9$*ZL~SwmZBr#%OncV(Qzj^ju>&j9f@A>=f^KA=rAF&r^eMvptRjnxK!EbnkNX znFQS}TG>c6U1%U@U=`=B4uuMKl9r42k=5v{X8&GzmaP1WpB4Z{v+fxz{OsMRVNziDq{HT4kV^p#PUXP5qHe z$@~0+<@RN^MC#=;D5#81c{NVIylWn_aFA_)H+B(&XiUy9)mG>c$f^EM*j?Fc+mEQ{ zrtu!vbdfsAX(34)A{lWBXa$`_>r|jIuD#)ebw|cl#a3>n5(y5flSk=wtNMs=(h{`- zq&;Jj6XP!l@@r@L@D7JRGOR&SCvw-VDQ*%v@o*9$MUjJwXi;%&WxioJ4ND4sMB$Ov zm6q{p@V|qg%154Y`YbS))|M2n)Ud3+<{`hhbB@ ze%4)Ra(YC_TT?t+;zUaPtjO5+-Ibo#Eia_Ps_k8`;vC&GxnCo0<646(>o@V1IxF)}=#EU1P&si%3&A zz#eAAytQt+P~D7x{$5duG)6;SGyR8RIY3cYRgP9Vq5b zNV3I}FT^^U;mD%=#-eP-WWp$c*_^ihcZq?_?JOxOeGMQwvAXEEc4Nza2Dff;&ro+y zcYyZmBKmnWw(0iz6Ch>@e5&U|IqBVDFOhXC!em$U#5{hHPp!em^YoBQ4KCNq9~089 z-od4QO)_8Dj@}YIMkUO1N+Gg(DaPNR*oF0UfC02_PdPJi zQv8mkm*?loholab4-G7ORiu zCaZDbxesA=dpNrT zwkpm2YXl@;r&ogCg@}0*b@Pb5Q13XZdTzL^Q*G;+gfl9>O1~**oJ2bFA1hzgi%wE( zN>{ZAo@mc^D)J0cSt`xUYQlt(J*E;&(55bzwCdXT1LkSNyTg1m&*5H&I-Tpgs;JJB z)N~DodY?+T$1E28;QTaaWvZJ$Am>WU;Haa|%Xw=kkpO!h%2XsF!AxXkca7)f-^ zSW*phD-1adgUM~D4BnX%-i}EcZ2l%DWXg4wp;)bpr+8r3t|d?SEY%mMkm*l8iNyW$ z)?O@^+eo?QP%t9N{@Vy6^Pm>?0ioM?$2QX}RXe-Jsyir-dq-71?9OZWwjO)qBc?yb z54PRwkFQG=%{(4Q;Z=(L2S{Hg(pA=7pesJEw8Jgi9q)^uH}KW2>6AZ)Ba*h?&q+H9 zxEdh{q7N9JuEThT;C(Z|_?aBEFh-=WSTW$prX z74NF1D4ThDycfowERs0nhL-roega$2tda!!uQHGe7bwS~4OZUx#$f^-7*R)W6>E(@ z$Q^5TTV`ldkV-E#Hc$8u2}9pg-zq-CGaq5Jdy&hUav_F}B&smKPayWyGkGs6f6TyB zlkeLAJv63a!Prs}5Q~!o`=;mI21cGS;Pu{4nUpr;Ikp*}FMi*yaK^^EKS*(E=Sxbo z3UT|xVm>0xNhLBvB(7sFx*+Lp{b4mMNIlV6ah4vr*Nw62@a$XNI0r=Yc2Qj@fOnK8 z)m+wQ-g~a-$Og~qgv3yu8Ga*n?ClmilhvdXS1>~>Rc}mUEE%OYL@XRj zgy<+Cqm1WVpKmTC4TP$@k({l$*;Cu>qq(&961m&+d4TWJYLQ?$sQuZPkns|eF8qXQ z84(I zwJIY^9@U9!8Bisv2Oho(_yNX7c;DF@(KK$S7qqIGm9NvMUG3fLMJN#y!A3(;6sScC zCx;bDFG93KCKHF1RPmP7PjZBMC;Qp4FMlU_wzCg!pDn5k8hsE(CJ|0J5KTA%DgG!P zKYHgWAm`&;rS_3Pq(ppoQ;{F1KowrA) zP(A3)sn*RyG}5{m-PoaFjm-&KqG&ZXKJ{!>UI|?4a&@mHBgR?HDZfGAgJZ*L#r|NE zY0S5K{DC0GI0t|G_+hC571wzKv5?iLi(4TD7sAZZ;FqJA?;536&>tMh+`QK^+J%QZ zN&KP~Ey_#oCmu;wIv3xFQb-T7!*mGa@^hDn93_`8$4cFRg5on z12TLrhEPHMg8lk__`ns0K&oU^Xe!W{e&CkXNYnJUkK&WFCxG>C5PNWTOyaVZKVP!T zJUt;zF0NO*^z6{X_IW>2B&-;*P1IO(A9*;2!$L}o3`G=2r21s;@ zI6V>z@X;sr;?XC^m0xRkMVL#F-()^YZ<@OcskhN~gd#xpRMj9v^g##vpz`!F0#J|< zcXp!+@Wi*lgU2A^zPJv=EUk4JraYRlZ@nV2uMD;82B1<3;)%nYI}J{JH1tSC z7MvPISBph^;hoz>7&lmFYqxE9qQZ7mxrlGSS`+|Fb ztlAMTsxhOl*Z$a^y}W)Ny`bnkyw_x}W9B$7@9Q>8r#XG6`+449&n?hq*Sl<7S1a7_ z7A=5pf0?at8;yjc8s2m?Tzugizr!33#nd!+0g<|osZ?ye2YzgNL~`z-x>?v?@aw5) zyy{%Y-HOp69~#!r96fjdIOxyWmIh0@B!OT~LorMi(Kr4jP6gCaaO&((+Zw=DWA3n08Y5|W};r4tBnbI8Au+V(-cSzysBfVK;al9+_ zR&}8!wxrc`eb%;hHg+frG3wrx^os$5+5_!)Se2rr#bwsh0aP9@YD6(0<%-9e4~aM# zPZ$z;L;90VrK$q$|j2l zdLUqvPbc3c*OQn*J*h&ww8WQ~vZ=@9NsM^>C6xM0Y%7707;Sb84A=osO=Z*s8rM+9 zoTVTXmBY$bJik3AFwRJvJ}luK4~&vOCMI_egsej%_BubhCWM?Rf;FG)fDW3-=qXwK z*Wf&59BfP>m|t$UK9(4dqs?XAnEqmtmW`p6@IxeTJR!e~EpR=op1)mF!+m{PFK$dOK zgDKwc>!=k>_?4oQJKvmZz;!PkAf>^e_38V6D7(L5gN2O=}g^3eQM-dK1$SJ6?xj%q2Y= zF;?*N_6CG3yLO2p>giyY6n$INvisi%?>BJ|TD_a+h;%J7(5X4EGrsKD^FWMaK*vD? zmI1Ggp>8yK-#L5sXtXXXPm#$U4#7(~Ck2cd2}L&5;6KaU9JkeNthnhuZ+jKR+kb*T z?v5z4y$#mpug={1BQ8dwI+z`9h|UsPGI?t+e!rahec5(C3}4*H<7H=LkKh90X^@3~ zY_wSZ79I}>7!|8mK*zqv5+D-9hGId7SlT`p6YN8{i5&&G2^^KWnG|#AJNIuHa^cDe z(>>P(tbES4pH82xzH_0M_jf$>6P7nYjD?zU4((8{MB2R;C*rVuKq zBx#n~uwqfo@C1YwL7}@&qr%X41}Bn2i=o>|GhbDa`uaYJ`P;;cQ)q6Hf`#6zb zMk=15f+MJ73p{k`twC;@pk?C*y3-}B)E>F;nZ{W3-&!+s{jnO|Yh1Mue&bHik@D#{ zt+Mo9xwliDW28*x>9&45iYYunbelEv1WRTqsqy)I#s_zp!DGAKP~Gu_umFpTbi*8$ydY@MPvq&FP)lOS#M6PexUz@3a}>%Zy|$MiEmUXBkzaiFT_?LFxF( z`TDRKeCfKnp4$qY#K;P!#6j1+1bhr;OGvV7Renfn~-i2TDH8x0Tu|9A{;yqS=wcC zOJ|VIDwbX-!F)J+8~1eTX3@>DZ6w~1kWMdGoUia1Q)-gWNXk@hrs}RVavGyu1b^%p zzbq$FU_Dx zA#qHCABlJCbQbYW4ZaN*M77E!SVX`=PRCnE`h1o(R%tQC%bo+%# zb#DD}dW0q|-h4}7_gWjIuJa?4)3Y8H+_AZYkwZ`YGw&IXKb7EW%9jpG#xns*z|+u` zIOO>VQ$-g!KuoZKU3o2PTVwQRBe$U#3)x^N7h>o%D-WZKau8<}A;L3ceJqHxFy6k^ zNwx7>j-95&HqRyTq#kv`p&cryW_5Gxp3XyA-rUW}p(onAFmLDFyAVHWHzhYWz$0yT z2!|rTtprp9P{Xb}4S|wA4Ut9tX;N)j;?ry-^-53uV$II*ZZFdV`#b}7At2v$ivH`D zA7}<~K?Cq!nUbW161>&q@Zf3*w8knQ+mpFjJjNDV!QNV*9iP0j`Hg?;ZiQGob<9x{ zTit4?aI6A}aP2I%3MkJiwfzuLDVxoyJuS2UgaoRx)E%Od*^y#rQhs-RgTdMLQ5m!4 zaxNZ8*sx!EyJ>g|iR8>L=A|!7pJY!k-gJiv!aP{c$&4C}rhJmS2vwFSb`QR{EaYnM zKjj_Dx*WDko;^Jb_5+eHQrR!#OW->rrXuK6Y21gCu5@#@gXwbvs>!Iu(_QEByRYU4 zmIrg5H5v*|&*kQd`0cxxJ z6plNYCK^Mf7}(i?(Twq2N|@_Z)X6H6*uU`rz1OLlByi^m#Es52*0`<@q{4rvXAXne z;Py~yj+!|Cj1~qEGOqtDAjqQSvac$vOCA^ey6*9s_F=2IEMU-nT9&ss;xxB`X}Z5I zr(hApkW(Stg~^{o1ahIyxS6tV3q|GW`QDeLv}x5psn*_BQtwL+scbOel``25FOpnn z*;;>!kVn-&J_(@a6zE9{AGze$=XeLf;|g>8Vsd&-)jqmYF6nF)dVY7he6rM=-r^%s zI+6teUaW#(%pvaWO!5s0I_Xf91)B5)Z~sd4rNu6t5eWjGyn~VB9m;(i1+fza02c{S z*Ya&A+cVU!XX|9&#F`F#tId{c?|^$(PENHKW6!^psJ{4HKiW!3!??~YnQ3@`W>QpM zO->CHmxG##FQA9lMI;wqUmfVlX^s3MS4e-`9fSt|#oEJ@ToiZNWa;PKc)BI+rWC#X7kja;?d%AS)EwM&CzLZ^-! z!dAs*8BYM7imuR%_{P%8?9C$lEa&;kDe}{Aj%pP?hs9s_6~>`5P51#;%7|7mJsJS| zWz$|ipzDGe(PVPX(#emZsi;Mbxg!{*MN0ajVZTnXq!HffKpXvz_|EyDlv$YQOhhg< zl;e*A^WRZ~g>eV~WIQnhg_V4%>!pxkh?Vyc&?uZL(I=X%Id^XQX?sNH+U^g=@$Z%^yfo9(m5uRmUhtZDQ{Pq5GhC3IV{Ai zvc^PyD`flHK0^li7;fqAF+D1X5JLVKWw76+qyVhr#`sBKHtGC-{FtJPT@Bs z_2*kqrr!+KUY$Tmmb=NTb{Yslx`E)`&w6K5ywC(Sds#k8($UcIHbDv&R18kbIzIVGhP zWlQV;C|$G(=uqxVY!&eOwZvDgAH35vYHnVUUhEq0+OBF>#w(1gAJCtaEwnM%ZDw%loEL|0iJs310NB+XeE#DPAR>u` zqMX#HDo@>lZS^^t1#}N!gQ-6wFRgmnVj~_cZWBXFEXKnhtJQlFxOa~kED6>^S~Skn ziVL~b?hld7)oIo4l+ssz0;nltDyw*Om+E*ObIz%cnJSZ^ZEYvQ>D{klXsFaF)|GsG z953F?FdT*6R^zlFbS~a(0@<226v-}EL+ZSTyp8ODK?N1XvAu`_Vg>wDn$8T$d$C-# zxyX1TDI|5XY1L(;B%8$P1+36EZG4rYrNXUkmPSLQ2~8?x&S>Bs*%`|Y)cOozZw%Lz z$73=H%rI{6tiF9cx_l04#d4H)h4du{heMW5SKky~L_L;9v{97mu$YkbCQ=fMvkq&A zkPZ8MJ_}a{@3jxd!k2ZvzYeGDoWbbP9{?;YSa;q$R?N)j`xwSEGJ;S?p!A(d1g74HL zLvzvo5(R8DJqABou3ZAhplK+e`v_mljP`BWOgqk4M{+NO7-r@xl@61Vkwi|Cd?^VL zcOnJP5+P_MHGqd*o?&5g$U2^(^^%4w5VA_prB6|ORRisyLp%ea$?Tfj47O7}mXr`ME&pxyIrOgdbhs$F5I15C2J4INh!%g9Ppl|3 z$X6~Q#3Gvj1&Tq~9=7Tr6qjHm+?QWETj;=NJX?Xi$^EIjk)hJ_0~3+Nydr<1HQGgfXkDmZLGkxhA!p^E>?+U0U7Ex_x~;#_UPjA#3t* zQGFm7%C<`@2Q`94m99so;Boo>;&Go37aV$PM_$Ra&JE1XskOCKrmmokT(V3AO~9B) zWcEx6)a*r3awNP}!D=6SKI8j&6mu?oaQbE5WnYu$Q%~<*QXzPO7v{!6W@)T(`w84r z$FLo8T{#hN#0!`KY4~S)T&(+?kv%FRSSqG8OlQMzm`O9n*qB%;4ax@t4i6%Ps$GAY zDjEmY{q^Y}O8kztI#bug$)PUT9o;tSu1@C$zi+wmG zOsJXqOOgwt%yB#b!c}Btk=-c7bI$X%6CfI^-Odbi%UE2^AyO}$hXmQqp3^qS=mmL* zN!bRA^@i^FUXjyLON<My-YxN?WZm}e4(e2o4HP(W})5zHHpc}1J zb+R})&#L0`O+eVd21hi{4?7p<&7s&a1bJ`JXuFqLOY^@seL2a^&VoL8q)^d|dCVns z-JQjAloKizQn<{Ml7!Gw-#pb@A5bPA=)8qe*rIDp`Z1`ZL&F)XpN#Yn~#lj@d>TuIW% zXH={ECk`tTHE*Ntr^ex5*}?)3e_s=qByzmbzj0H^Tf0qv$ZZ5<>n)) zD^-P}U z=lQx{DB7X$8jmHbx0<&-o04v{FwygYZEh|>lNw{C|0yL^)ac*tJ|ROTCyz_u+!;MC zn%%xEz$GCTaDEtah~p4`7M(7jbsFZUO)Eip2?G=Lt;!|7U}( zpIS83JHizDBb7WVVV2EFvFiy|dOg=cv3!%3D;1Aa`{j!{G#7G{cTCAOS%e7SxiLgw zL*P*JOp}(K3imlaV4k1WP27DsNuc z+PxKi+ArDB`SC?&xVP+Qh4WJ|gelO&{`&NN$hw*chj+i3jIWN8jHjP?B8HD0sOPBG(Tt6G zD^hy$S-ZOUuO9bRuX**eIkVaz@6F`udNAjlv9By5!jqr0UpILXql#vzn&-2MwcOav z9&bfvNK_&EWg*54RQhTry=~l&9N(CYsWknEQYp6->A({;fn%ro-^h)q<1zirw096o z{oL3;vWBYI8;efCI}TQt8G(8uprq0`x}1Mt2L0%eO@1+bmkI&}lf?2JFcJG9gem-< z#o-gc(ps)VGZSADuQWu}|12$6QMSFLaR5@NH=(o~mRNF<%5Rig#;PjU1>Xm2$^RKafG@~|KQrA;DZqtZ1#|Ti_T26^;T2F1?&R-ouoci!L2Npwl>(Ve?;Z<;^RDRAf7 zd}vdxvA8AgW@PU83PC%I*eUzsu&aZqiYn97PYExp1 zJTS|16RNss=2~teK=_(d+<39NWJ1%)-xRpxNd>o}r%yTL96Z^-)}R{xy)D`7oB4{C ztVrA@PE7kYDhvGwR7(o5yny(0fB|aWUc-+bYED8!P#PtVjd?*MQk$}>;3+W|wlNN` zfW@Ljx-pHTG@&{7CPopRxGW<(7tcN3{ml9uc22B>TEm#42=fXIIE8p>ORZ!95q;j@w7EybNDj3lNn3MPL3ohst>fbMsq`BD< zGza)`aC##B>wxgHaF2i=0MMNkx7G1roe-J8j=la2s`AGa<5IvWeie-{p#WFD{k&oY zX;eM&&m)Va2|Y8k`cM_0GoLZ>v=1)CKVd)o_a1suHat^1(jCg-Xaq83hTt20PoXn= zJrl1u7Bm|Dq;y;qR@?|+fByxww~#tX+hrVbW1#87YidX4?+W)7jyidxHq84zC=QcE zkv>mEw|c?c1KxOdIp4(b{jaiJAhH-gvN<87kw3HYuKlksIKHHjJ|{MRYj$|-K_1v% z1cE0VnfhF4mIkk9n`DtT%iTDcKMTm(@p~Fn4QXRWNs11AbOnK*+}3s+`JlctBv! zVw>WSNQ|eV#QSP~)!ji;NxkC{~S?MBL<~`37T4b+#6!*Id^viEePqUo3TBd1`wn&c5IE-fPeOo=RYDXna>a z?4&REKIEwGR?Sh4b(qUB&ixaU7~Q5)ZYv{sCJ!=QxHRA|vV`BEu~?$bKo<*dB}sr< zSC;X$WkGo!(cxSghjNaiJWy?Yp5AE@M8;T7BZv;<)`FI$eHkC6(qSB=DWKj=sbI=& zeO2GA?qde4aZ#yLVNunnqIN?rDwltu4l{41{M znB^jmPoSllcaFJ#wd}XO)3;W#ys2vPkFUkbqKoqf_+;I~7a(kw>DK(~2xOx=cmytZL6 ziF1it!ze5BP{No{vUL*2X61G;9OH5GBDu{y1g;y3i;fFPO$EQ(si%J~C0Q<3Sp_*+ zEC(ZUdt71-JJ0@uxO7>Ff*XLSm~{Y^%0H|M(a& zF^vihv1U)gB6j@2%kL3mNs{NR;iMImoy;Yaoj{V?9~)qLE+rGJgfDJ`w4(0wW58Tl zUN=3}wCbx{SCRLG;djaJZrra95L^7&geBlVT|FGvnC6#me66B^*cAsviwm1;%=5^Y zp(WTvQBzAB2V+u_9)hRc&CxrS6?tEPNlg*sSVEfAdEkM9gqwuxP+`pi`Blkc5mph0 zIJP%f@?^<_iVcS_v=oD$R~5G;hB6=BBSPohU+vL28y`Qgj=I0+<*)Zg^p`=v^7mqp0lHD(dcKQPe zzV3|p^z_}cf=20%)`n)lDo~iuZ-vQ3EAp4rna#1;qzoPrBn^T~)d5IOEfaKDf9i(~ zo@5Q}dJixT>(B0blB0-E!HslDM#F`S_5evhw!imzbpNsDzoSO~HvaDj zR0am9f1mdcB?ZU;7@I=BWNqG>VMyxW0Bn$-NYO_rWC9mA&5*4cw zl?|pRLwOA>k{gd1DFCSAlDZ3PhY3-huO^4|$KM=&Cg{VTg1JsCPnmk|wRJM@V z?biKv)NAAxsx|4~*M#$1^gd%r5y$H(QiKX$u`XI}Q|E6D$5Er8T`^=eZhf6?SGv`+ zs)(qcxcB9tdWBKTS%mh1{2%C48h^f&Ii+E9OZ;rQOzuz}MAysdk`L%-iO{CHyu-$- zHXz>(XRj?!Xwp}BKZ8B^;Kkg>_KzqBxrW3JsQ|d$#_HW9tAF+^2l#ab6W#G${SUnl zqhTI1F9jJBGJk$@Xw)eR?aM}R?q^aDGro;yPzseK2FgPj$R4P|(x{At(}dTIB=7BG zn-$=v@>x&mEIP=PQ))8!EKkAK!QH{RMQY9!hS1z)BavoiP3q)vP_7J!T6iM2S&Co| ziX#Hb#aF<$k$0^NVI9>zb-rSG^1~MS@yR#Ln;4+tmmULCiy}$Dsg$$cvU4*a!fXYI&k$H{_^Wlo(lsX zBF)cvPSBo2mko7v7ivMhSKj|!CG-)MpLku!IYgE&m{I}n>w?^Le?mD~pTse!x#|Kw z&u@&h&g-{@hxVp6qQ6d>tk7YA#5xBsG$c-}ST|8;M*7_D$FiWZ#X&E#S>`ZX63G`5 zsQRViMRy0d2W0b=+7Q5H(eruAXkJ8vPZ@U)cTTqovoLhgu5cIWiYwM~aoG-67plX* zqo1$+te`M=Ewg20OzlK=a~{lp!%-WOF^KiVuU%rpQ|fqm=v=4F3f>IpYn8ML`)CvUx}cD|T+QQ~ zL^EtkK9A*AV@6P`$rpi&tR4Q)Yf)#x87q+_rXN|vH!f)TD0v2|QSFhE?9h#AR#n{8 z8~#UwGnCo7D1&^{jOkPv=XX*owKm7q=X3QiwC0xWiOv4! zE1FYxH?qr|*z+(-5=?*LN|}=L>46|(Jr1|yqa54Dd7TAbg=x10@I=z5AMaob2IJ57 z6N8|>LF5ED_+nBoO_qe2iJ^8l_m{8Y8TELcjwuzdd3lfU~mr?Z$*C=|M8|-nQ<;HR+Mnei}8|1!(~$(3&q7n1m0D{Ahr&yrHnjY zRe2@EYbRJilbS1V5~}i3|GA`6BAL21m|-yhwMv^Pd(YRvNy#`NJEtUbRV%^7yj(eG zgp2n*JYxH6e=JO|8&~CYZsTATVrQDKT19K`b^mr*LUy-VR*cWETc`G# zaI1!CiPF~R4!48Rs*DdOr zhtxDfin3k#vmFOuk&nnjRcn*x z#bZvb3>+jOG44vd`fk<&WAS9UL%Eseo`;9tNf_J6O3ES|izP&hR0t^2DX=ndr}Ep% z+Wz2O{kfdOD@4bowb)9OOy4;(LlT)0lT}{#i?gUCjIA+xOkV$#u|RSUNnTOg9c5xJ zTtQE*Dqsl50@g6m7F6~c9(@2h9xatvF`Kwk(`9nzLTm7}dF#|ouDh|Ycxf9B5XUkyg&3K=@UctWDPLi$KiiQ(3;cgu;~L&i$lz^k=1W1>fKh_e;NK!Q$@km z&3s62D=aMi{V+vUHt}>v>)9P&tQAt!K6-JDgE)rZ)o$$FGJ|XfL*)?Yna&9^)pfYo zM+j4d%{+UyEMNon%p%%*;P6qjWdT~80-%V@bTB_0w+{d+^eYCg)u4^M>)4ldH^(}& zO3S)aL)}oTAXRI?p1PcSBhz3WbTim--t=`o!00)OdbC+k-MygBFIY$N=PY8A#0j+g z-dod0ZCj#Qdu?aSLqU0*TQHnZ$Mv}z_vLCdDp4=Nxn`$ii>bP4^#;}U$9ngW)nl>J z)pcn6h!Sks^^>6G_`$8H__gsQ+q<3go8|Ek>C&A186|HhssQSqJl#GD%bBd>Gk zPo!Ttw*zc#(@H*@%dEa(F?~i%3xk$2By}uyz3GNMWu0nf+kPF%lY!X@N5u(cR>k7U zLecprps`Lb?YyHO-)Na+lut9a8p^GQY}eHj_ypI+K@NEubx`__F(NW^jA+Eoj6HNu zO|5V#5?D_0UTe}5q;8}BZOl2CG5)nAag}A}o!}SASJ(R$y9>5Y*$tDkMGwr?v>U~f zx@ruwVXL8YB`G{atijnA}@J+wO1hkhO+z}vBD$($7O!DSs<0m8XxP8Q=IhY`k z)?oQsyKsWTiRylH;50L;2$vae3KlwqhR2bO_abc!AShJ>5IOq8Rr{m24P=D6sajI5 zHFJ&=st#PG^okm)o$W5y_jPz_blgmzmj$1X*6a3%YHj*A;uNCWF+=SS!h?alSuarU zfYY&h8Z&DfZQi}BumqQ?owvX>11;~XMuw{I{4S6ECmA*58fx6;!d%1V&2o0_k9#8?AC*Wbl2*AbH7iIr z)`nYgW=bSi#sbvS{l!@LV0=$*W%d4Ysx07o^T2+edi<^jlejfp9d487^{!Fk(Oo<(LDr-@ylJMhri6mITDnn{P30z!)Xd=l4C%M}6 zCeZ%8!0{2{1D<6}S%gUPzc3}WdI-D%`k&O_^=;JV)K=`8MC#*~hyfZkXVjJnp6mKdRlm<l?c5McnjnYZ-f(6p-xT9i41Dn?A;*ab*wLXf4tx7`9zC zjdFN(DxFZ@znU|BY#v?_&2T%LF3zH*Kb}bq#PztKY14r2=N_aJ%z17*;mpxXwA@iX zJW#Hl16T}JMtmE<-QZ?9eN!3$-7RuA=$GpTDdizXWpbAge=WmIGZktZjgYO0sr=@b z^}7b#0&WL)q&Q-%cfADK0?NGxi6`G}^hXA=<#-EeWCFy!u-M_#w8a*L;!dh7=Jmq} zNrX)L-JO#j@}#mV<#D4;ZUtvrY9{pIp*pnx)&FsX7^m6X>uHf~lkhgjeDM+ie$#pr z%;!gB6{7@k5RwyG$-l0Ptk!ZqokMcD^!}>g)K!oCE-&q4o(|nbl`rmUEi3E>Ic^!7 zT<}el7(>7v`0haF;d`gEXgsMcr98`u{+tG<)YV%H#i0?5djdR0HOvTdO+Q*6=>HB$ zflRRkpy*c!UJWEJ+X9rgg~E4l7z_}PKdQVpooLwUxEMh%iI50=k|^U5>nOHBXNzE3 zBp-D|CS{o67_?kit&v+HN?d!luwAFJ?!RDCNBAq4@Fma-fH7~>)XI42tW|*Z&sMee zh0XU6tx#*P=0io)L^Z|B5$&JNr-C?_DYxegzieohmP5{K$e?_~29$*W)+(>lye3Od z*`#kr#abXj2ZO!=Q><(2iQwN>aH~=Kvqt&ov+p! zAdHVZZF`@}*j>=G--V=d*dTa1_52d8Kl005v@&3QnCEV%szB93)o7_{v(-=-5|fYj zQ;{zf@Fkfc*f~)ujIUe)vC^R2*w(ZH6=_N#tiaVC!28u~gtWcx$&@nfhL~YbBOkKB zRImb1F4sS9`&6_JBmnw?c5oe?yd9XudY0V}pBuETCwKK`;$$d4&6A317n*E0;~rkH z!rAq&Eq!|G4j~fPu{${#xHYym?l!8O+XpWncPe(F;40N^PTro;jH#jH#xNZK7&Srg zbuj{kUV8;_;`BuQ=%(1F;)39iIpI&@F*p)K^8l+hp zF0niha365HhY*tY?qpT})4NV5>GLeso+@^+)8_~QXQcW_GSu}Yy zFPpEYy;r~OL}HpqKgd56G0}(-t4XuJUZYpH+1? zny;30wrKb9ecpsW4flTbq4TJHjbFXd~2bMtYEvUv|)sUsbJcL0#xjZ&tzB^R_p!jgl7d_}+gFCf`)%aZ}aee1-X&YjDeZm6mw{ z_x{a_-C-mu!pG@#$#sHlD_fe^t={sWO8b7BI{rp?v%^3mgw&Ad*$lk=epwz!Fq%1< z-WzF#pz;RDAWQ5c7R8R(1c@FSfr*q}a@Po0!F)IA7v1$0r~rdZ9Z64L*fT6lrbs1A zrQ0_w71h)I3Kxg66qH4Gz2by_UjII6`bls=o|<=`agPr3!@5O`m;Bw~NX_}}Yf%{g zq64yyKsV0DwK65iqD2!Cx^4`rGrV`%dfkf%eaD#%R!jnJi1s8OJFYP})$kM(4mp0A zFH7IGP2fl;sPoZ?nFIb|2Eh)@o5|=+kSF$`3x7B0J$3Exja^)u`thW`{jd z6ttYPhnt^#_at;7BmIL-5)a;x}B8Q>|{7))gQjJkwI&f$1z%p=Rv$e#5x0tR3HkG~W_P zAWUxo0vYnTc`cjsCIYY=HNTM~XN*`s$Tec70f6`Lh;sy6^Aq3^!=nFdY9G27;>28Y za5tGvsMBalZ+A2EP~3Ij#yF7zCScC|4)!F$6H&pO3B*3v zJjtP55&30;{H*AE`@*2onGi?j@hGv4*!kQk!`7l8YC8;j^xK4*N`dhJW{dvRv@wWW zxX^SzD-bSLjp$?Dh;n)f0F~;*>S1X$kahq!I5JdYqEm7)hgcMwjYy0pYG*E!x6juT zg@l>+VP)^AC5EOZa}XBZ8( zD5E29!Fv0G?RirnB~Ok4UPb?O%siI4;;aL9g+X<{Oc?UZr4vuvM8fGX7Jq{TA`RrS z$QO1&PFB0y>c<9ptFDhc4p;0ioACJxpV(l)BX8HKKcK{-aAIgwyj&* zX=A0e(wQr5+qP}nwr$&)D{b4hZQIVQb8gi+wfCug?>$xD->*d*Gg^$+Vnoat<44T* z>Ak-#hq6YDnu-iFd2XLuu?qL$V)=7H08`*YafCQJGiZ)xT`wNDo0tdM-6S_u+dyfU z_7*Cd#?~*wp##${G&w$IPp9ZJm!iVXScmV^c7G~CUQ-KxK$&%Pv{ zgX(zMs;XwdA80VF>69_P4a?}fvg(K)+Zq-eZS*TcS*n9KKk+RC;o8~9~`1`SZFHJukbj0Cz}hgkNxKD>NdKP*gtG#7&?3v@M=-BM$L z`!MDb$OC0OUG16mJ=rvt&q~=a?I3kxG+S ziDqLW!Aa;QLy=VwaH$#%&YI*rd}NqI1);x{JJRC-l4IJ!ggga~-pGJF<9Hf~AiM?& zx}sKFRgK_0oYsLW>z;8+K?usSD%$~6{FS8x@`02pH}YW{T`Z;!BhhdDoJ}R+Qn46$ z$|>@|U(@L>F1!UKF8;9Y{`XdAyzNEhkN z#&+NHiQG_{J0$A4##``_KM66^9aisqaI^s@mjv=#vDuHe68~WfqqIJ!psu~;IUTnS z?>Fd*ES#c3L#;gSx1Tr?G4gj`l0JK=KE`J<8+#J2JV9N&6BRSKx7JEC`|ve&?pLL@ zT6yRM;A}3D9$(q_+hVW<(=FaG_Cef-Z#Hb-q4(dr%Xc9USi%PaN1wq6ufD|B498rq z@xMm44bDi9MG#Gb<+FV&C?2RKwst?P22`Lv(?!@O9t9?RBD@DbxAf0cHm;@IfiE9O ziLYU=?%6wsI+j!2mCV^6$FTUTXT~Yrg0@SmVa62P*;>C-S|9mvjzQhCy`i?C#l)LD zaA?xgcErN`HM5T#(3t?T6G=x7)x@LyTWD*qaaezV#sv=?V&GhwO+DXtW%s?3tZ@x) zlz?sbLc|x~wOt%BT^NmOYYVV&jar->F*)92W*1Ux_a}4&leocZjdD5NsvBzgjYHwv zB(rh#n!K^be4rn9A9%7@3=nF5gC4iDUJFu2dW^O5!`pv3s4@iM@LoWA_{#55oI_n6 za6iw&Ek$B?JYR+)=mN8`yk=asZ_VO+#R(bFx(dtcg9C3mPg6f`lm}{uj zdm&#JyT|GiRFw}}W8|KAr}(!GLBTeZCR6|N^H}0MI8=LTO?tk?i6f^EC3JX>Ppg+u zd+KCTD3FM7r!}+yxr)M(Y>A4gJF3ys*?wbn!vb|ZBTdsrDtc>dWQrGr4#S?c(e zM!Kmb)otFjQK8ivAz#8x8;#BhKZZ8wJV9-pX6Gw`)uxw2#7`t~?!IW--zV|$))Hx` zb`o&1T2$jIDaVBl#XvH!}o> zDbmo%9&A*hrE2Gpc$oZnNp6ZTGo)1n!?Od3EAi)3bFPv0gd0LL*#V0nY3V-xmPhQh zIB%2r8ju9h@r{A98@Kn85^l`S;YL53hdwtfsO#^IrBU@=fN-e21CVOp^+Vw6AHO|| zgYUC&lQaFe7?)A>zavwHjxMqg!VGIeM)W1{e3;^zC;MD8c2P+D=HE~*hiV2_{uA8PmyDzASG ze)sx3vY6%hXqxbz<#Ihk3Q|1ka6@a!*mI13ZwA9*-43+*3yI3x2v zc{szLcsLUt6&)KB9@F0j3oY}%G~^VPRZ>=`5U_EwH~Tx``p;R{!b{&_^(iw z>Az{eN&D|ZS?0flvMhgwvMj7j^#47RtyG0}Ra|V;_PBO1{uLt@d?Sk2lQufatNZI0 z2nqyY8WF=T9RwiIgsg=zVxI)&8OMSmEiDjLnpdgq zFM)Jmw!GZ*rJ!@-u|aWxc)BVZJNqf~igwm}V$9m>iY_}xHGJT{aC&q{&_^FfP*wp_ z1;iKD5iTv~00;;Fb~i=84X7)16!KX=k#J^I_*_jN1I^Z7V1{=$r`3=ZehQMoE2Drr znIBS`er84?RYKShV}FAA1VmP-5bB(eVm443eU~QwJcs27sU>zjZ%3X7(K&fXE0elr ziY`U>4fHcFV=|y-tWf=p7+b%56^LBG2ke;vm(zy%ois;$0&Q}+my7qhUcWxXIQQ8E zQ_!F^!dudn}ZJz1u9OK=LNtkQk zPA$i6;=?yv5xr5j7gS(Z?zj?x*>!}pTUBg`wmD|&@sL2Nm{3y1f~c~+Z!Z3wS*=6F_I8(dzTI>t3Eub8(}P((1LirpFl)y=51 zgn0U^xTU)DWL8-?fs;iNO%^N`k&duOF44>QE*$ha0UT`lsENsfo-mc!LR)LYM=jwp zrjzR@FQ}9CZE9FrqC8$uJ_z+f(FQceg38R5^^5fwF}dc>3uP;zf)_!%wk`c1Nx~e*R+Lg8QuziO}`0* zsyBTFs)4%6?=yC@$9urqfTwniOLblP3ECOpQsv^uTKNU~JHvaZ*O1(RW^Q_?Cne3k zLd~2ych>ab{cQ5Ras#tBu}%c`+MvfP-&Z<1WkSE-e4;Qw|w%n zqdaByS?X{1P>irTX&k@UIC`)8N^c1=ijeOmUXh!?Nv_D4)47dRWU<~ML09)LWGICq zFHzf9EVH9F>01({`fk7TZ)#Koe+?Q&TEgItoxMVK$#Uv(kW=fzlnmgWsQ*%BGe3S< zlu6l#TNxYPlZ4)9bW2l`1>B6f|BCn`IS8xlsnL!Qob+4TX* zF5np&eahVvS+LHWP|+Ru{A3^vbtdfWVXYLIn77SYreLtW+cK)^gHqYUV8WUnI5sVE zV_DR{KFVN8&Gc9dJDBQzOONY%-I< z8q-nX%gz5zyq8nVExkF0Yv-(-)|_5FCwou;fnnaK@W7=mkb`H#Ac!kQi>J!)0^O!o`@qhkKqQLtCtU}g&q{2sTYzRO+tfwH1Wd?gF}Xj(UC3iw%Q`v| zOCsG{Bt}vEGSUyCDZ~L-7D1=uHT0_%qa*HRdWdnO?@4-AT?|fxQBCWPoIXb`wX{Ze zD+%M$9C!NqnMwZXk>z!F)h|Y4Cs*&5x{!qau-r%lcT!83WdV910oVSpBH_;tQ&z>3 z+X3-UuyU)V4465KNX;B0{>Egier1alDweAxd!~lb&Hd~1E~dl$;uac@(k@0jv4tOD zsSk7`;NAFy-)qlMT}E_n+Ex$6^^HOK9GW$ARI68485={5#K3O~W*UA-{a$*>_=))957Oli22@6|wtSdpbN<_0L zR!g|J_=v6eeC~H=QHT{1GgqHW#A~S$n?S+7&3pA9GYrL~fa+HdMiUH~q5ANZ`dEcy zxo3>S`aj5V*=K|*CF8&1#B6LymEtk^(J@a%z};AzlS|6iOrSBiYMQ@ETLe=lro)yn znFJ3zE!-L`dA!Q@(;ZFFEHhc!x(XHb27khzB?EdH`r)KC6P>}i49~YlF=qC|o{;3s z7I|3m`UPTzqot*n7Cao$goy)smo-bnS4U3wR0g9*^)|}MjTiuPX_Hoz%66w@rm4}- zTC%0=HL5*!Ga9+%`cgqUEMru?L<0UCe{lUu36MX6WE&&chLfls{r!+NF2fbVL(*|! z?dO|B$2nJ1*v@hPQwtle{OXE*Q)?OfTDouoR;q2i$ORW!4&l-odRWHBXNj~&Om!n7Or%BS>a1U4CGkD z_>{MBKQ{9t?L#IAmI%fLy)zlgi>3~!H0V)F7lfuKIj_=5yEKp#=`+k7%pDLNCzDK@ z(DrDq`1Vdz{w*zQyR`I_B(dU0(9TGV8ANL)+uZVg+H0>wi~Kc za%4FxDat4UA%!>9)~?4bR5hP1C0oVJTt`+#shA6OCg;p4wvM`81-n9rln=P=Z4+zo za4l0=^Fc>A(xNm(YD={Jt#jcl+${+`K&JoR4QCV8;hQT+pB3nE<2<!7`kvIb7`Z4l7`d_mt{`{gM5yh9*~q__ zvYOObbQQ>#dX2Fy|9+^Gr(WBw)=Gw}f!+awIOxQ7OR)!Tfwx_V|Augd)(trrP#W21 z6?BSFO`@EYH5~US0ih_v8Ab!>Zy0wEi78w8ph}4&gGOK^k#Z=qiYT%=og7J?OWr~# z03)rSE}ue}d;kV0!S5OLy$8hiB}h*gG+M)_3t3_%O)YS`rJgNvEERVPJ;X*uQH)tv zFW{6D2SksY#{{;N=PaNy5D2z4YGD{-@W*(>FsI=D#R8odMlVNv6fT@sJkeFyX-^<( z+g546mt29ZCakQpG)uWy^SBzl7QHULqS#!yf!eURzSqRO4z`ZE4yQ4Mx{k^bW7243 zHG)`0>7wkWOk2(^v3OxA@+dq@WMi+3mJ3@0nu|9a727^o04 zf(x$Hd)P;f=G+>4#Gh`FmED?LjPnD$p{TKmA${JU@Ds8WFfxc4eD3GL6YCA+D)0o* zG05K@fs1n9hzM=Io4)S8HHO20zcF{_+wK~;;cC?0kdi0Ov}B_XNdm%Zz4lY-qA$^h zn<5Q*d6k@mY9L5yXsYFG9+;CEuN2iEm2E7<&ZUj2xR*Ja4X>n&#H;U=lN2u%#~$cy z)WlY$h31*6mGdtZnWwi{-fu1l>yw67E9={hBg9tPwhF5|`tpUe#hyt*Vt%J4YH%f8 z_uFIoH3LTjf|&If`I7Te@b13*GJTO2#_+$9PJ%K5DMq>~;?VS{tCJkAQ)OLY~P|FN*|`C4(LS;0nPHf2t-KD3i%PRY5}7lc?pjWZ5=C_l7+!2qTAD;XwoUOtnu zZ^AGavycZP70#X?sW-0;>z{ZaM_G^14X>z?s5adH5>cu3lp z8r&-tXaf4}-f+j=?EA;iHu#r`;z8^a{NB9U+@)nPu@4^C)mLFRq_$7`gAQ=@bKLfw zyUW}+PNB=M&t~6^xQA-6)y#)602N~3{l+ssOEwe-vvo;rYQnUvCstsFYOpMBTGq^m zaXI``yg~DXH;~v``Z1DJ>BnRas#1-JpF(X+gQ9blxzM8)vph@i$U%<{7c!a0+7j?nK>p}9 zSEj2Qwzjo`M+hYhrTlsi5x!$-Ov^>d(zP#-G ze87T|RY|kJJGV7@b#7V}I!)awcQM@|5rtYN6*^q1Nm+Q{gu`quHRf7Pi@FWVx?fmi zQSKeusV|*#g(mT6U|d^b$?nt5=9?Tpq$4|$acLsdywTs6iVb_flwzB9;Z|P0c&d}r zzXRybr8*iL)V|^nmiwuETWZZN!+{J064p2CA1WVsej4maO;Qj^HK5y^QsEnv;@CeE zrFRQ#QZ7PrEeK5R2Aj$_)DS01f*|Q}A%s72Zzy504KGufcrH474I66N*QuYL?~b_q zCY1lIc|eKlBA8q5?+u~SiF;+Dl*hfala+$e=|jCdR7-2Y-3!WAoupM+XFNYjJtJ$W zx{2j?wKRIw7jDuvUWDAWLZ>j4ZV~u*ZcuLXE7oIx|@{8 z(EarE1P7Uw#k~_f1thWLm$6ijr@t@?f9{I_fz|6uI&|RdSX{kkI^)D@OVpzQtmQZ9 zcj@N^*jUd1X1BGQPbkz;`@8XXxv9hKQ@)oFb7>2aJ0ALq_QNy5Y?!$|c1s`rxCsfV zcl_mvWeQp^ABS#FR`t9JRwZ@5amOWnM_S69t}k3FgerjS>9(&9SO@gW&)gZ<9v2`S zpa=0VQk0@y|0MiVx}$^;X}{kmRNcAy_E3zqmcG=g^t}BJV5Yfk`2dV+Omy|^Xf#`q zaDY7Uu1GfsJ2?PKilI;zcT;|4QH=`iG5DT9^Z0V@)d8oWiC`1kQAXuz*1AtW!0O3 z9_qg+djIL9SZV*N=*>#^FHR&n24>p-zUm#N4(Y16*!i8~aJ|9dvcw@_JnC#hKl+0n z@^629{9p|AAVK;NNp$h_Vju#Qc-0ovX>&nJEtG2T_P`PXdwii+^ash4*1VP1%O1Ei z)rCk0my(T-KBu$90-xU=J)Wmlzn`-mypOxLYjGc&yu-dQIQGftvamsw>knqvRn%6(;UrEo>_;p)xx-I^O? zG<;?tp?_}RVNjy)BPfY75-j#IrJ)Dcuv>NI+rF#45?%60v?bH4?TQ-B2O`}g_QK=| z6ftsX$i*i4Hez>&BlNLSs;@Dsxe}vRvyesK7T-|6`UDqL)AOm3sv?WEGxM87WB67M+{Tnx=ElT)m(5KZNt-7VoG+Ec75wmcN3Px5g= z5+$9_!3+mm80$p8Ey{T|#T3^I<@)}CogutVYmP zH539jEOUjF8j&SJW58p;Kz-(|frbxWT!iK7K{&{kf)lv=S9L$h0iH<-O?>GC+Z_a* z9kuG%XX=Nz0{rv5IOeZ}(tvjgHIXGg#AnV{u;m@}!_yF=9v+dW-f~hgj#K%zY?cI# zm*ZFOx?rE2;}aoP(QdiL&@3M~6O9maa}12A#=#nx>|$rv5S$(bRY;zo63{T`-PUU$ z9&C7GLm&<;cZ@Fn)0$ZF7TCkWoQvg(yy@7ejg$odslps@abfeN9s<7Lb}<^Ooh^Jc zxjStk?@|&8Q_wW<&l|Q^$k)uNz|jZom1&x#k6=$pphCWSkXQH@=nW8SgvMEwub3-# zAQ3slsa~Qh$_;TG{!<Y!=Zb3bZC** zf*W?W0WV%4+dv(eXtFBcS+6crP- zYe|d5ZyGm_7$?l;E{mzl&FqjNj#NG_HoEtHEzw>-N8#oSuXQnBn6~E?FkSRkwPl#~ zWh*C5I4~IfAVd448Pm0)!1)g0WXslkxZkJ#g8(Ki)^rnSv- zd$@Eq(}X3W&@!d2(jLOZ!O`s2_l_yR678gUqy7# zAC*{dsmJCxMI%Drkq*g?qU}38gOgmQ!EuOCk;8?%WH`z#bKLAZeAWK&ILT!dhJ!Eh zg{qoFH;fms`@+lh6C%*T9$hDN(KWVZXx6-)h{i=LF!_z$5FQl*R}yyDV3P0-!J#@O z>nvLI$B`akMi&hcMiOezRHS%`R%7cm{G6@h_!W0 zN2%BR9Zc3w>eT1?H;j6A4kwnV#k{T4i;8=io=T*BaK0x_=oEX38ZdM9Mz4He*wo`EnNV}8fU*f;}+CFF|g3(;5v?WlDL9*_A+*;

          !W%6-_@Mwm>!qqrT+WKXK6UcU=}0U*qvtJ<2t^tqQ9E z= z?3bEFm<_`fi4n>%o)xr|X^2BDzh45Sx@4~#Zh(JEV@;@N+~RbY(KXerlIA`%t^0{T z-#%P#^igSaN8A+qH9)T(x~N~0kM}0tt4`o>5LeQ?;V@nfUxDAZwwSIX0xyL7YSHkx z@dVG3kdx3QGa@)wEX*`vq8hE73j9nb56!MFVLPYoJ#Y+h!nAQvvCni3>He|YB+%X$mL-6tB^VU98%b~?iSy|$$ z7wl_6*&SjnD+MJA%6c$plNEctRVqb|7&lUlDh2sXvlMgIY$jX1)TB_WeTJv8t6vQA zs%K^jq4pGy;Exb{B^^yKFU{|`YEhKeioS9x%f-wO6Kpp0EFqD&=xv^cS0j|>)sbzk z77+&F7`e&>hl2^?|+uQGmlc@!D$(dW>8#sR|dQ{I_fyzpTO zQRbp1sMQQBFf04$COY6&ei-$M*cgWeHx3AV`UR#opjW>!RR5n575*>`81VV@Gw^8T zKuPvIisrW687tPgpsOZEc(Q^WK~s+Dh9&-ZP+b-I{Du}C5)$E`0w3JhmX7bzS6Q`R zLB&Nh-OkS)TC>~UuM0zBMf<{%>0T=5Eh71!=?T(C*DO3|(cT}o#g50ljO8>odmZQR z?$Tt^Ny}~eI;KYi(&dCR6`Q(*(tAX=()t}w}aO#N3F;u5d&R;?)s;*ir| z5q2}@y^@A%%HC#MF%Oxmzo$pBf3b?sk;~`#7Z$NWklh}#vEo+?61e2=M8aT(9Jp41 zDw{VstClkHN4Sp{W$wnUoaVxnV16m9OWRwJTa00>4rVX-E2ihTb3gKvr(ouBxKm6i z6MlO~^k|-UqqYPBHQW29RHD2lhkL%}d(P@RDbt=pg8)&@^g(H)nYyrsLm@Qadpo~N zgiA<7Kw+P}hw0zO>Mf+;Ly0+uD0J4U?08|MX_c7u&$joG1fzMs*)M*uxoCM8KHE@? zSh&AOa@9XGEhoy5eyz?YDP%Yg@2vU=(xKL&PI~IzA>CV0jA@+L4|8(c9M nwUt4 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μ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

          %f0dfw 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%0A`xnj8=$C*|V!N@8S@$fk_F+JomNCYSjbTR~ z%6sSfEA13NdE?5G=ZcaBoJ~343g0)~$i1a$FqYM$9T{7z>R`2NwH{tD!BJx0;Ot&JXCZ z8H&sg-m+#MqpDwuG|^Gbl#mVce0dhB1I>w*0sK}=5o|>$zn1X218v5^3Ac(+ef};&O%?(@xj@GQ->(Z94Zwjq9XDTrjuW{qcPs zHgYW$O|gciy{u<^(P;zRd&Ia~C5OlLLHO&A6cn&oPwA{UIyJWaRAXcj%fD2R={eNl zmg9?nDy_<0AXttPoH;)Q9wOKQ*w|kZC{j>UU?0GKDWd@l|yN7Jn_GT$>UK(dbp6&W$4k5aIzRxO5@4!h9p z!&*V35=i^7>W9fO%zlVhe8Z>nBq^?XhuS`0J8O&UU+P18oC+Tf291zlL4R$4b&{@< zwqadGUx$tfZU!EcE|GeX1g=$5;Xky44md0tJa9ZHmIU4t9OaE4GFUTxW!t4}o~>9` zv8u6C{$ehyJ)hp+jh?HbHUoQy&K6;4(1hR5ynn0ca!etci#? ze&*DXyf7kG-q@`#-BnWcF1)Q73e2pIe`PqgfP4VlO2< z(buv^iEgo+_EbxNa=KXj=HvXBJ%92EqX(@Aw0+eY-CK;vi0rK4G7Wx`=!6hHGWNpK zsAE+%!wL_D!HN>g=yeX5pu~G24IyT%WSnRW8j7k6F?KOS!bAnC1nx4;GIVw-w<;cWoe=Jw%lknQC4v28Hjy!JtF z5bi|vN!S-ZP_bXg$3tmO+q|fuJ*Ba!_H_tvkHP88*IG;S>RmXoH@u zT7aF|UzpT&O$9TUA~{SW1J4mKFMb?-7TlvUvU~_Qty7@VmU?=_GdB}pJ0zF8C*-Iq z5&N*q3}K+G;mq z$-3}vM+oL!OSj>_ncweNxZT9NyIqX*KjavAEWiqBk#+@cu2zBJFtm6`c6WDoxYoZA zEDj!TnFP*i>Dk=1c)HW#!~^M;agFL7ORe|?WdGi)d&mk)x`MqFTXWvVIY1D-9$B)r z<((__W!I!h01ujI#lKuG&vSET1ef^5ghtnwB`FMsVygELo1T|Tg!K54l8(y~KZ2Uz z2RG%wGJk-3Bku(wJf~ijN7XU|2_(3-E9G2~oeg6iCjAFPX}*{!Q1uK}8Od0j2|z}{ zI1|sjU^y0vO}@#8TgI=5ihQvE#Tex%nMn^QBKn+}bUJ9e*SmAebul7-@$>5=05?F$ zzXs1?ALM2CxFq;UuyhqyK7>W5{p}MwE?hF5twB7h$=FfoIduX2&>X&YwJ|! zCsW1hktPEFDYVAhL+4JPi zbFTvfZ&T@Nt9BSwUkBci%o|--pZ-}=6`o0yukx>>R^OlXn{sGtfv`e%NLa1|ItRc5 z&VJM487Sa2`ksKwqnI>z7Yn})&1)7jlIea3bami>Lpq9*w5rr6O4;!??GYLiV=WFz zXmY*czy!XM>);UuA@rU^??;~Ww`{AY%)kVp5|WT&@x>xU7q4gdOi0}60M+YzpCjs; zMVf}y=E3ECiFP+M`=PY1bBd-tCT&jiUo&secT|Fe2b`NjS{n0FWuU&PT6 z2>J%%=$F`6*euU~0JJ>5P+_K7iDw?8noH5TluHQ+o_x}sG=w6N8^cI=S+MwM5T=>b zWBJPL3#g)zwP{LGm(ekVOIymH-k(usW6iXC>@KgC0ib-lI`_guJ4+I?Gix&KM%Qc5 z_(^O51(X}TenH^;sg3)X$Bl|_9pgMiZP(@@&P^fy9eOx?&*AQQykzPip(4PLM-@(* zMdk3v@HZr3ZJ2@--=~WY*v>%fL++gcr*8&n7~BKtUf9W^Te{SK=V-L)!3gDJHP@n* zmrCQ^S{t!!uvos~SS-t@%VUaCBPiZ7b1zL!DOGO~dB4N0o|28Zwe``D{r(U;DIV_& z!E~!96+0}Po_9(9yW;%QWWAEId&YX6>H@B@0!~_^o>5LQ{a6i!c;R>Z%lhmp_hu<_3vf*qLBgJX?5|^}p(nixR z-aP7MDpLR4R|bI{{u$zZxQWEsXIBEVEW-xNE)PU4$wyuPEyLPmVXv=LLbF(XE}?#U5AUPq;w z2#9t&h^MT_8gJZ|+;lwy5`SGxfyZc!lvV3&+H`&%1l6N* zi>#ZKUE8iTtSB?(DbtA$+}FM9$ER|7chNAxtT zN_fN;s8SFgXyj5*n%`8YD-h)VVAeJ8G}XIjiD?C{Kn-g#cARV(MWro2Z>rY0i-H@a z=Gh~LA<*cPGR;K_YvZX=*8+uaP|j$|I!t~^GJOM=Vc+xd?d8eE2F2E8=wMUG!?lY` zDU54U#f)pr+rG=97}H1eJ%KlIKgZvMR9&Q5Fi5Qg*vZ`AbyN29dVEd_Vg&m1=MNPV zKn}QSL40sV+)HQ;vofQil2*)S2XE#*W!d zESq_mT=mpGm!`1~uDmm|xF@A=2AJMix$5G)j@@5MDQWi4nWuqYYp=PvJhQ=K>P#WB zgi?h7zk|v??WMjQz6HP2MucmkKzVY9$4s5T7>CUj)D{TS(JTik;XYM>OAVQ{akvLq zxPg4^=7vj1Gx~nOZlOy;A?lB1PIQf+o5%HIIi)i2Hl}8(@@Lp+osRG`ZJZjNv8S{c zv9}iOZZ1ET0#IIpYkVK(O<{#fwYy%oS31;*{=n@XXo|}AHe8Qw3u?a|##ffWt-cHW z@izLINH)als=NrKI(|od9S;6;?&6PhWt6&J@}2!L;gi8>iRND6Q0cF)QvT}mRCK~9 zJ24mv0~i#q(jEnEje)Vw;8I9Ugal+r(-{~;C#WeB(z5%y zV;+E+EG2YZHM5i-56D3j;yW^rOX0*5(ZyBDZB%a>S~|RVy~mAB?%0uLm1Di!BqeeF z1KyUj13*&^w!6=muv)X>1GOvCxuy_4RI9&v&Ilc(ZI>d$RO-7Fw!UkFe2mDfPEVFF z5N@G`MD1gxY=uF%ShPb@5sZ<{Sigz;d;4+qUKZ0eMmc$p-QzUBvKp`Czk#cPy4YeCCeN#T9S& z`$}e1NM^#r8~EH@NWiPa7i^+Nflg73+*^j7WLnTbaEY0WuIWyeqyuVbYY+_ZCh%u! zJMF_CEE-m6N7)BjIx41VRkU`r_l?0DHl91LeNWQWy;E=>RGDCHd7gZdER;_GXENV( z4&|?b*VwEgizTWoNWPxYRDDkj^2TBK_gtcrHNW}Qo_Mh%-;3YFBw{uIU|OD(u}YY&6Itp^+ScD=Xqi<0d%Nl%O63DaDi z7AIYYo?C^7Hv3G)7v3B$*Nrhi?UOdr7(CC5?$+&3sO3^tU;R(o4FdOyRhZaAsybW0DpH-IJOBrKn z-#{P9F2uvQaSlz^tMxy2#GFeZjFM(5oH*GPmxyjfJ@w-Q2^Lr>bIK5B{t~0MzvU!Z zd0p;4GbU@>UK1pL>Fj~u-(^du!n$$zs!1Ot)VMCX<1v@lwtLgTcC)wo;N)J6;o$3% zz>Q~SadNswdxdrp+>n1X4%gb5tX(~{dB&3Y>`=ds{}x#4QM;33lu9fmUyNFmTAYG{ zhB^eD06G9#1ah?OV&0KZw7ZA=IFeRAk8a#=giH}mJ*uAU6m?&9a_#pX*7W4fzhvRg z`4Q^(f337vrr$o>?%qbynLmeduf5B;zbClK*4g)lC_4a|(VJJ^;?dREe>#HD^~nip%m-++Re>okI9#xVZEw-yjcvd~E`Ea=@rE8|cPiagak zWsPW14--C%Qi@mUF}Adi^tx1z|Lgy9r02?8TzbdZTU-~Dd`2*bsmDMHO(vG13_&9w z2D}kvunA$0ixSC&(lUp6DnNaSB6RKDFvUF=!ty9*qClzF*iU0G&|IrK}6 zChk*>%%AYoZ!nDbT(n)jaa<0(#)-eDDhy&fR=@(b`Qi~Qw_*`ga*bA^O1BsHNlu<= zdv5Ma5ajLdQzz(qb=~)OazClqLJ6@>f*wi zC2E^i@iz?Z4y*gOrKPNwA1x%67K7)Qu)J*5&FxcRXf*{mF-^Bkjp=98UGh9%jP^Js zR+Gv4(v@OPp+iRMdpt4(96sy&g?`aoF{%BzY3oH`Uc*cz0!uo|6hSHlX%%D|#EhA; zqdX1Eh5<=d0(7&3bzzg52B~$t8;FZX=n`SGBq?!xah|Ee{45kG`yH0`Wd*oA6MH>4|}hD#AOZ}B9~RkLA=9(3#&`)GyPAZfc}m- zp8Dm+p5pclC16GsMSb3QlH@bd?P-2eg zWNc$yVkQI#6u&*Q<#y-(9eqXpa+x-_%_a`8CZ0{V(|lS)@!@q1aO(>Oi_JiGYa9h; z4)FV{*(UmF;jS&C8kVv~m zvH)|JdSya?Jvr-KfL{$KfM?bk<&t|!V7!A80H`3lgH087d!An*+|vb=M{*$@vWg-B zMcjb|N`)Ma@L%AcR7Yz& zM*-h+HAIkOPLz@+LQ;_n^?4`gZUuz{Gl=|j80Lf%q!8#>t1+Z8q;lla2vr8W@p)pu z1f^848>;YQ;?y_}WaW_ksHwbVlaSK|)ySCj6>IqaIJ;*{9kN{VmO)*B5b{Z<4hoI7 zkJ$c5y_GMXTv?o2+`4mcVlqTFcM_><9R|7=6^5u@(+Qiz0F7n4=YN}7V&l3Z+ri? zf6{JIqD~ARe^33gSLPMV2S&RKhHRJW)an#GXtH}Zjb-5788D^9ROWUdQ>gjnuu!k? z6)dO2PMcxWd79eI;xF1|mK2Q|C@t(VLjVfxV+i{yMPEJ^SC>=>Y3`?=XAI6NwNxx0 zf-us*qQ7q3GFg3K4OOfj(%z!HZ(*LkSLZh5G4`D3CPPDK0b16VWlLUnydi<}C0~4{ zF(@+lwdq|_dPmbR`I>Zw&+!|#{?p%A_ml5C<7fRn`6}u)5}U381&Tza!hnN6D&1LS zogwN%l}cqhgelM{OnfCRxB~_?oY7EmYBR+{x3(x_0{T;R$P1X!WmR~%Y&bcHB_6L< zYO!Wv#cVpGfSk*Yh*&g(u2bS{u#@SvaG%BFE|F(Mk5@QHmtdh=Kc!RUG{{ zJ;*?i7zaH8p9+##pA=SM%(5!_5MccILIJC4-{l5 z=1<>sM+cm|{GCjq!eXbGBM^X7w?;J^2Jr+T!UB{Y3s z0#qvgdXgC@CldBj^f$ zAM$>#q)=ACPBKsBz~)#qK1I5CROeLlxJE#3234TGQl)8`Kb|@00V2J;c3;K+QtY0U z?ppSEXGr;BmONmA>E;0@` z^4#^#(SEhDX!PK?lWpW24QV}(CilneHEJ2vxN^0BBP^S=3&>c(_{*W0VJd=HQ$E*M zZn<6~X>vO|6Q?~M*SXcY^)={0{K;%Z{=4k9!a`Nr_IIq~Mq@IU^{*Po%}_k&u;h2? zmNIx}Cr;m(7coz4FmVZ=HTrWeY0l}d`ESl6oGU}|T(>T4h6U{kS^sNLZEYhC^3wY- zGO+~k*_Dh10YDUa6OC7Eu33nJtr+)h8B$=uT4)Vt(8`Je_B=~|WH3@o#9Bn<1(`e~ zmjd;WVfKP7xjF?3M_l#e-<{b9;BW_k>LLoAF;8z3sO@43s<+S7B_P#<{E0Wa2UAi* zPbG|F)&#;=d6RE7)1%asp;i5U&jKH6ALpOGRNVzajENO0?%EdVpAlu}F7e5WQBXk` zyr>t|2KIetlwoXTJvg8U?PR0_fMvYu=<}=Z{+Hl16j7_vKSK&dc1hh8hPotq^XWN) znYkM8(gBo%6h3;N;c(x^8NL>0a~lV-2cg^C+N|H?o@W@}NP05JCWux zpZE+$B9Zjx>h@$~$>a$zS<#VHmiK{yKUYgfuCk)xS2OV=t^>D?YdMX3U*UutP723w zbZAK%4(+x6Md&!)heU~=u-sS0qCIvLCw&ivqDd#F(-N7K3nGqr#Wr)bVc{}j-2!j|#1dVff|%3_8|rWV91)N@C`E=}y`Rc0^CpB@~v@~K8&Uv#}#wTyyzIp}&y z>WeHM5;E?5-9#v9$9om2>yl%+>-T!5vBtA^dbsA0uZo;y*_XI&1==0<0Tt&J4^iSz z+c+AbcVQM`p>vS*c2sql&;S(qC$5q;Ktzk)+-TA%XIfh=yW1k2!nvPetzmS;RU#^{ zUiP2%yPrdES?oi<2)`o^Pa+7k2tuw9?*8m=sO8B{@>6$)@PS&EUg$>Zvq_&{A|eo% zBO{psK$ILCjzv__X%#dH@MA#LRB^*`5+@9t1De4$z7hpxv>}{cP(BB=iMg+b$1gfP zvmeaNW~*D}xI;uc)QB#iMuEZGh+4{H+J{m53Ab0Y^u(!PJwio44Le0KoD5juCbEd= zf-YI&4f5R?vXsxB+gQvTr1bkaOR9%LUmrW7u>D?8WyH7&S4!RWyu)86R3@I7nvZFC z0%~IRq%BtUOPHe zt-ro=xn8M9TiNc${P{y8bLeV~sp(StMcy`hc5_>1O>Gt-2&g#BSjKGCavY73*|Uks z0>-{>MbGvAdhqz=K>EU4G`c>yD{Erwd(B7Fj<02x_!9iGby#G#AT1Jvz={F?YqLoA z)HN}CK!$aV(8@m1cG#BND7tM#&|?S}E?#&|kjqBi@2(u!{#=;UHJ%M6;K&1XS&`Ep z$E4V^x=wkO+z!ZP_I`;Ir5(3}!$d|W+7TGlB>V}a&?9C;oNoL{zVPa?7&db{FFM=M z#2Ox zXA#7d^Se{`r>LjUz-DHeReOK6^Ht?q(ZO(qQcCqEjg>*$o5tswKy3)uL51ytq%=s; z#zBegoCJbkkHj;$+onNs^@!vJ>ZNmBdqCT!K|Z<)a|sQ>CEmoQ~&BWBt=GdUBPl^*8`&H zMK<$h=_^M`<&()N+<+($267C~K@w9MV##n}rjx_@^O)|dBhLk*; zE}W;hFEd6#kSnlt@W(phR`gq*Jlr~vIMd)Q05!nVBA+;Jp+ysF@mS;TARFLMp!;ph z5AdtNTLd58^+C}&2|m`LFT{Nhf|`i?0U|QAPp-p8fLkOi0UW*)pmqFeEHflMP9F&F zFkOk8V7I)}(YO;AOjxrLYASFW*KunHhZz@rwmch0yAkR}0K%Tu2c zGZHRh)3KZJKbun5rJE4fjG1PPjX>&f51zrJLW{U@zsqOqb$Muf%c&evIAzN!m;W?5 zT#0u};5p;Hd`@rdZKW!nT#RR@w37bt|4@TI0s8I+-P!h!LKY8f3FD!@B!8AQu`-oX zsXbRl;7P}qWWoBfP^+nHH(#y`|M|{aSNSq}@-@B2vlwy0OHBp{U{VTC>Eo9By>0+c zlCSxaBq|fsp|N3m`L5G;7wTH2<|v4k=%?EOebsYbl0V&~#V>&{5e0Ij8}i*7q7_Hl z+@BoXCFl9NiW~7Z77Hl{kemlk5tz~eBrU95hS^Vt{iqyilFy+8_tu=(UWPI)_%IK& z6w(uF!^c|SvgD6iAY6t-9n#nf;ao^|&d*w?(}YYs?>|)&5~yuqh>#jc1F!%9i?OQ$ zv<^54$O-rbfLpFIrqQR;2fpiwYUsc|uDv*o92bg?q0wEE;jU`b)h(IsdRk%@vRy|f zn0aD4bk1P#XT>O>l-by9Z3%i=vhpBFLgHy&g!V+Z6aZukl!jz99x~7vn0wl|5X8@} z3&p_UT~55L!#AjrUH z$Q?~9I!piKAV=Rl2XLG*ERJ#4;t;2;%C%2<+eqN5wifcgu~ihviYyMCDv>q0aQ1JF5rUo{95z`xxSE(`+UaZMN; z2KE4vd>0lmMDK~y-hysI230JRQx7sj{_~*o8erJ0Z$00zwEQhuzf_KVQCC3G>^WdK z;J@bFFMp>qqWk1Yoh~eP%aG31VX>VBuC)976A63S)D%pXT6V$%qbb%vG}ixZ3bHan z`VvI5e%#EFkV!X~GiJjbvFD8ev)dfH zBXUD6BaE2_R&^sPfg2UI|7>N$9lV2&N!@pYhyk;&PA3c=e_O;b*EcGQ=TYUW%~Y%& zU`GuQfy!4y8!+Srx)$flc$0#ML^Td_1WrPQkv1QDEnQZwwayZa;U6%x!-~m&0c2_8 zAI(F@36zTA|3%RT<9Fm&=m+J;2H(fqAK7)S|8cW#@au1plRHkKM7FGjW4}+#gdT(R8e847O(+tf7a(O^0Uyd#a zh(Px?tfMSkMjn+|9@%}K1Q8(|mm{1tem(JTtlrY5?{ znPsnKXg;~@Dn)PqVrCyX1@-xNLqw*XfUTglwsg4qUQ1G(PEr|6D{)XvW+xcE4-;fQ z#JwJ5Va+wN%wnGPn-l4bAh_Y57SVfh>YZmXrUu5Hp}kdzTv#K<~%{YdB4}a!!iSVt<;4E+u5h*%`_ot z^&RGbzkm+&hP?U@hX5cI*pZQeG1^HP9g5>{4<*O|**kHP8QK*(v&YxylCh$ao0#BI zlIYU2@FVEc)nslR(&rW8$f=DPw%IU^849=AlEtU=34M6OKt82FP6&9B?hd#}8V(c0 ziisNx6^y_*5kqOmUl|!D)*vvBsK$bRws$H>&>vx^V`?soH?p2lTC0E_iE-E6I%yGl ziP5pOFq)rvVV<@c?p-8Qt0aUXRhdauP+7siOkZ?}J5ohvX>4$Xx~a9d0=thZjt{LI zT_o=!j!)$*MWwG$M%U@xt1@CLjaK*>EAvM!s=FnesH1I)M=Sm@Suks^)x%RB;A{mF zT0{(#<;)Z8$K`cBAEAk4cCBkWs_kWKpKc`hqI3NIh$F(59vha10Oc#JG4Cpg7wKmd zF3fVG)ufzgHFnYe*6*5)SioOZ-V7SJU>#z?*PXprZdyGBDE7)BUII4F9JY_Wv>h zJT()`zcK9WjEwlK4DA2Puq%nm$|y|3g5hXQ%&%D*ku;XGQ(*^}m;Y$6tB=LoEMa#XtA|U+U|B zE9Za3-{)retE&Ddxt;Bw<@x9Kzn2UQkpGeI-?emhCZ_*in)`p0lkWf3*Z=+6{zG5? zJN}`o{}+AzpLO=%>g)fW=b!O^TD1Sa$DsR{`v2#1`u9Eh5AB|Th5dg=yZ^5(@?YNu z|9oToXXgGNjp~19?iuL+YP0_{bN{dHlj*-@?wS9Uxu<8PW25{3X6~0g-My5Sx4zk5 zw$&5Tjh@q`OmuIo#;Ml8A=3EN21y7(=&XK$AOnJ;%%dTYfkv6-gNI2Xkjqt$tt1pw zW2Uw!Jb`Ycs!%qUOJ*LMCP&nUjNh=El32a_Z1?JhH0F9#+`KhQ!omyW{uXjG+fK+too=DV5DZHa@cfW&tx8jM{PPYz z(M$N7dODZ0^J)c`2cN>1`Tp$dugo060ch~y4P>~{uoeEZ};$Rxj!$(VqANu-QO zqj$!<*K4dTZqU0?P`9>Nw>ijVvtM18Zrk32=_&RIT%(g*7X*zPeP%nBda=-vTUmtPY+8( zr(Tz7gIT&=W-Ex5A)!t&t3Z6cBRHULRWdBzFE)xF3}LlLaa)+N@JOJFz&n$=Z*Q0F zfKT6+MEKR?h4pPhsbHOyJ1m27(1vPAI%@SBCScpUQ9~sNMXqt(XqAmnbv%9$Q#v3y zu3CkLls<7Y#BKbFX9u`hEnc-h@}RjA!D&P8n!Ex$Md`O8vE*PCKSi)u3!Y7T>&VBb zioWK4WubcAJw6EvJbKOTcXyq=P}HG<3~%`#d{p7{ASH_1w4aJQdeewwDB7L8rGlZ% z`yu$OmEg$>t$0&Xl_Fma6m#@|=_$LUW6Ed$I@RG-1wtfJRcg=(l3nkc8J2}S--pL6 z%A^5v$T!$t59G5RUFXMd+Adku&y|xl$|7&r4I(<^H0siTCJ>W9L6~#ZdXYawK?KDn+S2y@rjwB|Qab znv6z8726toDKc7B27#4jrF8L`lB~yE=J+^7xfDJdWi_k#DphuYyiuRG{dm_6fzzg8 z14sNiA0_st3=Lr>+tl1?&BFm64elFw;jZ(#epAl?Wlc`Sgu||A zk6()#Npe-ANERtnTc>sPPu^^0k7;QEZ*>Tw-25$2TB|7l`Z&P5gM(J^j)624^h5wG7&`DvJF%fKa97Sf7`1Qr`WFC zwBF^#^@4wr7~@^;kb!>b$oi`}fA~o)0f@qErPRnJfJ3CL$Osp5%kyG6ReSa=dIK2g zk8d@7X|sssvP1~>-CBDq&RASu!rw)ajgpB)*m-SXVIf;OMi{y#No9$FXDTZ%{ij@R zIWk1UWV?bhBk2m%MMl?O#*T|1U`D+)V2?!93V(!EO=r+BCkHmJ>`@uVGr zb>TvW4hP9=^_imBdg?l?hA$PmE-W>$1;7DA** zM@zQVja?E1DczTi)PR1cFv)xDFTxbu|LL!R;S>!k&Rtca0BV{)71d*^%P!zn68@MzH!Nwgj#w?@2d3k#B7^Ws|b6UF~Gj!r%Rutqg9ma;at#gv#;NzD=ETkIR{9MuOWK zLOUgun!zsml8i@5J+GZYaz$T{KB8=?@O3t8H_kB%q}%g)rhfrMIJ&W_a2c=Id8WA;{pVfWIt-uw-F*3`E=om3agB<6ltmW% z*lzu}AWG0U2pkI0(L_7_X~QWDl~ol)r9}PMgF|;1$(gxi=A|ndZrhLWZi^HO3FYxFQ zPfSk2X1c3MS4N=D4 zY|B|=Dqt$GK*J@Xmk$Z&VYMY$sZ6Cja3k)?0% z1|CR)HW@W!uPpQv2)p0faQC_f!!HFs6wyH7yQYH=p9aO;@Mbzg(Aq_0WA@dB11rYc zL+!*>gYKjq-61+29Gb3GL_)@B!g+m(Y^q#Fb_n&6qo$l-vRX7kKxTO)(8X8HEdF%k z;%1hQ%JpDWlNZliXNqMSx}cURb1D5YFd zGg~j&BdMj`t~P%jDUnnnkwFz;!Uf1ll9CxxX+@BXleJY_OwoVJ9(OVDr+qxo%ADn3M~Ki$l~Gw?@wJ<^Pp%jH)ivR8Mcx?N z&O+MGM4j64iX`+_`PpmwuOm<56zcS@rQake>r6-=!(y!EX8%r4I}$)-{Tls^R|q-T zP_6+QO1)wQ97m(^RfJ=1=W{UvL%+PmtM=y|#kYb3x!Ms8-y0|d5i9+S_ZAGN}1_pubHrcxZPe)Z7Nsa8rFgE`4_7tA;seGn;e+Rjza*Xo(^ zIiL`(SaoV)XM7-ire^O;sNx0j0ORDD7?ImiLTz!IJ!Doos5bn*DGMwZ?%!wj^L`>o zY|sbQb+^CUTFWmr_a$9+FU;QU!GQO>8^P!^#;kuBN$Jl|thNiM_HKI%4o7%jCq9o8 zx78Jm7w7XS-NMCJ=TpN~{EKUjuU$ZmTTm59x#j~8!}Eef4rJHOa0l~kcATG(<$=cV z^Ee!*1KtO%S9TzlpWDI!5})N~<@2)4VhN{fxrKGATIHsr3v|W?x>&=AV--y*&Y#U| zQywNj@u98DvVHpTnPuTZ!%_Ko$9U)7!}kG;;o3hWItJMSi(?PE?}5vE7&E+uTXwLX z_VDe??R~W!j}3y;tyLu_{9W?C^-iy=9wArLaK4_JWuW(~=Polb`(sYFBiqZNHtWh! z$|0k|s@UlubW?opo-#v5abk9#{pkzFI*sF2R$&@ebm-JP+Uk`PgtuMg)2PwTB_{@~zfa<& zQ>VA#2_P!xum99p0IcrrOGC3Bk5F@QWVL0wW1CUZzT$}76oM+h;-%sh)E9|kzhm<) zMlQUtV#So6YBC++MmjH5F0XaT>P}$Y(@vd^`OwKznbB_XL1@4zd{KIAn!0JEh|+Zf z3MZE!7F2p=Mn5MY$1oQx2&wgtn>zh#8Tsahau&PStCf~z-=4vx;l;~DhJQf2;M7Rt z5mOFblq@T|>LpLJ`+X(zc?A8;$KSbLcl$lOAbVZ5Yju3}*DrH;e91ToQKC4`AgK*Q zmT7xSD^2$MnuUYsTCY#d96gthnxw>n&WNzQsnw1G%TK+%#bp3-jbeMgw$h=@!BhN! z=pk3Id3Xv>$Rp_DkVJ}wd_3aq(r6uJO9$lLaXY)Z>vADi_0mOsne~X%a zJP%fE=1z~HVv$QnNcUqvgUn#mcww5=!8fGiQ{dREo$OYxAbASBn%%=3`OCIS@Kwwp;6hu!l4$UHRNAt0&e>a!j&Kwh49! z&LG`HmPgDIpDV~Ri0==XM(K05zw9K)yPIsxsns2#_iGu7j;2oQ!1?7&kfVbtrLF^Q zpoAxbhv3&UHW*w0)O~AA&Y~?7o0#|G>uxVO6TSjHKdfe99Mbn5N;7x`@#H>NF8n_O z2>OsA&CgWp%-@z)J|DJLQH~!aU>Cbk*f4>i-}4+;ETuzo=K{vij=xxLQSZs)Zv?&> z?ycqpp(sS;Cj~t^veF<=rA1+rx8stD^+C0i16HL3tm)>lf6J0Y5Dq=a5{+YO1}XR} zvOf5M4HPm8tX>*LxdDe{BS0)l3Vi{oX?RKTz1H`h(4E_!g~-JGn? zp`jlb=Yks=;z8zJIa!Z1IRu<8XDJo8j2M>*G;f6nR(_sKd0kYMsS58U+lpv%Aica0 z@Hgu3<{z>)@><%-+4RMucHE;f#bWZScofByb}w(i49&Zn@Al?4*zq`1x%q)dmxhhg zef+!UIbx?la@`0oj|QZkjeR~AZZIdQsxuv`;vVXvaLHc+{3r*_W|uyXqm-I+#Oss= zs-aku5TAu&Zy0cr_3xk`i#>dW5Ggrb0bmeB~+(^`Rp09!b@I3i>MrtKJ zxL_PZXE}eU*K&)w@jtHh7?x3+N~N%YZAspHOQ0lSHQSlSWvT&&D zKLn?jfU3R6b42MPRtUzbUCN7wrNEY-0`4JCWh1zF@2TeF;4akeKiWy8E@j3;7fg!n zZo8wgu`tmRjS>R_#~)pDuT2~;5|;o;0fFUVfb6ToGVqEj+Hha3%Fas*REBnopNKrc zEvy*vBbc^^*Zy1!O`7}H8$K;ZCy)8|-#yOoIVdsYgX=w6LATU_;lVgVl`?r*g-x=U~{A6a1!={?Ralq@q9u5x#nE` zpW%t?Mk)`Au`S&Fe<%4^6ya1|I#(DGk?d~|(~`W2|2NCBBel(n zoN#W~)85~u=)Fb^x4`wE$3m%E*d?B~qbCL`Cs7uXH13yh!ZE6lEv^}n7Z$P=*4k>}f0>by_Om8xEJ$-MPEjGi_` zN0R5gKaY_}!rvcheVq#2e~L$NAw{}1d~lj9f3sUp)ZvH+u9~=#!*GfPI3S{qtd3!! zxiGz9*PJ9=fZ+QYnUSaDFTtKjxH??|p~LUl4_=#aIJWf5#Q3i0j6r|eZGwDZ_tT{b zAZN~7L+{FC*#Zi9@O;P%0V+(0?-)k)y}Rt=Z|Z4pkZ(=V_@z+~znBFzokDb`b9}LC zx!_n2Ri08-(0EJ9!pE=RU&?2U3EnK3lEOtA^~rn|Hu?uU*m<$bA+eL^MK}TrjJ7uozqJP8xqEDcb1X4vL zuZQ!ek`5SP*XYCIq;KbjBx#|*0CFO2(_d?YVve^LfIIpiDayn6BHDYK-I-lo+D^Od z;}N*L4Z>-EYYN6S*7u0k|J(Ihu0oNF11>HU19$JRK@kQ#u~SEspb=fFA2CXdgze~F zjM4@x(JB)g>J{ZJ*eX|Eyiy=QXu#U=oTZDhfq5mWb|736l z8^o|W$H4+G=WJxl^dmPIbwcyTYMlUci`FHH>pOfV_jT57*L`Yx@_O0ml+@kyNlRA6 z^h&3FT`F-v$hkI;S-{oS_sqVl--#IQl63*`Vxm4RCr%VNjqdGa`?id(`CV$fqIIjx zc~JJ`71G9|*lQtmY#i4X6n8$67BeI`0mTGs$YC?{TVsXfkep~c;yI@n9v5kVPP~2) z`O*!^3Z))*|8p}AQfx_J6hra(N({6C<1~H1$pupu1iM0n+N%&%KDj_`qHoNgb?(>U z@*aU%$oPDk7E^c!Oh)a}JVdncnyLudQ0+LTQmAjLpQwydUv>HYYVd;G zwq!v>*r7F7rAgd{>ubB?l*+EM(#7VKx6NJ4V{D-gCpb9=s#Y{E&m&t=xDp7TlCdKR zM;j_GPLveCvp>ptb4lTfx*SZK#Sya;JTmHXv0;Ud&-xMJH0D17>ZWrdN}R;$nlx%l zA(3-YUuOf3sTz4<_`RC^n99-Mm0 zMWP{OqhZKxFi+V|tRk}k}88T4#f0Ay>g*}A>d6(4v zixOzGQR1qDl%a@vOit$bp1VBG&_1TDBnDit`Lo1no+?Z_NKD`TIO z<6jDm6E?VdND-H}n!%^hoqv~V8nnf$dzJY)&|#~?gF_mhac;B|bB+Sd!eJd2dJZzn zR8;jihMWZnQ5~SFdJ+Ws(WQpL;d)DbcO$Z+vMWhE-Ws64wedWv99VuTsezqm1gM9v zp*q~|SvfMTjV{Z8x-$CpH14_D1GSH2z!?w#(DM@1srWa>11reC

          xq=1p9%k=B6P7V6A1k`6emiN1$5-A@EqL5|SE#<(J~vD9jW-K>x<=-!TWu2GiTV(jaS?+K)`;ZJjP6w!KJ%XTEt#vT1_K1R^R~Nu9 zB6|?Q?JK51&Q!;!`9j;8%VdJ&_=ONTYXam{7AuIV1;;$keOSJ>%qIQL#Y+i%aQr6p zr^ghF#u6*>I9Sn^{pnT`T)KMbOc`nY+F#?0)^U~?{D&b}SJP9ysVWU#iL_`njE-NX5u1+XhSlkhG+}pu5CqUXBmB^ zBR+>uAz|m1Po=_P>~=h_Is{PQruK+zwJOu;vo;yL-tNy$Np)sfVK8&H@81s)>^3~( zuXadXT|m1d6PcqVO~v(|D%=)#y6JxldgV!RR(Ax-*uUeW`)A?D zs7eWQqMPxM4}4FvJ{n>_0w%~#$Kc{OtbeQbhVjJ}_`m?f;X%ngP_MY>d(o~o=X>E2 zO&}~T%T8ZV-+4oPtq{`9a319(5vmkOgkwPW{m3lMMjiMOUbrfxf3vsbXv5Del5Z z6uEB;*miNI^SOryTJ>2@6DaN%PLO?v9~U4uB#KkL#kPm+d^t5+%dkczV0NzWP>f`gM-0wNIc1q8?=F3K}Tl%-Tmz!>e zXGuxswW}8okn7+v9Tz|gvt8doN}Hd{yTla;3<#DmAl>I z&YWqgDiICHn9Emph;=2=$mipI8@+2L_4ovp)`xcyw*n-bXPpC4&k#v7v>x4%dbf(` z6cnRe2TmnpRUJ5vLV;`x_!XNLe;H3)Ha+jw-=!S8rK~>6@HFFBns#s=44A(oGN-F= zfiSPA#D#p@APZO+=DQ2jp|v${G+--Y#B^-q>jdeT$Nwvg19m_#&D~7l=cvNnypslf zYRCIacB#p(EW0-AVXgj1e%x#*K%@Qsz2rCNUyRMqTm8nc=V^URhqpyG&NUt`hN>Ci zF(B`kiAr}C=BG9rRpO7%0)AIR)emee-q3m~q~yF=ZG%hhb0y#Bqp?m^|AJ^#VY}CW zV5r0*RBJkrkg#}W5CS}lk3>Ax*`wIdJWGlWH+Ha^hxs2aI%%Q!W~@_!=Pz-ew7-cx z&Wb-wXxlj*?nW~*#h(#-Zn)^j)g{^X&K}IV&9~2@adz<_f7iMU(v2`D|9v)4}9C9e-z!rL6O2`A$(?81< zLuKX%exL%xi9e(H#j)&aheYI9*a|_lfbvIX@diJu9*uliOM#V$+C0`fDkMyJAAp?n zWWQtQ`}@atE6(;R86XlP?hL$a%!xkK;f07L4#6&Z9tIuvp+7JHMCxJvi6zi*)} zC2cvFSwu+Bs|d95YD-iTBs{|zy{2>JMw46Px5CUGiK^%8s z1psXzX(S#Ej3DQ?gKRHCgYFHRp5sKvIHm3QWP4O-?{EG|FHM~KxW zJPnDEsYBZ73_rmVd=|sZHLQ#0Huk~e(t)8drDEBUSgQ^T@=R}QK%~x_>U(4-PDhNM zH#7^*rrQkojP2gpi1WVQT8A8-fg}SZc9c4VX2?XVz_Y}(L_L$0P+fyV0o(`k7lma% z=BHs;B3BIGtL%4`@A=gY$hmuGcc#>ztx?7zSW6Jsg}Mf;1;IzxFNr*3nc2=--dtXr zLPNmD^t_Y04KczRkqJczjhwn$afNJK!0CSfRqFG*YC7z*?tEm$wJpm7(f2!whmnWF zw4ld0Zvr|Ffybj<3yq_owyw*Dl{dG~(8>K%JQ>m%Ntq#WD4TO~4jx@j%6JG;9F=E~Yyg`; zGs*$(NUg9cV4cP=GoQi4Pxi|z*7Fh z6Q0Mv0gy z%h*9u%=zeY%VTks&rNDb5hfL!;amThTkpQQ6c|t)e<3Q#kM$JaI{6fwmf$?BezVJ* zSub#~as%^{+4=d8tRZr}AAMY=;ko=r4#@*zxN~AF;ib@8L_MS-`#JyYk)(3(F5;PqKKdC+utNt^M$j#h5bdBv@C;-S z;^^U+FyY06@wAY|M4St-A)XMeDo7M1s$}0QvTwPk;03!nbQe=P`o}WUAlK%*>&Vx-;VIlU;;Jg~!zn$m)()I? z8%~l$V3wu6k5So2=w>{RL1Eq;-kfxan|8*yR2CDBpws=$7UpRZ=-lMx1w4A?huyTJk38zOk65};pOxm`bL|Lj-eZWcN<2Qn1QiQz&KVX6=yLJ2+ z5MO1QXMGg(`H>3^y^=3InB~E+6zcNGM?-hGE zYI_t9J(9e;rTU+-v5Vh7prlmsjmT3`#aZ5+HV z|Af4u2XA8dcE6(aIWnpy<^vWcc=nci{Ivk7|Ub_OE)kHsnYgYiOJ)-+=$gC`0KMaBwx$j{- z6VALJyzb^~{=VcB`=dJ|M;MlHU`sG58v6aKYSZ5nMn9sB{?jL^&%nLZH1vbmb%H!` zG6x?Vagyw7-|L_;~SAq{ydrqH`SxWu5SV7jPyZf26!+}+8?R# z@$z3ge=oDp*_YmXOZz^e$6lhI@{l2v-L_7AegRIrbmlI|?$-6j9#9Hk)_r9UORV1@ zQQUoT%bpuP-xzu9LRV1>NHs4gO55^THGM(TpoTi8u}7^#9VyvJ_@5CC=mYuJ*5KCE zTO+~0KUv=vS-pb?yk&#jb>_w@4(DXw0oRE#&bSQ}H(PfOZ`Ke79sIBOUN zHehk0(P>9+E*;-gu>pxrQAGT1U}?XQ^RNJb`dz8FnD~Sr7tM)ISL`4D&$!Rs%vzZK zAHU$%0-gV^hrs$@2wz4mjhSviw^QfsLKv-+BlvZ2#&ZF#mfGf$^Wg z$wtV=$V|x2!1nJo1Py5!Ed@zxVS5)x%YQ+N|3@0azp4iuOw9k)JYZ#D{txB>%YO!z z{~g)P{;%c%8w11t>xBOQcl@8<@vme&BRj+Y4H^F*i{!s0mvX~O=i;v~dQ6yz*YMuA1iPGUrE z(CAD;DF_J@^7QaPcqobk%s}^Omh%@8SQ_+y;9EGnED%lQ(IC-Zi zzukOYxc$55ZhUUMe!6=(rB^szW-FA-&R5|Wi6YBfkq@)FiVHGqRHAd)fhwHTo4Ih1 z`S_vn4VqY4ciTxS20kfXjYW&mH43kFS08&QVosED$%#Fs9bPs?qdF})|ME@G#OE}bGx=38Nlm_AZ(OxMo$ z<+DE0X$x#Jcv3$sNOUI3u6kK;t(?;LLo9%L#XMvlGh_*6O4}|^*_m$hY^NCJo>1a2KMstdcBY~)-Dt2qG+Zz|Bl*JU&uk9M-6c?tIV;gGz7(+C7j&iO z4t4Jox}Et{tCPYs_C2f+*?f2S;_T0qy`_)jJhEIBE=^AxY4G6mXWPJ14^P_}Z(kbo zWp}yfq!YJhv7b^uc~RiCIP$U@9SU^@tuDYg`|}mlopRtrCcI&4PFk(;Ug|xQ`wHk# zn?*p#@GXIq+Lo%zn9oQatH1ADUx==jt=q3DUt+Z;^^C$d(yvKA^U5FLyncBj{4n$PBSiikr2X7?xGSaHek?eHupa98 z>qGyNvwYwj$0v5POt64(F&3kW85&7n0<8id%7$`NBL51-7oByR_w__@0T}a$pP{bq zL6`}$!U>9CO^=8*>P%m2sg2ng;$8B!hV)GGnTfA!%JJly?>Ri&c~j+$0Pc-HtHaUg z6v^z+5F*`%v6iHoFy`1E9*&h$i&kkiv&;$j+=}Dg(I0u|U+VebTPy^RN(|;=N*tHB zRI2ZJv|>-lv;^A-#jE1)#1%LsOye8N6ZY9Rxvh0ohxts(8OsenxMTGJGgtlv++EyF zA3MEa_vYU8KcN3`^H1~tH4hdhff9{I1#&2Q4LL=uT>Je^w!>_iH7S!M8zobhu`@bN zo>i7^o^_H5$jW2jH}xI)#CT9_vg??;FD5m5+rqZSv#)7b)w*f@UhN!vPf%@(5#a?x z`l9H3?TXVipFGKtIYFBKAl;$*p1d*N^eq-Vh8JOoGkXYMn`JjIeEq)l%Q}R++e_clJ+K)HQpHoTIQU|W^+*^ohWyQX}`Hzc!#W{ z%c?j1er!3z=8E_vU~nTWOZkM{9MwNkR-6d4fY}wsv1Dd#6cS;N%PnJmq;8ewSeIMY z#lb5!UiM_z&dr!~zCypf!}*wY$92%-vGbXdn?t?OusfBZ&T^&Q2&rj10Beg1c9M5$A_|LWjp;Ay-9vj4+P^j`st?qU5hNEyIqz4XhkaZSp zfE$=@teXw@N_yUN%F4TxG?{F+g13j_-}VOM?liQ+xY?DftV(_-!vq@l19 zIJ`tI_xXMx$_dHXVNfq`9h>MGE5DIwWFEsi6fu>#`=PPz^aXtj}}Yu!5Mkue}R5OR2zR@X*B z(&+=Y0|EPVa%|jzN@1O!KrZ1^^u!9HYWaq_TFgCkd-Brqb#qgynj<;@+!UQ7tHLpb z0_dR_s|tmhP@EHBP8_Y9%gL+jHAIK`?09nDTx-3dYA#ilWoZIQ{MVXJFAeUvl0!HVah}VKt&Bc z&%O{LaiN>8kSH7_I#1UIW&J$I603NqCxTf{k5mXN(s-V_tK^*e>*$(Irs99`+92(P z{q9Ah8M{QHsY#9@1$Y0@eSTMN*G7Y64YrEPn2LGj;L$-%^y#49Gz1m+s0in{si2=7 z_gGdo1*S)Ew}8vC{CwuJ(3*5yYau0uC#IMj| zs{bnO3@ZgSO|Q0||0B4CnWCdf#`E=4+`JAYxqUS8QI#)r7=0X(n;>071 zsf2n|4KvxOh*6i>cx%oW>8UqtC9I0gJFQv4C6rXu&d0|4<;O`;n3q@t>*%22mu}T? zviKYQ2#v;^=6V;H*&NseR3)4UmEFD10IAbHtr*ozT4YEk{ha>?BQ zlg8Gr#Iet4u#p^E%&fYfOry=ks3tvUuPvLh2jsmh_hB8QiBHFQg5U~+(xjN&w&OPh5UfKloQVw} z(L8oF$u*iZB>|y1GSt{wPmbvwQJ|$*JUSR7ljl}H-(4)Y@a>ECLTsFmC@!M)pBj~6 zC!-oRg|i*vUgqWA6t%q@$r(1W#CqO=O2++Ysy8{;maWF+SG9kCBXz+W``lVOutb?x1!Sd-i=Y!S^7)72N++x~=2iNgGq;{9R_@ z+_Tq`;ZbtacBWa_b%G5AA?*ERQ8I3%GH)_C(n|EkCbPg!&fPK~L7wnhx zhq7u(7p9#7hb#vKqagQ0cn!-K-=fkQMmMU-Zon?uYby4&wu?C4v6C&X74xX7SvvSdR!~W8U!TJ z22d8zw!iW(YCJ@b+a!o9;5}D==u@EddcuxyVvI(Uzr{`*4ro>fI6foQF&i2<_9(Wc zY))B4v=hfTX(<;^w8<9DBAfyt1?k7>&zOpc2T>IfNU@mauyLo`nJwcDJjX+O zX#>oH2|8<*XU+E@rgtdD=iDBy9=I34f9 zIpP6HZcOs8ftDjXgX=a}*2XVPNrU&Alv$%PO(RSTWY=h9qK8pR%Yl@r09*h*IrP4_ z1FORz(n<6|jziYLa{G0Akb~LEqAjPzSxa_fx;4#j>86tHMay-Y28va0>xva~#vH1u zy|9GknSLsNW$r&^1Dvpu?6-nN+m_A3{WJf(J{{vfbbG)PKsxnLzaKXOxPg@9TXp-v z8sYx@h5Y&DGt-~*YnJ~OZi-_3(bQ4AlsV~u`%Hz5JAFNCVrBYTW=B_T8UafYUnn^& zngYS_@b}Qm?=>)pKfgC#;CfyPUU~~&_#R1Klzo2hnFT!n0Wh;++65dxeP&eCHQ3Vm zVWXM?2p}GRfgXXR0jFZoidx-<1^9R?yPMRu@eZW}%;ba4Q`&RE|-P(YrjjI>9rO?MNPLl9*EJ5Wcv&4)*&o+#Z1U?)C$)ITkQZ8vSk>f7VU?R!!-nj+7};w##5YLjo|~ zk(sXY%s2FBn)y>K{g{?|!+fN$5Q{%T&DQv*>VL#Tzd~R?oUoohm@b=`E|-`u)y*W7 zIS)y=3FsKR2KtA*gL0mm?0#WPKRifww~SPH?U3%-Pwxi02yB{)NK!YDTLX|)*O z_K&m_v@BKw-w3Cg_c-E3wI+Py!L%k6IUmJVM-={PU$?}H;k1%)_Se5qI&vLh?`W{i zHF||$CX-d9h)rG5PxHd_RL7(6sLgdl(ejSz{Iw#EXTdX2XSPIYCP0*mj|j)A6{b93 zGjMiq43c&7Ff_>q<3n{ay>OCIYb;U6A!{gqC6b8~l_&ewO{f@wrWALSqzXH6r=)4% zvSOhdQ)bz2RAdKj6G#zVV#{(KM6IQldZ&RjDs!S|7kQ&a?`c(eN6>cLmMwy;5R)4C zI82IP7ft>xg*~FTvv^%hX5T7G@mZ%%k(k9N#l{*08Qa)1QGXj|1G|)5!-+J@ z;OVrKGAV2qcW>Y-GJ0!Gu}kXHKhO0dWorA3ePos_WPNK_GQz84IolzqnNExcr-t5c zPVvB)fWuhYa3)qV;FE`pZ7$*+b)vL_TlRjXS_>I9;#Rz_I=g&GRar?ZAJRDKhh(Ut zjbYe{+dwD#?PP|*nA&xn%OXh)*jCn;4^m4mO(jbs(bYTqfkHhW1L`~3r(ZefC}!31 z$v>~;dg}Q5RH@GNe)~@4lKcrVOV^uD5ButNCz`knxH5Wp+wX^6pF94zC}0~Yg0~1!JiyWEpZIJ8FJ2$944OhRS+tZFllNG92EC5qa`K<)$?| z&XbtxJsi*njdbCB(7W?ecSI9>2@BOa4&IDheUawjaDAW^bRPbewvRYPAx3%O0 z@0JvE+wSk$=2KoH32;`Q{joQEVy-wj-SBTPY8@XW(YU<0AFnEq3)#fiplJ@>YuU>( z14);IXu^+^o>F#eZX(sxdSnd#O|TO%sP^9?qW|Ts;o#z8``^c$|9#W`zad22JS_j2 z5OMLa{ufgf=l{V}^*`G2%%q(EG5?S8U-*!Snyi?L7M+@vt(lX8ncM$t(<`Ymh}i!z zl~+Uf&$x*6zq3}cv;H5gRUAD3*;@6#8vXy39dWY!Z)+9Df8rRdtpC3_#{Wk!|Bs~p z---XvSmS@*=l_f~*jN$%U#P}^jg0lbqZ*uS|CMU6v9kZqr~3cE8ckjB-fGLA+@3S- z@2qUkGd*UkiQ^Px7;tfQPzCK1lt15p3QGjiH-w{eiYw<&{46M_re?%SrDc@z_XoF? zXISn~vfQfBD8^pJKU!6(5HjC>&H`WreSO_L`fQ(={hfW?{>%bx^`3Y!4#1HSRZ9>y zm@{OwyYI=3`t6Ppz!^PPVNLGqVt;!;_er9md(G;5zZR6oe$9Hojl+lx*f0=#St=Wftz9h5ZOnb}%+-NRIir;~?IvsMJTA}ZI zKSUUSsZ-i~WL~$jYxcrY)BP+_mVTD8Kd|S&4@e}SWMXi3b)+@aVCQHb5Sxf2Eb$53q2>K^!AAW8MB6pgqKRR2JaLHv zZI~pu@*u}zgW8$qqb(VpDL0$3d6eLJQKLmQ^Z(t7w;x&ZzNPiTBMaf=)6E-q@p5sv zd0p3Rnw)A{3O6~ZA5z|ZcOyKbG+!?2t$;x@ZmqL#Qlb@^je(cTLMtnqf}7U zU@dAydWCEA$hjl@WNXl!^J{;@uO4rU7%aichpq^KyZMHGi`x0`L~l-h+-|-KIoix; zJ2%bW%{OmnUA;sHXgY|8k_r|^P+B+lJW8ao^{+s5NMZE_;}aW@SL)b>`Hj>Y^sNvYhj-|E5C4q#CH*zKAb0v$Y>C!^%pd&~wB=4p z9Lv-Xx~1(R-ic`47kz>I3e1wEj1M`~wIg1g`pgg{@x^#8{*WKw-P5=OUM^ksU*a{`UFB(8Bu-ga|cizTHIDw5;}zP&pD=U>?VjT`2hrh|UdF}fvQzY?`dr21 zruoa&(bq`W>!3HvNPBIaxVzLEBOgN-1tE^hnFVXY4mZfs!t6v+J83I!D`6|!cKQ?f z6)emMH^f*CwK^BR7ux@ZLC6s>pQ#mAk9Z*C&DaAcVGd*9pLxf@oWOPPep{>cFL#)! zkGdP!8^Q^YN@{M$Ig^~BGTC#ZNf*r+H~))c_3I{1HEYN!3kY&d-h^WuoZd@uq-$r; zLwtsLCVPf=O8`Lj64u@id&3)!l)j>UAo=oq%YHe1IT>}_cHEYiMFNLhj5A*ZRs7EM ztg_e*CZyb?-iulfDf4D_^1Dyl8;drS?U1>m{sHZ%IK0C@;y=(%Jzz4XqbY^TO#$0N zHKWxn`Q5ID*b7y@n@by}Qy|V(6x*iHe(NEB6Cu&D`UBcC zQqvc+M+(6-2@d71M<4iVp-UN0D@-+J$-Uo5DmjXxFwGaWRI9q4p#b<}G^u(?kla7m zO&_qsK95aHZgi-LcDPexR;lp!T{osNcw%Zxf!mj1(&4Xgonh%BWPL_%7Ad0Om(@m$ zxu(qnOPlMz&Suw)OBjd!Z=1C4`>qc(9gw!8HjS(K!_+WYAhaGSTm=-wK_~ukiF@L7 zsg|s0L)${gqivY;8Zh`yEd5YMvC+KLojwA_-3?`V zSETi1f*FR;FW;z{!-uDyp90Kx8;?G ztHsU^&DjcPv)IV{1~sb&3N)q|EOGKZCFb2{4}QBv2Ogr1650j|1U^aT3j7qpZA^O_ z8|%Hv1RTA&#A_;xfq?Wa6!zw!y}8@QTB``I`pJC@L#zH|CqL(6GeavE{fKCH{)!uI zERvL{Rzm!YsMbBJgHj0Ze{-fLUByBDg?L@*{V4tz@NHxQ^xXEAUC>;^Va-T}EcOR= zCHc2)`Wd_wJf<-ljR;pN9AF&&IuPT-oesNtQ()-0oR&Dk4UqWD=n5!AE9f#P#SE5v zDud=Tc6eOA=XLqaU>WIXwbROD>GC4c@GL5oxKb|tM9i@On1{k@DUO{%zHx<@9 zZROKKsT{?R>*MQerHZzD=9~*|X;$txb18kzqk)2#1A|+lB{es`oCCIm*jXf{odjGp zv8{gy1e@R2p%@4V_V65-q>=46xCsrq;b9z?hPb<;t8BA20#^s<4w|T%G+n=sDZ=K- zyP^>@z&Q4z87v1ThOQmfHgW-x1B3enRPyqaI`}`wN76+LJG(3of|I>O zH29pK(sR^1krs*9^c6IT=ZLlfc=S(jhZsxe%HZ|MfmXl-@&Hnu{l@*dgmUTAMIoIj zyl~DLe7MwpL-Np09dk&D<5p_X3{L!@Q%6rfU>s}0UG%qv5cqgZ?W_PRo1d5*-nRs1 zk@JGMwL=eBYtbS@a&nSb5t+ZLecz&pP3C1u2FC{cwI_g8%=h?18*m}kvrp^b_YyM>>2#r@yeLOagndyHs z4&LB#+AASGeeY!DnBpU1-gbUJNg(2mc{mayUH2dvbKjSNbDxL8qJj6 zEx_`6Yj%=%2r%=A1f-~LK`aUsi#uMfntMH2h)U=KK;-L zjEztsShx0w>mxacqrDqtMi?(}h;m@^-`DIzx(o@lIxzLI_{2RB`#hcTTmq|egozaB z#xNg{6Alo*%8qclvY-dgmT)BA>Y*RY3#F#6^xsmMB{Wz$VVT02%p zUQKxU78gFS%%^aSbrj8^=UhFtL5B}kGNVVx2auV;ev2ojb9mXoyG|?DKjTTiFOzPrj zy}e^N&+i9!kk*Q|6;JdRM!Ort^}<=$+L}pSP2-JgjnjkbUi7GUAI+yRq$n-%RvPTi zc7LS1;Bb%$*A5nJQ7+e3P8QmNi=iPiZi?NfowLTAaj95G6`W1;AYO2-xmV`r>bKYF zuDZ6lsd+9|0aj*9Y+x{)phdx?TGfIydK#t+&3}GEcnmggfmWouUyu+5hp19!ZGPXr z&1U21^Cyq6%-B}?i>-ogWp}fyUsuN=fZS}CuRYk-uC!0s6wlC{8-Ami^JHK{{n4O# z6fO^2`cPrx`*nub`|QZg8jHZnidG55UWs@=4ka&Fap>n7z#n zBM`pCbepr~c-h2^ulvQYTkM}dxr3V@R{mdqB@)e2P~i!&d&t6dF-9|4`Vqxs^qu9D zL}6RX$0+lWyK(p0zCUj+xh{Ds8xEu~=Ar^->X-iFNQCMpAQvL9UJ9e~n3XZ8dX9O} z>?1MGIBv2X2W74m0u)_wsrFtUksqBY9PwCeU>``7$YpLpc({Jv&m@wHUPjXs_f82` zSu-(y;C^A*J6$^-Z&C*%471<7x>?b=k6%0~2Ew#R1!XW2b|Ec7KH-B(tp#Cive~2< zy2wFtFuR=^sX*{i9U>GMZ`*dYWI0zJVD`{!6kunB{o}JNJBNbRW^!^@^8nUnmNeVO zzgK34rq^{EaZ!R~CT3LfZpUD)*X*E4F!$Q~JM&Vok(Hpdw1H$Vv+rADKCPP;F1vJ? zlW&H0P>-KXYxq&>7vUwTV;;LD{R^dLKyf#6U8B5LTEa=hRD_8H>@5drFsnz{{P>T> zQa9whVLF+k&v(={H_Odop9}v`6pkGoPF{8py8DesTQof>(7&^?YRq1KRnw;*sx-)Dr*em?s zIGP>w06QE^0p20gGxSeGuP3jb+0-K^Y{{a4UeH})W}~X; zz-noi+P1=s&rGHWU``AzrwgdW|GRt-m&x4(MG_3^90%zevrZ%l3=`w*0q*{SH;I=& zv;zD!ERP%NGoL^565a2u2;-I_Uf_%^j{?TqB!peQD3<*c&GeL);jF$!^6Pd=gN2y2 zKq#YATJIe>Ez);wv#$NGWc8%GBma7ytwZ-YCZ;rEf>9388z(eWjMAgzy(ElM3|j`V zSv!Z$8&Om~KKanvF~qgnrrW)?Y1p0PMZiPSTk^dR>)QHSWmty7#)}S@2Ie$*diYpH zEE$LqGZGIC*~;@YQO&srIc<@#Nc3vHFUK~K7w~{OxUzQ2vZ+?^y443JH{*ds+bsu4 zkwKwg@N(RO)tQ>zyE`4WqvLV%MWtEoc|T5|p`S)(Z%mvEnu_9I-+W*H^W+A&_CXO$ z>puB+;7)9CJN@C3q#*zUl>@U`Zdr3ksAC-3myUr6RY*Qgr|flxxm_5K{B8|6%WaF7?gEx1$WP>=uy&ios<=~ z^PB#il8v3WxCxb1)tF~zon#4QRTjQJarHZMW^k8NehoB-vzm|y4*w_e)m`9fbN^G4Fj9mo_pk{lAX z$=S&sGW|bFSuXS(Leko{DsgBO+;CRz z#-e(bBiSTmuqd1)9;`vRMaW-$f=tJPf!w6C}bKb)@zas}(=onE?YUFCevLq<8LE(Z^<2J&V66+wcAs?T61<=$>!gB z>PPv&@;w5lweK$)zIb6Zmql&b@A4OuCNt)rT{ek_l~<0&|B+AlR+qJEKK;;5I-Blj z^bcpL%imUz8oB0fE}u=&|DLpE+jQ2opjqQl<%;s^WTSAy5jo0AuLMOYtWtG}=iJ~C zLw!N5RBVT48CbA;*j%b!VUj4qKbuhxBj>AJak3n+L7Jaozbl?zmR`cC9De-u>+VhL zXDDN|ez^g@mXfs|J}it@T$g)>ZDm0E-@q0;q+kVe$}A{jm?u7SnDhG)TCGytD&@My znO|EpDW%MtKDNElF`0hCQeNebPkXz3)a2RPRye zU-{@|@iNBZrNw;{)`hK(?R<(>teg&+(V8Kt!>$Ky`QswwIU*x?peF1C!?#|-@4vKN zGXQt0((=eYP{$w*Frf&N9@qiJ3Hw;1C-*k`YYVXyZgk#6z%vR6>cF{HF%Bdh6;t>_ z4rG8He@n&g4<_uxAJA&t^dy{)Z-YO08T=UKYsDKYMmCWpC~cJ`x!5!(x^UickPiFx zx3Ed)=fbT1O_xogDjeqvDg=0lsDvae0_Rc~06&HW%0-EQ5;@S!ro{OIS(lgG-m!g zoL3S@NRQ!C5hl(Itiu0~g=?9pKx)(=>1J z&3x;yPVAUoBceWi#AgFfK{5NG!z+zW^|k@gOAk-%XPB7`wk45D$E)#B`*ZP(krf!(CR0C96*U5s+Z1xxZq{vcfQr&qz0}1q=d73BZ~?BI_V@nE0!h+2L9x zPGA>RRa?y4fQy6tbtQFX{Ofu#=CbqoW=PcFjjjg&!+2U&(C_|c5yz+HdR`Ik40Lt2 zvrqT^L8J97X?W9qRU_H3v;FG*G#Smb#`>H}>Q@3T-}(DNpt<5;*ggEuVyV@To>Zs= zUE7**iXb_ixY?Ib9Fft`=#WZV+t^EO#El^I{(Fs(cRdM)A@R(Ikh6~`sOBQcw`n4p5CXvyqA`4&9(hGOS8G*YvSxgT-|!D6d07)aT-n|TIULe>?r^; zP7({eh;hCjPW1rZp7EZJ4st(BSz)?;p-dsOQCH`-QWPLFP zc1>^56RySEx>H`P3BOtb9*h_sgoRtRtyaPS6r0P)rvs3Vw_R}XHs9i%4AW1jpg(D! z(xB!3#ZHc1-S^mab8L2g&_Rp+i2xsn#_Ehv@*lsY}b?jr@Gt5jSKIVXIln+x4ioq1Gx&~M&ESgZo_lD z{L7g_oko&di+BK%H}Y1{3AHt6gV+wCHg2bn<7gEPLBO`3^EC#p;fzVZM9}TZ$l1ah>mT?ES6J0Vnxo< zJHBG|=ag!sNdRxD$djZO98OP(@N(ER@fh*Q;Ol}-Rc286Jy?ri`Dv3ABia6p<+)&F znsG(!!aUekNRB)$i8l)-h_(FrE-cx_zM{?PUfSfoG6s#s#PRiH(aRs)3f)?Z-|zr) zoogXtTg&hgzMrsxpG<$;HnzY5ZjBu$XM4+eAAFPm_iTt5lPHMRvac9?Wr3$_ycU#w zYwHp5fd}(p2*B0f0>+&Nw%{J7UE$xr)`E)UZyFYjSVggZAo~mH-y} zVW_iHC14d;{~Qd8mmDbfL4t=VP|o)@?4f%&lDp9E|Ah~4ZE4RHLugfcZO%LWV2Y0w zC_ju|$Pk}QNavw}P?bb8N<|}iLW{e_O4MMCkPNRCTY0U6LkE>D zx(5GKA7)(vppZKP_7rzAj(HebpJB{%zo1A@>d%jDw2_LjO!|VGxcV=9e68EaFFYCT zLPAWhAyv%OH>5}58xpBlK!xON-}9D6GTDjN4Ze54G1{qHbS0d0mFEpGnxMR?G@c*{ zm~pFkPN?3*wgPr#dx@ZL4IMc@VTWt}2(JPVc0=O{Y3J@{_%kpcm}T_A@Lf9NV=BsD zFWc=42(^&IUN`E7PujM{7N1Arw>}VXR1x_r@YcgvND<(EM(?^nD3^gL8xLV^h_8Ffk6NK0JlJ?cr&;3joY4Tq_)Q9|Ui@ zes6wmrmGIVt|~qs#OB1X8Gut6QkU>z8um_BV?BftE`9DwE8DOOli?9owNV6B{t6-= zA4gCO|2fWw18d(!${)gr^=qvQN@f^=EpTRtgK%}kN`AxGwwcnB_0*)Ki14=ITY&{6 zxU8xl*`8^sV6h;_#*xb{%N76`S`ItHM!1e7b+9a%yEv`Gg91J0V3NDNbPGY>G_i8a zd+Ph%v**&VybANaBK?aDdutm9qOKNsp->udT>a~Uq7;V{bxW{*7V>vIGB)^W;jUY! zw+B**BiAuF#mesrrux@DIzpb?iFEqBKgfRMc{Yz{%Pm&`#E($akk&X1@j087wmL*F z#6U@nfXfroO1%q}$;5gmy;4xJn_cMa#JHKl8#9#VT8+zX^M%QhweM>p_vBJV%L z4vdh#_wo+DtMOh{>A08l(~mw^j-#&HUGWlHu%L-)*}hD6`QpU}pxP#{sraw)eTMa; zcT5eZ?fO=`Zzre3ee7noe-b)$oLuTYc(*iy@KEeK9N**x!sG#{khwu#2!%?4vs&=2 z$3xd&^H#%7N8-b~Pb{DPG7-teOYHglM*TJjr_e%lVAn01R9>5VI%TmpG&HpwXTHiF z)$z6ZulO_HW{S$`KEyR#_Z9S?IZ0A%^F*~9iw+emD7(Q zAg5GtUM9Pau97oW{f_;ZII*?bNIU!+?7+x<)L_wiFf6J+o|Hd?BG5zUf6pELov3F$ zfiyNUmZB#G;?4b_${pj7Sp+iHv<)A~E&TXNbh7{vM+;^K zo!13Mfk%4@v?Wysn?MlaY2FP}EgMkQkdbM>SM$@f{cCBh_1N^1ba=RgwE;0Ia-w&W zwJUR_Gum8p5q(rFt9sEEy}=L@UGp!hxtOc?`tKh{+q>cWC!JZbbbt!B#)PMTM6_q{ zmiLZ;nI#HyYT?Pm7y}x*^eYj+$q`K!`UgZZvFjz>J&P>uK7{v zg?<#Gl&jqWLb+xH5%Ov^U4=2nfg8-R=w#*bL$H>xDB@e$6cLMqP}PuBcGyTItly4J zaEp)V!vf`bj!nb`?E7Y6apMC)$~v5%Jfl&9dVb5Q7^CteS>47TACvYkCrrejzS$0a z%?INtVHYs_&m}cIu3KlYhT~s0biS)?_btF#Ltf{#qw&6}2mk;0kv;xf2kmGbbUi+C zq()VjYiqH%-$WjTr82%RIRp1eCX1n>(2xArUwy>ZdGVGQaJqDF`16 z=OOpUvF`{P(faF6M$7%yuY7R-fZ+pf3!dqlr#O;xX?tlwzA^~Db;Z`N{r3)EA|4?Z zj(doyMdZdU@h7_C!@3d(uJ~sSi*Qbk@X5i-$Cjr1zJ$-QphU`V<8N!h6St&c^(yQs zk>m)mW>WNJh~_f=pUOv|nGgo_Wybh2bMGa&cVUVWHlo64xoz-fTZj_S0(DUTRg*3F zaR95u(qX1SMmGQF3Q1!rb}zf}=;O^L21?fYqtVk;VXMh#>gF0-r{Sj8x-9)9SjdkA z4JG|B!MX|0Jl4jrPI|4dw@jDoul{(;V4em3pWImbe-vB{3E8icZ(QQ}fUCINgfj2e zAv!)~%xWY@nG|vhOn1}R<`;-QlfhBlH~$}5T9stBX_&a z;R*DJv{8}!4jp$n$<@t#te=YUY@RrDQ>e1Mge|vLGNd5Q3n) z1q|n^>13u(VCHPk88tVVyF-mSu=G*hpi-^CV)CUSaM<-2#pBH&Y!N!PN+J#&NPlq7 zsNT9`O7bQNtkF~K-o5X$4-p_V@9Da&N77=TL|;Qum9i0@BgNoxTAW(w^H%I0Dt#s? z^3lmzMqOXuXX%4$SWzwuQ=g+^=Uqd;2r=FU$lV6Gb}p07C0yYa@BaSf6!k+MZ>m#S zfxAJn6$)5F4VFzmPT>$8*3QpC%%zrt@8EO#05{S*W$-*PTD%uPi{kxwQa^4vJL{X; zegArSair3h>4SAzvX|5Otvunggg4{+S*xqtZqYwB^Cxl^&+$!p!~|hYhCINR&$MMqO#WO6`^@Qm*@IPvmTL?=eGoep;Z@JZ-uY*nTwg~m-E989rx z-_ntzM~B?Z8?{`d(mAF59TapZjPJ7#eNQ1kuDDvlL)FeS>huDAFJjx{6ywF?S1s4P zw0vF3fAJE%An|C|Bkw!&$@*RK!T62y%6|g5o_%FHWXj5IuM|rm%g@Zi{%Be<)d_5P zu|tKvPpUZ^JK+edpiz-MMVyo-6BQc@Firk(%&try)YlTh3;9q*okrR1MEb(VSUMPh zJZRLxPmDYg#m%npT!xR0ysxYlOBI8;D-lADBB^)M)iF~ZIp7%VPMGH%r*}0dkT=_A zcP3^($d&`F%v^R&R{iJjZyWEBOr%fUzEQ1ynRNs&40*;MNY4=?Vz46{K}q`WAq^wR znyp_^lqfw02`tKi%|iLwbC3R~coUb43nNbPr047J=ZTWZpy;WkhO3*JAFyoo?B|Ce z=gb_nf$_Xt+0qe99+#0}Mw>Y0iLyUk*lV5Kl6bGKG#r~|AWLvzGY8L5m%KK=`gmB^ zsvZeZ<0Obi4eZ=YIu#ay=qJC`lFC-q5YQ0La=-{dP`kJxa6%T^Ay%8nFuFe;Y>-Dd zT*bih_*AJ)g*3hiD=`v%LU-@E008MX_otYBF%m;pHXc#m#I3q6qs?J=+mlna9gJ#= zUdMX+k}gsRCL~ycxw}B02G;NcSkV)KodXo5fv?TK5Pe~JyO#M%vVvolUrZ~%!Cnxk zH-*ms7VBIcp6q$-^Ieh0mx@tLB>aqw9HXgFII-HVI96AeKNJfo9LdZjKH7)!5-y17 zpfpyR*0LcdlT}vFqf=U%;Y4r3)KC9iUa1a|)VTWBGJ{xhGr0Z`MMBt%0s64K_4lMM zzUr!{fw*6S<_1OE?B0~>vNYhYkg5dW>YS}2{Q}&)p6N&6g;((+>)I(q=6>;H8Dwl;&GB@#=3@-d2FwRj0C?zLddhW zfgWoejW_E+OvCevyt(ASw)yqFN)3jsD7T#T#aE|)jBOl%T&Q#+woMt39zKTXk434! zgWS^lja_jAQcaLwks_3;7{_?8{T{DsQp^B_B{sw&oBIh9N^j}L5jVP?tM2CpQ1P9c z-}m;`Q|Ck@$dS%VGYD%pq=^EbP&!Bf6B<0x!h`YGd|XFy!!v*3reY$l!iPOme}pfG zd4nNDt9feAGjR_C;M=bL!|uG+AniRc_Wq;*f!+V1sRA=h1@CV#ofkJP-38&N59H4v zT1gFa!t@E~nAc?aZZ6)H$F^BNzZdDS+JYZsOcp%;n4WwOYQsHqAS_tXFuJeH_c{^c z^HCOS=*%T4$4);fiir*0o*HWkKjCG}b{2lkoLqza+Ev5lUN`St zPS_=07JIeS6__{5u6{iJnsZ@KvC3@Z89){)kCVb4*@?nQtHMnA37bkU?O|C?oi{t; z)cD`-te?}mPP~PBdC`2$Ozy2*_{9fq0|;y&N3He^t_drCb9}b=u`$kM>f#o?ZT+{6 zmLnMt-i>1Rn`CpBWEH0Dr|zWCFOIhkm8XJ*Kz*GJ3C8-YBWzl>iG8!~N!Jv3m!*qR zU$8din@ba+Twd%F;4d4m)#lZBTbDLQp?|K#KE|Y2^yQ2`%6#+*#`VG!1&QrzQSC#d zplX*5-1rbtF)C1_c3{q$#qZW6fWyxP7;gBb!qbc%SWjucH=1U|*kS@+-q`hZ%csZb z7DTfXN97XZz_?@CJoA+7X}w7B%hlSJO@&aNRA!RFn?kGgan=~~;kER22Q*DVukXNY zrYJ2>;oguN!x)=T+crltW!c*a^434@)>-*bG6vx=i~#rLhaTYZtXEOhY03Ctt^vS& z8n<>4jZwZ_^NFvto@dSbg4*Udq`QX4*Yk=8@-7TZxzO185n4VqivPqKJ4hRrUEZXc z-OZ)hMG)IrvwThwml6(nm|?i6t&KtlgI}U-f9 z;uT?(Z#DUgZt!aO=IjP`8`Wq3mG{==^hR6~=ro+)rgT;D^n{JCm*Nm_lf|s*-g~<9 zK_klLtzbYwjSkJ9_g0|5pyeqx7;63>MX7aktHmUTM6nLD;JjnQj|(1yG~0$nBaV#l zar10yEH%|A>&ZIpAa{VwBw;o_qqr0R#@?C0u78xpFpA(-Ys%;xLAe2XH%eU$9*NDk ze+sSNPKG`W4Y65MhbFpS_VZzxTWSZWtpkrTEP=#5nVsicU*y{~4=>q=_PIyu#IT!t z$y*!w1yv+jfFcE$gb^(zrhH1zKgIr)W;R(Yu?f zO{sO4;GTQE0gP99ZdJIdc8o|slE~(f4O%rO#qSziY>&d z@HbLC)<0VJRE*QIycU6Oo7yqi}b zaM5U@u5cj9tJt7uX?{{L{J|;e=OE!=H+dmWr7B@6KmbedId_063+BmDVcG#)(K;c* zpN5A)D@b|5xftmnJOX)xd|khH;{*M2cq2l-`E5G$*F*tcctW z`}kSzJTO#(ohlIS*xJahiN2lC2zvv>c>#zSdRSbvnUx zA%M5Dkw~{e$uFw?*7-eP@sv=#fFya8G|n~{eAVa%HERSp%jtHcHI>QzqNIdj*^BpJ zmfrBL@@iEdblYKQ$NPCIn)Z+Ti*KKgBdcx4{i>Cz_j^P*vQe2-(xlHqpl@A_PARHD zpbnEwL?XRvdJh{xlg5dC-J%xE2-0CHLnyz1nqhM52EMe5YS5eHIZr9~)Z==74^(il zwJ3^Fz_tY(U@Ke=Uwu(XNEC*At)E1LivlfL!kxr+a1#7OGRF0$sE|1Y^N3XWBb?I= z$<^0J&`0Fvg5&r3UJ#9}*}&mJAYo&LSZ=@z1G*)hN}qL=1!lRB*!Ae#nhDE$qgC%XIrdPQeo_qB4X_84OUBrrBSk zI$WyO`s0SHl@CXV-?qg3VPRQH%C^0ETzvcaX_Blg_Z#CmpIC(g^9Y|Lghb%-)Y(} zIExSPp+e&KPV2N+1r2QM;dGLyg>mV(oK5NNMt~X*+H3u(jLXms%{Z(wcB>auwt-DX z2Ff%DSn5`0+ZCqSD?48KoSOjgjEd<+h4Sww9{FJ{aAJdqoWv0&O)tWobKku2)cPM%pxFCJ!S0!AVHN^PQ7k^0*KALBka#%}B z_AywJuj=}QSS}T#&_$eA>}V!dD697G#)EM}Xynn<@%Cx<$0d%d%hf@r{YG?#Zvn&j z11<=V9K@5Wo39k>ut#hG<3M68G9}SE9-vWE(R(YnsJk%HoEgUH#Md(sUS`R0456{p z|Mg(Sh<)PBa&~OIFpVXn$snr)o=UtZ-`QUL8=GB3*A!DP4%JjMt7yatYw1bM zMm`x}AI@+F@rf|bmSeYXcdbx;6KA$+5662KnSvT)_*(kUpzZ07hvd)uw5BdeukZ2` z(W*hCkF~pZ#m%J^q>kP2Bgr=KuEa|-SNnEr&nD-X_Iv4TpP<+4)h#J(g?woKgP$p< zo#Zv()@L_J^&|vuou-F`D+;i?yPhu`pkyn=>9RNpkK0}lc(|;_U#!LPY2$=or&*V4 zh1WZbPD!VAR!pr_=4I5dByGM!W8|4V@L}14J|U}IpoCRe&!J-NJH9mTLoaWJgeV7V z{l41r68k=G{LSeH6g)Zk9Lj9K07J4IbnJ+sM@e$Ry!$i5ep8j(01+koDpH`+%I>e) zA|DQCB0DfO!_tFx&@o-z(9B1VL+VrD)i-4Dp=O^Myp(CNd4`#-GC^~Wb{QAIgce;{ zCET~<%1V%#dz&tun6LbhexYk`X?S;8wsM3xx}||?z9)Dy!S^I|f^>iTc0sxA>vIC? zOC$hOex&b}7YVD9P5x?vHA$YH;4Bum(iG5$p+i@ROdg)FKFa^dFO*SG24dAUP~+_zg&$4z@|Hr+Yxx@2}H*v3b2 zC&0-!JRC7sLoMrh{`7wl-RIIJqUrd zEySxVPvbML;5XIdOD@(_fj3FMveO^aTTV4D8BYP`txDO`Uw=ilHph*2lCu;5G}#zo zzVm#egbRbG%Z%6`5%V;!J8HhtIXEtm*Jrj|CPFLaIG5lwvQ(hfF@;kVS6*(xMi!i1 zMIf*ZS2MCT7kb@=zE?6p*LdT8ucd-Mep?zRW1TN&rL9DS{F(Q3a}du&)2|e4)!~-9 zn){fJ83XNv-{=aFSt?SMtyHVa5P6tjDba(JCsao1;3#ivs_(u=$L~DYMIENgE2oRX`~-y62|VlWt6%D^D2bu zx}pN;p?N>^t)!0r)lI5ECdC?a-YxGvN@KTgP6HLPWtzskzpQbE1qE=t|afSC$? zc(0o7_#+FBLhnnhspcDnItkOnQ*=E)k#w1qs(Pxf3VRqdf3IHktQ*H zgn&`$u^uvVYca`4+oh$J`0LQPMe_S}Y;$Qs#mSb4HYH#>X{dItsS_iFegY%pvB$4o z!X{<|(=SS}*El ze43Ke}$gWy%7yppfwgn)<3tI_+d+C~bVe*__O6jQ-Fl!A)Ur;#YYIM8Go+`f%AAuGot>HM}UMfQc0KMNvPNtD|ohg+luqmfAZ<{t4A z7u*x1bc`3Q4VcCJbBK|WT5e2$rI7hcR@L?;gI_SE&o!z9q}5s{-|A0t>D+*qWq$kJ z?+&v(n6_q$$a#Sfsq^eP(ba+1Zx>dZR|c9v++7`2frt20PN}*&6?0wFMsofB5{UJT zxpTY0l)I6b<$Jwv*rbr{GoK;sy}o5)uE+VaL;Y;!;#l?5bPW0rgd4cq7}n7Lpxz6|EWLb0aVfTBmKf>a|Hos zos2t=zUslbDEn4YOa0&uR&sw!tZ7SL6*;A3!Sl9FB7lG;1rrrTe+!h&BWK`T%dhzo z&WzK{X+!W*K=qq;)CS*U_o$h~#1>`M$%sr^Z%~G=vol6O$>;7KCmLtHVKVl zJVR<=3c5@K=WbIZ(w;Glf=OK%{-kONQIR0gL;c2!o9*J8$y)GsrG(sIP_(LOX$_7y zm2!+oeDg+92_zB0pGGf!i2#J_58!$sqY{uvwGC=}sA_G*zy0`&D1zaa@ z1pB@&z8o(`*JD0AS8M-uTU@Oi*Irs(Z9V-c7`~f!^icY(bU4r#5-;(J?&JB} z(=?z(Y`B=b7rYDgNp402XiX6*1asq;x|tvLV!* zm&Y$DbWYrFshrHB>>)f7d08cMX_=P9LMlr4)j4hU(nEqnODdKI*F}H**_B(rcqzrS zoOQCUG<2y=74GvU9wgGYd5X=k?Zqw^5Y|NBI31kwBt+G&ewGJ|6R`xF+J7>N}#F~l=`?7Gp)|cWX=K~56DE4$*EikZCN~~M(*ID{T~TCoW56O z`pTD=a6{kdMpt~w->O4-=6{Y0_dY>nVU5O>>dDV?UoKDoD!04#o~L7-DRbJ*&kg{Z z^nUDs+_9k1T?4I+l;e~QR^u7tb~otoR8Cs_gvol4sJB_)!bSE+ljnU^O?;1>Rz!iwQHWmyVWWKK)mLj;GVmRTnSl_T!{SB4(Cn zNeMi^DwF;tXUdX1^XWgLpD01>{my$Xt8jx536`TAIt4E8I(u}m>Sx!;ua*L^#}JdC z&mn9Bdiv&dR&=fltYVA#-%=G+37Xf<8tGDgr6$)fezw2)`)UsJtGhk>%K51HHGR}a z@|*QCfiyAc7ZM=i=)sDi^9G*KL90rn+F&w>LTK_Fj-%%#<3}|5M}v2)B(;yU2#Y@q zq{||w*@E#!Ohnm40HR@{1$1hJ9kdUQ;Y|M*dG8oy*|Kd5r)}G|ZQGT$ZQEvLW~FW0 z&PrRAwr%s%Vo?WZrMQc zJ?(w$n9!k{Nq`#Qvn7648PkMrGDS_L&FR`^3d_CDM#_B=;=2+`&Qk^m}I3X*eqwZ7+jf#S?xnuRpJLobsVlCNMqam{L!<9Vb%}si`C9(Y4(??ECK_fxpiZ#c66f zZI++Rzr}%8X2|DqL0n8S^W4q zsHVPrBlQLM8OQGDz9_{F^4ooht;6yu1~@I2>zk{M;3;ExJ+ZvLumf$7KZ7mb%k=%* zQ4J0oKvG+f>>IAV)lMb-A+H5ea*(bMfgfH}+Do|e2IACPgaJ`gFD;)0yu3`_ zGNHl2yw^Jauu^|`EQ*U|ZB(7?bbNna18?D*@$Ad5`}py_gX?L1(QM#3!p)k%g~b}` z8FJp8Z(Dp&@4yKhC@@+@V<0~gL==qyQEG*%%ozLZd_p z@`~XM#h$~;L=z$2#VdE{MYBi{mh?xdD5?U(nKGs1FCu=F+NW+8VbK~*l(7DyCjnHc zG|jNrGW1-;Qxu*MmNDhzHg~!-`f0UlLAAY#QK=WK14|cPUHL_a776VAn6aQ^-2=G? z%=_?HtNYAGX&=-NT_60eD&LsT>TEIc1*+p%ED_%(pjr9%Xwe_#5I@%Rr~&F0(7Llg zKk{_M7ZjScX##K(Z1*d3 zQAwP`R z(^Vaa>fD4QlJ29q4@9NsbDFdS@MNk*jv-b-c&{X>P?lshmFBQW;GN@)#URjHH1bGc z?_wF~9(ND0_H`+w)9PL7QtDFECO$=hYrn03p~+LDrfURH;T%jsskL>iawEXn>(SOE zUL9P{=Jc+Ox?VW=(65r?*?$K3iF?bx1b+2Dw7mtpOGQ{(C#OzH2{$4?rD~cLam%+N z{yN#+7)c`KByCfYJDuVroeFqJDxiIeW%ZY$0-w<%y<5RqK12LANuxY}Na7pFwb9wH zZDPyvP5B@Ii;~NF;N3kz(B)O6scT_~L(H!k6yOVSe7tTD{CjR`IZSt?Wh&Xov!WNs zK3IoIA*-4T=UxvpDJNZ;t(#_iXCMJ5;522}{Fyz6iM`ic`FY6NNn|ij4M89&JAH@D z#)Z{)~x!a{9*TgqoP`8{pHxqpH;rbf{b#Yf{AByGIW5B)xKW4P!ZMx|BZ0RP!`^xh@I$uk(@%bFZy9x|%`$~PmYOBB7T!K$%E7>Bic+BRUFphzCp8fK#WW3h9 zYaco4Pai=RCCLXipBp@PRC7sBAbkT;*yl{a?vN6)mivi?UY>Ed+HaT8!gb};1bt!H zao;ZOpz+zxaHQxRTRRI6KexEO#@e>(!?;DkYN?#{wC(lFtLaE0;}iUX^$2_DZGCMl z2L~S`r`+}lz5;E%nEIFjssfE-->?ErB{`g5r-?xgh0|*zu(UQAnl42Uovu|IuE6S7 zU|uBMu2M|O>^KyolFk{LuB*Oy`P&@mtiCk*LY?h7-bt$-Hz?d-=!1Xobi%I&Y6?;=@-qG#=@5VZ(Y8I1Yk zAV4Y~Fu6{m+MKRC84X%rkLESz-z=v)R=97f@Vogb-bl-OSFXhG`FakWRj=NOyK5OU z0(?p9_uB0I#rmK5J+LU1y6EKg@(EM47DVC>TnAaDpUK+>!<0CEBcdDvbb*K7T zd)v;L-4n~_ZsU&k&WCysH8%OMY17Kb3Kx4)_EI)mtMjRRtqDE)XcBm{W?{PP%hefc z%gbq2Js|%bj}~i3=S$6K2^d#2;jpJ%uGow0j-L7F{uT-E3p)Z?Izk|!u?*QtFn}VG z#DEM0$iRAADt9mBttuymjs`mKB%N2B(+2m?TkV_@JNiV(A;3o+g-(})^$;!2&Jya{ zvF?&9xS(t|>Z71GyKt~Ufd&&wYkPy~@k0_tfUhJ@?WNdzJ!N0EhEqSP zmVDH!UqiOKHVVGASbII$m^KkkRmcVuErFy8^--&$DoeF!JpH?qp(a^5PA#k*m(uoD zOf}+A2if~n9wMYXO50Qo-2voRQOccDR!Wgbo8dFVe12ow*EWjmSn9@(h>RDDJ`kXgR8bl&1A(i8ySN5fHLzAC)ngLFaO7+bXI1d3C|G3 zQfd*Y7cXpb9xCTbz(nPl-{YZp9}@5LXu_HBq{*+2rC+*V^F2;<6x8lBim7$mt8s38 z&2I*u+w479RuRro-DZHV*$w7uu54({ZQtK;AjJ=;g^`b{A!>m)w6-X^c9AW*#n z+Qu}dPid)F9J{r(EH0fN8}K#@9@088g{`5t@@-i8$3mOLC*>P_R(#>1T~9%5+!<;6%2Ccrj(%=rdliE@({o z=D`oYO3O2fBW}+q3(^_3Dq^2VU?$iOC6 znb@otiSivTi(+~QhYoEc)E(dao%}5wfe!TG$z%@Hm|_1N7%b8+9$yP9E<^53D>N|; z7kebN>0T2Q+I;ty%&KR4Evb-QH(e!#jO2;k5wW9gWNSv2JV!7h%;U)!=!5B`mVJpk zkM#b+cwfq()-OqY?vO(*F4p!wB<+`*@no%P$4>Z2Vv%A~XY zQd3M^x*ySpSc5WFpAytTn2j~$jSM5{pgnk3A7*~}cvN|VVmjC){-;9s-IeNR(345G zxQ1aN{w4k-_W0iXX=8?-0)6X?#Y1C;e3`N>UvX^PODWgsA@ON=#+Bkz>kIoTJ04#l ztcQEf;?a)k005A$Ewh3}IXid|V@u?E+0A>h^NicJEidF0R7C{e#gKh`O#*|bMuA2$Qw1r(xrn}A^z1HsfYE=V2R$`ORhiU#d-O>s}kEvHLJBc~f zi!n2AmqYG3Rs2vjX)T@EYIlzL)G$32`t}#hhvjY9?x*Br5` zR5KV-ZOD(L!u1gYI&Xu2|>(2tqlO`Rq+EyJ#t(m%0=3yL?I z=(35o-a_%T^*n}=4)n}|qiYQELs?NTHUloPzne!1kC~mzSyb%UZ}UDNC&yKgfBP&N z@-6&O*;Bl5h}kNDHB2pKghgY3Yn8xb81E;XKc5}_Io|Mj;bxi<t0%kV zIOi9qqj#>&mci7}ltIx|jOv%eW?EgK`$+O|qh{VB!rKM33F9ksY%Fquw+(~<#72Bs zIuo#-(njY3`vPy;E$au=3GiY+M1Ie-kDkYzET{tB6;!Nt%sKE8Q=;N7&Y55nb`ywabhG%Xp+z|?0ZwjfkS`nMMxdfk zZJXnfunY2K4B?Y*-}`(Tos_>$j6pX|8s24gfpXw=PWhZ8vH^SE^&|Y2r^~q;mG#(`KW8( zX8`-jH`7Z^mtrf!uV_2^Dxp6tQZwpPQ15_W{hYFl#^r~vhHLY?Laz1a5_ER?u~uu- z?Tk&t+O*n7^XXOvzFty?c?FNxh0L?-hEQ7TSeA>JA9V-iwcDguF=Pk~)o{ zi%RSdGrSz3US%mn3*u*GIczf^xQJ(+F;5)n(n&b!U`qZ%T;`}VkT3wmy%hRHVTcW| z%g{1_YQ|FPqmnr4IC6o!v?~LPd03e1nQ)JG@qH0q#1_6!=`40SX{uU3RJBwxV!OLY zCy&&M+bTNA$XW+go$^;I+)rS7Ex0N6>=J;3%(CDp?W?zZN2V+}|- z1vC5=^`SUmWq`?i5qqGYvyP5N`}p&zav?DQ!~!Vwu@qj!bLBp{XQN3_9g%xqt^~5) zg>e?ca^XG!3*n!^OIN)j+F#QPlps_w19fd7I6*_VZx=~k?2y%{?@7Ll`|%gxS=H_u zP{3!H1hf3{kAc_#*8q_Vo#LkyVV(i)A;N*l_Bq3Nj^d9{uIcP!%L5o@K+WG}fI1{^ z=OYB7HqQ@wcI@^-OYijV^dvv&zKZt02EG(;-Fl;Xnt*|krqgCgh(iN8Ia@bocppg*K``EEylP>9zx zdeFDe&`RT+AquvB84t}XdQga_Ibkr6=Fq5)2o1Vn*`XPwIK1vUAtUf%M;ncM(2(D( zjv@+Fy)tufOnqYdv|my;Q@u^So^6yYeb5Ee*UTse*o7ukG-|do%3(!5Ap4JBxhSFE zdq}D>)kxe&2l|VhpC3(F*V5Il6Gz;UN_I$e0GR9pyQ} z!442q{DcKSO;8p<;9gyQEQZlj8Q{!j%x^e}s1;098(+qL}6`mDxa*INp?^Chm|gEPYm^!+M}KlFy5T8N`UC3vrAcBdle54?1)FKTA<| zOS<=7-#(4Oq>sM>Q`N{H8oEDTxxY!mGWI}_U@kNEsPLX@m4Ce_srbM^PLtpB2FjlL z?N}}0-;W0OIrk4y2pNQRv(1#$2zXR=zunuTn8=;VcE@;9R5gk0r!7<{hUjZ*hmWZ~ z@5@O?83#NqkgfplNIm4PR=AeCm9knEX;z+E=4s}7vZNd?oTq7OzJn2DEHae%l}kS7XB$_^Se~*jol7Sp z7paS!hmjEZCdD^zzEYHzLa1@_9F?0o@3Q*KP^sj+dOuZ@p7q3j+vDdsuI4D_KQIIN z>DSVS1`|k*MWppQSRa=mwFVX-dsBk%OTdoTF@1%e|y7al?^UHN3zm`r> zy=qy_YlHUtnTTV@vRc-kFRxae%P3>)t5e*iQqn-h?tNsQ@xaISvRsb2T^C!sq?ndG z4mbHeMxOXi8I3-Pbk7FD%J6FRV!D*t(P$67u{8X)Owl zPUiMR$F=T_^v@_m;e~5CgKHL8v9B6f3!9tk!^L9;MR9KfH}OsjS-q>)aw6A6j>6~q zwARYXX5&*4u3J|TI^={%rV5H(A)+a3Hk7ZYmo3hvY3XSE9DR%}SY?*{fhaCdj`l!2 zBg8=?cWtDWFmn)a3==`LEJ|V3wP$gRh`p@7YdK-2a|Y{cXFB7EsZ=9ZWYzpHKvcuV z%Ks#0{HK=f-^6+uS=j$l&+bxPDO@V(9y!cT2|%1Kk@P(62`wz)BJBFjM*4i{`L6FKUIB|{^j^WHrD?o zVa(1!z|P7*z|6|}XZjDYv9S{{ax(tmiTO|bqyD%3@AB{TH&|KOp#H$`^k4e_#$W6H zVgH}n|L_I%+aEg<)1UaAXZvHV{W&EronF#Pjc{(fzL%m1FkANW0o-|27v|LpU3{9cnk+u1pw z{yx^9^Z1?q1OL80{~JL4U)cWtevCh#slVQ+zc=Zhy4)-r%>OUC-2eVa{+IJb*;xKv zh@16)E5yyj$oxM(UzCmQKPqvv|Em%=CkH3n|5=DTnG0GSWvT5bGi_z%Y3kfdL*Gq9 zeFhax5S@Vn*#qJ`1r zOP8dTt*xb(Y$8k3VXyD5AAcA(&Z`(U8Q}?eU}_z{9i6(UozW!|4;&-zHdd^))U?+g7y=7fk_%Nk zRnf{$=Fm%YMaN$WtK-{-04l>~ges(?zMfQ_vDtauJ%v&oqYHh_KE@`?o;_K&fxmtM zex$p|u5pc~tcydu%;#O{Y&BM!m>wne`1@k&Y^~H;FyFDTW4>0+T%E5k&v`iBCF&l3 zff3%aMH`5mtj6G0U-wW=y)81C204dT_zi-0L14-|^#%H|$D;?_AXfMIxd1 zNfc4T+7bHQ@Rg&V)wkQ0SIVu^lGvvskpx!F9eUaVZhUc6zi=XH6s>}AJ}|AzU~y8k zWcHeylonB)qRE(;+WZN6_X1SC;G_nUN51O$AFt9{jVp;W4pndpxcc^XM-JMIz|;_B z6gjS$1WklqN((sA-=iI&tn%kR#RT3>YLO?@Z6`7#W7gg7Py$ViQb}WXO3PWssHY#A zMT?3lRkPfrE(Z6?dx60$Or^{V3erq8A!EEaH?|>lmGJI+u9Vbs|hvRJ0>LR=M9UY z`fFVs^?(Va$8FmRWiaNG+OOTEkdiTf453>LrRrLZ1rA2#xeFCI23WSlkeB*hw~ybx zv)wbdp%XD%QyIQOZgA?{O`Q7DDjX`N${njVhe~kp{S~Q2-Wua*u9QF8z93gls zfZw+Wu-0hHGap@j6&;@->}M7E8_nK5+FztI8$t+9fi_9vv>|)vl(M;e_}^weN=O=k zxMs6G9&WnPtL(opB=ZPH3KFKGqbHY7k7cHpC!TM`_<0VI#C;3khan+_+-}Bjf~9A49|?PYura*^34wCpXr+Jw-4l5jf}_6ghT6Q1otX4kI+IMQy7u? z!2En@D%U6u0SU^ZF5Ms7*M_FqjF2C3+cjwW7O`Nk{KYj;jMDhX!Zh5SU=3!JD(UEG zT|cWo!)JJy7^h$Ip>hswk>7`+YcsIMnK?n?AU6dUz5SGSPWl++I&@j*hVYZG0I_7( z6$$1btQtf(f%=7T_M9S8B=Gtf=@>O4Hh+769g@R(Dm9=)4)S?k#d`?mdrnHEjVh|$ zKxbT+uTA;|Z>B@Ohsi@`a{l`1`OEo*p5DgOatJOo)aX=-{petK0A|s++WCFg^;Lyh zXOq>m8vJ51>Hsrj2s}a>We=GI-Jv-of`wt+t!e(Lk-IK1jp7}YbfkFHNf{Aj_wtYj za4*>YVh@)IVQri#|V3NierWQdpDX|8TxL>DzBz$jJ_HznaEEIci)!ChH?TT z3y77;TGdbk*4zQ51btX5^$TH)2C8fZQwR;OR39p#+8-uIOwWLaNWvJ)P^wZ?l}e1? ziAG5ggJ5E^2A;Fp8T*74i>0rEud047{EV zj%bL*oWZQTwn_Rx$pt~VrO!e=gTp{XQIN`NhP7c*N~Lq`>ZhTvt~Me*seI?>!(OtL zo-TW%k25FVmcv(b{SJj&@rUe7g>cSz!LU;O^23s!)~)(|19}n)q@ZqLeea!%d1R6l z-sy~fjMy+y=u(cSYN>=kwOmBnHD zG3oY|u_g!wKtKk7H74y|>Jva!F)AjoB2LV0gM)_MyMRP$B2EeFAce|P9I4&ST?BgE1AAk16-;I^-GRIV zL=tKi12fvNhiMQpZ!uRou{dRhD;Kqy}@cQJP=7@pwh-(y-+?8u1NVOEHE?5#ai3$XS*|Fa`4+txvQBw!Q$ksleRN!Zd z7Rt}DSO4v#`_S5k@f`&>P)8u#F{V)E0EI68>~B$aiX zWa0IBn_NQL{OiH*25tkG378`?(=akwNOIF9*>SJD_Fixu!f|hP+c>5z##)Ixj3&b_oV|%qi#R0n(}n>+>wmR6*0MgYcNUCa@pif1w*gBc-?VjC zX}t<)z;E1*Dt_%RgqEOfEKOCmb$e;~ZEak8V>y-ly!%xu+a4p}GtATLxE;a4Kn;;1 zVH47?K8YA=h6zKrG*K%O;vvPiUU;fnfae=b&Lbipekb4*{7S&Ao{Ge?_gHj^w96Mx zl!T8pSS%9w722@<_N#PP*aT6p>$Cs(X{6kpPXY8>SMQVnvI1cH5zE{VUosDt&GHYs zAq+`>LX=eZk*jHV2`n8Bh5_gol|Dz7SNqTSaogsD{8!`eH0stn#)38Q88)ARe6#At z)}*EAd+VF~{rlfY@|+0jcJqm5*g0O33Em?_^QaL714ZLCQ3)lA8H|-cneBbEHvlD3 zYS(tg`_fq2ivpm~f(@$u)5+lF($z?J=?8e;%{;<<`ZD{Su;qPOyrk*|skinRZdsky z;Jdwj7c15HHobrZ8M zOU`br9Zf*)8yBjgd+FQ`m%-&Mu`{~8P8_%?___f0L=#9e8>2^&Y}gEuiV?Z9s-E)G zOCnSDlR~>P8)FD(>f_G=N2!**{TldH@mRhVE;`_28rK$552BtI?06b2Wvr|AqJg+1sMHmSq=z#byQt%bq*cn8)ZWGleb z%1~vBYkzRbL92ia&^#Kz+mcS{+MHsD7O2n%eNjL&g%*a zg1|`|GoGks^EW^ZDMeQ1;ar9TpW>ngm=o;gS+pJxFRA4*>-mhe-L)By`q>SDr%k2z zHD1&G4oKHmJ+976P%~3gZIk{ZZ;-xvgjT+3-;}5Oi*5qvO^?S!;Pb6RSW9gqtpmqd z+P}UUa5oE?HjzmrQNw2cC2_JtAay*v0&9QZq7~nYu-v7X@uF zE!?i6!j04Ru|LS^zE~eVI580iF9EsUJ@AGvqu(itrWL1q(WMgN$+>~^L|Y4gyJP!V&1*D`*ZS4y-7I2NmHtHNCNV^crH#W3QDsPasp+o({7c(z-GSh z;+he4Y9-^xvRRp)KLG>NDZ%jDm6)W8P@+4!Tbl=oV}C-4?H6svMulyks4EI!1);)r zuAnoF+oM-=+u!hc>{Io<$!4F|zlshHjxTmCVZZF2PmxpYZ%|uas&DX_$pyn|w}hnY zolanT^r!#O(Z8cvyB(mh+f4JK_YGQEC42G8;9|4c>@*VQ@mm3Gx);~CLSwmN*)`P5 z1h|sdS&txb>vZARrK1-m4u)jHI}`wJM9XNFH=1umvc7Ckr=^Y16pSb(Z5#-iZuM(e z6Nq&%Lh|9h-T{?&`8-DTcsQS1kv6$DE=WP2^1VwbKvY`k%ym*AbLhbIkCHFLcTXba z%q0s6N_Ss#QyU;9HMImXBE13NqiInD;D7OWYJ&Hl^4WWvb%PDB``GIU6{+ru>o$`> zA;h={x!b(`?CdU~yz;#bWMziV!^>tX-GY*0k_~W5I;jIM5OA9W9X(*Fd z=y(lIl;r55KiOZ8R%5C*Wxx!88LJsNpcc&=FA#;Ak1V^@V?&Q&oli#D{TyadyPSN`9 zp8Hhy+|yP2-g^5uoz$+=t6_i7BNA{*`0kTu6npW)KoU^7lr)x53?Z!1)r$V=aIN={ zU{cS;DIH(2T;ke8_q7=}eWG^~O(lf74mjmqtLB~g#f|a)qru&MKK~UK+X|Zvd58YF zd0rUbo3_Vy8d=@tYm*lq{{AZJ%phfb3Uh~t1+6Nc& zpv@krMu^f^7DEfp(x{Z66a6(FK}*4k5%t=vVRhbqqwL|_ejqdvLB$nnQIC68$fg$R z1!?q+!b&(X$t8iQjn)eN@%}+8w{LQlX(~iDroi;JrPN9MQdyW0qjCM5w?;X&erV~|hWcKFd{q!{q&%XZgDX;5m z;q{|)e1DpjntpU_^={G123KwC$Jd!12SRD)j{I2WK8g+|X&Ba8Xhq4!2G)q1C;1z5 zm1-ZOpZn+>y4n|o?Ndmdd>Yqv7@P_@=%&DOfHhZzF0*kX^P+(vGokUX6HKwVR=zNo zf%n)niUb8C$B+b0bk95q`=9F1-H2U+l;)m7ca&H?RZ?Pxc_FCT<7|#yG6PXLFn~H z85%}FPeInD$;Yn?sxIT|j_j8q$8W1;y?u=tW1O?Yz64uZZq7^0HQVB*DXOB^JLrov zzI!SAWwXkYO<6%4Xh*OdM32hu)lj%Uuqsm7Rrd2woxIZwv@>-?Su&-*MVumz*HH!L zrW?KPeanv2UyoB!*e?r@RCOnlGcn>Is&&%nFK4*P4I0}_fj|ov@svoa9RS5_x~)f< zh(Ple-Mf;q^T`NIMpqh>o*OtrIVXNjYuWlKzJGFSz{b#?$pe@NH#IFVffamrHhaWU z9G5w>y6b8S7EH=j{ryC(Aw2>M8`j`T8XIs&MPRC-b9L;_^2gqzWuq#AN`VQ)O2xdU z3&>fc6y_Vv9B{}h9xYkskJ&p1sb5%Go5iY>c6*)P#9Kd^c?#wYc?nk$P67H)@;Wso z*GeyD>sRa82O`lKmB)}Jc5Rd#Zem(&r3Nd&=;4dBh8Wp^;NaSiTa+`ocETa zB=;uMk<=31RYw(&DYmbpzFyGql2TMuYueQP#j|WCana`5^ z&=HsHPqbVn$7Kigh~3`5Ud$?fXxKI0^7zJo3IUu9`B4H^y}e!=(T zji}64<$$}xUF@UfGuV6+4F_NWkNFqUVsDCUEO6U=4zM)F!m?CI; z2$dpgdQAB&t~p(%6<($lV7V~#EYY<&tU045RZ+2RL&>^{{HCRwT^+eia|hcBePz## zAYAp;2|?DQvL#7TVWZnJ?&t+BoSV3p8@I)keU*-#TaC_E7o$Z?@+P9R#xK(*(i+Q# zHu&oPidAjeD%F-Js?)>(VZ`}n z5Zif0`DO^)MconEIj-{eIO>Iu=X(3s=fKA`ZtkxDo`9b1p6y<)%pK?v*|vY|CiFv3 z6*+Z=$TXCH=Lphl14^!M-bw>Rt}&r)IkP(!;O&oI6GH!mGrC&NpKNO?86J_7Np|x` zD=djN<=WWD^?5jJh1T-}xr|nUl<^ia(+ou~F}gXFzl@y8OE5C4NrEOX8B%FggCr3i zJcAT#W>4>_bgRtN;jAN%Wy!P+HEmDXaGC3zX0=VLBOSJiA5)9Vcx4h+gP?w8r+eeD zsui5BrYS;)y7o<&`_^IwGxMjTSH@ae{#d{te*Of*i22@C!cZPl?;)+d|62L3e){?%GtQr&6e zr@`RM{%i}XSi4LOoz+WPth`^?=~ts0R#xBOY+Fu>Duw zft0$WJmwr(H z;3xbK?f)y-IiUWY{tbU=`yJb7=HUEi{PG5;O^;3WKm z_wXCPef~55m+^k*|6K6Dbo#S_V}?^1okxEnL8jM_>7DeSK||aW!R?bCt+tag|)k5=SG<<+~0Lm`qJJ zXpV}J!ApHY_hUP$(%kvp-2=xDaU&vyPFrR9HC(|hu>}vfA?}h*^qeeuR4CVf2FLRu z=jD~4HBO|zO+%Z43$YSy!|MQm9;P&s6VwRsIrUABtNM_n>ju7Sk34NQx=&Shig$Si zTLR)wc6%(AtA1k7KgDlBcwEso*xGv7U)W`byz7pbHPPv|M}H*rVBOA;Yp%5y7B!8r zrwAUOmO)^m3uB5U;YlIJ`HH^@Fn=da;R7)*!bkg<#=nfji31@af*h3q<|QsvmVOxV zj~)r0h;JsKt_N)V5|{6V-4~(T7o(&=Ey{D=572l~0J|-aNeTg?fS|2cgc}njObWZ5 zMNk1i=7?7MRSRBJ57;YmqZ~xo%-|cjs3_45ls}I|_!5zCHUrLq?WKtRi8#a`r_%}% z1M1lWKK4`qcuz3lO0^n0$pFlq9y(-*wi-O6`Yz!u`Y!E^+K$hQ=Z9Ala~1UJHA{WW zGqFuiBW7X_)R+^hIg>JBR?7IvaBTu?Zvv7YePNE~iQm1|hvOT9C(!e=CpsrgvC5qG zUM-+p;oE!2Gia_8bw><0C9cR*9&u{ibOb#}wQ=qw35p;8C#8KM;s+QnuoKjdt}D#- zshBhRYJ|=Nb-X76Z-Ak?bb9LSx&wv_m~23TU)+2xI=KJd6*9VptSa+WFP3T^ zS?YyjBetl%C|m*YF~;@bbSb<~XcY%&+|Py^pJ%OnQm0X^3E~OBLmjk+9#G#mK`O^t zrh5`Dkhg2ud$hycFCpzX^qoO>a9@hWoo5EZ9etAyI;bA+V&x|;IKF?M}2{23vjo&Z!C2wh%1KQ#|0%%Rd z>)7k<>hT@U+GzV}2wiu|mTL^Bhc;vR@%^xk#o<4|6=?16;o>97XC3b0?mr1%K|Yel z;P3f?rhD0YDWq@2-T{2kzVLctdVr`BUMC5NC0L`|Q)vMCsz`f?;Cqkl`kp{u!o7t) z<+_bH$bvA(8X4ml5sNc8`@E;HRsgtzX${HinU^^#Wf9_E_?M1DVhn;B3uH_BMBs10Lgu0@W9*n0j#dU?C;|k_V}F9RQqClI3Vum zhMQX9;)a)Y&m5q2qu96KZsgt}d~x`}Q2<~?{M*7LP}77=6VU2otqI%`fvplx9MKmTmrcTkauRtA3#5gzUzM00MWyso`%Twcl7rRsAfhw860j> ztE59e>T|7#SDs_7!-HC+f?hb|L-ldV1nAt*tBell>)bcu9hwr;E#{ZAg~R}SGI@g} z?`{>a@)!u{)%#FH@{{?TOYc+N4s75#v!9gyVLLm>4P1^xze=*e$?P= z$MT8k4f#%~7`bGopWCHDUv=nxmPgRS{gd5tcus>*rJjd>jM8 zIwF6eart|2bd5bHoZB43yaM`+;(|qBfu`R(TNA!nJ=)#WyYrnhESs3qpLc*BTP`!^ z1SH`E@l5K#bL)WVD8Y2J`Naln6tbL)#c1B-!r z!gfF9!{4AShp82OmB?Guor>xikWcjw*5bdmp{}#p;=B33;XaY+fvoF>;Q>Z`QcE*ph=EU`F zasYeodU9~f8wTPE%;I3^1^b@*Pc!E|DAxwM?b1=CL2GiOf8ZW3?imI}|}km5zM4bi4)Q`*zm52(h>Cp+3? z5$OX%Y3qB{+{kwxyO=F(kA~H&iy>w*R)N<`OTPm4xtikPiW3`4O>m1Gc!W;YDbQb= z5VnttB9>}2%i8nWup2Ix`?H_3w2r=br%9~w3j$QT*DbDw!xEKb;RUAdAPVWuGBm7i`5M{D6<}Rra{9Ht(Ki$!l zEN9T{%yh2~t2V?~Iyein&T_cVUPB?6D-vQ2p!!;WAr9M=WTw>5w0SuH3>~*pPMu_( z3eip9==2C;pW`muxz)sv!N$&m?VDuYzGJAv!!l?Ky-enYeX3mUqA`Cm z(eA>LQg$`Es-w=mu~vXH@& z7UJLm9eZ9Th^^nW55ETLVI2Zks0>Zt&SqelhYXQ@jBo2Je4aKuh0tYqT7d>tTS$6} ziHXPA#CHJoh1#@aW1`o41)wa0%jnMZC9+*pK_G*D>9wmVBZGbVG`3~>(JSV2lGhl1 zrJ=2<*u!41V=t_wP{gu@4G0nX+8#kQQ0zeY4yb|-kwX;5U8n#K0cS77R;f%KVR#6G z1lk&gIAz3%u^(p;kR%}CL}V)dMte|T5M*y9@&*{S6lrb<8UYpcRfbO)O#}n(5?Z(T zDX>2;CqCt(2yZ>6PSP0g3GP|7DUxrkHjFSoIKf!N^af)JfE`9SdIUI<=0o}|JcZU6 za!t0`EiJnA^PL z?^_u^+X>6(qcj7k{ zIy03G<~qsQt*kHS7yfHIhd%JS`#U>7WNz#?O2(9fI=pw1;vc#Pf|3i@^)oT^$tb?) z{~vGf7%R&Ars*!*_FlGa+qP}nwr$(C?Y(TZ`P{0=z&6E zsqbxuYBvvB8sHg0X6X(h9{qCH2e26KIZEn=(Q;faGVL)?7PDJ9=91l|B% z9fGm;pCfE}svWZEZ3j4&S9MomfcicR!K)2au2?v1xFP62B8S1?vd8D_Z}mWl4l3|S z2V|%f)!fr&Ld4EvUZ@mZ%+pi|0yo8qx6p#P!h0l59onth`M9Bz?UL7o&Ed`TkL{ob z-tW+(^s!^g>KGb{>H>rM$&jk`-|i76Jves9?7GRQZX4nma0L!!A;;8%^xRY~heeUO z=n!LpNmQ1&aBLT(O(-$oRkdndruJ+T%EWQO&?T-B;$ae`h6N!<$MmNQTl8cTSAeS> zrL9deHnRbcEHuk`L36-blvJayS<}a$sK5pCBVe}T=0n$Xb{Gf6{Pe2I*6#1evboW@ z8}|HAQl0crEP?4uBFst`gy;3wUI@r>A|k51IB|eww9XG#^dA<(HZlayhmQ<*BfQW< z_G3nUR=?Ptt*%fRfznQU@1gL1T^_*ctx0zS`y^k(sGEmp!FIR#mmd`*NghvXck}mA zzB;|&OiA))4V#_5H(r^>*%Zd0Y`koS&zL@&8E4QGu4aZHNAEmHgOPaeM4Xy_Qd(<1*;Z87RbT79&Y~&V+=$g zH7nZybrPRJpNtaDjF;*HwTGj+F3X}H8FnpyE!#kdZB~_W`km3}O_UGUCupg5E2M&b z8SM(8Uf>QQ1PJ)T+e&Tn;;6IVQktGM$0|@HfCZBs+tQK?wJ@GEGZIPx+1Ao>5a;(t z&$zKLZ{5(%o__*n_k=ke1>U5p;qUUbEWI(_SexOtefpK_94(yBrq2n~zV{(3T&kCZ zAz=KXCVtVF{J9l!lJ)xII@jiU8co_& zg&PbbyJot2r{mZH3T#EZgH|i{xCp4yk!%zC$l5($Kxm1IVrPm}*IzFmP(H(Ej6pb9 z&@sc}$8(=ej_wK&6gf8OP>DmelvcUE-;fMg66Ht!I6V9dxpuupT^xPZJ8xWOd<=JR zvp+{^CPt>J%3I7PM*=tYmU|;>=X`kGO-8ahwP8N@f)zX5->;u9xS3`vWKSPKdvEnv2U;%!LWAO}(3;HpeRa8q9oT6iry3#4U z;h=NHJ=vr#h*YC_HSAjVOj=PvJSnQP1G#}UBRUN&7;sOD3I-7qW{)I8LDt71bP~J% zX%zc#d2zV!yels~oPTiX|G3cmLDDEt8vJmlk+_ct-nYM1jH88b3KK?>3j~9pC_f+z zxJjG#SK`~&mC6e-t106D!2y*?2H^Bz%K7;{V-LQ_M;|ziyC!1xdh{OfdA4ObgvSl$ zH3#ik>#FXl^Wkg|(k|$g)-LOnW~382%=L!SG?blaGwEvD)wDRmka@XQu>dne_=0|A zGi!1q^dU5==2C~jN1w}jk)gaJ^_qR)kmi-|h7Y-^^yo1m-Imi~TL`LkmfJMPlV9&L`bUJ+L3G{+H@_#q(quTV;g1D=k9T>*UZ!F z<_DQ|Ke2mFEVpb^@9Qe6NJdOFDft$>)6Civ@VDP76Sv#R+V36muJaeC-BI7jZ)R3+ zb)CZ+1YCa>(>X&G+s?=#gIHSzzf`Cc$tt2~_K>R6jSk+}NBbFVDz{LhO^!L%U;#n{ zUJxoqAYYzEDHjZ#TjY47c^d0^{Bx7z2&El43YD`WAMaXr9B_kaR=55V?3{mYqu0J`1IY- z=1WLrh4b`)4EYA?U`+K4C=@R4>MwA=5K}u3eRL$sxf3`+Bnb{k6n?UvT3}AgsI|l? zt&+JL^Nt#HD*&WNL9L^j#dRfA8|1`4kAfBq-m{;ItaoQ@lU%3j#OtPh#V1{TE`&W; zJb->?Jf&1?QPd>f5^JqjuX1}HuLKW*qVe`Dvqg2xjeKSv?vBqvmXQb zq{EmEEkJZA($Nb~JtPuuhG)5m3l28RbN7>L95e^YPhYl-=tE!()YqcB7{JCTQ$Azq zs4G7W)Q5`7H%l=r1dAH?D~<`rCy3KzN+R%yc?`ao4}yM=x_w#*NV<6kC&CxGYbYc} zVy;ZmQv+@`rxU~z&%qX%K+aF<=Rp>V#XWDUuZrAi!zCG1s_U#KBan?HR~Xc)%LlU% zqQ%t&sIZsbTQ(PG!6;4Ri$O69Loo}E;8_Opvvn38>xbvsT*8M$qyC{+ZPytMXbotE zYFmUbMMuGqYZ*9-spJ7`>REu3+R#p=$VVS>*DD*9f~_WfE}Are2-zrK)0fUczeAIL z-6v8X1>(iJjPpVI)ViY6H|5Bn^Q|^n{b|kwi?7JBkA1JO9rjaxLK=#q9VKWqU4!k{ zSu$BsX55Bsq)>JYAS_i!s0qYpBqRVL0_^iwgOQ>zr5Leh_=C2Vjeig+HNRw)$s%1< zsw2e7+=G=kS5}yOl`JU2XCkRisp=+5XT293spIQl=Pv;z_6xy-Hbd$4S4+(#Vlb=_ z`F(#uFph#zvs?l{rLdi#sApbU`BHf(6%S7&lvq{G2E2vjh^tJ6|0`(F(CC{OK-HsEbSTNT?CW+K#QB0+mFoN5wO zGlPfCsJ_CI8k;FgEkVLtrt^@OGw1C)a^-p!!n@3eNMb^yTydx|(<>y*`fuG3 z@oCPXxx@cNKPRc(X7v~i7Ov{Kd;f`?XN#t|-hzOmge)IQXSm8EyRrva^BGElOqE>Z%^G9NEn~Nvod?8{v7;50)@nPSok96o~5`e0wZ+N8MMj9M|(B z$anu~o#sSSWIjt$ThSQ*)TjLHJ~6HM3~=U8`h7i`whSFyyg$DpjHy}ufUHd&HZlf7 z;M+Ih98tBWO7rvSbxqeh=lxk&yH>ZW$M_uTf$HaLr!X?ikO4016h_wD@G=3f7*^xQ z`J$%%?p$Q2kIqEUWU$nJ*^I*zH#Wj&))&%~6edTm_MG0i2xrol_|I#*F)-Q02~3MU z&HB`vN~g*CFU#FmE9_&74-3qgAJ7etllR_`^~Xom(i*wVo5jrUr)k;OUxWed4PJeJXBRqoms> z(Pc+GojsUn5~Xk4XSsA+87YZ2&NZd?(M^cDgX`C-la>(QW&1I0HTE!+-Qq-8vFRtbJ>bzDRHS;YJQ1xGsYA`+0_u zujobljVgwA(~+RhCjTfYo?MnPI}@6y7hUkk(dPnVXbS4Iw$81W&Q*YDBXNSB>IiyN zg!+Nq5s}ys-yI4g{m@ua{04Xd@ZY*rV4BI1hdFV~S=FYk8sMMmm4DJCUrd>j#iBkg znBt3(FdAaj#;c{8AqVA+U5=S8f950k!zv^y6B9(MlDeHMPc87Qg@xxiVUOybwQOLf zGEw+*%zou^yJLUrqo#v=^Dg!n%Ch@~rqv)6p3}VL`-y7={Sdl8t~J#*I)A^W*6?~y zR`F`n?V{*z9qBP1e%{8r`mxY$w>#G|Loq`RZ-zSE^}d$6{A)LyA*GIcPJ-tGcL`}k z4IA9EC!Vr@XU%`=m>k7;B;J{nt1eA_e*y@ZnusULXHA!_rwiPk8 zeK^1@v5K*xAgRBy+;@r}RQR6{w6a9b3PBeB{WJ0sUFaWX*4!R0)&QUTulGDrMJ+Bo z@NGualMy2ybi;b_ZziV>%X}FZc=*@I+r!t1u&Xc}v6umsEx7I+?%|sw*C@guX72!T z*jZBt5;X1c+0%RgJ~W*fJ!ogfV0VT_pm%Pkd(r4~(k4{cxPB*KEnwsu`iu~D1Qm5} z*r?U|>#H*BUsH|S>P6#L>8>YArSLFD@h3rZK+;V^>Ol}a&{V@1UBOc~gZyAwv#cy3 z+280ibw56&`!=3ui2l-(%5$A-Xv zMsR=5NnR-J;golt$83%5;y(BKov1XuK@i!(w69bQIE$1TEa_f{LVIj>bGd2=9 zmV}_2>5da;v{)!(qg=r5S1r&>GL?!f_=+1XEQdE>m<|P^ikDtSR zc1|<~Rp&2Hcsw}=bD|2iKoyAKHOr$^k@k?|pNOw_ipIINrTWL$=K7q0vysEE<6MD7=U~R?6r2 z=eDjwPn!*Om;R}0x-s;^%2F~K>tU4uo^P)G{9XNZrK?tg#wntuWj==KrdDd^p;WdK z6Y(>tV-2$!gQ16AK6Slt!y20(4^Q4EMfu4bo^k9ql}P48V{(;JxCbYnPOfd7la`oB>d% zZ8q@3dgMk0t6Y_|eRqwa_aFX|Q{?_o33Yn?3^fWvmwqKrxFzH4Bk!@+-mzZ5S3z zULw%bjPNSw7eVIO5xOVdpbVI~bYLS@7rT)^eK0z=@(I()Wy*#iy`}*mn<3mWd&meL zTbg5vjl^d5;7404T-||=uN+p8?fz|{3l{zI7l7sqLQRy`L*pO#PC%S65>fe$7(W-&H zI+NFBu<8=S4uKYl*M)~a3SIMA+i^TWmg{HDHm3#p1SX(bO^*7f6dcnaZ^?4lmgtU|UB z*w(|=HtT4al+Y(h)C*jIiEXI#krPj!rrfg}Q%eb4$C6-&2#p>fxku94K_*8e`s6(S zS!Gm8F!^%ar-=r{Ql3R?Fjlt)tfr(!E+r!TU$pfk!R7cqrXL4S+vnDu17wt(LKqmi zOJN06H^ZL;@ru>5B%7M&$_uav0Z6WjHZ>apDZrHlCZQ7i&`dcn%#36yEFtp)rTOM6 zn-U`Y@&>eJNwJ*d;m#5d;w)OnRWJ(RUH2%<1u_?Ro}lf;WkDC`{|wSo><5>{Wb|(W zzI6+AO9EQ^m4|!utralEqUBfys3D`K1bl~Q3-oT{zQ1cj);?tUSRa9*np{`PF$GMQ zpDw8=>2tO3?u@{1KS7KMP`p@NuU=@3?qu3(FnK&Fma%2m0P=!rY{j-E@8!`>8+D6T zm&RMUI1+enh*`TL)Ms3ib`1GNdq9bZ8YBw^g3K%runG&H2_Dys>kr#;H!WDVA-;11 zYCWP^kDx09#SVvdt8csuU6nN+tw8ziioEQL_^ASbUdN;*mrLiYClYIE9K@7_2;Joz*L`VNYdFX-*J3kv_w(61nZUuUyubJ)A{DUsw{l+Q-P)cfM`m$n;+qONu#mY~6T8*&~+c+lq*iWbigs-4(uY zWG(TH`X2UI3=CQBSwFNI&jImY94!qL)w5T=8G5RTe~&w2_0!>TA8aW1n5diUq_gmu z>6#k=%E@tno4LW{ewE}8CIVfNKL>EheCg7oQm;sLUa0^~K(oJUla!js^_5Uh6>4pN z{#-XP@cw+dQb$|!INDup_UX1adHnETqc?A9VB?rdy{<=nv2j044|wekVO{yY3_z>> z;^{6gJjLVbcx;Q~eYqs#!UHwkhW8aDI&miSA60NqKBs#Fr-sbVnIeWQ z1to;-Ey12LDC-t`4Gjn#iH@N9nTjm-~f0EVaTj;~sN9 zm>_3E0D0K*VQiVi*VCv`ldFt$RL+ZRXXQ(3B8K}RaNafEV(0x%z^C|pE@sJc)(X5g ztZ$1F``ctr=eV8eekX6QA zg`Q4GW4qE1>pQ(Av5#UYGex`Tluey?g8&9bG+y$V!`G>??lp@m8k8))3OBPN6ys18QSy z4vp*ENHma4WK%J6m+h(L^Z*ykg#}EFHHKW1vQXL7@Ke1&sGHBiN&PnwOXG&MHzxIn zx4|cI)9$sikexxFzrpCzklJn!{`uk?iIlq8wNjW!^L`G{?IGaz>OY^)9a#7F>mfb4KQZ`;Bu}VDG<+BGgEw64DIcfbHn3sOdwIjX zi*-79q@L-jj+DhPrfH+@nGuvjsrV%OC3~Ag?#?T?tQq`0XhVE9BD)udXOd#PA}sQd zBk$ynBa(|n8}i+?B@x-XdQY|p+)x?K`=VnUN;HWgJuwptVzRyhX4HSZc$(aXb$_H@ zq*J2C(7p_0L9xKvfznoXq(a^mp9%p&QHwEBUY@0{SQ09wfc_Sr8J1E7ffC;sY)HW5 zO=UlDPisIfD4O65vK1T?`V|OY3MN0*}4J_(7Ax?(YImf4Hv7;z0D2B@&+&EG8|_QyaQ!pRbSOIJ2M?NoZND z27U1>XV2rgO3?R)MeDuZUD+H~n~UkoDmOUh#Ed>XMF!KU7Yu@yxasjKo!7bkkl{z3 zR>YO*SXV09frI*K1oUugwkU&^=w-u}eJP@`D#=aaGna1FB0!?-J%8K^N$h=g=LbFt z8x7>S3kp9M&TEnFnh~>dxDG+Ls_YN==bSZ+pqH*&D3cmSNM-g-46YoG3h%2%gmQk{ zDJ~g!xu^IiGtJQDx~NfZYyH)LdFYjI!uu@)#3Emz6G*JU z2KgBS9y2h;I zuCi|gBEh)M9d)*==Fwo^`E|CF^OvxIMG7v1%ztib;%@8wOPF&%;Qe%X+$v~V)*#-|*e#d;1up)4w zf7ZKh^ruP7tuDs7UVC`6g&%oTdXg1^EW_E>BM;3S7=7 zdbK#vR4mCZA=$8LR2)G7iL(p2b6`t|R>)hXs895ac5h0XX0E2cX33>%G$Df07cIz% zbKUfVbV;Z1u%p82YG|XJIXxLG%UJJ$jJtU_1ftrM(;lQNqEo2s&QjumdEZqi`pmDL z$g~GdKAmA#WntI#d{iPPL9g}4VpmD^VJo)Ky~yP^ARMhjFrOr%r|9kse~#o29o^kB z-!|Vs@TOBiu4qy*{F;A0(|h(g;j80H8#p~HJ=b)Gw{%T^HGVP=q3lc4z)jC%V5=YK z9_ZvfoRzMimLFQR96cw+vh*op433`G&zIJ^D0*Ef$pE5rBAqy00&T&>#PlU#5}MGe z)G_H^1wH_+ner~;iLfTJVUa0C=qiyn&nmpvQb|=nz3j6t1<$H8>{f9F#tSnzJ z@^7&<)2-Ow`d|h{AI-rkTAEjLNJb{yhWFAhFjC}@uArT*Y3wLxs|EaJa3#&uSNX5C za3oaVglDUJcjao?)kc|GfZsOuhn{X*GKs@g@X|~0K8rOKF};ti#0fI=MDM{w`!uZs zWfc-G>r97rREeY77UQ81Z+FiGIvp#OG-VUzsk}_@l}bvroyY0CoVHTD-vDl4a9#SP zA5THKerbGP`G3*`ZAJyJSa%suPa3JKY^<*`E>-=W*2Qj3$9majtkt#8WMKEuv9M=- zANK)hA!Kq>b2Rr_G-O*VMPnblJ~Mk*gSWUGTFT z+^g17spTZ!JR>4W>T51$o)WgbTn14JI?QhJ^O&(Y#yXGXs?UOb8Y!)XEh+U*)?%zE zJrnp+-Q|)SW(D-S0pno`f%T86mvYdy%Cy^VIG2i->4D0N z$e{mP8^nIq3DU`(NHI!1GF-i}XtG;t%W)pg_MssnrR59psu&6$$m73)$yW+eLcvbE zriFlJKCmEOfXI$c(g9FWo4Lfp^GzS&Ep$PRDFJN@bGoJyD54bA81e$vuIc z3SU%DkV*=1WHDgYZUU5;V9PS8Uaa)7AQnp>5g+7ER3Pz5D(5cdHI`MF#v*RQ(ny3D z;4Ut4^rWk1S85u<$`SL~Ojzc?u`SZ3kW<$4CRb*rrdX{{xe`t_fKL*nU)VqmYDF=i zBS!@5YNiXa?kKkp$v*td+N-v7tgth!@>muv0juo58A4f_!L=-OGl_VuZ1{bUA4fpF z7tH-DD>A4K*6q&o5PJ%?rM4$wMor)-T9Ehw0pG(3_ zCR?js^1M-^iX|)^;dV8d>G%u76s9j}eWJ?kaI&(yDj)u?x_~n9Ux$B<2C^I_ym7 zh3AInTM zB&t9CQCO*uu47|v_l+QTSS9HKnsoXMn!@x|ChQtS;)HZiKxyvM6IFBx1ReZ(6=a?W zPz{oUo=2d$yV1-DD8u^SfOM|sx;Fzi!7T@_F~97&z`?d^0nG#&z6(1 zh>|#^KGrx3dR1uP%m52J|M-i}rvQ(f7IA*Kzi^ZL#uS#2nDO5;LG~|}U0`KiVsnEn zIR$HqD)&-9!GB_av5gY0JzYGm&Ao$LNAci(zPtnD8yShS!SeYC=i;T8Uf9!IZJWB> z-YB;kL)SGJm(2z7jow0 zCXavxYjaG)rHM5mAEl|^V|h?+lK(cbOI6$7JO*F89yEC8c`(44Xne!anA?dc3-P;7~>K-=S?vvi#@nUBVsVTbZve z=sT+k_rrCiC&g;~h6?^V(j6>Cwv>D|JFg_IiV9l8;6q<_oL7aFaJVspo&z&ZOd{1k zeI)ORALx;~W|hqtG_>Kul}%O6L=8=;CsVS5=JCzb;c*N#EdYlV4_tGDFDBuqbVii2qS}PfLk|LPIX~flvNZ?Mi8U3>sEYGV-U_`6Y|D~c6+c^ko}1$=9Xl)@I=EVN z=jlX_3i<-~TL6>+RR{j$Sbo@@`JP>>6?6ZvC)*WT5Wv=iK78U!ht`KkC^mIJnf={4!)+Hi98X_j^-tWWf)95Rp<8P3Td;n1@DqvA@v-HTC{hI^A=}R zc8GKdda1hg>9S(LZbnzdFevq$mwPmN6q&Rh7q{$uh-De_9jl+b4SMulqPj7gNF@FV zInx@>=LiR;U@8Ox`H0Qa*M>0>wlR=>Nd0L9$6{+K_1$18s3d_l+fL@Qyq9qrlk0iw zGl3WhIt$ACPWupi_RBxJZO4$`7}3+0`1+B=i`EE_lxLt6DB*X&q!cTXXQ>phUn*oU zr^X7qm}4>L&h#fO^kjyV5mnMpU7T+z2V^P4JmYlc5$qFE$_PsURC4M{TVFS6Mx)xE z7SaKeYEU#W#uI)kDPo!doUA)xevXrKwHKn2%PnG1PY^ zhmki9Hg6d73RciBg=%V$T9|vciN>-S8B6cN0MsZ@;c9kthZ)1bMCH#sf^`gZ4C@x!DY}&MGZYE&6CY$tx{HIvxFsR$)JG}F z`idCrtyF%%^pO|m73d-m8Ap6Tx`Ks&4|iVFh=-SeuLN;NdT;`K0iXtSXTR{8S(NGQ z0_flR6>)Kutp1?LtQ;@x-k1m}Cdp{fimqmofIb0Dj@tPKpikP5E>1TI;Et1ztWT#A zstfEMpInFt08hL>bwr+G@xaXy913_9d2xT)tJP^nLdmY7OickfZ zAGstd-!+_TNttQ5#u7@vx?9~#R7NGSYwn*z{-F+Q02}NI;pQLF6te}kkB;CAx$oLy zj2V24pc?pL4jQf6{}-r5sPvkEf1whs>hg4qKrYIp&kXz*RTwk=^Duu=Z8-PN3M|?b zsQ{1h?Ee>(qCEObz<*Ko@10N}3@Cka|AO-WQ2;^<4gam60ErUl|AT@^1qh4~|G%L8 z_s%{j44u9^;82y}KY+&2?Z2!13!qT75qh9dMEYod17(JP00Kj#kD&rn)X6(VARo=! ze+K*)N(>(WMey|hKyKuJbcm?9GLTjJz>|^v9f9O!%gM{{avN zB5DyZJtx3lC`ZHfp8@=ZJOiilfDT-M;nyzo@t@~~crN=Oh%hRPF%C-YpkCE|OJ~K9 zwjx>7A0(cVLB0GI%5K<{3VRZ$a)b}1ea0h1hb1M`^2Q*jbO-~|;1L8@p*8q@b`SxX z9?*Ry2nWSV<9aZI!g{SWIvn)&Z^1l%m@i>pw!S>RS*Oo;-dy)8#cqI}J{9?Nd9 z13UbF0w9Ny%t~Sd3^o|gR+L@?Bvt9}9XrQ+t&TT$+MT?p+nEs+qzcURU?RfP!3GZ)QNpWQ6`Y0%t*Ys6kB#6NE^DBcbuYJ%uU9 z0-vD7gsTVgV0@5YAauAu>*v2WGh_-Egq+_hYIiRYzQ^9p>9Ox(g@Zx>I*SG(0CMBN z%)I)E_<{qMUmw%J?Gb#K=1n?@#rS~s2w}8~bMH8mvmTVev@7hO`4)ruk) zN5^|4*UP~J4-hPcCVi5Dx7BYbynpiYJ$}cU`vVsZdjB@JIRoTQRfR35X8e2pOHb&K zQm$FD^m^a>OnML^1e{0C#O8q;$Y;M=C^w8-i2L=(ElS>-ZQ3h|Q+TOqWm6_sl{(i| zuE0#=hvK*5Z}#8Rzm4UT(2~V?R=r{uEDA-p_;Y!WD#GB#fKW9QelKfmU!Yj=w0WY) z%_-gRNWMpfl6=ri@kw&{MLTpor)iix3jdOXkcWu=Lh&`w&6jQ^#nq!19v0*dVQN4G;o;vKty)h;Jt= zw9_tdfiKUzh|bE~yBT>bL_?hZ3L!e-RAzHgHdZgM)e4u3O%Ayr6#RC9&B54RgeXC5 zY``w6fZb-7jk=L6;DcF;nAdSDd%};_aogTr3(tN*O_`N^6j$=FdHyXtGx65wCvC5r zD;;HBm$iVfp0@U zpZPoo14`j^W?eA zssWLsyqP^MnAQRq0l0NB%g=9f{CWVk0mb&#b203=6w8fgo_MQ}rC)#f&sZIoTG75j zLbXxie1x>*LLH`eX*9{)Xa>*PXeN}k;LmTlsd9uHO3mI6k`F2AnV(EFh?xW$Dl~SY z>!zNa+2yGuzIhb$TplyPkS0ySsc)L)gykPgJF|HyKBaG@8rlanx56~bQdZ~Q;$~&B zsN_PdKh+nbwUd#dl~kh}&JNX~k$LCUfvzk3W0ln(85fkAIuc`*g+?m#4U{R8F4dVK z$~TwToFdGTJG$ldQRc?+`zI)RhvZ!iF2ty3xrn@{7s*4^gI)=wOBnMXVj|86<|@7_ zzNj^UKB84mPp7SkDznQ(-V|Z?JH{!9kupCD=(i|{Ho|#LDAKW~)hdt4xbIw2-HH_ZnlV|yTaz<^)u zjf|T4A5+FAYNBY*dZ{j`$)xyiWhkQCy@sC0Dq!U(rX=}>lVQWH)i&>&lbns54_uRH z$Ik_2`E!pbJd#DAat!7g=I8iC_#M@VB)Ur>_jpmIr4_(#bHe0H7@CpDf5^Um{o)>f zGD%y@3$}cn0z)TO=tUvHBBK>RIe@G$zOOVBX6Fl*^|Nj|e@xLLu_&fc3kjCHoce%fz9RF7TwZDJIf2aQx z+VQW-{#QEjZ}a|rdw)d~|F+zJtb^@8g<<@MSAvE4|0q}Czr9TUC$Yr8uI2wMmiX71 z{=X!aVE%8#5-k5!EWyA?&&>S4k*?qg>8-rH{KoOx>#}2bcYNM++SJrc~y0%{=U;J?q{Fb{{%?9T)U;v_T8-KU>Tr-P5w_r zRr$aN37^#SxAL!6%bCtBOWOqAvJY%!Jzt@r#!d?*=nVj%q6%IEnQfVvL2OOBg<;llh4=D{#IMq5gRbdY}rq*N?WR@`m+E2Vom9O|$^|!hDbj^~z^Bf0y*AGB!>2+es#DNolOO{X9mG+GryEdk|1~=|xG4^dSNSTymp!Jgi*p`WAlw9z z+7ITA@zMmto7Y?q%(;)yEphltFjPEVI9@rje}4VVs+RDhw%PsGi?nsi5qLo|uZ zJQUWP$@@k{x=&p_;<7da>`iSK(<}&Eb0gpm0k?>?8`L)huwjp4x<_a|99ExY14I|? z&oFGpQ%#a*6=E}d9CgPT^Xevy6Bwt@mTMAng>Ad9`-9+@{tHoFo$!j-BcgcS`+^Jp zWXQ#y$Dte3w&)V?4e|>-czov%^bgc-p+8AG7||8_)(EnDd|nhc5~K((G0kv1Xz3yp zBR(?e0t=?|K?73iynB^C%e^Pj77PvZ30fzfznIKBpOg`HqYtKTQA)2!c201dglQiU zkGIGpL#Bc-I%%Ttf&&uT;@6Zt$xhJg{_i_trHCx6H!NQ=zEQo?zT7XIq}`#a zI~a$?^xvPgPW*#i_As+!cv}%k>QGeyXu`Hb7{1_sBJJR&_ZVw|RT;2x^@6^Md=m$E zGOU4Jd*piIZF_d=)$B4~9G{>P=IjH#N)2scN)k%x%lCYTN?J>K z7eaqV1%qm%zO0Htoqx~CBIS$k7h*DPe%5TRyi|@t3B~McIPc61U0rT(Nd`<3s*0M4 zOim7i3Jw)b68v^I*m+#g=#dfvO5y9boIX!5t%s(L71%!=&oe|E;O&$dpZqIv#=`p< zjH`ZVmE*&Gb9)<39c#Lt7M{9JOBwUPMP(FcHhQj_U%-5&lqteU)a@|fVKP2*H%4C9 z1LH(klPgLK8mcmS-SCmBO-D9&a1#po(nqwV#wLrd*-rQPSiR4ouCh>IESfe$@4QR} z9P0K3(|Wp&nIm6-fguUaq8Za#6jK+GoLMul%7=i3o~gdl#w9*EWeY9v9s65n!s%%! zK{s9L%!;ZG=1s_hBA~J}kRXTFJge_szTt+d7m3N#xoikC#kp*TSG|5zTUXry(kxZl zu}HY8m)w$B6@{D>8S*{#-JB#P00EnKy}c$K#%78X8S}d`o>)`v0lJl=6e|)Tj0>o@ zl`a5=VD8T;mDUBAR`Gr;-2ge(iQ~i(gkJ;BX3eL*g(Uh}2Br!D8Z-SEo#6pGR{Ba* zy3}?MAmi!jOp&6uxJ1{JnOplIl$s1|!Ka@Ck zVp)Bqc|?glWePP!@^n>gHg|b*Jbm_0WEwbB+G-MH3$2dKM`2%Q7p%}@8;77%?*q28 zb$b!n9aJbiEeNd`gwu?P5yXL@cqAR%eegsuj*u5Zj#z^dh!b7rCI!@X`Z8#uH%b#k z#M=&Zc8~~Cm%~<6b`wV>HHJvA;qk^LGE=RC_IM6gyjRR&)mBGrfcE%Q$)~>qc3R5y z6Ia-0&d+>1$rns4gdhH3TRhPfQyWx%6Rn0A(hQfRo0D-=|6sh^8-7&l1tY`)!5+OV z@W8!_&7Wk7criAkaqCl2PM?s^X=Iw576dYPNNuuLvwZ6`o6llxG{_&zt^@i;*$yu_k`I3#vJ!Q zV(_}4Y7y3%%(}BmjnpiP9bdg)9Z%pIK1!ZCKk^4eCCnKVFbXa90`exP4S2?!uak+C z5YL52NFov`m~|_tQ6fZu(1GRRjEgl=)dW;&arGGS=_+m&yxc|LfMom}Ik~Yz9!TPB zi_Tv1BaoII86rprxDKa`H zfIAwLS|f~@TDKoIS{oupgORz1`WK? z8J;Kd_O|W_?#JD1rrGAK&g_{cNYjjq2H<=u^C`CqA-gqO)cKJ_LZwwvU{Mq_G)UPd zy-aGS1Uhth$)Ph$ztg=nW5*M>X0ksJ^fx4l%;;hG!_nFmXo;@zMnC%{Gp#IHrKh|R zw1$&BqDV%;96QeFDLWL1?vX*xdf%bBpWFIE!Xm`LVjD1bQ5rVEY-2WdV?;fLtlAFH zz9GS1DRpb2=@e4UalPvr)h_qTQWlfV9l8uxBhzQ4QWR@a+NiFB%G0HD$D};Mp>0Vd zywY-zc2wjv#sO#o#gWJrp_Y)O8eGAxkXtEhEW1i%xF&Ygc$czyQz?uaxCP8g1Uae@ z(aNK!r`Dba8K1$XG+Q;)t9Gn8rgKk!SA|j6HRwS`M9xwepRHPU=9gP?p=)PDqs^*! znL1cxiYSeXiIC>2q_o2TLGA!Wu7<+4x^C)jLSkza8X9OT8P8C@o=FwEo(B&@6F*6k zyEGARHw3pWW;}zSL$P~uI2JLCm|ZiV7?}4ji4j4hSrLyeg&R1|$h3gP&u4^+@*Zb1 zmb9+VDd4FfOS2V?rKExC1VpeTl z(|TmNFmZ9IA{DI4k7T0bP?Br670 zEa8arT@=v}-gklz1s~kyecNIiyS4CpFVX3Wt#?xx1O*?&9_$*#CDZlX2dTxy$Oj>F z+^5QPKz`T2S+|5ao`(Hc1G$e;H*Fhbzgo^*hKgvld}zUtpG=%zPBg3ilTFQjL~R(0 z3{Bxly=JI-Aab0*m{Bo6Jf=3&V%lz7c^xMj88Edyp&#+Y$U6{pPm5jRCPD4>HlHv9iU`ewyfc@>y&NV_9@%8ZQHhO+x98j_9@%; zckkN zTWcyY8L)-(0~XKCTR>vGr$z0_hax9Ei64^?NX{3loVG0zh0o_AD`W>g-Fmy>22(HA zqr@s=lI`Wb$RnapSY7qXZ3sOHJ%15H0jH3}B+9*I>34FNu4fmbYY03+MWPnJ{CZk^`uSeh z8ET7h+fxRcNGdi%oa3A;{WAY)9Dq%SGNLkc_iWtsF8O)+wcw*4{+-3QcdX-Eo%`Bp zUdGMSPMuzVkUplFh$qXNMomiQS;dgjAm3d$9lIx7ILiSgs?5&PMFThcLuVAEW}V{m z31}YAX&=UW9&v_4c5r|P_dyAwfd_hobmc<%2jxf-(zy9y79j;+tULFFhKY5vi`w(t z)sEq1Gv%@kt9Y#AmP}#RFPxr-DyI~kl@oy#eF;UT=mojU;4jj3Q1Lq8cIh~_SuM}} z_OZIybtd;uKyEj_Li~D#W5>-Z%&g~GP)yLR{{L35dX!dEXW1>`9bjzy3%>p zKb8U6Hi+`h7W-?XDe(Q;(}>j3bK0$D-Q}^GFUNf$`~5EAu2ecVIA^YT<^6LgaTqkT zaVOT>;P@k3w13Nbqee$n>EVKBNpqrWz&kk+C~<(y04cPnL?){R-*;~K1Zxy8zDI{( z!|9h?n|N+7{|4oCihH!2VW&)wOy_nBe~JR-34M@|et2!2g$$P~@p5uS<)TP(rS>nk z=zRvx^t~a&0=wI$Rf+OmA%2=4+#+(8O?qr(=+KvUxqKWyLA1z)D@cp zBG%XBYww%TvKI_5l*B!_mryDd9RvmOu0xREXPF&CNi}5Q+gUO5x}j=ynv*IhMnJpPX={?q{yWn zQagfWM^CGmhB6&+Un~78=SolXItgBtOnAshuwvv1{TN7>?zgI8`8}~-!qhCH#7J%O zt4;pKobmaVREqu}Gv~-jDkF`Dx9>9PGsJHn#y7qgWZBE*qLNFey!SO_NfuAL8}ihv z-Na_Vt*5Kb&5L#KW70czyCoCEdabqk^7f|Io5uR(W2$vBt-Y@<^@jTke~bfVxSz@6 zbHKhcw8!??b?qv`b9DH8pLN|PVt+o4ShxL;qTB4Arcs|a5K(PAC=#NuR*V{o32PO0 zwKrVg`oS{`9Uy@M$_on>opi3`c0q(h9nK<-+Dux`+|H0r;>uBvmFolP0&<3#b<%|_ zL;H}Jn-&VNFbQTshhAS){wkGd?hpbFi))Q2BnXgLvd`Q_j=AvU(2z}As84+)1ji+h zr6rHNg@sLIzCwe>uiGm^_*=PK*u+Z#TO@SKp_uHT*W8S>yiIA1KT zfUy4qst#4!ai|j#T%}sXS&e={!9v}@ycN4Ct1hc0tC2j##$*9$uTOb@IzrUeONIM> zPCAw@5^XPfHeN5s%&|~hq$b_yAYFYZZzCUree;ihyqu*nVr*&55^YBFDV8c*m-gQT z6mmMvRj~y_YYp>w)oBYXc63zrbZp4_tQ(dW)BGVdM=2=amCrD;g$)J*f zmbEA5&Q&1v(W+)(red9x*BO;1xCm2_M61|JJ#3-t7 z2%&bbd$Ng&yx-&7L%i_8`jzW`Nm*H$>G6BYFpS%F*A3465D~iI4qs# zc>A*IhL#9aZr5IXu=6oYW1HK1sEVZ<{VP|qg3`vOys9m@_=?{Qw%5tR_vM_19q1KF z7Wd_LAN!EyjOmBDn>k4m zn9%MhjZ(tEg>#B(xqKXEMljiN_)d|Dx>CFSJ^+V9-ezySo_qr>W@AoDW`i>K91q-O z+O-|lio0o)HH>9FK5_ECTp0T#-mUAJc8ReZ!yQ#*IYfW9}JGvj?L}M?F_Gi zk=(D_={*9y6+>aC965Vw1^J+hN@CKD^VjoN*dC#!OP-*Tz{yhWB#h7!My0u?_A>Fq{TO?rIqEavp=% zBY;)`r&1|<;MuWZ`=LcEO|uGANJ{epmZv3SN?A)?ioq5~l#ApwvaWhqUkGBQtk0Ub z9YHi07$R8_=60>EJ|J3V7RZ9LVCof}g{(ZSC`A8=e=s#66B0^WFDW^)ZmGv$l$DjlOOYX)2p368ntC~ru)|XAip=7*7Roi933#oyPaH5k0@LMv zuv)2u3$@W?-?;X@O70JEjrn-+o}6@(nEBDB^^_10-09+My~a}GtmT1Ez+kzz*1IJRe)1be+WvbGbuU|kPhNEQ>e5Q4&u9I&V9DBI#IuR0#jX2`;PZ^hKVzNZML~D#5 zE!DM%@um8frONl9rfs{|AJ1V)u_DQ-GMD{G-Padzwq)DL01WD4z*JX@k?BXXjP4}| z3wLfgNyW)`3gRow$$P29mRbbRaTl1bf(377b&_6#cYewVKb85Ax6weMNvcsJ%}}Z; zR&h>OcJ}oU_Sz`N9106MkcFG&DxOsya1!#=t8ImMs4>Lt_Vo~{&9TM3eu2oNB7>5k zQ1fdRM#~>r#a9J@VJDB+7K;&c8Rce?;3W>7a3zbZ6A8InmNyAm#MvZ+)Fx3Jii;>e zh^r^@Ih98G_^fs?hSl*L**M5&Te?cw=MG0InZ3& zuMQiDo0lFOaI1VJt!Qz_4^Nmp61xAy=WjAO8yGKT^M_1CB8BTgVo9Xp zGbv5;MW2Na4f@`EPu$Ageqa0!;(IrGrX{e}V?Ag6y%D?G2n;>tir~cg&Un*Fma^*D z3u61Q5Uv`D)=A4tw0pzNpzalF)-0)OD#!PFbi)ELe`TlJCTsDXYRj2$gM%&&0D`4X zdV!`>67_AoO1%xi7C}KT3eivM-$(Be03Q|f3OHK)77GDY&OPUbxM}oIYRb#cgj0iZ@fcp9>i|6uuWrBF;&uOXWJTL%uX#yTmNndgFyoAA&aei*oR#Ma6zB|mo zgk_`Vv$jGR@3i`9+dC}A*sEo)(8B`5NREaLw?+?HGMfRN2X8V5b@UTb3-(?gkUGdR zAE?4q=r_J52tj}jP(-$qsM?6d$(5dJpvvbmLwK*4WQ1wM^t+Kpxx>VtFC{nG_K{2i@`PVg64gJH}oRa9>fsU8pT4~SW8 zr{gC!QL``I^2BG#LQE(KEn#)SK{SL?@wdwGTizf$rEz8#gqWRS!?cXXcQZLSf6QS& zRm9HAHi;3*G2Ued|MHM%ob*#z!_dipI9J@^d5%X+Z}ABs2x1yZj0q7kRkqEm{}72b z_f5-+!J^wF5}2z`G%h&1W7r$3k@XA&cpy0O7UrrA4;F>h8Z)Q zUSFs-jp8Ug2mvl)WDsf3{5A_60dk;w^TiZc|Aqga=F{9KMzpO8$Qn+h3;Ci!bvo(Z zC_`?eG??7)$*gwfh@tPo8?M{Yx-G}EI~ajy0qf6rB_(o-QP5!%g<2&5qPuw8jG+{XBU z4YjmKWfw&+ST^C1CRU70868}&B*Cj>Px^CFoK7k0p|iJ~*9vCm@XJ$}ZMchh{&V_` z`r4Mw8O!ojdT4ji5$tO8&1O;O!9~^Uj7M&ZW;`^@FM&sSZr{PH{3B`V-C_9d)(Yc86l|L|(jYR`YF{Twe@W43bBhld5ut z@{pb2!=wK3&>dkVIm8UBm?m?ixvCwbc|9yEM$z>k>!Ur>&%`2+xPu8vV%-elKHmf- zA@S7(v_DKJAbN0X2UW=hKkqi!7Z~5 zwsB8aNcEzN5ao@v(`wF#n2yx4nK|P2QQD^}_snZJOnK zaeE5uXJ%hUR9_0FiT7{Cj&8HO@}rJf0S$giK#=?o?z{)oSX*8aF$fXRo` zsJ<%3{9Xto2WR0LO9of|SsL4~y!E2KTM^eognkDKC6F+8^QtFE$>KM6Q)(v2_QfCv z5V=CDWBK(}TxWyR_tt#AqUg-9MH?Cg)7TVqV`+cc(F{hRyo?q5Xc^t#A-VDmJRLsw zFLx9A8(ZbiCObPl%U|68daIXzMFC@C{U-|8pKO}{4F!zh-xy%5Ozi)a0j8#|ETp3G zZ`2+ceFq0y*S`^b{uf&cu`@FLh4{tzpNU`0|CRW~_8-JAM)v=&2KB!>j*aQR?PK9! z{BLvo(f40`tnB}m>(6CmVP^ZMaj?)c{9D|A`2VT>uk6n~e*QfU>d*H-KmR?~-}C*; zvHhi=iGkza;@Ft}F_%Bb_ZPy~|Iis9u7u)|#`eNXK`X5MN`2SQe z?EjMV#qpm=U-S%rQV{=dq_1ubPp<{#6u#$YnfVg&jORk}3{vwqG2I6Qjdi?Y8k$)J z4gZwa_Y|6C^*iSBU|du zE)VqGp{+0GaPKN@Bm_dym|au4IPD<@bi&8y?w|!^Bemf zFAI0L01k8j-45!{cT1rFT0o`0vA(QOzr29(u{C-uJ{v?wJ#7Jqd7<)pTPqt4PfKSS zK>^A!y?V=_xe}J^zJo3`tV*4$ui7o=7=jTuD(kkI&z?wd6a$M1TXvF;YOmTVHPuRg zHFHC*x_I{*Iv+o;C#|`qL}6-AfeQd2P@sxcf$^`Yvr#h9Uw&a zQyr6F=SS^_(88yH7jkEW_gBBcLX6A~H4YnsfB1#53Mv}c;G`CvG#PL?h}DU;LAZ=I zaI~rz2S#!u=msdzcIJW}jT414G)I~S9r~NT=i72GKZbs+{@5TjZh@oi$OM}MFB1hz z0Jkv@5wqTvsY|TuVMq^}L?1KxtAh)WnN54&hGJ zBkWcGB7D`fo}4iL2S%GE*F{jN{U?E!Orcrjm~~O;1#u^Nd`B*(KCYhh9K#?1z`|{L z@Pmx#$CC_iRp~ujoH@SyL%eB=TUCNS6dJi+(7Y zmhH?@ooGK8KJ?D%G8|G5T^aK2b$#@Tpoz8$`=U`re=`VJ%qm_wi%BYS*dj$1RrQ0LDfCcAZ)FFCY?0_CS5 zr!g+LP-1FM(~y3Y_sx4V!^-BL$wQkJeCZO<&7)gL#Yho1fthqF`GISo!sL0oHUq;r zFllKOMq`S#>TZSC8SNdW)1PBXXNT2(xk>*F`kd><$rst1?F&(SPkDAhXUiQ-3|l@E zdOd)sAdEU-lQhgb5BOQ8EjgxARF5@pX#F7K!I>PnenYq!xZZ)r`is?r;3BeH8ZV$# zPLVis9vnPP!miF!j`LZN)&SJv9PW%0>LPjti?=TaZdWoeV0?7||owB06)VsFxTCxc?x zGy;h!d{`OGcul>=B9`i7gEE#%0Cm#5?`=RiM@7|5sb*#35pUvAsH$`8C7^PBQ~3}o z(M8p{t)#WGx1$>>mCN4*C237PVHcjCga$jr90#joQcaAhVn9V!*?D!ZJYmGl)_G*! zZa*vKj52d$E5dtqX)(al$h11{BnTWS#Uq6m9YNo|Q|Vl76|sa%V?e31DTS5E>P{(G z+SS*nXSqwG(&wb3kN&Xw^yH$J9|E^3nr)+4Wkhf_W9_2fxEx$Vv;V-~o{$(*Rb^=G z@&B2$@)8a{~ zoZ2~)ZFqvuI^wz4UV~(Y>m4wKDU%cce_kesvxw^A**^*O{di!MoFC8dnk`*?+Z@DSzgtj=1*{l+^>qCHkt?QPpzFA#FR z>BBviC+Dyyd+iZbTtz}2nG@(p?Xst_UeV=b4y|}k_tL&~Z2Mcs4=c%8G3L<6-H-HW znyb1>6fVNJbQUI{h~X5XAS>JGxK&_;GKZ|6z9Ksv5TT94%9`@Q?}kKN&|Hk0YS1R_ z7IwRs;;LGoHD4XYpEa1OXp~6%$&%P77q(OUAeox*WNo0X$ePwjOVi8CV{I}qO+Scg z7j`13s<3tSi@Shm=|d778chf@dxlduXm)!jHPxytgemgga%`+1b4B`^TlT8DASLQI z>-xE69C_!nQvH(yUMQ#9z-Z^zckpc8H+L64KU;iGqlPvRfOf9nN4N;_>HNY(#B>X} z7mw{Xj3&2m*%Fp0^*JGx-zr3e^KNX3w48YQhs3PoqwL0ZAa`e7`Q7eZ1==2tAW{jY ziV^!2zw9AWcl_*zc0|;=aCghas>zA8UR?#;)?NAA&bSD)yd8rqV~lA~==rv~~%4jj+s8Kq-qlvF{*%n;}yAZu<(UNM-OuzIPh@Tn~4y>?XTFsXo{ z7#kWZj8D+ab~O7)y{BEqQ+-eO+)On=DEhvVkG2-KA9!1kHiJLghf9p+hbMzV4~U2z z%0G{3n6F7@#1fSHFw?QES=-H!=!zyU<{;g53Z^~w345)OktV`ujAclvG$?uamV1hq zN-2J-2|AlDjmQyH%W3J|z-06J-Wqt>hR-E4#-4=LMv~f)B@7k zo2Sw!P_Hl$3Zfkl&~kWh4i!q;C!Zk>3S2xQSw8;(Q!6vj7_gOV(I6_;d&0nx)wP45 zBp)N7jG?PyvU2Yq)yHhvPNSC_e?V6+Mez-~76|wS*?_fI6yw7YaaYyL?4p7;&hH^w zY^sDde>|!KQ{o z%Er*f5I8w0RX{Poec$tb705cDVnRJiN1GwANE~j*ZHg~EBpjURm7|oi&vRIWk0)qc zjZ3zRYOyE&`2L}=OO>UhlqI!jiDhHGb$KFL^S=OFuS3Egn^bWOj?;atFD%ArnTl-`KOIx}wO^Lo3!?qARI zq?F-4)=ZVV({Y||?$7or z)<8HEs)qncW+q8HD$iAh;2_2WsUiQh+$qy#?Z@MJr0Y%s-nuN!M*aS- zr_4)9uKrBar|4(aiP^)18MD?|`A*AjA{tze@5M)su;@W!Oe@!$a|vLTULdf+G$1qv zJsec%Z2I3qqa<2j$)FOBse=rpLXmoMkI&y<*RxQa!9jhRWivt7UK3c_O;brIo`-Ot;Uut8z>U^gH;0C7is>% zcmDIFFQaWv@l@G^qix)MM$G2WO*sPLG~`)DR4;Gw-dInUy`Ja%^E+8whij#jK0fbr zCv3W1vNoRw)vCUqbhY0RlsQR^i4I^o0h25*CfoTWUag{V+f zTr}pjbMdHqZrdj=tM0`EWp{U;7vL8ow=ncNh6yXv8cC2{DwnbjFY1+iG^6h{sJY+L z&tEO}me{JFY$F04@EP&&s2tWv9swotOcC9TMl8Se)iR3J`WdqpN|#QU$1uA?b`iVE zTbS|Me(e%b{0I(z_8-rCiWh1gIUA-$W$KIaNG|JxVXR%pRCi}&WV#}lsW?|muk}k`{tSEkk82T3gA1n_j0w1!rA@$kuG-c81`S913QioIs9*wEl=hp1 z=Txau)VM+H1kXgGjkLV^LKkK(+0b#I6P1ZZ@;a>eS&&dI(URy#3&46fNH*5*4Cl5p z$)ZF>wY;VKEUu+vx}OM=d&%9x8N}*0(rU0y3_%^P^8CAB4Ob_XGd?xEIVZUdrz~@# zXs}jpv>xdJjg1Az>EjMFO*E=^z6+kWx4BDi6S(QmI*R+cVS&U6 zdQLm1yPD6u-~F=*Q%Wt=$5Rj$Mv76h)F!*-2vS|*H%wm#&L5ooVlqVuumBq1BUp$@ z;ef?UQZRt@8d66PyD=STsycW|;#UPyE#w4*IPhy2$l^e$*oC58;wq|D*0>1JM?2r< zj!)r9T{K%GBC{{OTq8Ih9gk!69E%IxLo}XrQQd^0yolaKPTa#(h?gItFo;ug4x0fU zSij9F95|e!6B-STP01EzV#?wmI9%4eu=%8h51}uh=h>c>E)1IDlSVBq^&8Uq*%vMD z5I})aqap(ZF!Uhk)SSjvYJEQM9?Q^(=~DB)5*!rDl0hTBwq+$mL<(f9XRvOSgOG4! zOdcM4Wem8X(+yK2SEO~M=0^Kj4=f|PTz?7$jqD3h`psbv;C2A6-frzhSz%#>hdSA> z+3T2azWfHPPeOBJNi{;0vQSLWy(x6BY@Sr4Q6+KflBgUolvjuvJ9kOL4#$Senz|}Z zOg?QZWzCC)XS9ONOC(0$PRK(;S=p0~jT<}%^%B27JV{jrR#r@RDiIYe#+QVusgc;A zr?p;KGJ^=_rM*8d;-i+a&|X-HOICSOI^KZAD7C57eOTiDr=iAfUVPGt`nQ&n$F%Q4_R>Z@upiDXnX^a zuwB+m0?tw|Zn{&UA_hTL;eyNnMy*@D*iqPOYmd!!I?K3BUPG2~(CLtXQ7 zTh6bMj8-4PX~!D+6_sGM0m0$-Kxgqb_EAdAqodWrJg27KW-_#DDMl^P!Tj`Ne;Az< za8m3&b|?T)zx9Y=eQOd*AbvnnMg2Mn~XnAC;=pNMA z%gSb6<)*Uk^io^5+j{rE4L+Xf$jWNOwvM#&8Pijx57P%vnFNgKv8+nDG!kgyNy#cy z!+UKL(j7`mD>0^z9i?8z80FZ5JeyQFxCLtn-p1`u*KGE*-0IZROqE+6b8L zZoysG*zC>f=SthUAgL-;U~QJ43H8-FA?2#(6R)|=9Rj5ln_b!%Fs$#lw!7KUn%WoR zsd}AeP0*^Tq+(N4^;2a!ow>)(_&%QP5i1av#A3bBf!Hqnp7*Et;__*-wwUS7dAYY< zC=;xz{irvls#w6f;#O?m%YN=2Q@Ew|)%rZ%xm%!%%tVuTUDt$54H zLOa)KE4>$hN;L?r{8+&yaA8}}-6 ztj88*&Rk07u3QEVzxn|5Dq=bWs1!l8C1JYb7JAJ!V0tmgh5VEX6O%eVqn7&PG*z{H z+Rqp#ojB=g?D=Uc4ZLvYSiQJw145$(`wX4xLWm&)ZK>V1CC<(8L-Y*zlmZS+_7r)j zgu0NjM4<>hRy-2HtfBdv;&z{lK)7M*2CqqlCL_v)XivEw-n4S_Hl>-7$jNla14o;^E-E;Fd)GunV4#l>j$da_s@{(BVdz^V=1lh8kLm-&FLNSoiV;5JU^ZbKmAzy zSaW!==nRcC^E4ZerC&<*bd8IsE_@ec;H&&dnJLp5u%tx8mLVX@34(Hx)01Y2J@x_} z(qQ*;{jpIe3)@kJQC5q(j61(XwOHa>y(DAW3#zK58e+*|nD9=a@?XcRPGPJUIaDUGy)OiyCTwQjK0R zIY&OIN=DI2a?ow(0U)a$OOl|4fdL?jIZYj+9%dpDsq(2jVP6#f=+mME5ljPE2%W^4 z4JuCsBp+%3QKWg=sLu*8XW}3$UKOTpwGY*6TnrV@*od^W9(bm-?}6O#R#VmQPeUT* zN2&_mvJ2rB>M6M@pq-nU+o6|b@HNrCAZ&^4?r*lMy-)s7$(IZxcZ%RQetmIGP-%nR zPglmzTQ<8f2m8&3@B@%27I8NEerOk++N>grp_QSr#ZlSTbS8oXr-3G(uU_V)>$Fzr z<|O8ua1c;g4wmJP4(&`YU$+P~e1tDC>VfdQvX7U@9CN_9ysGhGzpp6C4EK zp^A6ebP3cqj37I={7`~19N$T)mmlPG0`dCC7`{P$d#Mzwh>2OHII^7IYxSG2ge3#F z`GWpo57Yc3l*iLa5Nli)UP4ftq1jw}L!96}9+T~ybsO!>vbed;Tmm?_E+KYaIb{y0 z$!*!eF_P2RzC!q`(=L+^CI_F(=|^#;?RN6DWzOq3T-k~Ckr(vL7OzFOC{Go7T>!4)n#n+hObB7x>R4LKAvC7y?ArS zO7Bkw-LY!XoB~ATpdkYk;6Zo=e0a5X4`kv8~sYck_hlNKQMfbI5B4k7=81DQ+fL_UD8r~Fy^5l~H4|XBI z;m|#)CQ&*ZtjkKyzQ@;XN148_W7FCDJ55wDy*IFZaR#$h886?jeSQdAqwr&}< zNn`3zUoMgU`D|9xqP`}%Rqrlnzl*_Llu><*NUyQ;aBQ=g4oIo1ENrF}c#{0K)d2s7 zUiUkz{+F;Y$G@XotZW<%|KVn*|KGyGY;5#@g@xG|+5QR(GtvLIurLP;J`FQ7Gd=?| zGwYw)32gri4QnU}NGQuui5XkD7(1C8>i_r3ApgLG8Cd?R2ExL`@Si|o_P;@Qf5rIN z8U6tZ|EYTMceRVZDsuc!_MeW0`rpR=5BC3Cj=!sK{JAE7Z!`Wym4orm@&A1uf7qYO zBL9eCVf|Z4sh}TbBp#LB7Bp&j%C#t6 z7R@ahUfWMl9M3ys1Lr*w{)8lIQVPaLLU2=b)X`22lGEYa2nc@APe z;G>p08@pfg-%rvfzCVq8ebhJZSaP*pZg>etcnO`)@0M2RHXJXPpTiph>e_9DCHLoN z-W_^CazT7gp&-CwC%oW4#BYMBmYuYY)A~gajo|>V)wb3*#Q>SdL!zuKF>5UwwU5?e zd*Hj?D~4HUp5*#~ZU}DnH#9c5CJ8m5dSE}&S}ZlzdDFTckAGi-!-Pb|YsG5C!}@U) z33WryO_RdXD_9kK5#I9vEF1Z3@=b6T>xg@NQ{D%~F>&Vr5z=i*Zj{H#G(bL3Kh9CF z3nwdyYMOK66n`cOuQaBL5o8NAg?331$*?3%D0%p87fhUDzQxJNAqbynrv$q9FNzG9 zMZBW@hS)N}4N&G(UZ6Xr*PKF?gM4FZ%YFUr-nb^(u4L3>)dP8@{}zXm!NUyP&9{J$ zDXINnIG(TkP~a|Ml9FM@raAH@fE%$udT3C*(Unj#59pCCJew)FQfXU)ledKaNIqfg zePn-6qN#AVAbW1`I=!|C%HOcMYm3M!SpCSh?+0c0r>bx-_V-*G)KVdFa5in z8*Od8*uDwAW2y=1%kvaHvJU;+a3(C$psY#J z`a^1SSm@udx#NOnv3G?Z+V%2QDl+A*54k7bmfx)=Y-{qy3-O^c9x&=JTv#FK!}ZEl z+1;_Dtv6&sDRz+BT7;Cs-C^MygDSVRd(Y!6<2r}d&L!(*SIulsx=Y^?7!1BfTNJE= zEGZvO4AKIh)PgM9;V-mn!m zM4ix=fGx2+1389tbl zipV3%Q}UDD4Im@cGacCz0d9$pse7p|Wazr((+A9pssrM^Xv2=6@xuZs;j zAmXK!l9)wT zg;)PPH^5qjTbsHNy^wiAs@#fgzBKC91E2F5`cc?D9n;9yD7%V=Ej$TYu{JSshsX;` zReiMJPLmtklGR$!d~5llaWQMNJpp&iHmJ9YGE^Y1MS~09i#!vtGRTKg^OB56l1HtO zLd8ZUnyi|{mTapm4O>aIXnoe$;=K4f8^`V!a?m5prk#CncOHI#f*SP=3p z*wi5W0YL?yp+TE6hhx;x{lW8v@-2oje)g)X7Jp~>M72#>(Jsv?ud5tF$ySMnbjzo} zp*!>T;<#sG-}q`tsoGk-EP}=={t$Leu-^Kx~x$&DECN_!aKJ&==flZ-JExj#~nI( zPJi*YwbJ-?sq+z73-a+7c2;gyf)z?~9ZXhAdssE}Or(AnfT=!k*B9{dcO?5G(FIdS zO1r)3qkKFeiz~T)mXv)~Z{}>u{Bs|Vkn6^evRVb22@-|P&kec5>sb`Hqb|5_q8sc_ z2ALL7WWEBIeWM;sBHXiFe*PxS6Ov(b9)p~a_b!=q|HNkvRa;%#Y${DqmrZjs0B%UfCgpc%Y+lNI3;~vzTu%?wJH{W(MC{+lI?wtlarA z3*3&a<@HV)`ZdF2@5q-;mF%9Zvu4g@7O4Ts(C2|D3$)NuG`WoK^TnxJ-1Sxh=3~M` zK07b=!iFPm(2qc|npiv*MqgpO?(G91Fw+TD}!6ZX>IvY zbEcEzDP7wT{QK?!ZMz|5M*>&_IIWYLXc}Pp?H9f3VBpk&rZnjj(a%{1y3mmdtvA$p@TwNwQ-g6t-_%69uJPaJ zit8T*V)MFM1J?w3Iv;9PfX4}Gvb`NZpvCx=b6xY zBD|kDN*)V)NGAs$*t!rQmdCNopq8I7Iy|tK>o2M5}XL8fF_>esZqfO3&HElNi zBlf&(pRDTnE69*FGSG*TZ8WY9My|gmECXg>Wg%hi2$%=Au9{-L4;>#@qftS+ z1MQGyszQXxoclV?rw@b@{Xb~ zk!pS8^6Oa@2UBX=cszVlDwo3%;S<@4b2p&or5rq2JY%`ToyFOB;&BzkuM4se60H-{ zfFc7ptd9^6Ss+-V<`)t!pogzoJ0LRPM;$#-lN>mCP!HOrexykrVD4b<{^&UwrJDuU zN^-@vw<2?<-M#&WM-#Eq-t8>}TsO^zZ37;0d|dYt1g0lzqha$3JHgBBouzzIk=hT| zqTgPsuj*6jksCMBTh|FEKM8v{Kh%)BQCopj3kX1 zPR2=y7z~Ry?nS-6^>zzh!Dr7wPq8)MmR3?O=1i5rJ$ZAOn%w6kBuSnl}r5LBar#;lFjU-A!w_6dk)Rm~iapA$bnOY2d0n`Qv>=yJF{bj@UZs9m*b!4f<+YY3rep0}}#fc|uB|YBP9?`3uR_39pJWD%erFgdh7aoHxbR@ z5SZO@JJTc+5T-LmrKxEbB^zYvJ5q2Lz;ysk04Rq|fObtSK(k*q%=jp(KV^P_OoOtA zd_l^gXt7>2=%>P(vlgu_pQc-zp8?qa)ReH~s^nl2St8qR(xd_MFlY#A_wqzjN=1t4!BmGtR8KxQ$Y`C8T-=%JbqOuXsp}MKVx4n0q^^0oFmzV}t{4oSJS#<~1LaQa zAv1t2I5s%Myq_chil2&K|1+@VhrJkH=!1O)C^LXkl$#bV-7gIZvcnCU>RqbFbp6RSkvA*nsw#|E zAXdsWIaN+m%Ctj@>}0AGzT<5Hdb7mjr{!)N`XgkRd-m5oN6$S6-xCMHBS-Bc2mRfs z1F^#u=L;f?nRxV!XM~xCyEKE46K^d5!)jV0vte$mnbEzB3MQ`EzI*UIiu|Y0YVsq= zTcBWi1S!aVBMEsF12a-N*r^;?X;8K-SaZO;8IgV5BkCJ@1HQ$1mhdj5=Arx}T2_Vl z=LG6U_S7I`>9A}d9pt76@Dccj2a$bJqaW%%0oWHamA&|z*!3yRsVm!jB40N4lYIX+ zSS_E-b8Xl%swXC~|e-(1TjpiX?b2fBaqYW8-TEe8P zM|MDlT97OOCa&!BVR^iByzwHG56GxG)}fMg8RtY!>aQA+Sfb5LLy}X~UoQtu=I9g6 zfo_TcB6v_AWRr$o{ciz}1OeoS{ijx`IV+`IU#Lqh-_Cm)G9tRxsKbogk=GRb5*@4CWo2`!5BN;M5(S=QnTnXnSe5G;+C^*DtPv4z0;OkgkF1 zUPE1weJL@)Y6hXv2XY?el}^E*FIsj=K)5gfne{o>X!nR_f!rLBWUY3nWyz-}7bF|T zc0o4XTyu!F2x@SgGV}zWS2LfqxUFQJN1flDD_x*m47s-WB>NQmgcFbKIvN9*@J`{w z29D%$Hw0q8OWXL-S&Oiw^55cf%8 z9K(=Un|c{G)*G~6@S$HDSkYm$hv=alE9Z>_NhyqZxfOawWK{imGwm(0Y}3h%ZiG}+ zn?WRFyPpNFF2<>QqS8eb7g|#@S~Z%%W-cjn!X?ig;&c3id;3Lgi(-FkG_d?;r954M zjO(aeeK4JluK?ku%EOAoIlM&zISSv9{km%4t|WUCF*1j>2xJR_8CslZ%Cmw$Qvvv_ zY0^~7lwv;6zPv17zxPCgO$oceJGUu16=7248%BDSEOPqItg`u(%BYwW^TI%{@#?W$ zsszn?CJk3o^_Zw+5q>QOnQtx2X~sc_K%84*$(EOFjTdBpM8fjzz6s+5g3+;cB!sm* zI3>=df6Ud_on^%Tgk=1)-_kS93Y1I?`lwShmoIVfkt|H8qz55WSYX2bIkS zyd;;gvC5KKorEiSv0~4(d$fdZqPgWCJ9HCj#=dA#3nE^)%4h>=bs}CKqMVmu?%m|7 ztdomuQ|*9K&s*C`zG_5#Ev)YJgbFn*S$}0THFPyev`g8F@kBqB5@io|*@puHQ!hm- zjKQFLs#^tJcaxLz+ODoHAwjb;gw`VFnM9YJ(g&JwOxD{0PJOU`Q3m`-#x}g1iYiWQ zXFMoexa%c;HGL<2FMU7$i}PrKY^UNKb6`6PbJ`QC745n%eZK%1D!Mp)Scqnf_bz_t z!c29@ANHfSt5A`7#$251ha&dB;4$rw&+b*ksA0;n>^flWj)qt;^Fhf#(1Da+F?Q5| zuRy!OD4dzEdHltIyA+8cMI1QnOvF8-Uk(bA$j3dU=qa!cR zAv4R<({(dqFziIb0`$N-;hw>+^MF*6BbcmirvoZunv^=?zI%hre^=fbw>*gRp7lbFl=PTy!XhVZX&0LNb)npv3{nE%^h zmj4t7Z~z$p4hI1KzDtbl-{1g7ra#-$*#7wbbNqden4G+vqB^y*g^h`mtclxS1YLP0 z8RdW9B=%RUa2BS2YZcB4`0pKKe^rD30S>VKtz(S!zlq(9jQ{#-{7+p?|8^h$)YkNu z%l&t;h zI0>;GC2%Sclkk)VFJR@n{sNc+CqEHaA0ad+Nq)3ZFC#N2Rck>Z6BF~shNv|^3vnzb zGg0||_#Ux>!*GZV?ku_B>qjN0f9K4V&z09#XE#7<5#Taip;Y#J367B{vWyM+AgiIZ zAj4WYIF}u`!bz3Jjg7?H7nQr$)XK8k!9g+TMd5lRd{W6yyYVOGvd_AaFceCDgSoEJ zz=q!k4w{x*{>~^p#!dk{1I(^TgD*#6@*<5hF+59vc0y``Wd4IN<#m`aqZ)mE1iYR{DqJg-P-CDJ1ZOgdAcjm1)Q)1=PTye z%P5wH_?q)L{vEvpvtEUMcx&EVI1vFTL)qwYmlBcL6wKIS2jLvCqCO!rv`-IBdlJ*B zlc&FK>Dg(mc6?q;F(*^KGPZEGj;zY00O;7HA!V4hvIy%!Ug)zKvZ zkc;bCvTO}iQ~MnU*G5&TSO_9LcyBEa2m$$DVAc5h_(~=RU@s?5C{dF_BE`SVxus4d z)+7k(mDyC2l|W(wYR^tx*XSG(_et7uoYtpojn+j3jbTic_?^mAJXdO}qsp=nGUP;5 z6_}3LArhMB(O-#Guc_6mjGGJ{>?De@t&E8gUUpAqUjZM$8D8KsRWu1D4P$lhVy?kH zG^yc!y|)d{+1({y#sF(xttqKz&4#Cq%+b5#7_3))BPJcGs1rAutd|uR%(rhnA+<*} zhGoyA$wr)5l+ouxHU~m(v^-%RT_RU=Z|b#@==y%gRU)JBccV7p?0H89=x%fKjZw19 z%uxn6)dWsIXRCpjJ7Qew<6h)1_goB{S8TTsHL%*k<`k%xm54>@^100My7(baP+lWr z8~QLa;u1)!LpKL5O=@pJ_cR%mxb<%{@EL5Fy9_z4WSM&A-dybve$rh;7Xsy;RYa(M zUpC-=I}svN$Hsw>LRm#s&m78Jxu_2M2;~{dHQ-u3J12Y#%rV}+Q|=Dfo_V_Fy8(UA z$E4aQ6y&DcVkybuW%QP|t8wmWpRJv?-dgv8L_F;t4)Bc*OJqdGX2W8rU+~ zJXdnXb|T6hk$OQ(SAgq@)r&Jj&l_02e(;9OZF$~)G5CbyBgQ3?FgI+yj=~wD7w-5q z1b@SRlS{d-Y?*1SY3{js&t}Ry#=Xit!9CKs^&b2}c}IQJlOC5zoccy1r`ex6Q&Yd> zu!L<@^I&^sSL0Ppph4WcTV4iKNFadW_f&r-{n8mE;*NRe8$plZclgv`!#79h#6^@Y z)!?pvei*m4^_>@~XWuG98cmWLsca?do~X;hcX?s^9ndumIS-W`_7ny2iM&0kw93J_ z)i`}mCYzHIen+`ARpZUY(%o-4Sy;77_`2o{mm~a%kiMQUFXvtN5dS$-hY7;;q* z)0ly+0bH0RH8YR(indOgZB73BM+*ELR)thw6~lDNH5SG zpGM8G@KMa=A6DwD6J=&6O4YAk*0A%^U8O9ZION+5o|r0ca?l0{pF_zJc+Q!w5sWMY z3qhg#0tFV>+ z#>j9{G@=JHJ2bZ1#O^j*9+%h{!Yy>j6T9&y<PnpLD*PCFyoMDE+6>y+flIhs}#yJijRmGrRyzA58 zde<3%RaBzb--MfC6-W&6kIVV8B#pdk^Cxa%ZHln(=DX)K^(1Zvq4uNb=xH#yOdFqm zD!dTiIr3a00R|cxm~^mCWo=e|eYXgLEP==U)uSirm`KdnhfjckW7MEIN!EvT_^Oj4 zP?n3gAhY^IBI(w6ebGNQl)wedg}j}LesMNOpya4ic^-1A^sDqV%JP-YoGHu+L}qlt z7u;p*9BmWNLa_?@Hpe2ZahEE`{cL(Op|hNvHk}Kce)vqh`@tEP zDVubSvZzqcQ{pku9<VH#_ciy->xNvGgrpW?O097aN*gC$eDB3#=w*U?T3`h3m2Y;ve|=p~#M*_B~W&&4k0)j}a&vV-VS4h~&86AL3Qq{YvT z_AdBLvFS%q%N9u0SU&_!GonXXvA_$sjyaGda$uaOlFRGk*N#yI;d(qn6<)QgN4@~+$x}Z{BY5F4CxUb@kjmYB+7w%CK!xS@K{v&QE9>aJNxrd zU(dG6lHNk(Fa*QcCp%YBmwe8hU}Qcxv5>+{S3WhS-F-7TgfEKfcbh>KoJxgfdV``H z7`cdpkG1FPm!mv~qhze&!CqZA!voPw$;C}tBRv#-w+^Ac5?gI$&g>SxS41^3xxANG z$%Mu#zO~&qu{G0K4s)h=F{+70Dd#L`~g9zF%hBv3};Nd%^R~0&Ff~?k2Zz zAJg+NvkZ}^Z}7_d)u&y)?MniD8=G94yFG+}uYGjyq+5#GZqXEovRdFfgV=o-N&-91 zpIaez(gNBRBu}gLJ2Ap8N>-(^wRa2CdK)W>o9+|$B~du33)(4a&CatM{Im*rH{$K@ zt{)M3$uRxo>Ndp_B!a#@%NP(3(aH;>Si75~;KMuLx4PWnYz9Y?L*Y$f#g&km#>ZdN z9YPey4yNy1(}wrB-bnnju7@JkI~s%66gUi-2*FeIgKUM2DN zyefh1=S0X|fH`Q<$|}%$3%WN)JES?0*M;h#bRqBM5>b9ZAU0y9S2QCKKFEbCLWtje zu^=ZcwAvaiq*I_c7JFJrzD2|#&g2boJ%=yZ)A~SSK*@B%bE4j}-axFXWNQgVz}w-x z^MF5;4N77I-^?4Lc?h&bF1CV-Hz7m^m**iwT0sB%-=s!`DzV*TLHR3|~l)}3k- zvlb}kb)Z2-A>ZdR<#_dailiSD{0&)C^b5P3^b$>qf`HHr8GdM`3$NscDB2=40UeH! z$y3`P&wa%I`}13k`M^jw8GJZvtE%N5pnmD3*5v|eo3hES1nt>tt}Z5(#8~dyHDx%Q z{QKh2^62yO_&R&RxgdRtX%rj_bZ^3fT%QkBlwvlJ8_0w+h?LWxABAjwfkY1YF^7|b zDB=YgcqPakhikHQZ41Jn4%DQK{Y_F|GFve+T(5Yp(5=OSbTF*d3sJ{N#SR|SydBzA z>aDU0px7OR5QtLGv`eHOWu?<^C8cA)e$0k@3GM5JRsjK32iWImHik9hgV-s+AEYc; zq>)?;JK_|)W9yNNwIWWG*IoWW{z*V63zm#wnwj8;^0iQ;B%UZw;aHZ}#>57V&1%y9 z3*;5nGEA>#<>|HG0y3J#lnca5BQ1@7gaVaeVbYW=7W5NcmGcy8%CxTi(w?;?Hir0B&)Bm4qifh|%Q?)omq zBvNrRPW6}aw1PBC%BUToe04P+exB3L6Z8)!RF8IUR`;q4AN!dj94IuK_*j(&gO0a2{> zXktjx^zPtdd5YaVTD_{JNlm9pW2WX*P3#g$mYucgkL4Er!UW_)AT%(eOrtf!!E#JJ zX_;vIK@KB#jyV(cDAAzjL|Ty|K3H!o4iv;OaJ*D_YCd`FnZ$A&dt|~BAlt7^|D?&? z4k=uUOFCW+8hEgFP;$_{-h@kH^0;tNk4+EqyI}fw)dSk}q12zMuJp_nG46SY4mJ*k%GvZk$YeS8vK=~!ZJo05m(ko9rmMBuX&`BNQkBr1 zVo1#`nj1AZX|ib1r!wtm>tAU~l}ZlZ84}yE)FJIHK`-UAg(TYj5h`87EFlB3RMsK2 zi#RZ@DaL@c>mI(}ulaKUDatkL^cET8?DQjj0>5SkZ~~!m-CF=qK(D_^U$~itKf+q1{aLg~@V6}snW)6< z$>khKCzS~Wjs=(hyzoJ4w_4K^zkQaF35n$vq| z?1|5=iBIyh4~?`gmQ=X{Y3Dq}XP6L-XJn>}JhL^uiAKH@3qPj$?l2!oEX3kB2(uNw ziMlVb(2o$PuD=JR=`b2U?OCBOj*7XcMxhrsUl?f}_0jj|7;vX5HXHyqhF z6j`sXdEJ9x&Npm&87?p3T}U+iw|>kHwqai9Xdm{GvB4kA$dslC$LE|sqtpjJ!_eh({u|%2CJcMpUD)Bgc@}$z~PbgnGdZIw%-2Z?OBP z!#y2praxfYVvHh)&dbL$i_SB|+r^YJ5|)vABz$CL+5;9>dZJ55^mBbA0CO~NgTdVL?rWz;1VG+@RAJg{49Lp#_=VOYTG9O2gA>vIjlZnHZUs`Y1L_H3V)i}=?_&0f98Y4Z zlL~%nptPwJ!-*#0>}mL*wB9spCaIK~^P>K|~2PR5)$F$n&ciK0O<5Er5w=z^2XoMizqPM~*QkKkHHl|V)AjPt+IAqw6y&y#wlNmRpF=>$DYI3T36LLt`F)}yvHo#$SymI7s zwHyIyXsQJ<(6(x#uMcUtSZFWsEXJ&+mwg-cQRdo6F8CONgVW1=GQ7=rwvVi$4iJf$0l(*inptsd=nhQ8T4m zv>C0aj^C16v0{Xkp{wCUyYbd6j3Ks4IIx?RD_e!C2Oq%z#j{%ZLLcGZ#m zVzDVpn>rL3tIRSL5-=F4qW`zyBDyY2PRDcn4B~O4!-9{sMR0n@&JYcp9kOllGu<=G zGi$4wCfKX2-6a~Uc9-;~JlfTxI?|Orn|ijaDMRMf))?!-w-90;-ne)4Q!@u~Lq-W} z#m*op+z;hGx6GJ%)Hx+#wA%JcY5HsBkeY;3&w?_^mL+Yq<*^m|GmVrj*04%bt_QnX z#}EygZsMsQOr_*%3Mw`lRLL%%Q4B?E?F><)NM~~gd}gjlMr~)85=o7Yn>-H>Eczl6 zmJ*H*bB8Htd;x(zD|)+a&r%QWbQW-n1m*3OvVOMaU6(1+#^ydLyn>&gW*B;d7|+zM zHzA1&%NK@s&qQC&t20L`3qm%XibaOqh?c1FV3yuwXi}{AGw%u5XTokGW)2R@7F1`+ zk}E7qDRa@~iZ5{~gPy8ClE;TUOYYSd3UC~H3*?Z?GcXdg0M1z$lugPNOBp$EQZlQG zCG%NuA=B2i$Z{PN(-Dz=1ZZEnkps~>$#GM$qFF+#<3emR0kOwlH_Pgeewc%TC~7nn zNnh?T?e8)E`Q5%loyuJ{&GV~m#v^Dh!Zhs4`?PujPu#RC-rSMUqe}lSVqWqEC zohqR>QCw@O*L17G+7+#`xZtu@Ufu0&njGq`P2(!XK-<-A?O)WUZj*C!T2VFcniXzS z!Xej%e?>Ka0Yo`YJw=^DWNkqy8ULkyfl~4VKQFgA%jNSy{PmV_(gYf(Eih`y(GpS1{`LMG}2k7X2r8ZaH0(`}i3rD6rq}_ed7) zJ)zsJiwe8%apb>$?SFqBtX>rH^KU;H(SV5drN7qLaprff!1)y5k89s`+jaFr{1t@r z$uO(pUDsNs?hFnO;hFDsu#=EWTu6PTuPc{JaT3MfUTGG7z30?Wc4)eKVPM&8xn)lG z)aZVYJaY_08+V?f(MP{lJM5u9{BKbW0K>nc z8UV(>ry6X3_Avat!@bQSqqu(b<0=UHmdtu2K zgzzDt6A5F83KPNt^3m1k<4irGC~DAaFGv)!7f7Q_PHVcxHJ>XZDVn61t_nKa2d5KG2Oy zVg0>;SMWBwTB^UMf-u&BpWT6`MrqI3-00skMnQ$UzY%6%o!+|mV$*hlAzqc8MR|!M zb_Mx`J>Ly-c`ezs6Kfg%Q4!q_9#^mb+C}ME=oWd$-IF=-IwQ&`3XLHh~S@61xC$(0{h^Gimi?P8psESR511nj4R5P zP2}{L&WQUx_M98WEh$WGm%_3S7)2e-t_ZDRhxS`P*EM@xFTQ)QD0}uu?bvo%x&Y@; z9h@&zm|)j07_^0HVgx7#NM1M_s4mP`a^-%+Y+p`Ibg5{lA~_K`ONza*AFVlu`WnYA+BGMFbZtiQkE zlRJ7n=e#?8r@I$D!HM*MFc!d47D8zh#Avc@Me~Jz>V-$$1&Zz^pjdOVhbR8!|Dqng zxDv>|FK5rp9V~YJq0uD||7r6rP9mUar*D-j{b44IyLnfUER%}P& znKruL{DdjBU&1|P&y%3rUn;rY*b*6i7uR}_EYcqD$B5T8p@=(boI>)B3*%e~tprEBm9WZHPm&TA{}2BKR$*C6@b z-E-D6nm2t<9N%!y;8)03U=M|Qh`?_6b>nqrIg(ifc1DV;zj9JkUP&W?sjG-sx;$3utRY>5uMp(hPEk)y2 zPh}n-+L=YAWNN#3yvWZ#kljCAkyUi6_FKGESl^m5nJiqtqDpa>lFL|U_36WIH*h=F z4W9BG0q4NlvkQ`UklOHZn|uY+XNxboF8C5o5`{45wn}jmmtwV>7q!2yupGT~jBT}5 zb9veT{4=Il&XERuH1{?aj7SPB8@^EkhmTo!bS^P6E^nM4F)}r_YKbHsj!y5bbp!Ql z2(glW&W{U+<1Vg>HnybOZ2+s}XM?!z`Pnvd!U4-#rn{!5SB<=p8Fw@S##P^u7j6#H#3ju;e;(oCCp zrFqr}6M8%aN)NK1DdskJEOh1Wjx>b~ACK@IhRXu=(+Z(K01OL^VGAe60__v5s563m zLM4NxuP+NCykEU@6%5`yKPq;X+C`g8qZ|>oBoR)%!eE`o;7)OH9}8;znahe|4w z(c440U%*!8R0F{^HA#EUB{FkeJ-D65WOEI}lrCUBM*G(&VXRbOjP({m@qgk##p!iIK& zAM-Obr?3!TwJ_lIzpe%GkVFJp1OmqF4G?v)=>1MwfhYwZ(SJ*kK3xp*+3XL(aQ23j z>%-bVgnD6(wwp-sZ5O~EXnzX#o%`waTbjb86I$?uA9wJvPSExHm00VZWw1$Pv!IB3 zA40JGVGLpCbts~%4uJvt(77VwkJlT-AKehUnO9=&vy0#8OU*GVzAb<9e_P)C*8jjB zY(MaTq$|kCPVtTX)BPK}PKf<839~e0l!vpc{^_PuH_c68%9b3*?D$+oV8c%uqgm)e zw7%+D{FJ4Xte*`ybg9d7sqC2DbhYf#sX`(z#%*&jFs8%ejHe4>Z6hFRvN!bJ%zVA9 zdY`oAYr@3{TuVWByX=g^|<#`k|;Yo(Yz>^5w zff{{1!8X6%Ajofs3H#_)$%l#4NXYEMO#oF`C^DNThpI3w>hL?fNBM`#<)96H+!Nef z8B%OcuAF@>Bt z{S!V5&#tbkf!8RMl9JFU6vko2^7QI-_cXEl(6n7*%6jDqXK7l@o0#W2AU?8>> zC)BXeSFZ+gW`ml)u_dq$lMZ89vA9II42z^T53=n;PiT0Dy)C>(d?aqxVOGI*JYPV> zLhbN+93_^kDBu*Xl$VqAWe`OSuVjp=G<}QmPp{&zKYuSZi%zH3mz}=}djuc$x^{a)l^20G!hhc0JzOH_YNLCq>>Qfk>8z+W068 zXi{}5%S9**ON8b*&J7CM!3p$iqRi+{(#oEVtH!*aH50F6Nx`_l>^>u(_~y{dIy=b#F{US2(ewpdDm z+e!9mko9Ol$04a^P`qiZaZ`5j{Guq$oQf2km&{RC^>C))vY36us&*kMIl1bABa<@# zFbjp`YGvpXnI2EQRHk`*uU`{49r9}JWV^NFwxe4dQwZXnFiu$7n9L@Rc`~LHs&wy9 zNu$2njl8a~$rKF0qn)3dH=Uu%)fmJoX}q_GkN!O@8IFPb*ti;ww}#c=w=|cKfCL+} zyeQN8!epp@4ceEzz1&SgP3`QgF|l0>CZso8&`~q3tEsH4&o(pR)ByqC`LPm3`q<_) z4}%ip#FUxY!tMF{f?QqI<4Ci7$!?G8boEZkL!$i`ku!7;a&CcBwLe5@X6mIeTYZa@ zAnRqIz$efb#}~~P(c2%7STfg4F13iaX-0DwEUu( zqjYp7E82Sc>}QqvG&CjsOb7h37T^?h@wLVgj!f)W7ucG%P62>)v&>v-oH99&HF3!( zBc*x@cdzTF9n)mK9V&W)W2)M0m7XJouc`TwJRLNhPqabv1q3sC8ci%d8QKEo`@Cz? zxp`T?4`M1~2xj1WOl^-BHKgtLbvFULFLF#%$qH*p1OE;<=&CZ`32A{@>URtGghMhS&_W1<1Ii?KyXu+ zsg+CTnLk`Ubh4J5pB<^$tIx7OnXnYQadocBl=2W5jSC=t=SO(c6q$41|4fmoZCo%@ zm>I{P9qk$ELfrOMSSpMG&AFhx`@%09u_p1Zj`f{PdPvB>SkbjTTj}m1a|%GWDhN)r z5@P32`Hk(uYXP(Ku22><+R0!bDpf7azm&>hlSEo&qb3Q0ot$L-b^P9Tf&5ULgVtP| z9n!2Oe&sCDbg=-UNzl}ljHVy{9>?5UfNSG5>rs1=ktn@BPioRU>zo*~CW?*-Fy&Ho zti7nmt2~&cNx^l6uyS=Dg-`hSSYHhB*@bBdk+_0ioDF46+2BOi&*e7Nx{_|F zDTPs3T3yRIv$mO5)S3tcDve$HJ+I>Da$08H1fvY&xT4^&@@id%?Vzw?6MF~H5?v9B zETkP-J)h>xN;yB~{+XAmwuWvDejQEJR2DsrT2BbahR#CQC(j2D*;lV+htEO(Q3V2z#nvJo5A=h}3p-c4_9qN{noqIE zi%V)6^~4nX@;4f{md03`v<~f}DaVG}ngQmelOGnX!^@WzdaRdcm`>EgmZ*9$aLXFD z@~JpzdT^1o5JPH38|AO#)2_7|nowT|Mz{^<|4Ls1{M9^y3LgN5Pm{WJa|viyCh z0)Y8%iqiiL-;96bq48h775{(m&-mZ+;P}7r3;D}n`!gHkkMY+zGY8{!6K2 z|9_&>{hQn2pY%BZ(?95Q0OtQ8Oo8J+7wB02r9j8}_W~U=^MCT%@nWikO!m=Il z)EzrG3RXusKN|JB1aS%&Qjtk;qtvnN)7@qtU;FRvA5~A7xiD3D1F-nx?&|uVRzR_i&ISlfGpESz5OQ;O(*z=#;&SIz0)WGHV885&2d+@)% zQDLajaBA&uL2*dz>FH4l&Pn|ae-_!(Q_^TMZ0eCMiO{3$_Op2ChnDVJ+zT6es-#j4 z``~ryd9E5lpsOm^d_QW+Y8bRb_Y-ezHx=O~K#16;`}}o%JG6USHf)RWWm7TTT%kW= zBzDmEDyMkbZy?Ce=FqcS?bu5jtC z!v5@!{lTGH31lh%qwEChgC#R3YSgXF06$j4+(qglp~V|o%JylA=>P%mfB%VGSRdB#DfrEK!NaqJvxX4SK)vhqM>}c$Vy9 zQbT6;QpUNJZopB1JXv3qR4D6$jdo*tV5r5#v0sWgm3Za26cE-+&hEHLT`$)%;Z@u~ z$5ViLJpyCiP_%Z$Ng!iRqP+6>NhGuZL!sj30uNHEa?#4dei`)|EqhyPkl-cjQekV? zm{zm4VGAd$9L5fxq#T!4_UN(SWlV{b;IW~$T*nssfT^@|r#)gGqR_`LZMOZBLiPIa z=T09W15ori1qb2Xhbd|JVHI?7<1UerbU7W-rZyzq%y(pLmh*1cmjoz^lo}7b7-w&y zP`Frl5h0qULYem@isEge7`arBk+(}iambZZKl%^~M>LgHBRsCJV6 z-8&hungPlz1n+4n?KyM0MW*NY^m4fM&HhPj5ovSZc#o+V{dwx@jnrdE92%F)WFikI z$#e6;!w6C*_sB$thXuPv>+W7|Y2jjlU{Ta&7uUtp4j(sLH!wx?ndf04hA5!8 zuS-xyE1^y}`<#^TyVq#kSlp=XZQg;%tqZ!?#RaQz#1mDM z+K{V#@FO*p=Ap@24>8x65C?^K#ADQfz%9^=*5e0zqo2$rIoIg%n9l+I*zu@dyw{D> zWU}wY#ob=5_?s%@EvYa17_!9(q2~j#hibQDt~r}wFnFQH(2f}<^#<+n2I_FVRQI?? zqFtJ|RP?VSD_6Fnn$QBCJVnO9 zGQ48hA-k!zIhbhA-H%`p3qEVk-Pa($a}y*w!_)}FAW@8KnyZ}ns#srn**93%9Iz#j%0wKcVrK04Qbi99$KERj0d?Q#X*!0@HM4T!Jqy` z8PacLj>v$7Z2m3r*t9v($LyxNv9nQbN16=k%s$MuqOqAIzyXCcMr^SUEg%p#)?hC5 zk2?o$A0AJVE2|R%G+4t?3$sliGdN=*h)GQJbA9DKuP9OAjf$zO&W^x4wKLI1uTMK@ zOyJ-U3c}cRjzRt}|EF?WP~?!5Nfc#-I<#C-Q%v$Hsm&@dx6YXIYm&r)$${CZZ*kte zLH4ht+A82HitE@t9^(Uu2|}Bx$d5ewqC9%bu7z%mxuQhFMBVsKi~+AZry)bivAVgF|q^x8|no7$KhV=41b3@+5Sw|`dcXq0Q{R$lm$RY%gE0D zN0Gwt#}aJ+5_T$i*cjSb|0nis41e;?zm}gYZ0!F~ezN=%&;FvwxXzPmZc+2b2YkCq07>KwL z2y*QwYZII?$7%%eSIFUm3C_~Xr3H;77~utw_e=~N_44G$s3kaJ?Z{_+3cForz4=S6 z4iHsr8-1;&LdW}EJ;*d1``&9rm3{9s+7s5}T|J-oVx~(A9T&Ak}ILqZ~_p6iphm}14j|8{}tL52mZpd#2=W47hHRkHw z4UkzCwM6je(jd|Jq6yz>>v;5ce~tF|&iXM=`_zsg@PK!r*Tzbz8_R!MH0?tAsEmw) znb!HES?e#0?e_x9+6!f#0QJr^9Sla3W4N>79pN>C>FAhysl_FYn;QZVY~^t z!=2wNpC|r;8OC%B*}GdaGWt3aDVw!;eXsBvNfqFDMq&H9xARZ~*$=p|hkVC-6$jaX z&PvF;xyBe3`n(8DTmgPYZu^3J|Ne+%JWy7z*GGFTQ4LoBosR@zZ-aau;KcFh)C%ky z7w=#XAv)mfj+h(hbB&wrAGd=rx+~lYzicbk^^W=}5WK>ueI|HG(kD(4_+XD2+bh8l z7v4hD!n1M}cKl)Ta3 zcL0ln{)wX{>TDOPC%A{;g*4yz&i+C>9g@9YM*POK6=fTtS8j)o5QOJC@0#zLc2|N? zL&)$xEjuXcxPK#L1*Km695gu)%7q?}anxTrJ^X4c|9cEt9qf}9cvZrZ)()HbFi*?Q zn}WOI@mEwU`~F3hJuIUS4kZ_Ok5KLh{^2!iuGo!m07p0uAW@bqL6F-IOG5&m5FsHi zK}lJ_(spOb{>fgfjlFf-{==J_FJxwy4<(#I2A8y1 z#{?gH&=?^d9bg)2NDD+Noo6$j_g>DjwwsVtmsOC1X6_^fTX^&03qt5$Xq`XFD--D zBjysq!XEzxE9h=GLYUxoSj2NbXZqD!JhtH0GpM)?qGAWMM0GdrC>HaY8sfFcCl}w& z8Ig(;b)Ao&Z~h#{>GHbMJzHL>oAk=fn?p!#Zx_`z#&-if0g^@o6)OP_f~PZiIFEo% zv{1&Pf`NQPr6E-kRPz(Uf>U9;U-Eqm@X$Y@>LXFXZ()c+0=z>7gQaN8b?_;3v=rj= z4xZFvvGBfoOn^ucBc@~38=nxyml2>K-4P}FM%TtBfO2``6?ti0o&D^evk!If(D%3~ zjQpmiH8x#mB5VqNOWeSg;}(atDe{=6BAnbw2V#P@DUWJ(N?|=VQ)^tddPmi)1Cu-0 zgx-4QUA?~6K83N$)v~vy!B<61?J&<+6m_ifjC97|=ff*H+zFinvXR`%j3mJ}Jc>)= zE|Tvb6Rh?|B&lzzuX6UA0h+p=737ZXl?x@R@p1(~L3Q1fssi?&uu;r!V)I!C57{`q z?p`N%7qFgINlQOS+fU3Ihg-TubWSii-oB4kLi-}Z%36w z`%g)(!~`TP)<}!UT*q6OWV^MZH7>x$dZ)`(ZxY$hb5+ji9=i=YT9S=+#YdlxL(TiK{pn^^Rk!8N*~ zVzjWK2G_n-J81- zT-Jl`i-x|rWU3(xgOiee( z4A=l@-d3o$uz)ks3(IpZ0+(}Y8g&%kECe=8(X_#v4D2Z4q)c^60{smx5r zC>ou;AS6SmSac-seb9*x!2~?c;Q2cwYBZj%(lWJ9kc`4aGHR|$TNw;|MECLL7+j#~ zNc{~31;P^hCh26j)TQ^s1uhaSB+za>c`|!20QW7~rhg^criEagZD|TWk(Jym>tUtd zL10c@36zx>>iGD5kf03tGv#Fatgzc;mck=1KH1Dq@JJW|nkP-G!fppQY1i~12FjyI zu!>C}9xbR6s3^3E8_ADYqE`*6QaJ#Z#o(aW|Cz%_S!uvBY8-r#hf1a6goCziK{z=@ z`m%%usooHs`Tm2T&}rn%8n$(^*JII83fFKI*G!w*zhensadr`ND? z)63=nIOo}3-gdQ<7q9!#?ZOy8oPI8`5w9?|6gA`N{9El5Lk53}Z^`l!sVec{9wrqF zgck`MGSE^sbHEWZ3vXg24T{ppC3Keap};C?zG0VyuWI2~g59O{5gEas{0{jv_s}LX0jOOeub%U@D?1{8%%&ODWUWhp=c*WORMA7HA7N%9}b8(cBeX*(EXs0Z5(+?rD)X+b>9~!yBXstfP z)`J^`A~hclIJ46~F*_eLor&KrjTn9A--XsI!-zbJ!nzg3Sp58)MIRE(-){#PiKwh# zVVIbs^xkk4H-cTU!rCqSqkHu6@EAKSO0f#ZEX!45BYyqY*xe9-% zqA3F8jnBh8I4@ftXEOM8S{4=_&xPA%<)E%q7_ELi$&ADt=FZvIuCzcGA2mPq` z7zfZUr-;W&gavevWN@kTaDl{@iNd74Mq-Q$5s9Lh6gm6QHL>WhL$qLC6S;ZauLrvhNOyz8$mojzKS={VGI$|I z%O^@evg|QZWJ{m$Wtkc5J5vOA6hSgH+qV3niY;4Ucpd9`!**o8Aur6V-V{7|4gKVM zq_?x*s`rmjI%Vz|zpQ@&?%1iGa9TohV-Z+Wk>*9PzUhi|lH^Zrr_N!Sz56~R&XZnhb%8^&3iUJk7RL%QgL{m(Ew9sWuM{9ePk(pFmHv2KR6ph4Wx{svt)SWEHIN8Mmb;;xf1$0SzIza#2#g3 zId%M0Xf!=*V7T@fqa%gl)J?8#=$c{0T-Z9?1%k6 z@p*rB9pTz!+u^JC<6#d{O-Ht?ygO1lU~G2Z^|>xNIb#0kn0}4R9W_`q~M&W+>b zV=r3o0ES+ax}_|G9B|o*l{3b6gj-(EVNSyyB9B~x^|OQ8kjJ3iT%}h`F1mIY5gw}L zyVdzDBXelGOX$)Ghet%lVK2qOUN6P)lx)y0G$K>@AYbHEPDIjPxnPK?&ZXAAp6&n< z#+6o`rP^yW%R7X!|9R{VkSj^A0Aju`hL#e{WOxfU z)-0dYWvEU%VSrpUUtzH2v^UYsu;A99TEa=q;)qmHX`|7q8f6b^&{f(@)|^;8ptge7 zN5G%$-N3N|xoE4F^<{Z3lqcylIte2i%%`1I% z`*ZbjS@5CnT@h<5VUx4YO7}7O9B(N(h2x^8f)w14Qhkq(reJ9t`SN*s?fGKYEXUMY zPK+nD5MOVHByaN1i&Uit)h2ZT-l|l~eDxkykbP8ZU)|V8>u4>e9a|NL6a6hcA#U7? zC!1nW>5x-DS*mCM3g2r`VD7c5Rgsa&eG`i^R)+%B;LY|3o zn!4s05-%z*cSjP}xJQ#f0y$OUpkv`dy_pEZ%=<1`9wAf>#kBG8@$mf1T3+=6Rx|sG zw)JIm_+^1SOqOXO$3jHfr3UxuA~$y#g1KZfow4apWLn@NTTZRPR%HY?t9pKt<-&EI z1p4$#R*q?dLS{O5S*>POemKYOjeY1)d>fzy3Bnz&2mxo1xG|})_N^n8-}y9KY`fCOcxFqQFuXGxQ>C*iQyHG*rf@mmiqiyacIRb?IxEdzn9mP9hKTe8 zCcdAwDG56>JY%0JBSeP)8r$_8c#{;hTfHWqhxu)f&h|Jm?PB%^4dA<3G_pO~tg>a< ziZUe9c#EJ~(woPOg=&Sa@H-8(?$!~hcJOZyT#aA2COChARIlozqd8kEF_2_jM5GNx zN#!pZ6BzD33|7#}s$0<3)ml8uiLxtvh0jgdlnQwRhD+{a+NJC3e12Sn1JeDe_JmyDY)0Bg(_%`6>iUAx;aja_7IzT5P;3s^!5P|DybcKmrK3jYc*LKa z_?mYK>ja9V=8d{Dfw=SeU?Hu;KLT=40@U=cvylZ;0kEg7!04=1SL+={k?EaU9#4iC zf>c-ym%1PB!5rYC2oanMv}n*tzi0ydcU{=w?{I;CTW&5pd;b_xYUQx6{Fr79KBR?1 zEmjLUdwb;FE*`^UmOlcLct6~=h>hK>|fB3%k0wl>4|)QfDwe>o0iP3AmKJ5Ljx$BcI< zw#2dzE6(TvOoSNK96BO~dpD}0rk)m_UY_LHEt-{=#V6J2Ns-G7Vs0WXDi(&kG)(7a zB`~2HrHQ30j8=WB^i6C{{AzG}WWU$^C%05*IoSvm_!DSKT$Avn=I6QPTC0Do$hKFU zyG;J_EiH9#`{b(K_Hxjg5+*?vN0FP;fU1t#m>5>?7ChWa{4;s_vjtOQD`T0{XJpkm3a>Ll0i0sChlX3$`|B-!dk-eY1Hy&tgbp_P z#e~Z|_}G}(%UHeGT%LAZxxXC_*4DR zNNyP_9SfFNO3Jm&=0yTkY!|n~*Up|yF~4%~9i0+Xv1sevG2oxb^d`*ComXMX&Cuq9 zd?Ff#<@A0pxjD+{yhakNF5D+&m11o>ah)B`-=tP~xwh0yd$?0|2Q;P=gP%1@zaMHC zztQd{3#k=^7fcMZ>ebNDnIW>Qv19%yXp( zzYBjY9qdDbv!jfDc2xHN3|dBQ--b{Bif-X0P(>>0ZPKT@ZsxS}d)~Y3*?RFr0?p}a z`RX`{zh1JLa0aBF?6STW_-%_we7njpd;WSk{d`CJDmj_lU>@8?82DA0`k5}pv4h-= zoTOWyS;?_ExEcQZVj4?rMS50clvJTzWs1k1^se!Kb!x@K z-tGe`EL9NHwjZD9zCS-s+t3ASFZq*FBT7z7_Qd$2eg3F5+;OUTpFvb~0X<}trgtqD z=J^)Pw`$$zQ6M&|!XY9hA< z7rfl%-ZEnst3Uq)h6o5;)-OV@0%Nil?@JT2IBh z%^a-j&F+rRQnhAKaQ9YDY0vd!E)BOqzpw|*{}4Q+GdSP;hqx2U&}*ZlO9JY?!w>7DatbWD&_W( zXYxl8khOFu;n^>6ZUAnvShOpbJBH!VU?-k7id*vT4fVfhHGFDK(y0kz^6H)5k*f!t zlhUl&ZBw4d1nxZqZc2Yrm5AUC*VcsGlG^v+IcT4X8Ujf;F=e-SJhVm?(bF z#n0uSOQWfz`!O$NO=q0KnyMI5nwn;ig?1lViDh-hw0(Dz-`|;!463TDHBMiATKO+&#aR*`ukRi5dGTF zt`ssxz(y?B?D@mvsda4j-l@Nq(7WF01$Jy5YvSo0=vhtt)s>T*L!N;%ZJ`AoHlXsm zXD30Dr-hHD#zfbXc#GgSmzlyihMhp^b_jg^w0Xe|X6vr6jdk{`IxB%mjwJ(&MutZV z$2gp)~+c z3L5cx^4w`^Dzkmz{WK?}N$owi#H;XXn@u6tYs6x%GK}ucjt~1%pn2QTID+Ds_U7-K z;&Ls3!By8|xL~%epJoCVu1w>LKj^$@y?_%eoVUoTrF{~JV z{*PxcK|me+3NXs-Xvd4W5d(EqOkrN5wSEHh^EMnnxRzKst_KNf{E-F*#Ff*P{t zud}0D?GZd0fY5|HR03xrgMmFE4gbX*2JM5m1hq74`RjD;G0(uFufI>fYT6)wr%?Rc z;GBOkv@ByPhNc*PA0P6_ks-mb=RZ@fisaT?`tB9GjMj=|NVSsum&8S(0l}lm1TiU4eq)nQtKMp_6JuV(qq#2%8cRl(- z?KKMSn2b+l2LG-CZ3a~vPkn&EMTY+^7GWf$p&y!ratG=7a3zj`Yk*+JubOLIZ^!U= zk-w#ykEPNfeWJ$SWJd}se-atJ$eqqe$EauMIKuP7$!wAzh>6^wVBv zbCi>loY=o%Q`(7nxp=3M$D*rnQ`m_hGbnK2Oo$kks~o>g`9Z>#54|H8cbC-8IVZ7G z?*N$|wBS9~M11kY0Jpxu02eaDykhgmHP}0tKBRMD^>={(v>Qj*?X9la{m2#$%`0y4YIJb}i}s5YM10rxy3 z?fS!GqG9NI(@U=K7(89?6>%r?f_=(jMyR|BL!kMh2@v{J>kc)at*}{!6{n8-+PUX9 zVF|vNht`?hw9}|{`|GzU_?pWvkMCnPT+Vq;nU&B92l|&AXYB;XMLG_4fGrx6z2K=h zJ!G!rcCl>>AD> z>ABsZ-k`I4(RtUS@U3$yMP^|eA)&LqNR0 z!crW`HbN2OtD%U+to9h$vC7QJCO9{^auO19Mx~p@EpZ_{#wI_8rY{xC+T_r2>OYE4 zqXP$GtMnblVb*EYf3!IM!f2(6BMGjcaxmTfsMy1#YpCyx2%$>gs!7M1&XtZN>l)8< zFK4`a{15^#PgF<31!RyLGKTK`$w(N(89I?X5~no5lq{M%i$oD2EQ_A;dK4rf*{tfJ zi1_>}!-KU7fD(}B1Lk^_*e=4`#Be&EKi zgav@Iyr)H7Vq@@m@iMdN@m!i4_N&(-Teqg>tvuTGWBz2ysxdI*pP2GY&sHm3JTXfM z(ZeHe;hRI_LJj^jaOZ^pHbS zo==)Rsq9O7K3|N}T(YzOCCTgGNKM?#?Ck&NGAq;n*s7D8mE+%&ytr8Z<9-$_|E*Q$ zKT&344$gnF(z*X5$xBL2R7_o)R@l+Pz*@n;(b3NBf2ua%`X|Rs^ZyXe*!~mSi|ap& z4Op4}uURJx3)lbOK=>ckakBom7&|x1f9S!^#`*8D|3^Is*Z=Ot!TKL+|J&#I_x=8> zVEdPe=fBPf?EiQ-|H?W4Y1qm9ulUdP{~Wr1!~P9tW#<03`~KDA|85Dw@?Wc1{y!LW z|Ltt}&tilBJ!}6Rm+pU$?*E(Efb)MUHehA?ube$unf{ZrCo41C|3qz2)d}ydy12^a zJ=ONk;bb;;Ax)Vfht3ipgw-#^rm?DO3?v_wiWkR1gNV#4>x2HLtb86QJ5(Hrh)(=V zsJgsZ8-P%))1+2D)Fk0SUyNXU^!3}xOk@VsQ+s{=el*4Z-1g3WyqbIeJBmp}O0qg! zbg4?5HO(8i?23c$fk<+Z)AVt7!Y>PI#NQExi}*ZdXfvK&7y%vA1sh|K?8c?(wmV)? zp+d33;e?^JpWJkEvzmQP(_ev!q=5)?nC%Ji?HT8QqULB91&JO}3_xWrh6kM$#sD)< zMm;{OBd1Sa!EgEFFnzDcQKmJT{nzu?p`Si=L|xWL1>8iQj5*NnVW*(Pp>YNP=hy(6 z_QU|FK{jvdTC#l0Hh}1%K>%DnO7GR+i^5OQgBSrdRdU+I?9*9^u}k9G>+z!1Ue_k4PD+MKxN zg0xxM7r2ck1o}7l0wB7JSBb}BE8Vmou!F|37ZUF z*0@4oKL5rw>!y?_2^(VSXNFyfpcyFgt)IZHQ2qqNyYvsD)=jE<>m5lW=H_&<`|mb# zCwxn#;F@5b8*{d`I9_Rp906FL07&=moR~RxnkDoNs5Oy!n3-W$l3or3gwm10rx~*u zpQEtXn&66?!LE6mb`?mW3zj)_bQ9J4brDWrx~3G8Qv3*oSd~#+KRZ znQePGjoo^8gi}$hB%q^g0+Jm**tj(t(c8O#``ZXtfEz|O{tn@O?yh3^>!~OX?5`qB zet$xdo<5jHw#c;I^INZ%YvUgo!i2=Rjy*fMdtc;}!RkOLIuBY;m`}WpTVg&!VEFN_ znmc_rq+S2}t?&m0ca$6{;+We8UrmTtgdkpO#0Luq#vsN%>czy<(i8X=cj{+W!D=<* zo)@;L^xiScm~Y}W1O5O`mz$?p@6UeWPZ1e)W9-dNx4frwTj-AHi_kKlgR-Z1tMTIX z!RQ@GtSN?0DPDw~imfG6L*7G-nh05kPre;b#4V^XLD9-n6JWK6C0f1Yh-a`m^cjPC z3;Tlf;M8OvcT-mw6OU!Mbor z1uwP{m6Mqz)z|5Y9mQk)N!XBH8}mBgqH@4JKDcW|uq991JF-u6qHXhP<+!51BD?x| zh3$r(id1_S;>`^FOZAfQfdoPTrF{TC0R7Ip^1H0c-vJR;gDAItMFDdeb6ggk$%(dU zuCmvolS0`&;vF;hrP58J8EmM_Gwkgt$4_egA6c=G-#V_2QBx(JVoN%mo@TYk(#xFK&+?VYF29UVJ;tr!7Nwj0Bx z5t1x1*bNkWK26oiIUBY?rMX8W?6<3SF`{=MZHuqeC;O4nuc|u8AD*+XeZy`J0H?0W ziRT0(i0e}f(oGMpyhYW8aWF$L z{U(MX>0v;s``5?8pmns}+`uIY2lyi>#&)#Q*7u?7QP>j%XMc^^k&OnWcgO>7TQ)zj zbpK;;SlytdywnNHMwRrxU+};{E6T{Ufyf(KENOI9num&m4Mg)tk|UJGl9o5l z;#Sa2jJjm1-iOhWH$8J{j@V7@!>%2O;O`_be2hpo3T_})!lOaE637h4WyNE;hHyy>3f>H6kT}jCnE7kBi+pUKT}H_tYCRpjlPcsT zD7??AXo^rDd1S&MZZsQpqLJutDg$qIav*J{6=Rk&%VcctsN|z(Bmd|RQu};Ur=)pH zPD>eF%T$jmOf0EJ#46e zz=u=%Gn;tTU#2Ohy$k-YbhxcE@Wgx3I+PhS$d_rq8ebv(8Dy@te>>|C`NEL$i^i zYTyh~8GN;!D26)LC0s}qe}?D}HokV>xdlyS9V4zKHYZKv4nTEoouk=IB#ffqe2Zhp z=^tL#j)4ql=R!`V(qsIfl|xKi_WV*a=4#~&UE=WOld2yJ#+FEHY~ff=F!_%SFnuOB zR{i!G>(;%a9~>s;_nuBn{0i507<;C4?I0lB58|cA$x}&F)3|Vldti8AvVx}+^3?H8 zvsgiOL11Dy8>T&i3t!UZ@?*8`mat(xg()V-jE_0~!{tOtpW4i)xHx8Ci?im5;fjS7 zf#Bj+TtUbQ|5m5e`oZViKKLKRz#_7Ql2Ai6$dyfeY|!OM~zbh3tN+mJUNI)~^F zx)5F6oM%8X+ogO_KD*H2hJf09dn7ZQMLW-0p1v4u)W?s?tbgGVld2V3~&QNuGA+3!w9j6QeB1%KVtOdhcGnr?Uay$qM z#1y6)AsDT!gcULn?1hHe17Z405K}6B1h*Y;I9(D?!i_Ue!hbSJ3F!oQK;t-+-<$WO zAkj9JlD=Eqm z|GDZsANfJ8{K`o0sGh-Hk*pJ<)SlX5aS64m7L7vlPA*!o?H#qSw5!$AWEH0#N}*_^ zC)}?$)=uz3z@g6Klb^9OnL$oc(d!FemXYd^Qdt#)tVP5sPhi4erMWPyEec@2;#=U(G1?A-n>$wv#|d85I1Emy(W@5Scry>UW!x^$jsAFo$Zc{W{-hWH4l9x|>$ zhIv^CPTc`g1s;}H3ZERA5b^@RuwKw3g<2kM)kB2*cy{G3eb#AsV1JLg^-A`Z)t_9VoWC5KPPl1mUBRN28 z6doK*VJ{pHbhIL79_IVaA}Fa=*a7n(Nk22uUeMVfMYK_Gm3GN<9b!nokSppyD`f71 zcOhdd`eDk|lVSGAmntI+bXi?o>+t*XJ#sbcCYJ6+3!}Ue);-!M*djk2^|lu88uQ|o zYYl6&!QV|Ky9lWa@D7k@V?=vJw|~a$%-Qz%&ezt*w`Q{Du1WhKTU5jRtn5vW?$HXf zU&>KZ3KL=%JAeU~`TI4{4L(~4dwx#(RAuofVSKoSEXTx1Azhbrap!659tQfI^ug`HxxL= zJ{tJc<9~cpK&w-@!K10{l35RCN`WTG5RD!He_3;64wk?cAwbHX8CQ=lpbf(a&5dW! z3~f*!eH8Npm+T9p5>Z-@!n=_lHH}S$dXVi0^~KVY;eAS9$jpI+%f*x@C?Zt|ZVZsQ zXMLB}lde7+&m2K#tQy}1IPYR`8f}n;#?c$A!Fp1QDTYjN!Q&)vD=7(0V~OG0mk5=zGoBDLYVs(5g3R+zNy)Y0?()vEKN~mVD%#EE@hsYE zGtvL?Q(DNB#UDmDc}bFl*!h6%^MvBgX7XL0Ea_8Kk!{rDr(f`F{g~q>HDZuh?!HWd>L5!G)BRSNZ2#PpYVebWT+%^7re+>%$inxxy zrW+UY?4k*%CBKEbdLJ-qi78G=Xnb0u7h?>gC09enw<;^6MAGfkA%8)v5ld0#ZXi=z zU&-sTa#)fcVpv@W><2FxPHp-z0v@DPljjbo@>fuQ*o+i)_53& z4l8iiy{a#zX!EyR&1Kq7fX#0ODrc^hN3VEr&+Tle`uo`8Me?@2Zt2+RX}i2Qa|q{N z_Ee3Q#-c4AhH{-^=`Jpa^=@fOhpgU@ssZ+z%+B;ECj&>t=a_^14t<{{e!VcWkH~eO zyG~#+5%_R-hZjlwmfQ(2_lBHh27SDKx|i=GVuE(YO;zfFDqX|b2xkOM#?dH4b4O~F zn(-$nV0aJ59cCBTpaB~Qi$HraijI>$T%H;_E7>ueK2ipgw*;4hEv+$!h1wdjDo?s6 zM$IvES(7_Lo>0SO0D)7Hrufc~C{MBC?I>J20s1Pl?_+sk)p8cJOpe09Yz->jlVk?_iMiQm{r zp)pGscQUP*gN5hVI~$rVEu7<;e%#3 z$KDjDy(K#HcOdw@7gbntcrgz3N~%(r-iW|+7?^s{J(@RZ2M3oYW+gx9O}iLIDIH6{ ze}AI8f!wziY4XHqvc=3!g`lmR03A`>@fEM?j@YmP0s7y0C&@}E5#`+xaLlIW*CzbV zzSuygO77X5?y#lhk-hiC^CrrP&i*FKX}z&w%bE(N%HkB8h^25Nvql~d*nmS9#*Jc3 zxIkTEM?+XGLu#p|oA?yH8(sCM6Yj{j$%SKviwv+%2Z3UZ08zFhkpq zMUt`iZ|#%aM4cKK<93@(r?hN|I1J@`34y$! zTOISgRRj3FzM*R3Nb`f`5TRwEXW{9TY?OuHi)z5hV(!T7!pPIzQ|snc74)Xn{vdP{ z78lPI_>l+%I|LgPYr^$ZxJbDS^<&wAhYf@o68eqxYny2v6E8_6*+2 zuYBOiR*@j=l0j8F0*K*+i8Uc+tC=#EqKlTmdRp&dBI3+s z&+17w962n-27XVrgA5NbPN9{4tgZGfuh!kCIV%PdkcUQ9*pOAQ!4!12gX9bcp5y1} z?HIDW#^hUoGjCbQryVyqm9W{ImV=Kya$nGl?PbmMV6LR^wns z7FZf#*?%6sR-X)i#GLr<;#_GA6V`0HPjZE$9DlKHAKD*x+}*b!)NiPvMPS9UmAEsG zW}*M4qMPVh^ND)*wN2UwjbeRpt?qd)?+WWYh@e1Qz z{T})Wmz%Ua`*oU3Ilbszr>*7c&1LQH1kk0K-sv;ZN@!U3orW&=!C|JxmFL;@Jiw>> zs9q5s=VmivduJT}D&00yL9Uk_V z!>4@$f+{h84uQcKrlNmTMmZyn;Fl!!Ept64%>?I{)!w^X?2GRx8n90>f)TM)0d3PC zB&wke*;Yp$^@sSLg%Jia9}JECJD2d`AYbnC@vVbl`aQs)1v1hfpSoXQQ7t%+2qOaF zrFxiJrqDN+$Xk~Y93cjvW_J0(k~a?ABg)NiwV6L0AJ%ml0cFjtJKV(rk+B8dwq!@F z<$EYDCdUQ8_8tO!6ien6C#$x2?0au&b6!5SzeCTQNeXk!IJhHk+8joR1klN%@42rf zRH)>UXcasp*tJ^~OK*56vs->+H@^A%1sl2;rfZ(0)I2Z2nkpY7;K_CSQ-NTHNIP32 zS&!&YRsobK``bIMLwTixee=b7ZAIqQ9I9gUiQnci`!ngK~sCkmH%=4_&WxLt^YyO)gCkg-v(j z4K%$#c-bhD)2W?9tF$nACY(|RL6V8YhLJ*^u=ZE(Z(uC+c)E=CkzB;WHawF>R7RtG z6YdJJHXB~RNu#R!iQnum?)4pgwyW_yTFad><|%WIRP2xV60jFG{(RW1qn}T}EVJFA+h{X2X$+Y~qxbzK_;}r5CPC^){ib22&v4I#7?~`gJu#vC{uZ2Lh z!GD7y5Dw%;faN4rsOv&nLk+P0@=iL>wR8G(nqaX(40@a{{P2?R!Y1qtCaC@;QIx5j z%Hdq_Reje?@pqy{m)1VimKSID| zY~da7Q&~n$jbV|81<0Bk0p2K*DW8B;rv}Y$`1)h2QFS4xkZ_!JYW`xEzZH|2bKP{H z*2(90?UOtsI8KAc2rJzorpja7Wp=k)ID3YSz6XKyCd%-rDR+8 zE9=wU>DPEg{&>w{w;;}iyHVc=X4)?+IE)|i`;BV7-FU%b-BEwzs6UAy;&g~`9HbHZ~8r0_)8ws>@ll)I3kjGMsa1A3%+!~Up}e9TSGGA zv~bVPU{E7Hl^4V<@{ks0gf!yG7W|8530Gj!zi7rxgEqj948bObn9`#bQs3|MD0#gl z-C{2m^cs6&HGRRv=65SnUY+5e(on$ z3VM*7v|r92_L#{caSx?FLGVJ56K&WE`qFUy|6LTj_sgsE@108pjc| z;$?e1Rb7^Ov`9|y`%##njqBje2Ttd)dkOC#G6FYdG=9>NRk9D^L#!B~mDq4=LqAL< ziw13`FHpb9u8`w2*N6^Mdr4~^rJY+nY>R4~9iJWZvbz3PReQ`1-|D+ZPt*f6rq1+a68^7LA${uYXy zqM+p99Zfzi6ls{D@#i7YacwUPM4G#;R}}^O5%U@X7Ut=SQrasUY|G?DzvIhl=WxkB zp%sigy8TmOS5|8JHyExrD*p9zx*}JFe3;Xr90Ya-Q8TZqCmY_1r0XFZ)sjzraySyv|t?}ARu#?`Jx>)Z3prFJ;{$vbCn=qaB3f`MzkcidV{RCEKVjKVw|CpYCAP zI}YLviv4QynKznwR5^`M4b)fB>i^1-j{1ub z+HYlx%-MnQ2%LQBm!+A(a!{><@wFAzy#JrY4;TNMC5-CkX*R@<$+%#*c*u}hyrtH7 z3@`aw&I{BqkFA5QOd#UD;;S34zKgxDAF*7)YpPY1S=Baz{Pz+XKzfoME8qMFE5uI` zK(O7d9jR%Z|NaJaW}*fzbWoNy9wxHNlxO0}H_l7%h&7_dFAAP2F)zJ>aB9Ons)fwB z`|M)OC_~0uwCDpq`SnG)!-MCOc?s~o&4=`|vdmIjw0q8TdDWjWx=m0U@@$B;1CZN; zWH}a!*S@bpp4X|{`ybC=fdjNX?fa;w&trJ*Xuc;Y54E5-Y0vwb?R|?Lg)d$ou;slQ zg{sXI(8Lq#t8JbgB=ihQrDLpBep)n(qz5A#9nKKYo4KZN}w#DfVssrNg^6mtIASBZM7n?*2LIii_BLN+~YR;P3SzK6gAd zo3^$3VDt9)z~lWG)gzZJxHJ4P*{>hwHFYJfJt1P!V#OkUeD5 z#L%7#RJSs1nYzH5`tmUIE%za;;cU?H+~NWFx9)e2ddxmPFr4)l4jAA|IP}KGX}3wZ8Vmawu0AC!GE!fK9){9NAKPng9l@w^88&_{_}6b{Yv`# z!vx?%Ft|n8FVQSza?kX3ymj0|Kwo`?f=sl{srddr41hw5qs)YK`YER zTid4KCeDGBaT3x(31?Pa0jvx0!6qO1vz)!gtbv;Hqx@P4QC9}CZ z7q7AgtIN7Tb#PP(n_R%%t1GdcvYRzPj{l6~gZOuki{S-|hW{enLl{_`*E_;oo@U>c zM6KD7g^9ST;j${ba)!s~fSsv?ImQS#o;d0xHh7z8$VG_&z1vL^mAH9H9MSGw#u)X% zEN`{3yaG=b>95-_jg|!R6<7 z1;sWev8yZi$qp)IeK?eK6IdUWLR8kchA43h#Sm2an;g{ny&pDc@yszP^Kdp8k77Cs z%FI$eiay}w->t9&`5iVMNKR!( zrh5+7uKjLT;;e$Zrm7X2_!IGi1=H6&7c((XyHY{Nlpoz5tJQ$tUDhi%vWB3Hh_{g= zI?&|Bt6jD0hU5Af;>gkh9UajhtJm+asd}Ike!_X8hXH*K6vqY=xFWE2{CZX6;vl+p zoF++(96({ZszW-YJ77w}w7ZdwlK7y?`9!^zzRL&aM5#_0 zrBr}Zi$UFpLAWMXB0HQad%9LJ4BF^?Y5%M7{2guujP2+^oJiBM+=)g|%~$WpCmGZG zm+a!5=mFY?$DQLbMt_=uwB+ETu)aCqyB+n|szuR=0vR2f2&`E(oD-XhGEwZ?@T*jV zT}18T$ZPamS>)nxtul!Q$lhitRi}l5r*N^9X&%5o5-+iW%)f=EYt#vFvG?YzDag7j z9N_aF@X7t`HC6PzqyW0`-MuVeMz+B16w%yBS|^L+Is5e`)>F;~Ncru+sKsEP*7jnI zfbqKh<$LOF2xt2Wn~AuiO&>S9j2(X_WIxYUR5Qis|hg$w-gM0BW2Cm7QSRJYU~?HrTLV?OXX z1B~$i%XZ6p+LrJjq4-cgX7KGyV~*Vd%sjc`_5xf;Fk($?zXK% z#duYMr?sdgE;Un5_SX}Us|qn~G#kO8$E5!mdO79$oTJhxCK_{m6?%WP{@=h}duNPh z73aXrK#N3v*x+*q9wf-Dl3hnHKHLW!W;TWAGF&YAJ!RE6sz}Te`4F;Dv_%&N4sT5Q?);&h7I#F?-|mdi=T5TVu^LY!emEH*wiANZi^!v2r=t$z^zqGn z1HilKE3*RBL;-st#>A(`v@D0lp8Q(Hg#ZJhgy2c()hJcsfAH}s{x0>QyGsri(^3&r zM&lM=JbjT#jci1nl1v_b=jrJ#33{ysis&g>v zb4`Qk;Lh0aG%C1EJ$=NKbXbD@Z23wPFnAscX=iy=F{qZh8e zZl{YK$=6g-bM>+V&|ilNX`~{LnSj;|!NY6%&<)RSo^cs!GQ8$Af1M-qA`y>$ZgI6) zY@b%JcE(CKrV~ZhkM6=$DpPER)?_cvdVZ#ywiX>Gg3Sw)R6$LXF)%_i`jfKXC6e-u zA~;0-;GU_aFlJH_oSs0L{8@q#xXQ8G$09zRmprPHgaugK-w3dK+YY?*vUuI#_pxt% zt7*9NTA$inG=Fv{CJz5D_64?6M6hq4Gbd7tCCRq@%zK&&McQa*>f`E*wlWN#l@6+{ z9R15Sq?eV)`-b7yE@-p&lpK_bQ^GJ|{ibcv4E(5o*O^B32O~P>G)PvpG5+Kn-?#e( zF;4nhGQyqd9|vVQcg<87!sW0y`4N1gA|i9xX=;Q7+77lN6XGf~3?Ma@M?Jf$V?ghv z|BRBTt~*_Z?ues3<=u~~ac@)Gq2R`Lg&(x1Ctwr?FQ`TD~ocZ1zR*MZU!G z#Z!qD?zxN(#zYCbE!R(8X9og~R-&$I0i3&H)jS!&$NKFl$nl_PE7-7T-JV&CN2PaJ+&G(HR&q{kynA^JrOEOj!wc zHTzaDwUM23Pa7=b|I|*~b4T@@Ch? zu|vr&y$|DVuiMt{@nR%s+Ovt}BV?Q;r`-a0!l)aHN)=w2de2)}PB!EClfnw*{-%n@ z=`jB_@Jj3ewb9FIk#iC&hIdaAj%A|@ofQa5IVoUt~w4K6I0Cc zo0(V&x-AVlj30jS^8bn93}e@D^TYXNd2LHQ<(=+rQ}`(-m3*t= zV=}Pz!mPnb8zfbOV5|x&_Y<`Ei>n4;SQ>I{fAA&Fw~M<#!XLKQKrDxJ{z0nhEn!N? z>bp(vP?^^UckOD=LXR@5j>YDgxX5U5e11;;dw5RxyQy5`2lx$`Ywva2vzvHobY6!a z@DLML?MNz0bq~%vwLxp6_>|8(`rUPaGs27mi@O%!D2r$~qPdbAozEuR%vLaY^qC8y zq+z~1U&%R2U{MN>DN$kAz+5jpg#zj=(n1nLB!2h`fIKJ}W^k}Bt~(A6hb0;PB_5AP zvTQDr^t)j(_|B@gMr>$IJR^9VW=6JE6AX*UVO~j1u^5_;l*ZZyOMB^rG=2#GEgm>P zW?AkTx7~7u#-D&bemBNyIp<>oKv?q8eOH;;`rd4>b=6^Un&b020^Pck`8rM5_pI)X znYg${07u_-*J{`M2tUtE0%n%G{H*NOaNj2BMq;~wGl-Z!rG?e*C#^{CMlMQ6+!)L` zL1PCfYP`bV(U}(OpXSMR@4fvXdHTA?t7l;F?Z;Oaw%MLmhbnY5lMBd*_NOKCz ztA-??qxRFPQsAu>jm?cJBn)xH;V~CtPO}eYnK~*v+1KhRg^@zj*F=|;vP4J8B2LP9 zKKWadL?M%T$T{G!n@{zeZgv~?bF;H-DK$58|31U`>Dzp8f)QKwd=P>b%Nx~xzc>9Y zW{)K7rJCL6_9WEqypRJI+OY}ji3Y`%X-w8ONCk#;7zCv0u9!gRX^pH?WISks@Ah(CS>x5f(XoYDTwe$aZr3U(f+rDp3 z!tOHN1y@{E&@$O4S{8@wJ}PB({EI8HVpT}{sFG2Nw6dsxEwtR6URngZ#QIYt177_r zazy#2B4aZ4hPPYP3WSTjRIHVZ5-u_`NRrj5mBpCZyKx*~y}&+d=yJ6|jlo!piSKK?e+1nF||FoZa5|e3abMzh;wFD#6?!Ktx7V%NV#f43ToT2g}tyU@mlMr%A6dJ;rZr#HHw7}px^B-gT)`D zns~M7dpn`L`M4>${JcD69s_ldFl{gFO*B>b4*oC1&OdI4 zab>5Vb2zwpb6#-V3cyshhgBO(;5H>`FL?EEFEEl{^?iy}PpYHHn*BF#n@~3?=ag-7 zT(sZRatigT8qR>r=_ZG%HdX7|lt?r<%cb>>L2L!)Zn+X7iNArVrWlha^V%z#&ju^0 zB3mOp)PQGiLtU7aOt-u|bl4%V@v|aM6&hdm zu7~fHwbkvL9D*N`PemotJF#(%22>dF>>(i z=|WtXr#_>7UGjdy&L(zGliAH*3puM(iOemzVPtMVdpFL~M>gsGp z-?#1;eWz1uDjI{MDAagmxrcVW<)>e!=%kz{HqjdM~8dGe0~!*ew0-laiD z&hWS0E7CvcMZ$$tqDDXz6)TjHqb`jLL5wum$F=zCYas4j5-G1tZ=0T|*hf^mb%HzA zd}OgBo+%3XDdM3>3;Kwlj)uRi`*;ILL z6xi-VI1zAeX__HG*+)$Z8Nk;sBWs#7dmEZ84eV;nbe}%*45B1RB5BJUSnd(>R4$C= zUbISBBh^^y}{_9nd3 zzEd2wtEg;qij&o+qP!PeIX(EsY}>3d1|8%jo-3~n#bcW zDwpS)uU|K93z~B^M;UIZJOvMp*S9O9e2#DS!2@6NRmNa>!~x0nEqviG?}5O z7f@n}cPS72SqTr%-9_EeR%--_jU(!|M>L7!NF^pFSU7{Zbe&~ahVk+#U6CsUZ?ie= z`Ps$St6a)7(3zAWdWGexVt{mj7~uB&!#es`)GCK>8h_R67;M5bnYAsO2`I*_sB}Rh7+7s z^Dv=+>s|)$9F+JBbv(i!X`c`=!h5H@#7W2}|gFVkpz zx$L8Mc~^#5W6Zc1>>gn2hVZGIpA_}hOj%8DjAldYTn;)mmQ^^_l`B_s4X$4s`$>6H zbt`1%(6D2~pGh^jz}i^oNqr$!k*i+!x;bFA^>i@LZ8SfveG~am-Z-ttn?~R535<#? zz1V2!?2O`ZI*#gh<=^zCU#T}7ZhN^rdM7dicq8BK4lbz^_@nU}N3IyWXTJ;pg1AAb z?o^Jre)_5zPkguf+ww$c+l38FJNNDVpn-yEd8E(_3OELC>OO0_Xbml##+D`mD=8!C zJd8$aa}?&k%wL#iALb;=N{y)PMwn=!ILt>Zh`u(`eoQ)Hn!5fZ;0>g8oHLk5h*#h- z3;WO5b_7R6qPlSm1S9^bP7nKvMabFjkz33f+YlaH4gDQE%>=ZCsC#< zP>jj8k+GJ=qEE+{hRNKJ?Rsg{u)=i0yqrJ`PAXg|^z8T_4>*|wq&t>+p+Q6jiA-1n z;yvT-T(%{%O2Yyih}k95ige5LCMHoqWvM3>`~y;SpK&%57;b$AqCOYpph$_+!ysT(ak zZ><+^A8iC!`g_&vTfg@%H@yOP>}@>w^q@GL3L(7eoilA8Sf?4p(!GqDXeHqbz3jHfz|ZJW~i8 zE=-gNc-h9vRQPL4{+KE|9dBzHJfX#o!1SFI1%{jO75 zuJ-*Hx!Szv4?Z>IDYb5(@t>&xNkF#0HgeNgx|;kxuOUG1*kZYL$M@|EwDrB0$L{Bg zOuH^Q2RB&{K37_zHS}fJWd}c2?_4i(nzwj;&X`mJ*PAwzP_8H_5#_EI>iyz{>dF0y)WLA` zD&$+n{^xE~g3pJp3q&|3&W7_AoSE6xvORv#B=Fb|Sv1%?XK5UI@@x zF@Nf_9@}YJwlo>;PSlh1ZGAeo@?E+ycb#pdPT{S$dB%t>K16dL!(K;`%A9BCaag;~ zU;p*?;`_47ec5dq3%3O|=8kc-D^#l`T*0%v?+{gc5PF05-2QsdRn}%KqKX(R#rT=r zD4G#kG5IE%DJ8Oy;EZ^<=A+Yh%jo(|zulu8Hy*BV{tSL?7|S#Lx6wMu;~Q|8-?}7* zu9*43{E!ro8!iAkwZf-)=4(!xYHNa9j;WN$qqFt613pJ%={kW{%uw3LwE9x{<{YQC z$$yHnvC*IVj9!F}08`gpjzZtFwmLHCA23l=r<6jHr73fix+L3W+Uxh>rkRs#?L&4^ zpkLp_RC*4v28@}AO<7eT=MRo2oSZw@baHKJ;;<+X7NA!ly!~f&S9L)}<+fzrpHifi zGMiS48-LQr>gdjCI;Q^4^D%qwPIi6t)%KS3tvb8D$u91tzE3`+ncKzt{1cpvGjILj zOXHF}Q3|A_qX3_boC6kV>9~o5&Vlgk9FOj4Dq#U}*RDPpt{E)br_oPlP_57?P$Fh^ z3~d}w5^?m1n*^l&sbJjh0$*uPY}}6zzGwRw>;`UM8K5<`+i`dIXmaCR*e@Ec+j+bf zKa=t&kY7Leu^`BM{!&AqkGCWIOtZkRAnmSDn^=Sg?WvaOQx|5<4}OvLbDJ zuxtic`hfXHp&6)CS5y=+bh22fKp+2OPoO-fc0DOM<(|a38S>OOr3(&WQo}5MW(0pK zvsSmcfX-*BGIJz{wQM&ge5s3NavtBWYj z=UP73`?PrKp9pA&+TIfS19x!u_2NBZwB?*ui+2_%dRH_D^9jJmBBAA=SEq|=$ zxhJtwXH2ka!KgahvNT~nB?%4{`K>GvOQZrL+qwh38L4|4QyklYpy!#ZvRFwnsfyP9|Z`&qP0wXD?g!>OJMdV)*=FP++SWaja*TaxLC#ped)4OJy5nGc3x4h-#KHvM^czq(aGLaU{ z3I}{ZZokWO4QJlRo*YUEUq*w}wf#CM@=1srNSinpFeieZ;t13{lwsZqw3Ru_@D$z1 zO1Y8<7UQEOD`_w%zf7vXrax1_BfwJ|1(XJVGQWB}oPs_2oI*Ae2lTOpNuwCbL>{#G zJezZdf(%z18c*DLCa*6tY{^~Bz}=&vIx*n?t~77mKB97|d$+8vWVNK78cpcC7WV+N zHm$+ZV*9nd(etnxQZy#l?S(6$$Uv!2E^Oo$oS*8QE0cR0%eZLb8>R{=MT1|s{D7&d z3K`$3olg^CSfC}3=E~KrGlb}HO_3y7*N!CBw*9Y(CL*F!mjO((Rw^V*3TTn$GCX)w zZ>r&I&HX@#2fn5n+Do;_0(p*mzA|k}mBcbxUYKa*(rwBjiJS`HFksxvy{7>}C%l%F z`T%1h`9!lTrE14E<=6OWa_Efr1pZ0mk-|OMU00KiH~yRK+vn~|pTPH;909RKN%I&S z0lsFu*=eX~k(3J9lr=SKu=)j1j}FXvzKqy{d`lLM1vVq45?JDm#a!EOze0|pnZVY%Qd|4Czlm#>cCo;KQFmV8M z1|K@_<64wa1jul^ha&ntsZP5tkH7W0HG}( zKYQ$=46X8a|Fb3r##5`VLB7$E#wsWH_JR)Yg2oL4l+S)1#c@9kUn(L8#bGjGBV~_J zgw5K6I}p%x4|FWq6ipDgvEGQbd~UnnK-|`nRwUb~-dL-&7tXIazH+Yu z&j}xM&%rNcZrb7I)~0b&l1fczk7=4_#oSVD28%oU8)IZrj@phR_zT$p@ht!Qw%K_1 z>59^X39#Rl`h1!G-2@7Y+QpUwtl_zNvaUKOng^PfiaJy%3*xf|Bp_wA(liIHWDZRe zxmpI4`Qa9@ZNiqWEF!;|1Sk;|lPeYF`2&cr{FbGD>-w!(R+B2(F-LYf33$ocwyr{P zT>(U#VABqRJFJMIh_-S<$=&wcUp(BPQEA%USB~fKKUL=78gsr4z?u-WCQfB5b&pCz z&dW(P;bhJF=Qb@IsbkQq))qc@88;M1IqwYDoN7CL8!(n)hF%96j^NcTC3aphPS>{s zY2ah{G9;nk_p@q0rmOWgL8g{}yw!OuG@YwZk` zpNlHTCSWm#_SNtP;iU(jm-RBAe8Mqt@1a?8Rn|KH!3KEUb_w^{M?prH!CO=voJ-jU z=ASDr@cng?xG7euL%#R~_?&}ubFz(G&hNd8%o29iytQz9mGkm?#-|3Fk!76_Lw&)v zyg+b`0djY4NGQWm;~QROO)$0?ttGuJBkEHrrv12nDpwD8Fu@~8_A$6riuRgR@+7F? zHhOGvdO?u8cPIP-gbdZOi~HGe=?UOZ_uLh3uv{94l>Wsbi1mgthJ*IOS{ZqhrHCIyl$0qrQ>D+*e;;n}KuE9mO}cYuur?QRxVsyO=#YV*Z9q zI7@7tS;!QhpsISL)xt6P1)@j7a;}8yV)(KA(PBCg`R#EPH>MSc((anfkK@b8ue5QY z#EidAXV%96V8*A|H)h6HP7dSGJ!Vit=k%-zEUQ~VmMxVa=jO-`Sz(^f&;w* z8#chNc-%+SYA%u&C+GGwl9JJpypetlRWvnFL5%qNz@ zJdY9ZNs!^1xk>b>=O6Evd~`)8lVOu1rw@;eOo+fZer^*+L&$GHCE;rBlUtPI#i!n# zs6*RI+q`QX{VhVZ$Gs)DI?=1$$#Ou6ySJViA?C45FKzwcdsrU(~Q#XO96QHF_#8wT_y5?L_Ce`sM2O=63svXKsgx=d4$M^U_Q6@8Cy0(bnfeb~MT{g@q4` zvy;HgiiW3lc8dfyo5T__B%6#>A5sA&2_zF?3maWSLj+XKykDQFX_GoA&IYjgOkLF7 z%Bq;C%D4wBP8CgD@UWc4mCj3o(;I$aobQgFb(}>J<{c5XF{_)nsJJw*YRQ#$>ejFZ%RHvDl(aVvPj^Yz8GC9W5=obMF?&cw5r9(A zu{vqo$zaoNX7M|s+}*IJs4@9T*iU{y7_+anFY(zPKA@v?Sqtfmkx_0^;zDAs40zJ+ zVcJU6&xD1mC=~I?r7f%`WIx|OpFd~Byf*#DmoZT9H%+*|)yZRIBbC$fPsdSs|fLmDmsq{Ksin~Bx?)MQ|aO;S=)U9+k+r@XYT zs<}VKDEqOWjKZsuaG01{(h6mD;_AvO{qf`qdS*Syl)+ei-r}t{+PcX0y6x5DCy1y< z^`0I-R-q}GIy}cELs}zQW03X?xlMQPk^mY#L~#+fx%psT(%adw`O>|o)As<>m7Q+b z=PU0Xy&7S>&swb&JCnCUn(!LJX)(9(%eLq%5`FY|soS3(1S+E&$HfRIX%33VeH%fJ z86Gl|A1q0@3(1PQ8Z9-(A(48VN9&xstO^%rb9&pqQ;w6J3e(@6y*%RGkE={fBabK= zN09hMJ5^Zb7_W$)(q^pooDl2@%s+MbG3oPK7Y?YsK-i#-9ZUMA&WnTsWashwP{+iY zb7uf?z6iYzwDEe&sE>6Q*u2PZN*$snp%<|GW__O9db!B}aQt0fSm6A~JR!-Z<2IIf zDdg*SB6uxEH`un^>=Kye<2!}r{$t&Jhu#^;9U8kqhx1TgKQ~s`ErfQ&=i@#Z0W$jh z#IaMY`X1beY?g7Ss+4BN;MzSi7ObXAeSLe?(nXsE-pZHG_oSWt_0{#(o0D4tri|!E z>|UxmbSEqyTaU%ADX)G*>UWE4E3ys1lt$vO$YPUXq!tnYN{S5?%1YI`UxUJ7td zX(}?=Rr$PpQy$HwT_<&e`;b2Oqdx%4Qtp?IZrS}W&(1E_N;8^)A)d&$B;hRJelcBE zYCso@lQ!?qlr#551>)I>18P;5%`>=7@5A4;)Lbek*2nIK$XQm_sLse@BnNv0)G5J@ zacP5g$QtG7a()>5MB!9$gIXCHSX08zPWZGxI8Tl}Zf3t}My=k=f3YkuwIog#LKp2| zSDoZz{ZvEC$J)k+cGj+gguI3G^9rMq ziKmNZuZ3mL#amdkn;~iE_JnDD_l7dy5aUS}x*CVN8`6ID)5KGy@j#z)K`ASM0^B~D zt}>oAWe2C#&R)BaEW{^pRy1L*l!Zn^ejfpJ&5|p$A@vIIp)}e_4MB+X3hY04g}{dy z0Y~cfdoy}xJU_s0i2uq0h6u6Ox7LTAw?}BeANz*KFZTVN*xes&2H}qbJ@1e(AmbUP z0Ipnl4BYP)MPTyP8}HXk-uHKcqQ@ssidDUYchRjfDz`2TK}VC|xtl8e`rnGL)8o_# zMd%;K%g6CK$iHq~DZ%qp0y4nK{~)Kroha~3F7>b z`}(#dzGb5Oavvj02vYk-=87_>JY~K*C+F_emcPoq#!~r0;vr?p-7F;_hX;r*!#M!A zP3`H=IA2i)SurW`X?FL@2;deFp!{6&usEQOo;YeHZIfuk_n~A8LQ~ul_>`U-ofZUc zbP~>bP;G#eVV=iGaRQ&R18wO#QTYAyh%N$S1-}e=ZwbdiIeb_Xk_xVCxd?q3>b|BE z4`^F@_{-ebgo7g;j(zPh&Dpox0%i%KZ3Szt{(XsP_DG#MiBL~GoEqEETAoR)H0G%) zj-)vzP*$cpCQ(94uM8%6OIw&uaFw{F8Ja}|QZgyY){&LL2anUg5iN&l6*7${VWodD zi^!y;D_LL|9)ER=Q2U-rtElnAWKhsS$A4>PmpMNwxolRFAvmq<3{=J})R%Mti0?ChEp8S>i60AAB3|yH z3dIv~a)v;+0N4@q1B8;FEbSC}pM_OR*yv(_dt?xTT1i6(tjTv3md567-grjzD|Awoe?P5Igm?Si`IQjbw0=VJ!IudC@lB z1GS_1?1?%_dpd#_-0aorX_%V{*1lXj6YlMF^r^=GT%a`L}iA85ZM7i(9yaCbT{H?8$ zndcP-L`LdZV&ZHPl^a&YY(-ctc5(Y0b9nI(56+5!5v%$z=5LFIusKockppyfmFcS7 z3s82~rOV&jWqsARs_m9O#4qQUj;ZexdW7_9=o!@!O@;G`x8lqgu$?|t`{RzufAbMP zLw)T1lC9xQT#TVyIblj?4tfyJ`pRJ|9BwF+B(@Z!&f-v!TY#GtUi(YARDH9eIXvs+ zvy^%P`Z*$5idzAtw}Lb(#$b+1q2}XP=Q|NF_ zQdh9zuP9y=>(n31N`iG_sxUodq&P4mOVm?OLQ#)XuY@C?74Mlj#wcIMEbNV6bAV6n zp9y_f1N!ONQ?)B{soB-;=b3ic(QCtlLM<(oa}~*lRdU_RZ!L2ru)MVC7Dp>)icXj< zRD$FRM4ao_c6RG3>8hg6Dk8I!%jtBsI^7!SU`%z8%Q!8TANd}lap){-ymTdq5RiLHAIUW=aql#w9i@>34ckvN|^K)(T(N3 z-ryM)NHsoHZ~p+xy?LVAQn#q(I_82HGT6|~L-Cn`9hBewkgPT$qMlc;a`{~oxq3`J8Egi+{5JMuqHTSSlMi9yB_$-E#DV756puNO8 z!7d}7ewMqs*LS4m<&{(*X^iWqHCN+eYhLT=8)=#!;nT{aXWuQu-yvre237tC*zMo6 z&Oas-BQp!KqE_D}QwhIY%s_BZa9osIMVjk}eVl#x}I{u^*Aqx`@B z)Lh!c;2&60X6An(-ZC*TF#HShmf_!#w|`?x{~Pj_^}mp}>>Nbwe}1$6zX)BdCX2;ETJnCTAz_Cr;W5v3(YYFd)uI#r<(19PlH+&k-K{hr)t9 z#%KDb`xfX}DqS)GKfe}5scy<9U5rY_NVDjh=A??ajSuF=PDXRz4>?z6=4sDqAb|h2 z3pWT=h|5w0ui=m`yD=+sAQ!O6=VZR_F^J z*1Okn0&6Pi#WO`foDsEy7;yRtUg8@K8|^$xYVd;fQw^xc$LW0qSPt?stfrzL+)<%Hrmj;;yn+zfRo;JrE*=oJyGr^_1S$>0QctN3B0 z&vSkx_XL)Dp_yu{pY$2bx@dch>5lvE3s->A)1z^E9>QV(t#-0I8p9@vOyDLTvYJo8 zhj2~srSp2^>ljczFA8@S->GGmaCXZ9R&58)jq6w>C0@^g+OLOdXVu4?Koj=Xn|}Qb zGHb{)OcogsdnI>WIvj9UABDz{Ab^smSFmLS6U7ptwwt@tdd)w^z?8`&z_;tu&)@$c zk^x!R14}E?T2MOUTZe!$lz0{F2Cf^)zRi8*{q&hHfS*KoOt~S=Ym#!4E1cI?&R6Yi^>R|c3TYJ89cBc;DxR27k0oL(HvxWN+vv0lO@ z2fx|?S^K*-@6s4;psvj}+n_7^qbuJKA&8k_dU0T50Mj7zD(Nb~UTC2>cU;`(4M?Jc zp+i`t;9>Op;%>^x6Li_Zu2p!j{_u@|3}qSlfSk_;3&i9Er3? z==oxL^T~_BRc^l?-ati*j4ySFX>$Xm~n5pv^s%v(fB* z2itG*{dUiQ;ICzAo}b@BtooPoHjJTQf%7-C0;7A^i9}c>yOyuCse*W4QIwTO-yn5j zF%x?WWViRCj|g~Td(k&SEUz^0C_NC{3R3OU)rmc>sf~$y!`mFVzrCU{bfD7>XKf3z zZ-2k=xwg8Y>%hYYsoa4-vfRBhJR`Bk@DodqAoxMn2%aiPnc{1b0JlE^=tb~yVs>8{ z<7}1AX%V=N|oPNf_NaJ!sC}pQNKPf&Ev`@4HCHeYB*laO^vYK|dfp&Ccs#?Z z5>KYE%^9F@5Vkx9GS@0-kCqz}jlGa*H3I05W)W~_tQFK*?XMg*iDa%=%r;Ip?Es~G zoJz8J=P&rsGG{%Mw>p`)zG2#Mv+!V^_c4=Cf<67(sUI=dA`cv8bYl+02gAY|gq}t9 zhaN1nY2)N7u-QL>&J<-q30*s%Sum(KxLw>#HV>@;F9Tly#nNv1za1KW`uq_l$PJr- zKU3Z!Z~YY3qHoP{E{Kao$Y`d!HYC9;iim=R#r{xZJvay&p|cgP&$kgx$PNgpA8iUB zTqS)-I}+l;aRNAr9r(+%I;9=$f{OU)+3cpOzS^v3iT*~UhMUIU1ofV{ZHLOVwOcJm zA@RnBw9Ak{AQU%nNix}^gT%HV5;+|cOGcj2qErl{yXZBf#xrK>6^+4G0(P6e3TqLUN zzdpyXPJJa<*%8eAUb}+PRM_7bdsnk=pt%yhvBTo%cX0#QI`J_9|A6$AA8tv{@zWk<{GDN-TpQB zQwfSpP7hufl0@+W6HoL`_eN@PfkX5%w6 z*e8$wgD))eGKR1pEb~*0{yavZdCyBq$w-ycc&hdvY9P@`Sycgt&{13h`A-Z@*=}G6wXeRmTsPkgs zC%;K%`TJ8XYYZ)iGKR8lW`&EsuUZ173Q7C|-9?dYI{WZf)KGQn^jk17Bdwj1yUjvk zAgxZ)*-BM36?s-3(EuV#J<0~41C)egwb?so83SS?do?P8|ouz}kojXrl zPzF+BHX=o=~_nLitr+rCGMM3 zU7p&?#v9IpVCN_15>uV>6+4|yf^8C6yAi?0VPa-ArD@n5byu2h!eM>>7rkA+(%gb` z#XQd+yXSGLfAZ{ZM{+a@|y2ewmjmY!8OPfy~xa`3_t z4*L4qZf#_mz8^R(&DPFs6`6pL_|xCP^iX<|B1SG%{rz&ja9{o4_HXwPs*5;{m*iL$ z*cGstfvRIp^vVD+-*O4u>n+u=tSBnc+6Lb%IBcy?DLE(U_+K9SfMG#IeiX#oUjMKiSBVlN}Q zg})%iPlLJ2_3b_DsP$)`P9|oXVxr&%@r{>Q0Rzzq$BVF*^k0WScTss)2ag03-1AJi zH!1dD<^^DKYl0MVYnEkkSUkbVp@eCB%ptz;%Yu?%5y4I!Fwai-mf07=Dt@oR^7sMQ zGpNC?Vf@|m5^ag%mv?aTUm$xL0yDnPX=ON}Fga)ca?*RG^=&ij#74?MC7R48t$0IT z=s}4ps!DJ3v zjbZFso>LhGy45xNCW7c}~MRySf$|VvSn9P+?Pk9}All`6c-SIvDLiG#&}9 zwf(9%voQ#TWosef4Csu;-s~62ALql6G$Pu1j3cjfe%tN`KBO+8F<|otZLDtkP4!#& zJZ5jb^Zk^HFjn{VOs3Vv^5f8IvmB4Z`RZ-P7;f6=ArG&o8W(^iTlQlo-Scr*ujKOi zH`LQ)WRGTB&YUFgwid)X#%`+PZMAv{$+k=6Jf2erZ6vtfN`wW3@)0ULCC=Mj(14If z6T@y0NibLT+W_)SRW;h;Wh`boCh_dI?eq$El-b{(D^7|KHw8`u7t#BRUi>?LiY!Cg z4A+UjbBr`~xbgVU_DOgV_Ax?@fjk{n0m0SCc*``3k?Pd8$ zf1d=`yoQS#6<+mYlPgA2t~kYC@=O|AD_Agm1E8%E1%3LlvXLbgtY~ai=jFcpyO^kE>7;a zY$aUaarZ5czMbi@UvKdPe(G4L{dOAloZhCtl0s2ThoZu(JwyY#V4I8m4R-a&sT}== zGS>vpN+iU(D(on`+d6X?05q~pw=iK}9F~9Z*FV5P!RNZ=fK^X8hUhFpwT6b{ye{^v zn+KzXfq2M#z`LSNlnGJjRyK$wP z)6J{`eUCpJUw@Wgab0d_|F{I;uJ!OjH^maXAM6q=3bG-FgTnhJ2?*$Q8ROWX9g9~{nOQt`xQ zt^<5A)MeHDRpk3r!VXkLNHtj|7&id^t{(ROb#2?0OOrJ(?Jrr6Vl6vj<7}t2y!a@gmf9vM%*b-hp|H=Uc<|xOtK$Dkuj&Tlbdlf zM-+1WejBSYtG`#3FaNj~W(rr+?;RVJl$7|;RI~U)1pB^Rn8NFYEnxjM;py zokz^d){&aPA+!G!Qd)QHd4)MD!FMruc>e&J#u))7C(V8lw)rCk%M(hf`CIUo(1hO9 zc;B+Jz9_>9t23IkCnX?}KG^&le){FwS6Wx&_xUMw4lCzC;2d~!KEPf{ zmV;@}XBo#63@gQ00n=C)G^|gAPE=5GQXzcsqjq`^@WR0ee2%RD38x|ugKm^-i9wP! zYTN+9cWSQ`t)hJn!##g+|Cu~|II-KBpd?*TEjx0Z8>F;##H&L(mW%7@5iXa7kM90J$4f7+qHEQ_a z1{#U5z2hGhlKCOV;d5gC#}&yXj)x+PWr1bHFtxAKfCq1%DcSu)X+kf9lpx1Mwiu5e z0uto0-x=H)1}x;x0F91DNO>n7-Ghr$>bKzIa#xMNeLMeisId&BWB2Z` z+v;$e_mnA{p$?7;DbIi4RjLSki`>;wVq}&Y$ma;YRjIAbG9N z0Ep8vlR(VVyAa|Jmd~3zJP-(9(%5=4KEFOE*80iZS?Gb0^R|N-aU*NN(Cac=kD=FA z;I;=PbJO-Z&|bJ>x%ty#c+BfPueUowy-9!lDzbZAb4a$$U~rfkbZ)10x?})zcTX{v zj64G4w;hJda7ozOntBS2=2GP;Oj^kwP6mn~Mk)c;m^94}w7Z6#V?STqNUJ!>z#kzt zfry?26X6j!&N(NmwkBuiXIH9GqYRz(A*2Ax1l&?EiVdy_4M zJu79$mP{*cc)85|RsQCEGteLGe>fb!l{W|}K0pYV*jm)Sr z5M*L&sV=#(9+QKc76ddH#XNn&D5DKx-a=$3^czx1+2En{HTWMFUpUhm8tO`jrfcU+RJrL|RSbt~^38bAmrY9HWB9FERTq(%jdvI9mFL0VIqE^g z#h}p!!$68GsacqxZRcM9hFb!4#@lq#Pyq$9kS!?_07)7>)AbeH#2m`#f3Yn!&gp*R zfMlg>_T$tVh%&J3Re$MUeWRaeEb<501qt1=HM)$poZDC9#wv`zUc;A3zJPSjPqV+E zmSv|5Q{E-)ZYiZXs;)BHyV{xh zp;g;#8Auki-51;nivQe;h4?9V?A8iAFJw%bl_+i4n$0a`7$g)}AvVB_Yl0O&G8ucl zT%*YejW%a*)Z3%%0fN3^;$;jS>Zd zGr#Tpd7Q@<2&O?F*k2dgw{tLSP#^h4AD`b4uGAAu3!!Hy;fp>;0(4^KeigVwQ?Aw2 z2GFj*+eP0Mkxdb;+e{t`d&S6;ThE7k;*s=X?n^txx4(PnJwN{T6~GXIzP1AP0@jO{ zNjN1>$55uxxXt|42)ZbQ5p4IoD>kK1INA=)I-C_A7$BBI8VNyJhev|FQj&zwhaqh# z&LS;r_D|)~^niRx(;p@pY`Abu$Qz8*@FMFr=+C=+q#*3rt^}trOt45avJ&e><=-yGSsY%>xGbf}L{%O4(y}{VU~UxavPPRVZ~-BC?mt*gkF< zv0UPB&Ss2`Smd7z*~GnfG3MPgiB=i%JXD+5pc!S0k-VJQzB1Nq|5?`wjl6zn-;-f= z?%)Lr)gPfHsjb!#WakA$o{EiXs|zpYf#;Hm0Cbu%RmYL zraUiVWG=|B;QcLMKPR^y9wPGPtE@dh1K{st$aXXsc*{>m7>o2sHH1)sVy+SXWB8X+ zv!ko2IhmRk>a%X7>-Fbocx}&ykMYE*904D}`9xLN(bNYycDbxly_y>50=a{DmWP+Z zEMl$F8i#Ta*SH-*A+?`YTK7-DqhNnBc-ML0K@%}$;}B@cFG==B1xk(Uq69`LZ{A+6 zktf2vvtgRGoS0lRK4CUI@2^U=T}(CJ>(8lij8Yv}f!l+>exnH6?k}%i_!2K@&vNb_ z(?NC^LsFx9xwidZwrwW)WG*^0%S$y_&Hlq`W+uGHKTzLddI!yuCyq{UDO*&zacNJd ziU|f=nCG8?NFsw$VyQCw*d-d^7|FXwt|R4M0;ioU2t$wjLBMeX_p=5_ za9=n*F;a&ewC|vnxF$yWpuMO=LU>~xypTV$ORFb^vdGZ4sxPK|2VHO7D;5i&h7$q@ z>S-dl#e{L`X#;%rd_%p$tR-Dr!|cl!!#tTGV=XXI#O{T+qSFqi)raufrd?l306aHcmo(A=X< zGkSUd;m${_h(uywxS~6Hl~$+me3Tr~2vL?Mt?7Q=y!&~OaJvHY5o4BX?nS|h*vnP) zRQXiq_on!+_pSmCOc(QZN^*&x(R=msh~CpP0wO5XyvTn0J4D;?76g}P_#z_g7qIxGkgV=4ihvoOP^ z2yo^>SHjUCQYy*4y2{^RXkm*C&T*T^5AUA={;kAHy;A%E6gDntB3fRh7*n`lvUF>I z@S_#@J#~OOXto&&OOF|4CQHs7`=~KfD~LgKklXw%Fe8a3!QN5r z+i76N348gB;T7&kP(}VM=~A#E-xc#HVC%v{aNSLFH3+s*qT;TChgzvotf67@8Ghf% zbsXF6*q1c0w=(1)Y{Xt#jO1#u6+uiiLU0Pj^+|HTQ* zL7Q3=VJZ1-hRtO#OSg?~-EjqO=qIAYSnI&7)G~4%IHCi3LIVeE^jQU1ruR|D#x6Jf z!SKsKi~@WgA)HU<%Jiy|z44r@1%H`g-?U%mm25%k6adnGI@)tS;4o!nT7^&J{(Su^ zA^^YgXXNLzZP>g4?;;rDjR815IU)?XZ1H>KGtDuMt?#Ows_NX7SGBE(P?Mic=*<0b ztVy&osT4{B>RW8&(9{X2n-dSbB~7tHn+di8;uFU&p67~9Eqjo8ps^`+s=QR>&eJ2I zUqSzK+DUg>mskPTGvE^9#nUUXQM@zkHs+;6|4=t}d*_$3>(X=mp8O;IJ@pn*g`E71 z(NYqWW%+JiGu{Lt@On)LeMF(Nn6PRDp)6Ib`OUm3L8v4=6kwc!X!=WuCWv7I*#%{; zu~0t~bre{s6RvD9KxWaPeajZ^B$|Uo)~)KFcBZOwD_0~cf*`aQZfyCChjWe+TFBuq z2QL14qV|cXZvH%l?Ujg~0JGbe%B*EjsxsHT*zLw~biux_i+Yv6+ic{SVKOtpN!F~9 zf%vyD!_)jNr7*!trae9M=gOqgA+Rwq z2WFy|S8UptoCJx&z34+LEfONiwwt5!WjmVT;Fmhcage43E3w=fnFaqbguE&gpMW!k zfE?Zjyj^b7<^AAdUH$cpg%mHE;U~b@T1;601RgjsP*K#bDnlbdpWE_XIei!qg#6++ z)8Lla0)^m$bQXgfVb!2V$j4QpD5k6Ni(IDs>pN(_j-#VP;z8u&rQpD4=gG_|ChCW`Tt#szVZa z{3aIobqiX2S#DR3rIj?=Ip@=(f-GS|AAT6Km`Yj0&fYkg{Mz~nN~KF*6yNv()^9L& zfCQOIJs)^Wv`7J*^Zi7yrF9m;kV-I})_6zZ;|DW&zZ>_ss$oX%=oGIC>Te<}==fCHUw?jhn;ifrDOMn{|qXu zmAm&&W#oZ@0-%03{=n03Hi-a%koGhD;oHu=6$VowVys|t?f6x1y`Cr8YJp1ifB~ME zg4RsQtHK#dpu?$SE3HdJFI~IBepYw3%h@BP>C!Aam8DYB{C#04r|(*4(k)&mp3>Ow z(diV$e2Ch@(aP29>L|;Th6WJfl{+iGF42IHO_kb1wWthR#M=MFI~wN+=;Tfa4?dG1 zG?k2|P^u!%Ua^Yhgp7clzCTd3>^hb{rEhcyQ_MB&NglbeSmCF9T02_warvj9+fi*b*60C}{3~NG->STvR2EL$RCndC-OomY zwP#;@@Ol<+-Rj}vC~`IhCzL^L}6$3izrV&f8MV;cCna2VTKKo2SOD6SfuzEqh$^Y4+;r z1WK75x7lysUT(wGxGL;z@BLt>T78yoeDlnaEc0*qsxKgP=OX1Z`e?-9(83lXMP+5= ziU`;k8u|@w5_reej|-vGj~N8kahX^w(WKkLIUdM_v_+l%$`4~&JW>+AR`sqk8rVj2`h5sf{e(lIwMCV)-#f<>B*dG_f z_4N-ZxbSq_h+*8aYFz=?dwpyfD{@>%FUtIU-Y&{QzI1+idhd_U4&Z%)g$ zz0aD7>G2I+SB9p{w8_V+5py%7-YQ&l&Gdx^ojnXWedwpr=8O4*SL+w4$DKcsae9jz z<&z{v=^3f`04Grz1ef|sth6kRX32$zg<}ja3_qwZsD6!|>pwsq{++w`QIc;(Gl)a2vTk0 zmhs_7#tO_Sxg?B8)K4(0_){K&{%O@f=9&qUQQKh*&2e06+0w4HV|D176;zGq9G{GF z$PBCDU&*}*Dw9mZ9o=G)T(!Pp{j0s4ncuUKvv!^*b|RZWtJ7PrM@8&39dNs6yIzi-P#hnK?hA#SKF>u|`*;pwHAZbhXSe4B?f%j#AlUp>uo!}C(x#E zvRM3b@a0Qv)Af6Lp~v_6`aQg^9$ysFXQtb?j=HHAOr%?1of%AKlF62*MMI->V%5N& z6*5V-*T$0}2#%zg*1m(*^O6mH|D_!i_(de7eJChIl%(Alm_+QPEhXecq!y{>DVLxG zjPh2$fA>NDp6N5`lTB}E&DNSZ#PVh@oHFP8KvJ^S#mxn@1@veO;P{~ny_5R)zX3d`ldvIXZnevgtsJ8UIHuYT_U44Z|U(;D6cetV7 zJWlzl=yhNis#Lr^>RHXV`Sua8y7t)GT91i?a82o;9w zn9Q{i2pQ-dKO^o@Uf#m*YTtpR@HdTw$2J!wp<_6R2dj1ZUlJv4<<$jyeJX7&39(3X z783kMvO-`BC?=^HOB!=fdvF7M?onW8uD1OPOsVIZAo(&k%V%dAmQfs7;Ozca zIcClP)x_q?b`|~71O!IS;?wNGEklDaadiK7g?cMI zd4Q7YlKS6o)-S6|bA4DaoD{1aY`dwAc9SSB=dX)Lvk*vCIegz&2Dcwt+9)eA-M#mc zKMijOS~J=p+>9(d5g#D#g@`J9Ca#U8P`Q${H=KGn`$#E)`T`}XcgiD*8$h!j8{)Ih z7NITtAG%+ytLx;d8m_iiTMdtsY-+YO$q=XrXUp=OiZ~kFg{w;k72W8PPEn`NmbKP3 z+?vlC_iBIZCTV)*0Iup79x;yNMIw>?IX45L`Xt-3dr*+d9DA= zp(OUTez*B=4&^{{lEuFqN;jB)Ih3N?eq?KB8bsSO(EsjG>Y40uP*GC(>~L6nn;XOS zjF~f#`Bxfo8wFF?#vpsL6ARuNGn||LBfyeUsv;}=L0>)~f!!JwKNF%a|M*6ljuV(k zR5sPj(jGRwT2P@e6HofviK{NWeXOd}q-NN^AiAYluU3ZDbeJ0TMX0rQyB##}?Y?iR z#7+CzUEcPz-Tt*&vGqEsq;8%5B@?MOo29Yp%3SOBqZ@74-ug6EXosNphN^ad3Od{S z9ftA4?_mxqh&$c=(z%iCE*F@+j zd-K+Y?@*C9?;oFTO29|8O!zM&se!4P`yB-ouj){c701hh@gyEl*mW?#d$ojkx86vO z>^$XgP9gpXJk~4nJjc)DLj^p~!XU(on zm||{o*>k6H>K4i#q#N!%#z#&M7r9M{Qf3JGbiePfYV>dK=Q1wdAmkP!Q%R&SLp9dd zc6Mfd9`E)Sb$K1$DZ-zo2G1qj5pfz}x=rHtLfRP8>yTDp{#~JLLvl3_emv_UHAlw# zr$RZo28+CX3t8(tq~g*T8r1}06F4%zgwh!sOOX~ikPRN=k*Z1fDC_)(LdMh=>d=Pv z?3r7MyOLaunXYu*{7?p4#YzC~uw1V%ajs+3Ysjr)}2KE{^|N0oD?+j0-|XZw%rW&=PmE&b9?!Pb98Hb_D}cIUYkdF4beh3L)c?*xCZcjQ2n{2TE^%D@^EC{voLwFP>CDK$y}B*lr)G8941dS2QgT5a3NA*`YkJDgHq`u{ zj%wGcozi{^eMY(-SK$s&++y;4?xVjpUz}4C^yo5p&T7RvZwR^Sx*QL_+?>0!R&DZt zx?k^DTeS9s+1E{7(|`7OUGny1+eLE8=2k%as~PXRPZIk6@{{$6nZzv~ItADc7S0y@ z$?j-m=>ur^pR>hSu>K=zw5lwkp_-6gA#w~#msv`e^*=gk1X)=z-Z)H{`BaS}l?Lz1 zVi4p@VHDsnIFNo%f@*=<1b_nb_9bA~#oeD&xK2)#ynU$+mwt=?)!;$J$vYeZZMhtc zbnMFOmP+{~)K>LNr0i^bUI@`@nNpWC(P?dYj7TkwPPTDBaNg>kgP0eH-H06r&+f^O0GVZ1`>{5xVj2rcP7i!~JYx z>MH^TzdzvF0m6&Q5;e0$mb7h5?qPQCb(o>DbkxwLpNV|HQ`o4n_u~fNZmWw}IvW}z}&-Cnm+zw#$rT+H9 zZ|BpX!)bR0?$Yh1!(mYNV8o=gM)s%sa*oe06z1>Y)2i;zBY~b*%D%mjC!roJhjW3T z_g|kZ+h?{}#?ee~p(a|%$ii-bxNnrWAHD|i`I^#S8POCC`!;t3G3C(pi z9$O8!;0M283X*IZKS1KKy6>oh0FrEd0XSR&J)H(y1*6YQgzPb3oFI%;LwiB;DO$4Q zF>v|xX^#CjiV6BEs2>hKp7Uv7j2ODk_x>`o-K`N%%lkwbzFxDVm}kM=rc4sqc4GTW z0^mGrmSD*x(+e=yzq;djz3fH-FII-(I0_U-7P$xfY=bS47}=-Klv+JM3}Gi^Z*A|i zzam($qJv{gfqR3GpL>vtoO_vzV@qdE>#gKH`4sWm{w>mXB_atZW*2$CG#V54A=41w zS>A>D9DMP(OS;1{)Zf{M5@8vq^d#c`J#$+vz>;aAzgQn*TC}_eld-5aR&T~oHhbp! z4toN?nmT7rXEL$Piko3YLyv}BKZld{t#0teo~APCn)>94c=Jl6&niociA6=ty*~d+ z6IWdwf6pU=Xx693aKVjtx}J$NP*L4tzHU9QOY3&HCeXsaq4Is7NQtx2^LZma4-v-a z#((KwSOGl6Z9ji8+++xaecvr)+4Uw*U$!B|KN9T?3)Za#Rc-x?HoRAQm3md_DpzkH zqK0oR;rI{QaGEJqs?hd|jCAE^Gw!10wWqlT|3cJw;Ebk|=u*4nx=ZX09NJ{sHwN zB1}^h!L!R+S?Dpcmc8+DF8(cg6Zmm1?Qv7>ku*0^V8UbKZsDBtQEG*%m6AP~_r$mI z0eq(5RS4K`_iu{bM+ifPXt+kqavzOHDw9-B$@GF5C;E6)vd9IIO+wGue6Be?vw5Y0 zMICSn^RlRouA%N*1ijT?R&*6yyz;ZczFOh@VX?kfD~ z1?nILPnGzZHE@k!#x()DEy@(tzLHMj3SzXjK;95tg@oCb>aj;EAib*s43*%uqR2@q z%d9E{<)qMy6-z}K;*t`I_+~Gxd6CA(f5QzyQR{=6Q05hbpbUasX2Va4hhAKh$Kjt% z`RS^a9ta1Py2vQj=rQ2IMQ0<7-W6M*rX%m$!AFf7NI7f6Y^GN5*Dg0{t@{(+Sy;wn z*tTzJ-x^hubyhkV$lR$=QqP&T$;eYV3Jr>rr3`2Qp_Ox>S;I5xm?=ZJ9a}Kk;}1+C zXi46fXc^#3I}<%MLsY4+@(J3lws;qWiRHc9N41Y8!!jC$)d=T$T=_TT<4$+9BpNAs z=4%#P&QBZEAESQX2RC7R~3>7_~Y_k18Q{?%%oRFnV1lcb%`5ZDDdydH=zZR!vRjr4 z0Bepg?T17>Ay5+p<3NYdFz!Q!NwPh$-OSRd&WTs6n9ZM6g~{?T3Z1U%brnB^ z;<#S#T+60n@HP!|yL}HD-_WXSCiXm~*5<`k!7}m@7_T$FYsI<`@S+wf_}=YFEL|5> z%#vSWr_@30f>d?S$bPwH{fo$zwm%Z|| z`KJe>9Srd z(F$klSMLK@fcjEPTGcw+fe zp*mo{1oTjGOi{2>ff8Rs6?pxy49!o|{I=WYe?M11Y)P>RAyOQfj#}a*@WNP>Is?5a z1tzd+PBii%k&Z(VmKc^;9$6Z-@b>poSt9i?@%^`TGaXl}vGH`uBkyAuMg(EnG z3h$D%!De%P7j0mFyJe0F5%{-O1Ts#Vx!z~Uf|41<+VaveDzr1c-Ncu^fE#ai%Ab#6 z;>@_@Nzn5I!QG{Fxf(*M$9MR785%uPM z-W<*e-9`om165rmCqyb524?dF&m6`*K4acV-I8gOV>)i5=i zG&7M*unVX$+V(H%zEFVR8dS8^%!EKDss_0=uP8|?4+XU?Lv^SQF#P+%QghjL6C(E0 z1R_UuY9Ku}I+ZaAGujJ!xI{>PKx1>?ED25|4+HTGj)V1uBoc zw%xVE_f~gJ%GGK|L%eR^xp_B525$fznQ{b~v_lOR}pu4(?-`mND_=@sD200^lhVx*JDlF*4_h$Q5D zoHzEKxbS7LwsMLoJocQ^$usxRMCy+B4F>13ke9hI#+*J$xlD1B4B4{9p0XM6(t7JQ zF7~nTpKUdw>v4Is;RMdu>TF zGQjmVdvOgKN_)L#5~r^-hEG57B($8i=B{;3s4F43PUf zzw2VJlHV7&ZiGR{zps)y>~?%|@^s8hVy_j8yiwt%O!QB6%RQXps6(g(I=k|Rx?4CDtWEfyn5JAs+pQ$V!O|xgS2lv$^-v9=K>;Cee?1x= z$=4Ts5@k3&OZc9K7s}v_Kqu3A(`yP6)X`mhVre#V0s>K`tXH5FJtO#r1qwE~qLj$I zY?iVHNQWthV~abO(=>ji^t>;KFQ$Dde=W@eOlo0qUPA#setyMr#Y{byIRL!Zlb1Mn zNk7>MhxbkepRko|*-IV2fm7DfbNVcdGI9q!;F#b$KSvhDd{0=}Ln47eQp>_kS1g6; zl_E|}C{cKl$_>cIYE$GR>vvYh!%gSDZ zj&aMS2Zn>oUV#^^cA#jmif8zAD&F$P1&Xt6VXi^@yO5g-76W^60S~SYOd%3kUDWpp z0wR*nC8vHaH$F=od$V&Wh$(rHynhFRN2DRtB1n8PvzTH#&F5bm*?4x~c=lN$o=2<& zro8>!g^{E;eK{RT+6pPofJs*`CDogfZc$5C;(8;0?=6${t-wFemf|zf1$+)@)a^6O zZ4JInyOO^&J61nu_lKo*(V7(oe-Q&xZTCym)-Yy^W zLsTlS34!M>DCgs$O`EW)pe`a5jM|yf{-1GGpuSV|hN%~ft4E+Sk%<&4<`AU|Ozy1{GGe`cXqUxkUk+IiYRXt8_9z(Y?|uMz{unMHl#uc%hy3&ELOQS9AC-lG7+3kQ zz*m}f#Nu+{K{XnCy@R!jp)m`ttelz|6xo1djkE=!85Qwv^uz04a{QC>5DwvA25zEg=Cjwhw(-02?zL8)ZPURj22^x5$i z=44!6OgU0(o(A+eB7aiW^T;hMjNcxVvwZ3o^ONGOcsFrmDI4g$;aO*0-<77`6n!WU z0+1iReydx)8!?LNp${(jXBygZdN?0P1Hf!`S8vm5G=hIT$jPJJbmv{>mnT3`XJ<>u z_eGy^B9=c8!|Iwr^<(*j#lKsTkbE322%m|gSY!ncmt>w!)SMl<^z_)>)n>n#cqHD} zTUQ(O%8mg-%x|kh>!M%1$MsXb*Y6>W7#KDdAl^ zxz+Tbj<_Q}N+c7%vh1!PIwHBk=IY|Pq&fHiS3aJRI^o6qC7}$^&5z*o47z<%XQ*U7 zsKxogPrf-e#*oy3=OX)04~|>gdkJTHYrbC}r-C1d+3YYgm(<&lfk4#q!W_5U6qg>s zWP)7C6Y6a{aM$t_ICoO!#J-e|3{9(pUu<(e@}Z|2^K+v(`x_8#rKl}+kQ`vM$OWwV zs6v$F_`+#J5Pfbao@f{c8Lyh3zkQRgj&x68-X24c<+mS)FiMcmVcwYDFx!G=E!-|r zVxw~KLM@(~pWE2l&nFrj_1I!FLA?jFWQ{fPtjB0f@^~QQ%Sqc0f;nQ8X58!JELKB4M@jOy+At9(z!buOVeU-gY&P-1wiEu3Tw06=&Ma zjN8sw8fJCUnNPJGl9_Do8#R={P2{fBv2}LN&RJ`zX4vT5U#M_5UuGTIHKc${>;v4MAMV}NDP65N;I;$@WDJK%@4Z>n1 z)QOut|2p3~ZmMjB<&5(VZV~dphZf@vyxkq&op%9~);AX11~P$3J}tlvePBgRzzw<$ zyZiF@_J@7otqfcMGGR-mmCp_P$5BKVLbJrTs6@yzs;$4^*ls@CxEDk9OFr9}f`4pc z(OfgT>q<%G3*&E%6wt^6&OU+}U^+b)$hXOvTTe8Xc)zPivZxmLbEzF+8+rfte6|AN z0_ordSQAcEr2JN3Pn>4KbyySXWHySuULhO7h(xu5F8E`cC5%Wo6C%_M+;yn9^WR}^ zWTEJA_X&InY4HSPPlz5F&2>o_8Xwqi#8!F%Er=Ux<565NQFDlJvBYg7!7ITn(6KN_ zFP)M)A{m6}9{8nYzb>dK;N;2pGvJP0DTq9BldrPXjsml|qjbTcG=*IYXEi=BJ=H~@ z3yHWGVa;hItA_HOfC4S0oTUQSB06t_WHd=_J5hfBBe#M7BiCv|BGw>Fse%eu4RwhC z%~LTtvGF%aN~c33D&rlgc}Y!1UXam@%o9SigP5K}r5tsBCUsLqYQ7w;1~QE~wCn}up#q_feKL`NT$%_Ivf z)lxVYUyUA$z*RgFlG3VlSJv8~QbYo5t zZ-XgnLs1L|4iHEOZ3lipJVGo6T>u9lvUrDu`5?vy9P!)wd&4^ZS{Tl9`b89Mum!3xLEP75Mm< zPt5ChD1M#z7v=dM>I!Z1FDvpTN?kxQxhdm~y1*!E=KV?QDwP%T=;$i6L{DB0;ii3JH5Z(Sh~+oZOYtai2*G%@-6*x%D0f$*iDEv$IcVdc8WC2B4mWU+$BqY4 ztaFyVNF}L|dXNkhE*AI%wuZiS3eo}o4xEiDNE-zO37xTt|D}w)M>eDjzzk&6%ZKo4 zlZ;NG_^{%&UA%Ft{flt`J^=x1NQ1g&JW)S9gDX`AOE%M^R;%PW3Pz2>+f1oJvDp+< zTEkHLT`xs(z1x8&`Zcj)vq(~~SEEhA9)I2Ykm@Tc?=YxT$0#&AOng<#sAsAtCe0R` zAUnjehSA17MCT*@Lvzsy_?4ou^JIK}c!0aXqp{5bmqq6YZ|W=7*B{P#kX;;4;YdP7 z3GX($j~q|XW}w{n=1tPy9y~kBNiR}s3y1Oae#c-oBNj1?b?FUYaf$~bOW2dPPr|i7 z`P~))JLxE#3anrpI|n0t5-v?|Z+wr%bV9UAKE_rzE|kaEF!)M<$NVkUSNwgeO4}FQ zox!Mjk9L(*kzqd~__B0v5$>=VIW{9ie{Yb6pesY&oVW`TCGn$}+@!(j9^^47 z|I+Z=5MRe$wx9}QRn9@DAV!*|OYF9@7AXDW5InK6M(dJ9*;~)82i;n~vc@Qk%V6TY z4$fPol=f0J1~Dk6uh9iQx8}0&*9!Cva@L=gCjjcc#v-FG$RR2=Pc90gjoSRlWBXoj z+|T>@&x9THhfF19lPJyNAgYmozf^xE9?I?$l!3{>R?BO=`KhCihbp%BK-1|`~j-4 zYNUm<$V-(p9r?61+lE>H2veP?1H<$yryVRr%a6_8=QtDJ)92htw;89MODK|XiXeQ# z5X;+4E+gKj$ddf7IKYjL6nZ;dO?GdZxHZuNH>cJ2wv*Y~NgUY%#Qd)3%S-BvW1TKH z^tD<9bWbjiljx&a-1$37`^Ma^9ow&SAyj1@jQBUxSslP$(EAb}N;~tM?e|Vsr|H%f zhcDE|<2+p+*J1w~rS7zo`E7jCO%|iuiJp?$-p396dM=;cK9PfNd$=q4#^LEMpVM~` zLicjmSdd+*4X8{!cN}*@?oPauxn$yl-;X-Upxsg|Qx?iqFkF4rIU96=k55({V+;))RbQXzA@lDq{8nankDf{6YDm5tvk z;fIA9)%){hN0E|XmuBII8>liE<{$i8LRIIJ5{XBv_pL#QUd z)-3{7Ca&=?ACY2JN|YBx6UbsCoDSFx@vf2WV7zrKis|cjuuZBQ!8)~zrpxG)nM8u< zZHCxgAF;*r?G#xK!0)x@WyHqFOe1`Vf?TcG3VwhcGSH1au@wX_ExIwK7tdv{UFTAj zh<|uT)z}oO+!0P~MgG)AkG%SDTvICe`(zgi83MCXQyOwU$!lw?HlSu{N97J`s4YTl z6l)NMMm=G3eZ?Y~A5XqZeh40fg`%{%9A?!Vt+-C+(M6$KLD!?K?@HEqR{0jXYbg=w zqS=9-o5sj2Qk^V7O-*A=JEkUvI$W|EC7Uc&dY6xv8JW|U9T$px1e%7KqHAJtjH4JP znL?Y|EGaK?Sk7xTTlB^GDdrwYuoAnJIfJ^mW_uJhsBj15vIplrD74HuO^AL`=|B6g z!2s}6Ul&30SE{#Tb7ltZfE8g@EQ>k&Y}uxj6wh3@AYG$$HvN?|g`urzfD~;l=V|@3 zX_majVK{ezno<{-^oKcUFNbs4=8Kdyt>!M9+Qg|`u{K%0vobd=?QER8nb&m`KiOr{ z=7H`BHdEV|o-FNd*Ft*iCnk>F{N6PP;*435?=T`_#{UfZ}WV5mkb@VK5dh{ zQd2$Asla)D@ORC}-ru7>o(hJri#++3Yv*$Pr8ms=Z5%|y3~$7F%5i5NHN0DhloU)| zOxsJgRBbfV8e}_}Y)Z(8xsooNn4U^JMxt~uItyituddFST+^V5J$Q_n6g8rSr?eGn z?>zyWs*SE9pFzE!oW7cX>+dLv?uW4L(YV{4$Hv1Xxf(e`=nTPGdY>CznjJ_D&xU9VjV{JH*2FZYh4vI zD|Ln3d(A_RPSu`un<(WJw`#P~y0yve8QQ_qJ@*?eHJdFbqEUm(4q2n8PxJ&k>PL^^ zi+FP2O&|Onp-{jlebTv$tpAPtA1B0Y8!`T1rd2?JVmsNxy1#}h0o)2 z{z%JK550Qb1)fgdN+UJ%r;>SbSAb9Bv)alcAq2J7Q-X)|0Rg#)Jb;Cyi|#j&O-|!c z;{#xJ3U4B$;{pB${ItJg@TomWY_xRP6gvxV8f{wTMf0Ya){&-CU3uBi>MspjEmLh{ zb+yL1x`shF`v$TOhDt+)J-@DRGkIklY^Wn3BvgLpP9S9vF60TQ;?i0zY#i3Vl0;fX zMJ58~=8DO6gexWo>aLPQC57#+5ez8u7nH(Os+ChXSTxc+yTD{K90=tqB}q9xYyLCZ z6k0w9a+5!1;bX;qeBwEM<#|%Vjn7H$F<-}JY?*AY!|~HZnC%LxXC%)?b$;DIZp!g@ znN})qqyGG}k4+jM?ps^y5Kc{(J{_Da%>*9rdjXeiMy^S-onG%7Xy;ZA&0b9^FZ;?XuZQIuGGkl%Ydq+NKPEr-{{-xV1 zrI8X}wcPEuRI3UvK&&+qP}n zwr$(CwaPYnzx$rO&%4p*oW8gFTaOWu88K(hh{&8Va{OaFzb9sd6wu_QF|qn$3t@7Z zoQ?@kSzg^+?#jF@!@^LtYDtAS2M5>#Bm(r z?>QZdlhpBed$QZ|n$8Z(2|qWalq^XM7tiH|nvcf>KuOT87SqX@tfyWZpLJ(4j(jHc zP36;t2(mD>2?6lRLt312VY$#e$yHk6v1=M^9JEpx#F=E_7baD*f5%f)m7bli4$3 zTCV^En41{PUaw#BGQw?0-7_*TJR$P9B54AEkb0Fk4#+Q7L5c!AFH-iO&~pAaiMB|E z`I)|PEqaq|k*!Jj!`ai*)3{|D@ud=TMxV=D7}qS$I+wbQpAf<$zLW|a^EKHrj`E;Fw|qoLnNRUXa5RBbh-e%+7k$#1H1TZd$-F1xo*A+S78 zs{~Vbdj~ZvnLJ5yNe5b9>lv{`sQU>&E+>?7gO6O4LMWm zmfP|l>dqa{a(3zx?fkL&^V{*>qHmoK$Nj=V6Z1K;KI~qidKpAhdL0*%tXV6;w6D{N ziy7w*BY*ktxq`TWXa-vkAXifkZ-+Uk;&;*yt1CIz7eyNY_*|M>(u;Iqs`HeHmb^*O z`YCkH@l`PxlO_dapezq-kX&I24lFp$m&->@rN!uW9=5^)t+hV0Uw+TI^dj0ZGvq_6 z*@M}omR9Y=DT%fI>230`yrKQMw@~x`iSde3exIC0_#6NiNS#<~#`cYRlM2W6Fwq{i zTW7gx$l@v`>d^;8o9_+%=)4G*pZ$Yp6et9}jFwH-FGYGc@V@qigy8eAyVS&g1$wuM z>n0tiQ$$e~;b+ot0d|Z%t*bk2YYC1K=Qy%0iadhz9zLs2Uu4qJ89Ta4U`<)BtiTNL zjT^l8yU>`C7Mh=-iNKIn(r=pPFIHRh#T7n+A=LzcS!ZrmV&PRv#Qo{aQp-{LCG7T- zM{PaN>nofkl!S4CGjdUW@kX}YGc(Rw<4eEKbM@yVwqfQ?5{4aiYAV(!_=!w{F@+sV z=XYJf=o%}JBB!l9B8VPvbXh+YZE!R9E^FwiAK8+z&UWKP+-y6zk(~a`fF;TEXU4Bh z3-Ut#?l)!G*}7@T=W+0-9f9&DzN*}02XW4Q2J1j=TLBwu0T>~3)}kFam(Gm~rM_{* zmF6PUD5_v_Cw(<_4NS5>ca&(P`9?a|mlhW124nqYi})Xj;Tgq*kf_9|%Dq|dt7?m} zJ)P@n*Kzu6caCGO{05!`Z z=6P%P{T^cwHU^DX2T^Z~P(Jgmf3is=)giqI$)TGx0}v;ngU>3qM{Y}&KKiS0g>D%F zzrYN=4C3Zq0c(S>m4Vpf0>K&UZZSlvl;WM!!Hk50y94bu5Iw|v*K)W)EWZ)4 zS8FN4rD`qfwOc@9<-J$7_QQDA&^QorMdv8>oO3S_bU^8(oa5n&kSU-;$$xKWmK*PyM@I>?g zfN2|4$X0XeSOm5d&k`RUfJ+6#J?iH>jHjmf&k=DIRLUKWI z69IF)g!lG?YN%xxMXx3&{-o&!7+N@Lc)NIKq{GtS?s6rk_kX^+CdAtyNsJ9k5 zW>FTeSWUkEaI9*6AD%Y|#sF1n98C6KqbqUv_Gq(p0>|Zb>Kv|x*j@G_c#~v+N^mjC z=2&=-qSPRFL`|KLUWxobMVzSTTpM=Hf)e1s#gwS$@#Pxzqe^l7rD`dXLjqSA7WtLK zHNoLOLCS(X;Jx!FM`~jFR+HwJmW*b{?Cs4InIIN;ZHc75grs`0O=4Bzs0U&6Rmg=h zI%edV(c9XXnCMXze3Wz{sOo|GFp?i;v+5r6jr8Mq3x~fe*h-JOYjFB?vRO<@*y(Byxzu` zi=`0Ra|O!vCRE8K##d!uUmip#l$Q)mSZwREyLgVNHE9XuadJ2%-@IB_T>!-#bax?h zR`u;j>2!uNB!}w26-%0JVgHCP=F@=dy+laz^D&q20med2P6s3E@sm9p%GBGH-K4$v zgfGNQ4{JmhmkqEp_Ui`446{kLOBgS*w&{!K4`fQ2)jWFUUgQQ{)r#4eu7!tZwZ4+%`* zcIDio5if|RFB-x8HN*oR>DDRzO<|dN(3H9rA}8NSe0zcd<=Mk3qdTZdSW1;##a>~v zTw*Fa!uZtSxdb}xZ8?N@fO$j>y|DL!o=hvdCAmSMJw zSTx^XvVJkGa_qg=+5_ejzdf73Jg18;7~LL&-yT4<0?=*Hb9j_kl`fbsn=TqJCoNf< zG+;MiO)!&mMI6j$x#(rztXH~xwD43QFyx87n5QbKNq5#eUkyW!M{Z?#I^e&BUT8Go zzk*1!-Hs2(Ojx?ei#@TwHPLy$R1HUXO?({0JpG)5?y#-fGry{=5%q!a;=@;aqgQ)F z3JFOBafj%#s)^fAzQ-Pp!v%r{t@Yuy8cM|F<2AXTI6M>i&K zqgGSju_2ZD#hH`{q=I8j(AT#r0}_`2b{NPa)~wYR7yOOrK9PT3y&mdBZM_^kpy}r{ zr#C^p`|nG3Fms_EC$PUnV;fKQw6C7!6DKh3jcN*~mF$eca4|mKXNH}6t;a`BysJCS z##R}L9c{54Zm}JN>hfrD*~l_FqY9!B(Cn}rGcV#?HTs{(@Ed-P;NpNv`XmSqKl(0y z8bf4O@=@S4>i;fq0w7Sf3Ue8yN!`!32vtgY+xmv05>FAKV2x6aOx|8gdSB8lHP!iy zRA63JlXD&E;i7x(mT0lEo=Z)+GW%TSPRN#scDe?N5K(@u0G;-L=j57wPg@RdSP3t4 zl3f7bys*vGM;s3$)5xR84eD}3K5<1(tqkze1gh#nbU%7WZ-Dv4TE#`dN11Op-HH4v zne9RN#L5$A2^i7tZ$+cO5{~phIC!GlG5XP^FqrA}oB07x=$rp9FFu@aF#--a{OowJ0DD&SKinoq2dZEMb}-Uo?9d~! zIbKAMUIa+kx{)gi8+cI#eF9ge`mCl4Pi~h|;=G5S&x0?7_=q2tZ!O3Ln13nVVMb|5 zXVqm#S67o@!0LRXlI>tqd_To8l|3R>pEj+8o^Oj;spN<$IcvbRe&%r*7`u*WIpDUv z?~On6e%(A~v{)>Fv2$6ctjJ$9Ds#D>UqYp1zU-cuz$tOFj9@XkeGq8?oF(y6DHzlZp~NxNu&X<2T<&_SZ=EeK(H8tBVV2WE@GEi)VKkGKntnNOs^#~q*n-8=27W`i)Y zrJak-FFizy<>-gZoNeWA0SQ5`)kHj7Bh759y|Bn>o2{#>>?dgCG6mI4Q z0J;Pjl=}eCPpVmLFWX~8+g3bg%9}Az8=rI0N29KUXlCpSqBZ;|0NuHm1ZMM9R2UM;DdCVQJEE2Z0fF9p60HjSYM z`@bzjt~b+u;r$YvafKT6_t9>2ZeBfp0`iE; z!;hE_c?lS~Ugj6Nn@NOA^zVQIoC2W%R7urr1&kxryrmF=e9Yly|Fn=fejigq}@x?oyUE98r39c1;iytB8_c&|J zI*_3$AJ50qEgCh+U3R&jqFbULgY>FB^xpV93O#3>-?aET9^u9W2=iox zB88-}#ROF%<)Z1?g%fsDVjZzOg6UC<)!a*1vdbm-F#PEej`-{*KNV2A5Bh9)KGiLk zkj}4GJL#M?caply9fvGeNdxt(8)KBL|7Yav6NlbDu9}Jv%L*f#>Yvsm`ww)Lhdjii?z<%P{ol~8dAi4xAZ2MMHJ`g;6_P&}myM6apWbVJcOZmiX zAGuxIooi)3L%D+;IFb=x;$+{mbPYAOv^pu+b2y1X%lh44dw<1X3BfL2k=MI<88XdeY*c6t;d^~ zA9Rhj|Byr$(x!D-A8~m@toisg?bH9NeH^-_`AvV)!L|dagJnP7CO~WZMRdv>)I87< z#KT8^o8%OfeZan9O6f2FIY7q0tjzO{>Uup3m`T|fc3;wVLVmgqcR)ZL>KhOK;S^{hhnH-61Kz>KOugxj}dYg6h8?e3db z=1kFb-_C3vm7wG@il^4oWFFg@20fj z`%~lYppH`+{9-|JmCl5@4E}|+fo#AXxxIFQ7K5Gm`;63y5|Wjy@rL5s?zG9r;ls12 z$cvvZq6&C2``uw5pAcgRNU1E@E*@AbBYjt6@0cT18g4;#ns@`7-i$MNQ*J=}WI-Z! z*V6OWeKO;3;L8vLY9=rS<8sUTg7Fq`fKQNzg4J3P9!VvoN3Q`1RehcP_&f`I(-y8- z=F?!d+Cy$Wx|tyupBQ7~hiDY9O$~VWn(Q@7!vzMJqU^Ls7zkfj9y-OfUBVj2!kHm% zQlSQky740cp3X@|#Q361R)Hk(J2$r*U9d;^(PoE`xYJvi4aCPAa=szSBOIxe7ku*k zg&Dahcdb9ZJbYn`EFbmKW@NqnsF_w!^xvi0G8>$NN%f7P^o*tPzxAn#rbb;&1}LIM zC^KY9&LO{fLEY-5va|SqQ^{Ml_<2z*FWXh?cKv15PCAT*4#X`PLDS}fV*x;Y9eK&@ zS;zB1NKRb|?^dBMJokOz^YCra;SBK2J2VE{{O=fnziOF(6j>SA|MaX!dWQcgBEZVb z^k+nXg_Z8lhyWAI-w^@Ee?$c6|B~35@mc5@@mc9u{*e$+RZ|jDR;LuSak4l2Ls9*| zBLx0V1+XzN{wEZ`Ovm_-P{3bRTm}4p5Ox{=4h69M@zlisvkdwFxAEV%@plk_f$87# zC;try@XwRtUqFDr&e=bM0Dry7{}l*8|33!-nEovY!2C}j0397W%YP37B&kDaDz3Eg zo@{!U=v-xaq3ar>oA8OE@`KTlvDSm@BcnLViSo+<%G>H7B;to-3L+*dCXl$9HDHdc z4;EdgyhM`FieoJ_if43oE;f_UOIMmT7o%KtUT*@XF!elp!@V3+J!d=gJbrtfFn|*U zI+h~Qi&g5Vt%zU`LNN9KyLWjHaLAVFy-@|;0L-QvSxu;DS9B}-!xspKE>PL5by6YU zv?3_5!%M8Lv^G}nHL#DRAV|1jFNa|2^{b8*_r3t3$CzujSufD$Eb{us!Udm-Nm_Vq zt&cPt_P&5eQmQOlnG@;Q;q|{bpnE7URcUe*UDoOJDd1@BEVn!3ER3k-W`G}p!M-RKqG+oT!7NP5$rS}P zjT(5q;p?~EdFa}j9QCgp4ZaxlD|JRXR6~;x5+}oGGvetY16gE%eAPqt70veJ9Ma&i zF`)(EWF|s>4~*7VIg~w>q^^tEw26&3niK<)^ z_jv`c9SFAzf&Kv+kfVFU`~mR=Q7z!p8)XW`b*<70ALIAL>dNs3VoDdeAxG?v+7+WOjA>B{_2QFevyvhcqjC=mu3a|9SZeQVT|wyv-+ud9@uj; z&PY*0-6la1F;Wat;e1IGRk?rY0b&YYD3q%%&n=omE6j%MX3gOc?A$|4AHR8ys9vYnm}3e9Fmcq z!|MPDV|KiVY)wpgL17&#kJnJ`8Q6)Qx)$=)ZMKuJ^lY+Fkgg-eCcV>y5!!;rzUkep zo{dcm>Dy@KO_fU5Lql=#Fd+1E@{6wEYGt7tWa$2=6dqQJnJOSm)6_%SlvCnNys_-{ zb`e9(yCLqOh9qX0-e8y0_exY(7coqCd~ka(`7Ic-@DN2Czta6cePnLee)?Y79@Z`- zrA`@j_3iMZ7Con?klXzdO2>Y35B)DrE+8agA~f#A0Q*(^v$AKQxr!|`f$$L2) zuj~unZA|D23Y+S1d++U&-=Cnuc2(DBCoMCJFf(KyAFQFyl3qnkU0p>yvSv0`Hd|$? zCx|&A&yTn@rKeVuWkDs%!Fo$&t7%=;roX$>$#gbCN&Vl-kP@e1(b_u&rbcV+4MTe? zdRrRn*>XW%DDkZMCQ2zT9)0u62bgJQf2BTEYJVv>r~UHY_jGI?{G(?BxPC?H)Upb2`U;{$u}FX9GztJk7M-XznGgB57Xzf@M_ z4i7;2{#f*M@I+}i4mt3TG892oz&jKn7B~Q|*?or8Mul-tZ3rL?sV0K+NH*5wvx2~T9PQ$@&rYqtZuBrGk~9+TMFCmj z+b}*ME3yhTXx=wT+xg~A=$v!aCqJ)SU!)74nS+DZ>)vJMiObRMJd>;b(oOS4+vWN& ze@L>~E$1`lNOF6%`~3X9Ji_51DX+dHSYo>-r%*Y#D$=g zLeAP^@p>sSg(&BQ`$kjQy0X6b86DUpWiLuFWbdavLkQXVF7S`hI`^q1F&?A&i>YA8 zYDKbx;}D%3v=c)?2zYRPy+Vi3vX9FglORmID;w?9o~OQxKH6IgwDglnwXd9<${MZC zTZ5~~jSv?Rk{HO$?Uv&p2#D> zL4)j;r{AiXLFQ#~NbhWnJJwA3&KG@EgKO2!6=k$KNv|aci3u2EF+L)`9@BiDeawmB6JD?lf9uFNypRi|CS24Os+>4dF6QFWUb+R@RO1hFA z{bi=a!?0a~J^HBwtddhsE8^gWc0YEqN4>h-uGf_;bPfNt`wSD%Vz*&b0B`sc3}oW_+jGpO7*>Q6^sVn7H`4} z18|BmvsLzPLQIO>UDt@)d?>fmWO;rirM!XlyluoR6hf{<2Y(%q;-+nD2u`|g&iZjb z@(whm^z=SLl?2P~FdE3b>=*TX*(%Yui&pX-pd>pL>WzXt$fkA88LSaQGQ-Zt>g1ume+yN0No^aA z1sipJS?|FfzR@X3bMpdRrN)V7Kni4p!n*9j0F)UWO!b! z0JW7Le!SB${F>Df8=l>m$MT6wx~IWleCX&?uHVJ_EvncYusbn^j}@|+4?%zE4f`E0^BbeSw|Rz#g2uC%3M%Lrs)$4wi3Xo^UKeY(J3${AfWQbzzV5ZgQo zkGGX%jBl)sH+Uu2gjetifa`GmR5M`fibH-Gm$6yLKn7SP9WtYA z58)i*DrPI!IkaIKAsJtIK~p}MP5J`T^a2QSW*Un2TcQ8x6^dIzU>qX;c@tPfc9ar8 zk!?rxqTPvH)BheVQPT4z^EPz;(l2|}b{$6wd+|#C3P3yZEP+)NQk3d=cR1i`eKFub z>+Nw{GFIke!>T-{m7uq*YG#X}RJ z%x_V?%n#x~u)vzhy@r=i%T4qwiDoZGQ@V{A3i57YVIf>yBS-6VeO*V#d3lC*{EnD}eW= zFQgDJ>$?qtyo3|`kIHTrkRuHVbEb(A&e}g@RZvF{oK_?jsF0-bLfe)w#CIH8qlS-1&QQUgf<*jU=q66Y$HX*517GoJ zjEb>2aNR#Lbzu7O7D-hAKLcLn+K-9Il<5`A+Y<69>elik0G&3vFxZleSCDOUHsLiV ziu8(reTz^cGrRFm_Io5WtQ?FFvveHp2FwniCUMP5wsI>o*X(zPpnjEfKg?bIPB39I zEZM&+2ifQ(7j{9d!4uua?y~fn&0=_)e#lW2>kB_4F9^VJaT^hFvCO6?irtf~Cc9xP ziiy9}j&YG%E+mgA`Q_CV&<(9CiKNJSFLa3$3If~3gyiEVSf z;uoG==B_xnR&-aI9;(*6MbctMt^`pkKtoIxi#(sHo8KNMpH|-clTT|;(r>lS{gyg( zJ{nGzqw_Sg@k-^A(mdQ)Ld#Y6b@J}5J)T`!S4SDSNVe#FM%?Fm99`)fzV33Z{k8WA zMx!sS7%+RacNv#SWpd)cK8TK0R+kf@S+%}$)!gX;ic1xT_}QUZAhCqJkztu80^}mq zKO?k4@?eRoL(M|yuyZ1RHb&75L(Wi+Gsrs1X`IJ__v&u*`NTl>^R_O?t>C(B z)fKcsbu`I26;*}CYDZb44e{Ic;`l%k^10___JER-bMs(2bCjIscSn!Kvt{{v{VK{6 z_iPscY3Wg}hclogdbvmTnfBFbl`SrEY?IDR$6FGM{!%HxF;nLp`n=pM<3LzMYM}MS zaMa*jkvMLgY3Q5LjgA!{0TaJ7FM}Ved<*hqJwhutms&RF5*AfQSFgiFlP_)S2#Cv4zA z8DxTX#CK{gQNgHSqLrGKBZ$?5!84ku;k6(IIix-<`0WX6%CAysk$rP!U}bL-5PFOt z0%taW^+W(wFt-M^ge5%MyrfL48|uqcPE@qOPQc9;In0kUR-G?&H2o8!%Cn^8(`1z; z=?9A&2g!Pg_$jq7(I@M{$vU6i+pc-uovWSNi|WduT@5a5OLKe`_F2L?T6F1h15`_d zrQq12ozO6QfQraW6xiS&fcLdqn8Zn!fm;ai8hmhVL5TzWG!Wx#V0@%04MB7OX@mlu ziBkxk_${)dX>{4yMwb$=nicr_Z4L?ty?pyx9xhccM(%Fz*2%#E1xFo%R2YK>^;cX9 zykoCb(>cZw2iZ&!p8yZMkVbjhbG4fh4PFgigCbp~$WEji&JXDQ=BHrtkik z^Tj-ULeh+w7lvml#Kn)Kh7TTYhL#fB2~u*i>(ce&MD&hkO<&cAc4Mr7@S9SwFOwBP zf{PM;Y!5?S)Y*0ysNjTf!kjeOJfwPSfM#Eb+&9Wpx~O~3nqA*rUh``fz}L*}3lRhN zkdUZVo+XrbLv2uEOa8LY$dZ2>MYH=Wsa}P*Bo~OCr%vT`#eVLJ&8n z4bkV<0X`RPb$DJT{^;jD-HaI3qR+F>!~;PbA{%+ATQJUd1;-1agWDW>ve0G(@v^DZ zx2W}qqC}iHo-h>l=g2bz)L_NCNFO8ytTpz|_oPTSrB{IojGwfxHLn;xy|Qzx_OIsN z$47ad>|1DZq#c&=^!Q?HwZjgvA7&sf0g%CAPFeEmPk5f+Ij_O>i|H$CZnz zZ0-tbs^*Hnhjf2?mc_wfS7&hd6xZ!X?Z8nJ$1&(wAFSuWiMf?AT4~-N=kX3%bXMgq z!}0SlrhD)I3~AGgGiAxkA6FxW5F#424Gk}%*I?c$&6K^Qo!};1hx5Y$u6KR1|hDpnhyzPy(tDa?%Q;)$2GhJ=ujPX_}gYOI+kLxE>>__be^s%qwj^jkd5y zGABF;afGYeYvRp|lkCi35zzaaVYI&>d?B<*l*H;|lu2SLBoVmGHOkUp+a1tgNsU;U zg1(h5#?3E9>&e`k#S2H^;F3ak;6o#GX?oNMVYLmY<)k`?(`V?Zo<7L{s_4jaw{2<3 zZ9Zh|7a{#`@SDFZeFC|EcpB!`$QH=g)sSC+lHr-3p5mxmiSgjSxbku2EYH-#hWt8w zjYW!vCn#YQXS&HNe5ZmRzI*N0Pnba?jqKdyfqR8CNWNl4ur|ELvT(R-X39TCG5eXb zbBVr-;kLoFO|E`fTcPU@S4Dq#Vb7+hWu|5(eH#F!nW)i9lOqOg3wI?jx-evN$4bYH z-Z>Z6^PQN0&m9kJW=Hr8V0dZo6{fpUMcrDheqh<8oS^i&QK?C1V@({ zfM+{hlbUrkakG8DkyE*ScQvEq>Fto-xOF-~K|?Mjx$!tmDP6U)o%r>B%?3}FaUm&& za}J;R)gRC#4TOT!!USrMoo&~x7!lMmgR5G5({{ugHR7dx0r?BY)l_szf0sG%a>hQIk8K#Ku_M7E&E_wms-r zJRH#2tbd)`Ts>4y-W=tk0$+OgAcRM}+3@~4#a7Ubbs5ue%H_~+^-Z!*OZ-GuR zmvx}~xfct-Y9dj4SV%rRD001Cg}4>)3%~NBSmPE&g!ykV1Sg=NQ;!pf+`dGOXlefx zFP-*|x6>z5oqjkON{X0W!5NkrpUaiQ+q_>eN>*NMs4Fl42p%BW6?`Fs>-NXYAa1g^ z7~PX}GSkKQ<}!I?f_j7YmHzl_%=Fy13yJ=^n*qqSsS5BQ+~OGQK}mbyGt-6;6}^K| zu%jM2gsG&2zkka2Ba$js-%09#le*WA_uNiDKe58P9x7pSUr*Fv*QV@}?s$UXC6kDU ztoF|8-;ot^?B@7oE`fcV&zh7VfWcPQ4IgX*<0PB5F%*jqm5-EGF$Hx|R{O!00N7{^k?VDgi~388}U}6IU{?nl4uuwW;J9 zS2rq&muFCiSw_eo6RN^zGa4^IU~Wp6fvLc7Tc9oo4U^#6#PB{)kh8s?O7yH(^h0gk z;9!kTf8d55OsYguqgKB#vb|>P8L3Li?&F>}{=Iv>9ghnDvy>1*rsb342z?p4ksiQt zL7Phn*hMX)cwY%0T|J=R~H&5Juq;nafk@mV+u5*YuE$6UKZ_N zZzANcD1CcI4L%JQV*K6LtKK%H(zl3Wq zxgL|%)ELq2)qSUJUmZ+FDpP^_dn1Ak3^OLPQqz*^1+;B{N0LpYd(^%m$(a28locoT zX_%EKSE-A=F~U2BU!Ah**YB^R4*W96_D4oO*#fIgP2~J4LOg_AK|UuwQDoTyVLl)! zMECe++a3NR??tdr@Mns2Nb0VXUQc#8&RM2h28r6>lKWa4+F9IPPtM4e=*@`>QJjk$ zdDuobx@~Z;A0CXe_PyyK-VL(=93dkIBXvR~38JGmV=YoZ4y^ag8pGbxQAf>WQsFE^ z8so8ddPgngTIDB-H5H`gF6BBahGxrVg6muB_wDlSjBg5RZ;FZ#!P!x&p4LT&i( zTbZE8wUzV>wb95A8dMAYM@LI2eVi*yOHGBcW@QyR^mkDhy~S0$FHW(FuNzFZ$AOSR z-WkLIj0SS>Q9&Q+5cP%y@Z*9YrRYhy3QQ>CRW2a-1r0mZMosD%K zPW=JG-w(Jy+VM)^OnGOubGiAr`L_79_&9wzeAoTzTP&?@@h+#Gc@dV{VuTyEM*Je> zKNMw~-?wqru7LQmN^bUoP@e<%LJ0jk@J_#i{5#-IU$5w|&^U%$pJ#rxJx@1uJOexi zUS3(}(&SD*O-E1TOh&u;cL0^*oa(>8=_%-twx$3WiK2pE1@Y~*kvwzd_P4cGt6x`x zjB5knIrt6Is8lZ@)T@)KN*`1WV^`2@l;fHx8LFj8QI6L}OS48pV9twR0hI;IdmDt$ z?A~G~Y=Nri$8YaR&1zUVca2%jVY%^_EMPgBM=6)cl{-RD@Jk_N&4ofmMMU8Y8;CfQ zq>oK1(p7URS|11{WsIq`$!Cvir3DleLn_KM6PpjuPNyMGK`8s$8H+XqpvXHN`QO+@ zUYGf;k*#?_7L=29yd(P!D>C`;zaTr$Pi);iGs_S~a&|m-1aG9L>nb?@8p^b7q%I>- z=i_`PS(;rZX?4DA-~GM|@KN4U)0%H=VMFi1s@1p}?b=kbf)x(dXa3)1SxwNBOTm_@6HN z>j|bmHW>KJef`V(-!~ul+d%&)|6SjwXaC1lfn_L97a>M;(7;ew+{^YnQ(ft3cOyOrq~(7=*<|dP&_46iz;{<&Mo6(^3tlq zv%J3c#G?`6=sB2uBWcMTovvjJls-i-)x=!d5AjqfkYqKe=+3Ptx?qs+wrxq|69xBy z4VrzJl^+tN&A}3HAwv1oIubc@&C>;F%pI|<(Anm$umjvG#W8n zfx+@l?XC5Yx14lsE&`)1fYcP~L;t25fhHfLeYmrWmm_Ch+Ka6Viz!`{^4p3v!fsnJ zKddVQo}W4=$@|9<+KvC%(JINcyxWv$QsKH>d5*3{0bG?q7YM%r9gCP~LYae9EUu7L z)0&~hlvt-l`Qx_MvKx;9mY`_TSX6P)YYpRpG;D+F7?tu}nF8+fDxLG5_M1lJfOhdj z#tPz8Ci^k*M%ri=z z%N%oJ2x?r-AY=zRH&j<{Az4!F3djY|D zVmw>6?RsJ*iDDAQKZzAC4&Ed-KHo&EnC-+@x=X>0_&XGRo^!a|-z;#3HJM2&``w*} zxyxABX?OHn6AC=k4FvX-one<6txUtYvJa=5 zwPvs>9h88RLXqyVOC5xYZ(=O2%h(G=@28TzyY98B*4Ujft8bEh#Iq@Q*`PUO*aqGx zXQM1bCvYJTgbLDSvaLe%QEGPm>phyK~U4hs2=MWse>Y)W`E&^q^{vGgD!qmd^wsV2mz$HfQmev zM$IBVa5>D%5=okK{YM@%M8B(^>M2y!ETc#rrZB_@1jM4NMt%DFDp8cuMlf@2JoQ(Y z+Tgi0)z_Z=&@<<&&0L&imNSfx6Mel?dIGh&t&(O$Yej3|PjeNc_lQpIu-Ddo<-lir z3t1;qJND)G`eE&U;bmw1X^G~S%;#T_Z8OZ{W2iZ|nN@_(X(C?XvNudkvIdwINs}XF zKToKVN7acP{CIw-QN=Y$kYKKXxVh91xvAj1%pSp<*rINk@{;bD+=8_f462POcg&iX zsCn*EB)YuPyn5;wcvD)=PwqIN4842e-!@hVbyA*lcBYZo4|0ybliQI7kuvSG&OM%l zUA2PlZMaTU(Q1@*6`96#aOgX+AESF;I>T#}u&>>9dukbIt6Z-j_f@37%6FZBdk0Ca z$CySYP{WSsb5dQ^Zq%?1Hc(`35_Db5WlX&EtyX3Y?W295?!NXlE2W>?0nm2b3!+Lo zTHG;QyJX|ltLAGUji`2_dt67{?HWep+;{jt&MXi0=p^SroConPQDw(u<5+HS@RX!o z4`>fH$bLSNXLo%Z+udF$ae1K3;9e+mc_7c=4mEJHG;D=iq?j9$a=`oKn{WDYC=J2B ze$~~=Jl;@swXS=iw)}dJquL1MRkUpCuX^$0^jT{^&9bZ$?#f2+-XU1|HZ#k(O(l2i0>iV^c`u8!ClB$iO?X`j1YY}Laue1 z;}Y;dU>;E$OK!<-@ch-)Lr{5Wwtv?sg7Mbw&P_F8zDKbqp-47BS)@c(La8Wf6#h*x z2DcBGMGkk0tX91Bs}eynNO(WxhLbX-D>>Ameuz6B4eDBq4K^sotxM>woOo(u zGJ}O%lq|aiqcoDtawPtipCo$F^rCk{E^iH>TW>84$|);#>T~pUZjtiSB4y8FdDbGE z!3ZA$u(??AcecwGf6UMD{(a>xx71GPs8{TAR_M9WzN@DLh`lp|*i^q!Wuw!l!px%a zzZ9TD&43PRDUWF-lV)`^d0%I(#utY4a#Ts)$!fX`46sdJvyMbW7HI_!Jj@(>m$MSN zjl@Oa?0(O?m*%%iUXfgsw_p2boO0@(D-%d3Pt#X7Y+o8qd>&F|y<8qUtC5=FG)*Y9 zmS{;Ahe|GgaEe*eT8_{%vnB+pV&P>-b`ru>XLCh1g+a=$X@=Tf0B z9Lg~;DF;9_84XZz2?40Qh=BgRbZ_|){QtoY1-M7IBe z7|Y7ZDyaUACZ!gzu{8WY=Zx9@g)?TL{|C@LD3WPN!cCY9%r&h&N zszK>AZ)#Te+;Ge$EG z#+SWNs0(UtngoVU!LrDc@SYoB+0c8FcY>=(TipGd;yy5zkt_QLA?=prMp>*(J;Vdm z;~dqxaFU{^h8YJ=(PyIYN<)emL6$&cNT(E$40GayqPy>Q{={$0w^$iD1mRPy~5@GWCpeujxj$lB)xjwCj`?jE~ZTsChE&fRB%K^(`4sa|A4Y z(z|V3Xlvs|c8&1uQ;kSp9>38eYSGUPW>J(Oc z1IXZU#!ZU^sX4unlv@*V^9>##_g&H4zSF<@h6}nzY!0=K^&Mhf^D5cqO&O*Nh!-U+ zeyhJ>I6tbr!FWw~ADPv1m2;JB=Vmiqi&&4yq3G8HJ^q;Ng6K%h{ke{%dW3&GOhMAn zX33*5&C=kZ7T-0rz0Y#Br*bbFNT7{)O_ow#t`?mZJZJi{WJX`r3%eO=xfAtxm3MLq z!jc%JH>5g;h5ikbGcITvb64=8RVQz$EK}Ck#)x`Rwv-BN~LGNR@ zMb0wFoc!TPFD>v%CCIE5_Od=(o#*6;=@fr3NjDvs7KS{ag z1ygQK)B$w~*c`(>kZnL)`@G6pfBU16(3`wwcd0X&_5^FL`Oe@2=Bo~!JY6_t)wfw1 z8`*}ukSx3`Id4jiwXDO6b}iz9@j^O!C+qFu;boz2;ri*K?l51@C$m^phf*;O=b;YpD4wTY2C zL>>^zs^bMW>YSM7%$EG7TZ(rnF6r|oo_DGh063Nte^ zGcz-@(@be*W@ct)W@cuFFx+!WxB6C{`m5@6tNThVrDDZ?h=(ohrFd9-j5+7mue*af zkSnK2jr+X|Wh!i`p9i(_IRS|{n@T>Bl7&(vK_#9g!A406zKn9->a?!Wb8Vn8uu-WI zXa%&wTa#X~dSv&A^U8Q1daa}yWH)K}t z<8D9Kgz#L^xw*LkPY%9E?0YD2XbqP>OWFjWMgz*FR*dyS2MzZzRkSEMA|`T2Kn;gy z1U;z_K7! zTqp7?>rjE*E350*(f$Uj8FxRI8*IXi-u$+e;^mTp*(v2c0Jh{$$hMic1xTjfseDxZ~#DivB`k6t% zcIgzqxF>A~ROM!*sp1t^l1^UA31Bgn2g_Fb%DN!@A>rXceL7mQhwVot6S5=uM(N-) z!9tN{1mF?!5t}pmBhsq3g)3ll&~4wy?H*>87V(quLF`odBc!gbx4q9ZBZvSGa#$8Q zGZ$|f>lMx|?dPkh{-@@q!D0wAXHL`{r$bXojib6=<=_Yq<)Xff)q{E3)QQwQ$zKWf zEC6+m23C?fi@|NSAW4(6#**J`L})B4oV8|8r0W4Yro6FqrBV@;|r7s9>5_5la z(%#rOzliOeSqU*chNpa~e`7GYIVWPqWSlIqee(<7o|}L3PEhe7KXxBZ)A%~NI+R|^ zd6ya#G*y5Jb;?-eQ@VZ^M|oRhl0YlRNaA>Su8)ambW5a6#mA4bu7OjInI~7eZk$OC zM0;$i%Wv3B7AlUxdp{+Y;$pNbRGRY9fhD9|;2UuF5t0d@M za)NsYZMldD>3*@SH_sQRp~DB?a%HO4Z0RmcxX1CiC&XOTNfxi#8!VT?w;c?2$X5n2 zw|KmHZMYC=&7(XS(JUk}YvVEr8c4ok><4W9j`8S&b~{p)%v8YXc<{99JpOi6;V9AA z22^gUG0?vEtPt5%g>%4I*Fe6i^xNb3-8&4%;&~HUQ{2Pco1;-FP-&*?MD4CBzFW2~ zoT^<=b*zm#G#GKrZ2Iw#*&l+~BX9_Vh3M?EB;ph;7gIHaB|zvAB>VJs<`E3N(MLOv z0`$-ffSO&6OUO7iWS_dKPhU{u8q<6vxSKjm7zw#gA%pJQI2R_8!?8%Ek{dHTwa$bC zXwnDC4a%Pni4#_^Z(dLYuM-bpmo62wwRMr4cYT~}(Zn+r5;0euS;T6o5u3omzXH7a zjsSzvNs#(ggHZ&7W@tWQH9l6c*zRd#@c#F5IQDB8l(c-eT(~VAX|a6fUy z4JZ5Sy;hMgNxVCh8js17KKI`| z9Cu+qO^#QFLuTc-0vB1^ig+Z$weGD%K0Q@l)Fx8G*RCT+pNDygD!w8JCkY!&z=;j(4~a4ALc6;0at&OfBw=yD53L&{Jy5h<)Ya0BFj0qymcjIic zlU#ct(tnlhBiHVmd{B*!G|6X_eBHFGqS_S1@(fNs;kQ}NXQa47b1BIF>KhFz4I&MO zVvgEY0$Yt)jh8LUTn$AAIxil&O!-JKnSqf7uL))fX$eK9NQ)crCLTI~Tl2LFCAAqm z>t2A5CDeoJ)nOVjnDKUb0Sm{bl-k2iefeR*vt-8EubE9|lTFttNfG&0?J$9R|EWb-Y&dh;|q z>N{CnTvxv3J95c);ihOrk5`aFmO7bOF2XOPggaHML8txg5?mf1=KO4tQ~-Vs)(i^f zW+Sp$unuww{-bW62W%5;`6rtl^)2f+xeXd+;xI;(mD^47p4u?d8^~_Di`vbdyiw+? zz1dl#pZ>-Lrj7MhHTBdTW-0QkvmE;KAb|@B32M11-XPnI5Y69h>G2_C1s!s$1v#h= zXR)9m>*{GXiCg1ol*r+0(g|}TPHiBlU+US{o&`9$AjjGrTwYF(wPIk#&)L@#`XA%4tp9 zicceh+S;Pds@kgNqPoDU#;WGdRaj#%2ySQ8)+F8-0&vQpI5Fw0XpJIuO9Jf-x(cEJ z^3{GFq(ws$)U?~05g%2BSGpTw5|TCO14b5Alli<>FA3g^Ie%sGB*n_?6vU2KL)?O+ zj13^XniY@Lt!i3_Kf!M;1CkZb)lFq9{r8V5&R)^?9N1;}V(>2#&S1W!pxk+sQYU*L zX$3rHE9o-`kZ! zGJ+^ZxN73kcB_k%9;{JkoQrXF@zPdbdxhSHHYC*9?lXflf622-4pK;)h26> zuL(Sv*jJQcJ^V2fCP^tW8WJY$5~RlyC2;L;bI=;a#y`w=TF@S$gI&`?9v7uW`ilx@gjx^G{7E!=PH`;dg zpNEsy3arFG5&`}BlS7HY_Ueg9!|4Es#SkYl5QPEh(h!Y)Zzcq`(T^xV(mGtT^EAO7 zX!QfxN7S?u(T_2d_wcp9O zE|w=9>q)kE3!;ig>bWX-33|lFt%G*w6J*u{>0^!WQux#p=Y!(kj=v2TV7$PFRWT0~B#YR`G7_gNgrW#GQuT>W zl&4?z8%)v08vR}5{e*B}-bu#wJ$iwDk9dBh2fZg2i5bg<9iJ$RO<&Ht>QX{GRw;uG zTai}fd}7@Y%)6Gd<})cJYlUDcrm`G)?fSF!&wUpIh_I^<&a)f0x->mBo9a27Olua_ zzz0@k9*9@LwXb0=NIn%9;M4<9Y5my`vkE7^oiCWTi$OWjftd6-R%mt!r-9w<6Q!-R zsies!$LGZBM|D6q++4E?H}R{np3rsuIxhztH@PgQorj;_ohw`*Uko@mdBuC>dxa1V z?bsW#G2onh3+_9V{jts$^;7IlaGG>$D`;7BF)KH$KWxFpE)-h(>N@jmyV)h8hoF}b zwlp~gIY-nhfqn#CY<1#g&`_t}cHWD2wQpIA-WIBhdZd^;3@jlx^5s_G`8&OG?aid8 z*pgK{0L=g~uPTK=%6cyiQdNXq`&g-iB08v|Vz_KLh1pbG>X<{8Gtld(l5^`tWs_`g zbJ)N5X1O?7j)dc|ShYWyh9?K%rp(QP)iI<=3@IE}pXIu&@2((y<9k>JQy$nR6yU2U z!GwDWZ>k*VS;M%ohB4Wkzin|*wr=;a8nXgcj%Q{=L?Xht(iimPGHImbn;AvZ38i5X z3BY_`x8cf>OrjXoS}GMsT=|Hwcph#QI*E4`<4MYXAYZggY{907bcF|WZ)nWY?Vb_+ z7=po(Wf+vDEF?MhrElcb=bd@UD-TB9=AcU=^B51qu6r}&cNXRftr!zaQ~NfL#Ll?a zU<1ka61TwoNa{fjcZp%u(%^Nj$ce2S>%>!Gu6copomW#Chic+@Q#j_Jhe6qL7Znw! zeK4J-tOuoy2b?&kk&)7ZDy^6+S&@AAq^-@OdGRABw1bN!3Cg zZo=%B!LFU8%1q-6%oD9_h3>c3<2>cxaWybIlVeI$Fr|GJQB}}X#8EG$OGaaTlnNBx zSfn5J@r*s>DbV`^?kR5Nv|Wvk&#O8*It2JliV&Lf08_C}+l3EQAs9@zeeAjry~1?3 zVe~CH86{=xSdKU_Kj5zyc~x{BbUk!^crVT)_|hHnw@pE9$V{n^DV8;>J9K^gq$p^j zap9mE(ce0F9dlDvp(|~NZ&zT#vJ5%c*A9eir@vv?9-ZAQiBQ58W7@RA*&GfqVq}Ap zfT4jXzM^ldfL?)jLXbHEuDN_gKs)3K!i4NtZHz?SBVP7%;z&o`C1}ah(jlxgnR(Hv zFtc}Bz!_!L5}{LzlasYmBGGMxgZ*?M+ToueuCqXt;zJoMZYTXpBO4UjqJMgV&Ha>X zs|t9T)??Vfx#0fWkq?@vJIJ?tIJR+2FC#V+@J3s2F@o?{fSci8 zSuPWR4)AY&X8dOXH!It}E3{!@WB7M58~-2R{`ZA8^bCJ5@nQbk_3z)m!rO{wRz?oe zMlSyXbY&H!6#w&Tn}1E)U}X4D(>9pc{%z&WztZ4;0Nzah19&qq{Ttv-&-~ZB@y`M8 zzj%&+*vkKRyZ;^aX8Lca_t*b|djI=}V*X3&&GPT5H!BMr>pzhKq2}Q^KhVH)m-c=U zMD%;ZFb*Ivqw+tex@Qfu|*X@}}%`admSGwQG-9v-iNljTGqWSN(w zVh0ZB3p52qf*`Rja?%qW9!7%&&`He5p(3I6B4 zwQbwBZM*kG?EZm$uc~h9vLdQ7^GPt|iQ{+LXYC(qZOA39Ep`f>zd28sxtva?8-s{P zdiMhZS6pF>ufv~t?wShb8V%-?P>k{p2zv=&)u*n!^O!yLT_Y>%?-Lcm>?~H#6($qN zFhR~2HS>yo+Q7=r=}Qx*>vbQ`wFNQzD4p_7#Z&I1uH$M@c9q2&*DFLUR{~swYSHRo za^SUlbALgVJoj&%S4wDKkpDL#8$+E(R09=4X(s z`#dix%A#jGOk{Ca*2HiA0>K;5l(q`U5TwzZMPSC=*)gfQ!zOfVc zromxWKMDxf|M@CtBnIz|dTect-&}c$&)U0!X-;PZJOP9F zPK6*vXHKa(QD-vEtq%Y@)2D4n^V$Jzr}pQY97-7q7_SWck%E4SKB;OF0w*}$8+#T(mv-5z&! z9~D@PR?W@uD$#2P&>zeAK!6?5KE$T#TxUv$q64Bd(1a={=kp$I9x6_}5nOMmR{E20 zKik;KbyOLH@4oON;z&4y5|(LBSRBl8#7>!wJK(N-ohKtZC~i6ei1oGmyQHN|q-r9#dsO2*{Saak(aN0@1yb>7ugRQcsJweeFk!gE<66 zk4l2Hf^Sw#(~i3FlEK-4u;^^^wnxU5(wCy?!15}Pq;76VsnZ`2sFrRn_FuoBF|$*& z?Ol_!Kf@vyQi^JgGHItMwPsS4^u1(~WvP135fH%EQ8JSqT3^T2>aV0rVQK8;@1aRf zGzDY4c#qrr;Jy89wsi3lD@%&RX0KBl$M}8aG<_lT{$)KjpQ|*7qUh-4_QEVj9R_y@ zXFzof`*1I}QTVQ5M#w+Tm`V*F9JCt}4M)9Tr!xucYo5^4zw94EWeo_w`#K8AE6lZ+ z9x;wRocW0PtSZSvwI^btXd!7u-4ao&Z>RjSMA{RmCBCc5RNLbM`p3P&9(9`VQ&8dX zbQOg*MTdsT+Cr3^MWhxRMk!PtTWt0|XDCS`LI+m;d;a6u*{$B?+b27OOd1N^u)rrU z$C!M`j_fC@G7AZ5J5BfPuO+c$3Q4ub#${E_-3Sv?J+~T&5j5Ob$Idi%$|#203kM z9Zv_O0OwX1wq}DZx(+k9Zy8n*5eV3Ib{onfIekAsb#a9s=DVjCSm)fb_51W#5;x)g zLsKIKQYP=qK|UGqyQ`fh&#ccPNW}Tb0Sz@|dLnV*5@|ElZ_~NAku+$PoO?0T?}Jg( z@FL8>9fbGK+#2bh+38@fT`t&~Tjc7fDhX*6Im|Z#si_B-*C;DBpCpe37V9CFR~NCa z&D^3cujB%8)pIm7n|SfcS;MFfGA!$4Av=2KH5F-&rltB(VjdPk&5M0_UXC)BFE}5a zlr0Q^%-!^JDti3@Sm(&O9Zjleva^?6HAj)#H1yDz$F$*6yj_s4JqDdGYr~}q(^MRT zxJTw7&9Rf(K-e-VQ)JiAjVS=h(rV=;>ns`TF#k^@TOaVa3(k53D{3vmDdoyiTOHbk>Voo&ZgapvVZ`X;HbJ zQGx)-gQFXB7hbMKW>c?mz8Q5&NWoIu&euX({=UwL>|b8dO)hl|S`Q2>fteX~ZN+Xo zGkkE!wf%J+ZW#|$?|8MEpHmVdn==R65sje`1#vx zR=a+Uf+mg3Rcon@?s!Cs`hvKJ^%jW6n+R<7)!4F|wBD<6@Fa0%YyHIfzA1Phl}!73mwG8&HuI6nWtX;(MD{}SV&ohF}^@b|Ig(~^J^O#=8^{Y zv0(rmWpbd=dBT!xesj^E4#g<2b3b92Il)pSLWn40CJ24vxcqmr+%P)f3lHq?fa+r94otp zVL9c_l%YXvZ+@#VciBm$mFew=df65u*YXNl|Bp$0^@0zgYGcaVI^zDOi(MtYl)DGB zQgr51O^1SQ%fQ^lXIj_HHoZJuJ4%AzrAl57x4jny7Vu?(WnBbHIJ^OkO;(HZgq(2# zKdao7%>KmatScXAKmR7i{(g8#F7@Am&e@<uw?EN^SN3`uMr)O_2`Kh}WoI8%TsXE|HjTCjal**M!tWtY zqz6*_nEfgV<7)sZ6TEGv(COfP+CY`1&k+#BaD;{94Tyq<+mprXd6a>w;Hb@^+3pxI|8ujY+C-r3PCLzRZJ zr29YxXXep+1^k*0Hoip!eLzewWq%mnhnIazz<<>|ih_}q^lvcU^ZG^LZ1s1Ik*$04 zYB*{z61ci}w9@g3GYW2rxYD6#dR$+-c(Fa29o^OUD~Dor4JK+?olT51_1HN9!6z6Tj@K*gBV$GScEc*8&83!dtxZTl z`IsFI-+FZY`mKMm)-^7JJw+X>AH&S}1UL2JB6!GAoMI8ta0X~ptUVt1-Hf~4xa#?# zc84Zo{b+z&hbFJX0LX%jJuWsrk zhhT`fwA~(+6?HG4+o9>_D@vrtbm1jB|LoLY=`pHoykF?)@<73eY#PlH;WNB`47egT zZqVcJ_~;1iR+57>8IzIA(*2`E^l(|u5zz_#0Xp4JbfB5y1B2mJIq5`wOnemKn^NXe zunFmI=I-wj&mbMy;r9Yn9|PW`8ze~QjKq~*JamsZCeM~u-qUC_P72(>LYvB6eddIu z7G2PetKf|PfKQOMIRYb?)_JyfNy=mw37p>n)N{Or+j-86@zZ^<^4VSNp}E!mNd1s( zwBj0lLjYx5nvD~GAZYr#3*vSIEfz`E!zl1BfU0Qt1p^lZe^!8L+d=@M+Ixoc>8Jf1 zeR7!cwjuPgP(7JLDXdGYI59E#;w6jMzynRV&93o-S9VG^_R#k**#@mQb>r~AcM7`~ z5`;*D;G0L!msqvbQwb7=khRj#-r_~2^Eekee>Jh8r?8Lv( zu_SLgTh|b&VK=_MzjK+a#VyO2mU=|$Fo1<~t>a?MPK8}>X8Qp5wuS!6YNF)Mm|7?X zR2iUPFiUrzg5$ZN>xG4}4M)rRDOm=d!{1X0MAr#L;z!WceNqbX(lV%TSzoU^2G0q-{p`Y4@NL5UCjw^`Ow;Xx4{P3|}D^ z>;%w1B7)zk_Z%nD(%tFuzKMI?Sh(RwXmE&PcFRhQ{{7=Cj>6eM>){iiEGfl8i~S9` zbs>AtOSPuMJqlO4kc4H5xAF2c>7!7?UJPKT;iF*Els1*y9craA{`5(`^23Z{^grqUWf5LVs9GHl z?=YtyCPu*BLK9zpv=trZl}sdLqA>|cpHOR>UB4mw5pORCi0pHG>_~)y=HKaC)F>)T_q_F`V`an~?fx>}9d4eRXXClcnEt z?KR$3sxA9RW^$S*HQ3L=8)ot-%iE27K?&&N$NR2RdoWj>jS;&;il!fKmJuT1=}oXd zoh8{U{Fiw0{R7UWPc1OQe4W*}=@_R?Z#P6@W8`B}u6ebsK}5ZB-nZ@!l!z0_Rzk&= z;IJ=6x=oihMS={ZyO3Gkr?){D0lrSONHKkf$EKzTFl z(b5$c#`?ems2vjEa?6>Stw|p7;c9O1vU%_nDK1dDTEzHy1j7onqf2U~SJuFg^FC?7 zlO6YBAriL^9J8=)2x`lpHfz-25BWEGORiJRmpgmQJjr0bUI9GNzY`3kKZ$dS=Q=V% zEI$}+fnb~B3y|(Nij^Kj%w!GS*p`WL_5~U&DLBaqt!loQzD77FNU}L2hO{~Y2M%~& zowUxJh@12fjAj2MM$&B0rA&TG7ZXS;6JR7HY=rmyJd-#WIg)AP2MsaZ$XAR)=~I*j&4$ zhy(GuHX1MN1hmINk8oGUlyi5Dy`@`OR{8!e6GhvF?;t8S;uO79P6_o6ECkhU3OQ8bYfXVZF`;hI7Kz-xd%I1`~W=df0uF6Uo+Zfz%~77DqY&<^VdN z^+`Yny@U!F3l1XBZdT> zR2G%!yDi*x?oTGM72eZ+Ne7@7VlkQa~X!HcZsNwVCTI$r%nrL7jyUhtCt{vRAn{{${9@ z2dptmtcl;I*x4QYblz#+19RWlNozgMqmMwdlQR#{E}h^mm1NyUe6}mtn}%EaCcBS0 zh~={V=L)_$c+LvD905Mfb^WZkyH@o{AL-Lg%z^mMjwk8hql{hryAm>Vx}wac*lnJp zS?AX77>&IfyS2PFdBbK2oO|@=)+q(cLu)<^>}9FHtI<>gqS0O@#B(A!$;%w(;f`D$ zZje}1ZU{$6FZq+&UlAptBszlIxbr1BA!^}JnQRhm$`DO#<_RCrj$x3LKjvj$qxq>d z?nVA@w;@*8Njp;d;VndCh@@pR%)l^^rhLsy@*E{OX<9!1U>FNWYDkY+nfN{t51PFp z6(XCg2JiLjqThAh#_mJWCD}JuJ71?A_$0f_Z61I!Kk!E?;YP^83j`9*d)0fbCrvOH z(ku0iEb<$xM_6*4hr@7dwl+Rbg-5XIWeaVbTU~0G$M-*><#srRC@Fy1u*6x9_?>RO zRyA_gY>FBCI?s{J@ksmo^bP_4*iR$`DDv@Q%MS(_ID)S;@q(OJ4m!*~%`uqKUI0h= zk{M5(ELQNLX53JyIE`@LS5a3W4U9!l7ovf#gjH0@-Ad~4=Tr^BP=4cA7S$5$uZzO-Zv@p+A~JMk!|!LQ0t@4>gvLzhuQ~Md@4EL_ zR;^0QFWR5`xPO7a8aBUi_lvNAO3E8LUOt30mtHh0j@;Xk-)c~fZQTavUR}0 z`#w7A$QVcrQF;9HJs3>V6lU!H%khuGQvF_fQ+3*ZE~TudjGB8>WDNmlEt*6K&z}?X z@(F1mu`Kv$={n0tmK*?N(dUpMOsO%_TT{|=5*1}zSP+ki)b#jgLbj#VK z93lEWu;Dd*CULz`re#reJPF5Ji(w#cvJRqY%|;?nk3AQ$K?yu)P;!(y5*XXJ#^8sJ zH-CVhu1bv~ECu{c&qjzjg=%JRBk|)pmKAC}=wfqm%E)`4#K`k_5F1)Z`bi^nncPUp zsywEiaf(?zatNwCqD13#y$8$Y;$@e_VY~&!lN5*#G-;c^fYS1wqUym z_$ly(NW?#p2t_VPG1tdIJILl7oq{8SonJSQFB zLbZP*E0-%uBaB5R0EV)SE9&xB&A0k^YNZB4FwTcPY`df8lRv?fquYb3j2mGdTyBE! z1Q>`DdF;o@oaowUgH?(qYO(4-QBPIeJdS!L^}jt5OOe-g?1r{=~A5~ZVg=C1o)+g6zQoDp%+b@ z(+^zkgb7G`L&cV#4T?oa5z`=SpLDTRw*zl07ikW|)%|ObDbsaR!V6lU8c1DIky0P*zreR7_$V|G5>?0m<;fr7=H!6a0l8tl=4! z@2#mQv(Cl2Yqf!meAe-k&y*VpWVIV{*QHTQ{U{5XZc9HwR04m|6y+fHR`Z^Y+_{a+ zWrXsqvFJ>kcDx#;eKmQ>`4i`iKWw{#AOMZ30&E0Ezdfh-N_n zgNwH1hjSZ#eCvUuNTTlen>JSQCSByFg6fVrI?kz*>Ln7nH{+@1p|qN|VsoL*5AU4M z$iu(eqr~;e7TY$PhSQh}(F9(qE1!I_-(BonG%MfqnNC;0L)e_1&%XQ2x9<+|hY*ov z*}eyU6h9x$CJX<~ZO|!6s;AT<*Q(s^qQ`O8W{Pj1eSm9(YpLh`N8<}6)OQL}f zme^(&+HSl zjIEOO9PyZM!R8fPjBQr0&__eoRnD>#*7wqu`MXSTi~$tb?}{z|Wab)a zb43|1yrH}uCw{@@?_k&9HgMxd`??Y*H3z*gkxyL`$ zgc@bQC4Y-!5XjB)DpqVJPO)*4wOQxzev4Bk{Rk!DVtF!{__qlD*e2)n$;~>j;0@*H z7DqU-j<>Xv9F$TI>OSIWZ~#BipLZMwFGKUdLKRY%4J7`#ioM5+YY0JfTxW=RXsO{N zu8Dx3BG%L6u|nGK4ww(1rV42U0>jxq3V(8pi}YL=g5#}h7_}>`eyF=S;Wl4(9kTl{ zd>OE`s9@xbzRa^a)`PsgYNtn9|G2ooY-0RdT$5V%FB41SKTS1BU4eUV2l+YA)l}fpY=4AcZY^>@l8}rLHvl@Q1Gqgt zOL~#wphjBGR4SE{<0?hTOe#x9(3kZ5Xf@3&u-i`~lgC=tPA#LkQ`T=w7BeBUO--6C zbPZnpWQN;s^PDp4q}6Dk5u5~waR1y2`(CRdE9RT79NJj+Ru3hmqu3leUi{ZvqTSgb zAV;I+p)OZa|9H@_RFX*@Vy$xS>rY(CRYGXn>*(cRwCXRPXeMGt!{ax&@SrEOvX#p* z$6D#q>Hn-QcinD~wjfm>I>@Il!Z&_?&wgJwk-t=k=B#0$7|g?k(Vngh73d{}kT10+ z;9wRv4c8ry%Ez(Ry~i|Ch$l{!Nug%wb;=~XStj0_n&pOWBSIIKMQLqf+nGDl(Mvo6Pc3WZbb9A zf4xJTZXSR?Op3~+FflB9Nt`_8YCE<^!$UbNi z1HkH44Dq$g?|=oWjLl3gd_OPhr7r97O8fn5?MS)_FsR%+Ag{uVghg zLs=zh!i`W_87wl8wFO&UIEfmobkzRfKqHJPl~zE3Vce4pxgV8=XjNJ6uxVOr3s9(U zXiC@w(D1ev-T)a$50p3B9wzhi+F;x6c@(7e`iT{&gDycY7o?ee)^T#7+J=Cw59~BL z+rvx=C&NJv6|1l>xT@gUD;2jzw@p!|_ZZscJVh@SN)heUty2k!Pz1b|jjJWcRXp4P z+Qs?JD3H{PwBKIGxz?~c>QMGLhPxk<;BQyN_;a7(VqKQZlb4g($$HgwHEG-=%V%P2b^G>pue>u7*6PK~uy> zGhFqo+N*KqS2#{z=c+x{^psSqzL<#pZfnV0%EKUs-wmg7;Ecxluk*6-YVXv(Mec=m zqxVJ8;xWY~^pmcEk0oCyZnKlX-MRcldn{K$45_a*%8Sw|bP!;x5?>!c!JDbi?`!~k zmepqmi5!3f&QAQ2{FX-HV)^{)rE)Q{@@=jhoI%^fD@ki$HpY#)SLXV$MTOl3MG4nKYiMl?a12|)@Hf@$5XAeUiU`Gwqy?>zKrMpC zL=M#yNH`hqLb0JlhP=&KXs`^IxWV-2&m?63c@T~u8F5=cN z#zculGOSO7`wjhRB)#|ub zoGe>TV_6Fq?S7ypjF)oU_kTFP+v>x_p3@mhubyPq`Z-Q*np8o~6{W;WkVn2Hxf&N7 z{1c`hJf?zk`$9EDe68-HuelKns0-!>7ZT43aV-?fg6j>emG(8k31qPqQCWD*! zkj@HQ+TPCsod8pEhejCrpk5%k>&EKRj>DgY?!eyX5#^&~@t~1J3TNi|xn`#tu*$u~ zhV*7{u><__3nia8*cfab$^QyF22S%?#Wb`lighaaR(^hm(~2~JS{OShGl?9H&mMn?g(?V#=C}Sn0=<225p=zOf+>7W zT(%Wm__1(0?{+4?OnPzAjcJe0ml#SOomIY@0sW-m#LkVlOyh- zIhm%hcgSzuWs~wFUXw%eQ$r{FI9%^k%Sp|1Z<1qxNTHaKG+<2=HFFmq7nf_*gK{U6 zM{r607*8nYsXi{Y9$}%_y}1~EL^K0eYLxcfd`h@ibGRZWz{^D;!{;MEoKFA44{5~!aXPz;qIup98!6wB)Us1mO;pY4LIR%^wjTZ-{ z7a$SbNCqUKgpd2A>GfYdNWDb~CoiabzM^A5H>T}W&{iyx9<2z;cM1@xlW}m7^UH?A zGJnm3U;!lXObkP)pTm;@*qhlv$JJm*aLZVsVfZw2asp4m@ffXSLhuO81c)LO z+k!X<`82T)+GGp)pG2gQl^>SR{G;fXUbtk}SFWHDl3CodH=446iuh+yFpCfFy!XeTYpy}C5wQ7@mFPaxhd`HQ0Qr1F%R zB2HJY97tM|c+C+EsjMYv8XV82xZMOVp%~fX!}J06m6`|qK@66*!`%_au6=}!2PDR& zxF#8D@}@_2;v-eZEH>IJ#QzX<)n)T9Vq$$bdh~zQxX4~ZNTz7Dk7;dMBMHN#MQm&U zsnqoo@TM3KF<9CvhLY*Usg#I9MB&H2y|5?qE(Ud*d55KlvDmmrT>yH)g^gB-N<;f3 zn}}S?yo@|eEfv;2-I8lsCCw&oG7b|(0InJe!>!gbW0~9;h*~BI-Df~Ru+G-Jy#)oi zTj9r(QR>6>A7p_YG;bXxl2ZjUG*HDVEg3RP02&C5k^Gi(IH?3SUd>zZFJ&e0ZZJ83^YB?Ty6jC_3ZsfLifj+r8 z*N^!;svLV@>c{>W$;aC!XG{qOVZKS5l!AgN{6}sD5q~7bNET zMrGC_&L|9hGZo477|PUt5%Op5>b21Xcn%D0>N&IhEtfM1Le%m?aq|YwvLY1r3bdNC zI0P1VAQmLyrQaF6{W-%Ie9QFD=Tx#7t2C>mI32DuMW+#g+}HME8)w*!FkgkEq=f{KC?1(J4pZ1~?lD?LICl>;+V_EJqlXpv7ZYp5D+rdda+>gBkiFYg=q?eNfOx zc25YC)eZEPonG?VS2Q_a&d%rimVOW6(cz{SZ!tL9zMOYW%k|i$M&Nh*4u*mJFj?tH-gL`be@ z(R(S?v~u^Q-`5fnr0bJspccZl)pCB;jen5dJ5oO`@`agae0~@>+(t73q?cLH z{~uoR;LyN>y%#0WuM7P7uRb5@FSE<(KX($aJpuA$V4#27lKqmuy+=$xSz+%8+o=Bk zU>8BZRt+C}SG0W~86IsGsHT9*yJ;?#nU z1?sV7|7~A9_HJ5z8T(-F^~NH6=KXhc20r*(*b}2#->&;rZw^w4)qX|WTs{adglKEl zmeDhEi6nlk^2mG)qR>_#VSh+74D)a%^d5UEX+32yza z00vuf1V$zYCUdlFEjIco?v%;X1(TBKb&jetE=2Z(%03_(79x8j!1Rk5U!CRmv&xIt z`bp{?NAwqs=8*?qC|U!ue(hG))YWMUtP69vb!6I&o zw|Mez<(*_DFuU+uX`Mu?T*0`bBr)0}Ynb0q!_>O}hg=O+L&#?L)|*M8UX4ygl~z*w zRvpVf;{#K>9lIx*Xm8dCT1yBjJ)%m!?9PWK)^1UiKj~gQPzE&dKho|o73`5*Lv!-1 z-=C`GVV0RyOD|Hk(&nw5!vT&k!dYhP^RQkuUG0~&sHgbt?3`m!4pJ7wwX4yP4sWLy z{w~pN(O56CX=YxrNaATuUsIjN7@>k-Md1iK*8^W3t4ne|N4)Q)w`QUC3x5=c(4$qK z)E6W=-$oG&JQJaPOCi9Nb$vVOP4x(LHAb}rPmLDy<7&;C z!Szle(_O=+I*+8fi-Y(rE!A;9hbD+l=#@i`xV%(nt5qxeuqL*lw)YJwS&~2_`aeFY zrDZTb`!l)e;WgANojeAroI--ZTo%+ThUfl6o7^v7gJ1>K=$a3fpY6 zw|eP4qwKLYIk%yQ*+mo}d3sK#iGFh3a{<4miz;Vv75B4rLoa;*Vm@%uG`2IQ8aX4g zI-V?JtLqQ;Q*HmVl&jflu(Gq>=!MuGzv8Acp*%eAhol`~J3aGvbey=RMWbAb7ikaS zMQPQ@xbx|j*{>hRc0Pu+-*&dUDHVu|z)kto3Iomm;crVj5e@|}9a9Cl@-_!^Ip69d zxHGz<3V?a1pxkl)v@8$BB?#l7HFiB+v6WGymotCV4ZIS}WvsgJ$?N>%3(+yt?;>E& zAUjEV4?NO=dy;_pYO_B2=BtUtm$lTs`2HK#-3nCiBD3)y7ipnnfoA*vhL5IkVcWN? z^MB_vd+{{w<|m71+5sYTf1vd+fKY=Lop#Op-z^SN8)lKQ7E_v7qvyEwh_0+vBrFH> z;aHm?>7ZmnMkTFHE@G6F-YcOrW+zuRFH7vcX1aPh&Ki$#%Po7H)<~6uR7^IecSq3_ ziFTtA5P?;ltFG5X!S516MC|Q)8?wYAo*$tNF@;8I<4fFT@SRQa z{cjP_tH4#*V!BG&YaNt?iLT^XgCJ=9%M$)#bR$TQCY6>r8VXMn;R)%Prj+ZD^@`Ac zHNEJ(WX>67Cm%ttFKZcy`8=na0s@SE-JYwS4g<2dwvMZzWG&S)A&7<+B(zby(VqiQ~W&S zEew82$mLVRubB0X>2qnKPd)OEp8d^fv1FnrR=~>6P!FvN4!ywa|eIVB^}qoA1aqYt6J}LMh(o_z!fC&6#c7s6KzKQC0_>AT?xh?>$QI zMdxR2$wqHHOs!|oiV?u0lLRy79iTC0TRHw(-)0uiH0{n&Ldg+*AVSA7)2A4g?iH$C zekt0?Yf8kP{wcArzimGGo{6|q=XME&i8p^9w{E+I&}NRx(gB2kMRLPa&Sv$H%lI>n zE5_>=w${0hCOs>svZJR7^sW%1;pEh)DLr47YfbT`vS~8t$-?D;_&1+xJyZ-$jk+v$P{Nxb%c5!9 z>ncjlagzT_6rlEsPQR_Fpvk1v+lk9-s`dl~*tqC@FgcegS5xFv1NruIs=MWc)sjzW zyZSiH?pdT_fZbSD-I_krzx_0zuj2z}o!}c-Aspg(?^)_`Ir((sXlLrYdhPhZsVg#z z8NST@=$s@^!@loH{M==bX;RrP@(WsB&MD$?D)9YsL*=_(Qaav#mg9naS=3(>j$Al) z!oF1}Irriq6`LlGJ8G7-{ApyyrEjDB(I{%|cMURIqtK_&zcpj%0dGYyxq@MyhqQ}t zzb6FtO<~F|Gq20aVmh1~Gy$XvUWa}v#+?j**f@9B;|U-~!YzV4^ZiLAMveT!!8j9{ z=O9aj;vKa72klbSAC-sELUB@11yI{r<|;}c*0HkLg`fzo=XBLrO^#-5>`}usYCiT$ zEMVZ5=XY7U8|%%R8#Mw>ytbv*HGv>Nso(v;*mck%Pjo$|kBUM{imx3Q4N%iG&yv;S z&qZv7-*;n9RccOtn`NYw*lQ1Z?$N3o44_;eGo;^pPMtF*lu%@h7VM(rDqutKa-Ob& z*<*|VmMnk`G=Z0x} zd}$TS+oM;#BdQo)XmRMY-aK^oY~25cYhC{mJfK#7ca+qh&G*L6%h3=MD^;a@0TMw7 z42C-mC#U~FIN+gqRuKIn&o1;@UAPnX6;P`A6&|&n*)9<)@x(K?cxuJ(uw=qZD0LM zMPtnjLWxLQ2V9A{77d;;a39;%qoOiNoL%35UX_t1I(k6c zt$b=|{PJEYa%bGQs1np&F1{BV*CK*SXL7nUB&f1qKqQ~o8!rmg!|s?nxg1RYke|1| zyG&n%DeX@o;6@ll79@IgcxV&i?Vh z(C2K7{a?wW=_w4AVL#X(kZaD?9he63{yKS~uAZ41h?I>#u+=!JFLp0-(l@Dw-5AAb zLs(4BWo+CwOV@7w=_E7J!9~5+GG}IX$6A`l$+A)ZWC#a_+nEL0D;+^ACzV1lmn&EP zIm@N*AFwKdeKXzxlCpN6p|dyk|9spyFcfjiohoox2G!3vf$q+DX_23Lcx|CZsB9mR zssufNhy0UV5`%Js9TY4VtnCq*v7C#IW@$L&R={Yudd7q+?);nH46ql;4%g>Vrwg)} z11p;X$)J$l%ZU5S_-p207Xh0zKe`Ov%<&>~_eOsUeWA5{mtDb!x zxp7+I9{J;uwmbXw1Sb<}e&DbA-8dzIO67RGJnui^6<&+f=(KR#6FIIo zPG*^B+=R#UcruGn*Yzbf+VeaL)kkx%Q~N3$r{^3|XjW`OMPaQeH9qZ9q;<04iqmxD zy=NE0RC3E5OZM!`+#vDEV8CK`27Wo`s-Y#%LMN0wrPxue_#*2~Q~w6+bg1*Vg_@<} zFESV*CZ|uak9CBY_&#!I>M5ZT#s$-n-b|W2e>AHDgGHXB^|`2_TWqoko2GG2G8sNR zd#RzSW*xiEYv(ePhO&_PwsY!RjAt8mn!QI!>)yyG9W>mMSJw7vE{>4<|i5Qf4>`s%r0pBzTpWR-yd8A?k_eTvlc#J z;tK6ce2s^oahV^(sn%Mp=RuX2o-xh&1Yp=D?#T9;PVR-C<*ksZ7m%V-?53S~bBe3+ ze~kibKa%KUm_7u%1xO{Sq9CJu_+G(htA^#@@GE5FInHIx9Q)#Qi-}apON6-kOj}n| ziqQ|!(=Y0PHFh?;*D@tYZnLg5!49l2RtE$@wug8H+-x7kaDbtsi8@DY_ z4giU{>l~YusNNt}rF^z?yjMxa8|j#n3~g8@j?&)xejmjGzWy(u*_wqvzCPbtD4k;HId%v2ONM{=TPIJU% zai{1~f}zLXFvA>zC9vj5oR6CG5@$lGvp#=3;T(=v$=a;G2Q4DRZq_<{w3gxYNc-A5 z&^viqwa)P+BGohBsQ(jc^FVv{!6LVl-eppvU{HC-tNj8F2Od}stjuJ7^4Idi_8n5j znVd(%Mj<9-?994z*}0DQR^+M{uYMH4Y;+_B zD+!{s^nvV~-YbYW8cCP__%dO>Bofo)iKYC&D6xb%{Cn0mYE|+=^GZSAaxw;Vysva2GX;*q-r!v#{Nz9nV=8$L-6x3OG}Eca0CzC) z#t<&pX}^nPw+56Ejv*rEph}){(LnjHac34Nfnt{kLGcRI-wE)550AC1WiZm|$Wy#I0uhb6;1yc3s>ButhB41a@EjzH zCAE!k4ZI5m32MU1xduIqQK zxKmQzhWJ^OGw$Y6)J0;wAL>yYTqAEY0xt)g`|$fyiXm37G==NEJ6^};0-q*uZo>^1 zxbpAXIMymsqeP)2T2NIyvxe3~Qw|&0F>YHXK=CzB2ti;5N z56cD{3=Hxh@IF9P&BNDJr$|ZBKw39)?gx5CT3v15&ZfKNu?Q>=iDRn~ylM9Aths(2 z9#Q-IcBtM?!Wt#l4(M+m(yQlw0*+7CXWr}*?6g^)vG-jblxS?!Hav68mXt!T%hABp zBiHujJQa6d6HZ%sd?9LH8_s|4J&vhAZpPHk6W!HZ1=j_}@1k#(ksQ!5nks#G!O#15 z4<0lCl@8=={1mQze2+<_xu3!jKJ{14VWdl~)WOv-l$*J3j+LSHFKMAv+;dAb6EFx* z4JB8?P>wHr`l8t4DnmY#|BV0Ot9aALFg{CMIx3W9TvsVvSBqY8IFBR&J(Wmlp^Sh& za+w+M_$k@!iRaGJ&5=K=xe+6K+UizOOlb@QxHNo(na^-1e$p-^n$n3fpN2VcKbr0s zVfa0!U#*dycd!S_n8L4OOam5AU}Brmsc~Q@X0roKlg9QSD4f*Bu@8B0S>({F+z}KI zY(+7wZY4OtP@TY!JAXg5Rc|MjS#0Dm*_oHPl`8lY>B%S^T*14r^7K`tM4QB|{%)*N zDgzP2oT{E2ZX_iujo>R3+KU72%;6NcdER^WgUu!?O&^@q&Fsc@gJ8J^v3-Ijfrm<_ z&Ie!&CG}(53i3~2%dXx&#j`W2x>(L&f=v6DAdA%0pXB4zn{q%VL6VG9GSv#$Lmr?g z2SGc!pz4<7u8D3+P-+# zq$A-XaVlh4=pjvntZXpz!kqCm7B!_`ViT`rkQ!oEFlm@7733Ou6wojxvogsWpL#Cv z3Qd7Y3bz4L^9+9qOFF~xG5;RRe9Z&SK|9`oK9NuPX)w%e_OXE#{W6X zm+2p8`Tl>U!_oiNE=ddw|BvPp|MTJhk1k0}|2&eI>3@tQW?}n>E=lbFc9$fke>szw z>7Qm2(=*WhJ41;ZJfOWa2U4%bGYCiGsIkS9wql*4P+o}FYO&Wsv57f+hDlgLGy3se zLTWPl-TC-j5P^wenyG)#$tjHH)jJ`PP0jY!2$mpaizn-#lC8M>0$zDk$&n;)vQA6D zG$R*k{bE!QsJ+;{=;+eM{^&}5F`0bIV!ZQabTmSefEd9?62d!Or4$_uVK&8QszMOR zv~04CkJR;XrMVq~q<5*nU9&SD*f5O#5vR-_QexD1c(#~sQkf+hG7lMoDJr^{`8pE0 zMbz(zV8vwno4}KjQp6qjUk-Nkwgq_BgGH^O1#@Oc$Mwac4%)HYYk>tMLSaM1Y? zn=DH}z0+cUbcQ$HGK;X^QnbZ`s?%BXl;{I?6hA?8s4*gHqD}v(Nxl>H{Yg+X^pooq z3BiKs>m=AjfrKw)|Le&RFUv8tc0304cI#>6)7PBJpuWFN3{oMwI>-$|oS5NR*#WI; zN)pfm(H=P{$|&Z$7@t>~c^}!icq$G`m2c!=IyCRAP!rGnqX{LdjD7X>AYfoMDf0a1NRHm3rV7x`Dy7q{kR}cGhvCS z0&P6Pyi6?mt9FiTJAMPaD-Ee?Y}+tny-GxARmMxxezL;N{MmJ)=13k>It2_iol=2H zoVpPXWcIlcmkG8;# zJ{{yvicP%B-tlvish$#H4PoU~$>cfGle2s0h(+gKSaDF|*qe52A^{o_LAOm#dPUkh z9b7_FGGX||Ikt{pJ^`0Sq9<+Vq5@rRvCnPuuk(>YzFMS%lK2NkKvegJK3N3d!~E+X zG(W?qpV*lqj@}5`QmoN10(o{6c0BZ}u0yU1n-#n$R#M&tPYdS*N{$q53w!_^K%Q_4 z5*A{#BCT04F_|eXRWZSO55fD^xA+e;E*>Z!1Rd!-LS2$sxl?mZW^w8(@d9<%$~)?@ zVWn=-&kD1#?SWXL_n-6CK-AaL4 zBR6HPis0vTXSSw!>B9h^YK)q_EP6b+M!W{L)vkd)JDk0Dy_mh22A$1nT0pd3QeLBc zFmQYRQd*QI^dYkZLR34YT#hSrqILfvk$t%w>QKOg8Nr0a~L6PU^)d+eOAfKTMS zFBWbYUuoU~I~|ol|Kl5rM!bj&!?QhO{*p zLj5yeL1!wjq_+&#q+Nxk+Xqd%ufQ+g?Cay4r=NDj;b&UzXn- z&n5R=gnX%Au!)Q@&8a&ACweWOQC$4qF}e20b`PS`Zoa#jqvh8BtVpIO?11Zh`Gz!NcuxF$iM(qCnY+s)bmh}8j_IMz z-xv$mnjrT|YC!_$LD~MnAaq!9JQcq$?ja)PUq)9;H-}+9d%=J8%V8Oul04MQF@Ye+LAO+6D(F-s1fySbYWH`3&<%;g2VF_ zEwYtcl(~L40HBSz^@RE7Zo{!FG}kCDnn^{OX|J)$h!|v6vnE=fTsuc-Sd@+=5M!=b z?bicuEhAH_iMa=%2x%1k9I4G!)u^dr%td+Oc%U)!=VhpsIn(6$aY7}Z(355n=~Dhs zF%wdy9S__Nd9uxvRwKx0kKrEw$+pkpUivz`f5GTdOM*JAex%7->%oU40_F@S`mH@v zqbKSKikG&xxz12;>ZO6W*C^jEz8sB|^l5nYvjF61iJ}z?>o@HB*t>Sk2#wrUWwe3* z5A2z?Dqe}#91(8>ZKO7>#qmy;t-+Bo!<3j^@kpvRnN%7Y75Kua_}vh$72a*ddb?0t zyL`vRgm5XEwoATP3N&psMMZ97*L+dOQ4(VY_QgBKyrWaMDApy%jo2kY-QyWAN|vAq1h&+iy*< zjbQYLVYySM){GSD0sbsCPI%f$BWZEwxnLjx7~v<(qLYjJ71Nd^lZzQ`+=l^gJblqE z?iwm9EmcNSQ;}9y3ud2R1s+V=TW#x0ZB7e*Sg8@lgN;pJ{tB%=n=P$UGGiA%e@Lj2 z3`v0MK+9@*SJvqK9G(&4?G(8jIWv(`w-c_+aY#0a)=o$YKox%Bv`rJwoW0r|IchR) zEolIwp_=N-_TqnXAo=d3MrGLXQAR>ajppJl&Np^rX~NqsQ1{A=Id$|}bZ1QoTx$~k zQsXCfluuLaJJ;6@GE&3g*ZKox59?Gd{{uV~mXI~j`iou_2KJSM_%;&5ctXaKP-dQ$%XBWXedw2X z!`S5&yi9TI)(WAsR_`A^EwPP@dW=Qy#M6A&pN0f?%F#1UP#ghn5_qV2I|+Ez26f_G z!s7BOSChTnh;Jv;yNo%+kI{nR7p4M4SR6>R^14NA$icY&yVm!N>TI{E7I;~R>RkTu zA)M|)&$?i^GXB;Uk8rVRSl?yB<@~ocH-+k&{f8<4ZxRCi3BEMd-0ABl3sWd}BW2 z>;`iNOo5AfP%5kP1ncc>?$!?v*htF3U$XfFw_q7i8r~D*-S;v!dY)mfDc~lauc2GfCZckAb*)J zyg&5qfv4TnHwzRkiw``3MA*suv6+sK*DdOci*GglV;4Tq7Kyi{NVSZ*(LrTOiv2r# zSl#BzWyZ}U8Lg+T3J>{LKF^xY?!y={|5pclQAZYqFZmafUF%`q>$$@MRp1%DYAJf^ zEu^Fip#)MXN~*wus(LQiMkiGV&yX}Zl2E`*f^j33fv)M69(-|_X>3{c_{k_OTp76`a6U>`?_sr@Co@kJsQB= zQ3QMHUBM}OqkyyfK`|HA&;k95om!!Td|xi?y6PZ3_7%Lo#$a%elWbsoXK)KU0$c|g zk3R2?T_c+&nUQ36XXPG8Lv`t*qK2}@1#tsTh@Zkq0rO^datxmz7_ja$u=>1jrbSg5 zZK|>^;(e%d-KbZ6{!d8_zl@58iAu63)mIplI{72gRF0nzph3q!(2Jzk)gyVb`o14+ zZ_aR;$_P3t#$QtAm&9iC+Zd)+&8HlViU!)vlmP6Shg?tY)_A8GyIQRbkFdGF;=Hm@ zzsBM?d!x0z9}GEuANwb*rX?}Hq~oqHDk!ei`i!)mT4>naXPNU$JIp-iMMv4X?;~u0 zlh_$tF|%!R)(wY)Lkce&YoalDkKV?dFe)yTuBt^XkgQ-&YN>AS+^^&RKrM*+QO48o za(|R4Y z%bA>3)@7l^fTl-zU+2M&Z~X@H}bWz5V z`ndvXAwqRtjw8LJGzKt;TjybgdaBi)vLD_LSuw~TbyK@cM$qhsdNO}}VWAw-KBlIq zbZp#A@YdWoTj7OY-L!RYdWg@)Lz`}0`QDqciUo}TQn(`FBO{MpmUxDNapn}u7|-F8 z-Iy~ICoa#!u(4_+PTJnsLaZIGRK-2rq(ys|u=FG}_aOGNvGKYQJUe2~+?H1Yw{O56 zT5rO3uf&X&%-R_A8!Oy6$XbQaxuLSPRf9j(@>aw}R7M1p95Is4_P2;qRu_FP3#;&^ zMm3%hm7Jsn26SZurQxW(FrI{({;1|alEXk^MI1V6x{W5{^xi7HNmlh$gXJUPtO~mr8u$@baUGrgg(^aEzUc`5Lhi%-B zOkS_)-!>29(1W6US?FN^|n68&$UUE=8zt5WiBD;;*F8jL8|DG#*~> zLKP05+9D65VZsPK%R^96S}Z6iPt+!Fu#)AdERl$@=q9+HoD_ z?%>tP;9{qb`;}s$53L~6BMDn3s_}>%dmx7|kn^YazQ${=j=NkH=ddcZcRAP3vbVrB zapD&t>V||>hdvXOUIWTT>sqTg-Xz$>M)yW-W60O2`(H-;YmPkJZ<1idrmB`Bbz;tQ zQ@(d@JMRU$)D5LC7JyR)N9CeZIp}!-=cH4W0xXA1(Rji0KepJpTSCQEZd^GUu11)kB`}*}h zhYQ6<)9r|a=ehU7bXCLBLc<>gh0-HES%GKN^fSkrze56d^c)E&BM)cDZ3#lEqegpG zs!@VfGBdj`V4`8~%OG4YS^`w^Z29a3cQ6jBDVx0sa*-Dg&i;r6&WfpH6 zu{ohRLF+HZ1uR(Brk7qAU&d5OYLHjdR^4myv#hYVxx`>Mk`5!yUJct8$cE(g1I}({ z6xO&(Bv0?#1$_?bIgRVAV(SjDRxq5v90Mx#0PM#QoV}BFHp?iJ;fEsH>hhxV=o6SO zFr2}T!PTyN^XAASoEvyG}A1TR^iUHEC)0T3Hx^iktS`1?sj~UKP;8+ut663lm zI`Zl$#g+I+xP+gh^j*P+CJS*Uh?Adqrpc>RXc^L0e)&x`&{W^J74H4<@;5$WP^F&8eSR_qaqKH${A&4d?gH9`O$&Li`}Wg{sqvFbKa zgK3vgLB6!>^*KFjLz`<`bldkQn6|5xjbl!)H}_Xq1vHPlut8av$SiUWZY4K^ zW9~O|pOjy$Yl6#qk46h%Fw2pT^Qa~)1^!9B_hB}*rh&Brt?BTv`rsU5>m~4T$Zmar z)cN$(`($t}Vtv-xE5e3k32K)8qWtk77PctI+2?6gpE@2MmUUr|YCbWf*6H8{68GMH z?vINgXz#b4#^3kJQ@#25CQTVlechYQfIQ9WIjbAPB5_;;_xFRtB!DW@OprgcjLE&z zZ8~h^4&dmAWhO4bLbU(GPQJN?T)m;Wnr1!TYR>SQ87ZB9vaI-^sLqJko6}pN%nE^5 zlh9o=W(X1uM61U}pBKSbdOTli0&OctD4Q2=s;;fQP#=jAMZM9R_HNS6KbpmtJU3O9 z;T71KBpM|d?M-^OYN}mbH;ojf=qq8AL~N?A%oZz20M|IR?wR)UtNEB=sbxO?d`Pnv z-g@Hb^FD0;xj*&IzL6)*gYF?E=Ui)IMK;PU!Rp(ze@mDR8H_tD=R$SsyO*Tev zIs<#+WEidWl?JwHgf5S*7K~x8VhI4PMeG4ohYfKNXcf?ACGuNR=Q%ITpK$W6t@J!H zlj{>9j`8t8oc*Bgf#~&MQocO`zX8Fr0lzB^v+Fr>ETBJ*-k-C-!PO*>h(Ff0`j0?u zn6jDcz4gZvtdV9QFY~y>)$|SaksLAyMfMFg-^k?kSVHwJ?G|!M2hl-8%cG(Qtq>-U z9ym0tTUUFYhjq;B*i<#TVg|3#n5yc@1g+3Q7O!8k-5 zk>EYuuKS2Z9z|U*zH%eATk*PPZQd4j+w*OE_|S3=vN*D&c7P_De$ED7?d!gH98>12(WbhYtw@T#-j25KU z_x=_W!fME7tY+XeHZ~De|6B=HQx8s24;?-h`R#$!h$FkHoQr!xsBC5v>R@PVTfnE;Rb84a1 zfvlq1bBb3E*L^CX)&Z)b+HJvGPNN#m_4MhU`J|!;O$Rp*($Eb616K8cV->FQUDc z$9pfjWjQxbaV(o&oYplys%Pbi*FsbKTA|sHDY|XQ`aV*2_|2i>(6WPuqRvO@vA% zHeC~`Haqjv2*Lh=k%5TWV$4^2PDUVm~H)iD$g^{ZQ# z)iP{#Nsp!B)uAzO#`#*OM3d_V#fcS3kGC}tO=!=C+=GtQ+k!GMlVxD*+&a}kQA&-$ za8VBM1_nT84(Lmel#XyGb9@$GCuh9q8^5(pw(DSmM&ShXy@kP60f=IPkNXee$PHl1 z4-iJCf-)P5nJ?)byiJ*Q)(!dGqLTE>pIAgMYkh(GM*^afsz+NtY9hFT0h>gyfIq;cEUVpXKA?$>0Kjhx%(`YKG~Wne79|c zd>74{dFaSmGw56ISSscFQXUHO9__9zy)vR;L14Knk zPXD&8S4_V;ODIaR{yOupZqw-)Ut$+-6nzCRY%I&moEw`rM%WTN+WvJMbbSbYY{Mg3^Pths$x zgJ@jMy~WcQ1K#abV5d5QA3HrH?xH6*cGF;~!dF#lUS>X5_T$kbQTod?M@o68@bd(EwybGc@Sy8+Z%tFxSHr=M$y>irkj;2V5kl#S%quQ*@3yw9H37vFE^ zF%75xO1r`IpRe~>+1Qx>F3t3B8xsE%W&E8Xk?HTX8-JPG{*`uvo(YedfsXwzOX44! z_y_5Rikg&=i1dG|2V{(0{|!Ilf5|vl{=tIC%>0isj=yOG6#h{z!2JJP8OQ%w?T zSB#7g+z@7EO`wn*qP?%4ReYdKX+2kJJzkfjQl@{~c{KjJ;^OGzBgB;VY2C5&s0rXG zDgcSE;XsQZ-q%j-m=wl~Xe&684)Mioy8v~Se3pbm^!t)T$jz;1Ha&T~hB}ikBtgjY zZK7$jW4o>``a;m z$|&x-$6Gu5gK7F5WQpm8Wb$~6Wl5{NTU<;Ie?mvoggV2Q>#K5`oQ=UjK@+Vmeuauo zxC7=WJZ*>J=WN?0yK=;>yTEN0A2zWSx0SGjLm0Q9%|0`5%e^cSqAUu8L@t3voak*R z*whb&m@`E&Cm~sw{$WWHP)7g2;>ki|*~s}z5)xuT#p960^OR&L#E1oBcsnwkVpI2v_L&^8iFEBC3`Z<(tsRgL z{y5&-))?8QSl1J~SHs#so9wD-meyZSJQIi1B-M!2-ogsd9mSq-&X~g>`%E7lPD$@+ z5u_LUOS>`-O>9`yuJK35Qud%Gol*>Uw>tOkXq;Mvi?P;BS%7TQld2PvS^lkTx3*=0 z&Tco%e(hcRafbjSQr(b)Tt8OpKF-HG`X6##+Q`Q^ulN^)L!ps0*;De=E3{UkZ<+U& zwTK_A(+al`?!Vzk>qfN9Sx*<^P(Pp8H)}KN=XCWpE+DExkfy)b%O9DX^>B(thzf z3`Uw^Qa4a;%}0@iA4s1BM2@Rop(Y{|chI|L#2(%Bt)guNLvO%dgVB%On)E5wC_thl zraCsizl@jY_h19IMRVi8+Z=l5Y+PBGPRFQch!l^KUDMML2uQppQLw=ve&AiqPX*jK zfnQsnZG&4$NldafH=ij{SPKc5F7xLkN;*saRFpXw4|!=4kVog=Q>|x#2Xw9*!j>^^ ziE{HT0`X$|({bBV30@g(0q%_E49_t5Sv^gB1RrCL?j4nXm+3s3xT(NUIf>)2YDc9hjG;V3?bgiWi>GNqbEFzTXv|Go7D= zJ(Hew87n+iOs&Fc{jzfKj^~7*z74ibvo>{HcDIK+fc@l}xe2-qSp%4& zU68aAZNvjOVX9R-gQ)zEcU1?D=Dj@Q&RTEGC*0;A*C;v(L+;o@4?Sy zN)N_1lsMfm)om_Cs86KOmot~MngWe#;;EguD+%93Y zo)ub&92KYvknrLqF~h)|&MbE`H!C z$n%7P4$PmLGk<7lpT9Irl8L8IDG3MWN^ombp%qWq&K{EAmqKrF`Z6#hozPXwS|%oNbC*JCe!*IMG&5 z_kK;pOO2mGOQE5`GQ6>lt>i(l@gXCdH_53b*vEH7SptD6U(@Qi-ma6P5$FXE{Akx zslN(Y8uLUc$!dOzaf&kCLj7`ebN0l2^P&BMN~^LxpCjJ_KPPf#n#_W|hn9U9K%w2% zt!rDgPDrOLwfknT_`Q z``A^7>r0sDmA3tEAG~bF^Mq|abLv#rtLUL`@eZ!8{0D2@373XA<#GFX<+%AfH(P}3jK=|sG!dd3@{%oq=CF|tMgvzqJ z6O$h(bkoU~b?qzME~wTH!{Kdzufchq?}~~{&W*r_HqwF$Bi{KbBA-f^jcjZL9a}-- z2XJMs-lmZ}Omi3eL0rHyX;6`P9zqM{f zhiHw)2lf}(3HifbSmvzE5X%(OV@GSpV8CcVX~1bfSimg&#hXCpsbLP9GA)I!Q$~yo zSw?8wtSxC@MO>e#{8~1B|8P~*to`k zOr6HGPpPnHFMWRM*6`heNYRW*D2~^efip^p`NCM@K7XFMYWu5;)5&%>>y=VBb8)r# zP$X_3n+9y$XR&vv=lo$qSjvzw#AB%-^XC2q^BHH0#H*x?`uqX~$CHHZgkJSm_a67a zrsHI=WYkKQDwnE7+rW`(<_6~Hj@pVaQK+ZH3+ao3Hs~jmb2uCdE`g{*xVb#zV1Hiu zH>&lmA~))Ild3f4hwo*K zPM2+Mn`xw2w>Zs5FVQMdE~2PjPmAbfuu$?dYRR+`tATsAt(N-J^!Jy^EStC5gLT3D zg5FTn4uZo`LGGC5Xeh-?2ULwI$~n1+nLIS+0z9*s)A_fp;WA;h#v#UO)qHBiUZTqs zP7p)C+nc$FGOs0xb$ZHCoF$Uy(n&Rhi18EaYlT!iZbKzW6<6Z#D`(`jVN(vIyk#ko z(?6A36A_S*5(mo%#}t%xbzh~t3qO@A8CE1<-I<1H6SHe`5_F6lZ}RFRAuJY$}7oU}6dcV6Z4XCmr+dy_dORC?}QYDz8%WCl2YupG@6n zog4`DDcR7A^coLX{861qR|S`eFP zRZi)-@PKe3eV5o=_9<+tIt-;;@h6C+D`>bVYlP7# zl2QVfJegI{A~~Vnq7=D0ip~3t(FBZl{4~)V!r;WY>xgxMO;Cg{`I@Dg(`A5FXu1mV z>V#wVohT?EQ(bycozO&6acN+Tw!1pueMSAY+8gjUsKyaN)z8OCGXYyiPefic@=Mg3 z@wtU^qQ%>fZr-bLy9ynlX`=!KrEzfypHi|@FN-)f9i(&*PD$L`W=yO6N76r4e@D)M zPF06CBRD-%?o$)^SrF)e>Q?G16ih!oKAw6iQ^`L~;#JIpbJCUl@PheOHXa%x>#PjB zA>-QK_2Mb0c(XFEj6E|44x{YQOmO$|+by@oSwnoRjQh0NnC%gIf(=74{%J_9<5UO)%t5S-wnw6UMveELP+xoRrZJ#~S zOKt(>v+{{5@psA$(M(|a19RcGGaU7|k`m4L{PPems)0rtD`-s>#qs{L%LxilF+LJlS^7-#a&zfM8q9rIOJc(`h`J{bcEao2nw)(V-d|cq zI3s}fY~KB(_8A0|L?aKkN$9IgZY@vMian7!Qh-^C$MqmBBk9R8t*BMZB1d@-z9YOD zVkc&1>tQ+r+UHvrBbrxdZ>)S%n?_}2c7>8Gv{^c<O*{4ttMkcCvXPAUV$#{BLekM6|==2mJ zQ=HS81y$nrI1YNLt*y*U@uwx%CYrgYf}5@Ez|>t1hCYF_T7VS%DU4L;;!oIiZgrfW zOtj#PJclF>kchJHD^B2pel2L}H9)9ElDM)) zJh(=^8oEzYVsPvUa}!cJ6P#44CMGYcildCg3hv>H!yVs-Ma1cxQG-b#n#Tk)eRpCW z34=;z>KAoFLA4I#;RcJ+eU&~WKJ%PKCqko!+{=c~EWWDC2^IDpkxOFQ?Nxq;Sh0Xg z{ya@vM+yK7=@GrcQcsSEd~r4>L#|>yJ(CoSeO`;-Q=TZe&nrw*G9SY%=#eWg71Py4 zOut@iAV%3!K-XM$xkEK55V5|xB5dV23AZ~i+6}?BzMV7pF)Yn7x1MTP0qZGWfF3u z?*j|8goE}0We{v+y&RbOPPPk=z4GLZKzD6@jZ(hBzwe{yOBB-Hd2?V!g{C%|{9o+d zW2`6vmoDgSoPD-!+qP}YN+qP}nwr$&cx;wddzV80!c4u-klgXTHDr(8 z>-XI3*2RM_LZAjB#7k;O^(HQ==T(U(j6$Y%6E2VI-&-}%v=ihelyYuxX^>;>h5aJTw#snwg@uqeeUm zedK5!mX=vkK!6$zMhuV%Nt=H}?G_&ycVg9gd#IA+!f98evAVVG4Xv|wSbX?@u(x9` zp+N<-@9<3qZ(KknTC{sSb5uz=8ExGA{btpQgn$_->hGN%dN~!^9y!p(wJluPG&qZ` z1HL$&{+v6nww${ZWlQlSt)Be!jYg+W$Bmq~Uy6POr(V)R!y9$0sT$TKVQ?4asF?CF z3rw@9IEL`tVVQ9)8)Ea|dkMOCcTa7ptf@4tHm)}Jcjem)PnmC+FGzg3e~~P-zdKz! zB^?iyEtN@=%Zp|<2|siANT^ebQcILjn4@!7x;Kum75?O6UQ4z3VHT(#R4|j~dpyAj zzi0PpjdKK5k^?LL-pDYX-MzZ z{aN<**_QsZ!{N49bnZd&OU5Tmhaxc`sk&car=_~>qt1xZnb+m?qGf~!i43~1oR^;D z$jt8I6!K-$aq3c_!QzFG)BEhcwQ{JeiyIOVo{yOuRZLFS>t98|LJsid47L;aAX01CmU2$FgAICS1B_X zYK42J29MMwH5X9z4LH@;>s!crSdKNqbIyY1Y@qq7$Fl{aDl~6QYMfd#!IY zE#l=(51b62?-Drm2TOIZgJ!o$haOA$<-MvyYQv&YcvVDf};q@o^!TdX+Q~j|HxU>bh z14gI6E?zo-d03a+4d`u-JE0_edXVnewYqB`E;h3Ed?(KQE`4-&4bA}X$mZfD?0p6v zJ&-bxVkn(8aFoCJ>QtLpAA#R;kJP>+vS|eQ>n60-W5)^CQ@JU!IZcX|zdLK5wrey` z`gP8C!n_i~G0mg2MCg%eE2L0E3nvXo<4z5Wu;`TO@g2HZw-UIqcEP2&ziI(K7~o#n z6+>!@lVE;9ktkUPgjh+HYI-@_r{TneN-wdd+;Dk*G%}kkDQc_Vp2mE?^Iw(gwN#}( z){h{6->wOYDjLMse+Dv^7HWwM^d}c5KN;*`@Rk{TCCr>XmLIi9O9!48W4ZAto=iY1xS;^Xg@2yVmpq->pK5uzaE zgHTHxIvq+T?(m!Wf{e1B&PgFbBu)x&K%MdE^U=i_h{fP5C(woE*FepL#*)b>{Nm+^ ziK!8el8PiV69+kaI(5T-m*S7H5dZb8C@bsJ(rp8`BpE`-oyOy}qYEs`$>e$q&?`*R z6gDK4y5Jt<$7E^`WTU70kw=Kh+I8Cx8*-`h$XGt*>3p87WtQ+H8fUAXFtnJMOt`TX zEggcp?)W$w0E>gX9F3FnHX*As^B855eMzQ2TqM+KPiNY!yVSt%QIy+-P~W~6{4_n) zj_p_C7=wCEcTMdkzkctRoubs!37%L z(eD_oDdKax)=&b4@Vk2a*R``Hq~LhqKy)Z$o8EBsiuNYM{WV2G3;ki3;r5mf%LDw= zw|PH|UGw1sQAURVzU=w>h4*KdsLrpT#^>?SlXS1e_X!<^KZzS!)M`I6vubcmkKPAN zv#BtgWx!G7qx`eI3!^!F-B53YqZRz%!nttVm3jV~&`rPJ75E=&H;xz%q4+E)W;NhV zr$99b1J~rFa}&$NN(i_i(s>}x&ji+kl%{No4pM_K(<8e2LgUs>Q63`>tl$@AMJJwe z9nuaH%p%8gvEMs9z+gukxV9#!7b(dibFS%GQ0f8JX-bOw8XhKMdIzad1i$9~Xk+BQ z>uh$mRNK3|G1;$Qkx3^7c727w*sQv~21#GdsBbE!*A#&AdPSrUN99>?$%`oLT;77} z{pqZ~n~hm##pcfDrUV>j96Ct#^6gw?3!?(au7Klkt&Im(+W~y!jIRGxVZ3>M@OeRy zb*OzyE4(`CmhOYkN50-IRO8~ShGsttPfpBbl-vj)jkgq%sIguGzsH4wInl(ua4ZFLS85u+?n69d~ zLTu-{KU!hY_(U`yU_b;+wl(@-)|@Mo{T>Vo?j|O6)R^q|32q7v4HO1zVe(XwL&06V zZLxs^T`!G35Wk)_T3fM!YzZZ|{hV~m5+Ak@4OiS#!m>%S_{9)uAM4U#!!Y~q3fd(l ztt*R&HJ>|Wzx`oP(4%@_NgS_VBUGach#R#EHmNe-05C`@)(dbB#jUkJp=Y#@xIN4$ zL)9Ls$T-ng3K3v{A%tmEmK+724H7>;i@!aLfGpNvwIlx3K1Tkp(qscJ>U+CRV*hyX z#|q*ZL}$v}p#}o;yqrDTuVHCf<9;#=nS^UCEI7J*0N*5+ zGUz>|xoszXkdy*+^Ud_7>b6T-29B#-ISFO2@p7joG_-HNjoU}ZtyL1=*)8QjBT z?@GfFDAT)d!ng}V?7nHamE8g~-x(D{mF3;_?VU4=An`hjIpjg$XPo z0)9e2s`XeAbBh*ptyBxK1B6+vPGb2+8cdryyHNE`0>o9&pg@2XVPl;^YB$caO5ATA z2d00tNOzV$bK zhJ)I8Mqpn{dQ8x_<$RPL`Dn6<`6`g&6HJ0|n%VuU%9@0txtxuLWQ9WHQ9se&;r~x1fgtn(!2Ip zjlC#j997#CRpB$?*w{#sqh{~aw5iqT?EtZW2^z$%)`;nVi6k|ozHd81V)Q&T1tTy~ z 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 literal 0 HcmV?d00001 diff --git a/www/extras/yui/docs/button.js.html b/www/extras/yui/docs/button.js.html new file mode 100644 index 000000000..bd6e217f2 --- /dev/null +++ b/www/extras/yui/docs/button.js.html @@ -0,0 +1,3379 @@ + + + + API: button button.js (YUI Library) + + + + +

          + + + +
          +
          +
          + +
          +
          /**
          +* @module button
          +* @description <p>The Button Control enables the creation of rich, graphical 
          +* buttons that function like traditional HTML form buttons.  <em>Unlike</em> 
          +* tradition HTML form buttons, buttons created with the Button Control can have 
          +* a label that is different from its value.  With the inclusion of the optional 
          +* <a href="module_menu.html">Menu Control</a>, the Button Control can also be
          +* used to create menu buttons and split buttons, controls that are not 
          +* available natively in HTML.  The Button Control can also be thought of as a 
          +* way to create more visually engaging implementations of the browser's 
          +* default radio-button and check-box controls.</p>
          +* <p>The Button Control supports the following types:</p>
          +* <dl>
          +* <dt>button</dt>
          +* <dd>Basic push button that can execute a user-specified command when 
          +* pressed.</dd>
          +* <dt>link</dt>
          +* <dd>Navigates to a specified url when pressed.</dd>
          +* <dt>submit</dt>
          +* <dd>Submits the parent form when pressed.</dd>
          +* <dt>reset</dt>
          +* <dd>Resets the parent form when pressed.</dd>
          +* <dt>checkbox</dt>
          +* <dd>Maintains a "checked" state that can be toggled on and off.</dd>
          +* <dt>radio</dt>
          +* <dd>Maintains a "checked" state that can be toggled on and off.  Use with 
          +* the ButtonGroup class to create a set of controls that are mutually 
          +* exclusive; checking one button in the set will uncheck all others in 
          +* the group.</dd>
          +* <dt>menubutton</dt>
          +* <dd>When pressed will show/hide a menu.</dd>
          +* <dt>splitbutton</dt>
          +* <dd>Can execute a user-specified command or display a menu when pressed.</dd>
          +* </dl>
          +* @title Button
          +* @namespace YAHOO.widget
          +* @requires yahoo, dom, element, event
          +* @optional container, menu
          +* @beta
          +*/
          +
          +
          +(function() {
          +
          +// Shorthard for utilities
          +
          +var Dom = YAHOO.util.Dom,
          +    Event = YAHOO.util.Event,
          +    Lang = YAHOO.lang,
          +
          +
          +    // Private member variables
          +
          +    m_oUserAgent = navigator.userAgent.toLowerCase(),
          +    m_bOpera = (m_oUserAgent.indexOf('opera') > -1),
          +    m_bSafari = (m_oUserAgent.indexOf('safari') > -1),
          +    m_bGecko = (!m_bOpera && !m_bSafari && m_oUserAgent.indexOf('gecko') > -1),
          +    m_bIE7 = (!m_bOpera && m_oUserAgent.indexOf('msie 7') > -1),
          +    m_bIE = (!m_bOpera && m_oUserAgent.indexOf('msie') > -1),
          +    m_oButtons = {},
          +    m_oFocusedButton = null;
          +
          +
          +
          +//  Constructor
          +
          +
          +/**
          +* The Button class creates a rich, graphical button.
          +* @param {String} p_oElement String specifying the id attribute of the 
          +* <code>&#60;input&#62;</code>, <code>&#60;a&#62;</code> or 
          +* <code>&#60;span&#62;</code> element to be used to create the button.
          +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
          +* one-html.html#ID-6043025">HTMLInputElement</a>|<a href="
          +* http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-html.html#
          +* ID-33759296">HTMLElement</a>} p_oElement Object reference for the 
          +* <code>&#60;input&#62;</code>, <code>&#60;a&#62;</code> or 
          +* <code>&#60;span&#62;</code> element to be used to create the button.
          +* @param {Object} p_oElement Object literal specifying a set of configuration  
          +* attributes used to create the button.
          +* @param {Object} p_oAttributes Optional. Object literal specifying a set of 
          +* configuration attributes used to create the button.
          +* @namespace YAHOO.widget
          +* @class Button
          +* @constructor
          +* @extends YAHOO.util.Element
          +*/
          +YAHOO.widget.Button = function(p_oElement, p_oAttributes) {
          +
          +    var fnSuperClass = YAHOO.widget.Button.superclass.constructor;
          +
          +    if(
          +        arguments.length == 1 && 
          +        !Lang.isString(p_oElement) && 
          +        !p_oElement.nodeName
          +    ) {
          +
          +        if(!p_oElement.id) {
          +
          +            p_oElement.id = Dom.generateId();
          +
          +            YAHOO.log(
          +                "No value specified for the button's \"id\" attribute. " +
          +                "Setting  button id to \"" + p_oElement.id + "\".",
          +                "warn"
          +            );
          +
          +        }
          +
          +        this.logger = new YAHOO.widget.LogWriter("Button " + p_oElement.id);
          +
          +        this.logger.log(
          +                "No source HTML element.  "  +
          +                "Building the button using the set of configuration attributes."
          +            );
          +
          +        fnSuperClass.call(
          +            this,
          +            (this._createButtonElement(p_oElement.type)),
          +            p_oElement
          +        );
          +
          +    }
          +    else {
          +
          +        var oConfig = {
          +        
          +            element: null,
          +            attributes: (p_oAttributes || {})
          +            
          +        },
          +
          +        sTagName;
          +
          +
          +        if(Lang.isString(p_oElement)) {
          +
          +            var oElement = Dom.get(p_oElement);
          +
          +            if (oElement) {
          +
          +                sTagName = oElement.tagName.toUpperCase();
          +            
          +                if(sTagName == this.TAG_NAME) {
          +            
          +                    oConfig.attributes.id = oElement.id;
          +            
          +                }
          +                else if(sTagName == "INPUT" && !oConfig.attributes.id) {
          +            
          +                    oConfig.attributes.id = Dom.generateId();
          +            
          +                    YAHOO.log(
          +                        "No value specified for the button's \"id\" " +
          +                        "attribute. Setting button id to \"" + 
          +                        oConfig.attributes.id + "\".",
          +                        "warn"
          +                    );
          +                
          +                }
          +            
          +                this.logger = new YAHOO.widget.LogWriter(
          +                                    "Button " + oConfig.attributes.id
          +                                        );
          +            
          +                this.logger.log(
          +                        "Building the button using an existing HTML " + 
          +                        "element as a source element." 
          +                    );
          +            
          +            
          +                oConfig.attributes.srcelement = oElement;
          +            
          +                initConfig.call(this, oConfig);
          +            
          +            
          +                if(!oConfig.element) {
          +            
          +                    this.logger.log(
          +                            "Source element could not be used as is.  " +
          +                            "Creating a new HTML element for the button."
          +                        );
          +            
          +                    oConfig.element = 
          +                        this._createButtonElement(oConfig.attributes.type);
          +            
          +                }
          +            
          +                fnSuperClass.call(this, oConfig.element, oConfig.attributes);
          +
          +            }
          +
          +        }
          +        else {
          +
          +            sTagName = p_oElement.tagName.toUpperCase();
          +
          +            if(sTagName == this.TAG_NAME) {
          +
          +                if(p_oElement.id) {
          +
          +                    oConfig.attributes.id = p_oElement.id;
          +                
          +                }
          +                else {
          +
          +                    oConfig.attributes.id = Dom.generateId();
          +
          +                    YAHOO.log(
          +                        "No value specified for the button's \"id\" " +
          +                        "attribute. Setting button id to \"" + 
          +                        oConfig.attributes.id + "\".",
          +                        "warn"
          +                    );
          +
          +                }
          +
          +
          +            }
          +            else if(sTagName == "INPUT" && !oConfig.attributes.id) {
          +
          +                oConfig.attributes.id = Dom.generateId();
          +
          +                YAHOO.log(
          +                    "No value specified for the button's \"id\" " +
          +                    "attribute. Setting button id to \"" + 
          +                    oConfig.attributes.id + "\".",
          +                    "warn"
          +                );
          +            
          +            }
          +
          +            this.logger = 
          +                new YAHOO.widget.LogWriter("Button " + oConfig.attributes.id);
          +
          +            this.logger.log(
          +                    "Building the button using an existing HTML element as " + 
          +                    "a source element." 
          +                );
          +
          +
          +            oConfig.attributes.srcelement = p_oElement;
          +    
          +            initConfig.call(this, oConfig);
          +    
          +    
          +            if(!oConfig.element) {
          +
          +                this.logger.log(
          +                        "Source element could not be used as is.  " +
          +                        "Creating a new HTML element for the button."
          +                    );
          +        
          +                oConfig.element = 
          +                    this._createButtonElement(oConfig.attributes.type);
          +        
          +            }
          +        
          +            fnSuperClass.call(this, oConfig.element, oConfig.attributes);
          +        
          +        }
          +
          +    }
          +
          +};
          +
          +
          +
          +// 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.
          +* @return {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
          +* level-one-html.html#ID-58190037">HTMLElement</a>}
          +*/
          +function getFirstElement(p_oElement) {
          +
          +    var oFirstChild = p_oElement.firstChild;
          +
          +    if(oFirstChild) {
          +
          +        if(oFirstChild.nodeType == 1) {
          +
          +            return oFirstChild;
          +
          +        }
          +        else {
          +
          +            var oNextSibling = oFirstChild.nextSibling;
          +
          +            if(oNextSibling && oNextSibling.nodeType == 1) {
          +            
          +                return oNextSibling;
          +            
          +            }
          +
          +        }
          +
          +    }
          +
          +}
          +
          +
          +/**
          +* @method createInputElement
          +* @description Creates an <code>&#60;input&#62;</code> element of the 
          +* specified type.
          +* @private
          +* @param {String} p_sType String specifying the type of 
          +* <code>&#60;input&#62;</code> element to create.
          +* @param {String} p_sName String specifying the name of 
          +* <code>&#60;input&#62;</code> element to create.
          +* @param {String} p_sValue String specifying the value of 
          +* <code>&#60;input&#62;</code> element to create.
          +* @param {String} p_bChecked Boolean specifying if the  
          +* <code>&#60;input&#62;</code> element is to be checked.
          +* @return {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
          +* one-html.html#ID-6043025">HTMLInputElement</a>}
          +*/
          +function createInputElement(p_sType, p_sName, p_sValue, p_bChecked) {
          +
          +    var oInput;
          +
          +    if(m_bIE) {
          +
          +        /*
          +            For IE it is necessary to create the element with the 
          +            "type," "name," "value," and "checked" properties set all at once.
          +        */
          +    
          +        var sInput = "<input type=\"" + p_sType + "\" name=\"" + p_sName + "\"";
          +
          +        if(p_bChecked) {
          +
          +            sInput += " checked";
          +        
          +        }
          +        
          +        sInput += ">";
          +
          +        oInput = document.createElement(sInput);
          +
          +    }
          +    else {
          +    
          +        oInput = document.createElement("input");
          +        oInput.name = p_sName;
          +        oInput.type = p_sType;
          +
          +        if(p_bChecked) {
          +
          +            oInput.checked = true;
          +        
          +        }
          +
          +    }
          +
          +    oInput.value = p_sValue;
          +    
          +    return oInput;
          +
          +}
          +
          +
          +/**
          +* @method setAttributesFromSrcElement
          +* @description Gets the values for all the attributes of the source element 
          +* (either <code>&#60;input&#62;</code> or <code>&#60;a&#62;</code>) that map to
          +* Button configuration attributes and sets them into a collection that is
          +* passed to the Button constructor.
          +* @private
          +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
          +* one-html.html#ID-6043025">HTMLInputElement</a>|<a href="http://www.w3.org/
          +* TR/2000/WD-DOM-Level-1-20000929/level-one-html.html#ID-
          +* 48250443">HTMLAnchorElement</a>} p_oElement Object reference to the HTML 
          +* element (either <code>&#60;input&#62;</code> or <code>&#60;span&#62;</code>) 
          +* used to create the button.
          +* @param {Object} p_oAttributes Object reference for the collection of 
          +* configuration attributes used to create the button.
          +*/
          +function setAttributesFromSrcElement(p_oElement, p_oAttributes) {
          +
          +    var me = this;
          +
          +    /**
          +    * @method setAttributeFromDOMAttribute
          +    * @description Gets the value of the specified DOM attribute and sets it 
          +    * into the collection of configuration attributes used to configure 
          +    * the button.
          +    * @private
          +    * @param {String} p_sAttribute String representing the name of the 
          +    * attribute to retrieve from the DOM element.
          +    */
          +    function setAttributeFromDOMAttribute(p_sAttribute) {
          +
          +        if( !(p_sAttribute in p_oAttributes) ) {
          +
          +            /*
          +                Need to use "getAttributeNode" instead of "getAttribute" 
          +                because using "getAttribute," IE will return the innerText of 
          +                a <code>&#60;button&#62;</code> for the value attribute rather 
          +                than the value of the "value" attribute.
          +            */
          +    
          +            var oAttribute = p_oElement.getAttributeNode(p_sAttribute);
          +    
          +
          +            if(oAttribute && ("value" in oAttribute)) {
          +
          +                me.logger.log(
          +                    "Setting attribute \"" + p_sAttribute + "\" using " +
          +                    "source element's attribute value of \"" + 
          +                    oAttribute.value + "\""
          +                );
          +
          +                p_oAttributes[p_sAttribute] = oAttribute.value;
          +
          +            }
          +
          +        }
          +    
          +    }
          +
          +
          +    /**
          +    * @method setFormElementProperties
          +    * @description Gets the value of the attributes from the form element and 
          +    * sets them into the collection of configuration attributes used to 
          +    * configure the button.
          +    * @private
          +    */
          +    function setFormElementProperties() {
          +
          +        setAttributeFromDOMAttribute("type");
          +
          +        if( !("disabled" in p_oAttributes) ) {
          +
          +            p_oAttributes.disabled = p_oElement.disabled;
          +
          +        }
          +
          +        setAttributeFromDOMAttribute("name");
          +        setAttributeFromDOMAttribute("value");
          +        setAttributeFromDOMAttribute("title");
          +
          +    }
          +
          +
          +    var sSrcElementTagName = p_oElement.tagName.toUpperCase();
          +
          +
          +    if( !("label" in p_oAttributes) ) {
          +
          +        // Set the "label" property
          +    
          +        var sText = sSrcElementTagName == "INPUT" ? 
          +                        p_oElement.value : p_oElement.innerHTML;
          +    
          +    
          +        if(sText && sText.length > 0) {
          +            
          +            p_oAttributes.label = sText;
          +            
          +        } 
          +
          +    }
          +
          +
          +    setAttributeFromDOMAttribute("tabindex");
          +    setAttributeFromDOMAttribute("accesskey");
          +
          +
          +    switch(sSrcElementTagName) {
          +    
          +        case "A":
          +        
          +            p_oAttributes.type = "link";
          +
          +            setAttributeFromDOMAttribute("href");
          +            setAttributeFromDOMAttribute("target");
          +
          +        break;
          +
          +        case "INPUT":
          +
          +            setFormElementProperties();
          +
          +            if( !("checked" in p_oAttributes) ) {
          +    
          +                p_oAttributes.checked = p_oElement.checked;
          +    
          +            }
          +
          +        break;
          +
          +        case "BUTTON":
          +
          +            setFormElementProperties();
          +
          +            var oRootNode = p_oElement.parentNode.parentNode;
          +
          +            if(Dom.hasClass(oRootNode, "checked")) {
          +            
          +                p_oAttributes.checked = true;
          +            
          +            }
          +
          +            if(Dom.hasClass(oRootNode, "disabled")) {
          +
          +                p_oAttributes.disabled = true;
          +            
          +            }
          +
          +            p_oElement.removeAttribute("name");
          +            p_oElement.removeAttribute("value");
          +
          +            p_oElement.setAttribute("type", "button");
          +
          +        break;
          +    
          +    }
          +
          +}
          +
          +
          +/**
          +* @method initConfig
          +* @description Initializes the set of configuration attributes that are used to  
          +* instantiate the button.
          +* @private
          +* @param {Object} Object representing the button's set of 
          +* configuration attributes.
          +*/
          +function initConfig(p_oConfig) {
          +
          +    var oAttributes = p_oConfig.attributes,
          +        oSrcElement = oAttributes.srcelement,
          +        sSrcElementTagName = oSrcElement.tagName.toUpperCase();
          +
          +
          +    if(sSrcElementTagName == this.TAG_NAME) {
          +
          +        p_oConfig.element = oSrcElement;
          +
          +        var oFirstChild = getFirstElement(p_oConfig.element);
          +
          +        Dom.addClass(oFirstChild, "first-child");
          +
          +        if(oFirstChild) {
          +
          +            var oButton = getFirstElement(oFirstChild);
          +
          +
          +            if(oButton) {
          +
          +                var sButtonTagName = oButton.tagName.toUpperCase();
          +
          +
          +                if(sButtonTagName == "A" || sButtonTagName == "BUTTON") {
          +
          +                    setAttributesFromSrcElement.call(
          +                            this, 
          +                            oButton, 
          +                            oAttributes
          +                        );
          +                
          +                }
          +            
          +            }
          +
          +        }
          +    
          +    }
          +    else if(sSrcElementTagName == "INPUT") {
          +
          +        setAttributesFromSrcElement.call(this, oSrcElement, oAttributes);
          +    
          +    }
          +
          +}
          +
          +
          +YAHOO.extend(YAHOO.widget.Button, YAHOO.util.Element, {
          +
          +
          +// Protected properties
          +
          +
          +/** 
          +* @property _button
          +* @description Object reference to the button's internal 
          +* <code>&#60;a&#62;</code> or <code>&#60;button&#62;</code> element.
          +* @default null
          +* @protected
          +* @type <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
          +* one-html.html#ID-48250443">HTMLAnchorElement</a>|<a href="
          +* http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-html.html#ID-
          +* 34812697">HTMLButtonElement</a>
          +*/
          +_button: null,
          +
          +
          +/** 
          +* @property _menu
          +* @description Object reference to the button's menu.
          +* @default null
          +* @protected
          +* @type <a href="YAHOO.widget.Menu.html">YAHOO.widget.Menu</a>
          +*/
          +_menu: null,
          +
          +
          +/** 
          +* @property _hiddenField
          +* @description Object reference to the <code>&#60;input&#62;</code> element 
          +* used when the button's parent form is submitted.
          +* @default null
          +* @protected
          +* @type <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
          +* one-html.html#ID-6043025">HTMLInputElement</a>
          +*/
          +_hiddenField: null,
          +
          +
          +/** 
          +* @property _onclickAttributeValue
          +* @description Object reference to the button's current value for the "onclick"
          +* configuration attribute.
          +* @default null
          +* @protected
          +* @type Object
          +*/
          +_onclickAttributeValue: null,
          +
          +
          +/** 
          +* @property _activationKeyPressed
          +* @description Boolean indicating if the key(s) that toggle the button's 
          +* "active" state have been pressed.
          +* @default false
          +* @protected
          +* @type Boolean
          +*/
          +_activationKeyPressed: false,
          +
          +
          +/** 
          +* @property _activationButtonPressed
          +* @description Boolean indicating if the mouse button that toggles the button's
          +* "active" state has been pressed.
          +* @default false
          +* @protected
          +* @type Boolean
          +*/
          +_activationButtonPressed: false,
          +
          +
          +/** 
          +* @property _hasKeyEventHandlers
          +* @description Boolean indicating if the button's "blur", "keydown" and 
          +* "keyup" event handlers are assigned
          +* @default false
          +* @protected
          +* @type Boolean
          +*/
          +_hasKeyEventHandlers: false,
          +
          +
          +/** 
          +* @property _hasMouseEventHandlers
          +* @description Boolean indicating if the button's "mouseout" and "mousedown" 
          +* and "mouseup" event handlers are assigned
          +* @default false
          +* @protected
          +* @type Boolean
          +*/
          +_hasMouseEventHandlers: false,
          +
          +
          +
          +// Constants
          +
          +
          +/**
          +* @property TAG_NAME
          +* @description The name of the tag to be used for the button's root element. 
          +* @default "SPAN"
          +* @final
          +* @type String
          +*/
          +TAG_NAME: "SPAN",
          +
          +
          +/**
          +* @property CHECK_ACTIVATION_KEYS
          +* @description Array of numbers representing keys that (when pressed) toggle 
          +* the button's "checked" attribute.
          +* @default [32]
          +* @final
          +* @type Array
          +*/
          +CHECK_ACTIVATION_KEYS: [32],
          +
          +
          +/**
          +* @property ACTIVATION_KEYS
          +* @description Array of numbers representing keys that (when presed) toggle 
          +* the button's "active" state.
          +* @default [13, 32]
          +* @final
          +* @type Array
          +*/
          +ACTIVATION_KEYS: [13, 32],
          +
          +
          +/**
          +* @property OPTION_AREA_WIDTH
          +* @description Width (in pixels) of the area of a split button that when 
          +* pressed will display a menu.
          +* @default 20
          +* @final
          +* @type Number
          +*/
          +OPTION_AREA_WIDTH: 20,
          +
          +
          +/**
          +* @property CSS_CLASS_NAME
          +* @description String representing the CSS class(es) to be applied to the 
          +* button's root element.
          +* @default "yuibutton"
          +* @final
          +* @type String
          +*/
          +CSS_CLASS_NAME: "yuibutton",
          +
          +
          +/**
          +* @property RADIO_DEFAULT_TITLE
          +* @description String representing the default title applied to buttons of 
          +* type "radio." 
          +* @default "Unchecked.  Click to check."
          +* @final
          +* @type String
          +*/
          +RADIO_DEFAULT_TITLE: "Unchecked.  Click to check.",
          +
          +
          +/**
          +* @property RADIO_CHECKED_TITLE
          +* @description String representing the title applied to buttons of type "radio" 
          +* when checked.
          +* @default "Checked.  Click to uncheck."
          +* @final
          +* @type String
          +*/
          +RADIO_CHECKED_TITLE: "Checked.  Click to uncheck.",
          +
          +
          +/**
          +* @property CHECKBOX_DEFAULT_TITLE
          +* @description String representing the default title applied to buttons of 
          +* type "checkbox." 
          +* @default "Unchecked.  Click to check."
          +* @final
          +* @type String
          +*/
          +CHECKBOX_DEFAULT_TITLE: "Unchecked.  Click to check.",
          +
          +
          +/**
          +* @property CHECKBOX_CHECKED_TITLE
          +* @description String representing the title applied to buttons of type 
          +* "checkbox" when checked.
          +* @default "Checked.  Click to uncheck."
          +* @final
          +* @type String
          +*/
          +CHECKBOX_CHECKED_TITLE: "Checked.  Click to uncheck.",
          +
          +
          +/**
          +* @property MENUBUTTON_DEFAULT_TITLE
          +* @description String representing the default title applied to buttons of 
          +* type "menubutton." 
          +* @default "Menu collapsed.  Click to expand."
          +* @final
          +* @type String
          +*/
          +MENUBUTTON_DEFAULT_TITLE: "Menu collapsed.  Click to expand.",
          +
          +
          +/**
          +* @property MENUBUTTON_MENU_VISIBLE_TITLE
          +* @description String representing the title applied to buttons of type 
          +* "menubutton" when the button's menu is visible. 
          +* @default "Menu expanded.  Click or press Esc to collapse."
          +* @final
          +* @type String
          +*/
          +MENUBUTTON_MENU_VISIBLE_TITLE: 
          +    "Menu expanded.  Click or press Esc to collapse.",
          +
          +
          +/**
          +* @property SPLITBUTTON_DEFAULT_TITLE
          +* @description  String representing the default title applied to buttons of 
          +* type "splitebutton." 
          +* @default "Menu collapsed.  Click inside option region or press 
          +* Ctrl + Shift + M to show the menu."
          +* @final
          +* @type String
          +*/
          +SPLITBUTTON_DEFAULT_TITLE: 
          +    "Menu collapsed.  Click inside option region or press Ctrl + Shift + M to show the menu.",
          +
          +
          +/**
          +* @property SPLITBUTTON_OPTION_VISIBLE_TITLE
          +* @description String representing the title applied to buttons of type 
          +* "splitbutton" when the button's menu is visible. 
          +* @default "Menu expanded.  Press Esc or Ctrl + Shift + M to hide the menu."
          +* @final
          +* @type String
          +*/
          +SPLITBUTTON_OPTION_VISIBLE_TITLE: 
          +    "Menu expanded.  Press Esc or Ctrl + Shift + M to hide the menu.",
          +
          +
          +/**
          +* @property SUBMIT_TITLE
          +* @description String representing the title applied to buttons of 
          +* type "submit." 
          +* @default "Click to submit form."
          +* @final
          +* @type String
          +*/
          +SUBMIT_TITLE: "Click to submit form.",
          +
          +
          +
          +// Protected attribute setter methods
          +
          +
          +/**
          +* @method _setType
          +* @description Sets the value of the button's "type" attribute.
          +* @protected
          +* @param {String} p_sType String indicating the value for the button's 
          +* "type" attribute.
          +*/
          +_setType: function(p_sType) {
          +
          +    if(p_sType == "splitbutton") {
          +
          +        this.on("option", this._onOption);
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _setLabel
          +* @description Sets the value of the button's "label" attribute.
          +* @protected
          +* @param {String} p_sLabel String indicating the value for the button's 
          +* "label" attribute.
          +*/
          +_setLabel: function(p_sLabel) {
          +
          +    this._button.innerHTML = p_sLabel;                
          +
          +},
          +
          +
          +/**
          +* @method _setTabIndex
          +* @description Sets the value of the button's "tabindex" attribute.
          +* @protected
          +* @param {Number} p_nTabIndex Number indicating the value for the button's 
          +* "tabindex" attribute.
          +*/
          +_setTabIndex: function(p_nTabIndex) {
          +
          +    this._button.tabIndex = p_nTabIndex;
          +
          +},
          +
          +
          +/**
          +* @method _setTitle
          +* @description Sets the value of the button's "title" attribute.
          +* @protected
          +* @param {String} p_nTabIndex Number indicating the value for the button's 
          +* "title" attribute.
          +*/
          +_setTitle: function(p_sTitle) {
          +
          +    if(this.get("type") != "link") {
          +
          +        var sTitle = p_sTitle;
          +
          +        if(!sTitle) {
          +
          +
          +            var sType = this.get("type");
          +
          +            switch(sType) {
          +
          +                case "radio":
          +
          +                    sTitle = this.RADIO_DEFAULT_TITLE;
          +
          +                break;
          +
          +                case "checkbox":
          +
          +                    sTitle = this.CHECKBOX_DEFAULT_TITLE;
          +
          +                break;
          +                
          +                case "menubutton":
          +
          +                    sTitle = this.MENUBUTTON_DEFAULT_TITLE;
          +
          +                break;
          +
          +                case "splitbutton":
          +
          +                    sTitle = this.SPLITBUTTON_DEFAULT_TITLE;
          +
          +                break;
          +
          +                case "submit":
          +
          +                    sTitle = this.SUBMIT_TITLE;
          +
          +                break;
          +
          +            }
          +
          +        }
          +
          +        this._button.title = sTitle;
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _setDisabled
          +* @description Sets the value of the button's "disabled" attribute.
          +* @protected
          +* @param {Boolean} p_bDisabled Boolean indicating the value for the button's 
          +* "disabled" attribute.
          +*/
          +_setDisabled: function(p_bDisabled) {
          +
          +    if(this.get("type") != "link") {
          +
          +        if(p_bDisabled) {
          +
          +            if(this.hasFocus()) {
          +            
          +                this.blur();
          +            
          +            }
          +
          +            this._button.setAttribute("disabled", "disabled");
          +
          +            this.addClass("disabled");
          +
          +        }
          +        else {
          +
          +            this._button.removeAttribute("disabled");
          +
          +            this.removeClass("disabled");
          +        
          +        }
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _setAccessKey
          +* @description Sets the value of the button's "accesskey" attribute.
          +* @protected
          +* @param {String} p_sAccessKey String indicating the value for the button's 
          +* "accesskey" attribute.
          +*/
          +_setAccessKey: function(p_sAccessKey) {
          +
          +    this._button.accessKey = p_sAccessKey;
          +
          +},
          +
          +
          +/**
          +* @method _setHref
          +* @description Sets the value of the button's "href" attribute.
          +* @protected
          +* @param {String} p_sHref String indicating the value for the button's 
          +* "href" attribute.
          +*/
          +_setHref: function(p_sHref) {
          +
          +    if(this.get("type") == "link") {
          +
          +        this._button.href = p_sHref;
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _setTarget
          +* @description Sets the value of the button's "target" attribute.
          +* @protected
          +* @param {String} p_sTarget String indicating the value for the button's 
          +* "target" attribute.
          +*/
          +_setTarget: function(p_sTarget) {
          +
          +    if(this.get("type") == "link") {
          +
          +        this._button.setAttribute("target", p_sTarget);
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _setChecked
          +* @description Sets the value of the button's "target" attribute.
          +* @protected
          +* @param {Boolean} p_bChecked Boolean indicating the value for the button's 
          +* "checked" attribute.
          +*/
          +_setChecked: function(p_bChecked) {
          +
          +    var sType = this.get("type"),
          +        sTitle;
          +
          +    if(sType == "checkbox" || sType == "radio") {
          +
          +        if(p_bChecked) {
          +
          +            this.addClass("checked");
          +            
          +            sTitle = (sType == "radio") ? 
          +                        this.RADIO_CHECKED_TITLE : 
          +                        this.CHECKBOX_CHECKED_TITLE;
          +        
          +        }
          +        else {
          +
          +            this.removeClass("checked");
          +
          +            sTitle = (sType == "radio") ? 
          +                        this.RADIO_DEFAULT_TITLE : 
          +                        this.CHECKBOX_DEFAULT_TITLE;
          +        
          +        }
          +
          +        this.set("title", sTitle);
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _setMenu
          +* @description Sets the value of the button's "menu" attribute.
          +* @protected
          +* @param {Object} p_oMenu Object indicating the value for the button's 
          +* "menu" attribute.
          +*/
          +_setMenu: function(p_oMenu) {
          +
          +    var Menu = YAHOO.widget.Menu,
          +        oMenu,
          +        me = this;
          +
          +    if(!Menu) {
          +
          +        this.logger.log("YAHOO.widget.Menu dependency not met.", "error");
          +
          +        return false;
          +    
          +    }
          +
          +
          +    function initMenu() {
          +    
          +        if(oMenu) {
          +    
          +            oMenu.showEvent.subscribe(this._onMenuShow, this, true);
          +            oMenu.hideEvent.subscribe(this._onMenuHide, this, true);
          +            oMenu.keyDownEvent.subscribe(this._onMenuKeyDown, this, true);
          +            oMenu.renderEvent.subscribe(this._onMenuRender, this, true);
          +            oMenu.clickEvent.subscribe(this._onMenuClick, this, true);
          +            oMenu.itemAddedEvent.subscribe(this._onMenuItemAdded, this, true);
          +
          +            var oSrcElement = oMenu.srcElement;
          +    
          +            if(oSrcElement && oSrcElement.tagName.toUpperCase() == "SELECT") {
          +    
          +                oSrcElement.style.display = "none";
          +                oSrcElement.parentNode.removeChild(oSrcElement);
          +    
          +            }
          +    
          +            this._menu = oMenu;
          +    
          +        }
          +        else {
          +    
          +            this._menu.destroy();
          +            this._menu = null;
          +    
          +        }
          +    
          +    }
          +
          +
          +    if(p_oMenu instanceof Menu) {
          +
          +        oMenu = p_oMenu;
          +        
          +        var aItems = oMenu.getItems(),
          +            nItems = aItems.length,
          +            oItem;
          +    
          +        if(nItems > 0) {
          +    
          +            var i = nItems - 1;
          +    
          +            do {
          +    
          +                oItem = aItems[i];
          +    
          +                if(oItem) {
          +    
          +                    oItem.cfg.subscribeToConfigEvent(
          +                                "selected", 
          +                                this._onMenuItemSelected, 
          +                                oItem, 
          +                                this
          +                            );
          +    
          +                }
          +            
          +            }
          +            while(i--);
          +    
          +        }
          +
          +        initMenu.call(this);
          +
          +    }
          +    else if(Lang.isArray(p_oMenu)) {
          +
          +        this.on("appendTo", function() {
          +
          +            oMenu = new Menu(
          +                            Dom.generateId(), 
          +                            { lazyload: true, itemdata: p_oMenu }
          +                        );
          +    
          +            initMenu.call(me);
          +        
          +        });
          +       
          +    }
          +    else if(Lang.isString(p_oMenu)) {
          +
          +        Event.onContentReady(p_oMenu, function() {
          +
          +            oMenu = new Menu(this, { lazyload: true });
          +
          +            initMenu.call(me);
          +        
          +        });
          +    
          +    }
          +    else if(p_oMenu && p_oMenu.nodeName) {
          +
          +        oMenu = new Menu(p_oMenu, { lazyload: true });
          +    
          +        initMenu.call(this);
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _setOnClick
          +* @description Sets the value of the button's "onclick" attribute.
          +* @protected
          +* @param {Object} p_oObject Object indicating the value for the button's 
          +* "onclick" attribute.
          +*/
          +_setOnClick: function(p_oObject) {
          +
          +    /*
          +        Remove any existing listeners if a "click" event handler has already 
          +        been specified.
          +    */
          +
          +    if(
          +        this._onclickAttributeValue && 
          +        (this._onclickAttributeValue != p_oObject)
          +    ) {
          +
          +        this.removeListener("click", this._onclickAttributeValue.fn);
          +
          +        this._onclickAttributeValue = null;
          +
          +    }
          +
          +
          +    if(
          +        !this._onclickAttributeValue && 
          +        Lang.isObject(p_oObject) && 
          +        Lang.isFunction(p_oObject.fn)
          +    ) {
          +
          +        this.on("click", p_oObject.fn, p_oObject.obj, p_oObject.scope);
          +
          +        this._onclickAttributeValue = p_oObject;
          +
          +    }
          +
          +},
          +
          +
          +
          +// Protected methods
          +
          +
          +/**
          +* @method _createButtonElement
          +* @description Creates the button's element.
          +* @protected
          +* @param {String} p_sType String indicating the type of element to create.
          +* @return {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
          +* level-one-html.html#ID-58190037">HTMLElement</a>}
          +*/
          +_createButtonElement: function(p_sType) {
          +
          +    var sTagName = this.TAG_NAME,
          +        oElement = document.createElement(sTagName);
          +
          +    oElement.innerHTML =  
          +    
          +        "<" + sTagName + " class=\"first-child\">" + 
          +        (p_sType == "link" ? "<a></a>" : "<button type=\"button\"></button>") + 
          +        "</" + sTagName + ">";
          +
          +    return oElement;
          +
          +},
          +
          +
          +/**
          +* @method _isActivationKey
          +* @description Determines if the specified keycode is one that toggles the 
          +* button's "active" state.
          +* @protected
          +* @param {Number} p_nKeyCode Number representing the keycode to be evaluated.
          +* @return {Boolean}
          +*/
          +_isActivationKey: function(p_nKeyCode) {
          +
          +    var sType = this.get("type"),
          +        aKeyCodes = (sType == "checkbox" || sType == "radio") ? 
          +            this.CHECK_ACTIVATION_KEYS : this.ACTIVATION_KEYS,
          +
          +        nKeyCodes = aKeyCodes.length;
          +
          +    if(nKeyCodes > 0) {
          +
          +        var i = nKeyCodes - 1;
          +
          +        do {
          +
          +            if(p_nKeyCode == aKeyCodes[i]) {
          +
          +                return true;
          +
          +            }
          +
          +        }
          +        while(i--);
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _isSplitButtonOptionKey
          +* @description Determines if the specified keycode is one that toggles the 
          +* display of the split button's menu.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +* @return {Boolean}
          +*/
          +_isSplitButtonOptionKey: function(p_oEvent) {
          +
          +    return (
          +        p_oEvent.ctrlKey && 
          +        p_oEvent.shiftKey && 
          +        Event.getCharCode(p_oEvent) == 77
          +    );
          +
          +},
          +
          +
          +/**
          +* @method _addListenersToForm
          +* @description Adds event handlers to the button's form.
          +* @protected
          +*/
          +_addListenersToForm: function() {
          +
          +    var oForm = this.getForm();
          +
          +    if(oForm) {
          +
          +        Event.on(oForm, "reset", this._onFormReset, null, this);
          +        Event.on(oForm, "submit", this._onFormSubmit, null, this);
          +
          +        var oSrcElement = this.get("srcelement");
          +
          +
          +        if (
          +            (m_bIE || m_bGecko) && 
          +            (
          +                this.get("type") == "submit" || 
          +                (oSrcElement && oSrcElement.type == "submit")
          +            )
          +        ) {
          +        
          +            var aListeners = Event.getListeners(oForm, "keydown"),
          +                bHasKeyDownListener = false;
          +    
          +            if(aListeners) {
          +    
          +                var nListeners = aListeners.length;
          +    
          +                if(nListeners > 0) {
          +    
          +                    var i = nListeners - 1;
          +                    
          +                    do {
          +       
          +                        if(
          +                            aListeners[i].fn == 
          +                            YAHOO.widget.Button.onFormKeyDown
          +                        ) {
          +        
          +                            bHasKeyDownListener = true;
          +                            break;
          +                        
          +                        }
          +        
          +                    }
          +                    while(i--);
          +                
          +                }
          +            
          +            }
          +    
          +    
          +            if(!bHasKeyDownListener) {
          +    
          +                Event.on(
          +                        oForm, 
          +                        "keydown", 
          +                        YAHOO.widget.Button.onFormKeyDown, 
          +                        null, 
          +                        this
          +                    );
          +    
          +            }
          +
          +        }
          +    
          +    }
          +
          +},
          +
          +
          +_originalMaxHeight: -1,
          +
          +
          +/**
          +* @method _showMenu
          +* @description Shows the button's menu.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event) that triggered the display of
          +* the menu.
          +*/
          +_showMenu: function(p_oEvent) {
          +
          +    var oMenu = this._menu;
          +
          +    if(oMenu) {
          +
          +        YAHOO.widget.MenuManager.hideVisible();
          +
          +        oMenu.cfg.applyConfig({
          +                context:[this.get("id"), "tl", "bl"], 
          +                clicktohide: false,
          +                constraintoviewport: false,
          +                visible: true
          +            });
          +            
          +        oMenu.cfg.fireQueue();
          +
          +        /*
          +            Stop the propagation of the event so that the MenuManager 
          +            doesn't blur the menu after it gets focus.
          +        */
          +
          +        if(p_oEvent.type == "mousedown") {
          +
          +            Event.stopPropagation(p_oEvent);
          +
          +        }
          +
          +        this._menu.focus(); 
          +
          +
          +        var nViewportHeight = Dom.getViewportHeight(),
          +            nMenuHeight = oMenu.element.offsetHeight;
          +
          +
          +        if((oMenu.cfg.getProperty("y") + nMenuHeight) > nViewportHeight) {
          +
          +            this.logger.log("Current menu position will place a portion, or " +
          +                "the entire menu outside the boundary of the viewport.  " + 
          +                "Repositioning the menu to stay inside the viewport.");
          +
          +            oMenu.align("bl", "tl");
          +
          +            var nY = oMenu.cfg.getProperty("y"),
          +
          +                nScrollTop = (
          +                                document.documentElement.scrollTop || 
          +                                document.body.scrollTop
          +                            );
          +            
          +
          +            if(nScrollTop >= nY) {
          +
          +                if(this._originalMaxHeight == -1) {
          +
          +                    this._originalMaxHeight = 
          +                            oMenu.cfg.getProperty("maxheight");
          +
          +                }
          +
          +                oMenu.cfg.setProperty(
          +                            "maxheight", 
          +                            (nMenuHeight - ((nScrollTop - nY) + 20))
          +                        );
          +
          +                oMenu.align("bl", "tl");
          +
          +            }
          +
          +        }
          +
          +        oMenu.cfg.setProperty("constraintoviewport", true);
          +
          +    }            
          +
          +},
          +
          +
          +/**
          +* @method _hideMenu
          +* @description Hides the button's menu.
          +* @protected
          +*/
          +_hideMenu: function() {
          +
          +    var oMenu = this._menu;
          +
          +    if(oMenu && oMenu.cfg.getProperty("visible")) {
          +
          +        oMenu.hide();
          +
          +    }
          +
          +},
          +
          +
          +
          +
          +// Protected event handlers
          +
          +
          +/**
          +* @method _onMouseOver
          +* @description "mouseover" event handler for the button.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +_onMouseOver: function(p_oEvent) {
          +
          +    if(!this._hasMouseEventHandlers) {
          +
          +        this.on("mouseout", this._onMouseOut);
          +        this.on("mousedown", this._onMouseDown);
          +        this.on("mouseup", this._onMouseUp);
          +
          +        this._hasMouseEventHandlers = true;
          +
          +    }
          +
          +    this.addClass("hover");
          +
          +    if(this._activationButtonPressed) {
          +
          +        this.addClass("active");
          +
          +    }
          +
          +
          +    if(this._bOptionPressed) {
          +
          +        this.addClass("activeoption");
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _onMouseOut
          +* @description "mouseout" event handler for the button.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +_onMouseOut: function(p_oEvent) {
          +
          +    this.removeClass("hover");
          +
          +    if(this.get("type") != "menubutton") {
          +
          +        this.removeClass("active");
          +
          +    }
          +
          +    if(this._activationButtonPressed || this._bOptionPressed) {
          +
          +        Event.on(document, "mouseup", this._onDocumentMouseUp, null, this);
          +
          +    }
          +    
          +},
          +
          +
          +/**
          +* @method _onDocumentMouseUp
          +* @description "mouseup" event handler for the button.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +_onDocumentMouseUp: function(p_oEvent) {
          +
          +    this._activationButtonPressed = false;
          +    this._bOptionPressed = false;
          +
          +    var sType = this.get("type");
          +
          +    if(sType == "menubutton" || sType == "splitbutton") {
          +
          +        this.removeClass((sType == "menubutton" ? "active" : "activeoption"));
          +
          +        this._hideMenu();
          +
          +    }
          +
          +    Event.removeListener(document, "mouseup", this._onDocumentMouseUp);
          +
          +},
          +
          +
          +/**
          +* @method _onMouseDown
          +* @description "mousedown" event handler for the button.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +_onMouseDown: function(p_oEvent) {
          +
          +    if((p_oEvent.which || p_oEvent.button) == 1) {
          +
          +        if(!this.hasFocus()) {
          +        
          +            this.focus();
          +        
          +        }
          +
          +
          +        var sType = this.get("type");
          +
          +
          +        if(sType == "splitbutton") {
          +        
          +            var oElement = this.get("element"),
          +                nX = Event.getPageX(p_oEvent) - Dom.getX(oElement);
          +
          +            if((oElement.offsetWidth - this.OPTION_AREA_WIDTH) < nX) {
          +                
          +                this.fireEvent("option", p_oEvent);
          +
          +            }
          +            else {
          +
          +                this.addClass("active");
          +
          +                this._activationButtonPressed = true;
          +
          +            }
          +
          +        }
          +        else if(sType == "menubutton") {
          +
          +            if(this.hasClass("active")) {
          +
          +                this._hideMenu();
          +
          +                this._activationButtonPressed = false;
          +
          +            }
          +            else {
          +
          +                this._showMenu(p_oEvent);
          +
          +                this._activationButtonPressed = true;
          +            
          +            }
          +
          +        }
          +        else {
          +
          +            this.addClass("active");
          +
          +            this._activationButtonPressed = true;
          +        
          +        }
          +
          +
          +
          +        if(sType == "splitbutton" || sType == "menubutton") {
          +
          +            var me = this;
          +
          +            
          +            function onMouseUp() {
          +            
          +                me._hideMenu();
          +                me.removeListener("mouseup", onMouseUp);
          +            
          +            }
          +
          +
          +            this._hideMenuTimerId = window.setTimeout(function() {
          +            
          +                me.on("mouseup", onMouseUp);
          +            
          +            }, 250);
          +
          +        }
          +
          +    }
          +    
          +},
          +
          +
          +/**
          +* @method _onMouseUp
          +* @description "mouseup" event handler for the button.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +_onMouseUp: function(p_oEvent) {
          +
          +    if(this._hideMenuTimerId) {
          +
          +        window.clearTimeout(this._hideMenuTimerId);
          +
          +    }
          +
          +    var sType = this.get("type");
          +
          +    if(sType == "checkbox" || sType == "radio") {
          +
          +        this.set("checked", !(this.get("checked")));
          +    
          +    }
          +
          +
          +    this._activationButtonPressed = false;
          +    
          +
          +    if(this.get("type") != "menubutton") {
          +
          +        this.removeClass("active");
          +    
          +    }
          +    
          +},
          +
          +
          +/**
          +* @method _onFocus
          +* @description "focus" event handler for the button.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +_onFocus: function(p_oEvent) {
          +
          +    this.addClass("focus");
          +
          +    if(this._activationKeyPressed) {
          +
          +        this.addClass("active");
          +   
          +    }
          +
          +    m_oFocusedButton = this;
          +
          +
          +    if(!this._hasKeyEventHandlers) {
          +
          +        var oElement = this._button;
          +
          +        Event.on(oElement, "blur", this._onBlur, null, this);
          +        Event.on(oElement, "keydown", this._onKeyDown, null, this);
          +        Event.on(oElement, "keyup", this._onKeyUp, null, this);
          +
          +        this._hasKeyEventHandlers = true;
          +
          +    }
          +
          +
          +    this.fireEvent("focus", p_oEvent);
          +
          +},
          +
          +
          +/**
          +* @method _onBlur
          +* @description "blur" event handler for the button.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +_onBlur: function(p_oEvent) {
          +
          +    this.removeClass("focus");
          +
          +    if(this.get("type") != "menubutton") {
          +
          +        this.removeClass("active");
          +
          +    }    
          +
          +    if(this._activationKeyPressed) {
          +
          +        Event.on(document, "keyup", this._onDocumentKeyUp, null, this);
          +
          +    }
          +
          +
          +    m_oFocusedButton = null;
          +
          +    this.fireEvent("blur", p_oEvent);
          +   
          +},
          +
          +
          +/**
          +* @method _onDocumentKeyUp
          +* @description "keyup" event handler for the document.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +_onDocumentKeyUp: function(p_oEvent) {
          +
          +    if(this._isActivationKey(Event.getCharCode(p_oEvent))) {
          +
          +        this._activationKeyPressed = false;
          +        
          +        Event.removeListener(document, "keyup", this._onDocumentKeyUp);
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _onKeyDown
          +* @description "keydown" event handler for the button.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +_onKeyDown: function(p_oEvent) {
          +
          +    if(
          +        this.get("type") == "splitbutton" && 
          +        this._isSplitButtonOptionKey(p_oEvent)
          +    ) {
          +
          +        this.fireEvent("option", p_oEvent);
          +
          +    }
          +    else if(this._isActivationKey(Event.getCharCode(p_oEvent))) {
          +
          +        if(this.get("type") == "menubutton") {
          +
          +            this._showMenu(p_oEvent);
          +
          +        }
          +        else {
          +
          +            this._activationKeyPressed = true;
          +            
          +            this.addClass("active");
          +        
          +        }
          +    
          +    }
          +
          +
          +    var oMenu = this._menu;
          +
          +    if(
          +        oMenu && oMenu.cfg.getProperty("visible") && 
          +        Event.getCharCode(p_oEvent) == 27
          +    ) {
          +    
          +        oMenu.hide();
          +        this.focus();
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _onKeyUp
          +* @description "keyup" event handler for the button.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +_onKeyUp: function(p_oEvent) {
          +
          +    if(this._isActivationKey(Event.getCharCode(p_oEvent))) {
          +
          +        var sType = this.get("type");
          +
          +        if(sType == "checkbox" || sType == "radio") {
          +
          +            this.set("checked", !(this.get("checked")));
          +        
          +        }
          +
          +        this._activationKeyPressed = false;
          +
          +        if(this.get("type") != "menubutton") {
          +
          +            this.removeClass("active");
          +
          +        }
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _onClick
          +* @description "click" event handler for the button.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +_onClick: function(p_oEvent) {
          +
          +    var sType = this.get("type"),
          +        sTitle;
          +
          +    switch(sType) {
          +
          +        case "radio":
          +        case "checkbox":
          +
          +            if(this.get("checked")) {
          +                
          +                sTitle = (sType == "radio") ? 
          +                            this.RADIO_CHECKED_TITLE : 
          +                            this.CHECKBOX_CHECKED_TITLE;
          +            
          +            }
          +            else {
          +            
          +                sTitle = (sType == "radio") ? 
          +                            this.RADIO_DEFAULT_TITLE : 
          +                            this.CHECKBOX_DEFAULT_TITLE;
          +            
          +            }
          +            
          +            this.set("title", sTitle);
          +
          +        break;
          +
          +        case "submit":
          +
          +            this.submitForm();
          +        
          +        break;
          +
          +        case "reset":
          +
          +            var oForm = this.getForm();
          +
          +            if(oForm) {
          +
          +                oForm.reset();
          +            
          +            }
          +
          +        break;
          +
          +        case "menubutton":
          +
          +            sTitle = this._menu.cfg.getProperty("visible") ? 
          +                            this.MENUBUTTON_MENU_VISIBLE_TITLE : 
          +                            this.MENUBUTTON_DEFAULT_TITLE;
          +
          +            this.set("title", sTitle);
          +
          +        break;
          +
          +        case "splitbutton":
          +
          +            var oElement = this.get("element"),
          +                nX = Event.getPageX(p_oEvent) - Dom.getX(oElement);
          +
          +            if((oElement.offsetWidth - this.OPTION_AREA_WIDTH) < nX) {
          +
          +                return false;
          +            
          +            }
          +            else {
          +
          +                this._hideMenu();
          +    
          +                var oSrcElement = this.get("srcelement");
          +    
          +                if(oSrcElement && oSrcElement.type == "submit") {
          +    
          +                    this.submitForm();
          +                
          +                }
          +            
          +            }
          +
          +            sTitle = this._menu.cfg.getProperty("visible") ? 
          +                            this.SPLITBUTTON_OPTION_VISIBLE_TITLE : 
          +                            this.SPLITBUTTON_DEFAULT_TITLE;
          +
          +            this.set("title", sTitle);
          +
          +        break;
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _onAppendTo
          +* @description "appendTo" event handler for the button.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +_onAppendTo: function(p_oEvent) {
          +
          +    /*
          +        It is necessary to call "getForm" using "setTimeout" to make sure that 
          +        the button's "form" property returns a node reference.  Sometimes, if
          +        you try to get the reference immediately after appending the field, it
          +        is null.
          +    */
          +
          +    var me = this;
          +
          +    window.setTimeout(function() {
          +
          +        me._addListenersToForm();
          +
          +    }, 0);
          +
          +},
          +
          +
          +/**
          +* @method _onFormSubmit
          +* @description "submit" event handler for the button's form.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +_onFormSubmit: function(p_oEvent) {
          +
          +    var sType = this.get("type"),
          +        oMenuItem = this.get("selectedMenuItem"),
          +        oForm = this.getForm();
          +    
          +    
          +    if(sType == "radio" || sType == "checkbox") {
          +    
          +        YAHOO.log("Creating hidden field for button: " + this);
          +    
          +        this.createHiddenField();
          +    
          +    }
          +    else if(oMenuItem) {
          +    
          +        var oSrcElement = this._menu.srcElement;
          +
          +        if(oSrcElement && oSrcElement.tagName.toUpperCase() == "SELECT") {
          +
          +            oForm.appendChild(oSrcElement);
          +            oSrcElement.selectedIndex = oMenuItem.index;
          +
          +        }
          +        else {
          +    
          +            var oValue = (oMenuItem.value === null || oMenuItem.value === "") ? 
          +                                oMenuItem.cfg.getProperty("text") : 
          +                                oMenuItem.value;
          +
          +
          +            if(oValue) {
          +    
          +                var oField = createInputElement(
          +                                    "hidden", 
          +                                    (this.get("name") + "_options"),
          +                                    oValue
          +                                );
          +    
          +                oForm.appendChild(oField);
          +    
          +            }
          +    
          +        }                
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _onFormReset
          +* @description "reset" event handler for the button's form.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +_onFormReset: function(p_oEvent) {
          +
          +    var sType = this.get("type");
          +
          +    if(sType == "checkbox" || sType == "radio") {
          +
          +        this.resetValue("checked");
          +
          +    }
          +
          +    if(this._menu) {
          +
          +        this.resetValue("selectedMenuItem");
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _onDocumentMouseDown
          +* @description "mousedown" event handler for the document.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +_onDocumentMouseDown: function(p_oEvent) {
          +
          +    var oTarget = Event.getTarget(p_oEvent),
          +        oButtonElement = this.get("element"),
          +        oMenuElement = this._menu.element;
          +
          +    if(
          +        oTarget != oButtonElement && 
          +        !Dom.isAncestor(oButtonElement, oTarget) && 
          +        oTarget != oMenuElement && 
          +        !Dom.isAncestor(oMenuElement, oTarget)
          +    ) {
          +
          +        this._hideMenu();
          +
          +        Event.removeListener(
          +                document, 
          +                "mousedown", 
          +                this._onDocumentMouseDown
          +            );    
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _onOption
          +* @description "option" event handler for the button.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +_onOption: function(p_oEvent) {
          +
          +    if(this.hasClass("activeoption")) {
          +
          +        this._hideMenu();
          +
          +        this._bOptionPressed = false;
          +
          +    }
          +    else {
          +
          +        this._showMenu(p_oEvent);    
          +
          +        this._bOptionPressed = true;
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _onMenuShow
          +* @description "show" event handler for the button's 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.
          +*/
          +_onMenuShow: function(p_sType, p_aArgs) {
          +
          +    Event.on(document, "mousedown", this._onDocumentMouseDown, null, this);
          +
          +    var sTitle,
          +        sClass;
          +    
          +    if(this.get("type") == "splitbutton") {
          +
          +        sTitle = this.SPLITBUTTON_OPTION_VISIBLE_TITLE;
          +        sClass = "activeoption";
          +    
          +    }
          +    else {
          +
          +        sTitle = this.MENUBUTTON_MENU_VISIBLE_TITLE;        
          +        sClass = "active";
          +
          +    }
          +
          +    this.addClass(sClass);
          +    this.set("title", sTitle);
          +
          +},
          +
          +
          +/**
          +* @method _onMenuHide
          +* @description "hide" event handler for the button's 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.
          +*/
          +_onMenuHide: function(p_sType, p_aArgs) {
          +    
          +    if(this._originalMaxHeight != -1) {
          +    
          +        this._menu.cfg.setProperty("maxheight", this._originalMaxHeight);
          +
          +    }
          +
          +
          +    var sTitle,
          +        sClass;
          +    
          +    if(this.get("type") == "splitbutton") {
          +
          +        sTitle = this.SPLITBUTTON_DEFAULT_TITLE;
          +        sClass = "activeoption";
          +
          +    }
          +    else {
          +
          +        sTitle = this.MENUBUTTON_DEFAULT_TITLE;        
          +        sClass = "active";
          +    }
          +
          +
          +    this.removeClass(sClass);
          +    this.set("title", sTitle);
          +
          +
          +    if(this.get("type") == "splitbutton") {
          +
          +        this._bOptionPressed = false;
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _onMenuKeyDown
          +* @description "keydown" event handler for the button's 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.
          +*/
          +_onMenuKeyDown: function(p_sType, p_aArgs) {
          +
          +    var oEvent = p_aArgs[0];
          +
          +    if(Event.getCharCode(oEvent) == 27) {
          +
          +        this.focus();
          +
          +        if(this.get("type") == "splitbutton") {
          +        
          +            this._bOptionPressed = false;
          +        
          +        }
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _onMenuRender
          +* @description "render" event handler for the button's 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.
          +*/
          +_onMenuRender: function(p_sType, p_aArgs) {
          +
          +    this.get("element").parentNode.appendChild(this._menu.element);
          +
          +},
          +
          +
          +/**
          +* @method _onMenuItemSelected
          +* @description "selectedchange" event handler for each item in the 
          +* button's 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 {<a href="YAHOO.widget.MenuItem.html">YAHOO.widget.MenuItem</a>} 
          +* p_oItem Object representing the menu item that subscribed to the event.
          +*/
          +_onMenuItemSelected: function(p_sType, p_aArgs, p_oItem) {
          +    
          +    this.set("selectedMenuItem", p_oItem);
          +
          +},
          +
          +
          +/**
          +* @method _onMenuItemAdded
          +* @description "itemadded" event handler for the button's 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 {<a href="YAHOO.widget.MenuItem.html">YAHOO.widget.MenuItem</a>} 
          +* p_oItem Object representing the menu item that subscribed to the event.
          +*/
          +_onMenuItemAdded: function(p_sType, p_aArgs, p_oItem) {
          +    
          +    var oItem = p_aArgs[0];
          +
          +    oItem.cfg.subscribeToConfigEvent(
          +                "selected", 
          +                this._onMenuItemSelected, 
          +                oItem, 
          +                this
          +            );
          +
          +},
          +
          +
          +/**
          +* @method _onMenuClick
          +* @description "click" event handler for the button's 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.
          +*/
          +_onMenuClick: function(p_sType, p_aArgs) {
          +
          +    var oItem = p_aArgs[1];
          +
          +    if(oItem) {
          +
          +        var oSrcElement = this.get("srcelement");
          +    
          +        if(oSrcElement && oSrcElement.type == "submit") {
          +    
          +            this.submitForm();
          +    
          +        }
          +    
          +        this._hideMenu();
          +    
          +    }
          +
          +},
          +
          +
          +
          +// Public methods
          +
          +
          +/**
          +* @method createHiddenField
          +* @description Creates the button's hidden form field and appends it to its
          +* parent form.
          +* @return {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
          +* one-html.html#ID-6043025">HTMLInputElement</a>}
          +*/
          +createHiddenField: function () {
          +
          +    if (!this.get("disabled")) {
          +
          +        var sType = this.get("type"),
          +        
          +            bCheckable = (sType == "checkbox" || sType == "radio"),
          +        
          +            oField = createInputElement(
          +            
          +                        /*
          +                            Use "submit" type for IE so that the input 
          +                            element will be able to be clicked via a call to 
          +                            the "click" method by the "submitForm" method.
          +                        */
          +            
          +                        (bCheckable ? sType : (m_bIE ? "submit" : "hidden")),
          +                        this.get("name"),
          +                        this.get("value"),
          +                        this.get("checked")
          +                    ),
          +                    
          +            oForm = this.getForm();
          +    
          +
          +        if (oField) {
          +
          +            if (bCheckable || oField.type == "submit") {
          +
          +                oField.style.display = "none";
          +
          +            }
          +
          +
          +            if (oForm) {
          +        
          +                var oHiddenField = this._hiddenField;
          +        
          +                if (oHiddenField && Dom.inDocument(oHiddenField)) {
          +        
          +                    oForm.replaceChild(oField, oHiddenField);
          +        
          +                }
          +                else {
          +        
          +                    oForm.appendChild(oField);
          +                    
          +                }
          +            
          +            }
          +    
          +            this._hiddenField = oField;
          +    
          +            return oField;
          +
          +        }
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method submitForm
          +* @description Submits the form to which the button belongs.
          +* @protected
          +*/
          +submitForm: function(p_oMenuItem) {
          +
          +    var oForm = this.getForm();
          +
          +    if (oForm) {
          +
          +        var oInput = this.createHiddenField();
          +
          +        if (m_bIE) {
          +
          +            /*
          +                Clicking the button via a call to the "click" method will 
          +                cause IE to both fire the form's "submit" event as well as 
          +                submit the form.  Originally tried just firing the "submit"
          +                event via "fireEvent," but then the event could not 
          +                be cancelled.
          +            */            
          +
          +            oInput.click();
          +
          +        }
          +        else {  // Gecko, Opera, and Safari
          +
          +            var oEvent = document.createEvent("HTMLEvents");
          +            oEvent.initEvent("submit", true, true);
          +
          +            /*
          +                In Safari, dispatching a "submit" event to a form WILL cause  
          +                the form's "submit" event to fire, but WILL NOT submit the   
          +                form.  Therefore, we need to call the "submit" method as well.
          +            */
          +
          +            var bSubmitForm = oForm.dispatchEvent(oEvent);
          +          
          +            if(m_bSafari && bSubmitForm) {
          +
          +                oForm.submit();
          +            
          +            }
          +
          +        }
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @method init
          +* @description The Button class's initialization method.
          +* @param {String} p_oElement String specifying the id attribute of the 
          +* <code>&#60;input&#62;</code>, <code>&#60;a&#62;</code> or 
          +* <code>&#60;span&#62;</code> element to be used to create the button.
          +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
          +* one-html.html#ID-6043025">HTMLInputElement</a>|<a href="
          +* http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-html.html#
          +* ID-33759296">HTMLElement</a>} p_oElement Object reference for the 
          +* <code>&#60;input&#62;</code>, <code>&#60;a&#62;</code> or 
          +* <code>&#60;span&#62;</code> element to be used to create the button.
          +* @param {Object} p_oElement Object literal specifying a set of configuration 
          +* attributes used to create the button.
          +* @param {Object} p_oAttributes Optional. Object literal specifying a set of  
          +* configuration attributes used to create the button.
          +*/
          +init: function(p_oElement, p_oAttributes) {
          +
          +    var sTagName = p_oAttributes.type == "link" ? "A" : "BUTTON",
          +        oSrcElement = p_oAttributes.srcelement;
          +
          +
          +    this._button = p_oElement.getElementsByTagName(sTagName)[0];
          +
          +
          +    YAHOO.widget.Button.superclass.init.call(
          +            this, p_oElement, 
          +            p_oAttributes
          +        );
          +
          +
          +    m_oButtons[this.get("id")] = this;
          +
          +
          +    this.addClass(this.CSS_CLASS_NAME);
          +    
          +    if(m_bIE && !m_bIE7) {
          +
          +        this.addClass("ie6");
          +
          +    }
          +    
          +    this.addClass(this.get("type"));
          +
          +    Event.on(this._button, "focus", this._onFocus, null, this);
          +    this.on("mouseover", this._onMouseOver);
          +    this.on("click", this._onClick);
          +    this.on("appendTo", this._onAppendTo);
          +    
          +    var oContainer = this.get("container"),
          +        oElement = this.get("element");
          +
          +
          +    if(oContainer) {
          +
          +        if(Lang.isString(oContainer)) {
          +
          +            var me = this;
          +
          +            Event.onContentReady(oContainer, function() {
          +
          +                me.appendTo(this);            
          +            
          +            });
          +
          +        }
          +        else {
          +
          +            this.appendTo(oContainer);
          +
          +        }
          +
          +    }
          +    else if(
          +        !Dom.inDocument(oElement) && 
          +        oSrcElement && 
          +        oSrcElement.tagName.toUpperCase() == "INPUT"
          +    ) {
          +
          +        var oParentNode = oSrcElement.parentNode;
          +
          +        if(oParentNode) {
          +
          +            this.fireEvent("beforeAppendTo", {
          +                type: "beforeAppendTo",
          +                target: oParentNode
          +            });
          +    
          +            oParentNode.replaceChild(oElement, oSrcElement);
          +    
          +            this.fireEvent("appendTo", {
          +                type: "appendTo",
          +                target: oParentNode
          +            });
          +        
          +        }
          +
          +    }
          +    else if(
          +        Dom.inDocument(oElement) && 
          +        oSrcElement.tagName.toUpperCase() == "SPAN"
          +    ) {
          +
          +        this._addListenersToForm();
          +
          +    }
          +
          +    this.logger.log("Initialization completed.");
          +
          +},
          +
          +
          +/**
          +* @method initAttributes
          +* @description Initializes all of the configuration attributes used to create 
          +* the button.
          +* @param {Object} p_oAttributes Object literal specifying a set of 
          +* configuration attributes used to create the button.
          +*/
          +initAttributes: function(p_oAttributes) {
          +
          +    var oAttributes = p_oAttributes || {};
          +
          +    YAHOO.widget.Button.superclass.initAttributes.call(this, oAttributes);
          +
          +
          +    /**
          +    * @config type
          +    * @description String specifying the button's type.  Possible values are: 
          +    * "button," "link," "submit," "reset," "checkbox," "radio," "menubutton," 
          +    * and "splitbutton."
          +    * @default "button"
          +    * @type String
          +    */
          +    this.setAttributeConfig("type", {
          +
          +        value: (oAttributes.type || "button"),
          +        validator: Lang.isString,
          +        writeOnce: true,
          +        method: this._setType
          +
          +    });
          +
          +
          +    /**
          +    * @config label
          +    * @description String specifying the button's text label or innerHTML.
          +    * @default null
          +    * @type String
          +    */
          +    this.setAttributeConfig("label", {
          +
          +        value: oAttributes.label,
          +        validator: Lang.isString,
          +        method: this._setLabel
          +
          +    });
          +
          +
          +    /**
          +    * @config value
          +    * @description Object specifying the value for the button.
          +    * @default null
          +    * @type Object
          +    */
          +    this.setAttributeConfig("value", {
          +
          +        value: oAttributes.value
          +
          +    });
          +
          +
          +    /**
          +    * @config name
          +    * @description String specifying the name for the button.
          +    * @default null
          +    * @type String
          +    */
          +    this.setAttributeConfig("name", {
          +
          +        value: oAttributes.name,
          +        validator: Lang.isString
          +
          +    });
          +
          +
          +    /**
          +    * @config tabindex
          +    * @description Number specifying the tabindex for the button.
          +    * @default null
          +    * @type Number
          +    */
          +    this.setAttributeConfig("tabindex", {
          +
          +        value: oAttributes.tabindex,
          +        validator: Lang.isNumber,
          +        method: this._setTabIndex
          +
          +    });
          +
          +
          +    /**
          +    * @config title
          +    * @description String specifying the title for the button.
          +    * @default null
          +    * @type String
          +    */
          +    this.configureAttribute("title", {
          +
          +        value: oAttributes.title,
          +        validator: Lang.isString,
          +        method: this._setTitle
          +
          +    });
          +
          +
          +    /**
          +    * @config disabled
          +    * @description Boolean indicating if the button should be disabled.  
          +    * (Disabled buttons are dimmed and will not respond to user input 
          +    * or fire events.  Does not apply to button's of type "link.")
          +    * @default false
          +    * @type Boolean
          +    */
          +    this.setAttributeConfig("disabled", {
          +
          +        value: (oAttributes.disabled || false),
          +        validator: Lang.isBoolean,
          +        method: this._setDisabled
          +
          +    });
          +
          +
          +    /**
          +    * @config href
          +    * @description String specifying the href for the button.  Applies only to 
          +    * buttons of type "link."
          +    * @type String
          +    */
          +    this.setAttributeConfig("href", {
          +
          +        value: oAttributes.href,
          +        validator: Lang.isString,
          +        method: this._setHref
          +
          +    });
          +
          +
          +    /**
          +    * @config target
          +    * @description String specifying the target for the button.  Applies only  
          +    * to buttons of type "link."
          +    * @type String
          +    */
          +    this.setAttributeConfig("target", {
          +
          +        value: oAttributes.target,
          +        validator: Lang.isString,
          +        method: this._setTarget
          +
          +    });
          +
          +
          +    /**
          +    * @config checked
          +    * @description Boolean indicating if the button is checked.  Applies only
          +    * to buttons of type "radio" and "checkbox."
          +    * @default false
          +    * @type Boolean
          +    */
          +    this.setAttributeConfig("checked", {
          +
          +        value: (oAttributes.checked || false),
          +        validator: Lang.isBoolean,
          +        method: this._setChecked
          +
          +    });
          +
          +
          +	/**
          +	* @config container
          +	* @description HTML element reference or string specifying the id 
          +	* attribute of the HTML element that the button'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 null
          +	*/
          +    this.setAttributeConfig("container", {
          +
          +        value: oAttributes.container
          +
          +    });
          +
          +
          +	/**
          +	* @config srcelement
          +    * @description Object reference to the HTML element (either 
          +    * <code>&#60;input&#62;</code> or <code>&#60;span&#62;</code>) used to 
          +    * create the button.
          +	* @type <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
          +	* level-one-html.html#ID-58190037">HTMLElement</a>|String
          +	* @default null
          +	*/
          +    this.setAttributeConfig("srcelement", {
          +
          +        value: oAttributes.srcelement,
          +        writeOnce: true
          +
          +    });
          +
          +
          +	/**
          +	* @config menu
          +    * @description Object specifying the menu for the button.  The value can be
          +    * one of the following:
          +    * <ul>
          +    * <li>Object specifying a <a href="YAHOO.widget.Menu.html">
          +    * YAHOO.widget.Menu</a> instance.</li>
          +    * <li>String specifying the id attribute of the <code>&#60;div&#62;</code> 
          +    * element used to create the menu.</li>
          +    * <li>String specifying the id attribute of the 
          +    * <code>&#60;select&#62;</code> element used to create the menu.</li>
          +    * <li>Object specifying the <code>&#60;div&#62;</code> element used to 
          +    * create the menu.</li>
          +    * <li>Object specifying the <code>&#60;select&#62;</code> element used to 
          +    * create the menu.</li>
          +    * <li>Array of object literals, each representing a set of 
          +    * <a href="YAHOO.widget.MenuItem.html">YAHOO.widget.MenuItem</a> 
          +    * configuration attributes.</li>
          +    * <li>Array of strings representing the text labels for each menu item in 
          +    * the menu.</li>
          +    * </ul>
          +	* @type <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
          +	* level-one-html.html#ID-58190037">HTMLElement</a>|String|Array
          +	* @default null
          +	*/
          +    this.setAttributeConfig("menu", {
          +
          +        value: null,
          +        method: this._setMenu
          +    
          +    });
          +
          +
          +	/**
          +	* @config selectedMenuItem
          +    * @description Reference to the item in the button's menu that is
          +    * currently selected.
          +	* @type <a href="YAHOO.widget.MenuItem.html">YAHOO.widget.MenuItem</a>
          +	* @default null
          +	*/
          +    this.setAttributeConfig("selectedMenuItem", {
          +
          +        value: null
          +    
          +    });
          +
          +
          +	/**
          +	* @config onclick
          +    * @description Object literal representing the code to be executed when 
          +    * the button is clicked.  Format:<br> <code> {<br> 
          +    * <strong>fn:</strong> Function,   &#47;&#47; The handler to call when the 
          +    * event fires.<br> <strong>obj:</strong> Object, &#47;&#47; An object to 
          +    * pass back to the handler.<br> <strong>scope:</strong> Object &#47;&#47; 
          +    * The object to use for the scope of the handler.<br> } </code>
          +    * @type Object
          +	* @default null
          +	*/
          +    this.setAttributeConfig("onclick", {
          +
          +        value: oAttributes.onclick,
          +        method: this._setOnClick
          +    
          +    });
          +
          +},
          +
          +
          +/**
          +* @method focus
          +* @description Causes the button to receive the focus and fires the button's
          +* "focus" event.
          +*/
          +focus: function() {
          +
          +    if(!this.get("disabled")) {
          +
          +        this._button.focus();
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @method blur
          +* @description Causes the button to lose focus and fires the button's
          +* "blur" event.
          +*/
          +blur: function() {
          +
          +    if(!this.get("disabled")) {
          +
          +        this._button.blur();
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method hasFocus
          +* @description Returns a boolean indicating whether or not the button has focus.
          +* @return {Boolean}
          +*/
          +hasFocus: function() {
          +
          +    return (m_oFocusedButton == this);
          +
          +},
          +
          +
          +/**
          +* @method isActive
          +* @description Returns a boolean indicating whether or not the button is active.
          +* @return {Boolean}
          +*/
          +isActive: function() {
          +
          +    return this.hasClass("active");
          +
          +},
          +
          +
          +/**
          +* @method getMenu
          +* @description Returns a reference to the button's menu.
          +* @return {<a href="YAHOO.widget.Menu.html">YAHOO.widget.Menu</a>}
          +*/
          +getMenu: function() {
          +
          +    return this._menu;
          +
          +},
          +
          +
          +/**
          +* @method getForm
          +* @description Returns a reference to the button's parent form.
          +* @return {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
          +* one-html.html#ID-40002357">HTMLFormElement</a>}
          +*/
          +getForm: function() {
          +
          +    return this._button.form;
          +
          +},
          +
          +
          +/** 
          +* @method getHiddenField
          +* @description Returns a reference to the <code>&#60;input&#62;</code> element 
          +* used when the button's parent form is submitted.
          +* @return {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
          +* one-html.html#ID-6043025">HTMLInputElement</a>}
          +*/
          +getHiddenField: function() {
          +
          +    return this._hiddenField;
          +
          +},
          +
          +
          +/**
          +* @method destroy
          +* @description Removes the button's element from its parent element and 
          +* removes all event handlers.
          +*/
          +destroy: function() {
          +
          +    this.logger.log("Destroying ...");
          +
          +    var oElement = this.get("element"),
          +        oParentNode = oElement.parentNode,
          +        oMenu = this._menu;
          +
          +    if(oMenu) {
          +
          +        this.logger.log("Destroying menu.");
          +
          +        oMenu.destroy();
          +
          +    }
          +
          +    this.logger.log("Removing DOM event handlers.");
          +
          +    Event.purgeElement(oElement);
          +    Event.purgeElement(this._button);
          +    Event.removeListener(document, "mouseup", this._onDocumentMouseUp);
          +    Event.removeListener(document, "keyup", this._onDocumentKeyUp);
          +    Event.removeListener(document, "mousedown", this._onDocumentMouseDown);
          +
          +
          +    var oForm = this.getForm();
          +    
          +    if(oForm) {
          +
          +        Event.removeListener(oForm, "reset", this._onFormReset);
          +        Event.removeListener(oForm, "submit", this._onFormSubmit);
          +
          +    }
          +
          +
          +    oParentNode.removeChild(oElement);
          +
          +    this.logger.log("Removing from document.");
          +
          +    delete m_oButtons[this.get("id")];
          +
          +    this.logger.log("Destroyed.");
          +
          +},
          +
          +
          +fireEvent: function(p_sType , p_aArgs) {
          +
          +    //  Disabled buttons should not respond to DOM events
          +
          +    if(this.DOM_EVENTS[p_sType] && this.get("disabled")) {
          +
          +        return;
          +
          +    }
          +
          +    YAHOO.widget.Button.superclass.fireEvent.call(this, p_sType, p_aArgs);
          +
          +},
          +
          +
          +/**
          +* @method toString
          +* @description Returns a string representing the button.
          +* @return {String}
          +*/
          +toString: function() {
          +
          +    return ("Button " + this.get("id"));
          +
          +}
          +
          +});
          +
          +
          +/**
          +* @method onFormKeyDown
          +* @description "keydown" event handler for the button's form.
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +YAHOO.widget.Button.onFormKeyDown = function(p_oEvent) {
          +
          +    var oTarget = Event.getTarget(p_oEvent),
          +        nCharCode = Event.getCharCode(p_oEvent);
          +
          +
          +    if (
          +        nCharCode == 13 && 
          +        oTarget.tagName && 
          +        oTarget.tagName.toUpperCase() == "INPUT"
          +    ) {
          +
          +        var sType = oTarget.type;
          +
          +
          +        if(
          +            sType == "text" || sType == "password" || sType == "checkbox" || 
          +            sType == "radio" || sType == "file"
          +        ) {
          +
          +
          +            function isYUISubmitButton(p_oElement) {
          +    
          +                var sId = p_oElement.id;
          +    
          +                if (sId) {
          +    
          +                    var oButton = m_oButtons[sId];
          +        
          +                    if (oButton) {
          +        
          +                        var oSrcElement = oButton.get("srcelement");
          +        
          +                        return (
          +                                    oButton.get("type") == "submit" || 
          +                                    (
          +                                        oSrcElement && 
          +                                        oSrcElement.type == "submit"
          +                                    )
          +                                );
          +        
          +                    }
          +                
          +                }
          +            
          +            }
          +    
          +    
          +            var aButtons = Dom.getElementsBy(
          +                                isYUISubmitButton,
          +                                this.TAG_NAME, 
          +                                this.getForm()
          +                            ),
          +    
          +                nButtons = aButtons.length;
          +    
          +    
          +            if (nButtons > 0) {
          +    
          +                m_oButtons[aButtons[0].id].submitForm();
          +            
          +            }
          +
          +        
          +        }
          +
          +    }
          +
          +};
          +
          +
          +/**
          +* @method addHiddenFieldsToForm
          +* @description Searches the specified form and adds hidden fields for instances 
          +* of YAHOO.widget.Button that are of type "radio," "checkbox," "menubutton," 
          +* and "splitbutton."
          +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
          +* one-html.html#ID-40002357">HTMLFormElement</a>} p_oForm Object reference 
          +* for the form to search.
          +*/
          +YAHOO.widget.Button.addHiddenFieldsToForm = function(p_oForm) {
          +
          +    var aButtons = Dom.getElementsByClassName("yuibutton", "*", p_oForm),
          +        nButtons = aButtons.length;
          +
          +
          +    if(nButtons > 0) {
          +
          +        YAHOO.log("Form contains " + nButtons + " YUI buttons.");
          +
          +        var oButton = null,
          +            sType = null,
          +            oMenuItem = null,
          +            oMenu = null;
          +
          +        for(var i=0; i<nButtons; i++) {
          +
          +            oButton = m_oButtons[aButtons[i].id];
          +
          +            if(oButton) {
          +
          +                sType = oButton.get("type");
          +                oMenuItem = oButton.get("selectedMenuItem");
          +
          +
          +                if(sType == "radio" || sType == "checkbox") {
          +    
          +                    YAHOO.log("Creating hidden field for button: " + oButton);
          +    
          +                    oButton.createHiddenField();
          +                
          +                }
          +                else if(oMenuItem) {
          +    
          +                    oMenu = oButton.getMenu();
          +    
          +                    var oSrcElement = oMenu.srcElement;
          +                        
          +                    if(
          +                        oSrcElement && 
          +                        oSrcElement.tagName.toUpperCase() == "SELECT"
          +                    ) {
          +            
          +                        p_oForm.appendChild(oSrcElement);
          +                        oSrcElement.selectedIndex = oMenuItem.index;
          +            
          +                    }
          +                    else {
          +    
          +                        var oValue = (
          +                                        oMenuItem.value === null || 
          +                                        oMenuItem.value === ""
          +                                    ) ? oMenuItem.cfg.getProperty("text") : 
          +                                    oMenuItem.value;
          +
          +                        if(oValue) {
          +
          +                            var oHiddenField = oButton.getHiddenField(),
          +    
          +                                oField = createInputElement(
          +                                            "hidden",
          +                                            (oButton.get("name") + "_options"),
          +                                            oValue
          +                                        );
          +                                        
          +                            if(oHiddenField && Dom.inDocument(oHiddenField)) {
          +
          +                                p_oForm.replaceChild(oField, oHiddenField);
          +
          +                            }
          +                            else {
          +
          +                                p_oForm.appendChild(oField);
          +                            
          +                            }
          +    
          +                        }
          +    
          +                    }                
          +    
          +                }
          +                
          +            }
          +        
          +        }
          +
          +    }
          +
          +};
          +
          +
          +
          +// Events
          +
          +
          +/**
          +* @event focus
          +* @description Fires when the menu item receives focus.  Passes back a single 
          +* object representing the original DOM event object passed back by the event 
          +* utility (YAHOO.util.Event) when the event was fired.  See <a href="
          +* YAHOO.util.Element.html#addListener">Element.addListener</a> for more 
          +* information on listening for this event.
          +* @type YAHOO.util.CustomEvent
          +*/
          +
          +
          +/**
          +* @event blur
          +* @description Fires when the menu item loses the input focus.  Passes back a 
          +* single object representing the original DOM event object passed back by the 
          +* event utility (YAHOO.util.Event) when the event was fired.  See <a href="
          +* YAHOO.util.Element.html#addListener">Element.addListener</a> for more 
          +* information on listening for this event.
          +* @type YAHOO.util.CustomEvent
          +*/
          +
          +
          +/**
          +* @event option
          +* @description Fires when the user invokes the button's option.  Passes back a 
          +* single object representing the original DOM event (either "mousedown" or 
          +* "keydown") that caused the "option" event to fire.  See <a href="
          +* YAHOO.util.Element.html#addListener">Element.addListener</a> for more 
          +* information on listening for this event.
          +* @type YAHOO.util.CustomEvent
          +*/
          +
          +})();
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/buttongroup.js.html b/www/extras/yui/docs/buttongroup.js.html new file mode 100644 index 000000000..05c7b5417 --- /dev/null +++ b/www/extras/yui/docs/buttongroup.js.html @@ -0,0 +1,952 @@ + + + + API: button buttongroup.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Button  2.2.2

          +

          + Yahoo! UI Library + > button + + > buttongroup.js (source view) +

          +
          + +
          +
          +
          + +
          +
          (function() {
          +
          +// Shorthard for utilities
          +
          +var Dom = YAHOO.util.Dom,
          +    Event = YAHOO.util.Event,
          +    Lang = YAHOO.lang,
          +    Button = YAHOO.widget.Button;    
          +
          +    // Private collection of radio buttons
          +
          +    m_oButtons = {};
          +
          +
          +
          +/**
          +* The ButtonGroup class creates a set of buttons that are mutually exclusive; 
          +* checking one button in the set will uncheck all others in the button group.
          +* @param {String} p_oElement String specifying the id attribute of the 
          +* <code>&#60;div&#62;</code> element of the button group.
          +* @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 button group.
          +* @param {Object} p_oElement Object literal specifying a set of 
          +* configuration attributes used to create the button group.
          +* @param {Object} p_oAttributes Optional. Object literal specifying a set of 
          +* configuration attributes used to create the button group.
          +* @namespace YAHOO.widget
          +* @class ButtonGroup
          +* @constructor
          +* @extends YAHOO.util.Element
          +*/
          +YAHOO.widget.ButtonGroup = function(p_oElement, p_oAttributes) {
          +
          +    var fnSuperClass = YAHOO.widget.ButtonGroup.superclass.constructor;
          +
          +    if(
          +        arguments.length == 1 && 
          +        !Lang.isString(p_oElement) && 
          +        !p_oElement.nodeName
          +    ) {
          +
          +        if(!p_oElement.id) {
          +
          +            var sId = Dom.generateId();
          +
          +            p_oElement.id = sId;
          +
          +            YAHOO.log(
          +                "No value specified for the button group's \"id\" attribute. " +
          +                "Setting button group id to \"" + sId + "\".",
          +                "warn"
          +            );
          +
          +        }
          +
          +        this.logger = new YAHOO.widget.LogWriter("ButtonGroup " + sId);
          +
          +        this.logger.log(
          +                "No source HTML element.  "  +
          +                "Building the button group using the set of " + 
          +                "configuration attributes."
          +            );
          +
          +        fnSuperClass.call(this, (this._createGroupElement()), p_oElement);
          +
          +    }
          +    else if(Lang.isString(p_oElement)) {
          +
          +        var oElement = Dom.get(p_oElement);
          +
          +        if (oElement) {
          +        
          +            if(oElement.nodeName.toUpperCase() == this.TAG_NAME) {
          +
          +                this.logger = 
          +                    new YAHOO.widget.LogWriter("ButtonGroup " + p_oElement);
          +        
          +                fnSuperClass.call(this, oElement, p_oAttributes);
          +
          +            }
          +
          +        }
          +    
          +    }
          +    else {
          +
          +        var sNodeName = p_oElement.nodeName;
          +
          +        if(sNodeName && sNodeName == this.TAG_NAME) {
          +    
          +            if(!p_oElement.id) {
          +    
          +                p_oElement.id = Dom.generateId();
          +    
          +                YAHOO.log(
          +                    "No value specified for the button group's \"id\" " +
          +                    "attribute. Setting button group id " +
          +                    "to \"" + p_oElement.id + "\".",
          +                    "warn"
          +                );
          +    
          +            }
          +    
          +            this.logger = 
          +                    new YAHOO.widget.LogWriter("ButtonGroup " + p_oElement.id);
          +    
          +            fnSuperClass.call(this, p_oElement, p_oAttributes);
          +
          +        }
          +
          +    }
          +
          +};
          +
          +
          +YAHOO.extend(YAHOO.widget.ButtonGroup, YAHOO.util.Element, {
          +
          +
          +// Protected properties
          +
          +
          +/** 
          +* @property _buttons
          +* @description Array of buttons in the button group.
          +* @default null
          +* @protected
          +* @type Array
          +*/
          +_buttons: null,
          +
          +
          +
          +// Constants
          +
          +
          +/**
          +* @property TAG_NAME
          +* @description The name of the tag to be used for the button group's element. 
          +* @default "DIV"
          +* @final
          +* @type String
          +*/
          +TAG_NAME: "DIV",
          +
          +
          +/**
          +* @property CSS_CLASS_NAME
          +* @description String representing the CSS class(es) to be applied to the 
          +* button group's element.
          +* @default "yuibuttongroup"
          +* @final
          +* @type String
          +*/
          +CSS_CLASS_NAME: "yuibuttongroup",
          +
          +
          +
          +// Protected methods
          +
          +
          +/**
          +* @method _createGroupElement
          +* @description Creates the button group's element.
          +* @protected
          +* @return {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
          +* level-one-html.html#ID-22445964">HTMLDivElement</a>}
          +*/
          +_createGroupElement: function() {
          +
          +    var oElement = document.createElement(this.TAG_NAME);
          +
          +    return oElement;
          +
          +},
          +
          +
          +
          +// Protected attribute setter methods
          +
          +
          +/**
          +* @method _setDisabled
          +* @description Sets the value of the button groups's "disabled" attribute.
          +* @protected
          +* @param {Boolean} p_bDisabled Boolean indicating the value for the button
          +* group's "disabled" attribute.
          +*/
          +_setDisabled: function(p_bDisabled) {
          +
          +    var nButtons = this.getCount();
          +
          +    if(nButtons > 0) {
          +
          +        var i = nButtons - 1;
          +        
          +        do {
          +
          +            this._buttons[i].set("disabled", p_bDisabled);
          +        
          +        }
          +        while(i--);
          +
          +    }
          +
          +},
          +
          +
          +
          +// Protected event handlers
          +
          +
          +/**
          +* @method _onKeyDown
          +* @description "keydown" event handler for the button group.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +*/
          +_onKeyDown: function(p_oEvent) {
          +
          +    var oTarget = Event.getTarget(p_oEvent),
          +        nCharCode = Event.getCharCode(p_oEvent),
          +        sId = oTarget.parentNode.parentNode.id,
          +        oButton = m_oButtons[sId],
          +        nIndex = -1;
          +
          +
          +    if(nCharCode == 37 || nCharCode == 38) {
          +
          +        nIndex = (oButton.index === 0) ? 
          +                    (this._buttons.length -1) : (oButton.index - 1);
          +    
          +    }
          +    else if(nCharCode == 39 || nCharCode == 40) {
          +
          +        nIndex = (oButton.index === (this._buttons.length - 1)) ? 
          +                    0 : (oButton.index + 1);
          +
          +    }
          +
          +
          +    if(nIndex > -1) {
          +
          +        this.check(nIndex);
          +        this.getButton(nIndex).focus();
          +    
          +    }        
          +
          +},
          +
          +
          +/**
          +* @method _onAppendTo
          +* @description "appendTo" event handler for the button group.
          +* @protected
          +* @param {Event} p_oEvent Object representing the event that was fired.
          +*/
          +_onAppendTo: function(p_oEvent) {
          +
          +    var aButtons = this._buttons,
          +        nButtons = aButtons.length;
          +
          +    for(var i=0; i<nButtons; i++) {
          +
          +        aButtons[i].appendTo(this.get("element"));
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _onButtonCheckedChange
          +* @description "checkedChange" event handler for each button in the 
          +* button group.
          +* @protected
          +* @param {Event} p_oEvent Object representing the event that was fired.
          +* @param {<a href="YAHOO.widget.Button.html">YAHOO.widget.Button</a>} p_oButton 
          +* Object representing the button that fired the event.
          +*/
          +_onButtonCheckedChange: function(p_oEvent, p_oButton) {
          +
          +    var bChecked = p_oEvent.newValue,
          +        oCheckedButton = this.get("checkedButton");
          +
          +    if(bChecked && oCheckedButton != p_oButton) {
          +
          +        if(oCheckedButton) {
          +
          +            oCheckedButton.set("checked", false, true);
          +
          +        }
          +
          +        this.set("checkedButton", p_oButton);
          +        this.set("value", p_oButton.get("value"));
          +
          +    }
          +    else if(oCheckedButton && !oCheckedButton.set("checked")) {
          +
          +        oCheckedButton.set("checked", true, true);
          +
          +    }
          +   
          +},
          +
          +
          +
          +// Public methods
          +
          +
          +/**
          +* @method init
          +* @description The ButtonGroup class's initialization method.
          +* @param {String} p_oElement String specifying the id attribute of the 
          +* <code>&#60;div&#62;</code> element of the button group.
          +* @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 button group.
          +* @param {Object} p_oElement Object literal specifying a set of configuration 
          +* attributes used to create the button group.
          +* @param {Object} p_oAttributes Optional. Object literal specifying a set of 
          +* configuration attributes used to create the button group.
          +*/
          +init: function(p_oElement, p_oAttributes) {
          +
          +    this._buttons = [];
          +
          +    YAHOO.widget.ButtonGroup.superclass.init.call(
          +            this, p_oElement, 
          +            p_oAttributes
          +        );
          +
          +    this.addClass(this.CSS_CLASS_NAME);
          +
          +    this.logger.log(
          +        "Searching for child nodes with the class name " +
          +        "\"yuibutton\" to add to the button group."
          +    );
          +
          +    var aButtons = this.getElementsByClassName("yuibutton");
          +
          +
          +    if(aButtons.length > 0) {
          +
          +        this.logger.log(
          +            "Found " + aButtons.length + " child nodes with the class " + 
          +            "name \"yuibutton.\"  Attempting to add to button group."
          +        );
          +
          +        this.addButtons(aButtons);
          +
          +    }
          +
          +
          +    this.logger.log(
          +        "Searching for child nodes with the type of \"radio\" to add to the " +
          +        " button group."
          +    );
          +
          +    function isRadioButton(p_oElement) {
          +
          +        return (p_oElement.type == "radio");
          +
          +    }
          +
          +    aButtons = Dom.getElementsBy(isRadioButton, "input", this.get("element"));
          +
          +
          +    if(aButtons.length > 0) {
          +
          +        this.logger.log(
          +            "Found " + aButtons.length + " child nodes with the type of " +
          +            "\"radio.\"  Attempting to add to button group."
          +        );
          +
          +        this.addButtons(aButtons);
          +
          +    }
          +
          +    this.on("keydown", this._onKeyDown);
          +    this.on("appendTo", this._onAppendTo);
          +
          +    var oContainer = this.get("container");
          +
          +    if(oContainer) {
          +
          +        if(Lang.isString(oContainer)) {
          +
          +            var me = this;
          +
          +            Event.onContentReady(oContainer, function() {
          +
          +                me.appendTo(this);            
          +            
          +            });
          +
          +        }
          +        else {
          +
          +            this.appendTo(oContainer);
          +
          +        }
          +
          +    }
          +
          +
          +    this.logger.log("Initialization completed.");
          +
          +},
          +
          +
          +/**
          +* @method initAttributes
          +* @description Initializes all of the configuration attributes used to create  
          +* the button group.
          +* @param {Object} p_oAttributes Object literal specifying a set of 
          +* configuration attributes used to create the button group.
          +*/
          +initAttributes: function(p_oAttributes) {
          +
          +    var oAttributes = p_oAttributes || {};
          +
          +    YAHOO.widget.ButtonGroup.superclass.initAttributes.call(
          +        this, 
          +        oAttributes
          +    );
          +
          +
          +    /**
          +    * @config name
          +    * @description String specifying the name for the button group.  This
          +    * name will be applied to each button in the button group.
          +    * @default null
          +    * @type String
          +    */
          +    this.setAttributeConfig("name", {
          +
          +        value: oAttributes.name,
          +        validator: Lang.isString
          +
          +    });
          +
          +
          +    /**
          +    * @config disabled
          +    * @description Boolean indicating if the button group should be disabled.  
          +    * Disabling the button group will disable each button in the button group.  
          +    * Disabled buttons are dimmed and will not respond to user input 
          +    * or fire events.
          +    * @default false
          +    * @type Boolean
          +    */
          +    this.setAttributeConfig("disabled", {
          +
          +        value: (oAttributes.disabled || false),
          +        validator: Lang.isBoolean,
          +        method: this._setDisabled
          +
          +    });
          +
          +
          +    /**
          +    * @config value
          +    * @description Object specifying the value for the button group.
          +    * @default null
          +    * @type Object
          +    */
          +    this.setAttributeConfig("value", {
          +
          +        value: oAttributes.value
          +
          +    });
          +
          +
          +	/**
          +	* @config container
          +	* @description HTML element reference or string specifying the id 
          +	* attribute of the HTML element that the button group'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 null
          +	*/
          +    this.setAttributeConfig("container", {
          +
          +        value: oAttributes.container
          +
          +    });
          +
          +
          +	/**
          +	* @config checkedButton
          +    * @description Reference for the button in the button group that 
          +    * is checked.
          +	* @type {<a href="YAHOO.widget.Button.html">YAHOO.widget.Button</a>}
          +	* @default null
          +	*/
          +    this.setAttributeConfig("checkedButton", {
          +
          +        value: null
          +
          +    });
          +
          +},
          +
          +
          +/**
          +* @method addButton
          +* @description Adds the button to the button group.
          +* @param {<a href="YAHOO.widget.Button.html">YAHOO.widget.Button</a>} p_oButton 
          +* Object reference for the <a href="YAHOO.widget.Button.html">
          +* YAHOO.widget.Button</a> instance to be added to the button group.
          +* @param {String} p_oButton String specifying the id attribute of the 
          +* <code>&#60;input&#62;</code> or <code>&#60;span&#62;</code> element to be 
          +* used to create the button to be added to the button group.
          +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
          +* one-html.html#ID-6043025">HTMLInputElement</a>|<a href="
          +* http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-html.html#
          +* ID-33759296">HTMLElement</a>} p_oButton Object reference for the 
          +* <code>&#60;input&#62;</code> or <code>&#60;span&#62;</code> element to be 
          +* used to create the button to be added to the button group.
          +* @param {Object} p_oButton Object literal specifying a set of 
          +* <a href="YAHOO.widget.Button.html">YAHOO.widget.Button</a> configuration 
          +* attributes used to configure the button to be added to the button group.
          +* @return {<a href="YAHOO.widget.Button.html">YAHOO.widget.Button</a>} 
          +*/
          +addButton: function(p_oButton) {
          +
          +    var oButton;
          +
          +
          +    if(p_oButton instanceof Button && p_oButton.get("type") == "radio") {
          +
          +        oButton = p_oButton;
          +
          +    }
          +    else if(!Lang.isString(p_oButton) && !p_oButton.nodeName) {
          +
          +        p_oButton.type = "radio";
          +
          +        oButton = new Button(p_oButton);
          +    
          +    }
          +    else {
          +
          +        oButton = new Button(p_oButton, { type: "radio" });
          +
          +    }
          +
          +
          +    if(oButton) {
          +
          +        var nIndex = this._buttons.length,
          +            sButtonName = oButton.get("name"),
          +            sGroupName = this.get("name");
          +
          +        oButton.index = nIndex;
          +
          +        this._buttons[nIndex] = oButton;
          +        m_oButtons[oButton.get("id")] = oButton;
          +
          +
          +        if(sButtonName != sGroupName) {
          +
          +            oButton.set("name", sGroupName);
          +        
          +        }
          +
          +
          +        if(this.get("disabled")) {
          +
          +            oButton.set("disabled", true);
          +
          +        }
          +
          +
          +        if(oButton.get("checked")) {
          +
          +            this.set("checkedButton", oButton);
          +
          +        }
          +
          +        
          +        oButton.on("checkedChange", this._onButtonCheckedChange, oButton, this);
          +
          +        this.logger.log("Button " + oButton.get("id") + " added.");
          +
          +        return oButton;
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method addButtons
          +* @description Adds the array of buttons to the button group.
          +* @param {Array} p_aButtons Array of <a href="YAHOO.widget.Button.html">
          +* YAHOO.widget.Button</a> instances to be added 
          +* to the button group.
          +* @param {Array} p_aButtons Array of strings specifying the id attribute of 
          +* the <code>&#60;input&#62;</code> or <code>&#60;span&#62;</code> elements to 
          +* be used to create the buttons to be added to the button group.
          +* @param {Array} p_aButtons Array of object references for the 
          +* <code>&#60;input&#62;</code> or <code>&#60;span&#62;</code> elements to be 
          +* used to create the buttons to be added to the button group.
          +* @param {Array} p_aButtons Array of object literals, each containing a set of 
          +* <a href="YAHOO.widget.Button.html">YAHOO.widget.Button</a> configuration 
          +* attributes used to configure each button to be added to the button group.
          +* @return {Array}
          +*/
          +addButtons: function(p_aButtons) {
          +
          +    if(Lang.isArray(p_aButtons)) {
          +    
          +        var nButtons = p_aButtons.length,
          +            oButton,
          +            aButtons = [];
          +
          +        if(nButtons > 0) {
          +
          +            for(var i=0; i<nButtons; i++) {
          +
          +                oButton = this.addButton(p_aButtons[i]);
          +                
          +                if(oButton) {
          +
          +                    aButtons[aButtons.length] = oButton;
          +
          +                }
          +            
          +            }
          +
          +            if(aButtons.length > 0) {
          +
          +                this.logger.log(aButtons.length + " buttons added.");
          +
          +                return aButtons;
          +
          +            }
          +        
          +        }
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method removeButton
          +* @description Removes the button at the specified index from the button group.
          +* @param {Number} p_nIndex Number specifying the index of the button to be 
          +* removed from the button group.
          +*/
          +removeButton: function(p_nIndex) {
          +
          +    var oButton = this.getButton(p_nIndex);
          +    
          +    if(oButton) {
          +
          +        this.logger.log("Removing button " + oButton.get("id") + ".");
          +
          +        this._buttons.splice(p_nIndex, 1);
          +        delete m_oButtons[oButton.get("id")];
          +
          +        oButton.removeListener("checkedChange", this._onButtonCheckedChange);
          +        oButton.destroy();
          +
          +
          +        var nButtons = this._buttons.length;
          +        
          +        if(nButtons > 0) {
          +
          +            var i = this._buttons.length - 1;
          +            
          +            do {
          +
          +                this._buttons[i].index = i;
          +
          +            }
          +            while(i--);
          +        
          +        }
          +
          +        this.logger.log("Button " + oButton.get("id") + " removed.");
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method getButton
          +* @description Returns the button at the specified index.
          +* @param {Number} p_nIndex The index of the button to retrieve from the 
          +* button group.
          +* @return {<a href="YAHOO.widget.Button.html">YAHOO.widget.Button</a>}
          +*/
          +getButton: function(p_nIndex) {
          +
          +    if(Lang.isNumber(p_nIndex)) {
          +
          +        return this._buttons[p_nIndex];
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method getButtons
          +* @description Returns an array of the buttons in the button group.
          +* @return {Array}
          +*/
          +getButtons: function() {
          +
          +    return this._buttons;
          +
          +},
          +
          +
          +/**
          +* @method getCount
          +* @description Returns the number of buttons in the button group.
          +* @return {Number}
          +*/
          +getCount: function() {
          +
          +    return this._buttons.length;
          +
          +},
          +
          +
          +/**
          +* @method focus
          +* @description Sets focus to the button at the specified index.
          +* @param {Number} p_nIndex Number indicating the index of the button to focus. 
          +*/
          +focus: function(p_nIndex) {
          +
          +    var oButton;
          +
          +    if(Lang.isNumber(p_nIndex)) {
          +
          +        oButton = this._buttons[p_nIndex];
          +        
          +        if(oButton) {
          +
          +            oButton.focus();
          +
          +        }
          +    
          +    }
          +    else {
          +
          +        var nButtons = this.getCount();
          +
          +        for(var i=0; i<nButtons; i++) {
          +
          +            oButton = this._buttons[i];
          +
          +            if(!oButton.get("disabled")) {
          +
          +                oButton.focus();
          +                break;
          +
          +            }
          +
          +        }
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method check
          +* @description Checks the button at the specified index.
          +* @param {Number} p_nIndex Number indicating the index of the button to check. 
          +*/
          +check: function(p_nIndex) {
          +
          +    var oButton = this.getButton(p_nIndex);
          +    
          +    if(oButton) {
          +
          +        oButton.set("checked", true);
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @method destroy
          +* @description Removes the button group's element from its parent element and 
          +* removes all event handlers.
          +*/
          +destroy: function() {
          +
          +    this.logger.log("Destroying...");
          +
          +    var nButtons = this._buttons.length,
          +        oElement = this.get("element"),
          +        oParentNode = oElement.parentNode;
          +    
          +    if(nButtons > 0) {
          +
          +        var i = this._buttons.length - 1;
          +
          +        do {
          +
          +            this._buttons[i].destroy();
          +
          +        }
          +        while(i--);
          +    
          +    }
          +
          +    this.logger.log("Removing DOM event handlers.");
          +
          +    Event.purgeElement(oElement);
          +    
          +    this.logger.log("Removing from document.");
          +
          +    oParentNode.removeChild(oElement);
          +
          +},
          +
          +
          +/**
          +* @method toString
          +* @description Returns a string representing the button group.
          +* @return {String}
          +*/
          +toString: function() {
          +
          +    return ("ButtonGroup " + this.get("id"));
          +
          +}
          +
          +});
          +
          +})();
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/connection.js.html b/www/extras/yui/docs/connection.js.html new file mode 100644 index 000000000..07d43432a --- /dev/null +++ b/www/extras/yui/docs/connection.js.html @@ -0,0 +1,1226 @@ + + + + API: connection connection.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          connection  2.2.2

          +

          + Yahoo! UI Library + > connection + + > connection.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * 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
          + * @requires yahoo
          + */
          +
          +/**
          + * The Connection Manager singleton provides methods for creating and managing
          + * asynchronous transactions.
          + *
          + * @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_headers:{},
          +
          +  /**
          +   * @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 client HTTP headers sent for POST
          +  * transactions.
          +  * @property _default_post_header
          +  * @private
          +  * @static
          +  * @type boolean
          +  */
          +    _default_post_header:'application/x-www-form-urlencoded; charset=UTF-8',
          +
          + /**
          +  * @description Determines if a default header of
          +  * 'X-Requested-With: XMLHttpRequest'
          +  * will be added to each transaction.
          +  * @property _use_default_xhr_header
          +  * @private
          +  * @static
          +  * @type boolean
          +  */
          +    _use_default_xhr_header:true,
          +
          + /**
          +  * @description The default header value for the label
          +  * "X-Requested-With".  This is sent with each
          +  * transaction, by default, to identify the
          +  * request as being made by YUI Connection Manager.
          +  * @property _default_xhr_header
          +  * @private
          +  * @static
          +  * @type boolean
          +  */
          +    _default_xhr_header:'XMLHttpRequest',
          +
          + /**
          +  * @description Determines if custom, default headers
          +  * are set for each transaction.
          +  * @property _has_default_header
          +  * @private
          +  * @static
          +  * @type boolean
          +  */
          +    _has_default_headers:true,
          +
          + /**
          +  * @description Determines if custom, default headers
          +  * are set for each transaction.
          +  * @property _has_default_header
          +  * @private
          +  * @static
          +  * @type boolean
          +  */
          +    _default_headers:{},
          +
          + /**
          +  * @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 Tracks the name-value pair of the "clicked" submit button if multiple submit
          +   * buttons are present in an HTML form; and, if YAHOO.util.Event is available.
          +   * @property _submitElementValue
          +   * @private
          +   * @static
          +   * @type string
          +   */
          +	 _submitElementValue:null,
          +
          +  /**
          +   * @description Determines whether YAHOO.util.Event is available and returns true or false.
          +   * If true, an event listener is bound at the document level to trap click events that
          +   * resolve to a target type of "Submit".  This listener will enable setForm() to determine
          +   * the clicked "Submit" value in a multi-Submit button, HTML form.
          +   * @property _hasSubmitListener
          +   * @private
          +   * @static
          +   * @type boolean
          +   */
          +	 _hasSubmitListener:(function()
          +	 {
          +		if(YAHOO.util.Event){
          +			YAHOO.util.Event.addListener(
          +				document,
          +				'click',
          +				function(e){
          +					var obj = YAHOO.util.Event.getTarget(e);
          +					if(obj.type == 'submit'){
          +						YAHOO.util.Connect._submitElementValue = encodeURIComponent(obj.name) + "=" + encodeURIComponent(obj.value);
          +					}
          +				})
          +			return true;
          +	    }
          +	    return false;
          +	 })(),
          +
          +  /**
          +   * @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);
          +		YAHOO.log('ActiveX Program Id  ' + id + ' added to _msxml_progid.', 'info', 'Connection');
          +	},
          +
          +  /**
          +   * @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;
          +		YAHOO.log('Use default POST header set to  ' + b, 'info', 'Connection');
          +	},
          +
          +  /**
          +   * @description Member to enable or disable the default POST header.
          +   * @method setDefaultXhrHeader
          +   * @public
          +   * @static
          +   * @param {boolean} b Set and use default header - true or false .
          +   * @return void
          +   */
          +	setDefaultXhrHeader:function(b)
          +	{
          +		this._use_default_xhr_header = b;
          +		YAHOO.log('Use default transaction header set to  ' + b, 'info', 'Connection');
          +	},
          +
          +  /**
          +   * @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;
          +			YAHOO.log('Default polling interval set to ' + i +'ms', 'info', 'Connection');
          +		}
          +	},
          +
          +  /**
          +   * @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 };
          +			YAHOO.log('XHR object created for transaction ' + transactionId, 'info', 'Connection');
          +		}
          +		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 };
          +					YAHOO.log('ActiveX XHR object created for transaction ' + transactionId, 'info', 'Connection');
          +					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){
          +			YAHOO.log('Unable to create connection object.', 'error', 'Connection');
          +			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.toUpperCase() == '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.toUpperCase() == '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._use_default_xhr_header){
          +				if(!this._default_headers['X-Requested-With']){
          +					this.initHeader('X-Requested-With', this._default_xhr_header, true);
          +					YAHOO.log('Initialize transaction header X-Request-Header to XMLHttpRequest.', 'info', 'Connection');
          +				}
          +			}
          +			if(this._isFormSubmit || (postData && this._use_default_post_header)){
          +				this.initHeader('Content-Type', this._default_post_header);
          +				YAHOO.log('Initialize header Content-Type to application/x-www-form-urlencoded for POST transaction.', 'info', 'Connection');
          +				if(this._isFormSubmit){
          +					this.resetFormState();
          +				}
          +			}
          +
          +			if(this._has_default_headers || 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);
          +			YAHOO.log('No callback object to process. Transaction complete.', 'warn', 'Connection');
          +			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 || httpStatus === 1223){
          +			responseObject = this.createResponseObject(o, callback.argument);
          +			if(callback.success){
          +				if(!callback.scope){
          +					callback.success(responseObject);
          +					YAHOO.log('Success callback. HTTP code is ' + httpStatus, 'info', 'Connection');
          +				}
          +				else{
          +					// If a scope property is defined, the callback will be fired from
          +					// the context of the object.
          +					callback.success.apply(callback.scope, [responseObject]);
          +					YAHOO.log('Success callback with scope. HTTP code is ' + httpStatus, 'info', 'Connection');
          +				}
          +			}
          +		}
          +		else{
          +			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);
          +							YAHOO.log('Failure callback. Exception detected. Status code is ' + httpStatus, 'warn', 'Connection');
          +						}
          +						else{
          +							callback.failure.apply(callback.scope, [responseObject]);
          +							YAHOO.log('Failure callback with scope. Exception detected. Status code is ' + httpStatus, 'warn', 'Connection');
          +						}
          +					}
          +					break;
          +				default:
          +					responseObject = this.createResponseObject(o, callback.argument);
          +					if(callback.failure){
          +						if(!callback.scope){
          +							callback.failure(responseObject);
          +							YAHOO.log('Failure callback. HTTP status code is ' + httpStatus, 'warn', 'Connection');
          +						}
          +						else{
          +							callback.failure.apply(callback.scope, [responseObject]);
          +							YAHOO.log('Failure callback with scope. HTTP status code is ' + httpStatus, 'warn', 'Connection');
          +						}
          +					}
          +			}
          +		}
          +
          +		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;
          +		// Normalize IE's response to HTTP 204 when Win error 1223.
          +		obj.status = (o.conn.status == 1223)?204:o.conn.status;
          +		// Normalize IE's statusText to "No Content" instead of "Unknown".
          +		obj.statusText = (o.conn.status == 1223)?"No Content":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 Method that initializes the custom HTTP headers for the each transaction.
          +   * @method initHeader
          +   * @public
          +   * @static
          +   * @param {string} label The HTTP header label
          +   * @param {string} value The HTTP header value
          +   * @param {string} isDefault Determines if the specific header is a default header
          +   * automatically sent with each transaction.
          +   * @return {void}
          +   */
          +	initHeader:function(label,value,isDefault)
          +	{
          +		var headerObj = (isDefault)?this._default_headers:this._http_headers;
          +
          +		if(headerObj[label] === undefined){
          +			headerObj[label] = value;
          +		}
          +		else{
          +			// Concatenate multiple values, comma-delimited,
          +			// for the same header label,
          +			headerObj[label] =  value + "," + headerObj[label];
          +		}
          +
          +		if(isDefault){
          +			this._has_default_headers = true;
          +		}
          +		else{
          +			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)
          +	{
          +		if(this._has_default_headers){
          +			for(var prop in this._default_headers){
          +				if(YAHOO.lang.hasOwnProperty(this._default_headers,prop)){
          +					o.conn.setRequestHeader(prop, this._default_headers[prop]);
          +					YAHOO.log('Default HTTP header ' + prop + ' set with value of ' + this._default_headers[prop], 'info', 'Connection');
          +				}
          +			}
          +		}
          +
          +		if(this._has_http_headers){
          +			for(var prop in this._http_headers){
          +				if(YAHOO.lang.hasOwnProperty(this._http_headers,prop)){
          +					o.conn.setRequestHeader(prop, this._http_headers[prop]);
          +					YAHOO.log('HTTP header ' + prop + ' set with value of ' + this._http_headers[prop], 'info', 'Connection');
          +				}
          +			}
          +			delete this._http_headers;
          +
          +			this._http_headers = {};
          +			this._has_http_headers = false;
          +		}
          +	},
          +
          +  /**
          +   * @description Resets the default HTTP headers object
          +   * @method resetDefaultHeaders
          +   * @public
          +   * @static
          +   * @return {void}
          +   */
          +	resetDefaultHeaders:function(){
          +		delete this._default_headers
          +		this._default_headers = {};
          +		this._has_default_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{
          +			YAHOO.log('Unable to create form object ' + formId, 'warn', 'Connection');
          +			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){
          +							if(this._hasSubmitListener){
          +								this._sFormData += this._submitElementValue + '&';
          +							}
          +							else{
          +								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);
          +
          +		YAHOO.log('Form initialized for transaction. HTML form POST message is: ' + this._sFormData, 'info', 'Connection');
          +
          +		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} 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);
          +		YAHOO.log('File upload iframe created. Id is:' + frameId, 'info', 'Connection');
          +	},
          +
          +  /**
          +   * @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 = [];
          +		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 uploadEncoding = 'multipart/form-data';
          +		var io = document.getElementById(frameId);
          +
          +		// Initialize the HTML form properties in case they are
          +		// not defined in the HTML form.
          +		this._formNode.setAttribute('action', uri);
          +		this._formNode.setAttribute('method', 'POST');
          +		this._formNode.setAttribute("target", frameId);
          +
          +		if(this._formNode.encoding){
          +			// IE does not respect property enctype for HTML forms.
          +			// Instead it uses the property - "encoding".
          +			this._formNode.encoding = uploadEncoding;
          +		}
          +		else{
          +			this._formNode.enctype = uploadEncoding;
          +		}
          +
          +
          +		if(postData){
          +			var oElements = this.appendPostData(postData);
          +		}
          +
          +		this._formNode.submit();
          +
          +		if(oElements && oElements.length > 0){
          +			for(var i=0; i < oElements.length; i++){
          +				this._formNode.removeChild(oElements[i]);
          +			}
          +		}
          +
          +		// 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 && callback.upload){
          +				if(!callback.scope){
          +					callback.upload(obj);
          +					YAHOO.log('Upload callback.', 'info', 'Connection');
          +				}
          +				else{
          +					callback.upload.apply(callback.scope, [obj]);
          +					YAHOO.log('Upload callback with scope.', 'info', 'Connection');
          +				}
          +			}
          +
          +			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);
          +					YAHOO.log('File upload iframe destroyed. Id is:' + frameId, 'info', 'Connection');
          +				}, 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);
          +			YAHOO.log('Transaction ' + o.tId + ' aborted.', 'info', 'Connection');
          +
          +			return true;
          +		}
          +		else{
          +			YAHOO.log('Transaction ' + o.tId + ' abort call failed.', 'warn', 'Connection');
          +			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;
          +		YAHOO.log('Connection object for transaction ' + o.tId + ' destroyed.', 'info', 'Connection');
          +		//dereference the connection object.
          +		o = null;
          +	}
          +};
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/contextmenu.js.html b/www/extras/yui/docs/contextmenu.js.html new file mode 100644 index 000000000..d85b47dca --- /dev/null +++ b/www/extras/yui/docs/contextmenu.js.html @@ -0,0 +1,598 @@ + + + + API: menu contextmenu.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Menu  2.2.2

          +

          + Yahoo! UI Library + > menu + + > contextmenu.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +* 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
          +        );
          +
          +};
          +
          +
          +/**
          +* Constant representing the name of the ContextMenu's events
          +* @property YAHOO.widget.ContextMenu._EVENT_TYPES
          +* @private
          +* @final
          +* @type Object
          +*/
          +YAHOO.widget.ContextMenu._EVENT_TYPES = {
          +
          +    "TRIGGER_CONTEXT_MENU": "triggerContextMenu",
          +
          +    "CONTEXT_MENU": (
          +                        (YAHOO.widget.Module.prototype.browser == "opera" ? 
          +                            "mousedown" : "contextmenu")
          +                    ),
          +    "CLICK": "click"
          +
          +};
          +
          +
          +/**
          +* Constant representing the ContextMenu's configuration properties
          +* @property YAHOO.widget.ContextMenu._DEFAULT_CONFIG
          +* @private
          +* @final
          +* @type Object
          +*/
          +YAHOO.widget.ContextMenu._DEFAULT_CONFIG = {
          +
          +    "TRIGGER": { 
          +        key: "trigger" 
          +    }
          +
          +};
          +
          +
          +YAHOO.lang.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,
          +
          +
          +/**
          +* @property _bCancelled
          +* @description Boolean indicating if the display of the context menu should 
          +* be cancelled.
          +* @default false
          +* @private
          +* @type Boolean
          +*/
          +_bCancelled: false,
          +
          +
          +
          +// 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,
          +
          +
          +
          +// Events
          +
          +
          +/**
          +* @event triggerContextMenuEvent
          +* @description Custom Event wrapper for the "contextmenu" DOM event 
          +* ("mousedown" for Opera) fired by the element(s) that trigger the display of 
          +* the context menu.
          +*/
          +triggerContextMenuEvent: 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);
          +    
          +},
          +
          +
          +/**
          +* @method initEvents
          +* @description Initializes the custom events for the context menu.
          +*/
          +initEvents: function() {
          +
          +	YAHOO.widget.ContextMenu.superclass.initEvents.call(this);
          +
          +    // Create custom events
          +
          +    this.triggerContextMenuEvent = 
          +
          +            new YAHOO.util.CustomEvent(
          +                    YAHOO.widget.ContextMenu._EVENT_TYPES.TRIGGER_CONTEXT_MENU, 
          +                    this
          +                );
          +
          +},
          +
          +
          +/**
          +* @method cancel
          +* @description Cancels the display of the context menu.
          +*/
          +cancel: function() {
          +
          +    this._bCancelled = true;
          +
          +},
          +
          +
          +
          +// 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,
          +        oTrigger = this._oTrigger;
          +
          +
          +    // Remove the event handlers from the trigger(s)
          +
          +    if (oTrigger) {
          +
          +        Event.removeListener(
          +            oTrigger, 
          +            YAHOO.widget.ContextMenu._EVENT_TYPES.CONTEXT_MENU, 
          +            this._onTriggerContextMenu
          +        );    
          +        
          +        if(this.browser == "opera") {
          +        
          +            Event.removeListener(
          +                oTrigger, 
          +                YAHOO.widget.ContextMenu._EVENT_TYPES.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) {
          +
          +    var Event = YAHOO.util.Event;
          +
          +    if(p_oEvent.type == "mousedown" && !p_oEvent.ctrlKey) {
          +
          +        return;
          +
          +    }
          +
          +
          +    /*
          +        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);
          +
          +
          +    // Hide any other ContextMenu instances that might be visible
          +
          +    YAHOO.widget.MenuManager.hideVisible();
          +
          +
          +    this.contextEventTarget = Event.getTarget(p_oEvent);
          +
          +    this.triggerContextMenuEvent.fire(p_oEvent);
          +
          +
          +    if(!this._bCancelled) {
          +
          +        // Position and display the context menu
          +    
          +        this.cfg.setProperty("xy", Event.getXY(p_oEvent));
          +
          +        this.show();
          +
          +    }
          +
          +    this._bCancelled = false;
          +
          +},
          +
          +
          +
          +// Public methods
          +
          +
          +/**
          +* @method toString
          +* @description Returns a string representing the context menu.
          +* @return {String}
          +*/
          +toString: function() {
          +
          +    var sReturnVal = "ContextMenu",
          +        sId = this.id;
          +
          +    if(sId) {
          +
          +        sReturnVal += (" " + sId);
          +    
          +    }
          +
          +    return sReturnVal;
          +
          +},
          +
          +
          +/**
          +* @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(
          +        YAHOO.widget.ContextMenu._DEFAULT_CONFIG.TRIGGER.key, 
          +        { 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,
          +        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
          +        */ 
          +  
          +        Event.on(
          +            oTrigger, 
          +            YAHOO.widget.ContextMenu._EVENT_TYPES.CONTEXT_MENU, 
          +            this._onTriggerContextMenu,
          +            this,
          +            true
          +        );
          +
          +
          +        /*
          +            Assign a "click" event handler to the trigger element(s) for
          +            Opera to prevent default browser behaviors.
          +        */
          +
          +        if(this.browser == "opera") {
          +        
          +            Event.on(
          +                oTrigger, 
          +                YAHOO.widget.ContextMenu._EVENT_TYPES.CLICK, 
          +                this._onTriggerClick,
          +                this,
          +                true
          +            );
          +
          +        }
          +
          +    }
          +    else {
          +   
          +        this._removeEventHandlers();
          +    
          +    }
          +    
          +}
          +
          +}); // END YAHOO.lang.extend
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/contextmenuitem.js.html b/www/extras/yui/docs/contextmenuitem.js.html new file mode 100644 index 000000000..fc619090d --- /dev/null +++ b/www/extras/yui/docs/contextmenuitem.js.html @@ -0,0 +1,227 @@ + + + + API: menu contextmenuitem.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Menu  2.2.2

          +

          + Yahoo! UI Library + > menu + + > contextmenuitem.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +* 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.lang.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() {
          +
          +    var sReturnVal = "ContextMenuItem";
          +
          +    if(this.cfg && this.cfg.getProperty("text")) {
          +
          +        sReturnVal += (": " + this.cfg.getProperty("text"));
          +
          +    }
          +
          +    return sReturnVal;
          +
          +}
          +    
          +}); // END YAHOO.lang.extend
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/history.js.html b/www/extras/yui/docs/history.js.html new file mode 100644 index 000000000..851d69921 --- /dev/null +++ b/www/extras/yui/docs/history.js.html @@ -0,0 +1,868 @@ + + + + API: history history.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Browser History Manager  2.2.2

          +

          + Yahoo! UI Library + > history + + > history.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          + * The Browser History Manager provides the ability to use the
          + * back/forward navigation buttons in a DHTML application. It also allows
          + * a DHTML application to be bookmarked in a specific state.
          + *
          + * @module history
          + * @requires yahoo,event
          + * @namespace YAHOO.util
          + * @title Browser History Manager
          + * @experimental
          + */
          +
          +/**
          + * The History class provides the ability to use the back/forward navigation
          + * buttons in a DHTML application. It also allows a DHTML application to
          + * be bookmarked in a specific state.
          + *
          + * @class History
          + * @constructor
          + */
          +YAHOO.util.History = ( function () {
          +
          +    /**
          +     * User agent string used for browser detection.
          +     *
          +     * @property _ua
          +     * @type string
          +     * @default null
          +     * @private
          +     */
          +    var _ua = null;
          +
          +    /**
          +     * String identifying which browser we are in.
          +     * Different code is run depending on which browser you are using.
          +     *
          +     * @property _browser
          +     * @type string
          +     * @default "unknown"
          +     * @private
          +     */
          +    var _browser = "unknown";
          +
          +    /**
          +     * Our hidden IFrame used to store the browsing history.
          +     *
          +     * @property _iframe
          +     * @type HTMLIFrameElement
          +     * @default null
          +     * @private
          +     */
          +    var _iframe = null;
          +
          +    /**
          +     * INPUT field (with type="hidden" or type="text") or TEXTAREA.
          +     * This field keeps the value of the initial state, current state
          +     * the list of all states across pages within a single browser session.
          +     *
          +     * @property _storageField
          +     * @type HTMLInputElement|HTMLTextAreaElement
          +     * @default null
          +     * @private
          +     */
          +    var _storageField = null;
          +
          +    /**
          +     * Flag used to tell whether YAHOO.util.History.initialize has been called.
          +     *
          +     * @property _initialized
          +     * @type boolean
          +     * @default false
          +     * @private
          +     */
          +    var _initialized = false;
          +
          +    /**
          +     * Flag used to tell whether the storage field is ready to be used.
          +     *
          +     * @property _storageFieldReady
          +     * @type boolean
          +     * @default false
          +     * @private
          +     */
          +    var _storageFieldReady = false;
          +
          +    /**
          +     * Flag used to tell whether the Browser History Manager is ready.
          +     *
          +     * @property _bhmReady
          +     * @type boolean
          +     * @default false
          +     * @private
          +     */
          +    var _bhmReady = false;
          +
          +    /**
          +     * List of registered modules.
          +     *
          +     * @property _modules
          +     * @type array
          +     * @default []
          +     * @private
          +     */
          +    var _modules = [];
          +
          +    /**
          +     * List of fully qualified states. This is used only by Safari.
          +     *
          +     * @property _fqstates
          +     * @type array
          +     * @default []
          +     * @private
          +     */
          +    var _fqstates = [];
          +
          +    /**
          +     * Trims a string.
          +     *
          +     * @method _trim
          +     * @param {string} str The string to be trimmed.
          +     * @return {string} The trimmed string
          +     * @private
          +     */
          +    function _trim( str ) {
          +        return str.replace( /^\s*(\S*(\s+\S+)*)\s*$/, "$1" );
          +    }
          +
          +    /**
          +     * location.hash is a bit buggy on Opera. I have seen instances where
          +     * navigating the history using the back/forward buttons, and hence
          +     * changing the URL, would not change location.hash. That's ok, the
          +     * implementation of an equivalent is trivial.
          +     *
          +     * @method _getHash
          +     * @return {string} The hash portion of the document's location
          +     * @private
          +     */
          +    function _getHash() {
          +
          +        var href;
          +        var i;
          +
          +        href = top.location.href;
          +        i = href.indexOf( "#" );
          +        return i >= 0 ? href.substr( i + 1 ) : null;
          +    }
          +
          +    /**
          +     * Stores all the registered modules' initial state and current state.
          +     * On Safari, we also store all the fully qualified states visited by
          +     * the application within a single browser session. The storage takes
          +     * place in the form field specified during initialization.
          +     *
          +     * @method _storeStates
          +     * @private
          +     */
          +    function _storeStates() {
          +
          +        var moduleName;
          +        var moduleObj;
          +        var initialStates = [];
          +        var currentStates = [];
          +
          +        for ( moduleName in _modules ) {
          +            if ( YAHOO.lang.hasOwnProperty( _modules, moduleName ) ) {
          +                moduleObj = _modules[moduleName];
          +                initialStates.push( moduleName + "=" + moduleObj.initialState );
          +                currentStates.push( moduleName + "=" + moduleObj.currentState );
          +            }
          +        }
          +
          +        _storageField.value = initialStates.join( "&" ) + "|" + currentStates.join( "&" );
          +
          +        if ( _browser == "safari" ) {
          +            _storageField.value += "|" + _fqstates.join( "," );
          +        }
          +    }
          +
          +    /**
          +     * Periodically checks whether our internal IFrame is ready to be used.
          +     *
          +     * @method _checkIframeLoaded
          +     * @private
          +     */
          +    function _checkIframeLoaded() {
          +
          +        var doc;
          +        var elem;
          +        var fqstate;
          +
          +        if ( !_iframe.contentWindow || !_iframe.contentWindow.document ) {
          +            // Check again in 10 msec...
          +            setTimeout( _checkIframeLoaded, 10 );
          +            return;
          +        }
          +
          +        // Start the thread that will have the responsibility to
          +        // periodically check whether a navigate operation has been
          +        // requested on the main window. This will happen when
          +        // YAHOO.util.History.navigate has been called or after
          +        // the user has hit the back/forward button.
          +
          +        doc = _iframe.contentWindow.document;
          +        elem = doc.getElementById( "state" );
          +        // We must use innerText, and not innerHTML because our string contains
          +        // the "&" character (which would end up being escaped as "&amp;") and
          +        // the string comparison would fail...
          +        fqstate = elem ? elem.innerText : null;
          +
          +        setInterval( function () {
          +
          +            var newfqstate;
          +            var hash;
          +            var states;
          +            var moduleName;
          +            var moduleObj;
          +
          +            doc = _iframe.contentWindow.document;
          +            elem = doc.getElementById( "state" );
          +            // See my comment above about using innerText instead of innerHTML...
          +            newfqstate = elem ? elem.innerText : null;
          +
          +            if ( newfqstate != fqstate ) {
          +                fqstate = newfqstate;
          +                _handleFQStateChange( fqstate );
          +
          +                if ( !fqstate ) {
          +                    states = [];
          +                    for ( moduleName in _modules ) {
          +                        if ( YAHOO.lang.hasOwnProperty( _modules, moduleName ) ) {
          +                            moduleObj = _modules[moduleName];
          +                            states.push( moduleName + "=" + moduleObj.initialState );
          +                        }
          +                    }
          +                    hash = states.join( "&" );
          +                } else {
          +                    hash = fqstate;
          +                }
          +
          +                // Allow the state to be bookmarked without messing up the browser history...
          +                top.location.replace( "#" + hash );
          +
          +                _storeStates();
          +            }
          +        }, 50 );
          +
          +        _bhmReady = true;
          +
          +        YAHOO.util.History.onLoadEvent.fire();
          +    }
          +
          +    /**
          +     * Sets the new currentState attribute of all modules depending on the new
          +     * fully qualified state. Also notifies the modules which current state has
          +     * changed.
          +     *
          +     * @method _handleFQStateChange
          +     * @param {string} fqstate Fully qualified state
          +     * @private
          +     */
          +    function _handleFQStateChange( fqstate ) {
          +
          +        var i;
          +        var len;
          +        var moduleName;
          +        var moduleObj;
          +        var modules;
          +        var states;
          +        var tokens;
          +        var currentState;
          +
          +        if ( !fqstate ) {
          +            // Notifies all modules
          +            for ( moduleName in _modules ) {
          +                if ( YAHOO.lang.hasOwnProperty( _modules, moduleName ) ) {
          +                    moduleObj = _modules[moduleName];
          +                    moduleObj.currentState = moduleObj.initialState;
          +                    moduleObj.onStateChange( unescape( moduleObj.currentState ) );
          +                }
          +            }
          +            return;
          +        }
          +
          +        modules = [];
          +        states = fqstate.split( "&" );
          +        for ( i = 0, len = states.length ; i < len ; i++ ) {
          +            tokens = states[i].split( "=" );
          +            if ( tokens.length == 2 ) {
          +                moduleName = tokens[0];
          +                currentState = tokens[1];
          +                modules[moduleName] = currentState;
          +            }
          +        }
          +
          +        for ( moduleName in _modules ) {
          +            if ( YAHOO.lang.hasOwnProperty( _modules, moduleName ) ) {
          +                moduleObj = _modules[moduleName];
          +                currentState = modules[moduleName];
          +                if ( !currentState || moduleObj.currentState != currentState ) {
          +                    moduleObj.currentState = currentState || moduleObj.initialState;
          +                    moduleObj.onStateChange( unescape( moduleObj.currentState ) );
          +                }
          +            }
          +        }
          +    }
          +
          +    /**
          +     * Finish up the initialization of the Browser History Manager.
          +     *
          +     * @method _initialize
          +     * @private
          +     */
          +    function _initialize() {
          +
          +        var i;
          +        var len;
          +        var parts;
          +        var tokens;
          +        var moduleName;
          +        var moduleObj;
          +        var initialStates;
          +        var initialState;
          +        var currentStates;
          +        var currentState;
          +        var counter;
          +        var hash;
          +
          +        _storageField = document.getElementById( "yui_hist_field" );
          +
          +        // Decode the content of our storage field...
          +        parts = _storageField.value.split( "|" );
          +
          +        if ( parts.length > 1 ) {
          +
          +            initialStates = parts[0].split( "&" );
          +            for ( i = 0, len = initialStates.length ; i < len ; i++ ) {
          +                tokens = initialStates[i].split( "=" );
          +                if ( tokens.length == 2 ) {
          +                    moduleName = tokens[0];
          +                    initialState = tokens[1];
          +                    moduleObj = _modules[moduleName];
          +                    if ( moduleObj ) {
          +                        moduleObj.initialState = initialState;
          +                    }
          +                }
          +            }
          +
          +            currentStates = parts[1].split( "&" );
          +            for ( i = 0, len = currentStates.length ; i < len ; i++ ) {
          +                tokens = currentStates[i].split( "=" );
          +                if ( tokens.length >= 2 ) {
          +                    moduleName = tokens[0];
          +                    currentState = tokens[1];
          +                    moduleObj = _modules[moduleName];
          +                    if ( moduleObj ) {
          +                        moduleObj.currentState = currentState;
          +                    }
          +                }
          +            }
          +        }
          +
          +        if ( parts.length > 2 ) {
          +            _fqstates = parts[2].split( "," );
          +        }
          +
          +        _storageFieldReady = true;
          +
          +        if ( _browser == "msie" ) {
          +
          +            _iframe = document.getElementById( "yui_hist_iframe" );
          +            _checkIframeLoaded();
          +
          +        } else {
          +
          +            // Start the thread that will have the responsibility to
          +            // periodically check whether a navigate operation has been
          +            // requested on the main window. This will happen when
          +            // YAHOO.util.History.navigate has been called or after
          +            // the user has hit the back/forward button.
          +
          +            // On Safari 1.x and 2.0, the only way to catch a back/forward
          +            // operation is to watch history.length... We basically exploit
          +            // what I consider to be a bug (history.length is not supposed
          +            // to change when going back/forward in the history...) This is
          +            // why, in the following thread, we first compare the hash,
          +            // because the hash thing will be fixed in the next major
          +            // version of Safari. So even if they fix the history.length
          +            // bug, all this will still work!
          +            counter = history.length;
          +
          +            // On Gecko and Opera, we just need to watch the hash...
          +            hash = _getHash();
          +
          +            setInterval( function () {
          +
          +                var state;
          +                var newHash;
          +                var newCounter;
          +
          +                newHash = _getHash();
          +                newCounter = history.length;
          +                if ( newHash != hash ) {
          +                    hash = newHash;
          +                    counter = newCounter;
          +                    _handleFQStateChange( hash );
          +                    _storeStates();
          +                } else if ( newCounter != counter ) {
          +                    // If we ever get here, we should be on Safari...
          +                    hash = newHash;
          +                    counter = newCounter;
          +                    state = _fqstates[counter - 1];
          +                    _handleFQStateChange( state );
          +                    _storeStates();
          +                }
          +            }, 50 );
          +
          +            _bhmReady = true;
          +
          +            YAHOO.util.History.onLoadEvent.fire();
          +        }
          +    }
          +
          +    // Simple browser detection code
          +    // After talking with Matt Sweeney, I moved back to using the
          +    // user agent string instead of doing browser detection.
          +    _ua = navigator.userAgent.toLowerCase();
          +    if ( _ua.indexOf( "opera" ) != -1 ) {
          +        // Opera (check first in case of spoof)
          +        _browser = "opera";
          +    } else if ( _ua.indexOf( "msie" ) != -1 ) {
          +        // Microsoft Internet Explorer and derivatives...
          +        _browser = "msie";
          +    } else if ( _ua.indexOf( "safari" ) != -1 ) {
          +        // Safari (check before Gecko because it includes "like Gecko")
          +        _browser = "safari";
          +    } else if ( _ua.indexOf( "gecko" ) != -1 ) {
          +        // Gecko
          +        _browser = "gecko";
          +    }
          +
          +    return {
          +
          +        /**
          +         * Fired when the Browser History Manager is ready.
          +         *
          +         * @event onLoadEvent
          +         */
          +        onLoadEvent: new YAHOO.util.CustomEvent( "onLoad" ),
          +
          +        /**
          +         * Registers a new module.
          +         *
          +         * @method register
          +         * @param {string} module Non-empty string uniquely identifying the
          +         *     module you wish to register.
          +         * @param {string} initialState The initial state of the specified
          +         *     module corresponding to its earliest history entry.
          +         * @param {function} onStateChange Callback called when the
          +         *     state of the specified module has changed.
          +         * @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.
          +         */
          +        register: function ( module, initialState, onStateChange, obj, override ) {
          +
          +            var scope;
          +            var wrappedFn;
          +
          +            if ( typeof module != "string" || _trim( module ) === "" ||
          +                 typeof initialState != "string" ||
          +                 typeof onStateChange != "function" ) {
          +                throw new Error( "Missing or invalid argument passed to YAHOO.util.History.register" );
          +            }
          +
          +            if ( _modules[module] ) {
          +                throw new Error( "A module cannot be registered twice" );
          +            }
          +
          +            // Note: A module CANNOT be registered after calling
          +            // YAHOO.util.History.initialize. Indeed, we set the initial state
          +            // of each registered module in YAHOO.util.History.initialize.
          +            // If you could register a module after initializing the Browser
          +            // History Manager, you would not read the correct state using
          +            // YAHOO.util.History.getCurrentState when coming back to the
          +            // page using the back button.
          +            if ( _initialized ) {
          +                throw new Error( "All modules must be registered before calling YAHOO.util.History.initialize" );
          +            }
          +
          +            // Make sure the strings passed in do not contain our separators "," and "|"
          +            module = escape( module );
          +            initialState = escape( initialState );
          +
          +            // If the user chooses to override the scope, we use the
          +            // custom object passed in as the execution scope.
          +            scope = null;
          +            if ( override === true ) {
          +                scope = obj;
          +            } else {
          +                scope = override;
          +            }
          +
          +            wrappedFn = function ( state ) {
          +                return onStateChange.call( scope, state, obj );
          +            };
          +
          +            _modules[module] = {
          +                name: module,
          +                initialState: initialState,
          +                currentState: initialState,
          +                onStateChange: wrappedFn
          +            };
          +        },
          +
          +        /**
          +         * Initializes the Browser History Manager. Call this method
          +         * from a script block located right after the opening body tag.
          +         *
          +         * @method initialize
          +         * @param {string} iframeTarget Optional - Path to an existing
          +         *     HTML document accessible from the same domain. If not
          +         *     specified, defaults to "blank.html". This is only useful
          +         *     if you use https.
          +         * @public
          +         */
          +        initialize: function ( iframeTarget ) {
          +
          +            // Return if the browser history manager has already been initialized
          +            if ( _initialized ) {
          +                return;
          +            }
          +
          +            if ( _browser == "unknown" ) {
          +                throw new Error( "Your web browser is not supported by the Browser History Manager" );
          +            }
          +
          +            if ( !iframeTarget ) {
          +                iframeTarget = "blank.html";
          +            }
          +
          +            if ( typeof iframeTarget != "string" || _trim( iframeTarget ) === "" ) {
          +                throw new Error( "Invalid argument passed to YAHOO.util.History.initialize" );
          +            }
          +
          +            document.write( '<input type="hidden" id="yui_hist_field">' );
          +
          +            if ( _browser == "msie" ) {
          +                if ( location.protocol == "https:" ) {
          +                    // If we use https, we MUST point the IFrame to a valid
          +                    // document on the same server. If we don't, we will get
          +                    // a warning (do you want to display non secure items?)
          +                    document.write( '<iframe id="yui_hist_iframe" src="' + iframeTarget + '" style="position:absolute;visibility:hidden;"></iframe>' );
          +                } else {
          +                    // This trick allows us to do without having to download
          +                    // the asset, saving one HTTP request...
          +                    document.write( '<iframe id="yui_hist_iframe" src="javascript:document.open();document.write(&quot;' + new Date().getTime() + '&quot;);document.close();" style="position:absolute;visibility:hidden;"></iframe>' );
          +                }
          +            }
          +
          +            // We have to wait for the window's onload handler. Otherwise, our
          +            // hidden form field will always be empty (i.e. the browser won't
          +            // have had enough time to restore the session)
          +            YAHOO.util.Event.addListener( window, "load", _initialize );
          +
          +            _initialized = true;
          +        },
          +
          +        /**
          +         * Call this method when you want to store a new entry in the browser's history.
          +         *
          +         * @method navigate
          +         * @param {string} module Non-empty string representing your module.
          +         * @param {string} state String representing the new state of the specified module.
          +         * @return {boolean} Indicates whether the new state was successfully added to the history.
          +         * @public
          +         */
          +        navigate: function ( module, state ) {
          +
          +            var currentStates;
          +            var moduleName;
          +            var moduleObj;
          +            var currentState;
          +            var fqstate;
          +            var html;
          +            var doc;
          +
          +            if ( typeof module != "string" || typeof state != "string" ) {
          +                throw new Error( "Missing or invalid argument passed to YAHOO.util.History.navigate" );
          +            }
          +
          +            if ( !_bhmReady ) {
          +                throw new Error( "The Browser History Manager is not initialized" );
          +            }
          +
          +            if ( !_modules[module] ) {
          +                throw new Error( "The following module has not been registered: " + module );
          +            }
          +
          +            // Make sure the strings passed in do not contain our separators "," and "|"
          +            module = escape( module );
          +            state = escape( state );
          +
          +            // Generate our new full state string mod1=xxx&mod2=yyy
          +            currentStates = [];
          +            for ( moduleName in _modules ) {
          +                if ( YAHOO.lang.hasOwnProperty( _modules, moduleName ) ) {
          +                    moduleObj = _modules[moduleName];
          +                    currentState = ( moduleName == module ) ? state : moduleObj.currentState;
          +                    currentStates.push( moduleName + "=" + currentState );
          +                }
          +            }
          +
          +            fqstate = currentStates.join( "&" );
          +
          +            if ( _browser == "msie" ) {
          +
          +                html = '<html><body><div id="state">' + fqstate + '</div></body></html>';
          +                try {
          +                    doc = _iframe.contentWindow.document;
          +                    doc.open();
          +                    doc.write( html );
          +                    doc.close();
          +                } catch ( e ) {
          +                    return false;
          +                }
          +
          +            } else {
          +
          +                // Known bug: On Safari 1.x and 2.0, if you have tab browsing
          +                // enabled, Safari will show an endless loading icon in the
          +                // tab. This has apparently been fixed in recent WebKit builds.
          +                // One work around found by Dav Glass is to submit a form that
          +                // points to the same document. This indeed works on Safari 1.x
          +                // and 2.0 but creates bigger problems on WebKit. So for now,
          +                // we'll consider this an acceptable bug, and hope that Apple
          +                // comes out with their next version of Safari very soon.
          +                top.location.hash = fqstate;
          +                if ( _browser == "safari" ) {
          +                    // The following two lines are only useful for Safari 1.x
          +                    // and 2.0. Recent nightly builds of WebKit do not require
          +                    // that, but unfortunately, it is not easy to differentiate
          +                    // between the two. Once Safari 2.0 departs the A-grade
          +                    // list, we can remove the following two lines...
          +                    _fqstates[history.length] = fqstate;
          +                    _storeStates();
          +                }
          +
          +            }
          +
          +            return true;
          +        },
          +
          +        /**
          +         * Returns the current state of the specified module.
          +         *
          +         * @method getCurrentState
          +         * @param {string} module Non-empty string representing your module.
          +         * @return {string} The current state of the specified module.
          +         * @public
          +         */
          +        getCurrentState: function ( module ) {
          +
          +            var moduleObj;
          +
          +            if ( typeof module != "string" ) {
          +                throw new Error( "Missing or invalid argument passed to YAHOO.util.History.getCurrentState" );
          +            }
          +
          +            if ( !_storageFieldReady ) {
          +                throw new Error( "The Browser History Manager is not initialized" );
          +            }
          +
          +            moduleObj = _modules[module];
          +            if ( !moduleObj ) {
          +                throw new Error( "No such registered module: " + module );
          +            }
          +
          +            return unescape( moduleObj.currentState );
          +        },
          +
          +        /**
          +         * Returns the state of a module according to the URL fragment
          +         * identifier. This method is useful to initialize your modules
          +         * if your application was bookmarked from a particular state.
          +         *
          +         * @method getBookmarkedState
          +         * @param {string} module Non-empty string representing your module.
          +         * @return {string} The bookmarked state of the specified module.
          +         * @public
          +         */
          +        getBookmarkedState: function ( module ) {
          +
          +            var i;
          +            var len;
          +            var hash;
          +            var states;
          +            var tokens;
          +            var moduleName;
          +
          +            if ( typeof module != "string" ) {
          +                throw new Error( "Missing or invalid argument passed to YAHOO.util.History.getBookmarkedState" );
          +            }
          +
          +            hash = top.location.hash.substr(1);
          +            states = hash.split( "&" );
          +            for ( i = 0, len = states.length ; i < len ; i++ ) {
          +                tokens = states[i].split( "=" );
          +                if ( tokens.length == 2 ) {
          +                    moduleName = tokens[0];
          +                    if ( moduleName == module ) {
          +                        return unescape( tokens[1] );
          +                    }
          +                }
          +            }
          +
          +            return null;
          +        },
          +
          +        /**
          +         * Returns the value of the specified query string parameter.
          +         * This method is not used internally by the Browser History Manager.
          +         * However, it is provided here as a helper since many applications
          +         * using the Browser History Manager will want to read the value of
          +         * url parameters to initialize themselves.
          +         *
          +         * @method getQueryStringParameter
          +         * @param {string} paramName Name of the parameter we want to look up.
          +         * @param {string} queryString Optional URL to look at. If not specified,
          +         *     this method uses the URL in the address bar.
          +         * @return {string} The value of the specified parameter, or null.
          +         * @public
          +         */
          +        getQueryStringParameter: function ( paramName, url ) {
          +
          +            var i;
          +            var len;
          +            var idx;
          +            var queryString;
          +            var params;
          +            var tokens;
          +
          +            url = url || top.location.href;
          +
          +            idx = url.indexOf( "?" );
          +            queryString = idx >= 0 ? url.substr( idx + 1 ) : url;
          +            params = queryString.split( "&" );
          +
          +            for ( i = 0, len = params.length ; i < len ; i++ ) {
          +                tokens = params[i].split( "=" );
          +                if ( tokens.length >= 2 ) {
          +                    if ( tokens[0] == paramName ) {
          +                        return unescape( tokens[1] );
          +                    }
          +                }
          +            }
          +
          +            return null;
          +        }
          +
          +    };
          +
          +} )();
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/index.html b/www/extras/yui/docs/index.html new file mode 100644 index 000000000..bb1b4c45f --- /dev/null +++ b/www/extras/yui/docs/index.html @@ -0,0 +1,266 @@ + + + + API: (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

            2.2.2

          +

          + Yahoo! UI Library +

          + +
          +
          +
          + +
          + This is the API documentation for the + Yahoo! User Interface Library +
          +
          +

          Search YUI

          +
          + +
          +   +
          +
          +
          + + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/index.json b/www/extras/yui/docs/index.json new file mode 100644 index 000000000..0c653638b --- /dev/null +++ b/www/extras/yui/docs/index.json @@ -0,0 +1 @@ +[{"url": "YAHOO.util.Region.html#0", "host": "YAHOO.util.Region", "name": "0"}, {"url": "YAHOO.util.Region.html#1", "host": "YAHOO.util.Region", "name": "1"}, {"url": "Column.html#abbr", "host": "Column", "name": "abbr"}, {"url": "YAHOO.util.Connect.html#abort", "host": "YAHOO.util.Connect", "name": "abort"}, {"url": "YAHOO.widget.DataSource.html#_aCache", "host": "YAHOO.widget.DataSource", "name": "_aCache"}, {"url": "DataSource.html#_aCache", "host": "DataSource", "name": "_aCache"}, {"url": "YAHOO.widget.Button.html#_activationButtonPressed", "host": "YAHOO.widget.Button", "name": "_activationButtonPressed"}, {"url": "YAHOO.widget.Tab.html#activationEvent", "host": "YAHOO.widget.Tab", "name": "activationEvent"}, {"url": "YAHOO.widget.Button.html#_activationKeyPressed", "host": "YAHOO.widget.Button", "name": "_activationKeyPressed"}, {"url": "YAHOO.widget.Button.html#ACTIVATION_KEYS", "host": "YAHOO.widget.Button", "name": "ACTIVATION_KEYS"}, {"url": "YAHOO.widget.Tab.html#active", "host": "YAHOO.widget.Tab", "name": "active"}, {"url": "YAHOO.widget.Tab.html#activeChange", "host": "YAHOO.widget.Tab", "name": "activeChange"}, {"url": "YAHOO.widget.Tab.html#ACTIVE_CLASSNAME", "host": "YAHOO.widget.Tab", "name": "ACTIVE_CLASSNAME"}, {"url": "YAHOO.widget.TabView.html#activeIndex", "host": "YAHOO.widget.TabView", "name": "activeIndex"}, {"url": "YAHOO.widget.Menu.html#activeItem", "host": "YAHOO.widget.Menu", "name": "activeItem"}, {"url": "YAHOO.widget.OverlayManager.html#activeOverlay", "host": "YAHOO.widget.OverlayManager", "name": "activeOverlay"}, {"url": "YAHOO.widget.TabView.html#activeTab", "host": "YAHOO.widget.TabView", "name": "activeTab"}, {"url": "YAHOO.widget.TabView.html#activeTabChange", "host": "YAHOO.widget.TabView", "name": "activeTabChange"}, {"url": "YAHOO.util.Anim.html#actualFrames", "host": "YAHOO.util.Anim", "name": "actualFrames"}, {"url": "YAHOO.widget.DateMath.html#add", "host": "YAHOO.widget.DateMath", "name": "add"}, {"url": "YAHOO.widget.ButtonGroup.html#addButton", "host": "YAHOO.widget.ButtonGroup", "name": "addButton"}, {"url": "YAHOO.widget.ButtonGroup.html#addButtons", "host": "YAHOO.widget.ButtonGroup", "name": "addButtons"}, {"url": "YAHOO.widget.DataSource.html#_addCacheElem", "host": "YAHOO.widget.DataSource", "name": "_addCacheElem"}, {"url": "YAHOO.util.Dom.html#addClass", "host": "YAHOO.util.Dom", "name": "addClass"}, {"url": "YAHOO.util.Element.html#addClass", "host": "YAHOO.util.Element", "name": "addClass"}, {"url": "YAHOO.widget.Button.html#addHiddenFieldsToForm", "host": "YAHOO.widget.Button", "name": "addHiddenFieldsToForm"}, {"url": "YAHOO.util.DragDrop.html#addInvalidHandleClass", "host": "YAHOO.util.DragDrop", "name": "addInvalidHandleClass"}, {"url": "YAHOO.util.DragDrop.html#addInvalidHandleId", "host": "YAHOO.util.DragDrop", "name": "addInvalidHandleId"}, {"url": "YAHOO.util.DragDrop.html#addInvalidHandleType", "host": "YAHOO.util.DragDrop", "name": "addInvalidHandleType"}, {"url": "YAHOO.widget.Menu.html#addItem", "host": "YAHOO.widget.Menu", "name": "addItem"}, {"url": "YAHOO.widget.MenuManager.html#addItem", "host": "YAHOO.widget.MenuManager", "name": "addItem"}, {"url": "YAHOO.widget.Menu.html#addItems", "host": "YAHOO.widget.Menu", "name": "addItems"}, {"url": "YAHOO.widget.Menu.html#_addItemToGroup", "host": "YAHOO.widget.Menu", "name": "_addItemToGroup"}, {"url": "YAHOO.util.Element.html#addListener", "host": "YAHOO.util.Element", "name": "addListener"}, {"url": "YAHOO.util.Event.html#addListener", "host": "YAHOO.util.Event", "name": "addListener"}, {"url": "YAHOO.util.DragDropMgr.html#_addListeners", "host": "YAHOO.util.DragDropMgr", "name": "_addListeners"}, {"url": "YAHOO.widget.Button.html#_addListenersToForm", "host": "YAHOO.widget.Button", "name": "_addListenersToForm"}, {"url": "YAHOO.widget.MenuManager.html#addMenu", "host": "YAHOO.widget.MenuManager", "name": "addMenu"}, {"url": "YAHOO.widget.Calendar.html#addMonthRenderer", "host": "YAHOO.widget.Calendar", "name": "addMonthRenderer"}, {"url": "YAHOO.widget.CalendarGroup.html#addMonthRenderer", "host": "YAHOO.widget.CalendarGroup", "name": "addMonthRenderer"}, {"url": "YAHOO.widget.Calendar.html#addMonths", "host": "YAHOO.widget.Calendar", "name": "addMonths"}, {"url": "YAHOO.widget.CalendarGroup.html#addMonths", "host": "YAHOO.widget.CalendarGroup", "name": "addMonths"}, {"url": "YAHOO.util.Config.html#addProperty", "host": "YAHOO.util.Config", "name": "addProperty"}, {"url": "RecordSet.html#addRecord", "host": "RecordSet", "name": "addRecord"}, {"url": "DataTable.html#_addRecords", "host": "DataTable", "name": "_addRecords"}, {"url": "RecordSet.html#addRecords", "host": "RecordSet", "name": "addRecords"}, {"url": "YAHOO.widget.Calendar.html#_addRenderer", "host": "YAHOO.widget.Calendar", "name": "_addRenderer"}, {"url": "YAHOO.widget.Calendar.html#addRenderer", "host": "YAHOO.widget.Calendar", "name": "addRenderer"}, {"url": "YAHOO.widget.CalendarGroup.html#addRenderer", "host": "YAHOO.widget.CalendarGroup", "name": "addRenderer"}, {"url": "DataTable.html#addRow", "host": "DataTable", "name": "addRow"}, {"url": "DataTable.html#_addRowEl", "host": "DataTable", "name": "_addRowEl"}, {"url": "YAHOO.widget.TabView.html#addTab", "host": "YAHOO.widget.TabView", "name": "addTab"}, {"url": "DataSource.html#addToCache", "host": "DataSource", "name": "addToCache"}, {"url": "YAHOO.util.DragDrop.html#addToGroup", "host": "YAHOO.util.DragDrop", "name": "addToGroup"}, {"url": "YAHOO.widget.Calendar.html#addWeekdayRenderer", "host": "YAHOO.widget.Calendar", "name": "addWeekdayRenderer"}, {"url": "YAHOO.widget.CalendarGroup.html#addWeekdayRenderer", "host": "YAHOO.widget.CalendarGroup", "name": "addWeekdayRenderer"}, {"url": "YAHOO.widget.Calendar.html#addYears", "host": "YAHOO.widget.Calendar", "name": "addYears"}, {"url": "YAHOO.widget.CalendarGroup.html#addYears", "host": "YAHOO.widget.CalendarGroup", "name": "addYears"}, {"url": "YAHOO.util.Event.html#ADJ_SCOPE", "host": "YAHOO.util.Event", "name": "ADJ_SCOPE"}, {"url": "YAHOO.widget.DateMath.html#after", "host": "YAHOO.widget.DateMath", "name": "after"}, {"url": "YAHOO.widget.Menu.html#_aGroupTitleElements", "host": "YAHOO.widget.Menu", "name": "_aGroupTitleElements"}, {"url": "YAHOO.widget.Menu.html#_aItemGroups", "host": "YAHOO.widget.Menu", "name": "_aItemGroups"}, {"url": "YAHOO.widget.Overlay.html#align", "host": "YAHOO.widget.Overlay", "name": "align"}, {"url": "YAHOO.util.DD.html#alignElWithMouse", "host": "YAHOO.util.DD", "name": "alignElWithMouse"}, {"url": "YAHOO.widget.Menu.html#_aListElements", "host": "YAHOO.widget.Menu", "name": "_aListElements"}, {"url": "YAHOO.widget.AutoComplete.html#_aListItems", "host": "YAHOO.widget.AutoComplete", "name": "_aListItems"}, {"url": "YAHOO.widget.AutoComplete.html#allowBrowserAutocomplete", "host": "YAHOO.widget.AutoComplete", "name": "allowBrowserAutocomplete"}, {"url": "YAHOO.widget.AutoComplete.html#alwaysShowContainer", "host": "YAHOO.widget.AutoComplete", "name": "alwaysShowContainer"}, {"url": "YAHOO.widget.Slider.html#animate", "host": "YAHOO.widget.Slider", "name": "animate"}, {"url": "YAHOO.util.Anim.html#animate", "host": "YAHOO.util.Anim", "name": "animate"}, {"url": "YAHOO.widget.TVFadeIn.html#animate", "host": "YAHOO.widget.TVFadeIn", "name": "animate"}, {"url": "YAHOO.widget.TVFadeOut.html#animate", "host": "YAHOO.widget.TVFadeOut", "name": "animate"}, {"url": "YAHOO.widget.TreeView.html#animateCollapse", "host": "YAHOO.widget.TreeView", "name": "animateCollapse"}, {"url": "YAHOO.widget.TreeView.html#animateExpand", "host": "YAHOO.widget.TreeView", "name": "animateExpand"}, {"url": "YAHOO.widget.ContainerEffect.html#animateIn", "host": "YAHOO.widget.ContainerEffect", "name": "animateIn"}, {"url": "YAHOO.widget.ContainerEffect.html#animateOut", "host": "YAHOO.widget.ContainerEffect", "name": "animateOut"}, {"url": "YAHOO.widget.Slider.html#animationDuration", "host": "YAHOO.widget.Slider", "name": "animationDuration"}, {"url": "YAHOO.widget.ContainerEffect.html#animClass", "host": "YAHOO.widget.ContainerEffect", "name": "animClass"}, {"url": "YAHOO.widget.TreeView.html#animComplete", "host": "YAHOO.widget.TreeView", "name": "animComplete"}, {"url": "YAHOO.widget.TreeView.html#_animCount", "host": "YAHOO.widget.TreeView", "name": "_animCount"}, {"url": "YAHOO.widget.AutoComplete.html#animHoriz", "host": "YAHOO.widget.AutoComplete", "name": "animHoriz"}, {"url": "YAHOO.widget.AutoComplete.html#animSpeed", "host": "YAHOO.widget.AutoComplete", "name": "animSpeed"}, {"url": "YAHOO.widget.TreeView.html#animStart", "host": "YAHOO.widget.TreeView", "name": "animStart"}, {"url": "YAHOO.widget.AutoComplete.html#animVert", "host": "YAHOO.widget.AutoComplete", "name": "animVert"}, {"url": "RecordSet.html#append", "host": "RecordSet", "name": "append"}, {"url": "YAHOO.util.Element.html#appendChild", "host": "YAHOO.util.Element", "name": "appendChild"}, {"url": "YAHOO.widget.Node.html#appendChild", "host": "YAHOO.widget.Node", "name": "appendChild"}, {"url": "YAHOO.widget.Module.html#appendEvent", "host": "YAHOO.widget.Module", "name": "appendEvent"}, {"url": "YAHOO.util.Connect.html#appendPostData", "host": "YAHOO.util.Connect", "name": "appendPostData"}, {"url": "DataTable.html#appendRows", "host": "DataTable", "name": "appendRows"}, {"url": "YAHOO.util.Element.html#appendTo", "host": "YAHOO.util.Element", "name": "appendTo"}, {"url": "YAHOO.widget.Node.html#appendTo", "host": "YAHOO.widget.Node", "name": "appendTo"}, {"url": "YAHOO.widget.Module.html#appendToBody", "host": "YAHOO.widget.Module", "name": "appendToBody"}, {"url": "YAHOO.widget.Module.html#appendToFooter", "host": "YAHOO.widget.Module", "name": "appendToFooter"}, {"url": "YAHOO.widget.Module.html#appendToHeader", "host": "YAHOO.widget.Module", "name": "appendToHeader"}, {"url": "YAHOO.util.Config.html#applyConfig", "host": "YAHOO.util.Config", "name": "applyConfig"}, {"url": "YAHOO.util.DragDrop.html#applyConfig", "host": "YAHOO.util.DragDrop", "name": "applyConfig"}, {"url": "YAHOO.widget.Calendar.html#applyListeners", "host": "YAHOO.widget.Calendar", "name": "applyListeners"}, {"url": "YAHOO.widget.Node.html#applyParent", "host": "YAHOO.widget.Node", "name": "applyParent"}, {"url": "DataTable.html#_aSelectedRecords", "host": "DataTable", "name": "_aSelectedRecords"}, {"url": "YAHOO.util.Connect.html#asyncRequest", "host": "YAHOO.util.Connect", "name": "asyncRequest"}, {"url": "YAHOO.widget.Dialog.html#asyncSubmitEvent", "host": "YAHOO.widget.Dialog", "name": "asyncSubmitEvent"}, {"url": "YAHOO.util.Anim.html#attributes", "host": "YAHOO.util.Anim", "name": "attributes"}, {"url": "YAHOO.widget.ContainerEffect.html#attrIn", "host": "YAHOO.widget.ContainerEffect", "name": "attrIn"}, {"url": "YAHOO.widget.ContainerEffect.html#attrOut", "host": "YAHOO.widget.ContainerEffect", "name": "attrOut"}, {"url": "YAHOO.html#augment", "host": "YAHOO", "name": "augment"}, {"url": "YAHOO.lang.html#augment", "host": "YAHOO.lang", "name": "augment"}, {"url": "YAHOO.widget.Tooltip.html#autodismissdelay", "host": "YAHOO.widget.Tooltip", "name": "autodismissdelay"}, {"url": "YAHOO.widget.AutoComplete.html#autoHighlight", "host": "YAHOO.widget.AutoComplete", "name": "autoHighlight"}, {"url": "YAHOO.util.DD.html#autoOffset", "host": "YAHOO.util.DD", "name": "autoOffset"}, {"url": "YAHOO.util.DD.html#autoScroll", "host": "YAHOO.util.DD", "name": "autoScroll"}, {"url": "YAHOO.widget.Menu.html#autosubmenudisplay", "host": "YAHOO.widget.Menu", "name": "autosubmenudisplay"}, {"url": "YAHOO.widget.Menubar.html#autosubmenudisplay", "host": "YAHOO.widget.Menubar", "name": "autosubmenudisplay"}, {"url": "YAHOO.util.DragDrop.html#available", "host": "YAHOO.util.DragDrop", "name": "available"}, {"url": "YAHOO.util.Element.html#available", "host": "YAHOO.util.Element", "name": "available"}, {"url": "YAHOO.util.DragDrop.html#b4Drag", "host": "YAHOO.util.DragDrop", "name": "b4Drag"}, {"url": "YAHOO.util.DragDrop.html#b4DragDrop", "host": "YAHOO.util.DragDrop", "name": "b4DragDrop"}, {"url": "YAHOO.util.DragDrop.html#b4DragOut", "host": "YAHOO.util.DragDrop", "name": "b4DragOut"}, {"url": "YAHOO.util.DragDrop.html#b4DragOver", "host": "YAHOO.util.DragDrop", "name": "b4DragOver"}, {"url": "YAHOO.util.DragDrop.html#b4EndDrag", "host": "YAHOO.util.DragDrop", "name": "b4EndDrag"}, {"url": "YAHOO.util.DragDrop.html#b4MouseDown", "host": "YAHOO.util.DragDrop", "name": "b4MouseDown"}, {"url": "YAHOO.widget.Slider.html#b4MouseDown", "host": "YAHOO.widget.Slider", "name": "b4MouseDown"}, {"url": "YAHOO.util.DragDrop.html#b4StartDrag", "host": "YAHOO.util.DragDrop", "name": "b4StartDrag"}, {"url": "YAHOO.util.Easing.html#backBoth", "host": "YAHOO.util.Easing", "name": "backBoth"}, {"url": "YAHOO.widget.Slider.html#backgroundEnabled", "host": "YAHOO.widget.Slider", "name": "backgroundEnabled"}, {"url": "YAHOO.util.Easing.html#backIn", "host": "YAHOO.util.Easing", "name": "backIn"}, {"url": "YAHOO.util.Easing.html#backOut", "host": "YAHOO.util.Easing", "name": "backOut"}, {"url": "YAHOO.widget.Slider.html#baselinePos", "host": "YAHOO.widget.Slider", "name": "baselinePos"}, {"url": "YAHOO.util.Dom.html#batch", "host": "YAHOO.util.Dom", "name": "batch"}, {"url": "YAHOO.widget.ContextMenu.html#_bCancelled", "host": "YAHOO.widget.ContextMenu", "name": "_bCancelled"}, {"url": "YAHOO.widget.AutoComplete.html#_bContainerOpen", "host": "YAHOO.widget.AutoComplete", "name": "_bContainerOpen"}, {"url": "YAHOO.widget.DateMath.html#before", "host": "YAHOO.widget.DateMath", "name": "before"}, {"url": "YAHOO.widget.Tab.html#beforeActiveChange", "host": "YAHOO.widget.Tab", "name": "beforeActiveChange"}, {"url": "YAHOO.widget.TabView.html#beforeActiveTabChange", "host": "YAHOO.widget.TabView", "name": "beforeActiveTabChange"}, {"url": "YAHOO.widget.Tab.html#beforeContentChange", "host": "YAHOO.widget.Tab", "name": "beforeContentChange"}, {"url": "YAHOO.widget.Calendar.html#beforeDeselectEvent", "host": "YAHOO.widget.Calendar", "name": "beforeDeselectEvent"}, {"url": "YAHOO.widget.CalendarGroup.html#beforeDeselectEvent", "host": "YAHOO.widget.CalendarGroup", "name": "beforeDeselectEvent"}, {"url": "YAHOO.widget.Module.html#beforeHideEvent", "host": "YAHOO.widget.Module", "name": "beforeHideEvent"}, {"url": "YAHOO.widget.Module.html#beforeInitEvent", "host": "YAHOO.widget.Module", "name": "beforeInitEvent"}, {"url": "YAHOO.widget.Tab.html#beforeLabelChange", "host": "YAHOO.widget.Tab", "name": "beforeLabelChange"}, {"url": "YAHOO.widget.Overlay.html#beforeMoveEvent", "host": "YAHOO.widget.Overlay", "name": "beforeMoveEvent"}, {"url": "YAHOO.widget.TabView.html#beforeOrientationChange", "host": "YAHOO.widget.TabView", "name": "beforeOrientationChange"}, {"url": "YAHOO.widget.Module.html#beforeRenderEvent", "host": "YAHOO.widget.Module", "name": "beforeRenderEvent"}, {"url": "YAHOO.widget.Calendar.html#beforeRenderEvent", "host": "YAHOO.widget.Calendar", "name": "beforeRenderEvent"}, {"url": "YAHOO.widget.CalendarGroup.html#beforeRenderEvent", "host": "YAHOO.widget.CalendarGroup", "name": "beforeRenderEvent"}, {"url": "YAHOO.widget.Calendar.html#beforeSelectEvent", "host": "YAHOO.widget.Calendar", "name": "beforeSelectEvent"}, {"url": "YAHOO.widget.CalendarGroup.html#beforeSelectEvent", "host": "YAHOO.widget.CalendarGroup", "name": "beforeSelectEvent"}, {"url": "YAHOO.widget.Module.html#beforeShowEvent", "host": "YAHOO.widget.Module", "name": "beforeShowEvent"}, {"url": "YAHOO.widget.Dialog.html#beforeSumitEvent", "host": "YAHOO.widget.Dialog", "name": "beforeSumitEvent"}, {"url": "YAHOO.widget.DateMath.html#between", "host": "YAHOO.widget.DateMath", "name": "between"}, {"url": "DataTable.html#_bFocused", "host": "DataTable", "name": "_bFocused"}, {"url": "YAHOO.widget.AutoComplete.html#_bFocused", "host": "YAHOO.widget.AutoComplete", "name": "_bFocused"}, {"url": "YAHOO.widget.Menu.html#_bHandledMouseOutEvent", "host": "YAHOO.widget.Menu", "name": "_bHandledMouseOutEvent"}, {"url": "YAHOO.widget.Menu.html#_bHandledMouseOverEvent", "host": "YAHOO.widget.Menu", "name": "_bHandledMouseOverEvent"}, {"url": "YAHOO.widget.Menu.html#_bHideDelayEventHandlersAssigned", "host": "YAHOO.widget.Menu", "name": "_bHideDelayEventHandlersAssigned"}, {"url": "YAHOO.util.History.html#_bhmReady", "host": "YAHOO.util.History", "name": "_bhmReady"}, {"url": "YAHOO.widget.AutoComplete.html#_bItemSelected", "host": "YAHOO.widget.AutoComplete", "name": "_bItemSelected"}, {"url": "YAHOO.widget.Menu.html#blur", "host": "YAHOO.widget.Menu", "name": "blur"}, {"url": "YAHOO.widget.MenuItem.html#blur", "host": "YAHOO.widget.MenuItem", "name": "blur"}, {"url": "YAHOO.widget.Button.html#blur", "host": "YAHOO.widget.Button", "name": "blur"}, {"url": "YAHOO.widget.OverlayManager.html#blurAll", "host": "YAHOO.widget.OverlayManager", "name": "blurAll"}, {"url": "YAHOO.widget.Dialog.html#blurButtons", "host": "YAHOO.widget.Dialog", "name": "blurButtons"}, {"url": "YAHOO.widget.MenuItem.html#blurEvent", "host": "YAHOO.widget.MenuItem", "name": "blurEvent"}, {"url": "YAHOO.widget.Module.html#body", "host": "YAHOO.widget.Module", "name": "body"}, {"url": "YAHOO.util.Region.html#bottom", "host": "YAHOO.util.Region", "name": "bottom"}, {"url": "YAHOO.widget.LogReader.html#bottom", "host": "YAHOO.widget.LogReader", "name": "bottom"}, {"url": "YAHOO.util.Easing.html#bounceBoth", "host": "YAHOO.util.Easing", "name": "bounceBoth"}, {"url": "YAHOO.util.Easing.html#bounceIn", "host": "YAHOO.util.Easing", "name": "bounceIn"}, {"url": "YAHOO.util.Easing.html#bounceOut", "host": "YAHOO.util.Easing", "name": "bounceOut"}, {"url": "YAHOO.widget.AutoComplete.html#_bOverContainer", "host": "YAHOO.widget.AutoComplete", "name": "_bOverContainer"}, {"url": "YAHOO.widget.Module.html#browser", "host": "YAHOO.widget.Module", "name": "browser"}, {"url": "YAHOO.widget.MenuItem.html#browser", "host": "YAHOO.widget.MenuItem", "name": "browser"}, {"url": "YAHOO.widget.Calendar.html#browser", "host": "YAHOO.widget.Calendar", "name": "browser"}, {"url": "YAHOO.util.History.html#_browser", "host": "YAHOO.util.History", "name": "_browser"}, {"url": "YAHOO.widget.Logger.html#_browserConsoleEnabled", "host": "YAHOO.widget.Logger", "name": "_browserConsoleEnabled"}, {"url": "YAHOO.widget.Menu.html#_bStopMouseEventHandlers", "host": "YAHOO.widget.Menu", "name": "_bStopMouseEventHandlers"}, {"url": "YAHOO.widget.LogReader.html#_btnClear", "host": "YAHOO.widget.LogReader", "name": "_btnClear"}, {"url": "YAHOO.widget.LogReader.html#_btnCollapse", "host": "YAHOO.widget.LogReader", "name": "_btnCollapse"}, {"url": "YAHOO.widget.LogReader.html#_btnPause", "host": "YAHOO.widget.LogReader", "name": "_btnPause"}, {"url": "YAHOO.widget.LogReader.html#_buffer", "host": "YAHOO.widget.LogReader", "name": "_buffer"}, {"url": "YAHOO.widget.Calendar.html#buildDayLabel", "host": "YAHOO.widget.Calendar", "name": "buildDayLabel"}, {"url": "YAHOO.widget.Panel.html#buildMask", "host": "YAHOO.widget.Panel", "name": "buildMask"}, {"url": "YAHOO.widget.Calendar.html#buildMonthLabel", "host": "YAHOO.widget.Calendar", "name": "buildMonthLabel"}, {"url": "YAHOO.widget.Calendar.html#buildWeekdays", "host": "YAHOO.widget.Calendar", "name": "buildWeekdays"}, {"url": "YAHOO.widget.Panel.html#buildWrapper", "host": "YAHOO.widget.Panel", "name": "buildWrapper"}, {"url": "YAHOO.widget.Button.html#_button", "host": "YAHOO.widget.Button", "name": "_button"}, {"url": "YAHOO.widget.Dialog.html#buttons", "host": "YAHOO.widget.Dialog", "name": "buttons"}, {"url": "YAHOO.widget.ButtonGroup.html#_buttons", "host": "YAHOO.widget.ButtonGroup", "name": "_buttons"}, {"url": "YAHOO.widget.Tab.html#cacheData", "host": "YAHOO.widget.Tab", "name": "cacheData"}, {"url": "YAHOO.widget.DataSource.html#cacheFlushEvent", "host": "YAHOO.widget.DataSource", "name": "cacheFlushEvent"}, {"url": "DataSource.html#cacheFlushEvent", "host": "DataSource", "name": "cacheFlushEvent"}, {"url": "YAHOO.util.DD.html#cachePosition", "host": "YAHOO.util.DD", "name": "cachePosition"}, {"url": "YAHOO.widget.DataSource.html#cacheQueryEvent", "host": "YAHOO.widget.DataSource", "name": "cacheQueryEvent"}, {"url": "DataSource.html#cacheRequestEvent", "host": "DataSource", "name": "cacheRequestEvent"}, {"url": "YAHOO.widget.Calendar2up.html#Cal2up", "host": "YAHOO.widget.Calendar2up", "name": "Cal2up"}, {"url": "YAHOO.widget.Dialog.html#callback", "host": "YAHOO.widget.Dialog", "name": "callback"}, {"url": "YAHOO.widget.TVFadeIn.html#callback", "host": "YAHOO.widget.TVFadeIn", "name": "callback"}, {"url": "YAHOO.widget.TVFadeOut.html#callback", "host": "YAHOO.widget.TVFadeOut", "name": "callback"}, {"url": "YAHOO.widget.Dialog.html#callback.argument", "host": "YAHOO.widget.Dialog", "name": "callback.argument"}, {"url": "YAHOO.widget.Dialog.html#callback.failure", "host": "YAHOO.widget.Dialog", "name": "callback.failure"}, {"url": "YAHOO.widget.Dialog.html#callback.success", "host": "YAHOO.widget.Dialog", "name": "callback.success"}, {"url": "YAHOO.widget.CalendarGroup.html#callChildFunction", "host": "YAHOO.widget.CalendarGroup", "name": "callChildFunction"}, {"url": "YAHOO.widget.Dialog.html#cancel", "host": "YAHOO.widget.Dialog", "name": "cancel"}, {"url": "YAHOO.widget.ContextMenu.html#cancel", "host": "YAHOO.widget.ContextMenu", "name": "cancel"}, {"url": "DataTable.html#cancelEditorData", "host": "DataTable", "name": "cancelEditorData"}, {"url": "YAHOO.widget.Dialog.html#cancelEvent", "host": "YAHOO.widget.Dialog", "name": "cancelEvent"}, {"url": "YAHOO.widget.Menu.html#_cancelHideDelay", "host": "YAHOO.widget.Menu", "name": "_cancelHideDelay"}, {"url": "YAHOO.widget.AutoComplete.html#_cancelIntervalDetection", "host": "YAHOO.widget.AutoComplete", "name": "_cancelIntervalDetection"}, {"url": "YAHOO.widget.Menu.html#_cancelShowDelay", "host": "YAHOO.widget.Menu", "name": "_cancelShowDelay"}, {"url": "DataTable.html#caption", "host": "DataTable", "name": "caption"}, {"url": "YAHOO.widget.Logger.html#categories", "host": "YAHOO.widget.Logger", "name": "categories"}, {"url": "YAHOO.widget.LogMsg.html#category", "host": "YAHOO.widget.LogMsg", "name": "category"}, {"url": "YAHOO.widget.Logger.html#categoryCreateEvent", "host": "YAHOO.widget.Logger", "name": "categoryCreateEvent"}, {"url": "YAHOO.widget.LogReader.html#_categoryFilters", "host": "YAHOO.widget.LogReader", "name": "_categoryFilters"}, {"url": "DataTable.html#cellClickEvent", "host": "DataTable", "name": "cellClickEvent"}, {"url": "YAHOO.widget.Calendar.html#cellDates", "host": "YAHOO.widget.Calendar", "name": "cellDates"}, {"url": "DataTable.html#cellDoubleclickEvent", "host": "DataTable", "name": "cellDoubleclickEvent"}, {"url": "DataTable.html#cellEditEvent", "host": "DataTable", "name": "cellEditEvent"}, {"url": "DataTable.html#cellFormatEvent", "host": "DataTable", "name": "cellFormatEvent"}, {"url": "DataTable.html#cellMousedownEvent", "host": "DataTable", "name": "cellMousedownEvent"}, {"url": "DataTable.html#cellMouseoutEvent", "host": "DataTable", "name": "cellMouseoutEvent"}, {"url": "DataTable.html#cellMouseoverEvent", "host": "DataTable", "name": "cellMouseoverEvent"}, {"url": "YAHOO.widget.Calendar.html#cells", "host": "YAHOO.widget.Calendar", "name": "cells"}, {"url": "YAHOO.widget.Overlay.html#center", "host": "YAHOO.widget.Overlay", "name": "center"}, {"url": "YAHOO.util.DDProxy.html#centerFrame", "host": "YAHOO.util.DDProxy", "name": "centerFrame"}, {"url": "YAHOO.widget.Module.html#cfg", "host": "YAHOO.widget.Module", "name": "cfg"}, {"url": "YAHOO.widget.OverlayManager.html#cfg", "host": "YAHOO.widget.OverlayManager", "name": "cfg"}, {"url": "YAHOO.widget.Calendar.html#cfg", "host": "YAHOO.widget.Calendar", "name": "cfg"}, {"url": "YAHOO.widget.CalendarGroup.html#cfg", "host": "YAHOO.widget.CalendarGroup", "name": "cfg"}, {"url": "YAHOO.widget.Slider.html#change", "host": "YAHOO.widget.Slider", "name": "change"}, {"url": "YAHOO.widget.Module.html#changeBodyEvent", "host": "YAHOO.widget.Module", "name": "changeBodyEvent"}, {"url": "YAHOO.widget.Module.html#changeContentEvent", "host": "YAHOO.widget.Module", "name": "changeContentEvent"}, {"url": "YAHOO.widget.Module.html#changeFooterEvent", "host": "YAHOO.widget.Module", "name": "changeFooterEvent"}, {"url": "YAHOO.widget.Module.html#changeHeaderEvent", "host": "YAHOO.widget.Module", "name": "changeHeaderEvent"}, {"url": "YAHOO.widget.Calendar.html#changePageEvent", "host": "YAHOO.widget.Calendar", "name": "changePageEvent"}, {"url": "YAHOO.widget.CalendarGroup.html#changePageEvent", "host": "YAHOO.widget.CalendarGroup", "name": "changePageEvent"}, {"url": "YAHOO.widget.ButtonGroup.html#check", "host": "YAHOO.widget.ButtonGroup", "name": "check"}, {"url": "YAHOO.widget.Button.html#CHECK_ACTIVATION_KEYS", "host": "YAHOO.widget.Button", "name": "CHECK_ACTIVATION_KEYS"}, {"url": "YAHOO.util.Config.html#checkBoolean", "host": "YAHOO.util.Config", "name": "checkBoolean"}, {"url": "YAHOO.widget.Button.html#CHECKBOX_CHECKED_TITLE", "host": "YAHOO.widget.Button", "name": "CHECKBOX_CHECKED_TITLE"}, {"url": "DataTable.html#checkboxClickEvent", "host": "DataTable", "name": "checkboxClickEvent"}, {"url": "YAHOO.widget.Button.html#CHECKBOX_DEFAULT_TITLE", "host": "YAHOO.widget.Button", "name": "CHECKBOX_DEFAULT_TITLE"}, {"url": "YAHOO.widget.MenuItem.html#_checkDOMNode", "host": "YAHOO.widget.MenuItem", "name": "_checkDOMNode"}, {"url": "YAHOO.widget.MenuItem.html#checked", "host": "YAHOO.widget.MenuItem", "name": "checked"}, {"url": "YAHOO.widget.Button.html#checked", "host": "YAHOO.widget.Button", "name": "checked"}, {"url": "YAHOO.widget.ButtonGroup.html#checkedButton", "host": "YAHOO.widget.ButtonGroup", "name": "checkedButton"}, {"url": "YAHOO.widget.MenuItem.html#CHECKED_TEXT", "host": "YAHOO.widget.MenuItem", "name": "CHECKED_TEXT"}, {"url": "YAHOO.util.History.html#_checkIframeLoaded", "host": "YAHOO.util.History", "name": "_checkIframeLoaded"}, {"url": "YAHOO.util.Config.html#checkNumber", "host": "YAHOO.util.Config", "name": "checkNumber"}, {"url": "YAHOO.widget.Menu.html#_checkPosition", "host": "YAHOO.widget.Menu", "name": "_checkPosition"}, {"url": "Column.html#_children", "host": "Column", "name": "_children"}, {"url": "Column.html#children", "host": "Column", "name": "children"}, {"url": "YAHOO.widget.Node.html#children", "host": "YAHOO.widget.Node", "name": "children"}, {"url": "YAHOO.widget.Node.html#childrenRendered", "host": "YAHOO.widget.Node", "name": "childrenRendered"}, {"url": "DataTable.html#CLASS_BODY", "host": "DataTable", "name": "CLASS_BODY"}, {"url": "DataTable.html#CLASS_CHECKBOX", "host": "DataTable", "name": "CLASS_CHECKBOX"}, {"url": "DataTable.html#CLASS_CURRENCY", "host": "DataTable", "name": "CLASS_CURRENCY"}, {"url": "DataTable.html#CLASS_CURRENTPAGE", "host": "DataTable", "name": "CLASS_CURRENTPAGE"}, {"url": "DataTable.html#CLASS_DATE", "host": "DataTable", "name": "CLASS_DATE"}, {"url": "DataTable.html#CLASS_EDITABLE", "host": "DataTable", "name": "CLASS_EDITABLE"}, {"url": "DataTable.html#CLASS_EDITOR", "host": "DataTable", "name": "CLASS_EDITOR"}, {"url": "DataTable.html#CLASS_EMAIL", "host": "DataTable", "name": "CLASS_EMAIL"}, {"url": "DataTable.html#CLASS_EMPTY", "host": "DataTable", "name": "CLASS_EMPTY"}, {"url": "DataTable.html#CLASS_ERROR", "host": "DataTable", "name": "CLASS_ERROR"}, {"url": "DataTable.html#CLASS_EVEN", "host": "DataTable", "name": "CLASS_EVEN"}, {"url": "DataTable.html#CLASS_FIRST", "host": "DataTable", "name": "CLASS_FIRST"}, {"url": "DataTable.html#CLASS_FIRSTLINK", "host": "DataTable", "name": "CLASS_FIRSTLINK"}, {"url": "DataTable.html#CLASS_FIRSTPAGE", "host": "DataTable", "name": "CLASS_FIRSTPAGE"}, {"url": "DataTable.html#CLASS_HEADCONTAINER", "host": "DataTable", "name": "CLASS_HEADCONTAINER"}, {"url": "DataTable.html#CLASS_HEADRESIZER", "host": "DataTable", "name": "CLASS_HEADRESIZER"}, {"url": "DataTable.html#CLASS_HEADTEXT", "host": "DataTable", "name": "CLASS_HEADTEXT"}, {"url": "DataTable.html#CLASS_HIGHLIGHT", "host": "DataTable", "name": "CLASS_HIGHLIGHT"}, {"url": "DataTable.html#CLASS_LAST", "host": "DataTable", "name": "CLASS_LAST"}, {"url": "DataTable.html#CLASS_LASTLINK", "host": "DataTable", "name": "CLASS_LASTLINK"}, {"url": "DataTable.html#CLASS_LASTPAGE", "host": "DataTable", "name": "CLASS_LASTPAGE"}, {"url": "DataTable.html#CLASS_LINK", "host": "DataTable", "name": "CLASS_LINK"}, {"url": "DataTable.html#CLASS_LOADING", "host": "DataTable", "name": "CLASS_LOADING"}, {"url": "Column.html#className", "host": "Column", "name": "className"}, {"url": "YAHOO.widget.Menu.html#classname", "host": "YAHOO.widget.Menu", "name": "classname"}, {"url": "YAHOO.widget.MenuItem.html#classname", "host": "YAHOO.widget.MenuItem", "name": "classname"}, {"url": "YAHOO.widget.TabView.html#CLASSNAME", "host": "YAHOO.widget.TabView", "name": "CLASSNAME"}, {"url": "DataTable.html#CLASS_NEXTLINK", "host": "DataTable", "name": "CLASS_NEXTLINK"}, {"url": "DataTable.html#CLASS_NEXTPAGE", "host": "DataTable", "name": "CLASS_NEXTPAGE"}, {"url": "DataTable.html#CLASS_NUMBER", "host": "DataTable", "name": "CLASS_NUMBER"}, {"url": "DataTable.html#CLASS_ODD", "host": "DataTable", "name": "CLASS_ODD"}, {"url": "DataTable.html#CLASS_PAGELINK", "host": "DataTable", "name": "CLASS_PAGELINK"}, {"url": "DataTable.html#CLASS_PAGELINKS", "host": "DataTable", "name": "CLASS_PAGELINKS"}, {"url": "DataTable.html#CLASS_PAGESELECT", "host": "DataTable", "name": "CLASS_PAGESELECT"}, {"url": "DataTable.html#CLASS_PAGINATOR", "host": "DataTable", "name": "CLASS_PAGINATOR"}, {"url": "DataTable.html#CLASS_PREVLINK", "host": "DataTable", "name": "CLASS_PREVLINK"}, {"url": "DataTable.html#CLASS_PREVPAGE", "host": "DataTable", "name": "CLASS_PREVPAGE"}, {"url": "DataTable.html#CLASS_SCROLLABLE", "host": "DataTable", "name": "CLASS_SCROLLABLE"}, {"url": "DataTable.html#CLASS_SCROLLBODY", "host": "DataTable", "name": "CLASS_SCROLLBODY"}, {"url": "DataTable.html#CLASS_SELECTED", "host": "DataTable", "name": "CLASS_SELECTED"}, {"url": "DataTable.html#CLASS_SORTABLE", "host": "DataTable", "name": "CLASS_SORTABLE"}, {"url": "DataTable.html#CLASS_SORTEDBYASC", "host": "DataTable", "name": "CLASS_SORTEDBYASC"}, {"url": "DataTable.html#CLASS_SORTEDBYDESC", "host": "DataTable", "name": "CLASS_SORTEDBYDESC"}, {"url": "DataTable.html#CLASS_STRING", "host": "DataTable", "name": "CLASS_STRING"}, {"url": "DataTable.html#CLASS_TABLE", "host": "DataTable", "name": "CLASS_TABLE"}, {"url": "YAHOO.widget.Calendar.html#clear", "host": "YAHOO.widget.Calendar", "name": "clear"}, {"url": "YAHOO.widget.CalendarGroup.html#clear", "host": "YAHOO.widget.CalendarGroup", "name": "clear"}, {"url": "YAHOO.widget.Menu.html#clearActiveItem", "host": "YAHOO.widget.Menu", "name": "clearActiveItem"}, {"url": "YAHOO.widget.Calendar.html#clearAllBodyCellStyles", "host": "YAHOO.widget.Calendar", "name": "clearAllBodyCellStyles"}, {"url": "YAHOO.util.Event.html#clearCache", "host": "YAHOO.util.Event", "name": "clearCache"}, {"url": "YAHOO.widget.LogReader.html#clearConsole", "host": "YAHOO.widget.LogReader", "name": "clearConsole"}, {"url": "YAHOO.util.DragDrop.html#clearConstraints", "host": "YAHOO.util.DragDrop", "name": "clearConstraints"}, {"url": "YAHOO.widget.Menu.html#clearContent", "host": "YAHOO.widget.Menu", "name": "clearContent"}, {"url": "YAHOO.widget.Calendar.html#clearElement", "host": "YAHOO.widget.Calendar", "name": "clearElement"}, {"url": "YAHOO.widget.Calendar.html#clearEvent", "host": "YAHOO.widget.Calendar", "name": "clearEvent"}, {"url": "YAHOO.widget.CalendarGroup.html#clearEvent", "host": "YAHOO.widget.CalendarGroup", "name": "clearEvent"}, {"url": "YAHOO.widget.AutoComplete.html#_clearSelection", "host": "YAHOO.widget.AutoComplete", "name": "_clearSelection"}, {"url": "YAHOO.util.DragDrop.html#clearTicks", "host": "YAHOO.util.DragDrop", "name": "clearTicks"}, {"url": "YAHOO.widget.SliderThumb.html#clearTicks", "host": "YAHOO.widget.SliderThumb", "name": "clearTicks"}, {"url": "YAHOO.widget.DateMath.html#clearTime", "host": "YAHOO.widget.DateMath", "name": "clearTime"}, {"url": "YAHOO.widget.Menu.html#clickEvent", "host": "YAHOO.widget.Menu", "name": "clickEvent"}, {"url": "YAHOO.widget.MenuItem.html#clickEvent", "host": "YAHOO.widget.MenuItem", "name": "clickEvent"}, {"url": "YAHOO.util.DragDropMgr.html#clickPixelThresh", "host": "YAHOO.util.DragDropMgr", "name": "clickPixelThresh"}, {"url": "YAHOO.util.DragDropMgr.html#clickTimeout", "host": "YAHOO.util.DragDropMgr", "name": "clickTimeout"}, {"url": "YAHOO.util.DragDropMgr.html#clickTimeThresh", "host": "YAHOO.util.DragDropMgr", "name": "clickTimeThresh"}, {"url": "YAHOO.widget.Menu.html#clicktohide", "host": "YAHOO.widget.Menu", "name": "clicktohide"}, {"url": "YAHOO.widget.Panel.html#close", "host": "YAHOO.widget.Panel", "name": "close"}, {"url": "YAHOO.widget.Calendar.html#close", "host": "YAHOO.widget.Calendar", "name": "close"}, {"url": "YAHOO.widget.CalendarGroup.html#close", "host": "YAHOO.widget.CalendarGroup", "name": "close"}, {"url": "YAHOO.widget.LogReader.html#collapse", "host": "YAHOO.widget.LogReader", "name": "collapse"}, {"url": "YAHOO.widget.TreeView.html#collapse", "host": "YAHOO.widget.TreeView", "name": "collapse"}, {"url": "YAHOO.widget.Node.html#collapse\ntoggle style.", "host": "YAHOO.widget.Node", "name": "collapse\ntoggle style."}, {"url": "YAHOO.widget.Node.html#collapseAll", "host": "YAHOO.widget.Node", "name": "collapseAll"}, {"url": "YAHOO.widget.TreeView.html#collapseAll", "host": "YAHOO.widget.TreeView", "name": "collapseAll"}, {"url": "YAHOO.widget.TreeView.html#_collapseAnim", "host": "YAHOO.widget.TreeView", "name": "_collapseAnim"}, {"url": "YAHOO.widget.TreeView.html#collapseComplete", "host": "YAHOO.widget.TreeView", "name": "collapseComplete"}, {"url": "YAHOO.widget.MenuItem.html#COLLAPSED_SUBMENU_INDICATOR_TEXT", "host": "YAHOO.widget.MenuItem", "name": "COLLAPSED_SUBMENU_INDICATOR_TEXT"}, {"url": "Column.html#_colspan", "host": "Column", "name": "_colspan"}, {"url": "ColumnEditor.html#column", "host": "ColumnEditor", "name": "column"}, {"url": "DataTable.html#columnResizeEvent", "host": "DataTable", "name": "columnResizeEvent"}, {"url": "DataTable.html#columnSortEvent", "host": "DataTable", "name": "columnSortEvent"}, {"url": "Sort.html#compareAsc", "host": "Sort", "name": "compareAsc"}, {"url": "Sort.html#compareDesc", "host": "Sort", "name": "compareDesc"}, {"url": "YAHOO.widget.OverlayManager.html#compareZIndexDesc", "host": "YAHOO.widget.OverlayManager", "name": "compareZIndexDesc"}, {"url": "YAHOO.widget.Node.html#completeRender", "host": "YAHOO.widget.Node", "name": "completeRender"}, {"url": "YAHOO.util.Config.html#config", "host": "YAHOO.util.Config", "name": "config"}, {"url": "YAHOO.util.DragDrop.html#config", "host": "YAHOO.util.DragDrop", "name": "config"}, {"url": "YAHOO.widget.Calendar.html#Config", "host": "YAHOO.widget.Calendar", "name": "Config"}, {"url": "YAHOO.widget.Dialog.html#configButtons", "host": "YAHOO.widget.Dialog", "name": "configButtons"}, {"url": "YAHOO.util.Config.html#configChangedEvent", "host": "YAHOO.util.Config", "name": "configChangedEvent"}, {"url": "YAHOO.widget.MenuItem.html#configChecked", "host": "YAHOO.widget.MenuItem", "name": "configChecked"}, {"url": "YAHOO.widget.Menu.html#configClassName", "host": "YAHOO.widget.Menu", "name": "configClassName"}, {"url": "YAHOO.widget.MenuItem.html#configClassName", "host": "YAHOO.widget.MenuItem", "name": "configClassName"}, {"url": "YAHOO.widget.Dialog.html#configClose", "host": "YAHOO.widget.Dialog", "name": "configClose"}, {"url": "YAHOO.widget.Panel.html#configClose", "host": "YAHOO.widget.Panel", "name": "configClose"}, {"url": "YAHOO.widget.Calendar.html#configClose", "host": "YAHOO.widget.Calendar", "name": "configClose"}, {"url": "YAHOO.widget.Overlay.html#configConstrainToViewport", "host": "YAHOO.widget.Overlay", "name": "configConstrainToViewport"}, {"url": "YAHOO.widget.Tooltip.html#configContainer", "host": "YAHOO.widget.Tooltip", "name": "configContainer"}, {"url": "YAHOO.widget.Menu.html#configContainer", "host": "YAHOO.widget.Menu", "name": "configContainer"}, {"url": "YAHOO.widget.Overlay.html#configContext", "host": "YAHOO.widget.Overlay", "name": "configContext"}, {"url": "YAHOO.widget.Tooltip.html#configContext", "host": "YAHOO.widget.Tooltip", "name": "configContext"}, {"url": "YAHOO.widget.MenuItem.html#configDisabled", "host": "YAHOO.widget.MenuItem", "name": "configDisabled"}, {"url": "YAHOO.widget.Panel.html#configDraggable", "host": "YAHOO.widget.Panel", "name": "configDraggable"}, {"url": "YAHOO.widget.MenuItem.html#configEmphasis", "host": "YAHOO.widget.MenuItem", "name": "configEmphasis"}, {"url": "YAHOO.widget.Overlay.html#configFixedCenter", "host": "YAHOO.widget.Overlay", "name": "configFixedCenter"}, {"url": "YAHOO.widget.Overlay.html#configHeight", "host": "YAHOO.widget.Overlay", "name": "configHeight"}, {"url": "YAHOO.widget.Panel.html#configHeight", "host": "YAHOO.widget.Panel", "name": "configHeight"}, {"url": "YAHOO.widget.MenuItem.html#configHelpText", "host": "YAHOO.widget.MenuItem", "name": "configHelpText"}, {"url": "YAHOO.widget.Menu.html#configHideDelay", "host": "YAHOO.widget.Menu", "name": "configHideDelay"}, {"url": "YAHOO.widget.SimpleDialog.html#configIcon", "host": "YAHOO.widget.SimpleDialog", "name": "configIcon"}, {"url": "YAHOO.widget.Overlay.html#configIframe", "host": "YAHOO.widget.Overlay", "name": "configIframe"}, {"url": "YAHOO.widget.Menu.html#configIframe", "host": "YAHOO.widget.Menu", "name": "configIframe"}, {"url": "YAHOO.widget.Calendar.html#configIframe", "host": "YAHOO.widget.Calendar", "name": "configIframe"}, {"url": "YAHOO.widget.Panel.html#configKeyListeners", "host": "YAHOO.widget.Panel", "name": "configKeyListeners"}, {"url": "YAHOO.widget.Calendar.html#configLocale", "host": "YAHOO.widget.Calendar", "name": "configLocale"}, {"url": "YAHOO.widget.Calendar.html#configLocaleValues", "host": "YAHOO.widget.Calendar", "name": "configLocaleValues"}, {"url": "YAHOO.widget.Calendar.html#configMaxDate", "host": "YAHOO.widget.Calendar", "name": "configMaxDate"}, {"url": "YAHOO.widget.Menu.html#configMaxHeight", "host": "YAHOO.widget.Menu", "name": "configMaxHeight"}, {"url": "YAHOO.widget.Calendar.html#configMinDate", "host": "YAHOO.widget.Calendar", "name": "configMinDate"}, {"url": "YAHOO.widget.Panel.html#configModal", "host": "YAHOO.widget.Panel", "name": "configModal"}, {"url": "YAHOO.widget.Module.html#configMonitorResize", "host": "YAHOO.widget.Module", "name": "configMonitorResize"}, {"url": "YAHOO.widget.MenuItem.html#configOnClick", "host": "YAHOO.widget.MenuItem", "name": "configOnClick"}, {"url": "YAHOO.widget.Calendar.html#configOptions", "host": "YAHOO.widget.Calendar", "name": "configOptions"}, {"url": "YAHOO.widget.Calendar.html#configPageDate", "host": "YAHOO.widget.Calendar", "name": "configPageDate"}, {"url": "YAHOO.widget.CalendarGroup.html#configPageDate", "host": "YAHOO.widget.CalendarGroup", "name": "configPageDate"}, {"url": "YAHOO.widget.CalendarGroup.html#configPages", "host": "YAHOO.widget.CalendarGroup", "name": "configPages"}, {"url": "YAHOO.widget.Menu.html#configPosition", "host": "YAHOO.widget.Menu", "name": "configPosition"}, {"url": "YAHOO.widget.Dialog.html#configPostMethod", "host": "YAHOO.widget.Dialog", "name": "configPostMethod"}, {"url": "YAHOO.util.AttributeProvider.html#_configs", "host": "YAHOO.util.AttributeProvider", "name": "_configs"}, {"url": "YAHOO.widget.MenuItem.html#configSelected", "host": "YAHOO.widget.MenuItem", "name": "configSelected"}, {"url": "YAHOO.widget.Calendar.html#configSelected", "host": "YAHOO.widget.Calendar", "name": "configSelected"}, {"url": "YAHOO.widget.CalendarGroup.html#configSelected", "host": "YAHOO.widget.CalendarGroup", "name": "configSelected"}, {"url": "YAHOO.widget.MenuItem.html#configStrongEmphasis", "host": "YAHOO.widget.MenuItem", "name": "configStrongEmphasis"}, {"url": "YAHOO.widget.MenuItem.html#configSubmenu", "host": "YAHOO.widget.MenuItem", "name": "configSubmenu"}, {"url": "YAHOO.widget.MenuItem.html#configTarget", "host": "YAHOO.widget.MenuItem", "name": "configTarget"}, {"url": "YAHOO.widget.SimpleDialog.html#configText", "host": "YAHOO.widget.SimpleDialog", "name": "configText"}, {"url": "YAHOO.widget.Tooltip.html#configText", "host": "YAHOO.widget.Tooltip", "name": "configText"}, {"url": "YAHOO.widget.MenuItem.html#configText", "host": "YAHOO.widget.MenuItem", "name": "configText"}, {"url": "YAHOO.widget.Calendar.html#configTitle", "host": "YAHOO.widget.Calendar", "name": "configTitle"}, {"url": "YAHOO.widget.ContextMenu.html#configTrigger", "host": "YAHOO.widget.ContextMenu", "name": "configTrigger"}, {"url": "YAHOO.widget.Panel.html#configUnderlay", "host": "YAHOO.widget.Panel", "name": "configUnderlay"}, {"url": "YAHOO.util.Attribute.html#configure", "host": "YAHOO.util.Attribute", "name": "configure"}, {"url": "YAHOO.util.AttributeProvider.html#configureAttribute", "host": "YAHOO.util.AttributeProvider", "name": "configureAttribute"}, {"url": "YAHOO.widget.Menu.html#_configureSubmenu", "host": "YAHOO.widget.Menu", "name": "_configureSubmenu"}, {"url": "YAHOO.widget.MenuItem.html#configURL", "host": "YAHOO.widget.MenuItem", "name": "configURL"}, {"url": "YAHOO.widget.Module.html#configVisible", "host": "YAHOO.widget.Module", "name": "configVisible"}, {"url": "YAHOO.widget.Overlay.html#configVisible", "host": "YAHOO.widget.Overlay", "name": "configVisible"}, {"url": "YAHOO.widget.Menu.html#configVisible", "host": "YAHOO.widget.Menu", "name": "configVisible"}, {"url": "YAHOO.widget.Overlay.html#configWidth", "host": "YAHOO.widget.Overlay", "name": "configWidth"}, {"url": "YAHOO.widget.Panel.html#configWidth", "host": "YAHOO.widget.Panel", "name": "configWidth"}, {"url": "YAHOO.widget.Overlay.html#configX", "host": "YAHOO.widget.Overlay", "name": "configX"}, {"url": "YAHOO.widget.Overlay.html#configXY", "host": "YAHOO.widget.Overlay", "name": "configXY"}, {"url": "YAHOO.widget.Overlay.html#configY", "host": "YAHOO.widget.Overlay", "name": "configY"}, {"url": "YAHOO.widget.Overlay.html#configzIndex", "host": "YAHOO.widget.Overlay", "name": "configzIndex"}, {"url": "YAHOO.widget.Panel.html#configzIndex", "host": "YAHOO.widget.Panel", "name": "configzIndex"}, {"url": "YAHOO.widget.DS_XHR.html#connMgr", "host": "YAHOO.widget.DS_XHR", "name": "connMgr"}, {"url": "DataSource.html#connMgr", "host": "DataSource", "name": "connMgr"}, {"url": "YAHOO.widget.DS_XHR.html#connTimeout", "host": "YAHOO.widget.DS_XHR", "name": "connTimeout"}, {"url": "DataSource.html#connTimeout", "host": "DataSource", "name": "connTimeout"}, {"url": "YAHOO.widget.LogReader.html#_consoleMsgCount", "host": "YAHOO.widget.LogReader", "name": "_consoleMsgCount"}, {"url": "YAHOO.widget.Overlay.html#constraintoviewport", "host": "YAHOO.widget.Overlay", "name": "constraintoviewport"}, {"url": "YAHOO.widget.Menu.html#constraintoviewport", "host": "YAHOO.widget.Menu", "name": "constraintoviewport"}, {"url": "YAHOO.util.DragDrop.html#constrainX", "host": "YAHOO.util.DragDrop", "name": "constrainX"}, {"url": "YAHOO.util.DragDrop.html#constrainY", "host": "YAHOO.util.DragDrop", "name": "constrainY"}, {"url": "YAHOO.widget.CalendarGroup.html#constructChild", "host": "YAHOO.widget.CalendarGroup", "name": "constructChild"}, {"url": "YAHOO.widget.MenuItem.html#constructor", "host": "YAHOO.widget.MenuItem", "name": "constructor"}, {"url": "ColumnEditor.html#container", "host": "ColumnEditor", "name": "container"}, {"url": "YAHOO.widget.Tooltip.html#container", "host": "YAHOO.widget.Tooltip", "name": "container"}, {"url": "YAHOO.widget.Menu.html#container", "host": "YAHOO.widget.Menu", "name": "container"}, {"url": "YAHOO.widget.Button.html#container", "host": "YAHOO.widget.Button", "name": "container"}, {"url": "YAHOO.widget.ButtonGroup.html#container", "host": "YAHOO.widget.ButtonGroup", "name": "container"}, {"url": "YAHOO.widget.AutoComplete.html#containerCollapseEvent", "host": "YAHOO.widget.AutoComplete", "name": "containerCollapseEvent"}, {"url": "YAHOO.widget.AutoComplete.html#containerExpandEvent", "host": "YAHOO.widget.AutoComplete", "name": "containerExpandEvent"}, {"url": "YAHOO.widget.CalendarGroup.html#containerId", "host": "YAHOO.widget.CalendarGroup", "name": "containerId"}, {"url": "YAHOO.util.Region.html#contains", "host": "YAHOO.util.Region", "name": "contains"}, {"url": "YAHOO.util.Subscriber.html#contains", "host": "YAHOO.util.Subscriber", "name": "contains"}, {"url": "YAHOO.widget.Tab.html#content", "host": "YAHOO.widget.Tab", "name": "content"}, {"url": "YAHOO.widget.HTMLNode.html#content", "host": "YAHOO.widget.HTMLNode", "name": "content"}, {"url": "YAHOO.widget.Tab.html#contentChange", "host": "YAHOO.widget.Tab", "name": "contentChange"}, {"url": "YAHOO.widget.Tab.html#contentEl", "host": "YAHOO.widget.Tab", "name": "contentEl"}, {"url": "YAHOO.widget.HTMLNode.html#contentElId", "host": "YAHOO.widget.HTMLNode", "name": "contentElId"}, {"url": "YAHOO.widget.TabView.html#_contentParent", "host": "YAHOO.widget.TabView", "name": "_contentParent"}, {"url": "YAHOO.widget.TabView.html#CONTENT_PARENT_CLASSNAME", "host": "YAHOO.widget.TabView", "name": "CONTENT_PARENT_CLASSNAME"}, {"url": "YAHOO.util.Element.html#contentReady", "host": "YAHOO.util.Element", "name": "contentReady"}, {"url": "YAHOO.widget.HTMLNode.html#contentStyle", "host": "YAHOO.widget.HTMLNode", "name": "contentStyle"}, {"url": "YAHOO.widget.TabView.html#contentTransition", "host": "YAHOO.widget.TabView", "name": "contentTransition"}, {"url": "YAHOO.widget.Tab.html#contentVisible", "host": "YAHOO.widget.Tab", "name": "contentVisible"}, {"url": "YAHOO.widget.Overlay.html#context", "host": "YAHOO.widget.Overlay", "name": "context"}, {"url": "YAHOO.widget.Tooltip.html#context", "host": "YAHOO.widget.Tooltip", "name": "context"}, {"url": "YAHOO.widget.ContextMenu.html#contextEventTarget", "host": "YAHOO.widget.ContextMenu", "name": "contextEventTarget"}, {"url": "DataTable.html#contextMenu", "host": "DataTable", "name": "contextMenu"}, {"url": "YAHOO.widget.Module.html#contructor", "host": "YAHOO.widget.Module", "name": "contructor"}, {"url": "YAHOO.widget.OverlayManager.html#contructor", "host": "YAHOO.widget.OverlayManager", "name": "contructor"}, {"url": "DataSource.html#convertDate", "host": "DataSource", "name": "convertDate"}, {"url": "DataSource.html#convertNumber", "host": "DataSource", "name": "convertNumber"}, {"url": "YAHOO.util.AnimMgr.html#correctFrame", "host": "YAHOO.util.AnimMgr", "name": "correctFrame"}, {"url": "YAHOO.util.Event.html#counter", "host": "YAHOO.util.Event", "name": "counter"}, {"url": "YAHOO.widget.Button.html#_createButtonElement", "host": "YAHOO.widget.Button", "name": "_createButtonElement"}, {"url": "YAHOO.widget.LogReader.html#_createCategoryCheckbox", "host": "YAHOO.widget.LogReader", "name": "_createCategoryCheckbox"}, {"url": "YAHOO.util.EventProvider.html#createEvent", "host": "YAHOO.util.EventProvider", "name": "createEvent"}, {"url": "YAHOO.util.Connect.html#createExceptionObject", "host": "YAHOO.util.Connect", "name": "createExceptionObject"}, {"url": "YAHOO.util.DDProxy.html#createFrame", "host": "YAHOO.util.DDProxy", "name": "createFrame"}, {"url": "YAHOO.util.Connect.html#createFrame", "host": "YAHOO.util.Connect", "name": "createFrame"}, {"url": "YAHOO.widget.ButtonGroup.html#_createGroupElement", "host": "YAHOO.widget.ButtonGroup", "name": "_createGroupElement"}, {"url": "YAHOO.widget.Button.html#createHiddenField", "host": "YAHOO.widget.Button", "name": "createHiddenField"}, {"url": "YAHOO.widget.Button.html#createInputElement", "host": "YAHOO.widget.Button", "name": "createInputElement"}, {"url": "YAHOO.widget.Menu.html#_createItemGroup", "host": "YAHOO.widget.Menu", "name": "_createItemGroup"}, {"url": "YAHOO.widget.Logger.html#_createNewCategory", "host": "YAHOO.widget.Logger", "name": "_createNewCategory"}, {"url": "YAHOO.widget.Logger.html#_createNewSource", "host": "YAHOO.widget.Logger", "name": "_createNewSource"}, {"url": "YAHOO.util.Connect.html#createResponseObject", "host": "YAHOO.util.Connect", "name": "createResponseObject"}, {"url": "YAHOO.widget.MenuItem.html#_createRootNodeStructure", "host": "YAHOO.widget.MenuItem", "name": "_createRootNodeStructure"}, {"url": "YAHOO.widget.LogReader.html#_createSourceCheckbox", "host": "YAHOO.widget.LogReader", "name": "_createSourceCheckbox"}, {"url": "YAHOO.widget.TabView.html#createTabs", "host": "YAHOO.widget.TabView", "name": "createTabs"}, {"url": "ColumnEditor.html#createTextareaEditor", "host": "ColumnEditor", "name": "createTextareaEditor"}, {"url": "ColumnEditor.html#createTextboxEditor", "host": "ColumnEditor", "name": "createTextboxEditor"}, {"url": "YAHOO.util.Connect.html#createXhrObject", "host": "YAHOO.util.Connect", "name": "createXhrObject"}, {"url": "YAHOO.util.DragDropMgr.ElementWrapper.html#css", "host": "YAHOO.util.DragDropMgr.ElementWrapper", "name": "css"}, {"url": "YAHOO.widget.Menu.html#CSS_CLASS_NAME", "host": "YAHOO.widget.Menu", "name": "CSS_CLASS_NAME"}, {"url": "YAHOO.widget.Menubar.html#CSS_CLASS_NAME", "host": "YAHOO.widget.Menubar", "name": "CSS_CLASS_NAME"}, {"url": "YAHOO.widget.MenuBarItem.html#CSS_CLASS_NAME", "host": "YAHOO.widget.MenuBarItem", "name": "CSS_CLASS_NAME"}, {"url": "YAHOO.widget.MenuItem.html#CSS_CLASS_NAME", "host": "YAHOO.widget.MenuItem", "name": "CSS_CLASS_NAME"}, {"url": "YAHOO.widget.Button.html#CSS_CLASS_NAME", "host": "YAHOO.widget.Button", "name": "CSS_CLASS_NAME"}, {"url": "YAHOO.widget.ButtonGroup.html#CSS_CLASS_NAME", "host": "YAHOO.widget.ButtonGroup", "name": "CSS_CLASS_NAME"}, {"url": "YAHOO.util.Anim.html#currentFrame", "host": "YAHOO.util.Anim", "name": "currentFrame"}, {"url": "YAHOO.widget.DS_JSArray.html#data", "host": "YAHOO.widget.DS_JSArray", "name": "data"}, {"url": "YAHOO.widget.Node.html#data", "host": "YAHOO.widget.Node", "name": "data"}, {"url": "YAHOO.widget.Tab.html#dataConnection", "host": "YAHOO.widget.Tab", "name": "dataConnection"}, {"url": "YAHOO.widget.AutoComplete.html#dataErrorEvent", "host": "YAHOO.widget.AutoComplete", "name": "dataErrorEvent"}, {"url": "YAHOO.widget.DataSource.html#dataErrorEvent", "host": "YAHOO.widget.DataSource", "name": "dataErrorEvent"}, {"url": "DataSource.html#dataErrorEvent", "host": "DataSource", "name": "dataErrorEvent"}, {"url": "YAHOO.widget.DS_JSFunction.html#dataFunction", "host": "YAHOO.widget.DS_JSFunction", "name": "dataFunction"}, {"url": "YAHOO.widget.Tab.html#dataLoaded", "host": "YAHOO.widget.Tab", "name": "dataLoaded"}, {"url": "YAHOO.widget.Node.html#dataLoader", "host": "YAHOO.widget.Node", "name": "dataLoader"}, {"url": "YAHOO.widget.AutoComplete.html#dataRequestEvent", "host": "YAHOO.widget.AutoComplete", "name": "dataRequestEvent"}, {"url": "DataTable.html#dataReturnEvent", "host": "DataTable", "name": "dataReturnEvent"}, {"url": "YAHOO.widget.AutoComplete.html#dataReturnEvent", "host": "YAHOO.widget.AutoComplete", "name": "dataReturnEvent"}, {"url": "DataTable.html#dataSource", "host": "DataTable", "name": "dataSource"}, {"url": "YAHOO.widget.AutoComplete.html#dataSource", "host": "YAHOO.widget.AutoComplete", "name": "dataSource"}, {"url": "YAHOO.widget.Tab.html#dataSrc", "host": "YAHOO.widget.Tab", "name": "dataSrc"}, {"url": "YAHOO.widget.Tab.html#dataTimeout", "host": "YAHOO.widget.Tab", "name": "dataTimeout"}, {"url": "DataSource.html#dataType", "host": "DataSource", "name": "dataType"}, {"url": "YAHOO.widget.Calendar.html#DATE_DELIMITER", "host": "YAHOO.widget.Calendar", "name": "DATE_DELIMITER"}, {"url": "YAHOO.widget.CalendarGroup.html#DATE_DELIMITER", "host": "YAHOO.widget.CalendarGroup", "name": "DATE_DELIMITER"}, {"url": "YAHOO.widget.Calendar.html#DATE_FIELD_DELIMITER", "host": "YAHOO.widget.Calendar", "name": "DATE_FIELD_DELIMITER"}, {"url": "YAHOO.widget.CalendarGroup.html#DATE_FIELD_DELIMITER", "host": "YAHOO.widget.CalendarGroup", "name": "DATE_FIELD_DELIMITER"}, {"url": "YAHOO.widget.Calendar.html#DATE_RANGE_DELIMITER", "host": "YAHOO.widget.Calendar", "name": "DATE_RANGE_DELIMITER"}, {"url": "YAHOO.widget.CalendarGroup.html#DATE_RANGE_DELIMITER", "host": "YAHOO.widget.CalendarGroup", "name": "DATE_RANGE_DELIMITER"}, {"url": "YAHOO.widget.DateMath.html#DAY", "host": "YAHOO.widget.DateMath", "name": "DAY"}, {"url": "YAHOO.util.Connect.html#_default_post_header", "host": "YAHOO.util.Connect", "name": "_default_post_header"}, {"url": "YAHOO.util.Connect.html#_default_xhr_header", "host": "YAHOO.util.Connect", "name": "_default_xhr_header"}, {"url": "YAHOO.util.AnimMgr.html#delay", "host": "YAHOO.util.AnimMgr", "name": "delay"}, {"url": "YAHOO.widget.CalendarGroup.html#delegateConfig", "host": "YAHOO.widget.CalendarGroup", "name": "delegateConfig"}, {"url": "YAHOO.util.CustomEvent.html#_delete", "host": "YAHOO.util.CustomEvent", "name": "_delete"}, {"url": "YAHOO.widget.TreeView.html#_deleteNode", "host": "YAHOO.widget.TreeView", "name": "_deleteNode"}, {"url": "DataTable.html#_deleteRecord", "host": "DataTable", "name": "_deleteRecord"}, {"url": "RecordSet.html#deleteRecord", "host": "RecordSet", "name": "deleteRecord"}, {"url": "DataTable.html#deleteRow", "host": "DataTable", "name": "deleteRow"}, {"url": "DataTable.html#_deleteRowEl", "host": "DataTable", "name": "_deleteRowEl"}, {"url": "DataTable.html#deleteRows", "host": "DataTable", "name": "deleteRows"}, {"url": "YAHOO.widget.AutoComplete.html#delimChar", "host": "YAHOO.widget.AutoComplete", "name": "delimChar"}, {"url": "YAHOO.util.DragDrop.html#deltaX", "host": "YAHOO.util.DragDrop", "name": "deltaX"}, {"url": "YAHOO.util.DragDropMgr.html#deltaX", "host": "YAHOO.util.DragDropMgr", "name": "deltaX"}, {"url": "YAHOO.util.DragDrop.html#deltaY", "host": "YAHOO.util.DragDrop", "name": "deltaY"}, {"url": "YAHOO.util.DragDropMgr.html#deltaY", "host": "YAHOO.util.DragDropMgr", "name": "deltaY"}, {"url": "YAHOO.widget.Node.html#depth", "host": "YAHOO.widget.Node", "name": "depth"}, {"url": "YAHOO.widget.Calendar.html#deselect", "host": "YAHOO.widget.Calendar", "name": "deselect"}, {"url": "YAHOO.widget.CalendarGroup.html#deselect", "host": "YAHOO.widget.CalendarGroup", "name": "deselect"}, {"url": "YAHOO.widget.Calendar.html#deselectAll", "host": "YAHOO.widget.Calendar", "name": "deselectAll"}, {"url": "YAHOO.widget.CalendarGroup.html#deselectAll", "host": "YAHOO.widget.CalendarGroup", "name": "deselectAll"}, {"url": "YAHOO.widget.Calendar.html#deselectCell", "host": "YAHOO.widget.Calendar", "name": "deselectCell"}, {"url": "YAHOO.widget.CalendarGroup.html#deselectCell", "host": "YAHOO.widget.CalendarGroup", "name": "deselectCell"}, {"url": "YAHOO.widget.Calendar.html#deselectEvent", "host": "YAHOO.widget.Calendar", "name": "deselectEvent"}, {"url": "YAHOO.widget.CalendarGroup.html#deselectEvent", "host": "YAHOO.widget.CalendarGroup", "name": "deselectEvent"}, {"url": "YAHOO.widget.Dialog.html#destroy", "host": "YAHOO.widget.Dialog", "name": "destroy"}, {"url": "YAHOO.widget.Module.html#destroy", "host": "YAHOO.widget.Module", "name": "destroy"}, {"url": "YAHOO.widget.Overlay.html#destroy", "host": "YAHOO.widget.Overlay", "name": "destroy"}, {"url": "YAHOO.widget.Panel.html#destroy", "host": "YAHOO.widget.Panel", "name": "destroy"}, {"url": "YAHOO.widget.Tooltip.html#destroy", "host": "YAHOO.widget.Tooltip", "name": "destroy"}, {"url": "YAHOO.widget.ContextMenu.html#destroy", "host": "YAHOO.widget.ContextMenu", "name": "destroy"}, {"url": "YAHOO.widget.Menu.html#destroy", "host": "YAHOO.widget.Menu", "name": "destroy"}, {"url": "YAHOO.widget.MenuItem.html#destroy", "host": "YAHOO.widget.MenuItem", "name": "destroy"}, {"url": "YAHOO.widget.Button.html#destroy", "host": "YAHOO.widget.Button", "name": "destroy"}, {"url": "YAHOO.widget.ButtonGroup.html#destroy", "host": "YAHOO.widget.ButtonGroup", "name": "destroy"}, {"url": "YAHOO.widget.Module.html#destroyEvent", "host": "YAHOO.widget.Module", "name": "destroyEvent"}, {"url": "YAHOO.widget.MenuItem.html#destroyEvent", "host": "YAHOO.widget.MenuItem", "name": "destroyEvent"}, {"url": "YAHOO.widget.Logger.html#disableBrowserConsole", "host": "YAHOO.widget.Logger", "name": "disableBrowserConsole"}, {"url": "YAHOO.widget.MenuItem.html#disabled", "host": "YAHOO.widget.MenuItem", "name": "disabled"}, {"url": "YAHOO.widget.Button.html#disabled", "host": "YAHOO.widget.Button", "name": "disabled"}, {"url": "YAHOO.widget.ButtonGroup.html#disabled", "host": "YAHOO.widget.ButtonGroup", "name": "disabled"}, {"url": "YAHOO.widget.Tab.html#disabled", "host": "YAHOO.widget.Tab", "name": "disabled"}, {"url": "YAHOO.widget.MenuItem.html#DISABLED_CHECKED_TEXT", "host": "YAHOO.widget.MenuItem", "name": "DISABLED_CHECKED_TEXT"}, {"url": "YAHOO.widget.Tab.html#DISABLED_CLASSNAME", "host": "YAHOO.widget.Tab", "name": "DISABLED_CLASSNAME"}, {"url": "YAHOO.widget.MenuItem.html#DISABLED_SUBMENU_INDICATOR_TEXT", "host": "YAHOO.widget.MenuItem", "name": "DISABLED_SUBMENU_INDICATOR_TEXT"}, {"url": "YAHOO.widget.Menu.html#_disableScrollFooter", "host": "YAHOO.widget.Menu", "name": "_disableScrollFooter"}, {"url": "YAHOO.widget.Menu.html#_disableScrollHeader", "host": "YAHOO.widget.Menu", "name": "_disableScrollHeader"}, {"url": "DataSource.html#doBeforeCallback", "host": "DataSource", "name": "doBeforeCallback"}, {"url": "YAHOO.widget.AutoComplete.html#doBeforeExpandContainer", "host": "YAHOO.widget.AutoComplete", "name": "doBeforeExpandContainer"}, {"url": "DataTable.html#doBeforeLoadData", "host": "DataTable", "name": "doBeforeLoadData"}, {"url": "YAHOO.widget.Calendar.html#doCellMouseOut", "host": "YAHOO.widget.Calendar", "name": "doCellMouseOut"}, {"url": "YAHOO.widget.Calendar.html#doCellMouseOver", "host": "YAHOO.widget.Calendar", "name": "doCellMouseOver"}, {"url": "YAHOO.widget.Overlay.html#doCenterOnDOMEvent", "host": "YAHOO.widget.Overlay", "name": "doCenterOnDOMEvent"}, {"url": "YAHOO.widget.Tooltip.html#doHide", "host": "YAHOO.widget.Tooltip", "name": "doHide"}, {"url": "YAHOO.util.Anim.html#doMethod", "host": "YAHOO.util.Anim", "name": "doMethod"}, {"url": "YAHOO.widget.TabView.html#DOMEventHandler", "host": "YAHOO.widget.TabView", "name": "DOMEventHandler"}, {"url": "YAHOO.widget.Calendar.html#domEventMap", "host": "YAHOO.widget.Calendar", "name": "domEventMap"}, {"url": "YAHOO.util.Element.html#DOM_EVENTS", "host": "YAHOO.util.Element", "name": "DOM_EVENTS"}, {"url": "YAHOO.util.Event.html#DOMReady", "host": "YAHOO.util.Event", "name": "DOMReady"}, {"url": "YAHOO.util.Event.html#DOMReadyEvent", "host": "YAHOO.util.Event", "name": "DOMReadyEvent"}, {"url": "YAHOO.util.DragDrop.html#_domRef", "host": "YAHOO.util.DragDrop", "name": "_domRef"}, {"url": "YAHOO.widget.DataSource.html#doQuery", "host": "YAHOO.widget.DataSource", "name": "doQuery"}, {"url": "YAHOO.widget.DS_XHR.html#doQuery", "host": "YAHOO.widget.DS_XHR", "name": "doQuery"}, {"url": "YAHOO.widget.DS_JSFunction.html#doQuery", "host": "YAHOO.widget.DS_JSFunction", "name": "doQuery"}, {"url": "YAHOO.widget.DS_JSArray.html#doQuery", "host": "YAHOO.widget.DS_JSArray", "name": "doQuery"}, {"url": "YAHOO.widget.DataSource.html#_doQueryCache", "host": "YAHOO.widget.DataSource", "name": "_doQueryCache"}, {"url": "YAHOO.widget.Calendar.html#doSelectCell", "host": "YAHOO.widget.Calendar", "name": "doSelectCell"}, {"url": "YAHOO.widget.Tooltip.html#doShow", "host": "YAHOO.widget.Tooltip", "name": "doShow"}, {"url": "YAHOO.widget.Dialog.html#doSubmit", "host": "YAHOO.widget.Dialog", "name": "doSubmit"}, {"url": "YAHOO.util.DragDropMgr.html#dragCurrent", "host": "YAHOO.util.DragDropMgr", "name": "dragCurrent"}, {"url": "YAHOO.util.DragDrop.html#dragElId", "host": "YAHOO.util.DragDrop", "name": "dragElId"}, {"url": "YAHOO.widget.Panel.html#dragEvent", "host": "YAHOO.widget.Panel", "name": "dragEvent"}, {"url": "YAHOO.widget.Panel.html#draggable", "host": "YAHOO.widget.Panel", "name": "draggable"}, {"url": "YAHOO.widget.LogReader.html#draggable", "host": "YAHOO.widget.LogReader", "name": "draggable"}, {"url": "YAHOO.util.DragDropMgr.html#dragOvers", "host": "YAHOO.util.DragDropMgr", "name": "dragOvers"}, {"url": "YAHOO.util.DragDropMgr.html#dragThreshMet", "host": "YAHOO.util.DragDropMgr", "name": "dragThreshMet"}, {"url": "YAHOO.widget.TreeView.html#draw", "host": "YAHOO.widget.TreeView", "name": "draw"}, {"url": "YAHOO.util.Anim.html#duration", "host": "YAHOO.util.Anim", "name": "duration"}, {"url": "YAHOO.widget.Node.html#dynamicLoadComplete", "host": "YAHOO.widget.Node", "name": "dynamicLoadComplete"}, {"url": "YAHOO.widget.Node.html#_dynLoad", "host": "YAHOO.widget.Node", "name": "_dynLoad"}, {"url": "YAHOO.util.Easing.html#easeBoth", "host": "YAHOO.util.Easing", "name": "easeBoth"}, {"url": "YAHOO.util.Easing.html#easeBothStrong", "host": "YAHOO.util.Easing", "name": "easeBothStrong"}, {"url": "YAHOO.util.Easing.html#easeIn", "host": "YAHOO.util.Easing", "name": "easeIn"}, {"url": "YAHOO.util.Easing.html#easeInStrong", "host": "YAHOO.util.Easing", "name": "easeInStrong"}, {"url": "YAHOO.util.Easing.html#easeNone", "host": "YAHOO.util.Easing", "name": "easeNone"}, {"url": "YAHOO.util.Easing.html#easeOut", "host": "YAHOO.util.Easing", "name": "easeOut"}, {"url": "YAHOO.util.Easing.html#easeOutStrong", "host": "YAHOO.util.Easing", "name": "easeOutStrong"}, {"url": "DataTable.html#editCell", "host": "DataTable", "name": "editCell"}, {"url": "Column.html#editor", "host": "Column", "name": "editor"}, {"url": "DataTable.html#editorShowEvent", "host": "DataTable", "name": "editorShowEvent"}, {"url": "YAHOO.widget.Module.html#effect", "host": "YAHOO.widget.Module", "name": "effect"}, {"url": "YAHOO.util.DragDropMgr.ElementWrapper.html#el", "host": "YAHOO.util.DragDropMgr.ElementWrapper", "name": "el"}, {"url": "YAHOO.util.Anim.html#el", "host": "YAHOO.util.Anim", "name": "el"}, {"url": "YAHOO.widget.TreeView.html#_el", "host": "YAHOO.widget.TreeView", "name": "_el"}, {"url": "YAHOO.widget.TVFadeIn.html#el", "host": "YAHOO.widget.TVFadeIn", "name": "el"}, {"url": "YAHOO.widget.TVFadeOut.html#el", "host": "YAHOO.widget.TVFadeOut", "name": "el"}, {"url": "YAHOO.util.Event.html#EL", "host": "YAHOO.util.Event", "name": "EL"}, {"url": "YAHOO.util.Easing.html#elasticBoth", "host": "YAHOO.util.Easing", "name": "elasticBoth"}, {"url": "YAHOO.util.Easing.html#elasticIn", "host": "YAHOO.util.Easing", "name": "elasticIn"}, {"url": "YAHOO.util.Easing.html#elasticOut", "host": "YAHOO.util.Easing", "name": "elasticOut"}, {"url": "DataTable.html#_elBody", "host": "DataTable", "name": "_elBody"}, {"url": "YAHOO.widget.LogReader.html#_elBtns", "host": "YAHOO.widget.LogReader", "name": "_elBtns"}, {"url": "YAHOO.util.Event.html#elCache\nDOM element cache", "host": "YAHOO.util.Event", "name": "elCache\nDOM element cache"}, {"url": "YAHOO.widget.LogReader.html#_elCategoryFilters", "host": "YAHOO.widget.LogReader", "name": "_elCategoryFilters"}, {"url": "YAHOO.widget.LogReader.html#_elCollapse", "host": "YAHOO.widget.LogReader", "name": "_elCollapse"}, {"url": "YAHOO.widget.LogReader.html#_elConsole", "host": "YAHOO.widget.LogReader", "name": "_elConsole"}, {"url": "DataTable.html#_elContainer", "host": "DataTable", "name": "_elContainer"}, {"url": "YAHOO.widget.LogReader.html#_elContainer", "host": "YAHOO.widget.LogReader", "name": "_elContainer"}, {"url": "YAHOO.widget.LogReader.html#_elDefaultContainer", "host": "YAHOO.widget.LogReader", "name": "_elDefaultContainer"}, {"url": "YAHOO.widget.Module.html#element", "host": "YAHOO.widget.Module", "name": "element"}, {"url": "YAHOO.widget.MenuItem.html#element", "host": "YAHOO.widget.MenuItem", "name": "element"}, {"url": "YAHOO.util.Element.html#element", "host": "YAHOO.util.Element", "name": "element"}, {"url": "YAHOO.util.DragDropMgr.html#elementCache", "host": "YAHOO.util.DragDropMgr", "name": "elementCache"}, {"url": "DataTable.html#_elFirstRow", "host": "DataTable", "name": "_elFirstRow"}, {"url": "YAHOO.widget.LogReader.html#_elFt", "host": "YAHOO.widget.LogReader", "name": "_elFt"}, {"url": "YAHOO.widget.LogReader.html#_elHd", "host": "YAHOO.widget.LogReader", "name": "_elHd"}, {"url": "DataTable.html#_elLastRow", "host": "DataTable", "name": "_elLastRow"}, {"url": "YAHOO.widget.LogReader.html#_elSourceFilters", "host": "YAHOO.widget.LogReader", "name": "_elSourceFilters"}, {"url": "DataTable.html#_elTable", "host": "DataTable", "name": "_elTable"}, {"url": "YAHOO.widget.MenuItem.html#emphasis", "host": "YAHOO.widget.MenuItem", "name": "emphasis"}, {"url": "YAHOO.widget.Logger.html#enableBrowserConsole", "host": "YAHOO.widget.Logger", "name": "enableBrowserConsole"}, {"url": "YAHOO.widget.AutoComplete.html#_enableIntervalDetection", "host": "YAHOO.widget.AutoComplete", "name": "_enableIntervalDetection"}, {"url": "YAHOO.widget.Slider.html#enableKeys", "host": "YAHOO.widget.Slider", "name": "enableKeys"}, {"url": "YAHOO.widget.Menu.html#_enableScrollFooter", "host": "YAHOO.widget.Menu", "name": "_enableScrollFooter"}, {"url": "YAHOO.widget.Menu.html#_enableScrollHeader", "host": "YAHOO.widget.Menu", "name": "_enableScrollHeader"}, {"url": "YAHOO.util.DragDrop.html#endDrag", "host": "YAHOO.util.DragDrop", "name": "endDrag"}, {"url": "YAHOO.widget.Slider.html#endMove", "host": "YAHOO.widget.Slider", "name": "endMove"}, {"url": "YAHOO.widget.Overlay.html#enforceConstraints", "host": "YAHOO.widget.Overlay", "name": "enforceConstraints"}, {"url": "YAHOO.widget.Menu.html#enforceConstraints", "host": "YAHOO.widget.Menu", "name": "enforceConstraints"}, {"url": "DataSource.html#ERROR_DATAINVALID", "host": "DataSource", "name": "ERROR_DATAINVALID"}, {"url": "YAHOO.widget.DataSource.html#ERROR_DATANULL", "host": "YAHOO.widget.DataSource", "name": "ERROR_DATANULL"}, {"url": "DataSource.html#ERROR_DATANULL", "host": "DataSource", "name": "ERROR_DATANULL"}, {"url": "YAHOO.widget.DataSource.html#ERROR_DATAPARSE", "host": "YAHOO.widget.DataSource", "name": "ERROR_DATAPARSE"}, {"url": "YAHOO.widget.DS_XHR.html#ERROR_DATAXHR", "host": "YAHOO.widget.DS_XHR", "name": "ERROR_DATAXHR"}, {"url": "YAHOO.util.Config.html#eventQueue", "host": "YAHOO.util.Config", "name": "eventQueue"}, {"url": "YAHOO.widget.Menu.html#_execHideDelay", "host": "YAHOO.widget.Menu", "name": "_execHideDelay"}, {"url": "YAHOO.util.DragDropMgr.html#_execOnAll", "host": "YAHOO.util.DragDropMgr", "name": "_execOnAll"}, {"url": "YAHOO.widget.Menu.html#_execShowDelay", "host": "YAHOO.widget.Menu", "name": "_execShowDelay"}, {"url": "YAHOO.widget.Menu.html#_execSubmenuHideDelay", "host": "YAHOO.widget.Menu", "name": "_execSubmenuHideDelay"}, {"url": "YAHOO.widget.LogReader.html#expand", "host": "YAHOO.widget.LogReader", "name": "expand"}, {"url": "YAHOO.widget.Node.html#expand", "host": "YAHOO.widget.Node", "name": "expand"}, {"url": "YAHOO.widget.TreeView.html#expand", "host": "YAHOO.widget.TreeView", "name": "expand"}, {"url": "YAHOO.widget.Node.html#expandAll", "host": "YAHOO.widget.Node", "name": "expandAll"}, {"url": "YAHOO.widget.TreeView.html#expandAll", "host": "YAHOO.widget.TreeView", "name": "expandAll"}, {"url": "YAHOO.widget.TreeView.html#_expandAnim", "host": "YAHOO.widget.TreeView", "name": "_expandAnim"}, {"url": "YAHOO.widget.TreeView.html#expandComplete", "host": "YAHOO.widget.TreeView", "name": "expandComplete"}, {"url": "YAHOO.widget.Node.html#expanded", "host": "YAHOO.widget.Node", "name": "expanded"}, {"url": "YAHOO.widget.MenuItem.html#EXPANDED_SUBMENU_INDICATOR_TEXT", "host": "YAHOO.widget.MenuItem", "name": "EXPANDED_SUBMENU_INDICATOR_TEXT"}, {"url": "YAHOO.html#extend", "host": "YAHOO", "name": "extend"}, {"url": "YAHOO.lang.html#extend", "host": "YAHOO.lang", "name": "extend"}, {"url": "YAHOO.widget.ContainerEffect.html#FADE", "host": "YAHOO.widget.ContainerEffect", "name": "FADE"}, {"url": "YAHOO.widget.TVAnim.html#FADE_IN", "host": "YAHOO.widget.TVAnim", "name": "FADE_IN"}, {"url": "YAHOO.widget.TVAnim.html#FADE_OUT", "host": "YAHOO.widget.TVAnim", "name": "FADE_OUT"}, {"url": "YAHOO.widget.Calendar.html#_fieldArraysAreEqual", "host": "YAHOO.widget.Calendar", "name": "_fieldArraysAreEqual"}, {"url": "YAHOO.widget.LogReader.html#_filterCheckboxes", "host": "YAHOO.widget.LogReader", "name": "_filterCheckboxes"}, {"url": "YAHOO.widget.LogReader.html#_filterLogs", "host": "YAHOO.widget.LogReader", "name": "_filterLogs"}, {"url": "YAHOO.widget.OverlayManager.html#find", "host": "YAHOO.widget.OverlayManager", "name": "find"}, {"url": "YAHOO.widget.DateMath.html#findMonthEnd", "host": "YAHOO.widget.DateMath", "name": "findMonthEnd"}, {"url": "YAHOO.widget.DateMath.html#findMonthStart", "host": "YAHOO.widget.DateMath", "name": "findMonthStart"}, {"url": "YAHOO.util.CustomEvent.html#fire", "host": "YAHOO.util.CustomEvent", "name": "fire"}, {"url": "YAHOO.util.AttributeProvider.html#fireBeforeChangeEvent", "host": "YAHOO.util.AttributeProvider", "name": "fireBeforeChangeEvent"}, {"url": "YAHOO.util.AttributeProvider.html#fireChangeEvent", "host": "YAHOO.util.AttributeProvider", "name": "fireChangeEvent"}, {"url": "YAHOO.util.Config.html#fireEvent", "host": "YAHOO.util.Config", "name": "fireEvent"}, {"url": "YAHOO.util.EventProvider.html#fireEvent", "host": "YAHOO.util.EventProvider", "name": "fireEvent"}, {"url": "YAHOO.util.DragDropMgr.html#fireEvents", "host": "YAHOO.util.DragDropMgr", "name": "fireEvents"}, {"url": "YAHOO.widget.Slider.html#fireEvents", "host": "YAHOO.widget.Slider", "name": "fireEvents"}, {"url": "YAHOO.util.Event.html#fireLegacyEvent", "host": "YAHOO.util.Event", "name": "fireLegacyEvent"}, {"url": "YAHOO.util.Config.html#fireQueue", "host": "YAHOO.util.Config", "name": "fireQueue"}, {"url": "YAHOO.util.Element.html#fireQueue", "host": "YAHOO.util.Element", "name": "fireQueue"}, {"url": "YAHOO.widget.Overlay.html#fixedcenter", "host": "YAHOO.widget.Overlay", "name": "fixedcenter"}, {"url": "DataTable.html#fixedWidth", "host": "DataTable", "name": "fixedWidth"}, {"url": "ColumnSet.html#flat", "host": "ColumnSet", "name": "flat"}, {"url": "YAHOO.widget.DataSource.html#flushCache", "host": "YAHOO.widget.DataSource", "name": "flushCache"}, {"url": "DataSource.html#flushCache", "host": "DataSource", "name": "flushCache"}, {"url": "YAHOO.util.Subscriber.html#fn", "host": "YAHOO.util.Subscriber", "name": "fn"}, {"url": "YAHOO.util.Event.html#FN", "host": "YAHOO.util.Event", "name": "FN"}, {"url": "YAHOO.widget.OverlayManager.html#focus", "host": "YAHOO.widget.OverlayManager", "name": "focus"}, {"url": "YAHOO.widget.Menu.html#focus", "host": "YAHOO.widget.Menu", "name": "focus"}, {"url": "YAHOO.widget.MenuItem.html#focus", "host": "YAHOO.widget.MenuItem", "name": "focus"}, {"url": "YAHOO.widget.Button.html#focus", "host": "YAHOO.widget.Button", "name": "focus"}, {"url": "YAHOO.widget.ButtonGroup.html#focus", "host": "YAHOO.widget.ButtonGroup", "name": "focus"}, {"url": "YAHOO.widget.Slider.html#focus", "host": "YAHOO.widget.Slider", "name": "focus"}, {"url": "YAHOO.widget.Dialog.html#focusDefaultButton", "host": "YAHOO.widget.Dialog", "name": "focusDefaultButton"}, {"url": "YAHOO.widget.OverlayManager.html#focusevent", "host": "YAHOO.widget.OverlayManager", "name": "focusevent"}, {"url": "YAHOO.widget.MenuItem.html#focusEvent", "host": "YAHOO.widget.MenuItem", "name": "focusEvent"}, {"url": "YAHOO.widget.Dialog.html#focusFirst", "host": "YAHOO.widget.Dialog", "name": "focusFirst"}, {"url": "YAHOO.widget.Dialog.html#focusFirstButton", "host": "YAHOO.widget.Dialog", "name": "focusFirstButton"}, {"url": "YAHOO.widget.Dialog.html#focusLast", "host": "YAHOO.widget.Dialog", "name": "focusLast"}, {"url": "YAHOO.widget.Dialog.html#focusLastButton", "host": "YAHOO.widget.Dialog", "name": "focusLastButton"}, {"url": "DataTable.html#focusTable", "host": "DataTable", "name": "focusTable"}, {"url": "YAHOO.widget.LogReader.html#fontSize", "host": "YAHOO.widget.LogReader", "name": "fontSize"}, {"url": "YAHOO.widget.Module.html#footer", "host": "YAHOO.widget.Module", "name": "footer"}, {"url": "YAHOO.widget.LogReader.html#footerEnabled", "host": "YAHOO.widget.LogReader", "name": "footerEnabled"}, {"url": "YAHOO.widget.AutoComplete.html#forceSelection", "host": "YAHOO.widget.AutoComplete", "name": "forceSelection"}, {"url": "Column.html#format", "host": "Column", "name": "format"}, {"url": "DataTable.html#formatCell", "host": "DataTable", "name": "formatCell"}, {"url": "Column.html#formatCheckbox", "host": "Column", "name": "formatCheckbox"}, {"url": "Column.html#formatCurrency", "host": "Column", "name": "formatCurrency"}, {"url": "Column.html#formatDate", "host": "Column", "name": "formatDate"}, {"url": "Column.html#formatEmail", "host": "Column", "name": "formatEmail"}, {"url": "Column.html#formatLink", "host": "Column", "name": "formatLink"}, {"url": "YAHOO.widget.LogReader.html#formatMsg", "host": "YAHOO.widget.LogReader", "name": "formatMsg"}, {"url": "Column.html#formatNumber", "host": "Column", "name": "formatNumber"}, {"url": "DataTable.html#formatPaginatorDropdown", "host": "DataTable", "name": "formatPaginatorDropdown"}, {"url": "DataTable.html#formatPaginatorLinks", "host": "DataTable", "name": "formatPaginatorLinks"}, {"url": "DataTable.html#formatPaginators", "host": "DataTable", "name": "formatPaginators"}, {"url": "YAHOO.widget.AutoComplete.html#formatResult", "host": "YAHOO.widget.AutoComplete", "name": "formatResult"}, {"url": "Column.html#formatSelect", "host": "Column", "name": "formatSelect"}, {"url": "Column.html#formatter", "host": "Column", "name": "formatter"}, {"url": "YAHOO.util.Connect.html#_formNode", "host": "YAHOO.util.Connect", "name": "_formNode"}, {"url": "YAHOO.widget.Dialog.html#formSubmitEvent", "host": "YAHOO.widget.Dialog", "name": "formSubmitEvent"}, {"url": "YAHOO.util.AnimMgr.html#fps", "host": "YAHOO.util.AnimMgr", "name": "fps"}, {"url": "YAHOO.util.History.html#_fqstates", "host": "YAHOO.util.History", "name": "_fqstates"}, {"url": "YAHOO.util.Dom.html#generateId", "host": "YAHOO.util.Dom", "name": "generateId"}, {"url": "YAHOO.widget.TreeView.html#generateId", "host": "YAHOO.widget.TreeView", "name": "generateId"}, {"url": "YAHOO.util.Event.html#generateId", "host": "YAHOO.util.Event", "name": "generateId"}, {"url": "YAHOO.util.Dom.html#get", "host": "YAHOO.util.Dom", "name": "get"}, {"url": "YAHOO.util.AttributeProvider.html#get", "host": "YAHOO.util.AttributeProvider", "name": "get"}, {"url": "YAHOO.widget.OverlayManager.html#getActive", "host": "YAHOO.widget.OverlayManager", "name": "getActive"}, {"url": "YAHOO.widget.Node.html#getAncestor", "host": "YAHOO.widget.Node", "name": "getAncestor"}, {"url": "YAHOO.widget.TVAnim.html#getAnim", "host": "YAHOO.widget.TVAnim", "name": "getAnim"}, {"url": "YAHOO.util.Region.html#getArea", "host": "YAHOO.util.Region", "name": "getArea"}, {"url": "YAHOO.util.Anim.html#getAttribute", "host": "YAHOO.util.Anim", "name": "getAttribute"}, {"url": "YAHOO.util.AttributeProvider.html#getAttributeConfig", "host": "YAHOO.util.AttributeProvider", "name": "getAttributeConfig"}, {"url": "YAHOO.util.AttributeProvider.html#getAttributeKeys", "host": "YAHOO.util.AttributeProvider", "name": "getAttributeKeys"}, {"url": "YAHOO.util.DragDropMgr.html#getBestMatch", "host": "YAHOO.util.DragDropMgr", "name": "getBestMatch"}, {"url": "DataTable.html#getBody", "host": "DataTable", "name": "getBody"}, {"url": "YAHOO.util.History.html#getBookmarkedState", "host": "YAHOO.util.History", "name": "getBookmarkedState"}, {"url": "YAHOO.widget.ButtonGroup.html#getButton", "host": "YAHOO.widget.ButtonGroup", "name": "getButton"}, {"url": "YAHOO.widget.ButtonGroup.html#getButtons", "host": "YAHOO.widget.ButtonGroup", "name": "getButtons"}, {"url": "DataSource.html#getCachedResponse", "host": "DataSource", "name": "getCachedResponse"}, {"url": "DataSource.html#getCachedResponseEvent", "host": "DataSource", "name": "getCachedResponseEvent"}, {"url": "YAHOO.widget.DataSource.html#getCachedResultsEvent", "host": "YAHOO.widget.DataSource", "name": "getCachedResultsEvent"}, {"url": "YAHOO.util.Event.html#_getCacheIndex", "host": "YAHOO.util.Event", "name": "_getCacheIndex"}, {"url": "YAHOO.widget.LogReader.html#getCategories", "host": "YAHOO.widget.LogReader", "name": "getCategories"}, {"url": "DataTable.html#getCell", "host": "DataTable", "name": "getCell"}, {"url": "YAHOO.util.Event.html#getCharCode", "host": "YAHOO.util.Event", "name": "getCharCode"}, {"url": "YAHOO.widget.LogReader.html#getCheckbox", "host": "YAHOO.widget.LogReader", "name": "getCheckbox"}, {"url": "YAHOO.widget.Node.html#getChildrenEl", "host": "YAHOO.widget.Node", "name": "getChildrenEl"}, {"url": "YAHOO.widget.Node.html#getChildrenElId", "host": "YAHOO.widget.Node", "name": "getChildrenElId"}, {"url": "YAHOO.widget.Node.html#getChildrenHtml", "host": "YAHOO.widget.Node", "name": "getChildrenHtml"}, {"url": "YAHOO.util.DragDropMgr.html#getClientHeight", "host": "YAHOO.util.DragDropMgr", "name": "getClientHeight"}, {"url": "YAHOO.util.Dom.html#getClientHeight", "host": "YAHOO.util.Dom", "name": "getClientHeight"}, {"url": "YAHOO.util.DragDropMgr.html#getClientWidth", "host": "YAHOO.util.DragDropMgr", "name": "getClientWidth"}, {"url": "YAHOO.util.Dom.html#getClientWidth", "host": "YAHOO.util.Dom", "name": "getClientWidth"}, {"url": "Column.html#getColSpan", "host": "Column", "name": "getColSpan"}, {"url": "DataTable.html#getColumnSet", "host": "DataTable", "name": "getColumnSet"}, {"url": "YAHOO.util.Config.html#getConfig", "host": "YAHOO.util.Config", "name": "getConfig"}, {"url": "YAHOO.util.Connect.html#getConnectionObject", "host": "YAHOO.util.Connect", "name": "getConnectionObject"}, {"url": "YAHOO.widget.HTMLNode.html#getContentEl", "host": "YAHOO.widget.HTMLNode", "name": "getContentEl"}, {"url": "YAHOO.widget.ButtonGroup.html#getCount", "host": "YAHOO.widget.ButtonGroup", "name": "getCount"}, {"url": "YAHOO.util.DragDropMgr.html#getCss", "host": "YAHOO.util.DragDropMgr", "name": "getCss"}, {"url": "YAHOO.util.History.html#getCurrentState", "host": "YAHOO.util.History", "name": "getCurrentState"}, {"url": "YAHOO.widget.Dialog.html#getData", "host": "YAHOO.widget.Dialog", "name": "getData"}, {"url": "YAHOO.widget.Calendar.html#getDateByCellId", "host": "YAHOO.widget.Calendar", "name": "getDateByCellId"}, {"url": "YAHOO.widget.Calendar.html#getDateFieldsByCellId", "host": "YAHOO.widget.Calendar", "name": "getDateFieldsByCellId"}, {"url": "YAHOO.widget.DateMath.html#getDayOffset", "host": "YAHOO.widget.DateMath", "name": "getDayOffset"}, {"url": "YAHOO.util.DragDropMgr.html#getDDById", "host": "YAHOO.util.DragDropMgr", "name": "getDDById"}, {"url": "YAHOO.util.Anim.html#getDefaultUnit", "host": "YAHOO.util.Anim", "name": "getDefaultUnit"}, {"url": "YAHOO.widget.Node.html#getDepthStyle", "host": "YAHOO.widget.Node", "name": "getDepthStyle"}, {"url": "YAHOO.util.Dom.html#getDocumentHeight", "host": "YAHOO.util.Dom", "name": "getDocumentHeight"}, {"url": "YAHOO.util.Dom.html#getDocumentWidth", "host": "YAHOO.util.Dom", "name": "getDocumentWidth"}, {"url": "YAHOO.util.DragDrop.html#getDragEl", "host": "YAHOO.util.DragDrop", "name": "getDragEl"}, {"url": "YAHOO.util.DragDrop.html#getEl", "host": "YAHOO.util.DragDrop", "name": "getEl"}, {"url": "YAHOO.util.Anim.html#getEl", "host": "YAHOO.util.Anim", "name": "getEl"}, {"url": "YAHOO.widget.Node.html#getEl", "host": "YAHOO.widget.Node", "name": "getEl"}, {"url": "YAHOO.widget.TreeView.html#getEl", "host": "YAHOO.widget.TreeView", "name": "getEl"}, {"url": "YAHOO.util.Event.html#getEl", "host": "YAHOO.util.Event", "name": "getEl"}, {"url": "YAHOO.util.DragDropMgr.html#getElement", "host": "YAHOO.util.DragDropMgr", "name": "getElement"}, {"url": "YAHOO.util.Dom.html#getElementsBy", "host": "YAHOO.util.Dom", "name": "getElementsBy"}, {"url": "YAHOO.util.Dom.html#getElementsByClassName", "host": "YAHOO.util.Dom", "name": "getElementsByClassName"}, {"url": "YAHOO.util.Element.html#getElementsByClassName", "host": "YAHOO.util.Element", "name": "getElementsByClassName"}, {"url": "YAHOO.util.Element.html#getElementsByTagName", "host": "YAHOO.util.Element", "name": "getElementsByTagName"}, {"url": "YAHOO.widget.Node.html#getElId", "host": "YAHOO.widget.Node", "name": "getElId"}, {"url": "YAHOO.util.DragDropMgr.html#getElWrapper", "host": "YAHOO.util.DragDropMgr", "name": "getElWrapper"}, {"url": "YAHOO.util.Event.html#getEvent", "host": "YAHOO.util.Event", "name": "getEvent"}, {"url": "YAHOO.widget.MenuItem.html#_getFirstElement", "host": "YAHOO.widget.MenuItem", "name": "_getFirstElement"}, {"url": "YAHOO.widget.Button.html#getFirstElement", "host": "YAHOO.widget.Button", "name": "getFirstElement"}, {"url": "YAHOO.widget.Menu.html#_getFirstEnabledItem", "host": "YAHOO.widget.Menu", "name": "_getFirstEnabledItem"}, {"url": "DataTable.html#getFirstRow", "host": "DataTable", "name": "getFirstRow"}, {"url": "YAHOO.widget.MenuManager.html#getFocusedMenu", "host": "YAHOO.widget.MenuManager", "name": "getFocusedMenu"}, {"url": "YAHOO.widget.MenuManager.html#getFocusedMenuItem", "host": "YAHOO.widget.MenuManager", "name": "getFocusedMenuItem"}, {"url": "YAHOO.widget.Button.html#getForm", "host": "YAHOO.widget.Button", "name": "getForm"}, {"url": "YAHOO.util.History.html#_getHash", "host": "YAHOO.util.History", "name": "_getHash"}, {"url": "DataTable.html#getHead", "host": "DataTable", "name": "getHead"}, {"url": "YAHOO.widget.Button.html#getHiddenField", "host": "YAHOO.widget.Button", "name": "getHiddenField"}, {"url": "YAHOO.widget.Node.html#getHoverStyle", "host": "YAHOO.widget.Node", "name": "getHoverStyle"}, {"url": "YAHOO.widget.Node.html#getHtml", "host": "YAHOO.widget.Node", "name": "getHtml"}, {"url": "YAHOO.widget.Node.html#getIconMode", "host": "YAHOO.widget.Node", "name": "getIconMode"}, {"url": "Column.html#getId", "host": "Column", "name": "getId"}, {"url": "Column.html#getIndex", "host": "Column", "name": "getIndex"}, {"url": "YAHOO.widget.Menu.html#getItem", "host": "YAHOO.widget.Menu", "name": "getItem"}, {"url": "YAHOO.widget.Menu.html#_getItemGroup", "host": "YAHOO.widget.Menu", "name": "_getItemGroup"}, {"url": "YAHOO.widget.Menu.html#getItemGroups", "host": "YAHOO.widget.Menu", "name": "getItemGroups"}, {"url": "YAHOO.widget.Menu.html#getItems", "host": "YAHOO.widget.Menu", "name": "getItems"}, {"url": "YAHOO.widget.DateMath.html#getJan1", "host": "YAHOO.widget.DateMath", "name": "getJan1"}, {"url": "YAHOO.widget.TextNode.html#getLabelEl", "host": "YAHOO.widget.TextNode", "name": "getLabelEl"}, {"url": "DataTable.html#getLastRow", "host": "DataTable", "name": "getLastRow"}, {"url": "YAHOO.widget.LogReader.html#getLastTime", "host": "YAHOO.widget.LogReader", "name": "getLastTime"}, {"url": "YAHOO.util.Event.html#getLegacyIndex", "host": "YAHOO.util.Event", "name": "getLegacyIndex"}, {"url": "RecordSet.html#getLength", "host": "RecordSet", "name": "getLength"}, {"url": "YAHOO.util.Event.html#getListeners", "host": "YAHOO.util.Event", "name": "getListeners"}, {"url": "YAHOO.widget.AutoComplete.html#getListItemData", "host": "YAHOO.widget.AutoComplete", "name": "getListItemData"}, {"url": "YAHOO.widget.AutoComplete.html#getListItems", "host": "YAHOO.widget.AutoComplete", "name": "getListItems"}, {"url": "YAHOO.util.DragDropMgr.html#getLocation", "host": "YAHOO.util.DragDropMgr", "name": "getLocation"}, {"url": "YAHOO.widget.MenuManager.html#getMenu", "host": "YAHOO.widget.MenuManager", "name": "getMenu"}, {"url": "YAHOO.widget.Button.html#getMenu", "host": "YAHOO.widget.Button", "name": "getMenu"}, {"url": "YAHOO.widget.MenuManager.html#getMenuRootElement", "host": "YAHOO.widget.MenuManager", "name": "getMenuRootElement"}, {"url": "YAHOO.widget.MenuManager.html#getMenus", "host": "YAHOO.widget.MenuManager", "name": "getMenus"}, {"url": "YAHOO.widget.MenuItem.html#getNextEnabledSibling", "host": "YAHOO.widget.MenuItem", "name": "getNextEnabledSibling"}, {"url": "YAHOO.widget.Slider.html#_getNextX", "host": "YAHOO.widget.Slider", "name": "_getNextX"}, {"url": "YAHOO.widget.Slider.html#_getNextY", "host": "YAHOO.widget.Slider", "name": "_getNextY"}, {"url": "YAHOO.widget.TreeView.html#getNodeByIndex", "host": "YAHOO.widget.TreeView", "name": "getNodeByIndex"}, {"url": "YAHOO.widget.TreeView.html#getNodeByProperty", "host": "YAHOO.widget.TreeView", "name": "getNodeByProperty"}, {"url": "YAHOO.widget.Node.html#getNodeHtml", "host": "YAHOO.widget.Node", "name": "getNodeHtml"}, {"url": "YAHOO.widget.TreeView.html#getNodesByProperty", "host": "YAHOO.widget.TreeView", "name": "getNodesByProperty"}, {"url": "YAHOO.widget.SliderThumb.html#getOffsetFromParent", "host": "YAHOO.widget.SliderThumb", "name": "getOffsetFromParent"}, {"url": "YAHOO.widget.Menu.html#_getOffsetWidth", "host": "YAHOO.widget.Menu", "name": "_getOffsetWidth"}, {"url": "YAHOO.util.Event.html#getPageX", "host": "YAHOO.util.Event", "name": "getPageX"}, {"url": "YAHOO.util.Event.html#getPageY", "host": "YAHOO.util.Event", "name": "getPageY"}, {"url": "DataTable.html#getPaginator", "host": "DataTable", "name": "getPaginator"}, {"url": "YAHOO.util.Bezier.html#getPosition", "host": "YAHOO.util.Bezier", "name": "getPosition"}, {"url": "YAHOO.util.DragDropMgr.html#getPosX", "host": "YAHOO.util.DragDropMgr", "name": "getPosX"}, {"url": "YAHOO.util.DragDropMgr.html#getPosY", "host": "YAHOO.util.DragDropMgr", "name": "getPosY"}, {"url": "YAHOO.widget.MenuItem.html#getPreviousEnabledSibling", "host": "YAHOO.widget.MenuItem", "name": "getPreviousEnabledSibling"}, {"url": "YAHOO.util.Config.html#getProperty", "host": "YAHOO.util.Config", "name": "getProperty"}, {"url": "YAHOO.util.History.html#getQueryStringParameter", "host": "YAHOO.util.History", "name": "getQueryStringParameter"}, {"url": "RecordSet.html#getRecord", "host": "RecordSet", "name": "getRecord"}, {"url": "RecordSet.html#getRecordBy", "host": "RecordSet", "name": "getRecordBy"}, {"url": "RecordSet.html#getRecordIndex", "host": "RecordSet", "name": "getRecordIndex"}, {"url": "RecordSet.html#getRecords", "host": "RecordSet", "name": "getRecords"}, {"url": "DataTable.html#getRecordSet", "host": "DataTable", "name": "getRecordSet"}, {"url": "YAHOO.util.Dom.html#getRegion", "host": "YAHOO.util.Dom", "name": "getRegion"}, {"url": "YAHOO.util.Region.html#getRegion", "host": "YAHOO.util.Region", "name": "getRegion"}, {"url": "YAHOO.util.DragDropMgr.html#getRelated", "host": "YAHOO.util.DragDropMgr", "name": "getRelated"}, {"url": "YAHOO.util.Event.html#getRelatedTarget", "host": "YAHOO.util.Event", "name": "getRelatedTarget"}, {"url": "YAHOO.widget.DataSource.html#getResults", "host": "YAHOO.widget.DataSource", "name": "getResults"}, {"url": "YAHOO.widget.DataSource.html#getResultsEvent", "host": "YAHOO.widget.DataSource", "name": "getResultsEvent"}, {"url": "YAHOO.widget.Menu.html#getRoot", "host": "YAHOO.widget.Menu", "name": "getRoot"}, {"url": "YAHOO.widget.TreeView.html#getRoot", "host": "YAHOO.widget.TreeView", "name": "getRoot"}, {"url": "DataTable.html#getRow", "host": "DataTable", "name": "getRow"}, {"url": "Column.html#getRowSpan", "host": "Column", "name": "getRowSpan"}, {"url": "YAHOO.util.Subscriber.html#getScope", "host": "YAHOO.util.Subscriber", "name": "getScope"}, {"url": "YAHOO.util.DragDropMgr.html#getScroll", "host": "YAHOO.util.DragDropMgr", "name": "getScroll"}, {"url": "YAHOO.util.Event.html#_getScroll", "host": "YAHOO.util.Event", "name": "_getScroll"}, {"url": "YAHOO.util.DragDropMgr.html#getScrollLeft", "host": "YAHOO.util.DragDropMgr", "name": "getScrollLeft"}, {"url": "YAHOO.util.Event.html#_getScrollLeft", "host": "YAHOO.util.Event", "name": "_getScrollLeft"}, {"url": "YAHOO.util.DragDropMgr.html#getScrollTop", "host": "YAHOO.util.DragDropMgr", "name": "getScrollTop"}, {"url": "YAHOO.util.Event.html#_getScrollTop", "host": "YAHOO.util.Event", "name": "_getScrollTop"}, {"url": "DataTable.html#getSelectedCells", "host": "DataTable", "name": "getSelectedCells"}, {"url": "YAHOO.widget.Calendar.html#getSelectedDates", "host": "YAHOO.widget.Calendar", "name": "getSelectedDates"}, {"url": "YAHOO.widget.CalendarGroup.html#getSelectedDates", "host": "YAHOO.widget.CalendarGroup", "name": "getSelectedDates"}, {"url": "DataTable.html#getSelectedRecordIds", "host": "DataTable", "name": "getSelectedRecordIds"}, {"url": "DataTable.html#getSelectedRows", "host": "DataTable", "name": "getSelectedRows"}, {"url": "YAHOO.widget.Node.html#getSiblings", "host": "YAHOO.widget.Node", "name": "getSiblings"}, {"url": "YAHOO.widget.LogWriter.html#getSource", "host": "YAHOO.widget.LogWriter", "name": "getSource"}, {"url": "YAHOO.widget.LogReader.html#getSources", "host": "YAHOO.widget.LogReader", "name": "getSources"}, {"url": "YAHOO.widget.Logger.html#getStack", "host": "YAHOO.widget.Logger", "name": "getStack"}, {"url": "YAHOO.util.Anim.html#getStartTime", "host": "YAHOO.util.Anim", "name": "getStartTime"}, {"url": "YAHOO.widget.Logger.html#getStartTime", "host": "YAHOO.widget.Logger", "name": "getStartTime"}, {"url": "YAHOO.util.DragDropMgr.html#getStyle", "host": "YAHOO.util.DragDropMgr", "name": "getStyle"}, {"url": "YAHOO.util.Dom.html#getStyle", "host": "YAHOO.util.Dom", "name": "getStyle"}, {"url": "YAHOO.util.Element.html#getStyle", "host": "YAHOO.util.Element", "name": "getStyle"}, {"url": "YAHOO.widget.Node.html#getStyle", "host": "YAHOO.widget.Node", "name": "getStyle"}, {"url": "YAHOO.widget.TabView.html#getTab", "host": "YAHOO.widget.TabView", "name": "getTab"}, {"url": "YAHOO.widget.TabView.html#getTabIndex", "host": "YAHOO.widget.TabView", "name": "getTabIndex"}, {"url": "DataTable.html#getTable", "host": "DataTable", "name": "getTable"}, {"url": "YAHOO.util.Event.html#getTarget", "host": "YAHOO.util.Event", "name": "getTarget"}, {"url": "YAHOO.util.DragDrop.html#getTargetCoord", "host": "YAHOO.util.DragDrop", "name": "getTargetCoord"}, {"url": "ColumnEditor.html#getTextareaEditorValue", "host": "ColumnEditor", "name": "getTextareaEditorValue"}, {"url": "ColumnEditor.html#getTextboxEditorValue", "host": "ColumnEditor", "name": "getTextboxEditorValue"}, {"url": "YAHOO.widget.Slider.html#getThumb", "host": "YAHOO.widget.Slider", "name": "getThumb"}, {"url": "YAHOO.util.DragDrop.html#getTick", "host": "YAHOO.util.DragDrop", "name": "getTick"}, {"url": "YAHOO.util.Event.html#getTime", "host": "YAHOO.util.Event", "name": "getTime"}, {"url": "YAHOO.widget.Node.html#getToggleEl", "host": "YAHOO.widget.Node", "name": "getToggleEl"}, {"url": "YAHOO.widget.Node.html#getToggleElId", "host": "YAHOO.widget.Node", "name": "getToggleElId"}, {"url": "YAHOO.widget.Node.html#getToggleLink", "host": "YAHOO.widget.Node", "name": "getToggleLink"}, {"url": "ColumnEditor.html#getValue", "host": "ColumnEditor", "name": "getValue"}, {"url": "YAHOO.util.Attribute.html#getValue", "host": "YAHOO.util.Attribute", "name": "getValue"}, {"url": "YAHOO.widget.Slider.html#getValue", "host": "YAHOO.widget.Slider", "name": "getValue"}, {"url": "YAHOO.widget.SliderThumb.html#getValue", "host": "YAHOO.widget.SliderThumb", "name": "getValue"}, {"url": "YAHOO.env.html#getVersion", "host": "YAHOO.env", "name": "getVersion"}, {"url": "YAHOO.util.Dom.html#getViewportHeight", "host": "YAHOO.util.Dom", "name": "getViewportHeight"}, {"url": "YAHOO.util.Dom.html#getViewportWidth", "host": "YAHOO.util.Dom", "name": "getViewportWidth"}, {"url": "YAHOO.widget.DateMath.html#getWeekNumber", "host": "YAHOO.widget.DateMath", "name": "getWeekNumber"}, {"url": "YAHOO.util.Dom.html#getX", "host": "YAHOO.util.Dom", "name": "getX"}, {"url": "YAHOO.widget.Slider.html#getXValue", "host": "YAHOO.widget.Slider", "name": "getXValue"}, {"url": "YAHOO.widget.SliderThumb.html#getXValue", "host": "YAHOO.widget.SliderThumb", "name": "getXValue"}, {"url": "YAHOO.util.Dom.html#getXY", "host": "YAHOO.util.Dom", "name": "getXY"}, {"url": "YAHOO.util.Event.html#getXY", "host": "YAHOO.util.Event", "name": "getXY"}, {"url": "YAHOO.util.Dom.html#getY", "host": "YAHOO.util.Dom", "name": "getY"}, {"url": "YAHOO.widget.Slider.html#getYValue", "host": "YAHOO.widget.Slider", "name": "getYValue"}, {"url": "YAHOO.widget.SliderThumb.html#getYValue", "host": "YAHOO.widget.SliderThumb", "name": "getYValue"}, {"url": "YAHOO.widget.SliderThumb.html#_graduated", "host": "YAHOO.widget.SliderThumb", "name": "_graduated"}, {"url": "YAHOO.widget.MenuItem.html#groupIndex", "host": "YAHOO.widget.MenuItem", "name": "groupIndex"}, {"url": "YAHOO.util.DragDrop.html#groups", "host": "YAHOO.util.DragDrop", "name": "groups"}, {"url": "YAHOO.widget.Menu.html#GROUP_TITLE_TAG_NAME", "host": "YAHOO.widget.Menu", "name": "GROUP_TITLE_TAG_NAME"}, {"url": "YAHOO.widget.ContainerEffect.html#handleCompleteAnimateIn", "host": "YAHOO.widget.ContainerEffect", "name": "handleCompleteAnimateIn"}, {"url": "YAHOO.widget.ContainerEffect.html#handleCompleteAnimateOut", "host": "YAHOO.widget.ContainerEffect", "name": "handleCompleteAnimateOut"}, {"url": "YAHOO.util.DragDrop.html#handleElId", "host": "YAHOO.util.DragDrop", "name": "handleElId"}, {"url": "YAHOO.util.History.html#_handleFQStateChange", "host": "YAHOO.util.History", "name": "_handleFQStateChange"}, {"url": "YAHOO.util.DragDropMgr.html#handleIds", "host": "YAHOO.util.DragDropMgr", "name": "handleIds"}, {"url": "YAHOO.widget.Slider.html#handleKeyDown", "host": "YAHOO.widget.Slider", "name": "handleKeyDown"}, {"url": "YAHOO.widget.Slider.html#handleKeyPress", "host": "YAHOO.widget.Slider", "name": "handleKeyPress"}, {"url": "YAHOO.util.DragDrop.html#handleMouseDown", "host": "YAHOO.util.DragDrop", "name": "handleMouseDown"}, {"url": "YAHOO.util.DragDropMgr.html#handleMouseDown", "host": "YAHOO.util.DragDropMgr", "name": "handleMouseDown"}, {"url": "YAHOO.util.DragDropMgr.html#handleMouseMove", "host": "YAHOO.util.DragDropMgr", "name": "handleMouseMove"}, {"url": "YAHOO.util.DragDropMgr.html#handleMouseUp", "host": "YAHOO.util.DragDropMgr", "name": "handleMouseUp"}, {"url": "YAHOO.util.DragDrop.html#handleOnAvailable", "host": "YAHOO.util.DragDrop", "name": "handleOnAvailable"}, {"url": "YAHOO.util.Connect.html#handleReadyState", "host": "YAHOO.util.Connect", "name": "handleReadyState"}, {"url": "DataSource.html#handleResponse", "host": "DataSource", "name": "handleResponse"}, {"url": "YAHOO.widget.ContainerEffect.html#handleStartAnimateIn", "host": "YAHOO.widget.ContainerEffect", "name": "handleStartAnimateIn"}, {"url": "YAHOO.widget.ContainerEffect.html#handleStartAnimateOut", "host": "YAHOO.widget.ContainerEffect", "name": "handleStartAnimateOut"}, {"url": "YAHOO.widget.Slider.html#handleThumbChange", "host": "YAHOO.widget.Slider", "name": "handleThumbChange"}, {"url": "YAHOO.util.Connect.html#handleTransactionResponse", "host": "YAHOO.util.Connect", "name": "handleTransactionResponse"}, {"url": "YAHOO.widget.ContainerEffect.html#handleTweenAnimateIn", "host": "YAHOO.widget.ContainerEffect", "name": "handleTweenAnimateIn"}, {"url": "YAHOO.widget.ContainerEffect.html#handleTweenAnimateOut", "host": "YAHOO.widget.ContainerEffect", "name": "handleTweenAnimateOut"}, {"url": "YAHOO.util.DragDropMgr.html#handleWasClicked", "host": "YAHOO.util.DragDropMgr", "name": "handleWasClicked"}, {"url": "YAHOO.util.Element.html#hasChildNodes", "host": "YAHOO.util.Element", "name": "hasChildNodes"}, {"url": "YAHOO.widget.Node.html#hasChildren", "host": "YAHOO.widget.Node", "name": "hasChildren"}, {"url": "YAHOO.util.Dom.html#hasClass", "host": "YAHOO.util.Dom", "name": "hasClass"}, {"url": "YAHOO.util.Element.html#hasClass", "host": "YAHOO.util.Element", "name": "hasClass"}, {"url": "YAHOO.util.Connect.html#_has_default_header", "host": "YAHOO.util.Connect", "name": "_has_default_header"}, {"url": "YAHOO.util.EventProvider.html#hasEvent", "host": "YAHOO.util.EventProvider", "name": "hasEvent"}, {"url": "YAHOO.widget.Menu.html#hasFocus", "host": "YAHOO.widget.Menu", "name": "hasFocus"}, {"url": "YAHOO.widget.MenuItem.html#hasFocus", "host": "YAHOO.widget.MenuItem", "name": "hasFocus"}, {"url": "YAHOO.widget.Button.html#hasFocus", "host": "YAHOO.widget.Button", "name": "hasFocus"}, {"url": "YAHOO.util.Connect.html#_has_http_headers", "host": "YAHOO.util.Connect", "name": "_has_http_headers"}, {"url": "YAHOO.widget.Node.html#hasIcon", "host": "YAHOO.widget.Node", "name": "hasIcon"}, {"url": "YAHOO.widget.Button.html#_hasKeyEventHandlers", "host": "YAHOO.widget.Button", "name": "_hasKeyEventHandlers"}, {"url": "YAHOO.widget.Button.html#_hasMouseEventHandlers", "host": "YAHOO.widget.Button", "name": "_hasMouseEventHandlers"}, {"url": "YAHOO.util.DragDrop.html#hasOuterHandles", "host": "YAHOO.util.DragDrop", "name": "hasOuterHandles"}, {"url": "YAHOO.lang.html#hasOwnProperty", "host": "YAHOO.lang", "name": "hasOwnProperty"}, {"url": "YAHOO.util.Connect.html#_hasSubmitListener", "host": "YAHOO.util.Connect", "name": "_hasSubmitListener"}, {"url": "DataTable.html#headCellClickEvent", "host": "DataTable", "name": "headCellClickEvent"}, {"url": "DataTable.html#headCellDoubleclickEvent", "host": "DataTable", "name": "headCellDoubleclickEvent"}, {"url": "DataTable.html#headCellMousedownEvent", "host": "DataTable", "name": "headCellMousedownEvent"}, {"url": "DataTable.html#headCellMouseoutEvent", "host": "DataTable", "name": "headCellMouseoutEvent"}, {"url": "DataTable.html#headCellMouseoverEvent", "host": "DataTable", "name": "headCellMouseoverEvent"}, {"url": "YAHOO.widget.Module.html#header", "host": "YAHOO.widget.Module", "name": "header"}, {"url": "ColumnSet.html#headers", "host": "ColumnSet", "name": "headers"}, {"url": "YAHOO.widget.Overlay.html#height", "host": "YAHOO.widget.Overlay", "name": "height"}, {"url": "YAHOO.widget.LogReader.html#height", "host": "YAHOO.widget.LogReader", "name": "height"}, {"url": "YAHOO.widget.MenuItem.html#helptext", "host": "YAHOO.widget.MenuItem", "name": "helptext"}, {"url": "YAHOO.widget.Button.html#_hiddenField", "host": "YAHOO.widget.Button", "name": "_hiddenField"}, {"url": "ColumnEditor.html#hide", "host": "ColumnEditor", "name": "hide"}, {"url": "YAHOO.widget.Module.html#hide", "host": "YAHOO.widget.Module", "name": "hide"}, {"url": "YAHOO.widget.Calendar.html#hide", "host": "YAHOO.widget.Calendar", "name": "hide"}, {"url": "YAHOO.widget.LogReader.html#hide", "host": "YAHOO.widget.LogReader", "name": "hide"}, {"url": "YAHOO.widget.OverlayManager.html#hideAll", "host": "YAHOO.widget.OverlayManager", "name": "hideAll"}, {"url": "YAHOO.widget.Calendar.html#HIDE_BLANK_WEEKS", "host": "YAHOO.widget.Calendar", "name": "HIDE_BLANK_WEEKS"}, {"url": "YAHOO.widget.CalendarGroup.html#HIDE_BLANK_WEEKS", "host": "YAHOO.widget.CalendarGroup", "name": "HIDE_BLANK_WEEKS"}, {"url": "YAHOO.widget.LogReader.html#hideCategory", "host": "YAHOO.widget.LogReader", "name": "hideCategory"}, {"url": "YAHOO.widget.Node.html#hideChildren", "host": "YAHOO.widget.Node", "name": "hideChildren"}, {"url": "YAHOO.widget.Tooltip.html#hidedelay", "host": "YAHOO.widget.Tooltip", "name": "hidedelay"}, {"url": "YAHOO.widget.Menu.html#hidedelay", "host": "YAHOO.widget.Menu", "name": "hidedelay"}, {"url": "YAHOO.widget.Module.html#hideEvent", "host": "YAHOO.widget.Module", "name": "hideEvent"}, {"url": "YAHOO.widget.Overlay.html#hideIframe", "host": "YAHOO.widget.Overlay", "name": "hideIframe"}, {"url": "YAHOO.widget.Overlay.html#hideMacGeckoScrollbars", "host": "YAHOO.widget.Overlay", "name": "hideMacGeckoScrollbars"}, {"url": "YAHOO.widget.Panel.html#hideMask", "host": "YAHOO.widget.Panel", "name": "hideMask"}, {"url": "YAHOO.widget.Panel.html#hideMaskEvent", "host": "YAHOO.widget.Panel", "name": "hideMaskEvent"}, {"url": "YAHOO.widget.Button.html#_hideMenu", "host": "YAHOO.widget.Button", "name": "_hideMenu"}, {"url": "YAHOO.widget.LogReader.html#hideSource", "host": "YAHOO.widget.LogReader", "name": "hideSource"}, {"url": "DataTable.html#hideTableMessage", "host": "DataTable", "name": "hideTableMessage"}, {"url": "DataTable.html#hideTableMessages", "host": "DataTable", "name": "hideTableMessages"}, {"url": "YAHOO.widget.MenuManager.html#hideVisible", "host": "YAHOO.widget.MenuManager", "name": "hideVisible"}, {"url": "DataTable.html#highlight", "host": "DataTable", "name": "highlight"}, {"url": "YAHOO.widget.AutoComplete.html#highlightClassName", "host": "YAHOO.widget.AutoComplete", "name": "highlightClassName"}, {"url": "DataTable.html#highlightEvent", "host": "DataTable", "name": "highlightEvent"}, {"url": "YAHOO.widget.Button.html#href", "host": "YAHOO.widget.Button", "name": "href"}, {"url": "YAHOO.widget.Tab.html#href", "host": "YAHOO.widget.Tab", "name": "href"}, {"url": "YAHOO.widget.Node.html#href", "host": "YAHOO.widget.Node", "name": "href"}, {"url": "YAHOO.widget.LogReader.html#html2Text", "host": "YAHOO.widget.LogReader", "name": "html2Text"}, {"url": "YAHOO.util.Connect.html#_http_header", "host": "YAHOO.util.Connect", "name": "_http_header"}, {"url": "YAHOO.widget.SimpleDialog.html#icon", "host": "YAHOO.widget.SimpleDialog", "name": "icon"}, {"url": "YAHOO.widget.Node.html#iconMode", "host": "YAHOO.widget.Node", "name": "iconMode"}, {"url": "Column.html#_id", "host": "Column", "name": "_id"}, {"url": "YAHOO.widget.Module.html#id", "host": "YAHOO.widget.Module", "name": "id"}, {"url": "YAHOO.util.DragDrop.html#id", "host": "YAHOO.util.DragDrop", "name": "id"}, {"url": "YAHOO.util.DragDropMgr.ElementWrapper.html#id", "host": "YAHOO.util.DragDropMgr.ElementWrapper", "name": "id"}, {"url": "YAHOO.widget.MenuItem.html#id", "host": "YAHOO.widget.MenuItem", "name": "id"}, {"url": "YAHOO.widget.Calendar.html#id", "host": "YAHOO.widget.Calendar", "name": "id"}, {"url": "YAHOO.widget.CalendarGroup.html#id", "host": "YAHOO.widget.CalendarGroup", "name": "id"}, {"url": "YAHOO.widget.TreeView.html#id", "host": "YAHOO.widget.TreeView", "name": "id"}, {"url": "YAHOO.util.DragDropMgr.html#ids", "host": "YAHOO.util.DragDropMgr", "name": "ids"}, {"url": "YAHOO.widget.Overlay.html#iframe", "host": "YAHOO.widget.Overlay", "name": "iframe"}, {"url": "YAHOO.widget.Calendar.html#iframe", "host": "YAHOO.widget.Calendar", "name": "iframe"}, {"url": "YAHOO.widget.CalendarGroup.html#iframe", "host": "YAHOO.widget.CalendarGroup", "name": "iframe"}, {"url": "YAHOO.util.History.html#_iframe", "host": "YAHOO.util.History", "name": "_iframe"}, {"url": "YAHOO.widget.AutoComplete.html#_iFrameSrc", "host": "YAHOO.widget.AutoComplete", "name": "_iFrameSrc"}, {"url": "YAHOO.widget.Module.html#imageRoot", "host": "YAHOO.widget.Module", "name": "imageRoot"}, {"url": "Column.html#_index", "host": "Column", "name": "_index"}, {"url": "YAHOO.widget.MenuItem.html#index", "host": "YAHOO.widget.MenuItem", "name": "index"}, {"url": "YAHOO.widget.Calendar.html#index", "host": "YAHOO.widget.Calendar", "name": "index"}, {"url": "YAHOO.widget.Node.html#index", "host": "YAHOO.widget.Node", "name": "index"}, {"url": "YAHOO.widget.Calendar.html#_indexOfSelectedFieldArray", "host": "YAHOO.widget.Calendar", "name": "_indexOfSelectedFieldArray"}, {"url": "YAHOO.util.Dom.html#inDocument", "host": "YAHOO.util.Dom", "name": "inDocument"}, {"url": "YAHOO.util.Config.html#init", "host": "YAHOO.util.Config", "name": "init"}, {"url": "YAHOO.widget.ContainerEffect.html#init", "host": "YAHOO.widget.ContainerEffect", "name": "init"}, {"url": "YAHOO.widget.Dialog.html#init", "host": "YAHOO.widget.Dialog", "name": "init"}, {"url": "YAHOO.widget.Module.html#init", "host": "YAHOO.widget.Module", "name": "init"}, {"url": "YAHOO.widget.Overlay.html#init", "host": "YAHOO.widget.Overlay", "name": "init"}, {"url": "YAHOO.widget.OverlayManager.html#init", "host": "YAHOO.widget.OverlayManager", "name": "init"}, {"url": "YAHOO.widget.Panel.html#init", "host": "YAHOO.widget.Panel", "name": "init"}, {"url": "YAHOO.widget.SimpleDialog.html#init", "host": "YAHOO.widget.SimpleDialog", "name": "init"}, {"url": "YAHOO.widget.Tooltip.html#init", "host": "YAHOO.widget.Tooltip", "name": "init"}, {"url": "YAHOO.util.DragDrop.html#init", "host": "YAHOO.util.DragDrop", "name": "init"}, {"url": "YAHOO.util.DragDropMgr.html#init", "host": "YAHOO.util.DragDropMgr", "name": "init"}, {"url": "YAHOO.widget.ContextMenu.html#init", "host": "YAHOO.widget.ContextMenu", "name": "init"}, {"url": "YAHOO.widget.ContextMenuItem.html#init", "host": "YAHOO.widget.ContextMenuItem", "name": "init"}, {"url": "YAHOO.widget.Menu.html#init", "host": "YAHOO.widget.Menu", "name": "init"}, {"url": "YAHOO.widget.Menubar.html#init", "host": "YAHOO.widget.Menubar", "name": "init"}, {"url": "YAHOO.widget.MenuBarItem.html#init", "host": "YAHOO.widget.MenuBarItem", "name": "init"}, {"url": "YAHOO.widget.MenuItem.html#init", "host": "YAHOO.widget.MenuItem", "name": "init"}, {"url": "YAHOO.widget.Button.html#init", "host": "YAHOO.widget.Button", "name": "init"}, {"url": "YAHOO.widget.ButtonGroup.html#init", "host": "YAHOO.widget.ButtonGroup", "name": "init"}, {"url": "YAHOO.html#init", "host": "YAHOO", "name": "init"}, {"url": "YAHOO.widget.DataSource.html#_init", "host": "YAHOO.widget.DataSource", "name": "_init"}, {"url": "YAHOO.util.Anim.html#init", "host": "YAHOO.util.Anim", "name": "init"}, {"url": "YAHOO.widget.Calendar.html#init", "host": "YAHOO.widget.Calendar", "name": "init"}, {"url": "YAHOO.widget.CalendarGroup.html#init", "host": "YAHOO.widget.CalendarGroup", "name": "init"}, {"url": "YAHOO.widget.Node.html#init", "host": "YAHOO.widget.Node", "name": "init"}, {"url": "YAHOO.widget.TreeView.html#init", "host": "YAHOO.widget.TreeView", "name": "init"}, {"url": "YAHOO.widget.Button.html#initAttributes", "host": "YAHOO.widget.Button", "name": "initAttributes"}, {"url": "YAHOO.widget.ButtonGroup.html#initAttributes", "host": "YAHOO.widget.ButtonGroup", "name": "initAttributes"}, {"url": "YAHOO.util.Element.html#initAttributes", "host": "YAHOO.util.Element", "name": "initAttributes"}, {"url": "YAHOO.widget.Tab.html#initAttributes", "host": "YAHOO.widget.Tab", "name": "initAttributes"}, {"url": "YAHOO.widget.TabView.html#initAttributes", "host": "YAHOO.widget.TabView", "name": "initAttributes"}, {"url": "YAHOO.widget.Button.html#initConfig", "host": "YAHOO.widget.Button", "name": "initConfig"}, {"url": "YAHOO.widget.AutoComplete.html#_initContainer", "host": "YAHOO.widget.AutoComplete", "name": "_initContainer"}, {"url": "YAHOO.widget.AutoComplete.html#_initContainerHelpers", "host": "YAHOO.widget.AutoComplete", "name": "_initContainerHelpers"}, {"url": "YAHOO.widget.HTMLNode.html#initContent", "host": "YAHOO.widget.HTMLNode", "name": "initContent"}, {"url": "YAHOO.widget.Dialog.html#initDefaultConfig", "host": "YAHOO.widget.Dialog", "name": "initDefaultConfig"}, {"url": "YAHOO.widget.Module.html#initDefaultConfig", "host": "YAHOO.widget.Module", "name": "initDefaultConfig"}, {"url": "YAHOO.widget.Overlay.html#initDefaultConfig", "host": "YAHOO.widget.Overlay", "name": "initDefaultConfig"}, {"url": "YAHOO.widget.OverlayManager.html#initDefaultConfig", "host": "YAHOO.widget.OverlayManager", "name": "initDefaultConfig"}, {"url": "YAHOO.widget.Panel.html#initDefaultConfig", "host": "YAHOO.widget.Panel", "name": "initDefaultConfig"}, {"url": "YAHOO.widget.SimpleDialog.html#initDefaultConfig", "host": "YAHOO.widget.SimpleDialog", "name": "initDefaultConfig"}, {"url": "YAHOO.widget.Tooltip.html#initDefaultConfig", "host": "YAHOO.widget.Tooltip", "name": "initDefaultConfig"}, {"url": "YAHOO.widget.ContextMenu.html#initDefaultConfig", "host": "YAHOO.widget.ContextMenu", "name": "initDefaultConfig"}, {"url": "YAHOO.widget.Menu.html#initDefaultConfig", "host": "YAHOO.widget.Menu", "name": "initDefaultConfig"}, {"url": "YAHOO.widget.Menubar.html#initDefaultConfig", "host": "YAHOO.widget.Menubar", "name": "initDefaultConfig"}, {"url": "YAHOO.widget.MenuItem.html#initDefaultConfig", "host": "YAHOO.widget.MenuItem", "name": "initDefaultConfig"}, {"url": "YAHOO.widget.Module.html#initEvent", "host": "YAHOO.widget.Module", "name": "initEvent"}, {"url": "YAHOO.widget.Dialog.html#initEvents", "host": "YAHOO.widget.Dialog", "name": "initEvents"}, {"url": "YAHOO.widget.Module.html#initEvents", "host": "YAHOO.widget.Module", "name": "initEvents"}, {"url": "YAHOO.widget.Overlay.html#initEvents", "host": "YAHOO.widget.Overlay", "name": "initEvents"}, {"url": "YAHOO.widget.Panel.html#initEvents", "host": "YAHOO.widget.Panel", "name": "initEvents"}, {"url": "YAHOO.widget.ContextMenu.html#initEvents", "host": "YAHOO.widget.ContextMenu", "name": "initEvents"}, {"url": "YAHOO.widget.Menu.html#initEvents", "host": "YAHOO.widget.Menu", "name": "initEvents"}, {"url": "YAHOO.widget.Calendar.html#initEvents", "host": "YAHOO.widget.Calendar", "name": "initEvents"}, {"url": "YAHOO.widget.CalendarGroup.html#initEvents", "host": "YAHOO.widget.CalendarGroup", "name": "initEvents"}, {"url": "YAHOO.util.DDProxy.html#initFrame", "host": "YAHOO.util.DDProxy", "name": "initFrame"}, {"url": "DataTable.html#_initHead", "host": "DataTable", "name": "_initHead"}, {"url": "DataTable.html#_initHeadCell", "host": "DataTable", "name": "_initHeadCell"}, {"url": "YAHOO.util.Connect.html#initHeader", "host": "YAHOO.util.Connect", "name": "initHeader"}, {"url": "YAHOO.util.Config.html#initialConfig", "host": "YAHOO.util.Config", "name": "initialConfig"}, {"url": "YAHOO.util.Attribute.html#_initialConfig", "host": "YAHOO.util.Attribute", "name": "_initialConfig"}, {"url": "YAHOO.util.History.html#_initialize", "host": "YAHOO.util.History", "name": "_initialize"}, {"url": "YAHOO.util.History.html#initialize", "host": "YAHOO.util.History", "name": "initialize"}, {"url": "YAHOO.util.DragDropMgr.html#initialized", "host": "YAHOO.util.DragDropMgr", "name": "initialized"}, {"url": "YAHOO.util.History.html#_initialized", "host": "YAHOO.util.History", "name": "_initialized"}, {"url": "DataTable.html#initialRequest", "host": "DataTable", "name": "initialRequest"}, {"url": "YAHOO.widget.AutoComplete.html#_initList", "host": "YAHOO.widget.AutoComplete", "name": "_initList"}, {"url": "YAHOO.widget.AutoComplete.html#_initListItem", "host": "YAHOO.widget.AutoComplete", "name": "_initListItem"}, {"url": "DataTable.html#_initPaginator", "host": "DataTable", "name": "_initPaginator"}, {"url": "YAHOO.widget.AutoComplete.html#__initProps", "host": "YAHOO.widget.AutoComplete", "name": "__initProps"}, {"url": "YAHOO.widget.Module.html#initResizeMonitor", "host": "YAHOO.widget.Module", "name": "initResizeMonitor"}, {"url": "YAHOO.widget.Slider.html#initSlider", "host": "YAHOO.widget.Slider", "name": "initSlider"}, {"url": "YAHOO.widget.SliderThumb.html#initSlider", "host": "YAHOO.widget.SliderThumb", "name": "initSlider"}, {"url": "YAHOO.widget.Calendar.html#initStyles", "host": "YAHOO.widget.Calendar", "name": "initStyles"}, {"url": "YAHOO.widget.Menu.html#_initSubTree", "host": "YAHOO.widget.Menu", "name": "_initSubTree"}, {"url": "YAHOO.widget.MenuItem.html#_initSubTree", "host": "YAHOO.widget.MenuItem", "name": "_initSubTree"}, {"url": "DataTable.html#_initTable", "host": "DataTable", "name": "_initTable"}, {"url": "YAHOO.util.DragDrop.html#initTarget", "host": "YAHOO.util.DragDrop", "name": "initTarget"}, {"url": "YAHOO.widget.Slider.html#initThumb", "host": "YAHOO.widget.Slider", "name": "initThumb"}, {"url": "ColumnEditor.html#input", "host": "ColumnEditor", "name": "input"}, {"url": "RecordSet.html#insert", "host": "RecordSet", "name": "insert"}, {"url": "YAHOO.widget.Node.html#insertAfter", "host": "YAHOO.widget.Node", "name": "insertAfter"}, {"url": "YAHOO.util.Element.html#insertBefore", "host": "YAHOO.util.Element", "name": "insertBefore"}, {"url": "YAHOO.widget.Node.html#insertBefore", "host": "YAHOO.widget.Node", "name": "insertBefore"}, {"url": "YAHOO.widget.Menu.html#insertItem", "host": "YAHOO.widget.Menu", "name": "insertItem"}, {"url": "DataTable.html#insertRows", "host": "DataTable", "name": "insertRows"}, {"url": "YAHOO.util.DragDropMgr.html#interactionInfo", "host": "YAHOO.util.DragDropMgr", "name": "interactionInfo"}, {"url": "YAHOO.util.DragDropMgr.html#INTERSECT", "host": "YAHOO.util.DragDropMgr", "name": "INTERSECT"}, {"url": "YAHOO.util.Region.html#intersect", "host": "YAHOO.util.Region", "name": "intersect"}, {"url": "YAHOO.util.Event.html#_interval", "host": "YAHOO.util.Event", "name": "_interval"}, {"url": "YAHOO.util.DragDrop.html#invalidHandleClasses", "host": "YAHOO.util.DragDrop", "name": "invalidHandleClasses"}, {"url": "YAHOO.util.DragDrop.html#invalidHandleIds", "host": "YAHOO.util.DragDrop", "name": "invalidHandleIds"}, {"url": "YAHOO.util.DragDrop.html#invalidHandleTypes", "host": "YAHOO.util.DragDrop", "name": "invalidHandleTypes"}, {"url": "YAHOO.widget.Button.html#_isActivationKey", "host": "YAHOO.widget.Button", "name": "_isActivationKey"}, {"url": "YAHOO.widget.Button.html#isActive", "host": "YAHOO.widget.Button", "name": "isActive"}, {"url": "YAHOO.util.Dom.html#isAncestor", "host": "YAHOO.util.Dom", "name": "isAncestor"}, {"url": "YAHOO.util.Anim.html#isAnimated", "host": "YAHOO.util.Anim", "name": "isAnimated"}, {"url": "YAHOO.lang.html#isArray", "host": "YAHOO.lang", "name": "isArray"}, {"url": "YAHOO.lang.html#isBoolean", "host": "YAHOO.lang", "name": "isBoolean"}, {"url": "DataSource.html#isCacheHit", "host": "DataSource", "name": "isCacheHit"}, {"url": "YAHOO.util.Connect.html#isCallInProgress", "host": "YAHOO.util.Connect", "name": "isCallInProgress"}, {"url": "YAHOO.widget.Node.html#isChildOf", "host": "YAHOO.widget.Node", "name": "isChildOf"}, {"url": "YAHOO.widget.LogReader.html#isCollapsed", "host": "YAHOO.widget.LogReader", "name": "isCollapsed"}, {"url": "YAHOO.widget.AutoComplete.html#isContainerOpen", "host": "YAHOO.widget.AutoComplete", "name": "isContainerOpen"}, {"url": "YAHOO.widget.Calendar.html#isDateOOM", "host": "YAHOO.widget.Calendar", "name": "isDateOOM"}, {"url": "YAHOO.util.DragDropMgr.html#isDragDrop", "host": "YAHOO.util.DragDropMgr", "name": "isDragDrop"}, {"url": "YAHOO.widget.Node.html#isDynamic", "host": "YAHOO.widget.Node", "name": "isDynamic"}, {"url": "DataTable.html#isEmpty", "host": "DataTable", "name": "isEmpty"}, {"url": "YAHOO.util.Connect.html#_isFileUpload", "host": "YAHOO.util.Connect", "name": "_isFileUpload"}, {"url": "YAHOO.util.Connect.html#_isFormSubmit", "host": "YAHOO.util.Connect", "name": "_isFormSubmit"}, {"url": "YAHOO.lang.html#isFunction", "host": "YAHOO.lang", "name": "isFunction"}, {"url": "YAHOO.util.DragDropMgr.html#isHandle", "host": "YAHOO.util.DragDropMgr", "name": "isHandle"}, {"url": "YAHOO.widget.SliderThumb.html#_isHoriz", "host": "YAHOO.widget.SliderThumb", "name": "_isHoriz"}, {"url": "YAHOO.util.Event.html#isIE", "host": "YAHOO.util.Event", "name": "isIE"}, {"url": "YAHOO.widget.AutoComplete.html#_isIgnoreKey", "host": "YAHOO.widget.AutoComplete", "name": "_isIgnoreKey"}, {"url": "YAHOO.util.DragDropMgr.html#isLegalTarget", "host": "YAHOO.util.DragDropMgr", "name": "isLegalTarget"}, {"url": "DataTable.html#isLoading", "host": "DataTable", "name": "isLoading"}, {"url": "YAHOO.widget.Node.html#isLoading", "host": "YAHOO.widget.Node", "name": "isLoading"}, {"url": "YAHOO.util.DragDrop.html#isLocked", "host": "YAHOO.util.DragDrop", "name": "isLocked"}, {"url": "YAHOO.util.DragDropMgr.html#isLocked", "host": "YAHOO.util.DragDropMgr", "name": "isLocked"}, {"url": "YAHOO.widget.DateMath.html#isMonthOverlapWeek", "host": "YAHOO.widget.DateMath", "name": "isMonthOverlapWeek"}, {"url": "YAHOO.widget.Logger.html#_isNewCategory", "host": "YAHOO.widget.Logger", "name": "_isNewCategory"}, {"url": "YAHOO.widget.Logger.html#_isNewSource", "host": "YAHOO.widget.Logger", "name": "_isNewSource"}, {"url": "YAHOO.lang.html#isNull", "host": "YAHOO.lang", "name": "isNull"}, {"url": "YAHOO.lang.html#isNumber", "host": "YAHOO.lang", "name": "isNumber"}, {"url": "YAHOO.lang.html#isObject", "host": "YAHOO.lang", "name": "isObject"}, {"url": "YAHOO.util.DragDropMgr.html#isOverTarget", "host": "YAHOO.util.DragDropMgr", "name": "isOverTarget"}, {"url": "YAHOO.widget.LogReader.html#isPaused", "host": "YAHOO.widget.LogReader", "name": "isPaused"}, {"url": "YAHOO.widget.Node.html#isRoot", "host": "YAHOO.widget.Node", "name": "isRoot"}, {"url": "YAHOO.util.Event.html#isSafari", "host": "YAHOO.util.Event", "name": "isSafari"}, {"url": "YAHOO.widget.Module.html#isSecure", "host": "YAHOO.widget.Module", "name": "isSecure"}, {"url": "DataTable.html#isSelected", "host": "DataTable", "name": "isSelected"}, {"url": "YAHOO.widget.Button.html#_isSplitButtonOptionKey", "host": "YAHOO.widget.Button", "name": "_isSplitButtonOptionKey"}, {"url": "YAHOO.lang.html#isString", "host": "YAHOO.lang", "name": "isString"}, {"url": "YAHOO.util.DragDrop.html#isTarget", "host": "YAHOO.util.DragDrop", "name": "isTarget"}, {"url": "YAHOO.widget.Slider.html#isTarget", "host": "YAHOO.widget.Slider", "name": "isTarget"}, {"url": "YAHOO.widget.SliderThumb.html#isTarget", "host": "YAHOO.widget.SliderThumb", "name": "isTarget"}, {"url": "YAHOO.util.DragDropMgr.html#isTypeOfDD", "host": "YAHOO.util.DragDropMgr", "name": "isTypeOfDD"}, {"url": "YAHOO.lang.html#isUndefined", "host": "YAHOO.lang", "name": "isUndefined"}, {"url": "YAHOO.widget.TVAnim.html#isValid", "host": "YAHOO.widget.TVAnim", "name": "isValid"}, {"url": "YAHOO.util.Event.html#_isValidCollection", "host": "YAHOO.util.Event", "name": "_isValidCollection"}, {"url": "YAHOO.util.DragDrop.html#isValidHandleChild", "host": "YAHOO.util.DragDrop", "name": "isValidHandleChild"}, {"url": "YAHOO.widget.DateMath.html#isYearOverlapWeek", "host": "YAHOO.widget.DateMath", "name": "isYearOverlapWeek"}, {"url": "YAHOO.widget.Menu.html#itemAddedEvent", "host": "YAHOO.widget.Menu", "name": "itemAddedEvent"}, {"url": "YAHOO.widget.AutoComplete.html#itemArrowFromEvent", "host": "YAHOO.widget.AutoComplete", "name": "itemArrowFromEvent"}, {"url": "YAHOO.widget.AutoComplete.html#itemArrowToEvent", "host": "YAHOO.widget.AutoComplete", "name": "itemArrowToEvent"}, {"url": "YAHOO.widget.Menu.html#itemData", "host": "YAHOO.widget.Menu", "name": "itemData"}, {"url": "YAHOO.widget.AutoComplete.html#itemMouseOutEvent", "host": "YAHOO.widget.AutoComplete", "name": "itemMouseOutEvent"}, {"url": "YAHOO.widget.AutoComplete.html#itemMouseOverEvent", "host": "YAHOO.widget.AutoComplete", "name": "itemMouseOverEvent"}, {"url": "YAHOO.widget.Menu.html#itemRemovedEvent", "host": "YAHOO.widget.Menu", "name": "itemRemovedEvent"}, {"url": "YAHOO.widget.AutoComplete.html#itemSelectEvent", "host": "YAHOO.widget.AutoComplete", "name": "itemSelectEvent"}, {"url": "YAHOO.widget.Menu.html#ITEM_TYPE", "host": "YAHOO.widget.Menu", "name": "ITEM_TYPE"}, {"url": "YAHOO.widget.AutoComplete.html#_jumpSelection", "host": "YAHOO.widget.AutoComplete", "name": "_jumpSelection"}, {"url": "Column.html#key", "host": "Column", "name": "key"}, {"url": "YAHOO.widget.Menu.html#keyDownEvent", "host": "YAHOO.widget.Menu", "name": "keyDownEvent"}, {"url": "YAHOO.widget.MenuItem.html#keyDownEvent", "host": "YAHOO.widget.MenuItem", "name": "keyDownEvent"}, {"url": "YAHOO.widget.Slider.html#keyIncrement", "host": "YAHOO.widget.Slider", "name": "keyIncrement"}, {"url": "YAHOO.widget.Panel.html#keylisteners", "host": "YAHOO.widget.Panel", "name": "keylisteners"}, {"url": "YAHOO.widget.Menu.html#keyPressEvent", "host": "YAHOO.widget.Menu", "name": "keyPressEvent"}, {"url": "YAHOO.widget.MenuItem.html#keyPressEvent", "host": "YAHOO.widget.MenuItem", "name": "keyPressEvent"}, {"url": "ColumnSet.html#keys", "host": "ColumnSet", "name": "keys"}, {"url": "YAHOO.widget.Menu.html#keyUpEvent", "host": "YAHOO.widget.Menu", "name": "keyUpEvent"}, {"url": "YAHOO.widget.MenuItem.html#keyUpEvent", "host": "YAHOO.widget.MenuItem", "name": "keyUpEvent"}, {"url": "YAHOO.widget.Button.html#label", "host": "YAHOO.widget.Button", "name": "label"}, {"url": "YAHOO.widget.Tab.html#label", "host": "YAHOO.widget.Tab", "name": "label"}, {"url": "YAHOO.widget.TextNode.html#label", "host": "YAHOO.widget.TextNode", "name": "label"}, {"url": "YAHOO.widget.Tab.html#labelChange", "host": "YAHOO.widget.Tab", "name": "labelChange"}, {"url": "YAHOO.widget.TreeView.html#labelClick", "host": "YAHOO.widget.TreeView", "name": "labelClick"}, {"url": "YAHOO.widget.Tab.html#labelEl", "host": "YAHOO.widget.Tab", "name": "labelEl"}, {"url": "YAHOO.widget.TextNode.html#labelElId", "host": "YAHOO.widget.TextNode", "name": "labelElId"}, {"url": "YAHOO.widget.Tab.html#LABEL_INNER_TAGNAME", "host": "YAHOO.widget.Tab", "name": "LABEL_INNER_TAGNAME"}, {"url": "YAHOO.widget.TextNode.html#labelStyle", "host": "YAHOO.widget.TextNode", "name": "labelStyle"}, {"url": "YAHOO.util.Event.html#lastError", "host": "YAHOO.util.Event", "name": "lastError"}, {"url": "YAHOO.widget.Logger.html#_lastTime", "host": "YAHOO.widget.Logger", "name": "_lastTime"}, {"url": "YAHOO.widget.LogReader.html#_lastTime", "host": "YAHOO.widget.LogReader", "name": "_lastTime"}, {"url": "YAHOO.widget.Menu.html#lazyLoad", "host": "YAHOO.widget.Menu", "name": "lazyLoad"}, {"url": "YAHOO.util.Region.html#left", "host": "YAHOO.util.Region", "name": "left"}, {"url": "YAHOO.widget.LogReader.html#left", "host": "YAHOO.widget.LogReader", "name": "left"}, {"url": "YAHOO.util.Event.html#legacyEvents", "host": "YAHOO.util.Event", "name": "legacyEvents"}, {"url": "YAHOO.util.Event.html#legacyHandlers", "host": "YAHOO.util.Event", "name": "legacyHandlers"}, {"url": "YAHOO.util.Event.html#legacyMap", "host": "YAHOO.util.Event", "name": "legacyMap"}, {"url": "RecordSet.html#_length", "host": "RecordSet", "name": "_length"}, {"url": "YAHOO_config.html#listener", "host": "YAHOO_config", "name": "listener"}, {"url": "YAHOO.env.html#listeners", "host": "YAHOO.env", "name": "listeners"}, {"url": "YAHOO.util.Event.html#listeners", "host": "YAHOO.util.Event", "name": "listeners"}, {"url": "DataSource.html#liveData", "host": "DataSource", "name": "liveData"}, {"url": "YAHOO.util.Event.html#_load", "host": "YAHOO.util.Event", "name": "_load"}, {"url": "YAHOO.widget.Node.html#loadComplete", "host": "YAHOO.widget.Node", "name": "loadComplete"}, {"url": "YAHOO.util.Event.html#loadComplete", "host": "YAHOO.util.Event", "name": "loadComplete"}, {"url": "YAHOO.widget.Tab.html#loadHandler", "host": "YAHOO.widget.Tab", "name": "loadHandler"}, {"url": "YAHOO.widget.Tab.html#LOADING_CLASSNAME", "host": "YAHOO.widget.Tab", "name": "LOADING_CLASSNAME"}, {"url": "YAHOO.widget.Tab.html#loadMethod", "host": "YAHOO.widget.Tab", "name": "loadMethod"}, {"url": "YAHOO.widget.Calendar.html#Locale", "host": "YAHOO.widget.Calendar", "name": "Locale"}, {"url": "YAHOO.widget.CalendarGroup.html#Locale", "host": "YAHOO.widget.CalendarGroup", "name": "Locale"}, {"url": "YAHOO.widget.Calendar.html#LOCALE_MONTHS", "host": "YAHOO.widget.Calendar", "name": "LOCALE_MONTHS"}, {"url": "YAHOO.widget.CalendarGroup.html#LOCALE_MONTHS", "host": "YAHOO.widget.CalendarGroup", "name": "LOCALE_MONTHS"}, {"url": "YAHOO.widget.Calendar.html#LOCALE_WEEKDAYS", "host": "YAHOO.widget.Calendar", "name": "LOCALE_WEEKDAYS"}, {"url": "YAHOO.widget.CalendarGroup.html#LOCALE_WEEKDAYS", "host": "YAHOO.widget.CalendarGroup", "name": "LOCALE_WEEKDAYS"}, {"url": "YAHOO.util.DragDropMgr.html#locationCache", "host": "YAHOO.util.DragDropMgr", "name": "locationCache"}, {"url": "YAHOO.util.DragDrop.html#lock", "host": "YAHOO.util.DragDrop", "name": "lock"}, {"url": "YAHOO.util.DragDropMgr.html#lock", "host": "YAHOO.util.DragDropMgr", "name": "lock"}, {"url": "YAHOO.widget.Slider.html#lock", "host": "YAHOO.widget.Slider", "name": "lock"}, {"url": "YAHOO.util.DragDrop.html#locked", "host": "YAHOO.util.DragDrop", "name": "locked"}, {"url": "YAHOO.util.DragDropMgr.html#locked", "host": "YAHOO.util.DragDropMgr", "name": "locked"}, {"url": "YAHOO.widget.TreeView.html#locked", "host": "YAHOO.widget.TreeView", "name": "locked"}, {"url": "YAHOO.html#log", "host": "YAHOO", "name": "log"}, {"url": "YAHOO.widget.Logger.html#log", "host": "YAHOO.widget.Logger", "name": "log"}, {"url": "YAHOO.widget.LogWriter.html#log", "host": "YAHOO.widget.LogWriter", "name": "log"}, {"url": "YAHOO.widget.Logger.html#loggerEnabled", "host": "YAHOO.widget.Logger", "name": "loggerEnabled"}, {"url": "YAHOO.widget.LogReader.html#logReaderEnabled", "host": "YAHOO.widget.LogReader", "name": "logReaderEnabled"}, {"url": "YAHOO.widget.Logger.html#logResetEvent", "host": "YAHOO.widget.Logger", "name": "logResetEvent"}, {"url": "YAHOO.util.DragDrop.html#maintainOffset", "host": "YAHOO.util.DragDrop", "name": "maintainOffset"}, {"url": "YAHOO.widget.SliderThumb.html#maintainOffset", "host": "YAHOO.widget.SliderThumb", "name": "maintainOffset"}, {"url": "DataSource.html#makeConnection", "host": "DataSource", "name": "makeConnection"}, {"url": "YAHOO.widget.Dialog.html#manualSubmitEvent", "host": "YAHOO.widget.Dialog", "name": "manualSubmitEvent"}, {"url": "YAHOO.widget.TreeView.html#maxAnim", "host": "YAHOO.widget.TreeView", "name": "maxAnim"}, {"url": "YAHOO.widget.DataSource.html#maxCacheEntries", "host": "YAHOO.widget.DataSource", "name": "maxCacheEntries"}, {"url": "DataSource.html#maxCacheEntries", "host": "DataSource", "name": "maxCacheEntries"}, {"url": "YAHOO.widget.Calendar.html#maxdate", "host": "YAHOO.widget.Calendar", "name": "maxdate"}, {"url": "YAHOO.widget.CalendarGroup.html#maxdate", "host": "YAHOO.widget.CalendarGroup", "name": "maxdate"}, {"url": "YAHOO.widget.Menu.html#maxheight", "host": "YAHOO.widget.Menu", "name": "maxheight"}, {"url": "YAHOO.widget.AutoComplete.html#_maxResultsDisplayed", "host": "YAHOO.widget.AutoComplete", "name": "_maxResultsDisplayed"}, {"url": "YAHOO.widget.AutoComplete.html#maxResultsDisplayed", "host": "YAHOO.widget.AutoComplete", "name": "maxResultsDisplayed"}, {"url": "YAHOO.widget.Logger.html#maxStackEntries", "host": "YAHOO.widget.Logger", "name": "maxStackEntries"}, {"url": "YAHOO.util.DragDrop.html#maxX", "host": "YAHOO.util.DragDrop", "name": "maxX"}, {"url": "YAHOO.util.DragDrop.html#maxY", "host": "YAHOO.util.DragDrop", "name": "maxY"}, {"url": "YAHOO.widget.Calendar.html#MD_DAY_POSITION", "host": "YAHOO.widget.Calendar", "name": "MD_DAY_POSITION"}, {"url": "YAHOO.widget.CalendarGroup.html#MD_DAY_POSITION", "host": "YAHOO.widget.CalendarGroup", "name": "MD_DAY_POSITION"}, {"url": "YAHOO.widget.Calendar.html#MD_MONTH_POSITION", "host": "YAHOO.widget.Calendar", "name": "MD_MONTH_POSITION"}, {"url": "YAHOO.widget.CalendarGroup.html#MD_MONTH_POSITION", "host": "YAHOO.widget.CalendarGroup", "name": "MD_MONTH_POSITION"}, {"url": "YAHOO.widget.Calendar.html#MDY_DAY_POSITION", "host": "YAHOO.widget.Calendar", "name": "MDY_DAY_POSITION"}, {"url": "YAHOO.widget.CalendarGroup.html#MDY_DAY_POSITION", "host": "YAHOO.widget.CalendarGroup", "name": "MDY_DAY_POSITION"}, {"url": "YAHOO.widget.Calendar.html#MDY_MONTH_POSITION", "host": "YAHOO.widget.Calendar", "name": "MDY_MONTH_POSITION"}, {"url": "YAHOO.widget.CalendarGroup.html#MDY_MONTH_POSITION", "host": "YAHOO.widget.CalendarGroup", "name": "MDY_MONTH_POSITION"}, {"url": "YAHOO.widget.Calendar.html#MDY_YEAR_POSITION", "host": "YAHOO.widget.Calendar", "name": "MDY_YEAR_POSITION"}, {"url": "YAHOO.widget.CalendarGroup.html#MDY_YEAR_POSITION", "host": "YAHOO.widget.CalendarGroup", "name": "MDY_YEAR_POSITION"}, {"url": "YAHOO.widget.LogReader.html#_memberName", "host": "YAHOO.widget.LogReader", "name": "_memberName"}, {"url": "YAHOO.widget.Button.html#_menu", "host": "YAHOO.widget.Button", "name": "_menu"}, {"url": "YAHOO.widget.Button.html#menu", "host": "YAHOO.widget.Button", "name": "menu"}, {"url": "YAHOO.widget.Button.html#MENUBUTTON_DEFAULT_TITLE", "host": "YAHOO.widget.Button", "name": "MENUBUTTON_DEFAULT_TITLE"}, {"url": "YAHOO.widget.Button.html#MENUBUTTON_MENU_VISIBLE_TITLE", "host": "YAHOO.widget.Button", "name": "MENUBUTTON_MENU_VISIBLE_TITLE"}, {"url": "YAHOO.util.Attribute.html#method", "host": "YAHOO.util.Attribute", "name": "method"}, {"url": "YAHOO.util.Anim.html#method", "host": "YAHOO.util.Anim", "name": "method"}, {"url": "YAHOO.widget.Calendar.html#mindate", "host": "YAHOO.widget.Calendar", "name": "mindate"}, {"url": "YAHOO.widget.CalendarGroup.html#mindate", "host": "YAHOO.widget.CalendarGroup", "name": "mindate"}, {"url": "YAHOO.widget.AutoComplete.html#minQueryLength", "host": "YAHOO.widget.AutoComplete", "name": "minQueryLength"}, {"url": "Column.html#_minWidth", "host": "Column", "name": "_minWidth"}, {"url": "YAHOO.util.DragDrop.html#minX", "host": "YAHOO.util.DragDrop", "name": "minX"}, {"url": "YAHOO.util.DragDrop.html#minY", "host": "YAHOO.util.DragDrop", "name": "minY"}, {"url": "YAHOO.widget.Panel.html#modal", "host": "YAHOO.widget.Panel", "name": "modal"}, {"url": "YAHOO.util.DragDropMgr.html#mode", "host": "YAHOO.util.DragDropMgr", "name": "mode"}, {"url": "YAHOO.env.html#modules", "host": "YAHOO.env", "name": "modules"}, {"url": "YAHOO.util.History.html#_modules", "host": "YAHOO.util.History", "name": "_modules"}, {"url": "YAHOO.widget.Module.html#monitorresize", "host": "YAHOO.widget.Module", "name": "monitorresize"}, {"url": "YAHOO.widget.DateMath.html#MONTH", "host": "YAHOO.widget.DateMath", "name": "MONTH"}, {"url": "YAHOO.widget.Calendar.html#MONTHS_LONG", "host": "YAHOO.widget.Calendar", "name": "MONTHS_LONG"}, {"url": "YAHOO.widget.CalendarGroup.html#MONTHS_LONG", "host": "YAHOO.widget.CalendarGroup", "name": "MONTHS_LONG"}, {"url": "YAHOO.widget.Calendar.html#MONTHS_SHORT", "host": "YAHOO.widget.Calendar", "name": "MONTHS_SHORT"}, {"url": "YAHOO.widget.CalendarGroup.html#MONTHS_SHORT", "host": "YAHOO.widget.CalendarGroup", "name": "MONTHS_SHORT"}, {"url": "YAHOO.widget.Menu.html#mouseDownEvent", "host": "YAHOO.widget.Menu", "name": "mouseDownEvent"}, {"url": "YAHOO.widget.MenuItem.html#mouseDownEvent", "host": "YAHOO.widget.MenuItem", "name": "mouseDownEvent"}, {"url": "YAHOO.widget.Menu.html#mouseOutEvent", "host": "YAHOO.widget.Menu", "name": "mouseOutEvent"}, {"url": "YAHOO.widget.MenuItem.html#mouseOutEvent", "host": "YAHOO.widget.MenuItem", "name": "mouseOutEvent"}, {"url": "YAHOO.widget.Menu.html#mouseOverEvent", "host": "YAHOO.widget.Menu", "name": "mouseOverEvent"}, {"url": "YAHOO.widget.MenuItem.html#mouseOverEvent", "host": "YAHOO.widget.MenuItem", "name": "mouseOverEvent"}, {"url": "YAHOO.widget.Menu.html#mouseUpEvent", "host": "YAHOO.widget.Menu", "name": "mouseUpEvent"}, {"url": "YAHOO.widget.MenuItem.html#mouseUpEvent", "host": "YAHOO.widget.MenuItem", "name": "mouseUpEvent"}, {"url": "YAHOO.widget.Slider.html#moveComplete", "host": "YAHOO.widget.Slider", "name": "moveComplete"}, {"url": "ColumnEditor.html#moveContainerTo", "host": "ColumnEditor", "name": "moveContainerTo"}, {"url": "YAHOO.widget.Overlay.html#moveEvent", "host": "YAHOO.widget.Overlay", "name": "moveEvent"}, {"url": "YAHOO.widget.Slider.html#moveOneTick", "host": "YAHOO.widget.Slider", "name": "moveOneTick"}, {"url": "YAHOO.widget.AutoComplete.html#_moveSelection", "host": "YAHOO.widget.AutoComplete", "name": "_moveSelection"}, {"url": "YAHOO.widget.Slider.html#moveThumb", "host": "YAHOO.widget.Slider", "name": "moveThumb"}, {"url": "YAHOO.widget.Overlay.html#moveTo", "host": "YAHOO.widget.Overlay", "name": "moveTo"}, {"url": "YAHOO.util.DragDropMgr.html#moveToEl", "host": "YAHOO.util.DragDropMgr", "name": "moveToEl"}, {"url": "YAHOO.widget.LogMsg.html#msg", "host": "YAHOO.widget.LogMsg", "name": "msg"}, {"url": "DataTable.html#MSG_EMPTY", "host": "DataTable", "name": "MSG_EMPTY"}, {"url": "DataTable.html#MSG_ERROR", "host": "DataTable", "name": "MSG_ERROR"}, {"url": "DataTable.html#MSG_LOADING", "host": "DataTable", "name": "MSG_LOADING"}, {"url": "YAHOO.util.Connect.html#_msxml_progid", "host": "YAHOO.util.Connect", "name": "_msxml_progid"}, {"url": "YAHOO.widget.Node.html#multiExpand", "host": "YAHOO.widget.Node", "name": "multiExpand"}, {"url": "YAHOO.widget.Calendar.html#MULTI_SELECT", "host": "YAHOO.widget.Calendar", "name": "MULTI_SELECT"}, {"url": "YAHOO.widget.CalendarGroup.html#MULTI_SELECT", "host": "YAHOO.widget.CalendarGroup", "name": "MULTI_SELECT"}, {"url": "YAHOO.widget.Calendar.html#MY_MONTH_POSITION", "host": "YAHOO.widget.Calendar", "name": "MY_MONTH_POSITION"}, {"url": "YAHOO.widget.CalendarGroup.html#MY_MONTH_POSITION", "host": "YAHOO.widget.CalendarGroup", "name": "MY_MONTH_POSITION"}, {"url": "YAHOO.widget.Calendar.html#MY_YEAR_POSITION", "host": "YAHOO.widget.Calendar", "name": "MY_YEAR_POSITION"}, {"url": "YAHOO.widget.CalendarGroup.html#MY_YEAR_POSITION", "host": "YAHOO.widget.CalendarGroup", "name": "MY_YEAR_POSITION"}, {"url": "YAHOO.widget.Button.html#name", "host": "YAHOO.widget.Button", "name": "name"}, {"url": "YAHOO.widget.ButtonGroup.html#name", "host": "YAHOO.widget.ButtonGroup", "name": "name"}, {"url": "YAHOO.util.Attribute.html#name", "host": "YAHOO.util.Attribute", "name": "name"}, {"url": "YAHOO.html#namespace", "host": "YAHOO", "name": "namespace"}, {"url": "YAHOO.widget.Calendar.html#NAV_ARROW_LEFT", "host": "YAHOO.widget.Calendar", "name": "NAV_ARROW_LEFT"}, {"url": "YAHOO.widget.CalendarGroup.html#NAV_ARROW_LEFT", "host": "YAHOO.widget.CalendarGroup", "name": "NAV_ARROW_LEFT"}, {"url": "YAHOO.widget.Calendar.html#NAV_ARROW_RIGHT", "host": "YAHOO.widget.Calendar", "name": "NAV_ARROW_RIGHT"}, {"url": "YAHOO.widget.CalendarGroup.html#NAV_ARROW_RIGHT", "host": "YAHOO.widget.CalendarGroup", "name": "NAV_ARROW_RIGHT"}, {"url": "YAHOO.util.History.html#navigate", "host": "YAHOO.util.History", "name": "navigate"}, {"url": "YAHOO.widget.Menu.html#_nBodyScrollId", "host": "YAHOO.widget.Menu", "name": "_nBodyScrollId"}, {"url": "ColumnSet.html#_nCount", "host": "ColumnSet", "name": "_nCount"}, {"url": "Column.html#_nCount", "host": "Column", "name": "_nCount"}, {"url": "ColumnEditor.html#_nCount", "host": "ColumnEditor", "name": "_nCount"}, {"url": "DataTable.html#_nCount", "host": "DataTable", "name": "_nCount"}, {"url": "RecordSet.html#_nCount", "host": "RecordSet", "name": "_nCount"}, {"url": "Record.html#_nCount", "host": "Record", "name": "_nCount"}, {"url": "YAHOO.widget.Menu.html#_nCurrentMouseX", "host": "YAHOO.widget.Menu", "name": "_nCurrentMouseX"}, {"url": "YAHOO.widget.AutoComplete.html#_nDelayID", "host": "YAHOO.widget.AutoComplete", "name": "_nDelayID"}, {"url": "YAHOO.widget.AutoComplete.html#_nDisplayedItems", "host": "YAHOO.widget.AutoComplete", "name": "_nDisplayedItems"}, {"url": "YAHOO.widget.LogReader.html#newestOnTop", "host": "YAHOO.widget.LogReader", "name": "newestOnTop"}, {"url": "YAHOO.widget.Logger.html#newLogEvent", "host": "YAHOO.widget.Logger", "name": "newLogEvent"}, {"url": "YAHOO.widget.Calendar.html#nextMonth", "host": "YAHOO.widget.Calendar", "name": "nextMonth"}, {"url": "YAHOO.widget.CalendarGroup.html#nextMonth", "host": "YAHOO.widget.CalendarGroup", "name": "nextMonth"}, {"url": "YAHOO.widget.Node.html#nextSibling", "host": "YAHOO.widget.Node", "name": "nextSibling"}, {"url": "YAHOO.widget.Calendar.html#nextYear", "host": "YAHOO.widget.Calendar", "name": "nextYear"}, {"url": "YAHOO.widget.CalendarGroup.html#nextYear", "host": "YAHOO.widget.CalendarGroup", "name": "nextYear"}, {"url": "YAHOO.widget.Menu.html#_nHideDelayId", "host": "YAHOO.widget.Menu", "name": "_nHideDelayId"}, {"url": "DataTable.html#_nIndex", "host": "DataTable", "name": "_nIndex"}, {"url": "RecordSet.html#_nIndex", "host": "RecordSet", "name": "_nIndex"}, {"url": "YAHOO.widget.AutoComplete.html#_nIndex", "host": "YAHOO.widget.AutoComplete", "name": "_nIndex"}, {"url": "YAHOO.widget.DataSource.html#_nIndex", "host": "YAHOO.widget.DataSource", "name": "_nIndex"}, {"url": "DataSource.html#_nIndex", "host": "DataSource", "name": "_nIndex"}, {"url": "YAHOO.widget.AutoComplete.html#_nKeyCode", "host": "YAHOO.widget.AutoComplete", "name": "_nKeyCode"}, {"url": "YAHOO.widget.Menu.html#_nMaxHeight", "host": "YAHOO.widget.Menu", "name": "_nMaxHeight"}, {"url": "YAHOO.widget.TreeView.html#_nodes", "host": "YAHOO.widget.TreeView", "name": "_nodes"}, {"url": "YAHOO.widget.Node.html#nowrap", "host": "YAHOO.widget.Node", "name": "nowrap"}, {"url": "YAHOO.widget.Menu.html#_nShowDelayId", "host": "YAHOO.widget.Menu", "name": "_nShowDelayId"}, {"url": "YAHOO.widget.Menu.html#_nSubmenuHideDelayId", "host": "YAHOO.widget.Menu", "name": "_nSubmenuHideDelayId"}, {"url": "YAHOO.util.DragDropMgr.html#numericSort", "host": "YAHOO.util.DragDropMgr", "name": "numericSort"}, {"url": "YAHOO.widget.MenuItem.html#_oAnchor", "host": "YAHOO.widget.MenuItem", "name": "_oAnchor"}, {"url": "YAHOO.widget.AutoComplete.html#_oAnim", "host": "YAHOO.widget.AutoComplete", "name": "_oAnim"}, {"url": "YAHOO.util.Subscriber.html#obj", "host": "YAHOO.util.Subscriber", "name": "obj"}, {"url": "YAHOO.util.Event.html#OBJ", "host": "YAHOO.util.Event", "name": "OBJ"}, {"url": "YAHOO.widget.MenuItem.html#_oCheckedIndicator", "host": "YAHOO.widget.MenuItem", "name": "_oCheckedIndicator"}, {"url": "DataTable.html#_oColumnSet", "host": "DataTable", "name": "_oColumnSet"}, {"url": "YAHOO.widget.DS_XHR.html#_oConn", "host": "YAHOO.widget.DS_XHR", "name": "_oConn"}, {"url": "YAHOO.widget.AutoComplete.html#_oContainer", "host": "YAHOO.widget.AutoComplete", "name": "_oContainer"}, {"url": "YAHOO.widget.AutoComplete.html#_oCurItem", "host": "YAHOO.widget.AutoComplete", "name": "_oCurItem"}, {"url": "YAHOO.widget.Calendar.html#oDomContainer", "host": "YAHOO.widget.Calendar", "name": "oDomContainer"}, {"url": "YAHOO.widget.CalendarGroup.html#oDomContainer", "host": "YAHOO.widget.CalendarGroup", "name": "oDomContainer"}, {"url": "YAHOO.widget.MenuItem.html#_oHelpTextEM", "host": "YAHOO.widget.MenuItem", "name": "_oHelpTextEM"}, {"url": "YAHOO.util.Element.html#on", "host": "YAHOO.util.Element", "name": "on"}, {"url": "YAHOO.util.Event.html#on", "host": "YAHOO.util.Event", "name": "on"}, {"url": "YAHOO.widget.Button.html#_onAppendTo", "host": "YAHOO.widget.Button", "name": "_onAppendTo"}, {"url": "YAHOO.widget.ButtonGroup.html#_onAppendTo", "host": "YAHOO.widget.ButtonGroup", "name": "_onAppendTo"}, {"url": "YAHOO.util.DragDrop.html#onAvailable", "host": "YAHOO.util.DragDrop", "name": "onAvailable"}, {"url": "YAHOO.widget.Slider.html#onAvailable", "host": "YAHOO.widget.Slider", "name": "onAvailable"}, {"url": "YAHOO.util.Event.html#onAvailable", "host": "YAHOO.util.Event", "name": "onAvailable"}, {"url": "YAHOO.util.Event.html#onAvailStack", "host": "YAHOO.util.Event", "name": "onAvailStack"}, {"url": "YAHOO.widget.Calendar.html#onBeforeDeselect", "host": "YAHOO.widget.Calendar", "name": "onBeforeDeselect"}, {"url": "YAHOO.widget.Menu.html#_onBeforeHide", "host": "YAHOO.widget.Menu", "name": "_onBeforeHide"}, {"url": "YAHOO.widget.Menu.html#_onBeforeRender", "host": "YAHOO.widget.Menu", "name": "_onBeforeRender"}, {"url": "YAHOO.widget.Calendar.html#onBeforeSelect", "host": "YAHOO.widget.Calendar", "name": "onBeforeSelect"}, {"url": "YAHOO.widget.Menu.html#_onBeforeShow", "host": "YAHOO.widget.Menu", "name": "_onBeforeShow"}, {"url": "DataTable.html#_onBlur", "host": "DataTable", "name": "_onBlur"}, {"url": "YAHOO.widget.Button.html#_onBlur", "host": "YAHOO.widget.Button", "name": "_onBlur"}, {"url": "YAHOO.widget.ButtonGroup.html#_onButtonCheckedChange", "host": "YAHOO.widget.ButtonGroup", "name": "_onButtonCheckedChange"}, {"url": "YAHOO.widget.LogReader.html#_onCategoryCreate", "host": "YAHOO.widget.LogReader", "name": "_onCategoryCreate"}, {"url": "YAHOO.widget.Slider.html#onChange", "host": "YAHOO.widget.Slider", "name": "onChange"}, {"url": "YAHOO.widget.SliderThumb.html#onChange", "host": "YAHOO.widget.SliderThumb", "name": "onChange"}, {"url": "YAHOO.widget.Calendar.html#onChangePage", "host": "YAHOO.widget.Calendar", "name": "onChangePage"}, {"url": "YAHOO.widget.LogReader.html#_onCheckCategory", "host": "YAHOO.widget.LogReader", "name": "_onCheckCategory"}, {"url": "YAHOO.widget.LogReader.html#_onCheckSource", "host": "YAHOO.widget.LogReader", "name": "_onCheckSource"}, {"url": "YAHOO.widget.Calendar.html#onClear", "host": "YAHOO.widget.Calendar", "name": "onClear"}, {"url": "DataTable.html#_onClick", "host": "DataTable", "name": "_onClick"}, {"url": "YAHOO.widget.Menu.html#_onClick", "host": "YAHOO.widget.Menu", "name": "_onClick"}, {"url": "YAHOO.widget.Menubar.html#_onClick", "host": "YAHOO.widget.Menubar", "name": "_onClick"}, {"url": "YAHOO.widget.MenuItem.html#onclick", "host": "YAHOO.widget.MenuItem", "name": "onclick"}, {"url": "YAHOO.widget.Button.html#onclick", "host": "YAHOO.widget.Button", "name": "onclick"}, {"url": "YAHOO.widget.Button.html#_onClick", "host": "YAHOO.widget.Button", "name": "_onClick"}, {"url": "YAHOO.widget.Button.html#_onclickAttributeValue", "host": "YAHOO.widget.Button", "name": "_onclickAttributeValue"}, {"url": "YAHOO.widget.LogReader.html#_onClickClearBtn", "host": "YAHOO.widget.LogReader", "name": "_onClickClearBtn"}, {"url": "YAHOO.widget.LogReader.html#_onClickCollapseBtn", "host": "YAHOO.widget.LogReader", "name": "_onClickCollapseBtn"}, {"url": "YAHOO.widget.LogReader.html#_onClickPauseBtn", "host": "YAHOO.widget.LogReader", "name": "_onClickPauseBtn"}, {"url": "YAHOO.widget.TreeView.html#onCollapse", "host": "YAHOO.widget.TreeView", "name": "onCollapse"}, {"url": "YAHOO.util.Anim.html#_onComplete", "host": "YAHOO.util.Anim", "name": "_onComplete"}, {"url": "YAHOO.util.Anim.html#onComplete", "host": "YAHOO.util.Anim", "name": "onComplete"}, {"url": "YAHOO.widget.TVFadeIn.html#onComplete", "host": "YAHOO.widget.TVFadeIn", "name": "onComplete"}, {"url": "YAHOO.widget.TVFadeOut.html#onComplete", "host": "YAHOO.widget.TVFadeOut", "name": "onComplete"}, {"url": "YAHOO.widget.AutoComplete.html#_onContainerMouseout", "host": "YAHOO.widget.AutoComplete", "name": "_onContainerMouseout"}, {"url": "YAHOO.widget.AutoComplete.html#_onContainerMouseover", "host": "YAHOO.widget.AutoComplete", "name": "_onContainerMouseover"}, {"url": "YAHOO.widget.AutoComplete.html#_onContainerResize", "host": "YAHOO.widget.AutoComplete", "name": "_onContainerResize"}, {"url": "YAHOO.widget.AutoComplete.html#_onContainerScroll", "host": "YAHOO.widget.AutoComplete", "name": "_onContainerScroll"}, {"url": "YAHOO.util.Event.html#onContentReady", "host": "YAHOO.util.Event", "name": "onContentReady"}, {"url": "YAHOO.widget.Tooltip.html#onContextMouseMove", "host": "YAHOO.widget.Tooltip", "name": "onContextMouseMove"}, {"url": "YAHOO.widget.Tooltip.html#onContextMouseOut", "host": "YAHOO.widget.Tooltip", "name": "onContextMouseOut"}, {"url": "YAHOO.widget.Tooltip.html#onContextMouseOver", "host": "YAHOO.widget.Tooltip", "name": "onContextMouseOver"}, {"url": "DataTable.html#onDataReturnAppendRows", "host": "DataTable", "name": "onDataReturnAppendRows"}, {"url": "DataTable.html#onDataReturnInsertRows", "host": "DataTable", "name": "onDataReturnInsertRows"}, {"url": "DataTable.html#onDataReturnPaginateRows", "host": "DataTable", "name": "onDataReturnPaginateRows"}, {"url": "DataTable.html#onDataReturnPopulateTable", "host": "DataTable", "name": "onDataReturnPopulateTable"}, {"url": "DataTable.html#onDataReturnReplaceRows", "host": "DataTable", "name": "onDataReturnReplaceRows"}, {"url": "YAHOO.widget.Calendar.html#onDeselect", "host": "YAHOO.widget.Calendar", "name": "onDeselect"}, {"url": "DataTable.html#_onDocumentClick", "host": "DataTable", "name": "_onDocumentClick"}, {"url": "DataTable.html#_onDocumentKeydown", "host": "DataTable", "name": "_onDocumentKeydown"}, {"url": "YAHOO.widget.Button.html#_onDocumentKeyUp", "host": "YAHOO.widget.Button", "name": "_onDocumentKeyUp"}, {"url": "YAHOO.widget.Button.html#_onDocumentMouseDown", "host": "YAHOO.widget.Button", "name": "_onDocumentMouseDown"}, {"url": "YAHOO.widget.Button.html#_onDocumentMouseUp", "host": "YAHOO.widget.Button", "name": "_onDocumentMouseUp"}, {"url": "YAHOO.widget.MenuManager.html#onDOMEvent", "host": "YAHOO.widget.MenuManager", "name": "onDOMEvent"}, {"url": "YAHOO.util.Event.html#onDOMReady", "host": "YAHOO.util.Event", "name": "onDOMReady"}, {"url": "YAHOO.widget.Module.html#onDomResize", "host": "YAHOO.widget.Module", "name": "onDomResize"}, {"url": "YAHOO.widget.Overlay.html#onDomResize", "host": "YAHOO.widget.Overlay", "name": "onDomResize"}, {"url": "YAHOO.widget.Panel.html#onDomResize", "host": "YAHOO.widget.Panel", "name": "onDomResize"}, {"url": "DataTable.html#_onDoubleclick", "host": "DataTable", "name": "_onDoubleclick"}, {"url": "WidthResizer.html#onDrag", "host": "WidthResizer", "name": "onDrag"}, {"url": "YAHOO.util.DragDrop.html#onDrag", "host": "YAHOO.util.DragDrop", "name": "onDrag"}, {"url": "YAHOO.widget.Slider.html#onDrag", "host": "YAHOO.widget.Slider", "name": "onDrag"}, {"url": "YAHOO.util.DragDrop.html#onDragDrop", "host": "YAHOO.util.DragDrop", "name": "onDragDrop"}, {"url": "YAHOO.util.DragDrop.html#onDragEnter", "host": "YAHOO.util.DragDrop", "name": "onDragEnter"}, {"url": "YAHOO.util.DragDrop.html#onDragOut", "host": "YAHOO.util.DragDrop", "name": "onDragOut"}, {"url": "YAHOO.util.DragDrop.html#onDragOver", "host": "YAHOO.util.DragDrop", "name": "onDragOver"}, {"url": "YAHOO.widget.DateMath.html#ONE_DAY_MS", "host": "YAHOO.widget.DateMath", "name": "ONE_DAY_MS"}, {"url": "DataTable.html#onEventEditCell", "host": "DataTable", "name": "onEventEditCell"}, {"url": "DataTable.html#onEventFormatCell", "host": "DataTable", "name": "onEventFormatCell"}, {"url": "DataTable.html#onEventHighlightCell", "host": "DataTable", "name": "onEventHighlightCell"}, {"url": "DataTable.html#onEventSelectCell", "host": "DataTable", "name": "onEventSelectCell"}, {"url": "DataTable.html#onEventSelectRow", "host": "DataTable", "name": "onEventSelectRow"}, {"url": "DataTable.html#onEventSortColumn", "host": "DataTable", "name": "onEventSortColumn"}, {"url": "DataTable.html#onEventUnhighlightCell", "host": "DataTable", "name": "onEventUnhighlightCell"}, {"url": "YAHOO.widget.TreeView.html#onExpand", "host": "YAHOO.widget.TreeView", "name": "onExpand"}, {"url": "YAHOO.widget.Button.html#_onFocus", "host": "YAHOO.widget.Button", "name": "_onFocus"}, {"url": "YAHOO.widget.Dialog.html#_onFormKeyDown", "host": "YAHOO.widget.Dialog", "name": "_onFormKeyDown"}, {"url": "YAHOO.widget.Button.html#onFormKeyDown", "host": "YAHOO.widget.Button", "name": "onFormKeyDown"}, {"url": "YAHOO.widget.Button.html#_onFormReset", "host": "YAHOO.widget.Button", "name": "_onFormReset"}, {"url": "YAHOO.widget.Button.html#_onFormSubmit", "host": "YAHOO.widget.Button", "name": "_onFormSubmit"}, {"url": "YAHOO.widget.AutoComplete.html#_onFormSubmit", "host": "YAHOO.widget.AutoComplete", "name": "_onFormSubmit"}, {"url": "YAHOO.widget.Menu.html#_onHide", "host": "YAHOO.widget.Menu", "name": "_onHide"}, {"url": "YAHOO.widget.AutoComplete.html#_onIMEDetected", "host": "YAHOO.widget.AutoComplete", "name": "_onIMEDetected"}, {"url": "YAHOO.widget.Menu.html#_onInit", "host": "YAHOO.widget.Menu", "name": "_onInit"}, {"url": "YAHOO.util.DragDrop.html#onInvalidDrop", "host": "YAHOO.util.DragDrop", "name": "onInvalidDrop"}, {"url": "YAHOO.widget.MenuManager.html#onItemAdded", "host": "YAHOO.widget.MenuManager", "name": "onItemAdded"}, {"url": "YAHOO.widget.MenuManager.html#onItemDestroy", "host": "YAHOO.widget.MenuManager", "name": "onItemDestroy"}, {"url": "YAHOO.widget.AutoComplete.html#_onItemMouseclick", "host": "YAHOO.widget.AutoComplete", "name": "_onItemMouseclick"}, {"url": "YAHOO.widget.AutoComplete.html#_onItemMouseout", "host": "YAHOO.widget.AutoComplete", "name": "_onItemMouseout"}, {"url": "YAHOO.widget.AutoComplete.html#_onItemMouseover", "host": "YAHOO.widget.AutoComplete", "name": "_onItemMouseover"}, {"url": "YAHOO.widget.MenuManager.html#onItemRemoved", "host": "YAHOO.widget.MenuManager", "name": "onItemRemoved"}, {"url": "DataTable.html#_onKeydown", "host": "DataTable", "name": "_onKeydown"}, {"url": "YAHOO.widget.Menu.html#_onKeyDown", "host": "YAHOO.widget.Menu", "name": "_onKeyDown"}, {"url": "YAHOO.widget.Menubar.html#_onKeyDown", "host": "YAHOO.widget.Menubar", "name": "_onKeyDown"}, {"url": "YAHOO.widget.Button.html#_onKeyDown", "host": "YAHOO.widget.Button", "name": "_onKeyDown"}, {"url": "YAHOO.widget.ButtonGroup.html#_onKeyDown", "host": "YAHOO.widget.ButtonGroup", "name": "_onKeyDown"}, {"url": "DataTable.html#_onKeypress", "host": "DataTable", "name": "_onKeypress"}, {"url": "YAHOO.widget.Menu.html#_onKeyPress", "host": "YAHOO.widget.Menu", "name": "_onKeyPress"}, {"url": "DataTable.html#_onKeyup", "host": "DataTable", "name": "_onKeyup"}, {"url": "YAHOO.widget.Button.html#_onKeyUp", "host": "YAHOO.widget.Button", "name": "_onKeyUp"}, {"url": "YAHOO.widget.TextNode.html#onLabelClick", "host": "YAHOO.widget.TextNode", "name": "onLabelClick"}, {"url": "YAHOO.util.DragDropMgr.html#_onLoad", "host": "YAHOO.util.DragDropMgr", "name": "_onLoad"}, {"url": "YAHOO.util.History.html#onLoadEvent", "host": "YAHOO.util.History", "name": "onLoadEvent"}, {"url": "YAHOO.widget.MenuManager.html#onMenuBlur", "host": "YAHOO.widget.MenuManager", "name": "onMenuBlur"}, {"url": "YAHOO.widget.Button.html#_onMenuClick", "host": "YAHOO.widget.Button", "name": "_onMenuClick"}, {"url": "YAHOO.widget.MenuManager.html#onMenuDestroy", "host": "YAHOO.widget.MenuManager", "name": "onMenuDestroy"}, {"url": "YAHOO.widget.MenuManager.html#onMenuFocus", "host": "YAHOO.widget.MenuManager", "name": "onMenuFocus"}, {"url": "YAHOO.widget.Button.html#_onMenuHide", "host": "YAHOO.widget.Button", "name": "_onMenuHide"}, {"url": "YAHOO.widget.Button.html#_onMenuItemAdded", "host": "YAHOO.widget.Button", "name": "_onMenuItemAdded"}, {"url": "YAHOO.widget.Menu.html#_onMenuItemBlur", "host": "YAHOO.widget.Menu", "name": "_onMenuItemBlur"}, {"url": "YAHOO.widget.Menu.html#_onMenuItemConfigChange", "host": "YAHOO.widget.Menu", "name": "_onMenuItemConfigChange"}, {"url": "YAHOO.widget.Menu.html#_onMenuItemFocus", "host": "YAHOO.widget.Menu", "name": "_onMenuItemFocus"}, {"url": "YAHOO.widget.Button.html#_onMenuItemSelected", "host": "YAHOO.widget.Button", "name": "_onMenuItemSelected"}, {"url": "YAHOO.widget.Button.html#_onMenuKeyDown", "host": "YAHOO.widget.Button", "name": "_onMenuKeyDown"}, {"url": "YAHOO.widget.Button.html#_onMenuRender", "host": "YAHOO.widget.Button", "name": "_onMenuRender"}, {"url": "YAHOO.widget.Button.html#_onMenuShow", "host": "YAHOO.widget.Button", "name": "_onMenuShow"}, {"url": "YAHOO.widget.MenuManager.html#onMenuVisibleConfigChange", "host": "YAHOO.widget.MenuManager", "name": "onMenuVisibleConfigChange"}, {"url": "WidthResizer.html#onMouseDown", "host": "WidthResizer", "name": "onMouseDown"}, {"url": "DataTable.html#_onMousedown", "host": "DataTable", "name": "_onMousedown"}, {"url": "YAHOO.util.DragDrop.html#onMouseDown", "host": "YAHOO.util.DragDrop", "name": "onMouseDown"}, {"url": "YAHOO.widget.Button.html#_onMouseDown", "host": "YAHOO.widget.Button", "name": "_onMouseDown"}, {"url": "YAHOO.widget.Slider.html#onMouseDown", "host": "YAHOO.widget.Slider", "name": "onMouseDown"}, {"url": "YAHOO.widget.Menu.html#_onMouseMove", "host": "YAHOO.widget.Menu", "name": "_onMouseMove"}, {"url": "DataTable.html#_onMouseout", "host": "DataTable", "name": "_onMouseout"}, {"url": "YAHOO.widget.Menu.html#_onMouseOut", "host": "YAHOO.widget.Menu", "name": "_onMouseOut"}, {"url": "YAHOO.widget.Button.html#_onMouseOut", "host": "YAHOO.widget.Button", "name": "_onMouseOut"}, {"url": "DataTable.html#_onMouseover", "host": "DataTable", "name": "_onMouseover"}, {"url": "YAHOO.widget.Menu.html#_onMouseOver", "host": "YAHOO.widget.Menu", "name": "_onMouseOver"}, {"url": "YAHOO.widget.Button.html#_onMouseOver", "host": "YAHOO.widget.Button", "name": "_onMouseOver"}, {"url": "WidthResizer.html#onMouseUp", "host": "WidthResizer", "name": "onMouseUp"}, {"url": "YAHOO.util.DragDrop.html#onMouseUp", "host": "YAHOO.util.DragDrop", "name": "onMouseUp"}, {"url": "YAHOO.widget.Button.html#_onMouseUp", "host": "YAHOO.widget.Button", "name": "_onMouseUp"}, {"url": "YAHOO.widget.LogReader.html#_onNewLog", "host": "YAHOO.widget.LogReader", "name": "_onNewLog"}, {"url": "YAHOO.widget.Button.html#_onOption", "host": "YAHOO.widget.Button", "name": "_onOption"}, {"url": "YAHOO.widget.OverlayManager.html#_onOverlayDestroy", "host": "YAHOO.widget.OverlayManager", "name": "_onOverlayDestroy"}, {"url": "YAHOO.widget.OverlayManager.html#_onOverlayElementFocus", "host": "YAHOO.widget.OverlayManager", "name": "_onOverlayElementFocus"}, {"url": "DataTable.html#_onPagerClick", "host": "DataTable", "name": "_onPagerClick"}, {"url": "DataTable.html#_onPagerSelect", "host": "DataTable", "name": "_onPagerSelect"}, {"url": "YAHOO.widget.Menu.html#_onParentMenuConfigChange", "host": "YAHOO.widget.Menu", "name": "_onParentMenuConfigChange"}, {"url": "YAHOO.widget.Menu.html#_onParentMenuRender", "host": "YAHOO.widget.Menu", "name": "_onParentMenuRender"}, {"url": "DataTable.html#_onRecordUpdate", "host": "DataTable", "name": "_onRecordUpdate"}, {"url": "YAHOO.widget.Menu.html#_onRender", "host": "YAHOO.widget.Menu", "name": "_onRender"}, {"url": "YAHOO.widget.Calendar.html#onRender", "host": "YAHOO.widget.Calendar", "name": "onRender"}, {"url": "YAHOO.widget.Calendar.html#onReset", "host": "YAHOO.widget.Calendar", "name": "onReset"}, {"url": "YAHOO.widget.LogReader.html#_onReset", "host": "YAHOO.widget.LogReader", "name": "_onReset"}, {"url": "YAHOO.util.DragDropMgr.html#_onResize", "host": "YAHOO.util.DragDropMgr", "name": "_onResize"}, {"url": "DataTable.html#_onRowDelete", "host": "DataTable", "name": "_onRowDelete"}, {"url": "YAHOO.widget.Menu.html#_onScrollTargetMouseOut", "host": "YAHOO.widget.Menu", "name": "_onScrollTargetMouseOut"}, {"url": "YAHOO.widget.Menu.html#_onScrollTargetMouseOver", "host": "YAHOO.widget.Menu", "name": "_onScrollTargetMouseOver"}, {"url": "YAHOO.widget.Calendar.html#onSelect", "host": "YAHOO.widget.Calendar", "name": "onSelect"}, {"url": "YAHOO.widget.Menu.html#_onShow", "host": "YAHOO.widget.Menu", "name": "_onShow"}, {"url": "YAHOO.widget.Slider.html#onSliderEnd", "host": "YAHOO.widget.Slider", "name": "onSliderEnd"}, {"url": "YAHOO.widget.Slider.html#onSlideStart", "host": "YAHOO.widget.Slider", "name": "onSlideStart"}, {"url": "YAHOO.widget.LogReader.html#_onSourceCreate", "host": "YAHOO.widget.LogReader", "name": "_onSourceCreate"}, {"url": "YAHOO.util.Anim.html#_onStart", "host": "YAHOO.util.Anim", "name": "_onStart"}, {"url": "YAHOO.util.Anim.html#onStart", "host": "YAHOO.util.Anim", "name": "onStart"}, {"url": "YAHOO.widget.Menu.html#_onSubmenuBeforeShow", "host": "YAHOO.widget.Menu", "name": "_onSubmenuBeforeShow"}, {"url": "YAHOO.widget.Menu.html#_onSubmenuHide", "host": "YAHOO.widget.Menu", "name": "_onSubmenuHide"}, {"url": "YAHOO.widget.Menu.html#_onSubmenuShow", "host": "YAHOO.widget.Menu", "name": "_onSubmenuShow"}, {"url": "YAHOO.widget.AutoComplete.html#_onTextboxBlur", "host": "YAHOO.widget.AutoComplete", "name": "_onTextboxBlur"}, {"url": "YAHOO.widget.AutoComplete.html#_onTextboxFocus", "host": "YAHOO.widget.AutoComplete", "name": "_onTextboxFocus"}, {"url": "YAHOO.widget.AutoComplete.html#_onTextboxKeyDown", "host": "YAHOO.widget.AutoComplete", "name": "_onTextboxKeyDown"}, {"url": "YAHOO.widget.AutoComplete.html#_onTextboxKeyPress", "host": "YAHOO.widget.AutoComplete", "name": "_onTextboxKeyPress"}, {"url": "YAHOO.widget.AutoComplete.html#_onTextboxKeyUp", "host": "YAHOO.widget.AutoComplete", "name": "_onTextboxKeyUp"}, {"url": "YAHOO.widget.Menu.html#_onTextResize", "host": "YAHOO.widget.Menu", "name": "_onTextResize"}, {"url": "YAHOO.widget.ContextMenu.html#_onTriggerClick", "host": "YAHOO.widget.ContextMenu", "name": "_onTriggerClick"}, {"url": "YAHOO.widget.ContextMenu.html#_onTriggerContextMenu", "host": "YAHOO.widget.ContextMenu", "name": "_onTriggerContextMenu"}, {"url": "YAHOO.util.Anim.html#_onTween", "host": "YAHOO.util.Anim", "name": "_onTween"}, {"url": "YAHOO.util.Anim.html#onTween", "host": "YAHOO.util.Anim", "name": "onTween"}, {"url": "YAHOO.util.DragDropMgr.html#_onUnload", "host": "YAHOO.util.DragDropMgr", "name": "_onUnload"}, {"url": "YAHOO.widget.Menu.html#_onVisibleChange", "host": "YAHOO.widget.Menu", "name": "_onVisibleChange"}, {"url": "YAHOO.widget.Menu.html#_onWidthChange", "host": "YAHOO.widget.Menu", "name": "_onWidthChange"}, {"url": "YAHOO.widget.Logger.html#_onWindowError", "host": "YAHOO.widget.Logger", "name": "_onWindowError"}, {"url": "YAHOO.widget.MenuItem.html#_oOnclickAttributeValue", "host": "YAHOO.widget.MenuItem", "name": "_oOnclickAttributeValue"}, {"url": "YAHOO.widget.Button.html#option", "host": "YAHOO.widget.Button", "name": "option"}, {"url": "YAHOO.widget.Button.html#OPTION_AREA_WIDTH", "host": "YAHOO.widget.Button", "name": "OPTION_AREA_WIDTH"}, {"url": "YAHOO.widget.Calendar.html#Options", "host": "YAHOO.widget.Calendar", "name": "Options"}, {"url": "YAHOO.widget.CalendarGroup.html#Options", "host": "YAHOO.widget.CalendarGroup", "name": "Options"}, {"url": "DataTable.html#_oRecordSet", "host": "DataTable", "name": "_oRecordSet"}, {"url": "YAHOO.widget.TabView.html#orientation", "host": "YAHOO.widget.TabView", "name": "orientation"}, {"url": "YAHOO.widget.TabView.html#orientationChange", "host": "YAHOO.widget.TabView", "name": "orientationChange"}, {"url": "YAHOO.widget.MenuItem.html#_oSubmenu", "host": "YAHOO.widget.MenuItem", "name": "_oSubmenu"}, {"url": "YAHOO.widget.MenuItem.html#_oText", "host": "YAHOO.widget.MenuItem", "name": "_oText"}, {"url": "YAHOO.widget.AutoComplete.html#_oTextbox", "host": "YAHOO.widget.AutoComplete", "name": "_oTextbox"}, {"url": "YAHOO.widget.ContextMenu.html#_oTrigger", "host": "YAHOO.widget.ContextMenu", "name": "_oTrigger"}, {"url": "YAHOO.widget.LogReader.html#outputBuffer", "host": "YAHOO.widget.LogReader", "name": "outputBuffer"}, {"url": "YAHOO.util.Config.html#outputEventQueue", "host": "YAHOO.util.Config", "name": "outputEventQueue"}, {"url": "YAHOO.widget.ContainerEffect.html#overlay", "host": "YAHOO.widget.ContainerEffect", "name": "overlay"}, {"url": "YAHOO.widget.OverlayManager.html#overlays", "host": "YAHOO.widget.OverlayManager", "name": "overlays"}, {"url": "YAHOO.util.Subscriber.html#override", "host": "YAHOO.util.Subscriber", "name": "override"}, {"url": "YAHOO.util.Config.html#owner", "host": "YAHOO.util.Config", "name": "owner"}, {"url": "YAHOO.util.Attribute.html#owner", "host": "YAHOO.util.Attribute", "name": "owner"}, {"url": "YAHOO.util.DragDrop.html#padding", "host": "YAHOO.util.DragDrop", "name": "padding"}, {"url": "DataTable.html#pageCurrent", "host": "DataTable", "name": "pageCurrent"}, {"url": "YAHOO.widget.Calendar.html#pagedate", "host": "YAHOO.widget.Calendar", "name": "pagedate"}, {"url": "YAHOO.widget.CalendarGroup.html#pagedate", "host": "YAHOO.widget.CalendarGroup", "name": "pagedate"}, {"url": "DataTable.html#pageLinksLength", "host": "DataTable", "name": "pageLinksLength"}, {"url": "DataTable.html#pageLinksStart", "host": "DataTable", "name": "pageLinksStart"}, {"url": "DataTable.html#pagers", "host": "DataTable", "name": "pagers"}, {"url": "YAHOO.widget.CalendarGroup.html#pages", "host": "YAHOO.widget.CalendarGroup", "name": "pages"}, {"url": "DataTable.html#paginateEvent", "host": "DataTable", "name": "paginateEvent"}, {"url": "DataTable.html#_paginator", "host": "DataTable", "name": "_paginator"}, {"url": "DataTable.html#paginator", "host": "DataTable", "name": "paginator"}, {"url": "DataTable.html#_paginator.containers", "host": "DataTable", "name": "_paginator.containers"}, {"url": "DataTable.html#_paginator.currentPage", "host": "DataTable", "name": "_paginator.currentPage"}, {"url": "DataTable.html#_paginator.dropdownOptions", "host": "DataTable", "name": "_paginator.dropdownOptions"}, {"url": "DataTable.html#_paginator.dropdowns", "host": "DataTable", "name": "_paginator.dropdowns"}, {"url": "DataTable.html#_paginator.links", "host": "DataTable", "name": "_paginator.links"}, {"url": "DataTable.html#paginatorOptions", "host": "DataTable", "name": "paginatorOptions"}, {"url": "DataTable.html#paginatorOptions.containers", "host": "DataTable", "name": "paginatorOptions.containers"}, {"url": "DataTable.html#paginatorOptions.currentPage", "host": "DataTable", "name": "paginatorOptions.currentPage"}, {"url": "DataTable.html#paginatorOptions.dropdownOptions", "host": "DataTable", "name": "paginatorOptions.dropdownOptions"}, {"url": "DataTable.html#paginatorOptions.pageLinks", "host": "DataTable", "name": "paginatorOptions.pageLinks"}, {"url": "DataTable.html#paginatorOptions.rowsPerPage", "host": "DataTable", "name": "paginatorOptions.rowsPerPage"}, {"url": "DataTable.html#_paginator.pageLinks", "host": "DataTable", "name": "_paginator.pageLinks"}, {"url": "DataTable.html#_paginator.rowsPerPage", "host": "DataTable", "name": "_paginator.rowsPerPage"}, {"url": "DataTable.html#_paginator.totalPages", "host": "DataTable", "name": "_paginator.totalPages"}, {"url": "Column.html#_parent", "host": "Column", "name": "_parent"}, {"url": "YAHOO.widget.Menu.html#parent", "host": "YAHOO.widget.Menu", "name": "parent"}, {"url": "YAHOO.widget.MenuItem.html#parent", "host": "YAHOO.widget.MenuItem", "name": "parent"}, {"url": "YAHOO.widget.Calendar.html#parent", "host": "YAHOO.widget.Calendar", "name": "parent"}, {"url": "YAHOO.widget.Node.html#parent", "host": "YAHOO.widget.Node", "name": "parent"}, {"url": "YAHOO.widget.Node.html#parentChange", "host": "YAHOO.widget.Node", "name": "parentChange"}, {"url": "YAHOO.widget.SliderThumb.html#parentElId", "host": "YAHOO.widget.SliderThumb", "name": "parentElId"}, {"url": "Column.html#parse", "host": "Column", "name": "parse"}, {"url": "DataSource.html#parseArrayData", "host": "DataSource", "name": "parseArrayData"}, {"url": "Column.html#parseCheckbox", "host": "Column", "name": "parseCheckbox"}, {"url": "YAHOO.util.ColorAnim.html#parseColor", "host": "YAHOO.util.ColorAnim", "name": "parseColor"}, {"url": "Column.html#parseCurrency", "host": "Column", "name": "parseCurrency"}, {"url": "Column.html#parseDate", "host": "Column", "name": "parseDate"}, {"url": "YAHOO.widget.Calendar.html#_parseDate", "host": "YAHOO.widget.Calendar", "name": "_parseDate"}, {"url": "YAHOO.widget.Calendar.html#_parseDates", "host": "YAHOO.widget.Calendar", "name": "_parseDates"}, {"url": "DataSource.html#parseJSONData", "host": "DataSource", "name": "parseJSONData"}, {"url": "Column.html#parseNumber", "host": "Column", "name": "parseNumber"}, {"url": "YAHOO.widget.Calendar.html#_parsePageDate", "host": "YAHOO.widget.Calendar", "name": "_parsePageDate"}, {"url": "Column.html#parser", "host": "Column", "name": "parser"}, {"url": "YAHOO.widget.Calendar.html#_parseRange", "host": "YAHOO.widget.Calendar", "name": "_parseRange"}, {"url": "YAHOO.widget.DS_XHR.html#parseResponse", "host": "YAHOO.widget.DS_XHR", "name": "parseResponse"}, {"url": "Column.html#parseSelect", "host": "Column", "name": "parseSelect"}, {"url": "DataSource.html#parseTextData", "host": "DataSource", "name": "parseTextData"}, {"url": "DataSource.html#parseXMLData", "host": "DataSource", "name": "parseXMLData"}, {"url": "YAHOO.widget.LogReader.html#pause", "host": "YAHOO.widget.LogReader", "name": "pause"}, {"url": "YAHOO.widget.Module.html#platform", "host": "YAHOO.widget.Module", "name": "platform"}, {"url": "YAHOO.util.DragDropMgr.html#POINT", "host": "YAHOO.util.DragDropMgr", "name": "POINT"}, {"url": "YAHOO.util.Connect.html#_poll", "host": "YAHOO.util.Connect", "name": "_poll"}, {"url": "YAHOO.util.Connect.html#_polling_interval", "host": "YAHOO.util.Connect", "name": "_polling_interval"}, {"url": "YAHOO.util.Event.html#POLL_INTERVAL", "host": "YAHOO.util.Event", "name": "POLL_INTERVAL"}, {"url": "YAHOO.util.Event.html#POLL_RETRYS", "host": "YAHOO.util.Event", "name": "POLL_RETRYS"}, {"url": "YAHOO.widget.TreeView.html#popNode", "host": "YAHOO.widget.TreeView", "name": "popNode"}, {"url": "YAHOO.widget.AutoComplete.html#_populateList", "host": "YAHOO.widget.AutoComplete", "name": "_populateList"}, {"url": "DataTable.html#populateTable", "host": "DataTable", "name": "populateTable"}, {"url": "YAHOO.widget.Menu.html#position", "host": "YAHOO.widget.Menu", "name": "position"}, {"url": "YAHOO.widget.Menubar.html#position", "host": "YAHOO.widget.Menubar", "name": "position"}, {"url": "YAHOO.widget.Dialog.html#postmethod", "host": "YAHOO.widget.Dialog", "name": "postmethod"}, {"url": "YAHOO.widget.AutoComplete.html#prehighlightClassName", "host": "YAHOO.widget.AutoComplete", "name": "prehighlightClassName"}, {"url": "YAHOO.util.DragDropMgr.html#preventDefault", "host": "YAHOO.util.DragDropMgr", "name": "preventDefault"}, {"url": "YAHOO.util.Event.html#preventDefault", "host": "YAHOO.util.Event", "name": "preventDefault"}, {"url": "YAHOO.widget.Tooltip.html#preventoverlap", "host": "YAHOO.widget.Tooltip", "name": "preventoverlap"}, {"url": "YAHOO.widget.Tooltip.html#preventOverlay", "host": "YAHOO.widget.Tooltip", "name": "preventOverlay"}, {"url": "YAHOO.widget.Calendar.html#previousMonth", "host": "YAHOO.widget.Calendar", "name": "previousMonth"}, {"url": "YAHOO.widget.CalendarGroup.html#previousMonth", "host": "YAHOO.widget.CalendarGroup", "name": "previousMonth"}, {"url": "YAHOO.widget.Node.html#previousSibling", "host": "YAHOO.widget.Node", "name": "previousSibling"}, {"url": "YAHOO.widget.Calendar.html#previousYear", "host": "YAHOO.widget.Calendar", "name": "previousYear"}, {"url": "YAHOO.widget.CalendarGroup.html#previousYear", "host": "YAHOO.widget.CalendarGroup", "name": "previousYear"}, {"url": "YAHOO.widget.SliderThumb.html#_prevVal", "host": "YAHOO.widget.SliderThumb", "name": "_prevVal"}, {"url": "YAHOO.util.DragDrop.html#primaryButtonOnly", "host": "YAHOO.util.DragDrop", "name": "primaryButtonOnly"}, {"url": "YAHOO.widget.LogReader.html#_printBuffer", "host": "YAHOO.widget.LogReader", "name": "_printBuffer"}, {"url": "YAHOO.widget.Logger.html#_printToBrowserConsole", "host": "YAHOO.widget.Logger", "name": "_printToBrowserConsole"}, {"url": "YAHOO.widget.LogReader.html#_printToConsole", "host": "YAHOO.widget.LogReader", "name": "_printToConsole"}, {"url": "YAHOO.util.Event.html#purgeElement", "host": "YAHOO.util.Event", "name": "purgeElement"}, {"url": "YAHOO.widget.AutoComplete.html#queryDelay", "host": "YAHOO.widget.AutoComplete", "name": "queryDelay"}, {"url": "YAHOO.widget.DataSource.html#queryEvent", "host": "YAHOO.widget.DataSource", "name": "queryEvent"}, {"url": "YAHOO.widget.AutoComplete.html#_queryInterval", "host": "YAHOO.widget.AutoComplete", "name": "_queryInterval"}, {"url": "YAHOO.widget.DataSource.html#queryMatchCase", "host": "YAHOO.widget.DataSource", "name": "queryMatchCase"}, {"url": "YAHOO.widget.DataSource.html#queryMatchContains", "host": "YAHOO.widget.DataSource", "name": "queryMatchContains"}, {"url": "YAHOO.widget.DataSource.html#queryMatchSubset", "host": "YAHOO.widget.DataSource", "name": "queryMatchSubset"}, {"url": "YAHOO.util.AnimMgr.html#queue", "host": "YAHOO.util.AnimMgr", "name": "queue"}, {"url": "YAHOO.util.Config.html#queueInProgress", "host": "YAHOO.util.Config", "name": "queueInProgress"}, {"url": "YAHOO.util.Config.html#queueProperty", "host": "YAHOO.util.Config", "name": "queueProperty"}, {"url": "YAHOO.widget.Button.html#RADIO_CHECKED_TITLE", "host": "YAHOO.widget.Button", "name": "RADIO_CHECKED_TITLE"}, {"url": "DataTable.html#radioClickEvent", "host": "DataTable", "name": "radioClickEvent"}, {"url": "YAHOO.widget.Button.html#RADIO_DEFAULT_TITLE", "host": "YAHOO.widget.Button", "name": "RADIO_DEFAULT_TITLE"}, {"url": "YAHOO.util.Attribute.html#readOnly", "host": "YAHOO.util.Attribute", "name": "readOnly"}, {"url": "YAHOO.util.Event.html#_ready", "host": "YAHOO.util.Event", "name": "_ready"}, {"url": "DataTable.html#recordSetUpdateEvent", "host": "DataTable", "name": "recordSetUpdateEvent"}, {"url": "RecordSet.html#recordUpdateEvent", "host": "RecordSet", "name": "recordUpdateEvent"}, {"url": "YAHOO.util.Config.html#refireEvent", "host": "YAHOO.util.Config", "name": "refireEvent"}, {"url": "YAHOO.util.Config.html#refresh", "host": "YAHOO.util.Config", "name": "refresh"}, {"url": "YAHOO.util.Attribute.html#refresh", "host": "YAHOO.util.Attribute", "name": "refresh"}, {"url": "YAHOO.util.AttributeProvider.html#refresh", "host": "YAHOO.util.AttributeProvider", "name": "refresh"}, {"url": "YAHOO.widget.Node.html#refresh", "host": "YAHOO.widget.Node", "name": "refresh"}, {"url": "YAHOO.util.DragDropMgr.html#refreshCache", "host": "YAHOO.util.DragDropMgr", "name": "refreshCache"}, {"url": "YAHOO.widget.Calendar.html#refreshLocale", "host": "YAHOO.widget.Calendar", "name": "refreshLocale"}, {"url": "DataTable.html#refreshTable", "host": "DataTable", "name": "refreshTable"}, {"url": "YAHOO.util.Event.html#regCE", "host": "YAHOO.util.Event", "name": "regCE"}, {"url": "YAHOO.util.DragDropMgr.html#regDragDrop", "host": "YAHOO.util.DragDropMgr", "name": "regDragDrop"}, {"url": "YAHOO.util.DragDropMgr.html#regHandle", "host": "YAHOO.util.DragDropMgr", "name": "regHandle"}, {"url": "YAHOO.widget.OverlayManager.html#register", "host": "YAHOO.widget.OverlayManager", "name": "register"}, {"url": "YAHOO.html#register", "host": "YAHOO", "name": "register"}, {"url": "YAHOO.util.AttributeProvider.html#register", "host": "YAHOO.util.AttributeProvider", "name": "register"}, {"url": "YAHOO.util.History.html#register", "host": "YAHOO.util.History", "name": "register"}, {"url": "YAHOO.widget.Panel.html#registerDragDrop", "host": "YAHOO.widget.Panel", "name": "registerDragDrop"}, {"url": "YAHOO.util.AnimMgr.html#registerElement", "host": "YAHOO.util.AnimMgr", "name": "registerElement"}, {"url": "YAHOO.widget.Dialog.html#registerForm", "host": "YAHOO.widget.Dialog", "name": "registerForm"}, {"url": "YAHOO.widget.SimpleDialog.html#registerForm", "host": "YAHOO.widget.SimpleDialog", "name": "registerForm"}, {"url": "YAHOO.util.Element.html#_registerHTMLAttr", "host": "YAHOO.util.Element", "name": "_registerHTMLAttr"}, {"url": "YAHOO.widget.TreeView.html#regNode", "host": "YAHOO.widget.TreeView", "name": "regNode"}, {"url": "YAHOO.util.Connect.html#releaseObject", "host": "YAHOO.util.Connect", "name": "releaseObject"}, {"url": "YAHOO.widget.OverlayManager.html#remove", "host": "YAHOO.widget.OverlayManager", "name": "remove"}, {"url": "YAHOO.util.DragDropMgr.html#_remove", "host": "YAHOO.util.DragDropMgr", "name": "_remove"}, {"url": "YAHOO.widget.ButtonGroup.html#removeButton", "host": "YAHOO.widget.ButtonGroup", "name": "removeButton"}, {"url": "YAHOO.util.Element.html#removeChild", "host": "YAHOO.util.Element", "name": "removeChild"}, {"url": "YAHOO.widget.TreeView.html#removeChildren", "host": "YAHOO.widget.TreeView", "name": "removeChildren"}, {"url": "YAHOO.util.Dom.html#removeClass", "host": "YAHOO.util.Dom", "name": "removeClass"}, {"url": "YAHOO.util.Element.html#removeClass", "host": "YAHOO.util.Element", "name": "removeClass"}, {"url": "YAHOO.util.DragDropMgr.html#removeDDFromGroup", "host": "YAHOO.util.DragDropMgr", "name": "removeDDFromGroup"}, {"url": "YAHOO.widget.ContextMenu.html#_removeEventHandlers", "host": "YAHOO.widget.ContextMenu", "name": "_removeEventHandlers"}, {"url": "YAHOO.widget.Tooltip.html#_removeEventListeners", "host": "YAHOO.widget.Tooltip", "name": "_removeEventListeners"}, {"url": "YAHOO.util.DragDrop.html#removeFromGroup", "host": "YAHOO.util.DragDrop", "name": "removeFromGroup"}, {"url": "YAHOO.util.DragDrop.html#removeInvalidHandleClass", "host": "YAHOO.util.DragDrop", "name": "removeInvalidHandleClass"}, {"url": "YAHOO.util.DragDrop.html#removeInvalidHandleId", "host": "YAHOO.util.DragDrop", "name": "removeInvalidHandleId"}, {"url": "YAHOO.util.DragDrop.html#removeInvalidHandleType", "host": "YAHOO.util.DragDrop", "name": "removeInvalidHandleType"}, {"url": "YAHOO.widget.Menu.html#removeItem", "host": "YAHOO.widget.Menu", "name": "removeItem"}, {"url": "YAHOO.widget.MenuManager.html#removeItem", "host": "YAHOO.widget.MenuManager", "name": "removeItem"}, {"url": "YAHOO.widget.Menu.html#_removeItemFromGroupByIndex", "host": "YAHOO.widget.Menu", "name": "_removeItemFromGroupByIndex"}, {"url": "YAHOO.widget.Menu.html#_removeItemFromGroupByValue", "host": "YAHOO.widget.Menu", "name": "_removeItemFromGroupByValue"}, {"url": "YAHOO.util.Element.html#removeListener", "host": "YAHOO.util.Element", "name": "removeListener"}, {"url": "YAHOO.util.Event.html#removeListener", "host": "YAHOO.util.Event", "name": "removeListener"}, {"url": "YAHOO.widget.Panel.html#removeMask", "host": "YAHOO.widget.Panel", "name": "removeMask"}, {"url": "YAHOO.widget.MenuManager.html#removeMenu", "host": "YAHOO.widget.MenuManager", "name": "removeMenu"}, {"url": "YAHOO.widget.TreeView.html#removeNode", "host": "YAHOO.widget.TreeView", "name": "removeNode"}, {"url": "YAHOO.widget.TabView.html#removeTab", "host": "YAHOO.widget.TabView", "name": "removeTab"}, {"url": "YAHOO.widget.Module.html#render", "host": "YAHOO.widget.Module", "name": "render"}, {"url": "YAHOO.widget.Panel.html#render", "host": "YAHOO.widget.Panel", "name": "render"}, {"url": "YAHOO.widget.Calendar.html#render", "host": "YAHOO.widget.Calendar", "name": "render"}, {"url": "YAHOO.widget.CalendarGroup.html#render", "host": "YAHOO.widget.CalendarGroup", "name": "render"}, {"url": "YAHOO.widget.Calendar.html#renderBody", "host": "YAHOO.widget.Calendar", "name": "renderBody"}, {"url": "YAHOO.widget.Calendar.html#renderBodyCellRestricted", "host": "YAHOO.widget.Calendar", "name": "renderBodyCellRestricted"}, {"url": "YAHOO.widget.Calendar.html#renderCellDefault", "host": "YAHOO.widget.Calendar", "name": "renderCellDefault"}, {"url": "YAHOO.widget.Calendar.html#renderCellNotThisMonth", "host": "YAHOO.widget.Calendar", "name": "renderCellNotThisMonth"}, {"url": "YAHOO.widget.Calendar.html#renderCellStyleHighlight1", "host": "YAHOO.widget.Calendar", "name": "renderCellStyleHighlight1"}, {"url": "YAHOO.widget.Calendar.html#renderCellStyleHighlight2", "host": "YAHOO.widget.Calendar", "name": "renderCellStyleHighlight2"}, {"url": "YAHOO.widget.Calendar.html#renderCellStyleHighlight3", "host": "YAHOO.widget.Calendar", "name": "renderCellStyleHighlight3"}, {"url": "YAHOO.widget.Calendar.html#renderCellStyleHighlight4", "host": "YAHOO.widget.Calendar", "name": "renderCellStyleHighlight4"}, {"url": "YAHOO.widget.Calendar.html#renderCellStyleSelected", "host": "YAHOO.widget.Calendar", "name": "renderCellStyleSelected"}, {"url": "YAHOO.widget.Calendar.html#renderCellStyleToday", "host": "YAHOO.widget.Calendar", "name": "renderCellStyleToday"}, {"url": "YAHOO.widget.Node.html#renderChildren", "host": "YAHOO.widget.Node", "name": "renderChildren"}, {"url": "YAHOO.widget.Module.html#renderEvent", "host": "YAHOO.widget.Module", "name": "renderEvent"}, {"url": "YAHOO.widget.Calendar.html#renderEvent", "host": "YAHOO.widget.Calendar", "name": "renderEvent"}, {"url": "YAHOO.widget.CalendarGroup.html#renderEvent", "host": "YAHOO.widget.CalendarGroup", "name": "renderEvent"}, {"url": "YAHOO.widget.Calendar.html#renderFooter", "host": "YAHOO.widget.Calendar", "name": "renderFooter"}, {"url": "YAHOO.widget.CalendarGroup.html#renderFooter", "host": "YAHOO.widget.CalendarGroup", "name": "renderFooter"}, {"url": "YAHOO.widget.Calendar.html#renderHeader", "host": "YAHOO.widget.Calendar", "name": "renderHeader"}, {"url": "YAHOO.widget.CalendarGroup.html#renderHeader", "host": "YAHOO.widget.CalendarGroup", "name": "renderHeader"}, {"url": "YAHOO.widget.Node.html#renderHidden", "host": "YAHOO.widget.Node", "name": "renderHidden"}, {"url": "YAHOO.widget.Calendar.html#renderOutOfBoundsDate", "host": "YAHOO.widget.Calendar", "name": "renderOutOfBoundsDate"}, {"url": "YAHOO.widget.Calendar.html#renderRowFooter", "host": "YAHOO.widget.Calendar", "name": "renderRowFooter"}, {"url": "YAHOO.widget.Calendar.html#renderRowHeader", "host": "YAHOO.widget.Calendar", "name": "renderRowHeader"}, {"url": "YAHOO.widget.Calendar.html#_renderStack", "host": "YAHOO.widget.Calendar", "name": "_renderStack"}, {"url": "YAHOO.widget.Calendar.html#renderStack", "host": "YAHOO.widget.Calendar", "name": "renderStack"}, {"url": "RecordSet.html#replace", "host": "RecordSet", "name": "replace"}, {"url": "YAHOO.util.Element.html#replaceChild", "host": "YAHOO.util.Element", "name": "replaceChild"}, {"url": "YAHOO.util.Dom.html#replaceClass", "host": "YAHOO.util.Dom", "name": "replaceClass"}, {"url": "YAHOO.util.Element.html#replaceClass", "host": "YAHOO.util.Element", "name": "replaceClass"}, {"url": "DataSource.html#requestEvent", "host": "DataSource", "name": "requestEvent"}, {"url": "RecordSet.html#reset", "host": "RecordSet", "name": "reset"}, {"url": "YAHOO.widget.Calendar.html#reset", "host": "YAHOO.widget.Calendar", "name": "reset"}, {"url": "YAHOO.widget.CalendarGroup.html#reset", "host": "YAHOO.widget.CalendarGroup", "name": "reset"}, {"url": "YAHOO.widget.Logger.html#reset", "host": "YAHOO.widget.Logger", "name": "reset"}, {"url": "YAHOO.util.AttributeProvider.html#resetAttributeConfig", "host": "YAHOO.util.AttributeProvider", "name": "resetAttributeConfig"}, {"url": "YAHOO.util.Attribute.html#resetConfig", "host": "YAHOO.util.Attribute", "name": "resetConfig"}, {"url": "YAHOO.util.DragDrop.html#resetConstraints", "host": "YAHOO.util.DragDrop", "name": "resetConstraints"}, {"url": "YAHOO.util.Connect.html#resetDefaultHeaders", "host": "YAHOO.util.Connect", "name": "resetDefaultHeaders"}, {"url": "YAHOO.widget.Calendar.html#resetEvent", "host": "YAHOO.widget.Calendar", "name": "resetEvent"}, {"url": "YAHOO.widget.CalendarGroup.html#resetEvent", "host": "YAHOO.widget.CalendarGroup", "name": "resetEvent"}, {"url": "YAHOO.util.Connect.html#resetFormState", "host": "YAHOO.util.Connect", "name": "resetFormState"}, {"url": "YAHOO.util.Config.html#resetProperty", "host": "YAHOO.util.Config", "name": "resetProperty"}, {"url": "YAHOO.widget.Calendar.html#resetRenderers", "host": "YAHOO.widget.Calendar", "name": "resetRenderers"}, {"url": "YAHOO.util.Attribute.html#resetValue", "host": "YAHOO.util.Attribute", "name": "resetValue"}, {"url": "YAHOO.util.AttributeProvider.html#resetValue", "host": "YAHOO.util.AttributeProvider", "name": "resetValue"}, {"url": "Column.html#resizeable", "host": "Column", "name": "resizeable"}, {"url": "YAHOO.util.DDProxy.html#resizeFrame", "host": "YAHOO.util.DDProxy", "name": "resizeFrame"}, {"url": "YAHOO.util.DDProxy.html#_resizeProxy", "host": "YAHOO.util.DDProxy", "name": "_resizeProxy"}, {"url": "YAHOO.util.Event.html#resolveTextNode", "host": "YAHOO.util.Event", "name": "resolveTextNode"}, {"url": "DataSource.html#responseCacheEvent", "host": "DataSource", "name": "responseCacheEvent"}, {"url": "DataSource.html#responseEvent", "host": "DataSource", "name": "responseEvent"}, {"url": "DataSource.html#responseParseEvent", "host": "DataSource", "name": "responseParseEvent"}, {"url": "DataSource.html#responseSchema", "host": "DataSource", "name": "responseSchema"}, {"url": "YAHOO.widget.DS_XHR.html#responseStripAfter", "host": "YAHOO.widget.DS_XHR", "name": "responseStripAfter"}, {"url": "YAHOO.widget.DS_XHR.html#responseType", "host": "YAHOO.widget.DS_XHR", "name": "responseType"}, {"url": "DataSource.html#responseType", "host": "DataSource", "name": "responseType"}, {"url": "YAHOO.widget.LogReader.html#resume", "host": "YAHOO.widget.LogReader", "name": "resume"}, {"url": "YAHOO.util.Event.html#retryCount", "host": "YAHOO.util.Event", "name": "retryCount"}, {"url": "YAHOO.util.Region.html#right", "host": "YAHOO.util.Region", "name": "right"}, {"url": "YAHOO.widget.LogReader.html#right", "host": "YAHOO.widget.LogReader", "name": "right"}, {"url": "DataTable.html#rowAppendEvent", "host": "DataTable", "name": "rowAppendEvent"}, {"url": "DataTable.html#rowDeleteEvent", "host": "DataTable", "name": "rowDeleteEvent"}, {"url": "DataTable.html#rowSelectEvent", "host": "DataTable", "name": "rowSelectEvent"}, {"url": "DataTable.html#rowSingleSelect", "host": "DataTable", "name": "rowSingleSelect"}, {"url": "Column.html#_rowspan", "host": "Column", "name": "_rowspan"}, {"url": "DataTable.html#rowsPerPage", "host": "DataTable", "name": "rowsPerPage"}, {"url": "DataTable.html#rowsPerPageDropdown", "host": "DataTable", "name": "rowsPerPageDropdown"}, {"url": "DataTable.html#rowUnselectEvent", "host": "DataTable", "name": "rowUnselectEvent"}, {"url": "DataTable.html#rowUpdateEvent", "host": "DataTable", "name": "rowUpdateEvent"}, {"url": "YAHOO.util.AnimMgr.html#run", "host": "YAHOO.util.AnimMgr", "name": "run"}, {"url": "DataTable.html#saveEditorData", "host": "DataTable", "name": "saveEditorData"}, {"url": "YAHOO.widget.Menu.html#_sClassName", "host": "YAHOO.widget.Menu", "name": "_sClassName"}, {"url": "YAHOO.widget.MenuItem.html#_sClassName", "host": "YAHOO.widget.MenuItem", "name": "_sClassName"}, {"url": "YAHOO.util.CustomEvent.html#scope", "host": "YAHOO.util.CustomEvent", "name": "scope"}, {"url": "YAHOO.widget.DS_XHR.html#scriptQueryAppend", "host": "YAHOO.widget.DS_XHR", "name": "scriptQueryAppend"}, {"url": "YAHOO.widget.DS_XHR.html#scriptQueryParam", "host": "YAHOO.widget.DS_XHR", "name": "scriptQueryParam"}, {"url": "YAHOO.widget.DS_XHR.html#scriptURI", "host": "YAHOO.widget.DS_XHR", "name": "scriptURI"}, {"url": "YAHOO.util.DD.html#scroll", "host": "YAHOO.util.DD", "name": "scroll"}, {"url": "YAHOO.widget.SliderThumb.html#scroll", "host": "YAHOO.widget.SliderThumb", "name": "scroll"}, {"url": "DataTable.html#scrollable", "host": "DataTable", "name": "scrollable"}, {"url": "YAHOO.widget.AutoComplete.html#_sCurQuery", "host": "YAHOO.widget.AutoComplete", "name": "_sCurQuery"}, {"url": "DataTable.html#_select", "host": "DataTable", "name": "_select"}, {"url": "DataTable.html#select", "host": "DataTable", "name": "select"}, {"url": "YAHOO.widget.Calendar.html#select", "host": "YAHOO.widget.Calendar", "name": "select"}, {"url": "YAHOO.widget.CalendarGroup.html#select", "host": "YAHOO.widget.CalendarGroup", "name": "select"}, {"url": "YAHOO.widget.Calendar.html#selectCell", "host": "YAHOO.widget.Calendar", "name": "selectCell"}, {"url": "YAHOO.widget.CalendarGroup.html#selectCell", "host": "YAHOO.widget.CalendarGroup", "name": "selectCell"}, {"url": "YAHOO.widget.MenuItem.html#selected", "host": "YAHOO.widget.MenuItem", "name": "selected"}, {"url": "YAHOO.widget.Calendar.html#selected", "host": "YAHOO.widget.Calendar", "name": "selected"}, {"url": "YAHOO.widget.CalendarGroup.html#selected", "host": "YAHOO.widget.CalendarGroup", "name": "selected"}, {"url": "YAHOO.widget.Calendar.html#_selectedDates", "host": "YAHOO.widget.Calendar", "name": "_selectedDates"}, {"url": "YAHOO.widget.Button.html#selectedMenuItem", "host": "YAHOO.widget.Button", "name": "selectedMenuItem"}, {"url": "DataTable.html#selectEvent", "host": "DataTable", "name": "selectEvent"}, {"url": "YAHOO.widget.Calendar.html#selectEvent", "host": "YAHOO.widget.Calendar", "name": "selectEvent"}, {"url": "YAHOO.widget.CalendarGroup.html#selectEvent", "host": "YAHOO.widget.CalendarGroup", "name": "selectEvent"}, {"url": "YAHOO.widget.AutoComplete.html#selectionEnforceEvent", "host": "YAHOO.widget.AutoComplete", "name": "selectionEnforceEvent"}, {"url": "YAHOO.widget.AutoComplete.html#_selectItem", "host": "YAHOO.widget.AutoComplete", "name": "_selectItem"}, {"url": "DataTable.html#selectRow", "host": "DataTable", "name": "selectRow"}, {"url": "DataTable.html#_selectRowAnchorId", "host": "DataTable", "name": "_selectRowAnchorId"}, {"url": "YAHOO.widget.AutoComplete.html#_selectText", "host": "YAHOO.widget.AutoComplete", "name": "_selectText"}, {"url": "YAHOO.widget.AutoComplete.html#_sendQuery", "host": "YAHOO.widget.AutoComplete", "name": "_sendQuery"}, {"url": "YAHOO.widget.AutoComplete.html#sendQuery", "host": "YAHOO.widget.AutoComplete", "name": "sendQuery"}, {"url": "DataSource.html#sendRequest", "host": "DataSource", "name": "sendRequest"}, {"url": "YAHOO.util.AttributeProvider.html#set", "host": "YAHOO.util.AttributeProvider", "name": "set"}, {"url": "YAHOO.widget.Button.html#_setAccessKey", "host": "YAHOO.widget.Button", "name": "_setAccessKey"}, {"url": "YAHOO.util.Anim.html#setAttribute", "host": "YAHOO.util.Anim", "name": "setAttribute"}, {"url": "YAHOO.util.AttributeProvider.html#setAttributeConfig", "host": "YAHOO.util.AttributeProvider", "name": "setAttributeConfig"}, {"url": "YAHOO.widget.Button.html#setAttributeFromDOMAttribute", "host": "YAHOO.widget.Button", "name": "setAttributeFromDOMAttribute"}, {"url": "YAHOO.util.AttributeProvider.html#setAttributes", "host": "YAHOO.util.AttributeProvider", "name": "setAttributes"}, {"url": "YAHOO.widget.Button.html#setAttributesFromSrcElement", "host": "YAHOO.widget.Button", "name": "setAttributesFromSrcElement"}, {"url": "YAHOO.widget.Module.html#setBody", "host": "YAHOO.widget.Module", "name": "setBody"}, {"url": "YAHOO.widget.AutoComplete.html#setBody", "host": "YAHOO.widget.AutoComplete", "name": "setBody"}, {"url": "YAHOO.widget.Button.html#_setChecked", "host": "YAHOO.widget.Button", "name": "_setChecked"}, {"url": "YAHOO.widget.CalendarGroup.html#setChildFunction", "host": "YAHOO.widget.CalendarGroup", "name": "setChildFunction"}, {"url": "YAHOO.widget.TreeView.html#setCollapseAnim", "host": "YAHOO.widget.TreeView", "name": "setCollapseAnim"}, {"url": "YAHOO.util.Connect.html#setDefaultPostHeader", "host": "YAHOO.util.Connect", "name": "setDefaultPostHeader"}, {"url": "YAHOO.util.Connect.html#setDefaultXhrHeader", "host": "YAHOO.util.Connect", "name": "setDefaultXhrHeader"}, {"url": "YAHOO.util.DD.html#setDelta", "host": "YAHOO.util.DD", "name": "setDelta"}, {"url": "YAHOO.widget.Button.html#_setDisabled", "host": "YAHOO.widget.Button", "name": "_setDisabled"}, {"url": "YAHOO.widget.ButtonGroup.html#_setDisabled", "host": "YAHOO.widget.ButtonGroup", "name": "_setDisabled"}, {"url": "YAHOO.util.DragDrop.html#setDragElId", "host": "YAHOO.util.DragDrop", "name": "setDragElId"}, {"url": "YAHOO.util.DD.html#setDragElPos", "host": "YAHOO.util.DD", "name": "setDragElPos"}, {"url": "YAHOO.widget.Node.html#setDynamicLoad", "host": "YAHOO.widget.Node", "name": "setDynamicLoad"}, {"url": "YAHOO.widget.TreeView.html#setDynamicLoad", "host": "YAHOO.widget.TreeView", "name": "setDynamicLoad"}, {"url": "YAHOO.widget.TreeView.html#setExpandAnim", "host": "YAHOO.widget.TreeView", "name": "setExpandAnim"}, {"url": "DataTable.html#_setFirstRow", "host": "DataTable", "name": "_setFirstRow"}, {"url": "YAHOO.widget.Module.html#setFooter", "host": "YAHOO.widget.Module", "name": "setFooter"}, {"url": "YAHOO.widget.AutoComplete.html#setFooter", "host": "YAHOO.widget.AutoComplete", "name": "setFooter"}, {"url": "YAHOO.util.Connect.html#setForm", "host": "YAHOO.util.Connect", "name": "setForm"}, {"url": "YAHOO.widget.Button.html#setFormElementProperties", "host": "YAHOO.widget.Button", "name": "setFormElementProperties"}, {"url": "YAHOO.util.DragDrop.html#setHandleElId", "host": "YAHOO.util.DragDrop", "name": "setHandleElId"}, {"url": "YAHOO.widget.Module.html#setHeader", "host": "YAHOO.widget.Module", "name": "setHeader"}, {"url": "YAHOO.widget.AutoComplete.html#setHeader", "host": "YAHOO.widget.AutoComplete", "name": "setHeader"}, {"url": "YAHOO.util.Connect.html#setHeader", "host": "YAHOO.util.Connect", "name": "setHeader"}, {"url": "YAHOO.widget.Button.html#_setHref", "host": "YAHOO.widget.Button", "name": "_setHref"}, {"url": "YAHOO.widget.Menu.html#setInitialFocus", "host": "YAHOO.widget.Menu", "name": "setInitialFocus"}, {"url": "YAHOO.util.DragDrop.html#setInitialPosition", "host": "YAHOO.util.DragDrop", "name": "setInitialPosition"}, {"url": "YAHOO.widget.Menu.html#setInitialSelection", "host": "YAHOO.widget.Menu", "name": "setInitialSelection"}, {"url": "YAHOO.widget.Menu.html#setItemGroupTitle", "host": "YAHOO.widget.Menu", "name": "setItemGroupTitle"}, {"url": "YAHOO.widget.Button.html#_setLabel", "host": "YAHOO.widget.Button", "name": "_setLabel"}, {"url": "DataTable.html#_setLastRow", "host": "DataTable", "name": "_setLastRow"}, {"url": "YAHOO.widget.Menu.html#_setMaxHeight", "host": "YAHOO.widget.Menu", "name": "_setMaxHeight"}, {"url": "YAHOO.widget.Button.html#_setMenu", "host": "YAHOO.widget.Button", "name": "_setMenu"}, {"url": "YAHOO.widget.Calendar.html#setMonth", "host": "YAHOO.widget.Calendar", "name": "setMonth"}, {"url": "YAHOO.widget.CalendarGroup.html#setMonth", "host": "YAHOO.widget.CalendarGroup", "name": "setMonth"}, {"url": "YAHOO.widget.CalendarGroup.html#_setMonthOnDate", "host": "YAHOO.widget.CalendarGroup", "name": "_setMonthOnDate"}, {"url": "YAHOO.widget.Button.html#_setOnClick", "host": "YAHOO.widget.Button", "name": "_setOnClick"}, {"url": "YAHOO.util.DragDrop.html#setOuterHandleElId", "host": "YAHOO.util.DragDrop", "name": "setOuterHandleElId"}, {"url": "YAHOO.util.DragDrop.html#setPadding", "host": "YAHOO.util.DragDrop", "name": "setPadding"}, {"url": "YAHOO.util.Connect.html#setPollingInterval", "host": "YAHOO.util.Connect", "name": "setPollingInterval"}, {"url": "YAHOO.util.Connect.html#setProgId", "host": "YAHOO.util.Connect", "name": "setProgId"}, {"url": "YAHOO.util.Config.html#setProperty", "host": "YAHOO.util.Config", "name": "setProperty"}, {"url": "YAHOO.widget.Slider.html#setRegionValue", "host": "YAHOO.widget.Slider", "name": "setRegionValue"}, {"url": "DataTable.html#_setRowStripes", "host": "DataTable", "name": "_setRowStripes"}, {"url": "YAHOO.util.Anim.html#setRuntimeAttribute", "host": "YAHOO.util.Anim", "name": "setRuntimeAttribute"}, {"url": "YAHOO.widget.LogWriter.html#setSource", "host": "YAHOO.widget.LogWriter", "name": "setSource"}, {"url": "YAHOO.util.DragDrop.html#setStartPosition", "host": "YAHOO.util.DragDrop", "name": "setStartPosition"}, {"url": "YAHOO.widget.Slider.html#setStartSliderState", "host": "YAHOO.widget.Slider", "name": "setStartSliderState"}, {"url": "YAHOO.util.Dom.html#setStyle", "host": "YAHOO.util.Dom", "name": "setStyle"}, {"url": "YAHOO.util.Element.html#setStyle", "host": "YAHOO.util.Element", "name": "setStyle"}, {"url": "YAHOO.widget.Button.html#_setTabIndex", "host": "YAHOO.widget.Button", "name": "_setTabIndex"}, {"url": "YAHOO.widget.Button.html#_setTarget", "host": "YAHOO.widget.Button", "name": "_setTarget"}, {"url": "YAHOO.widget.Slider.html#setThumbCenterPoint", "host": "YAHOO.widget.Slider", "name": "setThumbCenterPoint"}, {"url": "YAHOO.widget.Button.html#_setTitle", "host": "YAHOO.widget.Button", "name": "_setTitle"}, {"url": "YAHOO.widget.LogReader.html#setTitle", "host": "YAHOO.widget.LogReader", "name": "setTitle"}, {"url": "YAHOO.widget.Button.html#_setType", "host": "YAHOO.widget.Button", "name": "_setType"}, {"url": "YAHOO.widget.TreeView.html#setUpLabel", "host": "YAHOO.widget.TreeView", "name": "setUpLabel"}, {"url": "YAHOO.util.Attribute.html#setValue", "host": "YAHOO.util.Attribute", "name": "setValue"}, {"url": "YAHOO.widget.Slider.html#setValue", "host": "YAHOO.widget.Slider", "name": "setValue"}, {"url": "YAHOO.widget.Menu.html#_setWidth", "host": "YAHOO.widget.Menu", "name": "_setWidth"}, {"url": "YAHOO.util.Dom.html#setX", "host": "YAHOO.util.Dom", "name": "setX"}, {"url": "YAHOO.util.DragDrop.html#setXConstraint", "host": "YAHOO.util.DragDrop", "name": "setXConstraint"}, {"url": "YAHOO.util.DragDrop.html#setXTicks", "host": "YAHOO.util.DragDrop", "name": "setXTicks"}, {"url": "YAHOO.util.Dom.html#setXY", "host": "YAHOO.util.Dom", "name": "setXY"}, {"url": "YAHOO.util.Dom.html#setY", "host": "YAHOO.util.Dom", "name": "setY"}, {"url": "YAHOO.util.DragDrop.html#setYConstraint", "host": "YAHOO.util.DragDrop", "name": "setYConstraint"}, {"url": "YAHOO.widget.Calendar.html#setYear", "host": "YAHOO.widget.Calendar", "name": "setYear"}, {"url": "YAHOO.widget.CalendarGroup.html#setYear", "host": "YAHOO.widget.CalendarGroup", "name": "setYear"}, {"url": "YAHOO.util.DragDrop.html#setYTicks", "host": "YAHOO.util.DragDrop", "name": "setYTicks"}, {"url": "YAHOO.util.Connect.html#_sFormData", "host": "YAHOO.util.Connect", "name": "_sFormData"}, {"url": "ColumnEditor.html#show", "host": "ColumnEditor", "name": "show"}, {"url": "YAHOO.widget.Module.html#show", "host": "YAHOO.widget.Module", "name": "show"}, {"url": "YAHOO.widget.Calendar.html#show", "host": "YAHOO.widget.Calendar", "name": "show"}, {"url": "YAHOO.widget.LogReader.html#show", "host": "YAHOO.widget.LogReader", "name": "show"}, {"url": "YAHOO.widget.OverlayManager.html#showAll", "host": "YAHOO.widget.OverlayManager", "name": "showAll"}, {"url": "YAHOO.widget.LogReader.html#showCategory", "host": "YAHOO.widget.LogReader", "name": "showCategory"}, {"url": "YAHOO.widget.Node.html#showChildren", "host": "YAHOO.widget.Node", "name": "showChildren"}, {"url": "YAHOO.widget.Tooltip.html#showdelay", "host": "YAHOO.widget.Tooltip", "name": "showdelay"}, {"url": "YAHOO.widget.Menu.html#showdelay", "host": "YAHOO.widget.Menu", "name": "showdelay"}, {"url": "Column.html#showEditor", "host": "Column", "name": "showEditor"}, {"url": "DataTable.html#showEmptyMessage", "host": "DataTable", "name": "showEmptyMessage"}, {"url": "YAHOO.widget.Module.html#showEvent", "host": "YAHOO.widget.Module", "name": "showEvent"}, {"url": "YAHOO.util.DDProxy.html#showFrame", "host": "YAHOO.util.DDProxy", "name": "showFrame"}, {"url": "YAHOO.widget.Overlay.html#showIframe", "host": "YAHOO.widget.Overlay", "name": "showIframe"}, {"url": "DataTable.html#showLoadingMessage", "host": "DataTable", "name": "showLoadingMessage"}, {"url": "YAHOO.widget.Overlay.html#showMacGeckoScrollbars", "host": "YAHOO.widget.Overlay", "name": "showMacGeckoScrollbars"}, {"url": "YAHOO.widget.Panel.html#showMask", "host": "YAHOO.widget.Panel", "name": "showMask"}, {"url": "YAHOO.widget.Panel.html#showMaskEvent", "host": "YAHOO.widget.Panel", "name": "showMaskEvent"}, {"url": "YAHOO.widget.Button.html#_showMenu", "host": "YAHOO.widget.Button", "name": "_showMenu"}, {"url": "DataTable.html#showPage", "host": "DataTable", "name": "showPage"}, {"url": "YAHOO.widget.Tooltip.html#showProcId", "host": "YAHOO.widget.Tooltip", "name": "showProcId"}, {"url": "YAHOO.widget.LogReader.html#showSource", "host": "YAHOO.widget.LogReader", "name": "showSource"}, {"url": "DataTable.html#showTableMessage", "host": "DataTable", "name": "showTableMessage"}, {"url": "ColumnEditor.html#showTextareaEditor", "host": "ColumnEditor", "name": "showTextareaEditor"}, {"url": "ColumnEditor.html#showTextboxEditor", "host": "ColumnEditor", "name": "showTextboxEditor"}, {"url": "YAHOO.widget.Calendar.html#SHOW_WEEKDAYS", "host": "YAHOO.widget.Calendar", "name": "SHOW_WEEKDAYS"}, {"url": "YAHOO.widget.CalendarGroup.html#SHOW_WEEKDAYS", "host": "YAHOO.widget.CalendarGroup", "name": "SHOW_WEEKDAYS"}, {"url": "YAHOO.widget.Calendar.html#SHOW_WEEK_FOOTER", "host": "YAHOO.widget.Calendar", "name": "SHOW_WEEK_FOOTER"}, {"url": "YAHOO.widget.CalendarGroup.html#SHOW_WEEK_FOOTER", "host": "YAHOO.widget.CalendarGroup", "name": "SHOW_WEEK_FOOTER"}, {"url": "YAHOO.widget.Calendar.html#SHOW_WEEK_HEADER", "host": "YAHOO.widget.Calendar", "name": "SHOW_WEEK_HEADER"}, {"url": "YAHOO.widget.CalendarGroup.html#SHOW_WEEK_HEADER", "host": "YAHOO.widget.CalendarGroup", "name": "SHOW_WEEK_HEADER"}, {"url": "YAHOO.util.CustomEvent.html#signature", "host": "YAHOO.util.CustomEvent", "name": "signature"}, {"url": "YAHOO.util.CustomEvent.html#silent", "host": "YAHOO.util.CustomEvent", "name": "silent"}, {"url": "YAHOO.util.Event.html#_simpleAdd", "host": "YAHOO.util.Event", "name": "_simpleAdd"}, {"url": "YAHOO.util.Event.html#_simpleRemove", "host": "YAHOO.util.Event", "name": "_simpleRemove"}, {"url": "YAHOO.widget.Panel.html#sizeMask", "host": "YAHOO.widget.Panel", "name": "sizeMask"}, {"url": "YAHOO.widget.Panel.html#sizeUnderlay", "host": "YAHOO.widget.Panel", "name": "sizeUnderlay"}, {"url": "YAHOO.widget.AutoComplete.html#_sLastTextboxValue", "host": "YAHOO.widget.AutoComplete", "name": "_sLastTextboxValue"}, {"url": "YAHOO.widget.ContainerEffect.html#SLIDE", "host": "YAHOO.widget.ContainerEffect", "name": "SLIDE"}, {"url": "YAHOO.widget.Slider.html#slideEnd", "host": "YAHOO.widget.Slider", "name": "slideEnd"}, {"url": "YAHOO.widget.Slider.html#slideStart", "host": "YAHOO.widget.Slider", "name": "slideStart"}, {"url": "ColumnSet.html#_sName", "host": "ColumnSet", "name": "_sName"}, {"url": "DataTable.html#_sName", "host": "DataTable", "name": "_sName"}, {"url": "YAHOO.widget.AutoComplete.html#_sName", "host": "YAHOO.widget.AutoComplete", "name": "_sName"}, {"url": "YAHOO.widget.DataSource.html#_sName", "host": "YAHOO.widget.DataSource", "name": "_sName"}, {"url": "DataSource.html#_sName", "host": "DataSource", "name": "_sName"}, {"url": "YAHOO.widget.LogReader.html#_sName", "host": "YAHOO.widget.LogReader", "name": "_sName"}, {"url": "RecordSet.html#sort", "host": "RecordSet", "name": "sort"}, {"url": "Column.html#sortable", "host": "Column", "name": "sortable"}, {"url": "DataTable.html#sortColumn", "host": "DataTable", "name": "sortColumn"}, {"url": "DataTable.html#sortedBy", "host": "DataTable", "name": "sortedBy"}, {"url": "Column.html#sortOptions.ascFunction", "host": "Column", "name": "sortOptions.ascFunction"}, {"url": "Column.html#sortOptions.descFunction", "host": "Column", "name": "sortOptions.descFunction"}, {"url": "YAHOO.widget.LogMsg.html#source", "host": "YAHOO.widget.LogMsg", "name": "source"}, {"url": "YAHOO.widget.LogWriter.html#_source", "host": "YAHOO.widget.LogWriter", "name": "_source"}, {"url": "YAHOO.widget.Logger.html#sourceCreateEvent", "host": "YAHOO.widget.Logger", "name": "sourceCreateEvent"}, {"url": "YAHOO.widget.LogMsg.html#sourceDetail", "host": "YAHOO.widget.LogMsg", "name": "sourceDetail"}, {"url": "YAHOO.widget.LogReader.html#_sourceFilters", "host": "YAHOO.widget.LogReader", "name": "_sourceFilters"}, {"url": "YAHOO.widget.Logger.html#sources", "host": "YAHOO.widget.Logger", "name": "sources"}, {"url": "YAHOO.widget.Button.html#SPLITBUTTON_DEFAULT_TITLE", "host": "YAHOO.widget.Button", "name": "SPLITBUTTON_DEFAULT_TITLE"}, {"url": "YAHOO.widget.Button.html#SPLITBUTTON_OPTION_VISIBLE_TITLE", "host": "YAHOO.widget.Button", "name": "SPLITBUTTON_OPTION_VISIBLE_TITLE"}, {"url": "YAHOO.widget.Menu.html#srcElement", "host": "YAHOO.widget.Menu", "name": "srcElement"}, {"url": "YAHOO.widget.MenuItem.html#srcElement", "host": "YAHOO.widget.MenuItem", "name": "srcElement"}, {"url": "YAHOO.widget.Button.html#srcelement", "host": "YAHOO.widget.Button", "name": "srcelement"}, {"url": "YAHOO.widget.AutoComplete.html#_sSavedQuery", "host": "YAHOO.widget.AutoComplete", "name": "_sSavedQuery"}, {"url": "YAHOO.widget.Logger.html#_stack", "host": "YAHOO.widget.Logger", "name": "_stack"}, {"url": "YAHOO.util.AnimMgr.html#start", "host": "YAHOO.util.AnimMgr", "name": "start"}, {"url": "YAHOO.util.DragDrop.html#startDrag", "host": "YAHOO.util.DragDrop", "name": "startDrag"}, {"url": "YAHOO.util.DragDropMgr.html#startDrag", "host": "YAHOO.util.DragDropMgr", "name": "startDrag"}, {"url": "YAHOO.util.Event.html#startInterval", "host": "YAHOO.util.Event", "name": "startInterval"}, {"url": "YAHOO.widget.SliderThumb.html#startOffset", "host": "YAHOO.widget.SliderThumb", "name": "startOffset"}, {"url": "YAHOO.util.DragDrop.html#startPageX", "host": "YAHOO.util.DragDrop", "name": "startPageX"}, {"url": "YAHOO.util.DragDrop.html#startPageY", "host": "YAHOO.util.DragDrop", "name": "startPageY"}, {"url": "DataTable.html#startRecordIndex", "host": "DataTable", "name": "startRecordIndex"}, {"url": "YAHOO.util.Anim.html#startTime", "host": "YAHOO.util.Anim", "name": "startTime"}, {"url": "YAHOO.widget.Logger.html#_startTime", "host": "YAHOO.widget.Logger", "name": "_startTime"}, {"url": "YAHOO.widget.Calendar.html#START_WEEKDAY", "host": "YAHOO.widget.Calendar", "name": "START_WEEKDAY"}, {"url": "YAHOO.widget.CalendarGroup.html#START_WEEKDAY", "host": "YAHOO.widget.CalendarGroup", "name": "START_WEEKDAY"}, {"url": "YAHOO.util.DragDropMgr.html#startX", "host": "YAHOO.util.DragDropMgr", "name": "startX"}, {"url": "YAHOO.util.DragDropMgr.html#startY", "host": "YAHOO.util.DragDropMgr", "name": "startY"}, {"url": "YAHOO.util.Anim.html#stop", "host": "YAHOO.util.Anim", "name": "stop"}, {"url": "YAHOO.util.AnimMgr.html#stop", "host": "YAHOO.util.AnimMgr", "name": "stop"}, {"url": "YAHOO.util.DragDropMgr.html#stopDrag", "host": "YAHOO.util.DragDropMgr", "name": "stopDrag"}, {"url": "YAHOO.util.DragDropMgr.html#stopEvent", "host": "YAHOO.util.DragDropMgr", "name": "stopEvent"}, {"url": "YAHOO.util.Event.html#stopEvent", "host": "YAHOO.util.Event", "name": "stopEvent"}, {"url": "YAHOO.util.DragDropMgr.html#stopPropagation", "host": "YAHOO.util.DragDropMgr", "name": "stopPropagation"}, {"url": "YAHOO.util.Event.html#stopPropagation", "host": "YAHOO.util.Event", "name": "stopPropagation"}, {"url": "YAHOO.util.History.html#_storageField", "host": "YAHOO.util.History", "name": "_storageField"}, {"url": "YAHOO.util.History.html#_storageFieldReady", "host": "YAHOO.util.History", "name": "_storageFieldReady"}, {"url": "YAHOO.util.History.html#_storeStates", "host": "YAHOO.util.History", "name": "_storeStates"}, {"url": "YAHOO.util.DragDropMgr.html#STRICT_INTERSECT", "host": "YAHOO.util.DragDropMgr", "name": "STRICT_INTERSECT"}, {"url": "YAHOO.widget.MenuItem.html#strongemphasis", "host": "YAHOO.widget.MenuItem", "name": "strongemphasis"}, {"url": "YAHOO.widget.Calendar.html#styleCellDefault", "host": "YAHOO.widget.Calendar", "name": "styleCellDefault"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_BODY", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_BODY"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CALENDAR", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CALENDAR"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CELL", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CELL"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CELL_BOTTOM", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CELL_BOTTOM"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CELL_HIGHLIGHT1", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CELL_HIGHLIGHT1"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CELL_HIGHLIGHT2", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CELL_HIGHLIGHT2"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CELL_HIGHLIGHT3", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CELL_HIGHLIGHT3"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CELL_HIGHLIGHT4", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CELL_HIGHLIGHT4"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CELL_HOVER", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CELL_HOVER"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CELL_LEFT", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CELL_LEFT"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CELL_OOB", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CELL_OOB"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CELL_OOM", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CELL_OOM"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CELL_RESTRICTED", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CELL_RESTRICTED"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CELL_RIGHT", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CELL_RIGHT"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CELL_SELECTABLE", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CELL_SELECTABLE"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CELL_SELECTED", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CELL_SELECTED"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CELL_SELECTOR", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CELL_SELECTOR"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CELL_TODAY", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CELL_TODAY"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CELL_TOP", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CELL_TOP"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CLOSE", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CLOSE"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_CONTAINER", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_CONTAINER"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_FOOTER", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_FOOTER"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_HEADER", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_HEADER"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_HEADER_TEXT", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_HEADER_TEXT"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_NAV_LEFT", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_NAV_LEFT"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_NAV_RIGHT", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_NAV_RIGHT"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_ROW_FOOTER", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_ROW_FOOTER"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_ROW_HEADER", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_ROW_HEADER"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_SINGLE", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_SINGLE"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_WEEKDAY_CELL", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_WEEKDAY_CELL"}, {"url": "YAHOO.widget.Calendar.html#Style.CSS_WEEKDAY_ROW", "host": "YAHOO.widget.Calendar", "name": "Style.CSS_WEEKDAY_ROW"}, {"url": "YAHOO.widget.CalendarGroup.html#sub", "host": "YAHOO.widget.CalendarGroup", "name": "sub"}, {"url": "YAHOO.widget.MenuItem.html#submenu", "host": "YAHOO.widget.MenuItem", "name": "submenu"}, {"url": "YAHOO.widget.Menu.html#submenualignment", "host": "YAHOO.widget.Menu", "name": "submenualignment"}, {"url": "YAHOO.widget.Menubar.html#submenualignment", "host": "YAHOO.widget.Menubar", "name": "submenualignment"}, {"url": "YAHOO.widget.Menu.html#submenuhidedelay", "host": "YAHOO.widget.Menu", "name": "submenuhidedelay"}, {"url": "YAHOO.widget.MenuItem.html#submenuIndicator", "host": "YAHOO.widget.MenuItem", "name": "submenuIndicator"}, {"url": "YAHOO.widget.MenuItem.html#SUBMENU_TYPE", "host": "YAHOO.widget.MenuItem", "name": "SUBMENU_TYPE"}, {"url": "YAHOO.widget.Dialog.html#submit", "host": "YAHOO.widget.Dialog", "name": "submit"}, {"url": "YAHOO.util.Connect.html#_submitElementValue", "host": "YAHOO.util.Connect", "name": "_submitElementValue"}, {"url": "YAHOO.widget.Dialog.html#submitEvent", "host": "YAHOO.widget.Dialog", "name": "submitEvent"}, {"url": "YAHOO.widget.Button.html#submitForm", "host": "YAHOO.widget.Button", "name": "submitForm"}, {"url": "YAHOO.widget.Button.html#SUBMIT_TITLE", "host": "YAHOO.widget.Button", "name": "SUBMIT_TITLE"}, {"url": "YAHOO.util.CustomEvent.html#subscribe", "host": "YAHOO.util.CustomEvent", "name": "subscribe"}, {"url": "YAHOO.util.EventProvider.html#subscribe", "host": "YAHOO.util.EventProvider", "name": "subscribe"}, {"url": "YAHOO.util.CustomEvent.html#subscribeEvent", "host": "YAHOO.util.CustomEvent", "name": "subscribeEvent"}, {"url": "YAHOO.util.CustomEvent.html#subscribers", "host": "YAHOO.util.CustomEvent", "name": "subscribers"}, {"url": "YAHOO.util.Config.html#subscribeToConfigEvent", "host": "YAHOO.util.Config", "name": "subscribeToConfigEvent"}, {"url": "YAHOO.widget.Menu.html#_subscribeToItemEvents", "host": "YAHOO.widget.Menu", "name": "_subscribeToItemEvents"}, {"url": "YAHOO.widget.DateMath.html#subtract", "host": "YAHOO.widget.DateMath", "name": "subtract"}, {"url": "YAHOO.widget.Calendar.html#subtractMonths", "host": "YAHOO.widget.Calendar", "name": "subtractMonths"}, {"url": "YAHOO.widget.CalendarGroup.html#subtractMonths", "host": "YAHOO.widget.CalendarGroup", "name": "subtractMonths"}, {"url": "YAHOO.widget.Calendar.html#subtractYears", "host": "YAHOO.widget.Calendar", "name": "subtractYears"}, {"url": "YAHOO.widget.CalendarGroup.html#subtractYears", "host": "YAHOO.widget.CalendarGroup", "name": "subtractYears"}, {"url": "DataTable.html#summary", "host": "DataTable", "name": "summary"}, {"url": "YAHOO.util.DragDropMgr.html#swapNode", "host": "YAHOO.util.DragDropMgr", "name": "swapNode"}, {"url": "YAHOO.widget.Overlay.html#syncPosition", "host": "YAHOO.widget.Overlay", "name": "syncPosition"}, {"url": "YAHOO.widget.Button.html#tabindex", "host": "YAHOO.widget.Button", "name": "tabindex"}, {"url": "DataTable.html#tableClickEvent", "host": "DataTable", "name": "tableClickEvent"}, {"url": "DataTable.html#tableDoubleclickEvent", "host": "DataTable", "name": "tableDoubleclickEvent"}, {"url": "DataTable.html#tableFocusEvent", "host": "DataTable", "name": "tableFocusEvent"}, {"url": "DataTable.html#tableInitEvent", "host": "DataTable", "name": "tableInitEvent"}, {"url": "DataTable.html#tableMousedownEvent", "host": "DataTable", "name": "tableMousedownEvent"}, {"url": "DataTable.html#tableMouseoutEvent", "host": "DataTable", "name": "tableMouseoutEvent"}, {"url": "DataTable.html#tableMouseoverEvent", "host": "DataTable", "name": "tableMouseoverEvent"}, {"url": "DataTable.html#tableRefreshEvent", "host": "DataTable", "name": "tableRefreshEvent"}, {"url": "YAHOO.widget.TabView.html#_tabParent", "host": "YAHOO.widget.TabView", "name": "_tabParent"}, {"url": "YAHOO.widget.TabView.html#TAB_PARENT_CLASSNAME", "host": "YAHOO.widget.TabView", "name": "TAB_PARENT_CLASSNAME"}, {"url": "YAHOO.widget.TabView.html#tabs", "host": "YAHOO.widget.TabView", "name": "tabs"}, {"url": "YAHOO.widget.Button.html#TAG_NAME", "host": "YAHOO.widget.Button", "name": "TAG_NAME"}, {"url": "YAHOO.widget.ButtonGroup.html#TAG_NAME", "host": "YAHOO.widget.ButtonGroup", "name": "TAG_NAME"}, {"url": "YAHOO.widget.MenuItem.html#target", "host": "YAHOO.widget.MenuItem", "name": "target"}, {"url": "YAHOO.widget.Button.html#target", "host": "YAHOO.widget.Button", "name": "target"}, {"url": "YAHOO.widget.Node.html#target", "host": "YAHOO.widget.Node", "name": "target"}, {"url": "YAHOO.widget.ContainerEffect.html#targetElement", "host": "YAHOO.widget.ContainerEffect", "name": "targetElement"}, {"url": "Column.html#text", "host": "Column", "name": "text"}, {"url": "YAHOO.widget.SimpleDialog.html#text", "host": "YAHOO.widget.SimpleDialog", "name": "text"}, {"url": "YAHOO.widget.Tooltip.html#text", "host": "YAHOO.widget.Tooltip", "name": "text"}, {"url": "YAHOO.widget.MenuItem.html#text", "host": "YAHOO.widget.MenuItem", "name": "text"}, {"url": "YAHOO.widget.AutoComplete.html#textboxBlurEvent", "host": "YAHOO.widget.AutoComplete", "name": "textboxBlurEvent"}, {"url": "YAHOO.widget.AutoComplete.html#textboxFocusEvent", "host": "YAHOO.widget.AutoComplete", "name": "textboxFocusEvent"}, {"url": "YAHOO.widget.AutoComplete.html#textboxKeyEvent", "host": "YAHOO.widget.AutoComplete", "name": "textboxKeyEvent"}, {"url": "YAHOO.widget.AutoComplete.html#_textMatchesOption", "host": "YAHOO.widget.AutoComplete", "name": "_textMatchesOption"}, {"url": "YAHOO.util.AnimMgr.html#thread", "host": "YAHOO.util.AnimMgr", "name": "thread"}, {"url": "YAHOO.widget.LogReader.html#thresholdMax", "host": "YAHOO.widget.LogReader", "name": "thresholdMax"}, {"url": "YAHOO.widget.LogReader.html#thresholdMin", "host": "YAHOO.widget.LogReader", "name": "thresholdMin"}, {"url": "YAHOO.widget.Slider.html#thumb", "host": "YAHOO.widget.Slider", "name": "thumb"}, {"url": "YAHOO.widget.Slider.html#thumbCenterPoint", "host": "YAHOO.widget.Slider", "name": "thumbCenterPoint"}, {"url": "YAHOO.widget.Slider.html#thumbMouseUp", "host": "YAHOO.widget.Slider", "name": "thumbMouseUp"}, {"url": "YAHOO.widget.Slider.html#tickPause", "host": "YAHOO.widget.Slider", "name": "tickPause"}, {"url": "YAHOO.widget.SliderThumb.html#tickSize", "host": "YAHOO.widget.SliderThumb", "name": "tickSize"}, {"url": "YAHOO.widget.LogMsg.html#time", "host": "YAHOO.widget.LogMsg", "name": "time"}, {"url": "YAHOO.util.Connect.html#_timeOut", "host": "YAHOO.util.Connect", "name": "_timeOut"}, {"url": "YAHOO.widget.LogReader.html#_timeout", "host": "YAHOO.widget.LogReader", "name": "_timeout"}, {"url": "YAHOO.util.DragDropMgr.html#_timeoutCount", "host": "YAHOO.util.DragDropMgr", "name": "_timeoutCount"}, {"url": "YAHOO.widget.Button.html#title", "host": "YAHOO.widget.Button", "name": "title"}, {"url": "YAHOO.widget.Calendar.html#title", "host": "YAHOO.widget.Calendar", "name": "title"}, {"url": "YAHOO.widget.CalendarGroup.html#title", "host": "YAHOO.widget.CalendarGroup", "name": "title"}, {"url": "YAHOO.widget.LogReader.html#_title", "host": "YAHOO.widget.LogReader", "name": "_title"}, {"url": "YAHOO.widget.Calendar.html#_toDate", "host": "YAHOO.widget.Calendar", "name": "_toDate"}, {"url": "YAHOO.widget.Calendar.html#today", "host": "YAHOO.widget.Calendar", "name": "today"}, {"url": "YAHOO.widget.Calendar.html#_toFieldArray", "host": "YAHOO.widget.Calendar", "name": "_toFieldArray"}, {"url": "YAHOO.widget.Node.html#toggle", "host": "YAHOO.widget.Node", "name": "toggle"}, {"url": "YAHOO.widget.AutoComplete.html#_toggleContainer", "host": "YAHOO.widget.AutoComplete", "name": "_toggleContainer"}, {"url": "YAHOO.widget.AutoComplete.html#_toggleContainerHelpers", "host": "YAHOO.widget.AutoComplete", "name": "_toggleContainerHelpers"}, {"url": "YAHOO.widget.AutoComplete.html#_toggleHighlight", "host": "YAHOO.widget.AutoComplete", "name": "_toggleHighlight"}, {"url": "YAHOO.widget.AutoComplete.html#_togglePrehighlight", "host": "YAHOO.widget.AutoComplete", "name": "_togglePrehighlight"}, {"url": "YAHOO.util.Region.html#top", "host": "YAHOO.util.Region", "name": "top"}, {"url": "YAHOO.widget.LogReader.html#top", "host": "YAHOO.widget.LogReader", "name": "top"}, {"url": "ColumnSet.html#toString", "host": "ColumnSet", "name": "toString"}, {"url": "DataTable.html#toString", "host": "DataTable", "name": "toString"}, {"url": "RecordSet.html#toString", "host": "RecordSet", "name": "toString"}, {"url": "YAHOO.util.Config.html#toString", "host": "YAHOO.util.Config", "name": "toString"}, {"url": "YAHOO.widget.ContainerEffect.html#toString", "host": "YAHOO.widget.ContainerEffect", "name": "toString"}, {"url": "YAHOO.widget.Dialog.html#toString", "host": "YAHOO.widget.Dialog", "name": "toString"}, {"url": "YAHOO.widget.Module.html#toString", "host": "YAHOO.widget.Module", "name": "toString"}, {"url": "YAHOO.widget.Overlay.html#toString", "host": "YAHOO.widget.Overlay", "name": "toString"}, {"url": "YAHOO.widget.OverlayManager.html#toString", "host": "YAHOO.widget.OverlayManager", "name": "toString"}, {"url": "YAHOO.widget.Panel.html#toString", "host": "YAHOO.widget.Panel", "name": "toString"}, {"url": "YAHOO.widget.SimpleDialog.html#toString", "host": "YAHOO.widget.SimpleDialog", "name": "toString"}, {"url": "YAHOO.widget.Tooltip.html#toString", "host": "YAHOO.widget.Tooltip", "name": "toString"}, {"url": "YAHOO.util.DragDrop.html#toString", "host": "YAHOO.util.DragDrop", "name": "toString"}, {"url": "YAHOO.util.Region.html#toString", "host": "YAHOO.util.Region", "name": "toString"}, {"url": "YAHOO.widget.ContextMenu.html#toString", "host": "YAHOO.widget.ContextMenu", "name": "toString"}, {"url": "YAHOO.widget.ContextMenuItem.html#toString", "host": "YAHOO.widget.ContextMenuItem", "name": "toString"}, {"url": "YAHOO.widget.Menu.html#toString", "host": "YAHOO.widget.Menu", "name": "toString"}, {"url": "YAHOO.widget.Menubar.html#toString", "host": "YAHOO.widget.Menubar", "name": "toString"}, {"url": "YAHOO.widget.MenuBarItem.html#toString", "host": "YAHOO.widget.MenuBarItem", "name": "toString"}, {"url": "YAHOO.widget.MenuItem.html#toString", "host": "YAHOO.widget.MenuItem", "name": "toString"}, {"url": "YAHOO.widget.MenuManager.html#toString", "host": "YAHOO.widget.MenuManager", "name": "toString"}, {"url": "YAHOO.widget.Button.html#toString", "host": "YAHOO.widget.Button", "name": "toString"}, {"url": "YAHOO.widget.ButtonGroup.html#toString", "host": "YAHOO.widget.ButtonGroup", "name": "toString"}, {"url": "YAHOO.widget.AutoComplete.html#toString", "host": "YAHOO.widget.AutoComplete", "name": "toString"}, {"url": "YAHOO.widget.DataSource.html#toString", "host": "YAHOO.widget.DataSource", "name": "toString"}, {"url": "YAHOO.widget.Slider.html#toString", "host": "YAHOO.widget.Slider", "name": "toString"}, {"url": "YAHOO.widget.SliderThumb.html#toString", "host": "YAHOO.widget.SliderThumb", "name": "toString"}, {"url": "YAHOO.util.Anim.html#toString", "host": "YAHOO.util.Anim", "name": "toString"}, {"url": "DataSource.html#toString", "host": "DataSource", "name": "toString"}, {"url": "YAHOO.widget.Calendar.html#toString", "host": "YAHOO.widget.Calendar", "name": "toString"}, {"url": "YAHOO.widget.CalendarGroup.html#toString", "host": "YAHOO.widget.CalendarGroup", "name": "toString"}, {"url": "YAHOO.widget.Tab.html#toString", "host": "YAHOO.widget.Tab", "name": "toString"}, {"url": "YAHOO.widget.TabView.html#toString", "host": "YAHOO.widget.TabView", "name": "toString"}, {"url": "YAHOO.widget.LogReader.html#toString", "host": "YAHOO.widget.LogReader", "name": "toString"}, {"url": "YAHOO.widget.LogWriter.html#toString", "host": "YAHOO.widget.LogWriter", "name": "toString"}, {"url": "YAHOO.widget.Node.html#toString", "host": "YAHOO.widget.Node", "name": "toString"}, {"url": "YAHOO.widget.TreeView.html#toString", "host": "YAHOO.widget.TreeView", "name": "toString"}, {"url": "YAHOO.widget.TVFadeIn.html#toString", "host": "YAHOO.widget.TVFadeIn", "name": "toString"}, {"url": "YAHOO.widget.TVFadeOut.html#toString", "host": "YAHOO.widget.TVFadeOut", "name": "toString"}, {"url": "YAHOO.util.CustomEvent.html#toString", "host": "YAHOO.util.CustomEvent", "name": "toString"}, {"url": "YAHOO.util.Subscriber.html#toString", "host": "YAHOO.util.Subscriber", "name": "toString"}, {"url": "YAHOO.util.Anim.html#totalFrames", "host": "YAHOO.util.Anim", "name": "totalFrames"}, {"url": "YAHOO.util.Connect.html#_transaction_id", "host": "YAHOO.util.Connect", "name": "_transaction_id"}, {"url": "ColumnSet.html#tree", "host": "ColumnSet", "name": "tree"}, {"url": "YAHOO.widget.Node.html#tree", "host": "YAHOO.widget.Node", "name": "tree"}, {"url": "YAHOO.widget.ContextMenu.html#trigger", "host": "YAHOO.widget.ContextMenu", "name": "trigger"}, {"url": "YAHOO.widget.ContextMenu.html#triggerContextMenuEvent", "host": "YAHOO.widget.ContextMenu", "name": "triggerContextMenuEvent"}, {"url": "YAHOO.util.History.html#_trim", "host": "YAHOO.util.History", "name": "_trim"}, {"url": "YAHOO.util.Event.html#_tryPreloadAttach", "host": "YAHOO.util.Event", "name": "_tryPreloadAttach"}, {"url": "YAHOO.util.AnimMgr.html#tweenCount", "host": "YAHOO.util.AnimMgr", "name": "tweenCount"}, {"url": "Column.html#type", "host": "Column", "name": "type"}, {"url": "ColumnEditor.html#type", "host": "ColumnEditor", "name": "type"}, {"url": "YAHOO.widget.Button.html#type", "host": "YAHOO.widget.Button", "name": "type"}, {"url": "YAHOO.widget.Slider.html#type", "host": "YAHOO.widget.Slider", "name": "type"}, {"url": "YAHOO.widget.Node.html#_type", "host": "YAHOO.widget.Node", "name": "_type"}, {"url": "YAHOO.util.CustomEvent.html#type", "host": "YAHOO.util.CustomEvent", "name": "type"}, {"url": "YAHOO.util.Event.html#TYPE", "host": "YAHOO.util.Event", "name": "TYPE"}, {"url": "YAHOO.widget.AutoComplete.html#typeAhead", "host": "YAHOO.widget.AutoComplete", "name": "typeAhead"}, {"url": "YAHOO.widget.AutoComplete.html#_typeAhead", "host": "YAHOO.widget.AutoComplete", "name": "_typeAhead"}, {"url": "YAHOO.widget.AutoComplete.html#typeAheadEvent", "host": "YAHOO.widget.AutoComplete", "name": "typeAheadEvent"}, {"url": "YAHOO.widget.DS_XHR.html#TYPE_FLAT", "host": "YAHOO.widget.DS_XHR", "name": "TYPE_FLAT"}, {"url": "DataSource.html#TYPE_JSARRAY", "host": "DataSource", "name": "TYPE_JSARRAY"}, {"url": "DataSource.html#TYPE_JSFUNCTION", "host": "DataSource", "name": "TYPE_JSFUNCTION"}, {"url": "YAHOO.widget.DS_XHR.html#TYPE_JSON", "host": "YAHOO.widget.DS_XHR", "name": "TYPE_JSON"}, {"url": "DataSource.html#TYPE_JSON", "host": "DataSource", "name": "TYPE_JSON"}, {"url": "DataSource.html#TYPE_TEXT", "host": "DataSource", "name": "TYPE_TEXT"}, {"url": "DataSource.html#TYPE_UNKNOWN", "host": "DataSource", "name": "TYPE_UNKNOWN"}, {"url": "DataSource.html#TYPE_XHR", "host": "DataSource", "name": "TYPE_XHR"}, {"url": "YAHOO.widget.DS_XHR.html#TYPE_XML", "host": "YAHOO.widget.DS_XHR", "name": "TYPE_XML"}, {"url": "DataSource.html#TYPE_XML", "host": "DataSource", "name": "TYPE_XML"}, {"url": "YAHOO.util.History.html#_ua", "host": "YAHOO.util.History", "name": "_ua"}, {"url": "YAHOO.widget.Panel.html#underlay", "host": "YAHOO.widget.Panel", "name": "underlay"}, {"url": "DataTable.html#unhighlight", "host": "DataTable", "name": "unhighlight"}, {"url": "DataTable.html#unhighlightEvent", "host": "DataTable", "name": "unhighlightEvent"}, {"url": "YAHOO.util.Region.html#union", "host": "YAHOO.util.Region", "name": "union"}, {"url": "YAHOO.util.Event.html#_unload", "host": "YAHOO.util.Event", "name": "_unload"}, {"url": "YAHOO.util.Event.html#unloadListeners", "host": "YAHOO.util.Event", "name": "unloadListeners"}, {"url": "YAHOO.util.DragDrop.html#unlock", "host": "YAHOO.util.DragDrop", "name": "unlock"}, {"url": "YAHOO.util.DragDropMgr.html#unlock", "host": "YAHOO.util.DragDropMgr", "name": "unlock"}, {"url": "YAHOO.widget.Slider.html#unlock", "host": "YAHOO.widget.Slider", "name": "unlock"}, {"url": "YAHOO.widget.AutoComplete.html#unmatchedItemSelectEvent", "host": "YAHOO.widget.AutoComplete", "name": "unmatchedItemSelectEvent"}, {"url": "YAHOO.util.DragDrop.html#unreg", "host": "YAHOO.util.DragDrop", "name": "unreg"}, {"url": "YAHOO.util.DragDropMgr.html#unregAll", "host": "YAHOO.util.DragDropMgr", "name": "unregAll"}, {"url": "YAHOO.util.AnimMgr.html#unRegister", "host": "YAHOO.util.AnimMgr", "name": "unRegister"}, {"url": "DataTable.html#_unselect", "host": "DataTable", "name": "_unselect"}, {"url": "DataTable.html#unselect", "host": "DataTable", "name": "unselect"}, {"url": "DataTable.html#_unselectAllCells", "host": "DataTable", "name": "_unselectAllCells"}, {"url": "DataTable.html#unselectAllCells", "host": "DataTable", "name": "unselectAllCells"}, {"url": "DataTable.html#_unselectAllRows", "host": "DataTable", "name": "_unselectAllRows"}, {"url": "DataTable.html#unselectAllRows", "host": "DataTable", "name": "unselectAllRows"}, {"url": "DataTable.html#unselectEvent", "host": "DataTable", "name": "unselectEvent"}, {"url": "DataTable.html#unselectRow", "host": "DataTable", "name": "unselectRow"}, {"url": "YAHOO.widget.CalendarGroup.html#unsub", "host": "YAHOO.widget.CalendarGroup", "name": "unsub"}, {"url": "YAHOO.util.CustomEvent.html#unsubscribe", "host": "YAHOO.util.CustomEvent", "name": "unsubscribe"}, {"url": "YAHOO.util.EventProvider.html#unsubscribe", "host": "YAHOO.util.EventProvider", "name": "unsubscribe"}, {"url": "YAHOO.util.CustomEvent.html#unsubscribeAll", "host": "YAHOO.util.CustomEvent", "name": "unsubscribeAll"}, {"url": "YAHOO.util.EventProvider.html#unsubscribeAll", "host": "YAHOO.util.EventProvider", "name": "unsubscribeAll"}, {"url": "YAHOO.util.Config.html#unsubscribeFromConfigEvent", "host": "YAHOO.util.Config", "name": "unsubscribeFromConfigEvent"}, {"url": "YAHOO.widget.Menu.html#_updateItemProperties", "host": "YAHOO.widget.Menu", "name": "_updateItemProperties"}, {"url": "DataTable.html#updatePaginator", "host": "DataTable", "name": "updatePaginator"}, {"url": "RecordSet.html#updateRecord", "host": "RecordSet", "name": "updateRecord"}, {"url": "RecordSet.html#updateRecordField", "host": "RecordSet", "name": "updateRecordField"}, {"url": "DataTable.html#updateRow", "host": "DataTable", "name": "updateRow"}, {"url": "DataTable.html#_updateRowEl", "host": "DataTable", "name": "_updateRowEl"}, {"url": "YAHOO.widget.AutoComplete.html#_updateValue", "host": "YAHOO.widget.AutoComplete", "name": "_updateValue"}, {"url": "YAHOO.util.Connect.html#uploadFile", "host": "YAHOO.util.Connect", "name": "uploadFile"}, {"url": "YAHOO.widget.MenuItem.html#url", "host": "YAHOO.widget.MenuItem", "name": "url"}, {"url": "YAHOO.util.DragDropMgr.html#useCache", "host": "YAHOO.util.DragDropMgr", "name": "useCache"}, {"url": "YAHOO.util.Connect.html#_use_default_post_header", "host": "YAHOO.util.Connect", "name": "_use_default_post_header"}, {"url": "YAHOO.util.Connect.html#_use_default_xhr_header", "host": "YAHOO.util.Connect", "name": "_use_default_xhr_header"}, {"url": "YAHOO.widget.AutoComplete.html#useIFrame", "host": "YAHOO.widget.AutoComplete", "name": "useIFrame"}, {"url": "YAHOO.util.Event.html#useLegacyEvent", "host": "YAHOO.util.Event", "name": "useLegacyEvent"}, {"url": "YAHOO.util.Anim.html#useSeconds", "host": "YAHOO.util.Anim", "name": "useSeconds"}, {"url": "YAHOO.widget.AutoComplete.html#useShadow", "host": "YAHOO.widget.AutoComplete", "name": "useShadow"}, {"url": "YAHOO.widget.Dialog.html#validate", "host": "YAHOO.widget.Dialog", "name": "validate"}, {"url": "YAHOO.widget.Calendar.html#validate", "host": "YAHOO.widget.Calendar", "name": "validate"}, {"url": "YAHOO.util.Attribute.html#validator", "host": "YAHOO.util.Attribute", "name": "validator"}, {"url": "YAHOO.widget.MenuItem.html#value", "host": "YAHOO.widget.MenuItem", "name": "value"}, {"url": "YAHOO.widget.Button.html#value", "host": "YAHOO.widget.Button", "name": "value"}, {"url": "YAHOO.widget.ButtonGroup.html#value", "host": "YAHOO.widget.ButtonGroup", "name": "value"}, {"url": "YAHOO.util.Attribute.html#value", "host": "YAHOO.util.Attribute", "name": "value"}, {"url": "YAHOO.widget.LogReader.html#verboseOutput", "host": "YAHOO.widget.LogReader", "name": "verboseOutput"}, {"url": "YAHOO.util.DragDropMgr.html#verifyEl", "host": "YAHOO.util.DragDropMgr", "name": "verifyEl"}, {"url": "YAHOO.widget.Slider.html#verifyOffset", "host": "YAHOO.widget.Slider", "name": "verifyOffset"}, {"url": "YAHOO.widget.Module.html#visible", "host": "YAHOO.widget.Module", "name": "visible"}, {"url": "YAHOO.widget.Menu.html#visible", "host": "YAHOO.widget.Menu", "name": "visible"}, {"url": "YAHOO.util.Event.html#webkit", "host": "YAHOO.util.Event", "name": "webkit"}, {"url": "YAHOO.widget.DateMath.html#WEEK", "host": "YAHOO.widget.DateMath", "name": "WEEK"}, {"url": "YAHOO.widget.Calendar.html#WEEKDAYS_1CHAR", "host": "YAHOO.widget.Calendar", "name": "WEEKDAYS_1CHAR"}, {"url": "YAHOO.widget.CalendarGroup.html#WEEKDAYS_1CHAR", "host": "YAHOO.widget.CalendarGroup", "name": "WEEKDAYS_1CHAR"}, {"url": "YAHOO.widget.Calendar.html#WEEKDAYS_LONG", "host": "YAHOO.widget.Calendar", "name": "WEEKDAYS_LONG"}, {"url": "YAHOO.widget.CalendarGroup.html#WEEKDAYS_LONG", "host": "YAHOO.widget.CalendarGroup", "name": "WEEKDAYS_LONG"}, {"url": "YAHOO.widget.Calendar.html#WEEKDAYS_MEDIUM", "host": "YAHOO.widget.Calendar", "name": "WEEKDAYS_MEDIUM"}, {"url": "YAHOO.widget.CalendarGroup.html#WEEKDAYS_MEDIUM", "host": "YAHOO.widget.CalendarGroup", "name": "WEEKDAYS_MEDIUM"}, {"url": "YAHOO.widget.Calendar.html#WEEKDAYS_SHORT", "host": "YAHOO.widget.Calendar", "name": "WEEKDAYS_SHORT"}, {"url": "YAHOO.widget.CalendarGroup.html#WEEKDAYS_SHORT", "host": "YAHOO.widget.CalendarGroup", "name": "WEEKDAYS_SHORT"}, {"url": "YAHOO.util.Event.html#WFN", "host": "YAHOO.util.Event", "name": "WFN"}, {"url": "Column.html#_width", "host": "Column", "name": "_width"}, {"url": "Column.html#width", "host": "Column", "name": "width"}, {"url": "YAHOO.widget.Overlay.html#width", "host": "YAHOO.widget.Overlay", "name": "width"}, {"url": "YAHOO.widget.LogReader.html#width", "host": "YAHOO.widget.LogReader", "name": "width"}, {"url": "YAHOO.util.Attribute.html#writeOnce", "host": "YAHOO.util.Attribute", "name": "writeOnce"}, {"url": "YAHOO.util.Attribute.html#_written", "host": "YAHOO.util.Attribute", "name": "_written"}, {"url": "YAHOO.widget.Overlay.html#x", "host": "YAHOO.widget.Overlay", "name": "x"}, {"url": "YAHOO.util.Point.html#x", "host": "YAHOO.util.Point", "name": "x"}, {"url": "DataSource.html#_xhrCallback", "host": "DataSource", "name": "_xhrCallback"}, {"url": "DataSource.html#_xhrFailure", "host": "DataSource", "name": "_xhrFailure"}, {"url": "DataSource.html#_xhrSuccess", "host": "DataSource", "name": "_xhrSuccess"}, {"url": "YAHOO.util.DragDrop.html#xTicks", "host": "YAHOO.util.DragDrop", "name": "xTicks"}, {"url": "YAHOO.widget.Overlay.html#xy", "host": "YAHOO.widget.Overlay", "name": "xy"}, {"url": "YAHOO.widget.Overlay.html#y", "host": "YAHOO.widget.Overlay", "name": "y"}, {"url": "YAHOO.util.Point.html#y", "host": "YAHOO.util.Point", "name": "y"}, {"url": "YAHOO.util.Config.html#YAHOO.util.Config.alreadySubscribed", "host": "YAHOO.util.Config", "name": "YAHOO.util.Config.alreadySubscribed"}, {"url": "YAHOO.util.Config.html#YAHOO.util.Config.BOOLEAN_TYPE", "host": "YAHOO.util.Config", "name": "YAHOO.util.Config.BOOLEAN_TYPE"}, {"url": "YAHOO.util.Config.html#YAHOO.util.Config.CONFIG_CHANGED_EVENT", "host": "YAHOO.util.Config", "name": "YAHOO.util.Config.CONFIG_CHANGED_EVENT"}, {"url": "YAHOO.util.CustomEvent.html#YAHOO.util.CustomEvent.FLAT", "host": "YAHOO.util.CustomEvent", "name": "YAHOO.util.CustomEvent.FLAT"}, {"url": "YAHOO.util.CustomEvent.html#YAHOO.util.CustomEvent.LIST", "host": "YAHOO.util.CustomEvent", "name": "YAHOO.util.CustomEvent.LIST"}, {"url": "YAHOO.util.DDProxy.html#YAHOO.util.DDProxy.dragElId", "host": "YAHOO.util.DDProxy", "name": "YAHOO.util.DDProxy.dragElId"}, {"url": "YAHOO.widget.Calendar.html#YAHOO.widget.Calendar.DATE", "host": "YAHOO.widget.Calendar", "name": "YAHOO.widget.Calendar.DATE"}, {"url": "YAHOO.widget.Calendar.html#YAHOO.widget.Calendar._DEFAULT_CONFIG", "host": "YAHOO.widget.Calendar", "name": "YAHOO.widget.Calendar._DEFAULT_CONFIG"}, {"url": "YAHOO.widget.Calendar.html#YAHOO.widget.Calendar.DISPLAY_DAYS", "host": "YAHOO.widget.Calendar", "name": "YAHOO.widget.Calendar.DISPLAY_DAYS"}, {"url": "YAHOO.widget.Calendar.html#YAHOO.widget.Calendar._EVENT_TYPES", "host": "YAHOO.widget.Calendar", "name": "YAHOO.widget.Calendar._EVENT_TYPES"}, {"url": "YAHOO.widget.CalendarGroup.html#YAHOO.widget.CalendarGroup.CSS_2UPCLOSE", "host": "YAHOO.widget.CalendarGroup", "name": "YAHOO.widget.CalendarGroup.CSS_2UPCLOSE"}, {"url": "YAHOO.widget.CalendarGroup.html#YAHOO.widget.CalendarGroup.CSS_2UPTITLE", "host": "YAHOO.widget.CalendarGroup", "name": "YAHOO.widget.CalendarGroup.CSS_2UPTITLE"}, {"url": "YAHOO.widget.CalendarGroup.html#YAHOO.widget.CalendarGroup.CSS_CONTAINER", "host": "YAHOO.widget.CalendarGroup", "name": "YAHOO.widget.CalendarGroup.CSS_CONTAINER"}, {"url": "YAHOO.widget.CalendarGroup.html#YAHOO.widget.CalendarGroup.CSS_MULTI_UP", "host": "YAHOO.widget.CalendarGroup", "name": "YAHOO.widget.CalendarGroup.CSS_MULTI_UP"}, {"url": "YAHOO.widget.CalendarGroup.html#YAHOO.widget.CalendarGroup._DEFAULT_CONFIG", "host": "YAHOO.widget.CalendarGroup", "name": "YAHOO.widget.CalendarGroup._DEFAULT_CONFIG"}, {"url": "YAHOO.widget.Calendar.html#YAHOO.widget.Calendar.IMG_ROOT", "host": "YAHOO.widget.Calendar", "name": "YAHOO.widget.Calendar.IMG_ROOT"}, {"url": "YAHOO.widget.Calendar.html#YAHOO.widget.Calendar.LONG", "host": "YAHOO.widget.Calendar", "name": "YAHOO.widget.Calendar.LONG"}, {"url": "YAHOO.widget.Calendar.html#YAHOO.widget.Calendar.MEDIUM", "host": "YAHOO.widget.Calendar", "name": "YAHOO.widget.Calendar.MEDIUM"}, {"url": "YAHOO.widget.Calendar.html#YAHOO.widget.Calendar.MONTH", "host": "YAHOO.widget.Calendar", "name": "YAHOO.widget.Calendar.MONTH"}, {"url": "YAHOO.widget.Calendar.html#YAHOO.widget.Calendar.MONTH_DAY", "host": "YAHOO.widget.Calendar", "name": "YAHOO.widget.Calendar.MONTH_DAY"}, {"url": "YAHOO.widget.Calendar.html#YAHOO.widget.Calendar.ONE_CHAR", "host": "YAHOO.widget.Calendar", "name": "YAHOO.widget.Calendar.ONE_CHAR"}, {"url": "YAHOO.widget.Calendar.html#YAHOO.widget.Calendar.RANGE", "host": "YAHOO.widget.Calendar", "name": "YAHOO.widget.Calendar.RANGE"}, {"url": "YAHOO.widget.Calendar.html#YAHOO.widget.Calendar.SHORT", "host": "YAHOO.widget.Calendar", "name": "YAHOO.widget.Calendar.SHORT"}, {"url": "YAHOO.widget.Calendar.html#YAHOO.widget.Calendar.STOP_RENDER", "host": "YAHOO.widget.Calendar", "name": "YAHOO.widget.Calendar.STOP_RENDER"}, {"url": "YAHOO.widget.Calendar.html#YAHOO.widget.Calendar._STYLES", "host": "YAHOO.widget.Calendar", "name": "YAHOO.widget.Calendar._STYLES"}, {"url": "YAHOO.widget.Calendar.html#YAHOO.widget.Calendar.WEEKDAY", "host": "YAHOO.widget.Calendar", "name": "YAHOO.widget.Calendar.WEEKDAY"}, {"url": "YAHOO.widget.ContextMenu.html#YAHOO.widget.ContextMenu._DEFAULT_CONFIG", "host": "YAHOO.widget.ContextMenu", "name": "YAHOO.widget.ContextMenu._DEFAULT_CONFIG"}, {"url": "YAHOO.widget.ContextMenu.html#YAHOO.widget.ContextMenu._EVENT_TYPES", "host": "YAHOO.widget.ContextMenu", "name": "YAHOO.widget.ContextMenu._EVENT_TYPES"}, {"url": "YAHOO.widget.Dialog.html#YAHOO.widget.Dialog.CSS_DIALOG", "host": "YAHOO.widget.Dialog", "name": "YAHOO.widget.Dialog.CSS_DIALOG"}, {"url": "YAHOO.widget.Dialog.html#YAHOO.widget.Dialog._DEFAULT_CONFIG", "host": "YAHOO.widget.Dialog", "name": "YAHOO.widget.Dialog._DEFAULT_CONFIG"}, {"url": "YAHOO.widget.Dialog.html#YAHOO.widget.Dialog._EVENT_TYPES", "host": "YAHOO.widget.Dialog", "name": "YAHOO.widget.Dialog._EVENT_TYPES"}, {"url": "YAHOO.widget.Menubar.html#YAHOO.widget.MenuBar._DEFAULT_CONFIG", "host": "YAHOO.widget.Menubar", "name": "YAHOO.widget.MenuBar._DEFAULT_CONFIG"}, {"url": "YAHOO.widget.Menu.html#YAHOO.widget.Menu._DEFAULT_CONFIG", "host": "YAHOO.widget.Menu", "name": "YAHOO.widget.Menu._DEFAULT_CONFIG"}, {"url": "YAHOO.widget.Menu.html#YAHOO.widget.Menu._EVENT_TYPES", "host": "YAHOO.widget.Menu", "name": "YAHOO.widget.Menu._EVENT_TYPES"}, {"url": "YAHOO.widget.MenuItem.html#YAHOO.widget.MenuItem._DEFAULT_CONFIG", "host": "YAHOO.widget.MenuItem", "name": "YAHOO.widget.MenuItem._DEFAULT_CONFIG"}, {"url": "YAHOO.widget.MenuItem.html#YAHOO.widget.MenuItem._EVENT_TYPES", "host": "YAHOO.widget.MenuItem", "name": "YAHOO.widget.MenuItem._EVENT_TYPES"}, {"url": "YAHOO.widget.Module.html#YAHOO.widget.Module.CSS_BODY", "host": "YAHOO.widget.Module", "name": "YAHOO.widget.Module.CSS_BODY"}, {"url": "YAHOO.widget.Module.html#YAHOO.widget.Module.CSS_FOOTER", "host": "YAHOO.widget.Module", "name": "YAHOO.widget.Module.CSS_FOOTER"}, {"url": "YAHOO.widget.Module.html#YAHOO.widget.Module.CSS_HEADER", "host": "YAHOO.widget.Module", "name": "YAHOO.widget.Module.CSS_HEADER"}, {"url": "YAHOO.widget.Module.html#YAHOO.widget.Module.CSS_MODULE", "host": "YAHOO.widget.Module", "name": "YAHOO.widget.Module.CSS_MODULE"}, {"url": "YAHOO.widget.Module.html#YAHOO.widget.Module._DEFAULT_CONFIG", "host": "YAHOO.widget.Module", "name": "YAHOO.widget.Module._DEFAULT_CONFIG"}, {"url": "YAHOO.widget.Module.html#YAHOO.widget.Module._EVENT_TYPES", "host": "YAHOO.widget.Module", "name": "YAHOO.widget.Module._EVENT_TYPES"}, {"url": "YAHOO.widget.Module.html#YAHOO.widget.Module.IMG_ROOT", "host": "YAHOO.widget.Module", "name": "YAHOO.widget.Module.IMG_ROOT"}, {"url": "YAHOO.widget.Module.html#YAHOO.widget.Module.IMG_ROOT_SSL", "host": "YAHOO.widget.Module", "name": "YAHOO.widget.Module.IMG_ROOT_SSL"}, {"url": "YAHOO.widget.Module.html#YAHOO.widget.Module.RESIZE_MONITOR_SECURE_URL", "host": "YAHOO.widget.Module", "name": "YAHOO.widget.Module.RESIZE_MONITOR_SECURE_URL"}, {"url": "YAHOO.widget.Module.html#YAHOO.widget.Module.textResizeEvent", "host": "YAHOO.widget.Module", "name": "YAHOO.widget.Module.textResizeEvent"}, {"url": "YAHOO.widget.Overlay.html#YAHOO.widget.Overlay.BOTTOM_LEFT", "host": "YAHOO.widget.Overlay", "name": "YAHOO.widget.Overlay.BOTTOM_LEFT"}, {"url": "YAHOO.widget.Overlay.html#YAHOO.widget.Overlay.BOTTOM_RIGHT", "host": "YAHOO.widget.Overlay", "name": "YAHOO.widget.Overlay.BOTTOM_RIGHT"}, {"url": "YAHOO.widget.Overlay.html#YAHOO.widget.Overlay.CSS_OVERLAY", "host": "YAHOO.widget.Overlay", "name": "YAHOO.widget.Overlay.CSS_OVERLAY"}, {"url": "YAHOO.widget.Overlay.html#YAHOO.widget.Overlay._DEFAULT_CONFIG", "host": "YAHOO.widget.Overlay", "name": "YAHOO.widget.Overlay._DEFAULT_CONFIG"}, {"url": "YAHOO.widget.Overlay.html#YAHOO.widget.Overlay._EVENT_TYPES", "host": "YAHOO.widget.Overlay", "name": "YAHOO.widget.Overlay._EVENT_TYPES"}, {"url": "YAHOO.widget.Overlay.html#YAHOO.widget.Overlay.IFRAME_SRC", "host": "YAHOO.widget.Overlay", "name": "YAHOO.widget.Overlay.IFRAME_SRC"}, {"url": "YAHOO.widget.Overlay.html#YAHOO.widget.Overlay._initialized", "host": "YAHOO.widget.Overlay", "name": "YAHOO.widget.Overlay._initialized"}, {"url": "YAHOO.widget.OverlayManager.html#YAHOO.widget.OverlayManager.CSS_FOCUSED", "host": "YAHOO.widget.OverlayManager", "name": "YAHOO.widget.OverlayManager.CSS_FOCUSED"}, {"url": "YAHOO.widget.Overlay.html#YAHOO.widget.Overlay.TOP_LEFT", "host": "YAHOO.widget.Overlay", "name": "YAHOO.widget.Overlay.TOP_LEFT"}, {"url": "YAHOO.widget.Overlay.html#YAHOO.widget.Overlay.TOP_RIGHT", "host": "YAHOO.widget.Overlay", "name": "YAHOO.widget.Overlay.TOP_RIGHT"}, {"url": "YAHOO.widget.Overlay.html#YAHOO.widget.Overlay.windowResizeEvent", "host": "YAHOO.widget.Overlay", "name": "YAHOO.widget.Overlay.windowResizeEvent"}, {"url": "YAHOO.widget.Overlay.html#YAHOO.widget.Overlay.windowResizeHandler", "host": "YAHOO.widget.Overlay", "name": "YAHOO.widget.Overlay.windowResizeHandler"}, {"url": "YAHOO.widget.Overlay.html#YAHOO.widget.Overlay.windowScrollEvent", "host": "YAHOO.widget.Overlay", "name": "YAHOO.widget.Overlay.windowScrollEvent"}, {"url": "YAHOO.widget.Overlay.html#YAHOO.widget.Overlay.windowScrollHandler", "host": "YAHOO.widget.Overlay", "name": "YAHOO.widget.Overlay.windowScrollHandler"}, {"url": "YAHOO.widget.Panel.html#YAHOO.widget.Panel.CSS_PANEL", "host": "YAHOO.widget.Panel", "name": "YAHOO.widget.Panel.CSS_PANEL"}, {"url": "YAHOO.widget.Panel.html#YAHOO.widget.Panel.CSS_PANEL_CONTAINER", "host": "YAHOO.widget.Panel", "name": "YAHOO.widget.Panel.CSS_PANEL_CONTAINER"}, {"url": "YAHOO.widget.Panel.html#YAHOO.widget.Panel._DEFAULT_CONFIG", "host": "YAHOO.widget.Panel", "name": "YAHOO.widget.Panel._DEFAULT_CONFIG"}, {"url": "YAHOO.widget.Panel.html#YAHOO.widget.Panel._EVENT_TYPES", "host": "YAHOO.widget.Panel", "name": "YAHOO.widget.Panel._EVENT_TYPES"}, {"url": "YAHOO.widget.SimpleDialog.html#YAHOO.widget.SimpleDialog.CSS_SIMPLEDIALOG", "host": "YAHOO.widget.SimpleDialog", "name": "YAHOO.widget.SimpleDialog.CSS_SIMPLEDIALOG"}, {"url": "YAHOO.widget.SimpleDialog.html#YAHOO.widget.SimpleDialog._DEFAULT_CONFIG", "host": "YAHOO.widget.SimpleDialog", "name": "YAHOO.widget.SimpleDialog._DEFAULT_CONFIG"}, {"url": "YAHOO.widget.SimpleDialog.html#YAHOO.widget.SimpleDialog.ICON_ALARM", "host": "YAHOO.widget.SimpleDialog", "name": "YAHOO.widget.SimpleDialog.ICON_ALARM"}, {"url": "YAHOO.widget.SimpleDialog.html#YAHOO.widget.SimpleDialog.ICON_BLOCK", "host": "YAHOO.widget.SimpleDialog", "name": "YAHOO.widget.SimpleDialog.ICON_BLOCK"}, {"url": "YAHOO.widget.SimpleDialog.html#YAHOO.widget.SimpleDialog.ICON_HELP", "host": "YAHOO.widget.SimpleDialog", "name": "YAHOO.widget.SimpleDialog.ICON_HELP"}, {"url": "YAHOO.widget.SimpleDialog.html#YAHOO.widget.SimpleDialog.ICON_INFO", "host": "YAHOO.widget.SimpleDialog", "name": "YAHOO.widget.SimpleDialog.ICON_INFO"}, {"url": "YAHOO.widget.SimpleDialog.html#YAHOO.widget.SimpleDialog.ICON_TIP", "host": "YAHOO.widget.SimpleDialog", "name": "YAHOO.widget.SimpleDialog.ICON_TIP"}, {"url": "YAHOO.widget.SimpleDialog.html#YAHOO.widget.SimpleDialog.ICON_WARN", "host": "YAHOO.widget.SimpleDialog", "name": "YAHOO.widget.SimpleDialog.ICON_WARN"}, {"url": "YAHOO.widget.Slider.html#YAHOO.widget.Slider.ANIM_AVAIL", "host": "YAHOO.widget.Slider", "name": "YAHOO.widget.Slider.ANIM_AVAIL"}, {"url": "YAHOO.widget.Slider.html#YAHOO.widget.Slider.getHorizSlider", "host": "YAHOO.widget.Slider", "name": "YAHOO.widget.Slider.getHorizSlider"}, {"url": "YAHOO.widget.Slider.html#YAHOO.widget.Slider.getSliderRegion", "host": "YAHOO.widget.Slider", "name": "YAHOO.widget.Slider.getSliderRegion"}, {"url": "YAHOO.widget.Slider.html#YAHOO.widget.Slider.getVertSlider", "host": "YAHOO.widget.Slider", "name": "YAHOO.widget.Slider.getVertSlider"}, {"url": "YAHOO.widget.Tooltip.html#YAHOO.widget.Tooltip.CSS_TOOLTIP", "host": "YAHOO.widget.Tooltip", "name": "YAHOO.widget.Tooltip.CSS_TOOLTIP"}, {"url": "YAHOO.widget.Tooltip.html#YAHOO.widget.Tooltip._DEFAULT_CONFIG", "host": "YAHOO.widget.Tooltip", "name": "YAHOO.widget.Tooltip._DEFAULT_CONFIG"}, {"url": "YAHOO.widget.TreeView.html#YAHOO.widget.TreeView.addHandler", "host": "YAHOO.widget.TreeView", "name": "YAHOO.widget.TreeView.addHandler"}, {"url": "YAHOO.widget.TreeView.html#YAHOO.widget.TreeView.counter", "host": "YAHOO.widget.TreeView", "name": "YAHOO.widget.TreeView.counter"}, {"url": "YAHOO.widget.TreeView.html#YAHOO.widget.TreeView.getNode", "host": "YAHOO.widget.TreeView", "name": "YAHOO.widget.TreeView.getNode"}, {"url": "YAHOO.widget.TreeView.html#YAHOO.widget.TreeView.getTree", "host": "YAHOO.widget.TreeView", "name": "YAHOO.widget.TreeView.getTree"}, {"url": "YAHOO.widget.TreeView.html#YAHOO.widget.TreeView.nodeCount", "host": "YAHOO.widget.TreeView", "name": "YAHOO.widget.TreeView.nodeCount"}, {"url": "YAHOO.widget.TreeView.html#YAHOO.widget.TreeView.preload", "host": "YAHOO.widget.TreeView", "name": "YAHOO.widget.TreeView.preload"}, {"url": "YAHOO.widget.TreeView.html#YAHOO.widget.TreeView.removeHandler", "host": "YAHOO.widget.TreeView", "name": "YAHOO.widget.TreeView.removeHandler"}, {"url": "YAHOO.widget.TreeView.html#YAHOO.widget.TreeView.trees", "host": "YAHOO.widget.TreeView", "name": "YAHOO.widget.TreeView.trees"}, {"url": "YAHOO.widget.DateMath.html#YEAR", "host": "YAHOO.widget.DateMath", "name": "YEAR"}, {"url": "YAHOO.util.DragDrop.html#__ygDragDrop", "host": "YAHOO.util.DragDrop", "name": "__ygDragDrop"}, {"url": "YAHOO.util.DragDrop.html#yTicks", "host": "YAHOO.util.DragDrop", "name": "yTicks"}, {"url": "YAHOO.util.EventProvider.html#__yui_events", "host": "YAHOO.util.EventProvider", "name": "__yui_events"}, {"url": "Record.html#yuiRecordId", "host": "Record", "name": "yuiRecordId"}, {"url": "YAHOO.util.EventProvider.html#__yui_subscribers", "host": "YAHOO.util.EventProvider", "name": "__yui_subscribers"}, {"url": "YAHOO.widget.Overlay.html#zIndex", "host": "YAHOO.widget.Overlay", "name": "zIndex"}] \ No newline at end of file diff --git a/www/extras/yui/docs/menu.js.html b/www/extras/yui/docs/menu.js.html new file mode 100644 index 000000000..2443c1321 --- /dev/null +++ b/www/extras/yui/docs/menu.js.html @@ -0,0 +1,4755 @@ + + + + API: menu menu.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Menu  2.2.2

          +

          + Yahoo! UI Library + > menu + + > menu.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +* 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
          +*/
          +(function() {
          +
          +var Dom = YAHOO.util.Dom,
          +    Event = YAHOO.util.Event,
          +    CustomEvent = YAHOO.util.CustomEvent,
          +    Lang = YAHOO.lang;
          +
          +
          +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
          +    );
          +
          +};
          +
          +
          +/**
          +* Constant representing the name of the Menu's events
          +* @property YAHOO.widget.Menu._EVENT_TYPES
          +* @private
          +* @final
          +* @type Object
          +*/
          +YAHOO.widget.Menu._EVENT_TYPES = {
          +
          +    "MOUSE_OVER": "mouseover",
          +    "MOUSE_OUT": "mouseout",
          +    "MOUSE_DOWN": "mousedown",
          +    "MOUSE_UP": "mouseup",
          +    "CLICK": "click",
          +    "KEY_PRESS": "keypress",
          +    "KEY_DOWN": "keydown",
          +    "KEY_UP": "keyup",
          +    "FOCUS": "focus",
          +    "BLUR": "blur",
          +    "ITEM_ADDED": "itemAdded",
          +    "ITEM_REMOVED": "itemRemoved"
          +
          +};
          +
          +
          +
          +/**
          +* @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}
          +*/
          +YAHOO.widget.Menu._checkPosition = function(p_sPosition) {
          +
          +    if(typeof p_sPosition == "string") {
          +
          +        var sPosition = p_sPosition.toLowerCase();
          +
          +        return ("dynamic,static".indexOf(sPosition) != -1);
          +
          +    }
          +
          +};
          +
          +
          +
          +/**
          +* Constant representing the Menu's configuration properties
          +* @property YAHOO.widget.Menu._DEFAULT_CONFIG
          +* @private
          +* @final
          +* @type Object
          +*/
          +YAHOO.widget.Menu._DEFAULT_CONFIG = {
          +
          +    "VISIBLE": { 
          +        key: "visible", 
          +        value: false, 
          +        validator: Lang.isBoolean
          +    }, 
          +
          +    "CONSTRAIN_TO_VIEWPORT": {
          +        key: "constraintoviewport", 
          +        value: true, 
          +        validator: Lang.isBoolean, 
          +        supercedes: ["iframe","x","y","xy"]
          +    }, 
          +
          +    "POSITION": { 
          +        key: "position", 
          +        value: "dynamic", 
          +        validator: YAHOO.widget.Menu._checkPosition, 
          +        supercedes: ["visible"] 
          +    }, 
          +
          +    "SUBMENU_ALIGNMENT": { 
          +        key: "submenualignment", 
          +        value: ["tl","tr"]
          +    },
          +
          +    "AUTO_SUBMENU_DISPLAY": { 
          +        key: "autosubmenudisplay", 
          +        value: true, 
          +        validator: Lang.isBoolean 
          +    }, 
          +
          +    "SHOW_DELAY": { 
          +        key: "showdelay", 
          +        value: 250, 
          +        validator: Lang.isNumber 
          +    }, 
          +
          +    "HIDE_DELAY": { 
          +        key: "hidedelay", 
          +        value: 0, 
          +        validator: Lang.isNumber, 
          +        suppressEvent: true
          +    }, 
          +
          +    "SUBMENU_HIDE_DELAY": { 
          +        key: "submenuhidedelay", 
          +        value: 250, 
          +        validator: Lang.isNumber
          +    }, 
          +
          +    "CLICK_TO_HIDE": { 
          +        key: "clicktohide", 
          +        value: true, 
          +        validator: Lang.isBoolean
          +    },
          +
          +    "CONTAINER": { 
          +        key: "container"
          +    }, 
          +
          +    "MAX_HEIGHT": { 
          +        key: "maxheight", 
          +        value: 0, 
          +        validator: Lang.isNumber
          +    }, 
          +
          +    "CLASS_NAME": { 
          +        key: "classname", 
          +        value: null, 
          +        validator: Lang.isString
          +    }
          +
          +};
          +
          +
          +YAHOO.lang.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 _nSubmenuHideDelayId
          +* @description Number representing the time-out setting used to cancel the 
          +* hiding of a submenu.
          +* @default null
          +* @private
          +* @type Number
          +*/
          +_nSubmenuHideDelayId: null,
          +
          +
          +/** 
          +* @property _nBodyScrollId
          +* @description Number representing the time-out setting used to cancel the 
          +* scrolling of the menu's body element.
          +* @default null
          +* @private
          +* @type Number
          +*/
          +_nBodyScrollId: null,
          +
          +
          +/** 
          +* @property _bHideDelayEventHandlersAssigned
          +* @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
          +*/
          +_bHideDelayEventHandlersAssigned: 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 Multi-dimensional Array representing the menu items as they
          +* are grouped in the menu.
          +* @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,
          +
          +
          +/**
          +* @property _nCurrentMouseX
          +* @description The current x coordinate of the mouse inside the area of 
          +* the menu.
          +* @default 0
          +* @private
          +* @type Number
          +*/
          +_nCurrentMouseX: 0,
          +
          +
          +/**
          +* @property _nMaxHeight
          +* @description The original value of the "maxheight" configuration property 
          +* as set by the user.
          +* @default -1
          +* @private
          +* @type Number
          +*/
          +_nMaxHeight: -1,
          +
          +
          +/**
          +* @property _bStopMouseEventHandlers
          +* @description Stops "mouseover," "mouseout," and "mousemove" event handlers 
          +* from executing.
          +* @default false
          +* @private
          +* @type Boolean
          +*/
          +_bStopMouseEventHandlers: false,
          +
          +
          +/**
          +* @property _sClassName
          +* @description The current value of the "classname" configuration attribute.
          +* @default null
          +* @private
          +* @type String
          +*/
          +_sClassName: 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 is selected.
          +* @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);
          +
          +                this.logger = new YAHOO.widget.LogWriter(this.toString());
          +
          +                this.logger.log("Source element: " + this.srcElement.tagName);
          +    
          +            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);
          +
          +                this.logger = new YAHOO.widget.LogWriter(this.toString());
          +
          +                this.logger.log("Source element: " + this.srcElement.tagName);
          +
          +            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);
          +
          +        this.logger = new YAHOO.widget.LogWriter(this.toString());
          +
          +        this.logger.log("No source element found.  " +
          +            "Created element with id: " + this.id);
          +
          +    }
          +
          +
          +    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.beforeShowEvent.subscribe(this._onBeforeShow, this, true);
          +        this.showEvent.subscribe(this._onShow, this, true);
          +        this.beforeHideEvent.subscribe(this._onBeforeHide, this, true);
          +        this.hideEvent.subscribe(this._onHide, 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);
          +        this.keyPressEvent.subscribe(this._onKeyPress, this, true);
          +
          +        YAHOO.widget.Module.textResizeEvent.subscribe(
          +            this._onTextResize, 
          +            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.toUpperCase() == "DIV") {
          +
          +        /*
          +            Populate the collection of item groups and item
          +            group titles
          +        */
          +
          +        oNode = this.body.firstChild;
          +
          +        var nGroup = 0,
          +            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;
          +
          +    this.logger.log("Searching DOM for items to initialize.");
          +
          +    if(this.srcElement.tagName) {
          +
          +        var sSrcElementTagName = this.srcElement.tagName.toUpperCase();
          +
          +
          +        switch(sSrcElementTagName) {
          +    
          +            case "DIV":
          +    
          +                if(this._aListElements.length > 0) {
          +    
          +                    this.logger.log("Found " + 
          +                        this._aListElements.length + 
          +                        " item groups to initialize.");
          +    
          +                    var i = this._aListElements.length - 1;
          +    
          +                    do {
          +    
          +                        oNode = this._aListElements[i].firstChild;
          +        
          +                        this.logger.log("Scanning " + 
          +                            this._aListElements[i].childNodes.length + 
          +                            " child nodes for items to initialize.");
          +    
          +                        do {
          +        
          +                            if(
          +                                oNode && 
          +                                oNode.tagName && 
          +                                oNode.tagName.toUpperCase() == "LI"
          +                            ) {
          +        
          +                                this.logger.log("Initializing " + 
          +                                    oNode.tagName + " node.");
          +
          +                                this.addItem(
          +                                        new this.ITEM_TYPE(
          +                                            oNode, 
          +                                            { parent: this }
          +                                        ), 
          +                                        i
          +                                    );
          +    
          +                            }
          +                
          +                        }
          +                        while((oNode = oNode.nextSibling));
          +                
          +                    }
          +                    while(i--);
          +    
          +                }
          +    
          +            break;
          +    
          +            case "SELECT":
          +    
          +                this.logger.log("Scanning " +  
          +                    this.srcElement.childNodes.length + 
          +                    " child nodes for items to initialize.");
          +    
          +                oNode = this.srcElement.firstChild;
          +    
          +                do {
          +    
          +                    if(oNode && oNode.tagName) {
          +                    
          +                        switch(oNode.tagName.toUpperCase()) {
          +        
          +                            case "OPTGROUP":
          +                            case "OPTION":
          +        
          +                                this.logger.log("Initializing " +  
          +                                    oNode.tagName + " node.");
          +        
          +                                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 aItems = this.getItems(),
          +        nItems = aItems.length,
          +        oItem;
          +    
          +    for(var i=0; i<nItems; i++) {
          +
          +        oItem = aItems[i];
          +
          +        if(
          +            oItem && 
          +            !oItem.cfg.getProperty("disabled") && 
          +            oItem.element.style.display != "none"
          +        ) {
          +
          +            return oItem;
          +
          +        }
          +    
          +    }
          +    
          +},
          +
          +
          +/**
          +* @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.parent = this;
          +
          +        oItem = new this.ITEM_TYPE(p_oItem.text, p_oItem);
          +
          +    }
          +
          +
          +    if(oItem) {
          +
          +        if (oItem.cfg.getProperty("selected")) {
          +
          +            this.activeItem = oItem;
          +        
          +        }
          +
          +
          +        var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0,
          +            aGroup = this._getItemGroup(nGroupIndex),
          +            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 {
          +  
          +                    function getNextItemSibling(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.logger.log("Item inserted." + 
          +                    " Text: " + oGroupItem.cfg.getProperty("text") + ", " + 
          +                    " Index: " + oGroupItem.index + ", " + 
          +                    " Group Index: " + oGroupItem.groupIndex);
          +
          +                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.logger.log("Item added." + 
          +                    " Text: " + oGroupItem.cfg.getProperty("text") + ", " + 
          +                    " Index: " + oGroupItem.index + ", " + 
          +                    " Group Index: " + oGroupItem.groupIndex);
          +        
          +
          +                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,
          +        aGroup = this._getItemGroup(nGroupIndex);
          +
          +    if(aGroup) {
          +
          +        var aArray = aGroup.splice(p_nItemIndex, 1),
          +            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,
          +            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),
          +        nItems = aGroup.length;
          +
          +    if(nItems > 0) {
          +
          +        var i = nItems - 1,
          +            oItem,
          +            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, null, p_oItem);
          +        oSubmenu.hideEvent.subscribe(this._onSubmenuHide, null, p_oItem);
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @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.blurEvent.subscribe(this._onMenuItemBlur);
          +
          +    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 _setWidth
          +* @description Sets the width of the menu's root <code>&#60;div&#62;</code> 
          +* element to its offsetWidth.
          +* @private
          +*/
          +_setWidth: function() {
          +
          +    var sWidth;
          +
          +    if (this.element.parentNode.tagName.toUpperCase() == "BODY") {
          +
          +        if (this.browser == "opera") {
          +
          +            sWidth = this._getOffsetWidth();
          +        
          +        }
          +        else {
          +
          +            Dom.setStyle(this.element, "width", "auto");
          +            
          +            sWidth = this.element.offsetWidth;
          +        
          +        }
          +
          +    }
          +    else {
          +    
          +        sWidth = this._getOffsetWidth();
          +    
          +    }
          +
          +    this.cfg.setProperty("width", (sWidth + "px"));
          +
          +},
          +
          +
          +/**
          +* @method _onWidthChange
          +* @description Change event handler for the the menu's "width" configuration
          +* property.
          +* @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.
          +*/
          +_onWidthChange: function(p_sType, p_aArgs) {
          +
          +    var sWidth = p_aArgs[0];
          +    
          +    if (sWidth && !this._hasSetWidthHandlers) {
          +
          +        this.itemAddedEvent.subscribe(this._setWidth);
          +        this.itemRemovedEvent.subscribe(this._setWidth);
          +
          +        this._hasSetWidthHandlers = true;
          +
          +    }
          +    else if (this._hasSetWidthHandlers) {
          +
          +        this.itemAddedEvent.unsubscribe(this._setWidth);
          +        this.itemRemovedEvent.unsubscribe(this._setWidth);
          +
          +        this._hasSetWidthHandlers = false;
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _onVisibleChange
          +* @description Change event handler for the the menu's "visible" configuration
          +* property.
          +* @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.
          +*/
          +_onVisibleChange: function(p_sType, p_aArgs) {
          +
          +    var bVisible = p_aArgs[0];
          +    
          +    if (bVisible) {
          +
          +        Dom.addClass(this.element, "visible");
          +
          +    }
          +    else {
          +
          +        Dom.removeClass(this.element, "visible");
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @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(),
          +        me = this;
          +
          +    function hideMenu() {
          +    
          +        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) {
          +
          +    var oRoot = this.getRoot();
          +
          +    function showMenu() {
          +
          +        if(p_oMenu.parent.cfg.getProperty("selected")) {
          +
          +            p_oMenu.show();
          +
          +        }
          +
          +    }
          +
          +
          +    oRoot._nShowDelayId = 
          +        window.setTimeout(showMenu, oRoot.cfg.getProperty("showdelay"));
          +
          +},
          +
          +
          +/**
          +* @method _execSubmenuHideDelay
          +* @description Hides a submenu after the number of milliseconds specified by 
          +* the "submenuhidedelay" configuration property have ellapsed.
          +* @private
          +* @param {YAHOO.widget.Menu} p_oSubmenu Object specifying the submenu that  
          +* should be hidden.
          +* @param {Number} p_nMouseX The x coordinate of the mouse when it left 
          +* the specified submenu's parent menu item.
          +* @param {Number} p_nHideDelay The number of milliseconds that should ellapse
          +* before the submenu is hidden.
          +*/
          +_execSubmenuHideDelay: function(p_oSubmenu, p_nMouseX, p_nHideDelay) {
          +
          +    var me = this;
          +
          +    p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () {
          +
          +        if(me._nCurrentMouseX > (p_nMouseX + 10)) {
          +
          +            p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () {
          +        
          +                p_oSubmenu.hide();
          +
          +            }, p_nHideDelay);
          +
          +        }
          +        else {
          +
          +            p_oSubmenu.hide();
          +        
          +        }
          +
          +    }, 50);
          +
          +},
          +
          +
          +
          +// Protected methods
          +
          +
          +/**
          +* @method _disableScrollHeader
          +* @description Disables the header used for scrolling the body of the menu.
          +* @protected
          +*/
          +_disableScrollHeader: function() {
          +
          +    if(!this._bHeaderDisabled) {
          +
          +        Dom.addClass(this.header, "topscrollbar_disabled");
          +        this._bHeaderDisabled = true;
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _disableScrollFooter
          +* @description Disables the footer used for scrolling the body of the menu.
          +* @protected
          +*/
          +_disableScrollFooter: function() {
          +
          +    if(!this._bFooterDisabled) {
          +
          +        Dom.addClass(this.footer, "bottomscrollbar_disabled");
          +        this._bFooterDisabled = true;
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _enableScrollHeader
          +* @description Enables the header used for scrolling the body of the menu.
          +* @protected
          +*/
          +_enableScrollHeader: function() {
          +
          +    if(this._bHeaderDisabled) {
          +
          +        Dom.removeClass(this.header, "topscrollbar_disabled");
          +        this._bHeaderDisabled = false;
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _enableScrollFooter
          +* @description Enables the footer used for scrolling the body of the menu.
          +* @protected
          +*/
          +_enableScrollFooter: function() {
          +
          +    if(this._bFooterDisabled) {
          +
          +        Dom.removeClass(this.footer, "bottomscrollbar_disabled");
          +        this._bFooterDisabled = false;
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @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) {
          +
          +    if(this._bStopMouseEventHandlers) {
          +    
          +        return false;
          +    
          +    }
          +
          +
          +    var oEvent = p_aArgs[0],
          +        oItem = p_aArgs[1],
          +        oTarget = Event.getTarget(oEvent);
          +
          +
          +    if(
          +        !this._bHandledMouseOverEvent && 
          +        (oTarget == this.element || Dom.isAncestor(this.element, oTarget))
          +    ) {
          +
          +        // Menu mouseover logic
          +
          +        this._nCurrentMouseX = 0;
          +
          +        Event.on(
          +                this.element, 
          +                "mousemove", 
          +                this._onMouseMove, 
          +                this, 
          +                true
          +            );
          +
          +
          +        this.clearActiveItem();
          +
          +
          +        if(this.parent && this._nSubmenuHideDelayId) {
          +
          +            window.clearTimeout(this._nSubmenuHideDelayId);
          +
          +            this.parent.cfg.setProperty("selected", true);
          +
          +            var oParentMenu = this.parent.parent;
          +
          +            oParentMenu._bHandledMouseOutEvent = true;
          +            oParentMenu._bHandledMouseOverEvent = false;
          +
          +        }
          +
          +
          +        this._bHandledMouseOverEvent = true;
          +        this._bHandledMouseOutEvent = false;
          +    
          +    }
          +
          +
          +    if(
          +        oItem && !oItem.handledMouseOverEvent && 
          +        !oItem.cfg.getProperty("disabled") && 
          +        (oTarget == oItem.element || Dom.isAncestor(oItem.element, oTarget))
          +    ) {
          +
          +        // Menu Item mouseover logic
          +
          +        var nShowDelay = this.cfg.getProperty("showdelay"),
          +            bShowDelay = (nShowDelay > 0);
          +
          +
          +        if(bShowDelay) {
          +        
          +            this._cancelShowDelay();
          +        
          +        }
          +
          +
          +        var oActiveItem = this.activeItem;
          +    
          +        if(oActiveItem) {
          +    
          +            oActiveItem.cfg.setProperty("selected", false);
          +    
          +        }
          +
          +
          +        var oItemCfg = oItem.cfg;
          +    
          +        // Select and focus the current menu item
          +    
          +        oItemCfg.setProperty("selected", true);
          +
          +
          +        if (this.hasFocus()) {
          +        
          +            oItem.focus();
          +        
          +        }
          +
          +
          +        if(this.cfg.getProperty("autosubmenudisplay")) {
          +
          +            // Show the submenu this menu item
          +
          +            var oSubmenu = oItemCfg.getProperty("submenu");
          +        
          +            if(oSubmenu) {
          +        
          +                if(bShowDelay) {
          +
          +                    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) {
          +
          +    if(this._bStopMouseEventHandlers) {
          +    
          +        return false;
          +    
          +    }
          +
          +
          +    var oEvent = p_aArgs[0],
          +        oItem = p_aArgs[1],
          +        oRelatedTarget = Event.getRelatedTarget(oEvent),
          +        bMovingToSubmenu = false;
          +
          +
          +    if(oItem && !oItem.cfg.getProperty("disabled")) {
          +
          +        var oItemCfg = oItem.cfg,
          +            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
          +            )
          +        ) {
          +
          +            // Menu Item mouseout logic
          +
          +            if(!bMovingToSubmenu) {
          +
          +                oItem.cfg.setProperty("selected", false);
          +
          +
          +                if(oSubmenu) {
          +
          +                    var nSubmenuHideDelay = 
          +                            this.cfg.getProperty("submenuhidedelay"),
          +
          +                        nShowDelay = this.cfg.getProperty("showdelay");
          +
          +                    if(
          +                        !(this instanceof YAHOO.widget.MenuBar) && 
          +                        nSubmenuHideDelay > 0 && 
          +                        nShowDelay >= nSubmenuHideDelay
          +                    ) {
          +
          +                        this._execSubmenuHideDelay(
          +                                oSubmenu, 
          +                                Event.getPageX(oEvent),
          +                                nSubmenuHideDelay
          +                            );
          +
          +                    }
          +                    else {
          +
          +                        oSubmenu.hide();
          +
          +                    }
          +
          +                }
          +
          +            }
          +
          +
          +            oItem.handledMouseOutEvent = true;
          +            oItem.handledMouseOverEvent = false;
          +    
          +        }
          +
          +    }
          +
          +
          +    if(
          +        !this._bHandledMouseOutEvent && 
          +        (
          +            (
          +                oRelatedTarget != this.element &&  
          +                !Dom.isAncestor(this.element, oRelatedTarget)
          +            ) 
          +            || bMovingToSubmenu
          +        )
          +    ) {
          +
          +        // Menu mouseout logic
          +
          +        Event.removeListener(this.element, "mousemove", this._onMouseMove);
          +
          +        this._nCurrentMouseX = Event.getPageX(oEvent);
          +
          +        this._bHandledMouseOutEvent = true;
          +        this._bHandledMouseOverEvent = false;
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _onMouseMove
          +* @description "click" event handler for the menu.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that 
          +* fired the event.
          +*/
          +_onMouseMove: function(p_oEvent, p_oMenu) {
          +
          +    if(this._bStopMouseEventHandlers) {
          +    
          +        return false;
          +    
          +    }
          +
          +    this._nCurrentMouseX = Event.getPageX(p_oEvent);
          +
          +},
          +
          +
          +/**
          +* @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],
          +        oItem = p_aArgs[1],
          +        oTarget = Event.getTarget(oEvent);
          +
          +    if(oItem && !oItem.cfg.getProperty("disabled")) {
          +
          +        var oItemCfg = oItem.cfg,
          +            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();
          +                
          +                oSubmenu.parent.focus();
          +    
          +            }
          +            else {
          +
          +                this.clearActiveItem();
          +
          +                oItem.cfg.setProperty("selected", true);
          +
          +                oSubmenu.show();
          +                
          +                oSubmenu.setInitialFocus();
          +    
          +            }
          +    
          +        }
          +        else {
          +
          +            var sURL = oItemCfg.getProperty("url"),
          +                bCurrentPageURL = (sURL.substr((sURL.length-1),1) == "#"),
          +                sTarget = oItemCfg.getProperty("target"),
          +                bHasTarget = (sTarget && sTarget.length > 0);
          +
          +            /*
          +                Prevent the browser from following links 
          +                equal to "#"
          +            */
          +            
          +            if(
          +                oTarget.tagName.toUpperCase() == "A" && 
          +                bCurrentPageURL && !bHasTarget
          +            ) {
          +
          +                Event.preventDefault(oEvent);
          +
          +                oItem.focus();
          +            
          +            }
          +
          +            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 if(oRoot.cfg.getProperty("clicktohide")) {
          +
          +                    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],
          +        oItem = p_aArgs[1],
          +        me = this,
          +        oSubmenu;
          +
          +
          +    /*
          +        This function is called to prevent a bug in Firefox.  In Firefox,
          +        moving a DOM element into a stationary mouse pointer will cause the 
          +        browser to fire mouse events.  This can result in the menu mouse
          +        event handlers being called uncessarily, especially when menus are 
          +        moved into a stationary mouse pointer as a result of a 
          +        key event handler.
          +    */
          +    function stopMouseEventHandlers() {
          +
          +        me._bStopMouseEventHandlers = true;
          +        
          +        window.setTimeout(function() {
          +        
          +            me._bStopMouseEventHandlers = false;
          +        
          +        }, 10);
          +
          +    }
          +
          +
          +    if(oItem && !oItem.cfg.getProperty("disabled")) {
          +
          +        var oItemCfg = oItem.cfg,
          +            oParentItem = this.parent,
          +            oRoot,
          +            oNextItem;
          +
          +
          +        switch(oEvent.keyCode) {
          +    
          +            case 38:    // Up arrow
          +            case 40:    // Down arrow
          +    
          +                oNextItem = (oEvent.keyCode == 38) ? 
          +                    oItem.getPreviousEnabledSibling() : 
          +                    oItem.getNextEnabledSibling();
          +        
          +                if(oNextItem) {
          +
          +                    this.clearActiveItem();
          +
          +                    oNextItem.cfg.setProperty("selected", true);
          +                    oNextItem.focus();
          +
          +
          +                    if(this.cfg.getProperty("maxheight") > 0) {
          +
          +                        var oBody = this.body;
          +
          +                        oBody.scrollTop = 
          +
          +                            (
          +                                oNextItem.element.offsetTop + 
          +                                oNextItem.element.offsetHeight
          +                            ) - oBody.offsetHeight;
          +
          +
          +                        var nScrollTop = oBody.scrollTop,
          +                            nScrollTarget = 
          +                                oBody.scrollHeight - oBody.offsetHeight;
          +
          +                        if(nScrollTop === 0) {
          +
          +                            this._disableScrollHeader();
          +                            this._enableScrollFooter();
          +
          +                        }
          +                        else if(nScrollTop == nScrollTarget) {
          +
          +                             this._enableScrollHeader();
          +                             this._disableScrollFooter();
          +
          +                        }
          +                        else {
          +
          +                            this._enableScrollHeader();
          +                            this._enableScrollFooter();
          +
          +                        }
          +
          +                    }
          +
          +                }
          +
          +    
          +                Event.preventDefault(oEvent);
          +
          +                stopMouseEventHandlers();
          +    
          +            break;
          +            
          +    
          +            case 39:    // Right arrow
          +    
          +                oSubmenu = oItemCfg.getProperty("submenu");
          +    
          +                if(oSubmenu) {
          +    
          +                    if(!oItemCfg.getProperty("selected")) {
          +        
          +                        oItemCfg.setProperty("selected", true);
          +        
          +                    }
          +    
          +                    oSubmenu.show();
          +                    oSubmenu.setInitialFocus();
          +                    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);
          +
          +                stopMouseEventHandlers();
          +
          +            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);
          +
          +                stopMouseEventHandlers();
          +
          +            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.blur();
          +                this.activeItem.cfg.setProperty("selected", false);
          +        
          +            }
          +        
          +        }
          +
          +
          +        Event.preventDefault(oEvent);
          +    
          +    }
          +    
          +},
          +
          +
          +/**
          +* @method _onKeyPress
          +* @description "keypress" event handler for a Menu instance.
          +* @protected
          +* @param {String} p_sType The name of the event that was fired.
          +* @param {Array} p_aArgs Collection of arguments sent when the event 
          +* was fired.
          +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance that fired the event.
          +*/
          +_onKeyPress: function(p_sType, p_aArgs, p_oMenu) {
          +    
          +    var oEvent = p_aArgs[0];
          +
          +
          +    if(oEvent.keyCode == 40 || oEvent.keyCode == 38) {
          +
          +        YAHOO.util.Event.preventDefault(oEvent);
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _onTextResize
          +* @description "textresize" 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.
          +*/
          +_onTextResize: function(p_sType, p_aArgs, p_oMenu) {
          +
          +    if(this.browser == "gecko" && !this._handleResize) {
          +
          +        this._handleResize = true;
          +        return;
          +    
          +    }
          +
          +
          +    var oConfig = this.cfg;
          +
          +    if(oConfig.getProperty("position") == "dynamic") {
          +
          +        oConfig.setProperty("width", (this._getOffsetWidth() + "px"));
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _onScrollTargetMouseOver
          +* @description "mouseover" event handler for the menu's "header" and "footer" 
          +* elements.  Used to scroll the body of the menu up and down when the 
          +* menu's "maxheight" configuration property is set to a value greater than 0.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that 
          +* fired the event.
          +*/
          +_onScrollTargetMouseOver: function(p_oEvent, p_oMenu) {
          +
          +    this._cancelHideDelay();
          +
          +    var oTarget = Event.getTarget(p_oEvent),
          +        oBody = this.body,
          +        me = this,
          +        nScrollTarget,
          +        fnScrollFunction;
          +
          +
          +    function scrollBodyDown() {
          +
          +        var nScrollTop = oBody.scrollTop;
          +
          +
          +        if(nScrollTop < nScrollTarget) {
          +
          +            oBody.scrollTop = (nScrollTop + 1);
          +
          +            me._enableScrollHeader();
          +
          +        }
          +        else {
          +
          +            oBody.scrollTop = nScrollTarget;
          +            
          +            window.clearInterval(me._nBodyScrollId);
          +
          +            me._disableScrollFooter();
          +
          +        }
          +
          +    }
          +
          +
          +    function scrollBodyUp() {
          +
          +        var nScrollTop = oBody.scrollTop;
          +
          +
          +        if(nScrollTop > 0) {
          +
          +            oBody.scrollTop = (nScrollTop - 1);
          +
          +            me._enableScrollFooter();
          +
          +        }
          +        else {
          +
          +            oBody.scrollTop = 0;
          +            
          +            window.clearInterval(me._nBodyScrollId);
          +
          +            me._disableScrollHeader();
          +
          +        }
          +
          +    }
          +
          +    
          +    if(Dom.hasClass(oTarget, "hd")) {
          +
          +        fnScrollFunction = scrollBodyUp;
          +    
          +    }
          +    else {
          +
          +        nScrollTarget = oBody.scrollHeight - oBody.offsetHeight;
          +
          +        fnScrollFunction = scrollBodyDown;
          +    
          +    }
          +
          +
          +    this._nBodyScrollId = window.setInterval(fnScrollFunction, 10);
          +
          +},
          +
          +
          +/**
          +* @method _onScrollTargetMouseOut
          +* @description "mouseout" event handler for the menu's "header" and "footer" 
          +* elements.  Used to stop scrolling the body of the menu up and down when the 
          +* menu's "maxheight" configuration property is set to a value greater than 0.
          +* @protected
          +* @param {Event} p_oEvent Object representing the DOM event object passed 
          +* back by the event utility (YAHOO.util.Event).
          +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that 
          +* fired the event.
          +*/
          +_onScrollTargetMouseOut: function(p_oEvent, p_oMenu) {
          +
          +    window.clearInterval(this._nBodyScrollId);
          +
          +    this._cancelHideDelay();
          +
          +},
          +
          +
          +
          +// 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) {
          +
          +    this.cfg.subscribeToConfigEvent("width", this._onWidthChange);
          +    this.cfg.subscribeToConfigEvent("visible", this._onVisibleChange);
          +
          +    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,
          +        oEl = this.element,
          +        nListElements = this._aListElements.length;
          +
          +
          +    if(nListElements > 0) {
          +
          +        var i = 0,
          +            bFirstList = true,
          +            oUL,
          +            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.
          +*/
          +_onRender: function(p_sType, p_aArgs) {
          +
          +    if (
          +        this.cfg.getProperty("position") == "dynamic" && 
          +        !this.cfg.getProperty("width")
          +    ) {
          +
          +        this._setWidth();
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @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);
          +            
          +            }
          +        
          +        }
          +
          +
          +        var oSrcElement = this.srcElement;
          +
          +        if(oSrcElement) {
          +
          +            if(oSrcElement.tagName.toUpperCase() == "SELECT") {
          +
          +                if(Dom.inDocument(oSrcElement)) {
          +
          +                    this.render(oSrcElement.parentNode);
          +                
          +                }
          +                else {
          +                
          +                    this.render(this.cfg.getProperty("container"));
          +                
          +                }
          +
          +            }
          +            else {
          +
          +                this.render();
          +
          +            }
          +
          +        }
          +        else {
          +
          +            if(this.parent) {
          +
          +                this.render(this.parent.element);            
          +
          +            }
          +            else {
          +
          +                this.render(this.cfg.getProperty("container"));
          +                this.cfg.refireEvent("xy");
          +
          +            }                
          +
          +        }
          +
          +    }
          +
          +
          +    if(this.cfg.getProperty("position") == "dynamic") {
          +
          +        var nViewportHeight = Dom.getViewportHeight();
          +
          +
          +        if(this.parent && this.parent.parent instanceof YAHOO.widget.MenuBar) {
          +           
          +            var oRegion = YAHOO.util.Region.getRegion(this.parent.element);
          +            
          +            nViewportHeight = (nViewportHeight - oRegion.bottom);
          +
          +        }
          +
          +
          +        if(this.element.offsetHeight >= nViewportHeight) {
          +    
          +            var nMaxHeight = this.cfg.getProperty("maxheight");
          +
          +            /*
          +                Cache the original value for the "maxheight" configuration  
          +                property so that we can set it back when the menu is hidden.
          +            */
          +    
          +            this._nMaxHeight = nMaxHeight;
          +
          +            this.cfg.setProperty("maxheight", (nViewportHeight - 20));
          +        
          +        }
          +    
          +    
          +        if(this.cfg.getProperty("maxheight") > 0) {
          +    
          +            var oBody = this.body;
          +    
          +            if(oBody.scrollTop > 0) {
          +    
          +                oBody.scrollTop = 0;
          +    
          +            }
          +
          +            this._disableScrollHeader();
          +            this._enableScrollFooter();
          +    
          +        }
          +
          +    }
          +
          +
          +},
          +
          +
          +/**
          +* @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) {
          +
          +    var oParent = this.parent;
          +    
          +    if(oParent) {
          +
          +        var oParentMenu = oParent.parent,
          +            aParentAlignment = oParentMenu.cfg.getProperty("submenualignment"),
          +            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);
          +
          +
          +            function disableAutoSubmenuDisplay(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.on(document, "mousedown", disableAutoSubmenuDisplay);                             
          +            Event.on(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) {
          +
          +    var oActiveItem = this.activeItem;
          +
          +    if(oActiveItem) {
          +
          +        var oConfig = oActiveItem.cfg;
          +
          +        oConfig.setProperty("selected", false);
          +
          +        var oSubmenu = oConfig.getProperty("submenu");
          +
          +        if(oSubmenu) {
          +
          +            oSubmenu.hide();
          +
          +        }
          +
          +    }
          +
          +    if (this == this.getRoot()) {
          +
          +        this.blur();
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @method _onHide
          +* @description "hide" 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.
          +*/
          +_onHide: function(p_sType, p_aArgs, p_oMenu) {
          +
          +    if(this._nMaxHeight != -1) {
          +
          +        this.cfg.setProperty("maxheight", this._nMaxHeight);
          +
          +        this._nMaxHeight = -1;
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @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],
          +        oPropertyValue = p_aArgs[0][1];
          +
          +    switch(sPropertyName) {
          +
          +        case "iframe":
          +        case "constraintoviewport":
          +        case "hidedelay":
          +        case "showdelay":
          +        case "submenuhidedelay":
          +        case "clicktohide":
          +        case "effect":
          +        case "classname":
          +
          +            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) {
          +
          +    var oParentMenu = p_oSubmenu.parent.parent,
          +
          +        oConfig = {
          +
          +            constraintoviewport: 
          +                oParentMenu.cfg.getProperty("constraintoviewport"),
          +
          +            xy: [0,0],
          +                
          +            clicktohide: oParentMenu.cfg.getProperty("clicktohide"),
          +                
          +            effect: oParentMenu.cfg.getProperty("effect"),
          +
          +            showdelay: oParentMenu.cfg.getProperty("showdelay"),
          +            
          +            hidedelay: oParentMenu.cfg.getProperty("hidedelay"),
          +
          +            submenuhidedelay: oParentMenu.cfg.getProperty("submenuhidedelay"),
          +
          +            classname: oParentMenu.cfg.getProperty("classname")
          +
          +        };
          +
          +
          +    /*
          +        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) {
          +
          +        var oLI = this.parent.element;
          +
          +        if(this.element.parentNode == oLI) {
          +    
          +            this.render();
          +    
          +        }
          +        else {
          +
          +            this.render(oLI);
          +    
          +        }
          +
          +    }
          +    
          +},
          +
          +
          +/**
          +* @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,
          +        aAlignment = oParent.parent.cfg.getProperty("submenualignment");
          +
          +    this.cfg.setProperty(
          +        "context", 
          +        [oParent.element, aAlignment[0], aAlignment[1]]
          +    );
          +
          +
          +    var nScrollTop = oParent.parent.body.scrollTop;
          +
          +    if(
          +        (this.browser == "gecko" || this.browser == "safari") 
          +        && nScrollTop > 0
          +    ) {
          +
          +         this.cfg.setProperty("y", (this.cfg.getProperty("y") - nScrollTop));
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @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.
          +*/
          +_onSubmenuShow: function(p_sType, p_aArgs) {
          +    
          +    this.submenuIndicator.firstChild.nodeValue = 
          +        this.EXPANDED_SUBMENU_INDICATOR_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.
          +*/
          +_onSubmenuHide: function(p_sType, p_aArgs) {
          +    
          +    this.submenuIndicator.firstChild.nodeValue =
          +        this.COLLAPSED_SUBMENU_INDICATOR_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.
          +*/
          +_onMenuItemFocus: function(p_sType, p_aArgs) {
          +
          +    this.parent.focusEvent.fire(this);
          +
          +},
          +
          +
          +/**
          +* @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.parent.blurEvent.fire(this);
          +
          +},
          +
          +
          +/**
          +* @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 sPropertyName = p_aArgs[0][0],
          +        oPropertyValue = p_aArgs[0][1];
          +
          +    switch(sPropertyName) {
          +
          +        case "selected":
          +
          +            if (oPropertyValue === true) {
          +
          +                this.activeItem = p_oItem;
          +            
          +            }
          +
          +        break;
          +
          +        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) {
          +
          +    if(this.parent && !(this.parent.parent instanceof YAHOO.widget.MenuBar)) {
          +    
          +        var oConfig = this.cfg,
          +            pos = args[0],
          +            
          +            x = pos[0],
          +            y = pos[1],
          +            
          +            offsetHeight = this.element.offsetHeight,
          +            offsetWidth = this.element.offsetWidth,
          +            
          +            viewPortWidth = YAHOO.util.Dom.getViewportWidth(),
          +            viewPortHeight = YAHOO.util.Dom.getViewportHeight(),
          +            
          +            scrollX = Math.max(
          +                    document.documentElement.scrollLeft, 
          +                    document.body.scrollLeft
          +                ),
          +            
          +            scrollY = Math.max(
          +                    document.documentElement.scrollTop, 
          +                    document.body.scrollTop
          +                ),
          +            
          +            nPadding = (
          +                            this.parent && 
          +                            this.parent.parent instanceof YAHOO.widget.MenuBar
          +                        ) ? 0 : 10,
          +            
          +            topConstraint = scrollY + nPadding,
          +            leftConstraint = scrollX + nPadding,
          +            bottomConstraint = 
          +                scrollY + viewPortHeight - offsetHeight - nPadding,
          +            rightConstraint = scrollX + viewPortWidth - offsetWidth - nPadding,
          +            
          +            aContext = oConfig.getProperty("context"),
          +            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);
          +        oConfig.setProperty("xy", [x,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],
          +    	    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",
          +        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],
          +        oMouseOutEvent = this.mouseOutEvent,
          +        oMouseOverEvent = this.mouseOverEvent,
          +        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._bHideDelayEventHandlersAssigned) {
          +
          +            oMouseOutEvent.subscribe(this._execHideDelay, this);
          +            oMouseOverEvent.subscribe(this._cancelHideDelay, this, true);
          +            oKeyDownEvent.subscribe(this._cancelHideDelay, this, true);
          +
          +            this._bHideDelayEventHandlersAssigned = true;
          +        
          +        }
          +
          +    }
          +    else {
          +
          +        oMouseOutEvent.unsubscribe(this._execHideDelay, this);
          +        oMouseOverEvent.unsubscribe(this._cancelHideDelay, this);
          +        oKeyDownEvent.unsubscribe(this._cancelHideDelay, this);
          +
          +        this._bHideDelayEventHandlersAssigned = 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
          +            );
          +
          +	}
          +
          +},
          +
          +
          +/**
          +* @method _setMaxHeight
          +* @description "renderEvent" handler used to defer the setting of the 
          +* "maxheight" configuration property until the menu is rendered in lazy 
          +* load scenarios.
          +* @param {String} p_sType The name of the event that was fired.
          +* @param {Array} p_aArgs Collection of arguments sent when the event 
          +* was fired.
          +* @param {Number} p_nMaxHeight Number representing the value to set for the 
          +* "maxheight" configuration property.
          +* @private
          +*/
          +_setMaxHeight: function(p_sType, p_aArgs, p_nMaxHeight) {
          +
          +    this.cfg.setProperty("maxheight", p_nMaxHeight);
          +    this.renderEvent.unsubscribe(this._setMaxHeight);
          +
          +},
          +
          +
          +/**
          +* @method configMaxHeight
          +* @description Event handler for when the "maxheight" configuration property of 
          +* a Menu changes.
          +* @param {String} p_sType The name of the event that was fired.
          +* @param {Array} p_aArgs Collection of arguments sent when the event 
          +* was fired.
          +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance fired
          +* the event.
          +*/
          +configMaxHeight: function(p_sType, p_aArgs, p_oMenu) {
          +
          +    var nMaxHeight = p_aArgs[0],
          +        oBody = this.body;
          +
          +
          +    if(this.lazyLoad && !oBody) {
          +
          +        this.renderEvent.unsubscribe(this._setMaxHeight);
          +    
          +        if(nMaxHeight > 0) {
          +
          +            this.renderEvent.subscribe(this._setMaxHeight, nMaxHeight, this);
          +
          +        }
          +
          +        return;
          +    
          +    }
          +
          +    Dom.setStyle(oBody, "height", "auto");
          +    Dom.setStyle(oBody, "overflow", "visible");    
          +
          +    var oHeader = this.header,
          +        oFooter = this.footer,
          +        fnMouseOver = this._onScrollTargetMouseOver,
          +        fnMouseOut = this._onScrollTargetMouseOut;
          +
          +
          +    if((nMaxHeight > 0) && (oBody.offsetHeight > nMaxHeight)) {
          +
          +        if(!this.cfg.getProperty("width")) {
          +
          +            this._setWidth();
          +
          +        }
          +
          +        if(!oHeader && !oFooter) {
          +
          +            this.setHeader("&#32;");
          +            this.setFooter("&#32;");
          +
          +            oHeader = this.header;
          +            oFooter = this.footer;
          +
          +            Dom.addClass(oHeader, "topscrollbar");
          +            Dom.addClass(oFooter, "bottomscrollbar");
          +            
          +            this.element.insertBefore(oHeader, oBody);
          +            this.element.appendChild(oFooter);
          +
          +            Event.on(oHeader, "mouseover", fnMouseOver, this, true);
          +            Event.on(oHeader, "mouseout", fnMouseOut, this, true);
          +            Event.on(oFooter, "mouseover", fnMouseOver, this, true);
          +            Event.on(oFooter, "mouseout", fnMouseOut, this, true);
          +        
          +        }
          +
          +        var nHeight = 
          +
          +                (
          +                    nMaxHeight - 
          +                    (this.footer.offsetHeight + this.header.offsetHeight)
          +                );
          +
          +        Dom.setStyle(oBody, "height", (nHeight + "px"));
          +        Dom.setStyle(oBody, "overflow", "hidden");
          +
          +    }
          +    else if(oHeader && oFooter) {
          +
          +        Dom.setStyle(oBody, "height", "auto");
          +        Dom.setStyle(oBody, "overflow", "visible");
          +
          +        Event.removeListener(oHeader, "mouseover", fnMouseOver);
          +        Event.removeListener(oHeader, "mouseout", fnMouseOut);
          +        Event.removeListener(oFooter, "mouseover", fnMouseOver);
          +        Event.removeListener(oFooter, "mouseout", fnMouseOut);
          +
          +        this.element.removeChild(oHeader);
          +        this.element.removeChild(oFooter);
          +    
          +        this.header = null;
          +        this.footer = null;
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @method configClassName
          +* @description Event handler for when the "classname" configuration property of 
          +* a menu changes.
          +* @param {String} p_sType The name of the event that was fired.
          +* @param {Array} p_aArgs Collection of arguments sent when the event was fired.
          +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance fired the event.
          +*/
          +configClassName: function(p_sType, p_aArgs, p_oMenu) {
          +
          +    var sClassName = p_aArgs[0];
          +
          +    if(this._sClassName) {
          +
          +        Dom.removeClass(this.element, this._sClassName);
          +
          +    }
          +
          +    Dom.addClass(this.element, sClassName);
          +    this._sClassName = sClassName;
          +
          +},
          +
          +
          +
          +// Public methods
          +
          +
          +
          +/**
          +* @method initEvents
          +* @description Initializes the custom events for the menu.
          +*/
          +initEvents: function() {
          +
          +	YAHOO.widget.Menu.superclass.initEvents.call(this);
          +
          +    // Create custom events
          +
          +    var EVENT_TYPES = YAHOO.widget.Menu._EVENT_TYPES;
          +
          +    this.mouseOverEvent = new CustomEvent(EVENT_TYPES.MOUSE_OVER, this);
          +    this.mouseOutEvent = new CustomEvent(EVENT_TYPES.MOUSE_OUT, this);
          +    this.mouseDownEvent = new CustomEvent(EVENT_TYPES.MOUSE_DOWN, this);
          +    this.mouseUpEvent = new CustomEvent(EVENT_TYPES.MOUSE_UP, this);
          +    this.clickEvent = new CustomEvent(EVENT_TYPES.CLICK, this);
          +    this.keyPressEvent = new CustomEvent(EVENT_TYPES.KEY_PRESS, this);
          +    this.keyDownEvent = new CustomEvent(EVENT_TYPES.KEY_DOWN, this);
          +    this.keyUpEvent = new CustomEvent(EVENT_TYPES.KEY_UP, this);
          +    this.focusEvent = new CustomEvent(EVENT_TYPES.FOCUS, this);
          +    this.blurEvent = new CustomEvent(EVENT_TYPES.BLUR, this);
          +    this.itemAddedEvent = new CustomEvent(EVENT_TYPES.ITEM_ADDED, this);
          +    this.itemRemovedEvent = new CustomEvent(EVENT_TYPES.ITEM_REMOVED, 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() {
          +
          +    var sReturnVal = "Menu",
          +        sId = this.id;
          +
          +    if(sId) {
          +
          +        sReturnVal += (" " + sId);
          +    
          +    }
          +
          +    return sReturnVal;
          +
          +},
          +
          +
          +/**
          +* @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,
          +            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,
          +            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) {
          +
          +    if(Lang.isArray(p_aItems)) {
          +
          +        var nItems = p_aItems.length,
          +            aItems = [],
          +            oItem;
          +
          +
          +        for(var i=0; i<nItems; i++) {
          +
          +            oItem = p_aItems[i];
          +
          +            if(oItem) {
          +
          +                if(Lang.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();
          +
          +            this.logger.log("Item removed." + 
          +                " Text: " + oItem.cfg.getProperty("text") + ", " + 
          +                " Index: " + oItem.index + ", " + 
          +                " Group Index: " + oItem.groupIndex);
          +
          +            return oItem;
          +
          +        }
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method getItems
          +* @description Returns an array of all of the items in the menu.
          +* @return {Array}
          +*/
          +getItems: function() {
          +
          +    var aGroups = this._aItemGroups,
          +        nGroups = aGroups.length;
          +
          +    return (
          +                (nGroups == 1) ? aGroups[0] : 
          +                    (Array.prototype.concat.apply([], aGroups))
          +            );
          +
          +},
          +
          +
          +/**
          +* @method getItemGroups
          +* @description Multi-dimensional Array representing the menu items as they 
          +* are grouped 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 clearContent
          +* @description Removes all of the content from the menu, including the menu 
          +* items, group titles, header and footer.
          +*/
          +clearContent: function() {
          +
          +    var aItems = this.getItems(),
          +        nItems = aItems.length,
          +        oElement = this.element,
          +        oBody = this.body,
          +        oHeader = this.header,
          +        oFooter = this.footer;
          +
          +
          +    if(nItems > 0) {
          +
          +        var i = nItems - 1,
          +            oItem,
          +            oSubmenu;
          +
          +        do {
          +
          +            oItem = aItems[i];
          +
          +            if(oItem) {
          +
          +                oSubmenu = oItem.cfg.getProperty("submenu");
          +
          +                if(oSubmenu) {
          +
          +                    this.cfg.configChangedEvent.unsubscribe(
          +                                this._onParentMenuConfigChange, 
          +                                oSubmenu
          +                            );
          +
          +                    this.renderEvent.unsubscribe(
          +                                        this._onParentMenuRender, 
          +                                        oSubmenu
          +                                    );
          +
          +                }
          +
          +                oItem.destroy();
          +
          +            }
          +        
          +        }
          +        while(i--);
          +
          +    }
          +
          +
          +    if(oHeader) {
          +
          +        Event.purgeElement(oHeader);
          +        oElement.removeChild(oHeader);
          +
          +    }
          +    
          +
          +    if(oFooter) {
          +
          +        Event.purgeElement(oFooter);
          +        oElement.removeChild(oFooter);
          +    }
          +
          +
          +    if(oBody) {
          +
          +        Event.purgeElement(oBody);
          +
          +        oBody.innerHTML = "";
          +
          +    }
          +
          +
          +    this._aItemGroups = [];
          +    this._aListElements = [];
          +    this._aGroupTitleElements = [];
          +    
          +    this.cfg.setProperty("width", null);
          +
          +},
          +
          +
          +/**
          +* @method destroy
          +* @description Removes the menu's <code>&#60;div&#62;</code> element 
          +* (and accompanying child nodes) from the document.
          +*/
          +destroy: function() {
          +
          +    // Remove all DOM event listeners
          +
          +    Event.purgeElement(this.element);
          +
          +
          +    // 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();
          +    this.focusEvent.unsubscribeAll();
          +    this.blurEvent.unsubscribeAll();
          +    this.itemAddedEvent.unsubscribeAll();
          +    this.itemRemovedEvent.unsubscribeAll();
          +    this.cfg.unsubscribeFromConfigEvent("width", this._onWidthChange);
          +    this.cfg.unsubscribeFromConfigEvent("visible", this._onVisibleChange);
          +
          +    if (this._hasSetWidthHandlers) {
          +
          +        this.itemAddedEvent.unsubscribe(this._setWidth);
          +        this.itemRemovedEvent.unsubscribe(this._setWidth);
          +
          +        this._hasSetWidthHandlers = false;
          +
          +    }
          +
          +    YAHOO.widget.Module.textResizeEvent.unsubscribe(this._onTextResize, this);
          +
          +
          +    // Remove all items
          +
          +    this.clearContent();
          +
          +
          +    this._aItemGroups = null;
          +    this._aListElements = null;
          +    this._aGroupTitleElements = null;
          +
          +
          +    // Continue with the superclass implementation of this method
          +
          +    YAHOO.widget.Menu.superclass.destroy.call(this);
          +    
          +    this.logger.log("Destroyed.");
          +
          +},
          +
          +
          +/**
          +* @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;
          +
          +        if(p_bBlur) {
          +
          +            oActiveItem.blur();
          +        
          +        }
          +
          +        oConfig.setProperty("selected", false);
          +
          +        var oSubmenu = oConfig.getProperty("submenu");
          +
          +        if(oSubmenu) {
          +
          +            oSubmenu.hide();
          +
          +        }
          +
          +        this.activeItem = null;            
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method focus
          +* @description Causes the menu to receive focus and fires the "focus" event.
          +*/
          +focus: function() {
          +
          +    if (!this.hasFocus()) {
          +
          +        this.setInitialFocus();
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @method blur
          +* @description Causes the menu to lose focus and fires the "blur" event.
          +*/    
          +blur: function() {
          +
          +    if (this.hasFocus()) {
          +    
          +        var oItem = YAHOO.widget.MenuManager.getFocusedMenuItem();
          +        
          +        if (oItem) {
          +
          +            oItem.blur();
          +
          +        }
          +
          +    }
          +
          +},
          +
          +
          +/**
          +* @method hasFocus
          +* @description Returns a boolean indicating whether or not the menu has focus.
          +* @return {Boolean}
          +*/
          +hasFocus: function() {
          +
          +    return (YAHOO.widget.MenuManager.getFocusedMenu() == this.getRoot());
          +
          +},
          +
          +
          +/**
          +* @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,
          +        DEFAULT_CONFIG = YAHOO.widget.Menu._DEFAULT_CONFIG;
          +
          +	// Add configuration attributes
          +
          +    /*
          +        Change the default value for the "visible" configuration 
          +        property to "false" by re-adding the property.
          +    */
          +
          +    /**
          +    * @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(
          +        DEFAULT_CONFIG.VISIBLE.key, 
          +        {
          +            handler: this.configVisible, 
          +            value: DEFAULT_CONFIG.VISIBLE.value, 
          +            validator: DEFAULT_CONFIG.VISIBLE.validator
          +         }
          +     );
          +
          +
          +    /*
          +        Change the default value for the "constraintoviewport" configuration 
          +        property to "true" by re-adding the property.
          +    */
          +
          +    /**
          +    * @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(
          +        DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.key, 
          +        {
          +            handler: this.configConstrainToViewport, 
          +            value: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.value, 
          +            validator: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.validator, 
          +            supercedes: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.supercedes 
          +        } 
          +    );
          +
          +
          +    /**
          +    * @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(
          +        DEFAULT_CONFIG.POSITION.key, 
          +        {
          +            handler: this.configPosition,
          +            value: DEFAULT_CONFIG.POSITION.value, 
          +            validator: DEFAULT_CONFIG.POSITION.validator,
          +            supercedes: DEFAULT_CONFIG.POSITION.supercedes
          +        }
          +    );
          +
          +
          +    /**
          +    * @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(
          +        DEFAULT_CONFIG.SUBMENU_ALIGNMENT.key, 
          +        { 
          +            value: DEFAULT_CONFIG.SUBMENU_ALIGNMENT.value 
          +        }
          +    );
          +
          +
          +    /**
          +    * @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(
          +	   DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.key, 
          +	   { 
          +	       value: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.value, 
          +	       validator: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.validator
          +       } 
          +    );
          +
          +
          +    /**
          +    * @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 250
          +    * @type Number
          +    */
          +	oConfig.addProperty(
          +	   DEFAULT_CONFIG.SHOW_DELAY.key, 
          +	   { 
          +	       value: DEFAULT_CONFIG.SHOW_DELAY.value, 
          +	       validator: DEFAULT_CONFIG.SHOW_DELAY.validator
          +       } 
          +    );
          +
          +
          +    /**
          +    * @config hidedelay
          +    * @description Number indicating the time (in milliseconds) that should 
          +    * expire before the menu is hidden.
          +    * @default 0
          +    * @type Number
          +    */
          +	oConfig.addProperty(
          +	   DEFAULT_CONFIG.HIDE_DELAY.key, 
          +	   { 
          +	       handler: this.configHideDelay,
          +	       value: DEFAULT_CONFIG.HIDE_DELAY.value, 
          +	       validator: DEFAULT_CONFIG.HIDE_DELAY.validator, 
          +	       suppressEvent: DEFAULT_CONFIG.HIDE_DELAY.suppressEvent
          +       } 
          +    );
          +
          +
          +    /**
          +    * @config submenuhidedelay
          +    * @description Number indicating the time (in milliseconds) that should 
          +    * expire before a submenu is hidden when the user mouses out of a menu item 
          +    * heading in the direction of a submenu.  The value must be greater than or 
          +    * equal to the value specified for the "showdelay" configuration property.
          +    * @default 250
          +    * @type Number
          +    */
          +	oConfig.addProperty(
          +	   DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.key, 
          +	   { 
          +	       value: DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.value, 
          +	       validator: DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.validator
          +       } 
          +    );
          +
          +
          +    /**
          +    * @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(
          +        DEFAULT_CONFIG.CLICK_TO_HIDE.key,
          +        {
          +            value: DEFAULT_CONFIG.CLICK_TO_HIDE.value,
          +            validator: DEFAULT_CONFIG.CLICK_TO_HIDE.validator
          +        }
          +    );
          +
          +
          +	/**
          +	* @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
          +	*/
          +	oConfig.addProperty(
          +	   DEFAULT_CONFIG.CONTAINER.key, 
          +	   { 
          +	       handler: this.configContainer,
          +	       value: document.body
          +       } 
          +   );
          +
          +
          +    /**
          +    * @config maxheight
          +    * @description Defines the maximum height (in pixels) for a menu before the
          +    * contents of the body are scrolled.
          +    * @default 0
          +    * @type Number
          +    */
          +    oConfig.addProperty(
          +       DEFAULT_CONFIG.MAX_HEIGHT.key, 
          +       {
          +            handler: this.configMaxHeight,
          +            value: DEFAULT_CONFIG.MAX_HEIGHT.value,
          +            validator: DEFAULT_CONFIG.MAX_HEIGHT.validator
          +       } 
          +    );
          +
          +
          +    /**
          +    * @config classname
          +    * @description CSS class to be applied to the menu's root 
          +    * <code>&#60;div&#62;</code> element.  The specified class(es) are 
          +    * appended in addition to the default class as specified by the menu's
          +    * CSS_CLASS_NAME constant.
          +    * @default null
          +    * @type String
          +    */
          +    oConfig.addProperty(
          +        DEFAULT_CONFIG.CLASS_NAME.key, 
          +        { 
          +            handler: this.configClassName,
          +            value: DEFAULT_CONFIG.CLASS_NAME.value, 
          +            validator: DEFAULT_CONFIG.CLASS_NAME.validator
          +        }
          +    );
          +
          +}
          +
          +}); // END YAHOO.lang.extend
          +
          +})();
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/menubar.js.html b/www/extras/yui/docs/menubar.js.html new file mode 100644 index 000000000..5929262d8 --- /dev/null +++ b/www/extras/yui/docs/menubar.js.html @@ -0,0 +1,566 @@ + + + + API: menu menubar.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Menu  2.2.2

          +

          + Yahoo! UI Library + > menu + + > menubar.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +* 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
          +        );
          +
          +};
          +
          +
          +/**
          +* Constant representing the MenuBar's configuration properties
          +* @property YAHOO.widget.MenuBar._DEFAULT_CONFIG
          +* @private
          +* @final
          +* @type Object
          +*/
          +YAHOO.widget.MenuBar._DEFAULT_CONFIG = {
          +
          +    "POSITION": { 
          +        key: "position", 
          +        value: "static", 
          +        validator: YAHOO.widget.Menu._checkPosition, 
          +        supercedes: ["visible"] 
          +    }, 
          +
          +    "SUBMENU_ALIGNMENT": { 
          +        key: "submenualignment", 
          +        value: ["tl","bl"] 
          +    },
          +
          +    "AUTO_SUBMENU_DISPLAY": { 
          +        key: "autosubmenudisplay", 
          +        value: false, 
          +        validator: YAHOO.lang.isBoolean 
          +    }
          +
          +};
          +
          +
          +
          +YAHOO.lang.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,
          +        oEvent = p_aArgs[0],
          +        oItem = p_aArgs[1],
          +        oSubmenu;
          +
          +
          +    if(oItem && !oItem.cfg.getProperty("disabled")) {
          +
          +        var oItemCfg = oItem.cfg;
          +
          +        switch(oEvent.keyCode) {
          +    
          +            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();
          +                            
          +                            }
          +                
          +                        }           
          +    
          +                        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;
          +    
          +        }
          +
          +    }
          +
          +
          +    if(oEvent.keyCode == 27 && this.activeItem) { // Esc key
          +
          +        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);
          +    
          +    }
          +
          +},
          +
          +
          +/**
          +* @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 && !oItem.cfg.getProperty("disabled")) {
          +
          +         var Event = YAHOO.util.Event,
          +             Dom = YAHOO.util.Dom,
          +    
          +             oEvent = p_aArgs[0],
          +             oTarget = Event.getTarget(oEvent),
          +    
          +             oActiveItem = this.activeItem,
          +             oConfig = this.cfg;
          +
          +
          +        // Hide any other submenus that might be visible
          +    
          +        if(oActiveItem && oActiveItem != oItem) {
          +    
          +            this.clearActiveItem();
          +    
          +        }
          +
          +    
          +        oItem.cfg.setProperty("selected", true);
          +    
          +
          +        // 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() {
          +
          +    var sReturnVal = "MenuBar",
          +        sId = this.id;
          +
          +    if(sId) {
          +
          +        sReturnVal += (" " + sId);
          +    
          +    }
          +
          +    return sReturnVal;
          +
          +},
          +
          +
          +/**
          +* @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,
          +        DEFAULT_CONFIG = YAHOO.widget.MenuBar._DEFAULT_CONFIG;
          +
          +	// Add configuration properties
          +
          +
          +    /*
          +        Set the default value for the "position" configuration property
          +        to "static" by re-adding the property.
          +    */
          +
          +
          +    /**
          +    * @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(
          +        DEFAULT_CONFIG.POSITION.key, 
          +        {
          +            handler: this.configPosition, 
          +            value: DEFAULT_CONFIG.POSITION.value, 
          +            validator: DEFAULT_CONFIG.POSITION.validator,
          +            supercedes: DEFAULT_CONFIG.POSITION.supercedes
          +        }
          +    );
          +
          +
          +    /*
          +        Set the default value for the "submenualignment" configuration property
          +        to ["tl","bl"] by re-adding the property.
          +    */
          +
          +    /**
          +    * @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(
          +        DEFAULT_CONFIG.SUBMENU_ALIGNMENT.key, 
          +        {
          +            value: DEFAULT_CONFIG.SUBMENU_ALIGNMENT.value
          +        }
          +    );
          +
          +
          +    /*
          +        Change the default value for the "autosubmenudisplay" configuration 
          +        property to "false" by re-adding the property.
          +    */
          +
          +    /**
          +    * @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(
          +	   DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.key, 
          +	   {
          +	       value: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.value, 
          +	       validator: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.validator
          +       } 
          +    );
          +
          +}
          + 
          +}); // END YAHOO.lang.extend
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/menubaritem.js.html b/www/extras/yui/docs/menubaritem.js.html new file mode 100644 index 000000000..40c02522f --- /dev/null +++ b/www/extras/yui/docs/menubaritem.js.html @@ -0,0 +1,239 @@ + + + + API: menu menubaritem.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Menu  2.2.2

          +

          + Yahoo! UI Library + > menu + + > menubaritem.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +* 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.lang.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",
          +
          +
          +
          +// Public methods
          +
          +
          +/**
          +* @method toString
          +* @description Returns a string representing the menu bar item.
          +* @return {String}
          +*/
          +toString: function() {
          +
          +    var sReturnVal = "MenuBarItem";
          +
          +    if(this.cfg && this.cfg.getProperty("text")) {
          +
          +        sReturnVal += (": " + this.cfg.getProperty("text"));
          +
          +    }
          +
          +    return sReturnVal;
          +
          +}
          +    
          +}); // END YAHOO.lang.extend
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/menuitem.js.html b/www/extras/yui/docs/menuitem.js.html new file mode 100644 index 000000000..914edefdb --- /dev/null +++ b/www/extras/yui/docs/menuitem.js.html @@ -0,0 +1,2395 @@ + + + + API: menu menuitem.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Menu  2.2.2

          +

          + Yahoo! UI Library + > menu + + > menuitem.js (source view) +

          +
          + +
          +
          +
          + +
          +
          (function() {
          +
          +var Dom = YAHOO.util.Dom,
          +    Module = YAHOO.widget.Module,
          +    Menu = YAHOO.widget.Menu,
          +    CustomEvent = YAHOO.util.CustomEvent,
          +    Lang = YAHOO.lang;
          +
          +/**
          +* 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.id = p_oConfig.id;
          +
          +        }
          +
          +        this.init(p_oObject, p_oConfig);
          +
          +    }
          +
          +};
          +
          +
          +/**
          +* Constant representing the name of the MenuItem's events
          +* @property YAHOO.widget.MenuItem._EVENT_TYPES
          +* @private
          +* @final
          +* @type Object
          +*/
          +YAHOO.widget.MenuItem._EVENT_TYPES = {
          +
          +    "MOUSE_OVER": "mouseover",
          +    "MOUSE_OUT": "mouseout",
          +    "MOUSE_DOWN": "mousedown",
          +    "MOUSE_UP": "mouseup",
          +    "CLICK": "click",
          +    "KEY_PRESS": "keypress",
          +    "KEY_DOWN": "keydown",
          +    "KEY_UP": "keyup",
          +    "ITEM_ADDED": "itemAdded",
          +    "ITEM_REMOVED": "itemRemoved",
          +    "FOCUS": "focus",
          +    "BLUR": "blur",
          +    "DESTROY": "destroy"
          +
          +};
          +
          +
          +/**
          +* Constant representing the MenuItem's configuration properties
          +* @property YAHOO.widget.MenuItem._DEFAULT_CONFIG
          +* @private
          +* @final
          +* @type Object
          +*/
          +YAHOO.widget.MenuItem._DEFAULT_CONFIG = {
          +
          +    "TEXT": { 
          +        key: "text", 
          +        value: "", 
          +        validator: Lang.isString, 
          +        suppressEvent: true 
          +    }, 
          +
          +    "HELP_TEXT": { 
          +        key: "helptext" 
          +    },
          +
          +    "URL": { 
          +        key: "url", 
          +        value: "#", 
          +        suppressEvent: true 
          +    }, 
          +
          +    "TARGET": { 
          +        key: "target", 
          +        suppressEvent: true 
          +    }, 
          +
          +    "EMPHASIS": { 
          +        key: "emphasis", 
          +        value: false, 
          +        validator: Lang.isBoolean, 
          +        suppressEvent: true 
          +    }, 
          +
          +    "STRONG_EMPHASIS": { 
          +        key: "strongemphasis", 
          +        value: false, 
          +        validator: Lang.isBoolean, 
          +        suppressEvent: true 
          +    },
          +
          +    "CHECKED": { 
          +        key: "checked", 
          +        value: false, 
          +        validator: Lang.isBoolean, 
          +        suppressEvent: true, 
          +        supercedes:["disabled"]
          +    }, 
          +
          +    "DISABLED": { 
          +        key: "disabled", 
          +        value: false, 
          +        validator: Lang.isBoolean, 
          +        suppressEvent: true
          +    },
          +
          +    "SELECTED": { 
          +        key: "selected", 
          +        value: false, 
          +        validator: Lang.isBoolean, 
          +        suppressEvent: true
          +    },
          +
          +    "SUBMENU": { 
          +        key: "submenu"
          +    },
          +
          +    "ONCLICK": { 
          +        key: "onclick"
          +    },
          +
          +    "CLASS_NAME": { 
          +        key: "classname", 
          +        value: null, 
          +        validator: Lang.isString
          +    }
          +
          +};
          +
          +
          +YAHOO.widget.MenuItem.prototype = {
          +
          +    // Constants
          +
          +
          +    /**
          +    * @property COLLAPSED_SUBMENU_INDICATOR_TEXT
          +    * @description String representing the text for the <code>&#60;em&#62;</code>
          +    * element used for the submenu arrow indicator.
          +    * @default "Submenu collapsed.  Click to expand submenu."
          +    * @final
          +    * @type String
          +    */
          +    COLLAPSED_SUBMENU_INDICATOR_TEXT: 
          +        "Submenu collapsed.  Click to expand submenu.",
          +
          +
          +    /**
          +    * @property EXPANDED_SUBMENU_INDICATOR_TEXT
          +    * @description String representing the text for the submenu arrow indicator 
          +    * element (<code>&#60;em&#62;</code>) when the submenu is visible.
          +    * @default "Submenu expanded.  Click to collapse submenu."
          +    * @final
          +    * @type String
          +    */
          +    EXPANDED_SUBMENU_INDICATOR_TEXT: 
          +        "Submenu expanded.  Click to collapse submenu.",
          +
          +
          +    /**
          +    * @property DISABLED_SUBMENU_INDICATOR_TEXT
          +    * @description String representing the text for the submenu arrow indicator 
          +    * element (<code>&#60;em&#62;</code>) when the menu item is disabled.
          +    * @default "Submenu collapsed.  (Item disabled.)."
          +    * @final
          +    * @type String
          +    */
          +    DISABLED_SUBMENU_INDICATOR_TEXT: "Submenu collapsed.  (Item disabled.)",
          +
          +
          +    /**
          +    * @property CHECKED_TEXT
          +    * @description String representing the text to be used for the checked 
          +    * indicator element (<code>&#60;em&#62;</code>).
          +    * @default "Checked."
          +    * @final
          +    * @type String
          +    */
          +    CHECKED_TEXT: "Menu item checked.",
          +    
          +    
          +    /**
          +    * @property DISABLED_CHECKED_TEXT
          +    * @description String representing the text to be used for the checked 
          +    * indicator element (<code>&#60;em&#62;</code>) when the menu item 
          +    * is disabled.
          +    * @default "Checked. (Item disabled.)"
          +    * @final
          +    * @type String
          +    */
          +    DISABLED_CHECKED_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,
          +
          +
          +
          +    // 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 _oCheckedIndicator
          +    * @description Object reference to the menu item's checkmark image.
          +    * @default <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
          +    * level-one-html.html#ID-58190037">HTMLElement</a>
          +    * @private
          +    * @type <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
          +    * level-one-html.html#ID-58190037">HTMLElement</a>
          +    */
          +    _oCheckedIndicator: null,
          +
          +
          +    /** 
          +    * @property _oOnclickAttributeValue
          +    * @description Object reference to the menu item's current value for the 
          +    * "onclick" configuration attribute.
          +    * @default null
          +    * @private
          +    * @type Object
          +    */
          +    _oOnclickAttributeValue: null,
          +
          +
          +    /**
          +    * @property _sClassName
          +    * @description The current value of the "classname" configuration attribute.
          +    * @default null
          +    * @private
          +    * @type String
          +    */
          +    _sClassName: 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 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;em&#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-58190037">HTMLElement</a>
          +    * @type <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
          +    * level-one-html.html#ID-58190037">HTMLElement</a>
          +    */
          +    submenuIndicator: null,
          +
          +
          +	/**
          +    * @property browser
          +	* @description String representing the browser.
          +	* @type String
          +	*/
          +	browser: Module.prototype.browser,
          +
          +
          +    /**
          +    * @property id
          +    * @description Id of the menu item's root <code>&#60;li&#62;</code> 
          +    * element.  This property should be set via the constructor using the 
          +    * configuration object literal.  If an id is not specified, then one will 
          +    * be created using the "generateId" method of the Dom utility.
          +    * @default null
          +    * @type String
          +    */
          +    id: null,
          +
          +
          +
          +    // 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) {
          +
          +
          +        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(Lang.isString(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"),
          +                        sURL = "#",
          +                        sTarget,
          +                        sText;
          +
          +
          +                    // 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),
          +                        bEmphasis = false,
          +                        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) {
          +
          +            var sId = this.element.id;
          +
          +            if(!sId) {
          +
          +                sId = this.id || Dom.generateId();
          +
          +                this.element.id = sId;
          +
          +            }
          +
          +            this.id = sId;
          +
          +
          +            Dom.addClass(this.element, this.CSS_CLASS_NAME);
          +
          +
          +            // Create custom events
          +
          +            var EVENT_TYPES = YAHOO.widget.MenuItem._EVENT_TYPES;
          +
          +            this.mouseOverEvent = new CustomEvent(EVENT_TYPES.MOUSE_OVER, this);
          +            this.mouseOutEvent = new CustomEvent(EVENT_TYPES.MOUSE_OUT, this);
          +            this.mouseDownEvent = new CustomEvent(EVENT_TYPES.MOUSE_DOWN, this);
          +            this.mouseUpEvent = new CustomEvent(EVENT_TYPES.MOUSE_UP, this);
          +            this.clickEvent = new CustomEvent(EVENT_TYPES.CLICK, this);
          +            this.keyPressEvent = new CustomEvent(EVENT_TYPES.KEY_PRESS, this);
          +            this.keyDownEvent = new CustomEvent(EVENT_TYPES.KEY_DOWN, this);
          +            this.keyUpEvent = new CustomEvent(EVENT_TYPES.KEY_UP, this);
          +            this.focusEvent = new CustomEvent(EVENT_TYPES.FOCUS, this);
          +            this.blurEvent = new CustomEvent(EVENT_TYPES.BLUR, this);
          +            this.destroyEvent = new CustomEvent(EVENT_TYPES.DESTROY, 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 oFirstChild = p_oElement.firstChild,
          +            oElement;
          +    
          +        if(oFirstChild) {
          +    
          +            if(oFirstChild.nodeType == 1) {
          +    
          +                oElement = oFirstChild;
          +    
          +            }
          +            else {
          +    
          +                var oNextSibling = oFirstChild.nextSibling;
          +    
          +                if(oNextSibling && oNextSibling.nodeType == 1) {
          +                
          +                    oElement = oNextSibling;
          +                
          +                }
          +    
          +            }
          +    
          +        }
          +
          +
          +        if(p_sTagName) {
          +
          +            return (oElement && oElement.tagName.toUpperCase() == p_sTagName) ? 
          +                oElement : false;
          +
          +        }
          +        
          +        return oElement;
          +
          +    },    
          +
          +
          +    /**
          +    * @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 () {
          +
          +        var oTemplate = YAHOO.widget.MenuItem._MenuItemTemplate;
          +
          +        if(!oTemplate) {
          +
          +            oTemplate = document.createElement("li");
          +            oTemplate.innerHTML = "<a href=\"#\">s</a>";
          +
          +            YAHOO.widget.MenuItem._MenuItemTemplate = oTemplate;
          +
          +        }
          +
          +        this.element = oTemplate.cloneNode(true);
          +        this._oAnchor = this.element.firstChild;
          +        this._oText = this._oAnchor.firstChild;
          +
          +        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,
          +            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,
          +                    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])));
          +        
          +                    }
          +        
          +                }
          +            
          +            }
          +
          +        }
          +
          +    },
          +
          +
          +
          +    // 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,
          +            oHelpText = p_aArgs[0],
          +            oEl = this.element,
          +            oConfig = this.cfg,
          +            aNodes = [oEl, this._oAnchor],
          +            oSubmenuIndicator = this.submenuIndicator;
          +
          +
          +        function initHelpText() {
          +
          +            Dom.addClass(aNodes, "hashelptext");
          +
          +            if(oConfig.getProperty("disabled")) {
          +
          +                oConfig.refireEvent("disabled");
          +
          +            }
          +
          +            if(oConfig.getProperty("selected")) {
          +
          +                oConfig.refireEvent("selected");
          +
          +            }                
          +
          +        }
          +
          +
          +        function removeHelpText() {
          +
          +            Dom.removeClass(aNodes, "hashelptext");
          +
          +            oEl.removeChild(me._oHelpTextEM);
          +            me._oHelpTextEM = null;
          +
          +        }
          +
          +
          +        if(this._checkDOMNode(oHelpText)) {
          +
          +            oHelpText.className = "helptext";
          +
          +            if(this._oHelpTextEM) {
          +            
          +                this._oHelpTextEM.parentNode.replaceChild(
          +                    oHelpText, 
          +                    this._oHelpTextEM
          +                );
          +
          +            }
          +            else {
          +
          +                this._oHelpTextEM = oHelpText;
          +
          +                oEl.insertBefore(this._oHelpTextEM, oSubmenuIndicator);
          +
          +            }
          +
          +            initHelpText();
          +
          +        }
          +        else if(Lang.isString(oHelpText)) {
          +
          +            if(oHelpText.length === 0) {
          +
          +                removeHelpText();
          +
          +            }
          +            else {
          +
          +                if(!this._oHelpTextEM) {
          +
          +                    this._oHelpTextEM = document.createElement("em");
          +                    this._oHelpTextEM.className = "helptext";
          +
          +                    oEl.insertBefore(this._oHelpTextEM, oSubmenuIndicator);
          +
          +                }
          +
          +                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],
          +            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],
          +            oAnchor = this._oAnchor,
          +            oText = this._oText,
          +            oConfig = this.cfg,
          +            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");
          +
          +                if(oEM) {
          +
          +                    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],
          +            oAnchor = this._oAnchor,
          +            oText = this._oText,
          +            oConfig = this.cfg,
          +            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");
          +
          +                if(oStrong) {
          +
          +                    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],
          +            oEl = this.element,
          +            oConfig = this.cfg,
          +            oEM;
          +
          +
          +        if(bChecked) {
          +
          +            var oTemplate = YAHOO.widget.MenuItem._CheckedIndicatorTemplate;
          +
          +            if(!oTemplate) {
          +
          +                oTemplate = document.createElement("em");
          +                oTemplate.innerHTML = this.CHECKED_TEXT;
          +                oTemplate.className = "checkedindicator";
          +
          +                YAHOO.widget.MenuItem._CheckedIndicatorTemplate = oTemplate;
          +
          +            }
          +
          +            oEM = oTemplate.cloneNode(true);
          +
          +            var oSubmenu = this.cfg.getProperty("submenu");
          +
          +            if(oSubmenu && oSubmenu.element) {
          +
          +                oEl.insertBefore(oEM, oSubmenu.element);
          +
          +            }
          +            else {
          +
          +                oEl.appendChild(oEM);
          +
          +            }
          +
          +
          +            Dom.addClass(oEl, "checked");
          +
          +            this._oCheckedIndicator = oEM;
          +
          +            if(oConfig.getProperty("disabled")) {
          +
          +                oConfig.refireEvent("disabled");
          +
          +            }
          +
          +            if(oConfig.getProperty("selected")) {
          +
          +                oConfig.refireEvent("selected");
          +
          +            }
          +        
          +        }
          +        else {
          +
          +            oEM = this._oCheckedIndicator;
          +
          +            Dom.removeClass(oEl, "checked");
          +
          +            if(oEM) {
          +
          +                oEl.removeChild(oEM);
          +
          +            }
          +
          +            this._oCheckedIndicator = 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],
          +            oConfig = this.cfg,
          +            oAnchor = this._oAnchor,
          +            aNodes = [this.element, oAnchor],
          +            oHelpText = this._oHelpTextEM,
          +            oCheckedIndicator = this._oCheckedIndicator,
          +            oSubmenuIndicator = this.submenuIndicator,
          +            i = 1;
          +
          +
          +        if(oHelpText) {
          +
          +            i++;
          +            aNodes[i] = oHelpText;
          +
          +        }
          +
          +
          +        if(oCheckedIndicator) {
          +            
          +            oCheckedIndicator.firstChild.nodeValue = bDisabled ? 
          +                this.DISABLED_CHECKED_TEXT : 
          +                this.CHECKED_TEXT;
          +
          +            i++;
          +            aNodes[i] = oCheckedIndicator;
          +            
          +        }    
          +
          +
          +        if(oSubmenuIndicator) {
          +
          +            oSubmenuIndicator.firstChild.nodeValue = bDisabled ? 
          +                this.DISABLED_SUBMENU_INDICATOR_TEXT : 
          +                this.COLLAPSED_SUBMENU_INDICATOR_TEXT;
          +
          +            i++;
          +            aNodes[i] = oSubmenuIndicator;
          +        
          +        }
          +
          +
          +        if(bDisabled) {
          +
          +            if(oConfig.getProperty("selected")) {
          +
          +                oConfig.setProperty("selected", false);
          +
          +            }
          +
          +            oAnchor.removeAttribute("href");
          +
          +            Dom.addClass(aNodes, "disabled");
          +
          +        }
          +        else {
          +
          +            oAnchor.setAttribute("href", oConfig.getProperty("url"));
          +
          +            Dom.removeClass(aNodes, "disabled");
          +
          +        }
          +
          +    },
          +
          +
          +    /**
          +    * @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],
          +                oHelpText = this._oHelpTextEM,
          +                oSubmenuIndicator = this.submenuIndicator,
          +                oCheckedIndicator = this._oCheckedIndicator,
          +                aNodes = [this.element, this._oAnchor],
          +                i = 1;
          +
          +
          +            if(oHelpText) {
          +    
          +                i++;
          +                aNodes[i] = oHelpText;
          +    
          +            }
          +            
          +
          +            if(oSubmenuIndicator) {
          +
          +                i++;
          +                aNodes[i] = oSubmenuIndicator;
          +
          +            }
          +
          +
          +            if(oCheckedIndicator) {
          +
          +                i++;
          +                aNodes[i] = oCheckedIndicator;
          +            
          +            }
          +
          +
          +            if(bSelected) {
          +    
          +                Dom.addClass(aNodes, "selected");
          +    
          +            }
          +            else {
          +    
          +                Dom.removeClass(aNodes, "selected");
          +    
          +            }
          +
          +        }
          +
          +    },
          +
          +
          +    /**
          +    * @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,
          +            oSubmenu = p_aArgs[0],
          +            oSubmenuIndicator = this.submenuIndicator,
          +            oConfig = this.cfg,
          +            aNodes = [this.element, this._oAnchor],
          +            bLazyLoad = this.parent && this.parent.lazyLoad,
          +            oMenu;
          +
          +
          +        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,
          +                    oSubmenuConfig = oSubmenu;
          +
          +                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(!oSubmenuIndicator) { 
          +
          +                    var oTemplate = 
          +                            YAHOO.widget.MenuItem._oSubmenuIndicatorTemplate;
          +
          +                    if(!oTemplate) {
          +                   
          +                        oTemplate = document.createElement("em");
          +                        oTemplate.innerHTML =  
          +                            this.COLLAPSED_SUBMENU_INDICATOR_TEXT;
          +                        oTemplate.className = "submenuindicator";
          +                        
          +                        YAHOO.widget.MenuItem._oSubmenuIndicatorTemplate = 
          +                            oTemplate;
          +
          +                    }
          +
          +
          +                    oSubmenuIndicator = oTemplate.cloneNode(true);
          +
          +
          +                    if(oMenu.element.parentNode == oEl) {
          +
          +                        if(this.browser == "opera") {
          +
          +                            oEl.appendChild(oSubmenuIndicator);
          +                            
          +                            oMenu.renderEvent.subscribe(function() {
          +
          +                                oSubmenuIndicator.parentNode.insertBefore(
          +                                                            oSubmenuIndicator, 
          +                                                            oMenu.element
          +                                                        );
          +                            
          +                            });
          +                
          +                        }
          +                        else {
          +
          +                            oEl.insertBefore(oSubmenuIndicator, oMenu.element);
          +                        
          +                        }
          +                
          +                    }
          +                    else {
          +
          +                        oEl.appendChild(oSubmenuIndicator);
          +                    
          +                    }
          +
          +                    this.submenuIndicator = oSubmenuIndicator;
          +
          +                }
          +
          +
          +                Dom.addClass(aNodes, "hassubmenu");
          +
          +
          +                if(oConfig.getProperty("disabled")) {
          +
          +                    oConfig.refireEvent("disabled");
          +
          +                }
          +
          +                if(oConfig.getProperty("selected")) {
          +
          +                    oConfig.refireEvent("selected");
          +
          +                }                
          +            
          +            }
          +
          +        }
          +        else {
          +
          +            Dom.removeClass(aNodes, "hassubmenu");
          +
          +            if(oSubmenuIndicator) {
          +
          +                oEl.removeChild(oSubmenuIndicator);
          +
          +            }
          +
          +            if(this._oSubmenu) {
          +
          +                this._oSubmenu.destroy();
          +
          +            }
          +
          +        }
          +
          +    },
          +
          +
          +    /**
          +    * @method configOnClick
          +    * @description Event handler for when the "onclick" 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.
          +    */
          +    configOnClick: function(p_sType, p_aArgs, p_oItem) {
          +
          +        var oObject = p_aArgs[0];
          +
          +        /*
          +            Remove any existing listeners if a "click" event handler has 
          +            already been specified.
          +        */
          +
          +        if(
          +            this._oOnclickAttributeValue && 
          +            (this._oOnclickAttributeValue != oObject)
          +        ) {
          +
          +            this.clickEvent.unsubscribe(
          +                                this._oOnclickAttributeValue.fn, 
          +                                this._oOnclickAttributeValue.obj
          +                            );
          +
          +            this._oOnclickAttributeValue = null;
          +
          +        }
          +
          +
          +        if(
          +            !this._oOnclickAttributeValue && 
          +            typeof oObject == "object" && 
          +            typeof oObject.fn == "function"
          +        ) {
          +
          +            this.clickEvent.subscribe(
          +                    oObject.fn, 
          +                    (oObject.obj || this), 
          +                    oObject.scope
          +                );
          +
          +            this._oOnclickAttributeValue = oObject;
          +
          +        }
          +    
          +    },
          +
          +
          +    /**
          +    * @method configClassName
          +    * @description Event handler for when the "classname" configuration 
          +    * property of a 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.
          +    */
          +    configClassName: function(p_sType, p_aArgs, p_oItem) {
          +    
          +        var sClassName = p_aArgs[0];
          +    
          +        if(this._sClassName) {
          +    
          +            Dom.removeClass(this.element, this._sClassName);
          +    
          +        }
          +    
          +        Dom.addClass(this.element, sClassName);
          +        this._sClassName = sClassName;
          +    
          +    },
          +
          +
          +
          +    // Public methods
          +
          +
          +	/**
          +    * @method initDefaultConfig
          +	* @description Initializes an item's configurable properties.
          +	*/
          +	initDefaultConfig : function() {
          +
          +        var oConfig = this.cfg,
          +            DEFAULT_CONFIG = YAHOO.widget.MenuItem._DEFAULT_CONFIG;
          +
          +
          +        // Define the configuration attributes
          +
          +        /**
          +        * @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(
          +            DEFAULT_CONFIG.TEXT.key, 
          +            { 
          +                handler: this.configText, 
          +                value: DEFAULT_CONFIG.TEXT.value, 
          +                validator: DEFAULT_CONFIG.TEXT.validator, 
          +                suppressEvent: DEFAULT_CONFIG.TEXT.suppressEvent 
          +            }
          +        );
          +        
          +
          +        /**
          +        * @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(
          +            DEFAULT_CONFIG.HELP_TEXT.key,
          +            { 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(
          +            DEFAULT_CONFIG.URL.key, 
          +            {
          +                handler: this.configURL, 
          +                value: DEFAULT_CONFIG.URL.value, 
          +                suppressEvent: DEFAULT_CONFIG.URL.suppressEvent
          +            }
          +        );
          +
          +
          +        /**
          +        * @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(
          +            DEFAULT_CONFIG.TARGET.key, 
          +            {
          +                handler: this.configTarget, 
          +                suppressEvent: DEFAULT_CONFIG.TARGET.suppressEvent
          +            }
          +        );
          +
          +
          +        /**
          +        * @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(
          +            DEFAULT_CONFIG.EMPHASIS.key, 
          +            { 
          +                handler: this.configEmphasis, 
          +                value: DEFAULT_CONFIG.EMPHASIS.value, 
          +                validator: DEFAULT_CONFIG.EMPHASIS.validator, 
          +                suppressEvent: DEFAULT_CONFIG.EMPHASIS.suppressEvent 
          +            }
          +        );
          +
          +
          +        /**
          +        * @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(
          +            DEFAULT_CONFIG.STRONG_EMPHASIS.key,
          +            {
          +                handler: this.configStrongEmphasis,
          +                value: DEFAULT_CONFIG.STRONG_EMPHASIS.value,
          +                validator: DEFAULT_CONFIG.STRONG_EMPHASIS.validator,
          +                suppressEvent: DEFAULT_CONFIG.STRONG_EMPHASIS.suppressEvent
          +            }
          +        );
          +
          +
          +        /**
          +        * @config checked
          +        * @description Boolean indicating if the menu item should be rendered 
          +        * with a checkmark.
          +        * @default false
          +        * @type Boolean
          +        */
          +        oConfig.addProperty(
          +            DEFAULT_CONFIG.CHECKED.key, 
          +            {
          +                handler: this.configChecked, 
          +                value: DEFAULT_CONFIG.CHECKED.value, 
          +                validator: DEFAULT_CONFIG.CHECKED.validator, 
          +                suppressEvent: DEFAULT_CONFIG.CHECKED.suppressEvent,
          +                supercedes: DEFAULT_CONFIG.CHECKED.supercedes
          +            } 
          +        );
          +
          +
          +        /**
          +        * @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(
          +            DEFAULT_CONFIG.DISABLED.key,
          +            {
          +                handler: this.configDisabled,
          +                value: DEFAULT_CONFIG.DISABLED.value,
          +                validator: DEFAULT_CONFIG.DISABLED.validator,
          +                suppressEvent: DEFAULT_CONFIG.DISABLED.suppressEvent
          +            }
          +        );
          +
          +
          +        /**
          +        * @config selected
          +        * @description Boolean indicating if the menu item should 
          +        * be highlighted.
          +        * @default false
          +        * @type Boolean
          +        */
          +        oConfig.addProperty(
          +            DEFAULT_CONFIG.SELECTED.key,
          +            {
          +                handler: this.configSelected,
          +                value: DEFAULT_CONFIG.SELECTED.value,
          +                validator: DEFAULT_CONFIG.SELECTED.validator,
          +                suppressEvent: DEFAULT_CONFIG.SELECTED.suppressEvent
          +            }
          +        );
          +
          +
          +        /**
          +        * @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(
          +            DEFAULT_CONFIG.SUBMENU.key, 
          +            { handler: this.configSubmenu }
          +        );
          +
          +
          +        /**
          +        * @config onclick
          +        * @description Object literal representing the code to be executed when 
          +        * the button is clicked.  Format:<br> <code> {<br> 
          +        * <strong>fn:</strong> Function,   &#47;&#47; The handler to call when 
          +        * the event fires.<br> <strong>obj:</strong> Object, &#47;&#47; An 
          +        * object to  pass back to the handler.<br> <strong>scope:</strong> 
          +        * Object &#47;&#47; The object to use for the scope of the handler.
          +        * <br> } </code>
          +        * @type Object
          +        * @default null
          +        */
          +        oConfig.addProperty(
          +            DEFAULT_CONFIG.ONCLICK.key, 
          +            { handler: this.configOnClick }
          +        );
          +
          +
          +        /**
          +        * @config classname
          +        * @description CSS class to be applied to the menu item's root 
          +        * <code>&#60;li&#62;</code> element.  The specified class(es) are 
          +        * appended in addition to the default class as specified by the menu 
          +        * item's CSS_CLASS_NAME constant.
          +        * @default null
          +        * @type String
          +        */
          +        oConfig.addProperty(
          +            DEFAULT_CONFIG.CLASS_NAME.key, 
          +            { 
          +                handler: this.configClassName,
          +                value: DEFAULT_CONFIG.CLASS_NAME.value, 
          +                validator: DEFAULT_CONFIG.CLASS_NAME.validator
          +            }
          +        );
          +
          +	},
          +
          +
          +    /**
          +    * @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;
          +
          +            function getNextArrayItem(p_aArray, p_nStartIndex) {
          +    
          +                return p_aArray[p_nStartIndex] || 
          +                    getNextArrayItem(p_aArray, (p_nStartIndex+1));
          +    
          +            }
          +    
          +    
          +            var aItemGroups = this.parent.getItemGroups(),
          +                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;
          +
          +            function getPreviousArrayItem(p_aArray, p_nStartIndex) {
          +    
          +                return p_aArray[p_nStartIndex] || 
          +                    getPreviousArrayItem(p_aArray, (p_nStartIndex-1));
          +    
          +            }
          +
          +            function getFirstItemIndex(p_aArray, p_nStartIndex) {
          +    
          +                return p_aArray[p_nStartIndex] ? 
          +                    p_nStartIndex : 
          +                    getFirstItemIndex(p_aArray, (p_nStartIndex+1));
          +    
          +            }
          +    
          +            var aItemGroups = this.parent.getItemGroups(),
          +                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,
          +            oAnchor = this._oAnchor,
          +            oActiveItem = oParent.activeItem,
          +            me = this;
          +
          +
          +        function setFocus() {
          +
          +            try {
          +
          +                if (
          +                    (me.browser == "ie" || me.browser == "ie7") && 
          +                    !document.hasFocus()
          +                ) {
          +                
          +                    return;
          +                
          +                }
          +
          +                oAnchor.focus();
          +
          +            }
          +            catch(e) {
          +            
          +            }
          +
          +        }
          +
          +
          +        if(
          +            !this.cfg.getProperty("disabled") && 
          +            oParent && 
          +            oParent.cfg.getProperty("visible") && 
          +            this.element.style.display != "none"
          +        ) {
          +
          +            if(oActiveItem) {
          +
          +                oActiveItem.blur();
          +
          +            }
          +
          +
          +            /*
          +                Setting focus via a timer fixes a race condition in Firefox, IE 
          +                and Opera where the browser viewport jumps as it trys to 
          +                position and focus the menu.
          +            */
          +
          +            window.setTimeout(setFocus, 0);
          +            
          +            this.focusEvent.fire();
          +
          +        }
          +
          +    },
          +
          +
          +    /**
          +    * @method blur
          +    * @description Causes the menu item to lose focus and fires the 
          +    * blur 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 hasFocus
          +    * @description Returns a boolean indicating whether or not the menu item
          +    * has focus.
          +    * @return {Boolean}
          +    */
          +    hasFocus: function() {
          +    
          +        return (YAHOO.widget.MenuManager.getFocusedMenuItem() == this);
          +    
          +    },
          +
          +
          +	/**
          +    * @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) {
          +
          +
          +            // If the item has a submenu, destroy it first
          +
          +            var oSubmenu = this.cfg.getProperty("submenu");
          +
          +            if(oSubmenu) {
          +            
          +                oSubmenu.destroy();
          +            
          +            }
          +
          +
          +            // 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() {
          +
          +        var sReturnVal = "MenuItem";
          +
          +        if(this.cfg && this.cfg.getProperty("text")) {
          +    
          +            sReturnVal += (": " + this.cfg.getProperty("text"));
          +    
          +        }
          +
          +        return sReturnVal;
          +    
          +    }
          +
          +};
          +
          +})();
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/menumanager.js.html b/www/extras/yui/docs/menumanager.js.html new file mode 100644 index 000000000..dbb77e110 --- /dev/null +++ b/www/extras/yui/docs/menumanager.js.html @@ -0,0 +1,790 @@ + + + + API: menu menumanager.js (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Menu  2.2.2

          +

          + Yahoo! UI Library + > menu + + > menumanager.js (source view) +

          +
          + +
          +
          +
          + +
          +
          /**
          +* @module menu
          +* @description <p>The Menu family of components features a collection of 
          +* controls that make it easy to add menus to your website or web application.  
          +* With the Menu Controls you can create website fly-out menus, customized 
          +* context menus, or application-style menu bars with just a small amount of 
          +* scripting.</p><p>The Menu family of controls features:</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
          +* @namespace YAHOO.widget
          +* @requires Event, Dom, Container
          +*/
          +(function() {
          +
          +var Dom = YAHOO.util.Dom,
          +    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 = function() {
          +
          +    // Private member variables
          +
          +
          +    // Flag indicating if the DOM event handlers have been attached
          +
          +    var m_bInitializedEventHandlers = false,
          +
          +
          +        // Collection of menus
          +
          +        m_oMenus = {},
          +    
          +    
          +        //  Collection of menu items 
          +
          +        m_oItems = {},
          +
          +
          +        // Collection of visible menus
          +    
          +        m_oVisibleMenus = {},
          +
          +
          +        // Map of DOM event types to their equivalent CustomEvent types
          +    
          +        m_oEventTypes =  {
          +            "click": "clickEvent",
          +            "mousedown": "mouseDownEvent",
          +            "mouseup": "mouseUpEvent",
          +            "mouseover": "mouseOverEvent",
          +            "mouseout": "mouseOutEvent",
          +            "keydown": "keyDownEvent",
          +            "keyup": "keyUpEvent",
          +            "keypress": "keyPressEvent"
          +        },
          +
          +
          +        m_oFocusedMenuItem = null;
          +
          +
          +    var m_oLogger = new YAHOO.widget.LogWriter("MenuManager");
          +
          +
          +    // Private methods
          +
          +
          +    /**
          +    * @method addItem
          +    * @description 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.
          +    */
          +    function addItem(p_oItem) {
          +
          +        var sId = p_oItem.id;
          +
          +        if(p_oItem && m_oItems[sId] != p_oItem) {
          +    
          +            m_oItems[sId] = p_oItem;
          +
          +            p_oItem.destroyEvent.subscribe(onItemDestroy);
          +
          +            m_oLogger.log("Item: " + 
          +                p_oItem.toString() + " successfully registered.");
          +
          +        }
          +    
          +    }
          +
          +
          +    /**
          +    * @method removeItem
          +    * @description 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.
          +    */
          +    function removeItem(p_oItem) {
          +    
          +        var sId = p_oItem.id;
          +
          +        if(sId && m_oItems[sId]) {
          +
          +            delete m_oItems[sId];
          +
          +            m_oLogger.log("Item: " + 
          +                p_oItem.toString() + " successfully unregistered.");
          +
          +        }
          +    
          +    }
          +
          +
          +    /**
          +    * @method getMenuRootElement
          +    * @description 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.
          +    */
          +    function getMenuRootElement(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, "hd") ||
          +                            Dom.hasClass(p_oElement, "bd") ||
          +                            Dom.hasClass(p_oElement, "ft")
          +                        )
          +                        && 
          +                        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
          +
          +
          +    /**
          +    * @method onDOMEvent
          +    * @description 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).
          +    */
          +    function onDOMEvent(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
          +
          +            oElement = getMenuRootElement(oTarget),
          +            oMenuItem,
          +            oMenu; 
          +
          +
          +        if(oElement) {
          +
          +            var sTagName = oElement.tagName.toUpperCase();
          +    
          +            if(sTagName == "LI") {
          +        
          +                var sId = oElement.id;
          +        
          +                if(sId && m_oItems[sId]) {
          +        
          +                    oMenuItem = m_oItems[sId];
          +                    oMenu = oMenuItem.parent;
          +        
          +                }
          +            
          +            }
          +            else if(sTagName == "DIV") {
          +            
          +                if(oElement.id) {
          +                
          +                    oMenu = m_oMenus[oElement.id];
          +                
          +                }
          +            
          +            }
          +
          +        }
          +
          +
          +        if(oMenu) {
          +
          +            var sCustomEventType = m_oEventTypes[p_oEvent.type];
          +
          +
          +            // Fire the Custom Event that corresponds the current DOM event    
          +    
          +            if(oMenuItem && !oMenuItem.cfg.getProperty("disabled")) {
          +
          +                oMenuItem[sCustomEventType].fire(p_oEvent);                   
          +
          +
          +                if (p_oEvent.type == "keyup" || p_oEvent.type == "mousedown") {
          +
          +                    if (m_oFocusedMenuItem != oMenuItem) {
          +                    
          +                        if(m_oFocusedMenuItem) {
          +
          +                            m_oFocusedMenuItem.blurEvent.fire();
          +                        
          +                        }
          +
          +                        oMenuItem.focusEvent.fire();
          +                    
          +                    }
          +                
          +                }
          +
          +            }
          +    
          +            oMenu[sCustomEventType].fire(p_oEvent, oMenuItem);
          +        
          +        }
          +        else if(p_oEvent.type == "mousedown") {
          +
          +            if(m_oFocusedMenuItem) {
          +
          +                m_oFocusedMenuItem.blurEvent.fire();
          +
          +                m_oFocusedMenuItem = null;
          +
          +            }
          +
          +
          +            /*
          +                If the target of the event wasn't a menu, hide all 
          +                dynamically positioned menus
          +            */
          +            
          +            for(var i in m_oMenus) {
          +    
          +                if(YAHOO.lang.hasOwnProperty(m_oMenus,i)) {
          +    
          +                    oMenu = m_oMenus[i];
          +    
          +                    if(
          +                        oMenu.cfg.getProperty("clicktohide") && 
          +                        oMenu.cfg.getProperty("position") == "dynamic"
          +                    ) {
          +    
          +                        oMenu.hide();
          +    
          +                    }
          +                    else {
          +
          +                        oMenu.clearActiveItem(true);
          +    
          +                    }
          +    
          +                }
          +    
          +            } 
          +
          +        }
          +        else if(p_oEvent.type == "keyup") { 
          +
          +            if(m_oFocusedMenuItem) {
          +
          +                m_oFocusedMenuItem.blurEvent.fire();
          +
          +                m_oFocusedMenuItem = null;
          +
          +            }
          +
          +        }
          +
          +    }
          +
          +
          +    /**
          +    * @method onMenuDestroy
          +    * @description "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.
          +    */
          +    function onMenuDestroy(p_sType, p_aArgs) {
          +
          +        if(m_oMenus[this.id]) {
          +
          +            delete m_oMenus[this.id];
          +
          +            m_oLogger.log("Menu: " + 
          +                this.toString() + " successfully unregistered.");
          +
          +        }
          +
          +    }
          +
          +
          +    /**
          +    * @method onMenuFocus
          +    * @description "focus" 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.
          +    */
          +    function onMenuFocus(p_sType, p_aArgs) {
          +
          +        var oItem = p_aArgs[0];
          +        
          +        if (oItem) {
          +
          +            m_oFocusedMenuItem = oItem;
          +        
          +        }
          +
          +    }
          +
          +
          +    /**
          +    * @method onMenuBlur
          +    * @description "blur" 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.
          +    */
          +    function onMenuBlur(p_sType, p_aArgs) {
          +
          +        m_oFocusedMenuItem = null;
          +
          +    }
          +
          +
          +    /**
          +    * @method onItemDestroy
          +    * @description "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.
          +    */
          +    function onItemDestroy(p_sType, p_aArgs) {
          +
          +        var sId = this.id;
          +
          +        if(sId && m_oItems[sId]) {
          +
          +            delete m_oItems[sId];
          +
          +        }
          +
          +    }
          +
          +
          +    /**
          +    * @method onMenuVisibleConfigChange
          +    * @description 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.
          +    */
          +    function onMenuVisibleConfigChange(p_sType, p_aArgs) {
          +
          +        var bVisible = p_aArgs[0];
          +        
          +        if(bVisible) {
          +
          +            m_oVisibleMenus[this.id] = this;
          +            
          +            m_oLogger.log("Menu: " + 
          +                this.toString() + 
          +                " registered with the collection of visible menus.");
          +        
          +        }
          +        else if(m_oVisibleMenus[this.id]) {
          +        
          +            delete m_oVisibleMenus[this.id];
          +            
          +            m_oLogger.log("Menu: " + 
          +                this.toString() + 
          +                " unregistered from the collection of visible menus.");
          +        
          +        }
          +    
          +    }
          +
          +
          +    /**
          +    * @method onItemAdded
          +    * @description "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.
          +    */
          +    function onItemAdded(p_sType, p_aArgs) {
          +    
          +        addItem(p_aArgs[0]);
          +    
          +    }
          +    
          +
          +    /**
          +    * @method onItemRemoved
          +    * @description "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.
          +    */
          +    function onItemRemoved(p_sType, p_aArgs) {
          +
          +        removeItem(p_aArgs[0]);
          +    
          +    }
          +
          +
          +
          +    return {
          +
          +        // 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.
          +        */
          +        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.on(oDoc, "mouseover", onDOMEvent, this, true);
          +                    Event.on(oDoc, "mouseout", onDOMEvent, this, true);
          +                    Event.on(oDoc, "mousedown", onDOMEvent, this, true);
          +                    Event.on(oDoc, "mouseup", onDOMEvent, this, true);
          +                    Event.on(oDoc, "click", onDOMEvent, this, true);
          +                    Event.on(oDoc, "keydown", onDOMEvent, this, true);
          +                    Event.on(oDoc, "keyup", onDOMEvent, this, true);
          +                    Event.on(oDoc, "keypress", onDOMEvent, this, true);
          +
          +
          +                    m_bInitializedEventHandlers = true;
          +                    
          +                    m_oLogger.log("DOM event handlers initialized.");
          +        
          +                }
          +        
          +                p_oMenu.destroyEvent.subscribe(onMenuDestroy);
          +                
          +                p_oMenu.cfg.subscribeToConfigEvent(
          +                    "visible", 
          +                    onMenuVisibleConfigChange
          +                );
          +        
          +                p_oMenu.itemAddedEvent.subscribe(onItemAdded);
          +                p_oMenu.itemRemovedEvent.subscribe(onItemRemoved);
          +                p_oMenu.focusEvent.subscribe(onMenuFocus);
          +                p_oMenu.blurEvent.subscribe(onMenuBlur);
          +    
          +                m_oLogger.log("Menu: " + 
          +                    p_oMenu.toString() + " successfully registered.");
          +    
          +            }
          +    
          +        },
          +
          +    
          +        /**
          +        * @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.
          +        */
          +        removeMenu: function(p_oMenu) {
          +    
          +            if(p_oMenu && m_oMenus[p_oMenu.id]) {
          +    
          +                delete m_oMenus[p_oMenu.id];
          +    
          +                m_oLogger.log("Menu: " + 
          +                    p_oMenu.toString() + " successfully unregistered.");
          +    
          +            }
          +    
          +        },
          +    
          +    
          +        /**
          +        * @method hideVisible
          +        * @description Hides all visible, dynamically positioned menus.
          +        */
          +        hideVisible: function() {
          +    
          +            var oMenu;
          +    
          +            for(var i in m_oVisibleMenus) {
          +    
          +                if(YAHOO.lang.hasOwnProperty(m_oVisibleMenus,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}
          +        */
          +        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}
          +        */
          +        getMenu: function(p_sId) {
          +    
          +            if(m_oMenus[p_sId]) {
          +            
          +                return m_oMenus[p_sId];
          +            
          +            }
          +        
          +        },
          +
          +
          +        /**
          +        * @method getFocusedMenuItem
          +        * @description Returns a reference to the menu item that currently 
          +        * has focus.
          +        * @return {YAHOO.widget.MenuItem}
          +        */
          +        getFocusedMenuItem: function() {
          +
          +            return m_oFocusedMenuItem;
          +
          +        },
          +
          +
          +        /**
          +        * @method getFocusedMenu
          +        * @description Returns a reference to the menu that currently has focus.
          +        * @return {YAHOO.widget.Menu}
          +        */
          +        getFocusedMenu: function() {
          +
          +            if(m_oFocusedMenuItem) {
          +
          +                return (m_oFocusedMenuItem.parent.getRoot());
          +            
          +            }
          +
          +        },
          +
          +    
          +        /**
          +        * @method toString
          +        * @description Returns a string representing the menu manager.
          +        * @return {String}
          +        */
          +        toString: function() {
          +        
          +            return ("MenuManager");
          +        
          +        }
          +
          +    };
          +
          +}();
          +
          +})();
          +
          +
          +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_animation.html b/www/extras/yui/docs/module_animation.html new file mode 100644 index 000000000..a32c8ff54 --- /dev/null +++ b/www/extras/yui/docs/module_animation.html @@ -0,0 +1,140 @@ + + + + API: animation (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          animation  2.2.2

          +

          + Yahoo! UI Library + > animation + + +

          +
          + +
          +
          +
          + + +

          Module: animation + + + +

          +
          + The animation module provides allows effects to be added to HTMLElements. +
          + +
          +

          Search animation: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_autocomplete.html b/www/extras/yui/docs/module_autocomplete.html new file mode 100644 index 000000000..9f554aced --- /dev/null +++ b/www/extras/yui/docs/module_autocomplete.html @@ -0,0 +1,134 @@ + + + + API: autocomplete (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          AutoComplete Widget  2.2.2

          +

          + Yahoo! UI Library + > autocomplete + + +

          +
          + +
          +
          +
          + + +

          Module: autocomplete + + + +

          +
          + The AutoComplete control provides the front-end logic for text-entry suggestion and +completion functionality. +
          + +
          +

          Search autocomplete: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_button.html b/www/extras/yui/docs/module_button.html new file mode 100644 index 000000000..1ee6d9101 --- /dev/null +++ b/www/extras/yui/docs/module_button.html @@ -0,0 +1,162 @@ + + + + API: button (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Button  2.2.2

          +

          + Yahoo! UI Library + > button + + +

          +
          + +
          +
          +
          + + +

          Module: button + + Beta + + +

          +
          +

          The Button Control enables the creation of rich, graphical +buttons that function like traditional HTML form buttons. Unlike +tradition HTML form buttons, buttons created with the Button Control can have +a label that is different from its value. With the inclusion of the optional +Menu Control, the Button Control can also be +used to create menu buttons and split buttons, controls that are not +available natively in HTML. The Button Control can also be thought of as a +way to create more visually engaging implementations of the browser's +default radio-button and check-box controls.

          +

          The Button Control supports the following types:

          +
          +
          button
          +
          Basic push button that can execute a user-specified command when +pressed.
          +
          link
          +
          Navigates to a specified url when pressed.
          +
          submit
          +
          Submits the parent form when pressed.
          +
          reset
          +
          Resets the parent form when pressed.
          +
          checkbox
          +
          Maintains a "checked" state that can be toggled on and off.
          +
          radio
          +
          Maintains a "checked" state that can be toggled on and off. Use with +the ButtonGroup class to create a set of controls that are mutually +exclusive; checking one button in the set will uncheck all others in +the group.
          +
          menubutton
          +
          When pressed will show/hide a menu.
          +
          splitbutton
          +
          Can execute a user-specified command or display a menu when pressed.
          +
          +
          + +
          +

          Search button: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_calendar.html b/www/extras/yui/docs/module_calendar.html new file mode 100644 index 000000000..303d8f3ec --- /dev/null +++ b/www/extras/yui/docs/module_calendar.html @@ -0,0 +1,134 @@ + + + + API: calendar (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Calendar  2.2.2

          +

          + Yahoo! UI Library + > calendar + + +

          +
          + +
          +
          +
          + + +

          Module: calendar + + + +

          +
          + 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. +
          + +
          +

          Search calendar: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_connection.html b/www/extras/yui/docs/module_connection.html new file mode 100644 index 000000000..41a785d7e --- /dev/null +++ b/www/extras/yui/docs/module_connection.html @@ -0,0 +1,131 @@ + + + + API: connection (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          connection  2.2.2

          +

          + Yahoo! UI Library + > connection + + +

          +
          + +
          +
          +
          + + +

          Module: connection + + + +

          +
          + 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. +
          + +
          +

          Search connection: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_container.html b/www/extras/yui/docs/module_container.html new file mode 100644 index 000000000..979d0901d --- /dev/null +++ b/www/extras/yui/docs/module_container.html @@ -0,0 +1,144 @@ + + + + API: container (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Container  2.2.2

          +

          + Yahoo! UI Library + > container + + +

          +
          + +
          +
          +
          + + +

          Module: container + + + +

          +
          + 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. +
          + +
          +

          Search container: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_datasource.html b/www/extras/yui/docs/module_datasource.html new file mode 100644 index 000000000..d43c813c2 --- /dev/null +++ b/www/extras/yui/docs/module_datasource.html @@ -0,0 +1,131 @@ + + + + API: datasource (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          DataSource Utility  2.2.2

          +

          + Yahoo! UI Library + > datasource + + +

          +
          + +
          +
          +
          + + +

          Module: datasource + + Beta + + +

          +
          + The DataSource utility provides a common configurable interface for widgets +to access a variety of data, from JavaScript arrays to online servers over +XHR. +
          + +
          +

          Search datasource: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_datatable.html b/www/extras/yui/docs/module_datatable.html new file mode 100644 index 000000000..550092913 --- /dev/null +++ b/www/extras/yui/docs/module_datatable.html @@ -0,0 +1,139 @@ + + + + API: datatable (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          DataTable Widget  2.2.2

          +

          + Yahoo! UI Library + > datatable + + +

          +
          + +
          +
          +
          + + +

          Module: datatable + + Beta + + +

          +
          + The DataTable widget provides a progressively enhanced DHTML control for +displaying tabular data across A-grade browsers. +
          + +
          +

          Search datatable: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_dom.html b/www/extras/yui/docs/module_dom.html new file mode 100644 index 000000000..7c8654482 --- /dev/null +++ b/www/extras/yui/docs/module_dom.html @@ -0,0 +1,131 @@ + + + + API: dom (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          dom  2.2.2

          +

          + Yahoo! UI Library + > dom + + +

          +
          + +
          +
          +
          + + +

          Module: dom + + + +

          +
          + The dom module provides helper methods for manipulating Dom elements. +
          + +
          +

          Search dom: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_dragdrop.html b/www/extras/yui/docs/module_dragdrop.html new file mode 100644 index 000000000..93e044f83 --- /dev/null +++ b/www/extras/yui/docs/module_dragdrop.html @@ -0,0 +1,141 @@ + + + + API: dragdrop (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Drag and Drop  2.2.2

          +

          + Yahoo! UI Library + > dragdrop + + +

          +
          + +
          +
          +
          + + +

          Module: dragdrop + + + +

          +
          + 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. +
          + +
          +

          Search dragdrop: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_element.html b/www/extras/yui/docs/module_element.html new file mode 100644 index 000000000..17ae58020 --- /dev/null +++ b/www/extras/yui/docs/module_element.html @@ -0,0 +1,134 @@ + + + + API: element (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          element  2.2.2

          +

          + Yahoo! UI Library + > element + + +

          +
          + +
          +
          +
          + + +

          Module: element + + Beta + + +

          +
          + Element provides an wrapper object to simplify adding +event listeners, using dom methods, and managing attributes. +
          + +
          +

          Search element: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_event.html b/www/extras/yui/docs/module_event.html new file mode 100644 index 000000000..209027c2f --- /dev/null +++ b/www/extras/yui/docs/module_event.html @@ -0,0 +1,134 @@ + + + + API: event (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Event Utility  2.2.2

          +

          + Yahoo! UI Library + > event + + +

          +
          + +
          +
          +
          + + +

          Module: event + + + +

          +
          + The Event Utility provides utilities for managing DOM Events and tools +for building event systems +
          + +
          +

          Search event: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_history.html b/www/extras/yui/docs/module_history.html new file mode 100644 index 000000000..79f6bf3e2 --- /dev/null +++ b/www/extras/yui/docs/module_history.html @@ -0,0 +1,131 @@ + + + + API: history (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Browser History Manager  2.2.2

          +

          + Yahoo! UI Library + > history + + +

          +
          + +
          +
          +
          + + +

          Module: history + + + Experimental + +

          +
          + The Browser History Manager provides the ability to use the +back/forward navigation buttons in a DHTML application. It also allows +a DHTML application to be bookmarked in a specific state. +
          + +
          +

          Search history: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_logger.html b/www/extras/yui/docs/module_logger.html new file mode 100644 index 000000000..5d99aca6f --- /dev/null +++ b/www/extras/yui/docs/module_logger.html @@ -0,0 +1,138 @@ + + + + API: logger (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Logger Widget  2.2.2

          +

          + Yahoo! UI Library + > logger + + +

          +
          + +
          +
          +
          + + +

          Module: logger + + + +

          +
          + 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. +
          + +
          +

          Search logger: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_menu.html b/www/extras/yui/docs/module_menu.html new file mode 100644 index 000000000..e7e0a0385 --- /dev/null +++ b/www/extras/yui/docs/module_menu.html @@ -0,0 +1,154 @@ + + + + API: menu (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Menu  2.2.2

          +

          + Yahoo! UI Library + > menu + + +

          +
          + +
          +
          +
          + + +

          Module: menu + + + +

          +
          +

          The Menu family of components features a collection of +controls that make it easy to add menus to your website or web application. +With the Menu Controls you can create website fly-out menus, customized +context menus, or application-style menu bars with just a small amount of +scripting.

          The Menu family of controls features:

          +
            +
          • Screen-reader accessibility.
          • +
          • Keyboard and mouse navigation.
          • +
          • A rich event model that provides access to all of a menu's +interesting moments.
          • +
          • Support for +Progressive +Enhancement; Menus can be created from simple, +semantic markup on the page or purely through JavaScript.
          • +
          +
          + +
          +

          Search menu: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_slider.html b/www/extras/yui/docs/module_slider.html new file mode 100644 index 000000000..b1810b710 --- /dev/null +++ b/www/extras/yui/docs/module_slider.html @@ -0,0 +1,135 @@ + + + + API: slider (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          Slider Widget  2.2.2

          +

          + Yahoo! UI Library + > slider + + +

          +
          + +
          +
          +
          + + +

          Module: slider + + + +

          +
          + 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. +
          + +
          +

          Search slider: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_tabview.html b/www/extras/yui/docs/module_tabview.html new file mode 100644 index 000000000..ca4dbd4d5 --- /dev/null +++ b/www/extras/yui/docs/module_tabview.html @@ -0,0 +1,130 @@ + + + + API: tabview (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          tabview  2.2.2

          +

          + Yahoo! UI Library + > tabview + + +

          +
          + +
          +
          +
          + + +

          Module: tabview + + + +

          +
          + The tabview module provides a widget for managing content bound to tabs. +
          + +
          +

          Search tabview: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_treeview.html b/www/extras/yui/docs/module_treeview.html new file mode 100644 index 000000000..d144822aa --- /dev/null +++ b/www/extras/yui/docs/module_treeview.html @@ -0,0 +1,144 @@ + + + + API: treeview (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          TreeView Widget  2.2.2

          +

          + Yahoo! UI Library + > treeview + + +

          +
          + +
          +
          +
          + + +

          Module: treeview + + + +

          +
          + The treeview widget is a generic tree building tool. +
          + +
          +

          Search treeview: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          + +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/module_yahoo.html b/www/extras/yui/docs/module_yahoo.html new file mode 100644 index 000000000..e4f3d14ee --- /dev/null +++ b/www/extras/yui/docs/module_yahoo.html @@ -0,0 +1,134 @@ + + + + API: yahoo (YUI Library) + + + + +
          + +
          +

          Yahoo! UI Library

          +

          YAHOO Global  2.2.2

          +

          + Yahoo! UI Library + > yahoo + + +

          +
          + +
          +
          +
          + + +

          Module: yahoo + + + +

          +
          + 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. +
          + +
          +

          Search yahoo: +

          + +
          +   +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          +
          +
          + Copyright © 2007 Yahoo! Inc. All rights reserved. +
          +
          + + diff --git a/www/extras/yui/docs/raw.json b/www/extras/yui/docs/raw.json new file mode 100644 index 000000000..5c1c0465a --- /dev/null +++ b/www/extras/yui/docs/raw.json @@ -0,0 +1 @@ +{"classmap": {"YAHOO.widget.Calendar2up": {"name": "YAHOO.widget.Calendar2up", "deprecated": "The old Calendar2up class is no longer necessary, since CalendarGroup renders in a 2up view by default.", "namespace": "YAHOO.widget", "module": "calendar", "guessedname": "Calendar2up", "extends": "YAHOO.widget.CalendarGroup", "superclass": "YAHOO.widget.CalendarGroup", "file": "CalendarGroup.js", "guessedtype": "function", "shortname": "Calendar2up", "properties": {"Cal2up": {"deprecated": "The old Calendar2up class is no longer necessary, since CalendarGroup renders in a 2up view by default.", "guessedname": "Cal2up", "guessedtype": "property"}}}, "YAHOO.widget.Slider": {"name": "YAHOO.widget.Slider", "constructors": [{"params": [{"type": "String", "name": "id", "description": " The id of the element linked to this instance"}, {"type": "String", "name": "sGroup", "description": " The group of related DragDrop items"}, {"type": "SliderThumb", "name": "oThumb", "description": " The thumb for this slider"}, {"type": "String", "name": "sType", "description": " The type of slider (horiz, vert, region)"}], "description": "A DragDrop implementation that can be used as a background for a\nslider. It takes a reference to the thumb instance \nso it can delegate some of the events to it. The goal is to make the \nthumb jump to the location on the background when the background is \nclicked."}], "namespace": "YAHOO.widget", "module": "slider", "events": {"slideEnd": {"description": "Event that fires at the end of a slider thumb move"}, "change": {"params": [{"type": "int", "name": "newOffset|x", "description": " the new offset for normal sliders, or the new\nx offset for region sliders"}, {"type": "int", "name": "y", "description": " the number of pixels the thumb has moved on the y axis\n(region sliders only)"}], "description": "Event the fires when the value of the control changes. If \nthe control is animated the event will fire every point\nalong the way."}, "slideStart": {"description": "Event that fires at the beginning of a slider thumb move."}}, "guessedname": "Slider", "methods": {"fireEvents": {"guessedname": "fireEvents", "params": [{"type": "boolean", "name": "thumbEvent", "description": " set to true if this event is fired from an event\nthat occurred on the thumb. If it is, the state of the\nthumb dd object should be correct. Otherwise, the event\noriginated on the background, so the thumb state needs to\nbe refreshed before proceeding."}], "description": "Fires the change event if the value has been changed. Ignored if we are in\nthe middle of an animation as the event will fire when the animation is\ncomplete", "private": "", "guessedtype": "function"}, "lock": {"description": "Locks the slider, overrides YAHOO.util.DragDrop", "guessedname": "lock", "guessedtype": "function"}, "YAHOO.widget.Slider.getHorizSlider": {"return": {"type": "Slider", "description": "a horizontal slider control"}, "description": "Factory method for creating a horizontal slider", "static": "", "guessedname": "getHorizSlider", "guessedtype": "property", "params": [{"type": "String", "name": "sBGElId", "description": " the id of the slider's background element"}, {"type": "String", "name": "sHandleElId", "description": " the id of the thumb element"}, {"type": "int", "name": "iLeft", "description": " the number of pixels the element can move left"}, {"type": "int", "name": "iRight", "description": " the number of pixels the element can move right"}, {"type": "int", "name": "iTickSize", "description": " optional parameter for specifying that the element \nshould move a certain number pixels at a time."}]}, "focus": {"private": "", "description": "Try to focus the element when clicked so we can add\naccessibility features", "guessedname": "focus", "guessedtype": "function"}, "onMouseDown": {"private": "", "description": "Handles the mousedown event for the slider background", "guessedname": "onMouseDown", "guessedtype": "function"}, "handleKeyDown": {"params": [{"type": "Event", "name": "e", "description": " the keydown event"}], "description": "Executed when a keydown event happens with the control focused.\nUpdates the slider value and display when the keypress is an\narrow key, home, or end as long as enableKeys is set to true.", "guessedname": "handleKeyDown", "guessedtype": "function"}, "getXValue": {"return": {"type": "int", "description": "the current horizontal offset"}, "description": "Returns the slider's thumb X offset from the start position", "guessedname": "getXValue", "guessedtype": "function"}, "moveThumb": {"guessedname": "moveThumb", "params": [{"type": "int", "name": "x", "description": " the X coordinate of the click"}, {"type": "int", "name": "y", "description": " the Y coordinate of the click"}, {"type": "boolean", "name": "skipAnim", "description": " don't animate if the move happend onDrag"}], "description": "Move the associated slider moved to a timeout to try to get around the \nmousedown stealing moz does when I move the slider element between the \ncursor and the background during the mouseup event", "private": "", "guessedtype": "function"}, "setRegionValue": {"return": {"type": "boolean", "description": "true if the move was performed, false if it failed"}, "params": [{"type": "int", "name": "newOffset", "description": " the number of pixels the thumb should be\npositioned away from the initial start point (x axis for region)"}, {"type": "int", "name": "newOffset2", "description": " the number of pixels the thumb should be\npositioned away from the initial start point (y axis for region)"}, {"type": "boolean", "name": "skipAnim", "description": " set to true to disable the animation\nfor this move action (but not others)."}, {"type": "boolean", "name": "force", "description": " ignore the locked setting and set value anyway"}], "description": "Provides a way to set the value of the region slider in code.", "guessedname": "setRegionValue", "guessedtype": "function"}, "onSliderEnd": {"deprecated": "use instance.subscribe(\"slideEnd\") instead", "description": "Event that fires at the end of a slider thumb move", "guessedname": "onSlideEnd", "guessedtype": "function"}, "thumbMouseUp": {"private": "", "description": "Handles mouseup event on the slider background", "guessedname": "thumbMouseUp", "guessedtype": "function"}, "YAHOO.widget.Slider.getSliderRegion": {"return": {"type": "Slider", "description": "a slider region control"}, "description": "Factory method for creating a slider region like the one in the color\npicker example", "static": "", "guessedname": "getSliderRegion", "guessedtype": "property", "params": [{"type": "String", "name": "sBGElId", "description": " the id of the slider's background element"}, {"type": "String", "name": "sHandleElId", "description": " the id of the thumb element"}, {"type": "int", "name": "iLeft", "description": " the number of pixels the element can move left"}, {"type": "int", "name": "iRight", "description": " the number of pixels the element can move right"}, {"type": "int", "name": "iUp", "description": " the number of pixels the element can move up"}, {"type": "int", "name": "iDown", "description": " the number of pixels the element can move down"}, {"type": "int", "name": "iTickSize", "description": " optional parameter for specifying that the element \nshould move a certain number pixels at a time."}]}, "verifyOffset": {"return": {"type": "boolean", "description": "True if the offset is the same as the baseline."}, "params": [{"type": "boolean", "name": "checkPos", "description": " check the position instead of using cached value"}], "description": "Checks the background position element position. If it has moved from the\nbaseline position, the constraints for the thumb are reset", "guessedname": "verifyOffset", "guessedtype": "function"}, "initThumb": {"params": [{"type": "YAHOO.widget.SliderThumb", "name": "t", "description": " the slider thumb"}], "description": "Initializes the slider's thumb. Executed in the constructor.", "guessedname": "initThumb", "guessedtype": "function"}, "toString": {"return": {"type": "string", "description": "string representation of the instance"}, "description": "Slider toString", "guessedname": "toString", "guessedtype": "function"}, "moveOneTick": {"guessedname": "moveOneTick", "params": [{"type": "int[]", "name": "the", "description": " destination coordinate"}], "description": "Move the slider one tick mark towards its final coordinate. Used\nfor the animation when tick marks are defined", "private": "", "guessedtype": "function"}, "onChange": {"deprecated": "use instance.subscribe(\"change\") instead", "params": [{"type": "int", "name": "firstOffset", "description": " the number of pixels the thumb has moved\nfrom its start position. Normal horizontal and vertical sliders will only\nhave the firstOffset. Regions will have both, the first is the horizontal\noffset, the second the vertical."}, {"type": "int", "name": "secondOffset", "description": " the y offset for region sliders"}], "description": "Event that fires when the value of the slider has changed", "guessedname": "onChange", "guessedtype": "function"}, "initSlider": {"params": [{"type": "string", "name": "sType", "description": " the type of slider (horiz, vert, region)"}], "description": "Initializes the slider. Executed in the constructor", "guessedname": "initSlider", "guessedtype": "function"}, "setValue": {"return": {"type": "boolean", "description": "true if the move was performed, false if it failed"}, "params": [{"type": "int", "name": "newOffset", "description": " the number of pixels the thumb should be\npositioned away from the initial start point"}, {"type": "boolean", "name": "skipAnim", "description": " set to true to disable the animation\nfor this move action (but not others)."}, {"type": "boolean", "name": "force", "description": " ignore the locked setting and set value anyway"}], "description": "Provides a way to set the value of the slider in code.", "guessedname": "setValue", "guessedtype": "function"}, "setThumbCenterPoint": {"description": "When the thumb is available, we cache the centerpoint of the element so\nwe can position the element correctly when the background is clicked", "guessedname": "setThumbCenterPoint", "guessedtype": "function"}, "handleThumbChange": {"private": "", "description": "Internal handler for the slider thumb's onChange event", "guessedname": "handleThumbChange", "guessedtype": "function"}, "endMove": {"private": "", "description": "Fired when the slider movement ends", "guessedname": "endMove", "guessedtype": "function"}, "getYValue": {"return": {"type": "int", "description": "the current vertical offset"}, "description": "Returns the slider's thumb Y offset from the start position", "guessedname": "getYValue", "guessedtype": "function"}, "onAvailable": {"description": "Executed when the slider element is available", "guessedname": "onAvailable", "guessedtype": "function"}, "onSlideStart": {"deprecated": "use instance.subscribe(\"slideStart\") instead", "description": "Event that fires when the at the beginning of the slider thumb move", "guessedname": "onSlideStart", "guessedtype": "function"}, "onDrag": {"private": "", "description": "Handles the onDrag event for the slider background", "guessedname": "onDrag", "guessedtype": "function"}, "getThumb": {"return": {"type": "SliderThumb", "description": "this slider's thumb"}, "description": "Returns a reference to this slider's thumb", "guessedname": "getThumb", "guessedtype": "function"}, "YAHOO.widget.Slider.getVertSlider": {"return": {"type": "Slider", "description": "a vertical slider control"}, "description": "Factory method for creating a vertical slider", "static": "", "guessedname": "getVertSlider", "guessedtype": "property", "params": [{"type": "String", "name": "sBGElId", "description": " the id of the slider's background element"}, {"type": "String", "name": "sHandleElId", "description": " the id of the thumb element"}, {"type": "int", "name": "iUp", "description": " the number of pixels the element can move up"}, {"type": "int", "name": "iDown", "description": " the number of pixels the element can move down"}, {"type": "int", "name": "iTickSize", "description": " optional parameter for specifying that the element \nshould move a certain number pixels at a time."}]}, "handleKeyPress": {"params": [{"type": "Event", "name": "e", "description": " the keypress event"}], "description": "Executed when a keypress event happens with the control focused.\nPrevents the default behavior for navigation keys. The actual\nlogic for moving the slider thumb in response to a key event\nhappens in handleKeyDown.", "guessedname": "handleKeyPress", "guessedtype": "function"}, "setStartSliderState": {"description": "Initialization that sets up the value offsets once the elements are ready", "guessedname": "setStartSliderState", "guessedtype": "function"}, "getValue": {"return": {"type": "int", "description": "the current value"}, "description": "Returns the slider's thumb offset from the start position", "guessedname": "getValue", "guessedtype": "function"}, "b4MouseDown": {"private": "", "description": "Resets the constraints before moving the thumb.", "guessedname": "b4MouseDown", "guessedtype": "function"}, "unlock": {"description": "Unlocks the slider, overrides YAHOO.util.DragDrop", "guessedname": "unlock", "guessedtype": "function"}, "_getNextY": {"private": "", "description": "Returns the next Y tick value based on the current coord and the target coord.", "guessedname": "_getNextY", "guessedtype": "function"}, "_getNextX": {"private": "", "description": "Returns the next X tick value based on the current coord and the target coord.", "guessedname": "_getNextX", "guessedtype": "function"}}, "uses": ["YAHOO.util.EventProvider"], "superclass": "YAHOO.util.DragDrop", "file": "Slider.js", "guessedtype": "function", "extends": "YAHOO.util.DragDrop", "shortname": "Slider", "properties": {"moveComplete": {"deprecated": "use the slideEnd event instead", "type": "Boolean", "description": "moveComplete is set to true when the slider has moved to its final\ndestination. For animated slider, this value can be checked in \nthe onChange handler to make it possible to execute logic only\nwhen the move is complete rather than at all points along the way.\nDeprecated because this flag is only useful when the background is\nclicked and the slider is animated. If the user drags the thumb,\nthe flag is updated when the drag is over ... the final onDrag event\nfires before the mouseup the ends the drag, so the implementer will\nnever see it.", "guessedname": "moveComplete", "guessedtype": "property"}, "isTarget": {"private": "", "description": "Overrides the isTarget property in YAHOO.util.DragDrop", "guessedname": "isTarget", "guessedtype": "property"}, "thumb": {"type": "YAHOO.widget.SliderThumb", "description": "A YAHOO.widget.SliderThumb instance that we will use to \nreposition the thumb when the background is clicked", "guessedname": "thumb", "guessedtype": "property"}, "baselinePos": {"type": "[int, int]", "description": "The basline position of the background element, used\nto determine if the background has moved since the last\noperation.", "guessedname": "baselinePos", "guessedtype": "property"}, "thumbCenterPoint": {"type": "{\"x\": int, \"y\": int}", "description": "The center of the slider element is stored so we can \nplace it in the correct position when the background is clicked.", "guessedname": "thumbCenterPoint", "guessedtype": "property"}, "keyIncrement": {"type": "int", "description": "Specifies the number of pixels the arrow keys will move the slider.\nDefault is 25.", "guessedname": "keyIncrement", "guessedtype": "property"}, "backgroundEnabled": {"type": "boolean", "description": "Set to false to disable a background click thumb move", "guessedname": "backgroundEnabled", "guessedtype": "property"}, "animationDuration": {"default": "0.2", "type": "int", "description": "If animation is configured, specifies the length of the animation\nin seconds.", "guessedname": "animationDuration", "guessedtype": "property"}, "YAHOO.widget.Slider.ANIM_AVAIL": {"type": "boolean", "static": "", "description": "By default, animation is available if the animation library is detected.", "guessedname": "ANIM_AVAIL", "guessedtype": "property"}, "type": {"type": "string", "description": "The type of the slider (horiz, vert, region)", "guessedname": "type", "guessedtype": "property"}, "animate": {"type": "boolean", "description": "Flag that determines if the thumb will animate when moved", "guessedname": "animate", "guessedtype": "property"}, "tickPause": {"type": "int", "description": "Adjustment factor for tick animation, the more ticks, the\nfaster the animation (by default)", "guessedname": "tickPause", "guessedtype": "property"}, "enableKeys": {"type": "boolean", "description": "Enables the arrow, home and end keys, defaults to true.", "guessedname": "enableKeys", "guessedtype": "property"}}, "description": "A DragDrop implementation that can be used as a background for a\nslider. It takes a reference to the thumb instance \nso it can delegate some of the events to it. The goal is to make the \nthumb jump to the location on the background when the background is \nclicked."}, "YAHOO.util.AnimMgr": {"name": "YAHOO.util.AnimMgr", "namespace": "YAHOO.util", "module": "animation", "guessedname": "AnimMgr", "methods": {"run": {"description": "Called per Interval to handle each animation frame.", "guessedname": "run", "guessedtype": "function"}, "unRegister": {"guessedname": "unRegister", "params": [{"type": "object", "name": "tween", "description": " The Anim instance to be be registered"}, {"type": "Int", "name": "index", "description": " The index of the Anim instance"}], "description": "removes an animation instance from the animation queue.\nAll animation instances must be registered in order to animate.", "private": "", "guessedtype": "function"}, "stop": {"params": [{"type": "object", "name": "tween", "description": " A specific Anim instance to stop (optional)\nIf no instance given, Manager stops thread and all animations."}], "description": "Stops the animation thread or a specific animation instance.", "guessedname": "stop", "guessedtype": "function"}, "start": {"description": "Starts the animation thread.\nOnly one thread can run at a time.", "guessedname": "start", "guessedtype": "function"}, "registerElement": {"params": [{"type": "object", "name": "tween", "description": " The Anim instance to be be registered"}], "description": "Adds an animation instance to the animation queue.\nAll animation instances must be registered in order to animate.", "guessedname": "registerElement", "guessedtype": "function"}, "correctFrame": {"guessedname": "correctFrame", "params": [{"type": "Object", "name": "tween", "description": " The Anim instance being corrected."}], "description": "On the fly frame correction to keep animation on time.", "private": "", "guessedtype": "function"}}, "file": "AnimMgr.js", "guessedtype": "function", "shortname": "AnimMgr", "properties": {"queue": {"guessedname": "queue", "type": "Array", "description": "The current queue of registered animation objects.", "private": "", "guessedtype": "property"}, "tweenCount": {"guessedname": "tweenCount", "type": "Int", "description": "The number of active animations.", "private": "", "guessedtype": "property"}, "delay": {"type": "Int", "description": "Interval delay in milliseconds, defaults to fastest possible.", "guessedname": "delay", "guessedtype": "property"}, "fps": {"type": "Int", "description": "Base frame rate (frames per second). \nArbitrarily high for better x-browser calibration (slower browsers drop more frames).", "guessedname": "fps", "guessedtype": "property"}, "thread": {"guessedname": "thread", "type": "Int", "description": "Reference to the animation Interval.", "private": "", "guessedtype": "property"}}, "description": "Handles animation queueing and threading.\nUsed by Anim and subclasses."}, "YAHOO.util.EventProvider": {"name": "YAHOO.util.EventProvider", "namespace": "YAHOO.util", "module": "event", "guessedname": "EventProvider", "methods": {"unsubscribeAll": {"params": [{"type": "string", "name": "p_type", "description": " The type, or name of the event"}], "description": "Removes all listeners from the specified event", "guessedname": "unsubscribeAll", "guessedtype": "function"}, "subscribe": {"params": [{"type": "string", "name": "p_type", "description": " the type, or name of the event"}, {"type": "function", "name": "p_fn", "description": " the function to exectute when the event fires"}, {"type": "", "name": "p_obj", "description": ""}, {"type": "Object", "name": "p_obj", "description": " An object to be passed along when the event \nfires"}, {"type": "boolean", "name": "p_override", "description": " If true, the obj passed in becomes the \nexecution scope of the listener"}], "description": "Subscribe to a CustomEvent by event type", "guessedname": "subscribe", "guessedtype": "function"}, "unsubscribe": {"return": {"type": "boolean", "description": "true if the subscriber was found and detached."}, "params": [{"type": "string", "name": "p_type", "description": " The type, or name of the event"}, {"type": "Function", "name": "p_fn", "description": " The subscribed function to unsubscribe, if not\nsupplied, all subscribers will be removed."}, {"type": "Object", "name": "p_obj", "description": " The custom object passed to subscribe. This is\noptional, but if supplied will be used to\ndisambiguate multiple listeners that are the same\n(e.g., you subscribe many object using a function\nthat lives on the prototype)"}], "description": "Unsubscribes one or more listeners the from the specified event", "guessedname": "unsubscribe", "guessedtype": "function"}, "hasEvent": {"params": [{"type": "string", "name": "type", "description": " the type, or name of the event"}], "description": "Returns true if the custom event of the provided type has been created\nwith createEvent.", "guessedname": "hasEvent", "guessedtype": "function"}, "fireEvent": {"return": {"type": "boolean", "description": "the return value from CustomEvent.fire, or null if \nthe custom event does not exist."}, "params": [{"type": "string", "name": "p_type", "description": " the type, or name of the event"}, {"type": "Object*", "name": "arguments", "description": " an arbitrary set of parameters to pass to \nthe handler."}], "description": "Fire a custom event by name. The callback functions will be executed\nfrom the scope specified when the event was created, and with the \nfollowing parameters:\n